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 | |
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>
-rw-r--r-- | drivers/mfd/Kconfig | 1 | ||||
-rw-r--r-- | drivers/mfd/max8925-core.c | 142 | ||||
-rw-r--r-- | include/linux/mfd/max8925.h | 96 |
3 files changed, 239 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"); |
diff --git a/include/linux/mfd/max8925.h b/include/linux/mfd/max8925.h index 2326246ddef2..b72dbe174d51 100644 --- a/include/linux/mfd/max8925.h +++ b/include/linux/mfd/max8925.h | |||
@@ -14,6 +14,33 @@ | |||
14 | 14 | ||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | 16 | ||
17 | /* Unified sub device IDs for MAX8925 */ | ||
18 | enum { | ||
19 | MAX8925_ID_SD1, | ||
20 | MAX8925_ID_SD2, | ||
21 | MAX8925_ID_SD3, | ||
22 | MAX8925_ID_LDO1, | ||
23 | MAX8925_ID_LDO2, | ||
24 | MAX8925_ID_LDO3, | ||
25 | MAX8925_ID_LDO4, | ||
26 | MAX8925_ID_LDO5, | ||
27 | MAX8925_ID_LDO6, | ||
28 | MAX8925_ID_LDO7, | ||
29 | MAX8925_ID_LDO8, | ||
30 | MAX8925_ID_LDO9, | ||
31 | MAX8925_ID_LDO10, | ||
32 | MAX8925_ID_LDO11, | ||
33 | MAX8925_ID_LDO12, | ||
34 | MAX8925_ID_LDO13, | ||
35 | MAX8925_ID_LDO14, | ||
36 | MAX8925_ID_LDO15, | ||
37 | MAX8925_ID_LDO16, | ||
38 | MAX8925_ID_LDO17, | ||
39 | MAX8925_ID_LDO18, | ||
40 | MAX8925_ID_LDO19, | ||
41 | MAX8925_ID_LDO20, | ||
42 | }; | ||
43 | |||
17 | /* Charger registers */ | 44 | /* Charger registers */ |
18 | #define MAX8925_CHG_IRQ1 (0x7e) | 45 | #define MAX8925_CHG_IRQ1 (0x7e) |
19 | #define MAX8925_CHG_IRQ2 (0x7f) | 46 | #define MAX8925_CHG_IRQ2 (0x7f) |
@@ -32,12 +59,65 @@ | |||
32 | /* Touch registers */ | 59 | /* Touch registers */ |
33 | #define MAX8925_TSC_IRQ (0x00) | 60 | #define MAX8925_TSC_IRQ (0x00) |
34 | #define MAX8925_TSC_IRQ_MASK (0x01) | 61 | #define MAX8925_TSC_IRQ_MASK (0x01) |
62 | #define MAX8925_ADC_RES_END (0x6f) | ||
35 | 63 | ||
36 | /* RTC registers */ | 64 | /* RTC registers */ |
37 | #define MAX8925_RTC_STATUS (0x1a) | 65 | #define MAX8925_RTC_STATUS (0x1a) |
38 | #define MAX8925_RTC_IRQ (0x1c) | 66 | #define MAX8925_RTC_IRQ (0x1c) |
39 | #define MAX8925_RTC_IRQ_MASK (0x1d) | 67 | #define MAX8925_RTC_IRQ_MASK (0x1d) |
40 | 68 | ||
69 | /* WLED registers */ | ||
70 | #define MAX8925_WLED_MODE_CNTL (0x84) | ||
71 | #define MAX8925_WLED_CNTL (0x85) | ||
72 | |||
73 | /* MAX8925 Registers */ | ||
74 | #define MAX8925_SDCTL1 (0x04) | ||
75 | #define MAX8925_SDCTL2 (0x07) | ||
76 | #define MAX8925_SDCTL3 (0x0A) | ||
77 | #define MAX8925_SDV1 (0x06) | ||
78 | #define MAX8925_SDV2 (0x09) | ||
79 | #define MAX8925_SDV3 (0x0C) | ||
80 | #define MAX8925_LDOCTL1 (0x18) | ||
81 | #define MAX8925_LDOCTL2 (0x1C) | ||
82 | #define MAX8925_LDOCTL3 (0x20) | ||
83 | #define MAX8925_LDOCTL4 (0x24) | ||
84 | #define MAX8925_LDOCTL5 (0x28) | ||
85 | #define MAX8925_LDOCTL6 (0x2C) | ||
86 | #define MAX8925_LDOCTL7 (0x30) | ||
87 | #define MAX8925_LDOCTL8 (0x34) | ||
88 | #define MAX8925_LDOCTL9 (0x38) | ||
89 | #define MAX8925_LDOCTL10 (0x3C) | ||
90 | #define MAX8925_LDOCTL11 (0x40) | ||
91 | #define MAX8925_LDOCTL12 (0x44) | ||
92 | #define MAX8925_LDOCTL13 (0x48) | ||
93 | #define MAX8925_LDOCTL14 (0x4C) | ||
94 | #define MAX8925_LDOCTL15 (0x50) | ||
95 | #define MAX8925_LDOCTL16 (0x10) | ||
96 | #define MAX8925_LDOCTL17 (0x14) | ||
97 | #define MAX8925_LDOCTL18 (0x72) | ||
98 | #define MAX8925_LDOCTL19 (0x5C) | ||
99 | #define MAX8925_LDOCTL20 (0x9C) | ||
100 | #define MAX8925_LDOVOUT1 (0x1A) | ||
101 | #define MAX8925_LDOVOUT2 (0x1E) | ||
102 | #define MAX8925_LDOVOUT3 (0x22) | ||
103 | #define MAX8925_LDOVOUT4 (0x26) | ||
104 | #define MAX8925_LDOVOUT5 (0x2A) | ||
105 | #define MAX8925_LDOVOUT6 (0x2E) | ||
106 | #define MAX8925_LDOVOUT7 (0x32) | ||
107 | #define MAX8925_LDOVOUT8 (0x36) | ||
108 | #define MAX8925_LDOVOUT9 (0x3A) | ||
109 | #define MAX8925_LDOVOUT10 (0x3E) | ||
110 | #define MAX8925_LDOVOUT11 (0x42) | ||
111 | #define MAX8925_LDOVOUT12 (0x46) | ||
112 | #define MAX8925_LDOVOUT13 (0x4A) | ||
113 | #define MAX8925_LDOVOUT14 (0x4E) | ||
114 | #define MAX8925_LDOVOUT15 (0x52) | ||
115 | #define MAX8925_LDOVOUT16 (0x12) | ||
116 | #define MAX8925_LDOVOUT17 (0x16) | ||
117 | #define MAX8925_LDOVOUT18 (0x74) | ||
118 | #define MAX8925_LDOVOUT19 (0x5E) | ||
119 | #define MAX8925_LDOVOUT20 (0x9E) | ||
120 | |||
41 | /* bit definitions */ | 121 | /* bit definitions */ |
42 | #define CHG_IRQ1_MASK (0x07) | 122 | #define CHG_IRQ1_MASK (0x07) |
43 | #define CHG_IRQ2_MASK (0xff) | 123 | #define CHG_IRQ2_MASK (0xff) |
@@ -83,6 +163,8 @@ enum { | |||
83 | #define MAX8925_IRQ_TSC_STICK (0) | 163 | #define MAX8925_IRQ_TSC_STICK (0) |
84 | #define MAX8925_IRQ_TSC_NSTICK (1) | 164 | #define MAX8925_IRQ_TSC_NSTICK (1) |
85 | 165 | ||
166 | #define MAX8925_MAX_REGULATOR (23) | ||
167 | |||
86 | struct max8925_irq { | 168 | struct max8925_irq { |
87 | irq_handler_t handler; | 169 | irq_handler_t handler; |
88 | void *data; | 170 | void *data; |
@@ -100,7 +182,21 @@ struct max8925_chip { | |||
100 | int chip_irq; | 182 | int chip_irq; |
101 | }; | 183 | }; |
102 | 184 | ||
185 | struct max8925_backlight_pdata { | ||
186 | int lxw_scl; /* 0/1 -- 0.8Ohm/0.4Ohm */ | ||
187 | int lxw_freq; /* 700KHz ~ 1400KHz */ | ||
188 | int dual_string; /* 0/1 -- single/dual string */ | ||
189 | }; | ||
190 | |||
191 | struct max8925_touch_pdata { | ||
192 | unsigned int flags; | ||
193 | }; | ||
194 | |||
103 | struct max8925_platform_data { | 195 | struct max8925_platform_data { |
196 | struct max8925_backlight_pdata *backlight; | ||
197 | struct max8925_touch_pdata *touch; | ||
198 | struct regulator_init_data *regulator[MAX8925_MAX_REGULATOR]; | ||
199 | |||
104 | int chip_id; | 200 | int chip_id; |
105 | int chip_irq; | 201 | int chip_irq; |
106 | }; | 202 | }; |