mmc: dw_mmc: allow biu and ciu clocks to defer
authorBen Whitten <ben.whitten@gmail.com>
Sun, 11 Aug 2024 21:22:11 +0000 (22:22 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 20 Aug 2024 11:23:46 +0000 (13:23 +0200)
Fix a race condition if the clock provider comes up after mmc is probed,
this causes mmc to fail without retrying.
When given the DEFER error from the clk source, pass it on up the chain.

Fixes: f90a0612f0e1 ("mmc: dw_mmc: lookup for optional biu and ciu clocks")
Signed-off-by: Ben Whitten <ben.whitten@gmail.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20240811212212.123255-1-ben.whitten@gmail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/dw_mmc.c

index 2333ef4893ee0da0b63ad2b37ebf8b7ccb330f29..e9f6e4e622901a0e1a12544899613c04e7cc5791 100644 (file)
@@ -3299,6 +3299,10 @@ int dw_mci_probe(struct dw_mci *host)
        host->biu_clk = devm_clk_get(host->dev, "biu");
        if (IS_ERR(host->biu_clk)) {
                dev_dbg(host->dev, "biu clock not available\n");
+               ret = PTR_ERR(host->biu_clk);
+               if (ret == -EPROBE_DEFER)
+                       return ret;
+
        } else {
                ret = clk_prepare_enable(host->biu_clk);
                if (ret) {
@@ -3310,6 +3314,10 @@ int dw_mci_probe(struct dw_mci *host)
        host->ciu_clk = devm_clk_get(host->dev, "ciu");
        if (IS_ERR(host->ciu_clk)) {
                dev_dbg(host->dev, "ciu clock not available\n");
+               ret = PTR_ERR(host->ciu_clk);
+               if (ret == -EPROBE_DEFER)
+                       goto err_clk_biu;
+
                host->bus_hz = host->pdata->bus_hz;
        } else {
                ret = clk_prepare_enable(host->ciu_clk);