[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
