]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
imx: Get fec mac address from fuse
authorLiu Hui-R64343 <r64343@freescale.com>
Thu, 18 Nov 2010 23:45:55 +0000 (23:45 +0000)
committerStefano Babic <sbabic@denx.de>
Sun, 21 Nov 2010 17:24:20 +0000 (18:24 +0100)
The patch is to support getting FEC MAC address from fuse bank.

Signed-off-by: Jason Liu <r64343@freescale.com>
Tested-by: Stefano Babic <sbabic@denx.de>
arch/arm/cpu/arm926ejs/mx25/generic.c
arch/arm/cpu/arm926ejs/mx27/generic.c
arch/arm/cpu/armv7/mx5/soc.c
arch/arm/include/asm/arch-mx25/imx-regs.h
arch/arm/include/asm/arch-mx27/imx-regs.h
arch/arm/include/asm/arch-mx5/imx-regs.h
drivers/net/fec_mxc.c

index b80a389ed9e2af5be5775b999f7ac9ca10faf2fd..c6e114634aba58d5c4c064323bd2a77d054d12c2 100644 (file)
@@ -260,4 +260,16 @@ void mx25_fec_init_pins (void)
        writel (outpadctl, &padctl->pad_fec_tdata1);
 
 }
+
+void imx_get_mac_from_fuse(unsigned char *mac)
+{
+       int i;
+       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
+       struct fuse_bank *bank = &iim->bank[0];
+       struct fuse_bank0_regs *fuse =
+                       (struct fuse_bank0_regs *)bank->fuse_regs;
+
+       for (i = 0; i < 6; i++)
+               mac[i] = readl(&fuse->mac_addr[i]) & 0xff;
+}
 #endif /* CONFIG_FEC_MXC */
index ae2ce5841c73bc12fafd971252fd12ab2c8375b2..27642bfe7dba8a804d21bbbc555c7751d9bb366b 100644 (file)
@@ -313,6 +313,18 @@ void mx27_fec_init_pins(void)
        for (i = 0; i < ARRAY_SIZE(mode); i++)
                imx_gpio_mode(mode[i]);
 }
+
+void imx_get_mac_from_fuse(unsigned char *mac)
+{
+       int i;
+       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
+       struct fuse_bank *bank = &iim->bank[0];
+       struct fuse_bank0_regs *fuse =
+                       (struct fuse_bank0_regs *)bank->fuse_regs;
+
+       for (i = 0; i < 6; i++)
+               mac[6 - 1 - i] = readl(&fuse->mac_addr[i]) & 0xff;
+}
 #endif /* CONFIG_FEC_MXC */
 
 #ifdef CONFIG_MXC_MMC
index 7c7a565665f5c644ee3a2421731a08f526e1b671..290011923eaf35699ddc9437f639702bf167de4b 100644 (file)
@@ -100,6 +100,20 @@ int cpu_eth_init(bd_t *bis)
        return rc;
 }
 
+#if defined(CONFIG_FEC_MXC)
+void imx_get_mac_from_fuse(unsigned char *mac)
+{
+       int i;
+       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
+       struct fuse_bank *bank = &iim->bank[1];
+       struct fuse_bank1_regs *fuse =
+                       (struct fuse_bank1_regs *)bank->fuse_regs;
+
+       for (i = 0; i < 6; i++)
+               mac[i] = readl(&fuse->mac_addr[i]) & 0xff;
+}
+#endif
+
 /*
  * Initializes on-chip MMC controllers.
  * to override, implement board_mmc_init()
index f5a2929e2209bf522fe156328232d67329393a23..55ad115a76fb43ae5ba186dff5f608cd6517988c 100644 (file)
@@ -36,6 +36,7 @@
 #ifndef __ASSEMBLY__
 #ifdef CONFIG_FEC_MXC
 extern void mx25_fec_init_pins(void);
+extern void imx_get_mac_from_fuse(unsigned char *mac);
 #endif
 
 /* Clock Control Module (CCM) registers */
@@ -129,12 +130,17 @@ struct iim_regs {
        u32 iim_srev;
        u32 iim_prog_p;
        u32 res1[0x1f5];
-       u32 iim_bank_area0[0x20];
-       u32 res2[0xe0];
-       u32 iim_bank_area1[0x20];
-       u32 res3[0xe0];
-       u32 iim_bank_area2[0x20];
+       struct fuse_bank {
+               u32 fuse_regs[0x20];
+               u32 fuse_rsvd[0xe0];
+       } bank[3];
 };
+
+struct fuse_bank0_regs {
+       u32 fuse0_25[0x1a];
+       u32 mac_addr[6];
+};
+
 #endif
 
 /* AIPS 1 */
