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 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 ;-)

> 
> 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