From 9112b2c5a7aa7484a99773f32e70dea5bb14baf7 Mon Sep 17 00:00:00 2001 From: roger Date: Thu, 4 Sep 2014 11:40:41 +0800 Subject: [PATCH] ethernet:gmac: pull low reset pin when suspend for saving power consumption --- .../net/ethernet/rockchip/gmac/stmmac_main.c | 25 ++++++--- .../ethernet/rockchip/gmac/stmmac_platform.c | 54 ++++++++----------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/drivers/net/ethernet/rockchip/gmac/stmmac_main.c b/drivers/net/ethernet/rockchip/gmac/stmmac_main.c index 89ece5c6440e..d2f18b0cba82 100755 --- a/drivers/net/ethernet/rockchip/gmac/stmmac_main.c +++ b/drivers/net/ethernet/rockchip/gmac/stmmac_main.c @@ -2933,14 +2933,18 @@ int stmmac_suspend(struct net_device *ndev) else { stmmac_set_mac(priv->ioaddr, false); /* Disable clock in case of PWM is off */ - if ((priv->plat) && (priv->plat->bsp_priv)) { - struct bsp_priv * bsp_priv = priv->plat->bsp_priv; - if ((bsp_priv) && (bsp_priv->gmac_clk_enable)) { - bsp_priv->gmac_clk_enable(false); + if ((priv->plat) && (priv->plat->bsp_priv)) { + struct bsp_priv * bsp_priv = priv->plat->bsp_priv; + if (bsp_priv) { + if (bsp_priv->gmac_clk_enable) { + bsp_priv->gmac_clk_enable(false); + } + if (bsp_priv->phy_power_on) { + bsp_priv->phy_power_on(false); + } + } } } - - } spin_unlock_irqrestore(&priv->lock, flags); return 0; } @@ -2967,8 +2971,13 @@ int stmmac_resume(struct net_device *ndev) /* enable the clk prevously disabled */ if ((priv->plat) && (priv->plat->bsp_priv)) { struct bsp_priv * bsp_priv = priv->plat->bsp_priv; - if ((bsp_priv) && (bsp_priv->gmac_clk_enable)) { - bsp_priv->gmac_clk_enable(true); + if (bsp_priv) { + if (bsp_priv->gmac_clk_enable) { + bsp_priv->gmac_clk_enable(true); + } + if (bsp_priv->phy_power_on) { + bsp_priv->phy_power_on(true); + } } } } diff --git a/drivers/net/ethernet/rockchip/gmac/stmmac_platform.c b/drivers/net/ethernet/rockchip/gmac/stmmac_platform.c index fbdd386deba1..b9cc4da35bf0 100755 --- a/drivers/net/ethernet/rockchip/gmac/stmmac_platform.c +++ b/drivers/net/ethernet/rockchip/gmac/stmmac_platform.c @@ -319,24 +319,6 @@ static int power_on_by_pmu(bool enable) { } } regulator_put(ldo); - msleep(100); - - if (enable) { - //reset - if (gpio_is_valid(bsp_priv->reset_io)) { - gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level); - msleep(10); - gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level); - } - - msleep(100); - } else { - //pull up reset - if (gpio_is_valid(bsp_priv->reset_io)) { - gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level); - } - } - } return 0; @@ -349,23 +331,11 @@ static int power_on_by_gpio(bool enable) { if (gpio_is_valid(bsp_priv->power_io)) { gpio_direction_output(bsp_priv->power_io, bsp_priv->power_io_level); } - - //reset - if (gpio_is_valid(bsp_priv->reset_io)) { - gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level); - msleep(10); - gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level); - } - msleep(100); } else { //power off if (gpio_is_valid(bsp_priv->power_io)) { gpio_direction_output(bsp_priv->power_io, !bsp_priv->power_io_level); } - //pull down reset - if (gpio_is_valid(bsp_priv->reset_io)) { - gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level); - } } return 0; @@ -374,13 +344,33 @@ static int power_on_by_gpio(bool enable) { static int phy_power_on(bool enable) { struct bsp_priv *bsp_priv = &g_bsp_priv; + int ret = -1; + printk("%s: enable = %d \n", __func__, enable); if (bsp_priv->power_ctrl_by_pmu) { - return power_on_by_pmu(enable); + ret = power_on_by_pmu(enable); } else { - return power_on_by_gpio(enable); + ret = power_on_by_gpio(enable); } + + if (enable) { + //reset + if (gpio_is_valid(bsp_priv->reset_io)) { + gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level); + mdelay(5); + gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level); + } + mdelay(30); + + } else { + //pull down reset + if (gpio_is_valid(bsp_priv->reset_io)) { + gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level); + } + } + + return ret; } int stmmc_pltfr_init(struct platform_device *pdev) { -- 2.34.1