Re: [RFC] MMC-4.5 Power OFF Notify rework |
|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
On Fri, Mar 30, 2012 at 12:02 PM, Girish K S
<girish.shivananjappa@xxxxxxxxxx> wrote:
> This is a rework of the existing POWER OFF NOTIFY patch. The current problem
> with the patch comes from the ambiguity on the usage of POWER OFF NOTIFY
> together with SLEEP and misunderstanding on the usage of MMC_POWER_OFF
> power_mode from mmc_set_ios in different host controller drivers.
>
> This new patch works around this problem by adding a new host CAP,
> MMC_CAP2_POWER_OFF_VCCQ_DURING_SUSPEND, which when set sends a
> POWER OFF NOTIFY from mmc_suspend instead of SLEEP. It is expected that host
> controller drivers will set this CAP, if they switch off both Vcc and Vccq
> from MMC_POWER_OFF condition within mmc_set_ios. However, note that there
> is no harm in sending MMC_POWER_NOTIFY even if Vccq is not switched off.
>
> This patch also sends POWER OFF NOTIFY from power management routines (e.g.
> mmc_power_save_host, mmc_pm_notify/PM_SUSPEND_PREPARE, mmc_stop_host), which
> does reinitialization of the eMMC on the return path of the power management
> routines (e.g. mmc_power_restore_host, mmc_pm_notify/PM_POST_RESTORE,
> mmc_start_host).
>
> Signed-off-by: Saugata Das <saugata.das@xxxxxxxxxx>
> Signed-off-by: Girish K S <girish.shivananjappa@xxxxxxxxxx>
Overall this looks good!
I think it may be possible to split the patch.
First a patch that moves mmc_card_set_sleep() and mmc_card_clr_sleep()
into mmc_card_sleep() and mmc_card_awake(), which is a good
refactoring in its own right. Then a patch doing the rest of the changes.
(But that's no big deal to me if Chris is OK with this.)
> -static void mmc_poweroff_notify(struct mmc_host *host)
> +int mmc_poweroff_notify(struct mmc_host *host)
So now this function will return an errorcode if notification fails,
maybe add some kerneldoc...
> @@ -2112,7 +2096,8 @@ int mmc_power_save_host(struct mmc_host *host)
>
> if (host->bus_ops->power_save)
> ret = host->bus_ops->power_save(host);
> -
> + host->power_notify_type = MMC_HOST_PW_NOTIFY_SHORT;
> + mmc_poweroff_notify(host);
So no risk in ignoring poweroff notification failure here I guess..
(Just thinking aloud.)
> @@ -2135,7 +2120,7 @@ int mmc_power_restore_host(struct mmc_host *host)
> mmc_bus_put(host);
> return -EINVAL;
> }
> -
> + host->power_notify_type = MMC_HOST_PW_NOTIFY_LONG;
This looks new, can you explain in the code as comments
or in the commit message when SHORT and LONG notifications are
used and why?
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 02914d6..885ad61 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1338,12 +1338,18 @@ static int mmc_suspend(struct mmc_host *host)
> BUG_ON(!host->card);
>
> mmc_claim_host(host);
> - if (mmc_card_can_sleep(host)) {
> - err = mmc_card_sleep(host);
> + if (host->caps2 & MMC_CAP2_POWER_OFF_VCCQ_DURING_SUSPEND) {
> + err = mmc_poweroff_notify(host);
> if (!err)
> - mmc_card_set_sleep(host->card);
> - } else if (!mmc_host_is_spi(host))
> + goto out;
> + }
> +
> + if (mmc_card_can_sleep(host))
> + err = mmc_card_sleep(host);
> + else if (!mmc_host_is_spi(host))
> mmc_deselect_cards(host);
Are you sure you should not deselect the card on an SPI host also if
you power off? (I'm just confused, better to ask...)
> +
> +out:
So if I understand correctly we power off if possible, else we
set the card to sleep. (Looks good.)
> mmc_claim_host(host);
> - if (mmc_card_is_sleep(host->card)) {
> + if (mmc_card_is_sleep(host->card))
> err = mmc_card_awake(host);
> - mmc_card_clr_sleep(host->card);
> - } else
> + else
> err = mmc_init_card(host, host->ocr, host->card);
So a powered-off card will be reinitialized here, nice!
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]