aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorEric Bénard <eric@eukrea.com>2012-05-08 11:12:17 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2012-05-23 16:55:48 -0400
commit8b5e218d8caa7592d26e68157bd71f50426bb7ae (patch)
tree6f9b84108386b4185629317afe9ea47f6906b967 /drivers/net/can
parent31a67102f4762df5544bc2dfb34a931233d2a5b2 (diff)
can: flexcan: add PM support
tested on an i.MX257 Signed-off-by: Eric Bénard <eric@eukrea.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/flexcan.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 1efb08386c61..0d058b0a3cb6 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1050,6 +1050,42 @@ static struct of_device_id flexcan_of_match[] = {
1050 {}, 1050 {},
1051}; 1051};
1052 1052
1053#ifdef CONFIG_PM
1054static int flexcan_suspend(struct platform_device *pdev, pm_message_t state)
1055{
1056 struct net_device *dev = platform_get_drvdata(pdev);
1057 struct flexcan_priv *priv = netdev_priv(dev);
1058
1059 flexcan_chip_disable(priv);
1060
1061 if (netif_running(dev)) {
1062 netif_stop_queue(dev);
1063 netif_device_detach(dev);
1064 }
1065 priv->can.state = CAN_STATE_SLEEPING;
1066
1067 return 0;
1068}
1069
1070static int flexcan_resume(struct platform_device *pdev)
1071{
1072 struct net_device *dev = platform_get_drvdata(pdev);
1073 struct flexcan_priv *priv = netdev_priv(dev);
1074
1075 priv->can.state = CAN_STATE_ERROR_ACTIVE;
1076 if (netif_running(dev)) {
1077 netif_device_attach(dev);
1078 netif_start_queue(dev);
1079 }
1080 flexcan_chip_enable(priv);
1081
1082 return 0;
1083}
1084#else
1085#define flexcan_suspend NULL
1086#define flexcan_resume NULL
1087#endif
1088
1053static struct platform_driver flexcan_driver = { 1089static struct platform_driver flexcan_driver = {
1054 .driver = { 1090 .driver = {
1055 .name = DRV_NAME, 1091 .name = DRV_NAME,
@@ -1058,6 +1094,8 @@ static struct platform_driver flexcan_driver = {
1058 }, 1094 },
1059 .probe = flexcan_probe, 1095 .probe = flexcan_probe,
1060 .remove = __devexit_p(flexcan_remove), 1096 .remove = __devexit_p(flexcan_remove),
1097 .suspend = flexcan_suspend,
1098 .resume = flexcan_resume,
1061}; 1099};
1062 1100
1063module_platform_driver(flexcan_driver); 1101module_platform_driver(flexcan_driver);