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: Ohad Ben-Cohen <ohad@wizery.com> Tested-by: Luciano Coelho <luciano.coelho@nokia.com> Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
parent
9b966aae64
commit
12ae637f08
@ -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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 *);
|
||||||
|
Loading…
Reference in New Issue
Block a user