diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2010-11-11 13:42:09 +0530 |
---|---|---|
committer | Nitin Kumbhar <nkumbhar@nvidia.com> | 2010-11-11 13:42:09 +0530 |
commit | 949a93f879aef1c53b8317e28e8db7258d299332 (patch) | |
tree | baf8423f14f179d8d226bb1508bc36b4e6ef49c8 /drivers/mmc/host/sdhci-tegra.c | |
parent | 52716f14531c3a62008fe1924cfafa05fa46173e (diff) | |
parent | 1b7aeb98256b733251847db1750626b710d4fba1 (diff) |
Merge branch android-tegra-2.6.36 into git-master/linux-2.6/android-tegra-2.6.36
Change-Id: I7dbc97aee0c0912baf4722a8756d228bf7dd1212
Diffstat (limited to 'drivers/mmc/host/sdhci-tegra.c')
-rw-r--r-- | drivers/mmc/host/sdhci-tegra.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index b7e97c3bbfa5..4493802a458e 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -30,9 +30,12 @@ #define DRIVER_NAME "sdhci-tegra" +#define SDHCI_VENDOR_CLOCK_CNTRL 0x100 + struct tegra_sdhci_host { struct sdhci_host *sdhci; struct clk *clk; + int clk_enabled; }; static irqreturn_t carddetect_irq(int irq, void *data) @@ -56,8 +59,31 @@ static int tegra_sdhci_enable_dma(struct sdhci_host *host) return 0; } +static void tegra_sdhci_enable_clock(struct tegra_sdhci_host *host, int enable) +{ + if (enable && !host->clk_enabled) { + clk_enable(host->clk); + sdhci_writeb(host->sdhci, 1, SDHCI_VENDOR_CLOCK_CNTRL); + host->clk_enabled = 1; + } else if (!enable && host->clk_enabled) { + sdhci_writeb(host->sdhci, 0, SDHCI_VENDOR_CLOCK_CNTRL); + clk_disable(host->clk); + host->clk_enabled = 0; + } +} + +static void tegra_sdhci_set_clock(struct sdhci_host *sdhci, unsigned int clock) +{ + struct tegra_sdhci_host *host = sdhci_priv(sdhci); + pr_info("tegra sdhci clock %s %u enabled=%d\n", + mmc_hostname(sdhci->mmc), clock, host->clk_enabled); + + tegra_sdhci_enable_clock(host, clock); +} + static struct sdhci_ops tegra_sdhci_ops = { .enable_dma = tegra_sdhci_enable_dma, + .set_clock = tegra_sdhci_set_clock, }; static int __devinit tegra_sdhci_probe(struct platform_device *pdev) @@ -105,6 +131,7 @@ static int __devinit tegra_sdhci_probe(struct platform_device *pdev) if (rc != 0) goto err_clkput; + host->clk_enabled = 1; sdhci->hw_name = "tegra"; sdhci->ops = &tegra_sdhci_ops; sdhci->irq = irq; @@ -205,6 +232,7 @@ static int tegra_sdhci_resume(struct platform_device *pdev) struct tegra_sdhci_host *host = platform_get_drvdata(pdev); int ret; + tegra_sdhci_enable_clock(host, 1); ret = sdhci_resume_host(host->sdhci); if (ret) pr_err("%s: failed, error = %d\n", __func__, ret); |