diff options
-rw-r--r-- | arch/blackfin/mach-bf518/boards/ezbrd.c | 44 | ||||
-rw-r--r-- | arch/blackfin/mach-bf518/boards/tcm-bf518.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf527/boards/cm_bf527.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf527/boards/ezbrd.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf527/boards/ezkit.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf527/boards/tll6527m.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/cm_bf537e.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/cm_bf537u.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/minotaur.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/pnav10.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/stamp.c | 24 | ||||
-rw-r--r-- | arch/blackfin/mach-bf537/boards/tcm_bf537.c | 24 | ||||
-rw-r--r-- | drivers/net/Kconfig | 8 | ||||
-rw-r--r-- | drivers/net/bfin_mac.c | 145 | ||||
-rw-r--r-- | drivers/net/bfin_mac.h | 2 | ||||
-rw-r--r-- | include/linux/bfin_mac.h | 29 |
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> | ||
91 | static 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 | |||
105 | static 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 | |||
120 | static 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 | |||
90 | static struct platform_device bfin_mii_bus = { | 127 | static 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 | ||
94 | static struct platform_device bfin_mac_device = { | 134 | static 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> | ||
85 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
86 | |||
87 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
88 | { | ||
89 | .addr = 1, | ||
90 | .irq = IRQ_MAC_PHYINT, | ||
91 | }, | ||
92 | }; | ||
93 | |||
94 | static 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 | |||
84 | static struct platform_device bfin_mii_bus = { | 101 | static 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 | ||
88 | static struct platform_device bfin_mac_device = { | 108 | static 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> | ||
277 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
278 | |||
279 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
280 | { | ||
281 | .addr = 1, | ||
282 | .irq = IRQ_MAC_PHYINT, | ||
283 | }, | ||
284 | }; | ||
285 | |||
286 | static 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 | |||
276 | static struct platform_device bfin_mii_bus = { | 293 | static 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 | ||
280 | static struct platform_device bfin_mac_device = { | 300 | static 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> | ||
197 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
198 | |||
199 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
200 | { | ||
201 | .addr = 1, | ||
202 | .irq = IRQ_MAC_PHYINT, | ||
203 | }, | ||
204 | }; | ||
205 | |||
206 | static 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 | |||
196 | static struct platform_device bfin_mii_bus = { | 213 | static 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 | ||
200 | static struct platform_device bfin_mac_device = { | 220 | static 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> | ||
370 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
371 | |||
372 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
373 | { | ||
374 | .addr = 1, | ||
375 | .irq = IRQ_MAC_PHYINT, | ||
376 | }, | ||
377 | }; | ||
378 | |||
379 | static 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 | |||
369 | static struct platform_device bfin_mii_bus = { | 386 | static 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 | ||
373 | static struct platform_device bfin_mac_device = { | 393 | static 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> | ||
261 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
262 | |||
263 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
264 | { | ||
265 | .addr = 1, | ||
266 | .irq = IRQ_MAC_PHYINT, | ||
267 | }, | ||
268 | }; | ||
269 | |||
270 | static 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 | |||
260 | static struct platform_device bfin_mii_bus = { | 277 | static 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 | ||
264 | static struct platform_device bfin_mac_device = { | 284 | static 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> | ||
601 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
602 | |||
603 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
604 | { | ||
605 | .addr = 1, | ||
606 | .irq = IRQ_MAC_PHYINT, | ||
607 | }, | ||
608 | }; | ||
609 | |||
610 | static 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 | |||
600 | static struct platform_device bfin_mii_bus = { | 617 | static 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 | ||
604 | static struct platform_device bfin_mac_device = { | 624 | static 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> | ||
566 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
567 | |||
568 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
569 | { | ||
570 | .addr = 1, | ||
571 | .irq = IRQ_MAC_PHYINT, | ||
572 | }, | ||
573 | }; | ||
574 | |||
575 | static 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 | |||
565 | static struct platform_device bfin_mii_bus = { | 582 | static 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 | ||
569 | static struct platform_device bfin_mac_device = { | 589 | static 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> | ||
72 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
73 | |||
74 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
75 | { | ||
76 | .addr = 1, | ||
77 | .irq = IRQ_MAC_PHYINT, | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | static 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 | |||
71 | static struct platform_device bfin_mii_bus = { | 88 | static 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 | ||
75 | static struct platform_device bfin_mac_device = { | 95 | static 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> | ||
103 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
104 | |||
105 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
106 | { | ||
107 | .addr = 1, | ||
108 | .irq = IRQ_MAC_PHYINT, | ||
109 | }, | ||
110 | }; | ||
111 | |||
112 | static 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 | |||
102 | static struct platform_device bfin_mii_bus = { | 119 | static 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 | ||
106 | static struct platform_device bfin_mac_device = { | 126 | static 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> | ||
331 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
332 | |||
333 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
334 | { | ||
335 | .addr = 1, | ||
336 | .irq = PHY_POLL, /* IRQ_MAC_PHYINT */ | ||
337 | }, | ||
338 | }; | ||
339 | |||
340 | static 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 | |||
330 | static struct platform_device bfin_mii_bus = { | 347 | static 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 | ||
334 | static struct platform_device bfin_mac_device = { | 354 | static 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> | ||
568 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
569 | |||
570 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
571 | { | ||
572 | .addr = 1, | ||
573 | .irq = IRQ_MAC_PHYINT, | ||
574 | }, | ||
575 | }; | ||
576 | |||
577 | static 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 | |||
567 | static struct platform_device bfin_mii_bus = { | 584 | static 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 | ||
571 | static struct platform_device bfin_mac_device = { | 591 | static 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 | ||
886 | config 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 | |||
894 | config BFIN_MAC_USE_HWSTAMP | 886 | config 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; | |||
76 | static struct net_dma_desc_tx *tx_desc; | 75 | static struct net_dma_desc_tx *tx_desc; |
77 | static struct net_dma_desc_rx *rx_desc; | 76 | static struct net_dma_desc_rx *rx_desc; |
78 | 77 | ||
79 | #if defined(CONFIG_BFIN_MAC_RMII) | ||
80 | static u16 pin_req[] = P_RMII0; | ||
81 | #else | ||
82 | static u16 pin_req[] = P_MII0; | ||
83 | #endif | ||
84 | |||
85 | static void desc_list_free(void) | 78 | static 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 | ||
395 | static int mii_probe(struct net_device *dev) | 388 | static 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 | /**************************************************************************/ |
571 | void setup_system_regs(struct net_device *dev) | 565 | void 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 | */ |
1206 | static int bfin_mac_enable(void) | 1211 | static 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 | ||
1343 | static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) | 1349 | static 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: | |||
1552 | out_err_mii_probe: | 1568 | out_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); |
1555 | out_err_mii_bus_probe: | ||
1556 | peripheral_free_list(pin_req); | ||
1557 | out_err_probe_mac: | 1571 | out_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) | |||
1623 | static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) | 1635 | static 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 | ||
1664 | out_err_mdiobus_register: | 1702 | out_err_mdiobus_register: |
1665 | kfree(miibus->irq); | 1703 | kfree(miibus->irq); |
1704 | out_err_irq_alloc: | ||
1666 | mdiobus_free(miibus); | 1705 | mdiobus_free(miibus); |
1667 | out_err_alloc: | 1706 | out_err_alloc: |
1668 | peripheral_free_list(pin_req); | 1707 | peripheral_free_list(pin_req); |
@@ -1673,11 +1712,15 @@ out_err_alloc: | |||
1673 | static int __devexit bfin_mii_bus_remove(struct platform_device *pdev) | 1712 | static 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 | |||
16 | struct bfin_phydev_platform_data { | ||
17 | unsigned short addr; | ||
18 | int irq; | ||
19 | }; | ||
20 | |||
21 | struct 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 | ||