diff options
-rw-r--r-- | 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 95afb6b77395..b85090caf7cf 100644 --- a/drivers/spi/davinci_spi.c +++ b/drivers/spi/davinci_spi.c | |||
@@ -301,7 +301,7 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
301 | struct davinci_spi *davinci_spi; | 301 | struct davinci_spi *davinci_spi; |
302 | struct davinci_spi_platform_data *pdata; | 302 | struct davinci_spi_platform_data *pdata; |
303 | u8 bits_per_word = 0; | 303 | u8 bits_per_word = 0; |
304 | u32 hz = 0, prescale; | 304 | u32 hz = 0, prescale = 0, clkspeed; |
305 | 305 | ||
306 | davinci_spi = spi_master_get_devdata(spi->master); | 306 | davinci_spi = spi_master_get_devdata(spi->master); |
307 | pdata = davinci_spi->pdata; | 307 | pdata = davinci_spi->pdata; |
@@ -338,10 +338,16 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
338 | set_fmt_bits(davinci_spi->base, bits_per_word & 0x1f, | 338 | set_fmt_bits(davinci_spi->base, bits_per_word & 0x1f, |
339 | spi->chip_select); | 339 | spi->chip_select); |
340 | 340 | ||
341 | prescale = ((clk_get_rate(davinci_spi->clk) / hz) - 1) & 0xff; | 341 | clkspeed = clk_get_rate(davinci_spi->clk); |
342 | if (hz > clkspeed / 2) | ||
343 | prescale = 1 << 8; | ||
344 | if (hz < clkspeed / 256) | ||
345 | prescale = 255 << 8; | ||
346 | if (!prescale) | ||
347 | prescale = ((clkspeed / hz - 1) << 8) & 0x0000ff00; | ||
342 | 348 | ||
343 | clear_fmt_bits(davinci_spi->base, 0x0000ff00, spi->chip_select); | 349 | clear_fmt_bits(davinci_spi->base, 0x0000ff00, spi->chip_select); |
344 | set_fmt_bits(davinci_spi->base, prescale << 8, spi->chip_select); | 350 | set_fmt_bits(davinci_spi->base, prescale, spi->chip_select); |
345 | 351 | ||
346 | return 0; | 352 | return 0; |
347 | } | 353 | } |