diff mbox series

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

Message ID 1529241759-5641-1-git-send-email-michael@amarulasolutions.com
State Accepted
Commit efd0b791069af93e9d439a70d1fe2ae8994dbbfa
Delegated to: Stefano Babic
Headers show
Series [U-Boot,V2] eth: dm: fec: Add gpio phy reset binding | expand

Commit Message

Michael Nazzareno Trimarchi June 17, 2018, 1:22 p.m. UTC
Add the missing gpio phy reset binding to the gpio and
reset time configuration

Signed-off-by: Michael Trimarchi <michael@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(-)

Comments

Joe Hershberger June 19, 2018, 4:45 p.m. UTC | #1
On Sun, Jun 17, 2018 at 8:22 AM, Michael Trimarchi
<michael@amarulasolutions.com> wrote:
> 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>
Jagan Teki July 7, 2018, 11:36 a.m. UTC | #2
On Sun, Jun 17, 2018 at 6:52 PM, Michael Trimarchi
<michael@amarulasolutions.com> wrote:
> Add the missing gpio phy reset binding to the gpio and
> reset time configuration
>
> Signed-off-by: Michael Trimarchi <michael@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.
Stefano Babic July 23, 2018, 8:27 a.m. UTC | #3
Hi Jagan,

On 07/07/2018 13:36, Jagan Teki wrote:
> On Sun, Jun 17, 2018 at 6:52 PM, Michael Trimarchi
> <michael@amarulasolutions.com> wrote:
>> Add the missing gpio phy reset binding to the gpio and
>> reset time configuration
>>
>> Signed-off-by: Michael Trimarchi <michael@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.

Best regards,
Stefano
Jagan Teki July 23, 2018, 8:40 a.m. UTC | #4
On Mon, Jul 23, 2018 at 1:57 PM, Stefano Babic <sbabic@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@amarulasolutions.com> wrote:
>>> Add the missing gpio phy reset binding to the gpio and
>>> reset time configuration
>>>
>>> Signed-off-by: Michael Trimarchi <michael@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.
Michael Nazzareno Trimarchi July 23, 2018, 8:47 a.m. UTC | #5
Hi Jagan

On Mon, Jul 23, 2018 at 10:40 AM, Jagan Teki <jagan@amarulasolutions.com> wrote:
> On Mon, Jul 23, 2018 at 1:57 PM, Stefano Babic <sbabic@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@amarulasolutions.com> wrote:
>>>> Add the missing gpio phy reset binding to the gpio and
>>>> reset time configuration
>>>>
>>>> Signed-off-by: Michael Trimarchi <michael@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.

Please explain what kind of rework needs a 10 lines ;) patch. Anyway, when
is suppose to be upload it again?

Michael
diff mbox series

Patch

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);
+	} 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[] = {
diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h
index 3b935af..fd89443 100644
--- a/drivers/net/fec_mxc.h
+++ b/drivers/net/fec_mxc.h
@@ -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