mbox series

[0/2] leds: lm3692x: Allow to set ovp and brigthness mode

Message ID cover.1576499103.git.agx@sigxcpu.org
Headers show
Series leds: lm3692x: Allow to set ovp and brigthness mode | expand

Message

Guido Günther Dec. 16, 2019, 12:28 p.m. UTC
Overvoltage protection and brightness mode are currently hardcoded
as disabled in the driver. Make these configurable via DT.

Guido Günther (2):
  dt: bindings: lm3692x: Document new properties
  leds: lm3692x: Allow to set ovp and brigthness mode

 .../devicetree/bindings/leds/leds-lm3692x.txt |  4 ++
 drivers/leds/leds-lm3692x.c                   | 43 ++++++++++++++++---
 2 files changed, 41 insertions(+), 6 deletions(-)

Comments

Dan Murphy Dec. 17, 2019, 12:53 p.m. UTC | #1
Guido

On 12/16/19 6:28 AM, Guido Günther wrote:
> Overvoltage protection and brightness mode are currently hardcoded
> as disabled in the driver. Make these configurable via DT.

Can we split these up to two separate patch series?

We are adding 2 separate features and if something is incorrect with one 
of the changes it is a bit hard to debug.

>
> Signed-off-by: Guido Günther <agx@sigxcpu.org>
> ---
>   drivers/leds/leds-lm3692x.c | 43 +++++++++++++++++++++++++++++++------
>   1 file changed, 37 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c
> index 8b408102e138..2c084b333628 100644
> --- a/drivers/leds/leds-lm3692x.c
> +++ b/drivers/leds/leds-lm3692x.c
> @@ -114,6 +114,7 @@ struct lm3692x_led {
>   	struct regulator *regulator;
>   	int led_enable;
>   	int model_id;
> +	u8 boost_ctrl, brightness_ctrl;
>   };
>   
>   static const struct reg_default lm3692x_reg_defs[] = {
> @@ -249,10 +250,7 @@ static int lm3692x_init(struct lm3692x_led *led)
>   	if (ret)
>   		goto out;
>   
> -	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL,
> -			LM3692X_BOOST_SW_1MHZ |
> -			LM3692X_BOOST_SW_NO_SHIFT |
> -			LM3692X_OCP_PROT_1_5A);
> +	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL, led->boost_ctrl);
>   	if (ret)
>   		goto out;

regmap_update_bits


