summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2011-05-19 17:56:33 -0700
committerSimon Glass <sjg@chromium.org>2011-08-24 10:01:51 -0700
commitf22424f2c7b085a88eb6b750c6acca1e2d133e9c (patch)
tree73b4d58fd2af0e64114f6b502a16cf6a33a02bd8 /drivers/mmc
parenta9177e1137f15505a0a5718e46167f43baede92b (diff)
tegra2: Add clock and PLL control functions
This adds functions for setting up clocks to peripherals, by selecting a parent clock and specifying a rate. BUG=chromium-os:13228 TEST=Build, boot on Seaboard Change-Id: I957723b5f0ef64244c16f44ae7cbd79abf06427d Reviewed-on: http://gerrit.chromium.org/gerrit/1290 Reviewed-by: Simon Glass <sjg@chromium.org> Tested-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/tegra2_mmc.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/drivers/mmc/tegra2_mmc.c b/drivers/mmc/tegra2_mmc.c
index 8b6f829e738..d69bbefd810 100644
--- a/drivers/mmc/tegra2_mmc.c
+++ b/drivers/mmc/tegra2_mmc.c
@@ -23,6 +23,7 @@
#include <mmc.h>
#include <asm/io.h>
#include <asm/arch/clk_rst.h>
+#include <asm/arch/clock.h>
#include "tegra2_mmc.h"
/* support 4 mmc hosts */
@@ -277,8 +278,9 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
int div, hw_div;
unsigned short clk;
unsigned long timeout;
- unsigned int reg, hostbase;
- struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
+ unsigned int hostbase;
+ enum periph_id mmc_id = PERIPH_ID_SDMMC1;
+
debug(" mmc_change_clock called\n");
/* Change Tegra2 SDMMCx clock divisor here */
@@ -305,27 +307,16 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
hostbase = readl(&host->base);
debug("mmc_change_clock: hostbase = %08X\n", hostbase);
- if (hostbase == TEGRA2_SDMMC1_BASE) {
- reg = readl(&clkrst->crc_clk_src_sdmmc1);
- reg &= 0xFFFFFF00; /* divisor (7.1) = 00 */
- reg |= hw_div; /* n-1 */
- writel(reg, &clkrst->crc_clk_src_sdmmc1);
- } else if (hostbase == TEGRA2_SDMMC2_BASE) {
- reg = readl(&clkrst->crc_clk_src_sdmmc2);
- reg &= 0xFFFFFF00; /* divisor (7.1) = 00 */
- reg |= hw_div; /* n-1 */
- writel(reg, &clkrst->crc_clk_src_sdmmc2);
- } else if (hostbase == TEGRA2_SDMMC3_BASE) {
- reg = readl(&clkrst->crc_clk_src_sdmmc3);
- reg &= 0xFFFFFF00; /* divisor (7.1) = 00 */
- reg |= hw_div; /* n-1 */
- writel(reg, &clkrst->crc_clk_src_sdmmc3);
- } else {
- reg = readl(&clkrst->crc_clk_src_sdmmc4);
- reg &= 0xFFFFFF00; /* divisor (7.1) = 00 */
- reg |= hw_div; /* n-1 */
- writel(reg, &clkrst->crc_clk_src_sdmmc4);
- }
+ /* TODO: We need to record the PERIPH_ID, not the hostbase */
+ if (hostbase == TEGRA2_SDMMC1_BASE)
+ mmc_id = PERIPH_ID_SDMMC1;
+ else if (hostbase == TEGRA2_SDMMC2_BASE)
+ mmc_id = PERIPH_ID_SDMMC2;
+ else if (hostbase == TEGRA2_SDMMC3_BASE)
+ mmc_id = PERIPH_ID_SDMMC3;
+ else if (hostbase == TEGRA2_SDMMC4_BASE)
+ mmc_id = PERIPH_ID_SDMMC4;
+ clock_ll_set_source_divisor(mmc_id, CLOCK_ID_PERIPH, hw_div);
writew(0, &host->reg->clkcon);