|
@@ -910,11 +910,11 @@ out:
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * SDIO suspend. We need to suspend all functions separately.
|
|
|
+ * SDIO pre_suspend. We need to suspend all functions separately.
|
|
|
* Therefore all registered functions must have drivers with suspend
|
|
|
* and resume methods. Failing that we simply remove the whole card.
|
|
|
*/
|
|
|
-static int mmc_sdio_suspend(struct mmc_host *host)
|
|
|
+static int mmc_sdio_pre_suspend(struct mmc_host *host)
|
|
|
{
|
|
|
int i, err = 0;
|
|
|
|
|
@@ -925,8 +925,26 @@ static int mmc_sdio_suspend(struct mmc_host *host)
|
|
|
if (!pmops || !pmops->suspend || !pmops->resume) {
|
|
|
/* force removal of entire card in that case */
|
|
|
err = -ENOSYS;
|
|
|
- } else
|
|
|
- err = pmops->suspend(&func->dev);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * SDIO suspend. Suspend all functions separately.
|
|
|
+ */
|
|
|
+static int mmc_sdio_suspend(struct mmc_host *host)
|
|
|
+{
|
|
|
+ int i, err = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < host->card->sdio_funcs; i++) {
|
|
|
+ struct sdio_func *func = host->card->sdio_func[i];
|
|
|
+ if (func && sdio_func_present(func) && func->dev.driver) {
|
|
|
+ const struct dev_pm_ops *pmops = func->dev.driver->pm;
|
|
|
+ err = pmops->suspend(&func->dev);
|
|
|
if (err)
|
|
|
break;
|
|
|
}
|
|
@@ -1076,6 +1094,7 @@ static int mmc_sdio_runtime_resume(struct mmc_host *host)
|
|
|
static const struct mmc_bus_ops mmc_sdio_ops = {
|
|
|
.remove = mmc_sdio_remove,
|
|
|
.detect = mmc_sdio_detect,
|
|
|
+ .pre_suspend = mmc_sdio_pre_suspend,
|
|
|
.suspend = mmc_sdio_suspend,
|
|
|
.resume = mmc_sdio_resume,
|
|
|
.runtime_suspend = mmc_sdio_runtime_suspend,
|