#define DOWNSHIFT_COUNT_MAX              5
 
 #define MAX_LEDS                         4
+#define VSC85XX_SUPP_LED_MODES (BIT(VSC8531_LINK_ACTIVITY) | \
+                               BIT(VSC8531_LINK_1000_ACTIVITY) | \
+                               BIT(VSC8531_LINK_100_ACTIVITY) | \
+                               BIT(VSC8531_LINK_10_ACTIVITY) | \
+                               BIT(VSC8531_LINK_100_1000_ACTIVITY) | \
+                               BIT(VSC8531_LINK_10_1000_ACTIVITY) | \
+                               BIT(VSC8531_LINK_10_100_ACTIVITY) | \
+                               BIT(VSC8531_DUPLEX_COLLISION) | \
+                               BIT(VSC8531_COLLISION) | \
+                               BIT(VSC8531_ACTIVITY) | \
+                               BIT(VSC8531_AUTONEG_FAULT) | \
+                               BIT(VSC8531_SERIAL_MODE) | \
+                               BIT(VSC8531_FORCE_LED_OFF) | \
+                               BIT(VSC8531_FORCE_LED_ON))
+
 struct vsc8531_private {
        int rate_magic;
+       u16 supp_led_modes;
        u8 leds_mode[MAX_LEDS];
        u8 nleds;
 };
                                   char *led,
                                   u8 default_mode)
 {
+       struct vsc8531_private *priv = phydev->priv;
        struct device *dev = &phydev->mdio.dev;
        struct device_node *of_node = dev->of_node;
        u8 led_mode;
 
        led_mode = default_mode;
        err = of_property_read_u8(of_node, led, &led_mode);
-       if (!err && (led_mode > 15 || led_mode == 7 || led_mode == 11)) {
+       if (!err && !(BIT(led_mode) & priv->supp_led_modes)) {
                phydev_err(phydev, "DT %s invalid\n", led);
                return -EINVAL;
        }
 
        vsc8531->rate_magic = rate_magic;
        vsc8531->nleds = 2;
+       vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES;
 
        return vsc85xx_dt_led_modes_get(phydev, default_mode);
 }