leds: lm3692x: Disable chip on brightness 0

Otherwise there's a noticeable glow even with brightness 0. Also
turning off the regulator can save additional power.

Signed-off-by: Guido Günther <agx@sigxcpu.org>
Signed-off-by: Pavel Machek <pavel@ucw.cz>
This commit is contained in:
Guido Günther 2020-01-06 16:48:53 +01:00 committed by Pavel
parent 4a8d2bee20
commit 260718b3a3

View File

@ -116,7 +116,8 @@ struct lm3692x_led {
int led_enable; int led_enable;
int model_id; int model_id;
u8 boost_ctrl; u8 boost_ctrl, brightness_ctrl;
bool enabled;
}; };
static const struct reg_default lm3692x_reg_defs[] = { static const struct reg_default lm3692x_reg_defs[] = {
@ -170,6 +171,9 @@ static int lm3692x_leds_enable(struct lm3692x_led *led)
int enable_state; int enable_state;
int ret, reg_ret; int ret, reg_ret;
if (led->enabled)
return 0;
if (led->regulator) { if (led->regulator) {
ret = regulator_enable(led->regulator); ret = regulator_enable(led->regulator);
if (ret) { if (ret) {
@ -272,6 +276,7 @@ static int lm3692x_leds_enable(struct lm3692x_led *led)
ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_ENABLE_MASK, ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_ENABLE_MASK,
enable_state | LM3692X_DEVICE_EN); enable_state | LM3692X_DEVICE_EN);
led->enabled = true;
return ret; return ret;
out: out:
dev_err(&led->client->dev, "Fail writing initialization values\n"); dev_err(&led->client->dev, "Fail writing initialization values\n");
@ -293,6 +298,9 @@ static int lm3692x_leds_disable(struct lm3692x_led *led)
{ {
int ret; int ret;
if (!led->enabled)
return 0;
ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_DEVICE_EN, 0); ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_DEVICE_EN, 0);
if (ret) { if (ret) {
dev_err(&led->client->dev, "Failed to disable regulator: %d\n", dev_err(&led->client->dev, "Failed to disable regulator: %d\n",
@ -310,6 +318,7 @@ static int lm3692x_leds_disable(struct lm3692x_led *led)
"Failed to disable regulator: %d\n", ret); "Failed to disable regulator: %d\n", ret);
} }
led->enabled = false;
return ret; return ret;
} }
@ -323,6 +332,13 @@ static int lm3692x_brightness_set(struct led_classdev *led_cdev,
mutex_lock(&led->lock); mutex_lock(&led->lock);
if (brt_val == 0) {
ret = lm3692x_leds_disable(led);
goto out;
} else {
lm3692x_leds_enable(led);
}
ret = lm3692x_fault_check(led); ret = lm3692x_fault_check(led);
if (ret) { if (ret) {
dev_err(&led->client->dev, "Cannot read/clear faults: %d\n", dev_err(&led->client->dev, "Cannot read/clear faults: %d\n",