imx: refactor imx_get_mac_from_fuse
authorPeng Fan <peng.fan@nxp.com>
Wed, 10 Jan 2018 05:20:31 +0000 (13:20 +0800)
committerStefano Babic <sbabic@denx.de>
Sun, 4 Feb 2018 11:00:58 +0000 (12:00 +0100)
Move imx_get_mac_from_fuse to a new mac.c for i.MX6/7.
Since fuse regs structure are different for i.MX6/7, use mac
address offset in code and define a new local struture
imx_mac_fuse.

Also sort the config order.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Reviewed-by: Stefano Babic <sbabic@denx.de>
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/mac.c [new file with mode: 0644]
arch/arm/mach-imx/mx6/soc.c
arch/arm/mach-imx/mx7/soc.c

index 63db0e15c4db3e15c7fc4c378f3a8bb0be10cae9..714b858e7324b5e2ad7e8360384fe9ee8e74dca4 100644 (file)
@@ -25,12 +25,13 @@ obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
 endif
 ifeq ($(SOC),$(filter $(SOC),mx6 mx7))
 obj-y  += cache.o init.o
-obj-$(CONFIG_SATA) += sata.o
+obj-$(CONFIG_FEC_MXC) += mac.o
 obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
 obj-$(CONFIG_IMX_RDC) += rdc-sema.o
 ifneq ($(CONFIG_SPL_BUILD),y)
 obj-$(CONFIG_IMX_BOOTAUX) += imx_bootaux.o
 endif
+obj-$(CONFIG_SATA) += sata.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
 obj-$(CONFIG_SYSCOUNTER_TIMER) += syscounter.o
 endif
diff --git a/arch/arm/mach-imx/mac.c b/arch/arm/mach-imx/mac.c
new file mode 100644 (file)
index 0000000..dd7fd92
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <errno.h>
+
+struct imx_mac_fuse {
+       u32 mac_addr0;
+       u32 rsvd0[3];
+       u32 mac_addr1;
+       u32 rsvd1[3];
+       u32 mac_addr2;
+       u32 rsvd2[7];
+};
+
+#define MAC_FUSE_MX6_OFFSET    0x620
+#define MAC_FUSE_MX7_OFFSET    0x640
+
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
+{
+       struct imx_mac_fuse *fuse;
+       u32 offset;
+       bool has_second_mac;
+
+       offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET;
+       fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset);
+       has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull();
+
+       if (has_second_mac && dev_id == 1) {
+               u32 value = readl(&fuse->mac_addr2);
+
+               mac[0] = value >> 24;
+               mac[1] = value >> 16;
+               mac[2] = value >> 8;
+               mac[3] = value;
+
+               value = readl(&fuse->mac_addr1);
+               mac[4] = value >> 24;
+               mac[5] = value >> 16;
+
+       } else {
+               u32 value = readl(&fuse->mac_addr1);
+
+               mac[0] = value >> 8;
+               mac[1] = value;
+
+               value = readl(&fuse->mac_addr0);
+               mac[2] = value >> 24;
+               mac[3] = value >> 16;
+               mac[4] = value >> 8;
+               mac[5] = value;
+       }
+}
index 43cb58106b92b694137a9b14b766d37f282d3d18..b3bee58f10d9e465ced3eec2dca43a3d68e858d4 100644 (file)
@@ -518,40 +518,6 @@ int board_postclk_init(void)
        return 0;
 }
 
-#if defined(CONFIG_FEC_MXC)
-void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
-{
-       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-       struct fuse_bank *bank = &ocotp->bank[4];
-       struct fuse_bank4_regs *fuse =
-                       (struct fuse_bank4_regs *)bank->fuse_regs;
-
-       if ((is_mx6sx() || is_mx6ul() || is_mx6ull()) && dev_id == 1) {
-               u32 value = readl(&fuse->mac_addr2);
-               mac[0] = value >> 24 ;
-               mac[1] = value >> 16 ;
-               mac[2] = value >> 8 ;
-               mac[3] = value ;
-
-               value = readl(&fuse->mac_addr1);
-               mac[4] = value >> 24 ;
-               mac[5] = value >> 16 ;
-               
-       } else {
-               u32 value = readl(&fuse->mac_addr1);
-               mac[0] = (value >> 8);
-               mac[1] = value ;
-
-               value = readl(&fuse->mac_addr0);
-               mac[2] = value >> 24 ;
-               mac[3] = value >> 16 ;
-               mac[4] = value >> 8 ;
-               mac[5] = value ;
-       }
-
-}
-#endif
-
 #ifndef CONFIG_SPL_BUILD
 /*
  * cfg_val will be used for
index 032dfcf2ce9aec589022279df23dc9cbcc896a12..10dec8bdf4bcfb6413ce6075ae7778cc25e76620 100644 (file)
@@ -208,38 +208,6 @@ void get_board_serial(struct tag_serialnr *serialnr)
 }
 #endif
 
-#if defined(CONFIG_FEC_MXC)
-void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
-{
-       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-       struct fuse_bank *bank = &ocotp->bank[9];
-       struct fuse_bank9_regs *fuse =
-               (struct fuse_bank9_regs *)bank->fuse_regs;
-
-       if (0 == dev_id) {
-               u32 value = readl(&fuse->mac_addr1);
-               mac[0] = (value >> 8);
-               mac[1] = value;
-
-               value = readl(&fuse->mac_addr0);
-               mac[2] = value >> 24;
-               mac[3] = value >> 16;
-               mac[4] = value >> 8;
-               mac[5] = value;
-       } else {
-               u32 value = readl(&fuse->mac_addr2);
-               mac[0] = value >> 24;
-               mac[1] = value >> 16;
-               mac[2] = value >> 8;
-               mac[3] = value;
-
-               value = readl(&fuse->mac_addr1);
-               mac[4] = value >> 24;
-               mac[5] = value >> 16;
-       }
-}
-#endif
-
 #ifdef CONFIG_IMX_BOOTAUX
 int arch_auxiliary_core_up(u32 core_id, u32 boot_private_data)
 {