mmc: dw_mmc: correct the calculation for CLKDIV

In case of "host->bus_hz < slot->clock", divider value is
miscalculated. And clock divider register value is multiple of 2. If
calculated divider value is odd number, result can be over-clocking.

Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
Acked-by: Will Newton <will.newton@gmail.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
Seungwon Jeon 2012-05-22 13:01:21 +09:00 committed by Chris Ball
parent fda5f73686
commit e419990b5e

View file

@ -617,14 +617,15 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot)
u32 div; u32 div;
if (slot->clock != host->current_speed) { if (slot->clock != host->current_speed) {
if (host->bus_hz % slot->clock) div = host->bus_hz / slot->clock;
if (host->bus_hz % slot->clock && host->bus_hz > slot->clock)
/* /*
* move the + 1 after the divide to prevent * move the + 1 after the divide to prevent
* over-clocking the card. * over-clocking the card.
*/ */
div = ((host->bus_hz / slot->clock) >> 1) + 1; div += 1;
else
div = (host->bus_hz / slot->clock) >> 1; div = (host->bus_hz != slot->clock) ? DIV_ROUND_UP(div, 2) : 0;
dev_info(&slot->mmc->class_dev, dev_info(&slot->mmc->class_dev,
"Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ" "Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ"