]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sunxi: add Allwinner R528/T113 SoC support
authorAndre Przywara <andre.przywara@arm.com>
Tue, 6 Sep 2022 14:59:57 +0000 (15:59 +0100)
committerAndre Przywara <andre.przywara@arm.com>
Sun, 22 Oct 2023 22:41:52 +0000 (23:41 +0100)
This adds the remaining code bits to teach U-Boot about Allwinner's
newest SoC generation. This was introduced with the RISC-V based
Allwinner D1 SoC, which actually shares a die with the ARM cores versions
called R528 (BGA, without DRAM) and T113s (QFP, with embedded DRAM).

This adds the new Kconfig stanza, using the two newly introduced symbols
for the new SoC generation and pincontroller. It also adds the new symbols
to the relavent code places, to set all the hardcoded bits directly.

We need one DT override:
The ARM core version of the DT specifies the CPUX watchdog as
"reserved", which means it won't be recognised by U-Boot. Override this
in our generic sunxi-u-boot.dtsi, to let U-Boot pick up this watchdog,
so that the generic reset driver will work.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/dts/sunxi-u-boot.dtsi
arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/board.c
arch/arm/mach-sunxi/clock_sun50i_h6.c
arch/arm/mach-sunxi/cpu_info.c
common/spl/Kconfig
drivers/clk/sunxi/Kconfig
drivers/mmc/sunxi_mmc.c
drivers/pinctrl/sunxi/Kconfig

index af419c7e59028d9f5a0110061dec64a581d924f3..a0c8abb703395aa2a2e5366a377a037b68a62075 100644 (file)
        };
 };
 
