diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2021-04-26 17:03:50 +0200 |
---|---|---|
committer | Thierry Reding <thierry.reding@gmail.com> | 2021-05-25 18:29:40 +0200 |
commit | 937efa29e70f7f8424b74631375dcb35d82a4614 (patch) | |
tree | 518cff12f16c69053a475ec7e74a04615b020852 /drivers/pwm/pwm-visconti.c | |
parent | e9fdf122cf3442573d811c0cb664d6b5c30b7780 (diff) | |
download | linux-937efa29e70f7f8424b74631375dcb35d82a4614.tar.gz linux-937efa29e70f7f8424b74631375dcb35d82a4614.tar.bz2 linux-937efa29e70f7f8424b74631375dcb35d82a4614.zip |
pwm: visconti: Fix and simplify period calculation
With the original code a request for period = 65536000 ns and period =
32768000 ns yields the same register settings (which results in 32768000
ns) because the value for pwmc0 was miscalculated.
Also simplify using that fls(0) is 0.
Fixes: 721b595744f1 ("pwm: visconti: Add Toshiba Visconti SoC PWM support")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Diffstat (limited to 'drivers/pwm/pwm-visconti.c')
-rw-r--r-- | drivers/pwm/pwm-visconti.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/pwm/pwm-visconti.c b/drivers/pwm/pwm-visconti.c index 46d903786366..af4e37d3e3a6 100644 --- a/drivers/pwm/pwm-visconti.c +++ b/drivers/pwm/pwm-visconti.c @@ -82,17 +82,14 @@ static int visconti_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, return -ERANGE; /* - * PWMC controls a divider that divides the input clk by a - * power of two between 1 and 8. As a smaller divider yields - * higher precision, pick the smallest possible one. + * PWMC controls a divider that divides the input clk by a power of two + * between 1 and 8. As a smaller divider yields higher precision, pick + * the smallest possible one. As period is at most 0xffff << 3, pwmc0 is + * in the intended range [0..3]. */ - if (period > 0xffff) { - pwmc0 = ilog2(period >> 16); - if (WARN_ON(pwmc0 > 3)) - return -EINVAL; - } else { - pwmc0 = 0; - } + pwmc0 = fls(period >> 16); + if (WARN_ON(pwmc0 > 3)) + return -EINVAL; period >>= pwmc0; duty_cycle >>= pwmc0; |