sunxi: A23: Fix some revisions needing a different magic sram poke
authorHans de Goede <hdegoede@redhat.com>
Fri, 4 Mar 2016 09:57:34 +0000 (10:57 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 23 Mar 2016 21:04:13 +0000 (22:04 +0100)
I've had this one a23 tablet which would not boot and I've finally
figured out what the problem is by looking at the released boot0 code,
it seems the magic sram controller poke which we need to do in s_init()
depends on the revision of the a23.

Specifically this change is needed to get the A23 SoC I have with the
following serial to boot: "E6071AB 26Y7".

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
arch/arm/cpu/armv7/sunxi/board.c

index eb5f4b686ea7416f02cb9377d2e4d78413ad350e..e80785ba5663231558bbd2b99ddf350277c0d60c 100644 (file)
@@ -113,11 +113,27 @@ int spl_board_load_image(void)
 
 void s_init(void)
 {
-#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I_A23
-       /* Magic (undocmented) value taken from boot0, without this DRAM
-        * access gets messed up (seems cache related) */
+       /*
+        * Undocumented magic taken from boot0, without this DRAM
+        * access gets messed up (seems cache related).
+        * The boot0 sources describe this as: "config ema for cache sram"
+        */
+#if defined CONFIG_MACH_SUN6I
        setbits_le32(SUNXI_SRAMC_BASE + 0x44, 0x1800);
+#elif defined CONFIG_MACH_SUN8I_A23
+       uint version;
+
+       /* Unlock sram version info reg, read it, relock */
+       setbits_le32(SUNXI_SRAMC_BASE + 0x24, (1 << 15));
+       version = readl(SUNXI_SRAMC_BASE + 0x24);
+       clrbits_le32(SUNXI_SRAMC_BASE + 0x24, (1 << 15));
+
+       if ((version & 0xffff0000) == 0x16500000)
+               setbits_le32(SUNXI_SRAMC_BASE + 0x44, 0x1800);
+       else /* 0x1661 ? */
+               setbits_le32(SUNXI_SRAMC_BASE + 0x44, 0xc0);
 #endif
+
 #if defined CONFIG_MACH_SUN6I || \
     defined CONFIG_MACH_SUN7I || \
     defined CONFIG_MACH_SUN8I