• Thomas Petazzoni's avatar
    mmc: sdhci-pxav3: do the mbus window configuration after enabling clocks · aa8165f9
    Thomas Petazzoni authored
    In commit 5491ce3f ("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: 5491ce3f ("mmc: sdhci-pxav3: add support for the Armada 38x SDHCI controller")
    Cc: <stable@vger.kernel.org> # v3.15+
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    aa8165f9
sdhci-pxav3.c 12.9 KB