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@xxxxxxxxxxxxxx> --- drivers/spi/mvebu_spi.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/spi/mvebu_spi.c b/drivers/spi/mvebu_spi.c index d61a545f02d8..319d213872e0 100644 --- a/drivers/spi/mvebu_spi.c +++ b/drivers/spi/mvebu_spi.c @@ -135,22 +135,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); -- 2.10.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox