[ar71xx] fix platform device ids of the USB controllers
[openwrt/svn-archive/archive.git] / target / linux / ar71xx / files / arch / mips / ar71xx / platform.c
index 9c91fa3bbe00e62aecd26980bf7288c769ff7f65..3c9b74ca2c3d4f8a04026cbfc679159debe79d34 100644 (file)
@@ -22,6 +22,8 @@
 #include <asm/mach-ar71xx/ar71xx.h>
 #include <asm/mach-ar71xx/platform.h>
 
+static u8 ar71xx_mac_base[ETH_ALEN] __initdata;
+
 /*
  * OHCI (USB full speed host controller)
  */
@@ -41,7 +43,7 @@ static struct resource ar71xx_usb_ohci_resources[] = {
 static u64 ar71xx_ohci_dmamask = DMA_BIT_MASK(32);
 static struct platform_device ar71xx_usb_ohci_device = {
        .name           = "ar71xx-ohci",
-       .id             = 0,
+       .id             = -1,
        .resource       = ar71xx_usb_ohci_resources,
        .num_resources  = ARRAY_SIZE(ar71xx_usb_ohci_resources),
        .dev = {
@@ -69,7 +71,7 @@ static struct resource ar71xx_usb_ehci_resources[] = {
 static u64 ar71xx_ehci_dmamask = DMA_BIT_MASK(32);
 static struct platform_device ar71xx_usb_ehci_device = {
        .name           = "ar71xx-ehci",
-       .id             = 0,
+       .id             = -1,
        .resource       = ar71xx_usb_ehci_resources,
        .num_resources  = ARRAY_SIZE(ar71xx_usb_ehci_resources),
        .dev = {
@@ -141,12 +143,46 @@ static void __init ar71xx_add_device_uart(void)
 }
 #endif /* CONFIG_AR71XX_EARLY_SERIAL */
 
+static struct resource ar71xx_mdio_resources[] = {
+       {
+               .name   = "mdio_base",
+               .flags  = IORESOURCE_MEM,
+               .start  = AR71XX_GE0_BASE + 0x20,
+               .end    = AR71XX_GE0_BASE + 0x38 - 1,
+       }
+};
+
+static struct ag71xx_mdio_platform_data ar71xx_mdio_data = {
+       .phy_mask       = 0xffffffff,
+};
+
+static struct platform_device ar71xx_mdio_device = {
+       .name           = "ag71xx-mdio",
+       .id             = -1,
+       .resource       = ar71xx_mdio_resources,
+       .num_resources  = ARRAY_SIZE(ar71xx_mdio_resources),
+       .dev = {
+               .platform_data = &ar71xx_mdio_data,
+       },
+};
+
+void __init ar71xx_add_device_mdio(u32 phy_mask)
+{
+       ar71xx_mdio_data.phy_mask = phy_mask;
+       platform_device_register(&ar71xx_mdio_device);
+}
+
 static struct resource ar71xx_eth0_resources[] = {
        {
                .name   = "mac_base",
                .flags  = IORESOURCE_MEM,
                .start  = AR71XX_GE0_BASE,
-               .end    = AR71XX_GE0_BASE + AR71XX_GE0_SIZE - 1,
+               .end    = AR71XX_GE0_BASE + 0x20 - 1,
+       }, {
+               .name   = "mac_base2",
+               .flags  = IORESOURCE_MEM,
+               .start  = AR71XX_GE0_BASE + 0x38,
+               .end    = AR71XX_GE0_BASE + 0x200 - 1,
        }, {
                .name   = "mii_ctrl",
                .flags  = IORESOURCE_MEM,
@@ -180,7 +216,12 @@ static struct resource ar71xx_eth1_resources[] = {
                .name   = "mac_base",
                .flags  = IORESOURCE_MEM,
                .start  = AR71XX_GE1_BASE,
-               .end    = AR71XX_GE1_BASE + AR71XX_GE1_SIZE - 1,
+               .end    = AR71XX_GE1_BASE + 0x20 - 1,
+       }, {
+               .name   = "mac_base2",
+               .flags  = IORESOURCE_MEM,
+               .start  = AR71XX_GE1_BASE + 0x38,
+               .end    = AR71XX_GE1_BASE + 0x200 - 1,
        }, {
                .name   = "mii_ctrl",
                .flags  = IORESOURCE_MEM,
@@ -209,6 +250,7 @@ static struct platform_device ar71xx_eth1_device = {
        },
 };
 
+static int ar71xx_eth_instance __initdata;
 void __init ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
                                u32 phy_mask)
 {
@@ -232,6 +274,8 @@ void __init ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
                default:
                        BUG();
                }
+               memcpy(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, ETH_ALEN);
+               ar71xx_eth0_data.mac_addr[5] += ar71xx_eth_instance;
                ar71xx_eth0_data.phy_if_mode = phy_if_mode;
                ar71xx_eth0_data.phy_mask = phy_mask;
                pdev = &ar71xx_eth0_device;
@@ -247,6 +291,8 @@ void __init ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
                default:
                        BUG();
                }
+               memcpy(ar71xx_eth1_data.mac_addr, ar71xx_mac_base, ETH_ALEN);
+               ar71xx_eth1_data.mac_addr[5] += ar71xx_eth_instance;
                ar71xx_eth1_data.phy_if_mode = phy_if_mode;
                ar71xx_eth1_data.phy_mask = phy_mask;
                pdev = &ar71xx_eth1_device;
@@ -256,8 +302,10 @@ void __init ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
                break;
        }
 
-       if (pdev)
+       if (pdev) {
                platform_device_register(pdev);
+               ar71xx_eth_instance++;
+       }
 }
 
 static struct resource ar71xx_spi_resources[] = {
@@ -286,6 +334,21 @@ void __init ar71xx_add_device_spi(struct ar71xx_spi_platform_data *pdata,
        platform_device_register(&ar71xx_spi_device);
 }
 
+void __init ar71xx_set_mac_base(char *mac_str)
+{
+       u8 tmp[ETH_ALEN];
+       int t;
+
+       t = sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
+                       &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]);
+
+       if (t == ETH_ALEN)
+               memcpy(ar71xx_mac_base, tmp, ETH_ALEN);
+       else
+               printk(KERN_DEBUG "AR71XX: failed to parse mac address "
+                               "\"%s\"\n", mac_str);
+}
+
 static int __init ar71xx_machine_setup(void)
 {
        ar71xx_print_cmdline();