[PATCH V2 0/5] Add mmc-pwrseq file to use common function

Some Socs need to use H/W power-reset before probing eMMC. Its function can be resued with same behavior.
Changelog on V2: - Not enable CONFIG_MMC_PWRSEQ by default when CONFIG_PWRSEQ is enabled. - Remove unused variable in each drivers.
Jaehoon Chung (5): mmc: pwrseq: add mmc-pwrseq file to provide a generic interface mmc: meson_gx_mmc: use mmc_pwrseq instead of meson_mmc_pwrseq mmc: rockchip_dw_mmc: use mmc_pwrseq instead of rockchip_mmc_pwrseq ARM: mach-meson: select MMC_PWRSEQ config configs: enable CONFIG_MMC_PWRSEQ configuration
arch/arm/mach-meson/Kconfig | 1 + configs/chromebit_mickey_defconfig | 1 + configs/chromebook_bob_defconfig | 1 + configs/chromebook_jerry_defconfig | 1 + configs/chromebook_minnie_defconfig | 1 + configs/chromebook_speedy_defconfig | 1 + drivers/mmc/Kconfig | 7 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/meson_gx_mmc.c | 45 ++----------------------- drivers/mmc/mmc-pwrseq.c | 51 +++++++++++++++++++++++++++++ drivers/mmc/rockchip_dw_mmc.c | 42 ++---------------------- include/mmc.h | 14 ++++++++ 12 files changed, 85 insertions(+), 81 deletions(-) create mode 100644 drivers/mmc/mmc-pwrseq.c

Add mmc-pwrseq file to provide a generic interface.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com --- Changelog on V2: - Remove "default y" in Kconfig --- drivers/mmc/Kconfig | 7 ++++++ drivers/mmc/Makefile | 1 + drivers/mmc/mmc-pwrseq.c | 51 ++++++++++++++++++++++++++++++++++++++++ include/mmc.h | 14 +++++++++++ 4 files changed, 73 insertions(+) create mode 100644 drivers/mmc/mmc-pwrseq.c
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index f8ea92172e44..f8ca52efb6b7 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -18,6 +18,13 @@ config MMC_WRITE help Enable write access to MMC and SD Cards
+config MMC_PWRSEQ + bool "HW reset support for eMMC" + depends on PWRSEQ + help + Ths select Hardware reset support aka pwrseq-emmc for eMMC + devices. + config MMC_BROKEN_CD bool "Poll for broken card detection case" help diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 1c849cbab2f1..89d6af3db30b 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -6,6 +6,7 @@ obj-y += mmc.o obj-$(CONFIG_$(SPL_)DM_MMC) += mmc-uclass.o obj-$(CONFIG_$(SPL_)MMC_WRITE) += mmc_write.o +obj-$(CONFIG_MMC_PWRSEQ) += mmc-pwrseq.o obj-$(CONFIG_MMC_SDHCI_ADMA_HELPERS) += sdhci-adma.o
ifndef CONFIG_$(SPL_)BLK diff --git a/drivers/mmc/mmc-pwrseq.c b/drivers/mmc/mmc-pwrseq.c new file mode 100644 index 000000000000..2539f61323d1 --- /dev/null +++ b/drivers/mmc/mmc-pwrseq.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2021 SAMSUNG Electronics + * Jaehoon Chung jh80.chung@samsung.com + */ + +#include <common.h> +#include <dm.h> +#include <mmc.h> +#include <pwrseq.h> +#include <asm/gpio.h> +#include <linux/delay.h> + +int mmc_pwrseq_get_power(struct udevice *dev, struct mmc_config *cfg) +{ + /* Enable power if needed */ + return uclass_get_device_by_phandle(UCLASS_PWRSEQ, dev, "mmc-pwrseq", + &cfg->pwr_dev); +} + +static int mmc_pwrseq_set_power(struct udevice *dev, bool enable) +{ + struct gpio_desc reset; + int ret; + + ret = gpio_request_by_name(dev, "reset-gpios", 0, &reset, GPIOD_IS_OUT); + if (ret) + return ret; + dm_gpio_set_value(&reset, 1); + udelay(1); + dm_gpio_set_value(&reset, 0); + udelay(200); + + return 0; +} + +static const struct pwrseq_ops mmc_pwrseq_ops = { + .set_power = mmc_pwrseq_set_power, +}; + +static const struct udevice_id mmc_pwrseq_ids[] = { + { .compatible = "mmc-pwrseq-emmc" }, + { } +}; + +U_BOOT_DRIVER(mmc_pwrseq_drv) = { + .name = "mmc_pwrseq_emmc", + .id = UCLASS_PWRSEQ, + .of_match = mmc_pwrseq_ids, + .ops = &mmc_pwrseq_ops, +}; diff --git a/include/mmc.h b/include/mmc.h index 1d377e0281f1..637081415430 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -591,6 +591,9 @@ struct mmc_config { uint f_max; uint b_max; unsigned char part_type; +#ifdef CONFIG_MMC_PWRSEQ + struct udevice *pwr_dev; +#endif };
struct sd_ssr { @@ -801,6 +804,17 @@ int mmc_deinit(struct mmc *mmc); */ int mmc_of_parse(struct udevice *dev, struct mmc_config *cfg);
+#ifdef CONFIG_MMC_PWRSEQ +/** + * mmc_pwrseq_get_power() - get a power device from device tree + * + * @dev: MMC device + * @cfg: MMC configuration + * @return 0 if OK, -ve on error + */ +int mmc_pwrseq_get_power(struct udevice *dev, struct mmc_config *cfg); +#endif + int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
/**

Use mmc_pwrseq instead of meson_mmc_pwrseq.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com Acked-by: Neil Armstrong narmstrong@baylibre.com --- Changelog on V2: - Add Neil's Acked-tag - Remove unused variable --- drivers/mmc/meson_gx_mmc.c | 45 +++----------------------------------- 1 file changed, 3 insertions(+), 42 deletions(-)
diff --git a/drivers/mmc/meson_gx_mmc.c b/drivers/mmc/meson_gx_mmc.c index 8b6dfa3b9603..fcf4f03d1e24 100644 --- a/drivers/mmc/meson_gx_mmc.c +++ b/drivers/mmc/meson_gx_mmc.c @@ -265,10 +265,6 @@ static int meson_mmc_probe(struct udevice *dev) uint32_t val; int ret;
-#ifdef CONFIG_PWRSEQ - struct udevice *pwr_dev; -#endif - /* Enable the clocks feeding the MMC controller */ ret = clk_get_bulk(dev, &clocks); if (ret) @@ -292,12 +288,11 @@ static int meson_mmc_probe(struct udevice *dev)
mmc_set_clock(mmc, cfg->f_min, MMC_CLK_ENABLE);
-#ifdef CONFIG_PWRSEQ +#ifdef CONFIG_MMC_PWRSEQ /* Enable power if needed */ - ret = uclass_get_device_by_phandle(UCLASS_PWRSEQ, dev, "mmc-pwrseq", - &pwr_dev); + ret = mmc_pwrseq_get_power(dev, cfg); if (!ret) { - ret = pwrseq_set_power(pwr_dev, true); + ret = pwrseq_set_power(cfg->pwr_dev, true); if (ret) return ret; } @@ -342,37 +337,3 @@ U_BOOT_DRIVER(meson_mmc) = { .of_to_plat = meson_mmc_of_to_plat, .plat_auto = sizeof(struct meson_mmc_plat), }; - -#ifdef CONFIG_PWRSEQ -static int meson_mmc_pwrseq_set_power(struct udevice *dev, bool enable) -{ - struct gpio_desc reset; - int ret; - - ret = gpio_request_by_name(dev, "reset-gpios", 0, &reset, GPIOD_IS_OUT); - if (ret) - return ret; - dm_gpio_set_value(&reset, 1); - udelay(1); - dm_gpio_set_value(&reset, 0); - udelay(200); - - return 0; -} - -static const struct pwrseq_ops meson_mmc_pwrseq_ops = { - .set_power = meson_mmc_pwrseq_set_power, -}; - -static const struct udevice_id meson_mmc_pwrseq_ids[] = { - { .compatible = "mmc-pwrseq-emmc" }, - { } -}; - -U_BOOT_DRIVER(meson_mmc_pwrseq_drv) = { - .name = "mmc_pwrseq_emmc", - .id = UCLASS_PWRSEQ, - .of_match = meson_mmc_pwrseq_ids, - .ops = &meson_mmc_pwrseq_ops, -}; -#endif

Use mmc_pwrseq instead of rockchip_mmc_pwrseq.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com --- Changelog on V2: - Remove unused variable - Fix build error --- drivers/mmc/rockchip_dw_mmc.c | 42 +++-------------------------------- 1 file changed, 3 insertions(+), 39 deletions(-)
diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c index 1be3c1741fd4..36a00bb2bf55 100644 --- a/drivers/mmc/rockchip_dw_mmc.c +++ b/drivers/mmc/rockchip_dw_mmc.c @@ -105,7 +105,6 @@ static int rockchip_dwmmc_probe(struct udevice *dev) struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); struct rockchip_dwmmc_priv *priv = dev_get_priv(dev); struct dwmci_host *host = &priv->host; - struct udevice *pwr_dev __maybe_unused; int ret;
#if CONFIG_IS_ENABLED(OF_PLATDATA) @@ -136,12 +135,11 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
host->fifo_mode = priv->fifo_mode;
-#ifdef CONFIG_PWRSEQ +#ifdef CONFIG_MMC_PWRSEQ /* Enable power if needed */ - ret = uclass_get_device_by_phandle(UCLASS_PWRSEQ, dev, "mmc-pwrseq", - &pwr_dev); + ret = mmc_pwrseq_get_power(dev, &plat->cfg); if (!ret) { - ret = pwrseq_set_power(pwr_dev, true); + ret = pwrseq_set_power(plat->cfg.pwr_dev, true); if (ret) return ret; } @@ -182,37 +180,3 @@ U_BOOT_DRIVER(rockchip_rk3288_dw_mshc) = {
DM_DRIVER_ALIAS(rockchip_rk3288_dw_mshc, rockchip_rk3328_dw_mshc) DM_DRIVER_ALIAS(rockchip_rk3288_dw_mshc, rockchip_rk3368_dw_mshc) - -#ifdef CONFIG_PWRSEQ -static int rockchip_dwmmc_pwrseq_set_power(struct udevice *dev, bool enable) -{ - struct gpio_desc reset; - int ret; - - ret = gpio_request_by_name(dev, "reset-gpios", 0, &reset, GPIOD_IS_OUT); - if (ret) - return ret; - dm_gpio_set_value(&reset, 1); - udelay(1); - dm_gpio_set_value(&reset, 0); - udelay(200); - - return 0; -} - -static const struct pwrseq_ops rockchip_dwmmc_pwrseq_ops = { - .set_power = rockchip_dwmmc_pwrseq_set_power, -}; - -static const struct udevice_id rockchip_dwmmc_pwrseq_ids[] = { - { .compatible = "mmc-pwrseq-emmc" }, - { } -}; - -U_BOOT_DRIVER(rockchip_dwmmc_pwrseq_drv) = { - .name = "mmc_pwrseq_emmc", - .id = UCLASS_PWRSEQ, - .of_match = rockchip_dwmmc_pwrseq_ids, - .ops = &rockchip_dwmmc_pwrseq_ops, -}; -#endif

