]> git.sur5r.net Git - u-boot/commitdiff
mx6qsabreauto: Pass the board revision to the kernel
authorFabio Estevam <fabio.estevam@freescale.com>
Tue, 2 Oct 2012 11:20:12 +0000 (11:20 +0000)
committerStefano Babic <sbabic@denx.de>
Tue, 16 Oct 2012 10:35:11 +0000 (12:35 +0200)
The kernel from Freescale expects that the bootloader passes the board revision.

Read the board revision and pass it via get_board_rev().

Without passing the board revision the kernel does not operate properly as the
initialization of peripherals are different in revA versus revB boards.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
arch/arm/include/asm/arch-mx6/imx-regs.h
board/freescale/mx6qsabreauto/mx6qsabreauto.c

index dc737ba12721999206ceaae34dd4cae36ee06c87..09ab010138b965950fb45679e84f5bad8ac36908 100644 (file)
@@ -200,6 +200,12 @@ struct src {
        u32     gpr10;
 };
 
+/* OCOTP Registers */
+struct ocotp_regs {
+       u32     reserved[0x198];
+       u32     gp1;    /* 0x660 */
+};
+
 /* GPR3 bitfields */
 #define IOMUXC_GPR3_GPU_DBG_OFFSET             29
 #define IOMUXC_GPR3_GPU_DBG_MASK               (3<<IOMUXC_GPR3_GPU_DBG_OFFSET)
index 17ff8ffcaf9502e281d20ff150aadfc58f679660..bd87901f4aa988d8fb8d3d7b7698e641425c7b50 100644 (file)
@@ -30,6 +30,8 @@
 #include <fsl_esdhc.h>
 #include <miiphy.h>
 #include <netdev.h>
+#include <asm/arch/sys_proto.h>
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
@@ -165,9 +167,38 @@ int board_eth_init(bd_t *bis)
        return 0;
 }
 
+#define BOARD_REV_B  0x200
+#define BOARD_REV_A  0x100
+
+static int mx6sabre_rev(void)
+{
+       /*
+        * Get Board ID information from OCOTP_GP1[15:8]
+        * i.MX6Q ARD RevA: 0x01
+        * i.MX6Q ARD RevB: 0x02
+        */
+       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+       int reg = readl(&ocotp->gp1);
+       int ret;
+
+       switch (reg >> 8 & 0x0F) {
+       case 0x02:
+               ret = BOARD_REV_B;
+               break;
+       case 0x01:
+       default:
+               ret = BOARD_REV_A;
+               break;
+       }
+
+       return ret;
+}
+
 u32 get_board_rev(void)
 {
-       return 0x63000;
+       int rev = mx6sabre_rev();
+
+       return (get_cpu_rev() & ~(0xF << 8)) | rev;
 }
 
 int board_early_init_f(void)
@@ -187,7 +218,20 @@ int board_init(void)
 
 int checkboard(void)
 {
-       puts("Board: MX6Q-Sabreauto\n");
+       int rev = mx6sabre_rev();
+       char *revname;
+
+       switch (rev) {
+       case BOARD_REV_B:
+               revname = "B";
+               break;
+       case BOARD_REV_A:
+       default:
+               revname = "A";
+               break;
+       }
+
+       printf("Board: MX6Q-Sabreauto rev%s\n", revname);
 
        return 0;
 }