diff options
author | Dong Aisheng <aisheng.dong@nxp.com> | 2016-01-29 21:34:45 +0800 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2016-02-16 18:02:44 +0800 |
commit | 43abde72cb8396a812997facec89280c3bc14b7c (patch) | |
tree | 3fbbf5e0003a5f6631112440a973c4235ddda27e | |
parent | e616a482bad2a2d4193d4890c6ad78ec3685d3e9 (diff) |
MLK-12360-3 bcmdhd: fix bcmdhd blocks system suspend issue
When enable WIFi and connected with AP, the system is unable to suspend.
root@imx6qdlsolo:~# echo standby > /sys/power/state
PM: Syncing filesystems ... done.
Freezing user space processes ... (elapsed 0.001 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
dhdsdio_isr: Enter
dhdsdio_isr: Enter
dhdsdio_isr: disable SDIO interrupts
Calling dhdsdio_dpc() from dhdsdio_isr
dhdsdio_dpc: Enter
dhdsdio_bussleep: request WAKE (currently SLEEP)
(Keypress still response here.... )
It's caused by Broadcom WiFi driver will keep handling SDIO irq even after
the driver is already suspended.
This weird behavior will block the MMC host suspend during its irq
synchronize operation in free_irq(), then the system suspend is blocked
too and hanged.
Add SDHCI_QUIRK2_SDIO_IRQ_THREAD for BCM WiFi to use kernel thread
to process sdio interrupts which won't block system suspend and process
freeze operation.
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
(cherry picked from commit 66b534082968214707d54d96ba142bc528a6e1de)
-rw-r--r-- | Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt | 2 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci-esdhc-imx.c | 1 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 3 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.h | 3 |
4 files changed, 7 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt b/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt index 462c62e3cfc0..483ee95599ef 100644 --- a/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt +++ b/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt @@ -36,7 +36,7 @@ Optional properties: - fsl,tuning-start-tap: Specify the start dealy cell point when send first CMD19 in tuning procedure. - wifi-host : assigned as a wifi host. - This is required for some WiFi cards to do card detect + This is required for Broadcom BCM WiFi cards to do card detect Examples: diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index fb8e06d24d7c..c0127016b862 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -1071,6 +1071,7 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, if (of_get_property(np, "wifi-host", NULL)) { wifi_mmc_host = host->mmc; + host->quirks2 |= SDHCI_QUIRK2_SDIO_IRQ_THREAD; dev_info(mmc_dev(host->mmc), "assigned as wifi host\n"); } diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 1565855b868d..529d9edc3b0b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -3110,7 +3110,8 @@ int sdhci_add_host(struct sdhci_host *host) host->timeout_clk = override_timeout_clk; mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23; - mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; + if (!(host->quirks2 & SDHCI_QUIRK2_SDIO_IRQ_THREAD)) + mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) host->flags |= SDHCI_AUTO_CMD12; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 7c02ff46c8ac..e934a599340c 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -412,6 +412,9 @@ struct sdhci_host { #define SDHCI_QUIRK2_ACMD23_BROKEN (1<<14) /* Broken Clock divider zero in controller */ #define SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN (1<<15) +/* Host or Card can't support no thread sdio irq */ +#define SDHCI_QUIRK2_SDIO_IRQ_THREAD (1<<16) + int irq; /* Device IRQ */ void __iomem *ioaddr; /* Mapped address */ |