aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mxs
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@freescale.com>2011-01-14 02:25:52 -0500
committerSascha Hauer <s.hauer@pengutronix.de>2011-01-21 05:36:49 -0500
commita320b2793dae44953dc58e9f681d8f161eb5b3ab (patch)
treeb495c50e806b6ff1c8d30625f32b0660f71bb5fa /arch/arm/mach-mxs
parent67f43086a24b77a82724855141a5b7a4d72549bd (diff)
ARM: mxs/mx28evk: read fec mac address from ocotp
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>
Diffstat (limited to 'arch/arm/mach-mxs')
-rw-r--r--arch/arm/mach-mxs/mach-mx28evk.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c
index 8e2c5975001e..e8db99fabc48 100644
--- a/arch/arm/mach-mxs/mach-mx28evk.c
+++ b/arch/arm/mach-mxs/mach-mx28evk.c
@@ -119,7 +119,7 @@ static void __init mx28evk_fec_reset(void)
119 gpio_set_value(MX28EVK_FEC_PHY_RESET, 1); 119 gpio_set_value(MX28EVK_FEC_PHY_RESET, 1);
120} 120}
121 121
122static struct fec_platform_data mx28_fec_pdata[] = { 122static struct fec_platform_data mx28_fec_pdata[] __initdata = {
123 { 123 {
124 /* fec0 */ 124 /* fec0 */
125 .phy = PHY_INTERFACE_MODE_RMII, 125 .phy = PHY_INTERFACE_MODE_RMII,
@@ -129,12 +129,45 @@ static struct fec_platform_data mx28_fec_pdata[] = {
129 }, 129 },
130}; 130};
131 131
132static int __init mx28evk_fec_get_mac(void)
133{
134 int i;
135 u32 val;
136 const u32 *ocotp = mxs_get_ocotp();
137
138 if (!ocotp)
139 goto error;
140
141 /*
142 * OCOTP only stores the last 4 octets for each mac address,
143 * so hard-code Freescale OUI (00:04:9f) here.
144 */
145 for (i = 0; i < 2; i++) {
146 val = ocotp[i * 4];
147 mx28_fec_pdata[i].mac[0] = 0x00;
148 mx28_fec_pdata[i].mac[1] = 0x04;
149 mx28_fec_pdata[i].mac[2] = 0x9f;
150 mx28_fec_pdata[i].mac[3] = (val >> 16) & 0xff;
151 mx28_fec_pdata[i].mac[4] = (val >> 8) & 0xff;
152 mx28_fec_pdata[i].mac[5] = (val >> 0) & 0xff;
153 }
154
155 return 0;
156
157error:
158 pr_err("%s: timeout when reading fec mac from OCOTP\n", __func__);
159 return -ETIMEDOUT;
160}
161
132static void __init mx28evk_init(void) 162static void __init mx28evk_init(void)
133{ 163{
134 mxs_iomux_setup_multiple_pads(mx28evk_pads, ARRAY_SIZE(mx28evk_pads)); 164 mxs_iomux_setup_multiple_pads(mx28evk_pads, ARRAY_SIZE(mx28evk_pads));
135 165
136 mx28_add_duart(); 166 mx28_add_duart();
137 167
168 if (mx28evk_fec_get_mac())
169 pr_warn("%s: failed on fec mac setup\n", __func__);
170
138 mx28evk_fec_reset(); 171 mx28evk_fec_reset();
139 mx28_add_fec(0, &mx28_fec_pdata[0]); 172 mx28_add_fec(0, &mx28_fec_pdata[0]);
140 mx28_add_fec(1, &mx28_fec_pdata[1]); 173 mx28_add_fec(1, &mx28_fec_pdata[1]);