summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDong Aisheng <aisheng.dong@nxp.com>2016-02-26 18:02:22 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2016-03-01 19:02:54 +0800
commit3a4a074d2ead8044afe42cd0d060fe25564b274c (patch)
treed3f8d2dd5616a4268d3ec6f5b761c28aecd66240
parentcd2d38c8051ad67ef95eac0fe72656be7a04c944 (diff)
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 <aisheng.dong@nxp.com>
-rw-r--r--Documentation/devicetree/bindings/mmc/mmc.txt3
-rw-r--r--drivers/mmc/core/host.c8
-rw-r--r--include/linux/mmc/pm.h1
3 files changed, 9 insertions, 3 deletions
diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt
index b7d0cd3fa60b..b05d517be2e9 100644
--- a/Documentation/devicetree/bindings/mmc/mmc.txt
+++ b/Documentation/devicetree/bindings/mmc/mmc.txt
@@ -70,7 +70,8 @@ polarity is in effect.
Optional SDIO properties:
- keep-power-in-suspend: Preserves card power during a suspend/resume cycle
- enable-sdio-wakeup: Enables wake up of host system on SDIO IRQ assertion
-
+- pm-ignore-notify: Ignore mmc PM notify. This will prevent MMC core automatically
+ to re-detect cards after sysem resume back.
MMC power sequences:
--------------------
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index c81a31621fbf..74fb8fc13855 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -517,6 +517,8 @@ int mmc_of_parse(struct mmc_host *host)
host->pm_caps |= MMC_PM_KEEP_POWER;
if (of_property_read_bool(np, "enable-sdio-wakeup"))
host->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
+ if (of_get_property(np, "pm-ignore-notify", NULL))
+ host->pm_caps |= MMC_PM_IGNORE_PM_NOTIFY;
if (of_property_read_bool(np, "mmc-ddr-1_8v"))
host->caps |= MMC_CAP_1_8V_DDR;
if (of_property_read_bool(np, "mmc-ddr-1_2v"))
@@ -651,7 +653,8 @@ int mmc_add_host(struct mmc_host *host)
mmc_host_clk_sysfs_init(host);
mmc_start_host(host);
- register_pm_notifier(&host->pm_notify);
+ if (!(host->pm_caps& MMC_PM_IGNORE_PM_NOTIFY))
+ register_pm_notifier(&host->pm_notify);
return 0;
}
@@ -668,7 +671,8 @@ EXPORT_SYMBOL(mmc_add_host);
*/
void mmc_remove_host(struct mmc_host *host)
{
- unregister_pm_notifier(&host->pm_notify);
+ if (!(host->pm_caps& MMC_PM_IGNORE_PM_NOTIFY))
+ unregister_pm_notifier(&host->pm_notify);
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 */