ar8216: factor out PHY init code into a generic function
PHY init code in the switch-specific hw_init functions is mainly identical. Factor it out into a generic ar8xxx_phy_init function. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 43331
This commit is contained in:
		@@ -342,6 +342,28 @@ ar8xxx_phy_poll_reset(struct mii_bus *bus)
 | 
			
		||||
        return -ETIMEDOUT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ar8xxx_phy_init(struct ar8xxx_priv *priv, bool support_1000)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	struct mii_bus *bus;
 | 
			
		||||
 | 
			
		||||
	if (priv->chip->fixup_phys)
 | 
			
		||||
		priv->chip->fixup_phys(priv);
 | 
			
		||||
 | 
			
		||||
	bus = priv->mii_bus;
 | 
			
		||||
	for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
 | 
			
		||||
		/* initialize the port itself */
 | 
			
		||||
		mdiobus_write(bus, i, MII_ADVERTISE,
 | 
			
		||||
			ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
 | 
			
		||||
		if (support_1000)
 | 
			
		||||
			mdiobus_write(bus, i, MII_CTRL1000, ADVERTISE_1000FULL);
 | 
			
		||||
		mdiobus_write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ar8xxx_phy_poll_reset(bus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static u32
 | 
			
		||||
ar8xxx_mii_read(struct ar8xxx_priv *priv, int reg)
 | 
			
		||||
{
 | 
			
		||||
@@ -888,22 +910,10 @@ ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 members)
 | 
			
		||||
static int
 | 
			
		||||
ar8236_hw_init(struct ar8xxx_priv *priv)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	struct mii_bus *bus;
 | 
			
		||||
 | 
			
		||||
	if (priv->initialized)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* Initialize the PHYs */
 | 
			
		||||
	bus = priv->mii_bus;
 | 
			
		||||
	for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
 | 
			
		||||
		mdiobus_write(bus, i, MII_ADVERTISE,
 | 
			
		||||
			      ADVERTISE_ALL | ADVERTISE_PAUSE_CAP |
 | 
			
		||||
			      ADVERTISE_PAUSE_ASYM);
 | 
			
		||||
		mdiobus_write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ar8xxx_phy_poll_reset(bus);
 | 
			
		||||
	ar8xxx_phy_init(priv, false);
 | 
			
		||||
 | 
			
		||||
	priv->initialized = true;
 | 
			
		||||
	return 0;
 | 
			
		||||
@@ -940,9 +950,7 @@ static const struct ar8xxx_chip ar8236_chip = {
 | 
			
		||||
static int
 | 
			
		||||
ar8316_hw_init(struct ar8xxx_priv *priv)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	u32 val, newval;
 | 
			
		||||
	struct mii_bus *bus;
 | 
			
		||||
 | 
			
		||||
	val = priv->read(priv, AR8316_REG_POSTRIP);
 | 
			
		||||
 | 
			
		||||
@@ -981,17 +989,7 @@ ar8316_hw_init(struct ar8xxx_priv *priv)
 | 
			
		||||
		msleep(1000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Initialize the ports */
 | 
			
		||||
	bus = priv->mii_bus;
 | 
			
		||||
	for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
 | 
			
		||||
		/* initialize the port itself */
 | 
			
		||||
		mdiobus_write(bus, i, MII_ADVERTISE,
 | 
			
		||||
			ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
 | 
			
		||||
		mdiobus_write(bus, i, MII_CTRL1000, ADVERTISE_1000FULL);
 | 
			
		||||
		mdiobus_write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ar8xxx_phy_poll_reset(bus);
 | 
			
		||||
	ar8xxx_phy_init(priv, true);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	priv->initialized = true;
 | 
			
		||||
@@ -1622,9 +1620,7 @@ ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np)
 | 
			
		||||
static int
 | 
			
		||||
ar8327_hw_init(struct ar8xxx_priv *priv)
 | 
			
		||||
{
 | 
			
		||||
	struct mii_bus *bus;
 | 
			
		||||
	int ret;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	if (priv->phy->dev.of_node)
 | 
			
		||||
		ret = ar8327_hw_config_of(priv, priv->phy->dev.of_node);
 | 
			
		||||
@@ -1637,19 +1633,7 @@ ar8327_hw_init(struct ar8xxx_priv *priv)
 | 
			
		||||
 | 
			
		||||
	ar8327_leds_init(priv);
 | 
			
		||||
 | 
			
		||||
	priv->chip->fixup_phys(priv);
 | 
			
		||||
 | 
			
		||||
	bus = priv->mii_bus;
 | 
			
		||||
	for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
 | 
			
		||||
		/* start aneg on the PHY */
 | 
			
		||||
		mdiobus_write(bus, i, MII_ADVERTISE, ADVERTISE_ALL |
 | 
			
		||||
						     ADVERTISE_PAUSE_CAP |
 | 
			
		||||
						     ADVERTISE_PAUSE_ASYM);
 | 
			
		||||
		mdiobus_write(bus, i, MII_CTRL1000, ADVERTISE_1000FULL);
 | 
			
		||||
		mdiobus_write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ar8xxx_phy_poll_reset(bus);
 | 
			
		||||
	ar8xxx_phy_init(priv, true);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user