From 391be7395f6eb8cf35e2afbd49cf7cb3d1bae279 Mon Sep 17 00:00:00 2001 From: Nan Li Date: Tue, 11 Jun 2019 14:28:50 +0800 Subject: [PATCH] sdio: optimize sdio clk cfg [1/1] 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 sdio: optimize sdio clk cfg [2/2] PD#SWPL-9640 Problem: sdio auto_clk close fail. Solution: optimize sdio auto_clk cfg, add sdio_clk_always_on(int on). Verify: G12A_u211 Change-Id: Id760b41a948c6b7e15f675376084b0cdd4edc151 Signed-off-by: Nan Li --- drivers/amlogic/mmc/aml_sd_emmc.c | 1 + drivers/amlogic/mmc/amlsd.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/drivers/amlogic/mmc/aml_sd_emmc.c b/drivers/amlogic/mmc/aml_sd_emmc.c index d8446d6421aa..0218c4deeac9 100644 --- a/drivers/amlogic/mmc/aml_sd_emmc.c +++ b/drivers/amlogic/mmc/aml_sd_emmc.c @@ -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; diff --git a/drivers/amlogic/mmc/amlsd.c b/drivers/amlogic/mmc/amlsd.c index eea5ccf78985..239b3c00821f 100644 --- a/drivers/amlogic/mmc/amlsd.c +++ b/drivers/amlogic/mmc/amlsd.c @@ -275,6 +275,33 @@ void aml_emmc_hw_reset(struct mmc_host *mmc) #endif } +void sdio_clk_always_on(int on) +{ + 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); + if (on) { + pconf->auto_clk = 0; + pconf->spare = 1; + } else { + pconf->auto_clk = 1; + pconf->spare = 0; + } + writel(vconf, host->base + SD_EMMC_CFG); + + pr_info("clk always on (%d): cfg = %x\n", + on, readl(host->base + SD_EMMC_CFG)); + } +} +EXPORT_SYMBOL(sdio_clk_always_on); + static void sdio_rescan(struct mmc_host *mmc) { int ret;