#include "../phylib.h"
 #include "mtk.h"
 
+#define MTK_PHY_MAX_LEDS                       2
+
 #define MTK_GPHY_ID_MT7981                     0x03a29461
 #define MTK_GPHY_ID_MT7988                     0x03a29481
+#define MTK_GPHY_ID_AN7581                     0x03a294c1
 
 #define MTK_EXT_PAGE_ACCESS                    0x1f
 #define MTK_PHY_PAGE_STANDARD                  0x0000
        return mt798x_phy_calibration(phydev);
 }
 
+static int an7581_phy_probe(struct phy_device *phydev)
+{
+       struct mtk_socphy_priv *priv;
+       struct pinctrl *pinctrl;
+
+       /* Toggle pinctrl to enable PHY LED */
+       pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "gbe-led");
+       if (IS_ERR(pinctrl))
+               dev_err(&phydev->mdio.bus->dev,
+                       "Failed to setup PHY LED pinctrl\n");
+
+       priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       phydev->priv = priv;
+
+       return 0;
+}
+
+static int an7581_phy_led_polarity_set(struct phy_device *phydev, int index,
+                                      unsigned long modes)
+{
+       u32 mode;
+       u16 val;
+
+       if (index >= MTK_PHY_MAX_LEDS)
+               return -EINVAL;
+
+       for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
+               switch (mode) {
+               case PHY_LED_ACTIVE_LOW:
+                       val = MTK_PHY_LED_ON_POLARITY;
+                       break;
+               case PHY_LED_ACTIVE_HIGH:
+                       val = 0;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       return phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
+                             MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,
+                             MTK_PHY_LED_ON_POLARITY, val);
+}
+
 static struct phy_driver mtk_socphy_driver[] = {
        {
                PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981),
                .led_hw_control_set = mt798x_phy_led_hw_control_set,
                .led_hw_control_get = mt798x_phy_led_hw_control_get,
        },
+       {
+               PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7581),
+               .name           = "Airoha AN7581 PHY",
+               .probe          = an7581_phy_probe,
+               .led_blink_set  = mt798x_phy_led_blink_set,
+               .led_brightness_set = mt798x_phy_led_brightness_set,
+               .led_hw_is_supported = mt798x_phy_led_hw_is_supported,
+               .led_hw_control_set = mt798x_phy_led_hw_control_set,
+               .led_hw_control_get = mt798x_phy_led_hw_control_get,
+               .led_polarity_set = an7581_phy_led_polarity_set,
+       },
 };
 
 module_phy_driver(mtk_socphy_driver);
 static const struct mdio_device_id __maybe_unused mtk_socphy_tbl[] = {
        { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981) },
        { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7988) },
+       { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7581) },
        { }
 };