2023-12-14 19:52:28

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 0/2] backlight: mp3309c: Allow to use on non-OF platforms

Allow to use driver on non-OF platforms and other cleanups.

Andy Shevchenko (2):
backlight: mp3309c: Make use of device properties
backlight: mp3309c: Utilise temporary variable for struct device

drivers/video/backlight/mp3309c.c | 76 +++++++++++++------------------
1 file changed, 31 insertions(+), 45 deletions(-)

--
2.43.0.rc1.1.gbec44491f096



2023-12-14 19:52:48

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 1/2] backlight: mp3309c: Make use of device properties

Convert the module to be property provider agnostic and allow
it to be used on non-OF platforms.

Add mod_devicetable.h include.

Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/video/backlight/mp3309c.c | 38 ++++++++++++-------------------
1 file changed, 15 insertions(+), 23 deletions(-)

diff --git a/drivers/video/backlight/mp3309c.c b/drivers/video/backlight/mp3309c.c
index 34d71259fac1..d9b08f191999 100644
--- a/drivers/video/backlight/mp3309c.c
+++ b/drivers/video/backlight/mp3309c.c
@@ -15,6 +15,8 @@
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
+#include <linux/mod_devicetable.h>
+#include <linux/property.h>
#include <linux/pwm.h>
#include <linux/regmap.h>