+/* Let U-Boot be the firmware layer that controls the watchdog. */
+#ifdef CONFIG_MACH_SUN8I_R528
+&wdt {
+       status = "okay";
+};
+#endif
+
 &binman {
        u-boot-sunxi-with-spl {
                filename = "u-boot-sunxi-with-spl.bin";
index 8471e11aa02a6cda8f6776f6345225ca6ce5dd87..a84a57e5b41249b4b240260d5dc89e5b6447033e 100644 (file)
@@ -266,7 +266,7 @@ struct sunxi_ccm_reg {
 #define CCM_CPU_AXI_AXI_MASK           0x3
 #define CCM_CPU_AXI_DEFAULT_FACTORS    0x301
 
-#ifdef CONFIG_MACH_SUN50I_H6
+#ifdef CONFIG_MACH_SUN50I_H6                           /* H6 */
 #define CCM_PLL6_DEFAULT               0xa0006300
 
 /* psi_ahb1_ahb2 bit field */
@@ -277,7 +277,7 @@ struct sunxi_ccm_reg {
 
 /* apb1 bit field */
 #define CCM_APB1_DEFAULT               0x03000102
-#elif CONFIG_MACH_SUN50I_H616
+#elif CONFIG_MACH_SUN50I_H616                          /* H616 */
 #define CCM_PLL6_DEFAULT               0xa8003100
 
 /* psi_ahb1_ahb2 bit field */
@@ -288,6 +288,11 @@ struct sunxi_ccm_reg {
 
 /* apb1 bit field */
 #define CCM_APB1_DEFAULT               0x03000102
+#elif CONFIG_MACH_SUN8I_R528                           /* R528 */
+#define CCM_PLL6_DEFAULT               0xe8216300
+#define CCM_PSI_AHB1_AHB2_DEFAULT      0x03000002
+//#define CCM_AHB3_DEFAULT             0x03000002
+#define CCM_APB1_DEFAULT               0x03000102
 #endif
 
 /* apb2 bit field */
index 6ba9ed2bb2aa4e6da33ad0dac2ae3ae8d3d3f0c3..d976203ee7b3bcc19b176613c5e9abff50395f8d 100644 (file)
@@ -346,6 +346,15 @@ config MACH_SUN8I_R40
        select SUNXI_DRAM_DW_32BIT
        imply SPL_SYS_I2C_LEGACY
 
+config MACH_SUN8I_R528
+       bool "sun8i (Allwinner R528)"
+       select CPU_V7A
+       select SUNXI_GEN_NCAT2
+       select SUNXI_NEW_PINCTRL
+       select MMC_SUNXI_HAS_NEW_MODE
+       select SUPPORT_SPL
+       select DRAM_SUN20I_D1
+
 config MACH_SUN8I_V3S
        bool "sun8i (Allwinner V3/V3s/S3/S3L)"
        select CPU_V7A
@@ -656,6 +665,7 @@ config SYS_CLK_FREQ
        default 1008000000 if MACH_SUN9I
        default 888000000 if MACH_SUN50I_H6
        default 1008000000 if MACH_SUN50I_H616
+       default 1008000000 if MACH_SUN8I_R528
 
 config SYS_CONFIG_NAME
        default "suniv" if MACH_SUNIV
@@ -664,6 +674,7 @@ config SYS_CONFIG_NAME
        default "sun6i" if MACH_SUN6I
        default "sun7i" if MACH_SUN7I
        default "sun8i" if MACH_SUN8I
+       default "sun8i" if MACH_SUN8I_R528
        default "sun9i" if MACH_SUN9I
        default "sun50i" if MACH_SUN50I
        default "sun50i" if MACH_SUN50I_H6
index d572314f0da0288a3b50fa2129d0ddd58a4c0427..c2fadf753677f145e28dc3aee09fcdb556d0555b 100644 (file)
@@ -147,6 +147,10 @@ static int gpio_init(void)
        sunxi_gpio_set_cfgpin(SUNXI_GPH(12), SUN9I_GPH_UART0);
        sunxi_gpio_set_cfgpin(SUNXI_GPH(13), SUN9I_GPH_UART0);
        sunxi_gpio_set_pull(SUNXI_GPH(13), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN8I_R528)
+       sunxi_gpio_set_cfgpin(SUNXI_GPE(2), 6);
+       sunxi_gpio_set_cfgpin(SUNXI_GPE(3), 6);
+       sunxi_gpio_set_pull(SUNXI_GPE(3), SUNXI_GPIO_PULL_UP);
 #elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUNIV)
        sunxi_gpio_set_cfgpin(SUNXI_GPA(2), SUNIV_GPE_UART0);
        sunxi_gpio_set_cfgpin(SUNXI_GPA(3), SUNIV_GPE_UART0);
@@ -163,6 +167,10 @@ static int gpio_init(void)
        sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUN8I_GPB_UART2);
        sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUN8I_GPB_UART2);
        sunxi_gpio_set_pull(SUNXI_GPB(1), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 4 && defined(CONFIG_MACH_SUN8I_R528)
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(6), 7);
+       sunxi_gpio_set_cfgpin(SUNXI_GPB(7), 7);
+       sunxi_gpio_set_pull(SUNXI_GPB(7), SUNXI_GPIO_PULL_UP);
 #elif CONFIG_CONS_INDEX == 5 && defined(CONFIG_MACH_SUN8I)
        sunxi_gpio_set_cfgpin(SUNXI_GPL(2), SUN8I_GPL_R_UART);
        sunxi_gpio_set_cfgpin(SUNXI_GPL(3), SUN8I_GPL_R_UART);
index daae994787e74476fd3de4d10fe20f18cedb3681..bea91c78bc5b5b0e8c8886efa272a7fc91168f85 100644 (file)
@@ -41,7 +41,9 @@ void clock_init_safe(void)
                        CCM_CPU_AXI_DEFAULT_FACTORS);
 
        writel(CCM_PSI_AHB1_AHB2_DEFAULT, &ccm->psi_ahb1_ahb2_cfg);
+#ifdef CCM_AHB3_DEFAULT
        writel(CCM_AHB3_DEFAULT, &ccm->ahb3_cfg);
+#endif
        writel(CCM_APB1_DEFAULT, &ccm->apb1_cfg);
 
        /*
index 7eef178859b87eed0e26140408b04c1f914e0bf4..7fecc3b88dd338538810a085df444d569e95f41b 100644 (file)
@@ -93,6 +93,8 @@ int print_cpuinfo(void)
        printf("CPU:   Allwinner R40 (SUN8I %04x)\n", sunxi_get_sram_id());
 #elif defined CONFIG_MACH_SUN8I_V3S
        printf("CPU:   Allwinner V3s (SUN8I %04x)\n", sunxi_get_sram_id());
+#elif defined CONFIG_MACH_SUN8I_R528
+       puts("CPU:   Allwinner R528 (SUN8I)\n");
 #elif defined CONFIG_MACH_SUN9I
        puts("CPU:   Allwinner A80 (SUN9I)\n");
 #elif defined CONFIG_MACH_SUN50I
index f7c8ba511b3f75b889490c1f9012960f35c36df5..25cd18afda73d069ab4743e3487d192cebf1f738 100644 (file)
@@ -371,6 +371,7 @@ config SPL_STACK
        default 0x91ffb8 if ARCH_MX6 && !MX6_OCRAM_256KB
        default 0x118000 if MACH_SUN50I_H6
        default 0x58000 if MACH_SUN50I_H616
+       default 0x40000 if MACH_SUN8I_R528
        default 0x54000 if MACH_SUN50I || MACH_SUN50I_H5
        default 0x18000 if MACH_SUN9I
        default 0x8000 if ARCH_SUNXI
index f65e482ba4c586c0e2fe9f0b0b4745cd53f3148b..8bdc09448969525fb57a2d28b9eb05f103fd40ec 100644 (file)
@@ -89,6 +89,7 @@ config CLK_SUN8I_H3
 
 config CLK_SUN20I_D1
        bool "Clock driver for Allwinner D1"
+       default MACH_SUN8I_R528
        help
          This enables common clock driver support for platforms based
          on Allwinner D1 SoC.
index 519ef602145cd8ce5b8865e245642f6954b1e12e..4d6351bf275771d0d3ed7b56426ff5d71e0f3b22 100644 (file)
@@ -707,6 +707,7 @@ static const struct udevice_id sunxi_mmc_ids[] = {
        { .compatible = "allwinner,sun50i-h6-emmc" },
        { .compatible = "allwinner,sun50i-a100-mmc" },
        { .compatible = "allwinner,sun50i-a100-emmc" },
+       { .compatible = "allwinner,sun20i-d1-mmc" },
        { /* sentinel */ }
 };
 
index c8f937d91e99e6c88cdbe8a9cf122fcd90c07477..cbd61795986b1fe5afaba54a6f3372fadbd676fe 100644 (file)
@@ -126,6 +126,7 @@ config PINCTRL_SUN50I_H616_R
 
 config PINCTRL_SUN20I_D1
        bool "Support for the Allwinner D1/R528 PIO"
+       default MACH_SUN8I_R528
        select PINCTRL_SUNXI
 
 endif