Commit 260718b3 authored by Guido Günther's avatar Guido Günther Committed by Pavel

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: default avatarGuido Günther <agx@sigxcpu.org>
Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
parent 4a8d2bee
...@@ -116,7 +116,8 @@ struct lm3692x_led { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment