aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Shiyan <shc_work@mail.ru>2013-06-10 12:59:31 -0400
committerBryan Wu <cooloney@gmail.com>2013-06-20 19:21:34 -0400
commitae6cdb03ef1d352c489d6c86e0bcec51365a2c64 (patch)
tree32e4198c16fe247afc09269cfd445ef929e36c95
parent9d263813c27e2ad3da7ea0877e623f4ff8767ddd (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/Kconfig6
-rw-r--r--drivers/leds/leds-mc13783.c60
-rw-r--r--include/linux/mfd/mc13xxx.h7
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
390config LEDS_MC13783 390config 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
398config LEDS_NS2 398config 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
330static 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
279static const struct platform_device_id mc13xxx_led_id_table[] = { 336static 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};
283MODULE_DEVICE_TABLE(platform, mc13xxx_led_id_table); 341MODULE_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
97struct mc13xxx_led_platform_data { 104struct mc13xxx_led_platform_data {