diff options
-rw-r--r-- | drivers/spi/spi-rspi.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 818843336932..a816f07e168e 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -295,14 +295,24 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
295 | static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) | 295 | static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) |
296 | { | 296 | { |
297 | int spbr; | 297 | int spbr; |
298 | int div = 0; | ||
299 | unsigned long clksrc; | ||
298 | 300 | ||
299 | /* Sets output mode, MOSI signal, and (optionally) loopback */ | 301 | /* Sets output mode, MOSI signal, and (optionally) loopback */ |
300 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); | 302 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
301 | 303 | ||
304 | clksrc = clk_get_rate(rspi->clk); | ||
305 | while (div < 3) { | ||
306 | if (rspi->max_speed_hz >= clksrc/4) /* 4=(CLK/2)/2 */ | ||
307 | break; | ||
308 | div++; | ||
309 | clksrc /= 2; | ||
310 | } | ||
311 | |||
302 | /* Sets transfer bit rate */ | 312 | /* Sets transfer bit rate */ |
303 | spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk), | 313 | spbr = DIV_ROUND_UP(clksrc, 2 * rspi->max_speed_hz) - 1; |
304 | 2 * rspi->max_speed_hz) - 1; | ||
305 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | 314 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
315 | rspi->spcmd |= div << 2; | ||
306 | 316 | ||
307 | /* Disable dummy transmission, set byte access */ | 317 | /* Disable dummy transmission, set byte access */ |
308 | rspi_write8(rspi, SPDCR_SPLBYTE, RSPI_SPDCR); | 318 | rspi_write8(rspi, SPDCR_SPLBYTE, RSPI_SPDCR); |