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 pwm: Unexport children before chip removal 2016-11-10 16:36:37 +01:00
Kconfig pwm-pca9685: enable ACPI device found on Galileo Gen2 2015-11-06 14:14:19 +01:00
Makefile pwm: Add MediaTek display PWM driver support 2015-10-06 16:07:30 +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-bcm-kona.c pwm: kona: Modify settings application sequence 2015-08-17 16:19:41 +02:00
pwm-bcm2835.c
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-05-04 14:48:47 -07:00
pwm-clps711x.c
pwm-crc.c pwm: crc: Add Crystalcove (CRC) PWM driver 2015-07-21 09:22:23 +02:00
pwm-ep93xx.c
pwm-fsl-ftm.c pwm: fsl-ftm: Fix clock enable/disable when using PM 2016-09-15 08:27:43 +02:00
pwm-img.c
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: NXP LPC18xx PWM/SCT driver 2015-09-09 15:00:33 +02:00
pwm-lpc32xx.c pwm: lpc32xx: fix and simplify duty cycle and period calculations 2016-09-15 08:27:43 +02:00
pwm-lpss-pci.c pwm: lpss: Add support for runtime PM 2015-11-06 14:34:13 +01: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: Add support for runtime PM 2015-11-06 14:34:13 +01:00
pwm-lpss.h pwm: lpss: Support all four PWMs on Intel Broxton 2015-11-06 14:26:28 +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-pca9685.c pwm: pca9685: Fix period change with same duty cycle 2017-03-15 09:57:14 +08:00
pwm-puv3.c
pwm-pxa.c
pwm-rcar.c pwm: Add support for R-Car PWM Timer 2015-10-06 09:40:46 +02:00
pwm-renesas-tpu.c
pwm-rockchip.c pwm: Make use of pwm_get_xxx() helpers where appropriate 2015-07-20 09:53:22 +02:00
pwm-samsung.c
pwm-spear.c
pwm-sti.c
pwm-sun4i.c pwm: sunxi: Fix whitespace issue 2015-11-10 13:06:47 +01:00
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 pwm: Fix device reference leak 2016-12-08 07:15:24 +01:00