aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2010-06-11 06:44:22 -0400
committerMike Frysinger <vapier@gentoo.org>2010-10-25 04:54:25 -0400
commit02460d08930656b3a50381cfb119864efcd4eef9 (patch)
treeaf76f49fbf61b252f9aca181d2911526a7ecc2c6
parent229aebb873e29726b91e076161649cf45154b0bf (diff)
netdev: bfin_mac: push settings to platform resources
Move all the pin settings out of the Kconfig and into the platform resources (MII vs RMII). This clean up also lets us push out the phy settings so that board porters may control the layout. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--arch/blackfin/mach-bf518/boards/ezbrd.c44
-rw-r--r--arch/blackfin/mach-bf518/boards/tcm-bf518.c24
-rw-r--r--arch/blackfin/mach-bf527/boards/cm_bf527.c24
-rw-r--r--arch/blackfin/mach-bf527/boards/ezbrd.c24
-rw-r--r--arch/blackfin/mach-bf527/boards/ezkit.c24
-rw-r--r--arch/blackfin/mach-bf527/boards/tll6527m.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/cm_bf537e.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/cm_bf537u.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/minotaur.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/pnav10.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/stamp.c24
-rw-r--r--arch/blackfin/mach-bf537/boards/tcm_bf537.c24
-rw-r--r--drivers/net/Kconfig8
-rw-r--r--drivers/net/bfin_mac.c145
-rw-r--r--drivers/net/bfin_mac.h2
-rw-r--r--include/linux/bfin_mac.h29
16 files changed, 421 insertions, 71 deletions
diff --git a/arch/blackfin/mach-bf518/boards/ezbrd.c b/arch/blackfin/mach-bf518/boards/ezbrd.c
index f95e6096719b..b894c8abe7ec 100644
--- a/arch/blackfin/mach-bf518/boards/ezbrd.c
+++ b/arch/blackfin/mach-bf518/boards/ezbrd.c
@@ -87,13 +87,55 @@ static struct platform_device rtc_device = {
87#endif 87#endif
88 88
89#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 89#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
90#include <linux/bfin_mac.h>
91static const unsigned short bfin_mac_peripherals[] = {
92 P_MII0_ETxD0,
93 P_MII0_ETxD1,
94 P_MII0_ETxEN,
95 P_MII0_ERxD0,
96 P_MII0_ERxD1,
97 P_MII0_TxCLK,
98 P_MII0_PHYINT,
99 P_MII0_CRS,
100 P_MII0_MDC,
101 P_MII0_MDIO,
102 0
103};
104
105static struct bfin_phydev_platform_data bfin_phydev_data[] = {
106 {
107 .addr = 1,
108 .irq = IRQ_MAC_PHYINT,
109 },
110 {
111 .addr = 2,
112 .irq = IRQ_MAC_PHYINT,
113 },
114 {
115 .addr = 3,
116 .irq = IRQ_MAC_PHYINT,
117 },
118};
119
120static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
121 .phydev_number = 3,
122 .phydev_data = bfin_phydev_data,
123 .phy_mode = PHY_INTERFACE_MODE_MII,
124 .mac_peripherals = bfin_mac_peripherals,
125};
126
90static struct platform_device bfin_mii_bus = { 127static struct platform_device bfin_mii_bus = {
91 .name = "bfin_mii_bus", 128 .name = "bfin_mii_bus",
129 .dev = {
130 .platform_data = &bfin_mii_bus_data,
131 }
92}; 132};
93 133
94static struct platform_device bfin_mac_device = { 134static struct platform_device bfin_mac_device = {
95 .name = "bfin_mac", 135 .name = "bfin_mac",
96 .dev.platform_data = &bfin_mii_bus, 136 .dev = {
137 .platform_data = &bfin_mii_bus,
138 }
97}; 139};
98 140
99#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE) 141#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
diff --git a/arch/blackfin/mach-bf518/boards/tcm-bf518.c b/arch/blackfin/mach-bf518/boards/tcm-bf518.c
index bead810a6546..e6ce1d7c523a 100644
--- a/arch/blackfin/mach-bf518/boards/tcm-bf518.c
+++ b/arch/blackfin/mach-bf518/boards/tcm-bf518.c
@@ -81,13 +81,35 @@ static struct platform_device rtc_device = {
81#endif 81#endif
82 82
83#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 83#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
84#include <linux/bfin_mac.h>
85static const unsigned short bfin_mac_peripherals[] = P_MII0;
86
87static struct bfin_phydev_platform_data bfin_phydev_data[] = {
88 {
89 .addr = 1,
90 .irq = IRQ_MAC_PHYINT,
91 },
92};
93
94static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
95 .phydev_number = 1,
96 .phydev_data = bfin_phydev_data,
97 .phy_mode = PHY_INTERFACE_MODE_MII,
98 .mac_peripherals = bfin_mac_peripherals,
99};
100
84static struct platform_device bfin_mii_bus = { 101static struct platform_device bfin_mii_bus = {
85 .name = "bfin_mii_bus", 102 .name = "bfin_mii_bus",
103 .dev = {
104 .platform_data = &bfin_mii_bus_data,
105 }
86}; 106};
87 107
88static struct platform_device bfin_mac_device = { 108static struct platform_device bfin_mac_device = {
89 .name = "bfin_mac", 109 .name = "bfin_mac",
90 .dev.platform_data = &bfin_mii_bus, 110 .dev = {
111 .platform_data = &bfin_mii_bus,
112 }
91}; 113};
92#endif 114#endif
93 115
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c
index 38037c7e125a..2c31af7a320a 100644
--- a/arch/blackfin/mach-bf527/boards/cm_bf527.c
+++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c
@@ -273,13 +273,35 @@ static struct platform_device dm9000_device = {
273#endif 273#endif
274 274
275#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 275#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
276#include <linux/bfin_mac.h>
277static const unsigned short bfin_mac_peripherals[] = P_RMII0;
278
279static struct bfin_phydev_platform_data bfin_phydev_data[] = {
280 {
281 .addr = 1,
282 .irq = IRQ_MAC_PHYINT,
283 },
284};
285
286static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
287 .phydev_number = 1,
288 .phydev_data = bfin_phydev_data,
289 .phy_mode = PHY_INTERFACE_MODE_RMII,
290 .mac_peripherals = bfin_mac_peripherals,
291};
292
276static struct platform_device bfin_mii_bus = { 293static struct platform_device bfin_mii_bus = {
277 .name = "bfin_mii_bus", 294 .name = "bfin_mii_bus",
295 .dev = {
296 .platform_data = &bfin_mii_bus_data,
297 }
278}; 298};
279 299
280static struct platform_device bfin_mac_device = { 300static struct platform_device bfin_mac_device = {
281 .name = "bfin_mac", 301 .name = "bfin_mac",
282 .dev.platform_data = &bfin_mii_bus, 302 .dev = {
303 .platform_data = &bfin_mii_bus,
304 }
283}; 305};
284#endif 306#endif
285 307
diff --git a/arch/blackfin/mach-bf527/boards/ezbrd.c b/arch/blackfin/mach-bf527/boards/ezbrd.c
index 6cc64a1e78b9..9a736a850c5c 100644
--- a/arch/blackfin/mach-bf527/boards/ezbrd.c
+++ b/arch/blackfin/mach-bf527/boards/ezbrd.c
@@ -193,13 +193,35 @@ static struct platform_device rtc_device = {
193 193
194 194
195#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 195#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
196#include <linux/bfin_mac.h>
197static const unsigned short bfin_mac_peripherals[] = P_RMII0;
198
199static struct bfin_phydev_platform_data bfin_phydev_data[] = {
200 {
201 .addr = 1,
202 .irq = IRQ_MAC_PHYINT,
203 },
204};
205
206static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
207 .phydev_number = 1,
208 .phydev_data = bfin_phydev_data,
209 .phy_mode = PHY_INTERFACE_MODE_RMII,
210 .mac_peripherals = bfin_mac_peripherals,
211};
212
196static struct platform_device bfin_mii_bus = { 213static struct platform_device bfin_mii_bus = {
197 .name = "bfin_mii_bus", 214 .name = "bfin_mii_bus",
215 .dev = {
216 .platform_data = &bfin_mii_bus_data,
217 }
198}; 218};
199 219
200static struct platform_device bfin_mac_device = { 220static struct platform_device bfin_mac_device = {
201 .name = "bfin_mac", 221 .name = "bfin_mac",
202 .dev.platform_data = &bfin_mii_bus, 222 .dev = {
223 .platform_data = &bfin_mii_bus,
224 }
203}; 225};
204#endif 226#endif
205 227
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c
index df82723fb504..9222bc00bbd3 100644
--- a/arch/blackfin/mach-bf527/boards/ezkit.c
+++ b/arch/blackfin/mach-bf527/boards/ezkit.c
@@ -366,13 +366,35 @@ static struct platform_device dm9000_device = {
366#endif 366#endif
367 367
368#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 368#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
369#include <linux/bfin_mac.h>
370static const unsigned short bfin_mac_peripherals[] = P_RMII0;
371
372static struct bfin_phydev_platform_data bfin_phydev_data[] = {
373 {
374 .addr = 1,
375 .irq = IRQ_MAC_PHYINT,
376 },
377};
378
379static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
380 .phydev_number = 1,
381 .phydev_data = bfin_phydev_data,
382 .phy_mode = PHY_INTERFACE_MODE_RMII,
383 .mac_peripherals = bfin_mac_peripherals,
384};
385
369static struct platform_device bfin_mii_bus = { 386static struct platform_device bfin_mii_bus = {
370 .name = "bfin_mii_bus", 387 .name = "bfin_mii_bus",
388 .dev = {
389 .platform_data = &bfin_mii_bus_data,
390 }
371}; 391};
372 392
373static struct platform_device bfin_mac_device = { 393static struct platform_device bfin_mac_device = {
374 .name = "bfin_mac", 394 .name = "bfin_mac",
375 .dev.platform_data = &bfin_mii_bus, 395 .dev = {
396 .platform_data = &bfin_mii_bus,
397 }
376}; 398};
377#endif 399#endif
378 400
diff --git a/arch/blackfin/mach-bf527/boards/tll6527m.c b/arch/blackfin/mach-bf527/boards/tll6527m.c
index ae4130e97c01..9ec575729e2c 100644
--- a/arch/blackfin/mach-bf527/boards/tll6527m.c
+++ b/arch/blackfin/mach-bf527/boards/tll6527m.c
@@ -257,13 +257,35 @@ static struct platform_device rtc_device = {
257#endif 257#endif
258 258
259#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 259#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
260#include <linux/bfin_mac.h>
261static const unsigned short bfin_mac_peripherals[] = P_RMII0;
262
263static struct bfin_phydev_platform_data bfin_phydev_data[] = {
264 {
265 .addr = 1,
266 .irq = IRQ_MAC_PHYINT,
267 },
268};
269
270static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
271 .phydev_number = 1,
272 .phydev_data = bfin_phydev_data,
273 .phy_mode = PHY_INTERFACE_MODE_RMII,
274 .mac_peripherals = bfin_mac_peripherals,
275};
276
260static struct platform_device bfin_mii_bus = { 277static struct platform_device bfin_mii_bus = {
261 .name = "bfin_mii_bus", 278 .name = "bfin_mii_bus",
279 .dev = {
280 .platform_data = &bfin_mii_bus_data,
281 }
262}; 282};
263 283
264static struct platform_device bfin_mac_device = { 284static struct platform_device bfin_mac_device = {
265 .name = "bfin_mac", 285 .name = "bfin_mac",
266 .dev.platform_data = &bfin_mii_bus, 286 .dev = {
287 .platform_data = &bfin_mii_bus,
288 }
267}; 289};
268#endif 290#endif
269 291
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537e.c b/arch/blackfin/mach-bf537/boards/cm_bf537e.c
index e2e7be40ef44..836698c4ee54 100644
--- a/arch/blackfin/mach-bf537/boards/cm_bf537e.c
+++ b/arch/blackfin/mach-bf537/boards/cm_bf537e.c
@@ -597,13 +597,35 @@ static struct platform_device bfin_sport1_uart_device = {
597#endif 597#endif
598 598
599#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 599#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
600#include <linux/bfin_mac.h>
601static const unsigned short bfin_mac_peripherals[] = P_MII0;
602
603static struct bfin_phydev_platform_data bfin_phydev_data[] = {
604 {
605 .addr = 1,
606 .irq = IRQ_MAC_PHYINT,
607 },
608};
609
610static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
611 .phydev_number = 1,
612 .phydev_data = bfin_phydev_data,
613 .phy_mode = PHY_INTERFACE_MODE_MII,
614 .mac_peripherals = bfin_mac_peripherals,
615};
616
600static struct platform_device bfin_mii_bus = { 617static struct platform_device bfin_mii_bus = {
601 .name = "bfin_mii_bus", 618 .name = "bfin_mii_bus",
619 .dev = {
620 .platform_data = &bfin_mii_bus_data,
621 }
602}; 622};
603 623
604static struct platform_device bfin_mac_device = { 624static struct platform_device bfin_mac_device = {
605 .name = "bfin_mac", 625 .name = "bfin_mac",
606 .dev.platform_data = &bfin_mii_bus, 626 .dev = {
627 .platform_data = &bfin_mii_bus,
628 }
607}; 629};
608#endif 630#endif
609 631
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537u.c b/arch/blackfin/mach-bf537/boards/cm_bf537u.c
index 752c833f7ca8..2a85670273cb 100644
--- a/arch/blackfin/mach-bf537/boards/cm_bf537u.c
+++ b/arch/blackfin/mach-bf537/boards/cm_bf537u.c
@@ -562,13 +562,35 @@ static struct platform_device bfin_sport1_uart_device = {
562#endif 562#endif
563 563
564#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 564#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
565#include <linux/bfin_mac.h>
566static const unsigned short bfin_mac_peripherals[] = P_MII0;
567
568static struct bfin_phydev_platform_data bfin_phydev_data[] = {
569 {
570 .addr = 1,
571 .irq = IRQ_MAC_PHYINT,
572 },
573};
574
575static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
576 .phydev_number = 1,
577 .phydev_data = bfin_phydev_data,
578 .phy_mode = PHY_INTERFACE_MODE_MII,
579 .mac_peripherals = bfin_mac_peripherals,
580};
581
565static struct platform_device bfin_mii_bus = { 582static struct platform_device bfin_mii_bus = {
566 .name = "bfin_mii_bus", 583 .name = "bfin_mii_bus",
584 .dev = {
585 .platform_data = &bfin_mii_bus_data,
586 }
567}; 587};
568 588
569static struct platform_device bfin_mac_device = { 589static struct platform_device bfin_mac_device = {
570 .name = "bfin_mac", 590 .name = "bfin_mac",
571 .dev.platform_data = &bfin_mii_bus, 591 .dev = {
592 .platform_data = &bfin_mii_bus,
593 }
572}; 594};
573#endif 595#endif
574 596
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c
index 05d45994480e..49800518412c 100644
--- a/arch/blackfin/mach-bf537/boards/minotaur.c
+++ b/arch/blackfin/mach-bf537/boards/minotaur.c
@@ -68,13 +68,35 @@ static struct platform_device rtc_device = {
68#endif 68#endif
69 69
70#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 70#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
71#include <linux/bfin_mac.h>
72static const unsigned short bfin_mac_peripherals[] = P_MII0;
73
74static struct bfin_phydev_platform_data bfin_phydev_data[] = {
75 {
76 .addr = 1,
77 .irq = IRQ_MAC_PHYINT,
78 },
79};
80
81static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
82 .phydev_number = 1,
83 .phydev_data = bfin_phydev_data,
84 .phy_mode = PHY_INTERFACE_MODE_MII,
85 .mac_peripherals = bfin_mac_peripherals,
86};
87
71static struct platform_device bfin_mii_bus = { 88static struct platform_device bfin_mii_bus = {
72 .name = "bfin_mii_bus", 89 .name = "bfin_mii_bus",
90 .dev = {
91 .platform_data = &bfin_mii_bus_data,
92 }
73}; 93};
74 94
75static struct platform_device bfin_mac_device = { 95static struct platform_device bfin_mac_device = {
76 .name = "bfin_mac", 96 .name = "bfin_mac",
77 .dev.platform_data = &bfin_mii_bus, 97 .dev = {
98 .platform_data = &bfin_mii_bus,
99 }
78}; 100};
79#endif 101#endif
80 102
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c
index 6b03808800a6..b95807894e25 100644
--- a/arch/blackfin/mach-bf537/boards/pnav10.c
+++ b/arch/blackfin/mach-bf537/boards/pnav10.c
@@ -99,13 +99,35 @@ static struct platform_device smc91x_device = {
99#endif 99#endif
100 100
101#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 101#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
102#include <linux/bfin_mac.h>
103static const unsigned short bfin_mac_peripherals[] = P_RMII0;
104
105static struct bfin_phydev_platform_data bfin_phydev_data[] = {
106 {
107 .addr = 1,
108 .irq = IRQ_MAC_PHYINT,
109 },
110};
111
112static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
113 .phydev_number = 1,
114 .phydev_data = bfin_phydev_data,
115 .phy_mode = PHY_INTERFACE_MODE_RMII,
116 .mac_peripherals = bfin_mac_peripherals,
117};
118
102static struct platform_device bfin_mii_bus = { 119static struct platform_device bfin_mii_bus = {
103 .name = "bfin_mii_bus", 120 .name = "bfin_mii_bus",
121 .dev = {
122 .platform_data = &bfin_mii_bus_data,
123 }
104}; 124};
105 125
106static struct platform_device bfin_mac_device = { 126static struct platform_device bfin_mac_device = {
107 .name = "bfin_mac", 127 .name = "bfin_mac",
108 .dev.platform_data = &bfin_mii_bus, 128 .dev = {
129 .platform_data = &bfin_mii_bus,
130 }
109}; 131};
110#endif 132#endif
111 133
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c
index cd2c797c8c9f..3aa344ce8e52 100644
--- a/arch/blackfin/mach-bf537/boards/stamp.c
+++ b/arch/blackfin/mach-bf537/boards/stamp.c
@@ -327,13 +327,35 @@ static struct platform_device bfin_can_device = {
327#endif 327#endif
328 328
329#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 329#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
330#include <linux/bfin_mac.h>
331static const unsigned short bfin_mac_peripherals[] = P_MII0;
332
333static struct bfin_phydev_platform_data bfin_phydev_data[] = {
334 {
335 .addr = 1,
336 .irq = PHY_POLL, /* IRQ_MAC_PHYINT */
337 },
338};
339
340static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
341 .phydev_number = 1,
342 .phydev_data = bfin_phydev_data,
343 .phy_mode = PHY_INTERFACE_MODE_MII,
344 .mac_peripherals = bfin_mac_peripherals,
345};
346
330static struct platform_device bfin_mii_bus = { 347static struct platform_device bfin_mii_bus = {
331 .name = "bfin_mii_bus", 348 .name = "bfin_mii_bus",
349 .dev = {
350 .platform_data = &bfin_mii_bus_data,
351 }
332}; 352};
333 353
334static struct platform_device bfin_mac_device = { 354static struct platform_device bfin_mac_device = {
335 .name = "bfin_mac", 355 .name = "bfin_mac",
336 .dev.platform_data = &bfin_mii_bus, 356 .dev = {
357 .platform_data = &bfin_mii_bus,
358 }
337}; 359};
338#endif 360#endif
339 361
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c
index a4d62b5fc7ba..31498add1a42 100644
--- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c
+++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c
@@ -564,13 +564,35 @@ static struct platform_device bfin_sport1_uart_device = {
564#endif 564#endif
565 565
566#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) 566#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
567#include <linux/bfin_mac.h>
568static const unsigned short bfin_mac_peripherals[] = P_MII0;
569
570static struct bfin_phydev_platform_data bfin_phydev_data[] = {
571 {
572 .addr = 1,
573 .irq = IRQ_MAC_PHYINT,
574 },
575};
576
577static struct bfin_mii_bus_platform_data bfin_mii_bus_data = {
578 .phydev_number = 1,
579 .phydev_data = bfin_phydev_data,
580 .phy_mode = PHY_INTERFACE_MODE_MII,
581 .mac_peripherals = bfin_mac_peripherals,
582};
583
567static struct platform_device bfin_mii_bus = { 584static struct platform_device bfin_mii_bus = {
568 .name = "bfin_mii_bus", 585 .name = "bfin_mii_bus",
586 .dev = {
587 .platform_data = &bfin_mii_bus_data,
588 }
569}; 589};
570 590
571static struct platform_device bfin_mac_device = { 591static struct platform_device bfin_mac_device = {
572 .name = "bfin_mac", 592 .name = "bfin_mac",
573 .dev.platform_data = &bfin_mii_bus, 593 .dev = {
594 .platform_data = &bfin_mii_bus,
595 }
574}; 596};
575#endif 597#endif
576 598
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 77c1fab7d774..c598fe008e37 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -883,14 +883,6 @@ config BFIN_RX_DESC_NUM
883 help 883 help
884 Set the number of buffer packets used in driver. 884 Set the number of buffer packets used in driver.
885 885
886config BFIN_MAC_RMII
887 bool "RMII PHY Interface"
888 depends on BFIN_MAC
889 default y if BFIN527_EZKIT
890 default n if BFIN537_STAMP
891 help
892 Use Reduced PHY MII Interface
893
894config BFIN_MAC_USE_HWSTAMP 886config BFIN_MAC_USE_HWSTAMP
895 bool "Use IEEE 1588 hwstamp" 887 bool "Use IEEE 1588 hwstamp"
896 depends on BFIN_MAC && BF518 888 depends on BFIN_MAC && BF518
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index f7233191162b..ce1e5e9d06f6 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Blackfin On-Chip MAC Driver 2 * Blackfin On-Chip MAC Driver
3 * 3 *
4 * Copyright 2004-2007 Analog Devices Inc. 4 * Copyright 2004-2010 Analog Devices Inc.
5 * 5 *
6 * Enter bugs at http://blackfin.uclinux.org/ 6 * Enter bugs at http://blackfin.uclinux.org/
7 * 7 *
@@ -23,7 +23,6 @@
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/spinlock.h> 24#include <linux/spinlock.h>
25#include <linux/mii.h> 25#include <linux/mii.h>
26#include <linux/phy.h>
27#include <linux/netdevice.h> 26#include <linux/netdevice.h>
28#include <linux/etherdevice.h> 27#include <linux/etherdevice.h>
29#include <linux/ethtool.h> 28#include <linux/ethtool.h>
@@ -76,12 +75,6 @@ static struct net_dma_desc_tx *current_tx_ptr;
76static struct net_dma_desc_tx *tx_desc; 75static struct net_dma_desc_tx *tx_desc;
77static struct net_dma_desc_rx *rx_desc; 76static struct net_dma_desc_rx *rx_desc;
78 77
79#if defined(CONFIG_BFIN_MAC_RMII)
80static u16 pin_req[] = P_RMII0;
81#else
82static u16 pin_req[] = P_MII0;
83#endif
84
85static void desc_list_free(void) 78static void desc_list_free(void)
86{ 79{
87 struct net_dma_desc_rx *r; 80 struct net_dma_desc_rx *r;
@@ -347,23 +340,23 @@ static void bfin_mac_adjust_link(struct net_device *dev)
347 } 340 }
348 341
349 if (phydev->speed != lp->old_speed) { 342 if (phydev->speed != lp->old_speed) {
350#if defined(CONFIG_BFIN_MAC_RMII) 343 if (phydev->interface == PHY_INTERFACE_MODE_RMII) {
351 u32 opmode = bfin_read_EMAC_OPMODE(); 344 u32 opmode = bfin_read_EMAC_OPMODE();
352 switch (phydev->speed) { 345 switch (phydev->speed) {
353 case 10: 346 case 10:
354 opmode |= RMII_10; 347 opmode |= RMII_10;
355 break; 348 break;
356 case 100: 349 case 100:
357 opmode &= ~(RMII_10); 350 opmode &= ~RMII_10;
358 break; 351 break;
359 default: 352 default:
360 printk(KERN_WARNING 353 printk(KERN_WARNING
361 "%s: Ack! Speed (%d) is not 10/100!\n", 354 "%s: Ack! Speed (%d) is not 10/100!\n",
362 DRV_NAME, phydev->speed); 355 DRV_NAME, phydev->speed);
363 break; 356 break;
357 }
358 bfin_write_EMAC_OPMODE(opmode);
364 } 359 }
365 bfin_write_EMAC_OPMODE(opmode);
366#endif
367 360
368 new_state = 1; 361 new_state = 1;
369 lp->old_speed = phydev->speed; 362 lp->old_speed = phydev->speed;
@@ -392,7 +385,7 @@ static void bfin_mac_adjust_link(struct net_device *dev)
392/* MDC = 2.5 MHz */ 385/* MDC = 2.5 MHz */
393#define MDC_CLK 2500000 386#define MDC_CLK 2500000
394 387
395static int mii_probe(struct net_device *dev) 388static int mii_probe(struct net_device *dev, int phy_mode)
396{ 389{
397 struct bfin_mac_local *lp = netdev_priv(dev); 390 struct bfin_mac_local *lp = netdev_priv(dev);
398 struct phy_device *phydev = NULL; 391 struct phy_device *phydev = NULL;
@@ -411,8 +404,8 @@ static int mii_probe(struct net_device *dev)
411 sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div); 404 sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div);
412 bfin_write_EMAC_SYSCTL(sysctl); 405 bfin_write_EMAC_SYSCTL(sysctl);
413 406
414 /* search for connect PHY device */ 407 /* search for connected PHY device */
415 for (i = 0; i < PHY_MAX_ADDR; i++) { 408 for (i = 0; i < PHY_MAX_ADDR; ++i) {
416 struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i]; 409 struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i];
417 410
418 if (!tmp_phydev) 411 if (!tmp_phydev)
@@ -429,13 +422,14 @@ static int mii_probe(struct net_device *dev)
429 return -ENODEV; 422 return -ENODEV;
430 } 423 }
431 424
432#if defined(CONFIG_BFIN_MAC_RMII) 425 if (phy_mode != PHY_INTERFACE_MODE_RMII &&
433 phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, 426 phy_mode != PHY_INTERFACE_MODE_MII) {
434 0, PHY_INTERFACE_MODE_RMII); 427 printk(KERN_INFO "%s: Invalid phy interface mode\n", dev->name);
435#else 428 return -EINVAL;
429 }
430
436 phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, 431 phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link,
437 0, PHY_INTERFACE_MODE_MII); 432 0, phy_mode);
438#endif
439 433
440 if (IS_ERR(phydev)) { 434 if (IS_ERR(phydev)) {
441 printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); 435 printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
@@ -570,6 +564,8 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = {
570/**************************************************************************/ 564/**************************************************************************/
571void setup_system_regs(struct net_device *dev) 565void setup_system_regs(struct net_device *dev)
572{ 566{
567 struct bfin_mac_local *lp = netdev_priv(dev);
568 int i;
573 unsigned short sysctl; 569 unsigned short sysctl;
574 570
575 /* 571 /*
@@ -577,6 +573,15 @@ void setup_system_regs(struct net_device *dev)
577 * Configure checksum support and rcve frame word alignment 573 * Configure checksum support and rcve frame word alignment
578 */ 574 */
579 sysctl = bfin_read_EMAC_SYSCTL(); 575 sysctl = bfin_read_EMAC_SYSCTL();
576 /*
577 * check if interrupt is requested for any PHY,
578 * enable PHY interrupt only if needed
579 */
580 for (i = 0; i < PHY_MAX_ADDR; ++i)
581 if (lp->mii_bus->irq[i] != PHY_POLL)
582 break;
583 if (i < PHY_MAX_ADDR)
584 sysctl |= PHYIE;
580 sysctl |= RXDWA; 585 sysctl |= RXDWA;
581#if defined(BFIN_MAC_CSUM_OFFLOAD) 586#if defined(BFIN_MAC_CSUM_OFFLOAD)
582 sysctl |= RXCKS; 587 sysctl |= RXCKS;
@@ -1203,7 +1208,7 @@ static void bfin_mac_disable(void)
1203/* 1208/*
1204 * Enable Interrupts, Receive, and Transmit 1209 * Enable Interrupts, Receive, and Transmit
1205 */ 1210 */
1206static int bfin_mac_enable(void) 1211static int bfin_mac_enable(struct phy_device *phydev)
1207{ 1212{
1208 int ret; 1213 int ret;
1209 u32 opmode; 1214 u32 opmode;
@@ -1233,12 +1238,13 @@ static int bfin_mac_enable(void)
1233 opmode |= DRO | DC | PSF; 1238 opmode |= DRO | DC | PSF;
1234 opmode |= RE; 1239 opmode |= RE;
1235 1240
1236#if defined(CONFIG_BFIN_MAC_RMII) 1241 if (phydev->interface == PHY_INTERFACE_MODE_RMII) {
1237 opmode |= RMII; /* For Now only 100MBit are supported */ 1242 opmode |= RMII; /* For Now only 100MBit are supported */
1238#if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2 1243#if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2
1239 opmode |= TE; 1244 opmode |= TE;
1240#endif
1241#endif 1245#endif
1246 }
1247
1242 /* Turn on the EMAC rx */ 1248 /* Turn on the EMAC rx */
1243 bfin_write_EMAC_OPMODE(opmode); 1249 bfin_write_EMAC_OPMODE(opmode);
1244 1250
@@ -1270,7 +1276,7 @@ static void bfin_mac_timeout(struct net_device *dev)
1270 if (netif_queue_stopped(lp->ndev)) 1276 if (netif_queue_stopped(lp->ndev))
1271 netif_wake_queue(lp->ndev); 1277 netif_wake_queue(lp->ndev);
1272 1278
1273 bfin_mac_enable(); 1279 bfin_mac_enable(lp->phydev);
1274 1280
1275 /* We can accept TX packets again */ 1281 /* We can accept TX packets again */
1276 dev->trans_start = jiffies; /* prevent tx timeout */ 1282 dev->trans_start = jiffies; /* prevent tx timeout */
@@ -1342,11 +1348,19 @@ static void bfin_mac_set_multicast_list(struct net_device *dev)
1342 1348
1343static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) 1349static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
1344{ 1350{
1351 struct bfin_mac_local *lp = netdev_priv(netdev);
1352
1353 if (!netif_running(netdev))
1354 return -EINVAL;
1355
1345 switch (cmd) { 1356 switch (cmd) {
1346 case SIOCSHWTSTAMP: 1357 case SIOCSHWTSTAMP:
1347 return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd); 1358 return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd);
1348 default: 1359 default:
1349 return -EOPNOTSUPP; 1360 if (lp->phydev)
1361 return phy_mii_ioctl(lp->phydev, ifr, cmd);
1362 else
1363 return -EOPNOTSUPP;
1350 } 1364 }
1351} 1365}
1352 1366
@@ -1394,7 +1408,7 @@ static int bfin_mac_open(struct net_device *dev)
1394 setup_mac_addr(dev->dev_addr); 1408 setup_mac_addr(dev->dev_addr);
1395 1409
1396 bfin_mac_disable(); 1410 bfin_mac_disable();
1397 ret = bfin_mac_enable(); 1411 ret = bfin_mac_enable(lp->phydev);
1398 if (ret) 1412 if (ret)
1399 return ret; 1413 return ret;
1400 pr_debug("hardware init finished\n"); 1414 pr_debug("hardware init finished\n");
@@ -1450,6 +1464,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
1450 struct net_device *ndev; 1464 struct net_device *ndev;
1451 struct bfin_mac_local *lp; 1465 struct bfin_mac_local *lp;
1452 struct platform_device *pd; 1466 struct platform_device *pd;
1467 struct bfin_mii_bus_platform_data *mii_bus_data;
1453 int rc; 1468 int rc;
1454 1469
1455 ndev = alloc_etherdev(sizeof(struct bfin_mac_local)); 1470 ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
@@ -1501,11 +1516,12 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
1501 if (!lp->mii_bus) { 1516 if (!lp->mii_bus) {
1502 dev_err(&pdev->dev, "Cannot get mii_bus!\n"); 1517 dev_err(&pdev->dev, "Cannot get mii_bus!\n");
1503 rc = -ENODEV; 1518 rc = -ENODEV;
1504 goto out_err_mii_bus_probe; 1519 goto out_err_probe_mac;
1505 } 1520 }
1506 lp->mii_bus->priv = ndev; 1521 lp->mii_bus->priv = ndev;
1522 mii_bus_data = pd->dev.platform_data;
1507 1523
1508 rc = mii_probe(ndev); 1524 rc = mii_probe(ndev, mii_bus_data->phy_mode);
1509 if (rc) { 1525 if (rc) {
1510 dev_err(&pdev->dev, "MII Probe failed!\n"); 1526 dev_err(&pdev->dev, "MII Probe failed!\n");
1511 goto out_err_mii_probe; 1527 goto out_err_mii_probe;
@@ -1552,8 +1568,6 @@ out_err_request_irq:
1552out_err_mii_probe: 1568out_err_mii_probe:
1553 mdiobus_unregister(lp->mii_bus); 1569 mdiobus_unregister(lp->mii_bus);
1554 mdiobus_free(lp->mii_bus); 1570 mdiobus_free(lp->mii_bus);
1555out_err_mii_bus_probe:
1556 peripheral_free_list(pin_req);
1557out_err_probe_mac: 1571out_err_probe_mac:
1558 platform_set_drvdata(pdev, NULL); 1572 platform_set_drvdata(pdev, NULL);
1559 free_netdev(ndev); 1573 free_netdev(ndev);
@@ -1576,8 +1590,6 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)
1576 1590
1577 free_netdev(ndev); 1591 free_netdev(ndev);
1578 1592
1579 peripheral_free_list(pin_req);
1580
1581 return 0; 1593 return 0;
1582} 1594}
1583 1595
@@ -1623,12 +1635,21 @@ static int bfin_mac_resume(struct platform_device *pdev)
1623static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) 1635static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
1624{ 1636{
1625 struct mii_bus *miibus; 1637 struct mii_bus *miibus;
1638 struct bfin_mii_bus_platform_data *mii_bus_pd;
1639 const unsigned short *pin_req;
1626 int rc, i; 1640 int rc, i;
1627 1641
1642 mii_bus_pd = dev_get_platdata(&pdev->dev);
1643 if (!mii_bus_pd) {
1644 dev_err(&pdev->dev, "No peripherals in platform data!\n");
1645 return -EINVAL;
1646 }
1647
1628 /* 1648 /*
1629 * We are setting up a network card, 1649 * We are setting up a network card,
1630 * so set the GPIO pins to Ethernet mode 1650 * so set the GPIO pins to Ethernet mode
1631 */ 1651 */
1652 pin_req = mii_bus_pd->mac_peripherals;
1632 rc = peripheral_request_list(pin_req, DRV_NAME); 1653 rc = peripheral_request_list(pin_req, DRV_NAME);
1633 if (rc) { 1654 if (rc) {
1634 dev_err(&pdev->dev, "Requesting peripherals failed!\n"); 1655 dev_err(&pdev->dev, "Requesting peripherals failed!\n");
@@ -1645,13 +1666,30 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
1645 1666
1646 miibus->parent = &pdev->dev; 1667 miibus->parent = &pdev->dev;
1647 miibus->name = "bfin_mii_bus"; 1668 miibus->name = "bfin_mii_bus";
1669 miibus->phy_mask = mii_bus_pd->phy_mask;
1670
1648 snprintf(miibus->id, MII_BUS_ID_SIZE, "0"); 1671 snprintf(miibus->id, MII_BUS_ID_SIZE, "0");
1649 miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 1672 miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
1650 if (miibus->irq == NULL) 1673 if (!miibus->irq)
1651 goto out_err_alloc; 1674 goto out_err_irq_alloc;
1652 for (i = 0; i < PHY_MAX_ADDR; ++i) 1675
1676 for (i = rc; i < PHY_MAX_ADDR; ++i)
1653 miibus->irq[i] = PHY_POLL; 1677 miibus->irq[i] = PHY_POLL;
1654 1678
1679 rc = clamp(mii_bus_pd->phydev_number, 0, PHY_MAX_ADDR);
1680 if (rc != mii_bus_pd->phydev_number)
1681 dev_err(&pdev->dev, "Invalid number (%i) of phydevs\n",
1682 mii_bus_pd->phydev_number);
1683 for (i = 0; i < rc; ++i) {
1684 unsigned short phyaddr = mii_bus_pd->phydev_data[i].addr;
1685 if (phyaddr < PHY_MAX_ADDR)
1686 miibus->irq[phyaddr] = mii_bus_pd->phydev_data[i].irq;
1687 else
1688 dev_err(&pdev->dev,
1689 "Invalid PHY address %i for phydev %i\n",
1690 phyaddr, i);
1691 }
1692
1655 rc = mdiobus_register(miibus); 1693 rc = mdiobus_register(miibus);
1656 if (rc) { 1694 if (rc) {
1657 dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); 1695 dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
@@ -1663,6 +1701,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
1663 1701
1664out_err_mdiobus_register: 1702out_err_mdiobus_register:
1665 kfree(miibus->irq); 1703 kfree(miibus->irq);
1704out_err_irq_alloc:
1666 mdiobus_free(miibus); 1705 mdiobus_free(miibus);
1667out_err_alloc: 1706out_err_alloc:
1668 peripheral_free_list(pin_req); 1707 peripheral_free_list(pin_req);
@@ -1673,11 +1712,15 @@ out_err_alloc:
1673static int __devexit bfin_mii_bus_remove(struct platform_device *pdev) 1712static int __devexit bfin_mii_bus_remove(struct platform_device *pdev)
1674{ 1713{
1675 struct mii_bus *miibus = platform_get_drvdata(pdev); 1714 struct mii_bus *miibus = platform_get_drvdata(pdev);
1715 struct bfin_mii_bus_platform_data *mii_bus_pd =
1716 dev_get_platdata(&pdev->dev);
1717
1676 platform_set_drvdata(pdev, NULL); 1718 platform_set_drvdata(pdev, NULL);
1677 mdiobus_unregister(miibus); 1719 mdiobus_unregister(miibus);
1678 kfree(miibus->irq); 1720 kfree(miibus->irq);
1679 mdiobus_free(miibus); 1721 mdiobus_free(miibus);
1680 peripheral_free_list(pin_req); 1722 peripheral_free_list(mii_bus_pd->mac_peripherals);
1723
1681 return 0; 1724 return 0;
1682} 1725}
1683 1726
diff --git a/drivers/net/bfin_mac.h b/drivers/net/bfin_mac.h
index 04e4050df18b..aed68bed2365 100644
--- a/drivers/net/bfin_mac.h
+++ b/drivers/net/bfin_mac.h
@@ -14,6 +14,8 @@
14#include <linux/clocksource.h> 14#include <linux/clocksource.h>
15#include <linux/timecompare.h> 15#include <linux/timecompare.h>
16#include <linux/timer.h> 16#include <linux/timer.h>
17#include <linux/etherdevice.h>
18#include <linux/bfin_mac.h>
17 19
18#define BFIN_MAC_CSUM_OFFLOAD 20#define BFIN_MAC_CSUM_OFFLOAD
19 21
diff --git a/include/linux/bfin_mac.h b/include/linux/bfin_mac.h
new file mode 100644
index 000000000000..904dec7d03a1
--- /dev/null
+++ b/include/linux/bfin_mac.h
@@ -0,0 +1,29 @@
1/*
2 * Blackfin On-Chip MAC Driver
3 *
4 * Copyright 2004-2010 Analog Devices Inc.
5 *
6 * Enter bugs at http://blackfin.uclinux.org/
7 *
8 * Licensed under the GPL-2 or later.
9 */
10
11#ifndef _LINUX_BFIN_MAC_H_
12#define _LINUX_BFIN_MAC_H_
13
14#include <linux/phy.h>
15
16struct bfin_phydev_platform_data {
17 unsigned short addr;
18 int irq;
19};
20
21struct bfin_mii_bus_platform_data {
22 int phydev_number;
23 struct bfin_phydev_platform_data *phydev_data;
24 const unsigned short *mac_peripherals;
25 int phy_mode;
26 unsigned int phy_mask;
27};
28
29#endif