>   
> @@ -268,8 +266,7 @@ static int lm3692x_init(struct lm3692x_led *led)
>   	if (ret)
>   		goto out;
>   
> -	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL,
> -			LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN);
> +	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL, led->brightness_ctrl);
>   	if (ret)
>   		goto out;
regmap_update_bits
>   
> @@ -326,6 +323,8 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
>   {
>   	struct fwnode_handle *child = NULL;
>   	struct led_init_data init_data = {};
> +	u32 ovp = 0;
> +	bool exp_mode;
>   	int ret;
>   
>   	led->enable_gpio = devm_gpiod_get_optional(&led->client->dev,
> @@ -350,6 +349,38 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
>   		led->regulator = NULL;
>   	}
>   
> +	led->boost_ctrl = LM3692X_BOOST_SW_1MHZ |
> +		LM3692X_BOOST_SW_NO_SHIFT |
> +		LM3692X_OCP_PROT_1_5A;
Make this a #define and then it can be reused as a mask for 
regmap_update_bits
> +	ret = device_property_read_u32(&led->client->dev,
> +				       "ti,overvoltage-volts", &ovp);
> +	if (!ret) {

if (ret)

     set boost_ctrl to default value since the default is not 0

led->boost_ctrl |= LM3692X_OVP_29V;

else

      do case

> +		switch (ovp) {
> +		case 0:
> +			break;
> +		case 22:
If the value is 21v why is this case 22?  DT binding says 21 is the 
first value
> +			led->boost_ctrl |= LM3692X_OVP_21V;
> +			break;
> +		case 25:
> +			led->boost_ctrl |= LM3692X_OVP_25V;
> +			break;
> +		case 29:
> +			led->boost_ctrl |= LM3692X_OVP_29V;
> +			break;
> +		default:
> +			dev_err(&led->client->dev, "Invalid OVP %d\n", ovp);
> +			return -EINVAL;
> +		}
> +	}
> +	dev_dbg(&led->client->dev, "OVP: %dV", ovp);
> +
extra debug statement
> +	led->brightness_ctrl = LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN;
Same comment as before on the #define
> +	exp_mode = device_property_read_bool(&led->client->dev,
> +				     "ti,brightness-mapping-exponential");
> +	dev_dbg(&led->client->dev, "Exponential brightness: %d", exp_mode);

extra debug statement

Dan
Guido Günther Dec. 17, 2019, 3:40 p.m. UTC | #2
Hi Dan,
On Tue, Dec 17, 2019 at 06:53:45AM -0600, Dan Murphy wrote:
> Guido
> 
> On 12/16/19 6:28 AM, Guido Günther wrote:
> > Overvoltage protection and brightness mode are currently hardcoded
> > as disabled in the driver. Make these configurable via DT.
> 
> Can we split these up to two separate patch series?

Sure, should the binding doc updates be split as well?

> We are adding 2 separate features and if something is incorrect with one of
> the changes it is a bit hard to debug.
> 
> > 
> > Signed-off-by: Guido Günther <agx@sigxcpu.org>
> > ---
> >   drivers/leds/leds-lm3692x.c | 43 +++++++++++++++++++++++++++++++------
> >   1 file changed, 37 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c
> > index 8b408102e138..2c084b333628 100644
> > --- a/drivers/leds/leds-lm3692x.c
> > +++ b/drivers/leds/leds-lm3692x.c
> > @@ -114,6 +114,7 @@ struct lm3692x_led {
> >   	struct regulator *regulator;
> >   	int led_enable;
> >   	int model_id;
> > +	u8 boost_ctrl, brightness_ctrl;
> >   };
> >   static const struct reg_default lm3692x_reg_defs[] = {
> > @@ -249,10 +250,7 @@ static int lm3692x_init(struct lm3692x_led *led)
> >   	if (ret)
> >   		goto out;
> > -	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL,
> > -			LM3692X_BOOST_SW_1MHZ |
> > -			LM3692X_BOOST_SW_NO_SHIFT |
> > -			LM3692X_OCP_PROT_1_5A);
> > +	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL, led->boost_ctrl);
> >   	if (ret)
> >   		goto out;
> 
> regmap_update_bits
> 
> 
> > @@ -268,8 +266,7 @@ static int lm3692x_init(struct lm3692x_led *led)
> >   	if (ret)
> >   		goto out;
> > -	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL,
> > -			LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN);
> > +	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL, led->brightness_ctrl);
> >   	if (ret)
> >   		goto out;
> regmap_update_bits
> > @@ -326,6 +323,8 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
> >   {
> >   	struct fwnode_handle *child = NULL;
> >   	struct led_init_data init_data = {};
> > +	u32 ovp = 0;
> > +	bool exp_mode;
> >   	int ret;
> >   	led->enable_gpio = devm_gpiod_get_optional(&led->client->dev,
> > @@ -350,6 +349,38 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
> >   		led->regulator = NULL;
> >   	}
> > +	led->boost_ctrl = LM3692X_BOOST_SW_1MHZ |
> > +		LM3692X_BOOST_SW_NO_SHIFT |
> > +		LM3692X_OCP_PROT_1_5A;
> Make this a #define and then it can be reused as a mask for
> regmap_update_bits
> > +	ret = device_property_read_u32(&led->client->dev,
> > +				       "ti,overvoltage-volts", &ovp);
> > +	if (!ret) {
> 
> if (ret)
> 
>     set boost_ctrl to default value since the default is not 0
> 
> led->boost_ctrl |= LM3692X_OVP_29V;
> 
> else
> 
>      do case
> 
> > +		switch (ovp) {
> > +		case 0:
> > +			break;
> > +		case 22:
> If the value is 21v why is this case 22?  DT binding says 21 is the first
> value
> > +			led->boost_ctrl |= LM3692X_OVP_21V;
> > +			break;
> > +		case 25:
> > +			led->boost_ctrl |= LM3692X_OVP_25V;
> > +			break;
> > +		case 29:
> > +			led->boost_ctrl |= LM3692X_OVP_29V;
> > +			break;
> > +		default:
> > +			dev_err(&led->client->dev, "Invalid OVP %d\n", ovp);
> > +			return -EINVAL;
> > +		}
> > +	}
> > +	dev_dbg(&led->client->dev, "OVP: %dV", ovp);
> > +
> extra debug statement
> > +	led->brightness_ctrl = LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN;
> Same comment as before on the #define
> > +	exp_mode = device_property_read_bool(&led->client->dev,
> > +				     "ti,brightness-mapping-exponential");
> > +	dev_dbg(&led->client->dev, "Exponential brightness: %d", exp_mode);
> 
> extra debug statement

They're not extra but meant to ease debugging the driver long therm but
i can drop these if that's not wanted. The rest makes a lot of sense.
Thanks a lot for having a look so promptly!

Cheers,
 -- Guido

> 
> Dan
> 
>
Dan Murphy Dec. 17, 2019, 5:01 p.m. UTC | #3
Guido

On 12/17/19 9:40 AM, Guido Günther wrote:
> Hi Dan,
> On Tue, Dec 17, 2019 at 06:53:45AM -0600, Dan Murphy wrote:
>> Guido
>>
>> On 12/16/19 6:28 AM, Guido Günther wrote:
>>> Overvoltage protection and brightness mode are currently hardcoded
>>> as disabled in the driver. Make these configurable via DT.
>> Can we split these up to two separate patch series?
> Sure, should the binding doc updates be split as well?

Yes.

<snip>
>> extra debug statement
> They're not extra but meant to ease debugging the driver long therm but
> i can drop these if that's not wanted. The rest makes a lot of sense.
> Thanks a lot for having a look so promptly!

Yes please remove those we don't need extra noise in the log.

If someone wants to debug this then they can add the statements themselves

Dan
Pavel Machek Dec. 21, 2019, 7:17 p.m. UTC | #4
On Tue 2019-12-17 06:53:45, Dan Murphy wrote:
> Guido
> 
> On 12/16/19 6:28 AM, Guido Günther wrote:
> >Overvoltage protection and brightness mode are currently hardcoded
> >as disabled in the driver. Make these configurable via DT.
> 
> Can we split these up to two separate patch series?

No need to split it up to separate _patch series_. I actually believe
single patch is okay here.

Thanks,
								Pavel
Pavel Machek Dec. 21, 2019, 7:18 p.m. UTC | #5
Hi!

> Overvoltage protection and brightness mode are currently hardcoded
> as disabled in the driver. Make these configurable via DT.

What exactly is overvoltage protection good for? Should we default to
29V if we have no other information?

> Signed-off-by: Guido Günther <agx@sigxcpu.org>

> +	ret = device_property_read_u32(&led->client->dev,
> +				       "ti,overvoltage-volts", &ovp);
> +	if (!ret) {
> +		switch (ovp) {
> +		case 0:
> +			break;
> +		case 22:
> +			led->boost_ctrl |= LM3692X_OVP_21V;
> +			break;

Should be case 21.
								Pavel
Guido Günther Dec. 24, 2019, 11:26 a.m. UTC | #6
Hi,
On Sat, Dec 21, 2019 at 08:18:44PM +0100, Pavel Machek wrote:
> Hi!
> 
> > Overvoltage protection and brightness mode are currently hardcoded
> > as disabled in the driver. Make these configurable via DT.
> 
> What exactly is overvoltage protection good for? Should we default to
> 29V if we have no other information?

The OVP protects the IC from overvoltage conditions on the output side.
While looking at the manual again I noticed that i misremembered the
'00' value which means 17V - not unprotected. Also the chip defaults
to 29V OVP so i've adjusted that too.

Cheers,
 -- Guido

> 
> > Signed-off-by: Guido Günther <agx@sigxcpu.org>
> 
> > +	ret = device_property_read_u32(&led->client->dev,
> > +				       "ti,overvoltage-volts", &ovp);
> > +	if (!ret) {
> > +		switch (ovp) {
> > +		case 0:
> > +			break;
> > +		case 22:
> > +			led->boost_ctrl |= LM3692X_OVP_21V;
> > +			break;
> 
> Should be case 21.
> 								Pavel
> -- 
> (english) http://www.livejournal.com/~pavelmachek
> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Guido Günther Dec. 24, 2019, 11:30 a.m. UTC | #7
Hi Dan,
I'm a bit confused about the regmap_write -> regmap_update_bits switch
(see below), maybe you can shed some light on it?

On Tue, Dec 17, 2019 at 06:53:45AM -0600, Dan Murphy wrote:
> Guido
> 
> On 12/16/19 6:28 AM, Guido Günther wrote:
> > Overvoltage protection and brightness mode are currently hardcoded
> > as disabled in the driver. Make these configurable via DT.
> 
> Can we split these up to two separate patch series?
> 
> We are adding 2 separate features and if something is incorrect with one of
> the changes it is a bit hard to debug.
> 
> > 
> > Signed-off-by: Guido Günther <agx@sigxcpu.org>
> > ---
> >   drivers/leds/leds-lm3692x.c | 43 +++++++++++++++++++++++++++++++------
> >   1 file changed, 37 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c
> > index 8b408102e138..2c084b333628 100644
> > --- a/drivers/leds/leds-lm3692x.c
> > +++ b/drivers/leds/leds-lm3692x.c
> > @@ -114,6 +114,7 @@ struct lm3692x_led {
> >   	struct regulator *regulator;
> >   	int led_enable;
> >   	int model_id;
> > +	u8 boost_ctrl, brightness_ctrl;
> >   };
> >   static const struct reg_default lm3692x_reg_defs[] = {
> > @@ -249,10 +250,7 @@ static int lm3692x_init(struct lm3692x_led *led)
> >   	if (ret)
> >   		goto out;
> > -	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL,
> > -			LM3692X_BOOST_SW_1MHZ |
> > -			LM3692X_BOOST_SW_NO_SHIFT |
> > -			LM3692X_OCP_PROT_1_5A);
> > +	ret = regmap_write(led->regmap, LM3692X_BOOST_CTRL, led->boost_ctrl);
> >   	if (ret)
> >   		goto out;
> 
> regmap_update_bits

The driver is writing full register values (regmap_write) here as
before, do you want that to change? Likely i'm overlooking something.

> > @@ -268,8 +266,7 @@ static int lm3692x_init(struct lm3692x_led *led)
> >   	if (ret)
> >   		goto out;
> > -	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL,
> > -			LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN);
> > +	ret = regmap_write(led->regmap, LM3692X_BRT_CTRL, led->brightness_ctrl);
> >   	if (ret)
> >   		goto out;
> regmap_update_bits

Same here.

> > @@ -326,6 +323,8 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
> >   {
> >   	struct fwnode_handle *child = NULL;
> >   	struct led_init_data init_data = {};
> > +	u32 ovp = 0;
> > +	bool exp_mode;
> >   	int ret;
> >   	led->enable_gpio = devm_gpiod_get_optional(&led->client->dev,
> > @@ -350,6 +349,38 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
> >   		led->regulator = NULL;
> >   	}
> > +	led->boost_ctrl = LM3692X_BOOST_SW_1MHZ |
> > +		LM3692X_BOOST_SW_NO_SHIFT |
> > +		LM3692X_OCP_PROT_1_5A;
> Make this a #define and then it can be reused as a mask for
> regmap_update_bits
> > +	ret = device_property_read_u32(&led->client->dev,
> > +				       "ti,overvoltage-volts", &ovp);
> > +	if (!ret) {
> 
> if (ret)
> 
>     set boost_ctrl to default value since the default is not 0
>
> led->boost_ctrl |= LM3692X_OVP_29V;
> 
> else
> 
>      do case
>

Fixed.

> > +		switch (ovp) {
> > +		case 0:
> > +			break;
> > +		case 22:
> If the value is 21v why is this case 22?  DT binding says 21 is the first
> value

Fixed, also added the 17V for the case where both bits a are 0.

> > +			led->boost_ctrl |= LM3692X_OVP_21V;
> > +			break;
> > +		case 25:
> > +			led->boost_ctrl |= LM3692X_OVP_25V;
> > +			break;
> > +		case 29:
> > +			led->boost_ctrl |= LM3692X_OVP_29V;
> > +			break;
> > +		default:
> > +			dev_err(&led->client->dev, "Invalid OVP %d\n", ovp);
> > +			return -EINVAL;
> > +		}
> > +	}
> > +	dev_dbg(&led->client->dev, "OVP: %dV", ovp);
> > +
> extra debug statement

dropped.

> > +	led->brightness_ctrl = LM3692X_BL_ADJ_POL | LM3692X_RAMP_EN;
> Same comment as before on the #define
> > +	exp_mode = device_property_read_bool(&led->client->dev,
> > +				     "ti,brightness-mapping-exponential");
> > +	dev_dbg(&led->client->dev, "Exponential brightness: %d", exp_mode);
> 
> extra debug statement

dropped.

Cheers and thanks for the comments,
 -- Guido

> 
> Dan
> 
>