]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mmc: meson-gx: fix error path in meson_mmc_clk_init / meson_mmc_probe
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 4 Mar 2017 12:25:14 +0000 (13:25 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:41:10 +0000 (21:41 +0200)
The condition should be "if (ret)" as the disable/unprepare is
supposed to be executed if the previous command fails.
In addition adjust the error path in probe to properly deal
with the case that cfg_div_clk can be registered successfully
but enable/prepare fails.
In this case we shouldn't call clk_disable_unprepare.

Reported-by: MichaƂ Zegan <webczat_200@poczta.onet.pl>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Acked-by: Kevin Hilman <khilman@baylibre.com>
Tested-by: Kevin Hilman <khilman@baylibre.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/meson-gx-mmc.c

index 68e76fa8052bed1e95b98e48407ca15aaa78c8bf..002e4aac7ca99f05dc3bcbdb21b8d665dfa862b1 100644 (file)
@@ -321,7 +321,7 @@ static int meson_mmc_clk_init(struct meson_host *host)
        host->mmc->f_min = clk_round_rate(host->cfg_div_clk, 400000);
 
        ret = meson_mmc_clk_set(host, host->mmc->f_min);
-       if (!ret)
+       if (ret)
                clk_disable_unprepare(host->cfg_div_clk);
 
        return ret;
@@ -771,7 +771,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
                                        meson_mmc_irq_thread, IRQF_SHARED,
                                        DRIVER_NAME, host);
        if (ret)
-               goto free_host;
+               goto err_div_clk;
 
        mmc->max_blk_count = CMD_CFG_LENGTH_MASK;
        mmc->max_req_size = mmc->max_blk_count * mmc->max_blk_size;
@@ -784,7 +784,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
        if (host->bounce_buf == NULL) {
                dev_err(host->dev, "Unable to map allocate DMA bounce buffer.\n");
                ret = -ENOMEM;
-               goto free_host;
+               goto err_div_clk;
        }
 
        mmc->ops = &meson_mmc_ops;
@@ -792,8 +792,9 @@ static int meson_mmc_probe(struct platform_device *pdev)
 
        return 0;
 
-free_host:
+err_div_clk:
        clk_disable_unprepare(host->cfg_div_clk);
+free_host:
        clk_disable_unprepare(host->core_clk);
        mmc_free_host(mmc);
        return ret;