diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2013-06-10 12:59:31 -0400 |
---|---|---|
committer | Bryan Wu <cooloney@gmail.com> | 2013-06-20 19:21:34 -0400 |
commit | ae6cdb03ef1d352c489d6c86e0bcec51365a2c64 (patch) | |
tree | 32e4198c16fe247afc09269cfd445ef929e36c95 | |
parent | 9d263813c27e2ad3da7ea0877e623f4ff8767ddd (diff) |
leds: leds-mc13783: Add MC13892 LED support
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Tested-by: Philippe Retornaz <philippe.retornaz@epfl.ch>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
-rw-r--r-- | drivers/leds/Kconfig | 6 | ||||
-rw-r--r-- | drivers/leds/leds-mc13783.c | 60 | ||||
-rw-r--r-- | include/linux/mfd/mc13xxx.h | 7 |
3 files changed, 69 insertions, 4 deletions
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index ef992293598a..e43402dd1dea 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig | |||
@@ -388,12 +388,12 @@ config LEDS_DELL_NETBOOKS | |||
388 | notebooks that have an external LED. | 388 | notebooks that have an external LED. |
389 | 389 | ||
390 | config LEDS_MC13783 | 390 | config LEDS_MC13783 |
391 | tristate "LED Support for MC13783 PMIC" | 391 | tristate "LED Support for MC13XXX PMIC" |
392 | depends on LEDS_CLASS | 392 | depends on LEDS_CLASS |
393 | depends on MFD_MC13783 | 393 | depends on MFD_MC13XXX |
394 | help | 394 | help |
395 | This option enable support for on-chip LED drivers found | 395 | This option enable support for on-chip LED drivers found |
396 | on Freescale Semiconductor MC13783 PMIC. | 396 | on Freescale Semiconductor MC13783/MC13892 PMIC. |
397 | 397 | ||
398 | config LEDS_NS2 | 398 | config LEDS_NS2 |
399 | tristate "LED support for Network Space v2 GPIO LEDs" | 399 | tristate "LED support for Network Space v2 GPIO LEDs" |
diff --git a/drivers/leds/leds-mc13783.c b/drivers/leds/leds-mc13783.c index da8ec244a641..f4de98052aaa 100644 --- a/drivers/leds/leds-mc13783.c +++ b/drivers/leds/leds-mc13783.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * LEDs driver for Freescale MC13783 | 2 | * LEDs driver for Freescale MC13783/MC13892 |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Philippe Rétornaz | 4 | * Copyright (C) 2010 Philippe Rétornaz |
5 | * | 5 | * |
@@ -85,6 +85,34 @@ static void mc13xxx_led_work(struct work_struct *work) | |||
85 | value = led->new_brightness >> 3; | 85 | value = led->new_brightness >> 3; |
86 | mask = 0x1f; | 86 | mask = 0x1f; |
87 | break; | 87 | break; |
88 | case MC13892_LED_MD: | ||
89 | reg = MC13XXX_REG_LED_CONTROL(0); | ||
90 | shift = 3; | ||
91 | mask = 0x3f; | ||
92 | value = led->new_brightness >> 2; | ||
93 | break; | ||
94 | case MC13892_LED_AD: | ||
95 | reg = MC13XXX_REG_LED_CONTROL(0); | ||
96 | shift = 15; | ||
97 | mask = 0x3f; | ||
98 | value = led->new_brightness >> 2; | ||
99 | break; | ||
100 | case MC13892_LED_KP: | ||
101 | reg = MC13XXX_REG_LED_CONTROL(1); | ||
102 | shift = 3; | ||
103 | mask = 0x3f; | ||
104 | value = led->new_brightness >> 2; | ||
105 | break; | ||
106 | case MC13892_LED_R: | ||
107 | case MC13892_LED_G: | ||
108 | case MC13892_LED_B: | ||
109 | off = led->id - MC13892_LED_R; | ||
110 | bank = off / 2; | ||
111 | reg = MC13XXX_REG_LED_CONTROL(2) + bank; | ||
112 | shift = (off - bank * 2) * 12 + 3; | ||
113 | value = led->new_brightness >> 2; | ||
114 | mask = 0x3f; | ||
115 | break; | ||
88 | default: | 116 | default: |
89 | BUG(); | 117 | BUG(); |
90 | } | 118 | } |
@@ -138,6 +166,29 @@ static int __init mc13xxx_led_setup(struct mc13xxx_led *led, int max_current) | |||
138 | shift = ((led->id - MC13783_LED_R1) - bank * 3) * 2; | 166 | shift = ((led->id - MC13783_LED_R1) - bank * 3) * 2; |
139 | mask = 0x03; | 167 | mask = 0x03; |
140 | break; | 168 | break; |
169 | case MC13892_LED_MD: | ||
170 | reg = MC13XXX_REG_LED_CONTROL(0); | ||
171 | shift = 9; | ||
172 | mask = 0x07; | ||
173 | break; | ||
174 | case MC13892_LED_AD: | ||
175 | reg = MC13XXX_REG_LED_CONTROL(0); | ||
176 | shift = 21; | ||
177 | mask = 0x07; | ||
178 | break; | ||
179 | case MC13892_LED_KP: | ||
180 | reg = MC13XXX_REG_LED_CONTROL(1); | ||
181 | shift = 9; | ||
182 | mask = 0x07; | ||
183 | break; | ||
184 | case MC13892_LED_R: | ||
185 | case MC13892_LED_G: | ||
186 | case MC13892_LED_B: | ||
187 | bank = (led->id - MC13892_LED_R) / 2; | ||
188 | reg = MC13XXX_REG_LED_CONTROL(2) + bank; | ||
189 | shift = ((led->id - MC13892_LED_R) - bank * 2) * 12 + 9; | ||
190 | mask = 0x07; | ||
191 | break; | ||
141 | default: | 192 | default: |
142 | BUG(); | 193 | BUG(); |
143 | } | 194 | } |
@@ -276,8 +327,15 @@ static const struct mc13xxx_led_devtype mc13783_led_devtype = { | |||
276 | .num_regs = 6, | 327 | .num_regs = 6, |
277 | }; | 328 | }; |
278 | 329 | ||
330 | static const struct mc13xxx_led_devtype mc13892_led_devtype = { | ||
331 | .led_min = MC13892_LED_MD, | ||
332 | .led_max = MC13892_LED_B, | ||
333 | .num_regs = 4, | ||
334 | }; | ||
335 | |||
279 | static const struct platform_device_id mc13xxx_led_id_table[] = { | 336 | static const struct platform_device_id mc13xxx_led_id_table[] = { |
280 | { "mc13783-led", (kernel_ulong_t)&mc13783_led_devtype, }, | 337 | { "mc13783-led", (kernel_ulong_t)&mc13783_led_devtype, }, |
338 | { "mc13892-led", (kernel_ulong_t)&mc13892_led_devtype, }, | ||
281 | { } | 339 | { } |
282 | }; | 340 | }; |
283 | MODULE_DEVICE_TABLE(platform, mc13xxx_led_id_table); | 341 | MODULE_DEVICE_TABLE(platform, mc13xxx_led_id_table); |
diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h index ee280f16350c..41ed59276c00 100644 --- a/include/linux/mfd/mc13xxx.h +++ b/include/linux/mfd/mc13xxx.h | |||
@@ -92,6 +92,13 @@ enum { | |||
92 | MC13783_LED_R3, | 92 | MC13783_LED_R3, |
93 | MC13783_LED_G3, | 93 | MC13783_LED_G3, |
94 | MC13783_LED_B3, | 94 | MC13783_LED_B3, |
95 | /* MC13892 LED IDs */ | ||
96 | MC13892_LED_MD, | ||
97 | MC13892_LED_AD, | ||
98 | MC13892_LED_KP, | ||
99 | MC13892_LED_R, | ||
100 | MC13892_LED_G, | ||
101 | MC13892_LED_B, | ||
95 | }; | 102 | }; |
96 | 103 | ||
97 | struct mc13xxx_led_platform_data { | 104 | struct mc13xxx_led_platform_data { |