video: backlight: lp855x: Get PWM for PWM mode during probe
authorArtur Weber <aweber.kernel@gmail.com>
Fri, 19 May 2023 18:07:26 +0000 (20:07 +0200)
committerLee Jones <lee@kernel.org>
Thu, 8 Jun 2023 15:49:11 +0000 (16:49 +0100)
Also deprecate the pwm-period DT property, as it is now redundant
(pwms property already contains period value).

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20230519180728.2281-3-aweber.kernel@gmail.com
drivers/video/backlight/lp855x_bl.c

index caac1cf..1c9e921 100644 (file)
@@ -218,23 +218,10 @@ err:
 
 static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br)
 {
-       struct pwm_device *pwm;
        struct pwm_state state;
 
-       /* request pwm device with the consumer name */
-       if (!lp->pwm) {
-               pwm = devm_pwm_get(lp->dev, lp->chipname);
-               if (IS_ERR(pwm))
-                       return;
-
-               lp->pwm = pwm;
-
-               pwm_init_state(lp->pwm, &state);
-       } else {
-               pwm_get_state(lp->pwm, &state);
-       }
+       pwm_get_state(lp->pwm, &state);
 
-       state.period = lp->pdata->period_ns;
        state.duty_cycle = div_u64(br * state.period, max_br);
        state.enabled = state.duty_cycle;
 
@@ -339,6 +326,7 @@ static int lp855x_parse_dt(struct lp855x *lp)
        of_property_read_string(node, "bl-name", &pdata->name);
        of_property_read_u8(node, "dev-ctrl", &pdata->device_control);
        of_property_read_u8(node, "init-brt", &pdata->initial_brightness);
+       /* Deprecated, specify period in pwms property instead */
        of_property_read_u32(node, "pwm-period", &pdata->period_ns);
 
        /* Fill ROM platform data if defined */
@@ -399,6 +387,7 @@ static int lp855x_probe(struct i2c_client *cl)
        const struct i2c_device_id *id = i2c_client_get_device_id(cl);
        const struct acpi_device_id *acpi_id = NULL;
        struct device *dev = &cl->dev;
+       struct pwm_state pwmstate;
        struct lp855x *lp;
        int ret;
 
@@ -457,11 +446,6 @@ static int lp855x_probe(struct i2c_client *cl)
                }
        }
 
-       if (lp->pdata->period_ns > 0)
-               lp->mode = PWM_BASED;
-       else
-               lp->mode = REGISTER_BASED;
-
        lp->supply = devm_regulator_get(dev, "power");
        if (IS_ERR(lp->supply)) {
                if (PTR_ERR(lp->supply) == -EPROBE_DEFER)
@@ -472,11 +456,31 @@ static int lp855x_probe(struct i2c_client *cl)
        lp->enable = devm_regulator_get_optional(dev, "enable");
        if (IS_ERR(lp->enable)) {
                ret = PTR_ERR(lp->enable);
-               if (ret == -ENODEV) {
+               if (ret == -ENODEV)
                        lp->enable = NULL;
-               } else {
+               else
                        return dev_err_probe(dev, ret, "getting enable regulator\n");
-               }
+       }
+
+       lp->pwm = devm_pwm_get(lp->dev, lp->chipname);
+       if (IS_ERR(lp->pwm)) {
+               ret = PTR_ERR(lp->pwm);
+               if (ret == -ENODEV || ret == -EINVAL)
+                       lp->pwm = NULL;
+               else
+                       return dev_err_probe(dev, ret, "getting PWM\n");
+
+               lp->mode = REGISTER_BASED;
+               dev_dbg(dev, "mode: register based\n");
+       } else {
+               pwm_init_state(lp->pwm, &pwmstate);
+               /* Legacy platform data compatibility */
+               if (lp->pdata->period_ns > 0)
+                       pwmstate.period = lp->pdata->period_ns;
+               pwm_apply_state(lp->pwm, &pwmstate);
+
+               lp->mode = PWM_BASED;
+               dev_dbg(dev, "mode: PWM based\n");
        }
 
        if (lp->supply) {