net: usb: lan78xx: move LED DT configuration to helper

Extract the LED enable logic based on the "microchip,led-modes"
property into a new helper function lan78xx_configure_leds_from_dt().

This simplifies lan78xx_phy_init() and improves modularity.
No functional changes intended.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Thangaraj Samynathan <thangaraj.s@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Oleksij Rempel 2025-05-05 10:43:38 +02:00 committed by David S. Miller
parent d39f339d26
commit 8ba1f33c55

View File

@ -2649,6 +2649,49 @@ static int lan78xx_mac_prepare_for_phy(struct lan78xx_net *dev)
return 0;
}
/**
* lan78xx_configure_leds_from_dt() - Configure LED enables based on DT
* @dev: LAN78xx device
* @phydev: PHY device (must be valid)
*
* Reads "microchip,led-modes" property from the PHY's DT node and enables
* the corresponding number of LEDs by writing to HW_CFG.
*
* This helper preserves the original logic, enabling up to 4 LEDs.
* If the property is not present, this function does nothing.
*
* Return: 0 on success or a negative error code.
*/
static int lan78xx_configure_leds_from_dt(struct lan78xx_net *dev,
struct phy_device *phydev)
{
struct device_node *np = phydev->mdio.dev.of_node;
u32 reg;
int len, ret;
if (!np)
return 0;
len = of_property_count_elems_of_size(np, "microchip,led-modes",
sizeof(u32));
if (len < 0)
return 0;
ret = lan78xx_read_reg(dev, HW_CFG, &reg);
if (ret < 0)
return ret;
reg &= ~(HW_CFG_LED0_EN_ | HW_CFG_LED1_EN_ |
HW_CFG_LED2_EN_ | HW_CFG_LED3_EN_);
reg |= (len > 0) * HW_CFG_LED0_EN_ |
(len > 1) * HW_CFG_LED1_EN_ |
(len > 2) * HW_CFG_LED2_EN_ |
(len > 3) * HW_CFG_LED3_EN_;
return lan78xx_write_reg(dev, HW_CFG, reg);
}
static int lan78xx_phy_init(struct lan78xx_net *dev)
{
__ETHTOOL_DECLARE_LINK_MODE_MASK(fc) = { 0, };
@ -2704,32 +2747,9 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
phy_support_eee(phydev);
if (phydev->mdio.dev.of_node) {
u32 reg;
int len;
len = of_property_count_elems_of_size(phydev->mdio.dev.of_node,
"microchip,led-modes",
sizeof(u32));
if (len >= 0) {
/* Ensure the appropriate LEDs are enabled */
ret = lan78xx_read_reg(dev, HW_CFG, &reg);
if (ret < 0)
return ret;
reg &= ~(HW_CFG_LED0_EN_ |
HW_CFG_LED1_EN_ |
HW_CFG_LED2_EN_ |
HW_CFG_LED3_EN_);
reg |= (len > 0) * HW_CFG_LED0_EN_ |
(len > 1) * HW_CFG_LED1_EN_ |
(len > 2) * HW_CFG_LED2_EN_ |
(len > 3) * HW_CFG_LED3_EN_;
ret = lan78xx_write_reg(dev, HW_CFG, reg);
if (ret < 0)
return ret;
}
}
ret = lan78xx_configure_leds_from_dt(dev, phydev);
if (ret)
goto free_phy;
genphy_config_aneg(phydev);