mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
net: ravb: Initialize PHY in probe() once
Reset and initialize the PHY once in the probe() function rather than doing it over and over again is start() function. This requires us to keep the clock enabled while the driver is in use. This significantly reduces the time between transfers as the PHY doesn't have to restart autonegotiation between transfers, which takes forever. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Geert Uytterhoeven <geert+renesas@glider.be> Cc: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
fd5577ce26
commit
d64c789414
1 changed files with 19 additions and 13 deletions
|
@ -399,7 +399,7 @@ static int ravb_dmac_init(struct udevice *dev)
|
||||||
static int ravb_config(struct udevice *dev)
|
static int ravb_config(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct ravb_priv *eth = dev_get_priv(dev);
|
struct ravb_priv *eth = dev_get_priv(dev);
|
||||||
struct phy_device *phy;
|
struct phy_device *phy = eth->phydev;
|
||||||
u32 mask = ECMR_CHG_DM | ECMR_RE | ECMR_TE;
|
u32 mask = ECMR_CHG_DM | ECMR_RE | ECMR_TE;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -410,13 +410,6 @@ static int ravb_config(struct udevice *dev)
|
||||||
ravb_mac_init(eth);
|
ravb_mac_init(eth);
|
||||||
ravb_write_hwaddr(dev);
|
ravb_write_hwaddr(dev);
|
||||||
|
|
||||||
/* Configure phy */
|
|
||||||
ret = ravb_phy_config(dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
phy = eth->phydev;
|
|
||||||
|
|
||||||
ret = phy_startup(phy);
|
ret = phy_startup(phy);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -443,10 +436,6 @@ static int ravb_start(struct udevice *dev)
|
||||||
struct ravb_priv *eth = dev_get_priv(dev);
|
struct ravb_priv *eth = dev_get_priv(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = clk_enable(ð->clk);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = ravb_reset(dev);
|
ret = ravb_reset(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -473,8 +462,8 @@ static void ravb_stop(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct ravb_priv *eth = dev_get_priv(dev);
|
struct ravb_priv *eth = dev_get_priv(dev);
|
||||||
|
|
||||||
|
phy_shutdown(eth->phydev);
|
||||||
ravb_reset(dev);
|
ravb_reset(dev);
|
||||||
clk_disable(ð->clk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ravb_probe(struct udevice *dev)
|
static int ravb_probe(struct udevice *dev)
|
||||||
|
@ -512,8 +501,23 @@ static int ravb_probe(struct udevice *dev)
|
||||||
|
|
||||||
eth->bus = miiphy_get_dev_by_name(dev->name);
|
eth->bus = miiphy_get_dev_by_name(dev->name);
|
||||||
|
|
||||||
|
/* Bring up PHY */
|
||||||
|
ret = clk_enable(ð->clk);
|
||||||
|
if (ret)
|
||||||
|
goto err_mdio_register;
|
||||||
|
|
||||||
|
ret = ravb_reset(dev);
|
||||||
|
if (ret)
|
||||||
|
goto err_mdio_reset;
|
||||||
|
|
||||||
|
ret = ravb_phy_config(dev);
|
||||||
|
if (ret)
|
||||||
|
goto err_mdio_reset;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_mdio_reset:
|
||||||
|
clk_disable(ð->clk);
|
||||||
err_mdio_register:
|
err_mdio_register:
|
||||||
mdio_free(mdiodev);
|
mdio_free(mdiodev);
|
||||||
err_mdio_alloc:
|
err_mdio_alloc:
|
||||||
|
@ -525,6 +529,8 @@ static int ravb_remove(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct ravb_priv *eth = dev_get_priv(dev);
|
struct ravb_priv *eth = dev_get_priv(dev);
|
||||||
|
|
||||||
|
clk_disable(ð->clk);
|
||||||
|
|
||||||
free(eth->phydev);
|
free(eth->phydev);
|
||||||
mdio_unregister(eth->bus);
|
mdio_unregister(eth->bus);
|
||||||
mdio_free(eth->bus);
|
mdio_free(eth->bus);
|
||||||
|
|
Loading…
Reference in a new issue