Commit 36f1d7e8 authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: slot-gpio: Add a function to enable/disable card detect IRQ wakeup

Commit 03dbaa04 ("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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent d5d568fa
...@@ -2655,8 +2655,7 @@ void mmc_start_host(struct mmc_host *host) ...@@ -2655,8 +2655,7 @@ void mmc_start_host(struct mmc_host *host)
void mmc_stop_host(struct mmc_host *host) void mmc_stop_host(struct mmc_host *host)
{ {
if (host->slot.cd_irq >= 0) { if (host->slot.cd_irq >= 0) {
if (host->slot.cd_wake_enabled) mmc_gpio_set_cd_wake(host, false);
disable_irq_wake(host->slot.cd_irq);
disable_irq(host->slot.cd_irq); disable_irq(host->slot.cd_irq);
} }
......
...@@ -154,6 +154,27 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host) ...@@ -154,6 +154,27 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host)
} }
EXPORT_SYMBOL(mmc_gpiod_request_cd_irq); 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 /* Register an alternate interrupt service routine for
* the card-detect GPIO. * the card-detect GPIO.
*/ */
......
...@@ -31,6 +31,7 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id, ...@@ -31,6 +31,7 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id,
unsigned int debounce, bool *gpio_invert); unsigned int debounce, bool *gpio_invert);
void mmc_gpio_set_cd_isr(struct mmc_host *host, void mmc_gpio_set_cd_isr(struct mmc_host *host,
irqreturn_t (*isr)(int irq, void *dev_id)); 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); void mmc_gpiod_request_cd_irq(struct mmc_host *host);
bool mmc_can_gpio_cd(struct mmc_host *host); bool mmc_can_gpio_cd(struct mmc_host *host);
bool mmc_can_gpio_ro(struct mmc_host *host); bool mmc_can_gpio_ro(struct mmc_host *host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment