]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sunxi: introduce NCAT2 generation model
authorAndre Przywara <andre.przywara@arm.com>
Wed, 5 Oct 2022 16:54:19 +0000 (17:54 +0100)
committerAndre Przywara <andre.przywara@arm.com>
Sun, 22 Oct 2023 22:41:46 +0000 (23:41 +0100)
Allwinner seems to typically stick to a common MMIO memory map for
several SoCs, but from time to time does some breaking changes, which
also introduce new generations of some peripherals. The last time this
happened with the H6, which apart from re-organising the base addresses
also changed the clock controller significantly. We added a
CONFIG_SUN50I_GEN_H6 symbol back then to mark SoCs sharing those traits.

Now the Allwinner D1 changes the memory map again, and also extends the
pincontroller, among other peripherals.
To mark this generation of SoCs, add a CONFIG_SUNXI_GEN_NCAT2 symbol,
this name is reportedly used in the Allwinner BSP code, and prevents us
from inventing our own name.

Add this new symbol to some guards that were already checking for the H6
generation, since many features are shared between the two (like the
renovated clock controller).

This paves the way to introduce a first user of this generation.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Tested-by: Samuel Holland <samuel@sholland.org>
14 files changed:
arch/arm/include/asm/arch-sunxi/clock.h
arch/arm/include/asm/arch-sunxi/cpu.h
arch/arm/include/asm/arch-sunxi/cpu_sunxi_ncat2.h [new file with mode: 0644]
arch/arm/include/asm/arch-sunxi/mmc.h
arch/arm/include/asm/arch-sunxi/prcm.h
arch/arm/include/asm/arch-sunxi/timer.h
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/Makefile
arch/arm/mach-sunxi/board.c
arch/arm/mach-sunxi/clock_sun50i_h6.c
common/spl/Kconfig
drivers/i2c/mvtwsi.c
drivers/mmc/sunxi_mmc.c
include/sunxi_gpio.h

index 2cfd5407423d97ebc351f991db636e8a38492924..3d34261b0e59f5b83aadcb89e97babd50acef717 100644 (file)
@@ -16,7 +16,7 @@
 /* clock control module regs definition */
 #if defined(CONFIG_MACH_SUN8I_A83T)
 #include <asm/arch/clock_sun8i_a83t.h>
-#elif defined(CONFIG_SUN50I_GEN_H6)
+#elif defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
 #include <asm/arch/clock_sun50i_h6.h>
 #elif defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN8I) || \
       defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUNIV)
index b08f2023748c9877e3ed7255f84116859215dae6..768c6572d6b735a46877104314dcc5d9327e3217 100644 (file)
@@ -10,6 +10,8 @@
 #include <asm/arch/cpu_sun9i.h>
 #elif defined(CONFIG_SUN50I_GEN_H6)
 #include <asm/arch/cpu_sun50i_h6.h>
+#elif defined(CONFIG_SUNXI_GEN_NCAT2)
+#include <asm/arch/cpu_sunxi_ncat2.h>
 #else
 #include <asm/arch/cpu_sun4i.h>
 #endif
diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sunxi_ncat2.h b/arch/arm/include/asm/arch-sunxi/cpu_sunxi_ncat2.h
new file mode 100644 (file)
index 0000000..ca92c39
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * (C) Copyright 2022 Arm Limited
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _SUNXI_CPU_SUNXI_NCAT2_H
+#define _SUNXI_CPU_SUNXI_NCAT2_H
+
+#define SUNXI_CCM_BASE                 0x02001000
+#define SUNXI_TIMER_BASE               0x02050000
+
+#define SUNXI_UART0_BASE               0x02500000
+#define SUNXI_UART1_BASE               0x02500400
+#define SUNXI_UART2_BASE               0x02500800
+#define SUNXI_UART3_BASE               0x02500C00
+#define SUNXI_TWI0_BASE                        0x02502000
+#define SUNXI_TWI1_BASE                        0x02502400
+#define SUNXI_TWI2_BASE                        0x02502800
+#define SUNXI_TWI3_BASE                        0x02502C00
+
+#define SUNXI_SRAMC_BASE               0x03000000
+/* SID address space starts at 0x03006000, but e-fuse is at offset 0x200 */
+#define SUNXI_SIDC_BASE                        0x03006000
+#define SUNXI_SID_BASE                 0x03006200
+#define SUNXI_GIC400_BASE              0x03020000
+
+#define SUNXI_MMC0_BASE                        0x04020000
+#define SUNXI_MMC1_BASE                        0x04021000
+#define SUNXI_MMC2_BASE                        0x04022000
+
+#define SUNXI_R_CPUCFG_BASE            0x07000400
+#define SUNXI_PRCM_BASE                        0x07010000
+
+#define SUNXI_CPUCFG_BASE              0x09010000
+
+#ifndef __ASSEMBLY__
+void sunxi_board_init(void);
+void sunxi_reset(void);
+int sunxi_get_sid(unsigned int *sid);
+#endif
+
+#endif /* _SUNXI_CPU_SUNXI_NCAT2_H */
index 5daacf10eb1049cf46b02fdeb57295d1687fdce8..8ed3e0459c9ba4f644912480ebba7ca1da20a55c 100644 (file)
@@ -45,7 +45,7 @@ struct sunxi_mmc {
        u32 chda;               /* 0x90 */
        u32 cbda;               /* 0x94 */
        u32 res2[26];
-#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
+#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
        u32 res3[17];
        u32 samp_dl;
        u32 res4[46];
index 5106076f5e912bb34bd5ca59c95621b0195eb552..c5418cfd28d484d2e3100fef26c461b7a5945dc6 100644 (file)
@@ -9,7 +9,7 @@
 #define _SUNXI_PRCM_H
 
 /* prcm regs definition */
-#if defined(CONFIG_SUN50I_GEN_H6)
+#if defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
 #include <asm/arch/prcm_sun50i.h>
 #else
 #include <asm/arch/prcm_sun6i.h>
index bb5626d893bb0798e8949261cf626c7a6e05c397..e17db8588e266f6cb52b962951b99298e2d7e9a5 100644 (file)
@@ -76,7 +76,7 @@ struct sunxi_timer_reg {
        struct sunxi_tgp tgp[4];
        u8 res5[8];
        u32 cpu_cfg;
-#elif defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
+#elif defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
        u8 res3[16];
        struct sunxi_wdog wdog[5];      /* We have 5 watchdogs */
 #endif
index d3ed62add99ca51b7cd2b34cf96836225abd9cc5..6ba9ed2bb2aa4e6da33ad0dac2ae3ae8d3d3f0c3 100644 (file)
@@ -121,7 +121,7 @@ config AXP_PMIC_BUS
 config SUNXI_SRAM_ADDRESS
        hex
        default 0x10000 if MACH_SUN9I || MACH_SUN50I || MACH_SUN50I_H5
-       default 0x20000 if SUN50I_GEN_H6
+       default 0x20000 if SUN50I_GEN_H6 || SUNXI_GEN_NCAT2
        default 0x0
        ---help---
        Older Allwinner SoCs have their mask boot ROM mapped just below 4GB,
@@ -183,6 +183,14 @@ config SUN50I_GEN_H6
        Select this for sunxi SoCs which have H6 like peripherals, clocks
        and memory map.
 
+config SUNXI_GEN_NCAT2
+       bool
+       select MMC_SUNXI_HAS_NEW_MODE
+       select SUPPORT_SPL
+       ---help---
+       Select this for sunxi SoCs which have D1 like peripherals, clocks
+       and memory map.
+
 config SUNXI_DRAM_DW
        bool
        ---help---
@@ -804,6 +812,7 @@ config VIDEO_SUNXI
        depends on !MACH_SUN9I
        depends on !MACH_SUN50I
        depends on !SUN50I_GEN_H6
+       depends on !SUNXI_GEN_NCAT2
        select VIDEO
        select DISPLAY
        imply VIDEO_DT_SIMPLEFB
@@ -1017,6 +1026,7 @@ config SPL_STACK_R_ADDR
        default 0x2fe00000 if MACH_SUN9I
        default 0x4fe00000 if MACH_SUN50I
        default 0x4fe00000 if SUN50I_GEN_H6
+       default 0x4fe00000 if SUNXI_GEN_NCAT2
 
 config SPL_SPI_SUNXI
        bool "Support for SPI Flash on Allwinner SoCs in SPL"
index 671211e93224863ca72b597ceceddfb92773663d..1d4c70ec3521c1fe40351a172c00b058c055e65f 100644 (file)
@@ -25,6 +25,7 @@ obj-$(CONFIG_MACH_SUN8I)      += clock_sun6i.o
 endif
 obj-$(CONFIG_MACH_SUN9I)       += clock_sun9i.o gtbus_sun9i.o
 obj-$(CONFIG_SUN50I_GEN_H6)    += clock_sun50i_h6.o
+obj-$(CONFIG_SUNXI_GEN_NCAT2)  += clock_sun50i_h6.o
 ifndef CONFIG_ARM64
 obj-y  += timer.o
 endif
index 4a1a0eacdba484f36fb6e57c81d8811b6e7dc46b..d572314f0da0288a3b50fa2129d0ddd58a4c0427 100644 (file)
@@ -176,13 +176,19 @@ static int gpio_init(void)
 #error Unsupported console port number. Please fix pin mux settings in board.c
 #endif
 
-#ifdef CONFIG_SUN50I_GEN_H6
-       /* Update PIO power bias configuration by copy hardware detected value */
-       val = readl(SUNXI_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_VAL);
-       writel(val, SUNXI_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_SEL);
-       val = readl(SUNXI_R_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_VAL);
-       writel(val, SUNXI_R_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_SEL);
-#endif
+       /*
+        * Update PIO power bias configuration by copying the hardware
+        * detected value.
+        */
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6) ||
+           IS_ENABLED(CONFIG_SUN50I_GEN_NCAT2)) {
+               val = readl(SUNXI_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_VAL);
+               writel(val, SUNXI_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_SEL);
+       }
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6)) {
+               val = readl(SUNXI_R_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_VAL);
+               writel(val, SUNXI_R_PIO_BASE + SUN50I_H6_GPIO_POW_MOD_SEL);
+       }
 
        return 0;
 }
