ethernet:gmac: pull low reset pin when suspend for saving power consumption
authorroger <cz@rock-chips.com>
Thu, 4 Sep 2014 03:40:41 +0000 (11:40 +0800)
committerroger <cz@rock-chips.com>
Thu, 4 Sep 2014 03:40:41 +0000 (11:40 +0800)
drivers/net/ethernet/rockchip/gmac/stmmac_main.c
drivers/net/ethernet/rockchip/gmac/stmmac_platform.c

index 89ece5c6440e38194680dda6b12bf088bc209033..d2f18b0cba8252e785ae89010bb661959a4abd38 100755 (executable)
@@ -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);
+                               }
                        }
                }
        }
index fbdd386deba18c16ceaabac0a55b56d782e91c8c..b9cc4da35bf083f2c6ce746fd8ddd441ed5ebbed 100755 (executable)
@@ -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) {