From cc255f5132cf39e9154340cf58780f8c763c6481 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Thu, 23 Jan 2025 17:06:08 +0000 Subject: [PATCH] Revert "serial: 8250_omap: Drop pm_runtime_irq_safe()" This reverts commit 8700a7ea5519fb0b3bad2362adfeac358c2119ce. Upstream-Status: Inappropriate Signed-off-by: Ross Burton --- drivers/tty/serial/8250/8250_omap.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 0dd68bdbfbcf7..db24d7d1dcb67 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -8,7 +8,6 @@ * */ -#include #include #include #include @@ -134,7 +133,6 @@ struct omap8250_priv { u8 tx_trigger; u8 rx_trigger; - atomic_t active; bool is_suspending; int wakeirq; u32 latency; @@ -636,23 +634,14 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id) unsigned int iir, lsr; int ret; - pm_runtime_get_noresume(port->dev); - - /* Shallow idle state wake-up to an IO interrupt? */ - if (atomic_add_unless(&priv->active, 1, 1)) { - priv->latency = priv->calc_latency; - schedule_work(&priv->qos_work); - } - #ifdef CONFIG_SERIAL_8250_DMA if (up->dma) { ret = omap_8250_dma_handle_irq(port); - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put(port->dev); return IRQ_RETVAL(ret); } #endif + serial8250_rpm_get(up); lsr = serial_port_in(port, UART_LSR); iir = serial_port_in(port, UART_IIR); ret = serial8250_handle_irq(port, iir); @@ -701,8 +690,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id) schedule_delayed_work(&up->overrun_backoff, delay); } - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put(port->dev); + serial8250_rpm_put(up); return IRQ_RETVAL(ret); } @@ -1314,8 +1302,11 @@ static int omap_8250_dma_handle_irq(struct uart_port *port) u16 status; u8 iir; + serial8250_rpm_get(up); + iir = serial_port_in(port, UART_IIR); if (iir & UART_IIR_NO_INT) { + serial8250_rpm_put(up); return IRQ_HANDLED; } @@ -1348,6 +1339,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port) uart_unlock_and_check_sysrq(port); + serial8250_rpm_put(up); return 1; } @@ -1539,6 +1531,8 @@ static int omap8250_probe(struct platform_device *pdev) if (!of_get_available_child_count(pdev->dev.of_node)) pm_runtime_set_autosuspend_delay(&pdev->dev, -1); + pm_runtime_irq_safe(&pdev->dev); + pm_runtime_get_sync(&pdev->dev); omap_serial_fill_features_erratas(&up, priv); @@ -1776,7 +1770,6 @@ static int omap8250_runtime_suspend(struct device *dev) priv->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; schedule_work(&priv->qos_work); - atomic_set(&priv->active, 0); return 0; } @@ -1786,10 +1779,6 @@ static int omap8250_runtime_resume(struct device *dev) struct omap8250_priv *priv = dev_get_drvdata(dev); struct uart_8250_port *up = NULL; - /* Did the hardware wake to a device IO interrupt before a wakeirq? */ - if (atomic_read(&priv->active)) - return 0; - if (priv->line >= 0) up = serial8250_get_port(priv->line); @@ -1805,10 +1794,8 @@ static int omap8250_runtime_resume(struct device *dev) uart_port_unlock_irq(&up->port); } - atomic_set(&priv->active, 1); priv->latency = priv->calc_latency; schedule_work(&priv->qos_work); - return 0; } -- 2.43.0