|
@@ -112,6 +112,12 @@
|
|
#define ESDHC_FLAG_STD_TUNING BIT(5)
|
|
#define ESDHC_FLAG_STD_TUNING BIT(5)
|
|
/* The IP has SDHCI_CAPABILITIES_1 register */
|
|
/* The IP has SDHCI_CAPABILITIES_1 register */
|
|
#define ESDHC_FLAG_HAVE_CAP1 BIT(6)
|
|
#define ESDHC_FLAG_HAVE_CAP1 BIT(6)
|
|
|
|
+/*
|
|
|
|
+ * The IP has errata ERR004536
|
|
|
|
+ * uSDHC: ADMA Length Mismatch Error occurs if the AHB read access is slow,
|
|
|
|
+ * when reading data from the card
|
|
|
|
+ */
|
|
|
|
+#define ESDHC_FLAG_ERR004536 BIT(7)
|
|
|
|
|
|
struct esdhc_soc_data {
|
|
struct esdhc_soc_data {
|
|
u32 flags;
|
|
u32 flags;
|
|
@@ -139,7 +145,7 @@ static struct esdhc_soc_data usdhc_imx6q_data = {
|
|
|
|
|
|
static struct esdhc_soc_data usdhc_imx6sl_data = {
|
|
static struct esdhc_soc_data usdhc_imx6sl_data = {
|
|
.flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
|
|
.flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
|
|
- | ESDHC_FLAG_HAVE_CAP1,
|
|
|
|
|
|
+ | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_ERR004536,
|
|
};
|
|
};
|
|
|
|
|
|
struct pltfm_imx_data {
|
|
struct pltfm_imx_data {
|
|
@@ -991,6 +997,13 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
|
|
writel(0x08100810, host->ioaddr + ESDHC_WTMK_LVL);
|
|
writel(0x08100810, host->ioaddr + ESDHC_WTMK_LVL);
|
|
host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
|
|
host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
|
|
host->mmc->caps |= MMC_CAP_1_8V_DDR;
|
|
host->mmc->caps |= MMC_CAP_1_8V_DDR;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * errata ESDHC_FLAG_ERR004536 fix for MX6Q TO1.2 and MX6DL
|
|
|
|
+ * TO1.1, it's harmless for MX6SL
|
|
|
|
+ */
|
|
|
|
+ writel(readl(host->ioaddr + 0x6c) | BIT(7),
|
|
|
|
+ host->ioaddr + 0x6c);
|
|
}
|
|
}
|
|
|
|
|
|
if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING)
|
|
if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING)
|
|
@@ -1002,6 +1015,9 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
|
|
ESDHC_STD_TUNING_EN | ESDHC_TUNING_START_TAP,
|
|
ESDHC_STD_TUNING_EN | ESDHC_TUNING_START_TAP,
|
|
host->ioaddr + ESDHC_TUNING_CTRL);
|
|
host->ioaddr + ESDHC_TUNING_CTRL);
|
|
|
|
|
|
|
|
+ if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536)
|
|
|
|
+ host->quirks |= SDHCI_QUIRK_BROKEN_ADMA;
|
|
|
|
+
|
|
boarddata = &imx_data->boarddata;
|
|
boarddata = &imx_data->boarddata;
|
|
if (sdhci_esdhc_imx_probe_dt(pdev, host, boarddata) < 0) {
|
|
if (sdhci_esdhc_imx_probe_dt(pdev, host, boarddata) < 0) {
|
|
if (!host->mmc->parent->platform_data) {
|
|
if (!host->mmc->parent->platform_data) {
|