summaryrefslogtreecommitdiff
path: root/target/linux/generic/files/drivers
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-11-19 20:17:52 +0000
committerFelix Fietkau <nbd@openwrt.org>2014-11-19 20:17:52 +0000
commit898712f43f30f464e0a31f8d3f1e9e272eafb6aa (patch)
tree540fa6ee046a56f0c642f006ca2a2ff306cb8f8e /target/linux/generic/files/drivers
parent20baeb55954eb896071e76410e574ee44239c40b (diff)
downloadmtk-20170518-898712f43f30f464e0a31f8d3f1e9e272eafb6aa.zip
mtk-20170518-898712f43f30f464e0a31f8d3f1e9e272eafb6aa.tar.gz
mtk-20170518-898712f43f30f464e0a31f8d3f1e9e272eafb6aa.tar.bz2
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
Diffstat (limited to 'target/linux/generic/files/drivers')
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.c66
1 files changed, 25 insertions, 41 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
index 3673612..b2c87db 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -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;
}