hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/tty/serial/8250/8250_omap.c
....@@ -653,6 +653,8 @@
653653 if ((lsr & UART_LSR_OE) && up->overrun_backoff_time_ms > 0) {
654654 unsigned long delay;
655655
656
+ /* Synchronize UART_IER access against the console. */
657
+ spin_lock(&port->lock);
656658 up->ier = port->serial_in(port, UART_IER);
657659 if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) {
658660 port->ops->stop_rx(port);
....@@ -662,6 +664,7 @@
662664 */
663665 cancel_delayed_work(&up->overrun_backoff);
664666 }
667
+ spin_unlock(&port->lock);
665668
666669 delay = msecs_to_jiffies(up->overrun_backoff_time_ms);
667670 schedule_delayed_work(&up->overrun_backoff, delay);
....@@ -1469,7 +1472,9 @@
14691472 err:
14701473 pm_runtime_dont_use_autosuspend(&pdev->dev);
14711474 pm_runtime_put_sync(&pdev->dev);
1475
+ flush_work(&priv->qos_work);
14721476 pm_runtime_disable(&pdev->dev);
1477
+ cpu_latency_qos_remove_request(&priv->pm_qos_request);
14731478 return ret;
14741479 }
14751480
....@@ -1516,25 +1521,35 @@
15161521 {
15171522 struct omap8250_priv *priv = dev_get_drvdata(dev);
15181523 struct uart_8250_port *up = serial8250_get_port(priv->line);
1524
+ int err;
15191525
15201526 serial8250_suspend_port(priv->line);
15211527
1522
- pm_runtime_get_sync(dev);
1528
+ err = pm_runtime_resume_and_get(dev);
1529
+ if (err)
1530
+ return err;
15231531 if (!device_may_wakeup(dev))
15241532 priv->wer = 0;
15251533 serial_out(up, UART_OMAP_WER, priv->wer);
1526
- pm_runtime_mark_last_busy(dev);
1527
- pm_runtime_put_autosuspend(dev);
1528
-
1534
+ err = pm_runtime_force_suspend(dev);
15291535 flush_work(&priv->qos_work);
1530
- return 0;
1536
+
1537
+ return err;
15311538 }
15321539
15331540 static int omap8250_resume(struct device *dev)
15341541 {
15351542 struct omap8250_priv *priv = dev_get_drvdata(dev);
1543
+ int err;
15361544
1545
+ err = pm_runtime_force_resume(dev);
1546
+ if (err)
1547
+ return err;
15371548 serial8250_resume_port(priv->line);
1549
+ /* Paired with pm_runtime_resume_and_get() in omap8250_suspend() */
1550
+ pm_runtime_mark_last_busy(dev);
1551
+ pm_runtime_put_autosuspend(dev);
1552
+
15381553 return 0;
15391554 }
15401555 #else