drivers: net: aquantia: set SMBus addr based on DT property
authorAlex Marginean <alexandru.marginean@nxp.com>
Thu, 14 Nov 2019 16:28:34 +0000 (18:28 +0200)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 9 Dec 2019 15:47:43 +0000 (09:47 -0600)
Aquantia PHYs have a SMBus interface mostly used for debug.  The addresses
on this interface are normally set up by PHY firmware, but depending on the
board they may end up not being unique.  Add an optional DT property used
to change SMBus address if needed.

Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/aquantia.c

index 3b036d01c760c2bc8b65df5bd9a5fb61b70102a4..3992a97712488bb1f9d93f8ba57a4ac9481be5d9 100644 (file)
@@ -94,6 +94,9 @@
 #define AQUANTIA_VND1_GSYSCFG_5G               3
 #define AQUANTIA_VND1_GSYSCFG_10G              4
 
+#define AQUANTIA_VND1_SMBUS0                   0xc485
+#define AQUANTIA_VND1_SMBUS1                   0xc495
+
 /* addresses of memory segments in the phy */
 #define DRAM_BASE_ADDR 0x3FFE0000
 #define IRAM_BASE_ADDR 0x40000000
@@ -355,6 +358,18 @@ static int aquantia_dts_config(struct phy_device *phydev)
                phy_write(phydev, MDIO_MMD_PMAPMD, AQUANTIA_PMA_RX_VENDOR_P1,
                          reg);
        }
+       if (!ofnode_read_u32(node, "smb-addr", &prop)) {
+               debug("smb-addr = %x\n", (int)prop);
+               /*
+                * there are two addresses here, normally just one bus would
+                * be in use so we're setting both regs using the same DT
+                * property.
+                */
+               phy_write(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_SMBUS0,
+                         (u16)(prop << 1));
+               phy_write(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_SMBUS1,
+                         (u16)(prop << 1));
+       }
 
 #endif
        return 0;