]> git.itanic.dy.fi Git - linux-stable/commitdiff
mmc: sdhci-esdhc-imx: improve ESDHC_FLAG_ERR010450
authorGiulio Benetti <giulio.benetti@benettiengineering.com>
Fri, 11 Aug 2023 21:48:53 +0000 (23:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Sep 2023 09:00:03 +0000 (11:00 +0200)
[ Upstream commit 5ae4b0d8875caa44946e579420c7fd5740d58653 ]

Errata ERR010450 only shows up if voltage is 1.8V, but if the device is
supplied by 3v3 the errata can be ignored. So let's check for if quirk
SDHCI_QUIRK2_NO_1_8_V is defined or not before limiting the frequency.

Cc: Jim Reinhart <jimr@tekvox.com>
Cc: James Autry <jautry@tekvox.com>
Cc: Matthew Maron <matthewm@tekvox.com>
Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
Acked-by: Haibo Chen <haibo.chen@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20230811214853.8623-1-giulio.benetti@benettiengineering.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index b3f761eca82998d853b999b43e548024878e5729..762288c6d30ce81f2da323d5ff145eeae31ef41d 100644 (file)
 #define ESDHC_FLAG_HS400               BIT(9)
 /*
  * The IP has errata ERR010450
- * uSDHC: Due to the I/O timing limit, for SDR mode, SD card clock can't
- * exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
+ * uSDHC: At 1.8V due to the I/O timing limit, for SDR mode, SD card
+ * clock can't exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
  */
 #define ESDHC_FLAG_ERR010450           BIT(10)
 /* The IP supports HS400ES mode */
@@ -777,7 +777,8 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
                | ESDHC_CLOCK_MASK);
        sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
 
-       if (imx_data->socdata->flags & ESDHC_FLAG_ERR010450) {
+       if ((imx_data->socdata->flags & ESDHC_FLAG_ERR010450) &&
+           (!(host->quirks2 & SDHCI_QUIRK2_NO_1_8_V))) {
                unsigned int max_clock;
 
                max_clock = imx_data->is_ddr ? 45000000 : 150000000;