summaryrefslogtreecommitdiffstats
path: root/drivers/net/phy/phy.c
diff options
context:
space:
mode:
authorRoland Hieber <rhi@pengutronix.de>2023-06-05 14:57:47 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-06-06 11:53:47 +0200
commit049162a0aace356f299fa4425bda15947ebb7ead (patch)
tree2b373c96c9fea625a904eaa2e6b44361e066bd8b /drivers/net/phy/phy.c
parenta3e42ff1571c8c52f5cc0f71c3749071bae6d498 (diff)
downloadbarebox-049162a0aace356f299fa4425bda15947ebb7ead.tar.gz
barebox-049162a0aace356f299fa4425bda15947ebb7ead.tar.xz
net: phy: add phy_modify_mmd_indirect convenience function
Add a read-modify-write convenience helper similar to phy_modify() for setting single bits in MMD registers. Signed-off-by: Roland Hieber <rhi@pengutronix.de> Link: https://lore.barebox.org/20230605125748.3665121-1-rhi@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net/phy/phy.c')
-rw-r--r--drivers/net/phy/phy.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index dbc30b66b8..74381949b4 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -882,6 +882,29 @@ void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, int devad,
phy_write(phydev, MII_MMD_DATA, data);
}
+/**
+ * phy_modify_mmd_indirect - Convenience function for modifying a MMD register
+ * @phydev: phy device
+ * @prtad: MMD Address
+ * @devad: MMD DEVAD
+ * @mask: bit mask of bits to clear
+ * @set: new value of bits set in @mask
+ *
+ */
+int phy_modify_mmd_indirect(struct phy_device *phydev, int prtad, int devad,
+ u16 mask, u16 set)
+{
+ int ret;
+
+ ret = phy_read_mmd_indirect(phydev, prtad, devad);
+ if (ret < 0)
+ return ret;
+
+ phy_write_mmd_indirect(phydev, prtad, devad, (ret & ~mask) | set);
+
+ return 0;
+}
+
int genphy_config_init(struct phy_device *phydev)
{
int val;