u-boot-brain/drivers/mmc
Yann Gautier 3602a56ac6 mmc: add a driver callback for power-cycle
Some MMC peripherals require specific power cycle sequence, where some
registers need to be written between the regulator is turned off and then
back on. This is the case for the MMC IP embedded in STM32MP1 SoC.

In STM32MP157 reference manual [1], the power cycle sequence is:
1. Reset the SDMMC with the RCC.SDMMCxRST register bit. This will reset
the SDMMC to the reset state and the CPSM and DPSM to the Idle state.
2. Disable the Vcc power to the card.
3. Set the SDMMC in power-cycle state. This will make that the
SDMMC_D[7:0], SDMMC_CMD and SDMMC_CK are driven low, to prevent the card
from being supplied through the signal lines.
4. After minimum 1ms enable the Vcc power to the card.
5. After the power ramp period set the SDMMC to the power-off state for
minimum 1ms. The SDMMC_D[7:0], SDMMC_CMD and SDMMC_CK are set to
drive “1”.
6. After the 1ms delay set the SDMMC to power-on state in which the
SDMMC_CK clock will be enabled.
7. After 74 SDMMC_CK cycles the first command can be sent to the card.

The step 3. cannot be handled by the current framework implementation.
A new callback (host_power_cycle) is created, and called in
mmc_power_cycle(), after mmc_power_off().

The incorrect power cycle sequence has shown some boot failures on
STM32MP1 with some SD-cards, especially on cold boots when the input
frequency is low (<= 25MHz).
Those failures are no more seen with this correct power cycle sequence.

[1] https://www.st.com/resource/en/reference_manual/DM00327659.pdf

