mmc: dw_mmc-rockchip: Fix native sdmmc deep resume failure

Native sdmmc does not use rpm, but we set pm_runtime_force_suspend()
and pm_runtime_force_resume() for sleep PM. pm_runtime_force_*()
will check rpm status, so that the it doesn't call the resume
callback if we didn't increase its usage count.

Another drive-by fix is to de-init rpm once when rpm is used.

Change-Id: Id7ea1ca95c684fb51867fb87c66f8998fc0758a3
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
This commit is contained in:
Shawn Lin
2019-10-30 09:54:58 +08:00
committed by Tao Huang
parent 085eb4c350
commit fedeff5024

View File

@@ -357,8 +357,13 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev)
match = of_match_node(dw_mci_rockchip_match, pdev->dev.of_node);
drv_data = match->data;
/*
* increase rpm usage count in order to make
* pm_runtime_force_resume calls rpm resume callback
*/
pm_runtime_get_noresume(&pdev->dev);
if (use_rpm) {
pm_runtime_get_noresume(&pdev->dev);
pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);
pm_runtime_set_autosuspend_delay(&pdev->dev, 50);
@@ -367,8 +372,10 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev)
ret = dw_mci_pltfm_register(pdev, drv_data);
if (ret) {
pm_runtime_disable(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
if (use_rpm) {
pm_runtime_disable(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
}
pm_runtime_put_noidle(&pdev->dev);
return ret;
}