Message ID | 20140425130849.GB15179@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Apr 25, 2014 at 03:08:49PM +0200, Markus Pargmann wrote: > I just tried the different parts of the patch. Without the following > change, emmc works: > > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -1507,12 +1507,6 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) > host->ops->set_clock(host, host->clock); > } > > - > - /* Reset SD Clock Enable */ > - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); > - clk &= ~SDHCI_CLOCK_CARD_EN; > - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); > - So the bit which stops us violating the SD spec stops eMMC from working... that's... just great. Okay, I'll look deeper at this and see what can be done, but I suspect it will turn out to require more patches and be more invasive.
On Fri, Apr 25, 2014 at 02:15:30PM +0100, Russell King - ARM Linux wrote: > On Fri, Apr 25, 2014 at 03:08:49PM +0200, Markus Pargmann wrote: > > I just tried the different parts of the patch. Without the following > > change, emmc works: > > > > --- a/drivers/mmc/host/sdhci.c > > +++ b/drivers/mmc/host/sdhci.c > > @@ -1507,12 +1507,6 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) > > host->ops->set_clock(host, host->clock); > > } > > > > - > > - /* Reset SD Clock Enable */ > > - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); > > - clk &= ~SDHCI_CLOCK_CARD_EN; > > - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); > > - > > So the bit which stops us violating the SD spec stops eMMC from working... > that's... just great. > > Okay, I'll look deeper at this and see what can be done, but I suspect it > will turn out to require more patches and be more invasive. In the mean time, here's the remainder (to patch 33) of the series with this commit omitted.
On Fri, Apr 25, 2014 at 02:15:30PM +0100, Russell King - ARM Linux wrote: > On Fri, Apr 25, 2014 at 03:08:49PM +0200, Markus Pargmann wrote: > > I just tried the different parts of the patch. Without the following > > change, emmc works: > > > > --- a/drivers/mmc/host/sdhci.c > > +++ b/drivers/mmc/host/sdhci.c > > @@ -1507,12 +1507,6 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) > > host->ops->set_clock(host, host->clock); > > } > > > > - > > - /* Reset SD Clock Enable */ > > - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); > > - clk &= ~SDHCI_CLOCK_CARD_EN; > > - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); > > - > > So the bit which stops us violating the SD spec stops eMMC from working... > that's... just great. > > Okay, I'll look deeper at this and see what can be done, but I suspect it > will turn out to require more patches and be more invasive. Well, I've given up trying to work out how to clean that mess up - sdhci will attempt to do all the high speed switching bollocks every time a set_ios call is made, turning the clock on and off multiple times in the process. I've since replaced it with a patch covering just the last hunk of this patch and killed the other two changes there (and rewritten the description.) I'm afraid that it looks like we're going to be stuck with turning the clock on and off multiple times during the transition to 1.8V signalling, which is technically against the SD spec. The spec'd procedure is: - send command - check card reports busy - clock off - switch to 1.8v signalling - wait 5ms - clock on - wait 1ms - check card reports non-busy whereas what we end up doing is: - send command - check card reports busy - clock off - switch to 1.8v signalling, waiting 5 to 5.5ms - wait 5ms - clock on - clock off - tweak other settings - clock on again - wait 1ms - check card reports non-busy
Hi, On Fri, Apr 25, 2014 at 02:22:45PM +0100, Russell King - ARM Linux wrote: > On Fri, Apr 25, 2014 at 02:15:30PM +0100, Russell King - ARM Linux wrote: > > On Fri, Apr 25, 2014 at 03:08:49PM +0200, Markus Pargmann wrote: > > > I just tried the different parts of the patch. Without the following > > > change, emmc works: > > > > > > --- a/drivers/mmc/host/sdhci.c > > > +++ b/drivers/mmc/host/sdhci.c > > > @@ -1507,12 +1507,6 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) > > > host->ops->set_clock(host, host->clock); > > > } > > > > > > - > > > - /* Reset SD Clock Enable */ > > > - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); > > > - clk &= ~SDHCI_CLOCK_CARD_EN; > > > - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); > > > - > > > > So the bit which stops us violating the SD spec stops eMMC from working... > > that's... just great. > > > > Okay, I'll look deeper at this and see what can be done, but I suspect it > > will turn out to require more patches and be more invasive. > > In the mean time, here's the remainder (to patch 33) of the series with > this commit omitted. I tested the whole series again, from 1 to patch 32 and it is working correctly now on the RIoT board (imx6s) with emmc and sd-card. You can add my tested-by tag for all core and imx related patches if you want to. Regards, Markus
--- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1507,12 +1507,6 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) host->ops->set_clock(host, host->clock); } - - /* Reset SD Clock Enable */ - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); - clk &= ~SDHCI_CLOCK_CARD_EN; - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); - Regards,