mmc: slot-gpio: Add support to enable irq wake on cd_irq
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 13 Jun 2017 12:07:51 +0000 (15:07 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 20 Jun 2017 08:30:49 +0000 (10:30 +0200)
Add host capability MMC_CAP_CD_WAKE to enable irq wake on the card detect
irq.

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/host.h

index d40697fae911a6b96340876b63170b1b05172e72..26431267a3e2d790d4eae99e65881ca60bd2047d 100644 (file)
@@ -2652,8 +2652,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);
index a8450a8701e435c8ae0878896fc6e5321626911e..863f1dbbfc1b1252667bee83ee058406fce0130c 100644 (file)
@@ -151,6 +151,8 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host)
 
        if (irq < 0)
                host->caps |= MMC_CAP_NEEDS_POLL;
+       else if ((host->caps & MMC_CAP_CD_WAKE) && !enable_irq_wake(irq))
+               host->slot.cd_wake_enabled = true;
 }
 EXPORT_SYMBOL(mmc_gpiod_request_cd_irq);
 
index c81380a2181fb3c5838d4331b4a6db5ab5d4fffc..ebd1cebbef0c9a1732e0b36542c3053f7d32c7d5 100644 (file)
@@ -185,6 +185,7 @@ struct mmc_async_req {
  */
 struct mmc_slot {
        int cd_irq;
+       bool cd_wake_enabled;
        void *handler_priv;
 };
 
@@ -275,6 +276,7 @@ struct mmc_host {
 #define MMC_CAP_DRIVER_TYPE_A  (1 << 23)       /* Host supports Driver Type A */
 #define MMC_CAP_DRIVER_TYPE_C  (1 << 24)       /* Host supports Driver Type C */
 #define MMC_CAP_DRIVER_TYPE_D  (1 << 25)       /* Host supports Driver Type D */
+#define MMC_CAP_CD_WAKE                (1 << 28)       /* Enable card detect wake */
 #define MMC_CAP_CMD_DURING_TFR (1 << 29)       /* Commands during data transfer */
 #define MMC_CAP_CMD23          (1 << 30)       /* CMD23 supported. */
 #define MMC_CAP_HW_RESET       (1 << 31)       /* Hardware reset */