Commit 53f9460e authored by Tony Lindgren's avatar Tony Lindgren Committed by Ulf Hansson

mmc: sdhci-omap: Restore sysconfig after reset

The sysconfig register is managed in a generic way by PM runtime for us by
the interconnect target module layer code. SDHCI_RESET_ALL also resets the
target module configuration, so we need to restore sysconfig after reset.

Note that there is no need to save and restore sysconfig during PM runtime,
the PM runtime layer will do that for us.

Not sure if this issue is a problem with the current configurations, I
noticed the issue while adding support for older TI SoCs and testing with
wlcore SDIO wlan device.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
Link: https://lore.kernel.org/r/20210921110029.21944-4-tony@atomide.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent d806e334
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include "sdhci-pltfm.h" #include "sdhci-pltfm.h"
#define SDHCI_OMAP_SYSCONFIG 0x110
#define SDHCI_OMAP_CON 0x12c #define SDHCI_OMAP_CON 0x12c
#define CON_DW8 BIT(5) #define CON_DW8 BIT(5)
#define CON_DMA_MASTER BIT(20) #define CON_DMA_MASTER BIT(20)
...@@ -797,6 +799,11 @@ static void sdhci_omap_reset(struct sdhci_host *host, u8 mask) ...@@ -797,6 +799,11 @@ static void sdhci_omap_reset(struct sdhci_host *host, u8 mask)
struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host); struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host);
unsigned long limit = MMC_TIMEOUT_US; unsigned long limit = MMC_TIMEOUT_US;
unsigned long i = 0; unsigned long i = 0;
u32 sysc;
/* Save target module sysconfig configured by SoC PM layer */
if (mask & SDHCI_RESET_ALL)
sysc = sdhci_omap_readl(omap_host, SDHCI_OMAP_SYSCONFIG);
/* Don't reset data lines during tuning operation */ /* Don't reset data lines during tuning operation */
if (omap_host->is_tuning) if (omap_host->is_tuning)
...@@ -816,10 +823,15 @@ static void sdhci_omap_reset(struct sdhci_host *host, u8 mask) ...@@ -816,10 +823,15 @@ static void sdhci_omap_reset(struct sdhci_host *host, u8 mask)
dev_err(mmc_dev(host->mmc), dev_err(mmc_dev(host->mmc),
"Timeout waiting on controller reset in %s\n", "Timeout waiting on controller reset in %s\n",
__func__); __func__);
return;
goto restore_sysc;
} }
sdhci_reset(host, mask); sdhci_reset(host, mask);
restore_sysc:
if (mask & SDHCI_RESET_ALL)
sdhci_omap_writel(omap_host, SDHCI_OMAP_SYSCONFIG, sysc);
} }
#define CMD_ERR_MASK (SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX |\ #define CMD_ERR_MASK (SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX |\
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment