sdio: optimize sdio clk cfg [1/1]
authorNan Li <nan.li@amlogic.com>
Tue, 11 Jun 2019 06:28:50 +0000 (14:28 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Tue, 18 Jun 2019 03:44:05 +0000 (20:44 -0700)
PD#SWPL-9640

Problem:
sdio auto_clk close fail.

Solution:
optimize sdio auto_clk cfg,
add sdio_clk_always_on().

Verify:
G12A_u211

Change-Id: Iec6e9460ad650001f079844f183d905789aa76e7
Signed-off-by: Nan Li <nan.li@amlogic.com>
drivers/amlogic/mmc/aml_sd_emmc.c
drivers/amlogic/mmc/amlsd.c

index 859962f..05455de 100644 (file)
@@ -2970,6 +2970,7 @@ static int aml_sd_emmc_card_busy(struct mmc_host *mmc)
                vconf = readl(host->base + SD_EMMC_CFG);
                pconf->auto_clk = 1;
                writel(vconf, host->base + SD_EMMC_CFG);
+               host->sd_sdio_switch_volat_done = 0;
                if ((host->mem->start == host->data->port_b_base)
                                && host->data->tdma_f)
                        host->init_volt = 0;
index 57bc96c..dfb2ad7 100644 (file)
@@ -304,6 +304,28 @@ void sdio_reinit(void)
 }
 EXPORT_SYMBOL(sdio_reinit);
 
+void sdio_clk_always_on(void)
+{
+       u32 vconf = 0;
+       struct sd_emmc_config *pconf = (struct sd_emmc_config *)&vconf;
+       struct amlsd_platform *pdata = NULL;
+       struct amlsd_host *host = NULL;
+
+       if (sdio_host) {
+               pdata = mmc_priv(sdio_host);
+               host = pdata->host;
+
+               vconf = readl(host->base + SD_EMMC_CFG);
+               pconf->auto_clk = 0;
+               pconf->spare = 1;
+               writel(vconf, host->base + SD_EMMC_CFG);
+
+               pr_info("clk always on: cfg = %x\n",
+                               readl(host->base + SD_EMMC_CFG));
+       }
+}
+EXPORT_SYMBOL(sdio_clk_always_on);
+
 void of_amlsd_pwr_prepare(struct amlsd_platform *pdata)
 {
 }