cmd: mdio: Switch to generic helpers when accessing the registers

Switch to use the generic helpers to access the MMD registers so that we
can used the same command also for C45 PHYs, C22 PHYs with direct and
indirect access and PHYs implementing a custom way to access the
registers.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
Carlo Caione 2019-02-08 17:25:08 +00:00 committed by Joe Hershberger
parent 4c29dc1863
commit e55047ec51

View file

@ -39,21 +39,24 @@ static int extract_range(char *input, int *plo, int *phi)
return 0; return 0;
} }
static int mdio_write_ranges(struct phy_device *phydev, struct mii_dev *bus, static int mdio_write_ranges(struct mii_dev *bus,
int addrlo, int addrlo,
int addrhi, int devadlo, int devadhi, int addrhi, int devadlo, int devadhi,
int reglo, int reghi, unsigned short data, int reglo, int reghi, unsigned short data,
int extended) int extended)
{ {
struct phy_device *phydev;
int addr, devad, reg; int addr, devad, reg;
int err = 0; int err = 0;
for (addr = addrlo; addr <= addrhi; addr++) { for (addr = addrlo; addr <= addrhi; addr++) {
phydev = bus->phymap[addr];
for (devad = devadlo; devad <= devadhi; devad++) { for (devad = devadlo; devad <= devadhi; devad++) {
for (reg = reglo; reg <= reghi; reg++) { for (reg = reglo; reg <= reghi; reg++) {
if (!extended) if (!extended)
err = bus->write(bus, addr, devad, err = phy_write_mmd(phydev, devad,
reg, data); reg, data);
else else
err = phydev->drv->writeext(phydev, err = phydev->drv->writeext(phydev,
addr, devad, reg, data); addr, devad, reg, data);
@ -68,15 +71,17 @@ err_out:
return err; return err;
} }
static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus, static int mdio_read_ranges(struct mii_dev *bus,
int addrlo, int addrlo,
int addrhi, int devadlo, int devadhi, int addrhi, int devadlo, int devadhi,
int reglo, int reghi, int extended) int reglo, int reghi, int extended)
{ {
int addr, devad, reg; int addr, devad, reg;
struct phy_device *phydev;
printf("Reading from bus %s\n", bus->name); printf("Reading from bus %s\n", bus->name);
for (addr = addrlo; addr <= addrhi; addr++) { for (addr = addrlo; addr <= addrhi; addr++) {
phydev = bus->phymap[addr];
printf("PHY at address %x:\n", addr); printf("PHY at address %x:\n", addr);
for (devad = devadlo; devad <= devadhi; devad++) { for (devad = devadlo; devad <= devadhi; devad++) {
@ -84,7 +89,7 @@ static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus,
int val; int val;
if (!extended) if (!extended)
val = bus->read(bus, addr, devad, reg); val = phy_read_mmd(phydev, devad, reg);
else else
val = phydev->drv->readext(phydev, addr, val = phydev->drv->readext(phydev, addr,
devad, reg); devad, reg);
@ -222,14 +227,14 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
bus = phydev->bus; bus = phydev->bus;
extended = 1; extended = 1;
} else { } else {
return -1; return CMD_RET_FAILURE;
} }
if (!phydev->drv || if (!phydev->drv ||
(!phydev->drv->writeext && (op[0] == 'w')) || (!phydev->drv->writeext && (op[0] == 'w')) ||
(!phydev->drv->readext && (op[0] == 'r'))) { (!phydev->drv->readext && (op[0] == 'r'))) {
puts("PHY does not have extended functions\n"); puts("PHY does not have extended functions\n");
return -1; return CMD_RET_FAILURE;
} }
} }
} }
@ -242,13 +247,13 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if (pos > 1) if (pos > 1)
if (extract_reg_range(argv[pos--], &devadlo, &devadhi, if (extract_reg_range(argv[pos--], &devadlo, &devadhi,
&reglo, &reghi)) &reglo, &reghi))
return -1; return CMD_RET_FAILURE;
default: default:
if (pos > 1) if (pos > 1)
if (extract_phy_range(&argv[2], pos - 1, &bus, if (extract_phy_range(&argv[2], pos - 1, &bus,
&phydev, &addrlo, &addrhi)) &phydev, &addrlo, &addrhi))
return -1; return CMD_RET_FAILURE;
break; break;
} }
@ -264,12 +269,12 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
switch (op[0]) { switch (op[0]) {
case 'w': case 'w':
mdio_write_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, mdio_write_ranges(bus, addrlo, addrhi, devadlo, devadhi,
reglo, reghi, data, extended); reglo, reghi, data, extended);
break; break;
case 'r': case 'r':
mdio_read_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, mdio_read_ranges(bus, addrlo, addrhi, devadlo, devadhi,
reglo, reghi, extended); reglo, reghi, extended);
break; break;
} }