Merge branch 'add-mdiobus_modify_changed-helper'
Russell King says: ==================== Add mdiobus_modify_changed() helper Sean Anderson's recent patch series is introducing more read-write operations on the MDIO bus that only need to happen if a change is being made. We have similar logic in __mdiobus_modify_changed(), but we didn't add its correponding locked variant mdiobus_modify_changed() as we had very few users. Now that we are getting more, let's add the helper. ==================== Link: https://lore.kernel.org/r/YV2UIa2eU+UjmWaE@shell.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
6d99f85e34
@ -926,6 +926,28 @@ int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mdiobus_modify);
|
||||
|
||||
/**
|
||||
* mdiobus_modify_changed - Convenience function for modifying a given mdio
|
||||
* device register and returning if it changed
|
||||
* @bus: the mii_bus struct
|
||||
* @addr: the phy address
|
||||
* @regnum: register number to write
|
||||
* @mask: bit mask of bits to clear
|
||||
* @set: bit mask of bits to set
|
||||
*/
|
||||
int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
|
||||
u16 mask, u16 set)
|
||||
{
|
||||
int err;
|
||||
|
||||
mutex_lock(&bus->mdio_lock);
|
||||
err = __mdiobus_modify_changed(bus, addr, regnum, mask, set);
|
||||
mutex_unlock(&bus->mdio_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mdiobus_modify_changed);
|
||||
|
||||
/**
|
||||
* mdio_bus_match - determine if given MDIO driver supports the given
|
||||
* MDIO device
|
||||
|
@ -2596,7 +2596,6 @@ int phylink_mii_c22_pcs_set_advertisement(struct mdio_device *pcs,
|
||||
{
|
||||
struct mii_bus *bus = pcs->bus;
|
||||
int addr = pcs->addr;
|
||||
int val, ret;
|
||||
u16 adv;
|
||||
|
||||
switch (interface) {
|
||||
@ -2610,32 +2609,12 @@ int phylink_mii_c22_pcs_set_advertisement(struct mdio_device *pcs,
|
||||
advertising))
|
||||
adv |= ADVERTISE_1000XPSE_ASYM;
|
||||
|
||||
val = mdiobus_read(bus, addr, MII_ADVERTISE);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
if (val == adv)
|
||||
return 0;
|
||||
|
||||
ret = mdiobus_write(bus, addr, MII_ADVERTISE, adv);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 1;
|
||||
return mdiobus_modify_changed(bus, addr, MII_ADVERTISE,
|
||||
0xffff, adv);
|
||||
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
val = mdiobus_read(bus, addr, MII_ADVERTISE);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
if (val == 0x0001)
|
||||
return 0;
|
||||
|
||||
ret = mdiobus_write(bus, addr, MII_ADVERTISE, 0x0001);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 1;
|
||||
return mdiobus_modify_changed(bus, addr, MII_ADVERTISE,
|
||||
0xffff, 0x0001);
|
||||
|
||||
default:
|
||||
/* Nothing to do for other modes */
|
||||
|
@ -349,6 +349,8 @@ int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
|
||||
int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val);
|
||||
int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask,
|
||||
u16 set);
|
||||
int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
|
||||
u16 mask, u16 set);
|
||||
|
||||
static inline u32 mdiobus_c45_addr(int devad, u16 regnum)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user