aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/leds-lp5521.c
diff options
context:
space:
mode:
authorMilo Kim <milo.kim@ti.com>2013-11-21 01:13:34 -0500
committerBryan Wu <cooloney@gmail.com>2014-01-27 20:28:48 -0500
commit28c9266b38a00a07497daad0237f7fa154652ece (patch)
tree211c339c861923ea835a3644eef88aa5f5633e50 /drivers/leds/leds-lp5521.c
parent1f431afdb4572c4f1dc8a3c5159fe910c53fc814 (diff)
leds: lp5521/5523: Fix multiple engine usage bug
Whenever the engine is loaded by the user-application, the operation mode is reset first. But it has a problem in case of multiple engine used because previous engine settings are cleared. The driver should update not whole 8bits but each engine bit by masking. On the other hands, whole engines should be reset when the driver is unloaded and on initializing the LP5523 driver. So, new functions are used for this handling - lp5521/5523_stop_all_engines(). Cc: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Milo Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
Diffstat (limited to 'drivers/leds/leds-lp5521.c')
-rw-r--r--drivers/leds/leds-lp5521.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c
index 05188351711d..26f89ac15998 100644
--- a/drivers/leds/leds-lp5521.c
+++ b/drivers/leds/leds-lp5521.c
@@ -152,12 +152,26 @@ static void lp5521_load_engine(struct lp55xx_chip *chip)
152 lp5521_wait_opmode_done(); 152 lp5521_wait_opmode_done();
153} 153}
154 154
155static void lp5521_stop_engine(struct lp55xx_chip *chip) 155static void lp5521_stop_all_engines(struct lp55xx_chip *chip)
156{ 156{
157 lp55xx_write(chip, LP5521_REG_OP_MODE, 0); 157 lp55xx_write(chip, LP5521_REG_OP_MODE, 0);
158 lp5521_wait_opmode_done(); 158 lp5521_wait_opmode_done();
159} 159}
160 160
161static void lp5521_stop_engine(struct lp55xx_chip *chip)
162{
163 enum lp55xx_engine_index idx = chip->engine_idx;
164 u8 mask[] = {
165 [LP55XX_ENGINE_1] = LP5521_MODE_R_M,
166 [LP55XX_ENGINE_2] = LP5521_MODE_G_M,
167 [LP55XX_ENGINE_3] = LP5521_MODE_B_M,
168 };
169
170 lp55xx_update_bits(chip, LP5521_REG_OP_MODE, mask[idx], 0);
171
172 lp5521_wait_opmode_done();
173}
174
161static void lp5521_run_engine(struct lp55xx_chip *chip, bool start) 175static void lp5521_run_engine(struct lp55xx_chip *chip, bool start)
162{ 176{
163 int ret; 177 int ret;
@@ -568,7 +582,7 @@ static int lp5521_remove(struct i2c_client *client)
568 struct lp55xx_led *led = i2c_get_clientdata(client); 582 struct lp55xx_led *led = i2c_get_clientdata(client);
569 struct lp55xx_chip *chip = led->chip; 583 struct lp55xx_chip *chip = led->chip;
570 584
571 lp5521_stop_engine(chip); 585 lp5521_stop_all_engines(chip);
572 lp55xx_unregister_sysfs(chip); 586 lp55xx_unregister_sysfs(chip);
573 lp55xx_unregister_leds(led, chip); 587 lp55xx_unregister_leds(led, chip);
574 lp55xx_deinit_device(chip); 588 lp55xx_deinit_device(chip);