]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pwm: stm32: Make use of mul_u64_u64_div_u64_roundup()
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Wed, 15 Apr 2026 14:50:13 +0000 (16:50 +0200)
committerUwe Kleine-König <ukleinek@kernel.org>
Tue, 26 May 2026 05:50:42 +0000 (07:50 +0200)
When the driver was converted to the waveform API the need for this
function arised but at that time this function didn't exist yet. In the
meantime it's available, so switch to the global function and drop the
driver specific implementation.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://patch.msgid.link/788319f0fff963feca4df3c5fcdd471dcf70ccdf.1776264104.git.u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/pwm-stm32.c

index 935257a890b0670f0eeb33e4a3aacb635a3da5f8..c708e4a7ad709bdcc037992489b3e6cbf8e9aaa6 100644 (file)
@@ -193,22 +193,6 @@ out:
        return ret;
 }
 
-/*
- * This should be moved to lib/math/div64.c. Currently there are some changes
- * pending to mul_u64_u64_div_u64. Uwe will care for that when the dust settles.
- */
-static u64 stm32_pwm_mul_u64_u64_div_u64_roundup(u64 a, u64 b, u64 c)
-{
-       u64 res = mul_u64_u64_div_u64(a, b, c);
-       /* Those multiplications might overflow but it doesn't matter */
-       u64 rem = a * b - c * res;
-
-       if (rem)
-               res += 1;
-
-       return res;
-}
-
 static int stm32_pwm_round_waveform_fromhw(struct pwm_chip *chip,
                                           struct pwm_device *pwm,
                                           const void *_wfhw,
@@ -223,16 +207,15 @@ static int stm32_pwm_round_waveform_fromhw(struct pwm_chip *chip,
                u64 ccr_ns;
 
                /* The result doesn't overflow for rate >= 15259 */
-               wf->period_length_ns = stm32_pwm_mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * (wfhw->arr + 1),
-                                                                            NSEC_PER_SEC, rate);
+               wf->period_length_ns = mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * (wfhw->arr + 1),
+                                                                  NSEC_PER_SEC, rate);
 
-               ccr_ns = stm32_pwm_mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * wfhw->ccr,
-                                                              NSEC_PER_SEC, rate);
+               ccr_ns = mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * wfhw->ccr, NSEC_PER_SEC, rate);
 
                if (wfhw->ccer & TIM_CCER_CCxP(ch + 1)) {
                        wf->duty_length_ns =
-                               stm32_pwm_mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * (wfhw->arr + 1 - wfhw->ccr),
-                                                                     NSEC_PER_SEC, rate);
+                               mul_u64_u64_div_u64_roundup(((u64)wfhw->psc + 1) * (wfhw->arr + 1 - wfhw->ccr),
+                                                           NSEC_PER_SEC, rate);
 
                        wf->duty_offset_ns = ccr_ns;
                } else {