mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
net: phy: introduce genphy_match_phy_device()
Introduce new API, genphy_match_phy_device(), to provide a way to check to match a PHY driver for a PHY device based on the info stored in the PHY device struct. The function generalize the logic used in phy_bus_match() to check the PHY ID whether if C45 or C22 ID should be used for matching. This is useful for custom .match_phy_device function that wants to use the generic logic under some condition. (example a PHY is already setup and provide the correct PHY ID) Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> Link: https://patch.msgid.link/20250517201353.5137-5-ansuelsmth@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1b76b2497a
commit
d6c45707ac
|
|
@ -543,20 +543,26 @@ static int phy_scan_fixups(struct phy_device *phydev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int phy_bus_match(struct device *dev, const struct device_driver *drv)
|
||||
/**
|
||||
* genphy_match_phy_device - match a PHY device with a PHY driver
|
||||
* @phydev: target phy_device struct
|
||||
* @phydrv: target phy_driver struct
|
||||
*
|
||||
* Description: Checks whether the given PHY device matches the specified
|
||||
* PHY driver. For Clause 45 PHYs, iterates over the available device
|
||||
* identifiers and compares them against the driver's expected PHY ID,
|
||||
* applying the provided mask. For Clause 22 PHYs, a direct ID comparison
|
||||
* is performed.
|
||||
*
|
||||
* Return: 1 if the PHY device matches the driver, 0 otherwise.
|
||||
*/
|
||||
int genphy_match_phy_device(struct phy_device *phydev,
|
||||
const struct phy_driver *phydrv)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
const struct phy_driver *phydrv = to_phy_driver(drv);
|
||||
const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
|
||||
int i;
|
||||
|
||||
if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
|
||||
return 0;
|
||||
|
||||
if (phydrv->match_phy_device)
|
||||
return phydrv->match_phy_device(phydev, phydrv);
|
||||
|
||||
if (phydev->is_c45) {
|
||||
const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
|
||||
int i;
|
||||
|
||||
for (i = 1; i < num_ids; i++) {
|
||||
if (phydev->c45_ids.device_ids[i] == 0xffffffff)
|
||||
continue;
|
||||
|
|
@ -565,11 +571,27 @@ static int phy_bus_match(struct device *dev, const struct device_driver *drv)
|
|||
phydrv->phy_id, phydrv->phy_id_mask))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
return phy_id_compare(phydev->phy_id, phydrv->phy_id,
|
||||
phydrv->phy_id_mask);
|
||||
}
|
||||
|
||||
return phy_id_compare(phydev->phy_id, phydrv->phy_id,
|
||||
phydrv->phy_id_mask);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(genphy_match_phy_device);
|
||||
|
||||
static int phy_bus_match(struct device *dev, const struct device_driver *drv)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
const struct phy_driver *phydrv = to_phy_driver(drv);
|
||||
|
||||
if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
|
||||
return 0;
|
||||
|
||||
if (phydrv->match_phy_device)
|
||||
return phydrv->match_phy_device(phydev, phydrv);
|
||||
|
||||
return genphy_match_phy_device(phydev, phydrv);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
|
|
|||
|
|
@ -1868,6 +1868,9 @@ char *phy_attached_info_irq(struct phy_device *phydev)
|
|||
__malloc;
|
||||
void phy_attached_info(struct phy_device *phydev);
|
||||
|
||||
int genphy_match_phy_device(struct phy_device *phydev,
|
||||
const struct phy_driver *phydrv);
|
||||
|
||||
/* Clause 22 PHY */
|
||||
int genphy_read_abilities(struct phy_device *phydev);
|
||||
int genphy_setup_forced(struct phy_device *phydev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user