Commit e6891c76 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

net: dsa: mv88e6xxx: Add serdes register read/write helper

Add a helper for accessing SERDES registers of the 6390 family.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 23ef57d8
...@@ -35,6 +35,22 @@ static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg, ...@@ -35,6 +35,22 @@ static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg,
reg, val); reg, val);
} }
static int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip,
int lane, int device, int reg, u16 *val)
{
int reg_c45 = MII_ADDR_C45 | device << 16 | reg;
return mv88e6xxx_phy_read(chip, lane, reg_c45, val);
}
static int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip,
int lane, int device, int reg, u16 val)
{
int reg_c45 = MII_ADDR_C45 | device << 16 | reg;
return mv88e6xxx_phy_write(chip, lane, reg_c45, val);
}
static int mv88e6352_serdes_power_set(struct mv88e6xxx_chip *chip, bool on) static int mv88e6352_serdes_power_set(struct mv88e6xxx_chip *chip, bool on)
{ {
u16 val, new_val; u16 val, new_val;
...@@ -298,12 +314,11 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane, ...@@ -298,12 +314,11 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane,
bool on) bool on)
{ {
u16 val, new_val; u16 val, new_val;
int reg_c45;
int err; int err;
reg_c45 = MII_ADDR_C45 | MV88E6390_SERDES_DEVICE | err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
MV88E6390_PCS_CONTROL_1; MV88E6390_PCS_CONTROL_1, &val);
err = mv88e6xxx_phy_read(chip, lane, reg_c45, &val);
if (err) if (err)
return err; return err;
...@@ -315,7 +330,8 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane, ...@@ -315,7 +330,8 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane,
new_val = val | MV88E6390_PCS_CONTROL_1_PDOWN; new_val = val | MV88E6390_PCS_CONTROL_1_PDOWN;
if (val != new_val) if (val != new_val)
err = mv88e6xxx_phy_write(chip, lane, reg_c45, new_val); err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
MV88E6390_PCS_CONTROL_1, new_val);
return err; return err;
} }
...@@ -325,12 +341,10 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane, ...@@ -325,12 +341,10 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane,
bool on) bool on)
{ {
u16 val, new_val; u16 val, new_val;
int reg_c45;
int err; int err;
reg_c45 = MII_ADDR_C45 | MV88E6390_SERDES_DEVICE | err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
MV88E6390_SGMII_CONTROL; MV88E6390_SGMII_CONTROL, &val);
err = mv88e6xxx_phy_read(chip, lane, reg_c45, &val);
if (err) if (err)
return err; return err;
...@@ -342,7 +356,8 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane, ...@@ -342,7 +356,8 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane,
new_val = val | MV88E6390_SGMII_CONTROL_PDOWN; new_val = val | MV88E6390_SGMII_CONTROL_PDOWN;
if (val != new_val) if (val != new_val)
err = mv88e6xxx_phy_write(chip, lane, reg_c45, new_val); err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
MV88E6390_SGMII_CONTROL, new_val);
return err; return err;
} }
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#define MV88E6390_PORT10_LANE1 0x15 #define MV88E6390_PORT10_LANE1 0x15
#define MV88E6390_PORT10_LANE2 0x16 #define MV88E6390_PORT10_LANE2 0x16
#define MV88E6390_PORT10_LANE3 0x17 #define MV88E6390_PORT10_LANE3 0x17
#define MV88E6390_SERDES_DEVICE (4 << 16)
/* 10GBASE-R and 10GBASE-X4/X2 */ /* 10GBASE-R and 10GBASE-X4/X2 */
#define MV88E6390_PCS_CONTROL_1 0x1000 #define MV88E6390_PCS_CONTROL_1 0x1000
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment