This corrects an off-by one error when calculating the clock divisor.
The code previously assumed that for example a divisor of 2 is
set using a value of 0001 (the inverse of 1/2), a divisor of 4 is
set using a value of 0010 (the inverse of 1/4) etc.. However, the correct
values are 0000, 0001, etc...

The use of DIV_ROUND_UP() was suggested by Guennadi Liakhovetski to avoid
understating the divisor by one in the case where the host clock is not a
binary power of the MMCIF clock.

Cc: Guennadi Liakhovetski <[email protected]>
Tested-by: Cao Minh Hiep <[email protected]>
Signed-off-by: Simon Horman <[email protected]>
---
 drivers/mmc/host/sh_mmcif.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index 8057bf3..5014bc4 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -453,7 +453,8 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host 
*host, unsigned int clk)
                sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
        else
                sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
-                               ((fls(host->clk / clk) - 1) << 16));
+                               ((fls(DIV_ROUND_UP(host->clk,
+                                                  clk) - 1) - 1) << 16));
 
        sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
 }
-- 
1.7.6.3

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to