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