Re: [RESEND v3 3/3] mmc: mediatek: add support for SDIO eint IRQ

From: Andy Shevchenko
Date: Tue Jan 18 2022 - 04:20:36 EST


On Mon, Jan 17, 2022 at 7:33 PM Axe Yang <axe.yang@xxxxxxxxxxxx> wrote:
>
> Add support for eint IRQ when MSDC is used as an SDIO host. This
> feature requires SDIO device support async IRQ function. With this
> feature, SDIO host can be awakened by SDIO card in suspend state,
> without additional pin.
>
> MSDC driver will time-share the SDIO DAT1 pin. During suspend, MSDC
> turn off clock and switch SDIO DAT1 pin to GPIO mode. And during
> resume, switch GPIO function back to DAT1 mode then turn on clock.
>
> Some device tree property should be added or modified in MSDC node
> to support SDIO eint IRQ. Pinctrls named state_dat1 and state_eint
> are mandatory. And cap-sdio-async-irq flag is necessary since this
> feature depends on asynchronous interrupt:
> &mmcX {
> ...
> pinctrl-names = "default", "state_uhs", "state_eint",
> "state_dat1";
> ...
> pinctrl-2 = <&mmc2_pins_eint>;
> pinctrl-3 = <&mmc2_pins_dat1>;
> ...
> cap-sdio-async-irq;
> ...
> };

...

> +static irqreturn_t msdc_sdio_eint_irq(int irq, void *dev_id)
> +{
> + struct msdc_host *host = dev_id;
> + struct mmc_host *mmc = mmc_from_priv(host);

> + unsigned long flags;

Same Q as per v2. Why do you need this?

Yes, you did the first step to the answer, but I want you to go deeper
and tell me why you need the spin_lock_irqsave() variant.

> + spin_lock_irqsave(&host->lock, flags);
> + if (likely(host->sdio_irq_cnt > 0)) {
> + disable_irq_nosync(host->eint_irq);
> + disable_irq_wake(host->eint_irq);
> + host->sdio_irq_cnt--;
> + }
> + spin_unlock_irqrestore(&host->lock, flags);
> +
> + sdio_signal_irq(mmc);
> +
> + return IRQ_HANDLED;
> +}

--
With Best Regards,
Andy Shevchenko