diff options
author | Antoine Tenart <antoine.tenart@bootlin.com> | 2020-06-23 16:30:07 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-06-24 14:33:16 -0700 |
commit | 0ef44e5cab8dbf0a0327871b48fe7c8425d0d885 (patch) | |
tree | 0606c9c9ee72e8f12b616c00246fa5988b95a36e | |
parent | 7b0cc34ac4795f5e1b7c586f136866f25e9b5ae5 (diff) | |
download | linux-stable-0ef44e5cab8dbf0a0327871b48fe7c8425d0d885.tar.gz linux-stable-0ef44e5cab8dbf0a0327871b48fe7c8425d0d885.tar.bz2 linux-stable-0ef44e5cab8dbf0a0327871b48fe7c8425d0d885.zip |
net: phy: add support for a common probe between shared PHYs
Shared PHYs (PHYs in the same hardware package) may have shared
registers and their drivers would usually need to share information.
There is currently a way to have a shared (part of the) init, by using
phy_package_init_once(). This patch extends the logic to share parts of
the probe to allow sharing the initialization of locks or resources
retrieval.
Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/phy.h | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/include/linux/phy.h b/include/linux/phy.h index 7860d56c6bf5..6fb8f302978d 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -244,7 +244,8 @@ struct phy_package_shared { }; /* used as bit number in atomic bitops */ -#define PHY_SHARED_F_INIT_DONE 0 +#define PHY_SHARED_F_INIT_DONE 0 +#define PHY_SHARED_F_PROBE_DONE 1 /* * The Bus class for PHYs. Devices which provide access to @@ -1566,14 +1567,25 @@ static inline int __phy_package_write(struct phy_device *phydev, return __mdiobus_write(phydev->mdio.bus, shared->addr, regnum, val); } -static inline bool phy_package_init_once(struct phy_device *phydev) +static inline bool __phy_package_set_once(struct phy_device *phydev, + unsigned int b) { struct phy_package_shared *shared = phydev->shared; if (!shared) return false; - return !test_and_set_bit(PHY_SHARED_F_INIT_DONE, &shared->flags); + return !test_and_set_bit(b, &shared->flags); +} + +static inline bool phy_package_init_once(struct phy_device *phydev) +{ + return __phy_package_set_once(phydev, PHY_SHARED_F_INIT_DONE); +} + +static inline bool phy_package_probe_once(struct phy_device *phydev) +{ + return __phy_package_set_once(phydev, PHY_SHARED_F_PROBE_DONE); } extern struct bus_type mdio_bus_type; |