diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-19 11:36:18 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-23 08:30:42 -0400 |
commit | a15123c708a364cc70c5db0ef56e6fab8268bf68 (patch) | |
tree | a3ccf858de07c372045b15012c1bfd87f96fa9f8 /drivers/mfd/arizona-spi.c | |
parent | c6f756223ad6bf5b71f1b9454b092f3dbe94900f (diff) |
mfd: arizona: SPI bus interface
Several forthcoming Wolfson devices are based on a common platform
known as Arizona allowing a great deal of reuse of driver code. This
patch adds SPI bus interface code for the devices.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/mfd/arizona-spi.c')
-rw-r--r-- | drivers/mfd/arizona-spi.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/drivers/mfd/arizona-spi.c b/drivers/mfd/arizona-spi.c new file mode 100644 index 00000000000..f4bedaf875e --- /dev/null +++ b/drivers/mfd/arizona-spi.c | |||
@@ -0,0 +1,91 @@ | |||
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 | default: | ||
39 | dev_err(&spi->dev, "Unknown device type %ld\n", | ||
40 | id->driver_data); | ||
41 | return -EINVAL; | ||
42 | } | ||
43 | |||
44 | arizona = devm_kzalloc(&spi->dev, sizeof(*arizona), GFP_KERNEL); | ||
45 | if (arizona == NULL) | ||
46 | return -ENOMEM; | ||
47 | |||
48 | arizona->regmap = devm_regmap_init_spi(spi, regmap_config); | ||
49 | if (IS_ERR(arizona->regmap)) { | ||
50 | ret = PTR_ERR(arizona->regmap); | ||
51 | dev_err(&spi->dev, "Failed to allocate register map: %d\n", | ||
52 | ret); | ||
53 | return ret; | ||
54 | } | ||
55 | |||
56 | arizona->type = id->driver_data; | ||
57 | arizona->dev = &spi->dev; | ||
58 | arizona->irq = spi->irq; | ||
59 | |||
60 | return arizona_dev_init(arizona); | ||
61 | } | ||
62 | |||
63 | static int __devexit arizona_spi_remove(struct spi_device *spi) | ||
64 | { | ||
65 | struct arizona *arizona = dev_get_drvdata(&spi->dev); | ||
66 | arizona_dev_exit(arizona); | ||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static const struct spi_device_id arizona_spi_ids[] = { | ||
71 | { "wm5102", WM5102 }, | ||
72 | { }, | ||
73 | }; | ||
74 | MODULE_DEVICE_TABLE(spi, arizona_spi_ids); | ||
75 | |||
76 | static struct spi_driver arizona_spi_driver = { | ||
77 | .driver = { | ||
78 | .name = "arizona", | ||
79 | .owner = THIS_MODULE, | ||
80 | .pm = &arizona_pm_ops, | ||
81 | }, | ||
82 | .probe = arizona_spi_probe, | ||
83 | .remove = __devexit_p(arizona_spi_remove), | ||
84 | .id_table = arizona_spi_ids, | ||
85 | }; | ||
86 | |||
87 | module_spi_driver(arizona_spi_driver); | ||
88 | |||
89 | MODULE_DESCRIPTION("Arizona SPI bus interface"); | ||
90 | MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | ||
91 | MODULE_LICENSE("GPL"); | ||