@@ -877,14 +877,22 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
pltfm_host->clk = imx_data->clk_per;
- clk_prepare_enable(imx_data->clk_per);
- clk_prepare_enable(imx_data->clk_ipg);
- clk_prepare_enable(imx_data->clk_ahb);
+ err = clk_prepare_enable(imx_data->clk_per);
+ if (err)
+ goto free_sdhci;
+
+ err = clk_prepare_enable(imx_data->clk_ipg);
+ if (err)
+ goto disable_clk_per;
+
+ err = clk_prepare_enable(imx_data->clk_ahb);
+ if (err)
+ goto disable_clk_ipg;
imx_data->pinctrl = devm_pinctrl_get(&pdev->dev);
if (IS_ERR(imx_data->pinctrl)) {
err = PTR_ERR(imx_data->pinctrl);
- goto disable_clk;
+ goto disable_clk_ahb;
}
imx_data->pins_default = pinctrl_lookup_state(imx_data->pinctrl,
@@ -892,7 +900,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
if (IS_ERR(imx_data->pins_default)) {
err = PTR_ERR(imx_data->pins_default);
dev_err(mmc_dev(host->mmc), "could not get default state\n");
- goto disable_clk;
+ goto disable_clk_ahb;
}
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
@@ -917,7 +925,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
if (!host->mmc->parent->platform_data) {
dev_err(mmc_dev(host->mmc), "no board data!\n");
err = -EINVAL;
- goto disable_clk;
+ goto disable_clk_ahb;
}
imx_data->boarddata = *((struct esdhc_platform_data *)
host->mmc->parent->platform_data);
@@ -929,7 +937,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request write-protect gpio!\n");
- goto disable_clk;
+ goto disable_clk_ahb;
}
host->mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
}
@@ -941,7 +949,7 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request card-detect gpio!\n");
- goto disable_clk;
+ goto disable_clk_ahb;
}
/* fall through */
@@ -990,14 +998,16 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
err = sdhci_add_host(host);
if (err)
- goto disable_clk;
+ goto disable_clk_ahb;
return 0;
-disable_clk:
- clk_disable_unprepare(imx_data->clk_per);
- clk_disable_unprepare(imx_data->clk_ipg);
+disable_clk_ahb:
clk_disable_unprepare(imx_data->clk_ahb);
+disable_clk_ipg:
+ clk_disable_unprepare(imx_data->clk_ipg);
+disable_clk_per:
+ clk_disable_unprepare(imx_data->clk_per);
free_sdhci:
sdhci_pltfm_free(pdev);
return err;
@@ -1012,9 +1022,9 @@ static int sdhci_esdhc_imx_remove(struct platform_device *pdev)
sdhci_remove_host(host, dead);
- clk_disable_unprepare(imx_data->clk_per);
- clk_disable_unprepare(imx_data->clk_ipg);
clk_disable_unprepare(imx_data->clk_ahb);
+ clk_disable_unprepare(imx_data->clk_ipg);
+ clk_disable_unprepare(imx_data->clk_per);
sdhci_pltfm_free(pdev);