Commit 12ae637f authored by Ohad Ben-Cohen's avatar Ohad Ben-Cohen Committed by Chris Ball

mmc: propagate power save/restore ops return value

Allow power save/restore and their relevant mmc_bus_ops handlers
exit with a return value.
Signed-off-by: default avatarOhad Ben-Cohen <ohad@wizery.com>
Tested-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 9b966aae
...@@ -1583,37 +1583,45 @@ void mmc_stop_host(struct mmc_host *host) ...@@ -1583,37 +1583,45 @@ void mmc_stop_host(struct mmc_host *host)
mmc_power_off(host); mmc_power_off(host);
} }
void mmc_power_save_host(struct mmc_host *host) int mmc_power_save_host(struct mmc_host *host)
{ {
int ret = 0;
mmc_bus_get(host); mmc_bus_get(host);
if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) { if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) {
mmc_bus_put(host); mmc_bus_put(host);
return; return -EINVAL;
} }
if (host->bus_ops->power_save) if (host->bus_ops->power_save)
host->bus_ops->power_save(host); ret = host->bus_ops->power_save(host);
mmc_bus_put(host); mmc_bus_put(host);
mmc_power_off(host); mmc_power_off(host);
return ret;
} }
EXPORT_SYMBOL(mmc_power_save_host); EXPORT_SYMBOL(mmc_power_save_host);
void mmc_power_restore_host(struct mmc_host *host) int mmc_power_restore_host(struct mmc_host *host)
{ {
int ret;
mmc_bus_get(host); mmc_bus_get(host);
if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) { if (!host->bus_ops || host->bus_dead || !host->bus_ops->power_restore) {
mmc_bus_put(host); mmc_bus_put(host);
return; return -EINVAL;
} }
mmc_power_up(host); mmc_power_up(host);
host->bus_ops->power_restore(host); ret = host->bus_ops->power_restore(host);
mmc_bus_put(host); mmc_bus_put(host);
return ret;
} }
EXPORT_SYMBOL(mmc_power_restore_host); EXPORT_SYMBOL(mmc_power_restore_host);
......
...@@ -22,8 +22,8 @@ struct mmc_bus_ops { ...@@ -22,8 +22,8 @@ struct mmc_bus_ops {
void (*detect)(struct mmc_host *); void (*detect)(struct mmc_host *);
int (*suspend)(struct mmc_host *); int (*suspend)(struct mmc_host *);
int (*resume)(struct mmc_host *); int (*resume)(struct mmc_host *);
void (*power_save)(struct mmc_host *); int (*power_save)(struct mmc_host *);
void (*power_restore)(struct mmc_host *); int (*power_restore)(struct mmc_host *);
}; };
void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops); void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops);
......
...@@ -657,12 +657,16 @@ static int mmc_resume(struct mmc_host *host) ...@@ -657,12 +657,16 @@ static int mmc_resume(struct mmc_host *host)
return err; return err;
} }
static void mmc_power_restore(struct mmc_host *host) static int mmc_power_restore(struct mmc_host *host)
{ {
int ret;
host->card->state &= ~MMC_STATE_HIGHSPEED; host->card->state &= ~MMC_STATE_HIGHSPEED;
mmc_claim_host(host); mmc_claim_host(host);
mmc_init_card(host, host->ocr, host->card); ret = mmc_init_card(host, host->ocr, host->card);
mmc_release_host(host); mmc_release_host(host);
return ret;
} }
static int mmc_sleep(struct mmc_host *host) static int mmc_sleep(struct mmc_host *host)
......
...@@ -722,12 +722,16 @@ static int mmc_sd_resume(struct mmc_host *host) ...@@ -722,12 +722,16 @@ static int mmc_sd_resume(struct mmc_host *host)
return err; return err;
} }
static void mmc_sd_power_restore(struct mmc_host *host) static int mmc_sd_power_restore(struct mmc_host *host)
{ {
int ret;
host->card->state &= ~MMC_STATE_HIGHSPEED; host->card->state &= ~MMC_STATE_HIGHSPEED;
mmc_claim_host(host); mmc_claim_host(host);
mmc_sd_init_card(host, host->ocr, host->card); ret = mmc_sd_init_card(host, host->ocr, host->card);
mmc_release_host(host); mmc_release_host(host);
return ret;
} }
static const struct mmc_bus_ops mmc_sd_ops = { static const struct mmc_bus_ops mmc_sd_ops = {
......
...@@ -250,8 +250,8 @@ static inline void *mmc_priv(struct mmc_host *host) ...@@ -250,8 +250,8 @@ static inline void *mmc_priv(struct mmc_host *host)
extern int mmc_suspend_host(struct mmc_host *); extern int mmc_suspend_host(struct mmc_host *);
extern int mmc_resume_host(struct mmc_host *); extern int mmc_resume_host(struct mmc_host *);
extern void mmc_power_save_host(struct mmc_host *host); extern int mmc_power_save_host(struct mmc_host *host);
extern void mmc_power_restore_host(struct mmc_host *host); extern int mmc_power_restore_host(struct mmc_host *host);
extern void mmc_detect_change(struct mmc_host *, unsigned long delay); extern void mmc_detect_change(struct mmc_host *, unsigned long delay);
extern void mmc_request_done(struct mmc_host *, struct mmc_request *); extern void mmc_request_done(struct mmc_host *, struct mmc_request *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment