colibri_imx7_emmc: enable DM_VIDEO
[oweals/u-boot.git] / cmd / mdio.c
index fb13d050752a7f2abeb615101e76046257477fe5..5e219f699d8dfbf9d3cb068b583c4df56ac2cf87 100644 (file)
@@ -1,8 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2011 Freescale Semiconductor, Inc
  * Andy Fleming
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
@@ -14,7 +13,6 @@
 #include <miiphy.h>
 #include <phy.h>
 
-
 static char last_op[2];
 static uint last_data;
 static uint last_addr_lo;
@@ -27,12 +25,12 @@ static uint last_reg_hi;
 static int extract_range(char *input, int *plo, int *phi)
 {
        char *end;
-       *plo = simple_strtol(input, &end, 0);
+       *plo = simple_strtol(input, &end, 16);
        if (end == input)
                return -1;
 
        if ((*end == '-') && *(++end))
-               *phi = simple_strtol(end, NULL, 0);
+               *phi = simple_strtol(end, NULL, 16);
        else if (*end == '\0')
                *phi = *plo;
        else
@@ -41,21 +39,27 @@ static int extract_range(char *input, int *plo, int *phi)
        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 addrhi, int devadlo, int devadhi,
                             int reglo, int reghi, unsigned short data,
                             int extended)
 {
+       struct phy_device *phydev;
        int addr, devad, reg;
        int err = 0;
 
        for (addr = addrlo; addr <= addrhi; addr++) {
+               phydev = bus->phymap[addr];
+
                for (devad = devadlo; devad <= devadhi; devad++) {
                        for (reg = reglo; reg <= reghi; reg++) {
-                               if (!extended)
+                               if (!phydev)
                                        err = bus->write(bus, addr, devad,
                                                         reg, data);
+                               else if (!extended)
+                                       err = phy_write_mmd(phydev, devad,
+                                                           reg, data);
                                else
                                        err = phydev->drv->writeext(phydev,
                                                        addr, devad, reg, data);
@@ -70,23 +74,27 @@ err_out:
        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 addrhi, int devadlo, int devadhi,
                            int reglo, int reghi, int extended)
 {
        int addr, devad, reg;
+       struct phy_device *phydev;
 
        printf("Reading from bus %s\n", bus->name);
        for (addr = addrlo; addr <= addrhi; addr++) {
-               printf("PHY at address %d:\n", addr);
+               phydev = bus->phymap[addr];
+               printf("PHY at address %x:\n", addr);
 
                for (devad = devadlo; devad <= devadhi; devad++) {
                        for (reg = reglo; reg <= reghi; reg++) {
                                int val;
 
-                               if (!extended)
+                               if (!phydev)
                                        val = bus->read(bus, addr, devad, reg);
+                               else if (!extended)
+                                       val = phy_read_mmd(phydev, devad, reg);
                                else
                                        val = phydev->drv->readext(phydev, addr,
                                                devad, reg);
@@ -224,14 +232,14 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                bus = phydev->bus;
                                extended = 1;
                        } else {
-                               return -1;
+                               return CMD_RET_FAILURE;
                        }
 
                        if (!phydev->drv ||
                            (!phydev->drv->writeext && (op[0] == 'w')) ||
                            (!phydev->drv->readext && (op[0] == 'r'))) {
                                puts("PHY does not have extended functions\n");
-                               return -1;
+                               return CMD_RET_FAILURE;
                        }
                }
        }
@@ -243,14 +251,14 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        case 'r':
                if (pos > 1)
                        if (extract_reg_range(argv[pos--], &devadlo, &devadhi,
-                                       &reglo, &reghi))
-                               return -1;
+                                             &reglo, &reghi))
+                               return CMD_RET_FAILURE;
 
        default:
                if (pos > 1)
-                       if (extract_phy_range(&(argv[2]), pos - 1, &bus,
-                                       &phydev, &addrlo, &addrhi))
-                               return -1;
+                       if (extract_phy_range(&argv[2], pos - 1, &bus,
+                                             &phydev, &addrlo, &addrhi))
+                               return CMD_RET_FAILURE;
 
                break;
        }
@@ -266,12 +274,12 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
        switch (op[0]) {
        case 'w':
-               mdio_write_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi,
+               mdio_write_ranges(bus, addrlo, addrhi, devadlo, devadhi,
                                  reglo, reghi, data, extended);
                break;
 
        case 'r':
-               mdio_read_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi,
+               mdio_read_ranges(bus, addrlo, addrhi, devadlo, devadhi,
                                 reglo, reghi, extended);
                break;
        }