Merge branch '2023-09-28-assorted-minor-fixes'
[platform/kernel/u-boot.git] / cmd / mdio.c
index efe8c9e..3c74326 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <dm.h>
 #include <miiphy.h>
 #include <phy.h>
 
@@ -54,7 +55,10 @@ static int mdio_write_ranges(struct mii_dev *bus,
 
                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
@@ -88,7 +92,9 @@ static int mdio_read_ranges(struct mii_dev *bus,
                        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,
@@ -185,7 +191,8 @@ static int extract_phy_range(char *const argv[], int argc, struct mii_dev **bus,
 }
 
 /* ---------------------------------------------------------------- */
-static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_mdio(struct cmd_tbl *cmdtp, int flag, int argc,
+                  char *const argv[])
 {
        char op[2];
        int addrlo, addrhi, reglo, reghi, devadlo, devadhi;
@@ -198,6 +205,11 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (argc < 2)
                return CMD_RET_USAGE;
 
+#ifdef CONFIG_DM_MDIO
+       /* probe DM MII device before any operation so they are all accesible */
+       dm_mdio_probe_devices();
+#endif
+
        /*
         * We use the last specified parameters, unless new ones are
         * entered.
@@ -242,13 +254,14 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        switch (op[0]) {
        case 'w':
                if (pos > 1)
-                       data = simple_strtoul(argv[pos--], NULL, 16);
+                       data = hextoul(argv[pos--], NULL);
+               /* Intentional fall-through - Get reg for read and write */
        case 'r':
                if (pos > 1)
                        if (extract_reg_range(argv[pos--], &devadlo, &devadhi,
                                              &reglo, &reghi))
                                return CMD_RET_FAILURE;
-
+               /* Intentional fall-through - Get phy for all commands */
        default:
                if (pos > 1)
                        if (extract_phy_range(&argv[2], pos - 1, &bus,
@@ -258,6 +271,11 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                break;
        }
 
+       if (!bus) {
+               puts("No MDIO bus found\n");
+               return CMD_RET_FAILURE;
+       }
+
        if (op[0] == 'l') {
                mdio_list_devices();