diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2014-05-22 14:07:35 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-05-26 09:30:37 -0400 |
commit | 3beb61dbfcf188399cbc36ce1eeb8b2ba724de38 (patch) | |
tree | 03a8a90b71a75dfc60b468fc541d59731b92470a /drivers/spi/spi-rspi.c | |
parent | c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (diff) |
spi: rspi: Round up division to avoid slave overclocking
The calculation of the bit rate divider used a standard C division, which
rounds down the quotient. This may lead to a higher bitrate than requested.
Round up to avoid this.
E.g. on Koelsch, the SPI flash (configured for 30 MHz) was driven at 48.75
MHz. After this patch it's driven at a safe 24.375 MHz.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 1fb0ad213324..5639f9529e0b 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -266,7 +266,8 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
266 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); | 266 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
267 | 267 | ||
268 | /* Sets transfer bit rate */ | 268 | /* Sets transfer bit rate */ |
269 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | 269 | spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk), |
270 | 2 * rspi->max_speed_hz) - 1; | ||
270 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | 271 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
271 | 272 | ||
272 | /* Disable dummy transmission, set 16-bit word access, 1 frame */ | 273 | /* Disable dummy transmission, set 16-bit word access, 1 frame */ |
@@ -302,7 +303,8 @@ static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) | |||
302 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); | 303 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
303 | 304 | ||
304 | /* Sets transfer bit rate */ | 305 | /* Sets transfer bit rate */ |
305 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | 306 | spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk), |
307 | 2 * rspi->max_speed_hz) - 1; | ||
306 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | 308 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
307 | 309 | ||
308 | /* Disable dummy transmission, set byte access */ | 310 | /* Disable dummy transmission, set byte access */ |
@@ -335,7 +337,7 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
335 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); | 337 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
336 | 338 | ||
337 | /* Sets transfer bit rate */ | 339 | /* Sets transfer bit rate */ |
338 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz); | 340 | spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk), 2 * rspi->max_speed_hz); |
339 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | 341 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
340 | 342 | ||
341 | /* Disable dummy transmission, set byte access */ | 343 | /* Disable dummy transmission, set byte access */ |