|
@@ -214,6 +214,52 @@ int cpu_eth_init(bd_t *bis)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static void __mx28_adjust_mac(int dev_id, unsigned char *mac)
|
|
|
+{
|
|
|
+ mac[0] = 0x00;
|
|
|
+ mac[1] = 0x04; /* Use FSL vendor MAC address by default */
|
|
|
+
|
|
|
+ if (dev_id == 1) /* Let MAC1 be MAC0 + 1 by default */
|
|
|
+ mac[5] += 1;
|
|
|
+}
|
|
|
+
|
|
|
+void mx28_adjust_mac(int dev_id, unsigned char *mac)
|
|
|
+ __attribute__((weak, alias("__mx28_adjust_mac")));
|
|
|
+
|
|
|
+#ifdef CONFIG_MX28_FEC_MAC_IN_OCOTP
|
|
|
+
|
|
|
+#define MXS_OCOTP_MAX_TIMEOUT 1000000
|
|
|
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
|
|
|
+{
|
|
|
+ struct mx28_ocotp_regs *ocotp_regs =
|
|
|
+ (struct mx28_ocotp_regs *)MXS_OCOTP_BASE;
|
|
|
+ uint32_t data;
|
|
|
+
|
|
|
+ memset(mac, 0, 6);
|
|
|
+
|
|
|
+ writel(OCOTP_CTRL_RD_BANK_OPEN, &ocotp_regs->hw_ocotp_ctrl_set);
|
|
|
+
|
|
|
+ if (mx28_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY,
|
|
|
+ MXS_OCOTP_MAX_TIMEOUT)) {
|
|
|
+ printf("MXS FEC: Can't get MAC from OCOTP\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = readl(&ocotp_regs->hw_ocotp_cust0);
|
|
|
+
|
|
|
+ mac[2] = (data >> 24) & 0xff;
|
|
|
+ mac[3] = (data >> 16) & 0xff;
|
|
|
+ mac[4] = (data >> 8) & 0xff;
|
|
|
+ mac[5] = data & 0xff;
|
|
|
+ mx28_adjust_mac(dev_id, mac);
|
|
|
+}
|
|
|
+#else
|
|
|
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
|
|
|
+{
|
|
|
+ memset(mac, 0, 6);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
U_BOOT_CMD(
|
|
|
clocks, CONFIG_SYS_MAXARGS, 1, do_mx28_showclocks,
|
|
|
"display clocks",
|