Re: [PATCH 1/2] mmc: slot-gpio: Add support to enable irq wake on cd_irq

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

 



On 28 April 2017 at 09:38, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
> On 25/04/17 23:02, Ulf Hansson wrote:
>> On 25 April 2017 at 13:46, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
>>> On 19/04/17 16:09, Adrian Hunter wrote:
>>>> Add mmc_gpio_cd_enable_wake() to allow drivers to enable irq wake on the
>>>> card detect irq.
>>>>
>>>> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
>>>
>>> Any comments on this?
>>
>> Not yet. I need some more thinking about this.
>
> How is the thinking going ;-)

To many things at the moment. Anyway, to me this is material for 4.13.
I will get back to it as soon as I can.

Kind regards
Uffe

>
>>
>> However, at first glance it seems very reasonable to make the core to
>> help with cd wakeup irqs.
>>
>> Related topic: I have a plan of avoiding the mmc_pm_notify() to punt a
>> work at resume, in case the host has enabled cd wakeup irqs. The
>> reason is that we are sometimes resuming removable cards, just to find
>> out that those are still there. I would be interesting to know how
>> $subject change can help with this as well. I intend to keep this in
>> mind while I review this, just so you know. :-)
>>
>> Kind regards
>> Uffe
>>
>>>
>>>> ---
>>>>  drivers/mmc/core/core.c       |  5 ++++-
>>>>  drivers/mmc/core/slot-gpio.c  | 12 ++++++++++++
>>>>  include/linux/mmc/host.h      |  1 +
>>>>  include/linux/mmc/slot-gpio.h |  1 +
>>>>  4 files changed, 18 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>>> index 0bb39795d484..6987976252ad 100644
>>>> --- a/drivers/mmc/core/core.c
>>>> +++ b/drivers/mmc/core/core.c
>>>> @@ -2828,8 +2828,11 @@ void mmc_stop_host(struct mmc_host *host)
>>>>       host->removed = 1;
>>>>       spin_unlock_irqrestore(&host->lock, flags);
>>>>  #endif
>>>> -     if (host->slot.cd_irq >= 0)
>>>> +     if (host->slot.cd_irq >= 0) {
>>>> +             if (host->slot.cd_wake_enabled)
>>>> +                     disable_irq_wake(host->slot.cd_irq);
>>>>               disable_irq(host->slot.cd_irq);
>>>> +     }
>>>>
>>>>       host->rescan_disable = 1;
>>>>       cancel_delayed_work_sync(&host->detect);
>>>> diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c
>>>> index a8450a8701e4..56e4edb9e63a 100644
>>>> --- a/drivers/mmc/core/slot-gpio.c
>>>> +++ b/drivers/mmc/core/slot-gpio.c
>>>> @@ -25,6 +25,7 @@ struct mmc_gpio {
>>>>       struct gpio_desc *cd_gpio;
>>>>       bool override_ro_active_level;
>>>>       bool override_cd_active_level;
>>>> +     bool cd_wake;
>>>>       irqreturn_t (*cd_gpio_isr)(int irq, void *dev_id);
>>>>       char *ro_label;
>>>>       char cd_label[0];
>>>> @@ -118,6 +119,15 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio)
>>>>  }
>>>>  EXPORT_SYMBOL(mmc_gpio_request_ro);
>>>>
>>>> +void mmc_gpio_cd_enable_wake(struct mmc_host *host)
>>>> +{
>>>> +     struct mmc_gpio *ctx = host->slot.handler_priv;
>>>> +
>>>> +     if (ctx && ctx->cd_gpio)
>>>> +             ctx->cd_wake = true;
>>>> +}
>>>> +EXPORT_SYMBOL(mmc_gpio_cd_enable_wake);
>>>> +
>>>>  void mmc_gpiod_request_cd_irq(struct mmc_host *host)
>>>>  {
>>>>       struct mmc_gpio *ctx = host->slot.handler_priv;
>>>> @@ -151,6 +161,8 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host)
>>>>
>>>>       if (irq < 0)
>>>>               host->caps |= MMC_CAP_NEEDS_POLL;
>>>> +     else if (ctx->cd_wake && !enable_irq_wake(irq))
>>>> +             host->slot.cd_wake_enabled = true;
>>>>  }
>>>>  EXPORT_SYMBOL(mmc_gpiod_request_cd_irq);
>>>>
>>>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
>>>> index 21385ac0c9b1..78c544e296cd 100644
>>>> --- a/include/linux/mmc/host.h
>>>> +++ b/include/linux/mmc/host.h
>>>> @@ -184,6 +184,7 @@ struct mmc_async_req {
>>>>   */
>>>>  struct mmc_slot {
>>>>       int cd_irq;
>>>> +     bool cd_wake_enabled;
>>>>       void *handler_priv;
>>>>  };
>>>>
>>>> diff --git a/include/linux/mmc/slot-gpio.h b/include/linux/mmc/slot-gpio.h
>>>> index 82f0d289f110..6af681d33a53 100644
>>>> --- a/include/linux/mmc/slot-gpio.h
>>>> +++ b/include/linux/mmc/slot-gpio.h
>>>> @@ -33,5 +33,6 @@ void mmc_gpio_set_cd_isr(struct mmc_host *host,
>>>>                        irqreturn_t (*isr)(int irq, void *dev_id));
>>>>  void mmc_gpiod_request_cd_irq(struct mmc_host *host);
>>>>  bool mmc_can_gpio_cd(struct mmc_host *host);
>>>> +void mmc_gpio_cd_enable_wake(struct mmc_host *host);
>>>>
>>>>  #endif
>>>>
>>>
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



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

  Powered by Linux