@@ -481,7 +487,7 @@ void reset_cpu(void)
                /* sun5i sometimes gets stuck without this */
                writel(WDT_MODE_RESET_EN | WDT_MODE_EN, &wdog->mode);
        }
-#elif defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
+#elif defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
 #if defined(CONFIG_MACH_SUN50I_H6)
        /* WDOG is broken for some H6 rev. use the R_WDOG instead */
        static const struct sunxi_wdog *wdog =
index 7926394cf7624284255f6fe9e2ab71907141e0fa..767a39fa2ab51fef0a6bf073b7df9e3f3294b90e 100644 (file)
@@ -18,8 +18,11 @@ void clock_init_safe(void)
                setbits_le32(&prcm->res_cal_ctrl, 2);
        }
 
-       clrbits_le32(&prcm->res_cal_ctrl, 1);
-       setbits_le32(&prcm->res_cal_ctrl, 1);
+       if (IS_ENABLED(CONFIG_MACH_SUN50I_H616) ||
+           IS_ENABLED(CONFIG_MACH_SUN50I_H6)) {
+               clrbits_le32(&prcm->res_cal_ctrl, 1);
+               setbits_le32(&prcm->res_cal_ctrl, 1);
+       }
 
        if (IS_ENABLED(CONFIG_MACH_SUN50I_H6)) {
                /* set key field for ldo enable */
index 6bc4066fad7a055bf8b6d7eb3157e9ccc55a740a..f7c8ba511b3f75b889490c1f9012960f35c36df5 100644 (file)
@@ -265,7 +265,7 @@ config SPL_TEXT_BASE
        default 0x402F0400 if AM33XX
        default 0x40301350 if OMAP54XX
        default 0x10060 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN9I
-       default 0x20060 if SUN50I_GEN_H6
+       default 0x20060 if SUN50I_GEN_H6 || SUNXI_GEN_NCAT2
        default 0x00060 if ARCH_SUNXI
        default 0xfffc0000 if ARCH_ZYNQMP
        default 0x0
index 14cdb0f663512e34aebe921160626384eeebca54..c38330f758a9fc6c52365db2d670e2a356333daa 100644 (file)
@@ -124,7 +124,8 @@ enum mvtwsi_ctrl_register_fields {
  * on other platforms, it is a normal r/w bit, which is cleared by writing 0.
  */
 
-#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
+#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6) || \
+    defined(CONFIG_SUNXI_GEN_NCAT2)
 #define        MVTWSI_CONTROL_CLEAR_IFLG       0x00000008
 #else
 #define        MVTWSI_CONTROL_CLEAR_IFLG       0x00000000
index 03e33753fcf915eafff4fd8248925d5b157beaab..519ef602145cd8ce5b8865e245642f6954b1e12e 100644 (file)
@@ -57,6 +57,7 @@ static bool sunxi_mmc_can_calibrate(void)
        return IS_ENABLED(CONFIG_MACH_SUN50I) ||
               IS_ENABLED(CONFIG_MACH_SUN50I_H5) ||
               IS_ENABLED(CONFIG_SUN50I_GEN_H6) ||
+              IS_ENABLED(CONFIG_SUNXI_GEN_NCAT2) ||
               IS_ENABLED(CONFIG_MACH_SUN8I_R40);
 }
 
@@ -191,7 +192,7 @@ static int mmc_config_clock(struct sunxi_mmc_priv *priv, struct mmc *mmc)
        rval &= ~SUNXI_MMC_CLK_DIVIDER_MASK;
        writel(rval, &priv->reg->clkcr);
 
-#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
+#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6) || defined(CONFIG_SUNXI_GEN_NCAT2)
        /* A64 supports calibration of delays on MMC controller and we
         * have to set delay of zero before starting calibration.
         * Allwinner BSP driver sets a delay only in the case of
@@ -544,7 +545,7 @@ struct mmc *sunxi_mmc_init(int sdc_no)
 
        /* config ahb clock */
        debug("init mmc %d clock and io\n", sdc_no);
-#if !defined(CONFIG_SUN50I_GEN_H6)
+#if !defined(CONFIG_SUN50I_GEN_H6) && !defined(CONFIG_SUNXI_GEN_NCAT2)
        setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MMC(sdc_no));
 
 #ifdef CONFIG_SUNXI_GEN_SUN6I
@@ -619,7 +620,7 @@ static unsigned get_mclk_offset(void)
        if (IS_ENABLED(CONFIG_MACH_SUN9I_A80))
                return 0x410;
 
-       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6))
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6) || IS_ENABLED(CONFIG_SUNXI_GEN_NCAT2))
                return 0x830;
 
        return 0x88;
index 30d8879dbd3730fb853ed106f8cc8c9e76d1b8c4..db3742c039703e68c2e1883f9937b47f7475bf05 100644 (file)
@@ -19,6 +19,9 @@
 #elif defined(CONFIG_SUN50I_GEN_H6)
 #define SUNXI_PIO_BASE         0x0300b000
 #define SUNXI_R_PIO_BASE       0x07022000
+#elif defined(CONFIG_SUNXI_GEN_NCAT2)
+#define SUNXI_PIO_BASE         0x02000000
+#define SUNXI_R_PIO_BASE       0x07022000
 #else
 #define SUNXI_PIO_BASE         0x01c20800
 #define SUNXI_R_PIO_BASE       0x01f02c00