Re: [PATCH] mmc: pxamci: fix card detect threaded interrupt

From: Ulf Hansson
Date: Wed Sep 16 2015 - 03:24:26 EST


On 12 September 2015 at 11:03, Robert Jarzmik <robert.jarzmik@xxxxxxx> wrote:
> Change the interrupt flavor of the card detection, from a hard interrupt
> to a threaded interrupt. There is no strong requirement for a hard
> interrupt.
>
> It fixes the case where the card detection is on a gpio expander, on I2C
> for example on zylonite board. In this case, the card detect netsted
> interrupt is called from a threaded interrupt. The request_irq() fails,
> because a hard irq cannot be a nested interrupt from a threaded
> interrupt (set __setup_irq()).
>
> This was tested on zylonite and mioa701 boards.

This may indeed fix that separate issue, but looking into pxamci
driver I realize that the card detect configuration suffers from other
issues as well.

1. The irq shouldn't be requested until after the host has been added.
Else an IRQ will call mmc_detect_change() with a non-added mmc host,
which is really a bad idea. :-)
2. The host_ops->get_cd() callback isn't assigned. Thus not allowing
the mmc core to find out whether the card is inserted or not.

So instead of this quick-fix, I suggest that pxamci convert to use the
mmc slot-gpio API, which means calling mmc_gpio[d]_request_cd() from
->probe() and assign the ->get_cd() callback, which use
mmc_gpio_get_cd().

What do you think?

Kind regards
Uffe

>
> Signed-off-by: Robert Jarzmik <robert.jarzmik@xxxxxxx>
> Cc: Petr Cvek <petr.cvek@xxxxxx>
> ---
> drivers/mmc/host/pxamci.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
> index 1420f29628c7..67c9d1443597 100644
> --- a/drivers/mmc/host/pxamci.c
> +++ b/drivers/mmc/host/pxamci.c
> @@ -814,8 +814,10 @@ static int pxamci_probe(struct platform_device *pdev)
> }
> gpio_direction_input(gpio_cd);
>
> - ret = request_irq(gpio_to_irq(gpio_cd), pxamci_detect_irq,
> - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
> + ret = request_threaded_irq(gpio_to_irq(gpio_cd), NULL,
> + pxamci_detect_irq,
> + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
> + IRQF_ONESHOT,
> "mmc card detect", mmc);
> if (ret) {
> dev_err(&pdev->dev, "failed to request card detect IRQ\n");
> --
> 2.1.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/