]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sunxi: SPL SPI: Add SPI boot support for the Allwinner H616 SoC
authorAndre Przywara <andre.przywara@arm.com>
Sun, 13 Dec 2020 20:19:43 +0000 (20:19 +0000)
committerAndre Przywara <andre.przywara@arm.com>
Tue, 18 Oct 2022 07:15:59 +0000 (08:15 +0100)
The H616 SoC uses the same SPI IP as the H6, also shares the same clocks
and reset bits.
The only real difference is a slight change in the pin assignment: the
H6 uses PC5, the H616 PC4 instead. This makes for a small change in
our spi0_pinmux_setup() routine.

Apart from that, just extend the H6 #ifdef guards to also cover the H616,
using the shared CONFIG_SUN50I_GEN_H6 symbol.
Also use this symbol for the Kconfig dependency.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
Tested-by: Ivan Shishkin <s45rus@gmail.com>
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/spl_spi_sunxi.c

index 5712576184424943a549494110f27894b9362029..6b16f43494f592965d06132a0a3545ecb810fc8a 100644 (file)
@@ -998,7 +998,7 @@ config SPL_STACK_R_ADDR
 
 config SPL_SPI_SUNXI
        bool "Support for SPI Flash on Allwinner SoCs in SPL"
-       depends on MACH_SUN4I || MACH_SUN5I || MACH_SUN7I || MACH_SUNXI_H3_H5 || MACH_SUN50I || MACH_SUN8I_R40 || MACH_SUN50I_H6 || MACH_SUNIV
+       depends on MACH_SUN4I || MACH_SUN5I || MACH_SUN7I || MACH_SUNXI_H3_H5 || MACH_SUN50I || MACH_SUN8I_R40 || SUN50I_GEN_H6 || MACH_SUNIV
        help
          Enable support for SPI Flash. This option allows SPL to read from
          sunxi SPI Flash. It uses the same method as the boot ROM, so does
index 925bf85f2d27a17a257c7d4cb1b4c21097ffcecc..520f14e51558f8a92d461236cda81f16813ca04b 100644 (file)
@@ -78,7 +78,7 @@
 
 #define CCM_AHB_GATING0             (0x01C20000 + 0x60)
 #define CCM_H6_SPI_BGR_REG          (0x03001000 + 0x96c)
-#ifdef CONFIG_MACH_SUN50I_H6
+#ifdef CONFIG_SUN50I_GEN_H6
 #define CCM_SPI0_CLK                (0x03001000 + 0x940)
 #else
 #define CCM_SPI0_CLK                (0x01C20000 + 0xA0)
@@ -97,7 +97,7 @@
 /*
  * Allwinner A10/A20 SoCs were using pins PC0,PC1,PC2,PC23 for booting
  * from SPI Flash, everything else is using pins PC0,PC1,PC2,PC3.
- * The H6 uses PC0, PC2, PC3, PC5.
+ * The H6 uses PC0, PC2, PC3, PC5, the H616 PC0, PC2, PC3, PC4.
  */
 static void spi0_pinmux_setup(unsigned int pin_function)
 {
@@ -105,11 +105,14 @@ static void spi0_pinmux_setup(unsigned int pin_function)
        sunxi_gpio_set_cfgpin(SUNXI_GPC(0), pin_function);
        sunxi_gpio_set_cfgpin(SUNXI_GPC(2), pin_function);
 
-       /* All chips except H6 use PC1, and only H6 uses PC5. */
-       if (!IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       /* All chips except H6 and H616 use PC1. */
+       if (!IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                sunxi_gpio_set_cfgpin(SUNXI_GPC(1), pin_function);
-       else
+
+       if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
                sunxi_gpio_set_cfgpin(SUNXI_GPC(5), pin_function);
+       if (IS_ENABLED(CONFIG_MACH_SUN50I_H616))
+               sunxi_gpio_set_cfgpin(SUNXI_GPC(4), pin_function);
 
        /* Older generations use PC23 for CS, newer ones use PC3. */
        if (IS_ENABLED(CONFIG_MACH_SUN4I) || IS_ENABLED(CONFIG_MACH_SUN7I) ||
@@ -122,7 +125,7 @@ static void spi0_pinmux_setup(unsigned int pin_function)
 static bool is_sun6i_gen_spi(void)
 {
        return IS_ENABLED(CONFIG_SUNXI_GEN_SUN6I) ||
-              IS_ENABLED(CONFIG_MACH_SUN50I_H6);
+              IS_ENABLED(CONFIG_SUN50I_GEN_H6);
 }
 
 static uintptr_t spi0_base_address(void)
@@ -130,7 +133,7 @@ static uintptr_t spi0_base_address(void)
        if (IS_ENABLED(CONFIG_MACH_SUN8I_R40))
                return 0x01C05000;
 
-       if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                return 0x05010000;
 
        if (!is_sun6i_gen_spi() ||
@@ -148,14 +151,14 @@ static void spi0_enable_clock(void)
        uintptr_t base = spi0_base_address();
 
        /* Deassert SPI0 reset on SUN6I */
-       if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                setbits_le32(CCM_H6_SPI_BGR_REG, (1U << 16) | 0x1);
        else if (is_sun6i_gen_spi())
                setbits_le32(SUN6I_BUS_SOFT_RST_REG0,
                             (1 << AHB_RESET_SPI0_SHIFT));
 
        /* Open the SPI0 gate */
-       if (!IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       if (!IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                setbits_le32(CCM_AHB_GATING0, (1 << AHB_GATE_OFFSET_SPI0));
 
        if (IS_ENABLED(CONFIG_MACH_SUNIV)) {
@@ -202,11 +205,11 @@ static void spi0_disable_clock(void)
                writel(0, CCM_SPI0_CLK);
 
        /* Close the SPI0 gate */
-       if (!IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       if (!IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                clrbits_le32(CCM_AHB_GATING0, (1 << AHB_GATE_OFFSET_SPI0));
 
        /* Assert SPI0 reset on SUN6I */
-       if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+       if (IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                clrbits_le32(CCM_H6_SPI_BGR_REG, (1U << 16) | 0x1);
        else if (is_sun6i_gen_spi())
                clrbits_le32(SUN6I_BUS_SOFT_RST_REG0,
@@ -218,7 +221,7 @@ static void spi0_init(void)
        unsigned int pin_function = SUNXI_GPC_SPI0;
 
        if (IS_ENABLED(CONFIG_MACH_SUN50I) ||
-           IS_ENABLED(CONFIG_MACH_SUN50I_H6))
+           IS_ENABLED(CONFIG_SUN50I_GEN_H6))
                pin_function = SUN50I_GPC_SPI0;
        else if (IS_ENABLED(CONFIG_MACH_SUNIV))
                pin_function = SUNIV_GPC_SPI0;