diff options
-rw-r--r-- | arch/powerpc/sysdev/mv64x60_dev.c | 129 | ||||
-rw-r--r-- | drivers/net/Kconfig | 2 |
2 files changed, 130 insertions, 1 deletions
diff --git a/arch/powerpc/sysdev/mv64x60_dev.c b/arch/powerpc/sysdev/mv64x60_dev.c index 735d20fa586b..0ccc495340bb 100644 --- a/arch/powerpc/sysdev/mv64x60_dev.c +++ b/arch/powerpc/sysdev/mv64x60_dev.c | |||
@@ -201,6 +201,128 @@ error: | |||
201 | return err; | 201 | return err; |
202 | } | 202 | } |
203 | 203 | ||
204 | /* | ||
205 | * Create mv64x60_eth platform devices | ||
206 | */ | ||
207 | static int __init eth_register_shared_pdev(struct device_node *np) | ||
208 | { | ||
209 | struct platform_device *pdev; | ||
210 | struct resource r[1]; | ||
211 | int err; | ||
212 | |||
213 | np = of_get_parent(np); | ||
214 | if (!np) | ||
215 | return -ENODEV; | ||
216 | |||
217 | err = of_address_to_resource(np, 0, &r[0]); | ||
218 | of_node_put(np); | ||
219 | if (err) | ||
220 | return err; | ||
221 | |||
222 | pdev = platform_device_register_simple(MV643XX_ETH_SHARED_NAME, 0, | ||
223 | r, 1); | ||
224 | if (IS_ERR(pdev)) | ||
225 | return PTR_ERR(pdev); | ||
226 | |||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static int __init mv64x60_eth_device_setup(struct device_node *np, int id) | ||
231 | { | ||
232 | struct resource r[1]; | ||
233 | struct mv643xx_eth_platform_data pdata; | ||
234 | struct platform_device *pdev; | ||
235 | struct device_node *phy; | ||
236 | const u8 *mac_addr; | ||
237 | const int *prop; | ||
238 | const phandle *ph; | ||
239 | int err; | ||
240 | |||
241 | /* only register the shared platform device the first time through */ | ||
242 | if (id == 0 && (err = eth_register_shared_pdev(np))) | ||
243 | return err;; | ||
244 | |||
245 | memset(r, 0, sizeof(r)); | ||
246 | of_irq_to_resource(np, 0, &r[0]); | ||
247 | |||
248 | memset(&pdata, 0, sizeof(pdata)); | ||
249 | |||
250 | prop = of_get_property(np, "block-index", NULL); | ||
251 | if (!prop) | ||
252 | return -ENODEV; | ||
253 | pdata.port_number = *prop; | ||
254 | |||
255 | mac_addr = of_get_mac_address(np); | ||
256 | if (mac_addr) | ||
257 | memcpy(pdata.mac_addr, mac_addr, 6); | ||
258 | |||
259 | prop = of_get_property(np, "speed", NULL); | ||
260 | if (prop) | ||
261 | pdata.speed = *prop; | ||
262 | |||
263 | prop = of_get_property(np, "tx_queue_size", NULL); | ||
264 | if (prop) | ||
265 | pdata.tx_queue_size = *prop; | ||
266 | |||
267 | prop = of_get_property(np, "rx_queue_size", NULL); | ||
268 | if (prop) | ||
269 | pdata.rx_queue_size = *prop; | ||
270 | |||
271 | prop = of_get_property(np, "tx_sram_addr", NULL); | ||
272 | if (prop) | ||
273 | pdata.tx_sram_addr = *prop; | ||
274 | |||
275 | prop = of_get_property(np, "tx_sram_size", NULL); | ||
276 | if (prop) | ||
277 | pdata.tx_sram_size = *prop; | ||
278 | |||
279 | prop = of_get_property(np, "rx_sram_addr", NULL); | ||
280 | if (prop) | ||
281 | pdata.rx_sram_addr = *prop; | ||
282 | |||
283 | prop = of_get_property(np, "rx_sram_size", NULL); | ||
284 | if (prop) | ||
285 | pdata.rx_sram_size = *prop; | ||
286 | |||
287 | ph = of_get_property(np, "phy", NULL); | ||
288 | if (!ph) | ||
289 | return -ENODEV; | ||
290 | |||
291 | phy = of_find_node_by_phandle(*ph); | ||
292 | if (phy == NULL) | ||
293 | return -ENODEV; | ||
294 | |||
295 | prop = of_get_property(phy, "reg", NULL); | ||
296 | if (prop) { | ||
297 | pdata.force_phy_addr = 1; | ||
298 | pdata.phy_addr = *prop; | ||
299 | } | ||
300 | |||
301 | of_node_put(phy); | ||
302 | |||
303 | pdev = platform_device_alloc(MV643XX_ETH_NAME, pdata.port_number); | ||
304 | if (!pdev) | ||
305 | return -ENOMEM; | ||
306 | |||
307 | err = platform_device_add_resources(pdev, r, 1); | ||
308 | if (err) | ||
309 | goto error; | ||
310 | |||
311 | err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); | ||
312 | if (err) | ||
313 | goto error; | ||
314 | |||
315 | err = platform_device_add(pdev); | ||
316 | if (err) | ||
317 | goto error; | ||
318 | |||
319 | return 0; | ||
320 | |||
321 | error: | ||
322 | platform_device_put(pdev); | ||
323 | return err; | ||
324 | } | ||
325 | |||
204 | static int __init mv64x60_device_setup(void) | 326 | static int __init mv64x60_device_setup(void) |
205 | { | 327 | { |
206 | struct device_node *np = NULL; | 328 | struct device_node *np = NULL; |
@@ -212,6 +334,13 @@ static int __init mv64x60_device_setup(void) | |||
212 | if ((err = mv64x60_mpsc_device_setup(np, id))) | 334 | if ((err = mv64x60_mpsc_device_setup(np, id))) |
213 | goto error; | 335 | goto error; |
214 | 336 | ||
337 | for (id = 0; | ||
338 | (np = of_find_compatible_node(np, "network", | ||
339 | "marvell,mv64x60-eth")); | ||
340 | id++) | ||
341 | if ((err = mv64x60_eth_device_setup(np, id))) | ||
342 | goto error; | ||
343 | |||
215 | return 0; | 344 | return 0; |
216 | 345 | ||
217 | error: | 346 | error: |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index fa489b10c38c..08e594d495d7 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2299,7 +2299,7 @@ config UGETH_TX_ON_DEMAND | |||
2299 | 2299 | ||
2300 | config MV643XX_ETH | 2300 | config MV643XX_ETH |
2301 | tristate "MV-643XX Ethernet support" | 2301 | tristate "MV-643XX Ethernet support" |
2302 | depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || (PPC_MULTIPLATFORM && PPC32) | 2302 | depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MV64X60 || MOMENCO_OCELOT_3 || (PPC_MULTIPLATFORM && PPC32) |
2303 | select MII | 2303 | select MII |
2304 | help | 2304 | help |
2305 | This driver supports the gigabit Ethernet on the Marvell MV643XX | 2305 | This driver supports the gigabit Ethernet on the Marvell MV643XX |