Before time, PWRSEQ is selected since below commit. commit 262d34363373 ("board: amlogic: select PWRSEQ for all amlogic platform") Select MMC_PWRSEQ config because of introducing CONFIG_MMC_PWRSEQ for only eMMC module.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com --- arch/arm/mach-meson/Kconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/arm/mach-meson/Kconfig b/arch/arm/mach-meson/Kconfig index 513a33dae204..6cba2c40ddaa 100644 --- a/arch/arm/mach-meson/Kconfig +++ b/arch/arm/mach-meson/Kconfig @@ -9,6 +9,7 @@ config MESON64_COMMON select SYSCON select REGMAP select PWRSEQ + select MMC_PWRSEQ select BOARD_LATE_INIT imply CMD_DM

On 16/02/2021 02:16, Jaehoon Chung wrote:
Before time, PWRSEQ is selected since below commit. commit 262d34363373 ("board: amlogic: select PWRSEQ for all amlogic platform") Select MMC_PWRSEQ config because of introducing CONFIG_MMC_PWRSEQ for only eMMC module.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com
arch/arm/mach-meson/Kconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/arm/mach-meson/Kconfig b/arch/arm/mach-meson/Kconfig index 513a33dae204..6cba2c40ddaa 100644 --- a/arch/arm/mach-meson/Kconfig +++ b/arch/arm/mach-meson/Kconfig @@ -9,6 +9,7 @@ config MESON64_COMMON select SYSCON select REGMAP select PWRSEQ
- select MMC_PWRSEQ select BOARD_LATE_INIT imply CMD_DM
Reviewed-by: Neil Armstrong narmstrong@baylibre.com

