diff mbox

[U-Boot,RESEND,v2,5/5] net: pch_gbe: Support PHY reset GPIOs

Message ID 20170430195710.19713-6-daniel.schwierzeck@gmail.com
State Superseded
Delegated to: Daniel Schwierzeck
Headers show

Commit Message

Daniel Schwierzeck April 30, 2017, 7:57 p.m. UTC
From: Paul Burton <paul.burton@imgtec.com>

Add support to the pch_gbe driver for resetting the PHY using a GPIO
specified in the device tree. This matches the support already in Linux.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>

Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---

Changes in v2: None

 drivers/net/pch_gbe.c | 29 +++++++++++++++++++++++++++--
 drivers/net/pch_gbe.h |  1 +
 2 files changed, 28 insertions(+), 2 deletions(-)

Comments

Joe Hershberger May 30, 2017, 8:26 p.m. UTC | #1
On Sun, Apr 30, 2017 at 2:57 PM, Daniel Schwierzeck
<daniel.schwierzeck@gmail.com> wrote:
> From: Paul Burton <paul.burton@imgtec.com>
>
> Add support to the pch_gbe driver for resetting the PHY using a GPIO
> specified in the device tree. This matches the support already in Linux.
>
> Signed-off-by: Paul Burton <paul.burton@imgtec.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> Tested-by: Bin Meng <bmeng.cn@gmail.com>
>
> Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> ---
>
> Changes in v2: None
>
>  drivers/net/pch_gbe.c | 29 +++++++++++++++++++++++++++--
>  drivers/net/pch_gbe.h |  1 +
>  2 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/pch_gbe.c b/drivers/net/pch_gbe.c
> index 8866f6632f..cc3ca8b3da 100644
> --- a/drivers/net/pch_gbe.c
> +++ b/drivers/net/pch_gbe.c
> @@ -12,6 +12,7 @@
>  #include <asm/io.h>
>  #include <pci.h>
>  #include <miiphy.h>
> +#include <asm/gpio.h>
>  #include "pch_gbe.h"
>
>  #if !defined(CONFIG_PHYLIB)
> @@ -72,6 +73,14 @@ static int pch_gbe_reset(struct udevice *dev)
>         priv->rx_idx = 0;
>         priv->tx_idx = 0;
>
> +       if (dm_gpio_is_valid(&priv->gpio_phy_reset)) {
> +               /* Reset the PHY */
> +               dm_gpio_set_value(&priv->gpio_phy_reset, 1);
> +               udelay(15000);

It seems these delays should come from the device tree as well.

Same as: http://www.mail-archive.com/u-boot@lists.denx.de/msg250563.html
or here: https://patchwork.ozlabs.org/patch/731278/

> +               dm_gpio_set_value(&priv->gpio_phy_reset, 0);
> +               udelay(5000);
> +       }
> +
>         writel(PCH_GBE_ALL_RST, &mac_regs->reset);
>
>         /*
> @@ -451,6 +460,11 @@ int pch_gbe_probe(struct udevice *dev)
>         plat->iobase = (ulong)iobase;
>         priv->mac_regs = (struct pch_gbe_regs *)iobase;
>
> +       err = gpio_request_by_name(dev, "phy-reset-gpios", 0,
> +                                  &priv->gpio_phy_reset, GPIOD_IS_OUT);
> +       if (err && (err != -ENOENT))
> +               return err;
> +
>         /* Read MAC address from SROM and initialize dev->enetaddr with it */
>         pch_gbe_mac_read(priv->mac_regs, plat->enetaddr);
>
> @@ -460,9 +474,17 @@ int pch_gbe_probe(struct udevice *dev)
>
>         err = pch_gbe_reset(dev);
>         if (err)
> -               return err;
> +               goto out_err;
>
> -       return pch_gbe_phy_init(dev);
> +       err = pch_gbe_phy_init(dev);
> +       if (err)
> +               goto out_err;
> +
> +       return 0;
> +out_err:
> +       if (dm_gpio_is_valid(&priv->gpio_phy_reset))
> +               dm_gpio_free(dev, &priv->gpio_phy_reset);
> +       return err;
>  }
>
>  int pch_gbe_remove(struct udevice *dev)
> @@ -473,6 +495,9 @@ int pch_gbe_remove(struct udevice *dev)
>         mdio_unregister(priv->bus);
>         mdio_free(priv->bus);
>
> +       if (dm_gpio_is_valid(&priv->gpio_phy_reset))
> +               dm_gpio_free(dev, &priv->gpio_phy_reset);
> +
>         return 0;
>  }
>
> diff --git a/drivers/net/pch_gbe.h b/drivers/net/pch_gbe.h
> index 0ea0c73a4f..1d13380837 100644
> --- a/drivers/net/pch_gbe.h
> +++ b/drivers/net/pch_gbe.h
> @@ -293,6 +293,7 @@ struct pch_gbe_priv {
>         struct udevice *dev;
>         int rx_idx;
>         int tx_idx;
> +       struct gpio_desc gpio_phy_reset;
>  };
>
>  #endif /* _PCH_GBE_H_ */
> --
> 2.11.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
diff mbox

