diff options
author | Haojian Zhuang <haojian.zhuang@marvell.com> | 2010-01-08 12:43:29 -0500 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-03-07 16:17:07 -0500 |
commit | 1ad998934e9c6cbae91662a05e0cb8772b1f4f75 (patch) | |
tree | 91ad77823b13b805c2ee3e5915aec46872d38170 /drivers | |
parent | d50f8f339f6901fccc9d4292b65ce8b69d7413d4 (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/Kconfig | 1 | ||||
-rw-r--r-- | drivers/mfd/max8925-core.c | 142 |
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 | |||
197 | config MFD_MAX8925 | 197 | config 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 | ||
23 | static 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 | |||
32 | static 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 | |||
41 | static 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 | |||
50 | static 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 | |||
66 | static 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 = ®ulator_resources[MAX8925_ID_##_id], \ | ||
97 | .id = MAX8925_ID_##_id, \ | ||
98 | } | ||
99 | |||
100 | static 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 | |||
23 | static int __get_irq_offset(struct max8925_chip *chip, int irq, int mode, | 126 | static 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, ®ulator_devs[0], | ||
318 | ARRAY_SIZE(regulator_devs), | ||
319 | ®ulator_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; | ||
335 | out_dev: | ||
336 | mfd_remove_devices(chip->dev); | ||
337 | out_irq: | ||
338 | if (chip->chip_irq) | ||
339 | free_irq(chip->chip_irq, chip); | ||
213 | out: | 340 | out: |
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; | ||
374 | out_irq: | ||
375 | if (chip->chip_irq) | ||
376 | free_irq(chip->chip_irq, chip); | ||
236 | out: | 377 | out: |
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 | ||
260 | MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925"); | 402 | MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925"); |