struct kszphy_priv {
        const struct kszphy_type *type;
+       int led_mode;
 };
 
 static const struct kszphy_type ksz8021_type = {
        return rc < 0 ? rc : 0;
 }
 
-static int kszphy_setup_led(struct phy_device *phydev, u32 reg)
+static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val)
 {
-
-       struct device *dev = &phydev->dev;
-       struct device_node *of_node = dev->of_node;
        int rc, temp, shift;
-       u32 val;
-
-       if (!of_node && dev->parent->of_node)
-               of_node = dev->parent->of_node;
-
-       if (of_property_read_u32(of_node, "micrel,led-mode", &val))
-               return 0;
-
-       if (val > 3) {
-               dev_err(&phydev->dev, "invalid led mode: 0x%02x\n", val);
-               return -EINVAL;
-       }
 
        switch (reg) {
        case MII_KSZPHY_CTRL_1:
 
        type = priv->type;
 
-       if (type->led_mode_reg)
-               kszphy_setup_led(phydev, type->led_mode_reg);
+       if (priv->led_mode >= 0)
+               kszphy_setup_led(phydev, type->led_mode_reg, priv->led_mode);
 
        return 0;
 }
 static int kszphy_probe(struct phy_device *phydev)
 {
        const struct kszphy_type *type = phydev->drv->driver_data;
+       struct device_node *np = phydev->dev.of_node;
        struct kszphy_priv *priv;
+       int ret;
 
        priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
 
        priv->type = type;
 
+       if (type->led_mode_reg) {
+               ret = of_property_read_u32(np, "micrel,led-mode",
+                               &priv->led_mode);
+               if (ret)
+                       priv->led_mode = -1;
+
+               if (priv->led_mode > 3) {
+                       dev_err(&phydev->dev, "invalid led mode: 0x%02x\n",
+                                       priv->led_mode);
+                       priv->led_mode = -1;
+               }
+       } else {
+               priv->led_mode = -1;
+       }
+
        return 0;
 }