net: stmmac: use suspend functions for hibernation
authorSrinivas Kandagatla <srinivas.kandagatla@st.com>
Thu, 16 Jan 2014 10:52:44 +0000 (10:52 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Jan 2014 23:23:43 +0000 (15:23 -0800)
In hibernation freeze case the driver just releases the resources like
dma buffers, irqs, unregisters the drivers and during restore it does
register, request the resources. This is not really necessary, as part
of power management all the data structures are intact, all the
previously allocated resources can be used after coming out of low
power.

This patch uses the suspend and resume callbacks for freeze and
restore which initializes the hardware correctly without unregistering
or releasing the resources, this should also help in reducing the time
to restore.

Also this patch fixes a bug in stmmac_pltfr_restore and
stmmac_pltfr_freeze where it tries to get hold of platform data via
dev_get_platdata call, which would return NULL in device tree cases and
the next if statement would crash as there is no NULL check.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@st.com>
Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

index 5a568015d1fed31b59fe7b0bc1d488b5b7991b74..027f1dd42d10c2390f99fa286236854c1e61c197 100644 (file)
@@ -117,8 +117,6 @@ extern const struct stmmac_desc_ops ndesc_ops;
 extern const struct stmmac_hwtimestamp stmmac_ptp;
 int stmmac_ptp_register(struct stmmac_priv *priv);
 void stmmac_ptp_unregister(struct stmmac_priv *priv);
-int stmmac_freeze(struct net_device *ndev);
-int stmmac_restore(struct net_device *ndev);
 int stmmac_resume(struct net_device *ndev);
 int stmmac_suspend(struct net_device *ndev);
 int stmmac_dvr_remove(struct net_device *ndev);
index 742a83f29affcb52f064aab0e8ec9bfa716a48b7..c1298a0aef0692108e04deb93ef600c2862d3100 100644 (file)
@@ -2912,22 +2912,6 @@ int stmmac_resume(struct net_device *ndev)
 
        return 0;
 }
-
-int stmmac_freeze(struct net_device *ndev)
-{
-       if (!ndev || !netif_running(ndev))
-               return 0;
-
-       return stmmac_release(ndev);
-}
-
-int stmmac_restore(struct net_device *ndev)
-{
-       if (!ndev || !netif_running(ndev))
-               return 0;
-
-       return stmmac_open(ndev);
-}
 #endif /* CONFIG_PM */
 
 /* Driver can be configured w/ and w/ both PCI and Platf drivers
index 9377ee623fa5de1322560d6a759fe8d99c0f99c5..6d0bf222623a56a174c35e8a06ed8e5d6d6d3074 100644 (file)
@@ -210,56 +210,36 @@ static int stmmac_pltfr_remove(struct platform_device *pdev)
 
 #ifdef CONFIG_PM
 static int stmmac_pltfr_suspend(struct device *dev)
-{
-       struct net_device *ndev = dev_get_drvdata(dev);
-
-       return stmmac_suspend(ndev);
-}
-
-static int stmmac_pltfr_resume(struct device *dev)
-{
-       struct net_device *ndev = dev_get_drvdata(dev);
-
-       return stmmac_resume(ndev);
-}
-
-static int stmmac_pltfr_freeze(struct device *dev)
 {
        int ret;
-       struct plat_stmmacenet_data *plat_dat = dev_get_platdata(dev);
        struct net_device *ndev = dev_get_drvdata(dev);
+       struct stmmac_priv *priv = netdev_priv(ndev);
        struct platform_device *pdev = to_platform_device(dev);
 
-       ret = stmmac_freeze(ndev);
-       if (plat_dat->exit)
-               plat_dat->exit(pdev);
+       ret = stmmac_suspend(ndev);
+       if (priv->plat->exit)
+               priv->plat->exit(pdev);
 
        return ret;
 }
 
-static int stmmac_pltfr_restore(struct device *dev)
+static int stmmac_pltfr_resume(struct device *dev)
 {
-       struct plat_stmmacenet_data *plat_dat = dev_get_platdata(dev);
        struct net_device *ndev = dev_get_drvdata(dev);
+       struct stmmac_priv *priv = netdev_priv(ndev);
        struct platform_device *pdev = to_platform_device(dev);
 
-       if (plat_dat->init)
-               plat_dat->init(pdev);
+       if (priv->plat->init)
+               priv->plat->init(pdev);
 
-       return stmmac_restore(ndev);
+       return stmmac_resume(ndev);
 }
 
-static const struct dev_pm_ops stmmac_pltfr_pm_ops = {
-       .suspend = stmmac_pltfr_suspend,
-       .resume = stmmac_pltfr_resume,
-       .freeze = stmmac_pltfr_freeze,
-       .thaw = stmmac_pltfr_restore,
-       .restore = stmmac_pltfr_restore,
-};
-#else
-static const struct dev_pm_ops stmmac_pltfr_pm_ops;
 #endif /* CONFIG_PM */
 
+static SIMPLE_DEV_PM_OPS(stmmac_pltfr_pm_ops,
+                       stmmac_pltfr_suspend, stmmac_pltfr_resume);
+
 static const struct of_device_id stmmac_dt_ids[] = {
        { .compatible = "st,spear600-gmac"},
        { .compatible = "snps,dwmac-3.610"},