diff options
author | Eric Bénard <eric@eukrea.com> | 2012-05-08 11:12:17 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2012-05-23 16:55:48 -0400 |
commit | 8b5e218d8caa7592d26e68157bd71f50426bb7ae (patch) | |
tree | 6f9b84108386b4185629317afe9ea47f6906b967 /drivers/net/can | |
parent | 31a67102f4762df5544bc2dfb34a931233d2a5b2 (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.c | 38 |
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 | ||
1054 | static 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 | |||
1070 | static 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 | |||
1053 | static struct platform_driver flexcan_driver = { | 1089 | static 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 | ||
1063 | module_platform_driver(flexcan_driver); | 1101 | module_platform_driver(flexcan_driver); |