mmc: remove MMC bus legacy suspend/resume method
PATCH v2 1/1 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
---
Changes in v2:
use SET_SYSTEM_SLEEP_PM_OPS to define sleep callbacks as Rafael suggested
drivers/mmc/card/block.c | 2 +- drivers/mmc/core/bus.c | 26 ++++++++++++-------------- include/linux/mmc/card.h | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-)
drivers/mmc/card/block.c +1 -1
@@ -1826,7 +1826,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);
drivers/mmc/core/bus.c +12 -14
@@ -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,20 @@ static int mmc_runtime_idle(struct device *dev)return pm_runtime_suspend (dev); } -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, -}; - -#define MMC_PM_OPS_PTR (&mmc_bus_pm_ops) -#else /* !CONFIG_PM_RUNTIME */ -#define MMC_PM_OPS_PTR NULL +#define mmc_runtime_suspend NULL +#define mmc_runtime_resume NULL +#define mmc_runtime_idle NULL#endif /* !CONFIG_PM_RUNTIME */ +static const struct dev_pm_ops mmc_bus_pm_ops = { + SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, + mmc_runtime_idle) +SET_SYSTEM_SLEEP_PM_OPS (mmc_bus_suspend, mmc_bus_resume) +}; +static struct bus_type mmc_bus_type = { .name ="mmc" , .dev_attrs = mmc_dev_attrs,
@@ -186,9 +186,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 )
include/linux/mmc/card.h +1 -1
@@ -480,7 +480,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 *); };
Signature · 1 line
1.7.1
Quoted 11 lines · Chuanxiao Dong
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_opsfor system sleeping modeSigned-off-by Chuanxiao Dong <[email protected]>---
Changes in v2:
useSET_SYSTEM_SLEEP_PM_OPSto define sleep callbacks as Rafael suggested
Quoted 5 lines
drivers/mmc/card/block.c | 2 +- drivers/mmc/core/bus.c | 26 ++++++++++++-------------- include/linux/mmc/card.h | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-)
Tested on AM335x Platform. Solves major issue/crash reported at
http://www.mail-archive.com/[email protected]/msg65425.html
..snip..
Regards,
Gururaja
Quoted 10 lines · Chuanxiao Dong
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_opsfor system sleeping modeSigned-off-by Chuanxiao Dong <[email protected]>---
Changes in v2:
useSET_SYSTEM_SLEEP_PM_OPSto define sleep callbacks as Rafael suggested
This looks so much more sane.
Yours,
Linus Walleij
Quoted 58 lines · Chuanxiao Dong
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_opsfor system sleeping modeSigned-off-by Chuanxiao Dong<[email protected]>---
Changes in v2:
useSET_SYSTEM_SLEEP_PM_OPSto define sleep callbacks as Rafael suggesteddrivers/mmc/card/block.c | 2 +- drivers/mmc/core/bus.c | 26 ++++++++++++-------------- include/linux/mmc/card.h | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-)drivers/mmc/card/block.c +1
-1@@ -1826,7 +1826,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);drivers/mmc/core/bus.c +2
-6@@ -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,20 @@ static int mmc_runtime_idle(struct device *dev)return pm_runtime_suspend (dev); } -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,
drivers/mmc/core/bus.c static int mmc_runtime_idle(struct device *dev) · line 172
Quoted 10 lines
drivers/mmc/core/bus.c +3
-5-}; - -#define MMC_PM_OPS_PTR (&mmc_bus_pm_ops) -#else /* !CONFIG_PM_RUNTIME */ -#define MMC_PM_OPS_PTR NULL +#define mmc_runtime_suspend NULL +#define mmc_runtime_resume NULL +#define mmc_runtime_idle NULL
You do not have to set these functions to NULL, the use of SET_RUNTIME_PM_OPS will fix that when !CONFIG_PM_RUNTIME
Quoted 28 lines
drivers/mmc/core/bus.c +7
-3#endif /* !CONFIG_PM_RUNTIME */ +static const struct dev_pm_ops mmc_bus_pm_ops = { + SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, + mmc_runtime_idle) +SET_SYSTEM_SLEEP_PM_OPS (mmc_bus_suspend, mmc_bus_resume) +}; +static struct bus_type mmc_bus_type = { .name ="mmc" , .dev_attrs = mmc_dev_attrs,@@ -186,9 +186,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 )include/linux/mmc/card.h +0
-0
include/linux/mmc/card.h struct mmc_driver { · line 486
Quoted 8 lines
include/linux/mmc/card.h +1
-1@@ -480,7 +480,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 *); };
Otherwise looks good!
Kind regards
Ulf Hansson
Quoted 75 lines
-----Original Message-----
From: Ulf Hansson [mailto:[email protected]]
Sent: Tuesday, April 10, 2012 9:20 PM
To: Dong, Chuanxiao
Cc: [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V2]mmc: remove MMC bus legacy suspend/resume methodQuoted 64 lines · Chuanxiao Dong
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_opsfor system sleeping modeSigned-off-by Chuanxiao Dong<[email protected]>---
Changes in v2:
useSET_SYSTEM_SLEEP_PM_OPSto define sleep callbacks as Rafael suggesteddrivers/mmc/card/block.c | 2 +- drivers/mmc/core/bus.c | 26 ++++++++++++-------------- include/linux/mmc/card.h | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-)drivers/mmc/card/block.c index renamed from drivers/mmc/card/block.c +0
-0f2020d3..3582c03 100644
drivers/mmc/card/block.c +1
-1@@ -1826,7 +1826,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); diff --git
a/drivers/mmc/core/bus.cb/drivers/mmc/core/bus.cindex 5d011a3..d44f0d9 100644drivers/mmc/core/bus.c +2
-10@@ -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,20 @@ static int mmc_runtime_idle(struct device *dev) return pm_runtime_suspend(dev); } -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, -}; - -#define MMC_PM_OPS_PTR (&mmc_bus_pm_ops) -#else /* !CONFIG_PM_RUNTIME */
Quoted 7 lines
drivers/mmc/core/bus.c static int mmc_runtime_idle(struct device *dev) · line 172
Quoted 4 lines
drivers/mmc/core/bus.c +3
-1-#define MMC_PM_OPS_PTR NULL +#define mmc_runtime_suspend NULL +#define mmc_runtime_resume NULL +#define mmc_runtime_idle NULLYou do not have to set these functions to NULL, the use of
SET_RUNTIME_PM_OPSwill fix that when !CONFIG_PM_RUNTIME
Okay, will remove this in v3.
Thanks
Chuanxiao
Quoted 41 lines
Quoted 28 lines
drivers/mmc/core/bus.c +6
-3#endif /* !CONFIG_PM_RUNTIME */ +static const struct dev_pm_ops mmc_bus_pm_ops = { + SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, + mmc_runtime_idle) +SET_SYSTEM_SLEEP_PM_OPS (mmc_bus_suspend, mmc_bus_resume) }; +static struct bus_type mmc_bus_type = { .name ="mmc" , .dev_attrs = mmc_dev_attrs,@@ -186,9 +186,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 )include/linux/mmc/card.h index renamed from include/linux/mmc/card.h +0
-01a1ca71..c984c9a 100644
include/linux/mmc/card.h struct mmc_driver { · line 486
Quoted 8 lines
include/linux/mmc/card.h +1
-1@@ -480,7 +480,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 *); };Otherwise looks good!
Kind regards
Ulf Hansson