linux/drivers/mmc/host
Thomas Petazzoni a375924125 mmc: sdhci-pxav3: do the mbus window configuration after enabling clocks
[ upstream commit aa8165f914 ]

In commit 5491ce3f79 ("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: 5491ce3f79 ("mmc: sdhci-pxav3: add support for the Armada 38x SDHCI controller")
Cc: <stable@vger.kernel.org> # v3.15+
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
[jogo: rebased onto 3.18.17]
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
History 2015-07-05 10:13:00 -04:00
..
android-goldfish.c mmc: remove unnecessary platform_set_drvdata() 2013-05-26 14:23:23 -04:00
atmel-mci-regs.h mmc: atmel-mci: AP700x PDC is not connected to MCI 2012-10-03 10:05:23 -04:00
atmel-mci.c mmc: atmel-mci: fix bad variable type for clkdiv 2015-06-10 13:42:22 -04:00
au1xmmc.c mmc: au1xmmc: fix error return code in au1xmmc_probe() 2014-09-09 13:59:01 +02:00
bfin_sdh.c mmc: bfin_sdh: Move away from using deprecated APIs 2013-10-30 20:26:36 -04:00
cb710-mmc.c mmc: cb710: Move away from using deprecated APIs 2013-10-30 20:26:37 -04:00
cb710-mmc.h mmc: host: use platform_{get,set}_drvdata() 2013-06-27 11:13:02 -04:00
davinci_mmc.c mmc: davinci: Remove redundant of_match_ptr 2014-02-25 15:42:55 -05:00
dw_mmc-exynos.c mmc: dw_mmc: exynos: Staticize dw_mci_exynos_pmops 2014-05-12 18:04:30 -04:00
dw_mmc-k3.c mmc: dw_mmc: fix possible build error 2014-03-03 14:00:56 -05:00
dw_mmc-pci.c mmc: dw_mmc-pci: Remove superflous #else condition on CONFIG_PM_SLEEP 2014-09-09 13:59:05 +02:00
dw_mmc-pltfm.c mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
dw_mmc-pltfm.h mmc: remove use of __devexit 2012-11-28 12:28:18 -08:00
dw_mmc-rockchip.c mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
dw_mmc.c mmc: dw_mmc: avoid write to CDTHRCTL on older versions 2015-01-08 10:30:16 -08:00
dw_mmc.h mmc: dw_mmc: Support voltage changes 2014-09-09 13:59:18 +02:00
jz4740_mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
Kconfig mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
Makefile mmc: dw_mmc: move rockchip related code to a separate file 2014-09-09 13:59:16 +02:00
mmc_spi.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
mmci.c mmc: core: restore detect line inversion semantics 2014-10-02 11:51:26 +02:00
mmci.h mmc: mmci: Add Qcom specific rx_fifocnt logic. 2014-07-09 11:25:57 +02:00
mmci_qcom_dml.c mmc: mmci: Add qcom dml support to the driver. 2014-09-09 13:58:46 +02:00
mmci_qcom_dml.h mmc: mmci: Add qcom dml support to the driver. 2014-09-09 13:58:46 +02:00
moxart-mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
msm_sdcc.c mmc: msm_sdcc: Move away from using deprecated APIs 2013-10-30 20:26:41 -04:00
msm_sdcc.h mmc: msm_sdcc: Use MCI_INT_MASK0 for PIO interrupts 2011-10-26 15:43:37 -04:00
mvsdio.c mmc: mvsdio: avoid compiler warning 2014-06-12 10:50:27 +02:00
mvsdio.h mmc: SDIO driver for Marvell SoCs 2009-03-24 21:30:03 +01:00
mxcmmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
mxs-mmc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
of_mmc_spi.c mmc: mmc_spi: Support CD/RO GPIOs 2013-08-24 23:45:22 -04:00
omap.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
omap_hsmmc.c mmc: omap_hsmmc: Fix UHS card with DDR50 support 2015-01-08 10:30:16 -08:00
pxamci.c mmc: pxamci: prepare and unprepare the clocks 2014-09-09 13:59:24 +02:00
pxamci.h [ARM] pxa: mmc: add 1st host controller support for pxa3xx 2008-01-26 15:07:53 +00:00
rtsx_pci_sdmmc.c mmc: rtsx_pci: Set power related cap2 macros 2014-09-24 11:20:16 +02:00
rtsx_usb_sdmmc.c mmc: rtsx_pci: Set power related cap2 macros 2014-09-24 11:20:16 +02:00
s3cmci.c mmc: Convert pr_warning to pr_warn 2014-09-24 10:13:09 +02:00
s3cmci.h mmc: s3cmci: port DMA code to dmaengine API 2014-07-09 11:26:13 +02:00
sdhci-acpi.c mmc: sdhci-acpi: Fix Braswell eMMC timeout clock frequency 2014-10-06 15:08:14 +02:00
sdhci-bcm-kona.c mmc, sdhci, bcm-kona, LLVMLinux: Remove use of __initconst 2014-10-03 14:33:46 +02:00
sdhci-bcm2835.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-cns3xxx.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-dove.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-esdhc-imx.c mmc: sdhci-esdhc-imx: set the correct max timeout value for uSDHC 2014-09-09 13:59:21 +02:00
sdhci-esdhc.h mmc: sdhci: convert sdhci_set_clock() into a library function 2014-05-22 07:26:32 -04:00
sdhci-msm.c mmc: Consolidate emmc tuning blocks 2014-09-23 09:13:19 +02:00
sdhci-of-arasan.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-of-esdhc.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-of-hlwd.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-pci-data.c mmc: sdhci-pci: add platform data 2012-01-11 23:58:47 -05:00
sdhci-pci-o2micro.c mmc: sdhci-pci-o2micro: Fix Dell E5440 issue 2015-01-08 10:30:16 -08:00
sdhci-pci-o2micro.h mmc: sdhci-pci-o2micro: Add SeaBird SeaEagle SD3 support 2014-05-22 08:40:44 -04:00
sdhci-pci.c mmc: sdhci-pci: Fix Braswell eMMC timeout clock frequency 2014-10-03 14:25:35 +02:00
sdhci-pci.h mmc: sdhci-pci: Add Bay Trail and Braswell SD card detect 2014-10-03 14:24:52 +02:00
sdhci-pltfm.c mmc: sdhci-pltfm: Do not use parent as the host's device 2014-09-09 13:58:58 +02:00
sdhci-pltfm.h mmc: sdhci-pltfm: export pltfm suspend/resume api 2014-01-13 12:48:06 -05:00
sdhci-pxav2.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-pxav3.c mmc: sdhci-pxav3: do the mbus window configuration after enabling clocks 2015-07-05 10:13:00 -04:00
sdhci-s3c-regs.h mmc: sdhci-s3c: remove platform dependencies 2013-04-19 13:51:23 +02:00
sdhci-s3c.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-sirf.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
sdhci-spear.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci-st.c mmc: sdhci-st: Intial support for ST SDHCI controller 2014-07-10 09:11:18 +02:00
sdhci-tegra.c mmc: remove .owner field for drivers using module_platform_driver 2014-09-09 13:59:04 +02:00
sdhci.c mmc: sdhci: Set SDHCI_POWER_ON with external vmmc 2015-01-27 08:29:40 -08:00
sdhci.h mmc: sdhci: execute tuning when device is not busy 2014-09-24 11:03:17 +02:00
sdricoh_cs.c mmc: sdricoh_cs: Move away from using deprecated APIs 2013-10-30 20:28:32 -04:00
sh_mmcif.c mmc: sh_mmcif: Fix timeout value for command request 2015-06-09 13:43:39 -04:00
sh_mobile_sdhi.c mmc: use .multi_io_quirk on sh_mobile 2014-09-09 14:15:42 +02:00
sunxi-mmc.c mmc: sunxi: Use devm_reset_control_get_optional() for reset control 2015-05-17 19:11:53 -04:00
tifm_sd.c mmc: Convert pr_warning to pr_warn 2014-09-24 10:13:09 +02:00
tmio_mmc.c mmc: tmio_mmc: Fixup system PM suspend lock-up 2014-09-09 13:59:12 +02:00
tmio_mmc.h mmc: tmio: Remove library functions for system PM 2014-09-09 13:59:12 +02:00
tmio_mmc_dma.c mmc: tmio: remove Renesas specific #ifdef 2014-09-09 13:59:15 +02:00
tmio_mmc_pio.c mmc: don't request CD IRQ until mmc_start_host() 2014-09-23 09:01:36 +02:00
usdhi6rol0.c mmc: usdhi6rol0: fix compiler warnings 2014-06-12 10:38:50 +02:00
ushc.c mmc: ushc: Fix incorrect parameter in sizeof 2014-02-25 15:42:20 -05:00
via-sdmmc.c mmc: via-sdmmc: Move away from using deprecated APIs 2013-10-30 20:28:36 -04:00
vub300.c mmc: vub300: Move away from using deprecated APIs 2013-10-30 20:26:43 -04:00
wbsd.c mmc: Convert pr_warning to pr_warn 2014-09-24 10:13:09 +02:00
wbsd.h mmc: update header file paths 2007-07-26 01:53:31 +02:00
wmt-sdmmc.c mmc: wmt-sdmmc: Remove deprecated IRQF_DISABLED 2014-07-09 11:26:08 +02:00