On 15/06/18 11:18, Helmut Grohne wrote: > Some controllers immediately report SDHCI_CLOCK_INT_STABLE after > enabling the clock even when the clock is not stable. When used in > conjunction with older/slower cards, this can result in: > > mmc0: error -84 whilst initialising SD card > > When the stable reporting is broken, we simply wait for the maximum > stabilization period. > > Signed-off-by: Helmut Grohne <h.grohne@xxxxxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 2 ++ > drivers/mmc/host/sdhci-of-arasan.c | 16 ++++++++++++++++ > 2 files changed, 18 insertions(+) > > Changes since v1 (RFC): > * Use an arasan-specific quirk in the ->set_clock() callback as requested by > Adrian Hunter. > > diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > index 60481bfc3d31..c0e0f04a8504 100644 > --- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > +++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > @@ -39,6 +39,8 @@ Optional Properties: > - xlnx,fails-without-test-cd: when present, the controller doesn't work when > the CD line is not connected properly, and the line is not connected > properly. Test mode can be used to force the controller to function. > + - xlnx,int-clock-stable-broken: when present, the controller always reports > + that the internal clock is stable even when it is not. > > Example: > sdhci@e0100000 { > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c > index c33a5f7393bd..f7fe26c75150 100644 > --- a/drivers/mmc/host/sdhci-of-arasan.c > +++ b/drivers/mmc/host/sdhci-of-arasan.c > @@ -102,6 +102,9 @@ struct sdhci_arasan_data { > > /* Controller does not have CD wired and will not function normally without */ > #define SDHCI_ARASAN_QUIRK_FORCE_CDTEST BIT(0) > +/* Controller immediately reports SDHCI_CLOCK_INT_STABLE after enabling the > + * internal clock even when the clock isn't stable */ > +#define SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE BIT(1) > }; > > static const struct sdhci_arasan_soc_ctl_map rk3399_soc_ctl_map = { > @@ -207,6 +210,16 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock) > > sdhci_set_clock(host, clock); > > + if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE) > + /* > + * Some controllers immediately report SDHCI_CLOCK_INT_STABLE > + * after enabling the clock even though the clock is not > + * stable. Trying to use a clock without waiting here results > + * in EILSEQ while detecting some older/slower cards. The > + * chosen delay is the maximum delay from sdhci_set_clock. > + */ > + msleep(20); > + > if (ctrl_phy) { > phy_power_on(sdhci_arasan->phy); > sdhci_arasan->is_phy_on = true; > @@ -759,6 +772,9 @@ static int sdhci_arasan_probe(struct platform_device *pdev) > if (of_property_read_bool(np, "xlnx,fails-without-test-cd")) > sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_FORCE_CDTEST; > > + if (of_property_read_bool(np, "xlnx,int-clock-stable-broken")) > + sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE; > + > pltfm_host->clk = clk_xin; > > if (of_device_is_compatible(pdev->dev.of_node, > -- 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