Message ID | 20170430195710.19713-6-daniel.schwierzeck@gmail.com |
---|---|
State | Superseded |
Delegated to: | Daniel Schwierzeck |
Headers | show |
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 --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_ */