[PATCH] mmc: sdhci-pxav3: do the mbus window configuration after enabling clocks

Ulf Hansson ulf.hansson at linaro.org
Fri Jan 2 02:52:16 PST 2015


On 31 December 2014 at 11:54, Thomas Petazzoni
<thomas.petazzoni at free-electrons.com> wrote:
> In commit 5491ce3f79ee ("mmc: sdhci-pxav3: add support for the Armada
> 38x SDHCI controller"), the sdhci-pxav3 driver was extended to include
> support for the SDHCI controller found in the Armada 38x
> processor. This mainly involved adding some MBus window related
> configuration.
>
> However, this configuration is currently done too early in ->probe():
> it is done before clocks are enabled, while this configuration
> involves touching the registers of the controller, which will hang the
> SoC if the clock is disabled. It wasn't noticed until now because the
> bootloader typically leaves gatable clocks enabled, but in situations
> where we have a deferred probe (due to a CD GPIO that cannot be taken,
> for example), then the probe will be re-tried later, after a clock
> disable has been done in the exit path of the failed probe attempt of
> the device. This second probe() will hang the system due to the clock
> being disabled.
>
> This can for example be produced on Armada 385 GP, which has a CD GPIO
> connected to an I2C PCA9555. If the driver for the PCA9555 is not
> compiled into the kernel, then we will have the following sequence of
> events:
>
>   1. The SDHCI probes
>   2. It does the MBus configuration (which works, because the clock is
>      left enabled by the bootloader)
>   3. It enables the clock
>   4. It tries to get the CD GPIO, which fails due to the driver being
>      missing, so -EPROBE_DEFER is returned.
>   5. Before returning -EPROBE_DEFER, the driver cleans up what was
>      done, which includes disabling the clock.
>   6. Later on, the SDHCI probe is tried again.
>   7. It does the MBus configuration, which hangs because the clock is
>      no longer enabled.
>
> This commit does the obvious fix of doing the MBus configuration after
> the clock has been enabled by the driver.
>
> Fixes: 5491ce3f79ee ("mmc: sdhci-pxav3: add support for the Armada 38x SDHCI controller")
> Cc: <stable at vger.kernel.org> # v3.15+
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>

Thanks! Applied for fixes.

Kind regards
Uffe

> ---
>  drivers/mmc/host/sdhci-pxav3.c | 15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
> index 4523887..ca3424e 100644
> --- a/drivers/mmc/host/sdhci-pxav3.c
> +++ b/drivers/mmc/host/sdhci-pxav3.c
> @@ -300,13 +300,6 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
>         if (IS_ERR(host))
>                 return PTR_ERR(host);
>
> -       if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) {
> -               ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info());
> -               if (ret < 0)
> -                       goto err_mbus_win;
> -       }
> -
> -
>         pltfm_host = sdhci_priv(host);
>         pltfm_host->priv = pxa;
>
> @@ -325,6 +318,12 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
>         if (!IS_ERR(pxa->clk_core))
>                 clk_prepare_enable(pxa->clk_core);
>
> +       if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) {
> +               ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info());
> +               if (ret < 0)
> +                       goto err_mbus_win;
> +       }
> +
>         /* enable 1/8V DDR capable */
>         host->mmc->caps |= MMC_CAP_1_8V_DDR;
>
> @@ -396,11 +395,11 @@ err_add_host:
>         pm_runtime_disable(&pdev->dev);
>  err_of_parse:
>  err_cd_req:
> +err_mbus_win:
>         clk_disable_unprepare(pxa->clk_io);
>         if (!IS_ERR(pxa->clk_core))
>                 clk_disable_unprepare(pxa->clk_core);
>  err_clk_get:
> -err_mbus_win:
>         sdhci_pltfm_free(pdev);
>         return ret;
>  }
> --
> 2.1.0
>



More information about the linux-arm-kernel mailing list