mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
eth: dm: fec: Add gpio phy reset binding
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>
This commit is contained in:
parent
824705d53c
commit
efd0b79106
2 changed files with 41 additions and 7 deletions
|
@ -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[] = {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue