[PATCH v2 01/11] pwm: Make .get_state() callback return an error code
Pavel Machek
pavel at ucw.cz
Mon Dec 5 14:30:35 PST 2022
Hi!
> .get_state() might fail in some cases. To make it possible that a driver
> signals such a failure change the prototype of .get_state() to return an
> error code.
>
> This patch was created using coccinelle and the following semantic patch:
>
> @p1@
> identifier getstatefunc;
> identifier driver;
> @@
> struct pwm_ops driver = {
> ...,
> .get_state = getstatefunc
> ,...
> };
>
> @p2@
> identifier p1.getstatefunc;
> identifier chip, pwm, state;
> @@
> -void
> +int
> getstatefunc(struct pwm_chip *chip, struct pwm_device *pwm, struct pwm_state *state)
> {
> ...
> - return;
> + return 0;
> ...
> }
>
> plus the actual change of the prototype in include/linux/pwm.h (plus some
> manual fixing of indentions and empty lines).
>
> So for now all drivers return success unconditionally. They are adapted
> in the following patches to make the changes easier reviewable.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
LED part:
Acked-by: Pavel Machek <pavel at ucw.cz>
Best regards,
Pavel
> static const struct pwm_ops ti_sn_pwm_ops = {
> diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-lpg.c
> index 02f51cc61837..741cc2fd817d 100644
> --- a/drivers/leds/rgb/leds-qcom-lpg.c
> +++ b/drivers/leds/rgb/leds-qcom-lpg.c
> @@ -968,8 +968,8 @@ static int lpg_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
> return ret;
> }
>
> -static void lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
> - struct pwm_state *state)
> +static int lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
> + struct pwm_state *state)
> {
> struct lpg *lpg = container_of(chip, struct lpg, pwm);
> struct lpg_channel *chan = &lpg->channels[pwm->hwpwm];
> @@ -982,20 +982,20 @@ static void lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
>
> ret = regmap_read(lpg->map, chan->base + LPG_SIZE_CLK_REG, &val);
> if (ret)
> - return;
> + return 0;
>
> refclk = lpg_clk_rates[val & PWM_CLK_SELECT_MASK];
> if (refclk) {
> ret = regmap_read(lpg->map, chan->base + LPG_PREDIV_CLK_REG, &val);
> if (ret)
> - return;
> + return 0;
>
> pre_div = lpg_pre_divs[FIELD_GET(PWM_FREQ_PRE_DIV_MASK, val)];
> m = FIELD_GET(PWM_FREQ_EXP_MASK, val);
>
> ret = regmap_bulk_read(lpg->map, chan->base + PWM_VALUE_REG, &pwm_value, sizeof(pwm_value));
> if (ret)
> - return;
> + return 0;
>
> state->period = DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * LPG_RESOLUTION * pre_div * (1 << m), refclk);
> state->duty_cycle = DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * pwm_value * pre_div * (1 << m), refclk);
> @@ -1006,13 +1006,15 @@ static void lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
>
> ret = regmap_read(lpg->map, chan->base + PWM_ENABLE_CONTROL_REG, &val);
> if (ret)
> - return;
> + return 0;
>
> state->enabled = FIELD_GET(LPG_ENABLE_CONTROL_OUTPUT, val);
> state->polarity = PWM_POLARITY_NORMAL;
>
> if (state->duty_cycle > state->period)
> state->duty_cycle = state->period;
> +
> + return 0;
> }
--
People of Russia, stop Putin before his war on Ukraine escalates.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20221205/9beb6abb/attachment-0001.sig>
More information about the Linux-mediatek
mailing list