Commit 43235679 authored by Ulf Hansson's avatar Ulf Hansson Committed by Chris Ball

mmc: core: Enable power_off_notify for eMMC shutdown sequence

In suspend mode it is important to save power. If the host is able to
cut buth vcc and vccq, the MMC_CAP2_POWEROFF_NOTIFY shall be set. It
will mean the card will be completely powered down at suspend and the
power off notification cmd will be sent prior power down.

It seems common not being able to cut both vcc and vccq for a host. In
this situation we issue the sleep cmd in favor of the power off
notification cmd, to save more power.

While maintainng the above policy, we also want to make use of the
power off notification in the shutdown sequence, even in the case were
the host has not set MMC_CAP2_POWEROFF_NOTIFY, since we know vcc and
vccq will regardless be cut.

We accomplish this by always enabling the power off notification byte
in the EXT_CSD and issue the power off notification when either
MMC_CAP2_POWEROFF_NOTIFY is set or we are executing a shutdown.
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 486fdbbc
...@@ -1041,11 +1041,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, ...@@ -1041,11 +1041,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
} }
/* /*
* If the host supports the power_off_notify capability then * Enable power_off_notification byte in the ext_csd register
* set the notification byte in the ext_csd register of device
*/ */
if ((host->caps2 & MMC_CAP2_POWEROFF_NOTIFY) && if (card->ext_csd.rev >= 6) {
(card->ext_csd.rev >= 6)) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_POWER_OFF_NOTIFICATION, EXT_CSD_POWER_OFF_NOTIFICATION,
EXT_CSD_POWER_ON, EXT_CSD_POWER_ON,
...@@ -1485,7 +1483,8 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) ...@@ -1485,7 +1483,8 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
if (err) if (err)
goto out; goto out;
if (mmc_can_poweroff_notify(host->card)) if (mmc_can_poweroff_notify(host->card) &&
((host->caps2 & MMC_CAP2_POWEROFF_NOTIFY) || !is_suspend))
err = mmc_poweroff_notify(host->card, notify_type); err = mmc_poweroff_notify(host->card, notify_type);
else if (mmc_can_sleep(host->card)) else if (mmc_can_sleep(host->card))
err = mmc_sleep(host); err = mmc_sleep(host);
......
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