diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index 4da4f47346415d1d643ad06b9e2e583a52293015..4bf3d7afb1ae3f1fb8384a0fcc29449375338c91 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -96,6 +96,8 @@ #define ESDHC_STROBE_DLL_STS_SLV_LOCK 0x1 #define ESDHC_VEND_SPEC2 0xc8 +#define ESDHC_VEND_SPEC2_TUNING_EN_MASK 0x00000070 +#define ESDHC_VEND_SPEC2_TUNING_EN_SHIFT 4 #define ESDHC_VEND_SPEC2_EN_BUSY_IRQ (1 << 8) #define ESDHC_TUNING_CTRL 0xcc @@ -1417,6 +1419,14 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host) writel(tmp, host->ioaddr + ESDHC_TUNING_CTRL); } + /* uSDHC auto tuning mechanism should use DAT[0] and CMD lines + * if SDIO card is enabling SDIO Interrupts on DAT[1]. + */ + if (imx_data->boarddata.sdio_interrupt_enabled) + esdhc_clrset_le(host, ESDHC_VEND_SPEC2_TUNING_EN_MASK, + 0x6 << ESDHC_VEND_SPEC2_TUNING_EN_SHIFT, + ESDHC_VEND_SPEC2); + /* * On i.MX8MM, we are running Dual Linux OS, with 1st Linux using SD Card * as rootfs storage, 2nd Linux using eMMC as rootfs storage. We let the @@ -1526,6 +1536,9 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, if (of_find_property(np, "no-1-8-v", NULL)) host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V; + if (of_property_read_bool(np, "fsl,sdio-interrupt-enabled")) + boarddata->sdio_interrupt_enabled = true; + if (of_property_read_u32(np, "fsl,delay-line", &boarddata->delay_line)) boarddata->delay_line = 0; diff --git a/include/linux/platform_data/mmc-esdhc-imx.h b/include/linux/platform_data/mmc-esdhc-imx.h index cba1184b364c97383565fa3ddd25f5fdeddf3a97..40d64d15242f463e4b57c7164807f8062ec4f4a7 100644 --- a/include/linux/platform_data/mmc-esdhc-imx.h +++ b/include/linux/platform_data/mmc-esdhc-imx.h @@ -38,5 +38,6 @@ struct esdhc_platform_data { unsigned int tuning_step; /* The delay cell steps in tuning procedure */ unsigned int tuning_start_tap; /* The start delay cell point in tuning procedure */ unsigned int strobe_dll_delay_target; /* The delay cell for strobe pad (read clock) */ + bool sdio_interrupt_enabled; }; #endif /* __ASM_ARCH_IMX_ESDHC_H */