generic: ar8216: move PHY4 RGMII workaround code out of the loop
[openwrt.git] / target / linux / generic / files / drivers / net / phy / ar8216.c
index 811e406..b34c2a8 100644 (file)
@@ -820,20 +820,20 @@ ar8316_hw_init(struct ar8216_priv *priv)
 
        priv->write(priv, AR8316_REG_POSTRIP, newval);
 
+       if (priv->port4_phy &&
+           priv->phy->interface == PHY_INTERFACE_MODE_RGMII) {
+               /* work around for phy4 rgmii mode */
+               ar8216_phy_dbg_write(priv, 4, 0x12, 0x480c);
+               /* rx delay */
+               ar8216_phy_dbg_write(priv, 4, 0x0, 0x824e);
+               /* tx delay */
+               ar8216_phy_dbg_write(priv, 4, 0x5, 0x3d47);
+               msleep(1000);
+       }
+
        /* Initialize the ports */
        bus = priv->mii_bus;
        for (i = 0; i < 5; i++) {
-               if ((i == 4) && priv->port4_phy &&
-                   priv->phy->interface == PHY_INTERFACE_MODE_RGMII) {
-                       /* work around for phy4 rgmii mode */
-                       ar8216_phy_dbg_write(priv, i, 0x12, 0x480c);
-                       /* rx delay */
-                       ar8216_phy_dbg_write(priv, i, 0x0, 0x824e);
-                       /* tx delay */
-                       ar8216_phy_dbg_write(priv, i, 0x5, 0x3d47);
-                       msleep(1000);
-               }
-
                /* initialize the port itself */
                mdiobus_write(bus, i, MII_ADVERTISE,
                        ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
@@ -1851,7 +1851,6 @@ ar8216_config_init(struct phy_device *phydev)
 {
        struct ar8216_priv *priv = phydev->priv;
        struct net_device *dev = phydev->attached_dev;
-       struct switch_dev *swdev;
        int ret;
 
        if (WARN_ON(!priv))
@@ -1872,24 +1871,15 @@ ar8216_config_init(struct phy_device *phydev)
                return 0;
        }
 
-       swdev = &priv->dev;
-       swdev->alias = dev_name(&priv->mii_bus->dev);
-       ret = register_switch(swdev, NULL);
-       if (ret)
-               goto err;
-
-       pr_info("%s: %s switch registered on %s\n",
-               swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev));
-
        priv->init = true;
 
        ret = priv->chip->hw_init(priv);
        if (ret)
-               goto err_unregister_switch;
+               return ret;
 
        ret = ar8216_sw_reset_switch(&priv->dev);
        if (ret)
-               goto err_unregister_switch;
+               return ret;
 
        /* VID fixup only needed on ar8216 */
        if (chip_is_ar8216(priv)) {
@@ -1904,11 +1894,6 @@ ar8216_config_init(struct phy_device *phydev)
        ar8xxx_mib_start(priv);
 
        return 0;
-
-err_unregister_switch:
-       unregister_switch(&priv->dev);
-err:
-       return ret;
 }
 
 static int
@@ -2004,6 +1989,7 @@ static int
 ar8216_probe(struct phy_device *phydev)
 {
        struct ar8216_priv *priv;
+       struct switch_dev *swdev;
        int ret;
 
        /* skip PHYs at unused adresses */
@@ -2028,6 +2014,15 @@ ar8216_probe(struct phy_device *phydev)
        if (ret)
                goto free_priv;
 
+       swdev = &priv->dev;
+       swdev->alias = dev_name(&priv->mii_bus->dev);
+       ret = register_switch(swdev, NULL);
+       if (ret)
+               goto free_priv;
+
+       pr_info("%s: %s switch registered on %s\n",
+               swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev));
+
 found:
        if (phydev->addr == 0) {
                if (ar8xxx_has_gige(priv)) {