Commit 254274cd authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: sdhci: Eliminate SDHCI_QUIRK_UNSTABLE_RO_DETECT

SDHCI_QUIRK_UNSTABLE_RO_DETECT is used by only one driver variant.
It was added in 2011 by commit 82b0e23a ("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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20240614080051.4005-4-adrian.hunter@intel.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 8d46e04c
...@@ -1319,6 +1319,23 @@ static const struct sdhci_pci_fixes sdhci_intel_mrfld_mmc = { ...@@ -1319,6 +1319,23 @@ static const struct sdhci_pci_fixes sdhci_intel_mrfld_mmc = {
.probe_slot = intel_mrfld_mmc_probe_slot, .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) static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
{ {
u8 scratch; u8 scratch;
...@@ -1403,11 +1420,6 @@ static int jmicron_probe(struct sdhci_pci_chip *chip) ...@@ -1403,11 +1420,6 @@ static int jmicron_probe(struct sdhci_pci_chip *chip)
return ret; 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; return 0;
} }
...@@ -1462,6 +1474,11 @@ static int jmicron_probe_slot(struct sdhci_pci_slot *slot) ...@@ -1462,6 +1474,11 @@ static int jmicron_probe_slot(struct sdhci_pci_slot *slot)
slot->host->mmc->caps |= MMC_CAP_BUS_WIDTH_TEST; 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; return 0;
} }
......
...@@ -2513,8 +2513,9 @@ int sdhci_get_cd_nogpio(struct mmc_host *mmc) ...@@ -2513,8 +2513,9 @@ int sdhci_get_cd_nogpio(struct mmc_host *mmc)
} }
EXPORT_SYMBOL_GPL(sdhci_get_cd_nogpio); 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; bool allow_invert = false;
int is_readonly; int is_readonly;
...@@ -2522,10 +2523,10 @@ static int sdhci_check_ro(struct sdhci_host *host) ...@@ -2522,10 +2523,10 @@ static int sdhci_check_ro(struct sdhci_host *host)
is_readonly = 0; is_readonly = 0;
} else if (host->ops->get_ro) { } else if (host->ops->get_ro) {
is_readonly = host->ops->get_ro(host); is_readonly = host->ops->get_ro(host);
} else if (mmc_can_gpio_ro(host->mmc)) { } else if (mmc_can_gpio_ro(mmc)) {
is_readonly = mmc_gpio_get_ro(host->mmc); is_readonly = mmc_gpio_get_ro(mmc);
/* Do not invert twice */ /* Do not invert twice */
allow_invert = !(host->mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH); allow_invert = !(mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
} else { } else {
is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE) is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
& SDHCI_WRITE_PROTECT); & SDHCI_WRITE_PROTECT);
...@@ -2539,27 +2540,7 @@ static int sdhci_check_ro(struct sdhci_host *host) ...@@ -2539,27 +2540,7 @@ static int sdhci_check_ro(struct sdhci_host *host)
return is_readonly; return is_readonly;
} }
EXPORT_SYMBOL_GPL(sdhci_get_ro);
#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;
}
static void sdhci_hw_reset(struct mmc_host *mmc) static void sdhci_hw_reset(struct mmc_host *mmc)
{ {
......
...@@ -437,8 +437,6 @@ struct sdhci_host { ...@@ -437,8 +437,6 @@ struct sdhci_host {
#define SDHCI_QUIRK_NO_HISPD_BIT (1<<29) #define SDHCI_QUIRK_NO_HISPD_BIT (1<<29)
/* Controller treats ADMA descriptors with length 0000h incorrectly */ /* Controller treats ADMA descriptors with length 0000h incorrectly */
#define SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC (1<<30) #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. */ unsigned int quirks2; /* More deviations from spec. */
...@@ -788,6 +786,7 @@ void sdhci_set_power_and_bus_voltage(struct sdhci_host *host, ...@@ -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, void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
unsigned short vdd); unsigned short vdd);
int sdhci_get_cd_nogpio(struct mmc_host *mmc); 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); void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq);
int sdhci_request_atomic(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); void sdhci_set_bus_width(struct sdhci_host *host, int width);
......
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