eth: dm: fec: Add gpio phy reset binding
authorMichael Trimarchi <michael@amarulasolutions.com>
Sun, 17 Jun 2018 13:22:39 +0000 (15:22 +0200)
committerStefano Babic <sbabic@denx.de>
Mon, 23 Jul 2018 08:28:01 +0000 (10:28 +0200)
Add the missing gpio phy reset binding to the gpio and
reset time configuration

Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/fec_mxc.c
drivers/net/fec_mxc.h

index 694a0b2f7eb6cc9a4e7613f454be939edebce3d6..dac07b6e34d24c26c8b39fcc13e631d5bd372f36 100644 (file)
@@ -15,7 +15,6 @@
 #include <miiphy.h>
 #include <net.h>
 #include <netdev.h>
-#include "fec_mxc.h"
 
 #include <asm/io.h>
 #include <linux/errno.h>
@@ -24,6 +23,9 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/mach-imx/sys_proto.h>
+#include <asm-generic/gpio.h>
+
+#include "fec_mxc.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -1245,6 +1247,19 @@ static int fec_phy_init(struct fec_priv *priv, struct udevice *dev)
        return 0;
 }
 
+#ifdef CONFIG_DM_GPIO
+/* FEC GPIO reset */
+static void fec_gpio_reset(struct fec_priv *priv)
+{
+       debug("fec_gpio_reset: fec_gpio_reset(dev)\n");
+       if (dm_gpio_is_valid(&priv->phy_reset_gpio)) {
+               dm_gpio_set_value(&priv->phy_reset_gpio, 1);
+               udelay(priv->reset_delay);
+               dm_gpio_set_value(&priv->phy_reset_gpio, 0);
+       }
+}
+#endif
+
 static int fecmxc_probe(struct udevice *dev)
 {
        struct eth_pdata *pdata = dev_get_platdata(dev);
@@ -1257,6 +1272,9 @@ static int fecmxc_probe(struct udevice *dev)
        if (ret)
                return ret;
 
+#ifdef CONFIG_DM_GPIO
+       fec_gpio_reset(priv);
+#endif
        /* Reset chip. */
        writel(readl(&priv->eth->ecntrl) | FEC_ECNTRL_RESET,
               &priv->eth->ecntrl);
@@ -1314,6 +1332,7 @@ static int fecmxc_remove(struct udevice *dev)
 
 static int fecmxc_ofdata_to_platdata(struct udevice *dev)
 {
+       int ret = 0;
        struct eth_pdata *pdata = dev_get_platdata(dev);
        struct fec_priv *priv = dev_get_priv(dev);
        const char *phy_mode;
@@ -1331,12 +1350,24 @@ static int fecmxc_ofdata_to_platdata(struct udevice *dev)
                return -EINVAL;
        }
 
-       /* TODO
-        * Need to get the reset-gpio and related properties from DT
-        * and implemet the enet reset code on .probe call
-        */
+#ifdef CONFIG_DM_GPIO
+       ret = gpio_request_by_name(dev, "phy-reset-gpios", 0,
+                            &priv->phy_reset_gpio, GPIOD_IS_OUT);
+       if (ret == 0) {
+               ret = dev_read_u32_array(dev, "phy-reset-duration",
+                                        &priv->reset_delay, 1);
+       } else if (ret == -ENOENT) {
+               priv->reset_delay = 1000;
+               ret = 0;
+       }
 
-       return 0;
+       if (priv->reset_delay > 1000) {
+               printf("FEX MXC: gpio reset timeout should be less the 1000\n");
+               priv->reset_delay = 1000;
+       }
+#endif
+
+       return ret;
 }
 
 static const struct udevice_id fecmxc_ids[] = {
index 3b935afe2c056344d71f584e675fc35f729b4cb6..fd894432054d9b815f633f82586e57558fe48d3f 100644 (file)
@@ -250,7 +250,10 @@ struct fec_priv {
        int phy_id;
        int (*mii_postcall)(int);
 #endif
-
+#ifdef CONFIG_DM_GPIO
+       struct gpio_desc phy_reset_gpio;
+       uint32_t reset_delay;
+#endif
 #ifdef CONFIG_DM_ETH
        u32 interface;
 #endif