pwm: Do stricter return value checking for .round_waveform_tohw()
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Sat, 5 Apr 2025 09:27:17 +0000 (11:27 +0200)
committerUwe Kleine-König <ukleinek@kernel.org>
Mon, 14 Apr 2025 06:03:16 +0000 (08:03 +0200)
The .round_waveform_tohw() is supposed to return 0 if the request could
be rounded down to match the hardware capabilities and return 1 if
rounding down wasn't possible.

Expand the PWM_DEBUG check to not only assert proper downrounding if 0
was returned but also check that it was actually rounded up when the
callback signalled uprounding.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/dfb824ae37f99df068c752d48cbd163c044a74fb.1743844730.git.u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/core.c

index 02d98e4c75a5f84caaa3bc46e51308fb62f95ed4..59cc8792e312c786c283c8b9e78dbb5af418e9b9 100644 (file)
@@ -270,10 +270,10 @@ int pwm_round_waveform_might_sleep(struct pwm_device *pwm, struct pwm_waveform *
                        wf_req.duty_length_ns, wf_req.period_length_ns, wf_req.duty_offset_ns, ret_tohw);
 
        if (IS_ENABLED(CONFIG_PWM_DEBUG) &&
-           ret_tohw == 0 && !pwm_check_rounding(&wf_req, wf))
-               dev_err(&chip->dev, "Wrong rounding: requested %llu/%llu [+%llu], result %llu/%llu [+%llu]\n",
+           (ret_tohw == 0) != pwm_check_rounding(&wf_req, wf))
+               dev_err(&chip->dev, "Wrong rounding: requested %llu/%llu [+%llu], result %llu/%llu [+%llu], ret: %d\n",
                        wf_req.duty_length_ns, wf_req.period_length_ns, wf_req.duty_offset_ns,
-                       wf->duty_length_ns, wf->period_length_ns, wf->duty_offset_ns);
+                       wf->duty_length_ns, wf->period_length_ns, wf->duty_offset_ns, ret_tohw);
 
        return ret_tohw;
 }
@@ -341,10 +341,10 @@ static int __pwm_set_waveform(struct pwm_device *pwm,
                if (err)
                        return err;
 
-               if (IS_ENABLED(CONFIG_PWM_DEBUG) && ret_tohw == 0 && !pwm_check_rounding(wf, &wf_rounded))
-                       dev_err(&chip->dev, "Wrong rounding: requested %llu/%llu [+%llu], result %llu/%llu [+%llu]\n",
+               if (IS_ENABLED(CONFIG_PWM_DEBUG) && (ret_tohw == 0) != pwm_check_rounding(wf, &wf_rounded))
+                       dev_err(&chip->dev, "Wrong rounding: requested %llu/%llu [+%llu], result %llu/%llu [+%llu], ret: %d\n",
                                wf->duty_length_ns, wf->period_length_ns, wf->duty_offset_ns,
-                               wf_rounded.duty_length_ns, wf_rounded.period_length_ns, wf_rounded.duty_offset_ns);
+                               wf_rounded.duty_length_ns, wf_rounded.period_length_ns, wf_rounded.duty_offset_ns, ret_tohw);
 
                if (exact && pwmwfcmp(wf, &wf_rounded)) {
                        dev_dbg(&chip->dev, "Requested no rounding, but %llu/%llu [+%llu] -> %llu/%llu [+%llu]\n",