mmc: sdhci: Get rid of SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 26 Sep 2022 19:20:21 +0000 (22:20 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 28 Sep 2022 08:08:50 +0000 (10:08 +0200)
SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS is used by only ENE controllers but can
be replaced by driver code.

Amend the ENE code to hook the ->set_ios() mmc host operation and do the
reset there.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20220926192022.85660-4-adrian.hunter@intel.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-pci-core.c
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 622b7de..169b847 100644 (file)
@@ -297,6 +297,27 @@ static const struct sdhci_pci_fixes sdhci_ricoh_mmc = {
                          SDHCI_QUIRK_MISSING_CAPS
 };
 
+static void ene_714_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+{
+       struct sdhci_host *host = mmc_priv(mmc);
+
+       sdhci_set_ios(mmc, ios);
+
+       /*
+        * Some (ENE) controllers misbehave on some ios operations,
+        * signalling timeout and CRC errors even on CMD0. Resetting
+        * it on each ios seems to solve the problem.
+        */
+       if (!(host->flags & SDHCI_DEVICE_DEAD))
+               sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
+}
+
+static int ene_714_probe_slot(struct sdhci_pci_slot *slot)
+{
+       slot->host->mmc_host_ops.set_ios = ene_714_set_ios;
+       return 0;
+}
+
 static const struct sdhci_pci_fixes sdhci_ene_712 = {
        .quirks         = SDHCI_QUIRK_SINGLE_POWER_WRITE |
                          SDHCI_QUIRK_BROKEN_DMA,
@@ -304,8 +325,8 @@ static const struct sdhci_pci_fixes sdhci_ene_712 = {
 
 static const struct sdhci_pci_fixes sdhci_ene_714 = {
        .quirks         = SDHCI_QUIRK_SINGLE_POWER_WRITE |
-                         SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS |
                          SDHCI_QUIRK_BROKEN_DMA,
+       .probe_slot     = ene_714_probe_slot,
 };
 
 static const struct sdhci_pci_fixes sdhci_cafe = {
index 4d672e7..ff4342d 100644 (file)
@@ -2407,14 +2407,6 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                host->ops->set_clock(host, host->clock);
        } else
                sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
-
-       /*
-        * Some (ENE) controllers go apeshit on some ios operation,
-        * signalling timeout and CRC errors even on CMD0. Resetting
-        * it on each ios seems to solve the problem.
-        */
-       if (host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS)
-               sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
 }
 EXPORT_SYMBOL_GPL(sdhci_set_ios);
 
index 95a08f0..d750c46 100644 (file)
@@ -379,8 +379,6 @@ struct sdhci_host {
 #define SDHCI_QUIRK_NO_CARD_NO_RESET                   (1<<2)
 /* Controller doesn't like clearing the power reg before a change */
 #define SDHCI_QUIRK_SINGLE_POWER_WRITE                 (1<<3)
-/* Controller has flaky internal state so reset it on each ios change */
-#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS              (1<<4)
 /* Controller has an unusable DMA engine */
 #define SDHCI_QUIRK_BROKEN_DMA                         (1<<5)
 /* Controller has an unusable ADMA engine */