diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2014-02-01 01:36:30 -0500 |
---|---|---|
committer | Bryan Wu <cooloney@gmail.com> | 2014-02-27 12:56:55 -0500 |
commit | 677d13f27e9735d3f2e8d7b8b54cbd820630638a (patch) | |
tree | 19c46845d883c6e5bdc623bb95256e1e075e97a0 | |
parent | 02e9e11e24c30828a26daad04f9f165906b62efd (diff) |
leds: leds-mc13783: Use proper "max_brightness" value fo LEDs
Instead of using maximum value of 255 and shift it to appropriate
LED duty cycle, this patch introduce a helper to use proper maximum
value for each LED.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
-rw-r--r-- | drivers/leds/leds-mc13783.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/leds/leds-mc13783.c b/drivers/leds/leds-mc13783.c index 491309a9551c..b1686b441205 100644 --- a/drivers/leds/leds-mc13783.c +++ b/drivers/leds/leds-mc13783.c | |||
@@ -45,11 +45,21 @@ struct mc13xxx_leds { | |||
45 | struct mc13xxx_led led[0]; | 45 | struct mc13xxx_led led[0]; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | static unsigned int mc13xxx_max_brightness(int id) | ||
49 | { | ||
50 | if (id >= MC13783_LED_MD && id <= MC13783_LED_KP) | ||
51 | return 0x0f; | ||
52 | else if (id >= MC13783_LED_R1 && id <= MC13783_LED_B3) | ||
53 | return 0x1f; | ||
54 | |||
55 | return 0x3f; | ||
56 | } | ||
57 | |||
48 | static void mc13xxx_led_work(struct work_struct *work) | 58 | static void mc13xxx_led_work(struct work_struct *work) |
49 | { | 59 | { |
50 | struct mc13xxx_led *led = container_of(work, struct mc13xxx_led, work); | 60 | struct mc13xxx_led *led = container_of(work, struct mc13xxx_led, work); |
51 | struct mc13xxx_leds *leds = led->leds; | 61 | struct mc13xxx_leds *leds = led->leds; |
52 | unsigned int reg, mask, value, bank, off, shift; | 62 | unsigned int reg, bank, off, shift; |
53 | 63 | ||
54 | switch (led->id) { | 64 | switch (led->id) { |
55 | case MC13783_LED_MD: | 65 | case MC13783_LED_MD: |
@@ -57,8 +67,6 @@ static void mc13xxx_led_work(struct work_struct *work) | |||
57 | case MC13783_LED_KP: | 67 | case MC13783_LED_KP: |
58 | reg = 2; | 68 | reg = 2; |
59 | shift = 9 + (led->id - MC13783_LED_MD) * 4; | 69 | shift = 9 + (led->id - MC13783_LED_MD) * 4; |
60 | mask = 0x0f; | ||
61 | value = led->new_brightness >> 4; | ||
62 | break; | 70 | break; |
63 | case MC13783_LED_R1: | 71 | case MC13783_LED_R1: |
64 | case MC13783_LED_G1: | 72 | case MC13783_LED_G1: |
@@ -73,16 +81,12 @@ static void mc13xxx_led_work(struct work_struct *work) | |||
73 | bank = off / 3; | 81 | bank = off / 3; |
74 | reg = 3 + bank; | 82 | reg = 3 + bank; |
75 | shift = (off - bank * 3) * 5 + 6; | 83 | shift = (off - bank * 3) * 5 + 6; |
76 | value = led->new_brightness >> 3; | ||
77 | mask = 0x1f; | ||
78 | break; | 84 | break; |
79 | case MC13892_LED_MD: | 85 | case MC13892_LED_MD: |
80 | case MC13892_LED_AD: | 86 | case MC13892_LED_AD: |
81 | case MC13892_LED_KP: | 87 | case MC13892_LED_KP: |
82 | reg = (led->id - MC13892_LED_MD) / 2; | 88 | reg = (led->id - MC13892_LED_MD) / 2; |
83 | shift = 3 + (led->id - MC13892_LED_MD) * 12; | 89 | shift = 3 + (led->id - MC13892_LED_MD) * 12; |
84 | mask = 0x3f; | ||
85 | value = led->new_brightness >> 2; | ||
86 | break; | 90 | break; |
87 | case MC13892_LED_R: | 91 | case MC13892_LED_R: |
88 | case MC13892_LED_G: | 92 | case MC13892_LED_G: |
@@ -91,22 +95,19 @@ static void mc13xxx_led_work(struct work_struct *work) | |||
91 | bank = off / 2; | 95 | bank = off / 2; |
92 | reg = 2 + bank; | 96 | reg = 2 + bank; |
93 | shift = (off - bank * 2) * 12 + 3; | 97 | shift = (off - bank * 2) * 12 + 3; |
94 | value = led->new_brightness >> 2; | ||
95 | mask = 0x3f; | ||
96 | break; | 98 | break; |
97 | case MC34708_LED_R: | 99 | case MC34708_LED_R: |
98 | case MC34708_LED_G: | 100 | case MC34708_LED_G: |
99 | reg = 0; | 101 | reg = 0; |
100 | shift = 3 + (led->id - MC34708_LED_R) * 12; | 102 | shift = 3 + (led->id - MC34708_LED_R) * 12; |
101 | value = led->new_brightness >> 2; | ||
102 | mask = 0x3f; | ||
103 | break; | 103 | break; |
104 | default: | 104 | default: |
105 | BUG(); | 105 | BUG(); |
106 | } | 106 | } |
107 | 107 | ||
108 | mc13xxx_reg_rmw(leds->master, leds->devtype->ledctrl_base + reg, | 108 | mc13xxx_reg_rmw(leds->master, leds->devtype->ledctrl_base + reg, |
109 | mask << shift, value << shift); | 109 | mc13xxx_max_brightness(led->id) << shift, |
110 | led->new_brightness << shift); | ||
110 | } | 111 | } |
111 | 112 | ||
112 | static void mc13xxx_led_set(struct led_classdev *led_cdev, | 113 | static void mc13xxx_led_set(struct led_classdev *led_cdev, |
@@ -186,7 +187,7 @@ static int __init mc13xxx_led_probe(struct platform_device *pdev) | |||
186 | leds->led[i].cdev.default_trigger = trig; | 187 | leds->led[i].cdev.default_trigger = trig; |
187 | leds->led[i].cdev.flags = LED_CORE_SUSPENDRESUME; | 188 | leds->led[i].cdev.flags = LED_CORE_SUSPENDRESUME; |
188 | leds->led[i].cdev.brightness_set = mc13xxx_led_set; | 189 | leds->led[i].cdev.brightness_set = mc13xxx_led_set; |
189 | leds->led[i].cdev.brightness = LED_OFF; | 190 | leds->led[i].cdev.max_brightness = mc13xxx_max_brightness(id); |
190 | 191 | ||
191 | INIT_WORK(&leds->led[i].work, mc13xxx_led_work); | 192 | INIT_WORK(&leds->led[i].work, mc13xxx_led_work); |
192 | 193 | ||