Patch

diff --git a/drivers/net/pch_gbe.c b/drivers/net/pch_gbe.c
index 8866f6632f..cc3ca8b3da 100644
--- a/drivers/net/pch_gbe.c
+++ b/drivers/net/pch_gbe.c
@@ -12,6 +12,7 @@ 
 #include <asm/io.h>
 #include <pci.h>
 #include <miiphy.h>
+#include <asm/gpio.h>
 #include "pch_gbe.h"
 
 #if !defined(CONFIG_PHYLIB)
@@ -72,6 +73,14 @@  static int pch_gbe_reset(struct udevice *dev)
 	priv->rx_idx = 0;
 	priv->tx_idx = 0;
 
+	if (dm_gpio_is_valid(&priv->gpio_phy_reset)) {
+		/* Reset the PHY */
+		dm_gpio_set_value(&priv->gpio_phy_reset, 1);
+		udelay(15000);
+		dm_gpio_set_value(&priv->gpio_phy_reset, 0);
+		udelay(5000);
+	}
+
 	writel(PCH_GBE_ALL_RST, &mac_regs->reset);
 
 	/*
@@ -451,6 +460,11 @@  int pch_gbe_probe(struct udevice *dev)
 	plat->iobase = (ulong)iobase;
 	priv->mac_regs = (struct pch_gbe_regs *)iobase;
 
+	err = gpio_request_by_name(dev, "phy-reset-gpios", 0,
+				   &priv->gpio_phy_reset, GPIOD_IS_OUT);
+	if (err && (err != -ENOENT))
+		return err;
+
 	/* Read MAC address from SROM and initialize dev->enetaddr with it */
 	pch_gbe_mac_read(priv->mac_regs, plat->enetaddr);
 
@@ -460,9 +474,17 @@  int pch_gbe_probe(struct udevice *dev)
 
 	err = pch_gbe_reset(dev);
 	if (err)
-		return err;
+		goto out_err;
 
-	return pch_gbe_phy_init(dev);
+	err = pch_gbe_phy_init(dev);
+	if (err)
+		goto out_err;
+
+	return 0;
+out_err:
+	if (dm_gpio_is_valid(&priv->gpio_phy_reset))
+		dm_gpio_free(dev, &priv->gpio_phy_reset);
+	return err;
 }
 
 int pch_gbe_remove(struct udevice *dev)
@@ -473,6 +495,9 @@  int pch_gbe_remove(struct udevice *dev)
 	mdio_unregister(priv->bus);
 	mdio_free(priv->bus);
 
+	if (dm_gpio_is_valid(&priv->gpio_phy_reset))
+		dm_gpio_free(dev, &priv->gpio_phy_reset);
+
 	return 0;
 }
 
diff --git a/drivers/net/pch_gbe.h b/drivers/net/pch_gbe.h
index 0ea0c73a4f..1d13380837 100644
--- a/drivers/net/pch_gbe.h
+++ b/drivers/net/pch_gbe.h
@@ -293,6 +293,7 @@  struct pch_gbe_priv {
 	struct udevice *dev;
 	int rx_idx;
 	int tx_idx;
+	struct gpio_desc gpio_phy_reset;
 };
 
 #endif /* _PCH_GBE_H_ */