OSDN Git Service

mmc: dw_mmc: exynos: fix to call suspend callback
authorJoonyoung Shim <jy0922.shim@samsung.com>
Wed, 23 Nov 2016 09:36:02 +0000 (18:36 +0900)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 5 Dec 2016 09:31:14 +0000 (10:31 +0100)
The dw_mmc-exynos should be RPM_ACTIVE on probe() to call suspend
callback of runtime PM in pm_runtime_force_suspend() during first system
suspend. Also call pm_runtime_get_noresume() on probe() because it
doesn't call suspend/resume callback by runtime PM now.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/dw_mmc-exynos.c

index e2439a1..e133528 100644 (file)
@@ -516,10 +516,34 @@ static int dw_mci_exynos_probe(struct platform_device *pdev)
 {
        const struct dw_mci_drv_data *drv_data;
        const struct of_device_id *match;
+       int ret;
 
        match = of_match_node(dw_mci_exynos_match, pdev->dev.of_node);
        drv_data = match->data;
-       return dw_mci_pltfm_register(pdev, drv_data);
+
+       pm_runtime_get_noresume(&pdev->dev);
+       pm_runtime_set_active(&pdev->dev);
+       pm_runtime_enable(&pdev->dev);
+
+       ret = dw_mci_pltfm_register(pdev, drv_data);
+       if (ret) {
+               pm_runtime_disable(&pdev->dev);
+               pm_runtime_set_suspended(&pdev->dev);
+               pm_runtime_put_noidle(&pdev->dev);
+
+               return ret;
+       }
+
+       return 0;
+}
+
+static int dw_mci_exynos_remove(struct platform_device *pdev)
+{
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_set_suspended(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
+
+       return dw_mci_pltfm_remove(pdev);
 }
 
 static const struct dev_pm_ops dw_mci_exynos_pmops = {
@@ -535,7 +559,7 @@ static const struct dev_pm_ops dw_mci_exynos_pmops = {
 
 static struct platform_driver dw_mci_exynos_pltfm_driver = {
        .probe          = dw_mci_exynos_probe,
-       .remove         = dw_mci_pltfm_remove,
+       .remove         = dw_mci_exynos_remove,
        .driver         = {
                .name           = "dwmmc_exynos",
                .of_match_table = dw_mci_exynos_match,