]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mmc: sdhci: Eliminate SDHCI_QUIRK_UNSTABLE_RO_DETECT
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 14 Jun 2024 08:00:51 +0000 (11:00 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 20 Jun 2024 14:43:51 +0000 (16:43 +0200)
SDHCI_QUIRK_UNSTABLE_RO_DETECT is used by only one driver variant.
It was added in 2011 by commit 82b0e23a295c ("mmc: sdhci: Fix read-only
detection with JMicron 388 chip").

Simplify sdhci by moving the logic to the only place it is used.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20240614080051.4005-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 23e6ba70144c78ea84fb5d2f59ff3913ca9bfa26..ed45ed0bdafd9657f1602e94f502ff46187fe891 100644 (file)
@@ -1319,6 +1319,23 @@ static const struct sdhci_pci_fixes sdhci_intel_mrfld_mmc = {
        .probe_slot     = intel_mrfld_mmc_probe_slot,
 };
 
+#define JMB388_SAMPLE_COUNT    5
+
+static int jmicron_jmb388_get_ro(struct mmc_host *mmc)
+{
+       int i, ro_count;
+
+       ro_count = 0;
+       for (i = 0; i < JMB388_SAMPLE_COUNT; i++) {
+               if (sdhci_get_ro(mmc) > 0) {
+                       if (++ro_count > JMB388_SAMPLE_COUNT / 2)
+                               return 1;
+               }
+               msleep(30);
+       }
+       return 0;
+}
+
 static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
 {
        u8 scratch;
@@ -1403,11 +1420,6 @@ static int jmicron_probe(struct sdhci_pci_chip *chip)
                return ret;
        }
 
-       /* quirk for unsable RO-detection on JM388 chips */
-       if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_SD ||
-           chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD)
-               chip->quirks |= SDHCI_QUIRK_UNSTABLE_RO_DETECT;
-
        return 0;
 }
 
@@ -1462,6 +1474,11 @@ static int jmicron_probe_slot(struct sdhci_pci_slot *slot)
 
        slot->host->mmc->caps |= MMC_CAP_BUS_WIDTH_TEST;
 
+       /* Handle unstable RO-detection on JM388 chips */
+       if (slot->chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_SD ||
+           slot->chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD)
+               slot->host->mmc_host_ops.get_ro = jmicron_jmb388_get_ro;
+
        return 0;
 }
 
index 112584aa077231eed8a1d86ca77a4c1e55d45d1a..a20df9383b20df3e6def3707c2ae2a8ffbf7cf82 100644 (file)
@@ -2513,8 +2513,9 @@ out:
 }
 EXPORT_SYMBOL_GPL(sdhci_get_cd_nogpio);
 
-static int sdhci_check_ro(struct sdhci_host *host)
+int sdhci_get_ro(struct mmc_host *mmc)
 {
+       struct sdhci_host *host = mmc_priv(mmc);
        bool allow_invert = false;
        int is_readonly;
 
@@ -2522,10 +2523,10 @@ static int sdhci_check_ro(struct sdhci_host *host)
                is_readonly = 0;
        } else if (host->ops->get_ro) {
                is_readonly = host->ops->get_ro(host);
-       } else if (mmc_can_gpio_ro(host->mmc)) {
-               is_readonly = mmc_gpio_get_ro(host->mmc);
+       } else if (mmc_can_gpio_ro(mmc)) {
+               is_readonly = mmc_gpio_get_ro(mmc);
                /* Do not invert twice */
-               allow_invert = !(host->mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
+               allow_invert = !(mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
        } else {
                is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
                                & SDHCI_WRITE_PROTECT);
@@ -2539,27 +2540,7 @@ static int sdhci_check_ro(struct sdhci_host *host)
 
        return is_readonly;
 }
-
-#define SAMPLE_COUNT   5
-
-static int sdhci_get_ro(struct mmc_host *mmc)
-{
-       struct sdhci_host *host = mmc_priv(mmc);
-       int i, ro_count;
-
-       if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT))
-               return sdhci_check_ro(host);
-
-       ro_count = 0;
-       for (i = 0; i < SAMPLE_COUNT; i++) {
-               if (sdhci_check_ro(host)) {
-                       if (++ro_count > SAMPLE_COUNT / 2)
-                               return 1;
-               }
-               msleep(30);
-       }
-       return 0;
-}
+EXPORT_SYMBOL_GPL(sdhci_get_ro);
 
 static void sdhci_hw_reset(struct mmc_host *mmc)
 {
index 957c7a917ffb7ff4adf502dfb6d1e4660fbe9735..f531b617f28d77caa381b83015d806796c7f8638 100644 (file)
@@ -437,8 +437,6 @@ struct sdhci_host {
 #define SDHCI_QUIRK_NO_HISPD_BIT                       (1<<29)
 /* Controller treats ADMA descriptors with length 0000h incorrectly */
 #define SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC           (1<<30)
-/* The read-only detection via SDHCI_PRESENT_STATE register is unstable */
-#define SDHCI_QUIRK_UNSTABLE_RO_DETECT                 (1<<31)
 
        unsigned int quirks2;   /* More deviations from spec. */
 
@@ -788,6 +786,7 @@ void sdhci_set_power_and_bus_voltage(struct sdhci_host *host,
 void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
                           unsigned short vdd);
 int sdhci_get_cd_nogpio(struct mmc_host *mmc);
+int sdhci_get_ro(struct mmc_host *mmc);
 void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq);
 int sdhci_request_atomic(struct mmc_host *mmc, struct mmc_request *mrq);
 void sdhci_set_bus_width(struct sdhci_host *host, int width);