[PATCH 1/1] ARM iMX28: incorrect frac/div calculation

Shawn Guo shawn.guo at linaro.org
Thu Mar 22 22:52:11 EDT 2012


On Thu, Mar 22, 2012 at 04:05:01PM -0700, Matt Burtch wrote:
> The frac and div values in _CLK_SET_RATE are calculated incorrectly
> for some clock rates ie. CPU clk of 454.73MHz, 392.72MHz, 261.81Mhz,
> etc.
> 
> Now the frac and div values which result in the closest actual clock
> rate to that requested is selected.

My understanding on clk_set_rate is we need to set the clk to a rate
closest to the requested one but never exceeding it.  Does your change
ensure that?

Regards,
Shawn

> Also there are no limitations
> on what frac values can be used, as long as they fall in the valid
> (18 < frac < 35) range.
> 
> Tested on custom iMX28 board.
> 
> Signed-off-by: Matt Burtch <matt at grid-net.com>
> ---
>  arch/arm/mach-mxs/clock-mx28.c |    8 ++------
>  1 files changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c
> index 5d68e41..a058b99 100644
> --- a/arch/arm/mach-mxs/clock-mx28.c
> +++ b/arch/arm/mach-mxs/clock-mx28.c
> @@ -354,19 +354,15 @@ static int name##_set_rate(struct clk *clk, unsigned long rate)		\
>  		}							\
>  		for (d = 1; d <= div_max; d++) {			\
>  			f = parent_rate * 18 / d / rate;		\
> -			if ((parent_rate * 18 / d) % rate)		\
> -				f++;					\
>  			if (f < 18 || f > 35)				\
>  				continue;				\
>  									\
>  			calc_rate = parent_rate * 18 / f / d;		\
> -			if (calc_rate > rate)				\
> -				continue;				\
>  									\
> -			if (rate - calc_rate < diff) {			\
> +			if (abs(rate - calc_rate) < diff) {		\
>  				frac = f;				\
>  				div = d;				\
> -				diff = rate - calc_rate;		\
> +				diff = abs(rate - calc_rate);		\
>  			}						\
>  									\
>  			if (diff == 0)					\
> -- 
> 1.7.5.4
> 



More information about the linux-arm-kernel mailing list