sh_mmcif_start_cmd(host, mrq);
}
+static int sh_mmcif_clk_update(struct sh_mmcif_host *host)
+{
+ int ret = clk_enable(host->hclk);
+
+ if (!ret) {
+ host->clk = clk_get_rate(host->hclk);
+ host->mmc->f_max = host->clk / 2;
+ host->mmc->f_min = host->clk / 512;
+ }
+
+ return ret;
+}
+
static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
struct sh_mmcif_host *host = mmc_priv(mmc);
if (!host->power) {
if (p->set_pwr)
p->set_pwr(host->pd, ios->power_mode);
- clk_enable(host->hclk);
+ sh_mmcif_clk_update(host);
pm_runtime_get_sync(&host->pd->dev);
host->power = true;
sh_mmcif_sync_reset(host);
dev_err(&pdev->dev, "cannot get clock \"%s\": %d\n", clk_name, ret);
goto eclkget;
}
- clk_enable(host->hclk);
- host->clk = clk_get_rate(host->hclk);
- mmc->f_max = host->clk / 2;
- mmc->f_min = host->clk / 512;
+ ret = sh_mmcif_clk_update(host);
+ if (ret < 0)
+ goto eclkupdate;
ret = pm_runtime_resume(&pdev->dev);
if (ret < 0)
pm_runtime_suspend(&pdev->dev);
eresume:
clk_disable(host->hclk);
+eclkupdate:
clk_put(host->hclk);
eclkget:
pm_runtime_disable(&pdev->dev);