From 79cb33b9da0c9475486ca0759341057854b25e38 Mon Sep 17 00:00:00 2001 From: Peter Geis Date: Sun, 20 Feb 2022 07:57:50 -0500 Subject: [PATCH] rockchip: handle bootrom mode in spl Signed-off-by: Peter Geis --- arch/arm/mach-rockchip/Makefile | 6 +-- arch/arm/mach-rockchip/boot_mode.c | 4 +- arch/arm/mach-rockchip/rk3568/rk3568.c | 54 +++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 5 deletions(-) --- a/arch/arm/mach-rockchip/Makefile +++ b/arch/arm/mach-rockchip/Makefile @@ -15,13 +15,13 @@ obj-tpl-$(CONFIG_ROCKCHIP_PX30) += px30-board-tpl.o obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o -ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) - # Always include boot_mode.o, as we bypass it (i.e. turn it off) # inside of boot_mode.c when CONFIG_ROCKCHIP_BOOT_MODE_REG is 0. This way, # we can have the preprocessor correctly recognise both 0x0 and 0 # meaning "turn it off". -obj-y += boot_mode.o +obj-$(CONFIG_ARCH_ROCKCHIP) += boot_mode.o + +ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) obj-$(CONFIG_ROCKCHIP_COMMON_BOARD) += board.o obj-$(CONFIG_MISC_INIT_R) += misc.o endif --- a/arch/arm/mach-rockchip/boot_mode.c +++ b/arch/arm/mach-rockchip/boot_mode.c @@ -51,7 +51,7 @@ __weak int rockchip_dnl_key_pressed(void) ret = -ENODEV; uclass_foreach_dev(dev, uc) { if (!strncmp(dev->name, "saradc", 6)) { - ret = adc_channel_single_shot(dev->name, 1, &val); + ret = adc_channel_single_shot(dev->name, 0, &val); break; } } @@ -89,6 +89,7 @@ int setup_boot_mode(void) boot_mode = readl(reg); debug("%s: boot mode 0x%08x\n", __func__, boot_mode); +#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) /* Clear boot mode */ writel(BOOT_NORMAL, reg); @@ -102,6 +103,7 @@ int setup_boot_mode(void) env_set("preboot", "setenv preboot; ums mmc 0"); break; } +#endif return 0; } --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -9,19 +9,30 @@ #include #include #include +#include #include #include #include #define PMUGRF_BASE 0xfdc20000 #define GRF_BASE 0xfdc60000 +#define GRF_GPIO1B_IOMUX_H 0x0c +#define GRF_GPIO1C_IOMUX_L 0x10 +#define GRF_GPIO1C_IOMUX_H 0x14 +#define GRF_GPIO1D_IOMUX_L 0x18 +#define GRF_GPIO1D_IOMUX_H 0x1c +#define GRF_GPIO2A_IOMUX_L 0x20 #define GRF_GPIO1B_DS_2 0x218 #define GRF_GPIO1B_DS_3 0x21c #define GRF_GPIO1C_DS_0 0x220 #define GRF_GPIO1C_DS_1 0x224 #define GRF_GPIO1C_DS_2 0x228 #define GRF_GPIO1C_DS_3 0x22c -#define SGRF_BASE 0xFDD18000 +#define GRF_GPIO1D_DS_0 0x230 +#define GRF_GPIO1D_DS_1 0x234 +#define GRF_GPIO1D_DS_2 0x238 +#define SGRF_BASE 0xfdd18000 +#define SGRF_SOC_CON3 0x0c #define SGRF_SOC_CON4 0x10 #define EMMC_HPROT_SECURE_CTRL 0x03 #define SDMMC0_HPROT_SECURE_CTRL 0x01 @@ -133,6 +144,24 @@ int arch_cpu_init(void) writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_1); writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_2); writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_3); + + /* emmc, sfc, and sdmmc iomux */ + writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1B_IOMUX_H); + writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1C_IOMUX_L); + writel((0x7777UL << 16) | (0x2111), GRF_BASE + GRF_GPIO1C_IOMUX_H); + writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1D_IOMUX_L); + writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1D_IOMUX_H); + writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO2A_IOMUX_L); + + /* set the fspi d0~3 cs0 to level 2 */ + writel(0x3f000700, GRF_BASE + GRF_GPIO1C_DS_3); + writel(0x3f000700, GRF_BASE + GRF_GPIO1D_DS_0); + writel(0x3f3f0707, GRF_BASE + GRF_GPIO1D_DS_1); + writel(0x003f0007, GRF_BASE + GRF_GPIO1D_DS_2); + + /* Set the fspi to secure */ + writel(((0x1 << 14) << 16) | (0x0 << 14), SGRF_BASE + SGRF_SOC_CON3); + #endif return 0; } @@ -164,3 +193,26 @@ int ft_system_setup(void *blob, struct bd_info *bd) #endif return 0; } + +#ifdef CONFIG_SPL_BUILD + +void __weak led_setup(void) +{ +} + +void spl_board_init(void) +{ + led_setup(); + +#if defined(SPL_DM_REGULATOR) + /* + * Turning the eMMC and SPI back on (if disabled via the Qseven + * BIOS_ENABLE) signal is done through a always-on regulator). + */ + if (regulators_enable_boot_on(false)) + debug("%s: Cannot enable boot on regulator\n", __func__); +#endif + + setup_boot_mode(); +} +#endif