Message ID | YX8VkdCAe6coHC4w@fedora (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] media: ir-rx51: Switch to atomic PWM API | expand |
On Sun, Oct 31, 2021 at 07:15:45PM -0300, Maíra Canal wrote: > Remove legacy PWM interface (pwm_config, pwm_enable, pwm_disable) and > replace it for the atomic PWM API. > > Signed-off-by: Maíra Canal <maira.canal@usp.br> > --- > V1 -> V2: remove conceptually wrong chunk of code and correct the position > of pwm_init_state function > --- > drivers/media/rc/ir-rx51.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/rc/ir-rx51.c b/drivers/media/rc/ir-rx51.c > index a0d9c02a7588..41d4a4338072 100644 > --- a/drivers/media/rc/ir-rx51.c > +++ b/drivers/media/rc/ir-rx51.c > @@ -19,6 +19,7 @@ > struct ir_rx51 { > struct rc_dev *rcdev; > struct pwm_device *pwm; > + struct pwm_state *state; > struct hrtimer timer; > struct device *dev; > wait_queue_head_t wqueue; > @@ -32,22 +33,22 @@ struct ir_rx51 { > > static inline void ir_rx51_on(struct ir_rx51 *ir_rx51) > { > - pwm_enable(ir_rx51->pwm); > + ir_rx51->state->enabled = true; > + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); > } > > static inline void ir_rx51_off(struct ir_rx51 *ir_rx51) > { > - pwm_disable(ir_rx51->pwm); > + ir_rx51->state->enabled = false; > + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); > } > > static int init_timing_params(struct ir_rx51 *ir_rx51) > { > - struct pwm_device *pwm = ir_rx51->pwm; > - int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); > + struct pwm_state *state = ir_rx51->state; > > - duty = DIV_ROUND_CLOSEST(ir_rx51->duty_cycle * period, 100); > - > - pwm_config(pwm, duty, period); > + state->period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); > + pwm_set_relative_duty_cycle(state, ir_rx51->duty_cycle, 100); > > return 0; > } > @@ -242,6 +243,7 @@ static int ir_rx51_probe(struct platform_device *dev) > > /* Use default, in case userspace does not set the carrier */ > ir_rx51.freq = DIV_ROUND_CLOSEST_ULL(pwm_get_period(pwm), NSEC_PER_SEC); > + pwm_init_state(pwm, ir_rx51.state); > pwm_put(pwm); > Orthogonal to this patch I wonder why probe calls pwm_get() and pwm_put(), just to have another call to pwm_get() in the open callback. Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > hrtimer_init(&ir_rx51.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); > -- > 2.31.1 > >
On Thu, Nov 04, 2021 at 04:29:13PM +0100, Uwe Kleine-König wrote: > On Sun, Oct 31, 2021 at 07:15:45PM -0300, Maíra Canal wrote: > > Remove legacy PWM interface (pwm_config, pwm_enable, pwm_disable) and > > replace it for the atomic PWM API. > > > > Signed-off-by: Maíra Canal <maira.canal@usp.br> > > --- > > V1 -> V2: remove conceptually wrong chunk of code and correct the position > > of pwm_init_state function > > --- > > drivers/media/rc/ir-rx51.c | 16 +++++++++------- > > 1 file changed, 9 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/media/rc/ir-rx51.c b/drivers/media/rc/ir-rx51.c > > index a0d9c02a7588..41d4a4338072 100644 > > --- a/drivers/media/rc/ir-rx51.c > > +++ b/drivers/media/rc/ir-rx51.c > > @@ -19,6 +19,7 @@ > > struct ir_rx51 { > > struct rc_dev *rcdev; > > struct pwm_device *pwm; > > + struct pwm_state *state; > > struct hrtimer timer; > > struct device *dev; > > wait_queue_head_t wqueue; > > @@ -32,22 +33,22 @@ struct ir_rx51 { > > > > static inline void ir_rx51_on(struct ir_rx51 *ir_rx51) > > { > > - pwm_enable(ir_rx51->pwm); > > + ir_rx51->state->enabled = true; > > + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); > > } > > > > static inline void ir_rx51_off(struct ir_rx51 *ir_rx51) > > { > > - pwm_disable(ir_rx51->pwm); > > + ir_rx51->state->enabled = false; > > + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); > > } > > > > static int init_timing_params(struct ir_rx51 *ir_rx51) > > { > > - struct pwm_device *pwm = ir_rx51->pwm; > > - int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); > > + struct pwm_state *state = ir_rx51->state; > > > > - duty = DIV_ROUND_CLOSEST(ir_rx51->duty_cycle * period, 100); > > - > > - pwm_config(pwm, duty, period); > > + state->period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); > > + pwm_set_relative_duty_cycle(state, ir_rx51->duty_cycle, 100); > > > > return 0; > > } > > @@ -242,6 +243,7 @@ static int ir_rx51_probe(struct platform_device *dev) > > > > /* Use default, in case userspace does not set the carrier */ > > ir_rx51.freq = DIV_ROUND_CLOSEST_ULL(pwm_get_period(pwm), NSEC_PER_SEC); > > + pwm_init_state(pwm, ir_rx51.state); > > pwm_put(pwm); > > > > Orthogonal to this patch I wonder why probe calls pwm_get() and > pwm_put(), just to have another call to pwm_get() in the open callback. > > Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Oh, I missed something: the member added to struct ir_rx51 must be a plain struct pwm_state, not a pointer to it. As suggested here the driver runs into a NULL pointer exception. Best regards Uwe
diff --git a/drivers/media/rc/ir-rx51.c b/drivers/media/rc/ir-rx51.c index a0d9c02a7588..41d4a4338072 100644 --- a/drivers/media/rc/ir-rx51.c +++ b/drivers/media/rc/ir-rx51.c @@ -19,6 +19,7 @@ struct ir_rx51 { struct rc_dev *rcdev; struct pwm_device *pwm; + struct pwm_state *state; struct hrtimer timer; struct device *dev; wait_queue_head_t wqueue; @@ -32,22 +33,22 @@ struct ir_rx51 { static inline void ir_rx51_on(struct ir_rx51 *ir_rx51) { - pwm_enable(ir_rx51->pwm); + ir_rx51->state->enabled = true; + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); } static inline void ir_rx51_off(struct ir_rx51 *ir_rx51) { - pwm_disable(ir_rx51->pwm); + ir_rx51->state->enabled = false; + pwm_apply_state(ir_rx51->pwm, ir_rx51->state); } static int init_timing_params(struct ir_rx51 *ir_rx51) { - struct pwm_device *pwm = ir_rx51->pwm; - int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); + struct pwm_state *state = ir_rx51->state; - duty = DIV_ROUND_CLOSEST(ir_rx51->duty_cycle * period, 100); - - pwm_config(pwm, duty, period); + state->period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); + pwm_set_relative_duty_cycle(state, ir_rx51->duty_cycle, 100); return 0; } @@ -242,6 +243,7 @@ static int ir_rx51_probe(struct platform_device *dev) /* Use default, in case userspace does not set the carrier */ ir_rx51.freq = DIV_ROUND_CLOSEST_ULL(pwm_get_period(pwm), NSEC_PER_SEC); + pwm_init_state(pwm, ir_rx51.state); pwm_put(pwm); hrtimer_init(&ir_rx51.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
Remove legacy PWM interface (pwm_config, pwm_enable, pwm_disable) and replace it for the atomic PWM API. Signed-off-by: Maíra Canal <maira.canal@usp.br> --- V1 -> V2: remove conceptually wrong chunk of code and correct the position of pwm_init_state function --- drivers/media/rc/ir-rx51.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)