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