Skip to content

Commit

Permalink
mmc: tmio: move runtime PM enablement to the driver implementations
Browse files Browse the repository at this point in the history
Both the Renesas and Uniphier implementations perform actions which
affect runtime PM before calling into the core tmio_mmc_host_probe()
which enabled runtime PM. Move pm_runtime_enable() from the core and
tmio_mmc_host_probe() into each drivers probe() so it can be called
before any clocks or other resources are switched on.

Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
  • Loading branch information
Niklas Söderlund authored and Ulf Hansson committed Jun 10, 2019
1 parent fdc4e75 commit 7ff2131
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 2 deletions.
6 changes: 6 additions & 0 deletions drivers/mmc/host/renesas_sdhi_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,8 @@ int renesas_sdhi_probe(struct platform_device *pdev,
/* All SDHI have SDIO status bits which must be 1 */
mmc_data->flags |= TMIO_MMC_SDIO_STATUS_SETBITS;

pm_runtime_enable(&pdev->dev);

ret = renesas_sdhi_clk_enable(host);
if (ret)
goto efree;
Expand Down Expand Up @@ -850,6 +852,8 @@ int renesas_sdhi_probe(struct platform_device *pdev,
efree:
tmio_mmc_host_free(host);

pm_runtime_disable(&pdev->dev);

return ret;
}
EXPORT_SYMBOL_GPL(renesas_sdhi_probe);
Expand All @@ -861,6 +865,8 @@ int renesas_sdhi_remove(struct platform_device *pdev)
tmio_mmc_host_remove(host);
renesas_sdhi_clk_disable(host);

pm_runtime_disable(&pdev->dev);

return 0;
}
EXPORT_SYMBOL_GPL(renesas_sdhi_remove);
Expand Down
5 changes: 5 additions & 0 deletions drivers/mmc/host/tmio_mmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ static int tmio_mmc_probe(struct platform_device *pdev)
host->mmc->f_max = pdata->hclk;
host->mmc->f_min = pdata->hclk / 512;

pm_runtime_enable(&pdev->dev);

ret = tmio_mmc_host_probe(host);
if (ret)
goto host_free;
Expand All @@ -191,6 +193,7 @@ static int tmio_mmc_probe(struct platform_device *pdev)
tmio_mmc_host_remove(host);
host_free:
tmio_mmc_host_free(host);
pm_runtime_disable(&pdev->dev);
cell_disable:
if (cell->disable)
cell->disable(pdev);
Expand All @@ -207,6 +210,8 @@ static int tmio_mmc_remove(struct platform_device *pdev)
if (cell->disable)
cell->disable(pdev);

pm_runtime_disable(&pdev->dev);

return 0;
}

Expand Down
11 changes: 9 additions & 2 deletions drivers/mmc/host/tmio_mmc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1153,6 +1153,15 @@ void tmio_mmc_host_free(struct tmio_mmc_host *host)
}
EXPORT_SYMBOL_GPL(tmio_mmc_host_free);

/**
* tmio_mmc_host_probe() - Common probe for all implementations
* @_host: Host to probe
*
* Perform tasks common to all implementations probe functions.
*
* The caller should have called pm_runtime_enable() prior to calling
* the common probe function.
*/
int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
{
struct platform_device *pdev = _host->pdev;
Expand Down Expand Up @@ -1261,7 +1270,6 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
pm_runtime_set_active(&pdev->dev);
pm_runtime_set_autosuspend_delay(&pdev->dev, 50);
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_enable(&pdev->dev);

ret = mmc_add_host(mmc);
if (ret)
Expand Down Expand Up @@ -1297,7 +1305,6 @@ void tmio_mmc_host_remove(struct tmio_mmc_host *host)

pm_runtime_dont_use_autosuspend(&pdev->dev);
pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev);
}
EXPORT_SYMBOL_GPL(tmio_mmc_host_remove);

Expand Down
3 changes: 3 additions & 0 deletions drivers/mmc/host/uniphier-sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,7 @@ static int uniphier_sd_probe(struct platform_device *pdev)
host->clk_disable = uniphier_sd_clk_disable;
host->set_clock = uniphier_sd_set_clock;

pm_runtime_enable(&pdev->dev);
ret = uniphier_sd_clk_enable(host);
if (ret)
goto free_host;
Expand All @@ -652,6 +653,7 @@ static int uniphier_sd_probe(struct platform_device *pdev)

free_host:
tmio_mmc_host_free(host);
pm_runtime_disable(&pdev->dev);

return ret;
}
Expand All @@ -662,6 +664,7 @@ static int uniphier_sd_remove(struct platform_device *pdev)

tmio_mmc_host_remove(host);
uniphier_sd_clk_disable(host);
pm_runtime_disable(&pdev->dev);

return 0;
}
Expand Down

0 comments on commit 7ff2131

Please sign in to comment.