ethernet: omni phy turn on true powerdown
authorZhuo Wang <zhuo.wang@amlogic.com>
Mon, 3 Sep 2018 10:53:32 +0000 (18:53 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Tue, 4 Sep 2018 09:55:40 +0000 (02:55 -0700)
PD#172019: omni phy turn on true power down

Change-Id: Ib95a6f58ddcfda2e6dfacaa8bc2dea7ab5ccda9d
Signed-off-by: Zhuo Wang <zhuo.wang@amlogic.com>
drivers/amlogic/ethernet/phy/amlogic.c
drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c

index 00f4152f6e9e161d5a6058658a6c22a5876b946d..d32ecbd93d900534a6774dd46a3d5aae61c9e173 100644 (file)
@@ -271,6 +271,19 @@ static int internal_phy_resume(struct phy_device *phydev)
        return rc;
 }
 
+void internal_phy_remove(struct phy_device *phydev)
+{
+       int value;
+
+       pr_info("internal phy shutdown\n");
+       /*disable link interrupt*/
+       value = phy_read(phydev, 0x1E);
+       phy_write(phydev, 0x1E, value & ~0x50);
+
+       value = 0;
+       value = phy_read(phydev, 0x18);
+       phy_write(phydev, 0x18, value | 0x1);
+}
 static struct phy_driver amlogic_internal_driver[] = { {
        .phy_id = 0x01814400,
        .name           = "amlogic internal phy",
@@ -283,6 +296,7 @@ static struct phy_driver amlogic_internal_driver[] = { {
        .read_status    = internal_phy_read_status,
        .suspend        = internal_phy_suspend,
        .resume         = internal_phy_resume,
+       .remove         = internal_phy_remove,
 } };
 
 module_phy_driver(amlogic_internal_driver);
index 6645b49f0e63068eb580b97dff541493e2248bab..27246a5da670653e2bfc68e9c372f989eaecb2ef 100644 (file)
@@ -487,11 +487,14 @@ void meson6_dwmac_shutdown(struct platform_device *pdev)
                dwmac_meson_disable_analog(&pdev->dev);
        }
        //stmmac_release(ndev);
+       //stmmac_pltfr_suspend(&pdev->dev);
+       if (priv->phydev) {
+               if (priv->phydev->drv->remove)
+                       priv->phydev->drv->remove(ndev->phydev);
+               else
+                       genphy_suspend(ndev->phydev);
+       }
        stmmac_pltfr_suspend(&pdev->dev);
-       if (priv->phydev)
-               genphy_suspend(ndev->phydev);
-       if (priv->plat->exit)
-               priv->plat->exit(pdev, priv->plat->bsp_priv);
 }
 
 #endif