diff mbox series

mmc: dw_mmc: allow biu and ciu clocks to defer

Message ID 20240811212212.123255-1-ben.whitten@gmail.com (mailing list archive)
State New
Headers show
Series mmc: dw_mmc: allow biu and ciu clocks to defer | expand

Commit Message

Ben Whitten Aug. 11, 2024, 9:22 p.m. UTC
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>
---
 drivers/mmc/host/dw_mmc.c | 8 ++++++++
 1 file changed, 8 insertions(+)


base-commit: 5189dafa4cf950e675f02ee04b577dfbbad0d9b1

Comments

Ulf Hansson Aug. 20, 2024, 11:49 a.m. UTC | #1
On Sun, 11 Aug 2024 at 23:23, Ben Whitten <ben.whitten@gmail.com> wrote:
>
> 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>

Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/host/dw_mmc.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 2333ef4893ee..e9f6e4e62290 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -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);
>
> base-commit: 5189dafa4cf950e675f02ee04b577dfbbad0d9b1
> --
> 2.43.0
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 2333ef4893ee..e9f6e4e62290 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -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);