diff options
Diffstat (limited to 'drivers/tty/serial/of_serial.c')
-rw-r--r-- | drivers/tty/serial/of_serial.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c index 27981e2b9430..8bc2563335ae 100644 --- a/drivers/tty/serial/of_serial.c +++ b/drivers/tty/serial/of_serial.c | |||
@@ -240,6 +240,32 @@ static int of_platform_serial_remove(struct platform_device *ofdev) | |||
240 | return 0; | 240 | return 0; |
241 | } | 241 | } |
242 | 242 | ||
243 | #ifdef CONFIG_PM_SLEEP | ||
244 | static int of_serial_suspend(struct device *dev) | ||
245 | { | ||
246 | struct of_serial_info *info = dev_get_drvdata(dev); | ||
247 | |||
248 | serial8250_suspend_port(info->line); | ||
249 | if (info->clk) | ||
250 | clk_disable_unprepare(info->clk); | ||
251 | |||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static int of_serial_resume(struct device *dev) | ||
256 | { | ||
257 | struct of_serial_info *info = dev_get_drvdata(dev); | ||
258 | |||
259 | if (info->clk) | ||
260 | clk_prepare_enable(info->clk); | ||
261 | |||
262 | serial8250_resume_port(info->line); | ||
263 | |||
264 | return 0; | ||
265 | } | ||
266 | #endif | ||
267 | static SIMPLE_DEV_PM_OPS(of_serial_pm_ops, of_serial_suspend, of_serial_resume); | ||
268 | |||
243 | /* | 269 | /* |
244 | * A few common types, add more as needed. | 270 | * A few common types, add more as needed. |
245 | */ | 271 | */ |
@@ -271,6 +297,7 @@ static struct platform_driver of_platform_serial_driver = { | |||
271 | .name = "of_serial", | 297 | .name = "of_serial", |
272 | .owner = THIS_MODULE, | 298 | .owner = THIS_MODULE, |
273 | .of_match_table = of_platform_serial_table, | 299 | .of_match_table = of_platform_serial_table, |
300 | .pm = &of_serial_pm_ops, | ||
274 | }, | 301 | }, |
275 | .probe = of_platform_serial_probe, | 302 | .probe = of_platform_serial_probe, |
276 | .remove = of_platform_serial_remove, | 303 | .remove = of_platform_serial_remove, |