[email protected] writes:

> From: Thomas Koeller <[email protected]>
>
> Computation of the clock prescaler value returned bogus results if
> the requested SPI clock was impossible to set. It now sets either
> the maximum or minimum clock frequency, as appropriate.
>
> Signed-off-by: Thomas Koeller <[email protected]>

What platforms was this tested on?

This looks like a fix that should be queued for 2.6.34-rc, but would
be helpful to have a review/ack from Sandeep on this.

Also, this fix needs to go upstream through the SPI maintainers.

Please send to [email protected], with
the davinci list in CC as well as these folks:

Grant Likely <[email protected]>
Sandeep Paulraj <[email protected]>
Philby John <[email protected]>
Sudhakar Rajashekhara <[email protected]>

Thanks,

Kevin


> ---
>  drivers/spi/davinci_spi.c |   12 +++++++++---
>  1 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
> index 956f617..02e1a76 100644
> --- a/drivers/spi/davinci_spi.c
> +++ b/drivers/spi/davinci_spi.c
> @@ -153,7 +153,7 @@ static int davinci_spi_setup_transfer(struct spi_device 
> *spi,
>       struct davinci_spi *davinci_spi;
>       struct davinci_spi_platform_data *pdata;
>       u8 bits_per_word = 0;
> -     u32 hz = 0, prescale;
> +     u32 hz = 0, prescale = 0, clkspeed;
>  
>       davinci_spi = spi_master_get_devdata(spi->master);
>       pdata = davinci_spi->pdata;
> @@ -190,10 +190,16 @@ static int davinci_spi_setup_transfer(struct spi_device 
> *spi,
>       set_fmt_bits(davinci_spi->base, bits_per_word & 0x1f,
>                       spi->chip_select);
>  
> -     prescale = ((clk_get_rate(davinci_spi->clk) / hz) - 1) & 0xff;
> +     clkspeed = clk_get_rate(davinci_spi->clk);
> +     if (hz > clkspeed / 2)
> +             prescale = 1 << 8;
> +     if (hz < clkspeed / 256)
> +             prescale = 255 << 8;
> +     if (!prescale)
> +             prescale = ((clkspeed / hz - 1) << 8) & 0x0000ff00;
>  
>       clear_fmt_bits(davinci_spi->base, 0x0000ff00, spi->chip_select);
> -     set_fmt_bits(davinci_spi->base, prescale << 8, spi->chip_select);
> +     set_fmt_bits(davinci_spi->base, prescale, spi->chip_select);
>  
>       return 0;
>  }
> -- 
> 1.7.0.3
>
> _______________________________________________
> Davinci-linux-open-source mailing list
> [email protected]
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to