net: axiemac: add PM callbacks to support suspend/resume
authorAndy Chiu <andy.chiu@sifive.com>
Tue, 1 Nov 2022 01:11:39 +0000 (09:11 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2022 08:45:07 +0000 (08:45 +0000)
Support basic system-wide suspend and resume functions

Signed-off-by: Andy Chiu <andy.chiu@sifive.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/xilinx/xilinx_axienet_main.c

index 441e1058104facc2318a23e2e7306157753cdd2d..d082f2b10f4df499340eeea026ad4636142bafe0 100644 (file)
@@ -2217,12 +2217,48 @@ static void axienet_shutdown(struct platform_device *pdev)
        rtnl_unlock();
 }
 
+static int axienet_suspend(struct device *dev)
+{
+       struct net_device *ndev = dev_get_drvdata(dev);
+
+       if (!netif_running(ndev))
+               return 0;
+
+       netif_device_detach(ndev);
+
+       rtnl_lock();
+       axienet_stop(ndev);
+       rtnl_unlock();
+
+       return 0;
+}
+
+static int axienet_resume(struct device *dev)
+{
+       struct net_device *ndev = dev_get_drvdata(dev);
+
+       if (!netif_running(ndev))
+               return 0;
+
+       rtnl_lock();
+       axienet_open(ndev);
+       rtnl_unlock();
+
+       netif_device_attach(ndev);
+
+       return 0;
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(axienet_pm_ops,
+                               axienet_suspend, axienet_resume);
+
 static struct platform_driver axienet_driver = {
        .probe = axienet_probe,
        .remove = axienet_remove,
        .shutdown = axienet_shutdown,
        .driver = {
                 .name = "xilinx_axienet",
+                .pm = &axienet_pm_ops,
                 .of_match_table = axienet_of_match,
        },
 };