Skip to content
  • Laxman Dewangan's avatar
    pwm: tegra: Increase precision in PWM rate calculation · 99f3e3b0
    Laxman Dewangan authored
    
    [ Upstream commit 250b76f4
    
     ]
    
    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: default avatarLaxman Dewangan <ldewangan@nvidia.com>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    99f3e3b0