net: usb: lan78xx: move LED DT configuration to helper
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 5 May 2025 08:43:38 +0000 (10:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 May 2025 11:57:05 +0000 (12:57 +0100)
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>
drivers/net/usb/lan78xx.c

index 7f1ecc415d53d8bb3f21e45f39ee45d4b3f79d8d..07530eef82cb6894f437809c5e035a9b41f9254d 100644 (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);