[EXT] Re: [PATCH 1/9] net: eqos: Add PHY reset control for i.MX platform

Ye Li ye.li at nxp.com
Wed Jul 21 04:37:31 CEST 2021


Hi Stefano,

  Ok. I will rebase the patches after the 8ULP is merged.

Best regards,
Ye Li
> -----Original Message-----
> From: Stefano Babic <sbabic at denx.de>
> Sent: Saturday, July 17, 2021 8:54 PM
> To: Ye Li <ye.li at nxp.com>; sbabic at denx.de; u-boot at lists.denx.de; Peng Fan
> <peng.fan at nxp.com>; marex at denx.de
> Cc: rfried.dev at gmail.com; dl-uboot-imx <uboot-imx at nxp.com>;
> s.arendt at sensopart.de
> Subject: [EXT] Re: [PATCH 1/9] net: eqos: Add PHY reset control for i.MX
> platform
> 
> Caution: EXT Email
> 
> Hi Ye,
> 
> series was completely lost on my side, I tried to check it today but it is obsolete
> now and conflicts with Peng's series for MX8ULP. So I drop it, yorry, you should
> rebase and post it again.
> 
> Best regards,
> Stefano Babic
> 
> On 19.02.21 08:07, Ye Li wrote:
> > Parse the "phy-reset-gpios", "phy-reset-post-delay" and
> > "phy-reset-duration" properties from eqos node to control the ethernet
> > PHY reset at driver probe.
> > Reset PHY once is enough that can reduce the time cost to get IP after
> > the first time.
> >
> > Signed-off-by: Ye Li <ye.li at nxp.com>
> > ---
> >   drivers/net/dwc_eth_qos.c | 55
> +++++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 55 insertions(+)
> >
> > diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
> > index e8242ca..14aafc6 100644
> > --- a/drivers/net/dwc_eth_qos.c
> > +++ b/drivers/net/dwc_eth_qos.c
> > @@ -303,6 +303,8 @@ struct eqos_priv {
> >       struct eqos_tegra186_regs *tegra186_regs;
> >       struct reset_ctl reset_ctl;
> >       struct gpio_desc phy_reset_gpio;
> > +     uint32_t reset_delay;
> > +     uint32_t reset_post_delay;
> >       struct clk clk_master_bus;
> >       struct clk clk_rx;
> >       struct clk clk_ptp_ref;
> > @@ -1880,6 +1882,7 @@ static int eqos_probe_resources_imx(struct
> udevice *dev)
> >   {
> >       struct eqos_priv *eqos = dev_get_priv(dev);
> >       phy_interface_t interface;
> > +     int ret = 0;
> >
> >       debug("%s(dev=%p):\n", __func__, dev);
> >
> > @@ -1890,8 +1893,52 @@ static int eqos_probe_resources_imx(struct
> udevice *dev)
> >               return -EINVAL;
> >       }
> >
> > +     ret = gpio_request_by_name(dev, "phy-reset-gpios", 0,
> > +                                &eqos->phy_reset_gpio,
> > +                                GPIOD_IS_OUT |
> GPIOD_IS_OUT_ACTIVE);
> > +     if (ret) {
> > +             pr_debug("gpio_request_by_name(phy reset) failed: %d",
> ret);
> > +     }
> > +
> > +     if (dm_gpio_is_valid(&eqos->phy_reset_gpio)) {
> > +             eqos->reset_delay = dev_read_u32_default(dev,
> "phy-reset-duration", 1);
> > +             if (eqos->reset_delay > 1000) {
> > +                     pr_err("phy reset duration should be <=
> 1000ms\n");
> > +                     /* property value wrong, use default value */
> > +                     eqos->reset_delay = 1;
> > +             }
> > +
> > +             mdelay(eqos->reset_delay);
> > +
> > +             eqos->reset_post_delay = dev_read_u32_default(dev,
> > +
> "phy-reset-post-delay",
> > +                                                           0);
> > +             if (eqos->reset_post_delay > 1000) {
> > +                     pr_err("phy reset post delay should be <=
> 1000ms\n");
> > +                     /* property value wrong, use default value */
> > +                     eqos->reset_post_delay = 0;
> > +             }
> > +
> > +             ret = dm_gpio_set_value(&eqos->phy_reset_gpio, 0);
> > +             if (ret < 0) {
> > +                     pr_err("dm_gpio_set_value(phy_reset, deassert)
> failed: %d", ret);
> > +                     goto err_free_gpio_phy_reset;
> > +             }
> > +
> > +             if (eqos->reset_post_delay)
> > +                     mdelay(eqos->reset_post_delay);
> > +     }
> > +
> >       debug("%s: OK\n", __func__);
> >       return 0;
> > +
> > +err_free_gpio_phy_reset:
> > +     if (dm_gpio_is_valid(&eqos->phy_reset_gpio)) {
> > +             dm_gpio_free(dev, &eqos->phy_reset_gpio);
> > +     }
> > +
> > +     debug("%s: returns %d\n", __func__, ret);
> > +     return ret;
> >   }
> >
> >   static phy_interface_t eqos_get_interface_imx(struct udevice *dev)
> > @@ -1951,6 +1998,14 @@ static int eqos_remove_resources_stm32(struct
> > udevice *dev)
> >
> >   static int eqos_remove_resources_imx(struct udevice *dev)
> >   {
> > +     struct eqos_priv *eqos = dev_get_priv(dev);
> > +
> > +     debug("%s(dev=%p):\n", __func__, dev);
> > +     if (dm_gpio_is_valid(&eqos->phy_reset_gpio)) {
> > +             dm_gpio_free(dev, &eqos->phy_reset_gpio);
> > +     }
> > +
> > +     debug("%s: OK\n", __func__);
> >       return 0;
> >   }
> >
> >
> 
> --
> ================================================================
> =====
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
> ================================================================
> =====


More information about the U-Boot mailing list