Add board revision check

Signed-off-by: Peng Fan <peng....@nxp.com>
---
 board/freescale/mx7dsabresd/mx7dsabresd.c | 59 ++++++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/board/freescale/mx7dsabresd/mx7dsabresd.c 
b/board/freescale/mx7dsabresd/mx7dsabresd.c
index ecea5a5..07392fa 100644
--- a/board/freescale/mx7dsabresd/mx7dsabresd.c
+++ b/board/freescale/mx7dsabresd/mx7dsabresd.c
@@ -82,6 +82,48 @@ static iomux_v3_cfg_t const uart1_pads[] = {
        MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
+#define BOARD_REV_C  0x300
+#define BOARD_REV_B  0x200
+#define BOARD_REV_A  0x100
+
+static int mx7sabre_rev(void)
+{
+       /*
+        * Get Board ID information from OCOTP_GP1[15:8]
+        * i.MX7D SDB RevA: 0x41
+        * i.MX7D SDB RevB: 0x42
+        */
+       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+       struct fuse_bank *bank = &ocotp->bank[14];
+       int reg = readl(&bank->fuse_regs[0]);
+       int ret;
+
+       if (reg != 0) {
+               switch (reg >> 8 & 0x0F) {
+               case 0x3:
+                       ret = BOARD_REV_C;
+                       break;
+               case 0x02:
+                       ret = BOARD_REV_B;
+                       break;
+               case 0x01:
+               default:
+                       ret = BOARD_REV_A;
+                       break;
+               }
+       } else {
+               /* If the gp1 fuse is not burn, we have to use TO rev for the 
board rev */
+               if (is_soc_rev(CHIP_REV_1_0))
+                       ret = BOARD_REV_A;
+               else if (is_soc_rev(CHIP_REV_1_1))
+                       ret = BOARD_REV_B;
+               else
+                       ret = BOARD_REV_C;
+       }
+
+       return ret;
+}
+
 #ifdef CONFIG_NAND_MXS
 static iomux_v3_cfg_t const gpmi_pads[] = {
        MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
@@ -377,14 +419,29 @@ int board_late_init(void)
 
 int checkboard(void)
 {
+       int rev = mx7sabre_rev();
        char *mode;
+       char *revname;
 
        if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT))
                mode = "secure";
        else
                mode = "non-secure";
 
-       printf("Board: i.MX7D SABRESD in %s mode\n", mode);
+       switch (rev) {
+       case BOARD_REV_C:
+               revname = "C";
+               break;
+       case BOARD_REV_B:
+               revname = "B";
+               break;
+       case BOARD_REV_A:
+       default:
+               revname = "A";
+               break;
+       }
+
+       printf("Board: i.MX7D SABRESD Rev%s in %s mode\n", revname, mode);
 
        return 0;
 }
-- 
2.6.2

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to