From 75dfde714bbe81e938190142d07307fa864fda34 Mon Sep 17 00:00:00 2001 From: Yifeng Zhao Date: Sat, 22 Jun 2024 10:36:18 +0800 Subject: [PATCH] mmc: sdhci-dwc: Fix SDHCI_RESET_ALL for CQHCI for rk35xx For rockchip sdhci controllers, SDHCI_RESET_ALL resets also CQHCI registers. Normally, SDHCI_RESET_ALL is not used while CQHCI is enabled, but that can happen on the error path. e.g. if mmc_cqe_recovery() fails, mmc_blk_reset() is called which, for a eMMC that does not support HW Reset, will cycle the bus power and the driver will perform SDHCI_RESET_ALL. So whenever performing SDHCI_RESET_ALL ensure CQHCI is deactivated. That will force the driver to reinitialize CQHCI when it is next used. Signed-off-by: Yifeng Zhao Change-Id: Iee491501ff7e32e347303f5389f22eef9f8f658b --- drivers/mmc/host/sdhci-of-dwcmshc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c index 24db6a819fa2..674c291d28fa 100644 --- a/drivers/mmc/host/sdhci-of-dwcmshc.c +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c @@ -529,6 +529,9 @@ static void rk35xx_sdhci_reset(struct sdhci_host *host, u8 mask) struct rk35xx_priv *priv = dwc_priv->priv; u32 extra = sdhci_readl(host, DECMSHC_EMMC_MISC_CON); + if ((host->mmc->caps2 & MMC_CAP2_CQE) && (mask & SDHCI_RESET_ALL)) + cqhci_deactivate(host->mmc); + if (mask & SDHCI_RESET_ALL && priv->reset) { reset_control_assert(priv->reset); udelay(1);