net: phy: add phy_modify() accessor
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 2 Jan 2018 10:58:53 +0000 (10:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Jan 2018 16:00:23 +0000 (11:00 -0500)
Add phy_modify() convenience accessor to complement the mdiobus
counterpart.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy-core.c
include/linux/phy.h

index 48e762bf6464aeee6ada3e304e6b7b31ee4ce5a5..44d09b1920149379694f9d40feb277140e245e49 100644 (file)
@@ -349,6 +349,29 @@ int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set)
 }
 EXPORT_SYMBOL_GPL(__phy_modify);
 
+/**
+ * phy_modify - Convenience function for modifying a given PHY register
+ * @phydev: the phy_device struct
+ * @regnum: register number to write
+ * @mask: bit mask of bits to clear
+ * @set: new value of bits set in mask to write to @regnum
+ *
+ * NOTE: MUST NOT be called from interrupt context,
+ * because the bus read/write functions may wait for an interrupt
+ * to conclude the operation.
+ */
+int phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set)
+{
+       int ret;
+
+       mutex_lock(&phydev->mdio.bus->mdio_lock);
+       ret = __phy_modify(phydev, regnum, mask, set);
+       mutex_unlock(&phydev->mdio.bus->mdio_lock);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(phy_modify);
+
 static int __phy_read_page(struct phy_device *phydev)
 {
        return phydev->drv->read_page(phydev);
index af1a740dafd4ceb432eb98cd9ae0ec8be7897ed6..135aba5c3d3938c8d05a273c84955f9bf1ab9ec1 100644 (file)
@@ -762,6 +762,7 @@ static inline int __phy_write(struct phy_device *phydev, u32 regnum, u16 val)
 }
 
 int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
+int phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
 
 /**
  * phy_interrupt_is_valid - Convenience function for testing a given PHY irq