Commit 8ba1f33c authored by Oleksij Rempel's avatar Oleksij Rempel Committed by David S. Miller
Browse files

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: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: default avatarThangaraj Samynathan <thangaraj.s@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d39f339d
Loading
Loading
Loading
Loading
+46 −26
Original line number Diff line number Diff line
@@ -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);