aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeungwon Jeon <tgih.jun@samsung.com>2012-05-22 00:01:21 -0400
committerChris Ball <cjb@laptop.org>2012-06-06 09:38:51 -0400
commite419990b5e811027b1552cbc5b76a6cc180f7f48 (patch)
tree12791ff201b9e56f74caaa86c22ce0964a8effcc
parentfda5f736864c46324dbc50246ef1ca0e84ebf4ae (diff)
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>
-rw-r--r--drivers/mmc/host/dw_mmc.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index b070ee542c8e..1ca5e72ceb65 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -617,14 +617,15 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot)
617 u32 div; 617 u32 div;
618 618
619 if (slot->clock != host->current_speed) { 619 if (slot->clock != host->current_speed) {
620 if (host->bus_hz % slot->clock) 620 div = host->bus_hz / slot->clock;
621 if (host->bus_hz % slot->clock && host->bus_hz > slot->clock)
621 /* 622 /*
622 * move the + 1 after the divide to prevent 623 * move the + 1 after the divide to prevent
623 * over-clocking the card. 624 * over-clocking the card.
624 */ 625 */
625 div = ((host->bus_hz / slot->clock) >> 1) + 1; 626 div += 1;
626 else 627
627 div = (host->bus_hz / slot->clock) >> 1; 628 div = (host->bus_hz != slot->clock) ? DIV_ROUND_UP(div, 2) : 0;
628 629
629 dev_info(&slot->mmc->class_dev, 630 dev_info(&slot->mmc->class_dev,
630 "Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ" 631 "Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ"