mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
serial: 8250_omap: fix wake irq cleared during suspend
The wake irq was cleared in shutdown(), which runs during the suspend
sequence, making it impossible to wake the system via UART.
Move wake irq setup to probe() and teardown to remove() so the irq
remains armed during suspend when the UART is a wakeup source.
Cc: stable@kernel.org
Fixes: 61929cf016 ("tty: serial: Add 8250-core based omap driver")
Signed-off-by: Kendall Willis <k-willis@ti.com>
Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com>
Link: https://patch.msgid.link/20260825-uart-wakeirq-fix-v2-1-0b9fba03d9b6@ti.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
03b49c991a
commit
73f3e6ca7a
|
|
@ -711,12 +711,6 @@ static int omap_8250_startup(struct uart_port *port)
|
|||
struct uart_8250_dma *dma = &priv->omap8250_dma;
|
||||
int ret;
|
||||
|
||||
if (priv->wakeirq) {
|
||||
ret = dev_pm_set_dedicated_wake_irq(port->dev, priv->wakeirq);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
up->capabilities |= UART_CAP_RPM;
|
||||
#endif
|
||||
|
|
@ -787,7 +781,6 @@ static void omap_8250_shutdown(struct uart_port *port)
|
|||
}
|
||||
|
||||
disable_irq_nosync(port->irq);
|
||||
dev_pm_clear_wake_irq(port->dev);
|
||||
|
||||
serial8250_release_dma(up);
|
||||
up->dma = NULL;
|
||||
|
|
@ -1588,6 +1581,12 @@ static int omap8250_probe(struct platform_device *pdev)
|
|||
|
||||
priv->wakeirq = irq_of_parse_and_map(np, 1);
|
||||
|
||||
if (priv->wakeirq) {
|
||||
ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, priv->wakeirq);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = serial8250_register_8250_port(&up);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "unable to register 8250 port\n");
|
||||
|
|
@ -1603,6 +1602,7 @@ static int omap8250_probe(struct platform_device *pdev)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
dev_pm_clear_wake_irq(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
flush_work(&priv->qos_work);
|
||||
|
|
@ -1625,6 +1625,7 @@ static void omap8250_remove(struct platform_device *pdev)
|
|||
omap_8250_shutdown(&up->port);
|
||||
serial8250_unregister_port(priv->line);
|
||||
priv->line = -ENODEV;
|
||||
dev_pm_clear_wake_irq(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
flush_work(&priv->qos_work);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user