2019-02-10 17:33:52

by J. Neuschäfer

[permalink] [raw]
Subject: [PATCH] mmc: spi: Fix card detection during probe

When using the mmc_spi driver with a card-detect pin, I noticed that the
card was not detected immediately after probe, but only after it was
unplugged and plugged back in (and the CD IRQ fired).

The call tree looks something like this:

mmc_spi_probe
mmc_add_host
mmc_start_host
_mmc_detect_change
mmc_schedule_delayed_work(&host->detect, 0)
mmc_rescan
host->bus_ops->detect(host)
mmc_detect
_mmc_detect_card_removed
host->ops->get_cd(host)
mmc_gpio_get_cd -> -ENOSYS (ctx->cd_gpio not set)
mmc_gpiod_request_cd
ctx->cd_gpio = desc

To fix this issue, call mmc_detect_change after the card-detect GPIO/IRQ
is registered.

Signed-off-by: Jonathan Neuschäfer <[email protected]>
---
drivers/mmc/host/mmc_spi.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 10ba46b728e8..8ade14fb2148 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -1450,6 +1450,7 @@ static int mmc_spi_probe(struct spi_device *spi)
mmc->caps &= ~MMC_CAP_NEEDS_POLL;
mmc_gpiod_request_cd_irq(mmc);
}
+ mmc_detect_change(mmc, 0);

/* Index 1 is write protect/read only */
status = mmc_gpiod_request_ro(mmc, NULL, 1, false, 0, NULL);
--
2.20.1



2019-02-11 08:30:17

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH] mmc: spi: Fix card detection during probe

On Sun, Feb 10, 2019 at 6:31 PM Jonathan Neuschäfer
<[email protected]> wrote:

> When using the mmc_spi driver with a card-detect pin, I noticed that the
> card was not detected immediately after probe, but only after it was
> unplugged and plugged back in (and the CD IRQ fired).
>
> The call tree looks something like this:
>
> mmc_spi_probe
> mmc_add_host
> mmc_start_host
> _mmc_detect_change
> mmc_schedule_delayed_work(&host->detect, 0)
> mmc_rescan
> host->bus_ops->detect(host)
> mmc_detect
> _mmc_detect_card_removed
> host->ops->get_cd(host)
> mmc_gpio_get_cd -> -ENOSYS (ctx->cd_gpio not set)
> mmc_gpiod_request_cd
> ctx->cd_gpio = desc
>
> To fix this issue, call mmc_detect_change after the card-detect GPIO/IRQ
> is registered.
>
> Signed-off-by: Jonathan Neuschäfer <[email protected]>

Seems correct!
Reviewed-by: Linus Walleij <[email protected]>

Yours,
Linus Walleij

2019-02-26 08:19:34

by Ulf Hansson

[permalink] [raw]
Subject: Re: [PATCH] mmc: spi: Fix card detection during probe

On Sun, 10 Feb 2019 at 18:31, Jonathan Neuschäfer <[email protected]> wrote:
>
> When using the mmc_spi driver with a card-detect pin, I noticed that the
> card was not detected immediately after probe, but only after it was
> unplugged and plugged back in (and the CD IRQ fired).
>
> The call tree looks something like this:
>
> mmc_spi_probe
> mmc_add_host
> mmc_start_host
> _mmc_detect_change
> mmc_schedule_delayed_work(&host->detect, 0)
> mmc_rescan
> host->bus_ops->detect(host)
> mmc_detect
> _mmc_detect_card_removed
> host->ops->get_cd(host)
> mmc_gpio_get_cd -> -ENOSYS (ctx->cd_gpio not set)
> mmc_gpiod_request_cd
> ctx->cd_gpio = desc
>
> To fix this issue, call mmc_detect_change after the card-detect GPIO/IRQ
> is registered.
>
> Signed-off-by: Jonathan Neuschäfer <[email protected]>

This works well as fix and for stable! However, we should probably
clean up the code in ->probe() to avoid this thing altogether. Anyway,
I send a patch for that - on top.

Applied for fixes and added a stable tag, thanks!

Kind regards
Uffe


> ---
> drivers/mmc/host/mmc_spi.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
> index 10ba46b728e8..8ade14fb2148 100644
> --- a/drivers/mmc/host/mmc_spi.c
> +++ b/drivers/mmc/host/mmc_spi.c
> @@ -1450,6 +1450,7 @@ static int mmc_spi_probe(struct spi_device *spi)
> mmc->caps &= ~MMC_CAP_NEEDS_POLL;
> mmc_gpiod_request_cd_irq(mmc);
> }
> + mmc_detect_change(mmc, 0);
>
> /* Index 1 is write protect/read only */
> status = mmc_gpiod_request_ro(mmc, NULL, 1, false, 0, NULL);
> --
> 2.20.1
>

2019-02-26 11:30:02

by J. Neuschäfer

[permalink] [raw]
Subject: Re: [PATCH] mmc: spi: Fix card detection during probe

On Tue, Feb 26, 2019 at 09:18:06AM +0100, Ulf Hansson wrote:
> On Sun, 10 Feb 2019 at 18:31, Jonathan Neuschäfer <[email protected]> wrote:
> >
> > When using the mmc_spi driver with a card-detect pin, I noticed that the
> > card was not detected immediately after probe, but only after it was
> > unplugged and plugged back in (and the CD IRQ fired).
> >
> > The call tree looks something like this:
> >
> > mmc_spi_probe
> > mmc_add_host
> > mmc_start_host
> > _mmc_detect_change
> > mmc_schedule_delayed_work(&host->detect, 0)
> > mmc_rescan
> > host->bus_ops->detect(host)
> > mmc_detect
> > _mmc_detect_card_removed
> > host->ops->get_cd(host)
> > mmc_gpio_get_cd -> -ENOSYS (ctx->cd_gpio not set)
> > mmc_gpiod_request_cd
> > ctx->cd_gpio = desc
> >
> > To fix this issue, call mmc_detect_change after the card-detect GPIO/IRQ
> > is registered.
> >
> > Signed-off-by: Jonathan Neuschäfer <[email protected]>
>
> This works well as fix and for stable! However, we should probably
> clean up the code in ->probe() to avoid this thing altogether.

I figured that calling mmc_gpiod_request_cd before mmc_add_host *should*
avoid the 'return -ENOSYS' in mmc_gpio_get_cd. However it turned out to
be not as simple as swapping around a few lines in mmc_spi_probe, when I
wrote/tested this patch.

> Anyway, I send a patch for that - on top.

Thanks!

> Applied for fixes and added a stable tag, thanks!

Great.


Thanks,
Jonathan Neuschäfer


Attachments:
(No filename) (1.58 kB)
signature.asc (849.00 B)
Download all attachments