@@ -312,7 +318,4 @@ struct iim_regs {
 #define WSR_UNLOCK1            0x5555
 #define WSR_UNLOCK2            0xAAAA
 
-/* FUSE bank offsets */
-#define IIM0_MAC               0x1a
-
 #endif                         /* _IMX_REGS_H */
index 6ecddaae8571a64304bed33410789e6b60330c96..8f40aa728c8017e621352a75906f7886d242290d 100644 (file)
@@ -34,6 +34,7 @@ extern void mx27_uart_init_pins(void);
 
 #ifdef CONFIG_FEC_MXC
 extern void mx27_fec_init_pins(void);
+extern void imx_get_mac_from_fuse(unsigned char *mac);
 #endif /* CONFIG_FEC_MXC */
 
 #ifdef CONFIG_MXC_MMC
@@ -202,9 +203,19 @@ struct iim_regs {
        u32 iim_scs1;
        u32 iim_scs2;
        u32 iim_scs3;
-       u32 res[0x1F0];
-       u32 iim_bank_area0[0x100];
+       u32 res[0x1f1];
+       struct fuse_bank {
+               u32 fuse_regs[0x20];
+               u32 fuse_rsvd[0xe0];
+       } bank[1];
 };
+
+struct fuse_bank0_regs {
+       u32 fuse0_3[5];
+       u32 mac_addr[6];
+       u32 fuse10_31[0x16];
+};
+
 #endif
 
 #define IMX_IO_BASE            0x10000000
@@ -512,9 +523,4 @@ struct iim_regs {
 #define IIM_ERR_SNSE   (1 << 2)
 #define IIM_ERR_PARITYE        (1 << 1)
 
-/* Definitions for i.MX27 TO2 */
-#define IIM0_MAC               5
-#define IIM0_SCC_KEY           11
-#define IIM1_SUID              1
-
 #endif                         /* _IMX_REGS_H */
index 0b6249a9b8bbbf024fe1923b6061340a8360a05d..b45026d175fc373b7573d9a0bfc2bfbd834d0d2f 100644 (file)
 #define BOARD_REV_1_0           0x0
 #define BOARD_REV_2_0           0x1
 
+#define IMX_IIM_BASE            (IIM_BASE_ADDR)
+
 #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
 #include <asm/types.h>
 
+extern void imx_get_mac_from_fuse(unsigned char *mac);
+
 #define __REG(x)       (*((volatile u32 *)(x)))
 #define __REG16(x)     (*((volatile u16 *)(x)))
 #define __REG8(x)      (*((volatile u8 *)(x)))
@@ -275,6 +279,36 @@ struct src {
        u32     sisr;
        u32     simr;
 };
+
+struct iim_regs {
+       u32     stat;
+       u32     statm;
+       u32     err;
+       u32     emask;
+       u32     fctl;
+       u32     ua;
+       u32     la;
+       u32     sdat;
+       u32     prev;
+       u32     srev;
+       u32     preg_p;
+       u32     scs0;
+       u32     scs1;
+       u32     scs2;
+       u32     scs3;
+       u32     res0[0x1f1];
+       struct fuse_bank {
+               u32     fuse_regs[0x20];
+               u32     fuse_rsvd[0xe0];
+       } bank[4];
+};
+
+struct fuse_bank1_regs {
+       u32     fuse0_8[9];
+       u32     mac_addr[6];
+       u32     fuse15_31[0x11];
+};
+
 #endif /* __ASSEMBLER__*/
 
 #endif                         /*  __ASM_ARCH_MXC_MX51_H__ */
index c17f9379bf93a3ff663395f0f3b56c8aa5fa60c9..0d0f392d1ef5aa84ed184885308051e85f853b34 100644 (file)
@@ -312,21 +312,8 @@ static void fec_rbd_clean(int last, struct fec_bd *pRbd)
 
 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
 {
-/*
- * The MX27 can store the mac address in internal eeprom
- * This mechanism is not supported now by MX51 or MX25
- */
-#if defined(CONFIG_MX51) || defined(CONFIG_MX25)
-       return -1;
-#else
-       struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
-       int i;
-
-       for (i = 0; i < 6; i++)
-               mac[6-1-i] = readl(&iim->iim_bank_area0[IIM0_MAC + i]);
-
+       imx_get_mac_from_fuse(mac);
        return !is_valid_ether_addr(mac);
-#endif
 }
 
 static int fec_set_hwaddr(struct eth_device *dev)
@@ -754,7 +741,7 @@ static int fec_probe(bd_t *bd)
        eth_register(edev);
 
        if (fec_get_hwaddr(edev, ethaddr) == 0) {
-               printf("got MAC address from EEPROM: %pM\n", ethaddr);
+               printf("got MAC address from fuse: %pM\n", ethaddr);
                memcpy(edev->enetaddr, ethaddr, 6);
        }