]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/phy/b53.c
Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot
[u-boot] / drivers / net / phy / b53.c
index 185a2cddaba661eb30fe769d6cf85b286f1bdbc7..30c4812d827d79bc8b76c4e47ffcfde7947ed282 100644 (file)
@@ -1,9 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2017
  * Broadcom
  * Florian Fainelli <f.fainelli@gmail.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
@@ -627,3 +626,142 @@ int phy_b53_init(void)
 
        return 0;
 }
+
+int do_b53_reg_read(const char *name, int argc, char * const argv[])
+{
+       u8 page, offset, width;
+       struct mii_dev *bus;
+       int ret = -EINVAL;
+       u64 value64 = 0;
+       u32 value32 = 0;
+       u16 value16 = 0;
+       u8 value8 = 0;
+
+       bus = miiphy_get_dev_by_name(name);
+       if (!bus) {
+               printf("unable to find MDIO bus: %s\n", name);
+               return ret;
+       }
+
+       page = simple_strtoul(argv[1], NULL, 16);
+       offset = simple_strtoul(argv[2], NULL, 16);
+       width = simple_strtoul(argv[3], NULL, 10);
+
+       switch (width) {
+       case 8:
+               ret = b53_mdio_read8(bus, page, offset, &value8);
+               printf("page=0x%02x, offset=0x%02x, value=0x%02x\n",
+                      page, offset, value8);
+               break;
+       case 16:
+               ret = b53_mdio_read16(bus, page, offset, &value16);
+               printf("page=0x%02x, offset=0x%02x, value=0x%04x\n",
+                      page, offset, value16);
+               break;
+       case 32:
+               ret = b53_mdio_read32(bus, page, offset, &value32);
+               printf("page=0x%02x, offset=0x%02x, value=0x%08x\n",
+                      page, offset, value32);
+               break;
+       case 48:
+               ret = b53_mdio_read48(bus, page, offset, &value64);
+               printf("page=0x%02x, offset=0x%02x, value=0x%012llx\n",
+                      page, offset, value64);
+               break;
+       case 64:
+               ret = b53_mdio_read48(bus, page, offset, &value64);
+               printf("page=0x%02x, offset=0x%02x, value=0x%016llx\n",
+                      page, offset, value64);
+               break;
+       default:
+               printf("Unsupported width: %d\n", width);
+               break;
+       }
+
+       return ret;
+}
+
+int do_b53_reg_write(const char *name, int argc, char * const argv[])
+{
+       u8 page, offset, width;
+       struct mii_dev *bus;
+       int ret = -EINVAL;
+       u64 value64 = 0;
+       u32 value = 0;
+
+       bus = miiphy_get_dev_by_name(name);
+       if (!bus) {
+               printf("unable to find MDIO bus: %s\n", name);
+               return ret;
+       }
+
+       page = simple_strtoul(argv[1], NULL, 16);
+       offset = simple_strtoul(argv[2], NULL, 16);
+       width = simple_strtoul(argv[3], NULL, 10);
+       if (width == 48 || width == 64)
+               value64 = simple_strtoull(argv[4], NULL, 16);
+       else
+               value = simple_strtoul(argv[4], NULL, 16);
+
+       switch (width) {
+       case 8:
+               ret = b53_mdio_write8(bus, page, offset, value & 0xff);
+               break;
+       case 16:
+               ret = b53_mdio_write16(bus, page, offset, value);
+               break;
+       case 32:
+               ret = b53_mdio_write32(bus, page, offset, value);
+               break;
+       case 48:
+               ret = b53_mdio_write48(bus, page, offset, value64);
+               break;
+       case 64:
+               ret = b53_mdio_write64(bus, page, offset, value64);
+               break;
+       default:
+               printf("Unsupported width: %d\n", width);
+               break;
+       }
+
+       return ret;
+}
+
+int do_b53_reg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       const char *cmd, *mdioname;
+       int ret = 0;
+
+       if (argc < 2)
+               return cmd_usage(cmdtp);
+
+       cmd = argv[1];
+       --argc;
+       ++argv;
+
+       if (!strcmp(cmd, "write")) {
+               if (argc < 4)
+                       return cmd_usage(cmdtp);
+               mdioname = argv[1];
+               --argc;
+               ++argv;
+               ret = do_b53_reg_write(mdioname, argc, argv);
+       } else if (!strcmp(cmd, "read")) {
+               if (argc < 5)
+                       return cmd_usage(cmdtp);
+               mdioname = argv[1];
+               --argc;
+               ++argv;
+               ret = do_b53_reg_read(mdioname, argc, argv);
+       } else {
+               return cmd_usage(cmdtp);
+       }
+
+       return ret;
+}
+
+U_BOOT_CMD(b53_reg, 7, 1, do_b53_reg,
+          "Broadcom B53 switch register access",
+          "write mdioname page (hex) offset (hex) width (dec) value (hex)\n"
+          "read mdioname page (hex) offset (hex) width (dec)\n"
+         );