X-Git-Url: http://plrg.eecs.uci.edu/git/?p=firefly-linux-kernel-4.4.55.git;a=blobdiff_plain;f=drivers%2Fmmc%2Fcore%2Fbus.c;h=0669ed0d73b425d25053a9f5cb8fbdaa4e548ed4;hp=96d6ac6aaf4754aa073c7065917f7512ee3626e6;hb=5013a8fe9733d7906daf046cd164bb2028a63fea;hpb=9896ff517b38c2c2db17980a71dca8cd23fb8585 diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c old mode 100755 new mode 100644 index 96d6ac6aaf47..0669ed0d73b4 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -122,53 +122,102 @@ static int mmc_bus_remove(struct device *dev) return 0; } -static int mmc_bus_pm_suspend(struct device *dev) +static void mmc_bus_shutdown(struct device *dev) { struct mmc_driver *drv = to_mmc_driver(dev->driver); struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; int ret = 0; - pm_message_t state = { PM_EVENT_SUSPEND }; - if (dev->driver && drv->suspend) - ret = drv->suspend(card, state); + if (dev->driver && drv->shutdown) + drv->shutdown(card); + + if (host->bus_ops->shutdown) { + ret = host->bus_ops->shutdown(host); + + if (ret) + pr_warn("%s: error %d during shutdown\n",mmc_hostname(host), ret); + } + +} + +#ifdef CONFIG_PM_SLEEP +static int mmc_bus_suspend(struct device *dev) +{ + struct mmc_driver *drv = to_mmc_driver(dev->driver); + struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; + int ret = 0; + + if (dev->driver && drv->suspend) { + ret = drv->suspend(card); + if (ret) + return ret; + } + + if(host->bus_ops->suspend) + ret = host->bus_ops->suspend(host); return ret; } -static int mmc_bus_pm_resume(struct device *dev) +static int mmc_bus_resume(struct device *dev) { struct mmc_driver *drv = to_mmc_driver(dev->driver); struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; int ret = 0; + if(host->bus_ops->resume){ + ret = host->bus_ops->resume(host); + if (ret) + pr_warn("%s: error %d during resume (card was removed?)\n", + mmc_hostname(host), ret); + } + if (dev->driver && drv->resume) ret = drv->resume(card); + return ret; } +#endif #ifdef CONFIG_PM_RUNTIME + static int mmc_runtime_suspend(struct device *dev) { struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; + int ret = 0; + + if (host->bus_ops->runtime_suspend) + ret = host->bus_ops->runtime_suspend(host); - return mmc_power_save_host(card->host); + return ret; } static int mmc_runtime_resume(struct device *dev) { struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; + int ret = 0; + + if (host->bus_ops->runtime_resume) + ret = host->bus_ops->runtime_resume(host); - return mmc_power_restore_host(card->host); + return ret; } static int mmc_runtime_idle(struct device *dev) { - return pm_runtime_suspend(dev); + return 0; } -#endif /* CONFIG_PM_RUNTIME */ + +#endif /* !CONFIG_PM_RUNTIME */ static const struct dev_pm_ops mmc_bus_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(mmc_bus_pm_suspend, mmc_bus_pm_resume) - SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, mmc_runtime_idle) + SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, + mmc_runtime_idle) + SET_SYSTEM_SLEEP_PM_OPS(mmc_bus_suspend, mmc_bus_resume) }; static struct bus_type mmc_bus_type = { @@ -178,6 +227,7 @@ static struct bus_type mmc_bus_type = { .uevent = mmc_bus_uevent, .probe = mmc_bus_probe, .remove = mmc_bus_remove, + .shutdown = mmc_bus_shutdown, .pm = &mmc_bus_pm_ops, }; @@ -221,8 +271,7 @@ static void mmc_release_card(struct device *dev) sdio_free_common_cis(card); - if (card->info) - kfree(card->info); + kfree(card->info); kfree(card); } @@ -295,7 +344,7 @@ int mmc_add_card(struct mmc_card *card) break; } - if (mmc_sd_card_uhs(card) && + if (mmc_card_uhs(card) && (card->sd_bus_speed < ARRAY_SIZE(uhs_speeds))) uhs_bus_speed_mode = uhs_speeds[card->sd_bus_speed]; @@ -308,7 +357,7 @@ int mmc_add_card(struct mmc_card *card) } else { pr_info("%s: new %s%s%s%s%s card at address %04x\n", mmc_hostname(card->host), - mmc_sd_card_uhs(card) ? "ultra high speed " : + mmc_card_uhs(card) ? "ultra high speed " : (mmc_card_highspeed(card) ? "high speed " : ""), (mmc_card_hs200(card) ? "HS200 " : ""), mmc_card_ddr_mode(card) ? "DDR " : "", @@ -318,6 +367,7 @@ int mmc_add_card(struct mmc_card *card) #ifdef CONFIG_DEBUG_FS mmc_add_card_debugfs(card); #endif + mmc_init_context_info(card->host); ret = device_add(&card->dev); if (ret) @@ -339,13 +389,11 @@ void mmc_remove_card(struct mmc_card *card) #endif if (mmc_card_present(card)) { - if(!HOST_IS_EMMC(card->host)) - mmc_card_clr_present(card); if (mmc_host_is_spi(card->host)) { - printk(KERN_INFO "%s: SPI card removed\n", + pr_info("%s: SPI card removed\n", mmc_hostname(card->host)); } else { - printk(KERN_INFO "%s: card %04x removed\n", + pr_info("%s: card %04x removed\n", mmc_hostname(card->host), card->rca); } device_del(&card->dev);