net: phy: provide phy_resume/phy_suspend helpers
authorSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Fri, 13 Dec 2013 09:20:27 +0000 (10:20 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Dec 2013 19:42:44 +0000 (14:42 -0500)
This adds helper functions to resume and suspend a given phy_device
by calling the corresponding driver callbacks if available.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Acked-by: Mugunthan V N <mugunthanvnm@ti.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c
include/linux/phy.h

index 5a619f0dcf73c7ca47b728116786aaa65c236f57..91f17178f1b32ff8a5fdad0eea972caabe9f89f5 100644 (file)
@@ -679,6 +679,30 @@ void phy_detach(struct phy_device *phydev)
 }
 EXPORT_SYMBOL(phy_detach);
 
+int phy_suspend(struct phy_device *phydev)
+{
+       struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
+       struct ethtool_wolinfo wol;
+
+       /* If the device has WOL enabled, we cannot suspend the PHY */
+       wol.cmd = ETHTOOL_GWOL;
+       phy_ethtool_get_wol(phydev, &wol);
+       if (wol.wolopts)
+               return -EBUSY;
+
+       if (phydrv->suspend)
+               return phydrv->suspend(phydev);
+       return 0;
+}
+
+int phy_resume(struct phy_device *phydev)
+{
+       struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
+
+       if (phydrv->resume)
+               return phydrv->resume(phydev);
+       return 0;
+}
 
 /* Generic PHY support and helper functions */
 
index 90a666e0884b9ecdf612da8dff6d7f3e53151933..73384ff3b5e50550bd5b705c3023133708dcee96 100644 (file)
@@ -548,6 +548,8 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
 struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);
 int phy_device_register(struct phy_device *phy);
 int phy_init_hw(struct phy_device *phydev);
+int phy_suspend(struct phy_device *phydev);
+int phy_resume(struct phy_device *phydev);
 struct phy_device * phy_attach(struct net_device *dev,
                const char *bus_id, phy_interface_t interface);
 struct phy_device *phy_find_first(struct mii_bus *bus);