diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c index 29e3ae9..7f35aa4 100644 --- a/drivers/mmc/host/dw_mmc-rockchip.c +++ b/drivers/mmc/host/dw_mmc-rockchip.c @@ -13,7 +13,9 @@ #include #include #include +#include #include +#include #include "dw_mmc.h" #include "dw_mmc-pltfm.h" @@ -285,6 +287,21 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev) return dw_mci_pltfm_register(pdev, drv_data); } +static void dw_mci_rockchip_platfm_shutdown(struct platform_device *pdev) +{ + struct dw_mci *host = platform_get_drvdata(pdev); + struct mmc_host *mmc = host->cur_slot->mmc; + int ret; + + mdelay(20); + + if (!IS_ERR(mmc->supply.vmmc)) + ret = regulator_enable(mmc->supply.vmmc); + + if (!IS_ERR(mmc->supply.vqmmc)) + regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000); +} + #ifdef CONFIG_PM_SLEEP static int dw_mci_rockchip_suspend(struct device *dev) { @@ -308,6 +325,7 @@ static SIMPLE_DEV_PM_OPS(dw_mci_rockchip_pmops, static struct platform_driver dw_mci_rockchip_pltfm_driver = { .probe = dw_mci_rockchip_probe, .remove = dw_mci_pltfm_remove, + .shutdown = dw_mci_rockchip_platfm_shutdown, .driver = { .name = "dwmmc_rockchip", .of_match_table = dw_mci_rockchip_match,