From cc225d163b5a4f7a0d1968298bf7927306646a47 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 28 Apr 2023 01:53:01 +0200 Subject: [PATCH] net: phy: mediatek-ge: add LED configuration interface This adds a small hack similar to the one used for ar8xxx switches to read a reg:value map for configuring the LED configuration registers. This allows OpenWrt to write device-specific LED action as well as blink configurations. It is unlikely to be accepted upstream, as upstream plans on integrating their own framework for handling these LEDs. Signed-off-by: David Bauer --- drivers/net/phy/mediatek-ge.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) --- a/drivers/net/phy/mediatek-ge.c +++ b/drivers/net/phy/mediatek-ge.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0+ +#include #include #include #include @@ -53,6 +54,36 @@ static int mt7530_phy_config_init(struct return 0; } +static int mt7530_led_config_of(struct phy_device *phydev) +{ + struct device_node *np = phydev->mdio.dev.of_node; + const __be32 *paddr; + int len; + int i; + + paddr = of_get_property(np, "mediatek,led-config", &len); + if (!paddr) + return 0; + + if (len < (2 * sizeof(*paddr))) + return -EINVAL; + + len /= sizeof(*paddr); + + phydev_warn(phydev, "Configure LED registers (num=%d)\n", len); + for (i = 0; i < len - 1; i += 2) { + u32 reg; + u32 val; + + reg = be32_to_cpup(paddr + i); + val = be32_to_cpup(paddr + i + 1); + + phy_write_mmd(phydev, MDIO_MMD_VEND2, reg, val); + } + + return 0; +} + static int mt7531_phy_config_init(struct phy_device *phydev) { mtk_gephy_config_init(phydev); @@ -65,6 +96,9 @@ static int mt7531_phy_config_init(struct phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404); phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404); + /* LED Config*/ + mt7530_led_config_of(phydev); + return 0; }