This adds SDHCI_AM654_QUIRK_DISABLE_HS400 quirk which shall be used
to disable HS400 support. AM62P SR1.0 and SR1.1 do not support HS400
due to errata i2458 [0] so disable HS400 for these SoC revisions.
[0] https://www.ti.com/lit/er/sprz574a/sprz574a.pdf
Signed-off-by: Judith Mendez <jm@ti.com>
---
drivers/mmc/host/sdhci_am654.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
index e4fc345be7e5..b7d2adff3277 100644
--- a/drivers/mmc/host/sdhci_am654.c
+++ b/drivers/mmc/host/sdhci_am654.c
@@ -156,6 +156,7 @@ struct sdhci_am654_data {
#define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0)
#define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1)
+#define SDHCI_AM654_QUIRK_DISABLE_HS400 BIT(2)
};
struct window {
@@ -820,6 +821,9 @@ static int sdhci_am654_init(struct sdhci_host *host)
if (ret)
goto err_cleanup_host;
+ if (sdhci_am654->quirks & SDHCI_AM654_QUIRK_DISABLE_HS400)
+ host->mmc->caps2 &= ~(MMC_CAP2_HS400 | MMC_CAP2_HS400_ES);
+
ret = __sdhci_add_host(host);
if (ret)
goto err_cleanup_host;
@@ -883,6 +887,12 @@ static int sdhci_am654_get_of_property(struct platform_device *pdev,
return 0;
}
+static const struct soc_device_attribute sdhci_am654_descope_hs400[] = {
+ { .family = "AM62PX", .revision = "SR1.0" },
+ { .family = "AM62PX", .revision = "SR1.1" },
+ { /* sentinel */ }
+};
+
static const struct of_device_id sdhci_am654_of_match[] = {
{
.compatible = "ti,am654-sdhci-5.1",
@@ -970,6 +980,12 @@ static int sdhci_am654_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "parsing dt failed\n");
+ soc = soc_device_match(sdhci_am654_descope_hs400);
+ if (soc) {
+ dev_err(dev, "Disable descoped HS400 mode for this silicon revision\n");
+ sdhci_am654->quirks |= SDHCI_AM654_QUIRK_DISABLE_HS400;
+ }
+
host->mmc_host_ops.start_signal_voltage_switch = sdhci_am654_start_signal_voltage_switch;
host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning;
--
2.49.0
On 8/5/25 6:49 PM, Judith Mendez wrote: > This adds SDHCI_AM654_QUIRK_DISABLE_HS400 quirk which shall be used > to disable HS400 support. AM62P SR1.0 and SR1.1 do not support HS400 > due to errata i2458 [0] so disable HS400 for these SoC revisions. > > [0] https://www.ti.com/lit/er/sprz574a/sprz574a.pdf > Signed-off-by: Judith Mendez <jm@ti.com> > --- > drivers/mmc/host/sdhci_am654.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c > index e4fc345be7e5..b7d2adff3277 100644 > --- a/drivers/mmc/host/sdhci_am654.c > +++ b/drivers/mmc/host/sdhci_am654.c > @@ -156,6 +156,7 @@ struct sdhci_am654_data { > > #define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0) > #define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1) > +#define SDHCI_AM654_QUIRK_DISABLE_HS400 BIT(2) > }; > > struct window { > @@ -820,6 +821,9 @@ static int sdhci_am654_init(struct sdhci_host *host) > if (ret) > goto err_cleanup_host; > > + if (sdhci_am654->quirks & SDHCI_AM654_QUIRK_DISABLE_HS400) > + host->mmc->caps2 &= ~(MMC_CAP2_HS400 | MMC_CAP2_HS400_ES); > + > ret = __sdhci_add_host(host); > if (ret) > goto err_cleanup_host; > @@ -883,6 +887,12 @@ static int sdhci_am654_get_of_property(struct platform_device *pdev, > return 0; > } > > +static const struct soc_device_attribute sdhci_am654_descope_hs400[] = { > + { .family = "AM62PX", .revision = "SR1.0" }, > + { .family = "AM62PX", .revision = "SR1.1" }, > + { /* sentinel */ } > +}; > + > static const struct of_device_id sdhci_am654_of_match[] = { > { > .compatible = "ti,am654-sdhci-5.1", > @@ -970,6 +980,12 @@ static int sdhci_am654_probe(struct platform_device *pdev) > if (ret) > return dev_err_probe(dev, ret, "parsing dt failed\n"); > > + soc = soc_device_match(sdhci_am654_descope_hs400); > + if (soc) { > + dev_err(dev, "Disable descoped HS400 mode for this silicon revision\n"); Not really an error, use dev_info() or dev_warn(). Also this message should go up in the init function when the caps are actually removed, and only printed if the caps were set in the first place. Andrew > + sdhci_am654->quirks |= SDHCI_AM654_QUIRK_DISABLE_HS400; > + } > + > host->mmc_host_ops.start_signal_voltage_switch = sdhci_am654_start_signal_voltage_switch; > host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning; >
Hi Andrew, On 8/7/25 12:28 PM, Andrew Davis wrote: > On 8/5/25 6:49 PM, Judith Mendez wrote: >> This adds SDHCI_AM654_QUIRK_DISABLE_HS400 quirk which shall be used >> to disable HS400 support. AM62P SR1.0 and SR1.1 do not support HS400 >> due to errata i2458 [0] so disable HS400 for these SoC revisions. >> >> [0] https://www.ti.com/lit/er/sprz574a/sprz574a.pdf >> Signed-off-by: Judith Mendez <jm@ti.com> >> --- >> drivers/mmc/host/sdhci_am654.c | 16 ++++++++++++++++ >> 1 file changed, 16 insertions(+) >> >> diff --git a/drivers/mmc/host/sdhci_am654.c >> b/drivers/mmc/host/sdhci_am654.c >> index e4fc345be7e5..b7d2adff3277 100644 >> --- a/drivers/mmc/host/sdhci_am654.c >> +++ b/drivers/mmc/host/sdhci_am654.c >> @@ -156,6 +156,7 @@ struct sdhci_am654_data { >> #define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0) >> #define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1) >> +#define SDHCI_AM654_QUIRK_DISABLE_HS400 BIT(2) >> }; >> struct window { >> @@ -820,6 +821,9 @@ static int sdhci_am654_init(struct sdhci_host *host) >> if (ret) >> goto err_cleanup_host; >> + if (sdhci_am654->quirks & SDHCI_AM654_QUIRK_DISABLE_HS400) >> + host->mmc->caps2 &= ~(MMC_CAP2_HS400 | MMC_CAP2_HS400_ES); >> + >> ret = __sdhci_add_host(host); >> if (ret) >> goto err_cleanup_host; >> @@ -883,6 +887,12 @@ static int sdhci_am654_get_of_property(struct >> platform_device *pdev, >> return 0; >> } >> +static const struct soc_device_attribute sdhci_am654_descope_hs400[] = { >> + { .family = "AM62PX", .revision = "SR1.0" }, >> + { .family = "AM62PX", .revision = "SR1.1" }, >> + { /* sentinel */ } >> +}; >> + >> static const struct of_device_id sdhci_am654_of_match[] = { >> { >> .compatible = "ti,am654-sdhci-5.1", >> @@ -970,6 +980,12 @@ static int sdhci_am654_probe(struct >> platform_device *pdev) >> if (ret) >> return dev_err_probe(dev, ret, "parsing dt failed\n"); >> + soc = soc_device_match(sdhci_am654_descope_hs400); >> + if (soc) { >> + dev_err(dev, "Disable descoped HS400 mode for this silicon >> revision\n"); > > Not really an error, use dev_info() or dev_warn(). Also this message > should go up in the init function when the caps are actually removed, > and only printed if the caps were set in the first place. Will fix for v2, thanks ~ Judith
© 2016 - 2025 Red Hat, Inc.