mmc: slot-gpio: Add a function to enable/disable card detect IRQ wakeup
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 27 Feb 2018 12:51:25 +0000 (14:51 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 5 Mar 2018 12:04:32 +0000 (13:04 +0100)
Commit 03dbaa04a2e5 ("mmc: slot-gpio: Add support to enable irq wake on
cd_irq") enabled wakeup at initialization. However drivers may wish to
enable and disable based on different criteria. Add a helper function
mmc_gpio_set_cd_wake() to make it easy for drivers to do that.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/core.c
drivers/mmc/core/slot-gpio.c
include/linux/mmc/slot-gpio.h

index e01910d..121ce50 100644 (file)
@@ -2655,8 +2655,7 @@ void mmc_start_host(struct mmc_host *host)
 void mmc_stop_host(struct mmc_host *host)
 {
        if (host->slot.cd_irq >= 0) {
-               if (host->slot.cd_wake_enabled)
-                       disable_irq_wake(host->slot.cd_irq);
+               mmc_gpio_set_cd_wake(host, false);
                disable_irq(host->slot.cd_irq);
        }
 
index 3698b05..dccbc52 100644 (file)
@@ -154,6 +154,27 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host)
 }
 EXPORT_SYMBOL(mmc_gpiod_request_cd_irq);
 
+int mmc_gpio_set_cd_wake(struct mmc_host *host, bool on)
+{
+       int ret = 0;
+
+       if (!(host->caps & MMC_CAP_CD_WAKE) ||
+           host->slot.cd_irq < 0 ||
+           on == host->slot.cd_wake_enabled)
+               return 0;
+
+       if (on) {
+               ret = enable_irq_wake(host->slot.cd_irq);
+               host->slot.cd_wake_enabled = !ret;
+       } else {
+               disable_irq_wake(host->slot.cd_irq);
+               host->slot.cd_wake_enabled = false;
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(mmc_gpio_set_cd_wake);
+
 /* Register an alternate interrupt service routine for
  * the card-detect GPIO.
  */
index 91f1ba0..06607c5 100644 (file)
@@ -31,6 +31,7 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id,
                         unsigned int debounce, bool *gpio_invert);
 void mmc_gpio_set_cd_isr(struct mmc_host *host,
                         irqreturn_t (*isr)(int irq, void *dev_id));
+int mmc_gpio_set_cd_wake(struct mmc_host *host, bool on);
 void mmc_gpiod_request_cd_irq(struct mmc_host *host);
 bool mmc_can_gpio_cd(struct mmc_host *host);
 bool mmc_can_gpio_ro(struct mmc_host *host);