ARM: mxs/mx28evk: read fec mac address from ocotp
authorShawn Guo <shawn.guo@freescale.com>
Fri, 14 Jan 2011 07:25:52 +0000 (15:25 +0800)
committerSascha Hauer <s.hauer@pengutronix.de>
Fri, 21 Jan 2011 10:36:49 +0000 (11:36 +0100)
Read fec mac address from ocotp and save it into fec_platform_data
mac field for fec driver to use.

Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
arch/arm/mach-mxs/mach-mx28evk.c

index 8e2c5975001ef2f331da045cc894301a248a7c53..e8db99fabc48bb22f2d1e10da744878c42cee3fb 100644 (file)
@@ -119,7 +119,7 @@ static void __init mx28evk_fec_reset(void)
        gpio_set_value(MX28EVK_FEC_PHY_RESET, 1);
 }
 
-static struct fec_platform_data mx28_fec_pdata[] = {
+static struct fec_platform_data mx28_fec_pdata[] __initdata = {
        {
                /* fec0 */
                .phy = PHY_INTERFACE_MODE_RMII,
@@ -129,12 +129,45 @@ static struct fec_platform_data mx28_fec_pdata[] = {
        },
 };
 
+static int __init mx28evk_fec_get_mac(void)
+{
+       int i;
+       u32 val;
+       const u32 *ocotp = mxs_get_ocotp();
+
+       if (!ocotp)
+               goto error;
+
+       /*
+        * OCOTP only stores the last 4 octets for each mac address,
+        * so hard-code Freescale OUI (00:04:9f) here.
+        */
+       for (i = 0; i < 2; i++) {
+               val = ocotp[i * 4];
+               mx28_fec_pdata[i].mac[0] = 0x00;
+               mx28_fec_pdata[i].mac[1] = 0x04;
+               mx28_fec_pdata[i].mac[2] = 0x9f;
+               mx28_fec_pdata[i].mac[3] = (val >> 16) & 0xff;
+               mx28_fec_pdata[i].mac[4] = (val >> 8) & 0xff;
+               mx28_fec_pdata[i].mac[5] = (val >> 0) & 0xff;
+       }
+
+       return 0;
+
+error:
+       pr_err("%s: timeout when reading fec mac from OCOTP\n", __func__);
+       return -ETIMEDOUT;
+}
+
 static void __init mx28evk_init(void)
 {
        mxs_iomux_setup_multiple_pads(mx28evk_pads, ARRAY_SIZE(mx28evk_pads));
 
        mx28_add_duart();
 
+       if (mx28evk_fec_get_mac())
+               pr_warn("%s: failed on fec mac setup\n", __func__);
+
        mx28evk_fec_reset();
        mx28_add_fec(0, &mx28_fec_pdata[0]);
        mx28_add_fec(1, &mx28_fec_pdata[1]);