Re: MMC card remains RO since "mmc: sdhci-omap: drop ->get_ro() implementation"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 21 Mar 2019 at 07:39, Kishon Vijay Abraham I <kishon@xxxxxx> wrote:
>
> Hi Thomas,
>
> On 20/03/19 2:26 AM, Thomas Petazzoni wrote:
> > Hello Sebastian,
> >
> > On Tue, 19 Mar 2019 18:27:37 +0100
> > Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> wrote:
> >
> >> Since commit 39ee32ce48675 ("mmc: sdhci-omap: drop ->get_ro()
> >> implementation") my
> >> |Model: TI AM5728 IDK
> >> |Board: AM572x IDK REV 1.3B
> >>
> >> does not boot from MMC anymore:
> >
> > Thanks for the feedback. It's really weird. Before my change, the
> > sdhci-omap driver was setting:
> >
> >   host->mmc_host_ops.get_ro = mmc_gpio_get_ro;
> >
> > But thanks to another change I did, the core is now doing:
> >
> >         else if (host->ops->get_ro)
> >                 is_readonly = host->ops->get_ro(host);
> > +       else if (mmc_can_gpio_ro(host->mmc))
> > +               is_readonly = mmc_gpio_get_ro(host->mmc);
> >         else
> >                 is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
> >                                 & SDHCI_WRITE_PROTECT);
> >
> > So basically, if there's no host->ops->get_ro, it calls
> > mmc_gpio_get_ro(), which should do the exact same thing.
> >
> > The only difference that I can see is that it only calls
> > mmc_gpio_get_ro() if mmc_can_gpio_ro() returns true. But looking at the
> > code of mmc_can_gpio_ro(), I don't see how it can be borked, and
> > mmc_gpio_get_ro() be working.
> > So there is something odd going on here. Do you have the time to add
> > some traces in sdhci_check_ro(), to see what is the return value of
> > mmc_can_gpio_ro(), whether we call mmc_gpio_get_ro(), and what does it
> > return ?
> >
> > This would help debugging his issue. Thanks a lot!
>
> I debugged this issue and realized not all the platforms using sdhci-omap will
> have wp-gpios populated (with micro SD slot) making it use incorrect value from
> SDHCI_PRESENT_STATE register. The following patch fixes it. I can post it as a
> separate patch if required.
>
> Thanks
> Kishon
>
> 8<-------------------------------------------
>
> From 37c69ac189a8ec7f0ca91f7cbcdbc9456ce22599 Mon Sep 17 00:00:00 2001
> From: Kishon Vijay Abraham I <kishon@xxxxxx>
> Date: Thu, 21 Mar 2019 11:45:44 +0530
> Subject: [PATCH] mmc: sdhci-omap: Set caps2 to indicate no physical write
>  protect pin
>
> After commit 6d5cd068ee59fba ("mmc: sdhci: use WP GPIO in
> sdhci_check_ro()") and commit 39ee32ce486756f ("mmc: sdhci-omap: drop
> ->get_ro() implementation"), sdhci-omap relied on SDHCI_PRESENT_STATE
> to check if the card is read-only, if wp-gpios is not populated
> in device tree. However SDHCI_PRESENT_STATE in sdhci-omap does not have
> correct read-only state.
>
> sdhci-omap can be used by platforms with both micro SD slot and standard
> SD slot with physical write protect pin (using GPIO). Set caps2 to
> MMC_CAP2_NO_WRITE_PROTECT based on if wp-gpios property is populated or
> not.
>
> This fix is required since existing device-tree node doesn't have
> "disable-wp" property and to preserve old-dt compatibility.
>
> Fixes: commit 6d5cd068ee59fba ("mmc: sdhci: use WP GPIO in
> sdhci_check_ro()")
> Fixes: commit 39ee32ce486756f ("mmc: sdhci-omap: drop ->get_ro()
> implementation")
> Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx>

Applied for fixes, thanks!

Kind regards
Uffe



> ---
>  drivers/mmc/host/sdhci-omap.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c
> index b1a66ca3821a..5bbed477c9b1 100644
> --- a/drivers/mmc/host/sdhci-omap.c
> +++ b/drivers/mmc/host/sdhci-omap.c
> @@ -1056,6 +1056,9 @@ static int sdhci_omap_probe(struct platform_device *pdev)
>                         mmc->f_max = 48000000;
>         }
>
> +       if (!mmc_can_gpio_ro(mmc))
> +               mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT;
> +
>         pltfm_host->clk = devm_clk_get(dev, "fck");
>         if (IS_ERR(pltfm_host->clk)) {
>                 ret = PTR_ERR(pltfm_host->clk);
> --
> 2.17.1



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux