net: stmmac: allow to split suspend/resume from init/exit callbacks
authorVincent Palatin <vpalatin@chromium.org>
Wed, 15 Jun 2016 18:32:21 +0000 (11:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Jun 2016 21:14:58 +0000 (14:14 -0700)
Let the stmmac platform drivers provide dedicated suspend and resume
callbacks rather than always re-using the init and exits callbacks.
If the driver does not provide the suspend or resume callback, we fall
back to the old behavior trying to use exit or init.

This allows a specific platform to perform only a partial power-down on
suspend if Wake-on-Lan is enabled but always perform the full shutdown
sequence if the module is unloaded.

Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index 409db913b117e65b2251f2d1b50ff0f0638ee2f0..a96714d34560e9c09afc87cc097567b15766cdd5 100644 (file)
@@ -411,7 +411,9 @@ static int stmmac_pltfr_suspend(struct device *dev)
        struct platform_device *pdev = to_platform_device(dev);
 
        ret = stmmac_suspend(dev);
-       if (priv->plat->exit)
+       if (priv->plat->suspend)
+               priv->plat->suspend(pdev, priv->plat->bsp_priv);
+       else if (priv->plat->exit)
                priv->plat->exit(pdev, priv->plat->bsp_priv);
 
        return ret;
@@ -430,7 +432,9 @@ static int stmmac_pltfr_resume(struct device *dev)
        struct stmmac_priv *priv = netdev_priv(ndev);
        struct platform_device *pdev = to_platform_device(dev);
 
-       if (priv->plat->init)
+       if (priv->plat->resume)
+               priv->plat->resume(pdev, priv->plat->bsp_priv);
+       else if (priv->plat->init)
                priv->plat->init(pdev, priv->plat->bsp_priv);
 
        return stmmac_resume(dev);
index ffdaca9c01af57d895f4d9a4ce53995366709135..0507dbfbf63c95a2f82f62f3d23d7eee640e40cc 100644 (file)
@@ -135,6 +135,8 @@ struct plat_stmmacenet_data {
        void (*bus_setup)(void __iomem *ioaddr);
        int (*init)(struct platform_device *pdev, void *priv);
        void (*exit)(struct platform_device *pdev, void *priv);
+       void (*suspend)(struct platform_device *pdev, void *priv);
+       void (*resume)(struct platform_device *pdev, void *priv);
        void *bsp_priv;
        struct stmmac_axi *axi;
        int has_gmac4;