Message ID | 20210617095145.163694-6-u.kleine-koenig@pengutronix.de |
---|---|
State | Changes Requested |
Headers | show |
Series | pwm: tegra: several improvements | expand |
On Thu, Jun 17, 2021 at 11:51:44AM +0200, Uwe Kleine-König wrote: > To ease review this reuses the formerly implemented callbacks. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > --- > drivers/pwm/pwm-tegra.c | 32 +++++++++++++++++++++++++++++--- > 1 file changed, 29 insertions(+), 3 deletions(-) > > diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c > index 11a10b575ace..1161c6323e60 100644 > --- a/drivers/pwm/pwm-tegra.c > +++ b/drivers/pwm/pwm-tegra.c > @@ -227,10 +227,36 @@ static void tegra_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) > clk_disable_unprepare(pc->clk); > } > > +static int tegra_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > + const struct pwm_state *state) > +{ > + int err; > + > + if (state->polarity != PWM_POLARITY_INVERSED) > + return -EINVAL; Where does this come from? I can't see this condition anywhere in the existing driver. Thierry
On Mon, Jun 28, 2021 at 02:29:35PM +0200, Thierry Reding wrote: > On Thu, Jun 17, 2021 at 11:51:44AM +0200, Uwe Kleine-König wrote: > > To ease review this reuses the formerly implemented callbacks. > > > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > > --- > > drivers/pwm/pwm-tegra.c | 32 +++++++++++++++++++++++++++++--- > > 1 file changed, 29 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c > > index 11a10b575ace..1161c6323e60 100644 > > --- a/drivers/pwm/pwm-tegra.c > > +++ b/drivers/pwm/pwm-tegra.c > > @@ -227,10 +227,36 @@ static void tegra_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) > > clk_disable_unprepare(pc->clk); > > } > > > > +static int tegra_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > > + const struct pwm_state *state) > > +{ > > + int err; > > + > > + if (state->polarity != PWM_POLARITY_INVERSED) > > + return -EINVAL; > > Where does this come from? I can't see this condition anywhere in the > existing driver. The old driver doesn't implement .set_polarity, so this condition originates from if (state->polarity != pwm->state.polarity) { if (!chip->ops->set_polarity) { err = -EINVAL; goto out_err; } ... in the legacy code path in the core. Best regards Uwe
Hello, On Thu, Jun 17, 2021 at 11:51:44AM +0200, Uwe Kleine-König wrote: > To ease review this reuses the formerly implemented callbacks. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > --- > drivers/pwm/pwm-tegra.c | 32 +++++++++++++++++++++++++++++--- > 1 file changed, 29 insertions(+), 3 deletions(-) > > diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c > index 11a10b575ace..1161c6323e60 100644 > --- a/drivers/pwm/pwm-tegra.c > +++ b/drivers/pwm/pwm-tegra.c > @@ -227,10 +227,36 @@ static void tegra_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) > clk_disable_unprepare(pc->clk); > } > > +static int tegra_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > + const struct pwm_state *state) > +{ > + int err; > + > + if (state->polarity != PWM_POLARITY_INVERSED) > + return -EINVAL; > + > + if (!state->enabled) { > + if (pwm->state.enabled) > + tegra_pwm_disable(chip, pwm); > + return 0; > + } > + > + if (state->period != pwm->state.period || > + state->duty_cycle != pwm->state.duty_cycle) { > + err = tegra_pwm_config(pwm->chip, pwm, (int)state->duty_cycle, > + (int)state->period); This patch has the same problem as my other apply conversions. I'll have to rework that before it is safe to take this. Best regards Uwe
diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c index 11a10b575ace..1161c6323e60 100644 --- a/drivers/pwm/pwm-tegra.c +++ b/drivers/pwm/pwm-tegra.c @@ -227,10 +227,36 @@ static void tegra_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) clk_disable_unprepare(pc->clk); } +static int tegra_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + const struct pwm_state *state) +{ + int err; + + if (state->polarity != PWM_POLARITY_INVERSED) + return -EINVAL; + + if (!state->enabled) { + if (pwm->state.enabled) + tegra_pwm_disable(chip, pwm); + return 0; + } + + if (state->period != pwm->state.period || + state->duty_cycle != pwm->state.duty_cycle) { + err = tegra_pwm_config(pwm->chip, pwm, (int)state->duty_cycle, + (int)state->period); + if (err) + return err; + } + + if (!pwm->state.enabled) + return tegra_pwm_enable(chip, pwm); + + return 0; +} + static const struct pwm_ops tegra_pwm_ops = { - .config = tegra_pwm_config, - .enable = tegra_pwm_enable, - .disable = tegra_pwm_disable, + .apply = tegra_pwm_apply, .owner = THIS_MODULE, };
To ease review this reuses the formerly implemented callbacks. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/pwm/pwm-tegra.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-)