Message ID | 20200323025633.6069-8-zhengdejin5@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | introduce read_poll_timeout | expand |
On 3/22/2020 7:56 PM, Dejin Zheng wrote: > it is sometimes necessary to poll a phy register by phy_read() > function until its value satisfies some condition. introduce > phy_read_poll_timeout() macros that do this. > > Suggested-by: Andrew Lunn <andrew@lunn.ch> > Reviewed-by: Andrew Lunn <andrew@lunn.ch> > Signed-off-by: Dejin Zheng <zhengdejin5@gmail.com> > --- > v5 -> v6: > - no changed. > v4 -> v5: > - no changed. > v3 -> v4: > - deal with precedence issues for parameter cond. > v2 -> v3: > - modify the parameter order of newly added functions. > phy_read_poll_timeout(val, cond, sleep_us, timeout_us, \ > phydev, regnum) > || > \/ > phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, \ > timeout_us) > v1 -> v2: > - pass a phydev and a regnum to replace args... parameter in > the phy_read_poll_timeout(), and also handle the > phy_read() function's return error. > > include/linux/phy.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/phy.h b/include/linux/phy.h > index 42a5ec9288d5..f2e0aea13a2f 100644 > --- a/include/linux/phy.h > +++ b/include/linux/phy.h > @@ -714,6 +714,19 @@ static inline int phy_read(struct phy_device *phydev, u32 regnum) > return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum); > } > > +#define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, timeout_us) \ > +({ \ > + int ret = 0; \ > + ret = read_poll_timeout(phy_read, val, (cond) || val < 0, sleep_us, \ > + timeout_us, phydev, regnum); \ > + if (val < 0) \ > + ret = val; \ > + if (ret) \ > + phydev_err(phydev, "%s failed: %d\n", __func__, ret); \> + ret; \ Those variable names are likely going to be clashing with existing variables within a function, I would recommend you prefix with double underscores: __ret, __val to avoid any variable re-declaration or shadowing.
diff --git a/include/linux/phy.h b/include/linux/phy.h index 42a5ec9288d5..f2e0aea13a2f 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -714,6 +714,19 @@ static inline int phy_read(struct phy_device *phydev, u32 regnum) return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum); } +#define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, timeout_us) \ +({ \ + int ret = 0; \ + ret = read_poll_timeout(phy_read, val, (cond) || val < 0, sleep_us, \ + timeout_us, phydev, regnum); \ + if (val < 0) \ + ret = val; \ + if (ret) \ + phydev_err(phydev, "%s failed: %d\n", __func__, ret); \ + ret; \ +}) + + /** * __phy_read - convenience function for reading a given PHY register * @phydev: the phy_device struct