From 9dc51bd550da16fcc235388faf9e93b64c6fe21b Mon Sep 17 00:00:00 2001 From: Dong Aisheng Date: Fri, 26 Feb 2016 18:02:22 +0800 Subject: [PATCH] MLK-12462-1 mmc: core: add MMC_PM_IGNORE_PM_NOTIFY feature With igore pm notify feature, MMC core will not re-detect card after system suspend/resume. This is needed for some special cards like Broadcom WiFi which can't work propertly on card re-detect after system resume. Signed-off-by: Dong Aisheng (cherry picked from commit 3a4a074d2ead8044afe42cd0d060fe25564b274c) --- Documentation/devicetree/bindings/mmc/mmc.txt | 3 +++ drivers/mmc/core/host.c | 8 ++++++-- include/linux/mmc/pm.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt index e45989d215c6..e654b5077117 100644 --- a/Documentation/devicetree/bindings/mmc/mmc.txt +++ b/Documentation/devicetree/bindings/mmc/mmc.txt @@ -76,6 +76,9 @@ Optional SDIO properties: - keep-power-in-suspend: Preserves card power during a suspend/resume cycle - wakeup-source: Enables wake up of host system on SDIO IRQ assertion (Legacy property supported: "enable-sdio-wakeup") +- pm-ignore-notify: Ignore mmc PM notify. This will prevent MMC core automatically + to re-detect cards after sysem resume back. + MMC power --------- diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 8c681c362eda..f0dcddc34997 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -301,6 +301,8 @@ int mmc_of_parse(struct mmc_host *host) if (device_property_read_bool(dev, "wakeup-source") || device_property_read_bool(dev, "enable-sdio-wakeup")) /* legacy */ host->pm_caps |= MMC_PM_WAKE_SDIO_IRQ; + if (device_property_read_bool(dev, "pm-ignore-notify")) + host->pm_caps |= MMC_PM_IGNORE_PM_NOTIFY; if (device_property_read_bool(dev, "mmc-ddr-1_8v")) host->caps |= MMC_CAP_1_8V_DDR; if (device_property_read_bool(dev, "mmc-ddr-1_2v")) @@ -451,7 +453,8 @@ int mmc_add_host(struct mmc_host *host) #endif mmc_start_host(host); - mmc_register_pm_notifier(host); + if (!(host->pm_caps& MMC_PM_IGNORE_PM_NOTIFY)) + mmc_register_pm_notifier(host); return 0; } @@ -468,7 +471,8 @@ EXPORT_SYMBOL(mmc_add_host); */ void mmc_remove_host(struct mmc_host *host) { - mmc_unregister_pm_notifier(host); + if (!(host->pm_caps& MMC_PM_IGNORE_PM_NOTIFY)) + mmc_unregister_pm_notifier(host); mmc_stop_host(host); #ifdef CONFIG_DEBUG_FS diff --git a/include/linux/mmc/pm.h b/include/linux/mmc/pm.h index 4a139204c20c..6e2d6a135c7e 100644 --- a/include/linux/mmc/pm.h +++ b/include/linux/mmc/pm.h @@ -26,5 +26,6 @@ typedef unsigned int mmc_pm_flag_t; #define MMC_PM_KEEP_POWER (1 << 0) /* preserve card power during suspend */ #define MMC_PM_WAKE_SDIO_IRQ (1 << 1) /* wake up host system on SDIO IRQ assertion */ +#define MMC_PM_IGNORE_PM_NOTIFY (1 << 2) /* ignore mmc pm notify */ #endif /* LINUX_MMC_PM_H */ -- 2.17.1