
Hi Justin,
On 2025-01-24 22:19, Justin Klaassen wrote:
The NanoPi R4S supports UHS-I (up to SDR104) SD cards, however using any of these 1.8v modes results in a boot failure in SPL upon soft reboot.
On the R4S the SD card power cannot be cycled, so upon reboot the SD card continues to operate at 1.8v but the GPIO is configured by default at the 3.3v level.
Sounds like similar/same issue [1] that I faced on Asus Tinker Board a few years ago :-)
[1] https://patchwork.kernel.org/patch/10817217/
This change enables the RK8XX regulators and Rockchip IO-domain drivers in SPL, which reads the voltage level of the "vcc_sdio" regulator and configures the GPIO for the appropriate level on boot. This allows the MMC subsystem to operate successfully at the 1.8v level in SPL.
Signed-off-by: Justin Klaassen justin@tidylabs.net
arch/arm/dts/rk3399-nanopi4-u-boot.dtsi | 9 +++++++++ configs/nanopi-r4s-rk3399_defconfig | 7 +++++++ drivers/misc/Kconfig | 8 ++++++++ drivers/misc/rockchip-io-domain.c | 7 ++++++- drivers/power/regulator/Kconfig | 9 +++++++++ drivers/power/regulator/rk8xx.c | 2 +- 6 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/arch/arm/dts/rk3399-nanopi4-u-boot.dtsi b/arch/arm/dts/rk3399-nanopi4-u-boot.dtsi index 75736124996..146b62c2e7a 100644 --- a/arch/arm/dts/rk3399-nanopi4-u-boot.dtsi +++ b/arch/arm/dts/rk3399-nanopi4-u-boot.dtsi @@ -23,4 +23,13 @@
&vcc_sdio { regulator-init-microvolt = <3000000>;
- bootph-pre-ram;
+};
+&io_domains {
- bootph-pre-ram;
+};
+&i2c0_xfer {
Please sort nodes in alphabetical order based on label.
These should probably be added to rk3399-nanopi-r4s-u-boot.dtsi since that is the only defconfig you enable relevant Kconfig options for.
- bootph-pre-ram;
}; diff --git a/configs/nanopi-r4s-rk3399_defconfig b/configs/nanopi-r4s-rk3399_defconfig index a6dafe3d9eb..905de05026f 100644 --- a/configs/nanopi-r4s-rk3399_defconfig +++ b/configs/nanopi-r4s-rk3399_defconfig @@ -8,6 +8,7 @@ CONFIG_ENV_OFFSET=0x3F8000 CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3399-nanopi-r4s" CONFIG_DM_RESET=y CONFIG_ROCKCHIP_RK3399=y +CONFIG_SPL_DRIVERS_MISC=y CONFIG_TARGET_EVB_RK3399=y CONFIG_SYS_LOAD_ADDR=0x800800 CONFIG_DEBUG_UART_BASE=0xFF1A0000 @@ -18,6 +19,8 @@ CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +CONFIG_SPL_I2C=y +CONFIG_SPL_POWER=y CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y CONFIG_TPL=y CONFIG_CMD_BOOTZ=y @@ -33,6 +36,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_ROCKCHIP_GPIO=y CONFIG_SYS_I2C_ROCKCHIP=y CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_SPL_ROCKCHIP_IODOMAIN=y CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y CONFIG_MMC_SDHCI=y @@ -45,8 +49,11 @@ CONFIG_GMAC_ROCKCHIP=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PMIC_RK8XX=y +CONFIG_SPL_PMIC_RK8XX=y +CONFIG_SPL_DM_REGULATOR=y CONFIG_SPL_DM_REGULATOR_FIXED=y CONFIG_REGULATOR_RK8XX=y +CONFIG_SPL_REGULATOR_RK8XX=y CONFIG_PWM_ROCKCHIP=y CONFIG_RAM_ROCKCHIP_LPDDR4=y CONFIG_BAUDRATE=1500000 diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index da84b35e804..ad935b81ae1 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -110,6 +110,14 @@ config ROCKCHIP_IODOMAIN for the IO-domain setting of the SoC to match the voltage supplied by the regulators.
+config SPL_ROCKCHIP_IODOMAIN
- bool "Rockchip IO-domain driver support in SPL"
- depends on SPL_MISC && ARCH_ROCKCHIP
- help
Enable support for IO-domains in Rockchip SoCs in SPL. It is necessary
for the IO-domain setting of the SoC to match the voltage supplied
by the regulators.
config SIFIVE_OTP bool "SiFive eMemory OTP driver" depends on MISC diff --git a/drivers/misc/rockchip-io-domain.c b/drivers/misc/rockchip-io-domain.c index 025b6049a9f..d24d0781b08 100644 --- a/drivers/misc/rockchip-io-domain.c +++ b/drivers/misc/rockchip-io-domain.c @@ -5,6 +5,8 @@
- Ported from linux drivers/soc/rockchip/io-domain.c
*/
+#define LOG_CATEGORY UCLASS_NOP
#include <dm.h> #include <dm/device_compat.h> #include <regmap.h> @@ -344,8 +346,10 @@ static int rockchip_iodomain_probe(struct udevice *dev) continue;
ret = device_get_supply_regulator(dev, supply_name, ®);
if (ret)
if (ret) {
log_debug("%s: Missing regulator for %s\n", __func__, supply_name);
log_debug() is already able to log function name with LOG=y and LOGF_FUNC=y, please drop __func__.
continue;
}
ret = regulator_autoset(reg); if (ret && ret != -EALREADY && ret != -EMEDIUMTYPE &&
@@ -353,6 +357,7 @@ static int rockchip_iodomain_probe(struct udevice *dev) continue;
uV = regulator_get_value(reg);
log_debug("%s: %s = %dV\n", __func__, supply_name, uV);
Same here.
Also for consistency please use a verbose or minimalist log message, do not mix. This has a verbose 'Missing regulator' above and minimalist message here.
if (uV <= 0) continue;
diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig index 958f337c7e7..d873ca06a47 100644 --- a/drivers/power/regulator/Kconfig +++ b/drivers/power/regulator/Kconfig @@ -241,6 +241,15 @@ config REGULATOR_RK8XX by the PMIC device. This driver is controlled by a device tree node which includes voltage limits.
+config SPL_REGULATOR_RK8XX
- bool "Enable driver for RK8XX regulators in SPL"
- depends on SPL_DM_REGULATOR && SPL_PMIC_RK8XX
- ---help---
Use help keyword without '---' and indent the help text.
- Enable support for the regulator functions of the RK8XX PMIC in SPL. The
- driver implements get/set api for the various BUCKS and LDOs supported
- by the PMIC device. This driver is controlled by a device tree node
- which includes voltage limits.
config DM_REGULATOR_S2MPS11 bool "Enable driver for S2MPS11 regulator" depends on DM_REGULATOR && PMIC_S2MPS11 diff --git a/drivers/power/regulator/rk8xx.c b/drivers/power/regulator/rk8xx.c index 368675ebb9f..35615e96b1c 100644 --- a/drivers/power/regulator/rk8xx.c +++ b/drivers/power/regulator/rk8xx.c @@ -16,7 +16,7 @@ #include <power/pmic.h> #include <power/regulator.h>
-#ifndef CONFIG_XPL_BUILD +#if CONFIG_IS_ENABLED(REGULATOR_RK8XX)
Please drop the whole ENABLE_DRIVER instead and use CONFIG_IS_ENABLED in its place.
#define ENABLE_DRIVER #endif
This should also be split up into multiple patches, possible: - io-domain debug logging - io-domain SPL Kconfig symbol - rk8xx.c + related Kconfig can possible go together - nanopi-r4s-u-boot.dtsi + defconfig can possible go together
Regards, Jonas