net: phy: micrel: add coma mode GPIO
authorMichael Walle <michael@walle.cc>
Wed, 27 Apr 2022 21:44:06 +0000 (23:44 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Apr 2022 23:37:53 +0000 (16:37 -0700)
The LAN8814 has a coma mode pin which puts the PHY into isolate and
power-dowm mode. Unfortunately, the mode cannot be disabled by a
register. Usually, the input pin has a pull-up and connected to a GPIO
which can then be used to disable the mode. Try to get the GPIO and
deassert it.

Signed-off-by: Michael Walle <michael@walle.cc>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/micrel.c

index b981c5e..685a0ab 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/ptp_clock.h>
 #include <linux/ptp_classify.h>
 #include <linux/net_tstamp.h>
+#include <linux/gpio/consumer.h>
 
 /* Operation Mode Strap Override */
 #define MII_KSZPHY_OMSO                                0x16
@@ -2837,6 +2838,21 @@ static int lan8814_config_init(struct phy_device *phydev)
        return 0;
 }
 
+static int lan8814_release_coma_mode(struct phy_device *phydev)
+{
+       struct gpio_desc *gpiod;
+
+       gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode",
+                                       GPIOD_OUT_HIGH_OPEN_DRAIN);
+       if (IS_ERR(gpiod))
+               return PTR_ERR(gpiod);
+
+       gpiod_set_consumer_name(gpiod, "LAN8814 coma mode");
+       gpiod_set_value_cansleep(gpiod, 0);
+
+       return 0;
+}
+
 static int lan8814_probe(struct phy_device *phydev)
 {
        struct kszphy_priv *priv;
@@ -2859,6 +2875,10 @@ static int lan8814_probe(struct phy_device *phydev)
                              addr, sizeof(struct lan8814_shared_priv));
 
        if (phy_package_init_once(phydev)) {
+               err = lan8814_release_coma_mode(phydev);
+               if (err)
+                       return err;
+
                err = lan8814_ptp_probe_once(phydev);
                if (err)
                        return err;