Signed-off-by: Yann Gautier <yann.gautier@st.com>
2019-10-10 10:59:48 +08:00
..
am654_sdhci.c mmc: am654_sdhci: Separate J721E compatible into 8bit and 4bit versions 2019-07-26 21:49:28 -04:00
arm_pl180_mmci.c mmc: arm_pl180_mmci: Sync compatible with kernel 2019-04-23 15:31:30 +02:00
arm_pl180_mmci.h mmc: arm_pl180_mmci: Sync compatible with kernel 2019-04-23 15:31:30 +02:00
aspeed_sdhci.c mmc: Add Aspeed SD controller driver 2019-09-05 15:27:31 +08:00
atmel_sdhci.c mmc: atmel_sdhci: Add sam9x60-sdhci compatibility string 2019-10-08 09:16:11 +03:00
bcm2835_sdhci.c mmc: bcm283x: Add support for bcm2711 device in bcm2835_sdhci 2019-09-06 18:16:59 +02:00
bcm2835_sdhost.c mmc: bcm2835-host: Fix wait_transfer_complete 2019-09-06 18:16:59 +02:00
bcmstb_sdhci.c mmc: bcm: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
davinci_mmc.c MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL 2018-09-11 21:49:02 -04:00
dw_mmc.c mmc: dw_mmc: fix timeout calculate method 2019-09-05 15:28:40 +08:00
exynos_dw_mmc.c ARM: Odroid XU3: Modify exynos dw_mmc driver to support Odroid XU3 in DM MMC 2018-08-06 10:53:53 +09:00
fsl_esdhc_imx.c mmc: fsl_esdhc_imx: enlarge mmc timeout 2019-07-15 10:30:09 +08:00
fsl_esdhc_spl.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
fsl_esdhc.c mmc: fsl_esdhc: Add emmc hs200 support 2019-09-12 14:05:38 +05:30
ftsdc010_mci.c mmc: ftsdc010_mci: Sync compatible with DT mmc node 2018-05-29 14:45:03 +08:00
ftsdc010_mci.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
gen_atmel_mci.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
hi6220_dw_mmc.c mmc: Add support for HI3660 SoC reusing hi6220_dw_mmc driver 2019-08-11 16:43:41 -04:00
iproc_sdhci.c drivers: mmc: Add sdhci driver for Broadcom iProc platform 2019-10-10 10:59:48 +08:00
jz_mmc.c mmc: jz_mmc: Compile-out write support if disabled 2019-01-16 13:56:43 +01:00
Kconfig drivers: mmc: Add sdhci driver for Broadcom iProc platform 2019-10-10 10:59:48 +08:00
kona_sdhci.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
Makefile drivers: mmc: Add sdhci driver for Broadcom iProc platform 2019-10-10 10:59:48 +08:00
meson_gx_mmc.c mmc: meson-gx: Add AXG compatible 2018-11-26 14:39:57 +01:00
mmc_boot.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
mmc_legacy.c mmc: Register only the first MMC device on MMC_TINY 2019-07-13 11:11:26 -04:00
mmc_private.h mmc: add mmc_poll_for_busy() and change the purpose of mmc_send_status() 2019-07-15 10:16:49 +08:00
mmc_spi.c dm: mmc_spi: Fix NULL pointer dereference in mmc_spi_bind() 2019-09-05 15:29:29 +08:00
mmc_write.c mmc: Rename timeout parameters for clarification 2019-09-05 15:27:31 +08:00
mmc-uclass.c mmc: add a driver callback for power-cycle 2019-10-10 10:59:48 +08:00
mmc.c mmc: add a driver callback for power-cycle 2019-10-10 10:59:48 +08:00
msm_sdhci.c mmc: msm_sdhci: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
mtk-sd.c mmc: mtk-sd: Add MT8183 SoC support 2019-08-20 12:20:32 -04:00
mv_sdhci.c mmc: mv_sdhci: fix uninitialized pointer deref on probe 2019-07-31 15:31:36 +08:00
mvebu_mmc.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
mxcmmc.c mmc: change the set_ios return type from void to int 2017-01-11 19:40:13 +09:00
mxsmmc.c mmc: Replace printf with debug call for timeouts in the i.MX28 mxs driver 2019-10-08 16:36:36 +02:00
omap_hsmmc.c mmc: Rename timeout parameters for clarification 2019-09-05 15:27:31 +08:00
pci_mmc.c mmc: pci: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
pic32_sdhci.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
pxa_mmc_gen.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
renesas-sdhi.c mmc: Rename timeout parameters for clarification 2019-09-05 15:27:31 +08:00
rockchip_dw_mmc.c rockchip: use 'arch-rockchip' as header file path 2019-05-01 00:00:05 +02:00
rockchip_sdhci.c rockchip: sdhci: Fix sdhci mmc driver probe abort 2019-07-20 23:59:44 +08:00
rpmb.c mmc: rpmb: fix response type of CMD25 2019-07-15 10:16:49 +08:00
s5p_sdhci.c mmc: s5p: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
sandbox_mmc.c sandbox: mmc: Fix up MMC emulator for valgrind 2019-10-08 13:57:39 +08:00
sdhci-cadence.c mmc: sdhci-cadence: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
sdhci.c mmc: sdhci: Add support for dt caps & caps mask 2019-09-06 10:40:13 +08:00
sh_mmcif.c mmc: sh_mmcif: Set default MMCIF clock rate 2019-03-25 20:26:53 +01:00
sh_mmcif.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
sh_sdhi.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
snps_dw_mmc.c ARC: dwmmc: Adding DesignWare MMC driver support for ARC devboards 2019-04-18 09:12:38 +03:00
socfpga_dw_mmc.c mmc: socfpga: Add clock framework support 2018-08-13 22:35:42 +02:00
sti_sdhci.c mmc: sti_sdhci: Fix sdhci_setup_cfg() call. 2019-08-27 09:36:56 +02:00
stm32_sdmmc2.c mmc: stm32_sdmmc2: reload watchdog 2019-08-27 11:19:23 +02:00
sunxi_mmc.c mmc: sunxi: Honour non-removable property in DT 2019-01-29 23:49:41 +05:30
tangier_sdhci.c mmc: tangier_sdhci: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00
tegra_mmc.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
tmio-common.c mmc: tmio: Clamp SD_SECCNT to 16bit values on 16bit IP 2019-03-25 20:26:53 +01:00
tmio-common.h mmc: tmio: sdhi: HS400 manual adjustment 2019-05-21 22:15:32 +02:00
uniphier-sd.c mmc: tmio: Make DMA transfer end bit configurable 2019-02-09 11:08:40 +01:00
xenon_sdhci.c mmc: sdhci: Make set_ios_post() return int 2019-07-17 11:12:08 -04:00
zynq_sdhci.c mmc: zynq_sdhci: fix uninitialized pointer deref on probe 2019-08-09 13:45:25 +08:00