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);