Dong Aisheng, Maybe you can shed some light on the issue below? On 26.06.2018 16:45, Stefan Agner wrote: > On 26.06.2018 12:53, Stefan Agner wrote: >> Hi, >> >> On our Colibri iMX6 (arch/arm/boot/dts/imx6qdl-colibri.dtsi) we >> experience the following stack trace when a SD card is plugged in: >> > > [...] > >> [<c08396f4>] (esdhc_pltfm_set_clock) from [<c083622c>] >> (sdhci_set_ios+0xd8/0x584) >> r10:ffffe000 r9:c1105900 r8:00004097 r7:d818f2e8 r6:d818f480 >> r5:d818f2e8 >> r4:d818f000 >> [<c0836154>] (sdhci_set_ios) from [<c0836070>] >> (sdhci_runtime_resume_host+0xa0/0x184) >> r9:c1105900 r8:00004097 r7:d818f2e8 r6:d818f648 r5:d818f000 r4:d818f480 > > [...] > >> >> It used to work in v4.9, so I started a git bisect. It pointed me to >> this commit: >> >> Commit d1e4f74f911d ("mmc: sdhci: Do not use spin lock in set_ios >> paths"). >> >> Reverting the commit on-top of v4.18-rc1 seems to fix the issue too. >> >> Any idea? > > I figured out that the same platform had a GPIO Key which triggered all > the time. This seems to exacerbate the MMC issue such that it triggers > on very boot, about rootfs mount time. > > This change seems to fix the issue as well, not sure though whether this > is a proper fix: > > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -697,6 +697,7 @@ static inline void esdhc_pltfm_set_clock(struct > sdhci_host *host, > int ddr_pre_div = imx_data->is_ddr ? 2 : 1; > int pre_div = 1; > int div = 1; > + unsigned long flags; > u32 temp, val; > > if (clock == 0) { > @@ -724,6 +725,7 @@ static inline void esdhc_pltfm_set_clock(struct > sdhci_host *host, > pre_div = 2; > } > > + spin_lock_irqsave(&host->lock, flags); > temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); > temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | > ESDHC_CLOCK_PEREN > | ESDHC_CLOCK_MASK); > @@ -754,6 +756,7 @@ static inline void esdhc_pltfm_set_clock(struct > sdhci_host *host, > writel(val | ESDHC_VENDOR_SPEC_FRC_SDCLK_ON, > host->ioaddr + ESDHC_VENDOR_SPEC); > } > + spin_unlock_irqrestore(&host->lock, flags); The bits ESDHC_CLOCK_IPGEN, ESDHC_CLOCK_HCKEN, ESDHC_CLOCK_PEREN which are cleared and written in that section are actually mentioned as "Reserved. Always write as 1." in the reference manual... -- Stefan > > mdelay(1); > } > > -- > Stefan -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html