aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@marvell.com>2010-01-08 12:43:29 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2010-03-07 16:17:07 -0500
commit1ad998934e9c6cbae91662a05e0cb8772b1f4f75 (patch)
tree91ad77823b13b805c2ee3e5915aec46872d38170 /drivers
parentd50f8f339f6901fccc9d4292b65ce8b69d7413d4 (diff)
mfd: Add subdevs in max8925
Add subdevs in MAX8925. MAX8925 includes regulator, backlight and touch components. Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mfd/Kconfig1
-rw-r--r--drivers/mfd/max8925-core.c142
2 files changed, 143 insertions, 0 deletions
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index ee416eefb8e9..d63ab2eec661 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -197,6 +197,7 @@ config PMIC_ADP5520
197config MFD_MAX8925 197config MFD_MAX8925
198 tristate "Maxim Semiconductor MAX8925 PMIC Support" 198 tristate "Maxim Semiconductor MAX8925 PMIC Support"
199 depends on I2C 199 depends on I2C
200 select MFD_CORE
200 help 201 help
201 Say yes here to support for Maxim Semiconductor MAX8925. This is 202 Say yes here to support for Maxim Semiconductor MAX8925. This is
202 a Power Management IC. This driver provies common support for 203 a Power Management IC. This driver provies common support for
diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c
index 3e26267960b1..f36c494b80f1 100644
--- a/drivers/mfd/max8925-core.c
+++ b/drivers/mfd/max8925-core.c
@@ -20,6 +20,109 @@
20#define IRQ_MODE_STATUS 0 20#define IRQ_MODE_STATUS 0
21#define IRQ_MODE_MASK 1 21#define IRQ_MODE_MASK 1
22 22
23static struct resource backlight_resources[] = {
24 {
25 .name = "max8925-backlight",
26 .start = MAX8925_WLED_MODE_CNTL,
27 .end = MAX8925_WLED_CNTL,
28 .flags = IORESOURCE_IO,
29 },
30};
31
32static struct mfd_cell backlight_devs[] = {
33 {
34 .name = "max8925-backlight",
35 .num_resources = 1,
36 .resources = &backlight_resources[0],
37 .id = -1,
38 },
39};
40
41static struct resource touch_resources[] = {
42 {
43 .name = "max8925-tsc",
44 .start = MAX8925_TSC_IRQ,
45 .end = MAX8925_ADC_RES_END,
46 .flags = IORESOURCE_IO,
47 },
48};
49
50static struct mfd_cell touch_devs[] = {
51 {
52 .name = "max8925-touch",
53 .num_resources = 1,
54 .resources = &touch_resources[0],
55 .id = -1,
56 },
57};
58
59#define MAX8925_REG_RESOURCE(_start, _end) \
60{ \
61 .start = MAX8925_##_start, \
62 .end = MAX8925_##_end, \
63 .flags = IORESOURCE_IO, \
64}
65
66static struct resource regulator_resources[] = {
67 MAX8925_REG_RESOURCE(SDCTL1, SDCTL1),
68 MAX8925_REG_RESOURCE(SDCTL2, SDCTL2),
69 MAX8925_REG_RESOURCE(SDCTL3, SDCTL3),
70 MAX8925_REG_RESOURCE(LDOCTL1, LDOCTL1),
71 MAX8925_REG_RESOURCE(LDOCTL2, LDOCTL2),
72 MAX8925_REG_RESOURCE(LDOCTL3, LDOCTL3),
73 MAX8925_REG_RESOURCE(LDOCTL4, LDOCTL4),
74 MAX8925_REG_RESOURCE(LDOCTL5, LDOCTL5),
75 MAX8925_REG_RESOURCE(LDOCTL6, LDOCTL6),
76 MAX8925_REG_RESOURCE(LDOCTL7, LDOCTL7),
77 MAX8925_REG_RESOURCE(LDOCTL8, LDOCTL8),
78 MAX8925_REG_RESOURCE(LDOCTL9, LDOCTL9),
79 MAX8925_REG_RESOURCE(LDOCTL10, LDOCTL10),
80 MAX8925_REG_RESOURCE(LDOCTL11, LDOCTL11),
81 MAX8925_REG_RESOURCE(LDOCTL12, LDOCTL12),
82 MAX8925_REG_RESOURCE(LDOCTL13, LDOCTL13),
83 MAX8925_REG_RESOURCE(LDOCTL14, LDOCTL14),
84 MAX8925_REG_RESOURCE(LDOCTL15, LDOCTL15),
85 MAX8925_REG_RESOURCE(LDOCTL16, LDOCTL16),
86 MAX8925_REG_RESOURCE(LDOCTL17, LDOCTL17),
87 MAX8925_REG_RESOURCE(LDOCTL18, LDOCTL18),
88 MAX8925_REG_RESOURCE(LDOCTL19, LDOCTL19),
89 MAX8925_REG_RESOURCE(LDOCTL20, LDOCTL20),
90};
91
92#define MAX8925_REG_DEVS(_id) \
93{ \
94 .name = "max8925-regulator", \
95 .num_resources = 1, \
96 .resources = &regulator_resources[MAX8925_ID_##_id], \
97 .id = MAX8925_ID_##_id, \
98}
99
100static struct mfd_cell regulator_devs[] = {
101 MAX8925_REG_DEVS(SD1),
102 MAX8925_REG_DEVS(SD2),
103 MAX8925_REG_DEVS(SD3),
104 MAX8925_REG_DEVS(LDO1),
105 MAX8925_REG_DEVS(LDO2),
106 MAX8925_REG_DEVS(LDO3),
107 MAX8925_REG_DEVS(LDO4),
108 MAX8925_REG_DEVS(LDO5),
109 MAX8925_REG_DEVS(LDO6),
110 MAX8925_REG_DEVS(LDO7),
111 MAX8925_REG_DEVS(LDO8),
112 MAX8925_REG_DEVS(LDO9),
113 MAX8925_REG_DEVS(LDO10),
114 MAX8925_REG_DEVS(LDO11),
115 MAX8925_REG_DEVS(LDO12),
116 MAX8925_REG_DEVS(LDO13),
117 MAX8925_REG_DEVS(LDO14),
118 MAX8925_REG_DEVS(LDO15),
119 MAX8925_REG_DEVS(LDO16),
120 MAX8925_REG_DEVS(LDO17),
121 MAX8925_REG_DEVS(LDO18),
122 MAX8925_REG_DEVS(LDO19),
123 MAX8925_REG_DEVS(LDO20),
124};
125
23static int __get_irq_offset(struct max8925_chip *chip, int irq, int mode, 126static int __get_irq_offset(struct max8925_chip *chip, int irq, int mode,
24 int *offset, int *bit) 127 int *offset, int *bit)
25{ 128{
@@ -210,6 +313,30 @@ static int __devinit device_gpm_init(struct max8925_chip *chip,
210 313
211 /* enable hard-reset for ONKEY power-off */ 314 /* enable hard-reset for ONKEY power-off */
212 max8925_set_bits(i2c, MAX8925_SYSENSEL, 0x80, 0x80); 315 max8925_set_bits(i2c, MAX8925_SYSENSEL, 0x80, 0x80);
316
317 ret = mfd_add_devices(chip->dev, 0, &regulator_devs[0],
318 ARRAY_SIZE(regulator_devs),
319 &regulator_resources[0], 0);
320 if (ret < 0) {
321 dev_err(chip->dev, "Failed to add regulator subdev\n");
322 goto out_irq;
323 }
324
325 if (pdata && pdata->backlight) {
326 ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
327 ARRAY_SIZE(backlight_devs),
328 &backlight_resources[0], 0);
329 if (ret < 0) {
330 dev_err(chip->dev, "Failed to add backlight subdev\n");
331 goto out_dev;
332 }
333 }
334 return 0;
335out_dev:
336 mfd_remove_devices(chip->dev);
337out_irq:
338 if (chip->chip_irq)
339 free_irq(chip->chip_irq, chip);
213out: 340out:
214 return ret; 341 return ret;
215} 342}
@@ -233,6 +360,20 @@ static int __devinit device_adc_init(struct max8925_chip *chip,
233 goto out; 360 goto out;
234 } 361 }
235 chip->chip_irq = i2c->irq; 362 chip->chip_irq = i2c->irq;
363
364 if (pdata && pdata->touch) {
365 ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
366 ARRAY_SIZE(touch_devs),
367 &touch_resources[0], 0);
368 if (ret < 0) {
369 dev_err(chip->dev, "Failed to add touch subdev\n");
370 goto out_irq;
371 }
372 }
373 return 0;
374out_irq:
375 if (chip->chip_irq)
376 free_irq(chip->chip_irq, chip);
236out: 377out:
237 return ret; 378 return ret;
238} 379}
@@ -255,6 +396,7 @@ void max8925_device_exit(struct max8925_chip *chip)
255{ 396{
256 if (chip->chip_irq >= 0) 397 if (chip->chip_irq >= 0)
257 free_irq(chip->chip_irq, chip); 398 free_irq(chip->chip_irq, chip);
399 mfd_remove_devices(chip->dev);
258} 400}
259 401
260MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925"); 402MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925");