[AVR32] Move ethernet tag parsing to board-specific code
authorHaavard Skinnemoen <hskinnemoen@atmel.com>
Mon, 4 Dec 2006 12:58:27 +0000 (13:58 +0100)
committerHaavard Skinnemoen <hskinnemoen@atmel.com>
Fri, 8 Dec 2006 12:06:19 +0000 (13:06 +0100)
By moving the ethernet tag parsing to the board-specific code we avoid
the issue of figuring out which device we're supposed to attach the
information to.  The board specific code knows this because it's
where the actual devices are instantiated.

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
arch/avr32/boards/atstk1000/atstk1002.c
arch/avr32/kernel/setup.c

index cced73c58115f8323d4b19e95451ad76f4038374..f65865cd9c3bd0effddd69ab1e3b2b4cc429bb85 100644 (file)
@@ -8,19 +8,32 @@
  * published by the Free Software Foundation.
  */
 #include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
 
+#include <asm/setup.h>
 #include <asm/arch/board.h>
 #include <asm/arch/init.h>
 
-struct eth_platform_data __initdata eth0_data = {
-       .valid          = 1,
-       .mii_phy_addr   = 0x10,
-       .is_rmii        = 0,
-       .hw_addr        = { 0x6a, 0x87, 0x71, 0x14, 0xcd, 0xcb },
-};
-
+static struct eth_platform_data __initdata eth_data[2];
 extern struct lcdc_platform_data atstk1000_fb0_data;
 
+static int __init parse_tag_ethernet(struct tag *tag)
+{
+       int i;
+
+       i = tag->u.ethernet.mac_index;
+       if (i < ARRAY_SIZE(eth_data)) {
+               eth_data[i].mii_phy_addr = tag->u.ethernet.mii_phy_addr;
+               memcpy(&eth_data[i].hw_addr, tag->u.ethernet.hw_address,
+                      sizeof(eth_data[i].hw_addr));
+               eth_data[i].valid = 1;
+       }
+       return 0;
+}
+__tagtable(ATAG_ETHERNET, parse_tag_ethernet);
+
 void __init setup_board(void)
 {
        at32_map_usart(1, 0);   /* /dev/ttyS0 */
@@ -38,7 +51,9 @@ static int __init atstk1002_init(void)
        at32_add_device_usart(1);
        at32_add_device_usart(2);
 
-       at32_add_device_eth(0, &eth0_data);
+       if (eth_data[0].valid)
+               at32_add_device_eth(0, &eth_data[0]);
+
        at32_add_device_spi(0);
        at32_add_device_lcdc(0, &atstk1000_fb0_data);
 
index ea2d1ffee4780c14ea6237f21090d1cbfd036f65..a34211601008420f456e185b825c9ed426eb51c7 100644 (file)
@@ -229,30 +229,6 @@ static int __init parse_tag_rsvd_mem(struct tag *tag)
 }
 __tagtable(ATAG_RSVD_MEM, parse_tag_rsvd_mem);
 
-static int __init parse_tag_ethernet(struct tag *tag)
-{
-#if 0
-       const struct platform_device *pdev;
-
-       /*
-        * We really need a bus type that supports "classes"...this
-        * will do for now (until we must handle other kinds of
-        * ethernet controllers)
-        */
-       pdev = platform_get_device("macb", tag->u.ethernet.mac_index);
-       if (pdev && pdev->dev.platform_data) {
-               struct eth_platform_data *data = pdev->dev.platform_data;
-
-               data->valid = 1;
-               data->mii_phy_addr = tag->u.ethernet.mii_phy_addr;
-               memcpy(data->hw_addr, tag->u.ethernet.hw_address,
-                      sizeof(data->hw_addr));
-       }
-#endif
-       return 0;
-}
-__tagtable(ATAG_ETHERNET, parse_tag_ethernet);
-
 /*
  * Scan the tag table for this tag, and call its parse function. The
  * tag table is built by the linker from all the __tagtable