|
@@ -1011,6 +1011,14 @@ static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void brcmf_sdiod_host_fixup(struct mmc_host *host)
|
|
|
+{
|
|
|
+ /* runtime-pm powers off the device */
|
|
|
+ pm_runtime_forbid(host->parent);
|
|
|
+ /* avoid removal detection upon resume */
|
|
|
+ host->caps |= MMC_CAP_NONREMOVABLE;
|
|
|
+}
|
|
|
+
|
|
|
static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
|
|
|
{
|
|
|
struct sdio_func *func;
|
|
@@ -1076,7 +1084,7 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
|
|
|
ret = -ENODEV;
|
|
|
goto out;
|
|
|
}
|
|
|
- pm_runtime_forbid(host->parent);
|
|
|
+ brcmf_sdiod_host_fixup(host);
|
|
|
out:
|
|
|
if (ret)
|
|
|
brcmf_sdiod_remove(sdiodev);
|
|
@@ -1246,15 +1254,15 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
|
|
|
brcmf_sdiod_freezer_on(sdiodev);
|
|
|
brcmf_sdio_wd_timer(sdiodev->bus, 0);
|
|
|
|
|
|
+ sdio_flags = MMC_PM_KEEP_POWER;
|
|
|
if (sdiodev->wowl_enabled) {
|
|
|
- sdio_flags = MMC_PM_KEEP_POWER;
|
|
|
if (sdiodev->pdata->oob_irq_supported)
|
|
|
enable_irq_wake(sdiodev->pdata->oob_irq_nr);
|
|
|
else
|
|
|
- sdio_flags = MMC_PM_WAKE_SDIO_IRQ;
|
|
|
- if (sdio_set_host_pm_flags(sdiodev->func[1], sdio_flags))
|
|
|
- brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
|
|
|
+ sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
|
|
|
}
|
|
|
+ if (sdio_set_host_pm_flags(sdiodev->func[1], sdio_flags))
|
|
|
+ brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
|
|
|
return 0;
|
|
|
}
|
|
|
|