android_kernel_oneplus_msm8998/drivers/pwm
Laxman Dewangan 51dd2600cc pwm: tegra: Increase precision in PWM rate calculation
[ Upstream commit 250b76f43f57d578ebff5e7211eb2c73aa5cd6ca ]

The rate of the PWM calculated as follows:

	hz = NSEC_PER_SEC / period_ns;
 	rate = (rate + (hz / 2)) / hz;

This has the precision loss in lower PWM rate.

Change this to have more precision as:

	hz = DIV_ROUND_CLOSEST_ULL(NSEC_PER_SEC * 100, period_ns);
	rate = DIV_ROUND_CLOSEST(rate * 100, hz)

Example:

1. period_ns = 16672000, PWM clock rate is 200 KHz.

	Based on old formula
		hz = NSEC_PER_SEC / period_ns
		   = 1000000000ul/16672000
		   = 59 (59.98)
		rate = (200K + 59/2)/59 = 3390

	Based on new method:
		hz = 5998
		rate = DIV_ROUND_CLOSE(200000*100, 5998) = 3334

	If we measure the PWM signal rate, we will get more accurate
	period with rate value of 3334 instead of 3390.

2.  period_ns = 16803898, PWM clock rate is 200 KHz.

	Based on old formula:
		hz = 59, rate = 3390

	Based on new formula:
		hz = 5951, rate = 3360

	The PWM signal rate of 3360 is more near to requested period
	than 3333.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-03-22 09:23:27 +01:00
..
core.c
Kconfig
Makefile
pwm-ab8500.c
pwm-atmel-hlcdc.c
pwm-atmel-tcb.c
pwm-atmel.c
pwm-bcm-kona.c
pwm-bcm2835.c
pwm-berlin.c
pwm-bfin.c
pwm-brcmstb.c
pwm-clps711x.c
pwm-crc.c
pwm-ep93xx.c
pwm-fsl-ftm.c
pwm-img.c
pwm-imx.c
pwm-jz4740.c
pwm-lp3943.c
pwm-lpc18xx-sct.c
pwm-lpc32xx.c
pwm-lpss-pci.c
pwm-lpss-platform.c
pwm-lpss.c
pwm-lpss.h
pwm-mtk-disp.c
pwm-mxs.c
pwm-pca9685.c
pwm-puv3.c
pwm-pxa.c
pwm-rcar.c
pwm-renesas-tpu.c
pwm-rockchip.c
pwm-samsung.c
pwm-spear.c
pwm-sti.c
pwm-sun4i.c
pwm-tegra.c pwm: tegra: Increase precision in PWM rate calculation 2018-03-22 09:23:27 +01:00
pwm-tiecap.c
pwm-tiehrpwm.c
pwm-tipwmss.c
pwm-tipwmss.h
pwm-twl-led.c
pwm-twl.c
pwm-vt8500.c
sysfs.c