linux/drivers/pwm
Boris Brezillon 12f9ce4a51 pwm: rockchip: Fix period and duty cycle approximation
The current implementation always round down the duty and period values,
while it would be better to round them to the closest integer.

These changes are needed in preparation of atomic update support to
prevent a period/duty cycle drift when executing several times the
'pwm_get_state() / modify / pwm_apply_state()' sequence.

Say you have an expected period of 3.333 us and a clk rate of
112.666667 MHz -- the clock frequency doesn't divide evenly, so the
period (stashed in nanoseconds) shrinks when we convert to the register
value and back, as follows:

  pwm_apply_state(): register = period * 112666667 / 1000000000;
  pwm_get_state(): period = register * 1000000000 / 112666667;

or in other words:

  period = period * 112666667 / 1000000000 * 1000000000 / 112666667;

which yields a sequence like:

  3333 -> 3328
  3328 -> 3319
  3319 -> 3310
  3310 -> 3301
  3301 -> 3292
  3292 -> ... (etc) ...

With this patch, we'd see instead:

  period = div_round_closest(period * 112666667, 1000000000) *
                   1000000000 / 112666667;

which yields a stable sequence:

  3333 -> 3337
  3337 -> 3337
  3337 -> ... (etc) ...

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Reviewed-by: Brian Norris <briannorris@chromium.org>
Tested-by: Brian Norris <briannorris@chromium.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2016-07-11 12:49:26 +02:00
..
core.c Merge branch 'for-4.7/pwm-atomic' into for-next 2016-05-17 14:57:58 +02:00
Kconfig pwm: Add support for Broadcom iProc PWM controller 2016-07-11 12:49:25 +02:00
Makefile pwm: Add support for Broadcom iProc PWM controller 2016-07-11 12:49:25 +02:00
pwm-ab8500.c
pwm-atmel-hlcdc.c pwm: atmel-hlcdc: add sama5d2 SoC support. 2015-10-06 16:07:28 +02:00
pwm-atmel-tcb.c misc: atmel_tclib: get and use slow clock 2015-10-06 12:33:14 +02:00
pwm-atmel.c pwm: Make use of pwm_get_xxx() helpers where appropriate 2015-07-20 09:53:22 +02:00
pwm-bcm2835.c pwm: bcm2835: Fix email address specification 2015-12-16 16:45:32 +01:00
pwm-bcm-iproc.c pwm: Add support for Broadcom iProc PWM controller 2016-07-11 12:49:25 +02:00
pwm-bcm-kona.c pwm: kona: Modify settings application sequence 2015-08-17 16:19:41 +02:00
pwm-berlin.c pwm: Add support for the Berlin PWM controller 2015-10-06 09:40:44 +02:00
pwm-bfin.c
pwm-brcmstb.c pwm: brcmstb: Fix check of devm_ioremap_resource() return code 2016-03-23 17:11:45 +01:00
pwm-clps711x.c pwm: Introduce the pwm_args concept 2016-05-03 13:44:37 +02:00
pwm-crc.c pwm: Use pwm_get/set_xxx() helpers where appropriate 2016-05-17 14:44:59 +02:00
pwm-ep93xx.c pwm: Add the pwm_is_enabled() helper 2015-07-20 09:46:06 +02:00
pwm-fsl-ftm.c pwm: fsl-ftm: Use flat regmap cache 2016-04-14 16:54:00 +02:00
pwm-img.c pwm: img: Test clock rate to avoid division by 0 2016-03-23 17:11:02 +01:00
pwm-imx.c pwm: Make use of pwm_get_xxx() helpers where appropriate 2015-07-20 09:53:22 +02:00
pwm-jz4740.c
pwm-lp3943.c
pwm-lpc18xx-sct.c pwm: Use pwm_get/set_xxx() helpers where appropriate 2016-05-17 14:44:59 +02:00
pwm-lpc32xx.c pwm: lpc32xx: return ERANGE, if requested period is not supported 2015-12-16 17:01:06 +01:00
pwm-lpss-pci.c pwm: lpss: pci: Enable PWM module on Intel Edison 2016-07-11 12:07:25 +02:00
pwm-lpss-platform.c pwm: lpss: Add support for runtime PM 2015-11-06 14:34:13 +01:00
pwm-lpss.c pwm: lpss: Move clk_rate check to ->probe() 2016-07-11 12:49:24 +02:00
pwm-lpss.h pwm: lpss: Update PWM setting for Broxton 2015-12-16 16:45:38 +01:00
pwm-mtk-disp.c pwm: Add MediaTek display PWM driver support 2015-10-06 16:07:30 +02:00
pwm-mxs.c pwm: Add the pwm_is_enabled() helper 2015-07-20 09:46:06 +02:00
pwm-omap-dmtimer.c pwm: Use pwm_get/set_xxx() helpers where appropriate 2016-05-17 14:44:59 +02:00
pwm-pca9685.c pwm-pca9685: enable ACPI device found on Galileo Gen2 2015-11-06 14:14:19 +01:00
pwm-puv3.c
pwm-pxa.c pwm: Introduce the pwm_args concept 2016-05-03 13:44:37 +02:00
pwm-rcar.c pwm: rcar: Make use of pwm_is_enabled() 2016-05-17 14:44:57 +02:00
pwm-renesas-tpu.c pwm: Add the pwm_is_enabled() helper 2015-07-20 09:46:06 +02:00
pwm-rockchip.c pwm: rockchip: Fix period and duty cycle approximation 2016-07-11 12:49:26 +02:00
pwm-samsung.c
pwm-spear.c
pwm-sti.c
pwm-sun4i.c pwm: Use pwm_get/set_xxx() helpers where appropriate 2016-05-17 14:44:59 +02:00
pwm-tegra.c pwm: Add the pwm_is_enabled() helper 2015-07-20 09:46:06 +02:00
pwm-tiecap.c pwm: pwm-ti*: Remove support for local clock gating 2016-07-11 12:07:18 +02:00
pwm-tiehrpwm.c pwm: pwm-ti*: Remove support for local clock gating 2016-07-11 12:07:18 +02:00
pwm-tipwmss.c pwm: pwm-ti*: Remove support for local clock gating 2016-07-11 12:07:18 +02:00
pwm-twl-led.c
pwm-twl.c
pwm-vt8500.c
sysfs.c pwm: Switch to the atomic API 2016-05-17 14:48:04 +02:00