On 04/06/18 09:42, Helmut Grohne wrote: > Work around repeated: > > mmc0: error -84 whilst initialising SD card > --- > drivers/mmc/host/sdhci.c | 1 + > 1 file changed, 1 insertion(+) > > I'm seeing the above error -84 with a series of Kingston cards of 4GB capacity > when used with an arasan host controller. Using the cards with other hosts or > using other cards with the host is not problematic. The host controller has the > following device tree: > > ps7-sdio@e0100000 { > compatible = "arasan,sdhci-8.9a"; > reg = <0xe0100000 0x1000>; > clock-names = "clk_xin", "clk_ahb"; > clock-frequency = <50000000>; > clocks = <&clkc 21>, <&clkc 32>; > interrupt-parent = <&ps7_scugic_0>; > interrupts = <0 24 4>; > }; > > When enabling sufficient debugging (and thus slowing the kernel down), the > problem goes away. Without debug features, the insertion of this delay suffices > for my particular instance. Inserting the same delay before the > SDHCI_CLOCK_CARD_EN write also makes the error go away. > > While instrumenting the code I found that the loop waiting for the > SDHCI_CLOCK_INT_STABLE would always terminate immediately (regardless of the > card being used). Only when the card is removed, the loop would spin once. This > hints that potentially the stable checking is broken for this host controller. > > During my testing I checked 7 Kingston cards, 2 Transcend Cards, 1 Apacer card, > 3 arasn hosts, 3 non-arasan hosts and had consistent reports for a similar > number of devices from others. > > If my hypothesis is reasonable, I can turn this patch into a new quirk that > replaces the stable polling with msleep(20), which is the poll timeout. Is > there anything else I should investigate before doing so? Please avoid quirks. Perhaps use the ->set_clock() callback. > > Helmut > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index 90cc1977b792..5d2809aeb4eb 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -1430,6 +1430,7 @@ void sdhci_enable_clk(struct sdhci_host *host, u16 clk) > > clk |= SDHCI_CLOCK_CARD_EN; > sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); > + udelay(80); > } > EXPORT_SYMBOL_GPL(sdhci_enable_clk); > > -- 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