Commit 32d317c6 authored by Chuanxiao Dong's avatar Chuanxiao Dong Committed by Chris Ball
Browse files

mmc: remove MMC bus legacy suspend/resume method

MMC bus is using legacy suspend/resume method, which is not compatible if
runtime pm callbacks are used. In this scenario, MMC bus suspend/resume
callbacks cannot be called when system entering S3. So change to use the
new defined dev_pm_ops for system sleeping mode.

Tested on AM335x Platform. Solves major issue/crash reported at
http://www.mail-archive.com/linux-omap@vger.kernel.org/msg65425.html



Signed-off-by: default avatarChuanxiao Dong <chuanxiao.dong@intel.com>
Tested-by: default avatarHebbar, Gururaja <gururaja.hebbar@ti.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarUlf Hansson <ulf.hansson@stericsson.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 4d048f91
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1824,7 +1824,7 @@ static void mmc_blk_remove(struct mmc_card *card)
}

#ifdef CONFIG_PM
static int mmc_blk_suspend(struct mmc_card *card, pm_message_t state)
static int mmc_blk_suspend(struct mmc_card *card)
{
	struct mmc_blk_data *part_md;
	struct mmc_blk_data *md = mmc_get_drvdata(card);
+8 −16
Original line number Diff line number Diff line
@@ -122,14 +122,14 @@ static int mmc_bus_remove(struct device *dev)
	return 0;
}

static int mmc_bus_suspend(struct device *dev, pm_message_t state)
static int mmc_bus_suspend(struct device *dev)
{
	struct mmc_driver *drv = to_mmc_driver(dev->driver);
	struct mmc_card *card = mmc_dev_to_card(dev);
	int ret = 0;

	if (dev->driver && drv->suspend)
		ret = drv->suspend(card, state);
		ret = drv->suspend(card);
	return ret;
}

@@ -165,20 +165,14 @@ static int mmc_runtime_idle(struct device *dev)
	return pm_runtime_suspend(dev);
}

#endif /* !CONFIG_PM_RUNTIME */

static const struct dev_pm_ops mmc_bus_pm_ops = {
	.runtime_suspend	= mmc_runtime_suspend,
	.runtime_resume		= mmc_runtime_resume,
	.runtime_idle		= mmc_runtime_idle,
	SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume,
			mmc_runtime_idle)
	SET_SYSTEM_SLEEP_PM_OPS(mmc_bus_suspend, mmc_bus_resume)
};

#define MMC_PM_OPS_PTR	(&mmc_bus_pm_ops)

#else /* !CONFIG_PM_RUNTIME */

#define MMC_PM_OPS_PTR	NULL

#endif /* !CONFIG_PM_RUNTIME */

static struct bus_type mmc_bus_type = {
	.name		= "mmc",
	.dev_attrs	= mmc_dev_attrs,
@@ -186,9 +180,7 @@ static struct bus_type mmc_bus_type = {
	.uevent		= mmc_bus_uevent,
	.probe		= mmc_bus_probe,
	.remove		= mmc_bus_remove,
	.suspend	= mmc_bus_suspend,
	.resume		= mmc_bus_resume,
	.pm		= MMC_PM_OPS_PTR,
	.pm		= &mmc_bus_pm_ops,
};

int mmc_register_bus(void)
+1 −1
Original line number Diff line number Diff line
@@ -481,7 +481,7 @@ struct mmc_driver {
	struct device_driver drv;
	int (*probe)(struct mmc_card *);
	void (*remove)(struct mmc_card *);
	int (*suspend)(struct mmc_card *, pm_message_t);
	int (*suspend)(struct mmc_card *);
	int (*resume)(struct mmc_card *);
};