Revert "mmc: host: Disable SDIO card clock when idle for Tegra 3 only"
Pavan Kunapuli [Mon, 25 Jun 2012 10:07:46 +0000 (15:07 +0530)]
Without the card clock, inband interrupt is not working on
some wifi chips.

Bug 981683

This reverts commit 0467657691ba046b492504272baf7c626d9a3713.

Signed-off-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Reviewed-on: http://git-master/r/110826
(cherry picked from commit 33c8e504328387097ed0160082cce6b36b994bd8)
Signed-off-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Change-Id: I6683720a9bda1f779a63133d8ca64a024c5d8a08
Reviewed-on: http://git-master/r/116707
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>

drivers/mmc/host/sdhci-tegra.c
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 86cee26..d25400d 100644 (file)
 
 static unsigned int tegra_sdhost_min_freq;
 static unsigned int tegra_sdhost_std_freq;
-
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock);
 static void tegra3_sdhci_post_reset_init(struct sdhci_host *sdhci);
 
 static unsigned int tegra3_sdhost_max_clk[4] = {
        208000000,      104000000,      208000000,      104000000 };
-#endif
 
 struct tegra_sdhci_hw_ops{
        /* Set the internal clk and card clk.*/
@@ -190,7 +187,6 @@ static unsigned int tegra_sdhci_get_ro(struct sdhci_host *sdhci)
        return gpio_get_value(plat->wp_gpio);
 }
 
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
 static void tegra3_sdhci_post_reset_init(struct sdhci_host *sdhci)
 {
        u16 misc_ctrl;
@@ -227,7 +223,6 @@ static void tegra3_sdhci_post_reset_init(struct sdhci_host *sdhci)
                SDHCI_VENDOR_MISC_CNTRL_ENABLE_SDR50_SUPPORT;
        sdhci_writew(sdhci, misc_ctrl, SDHCI_VENDOR_MISC_CNTRL);
 }
-#endif
 
 static int tegra_sdhci_set_uhs_signaling(struct sdhci_host *host,
                unsigned int uhs)
@@ -411,7 +406,6 @@ static void tegra_sdhci_set_clk_rate(struct sdhci_host *sdhci,
        sdhci->max_clk = clk_get_rate(pltfm_host->clk);
 }
 
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock)
 {
        int div;
@@ -496,7 +490,6 @@ set_clk:
 out:
        sdhci->clock = clock;
 }
-#endif
 
 static void tegra_sdhci_set_clock(struct sdhci_host *sdhci, unsigned int clock)
 {
@@ -918,9 +911,6 @@ static struct sdhci_ops tegra_sdhci_ops = {
        .read_w     = tegra_sdhci_readw,
        .write_l    = tegra_sdhci_writel,
        .platform_8bit_width = tegra_sdhci_8bit,
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
-       .set_card_clock = tegra_3x_sdhci_set_card_clock,
-#endif
        .set_clock  = tegra_sdhci_set_clock,
        .suspend    = tegra_sdhci_suspend,
        .resume     = tegra_sdhci_resume,
index 2281466..6c86278 100644 (file)
@@ -1849,6 +1849,7 @@ static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
 int sdhci_enable(struct mmc_host *mmc)
 {
        struct sdhci_host *host = mmc_priv(mmc);
+       u16 clk;
 
        if (!mmc->card)
                return 0;
@@ -1859,8 +1860,9 @@ int sdhci_enable(struct mmc_host *mmc)
                                host->ops->set_clock(host, mmc->ios.clock);
                        sdhci_set_clock(host, mmc->ios.clock);
                } else {
-                       if (host->ops->set_card_clock)
-                               host->ops->set_card_clock(host, mmc->ios.clock);
+                       clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+                       clk |= SDHCI_CLOCK_CARD_EN;
+                       sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
                }
        }
 
@@ -1870,6 +1872,7 @@ int sdhci_enable(struct mmc_host *mmc)
 int sdhci_disable(struct mmc_host *mmc, int lazy)
 {
        struct sdhci_host *host = mmc_priv(mmc);
+       u16 clk;
 
        if (!mmc->card)
                return 0;
@@ -1880,8 +1883,9 @@ int sdhci_disable(struct mmc_host *mmc, int lazy)
                if (host->ops->set_clock)
                        host->ops->set_clock(host, 0);
        } else {
-               if (host->ops->set_card_clock)
-                       host->ops->set_card_clock(host, 0);
+               clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+               clk &= ~SDHCI_CLOCK_CARD_EN;
+               sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
        }
 
        return 0;
index bf48767..c00833d 100644 (file)
@@ -260,7 +260,6 @@ struct sdhci_ops {
 #endif
 
        void    (*set_clock)(struct sdhci_host *host, unsigned int clock);
-       void    (*set_card_clock)(struct sdhci_host *host, unsigned int clock);
 
        int             (*enable_dma)(struct sdhci_host *host);
        unsigned int    (*get_max_clock)(struct sdhci_host *host);