xref: /linux/drivers/mfd/arizona-spi.c (revision f791be492f76dea7b0641ed227a60eeb2fa7e255)
1a15123c7SMark Brown /*
2a15123c7SMark Brown  * arizona-spi.c  --  Arizona SPI bus interface
3a15123c7SMark Brown  *
4a15123c7SMark Brown  * Copyright 2012 Wolfson Microelectronics plc
5a15123c7SMark Brown  *
6a15123c7SMark Brown  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7a15123c7SMark Brown  *
8a15123c7SMark Brown  * This program is free software; you can redistribute it and/or modify
9a15123c7SMark Brown  * it under the terms of the GNU General Public License version 2 as
10a15123c7SMark Brown  * published by the Free Software Foundation.
11a15123c7SMark Brown  */
12a15123c7SMark Brown 
13a15123c7SMark Brown #include <linux/err.h>
14a15123c7SMark Brown #include <linux/module.h>
15a15123c7SMark Brown #include <linux/pm_runtime.h>
16a15123c7SMark Brown #include <linux/regmap.h>
17a15123c7SMark Brown #include <linux/regulator/consumer.h>
18a15123c7SMark Brown #include <linux/slab.h>
19a15123c7SMark Brown #include <linux/spi/spi.h>
20a15123c7SMark Brown 
21a15123c7SMark Brown #include <linux/mfd/arizona/core.h>
22a15123c7SMark Brown 
23a15123c7SMark Brown #include "arizona.h"
24a15123c7SMark Brown 
25*f791be49SBill Pemberton static int arizona_spi_probe(struct spi_device *spi)
26a15123c7SMark Brown {
27a15123c7SMark Brown 	const struct spi_device_id *id = spi_get_device_id(spi);
28a15123c7SMark Brown 	struct arizona *arizona;
29a15123c7SMark Brown 	const struct regmap_config *regmap_config;
30a15123c7SMark Brown 	int ret;
31a15123c7SMark Brown 
32a15123c7SMark Brown 	switch (id->driver_data) {
33a15123c7SMark Brown #ifdef CONFIG_MFD_WM5102
34a15123c7SMark Brown 	case WM5102:
35a15123c7SMark Brown 		regmap_config = &wm5102_spi_regmap;
36a15123c7SMark Brown 		break;
37a15123c7SMark Brown #endif
38e102befeSMark Brown #ifdef CONFIG_MFD_WM5110
39e102befeSMark Brown 	case WM5110:
40e102befeSMark Brown 		regmap_config = &wm5110_spi_regmap;
41e102befeSMark Brown 		break;
42e102befeSMark Brown #endif
43a15123c7SMark Brown 	default:
44a15123c7SMark Brown 		dev_err(&spi->dev, "Unknown device type %ld\n",
45a15123c7SMark Brown 			id->driver_data);
46a15123c7SMark Brown 		return -EINVAL;
47a15123c7SMark Brown 	}
48a15123c7SMark Brown 
49a15123c7SMark Brown 	arizona = devm_kzalloc(&spi->dev, sizeof(*arizona), GFP_KERNEL);
50a15123c7SMark Brown 	if (arizona == NULL)
51a15123c7SMark Brown 		return -ENOMEM;
52a15123c7SMark Brown 
53a15123c7SMark Brown 	arizona->regmap = devm_regmap_init_spi(spi, regmap_config);
54a15123c7SMark Brown 	if (IS_ERR(arizona->regmap)) {
55a15123c7SMark Brown 		ret = PTR_ERR(arizona->regmap);
56a15123c7SMark Brown 		dev_err(&spi->dev, "Failed to allocate register map: %d\n",
57a15123c7SMark Brown 			ret);
58a15123c7SMark Brown 		return ret;
59a15123c7SMark Brown 	}
60a15123c7SMark Brown 
61a15123c7SMark Brown 	arizona->type = id->driver_data;
62a15123c7SMark Brown 	arizona->dev = &spi->dev;
63a15123c7SMark Brown 	arizona->irq = spi->irq;
64a15123c7SMark Brown 
65a15123c7SMark Brown 	return arizona_dev_init(arizona);
66a15123c7SMark Brown }
67a15123c7SMark Brown 
68a15123c7SMark Brown static int __devexit arizona_spi_remove(struct spi_device *spi)
69a15123c7SMark Brown {
70a15123c7SMark Brown 	struct arizona *arizona = dev_get_drvdata(&spi->dev);
71a15123c7SMark Brown 	arizona_dev_exit(arizona);
72a15123c7SMark Brown 	return 0;
73a15123c7SMark Brown }
74a15123c7SMark Brown 
75a15123c7SMark Brown static const struct spi_device_id arizona_spi_ids[] = {
76a15123c7SMark Brown 	{ "wm5102", WM5102 },
77e102befeSMark Brown 	{ "wm5110", WM5110 },
78a15123c7SMark Brown 	{ },
79a15123c7SMark Brown };
80a15123c7SMark Brown MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
81a15123c7SMark Brown 
82a15123c7SMark Brown static struct spi_driver arizona_spi_driver = {
83a15123c7SMark Brown 	.driver = {
84a15123c7SMark Brown 		.name	= "arizona",
85a15123c7SMark Brown 		.owner	= THIS_MODULE,
86a15123c7SMark Brown 		.pm	= &arizona_pm_ops,
87a15123c7SMark Brown 	},
88a15123c7SMark Brown 	.probe		= arizona_spi_probe,
8984449216SBill Pemberton 	.remove		= arizona_spi_remove,
90a15123c7SMark Brown 	.id_table	= arizona_spi_ids,
91a15123c7SMark Brown };
92a15123c7SMark Brown 
93a15123c7SMark Brown module_spi_driver(arizona_spi_driver);
94a15123c7SMark Brown 
95a15123c7SMark Brown MODULE_DESCRIPTION("Arizona SPI bus interface");
96a15123c7SMark Brown MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
97a15123c7SMark Brown MODULE_LICENSE("GPL");
98