[U-Boot] [PATCH V2] eth: dm: fec: Add gpio phy reset binding

Jagan Teki jagan at amarulasolutions.com
Mon Jul 23 08:40:57 UTC 2018


On Mon, Jul 23, 2018 at 1:57 PM, Stefano Babic <sbabic at denx.de> wrote:
> Hi Jagan,
>
> On 07/07/2018 13:36, Jagan Teki wrote:
>> On Sun, Jun 17, 2018 at 6:52 PM, Michael Trimarchi
>> <michael at amarulasolutions.com> wrote:
>>> Add the missing gpio phy reset binding to the gpio and
>>> reset time configuration
>>>
>>> Signed-off-by: Michael Trimarchi <michael at amarulasolutions.com>
>>> ---
>>> Changes v1 -> v2:
>>>         - fix commit message
>>>         - fix timeout property read
>>> ---
>>>  drivers/net/fec_mxc.c | 43 +++++++++++++++++++++++++++++++++++++------
>>>  drivers/net/fec_mxc.h |  5 ++++-
>>>  2 files changed, 41 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
>>> index 694a0b2..dac07b6 100644
>>> --- a/drivers/net/fec_mxc.c
>>> +++ b/drivers/net/fec_mxc.c
>>> @@ -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);
>>
>> This is return -1 if none have phy-reset-duration and function return
>> -1 at the end.
>
> Patch is landed on my desk...
>
> I am not sure what you mind. It is also thinkable that some products
> have no GPIO reset at all, and function simply ignores them. And setting
> phy-reset-duration to a default value seems quite logical.
>
> Let me know which are the issues here, I had thought I should apply this.

We are re-working this, will send the next version.


More information about the U-Boot mailing list