@@ -202,15 +204,12 @@ static const struct backlight_ops mp3309c_bl_ops = {
static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
struct mp3309c_platform_data *pdata)
{
- struct device_node *node = chip->dev->of_node;
- struct property *prop_pwms;
- struct property *prop_levels = NULL;
- int length = 0;
int ret, i;
unsigned int num_levels, tmp_value;
+ struct device *dev = chip->dev;

- if (!node) {
- dev_err(chip->dev, "failed to get DT node\n");
+ if (!dev_fwnode(dev)) {
+ dev_err(dev, "failed to get firmware node\n");
return -ENODEV;
}

@@ -224,8 +223,7 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
* found in the backlight node, the mode switches to PWM mode.
*/
pdata->dimming_mode = DIMMING_ANALOG_I2C;
- prop_pwms = of_find_property(node, "pwms", &length);
- if (prop_pwms) {
+ if (device_property_present(dev, "pwms")) {
chip->pwmd = devm_pwm_get(chip->dev, NULL);
if (IS_ERR(chip->pwmd))
return dev_err_probe(chip->dev, PTR_ERR(chip->pwmd),
@@ -257,11 +255,9 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
/*
* PWM control mode: check for brightness level in DT
*/
- prop_levels = of_find_property(node, "brightness-levels",
- &length);
- if (prop_levels) {
+ if (device_property_present(dev, "brightness-levels")) {
/* Read brightness levels from DT */
- num_levels = length / sizeof(u32);
+ num_levels = device_property_count_u32(dev, "brightness-levels");
if (num_levels < 2)
return -EINVAL;
} else {
@@ -275,10 +271,9 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
sizeof(*pdata->levels), GFP_KERNEL);
if (!pdata->levels)
return -ENOMEM;
- if (prop_levels) {
- ret = of_property_read_u32_array(node, "brightness-levels",
- pdata->levels,
- num_levels);
+ if (device_property_present(dev, "brightness-levels")) {
+ ret = device_property_read_u32_array(dev, "brightness-levels",
+ pdata->levels, num_levels);
if (ret < 0)
return ret;
} else {
@@ -288,8 +283,7 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,

pdata->max_brightness = num_levels - 1;

- ret = of_property_read_u32(node, "default-brightness",
- &pdata->default_brightness);
+ ret = device_property_read_u32(dev, "default-brightness", &pdata->default_brightness);
if (ret)
pdata->default_brightness = pdata->max_brightness;
if (pdata->default_brightness > pdata->max_brightness) {
@@ -310,8 +304,8 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
* If missing, the default value for OVP is 35.5V
*/
pdata->over_voltage_protection = REG_I2C_1_OVP1;
- if (!of_property_read_u32(node, "mps,overvoltage-protection-microvolt",
- &tmp_value)) {
+ ret = device_property_read_u32(dev, "mps,overvoltage-protection-microvolt", &tmp_value);
+ if (!ret) {
switch (tmp_value) {
case 13500000:
pdata->over_voltage_protection = 0x00;
@@ -328,9 +322,7 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
}

/* Synchronous (default) and non-synchronous mode */
- pdata->sync_mode = true;
- if (of_property_read_bool(node, "mps,no-sync-mode"))
- pdata->sync_mode = false;
+ pdata->sync_mode = !device_property_read_bool(dev, "mps,no-sync-mode");

return 0;
}
--
2.43.0.rc1.1.gbec44491f096


2023-12-14 19:59:08

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 2/2] backlight: mp3309c: Utilise temporary variable for struct device

We have a temporary variable to keep pointer to struct device.
Utilise it where it makes sense.

Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/video/backlight/mp3309c.c | 38 +++++++++++++------------------
1 file changed, 16 insertions(+), 22 deletions(-)

diff --git a/drivers/video/backlight/mp3309c.c b/drivers/video/backlight/mp3309c.c
index d9b08f191999..57eb1bcc054d 100644
--- a/drivers/video/backlight/mp3309c.c
+++ b/drivers/video/backlight/mp3309c.c
@@ -224,10 +224,9 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
*/
pdata->dimming_mode = DIMMING_ANALOG_I2C;
if (device_property_present(dev, "pwms")) {
- chip->pwmd = devm_pwm_get(chip->dev, NULL);
+ chip->pwmd = devm_pwm_get(dev, NULL);
if (IS_ERR(chip->pwmd))
- return dev_err_probe(chip->dev, PTR_ERR(chip->pwmd),
- "error getting pwm data\n");
+ return dev_err_probe(dev, PTR_ERR(chip->pwmd), "error getting pwm data\n");
pdata->dimming_mode = DIMMING_PWM;
pwm_apply_args(chip->pwmd);
}
@@ -245,11 +244,9 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
num_levels = ANALOG_I2C_NUM_LEVELS;

/* Enable GPIO used in I2C dimming mode only */
- chip->enable_gpio = devm_gpiod_get(chip->dev, "enable",
- GPIOD_OUT_HIGH);
+ chip->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
if (IS_ERR(chip->enable_gpio))
- return dev_err_probe(chip->dev,
- PTR_ERR(chip->enable_gpio),
+ return dev_err_probe(dev, PTR_ERR(chip->enable_gpio),
"error getting enable gpio\n");
} else {
/*
@@ -267,8 +264,7 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
}

/* Fill brightness levels array */
- pdata->levels = devm_kcalloc(chip->dev, num_levels,
- sizeof(*pdata->levels), GFP_KERNEL);
+ pdata->levels = devm_kcalloc(dev, num_levels, sizeof(*pdata->levels), GFP_KERNEL);
if (!pdata->levels)
return -ENOMEM;
if (device_property_present(dev, "brightness-levels")) {
@@ -287,8 +283,7 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
if (ret)
pdata->default_brightness = pdata->max_brightness;
if (pdata->default_brightness > pdata->max_brightness) {
- dev_err(chip->dev,
- "default brightness exceeds max brightness\n");
+ dev_err(dev, "default brightness exceeds max brightness\n");
pdata->default_brightness = pdata->max_brightness;
}

@@ -329,32 +324,33 @@ static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,

static int mp3309c_probe(struct i2c_client *client)
{
- struct mp3309c_platform_data *pdata = dev_get_platdata(&client->dev);
+ struct device *dev = &client->dev;
+ struct mp3309c_platform_data *pdata = dev_get_platdata(dev);
struct mp3309c_chip *chip;
struct backlight_properties props;
struct pwm_state pwmstate;
int ret;

if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
- dev_err(&client->dev, "failed to check i2c functionality\n");
+ dev_err(dev, "failed to check i2c functionality\n");
return -EOPNOTSUPP;
}

- chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
+ chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
if (!chip)
return -ENOMEM;

- chip->dev = &client->dev;
+ chip->dev = dev;

chip->regmap = devm_regmap_init_i2c(client, &mp3309c_regmap);
if (IS_ERR(chip->regmap))
- return dev_err_probe(&client->dev, PTR_ERR(chip->regmap),
+ return dev_err_probe(dev, PTR_ERR(chip->regmap),
"failed to allocate register map\n");

i2c_set_clientdata(client, chip);

if (!pdata) {
- pdata = devm_kzalloc(chip->dev, sizeof(*pdata), GFP_KERNEL);
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return -ENOMEM;

@@ -371,11 +367,10 @@ static int mp3309c_probe(struct i2c_client *client)
props.type = BACKLIGHT_RAW;
props.power = FB_BLANK_UNBLANK;
props.fb_blank = FB_BLANK_UNBLANK;
- chip->bl = devm_backlight_device_register(chip->dev, "mp3309c",
- chip->dev, chip,
+ chip->bl = devm_backlight_device_register(dev, "mp3309c", dev, chip,
&mp3309c_bl_ops, &props);
if (IS_ERR(chip->bl))
- return dev_err_probe(chip->dev, PTR_ERR(chip->bl),
+ return dev_err_probe(dev, PTR_ERR(chip->bl),
"error registering backlight device\n");

/* In PWM dimming mode, enable pwm device */
@@ -387,8 +382,7 @@ static int mp3309c_probe(struct i2c_client *client)
pwmstate.enabled = true;
ret = pwm_apply_state(chip->pwmd, &pwmstate);
if (ret)
- return dev_err_probe(chip->dev, ret,
- "error setting pwm device\n");
+ return dev_err_probe(dev, ret, "error setting pwm device\n");
}

chip->pdata->status = FIRST_POWER_ON;
--
2.43.0.rc1.1.gbec44491f096


2023-12-15 14:21:26

by FLAVIO SULIGOI

[permalink] [raw]
Subject: RE: [PATCH v1 2/2] backlight: mp3309c: Utilise temporary variable for struct device

> Subject: [PATCH v1 2/2] backlight: mp3309c: Utilise temporary variable
> for struct device
>
> We have a temporary variable to keep pointer to struct device.
> Utilise it where it makes sense.
>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> drivers/video/backlight/mp3309c.c | 38 +++++++++++++------------------
> 1 file changed, 16 insertions(+), 22 deletions(-)
>

Hi Andy,

I tested the patch in both pwm and analog-ic dimming-mode and everything is ok.
Thanks for the optimizations!

Tested-by: Flavio Suligoi <[email protected]>

2023-12-15 14:21:45

by FLAVIO SULIGOI

[permalink] [raw]
Subject: RE: [PATCH v1 1/2] backlight: mp3309c: Make use of device properties

> Subject: [PATCH v1 1/2] backlight: mp3309c: Make use of device
> properties
>
> Convert the module to be property provider agnostic and allow
> it to be used on non-OF platforms.
>
> Add mod_devicetable.h include.
>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> drivers/video/backlight/mp3309c.c | 38 ++++++++++++-------------------
> 1 file changed, 15 insertions(+), 23 deletions(-)

Hi Andy,

I tested the patch in both pwm and analog-ic dimming-mode and everything is ok.
Thanks for the optimizations!

Tested-by: Flavio Suligoi <[email protected]>


2023-12-15 16:11:58

by Daniel Thompson

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] backlight: mp3309c: Make use of device properties

On Thu, Dec 14, 2023 at 09:51:13PM +0200, Andy Shevchenko wrote:
> Convert the module to be property provider agnostic and allow
> it to be used on non-OF platforms.
>
> Add mod_devicetable.h include.
>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> drivers/video/backlight/mp3309c.c | 38 ++++++++++++-------------------
> 1 file changed, 15 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/video/backlight/mp3309c.c b/drivers/video/backlight/mp3309c.c
> index 34d71259fac1..d9b08f191999 100644
> --- a/drivers/video/backlight/mp3309c.c
> +++ b/drivers/video/backlight/mp3309c.c
> @@ -15,6 +15,8 @@
> #include <linux/delay.h>
> #include <linux/gpio/consumer.h>
> #include <linux/i2c.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/property.h>
> #include <linux/pwm.h>
> #include <linux/regmap.h>
>
> @@ -202,15 +204,12 @@ static const struct backlight_ops mp3309c_bl_ops = {
> static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,

Pretty minor... but I wonder if it should be renamed:
mp3309c_parse_fwnode().


Daniel.

2023-12-15 16:12:12

by Daniel Thompson

[permalink] [raw]
Subject: Re: [PATCH v1 2/2] backlight: mp3309c: Utilise temporary variable for struct device

On Thu, Dec 14, 2023 at 09:51:14PM +0200, Andy Shevchenko wrote:
> We have a temporary variable to keep pointer to struct device.
> Utilise it where it makes sense.
>
> Signed-off-by: Andy Shevchenko <[email protected]>

Reviewed-by: Daniel Thompson <[email protected]>


Daniel.

2023-12-15 16:28:27

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] backlight: mp3309c: Make use of device properties

On Fri, Dec 15, 2023 at 04:11:02PM +0000, Daniel Thompson wrote:
> On Thu, Dec 14, 2023 at 09:51:13PM +0200, Andy Shevchenko wrote:

...

> > static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
>
> Pretty minor... but I wonder if it should be renamed:
> mp3309c_parse_fwnode().

I am fine with either. Lee, do you want this be incorporated?

P.S> Flavio, thanks for testing!

--
With Best Regards,
Andy Shevchenko



2023-12-18 07:59:00

by FLAVIO SULIGOI

[permalink] [raw]
Subject: RE: [PATCH v1 1/2] backlight: mp3309c: Make use of device properties

Hi Daniel,

...

> Subject: Re: [PATCH v1 1/2] backlight: mp3309c: Make use of device
> properties
> > +++ b/drivers/video/backlight/mp3309c.c
> > @@ -15,6 +15,8 @@
> > #include <linux/delay.h>
> > #include <linux/gpio/consumer.h>
> > #include <linux/i2c.h>
> > +#include <linux/mod_devicetable.h>
> > +#include <linux/property.h>
> > #include <linux/pwm.h>
> > #include <linux/regmap.h>
> >
> > @@ -202,15 +204,12 @@ static const struct backlight_ops mp3309c_bl_ops
> = {
> > static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
>
> Pretty minor... but I wonder if it should be renamed:
> mp3309c_parse_fwnode().

Right! It was my oversight!
Thanks!

>
>
> Daniel.

Flavio