aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/samsung.c
diff options
context:
space:
mode:
authorMichael Spang <spang@chromium.org>2013-03-27 19:34:24 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-28 19:04:19 -0400
commitd09a7308e9887a83abfd3176f4416d4142a265dc (patch)
tree383fc1796fc1179e2a742381bc4d9e98af13f8d8 /drivers/tty/serial/samsung.c
parentb6ad29355560beef6d127c6d33fb10ec0113bd85 (diff)
serial: samsung: Restore IRQ mask during noirq resume
This closes a window where the system may hang in resume as soon as the UART interrupt is enabled and before the mask is restored. The hang occurs because the driver can't handle IRQs it thinks are masked. Signed-off-by: Michael Spang <spang@chromium.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/samsung.c')
-rw-r--r--drivers/tty/serial/samsung.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index b386fc8a5eec..78d9c55a9f84 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -1311,9 +1311,29 @@ static int s3c24xx_serial_resume(struct device *dev)
1311 return 0; 1311 return 0;
1312} 1312}
1313 1313
1314static int s3c24xx_serial_resume_noirq(struct device *dev)
1315{
1316 struct uart_port *port = s3c24xx_dev_to_port(dev);
1317
1318 if (port) {
1319 /* restore IRQ mask */
1320 if (s3c24xx_serial_has_interrupt_mask(port)) {
1321 unsigned int uintm = 0xf;
1322 if (tx_enabled(port))
1323 uintm &= ~S3C64XX_UINTM_TXD_MSK;
1324 if (rx_enabled(port))
1325 uintm &= ~S3C64XX_UINTM_RXD_MSK;
1326 wr_regl(port, S3C64XX_UINTM, uintm);
1327 }
1328 }
1329
1330 return 0;
1331}
1332
1314static const struct dev_pm_ops s3c24xx_serial_pm_ops = { 1333static const struct dev_pm_ops s3c24xx_serial_pm_ops = {
1315 .suspend = s3c24xx_serial_suspend, 1334 .suspend = s3c24xx_serial_suspend,
1316 .resume = s3c24xx_serial_resume, 1335 .resume = s3c24xx_serial_resume,
1336 .resume_noirq = s3c24xx_serial_resume_noirq,
1317}; 1337};
1318#define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops) 1338#define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops)
1319 1339