@ -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 [ ] = {