stmmac: use custom init/exit functions in pm ops
authorFrancesco Virlinzi <francesco.virlinzi@st.com>
Wed, 18 Apr 2012 19:48:19 +0000 (19:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Apr 2012 00:08:44 +0000 (20:08 -0400)
Freeze and restore can call the custom init/exit functions.
Also the patch adds a custom data field that can be used
for storing platform data useful on restore the embedded
setup (e.g. GPIO, SYSCFG).

Signed-off-by: Francesco Virlinzi <francesco.virlinzi@st.com>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index 12bd221..ba30d38 100644 (file)
@@ -189,9 +189,6 @@ static int stmmac_pltfr_remove(struct platform_device *pdev)
        if (priv->plat->exit)
                priv->plat->exit(pdev);
 
-       if (priv->plat->exit)
-               priv->plat->exit(pdev);
-
        platform_set_drvdata(pdev, NULL);
 
        iounmap((void *)priv->ioaddr);
@@ -218,14 +215,26 @@ static int stmmac_pltfr_resume(struct device *dev)
 
 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 platform_device *pdev = to_platform_device(dev);
 
-       return stmmac_freeze(ndev);
+       ret = stmmac_freeze(ndev);
+       if (plat_dat->exit)
+               plat_dat->exit(pdev);
+
+       return ret;
 }
 
 int stmmac_pltfr_restore(struct device *dev)
 {
+       struct plat_stmmacenet_data *plat_dat = dev_get_platdata(dev);
        struct net_device *ndev = dev_get_drvdata(dev);
+       struct platform_device *pdev = to_platform_device(dev);
+
+       if (plat_dat->init)
+               plat_dat->init(pdev);
 
        return stmmac_restore(ndev);
 }
index cf64031..f85c93d 100644 (file)
@@ -109,6 +109,7 @@ struct plat_stmmacenet_data {
        int (*init)(struct platform_device *pdev);
        void (*exit)(struct platform_device *pdev);
        void *custom_cfg;
+       void *custom_data;
        void *bsp_priv;
 };
 #endif