spi: mvebu: make sure the value calculated for PSCL is also used
The function used a separate variable to hold the value calculated and only used it for range checking but then didn't use it. This fixes calculation for slow baud rate that require a divider > 15. Additionally fix the rounding. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
84d7f7d877
commit
1548f21bd2
|
@ -128,22 +128,22 @@ static int mvebu_spi_set_baudrate(struct mvebu_spi *p, u32 speed)
|
|||
#if defined(CONFIG_ARCH_ARMADA_370) || defined(CONFIG_ARCH_ARMADA_XP)
|
||||
static int armada_370_xp_spi_set_baudrate(struct mvebu_spi *p, u32 speed)
|
||||
{
|
||||
u32 pscl, pdiv, rate, val;
|
||||
u32 pscl, pdiv, val;
|
||||
|
||||
/* prescaler values: 1,2,3,...,15 */
|
||||
pscl = DIV_ROUND_UP(clk_get_rate(p->clk), speed);
|
||||
|
||||
/* additional prescaler divider: 1, 2, 4, 8, 16, 32, 64, 128 */
|
||||
pdiv = 0; rate = pscl;
|
||||
while (rate > 15 && pdiv <= 7) {
|
||||
rate /= 2;
|
||||
pdiv = 0;
|
||||
while (pscl > 15 && pdiv <= 7) {
|
||||
pscl = DIV_ROUND_UP(pscl, 2);
|
||||
pdiv++;
|
||||
}
|
||||
|
||||
dev_dbg(p->master.dev, "%s: clk = %lu, speed = %u, pscl = %d, pdiv = %d\n",
|
||||
__func__, clk_get_rate(p->clk), speed, pscl, pdiv);
|
||||
|
||||
if (rate > 15 || pdiv > 7)
|
||||
if (pscl > 15 || pdiv > 7)
|
||||
return -EINVAL;
|
||||
|
||||
val = readl(p->base + SPI_IF_CONFIG) & ~(IF_CLK_PRESCALE_MASK);
|
||||
|
|
Loading…
Reference in New Issue