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 <[email protected]>
---
drivers/leds/leds-lm3692x.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c
index d1bd9ae4e7ab..183614744b92 100644
--- a/drivers/leds/leds-lm3692x.c
+++ b/drivers/leds/leds-lm3692x.c
@@ -117,6 +117,7 @@ struct lm3692x_led {
int model_id;
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) {
@@ -271,6 +275,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");
@@ -292,6 +297,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",
@@ -309,6 +317,7 @@ static int lm3692x_leds_disable(struct lm3692x_led *led)
"Failed to disable regulator: %d\n", ret);
}
+ led->enabled = false;
return ret;
}
@@ -322,6 +331,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",
--
2.23.0
On Wed 2019-12-25 12:16:39, Guido G?nther wrote:
> Otherwise there's a noticeable glow even with brightness 0. Also
> turning off the regulator can save additional power.
Ok, this will make set brightness slower, but I guess it makes sense.
Can you try to toggling brightness quickly from userspace, maybe even
from two threads, to ensure nothing really goes wrong there?
Hmm. And if this is independend of the other series, tell me and I can
apply v2.
Best regards,
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Hi Pavel,
On Thu, Dec 26, 2019 at 11:29:56AM +0100, Pavel Machek wrote:
> On Wed 2019-12-25 12:16:39, Guido G?nther wrote:
> > Otherwise there's a noticeable glow even with brightness 0. Also
> > turning off the regulator can save additional power.
>
> Ok, this will make set brightness slower, but I guess it makes sense.
>
> Can you try to toggling brightness quickly from userspace, maybe even
> from two threads, to ensure nothing really goes wrong there?
I ran brightness setting in a tight loop from 0 to max from two threads
100 times without issues.
>
> Hmm. And if this is independend of the other series, tell me and I can
> apply v2.
There's minor merge conflict so to make sure this does not get dependent
on the order i've folded this to the end of the
"leds: lm3692x: Allow to set ovp and brigthness mode"
series with your Acked-by's folded in. I'll wait a couple of days and
then send out a v3.
Cheers and thanks for having a look,
-- Guido
>
> Best regards,
> Pavel
> --
> (english) http://www.livejournal.com/~pavelmachek
> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html