Enable CONFIG_MMC_PWRSEQ configuration about boards that is using rockchip_dw_mmc driver.
Signed-off-by: Jaehoon Chung jh80.chung@samsung.com --- configs/chromebit_mickey_defconfig | 1 + configs/chromebook_bob_defconfig | 1 + configs/chromebook_jerry_defconfig | 1 + configs/chromebook_minnie_defconfig | 1 + configs/chromebook_speedy_defconfig | 1 + 5 files changed, 5 insertions(+)
diff --git a/configs/chromebit_mickey_defconfig b/configs/chromebit_mickey_defconfig index ba1215bca699..c09b63b94626 100644 --- a/configs/chromebit_mickey_defconfig +++ b/configs/chromebit_mickey_defconfig @@ -63,6 +63,7 @@ CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y CONFIG_PWRSEQ=y +CONFIG_MMC_PWRSEQ=y # CONFIG_SPL_DM_MMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y diff --git a/configs/chromebook_bob_defconfig b/configs/chromebook_bob_defconfig index 73635f0d13f1..a846b6470fef 100644 --- a/configs/chromebook_bob_defconfig +++ b/configs/chromebook_bob_defconfig @@ -55,6 +55,7 @@ CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y CONFIG_PWRSEQ=y +CONFIG_MMC_PWRSEQ=y CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y CONFIG_MMC_SDHCI=y diff --git a/configs/chromebook_jerry_defconfig b/configs/chromebook_jerry_defconfig index dada5579526b..692b630174d2 100644 --- a/configs/chromebook_jerry_defconfig +++ b/configs/chromebook_jerry_defconfig @@ -65,6 +65,7 @@ CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y CONFIG_PWRSEQ=y +CONFIG_MMC_PWRSEQ=y # CONFIG_SPL_DM_MMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y diff --git a/configs/chromebook_minnie_defconfig b/configs/chromebook_minnie_defconfig index 985ca9477069..ae55842e3bfd 100644 --- a/configs/chromebook_minnie_defconfig +++ b/configs/chromebook_minnie_defconfig @@ -65,6 +65,7 @@ CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y CONFIG_PWRSEQ=y +CONFIG_MMC_PWRSEQ=y # CONFIG_SPL_DM_MMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y diff --git a/configs/chromebook_speedy_defconfig b/configs/chromebook_speedy_defconfig index e3d4c30739ee..4b460ee6a9e6 100644 --- a/configs/chromebook_speedy_defconfig +++ b/configs/chromebook_speedy_defconfig @@ -64,6 +64,7 @@ CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y CONFIG_PWRSEQ=y +CONFIG_MMC_PWRSEQ=y # CONFIG_SPL_DM_MMC is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y
participants (2)
-
Jaehoon Chung
-
Neil Armstrong