leds: lm3692x: Disable chip on brightness 0
authorGuido Günther <agx@sigxcpu.org>
Mon, 6 Jan 2020 15:48:53 +0000 (16:48 +0100)
committerPavel <pavel@ucw.cz>
Tue, 7 Jan 2020 13:09:27 +0000 (14:09 +0100)
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>
drivers/leds/leds-lm3692x.c

index 1254695..28a51ae 100644 (file)
@@ -116,7 +116,8 @@ struct lm3692x_led {
        int led_enable;
        int model_id;
 
-       u8 boost_ctrl;
+       u8 boost_ctrl, brightness_ctrl;
+       bool enabled;
 };
 
 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 ret, reg_ret;
 
+       if (led->enabled)
+               return 0;
+
        if (led->regulator) {
                ret = regulator_enable(led->regulator);
                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,
                                 enable_state | LM3692X_DEVICE_EN);
 
+       led->enabled = true;
        return ret;
 out:
        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;
 
+       if (!led->enabled)
+               return 0;
+
        ret = regmap_update_bits(led->regmap, LM3692X_EN, LM3692X_DEVICE_EN, 0);
        if (ret) {
                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);
        }
 
+       led->enabled = false;
        return ret;
 }
 
@@ -323,6 +332,13 @@ static int lm3692x_brightness_set(struct led_classdev *led_cdev,
 
        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);
        if (ret) {
                dev_err(&led->client->dev, "Cannot read/clear faults: %d\n",