aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/davinci_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/davinci_spi.c')
-rw-r--r--drivers/spi/davinci_spi.c12
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}