eth: dm: fec: Add gpio phy reset binding
PATCH 1/1 eth: dm: fec: Add gpio phy reset binding
Add the missing gpio phy reset binding to the gpio and it's reset time configuration
Signed-off-by Michael Trimarchi <[email protected]>
--- drivers/net/fec_mxc.c | 42 ++++++++++++++++++++++++++++++++++++------ drivers/net/fec_mxc.h | 5 ++++- 2 files changed, 40 insertions(+), 7 deletions(-)
drivers/net/fec_mxc.c +36 -6
@@ -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,23 @@ 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,1000 ); + }else if (ret == -ENOENT ) { + 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[] = {
drivers/net/fec_mxc.h +4 -1
@@ -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
Signature · 1 line
2.7.4