ar71xx: move phy interface setup into a separate function
[openwrt.git] / target / linux / ar71xx / files / arch / mips / ar71xx / devices.c
index 0759142..0091ac2 100644 (file)
@@ -194,8 +194,16 @@ void __init ar71xx_add_device_mdio(unsigned int id, u32 phy_mask)
 {
        struct platform_device *mdio_dev;
        struct ag71xx_mdio_platform_data *mdio_data;
+       unsigned int max_id;
 
-       if (id > 0) {
+       if (ar71xx_soc == AR71XX_SOC_AR9341 ||
+           ar71xx_soc == AR71XX_SOC_AR9342 ||
+           ar71xx_soc == AR71XX_SOC_AR9344)
+               max_id = 1;
+       else
+               max_id = 0;
+
+       if (id > max_id) {
                printk(KERN_ERR "ar71xx: invalid MDIO id %u\n", id);
                return;
        }
@@ -208,6 +216,18 @@ void __init ar71xx_add_device_mdio(unsigned int id, u32 phy_mask)
                mdio_data = &ar71xx_mdio1_data;
                break;
 
+       case AR71XX_SOC_AR9341:
+       case AR71XX_SOC_AR9342:
+       case AR71XX_SOC_AR9344:
+               if (id == 0) {
+                       mdio_dev = &ar71xx_mdio0_device;
+                       mdio_data = &ar71xx_mdio0_data;
+               } else {
+                       mdio_dev = &ar71xx_mdio1_device;
+                       mdio_data = &ar71xx_mdio1_data;
+               }
+               break;
+
        case AR71XX_SOC_AR7242:
                ar71xx_set_pll(AR71XX_PLL_REG_SEC_CONFIG,
                               AR7242_PLL_REG_ETH0_INT_CLOCK, 0x62000000,
@@ -228,6 +248,14 @@ void __init ar71xx_add_device_mdio(unsigned int id, u32 phy_mask)
        case AR71XX_SOC_AR9331:
                mdio_data->is_ar7240 = 1;
                break;
+
+       case AR71XX_SOC_AR9341:
+       case AR71XX_SOC_AR9342:
+       case AR71XX_SOC_AR9344:
+               if (id == 1)
+                       mdio_data->is_ar7240 = 1;
+               break;
+
        default:
                break;
        }
@@ -557,58 +585,73 @@ static void __init ar71xx_init_eth_pll_data(unsigned int id)
                pll_data->pll_1000 = pll_1000;
 }
 
-static int ar71xx_eth_instance __initdata;
-void __init ar71xx_add_device_eth(unsigned int id)
+static int __init ar71xx_setup_phy_if_mode(unsigned int id,
+                                          struct ag71xx_platform_data *pdata)
 {
-       struct platform_device *pdev;
-       struct ag71xx_platform_data *pdata;
-
-       ar71xx_init_eth_pll_data(id);
-
        switch (id) {
        case 0:
-               switch (ar71xx_eth0_data.phy_if_mode) {
+               switch (pdata->phy_if_mode) {
                case PHY_INTERFACE_MODE_MII:
-                       ar71xx_eth0_data.mii_if = MII0_CTRL_IF_MII;
+                       pdata->mii_if = MII0_CTRL_IF_MII;
                        break;
                case PHY_INTERFACE_MODE_GMII:
-                       ar71xx_eth0_data.mii_if = MII0_CTRL_IF_GMII;
+                       pdata->mii_if = MII0_CTRL_IF_GMII;
                        break;
                case PHY_INTERFACE_MODE_RGMII:
-                       ar71xx_eth0_data.mii_if = MII0_CTRL_IF_RGMII;
+                       pdata->mii_if = MII0_CTRL_IF_RGMII;
                        break;
                case PHY_INTERFACE_MODE_RMII:
-                       ar71xx_eth0_data.mii_if = MII0_CTRL_IF_RMII;
+                       pdata->mii_if = MII0_CTRL_IF_RMII;
                        break;
                default:
-                       printk(KERN_ERR "ar71xx: invalid PHY interface mode "
-                                       "for eth0\n");
-                       return;
+                       return -EINVAL;
                }
-               pdev = &ar71xx_eth0_device;
                break;
        case 1:
-               switch (ar71xx_eth1_data.phy_if_mode) {
+               switch (pdata->phy_if_mode) {
                case PHY_INTERFACE_MODE_RMII:
-                       ar71xx_eth1_data.mii_if = MII1_CTRL_IF_RMII;
+                       pdata->mii_if = MII1_CTRL_IF_RMII;
                        break;
                case PHY_INTERFACE_MODE_RGMII:
-                       ar71xx_eth1_data.mii_if = MII1_CTRL_IF_RGMII;
+                       pdata->mii_if = MII1_CTRL_IF_RGMII;
                        break;
                default:
-                       printk(KERN_ERR "ar71xx: invalid PHY interface mode "
-                                       "for eth1\n");
-                       return;
+                       return -EINVAL;
                }
-               pdev = &ar71xx_eth1_device;
                break;
-       default:
+       }
+
+       return 0;
+}
+
+static int ar71xx_eth_instance __initdata;
+void __init ar71xx_add_device_eth(unsigned int id)
+{
+       struct platform_device *pdev;
+       struct ag71xx_platform_data *pdata;
+       int err;
+
+       if (id > 1) {
                printk(KERN_ERR "ar71xx: invalid ethernet id %d\n", id);
                return;
        }
 
+       ar71xx_init_eth_pll_data(id);
+
+       if (id == 0)
+               pdev = &ar71xx_eth0_device;
+       else
+               pdev = &ar71xx_eth1_device;
+
        pdata = pdev->dev.platform_data;
 
+       err = ar71xx_setup_phy_if_mode(id, pdata);
+       if (err) {
+               printk(KERN_ERR
+                      "ar71xx: invalid PHY interface mode for GE%u\n", id);
+               return;
+       }
+
        switch (ar71xx_soc) {
        case AR71XX_SOC_AR7130:
                pdata->ddr_flush = id ? ar71xx_ddr_flush_ge1
@@ -755,6 +798,15 @@ void __init ar71xx_add_device_eth(unsigned int id)
 
        if (pdata->mii_bus_dev == NULL) {
                switch (ar71xx_soc) {
+               case AR71XX_SOC_AR9341:
+               case AR71XX_SOC_AR9342:
+               case AR71XX_SOC_AR9344:
+                       if (id == 0)
+                               pdata->mii_bus_dev = &ar71xx_mdio0_device.dev;
+                       else
+                               pdata->mii_bus_dev = &ar71xx_mdio1_device.dev;
+                       break;
+
                case AR71XX_SOC_AR7241:
                case AR71XX_SOC_AR9330:
                case AR71XX_SOC_AR9331:
This page took 0.033383 seconds and 4 git commands to generate.