forked from Minki/linux
mmc: core: Use MMC_UNSAFE_RESUME as default behavior
Invoking system suspend or shutdown without using the Kconfig option MMC_UNSAFE_RESUME, did trigger an ungraceful power cut of the card. To improve the situation, change the behavior to always make use of the available bus_ops callbacks that handles system suspend and shutdown properly. By changing the behavior MMC_UNSAFE_RESUME becomes redundant, so lets's remove it. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Chris Ball <chris@printf.net>
This commit is contained in:
parent
710dec95d5
commit
2501c9179d
@ -2,21 +2,6 @@
|
||||
# MMC core configuration
|
||||
#
|
||||
|
||||
config MMC_UNSAFE_RESUME
|
||||
bool "Assume MMC/SD cards are non-removable (DANGEROUS)"
|
||||
help
|
||||
If you say Y here, the MMC layer will assume that all cards
|
||||
stayed in their respective slots during the suspend. The
|
||||
normal behaviour is to remove them at suspend and
|
||||
redetecting them at resume. Breaking this assumption will
|
||||
in most cases result in data corruption.
|
||||
|
||||
This option is usually just for embedded systems which use
|
||||
a MMC/SD card for rootfs. Most people should say N here.
|
||||
|
||||
This option sets a default which can be overridden by the
|
||||
module parameter "removable=0" or "removable=1".
|
||||
|
||||
config MMC_CLKGATE
|
||||
bool "MMC host clock gating"
|
||||
help
|
||||
|
@ -64,23 +64,6 @@ static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };
|
||||
bool use_spi_crc = 1;
|
||||
module_param(use_spi_crc, bool, 0);
|
||||
|
||||
/*
|
||||
* We normally treat cards as removed during suspend if they are not
|
||||
* known to be on a non-removable bus, to avoid the risk of writing
|
||||
* back data to a different card after resume. Allow this to be
|
||||
* overridden if necessary.
|
||||
*/
|
||||
#ifdef CONFIG_MMC_UNSAFE_RESUME
|
||||
bool mmc_assume_removable;
|
||||
#else
|
||||
bool mmc_assume_removable = 1;
|
||||
#endif
|
||||
EXPORT_SYMBOL(mmc_assume_removable);
|
||||
module_param_named(removable, mmc_assume_removable, bool, 0644);
|
||||
MODULE_PARM_DESC(
|
||||
removable,
|
||||
"MMC/SD cards are removable and may be removed during suspend");
|
||||
|
||||
/*
|
||||
* Internal function. Schedule delayed work in the MMC work queue.
|
||||
*/
|
||||
|
@ -1634,16 +1634,6 @@ static int mmc_power_restore(struct mmc_host *host)
|
||||
}
|
||||
|
||||
static const struct mmc_bus_ops mmc_ops = {
|
||||
.remove = mmc_remove,
|
||||
.detect = mmc_detect,
|
||||
.suspend = NULL,
|
||||
.resume = NULL,
|
||||
.power_restore = mmc_power_restore,
|
||||
.alive = mmc_alive,
|
||||
.shutdown = mmc_shutdown,
|
||||
};
|
||||
|
||||
static const struct mmc_bus_ops mmc_ops_unsafe = {
|
||||
.remove = mmc_remove,
|
||||
.detect = mmc_detect,
|
||||
.suspend = mmc_suspend,
|
||||
@ -1655,17 +1645,6 @@ static const struct mmc_bus_ops mmc_ops_unsafe = {
|
||||
.shutdown = mmc_shutdown,
|
||||
};
|
||||
|
||||
static void mmc_attach_bus_ops(struct mmc_host *host)
|
||||
{
|
||||
const struct mmc_bus_ops *bus_ops;
|
||||
|
||||
if (!mmc_card_is_removable(host))
|
||||
bus_ops = &mmc_ops_unsafe;
|
||||
else
|
||||
bus_ops = &mmc_ops;
|
||||
mmc_attach_bus(host, bus_ops);
|
||||
}
|
||||
|
||||
/*
|
||||
* Starting point for MMC card init.
|
||||
*/
|
||||
@ -1685,7 +1664,7 @@ int mmc_attach_mmc(struct mmc_host *host)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mmc_attach_bus_ops(host);
|
||||
mmc_attach_bus(host, &mmc_ops);
|
||||
if (host->ocr_avail_mmc)
|
||||
host->ocr_avail = host->ocr_avail_mmc;
|
||||
|
||||
|
@ -1207,16 +1207,6 @@ static int mmc_sd_power_restore(struct mmc_host *host)
|
||||
}
|
||||
|
||||
static const struct mmc_bus_ops mmc_sd_ops = {
|
||||
.remove = mmc_sd_remove,
|
||||
.detect = mmc_sd_detect,
|
||||
.suspend = NULL,
|
||||
.resume = NULL,
|
||||
.power_restore = mmc_sd_power_restore,
|
||||
.alive = mmc_sd_alive,
|
||||
.shutdown = mmc_sd_suspend,
|
||||
};
|
||||
|
||||
static const struct mmc_bus_ops mmc_sd_ops_unsafe = {
|
||||
.remove = mmc_sd_remove,
|
||||
.detect = mmc_sd_detect,
|
||||
.runtime_suspend = mmc_sd_runtime_suspend,
|
||||
@ -1228,17 +1218,6 @@ static const struct mmc_bus_ops mmc_sd_ops_unsafe = {
|
||||
.shutdown = mmc_sd_suspend,
|
||||
};
|
||||
|
||||
static void mmc_sd_attach_bus_ops(struct mmc_host *host)
|
||||
{
|
||||
const struct mmc_bus_ops *bus_ops;
|
||||
|
||||
if (!mmc_card_is_removable(host))
|
||||
bus_ops = &mmc_sd_ops_unsafe;
|
||||
else
|
||||
bus_ops = &mmc_sd_ops;
|
||||
mmc_attach_bus(host, bus_ops);
|
||||
}
|
||||
|
||||
/*
|
||||
* Starting point for SD card init.
|
||||
*/
|
||||
@ -1254,7 +1233,7 @@ int mmc_attach_sd(struct mmc_host *host)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mmc_sd_attach_bus_ops(host);
|
||||
mmc_attach_bus(host, &mmc_sd_ops);
|
||||
if (host->ocr_avail_sd)
|
||||
host->ocr_avail = host->ocr_avail_sd;
|
||||
|
||||
|
@ -424,12 +424,9 @@ static inline int mmc_regulator_get_supply(struct mmc_host *mmc)
|
||||
|
||||
int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
|
||||
|
||||
/* Module parameter */
|
||||
extern bool mmc_assume_removable;
|
||||
|
||||
static inline int mmc_card_is_removable(struct mmc_host *host)
|
||||
{
|
||||
return !(host->caps & MMC_CAP_NONREMOVABLE) && mmc_assume_removable;
|
||||
return !(host->caps & MMC_CAP_NONREMOVABLE);
|
||||
}
|
||||
|
||||
static inline int mmc_card_keep_power(struct mmc_host *host)
|
||||
|
Loading…
Reference in New Issue
Block a user