diff --git a/patches.suse/Revert-tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch b/patches.suse/Revert-tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch new file mode 100644 index 0000000..0062459 --- /dev/null +++ b/patches.suse/Revert-tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch @@ -0,0 +1,36 @@ +From 6d17d755d2d4a295b0a8b023eb115dea51b15d0c Mon Sep 17 00:00:00 2001 +From: Lucas Tanure +Date: Sun, 27 Aug 2023 09:29:44 +0100 +Subject: [PATCH] Revert "tty: serial: meson: Add a earlycon for the T7 SoC" + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: db726a2f3b4bc0cbf8e6cfd529d2d8eabb587d70 + +This reverts commit 6a4197f9763325043abf7690a21124a9facbf52e + +New SoC will use ttyS0 instead of ttyAML, so T7 SoC doesn't need a +OF_EARLYCON_DECLARE. + +Fixes: 6a4197f97633 ("tty: serial: meson: Add a earlycon for the T7 SoC") +Signed-off-by: Lucas Tanure +Link: https://lore.kernel.org/r/20230827082944.5100-1-tanure@linux.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index ad1079ca0e00..9388b9ddea3b 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -652,8 +652,6 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt + + OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + meson_serial_early_console_setup); +-OF_EARLYCON_DECLARE(meson, "amlogic,t7-uart", +- meson_serial_early_console_setup); + + #define MESON_SERIAL_CONSOLE_PTR(_devname) (&meson_serial_console_##_devname) + #else diff --git a/patches.suse/drm-i915-guc-Consider-also-RCU-depth-in-busy-loop.patch b/patches.suse/drm-i915-guc-Consider-also-RCU-depth-in-busy-loop.patch index c4af237..0c1a45d 100644 --- a/patches.suse/drm-i915-guc-Consider-also-RCU-depth-in-busy-loop.patch +++ b/patches.suse/drm-i915-guc-Consider-also-RCU-depth-in-busy-loop.patch @@ -1,10 +1,8 @@ -From 311187ea21bd1a10465ba4531f9508b152823bd3 Mon Sep 17 00:00:00 2001 +From d85608408bd98eae64252096eca1ecc7e0485b9c Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 3 Oct 2023 20:37:21 +0100 Subject: [PATCH] drm/i915/guc: Consider also RCU depth in busy loop. -From 607e0614f20206c0840e8716212ae3ff904e512d Mon Sep 17 00:00:00 2001 - References: SLE Realtime Extension Patch-mainline: Never, out-of-tree preempt-rt patch diff --git a/patches.suse/printk-Update-the-printk-series.patch b/patches.suse/printk-Update-the-printk-series.patch index 09d4018..8e7127d 100644 --- a/patches.suse/printk-Update-the-printk-series.patch +++ b/patches.suse/printk-Update-the-printk-series.patch @@ -1,4 +1,4 @@ -From 9da8b7d35670214ab5b90335ecbaae09cd6b301f Mon Sep 17 00:00:00 2001 +From bf4541f9313754f5f025e2780fb6d80412140899 Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Thu, 21 Mar 2024 12:04:09 +0000 Subject: [PATCH] printk: Update the printk series. @@ -34,16 +34,16 @@ Signed-off-by: Mel Gorman drivers/tty/serial/amba-pl010.c | 20 +- drivers/tty/serial/amba-pl011.c | 145 +-- drivers/tty/serial/apbuart.c | 10 +- - drivers/tty/serial/ar933x_uart.c | 29 +- + drivers/tty/serial/ar933x_uart.c | 26 +- drivers/tty/serial/arc_uart.c | 16 +- drivers/tty/serial/atmel_serial.c | 24 +- - drivers/tty/serial/bcm63xx_uart.c | 30 +- + drivers/tty/serial/bcm63xx_uart.c | 22 +- drivers/tty/serial/digicolor-usart.c | 18 +- drivers/tty/serial/dz.c | 32 +- - drivers/tty/serial/fsl_linflexuart.c | 34 +- - drivers/tty/serial/fsl_lpuart.c | 181 +-- + drivers/tty/serial/fsl_linflexuart.c | 26 +- + drivers/tty/serial/fsl_lpuart.c | 95 +- drivers/tty/serial/icom.c | 26 +- - drivers/tty/serial/imx.c | 145 +-- + drivers/tty/serial/imx.c | 142 +-- drivers/tty/serial/ip22zilog.c | 36 +- drivers/tty/serial/jsm/jsm_neo.c | 4 +- drivers/tty/serial/jsm/jsm_tty.c | 16 +- @@ -51,35 +51,35 @@ Signed-off-by: Mel Gorman drivers/tty/serial/lpc32xx_hs.c | 26 +- drivers/tty/serial/mcf.c | 20 +- drivers/tty/serial/men_z135_uart.c | 8 +- - drivers/tty/serial/meson_uart.c | 168 +-- + drivers/tty/serial/meson_uart.c | 30 +- drivers/tty/serial/milbeaut_usio.c | 16 +- drivers/tty/serial/mpc52xx_uart.c | 12 +- - drivers/tty/serial/mps2-uart.c | 19 +- + drivers/tty/serial/mps2-uart.c | 16 +- drivers/tty/serial/msm_serial.c | 38 +- - drivers/tty/serial/mvebu-uart.c | 29 +- - drivers/tty/serial/omap-serial.c | 68 +- + drivers/tty/serial/mvebu-uart.c | 18 +- + drivers/tty/serial/omap-serial.c | 65 +- drivers/tty/serial/owl-uart.c | 26 +- drivers/tty/serial/pch_uart.c | 10 +- drivers/tty/serial/pic32_uart.c | 20 +- drivers/tty/serial/pmac_zilog.c | 52 +- drivers/tty/serial/pxa.c | 30 +- - drivers/tty/serial/qcom_geni_serial.c | 27 +- + drivers/tty/serial/qcom_geni_serial.c | 18 +- drivers/tty/serial/rda-uart.c | 34 +- drivers/tty/serial/rp2.c | 20 +- drivers/tty/serial/sa1100.c | 20 +- - drivers/tty/serial/samsung_tty.c | 165 ++- + drivers/tty/serial/samsung_tty.c | 155 ++- drivers/tty/serial/sb1250-duart.c | 12 +- drivers/tty/serial/sc16is7xx.c | 366 +++--- - drivers/tty/serial/serial-tegra.c | 47 +- - drivers/tty/serial/serial_core.c | 189 ++- + drivers/tty/serial/serial-tegra.c | 32 +- + drivers/tty/serial/serial_core.c | 116 +- drivers/tty/serial/serial_mctrl_gpio.c | 4 +- drivers/tty/serial/serial_port.c | 4 +- drivers/tty/serial/serial_txx9.c | 26 +- drivers/tty/serial/sh-sci.c | 68 +- - drivers/tty/serial/sifive.c | 43 +- - drivers/tty/serial/sprd_serial.c | 33 +- - drivers/tty/serial/st-asc.c | 27 +- - drivers/tty/serial/stm32-usart.c | 343 ++--- + drivers/tty/serial/sifive.c | 16 +- + drivers/tty/serial/sprd_serial.c | 30 +- + drivers/tty/serial/st-asc.c | 24 +- + drivers/tty/serial/stm32-usart.c | 42 +- drivers/tty/serial/sunhv.c | 28 +- drivers/tty/serial/sunplus-uart.c | 26 +- drivers/tty/serial/sunsab.c | 34 +- @@ -88,8 +88,8 @@ Signed-off-by: Mel Gorman drivers/tty/serial/timbuart.c | 8 +- drivers/tty/serial/uartlite.c | 18 +- drivers/tty/serial/ucc_uart.c | 5 +- - drivers/tty/serial/vt8500_serial.c | 14 +- - drivers/tty/serial/xilinx_uartps.c | 60 +- + drivers/tty/serial/vt8500_serial.c | 8 +- + drivers/tty/serial/xilinx_uartps.c | 56 +- drivers/tty/tty.h | 13 +- drivers/tty/tty_audit.c | 7 +- drivers/tty/tty_io.c | 6 +- @@ -97,7 +97,7 @@ Signed-off-by: Mel Gorman include/linux/console.h | 235 ++-- include/linux/printk.h | 29 +- include/linux/serial_8250.h | 9 +- - include/linux/serial_core.h | 97 +- + include/linux/serial_core.h | 95 +- kernel/locking/lockdep.c | 5 + kernel/panic.c | 33 +- kernel/printk/Makefile | 2 +- @@ -109,7 +109,7 @@ Signed-off-by: Mel Gorman kernel/printk/printk_ringbuffer.h | 54 +- kernel/printk/printk_safe.c | 31 +- kernel/rcu/tree_stall.h | 5 +- - 94 files changed, 4843 insertions(+), 4746 deletions(-) + 94 files changed, 4436 insertions(+), 4437 deletions(-) diff --git a/drivers/tty/serial/21285.c b/drivers/tty/serial/21285.c index d756fcc884cb..4de0c975ebdc 100644 @@ -3259,7 +3259,7 @@ index d3cb341f2c55..716cb014c028 100644 static const char *apbuart_type(struct uart_port *port) diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c -index 4c3d04c6826a..ffd234673177 100644 +index 924c1a89347c..ffd234673177 100644 --- a/drivers/tty/serial/ar933x_uart.c +++ b/drivers/tty/serial/ar933x_uart.c @@ -133,9 +133,9 @@ static unsigned int ar933x_uart_tx_empty(struct uart_port *port) @@ -3366,16 +3366,6 @@ index 4c3d04c6826a..ffd234673177 100644 local_irq_restore(flags); } -@@ -749,8 +749,7 @@ static int ar933x_uart_probe(struct platform_device *pdev) - - port = &up->port; - -- mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- port->membase = devm_ioremap_resource(&pdev->dev, mem_res); -+ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res); - if (IS_ERR(port->membase)) - return PTR_ERR(port->membase); - diff --git a/drivers/tty/serial/arc_uart.c b/drivers/tty/serial/arc_uart.c index ad4ae19b6ce3..1aa5b2b49c26 100644 --- a/drivers/tty/serial/arc_uart.c @@ -3521,7 +3511,7 @@ index 88cdafa5ac54..1946fafc3f3e 100644 } } diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c -index 55e82d0bf92d..4a08fd5ee61b 100644 +index 0dd8cceb837c..4a08fd5ee61b 100644 --- a/drivers/tty/serial/bcm63xx_uart.c +++ b/drivers/tty/serial/bcm63xx_uart.c @@ -201,7 +201,7 @@ static void bcm_uart_break_ctl(struct uart_port *port, int ctl) @@ -3611,23 +3601,6 @@ index 55e82d0bf92d..4a08fd5ee61b 100644 local_irq_restore(flags); } -@@ -832,14 +832,10 @@ static int bcm_uart_probe(struct platform_device *pdev) - return -EBUSY; - memset(port, 0, sizeof(*port)); - -- res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- if (!res_mem) -- return -ENODEV; -- -- port->mapbase = res_mem->start; -- port->membase = devm_ioremap_resource(&pdev->dev, res_mem); -+ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem); - if (IS_ERR(port->membase)) - return PTR_ERR(port->membase); -+ port->mapbase = res_mem->start; - - ret = platform_get_irq(pdev, 0); - if (ret < 0) diff --git a/drivers/tty/serial/digicolor-usart.c b/drivers/tty/serial/digicolor-usart.c index 128b5479e813..5004125f3045 100644 --- a/drivers/tty/serial/digicolor-usart.c @@ -3830,7 +3803,7 @@ index 667f52e83277..6df7af9edc1c 100644 do { trdy = dz_in(dport, DZ_CSR); diff --git a/drivers/tty/serial/fsl_linflexuart.c b/drivers/tty/serial/fsl_linflexuart.c -index f697751c2ad5..7fa809a405e8 100644 +index 249cb380c3c6..7fa809a405e8 100644 --- a/drivers/tty/serial/fsl_linflexuart.c +++ b/drivers/tty/serial/fsl_linflexuart.c @@ -203,7 +203,7 @@ static irqreturn_t linflex_txint(int irq, void *dev_id) @@ -3936,36 +3909,11 @@ index f697751c2ad5..7fa809a405e8 100644 } /* -@@ -827,14 +827,10 @@ static int linflex_probe(struct platform_device *pdev) - - sport->line = ret; - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- if (!res) -- return -ENODEV; -- -- sport->mapbase = res->start; -- sport->membase = devm_ioremap_resource(&pdev->dev, res); -+ sport->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(sport->membase)) - return PTR_ERR(sport->membase); -+ sport->mapbase = res->start; - - sport->dev = &pdev->dev; - sport->type = PORT_LINFLEXUART; diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c -index 2e4a35adfcde..6d0cfb2e86b4 100644 +index 385b41275e8b..6d0cfb2e86b4 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c -@@ -288,6 +288,7 @@ struct lpuart_port { - wait_queue_head_t dma_wait; - bool is_cs7; /* Set to true when character size is 7 */ - /* and the parity is enabled */ -+ bool dma_idle_int; - }; - - struct lpuart_soc_data { -@@ -531,9 +532,9 @@ static void lpuart_dma_tx_complete(void *arg) +@@ -532,9 +532,9 @@ static void lpuart_dma_tx_complete(void *arg) struct dma_chan *chan = sport->dma_tx_chan; unsigned long flags; @@ -3977,7 +3925,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 return; } -@@ -542,7 +543,7 @@ static void lpuart_dma_tx_complete(void *arg) +@@ -543,7 +543,7 @@ static void lpuart_dma_tx_complete(void *arg) uart_xmit_advance(&sport->port, sport->dma_tx_bytes); sport->dma_tx_in_progress = false; @@ -3986,7 +3934,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) uart_write_wakeup(&sport->port); -@@ -552,12 +553,12 @@ static void lpuart_dma_tx_complete(void *arg) +@@ -553,12 +553,12 @@ static void lpuart_dma_tx_complete(void *arg) return; } @@ -4001,7 +3949,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static dma_addr_t lpuart_dma_datareg_addr(struct lpuart_port *sport) -@@ -650,7 +651,7 @@ static int lpuart_poll_init(struct uart_port *port) +@@ -651,7 +651,7 @@ static int lpuart_poll_init(struct uart_port *port) sport->port.fifosize = 0; @@ -4010,7 +3958,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* Disable Rx & Tx */ writeb(0, sport->port.membase + UARTCR2); -@@ -674,7 +675,7 @@ static int lpuart_poll_init(struct uart_port *port) +@@ -675,7 +675,7 @@ static int lpuart_poll_init(struct uart_port *port) /* Enable Rx and Tx */ writeb(UARTCR2_RE | UARTCR2_TE, sport->port.membase + UARTCR2); @@ -4019,7 +3967,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 return 0; } -@@ -702,7 +703,7 @@ static int lpuart32_poll_init(struct uart_port *port) +@@ -703,7 +703,7 @@ static int lpuart32_poll_init(struct uart_port *port) sport->port.fifosize = 0; @@ -4028,7 +3976,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* Disable Rx & Tx */ lpuart32_write(&sport->port, 0, UARTCTRL); -@@ -723,7 +724,7 @@ static int lpuart32_poll_init(struct uart_port *port) +@@ -724,7 +724,7 @@ static int lpuart32_poll_init(struct uart_port *port) /* Enable Rx and Tx */ lpuart32_write(&sport->port, UARTCTRL_RE | UARTCTRL_TE, UARTCTRL); @@ -4037,7 +3985,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 return 0; } -@@ -878,9 +879,9 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port) +@@ -879,9 +879,9 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port) static void lpuart_txint(struct lpuart_port *sport) { @@ -4049,7 +3997,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static void lpuart_rxint(struct lpuart_port *sport) -@@ -889,7 +890,7 @@ static void lpuart_rxint(struct lpuart_port *sport) +@@ -890,7 +890,7 @@ static void lpuart_rxint(struct lpuart_port *sport) struct tty_port *port = &sport->port.state->port; unsigned char rx, sr; @@ -4058,7 +4006,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 while (!(readb(sport->port.membase + UARTSFIFO) & UARTSFIFO_RXEMPT)) { flg = TTY_NORMAL; -@@ -955,9 +956,9 @@ static void lpuart_rxint(struct lpuart_port *sport) +@@ -956,9 +956,9 @@ static void lpuart_rxint(struct lpuart_port *sport) static void lpuart32_txint(struct lpuart_port *sport) { @@ -4070,7 +4018,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static void lpuart32_rxint(struct lpuart_port *sport) -@@ -967,7 +968,7 @@ static void lpuart32_rxint(struct lpuart_port *sport) +@@ -968,7 +968,7 @@ static void lpuart32_rxint(struct lpuart_port *sport) unsigned long rx, sr; bool is_break; @@ -4079,34 +4027,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 while (!(lpuart32_read(&sport->port, UARTFIFO) & UARTFIFO_RXEMPT)) { flg = TTY_NORMAL; -@@ -1064,26 +1065,6 @@ static irqreturn_t lpuart_int(int irq, void *dev_id) - return IRQ_HANDLED; - } - --static irqreturn_t lpuart32_int(int irq, void *dev_id) --{ -- struct lpuart_port *sport = dev_id; -- unsigned long sts, rxcount; -- -- sts = lpuart32_read(&sport->port, UARTSTAT); -- rxcount = lpuart32_read(&sport->port, UARTWATER); -- rxcount = rxcount >> UARTWATER_RXCNT_OFF; -- -- if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use) -- lpuart32_rxint(sport); -- -- if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use) -- lpuart32_txint(sport); -- -- lpuart32_write(&sport->port, sts, UARTSTAT); -- return IRQ_HANDLED; --} -- -- - static inline void lpuart_handle_sysrq_chars(struct uart_port *port, - unsigned char *p, int count) - { -@@ -1189,12 +1170,12 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport) +@@ -1170,12 +1170,12 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport) async_tx_ack(sport->dma_rx_desc); @@ -4121,7 +4042,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 return; } -@@ -1263,10 +1244,11 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport) +@@ -1244,7 +1244,7 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport) dma_sync_sg_for_device(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE); @@ -4129,64 +4050,8 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 + uart_port_unlock_irqrestore(&sport->port, flags); tty_flip_buffer_push(port); -- mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout); -+ if (!sport->dma_idle_int) -+ mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout); - } - - static void lpuart_dma_rx_complete(void *arg) -@@ -1276,6 +1258,50 @@ static void lpuart_dma_rx_complete(void *arg) - lpuart_copy_rx_to_tty(sport); - } - -+static void lpuart32_dma_idleint(struct lpuart_port *sport) -+{ -+ enum dma_status dmastat; -+ struct dma_chan *chan = sport->dma_rx_chan; -+ struct circ_buf *ring = &sport->rx_ring; -+ struct dma_tx_state state; -+ int count = 0; -+ -+ dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state); -+ if (dmastat == DMA_ERROR) { -+ dev_err(sport->port.dev, "Rx DMA transfer failed!\n"); -+ return; -+ } -+ -+ ring->head = sport->rx_sgl.length - state.residue; -+ count = CIRC_CNT(ring->head, ring->tail, sport->rx_sgl.length); -+ -+ /* Check if new data received before copying */ -+ if (count) -+ lpuart_copy_rx_to_tty(sport); -+} -+ -+static irqreturn_t lpuart32_int(int irq, void *dev_id) -+{ -+ struct lpuart_port *sport = dev_id; -+ unsigned long sts, rxcount; -+ -+ sts = lpuart32_read(&sport->port, UARTSTAT); -+ rxcount = lpuart32_read(&sport->port, UARTWATER); -+ rxcount = rxcount >> UARTWATER_RXCNT_OFF; -+ -+ if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use) -+ lpuart32_rxint(sport); -+ -+ if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use) -+ lpuart32_txint(sport); -+ -+ if ((sts & UARTSTAT_IDLE) && sport->lpuart_dma_rx_use && sport->dma_idle_int) -+ lpuart32_dma_idleint(sport); -+ -+ lpuart32_write(&sport->port, sts, UARTSTAT); -+ return IRQ_HANDLED; -+} -+ - /* - * Timer function to simulate the hardware EOP (End Of Package) event. - * The timer callback is to check for new RX data and copy to TTY buffer. -@@ -1309,9 +1335,9 @@ static void lpuart_timer_func(struct timer_list *t) + if (!sport->dma_idle_int) +@@ -1335,9 +1335,9 @@ static void lpuart_timer_func(struct timer_list *t) mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout); @@ -4198,41 +4063,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } } -@@ -1392,6 +1418,12 @@ static inline int lpuart_start_rx_dma(struct lpuart_port *sport) - unsigned long temp = lpuart32_read(&sport->port, UARTBAUD); - - lpuart32_write(&sport->port, temp | UARTBAUD_RDMAE, UARTBAUD); -+ -+ if (sport->dma_idle_int) { -+ unsigned long ctrl = lpuart32_read(&sport->port, UARTCTRL); -+ -+ lpuart32_write(&sport->port, ctrl | UARTCTRL_ILIE, UARTCTRL); -+ } - } else { - writeb(readb(sport->port.membase + UARTCR5) | UARTCR5_RDMAS, - sport->port.membase + UARTCR5); -@@ -1407,7 +1439,9 @@ static void lpuart_dma_rx_free(struct uart_port *port) - struct dma_chan *chan = sport->dma_rx_chan; - - dmaengine_terminate_sync(chan); -- del_timer_sync(&sport->lpuart_timer); -+ if (!sport->dma_idle_int) -+ del_timer_sync(&sport->lpuart_timer); -+ - dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE); - kfree(sport->rx_ring.buf); - sport->rx_ring.tail = 0; -@@ -1669,6 +1703,9 @@ static void lpuart32_setup_watermark_enable(struct lpuart_port *sport) - - static void rx_dma_timer_init(struct lpuart_port *sport) - { -+ if (sport->dma_idle_int) -+ return; -+ - timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0); - sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout; - add_timer(&sport->lpuart_timer); -@@ -1765,14 +1802,14 @@ static void lpuart_hw_setup(struct lpuart_port *sport) +@@ -1802,14 +1802,14 @@ static void lpuart_hw_setup(struct lpuart_port *sport) { unsigned long flags; @@ -4249,7 +4080,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static int lpuart_startup(struct uart_port *port) -@@ -1822,7 +1859,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport) +@@ -1859,7 +1859,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport) { unsigned long flags; @@ -4258,7 +4089,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 lpuart32_hw_disable(sport); -@@ -1832,7 +1869,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport) +@@ -1869,7 +1869,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport) lpuart32_setup_watermark_enable(sport); lpuart32_configure(sport); @@ -4267,7 +4098,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static int lpuart32_startup(struct uart_port *port) -@@ -1895,7 +1932,7 @@ static void lpuart_shutdown(struct uart_port *port) +@@ -1932,7 +1932,7 @@ static void lpuart_shutdown(struct uart_port *port) unsigned char temp; unsigned long flags; @@ -4276,7 +4107,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* disable Rx/Tx and interrupts */ temp = readb(port->membase + UARTCR2); -@@ -1903,7 +1940,7 @@ static void lpuart_shutdown(struct uart_port *port) +@@ -1940,7 +1940,7 @@ static void lpuart_shutdown(struct uart_port *port) UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE); writeb(temp, port->membase + UARTCR2); @@ -4285,7 +4116,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 lpuart_dma_shutdown(sport); } -@@ -1915,7 +1952,7 @@ static void lpuart32_shutdown(struct uart_port *port) +@@ -1952,7 +1952,7 @@ static void lpuart32_shutdown(struct uart_port *port) unsigned long temp; unsigned long flags; @@ -4294,7 +4125,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* clear status */ temp = lpuart32_read(&sport->port, UARTSTAT); -@@ -1932,7 +1969,7 @@ static void lpuart32_shutdown(struct uart_port *port) +@@ -1969,7 +1969,7 @@ static void lpuart32_shutdown(struct uart_port *port) UARTCTRL_TIE | UARTCTRL_TCIE | UARTCTRL_RIE | UARTCTRL_SBK); lpuart32_write(port, temp, UARTCTRL); @@ -4303,7 +4134,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 lpuart_dma_shutdown(sport); } -@@ -2032,7 +2069,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2069,7 +2069,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios, if (old && sport->lpuart_dma_rx_use) lpuart_dma_rx_free(&sport->port); @@ -4312,7 +4143,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 sport->port.read_status_mask = 0; if (termios->c_iflag & INPCK) -@@ -2087,7 +2124,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2124,7 +2124,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios, sport->lpuart_dma_rx_use = false; } @@ -4321,7 +4152,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static void __lpuart32_serial_setbrg(struct uart_port *port, -@@ -2267,7 +2304,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2304,7 +2304,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, if (old && sport->lpuart_dma_rx_use) lpuart_dma_rx_free(&sport->port); @@ -4330,7 +4161,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 sport->port.read_status_mask = 0; if (termios->c_iflag & INPCK) -@@ -2308,12 +2345,9 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2345,12 +2345,9 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, lpuart32_write(&sport->port, bd, UARTBAUD); lpuart32_serial_setbrg(sport, baud); @@ -4345,7 +4176,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if ((ctrl & (UARTCTRL_PE | UARTCTRL_M)) == UARTCTRL_PE) sport->is_cs7 = true; -@@ -2325,7 +2359,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2362,7 +2359,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, sport->lpuart_dma_rx_use = false; } @@ -4354,7 +4185,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static const char *lpuart_type(struct uart_port *port) -@@ -2443,9 +2477,9 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2480,9 +2477,9 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count) int locked = 1; if (oops_in_progress) @@ -4366,7 +4197,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* first save CR2 and then disable interrupts */ cr2 = old_cr2 = readb(sport->port.membase + UARTCR2); -@@ -2461,7 +2495,7 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2498,7 +2495,7 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count) writeb(old_cr2, sport->port.membase + UARTCR2); if (locked) @@ -4375,7 +4206,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } static void -@@ -2473,9 +2507,9 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count) +@@ -2510,9 +2507,9 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count) int locked = 1; if (oops_in_progress) @@ -4387,7 +4218,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 /* first save CR2 and then disable interrupts */ cr = old_cr = lpuart32_read(&sport->port, UARTCTRL); -@@ -2491,7 +2525,7 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count) +@@ -2528,7 +2525,7 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count) lpuart32_write(&sport->port, old_cr, UARTCTRL); if (locked) @@ -4396,26 +4227,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 } /* -@@ -2814,8 +2848,7 @@ static int lpuart_probe(struct platform_device *pdev) - if (!sport) - return -ENOMEM; - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- sport->port.membase = devm_ioremap_resource(&pdev->dev, res); -+ sport->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(sport->port.membase)) - return PTR_ERR(sport->port.membase); - -@@ -2825,6 +2858,8 @@ static int lpuart_probe(struct platform_device *pdev) - sport->port.type = PORT_LPUART; - sport->devtype = sdata->devtype; - sport->rx_watermark = sdata->rx_watermark; -+ sport->dma_idle_int = is_imx7ulp_lpuart(sport) || is_imx8ulp_lpuart(sport) || -+ is_imx8qxp_lpuart(sport); - ret = platform_get_irq(pdev, 0); - if (ret < 0) - return ret; -@@ -3054,7 +3089,7 @@ static int lpuart_suspend(struct device *dev) +@@ -3092,7 +3089,7 @@ static int lpuart_suspend(struct device *dev) uart_suspend_port(&lpuart_reg, &sport->port); if (lpuart_uport_is_active(sport)) { @@ -4424,7 +4236,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if (lpuart_is_32(sport)) { /* disable Rx/Tx and interrupts */ temp = lpuart32_read(&sport->port, UARTCTRL); -@@ -3066,7 +3101,7 @@ static int lpuart_suspend(struct device *dev) +@@ -3104,7 +3101,7 @@ static int lpuart_suspend(struct device *dev) temp &= ~(UARTCR2_TE | UARTCR2_TIE | UARTCR2_TCIE); writeb(temp, sport->port.membase + UARTCR2); } @@ -4433,7 +4245,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if (sport->lpuart_dma_rx_use) { /* -@@ -3079,7 +3114,7 @@ static int lpuart_suspend(struct device *dev) +@@ -3117,7 +3114,7 @@ static int lpuart_suspend(struct device *dev) lpuart_dma_rx_free(&sport->port); /* Disable Rx DMA to use UART port as wakeup source */ @@ -4442,7 +4254,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if (lpuart_is_32(sport)) { temp = lpuart32_read(&sport->port, UARTBAUD); lpuart32_write(&sport->port, temp & ~UARTBAUD_RDMAE, -@@ -3088,11 +3123,11 @@ static int lpuart_suspend(struct device *dev) +@@ -3126,11 +3123,11 @@ static int lpuart_suspend(struct device *dev) writeb(readb(sport->port.membase + UARTCR5) & ~UARTCR5_RDMAS, sport->port.membase + UARTCR5); } @@ -4456,7 +4268,7 @@ index 2e4a35adfcde..6d0cfb2e86b4 100644 if (lpuart_is_32(sport)) { temp = lpuart32_read(&sport->port, UARTBAUD); temp &= ~UARTBAUD_TDMAE; -@@ -3102,7 +3137,7 @@ static int lpuart_suspend(struct device *dev) +@@ -3140,7 +3137,7 @@ static int lpuart_suspend(struct device *dev) temp &= ~UARTCR5_TDMAS; writeb(temp, sport->port.membase + UARTCR5); } @@ -4581,7 +4393,7 @@ index 819f957b6b84..a75eafbcbea3 100644 static const char *icom_type(struct uart_port *port) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index bb77a887c61c..0fb679cdb15e 100644 +index c77831e91ec2..7e9652f68c65 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -421,13 +421,13 @@ static void imx_uart_stop_tx(struct uart_port *port) @@ -4880,7 +4692,7 @@ index bb77a887c61c..0fb679cdb15e 100644 return 0; } -@@ -2019,9 +2005,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2015,9 +2001,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) if (sport->port.sysrq) locked = 0; else if (oops_in_progress) @@ -4892,7 +4704,7 @@ index bb77a887c61c..0fb679cdb15e 100644 /* * First, save UCR1/2/3 and then disable interrupts -@@ -2049,7 +2035,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2045,7 +2031,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) imx_uart_ucrs_restore(sport, &old_ucr); if (locked) @@ -4901,7 +4713,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } /* -@@ -2207,10 +2193,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t) +@@ -2203,10 +2189,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t) struct imx_port *sport = container_of(t, struct imx_port, trigger_start_tx); unsigned long flags; @@ -4914,7 +4726,7 @@ index bb77a887c61c..0fb679cdb15e 100644 return HRTIMER_NORESTART; } -@@ -2220,14 +2206,15 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t) +@@ -2216,14 +2202,15 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t) struct imx_port *sport = container_of(t, struct imx_port, trigger_stop_tx); unsigned long flags; @@ -4932,17 +4744,7 @@ index bb77a887c61c..0fb679cdb15e 100644 static const struct serial_rs485 imx_rs485_supported = { .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND | SER_RS485_RX_DURING_TX, -@@ -2288,8 +2275,7 @@ static int imx_uart_probe(struct platform_device *pdev) - return -EINVAL; - } - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- base = devm_ioremap_resource(&pdev->dev, res); -+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(base)) - return PTR_ERR(base); - -@@ -2312,6 +2298,8 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2307,6 +2294,8 @@ static int imx_uart_probe(struct platform_device *pdev) /* RTS is required to control the RS485 transmitter */ if (sport->have_rtscts || sport->have_rtsgpio) sport->port.rs485_supported = imx_rs485_supported; @@ -4951,7 +4753,7 @@ index bb77a887c61c..0fb679cdb15e 100644 sport->port.flags = UPF_BOOT_AUTOCONF; timer_setup(&sport->timer, imx_uart_timeout, 0); -@@ -2338,13 +2326,19 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2333,13 +2322,19 @@ static int imx_uart_probe(struct platform_device *pdev) /* For register access, we only need to enable the ipg clock. */ ret = clk_prepare_enable(sport->clk_ipg); if (ret) { @@ -4974,7 +4776,7 @@ index bb77a887c61c..0fb679cdb15e 100644 /* * If using the i.MX UART RTS/CTS control then the RTS (CTS_B) -@@ -2424,6 +2418,8 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2419,6 +2414,8 @@ static int imx_uart_probe(struct platform_device *pdev) imx_uart_writel(sport, ucr3, UCR3); } @@ -4983,7 +4785,7 @@ index bb77a887c61c..0fb679cdb15e 100644 hrtimer_init(&sport->trigger_start_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hrtimer_init(&sport->trigger_stop_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); sport->trigger_start_tx.function = imx_trigger_start_tx; -@@ -2439,7 +2435,7 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2434,7 +2431,7 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request rx irq: %d\n", ret); @@ -4992,7 +4794,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } ret = devm_request_irq(&pdev->dev, txirq, imx_uart_txint, 0, -@@ -2447,7 +2443,7 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2442,7 +2439,7 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request tx irq: %d\n", ret); @@ -5001,7 +4803,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } ret = devm_request_irq(&pdev->dev, rtsirq, imx_uart_rtsint, 0, -@@ -2455,14 +2451,14 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2450,14 +2447,14 @@ static int imx_uart_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "failed to request rts irq: %d\n", ret); @@ -5018,7 +4820,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } } -@@ -2470,12 +2466,7 @@ static int imx_uart_probe(struct platform_device *pdev) +@@ -2465,12 +2462,7 @@ static int imx_uart_probe(struct platform_device *pdev) platform_set_drvdata(pdev, sport); @@ -5032,7 +4834,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } static int imx_uart_remove(struct platform_device *pdev) -@@ -2491,9 +2482,9 @@ static void imx_uart_restore_context(struct imx_port *sport) +@@ -2486,9 +2478,9 @@ static void imx_uart_restore_context(struct imx_port *sport) { unsigned long flags; @@ -5044,7 +4846,7 @@ index bb77a887c61c..0fb679cdb15e 100644 return; } -@@ -2508,7 +2499,7 @@ static void imx_uart_restore_context(struct imx_port *sport) +@@ -2503,7 +2495,7 @@ static void imx_uart_restore_context(struct imx_port *sport) imx_uart_writel(sport, sport->saved_reg[2], UCR3); imx_uart_writel(sport, sport->saved_reg[3], UCR4); sport->context_saved = false; @@ -5053,7 +4855,7 @@ index bb77a887c61c..0fb679cdb15e 100644 } static void imx_uart_save_context(struct imx_port *sport) -@@ -2516,7 +2507,7 @@ static void imx_uart_save_context(struct imx_port *sport) +@@ -2511,7 +2503,7 @@ static void imx_uart_save_context(struct imx_port *sport) unsigned long flags; /* Save necessary regs */ @@ -5062,7 +4864,7 @@ index bb77a887c61c..0fb679cdb15e 100644 sport->saved_reg[0] = imx_uart_readl(sport, UCR1); sport->saved_reg[1] = imx_uart_readl(sport, UCR2); sport->saved_reg[2] = imx_uart_readl(sport, UCR3); -@@ -2528,7 +2519,7 @@ static void imx_uart_save_context(struct imx_port *sport) +@@ -2523,7 +2515,7 @@ static void imx_uart_save_context(struct imx_port *sport) sport->saved_reg[8] = imx_uart_readl(sport, UBMR); sport->saved_reg[9] = imx_uart_readl(sport, IMX21_UTS); sport->context_saved = true; @@ -5626,30 +5428,10 @@ index d2502aaa3e8c..8048fa542fc4 100644 static const char *men_z135_type(struct uart_port *port) diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c -index 677584cab57e..4c1d2089a0bb 100644 +index 9388b9ddea3b..4c1d2089a0bb 100644 --- a/drivers/tty/serial/meson_uart.c +++ b/drivers/tty/serial/meson_uart.c -@@ -72,16 +72,17 @@ - - #define AML_UART_PORT_NUM 12 - #define AML_UART_PORT_OFFSET 6 --#define AML_UART_DEV_NAME "ttyAML" - - #define AML_UART_POLL_USEC 5 - #define AML_UART_TIMEOUT_USEC 10000 - --static struct uart_driver meson_uart_driver; -+static struct uart_driver meson_uart_driver_ttyAML; -+static struct uart_driver meson_uart_driver_ttyS; - - static struct uart_port *meson_ports[AML_UART_PORT_NUM]; - - struct meson_uart_data { -+ struct uart_driver *uart_driver; - bool has_xtal_div2; - }; - -@@ -128,14 +129,14 @@ static void meson_uart_shutdown(struct uart_port *port) +@@ -129,14 +129,14 @@ static void meson_uart_shutdown(struct uart_port *port) free_irq(port->irq, port); @@ -5666,7 +5448,7 @@ index 677584cab57e..4c1d2089a0bb 100644 } static void meson_uart_start_tx(struct uart_port *port) -@@ -237,7 +238,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id) +@@ -238,7 +238,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id) { struct uart_port *port = (struct uart_port *)dev_id; @@ -5675,7 +5457,7 @@ index 677584cab57e..4c1d2089a0bb 100644 if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)) meson_receive_chars(port); -@@ -247,7 +248,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id) +@@ -248,7 +248,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id) meson_uart_start_tx(port); } @@ -5684,7 +5466,7 @@ index 677584cab57e..4c1d2089a0bb 100644 return IRQ_HANDLED; } -@@ -283,7 +284,7 @@ static int meson_uart_startup(struct uart_port *port) +@@ -284,7 +284,7 @@ static int meson_uart_startup(struct uart_port *port) u32 val; int ret = 0; @@ -5693,7 +5475,7 @@ index 677584cab57e..4c1d2089a0bb 100644 val = readl(port->membase + AML_UART_CONTROL); val |= AML_UART_CLEAR_ERR; -@@ -300,7 +301,7 @@ static int meson_uart_startup(struct uart_port *port) +@@ -301,7 +301,7 @@ static int meson_uart_startup(struct uart_port *port) val = (AML_UART_RECV_IRQ(1) | AML_UART_XMIT_IRQ(port->fifosize / 2)); writel(val, port->membase + AML_UART_MISC); @@ -5702,7 +5484,7 @@ index 677584cab57e..4c1d2089a0bb 100644 ret = request_irq(port->irq, meson_uart_interrupt, 0, port->name, port); -@@ -340,7 +341,7 @@ static void meson_uart_set_termios(struct uart_port *port, +@@ -341,7 +341,7 @@ static void meson_uart_set_termios(struct uart_port *port, unsigned long flags; u32 val; @@ -5711,7 +5493,7 @@ index 677584cab57e..4c1d2089a0bb 100644 cflags = termios->c_cflag; iflags = termios->c_iflag; -@@ -404,7 +405,7 @@ static void meson_uart_set_termios(struct uart_port *port, +@@ -405,7 +405,7 @@ static void meson_uart_set_termios(struct uart_port *port, AML_UART_FRAME_ERR; uart_update_timeout(port, termios->c_cflag, baud); @@ -5720,7 +5502,7 @@ index 677584cab57e..4c1d2089a0bb 100644 } static int meson_uart_verify_port(struct uart_port *port, -@@ -463,14 +464,14 @@ static int meson_uart_poll_get_char(struct uart_port *port) +@@ -464,14 +464,14 @@ static int meson_uart_poll_get_char(struct uart_port *port) u32 c; unsigned long flags; @@ -5737,7 +5519,7 @@ index 677584cab57e..4c1d2089a0bb 100644 return c; } -@@ -481,7 +482,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c) +@@ -482,7 +482,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c) u32 reg; int ret; @@ -5746,7 +5528,7 @@ index 677584cab57e..4c1d2089a0bb 100644 /* Wait until FIFO is empty or timeout */ ret = readl_poll_timeout_atomic(port->membase + AML_UART_STATUS, reg, -@@ -505,7 +506,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c) +@@ -506,7 +506,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c) dev_err(port->dev, "Timeout waiting for UART TX EMPTY\n"); out: @@ -5755,7 +5537,7 @@ index 677584cab57e..4c1d2089a0bb 100644 } #endif /* CONFIG_CONSOLE_POLL */ -@@ -562,9 +563,9 @@ static void meson_serial_port_write(struct uart_port *port, const char *s, +@@ -563,9 +563,9 @@ static void meson_serial_port_write(struct uart_port *port, const char *s, if (port->sysrq) { locked = 0; } else if (oops_in_progress) { @@ -5767,7 +5549,7 @@ index 677584cab57e..4c1d2089a0bb 100644 locked = 1; } -@@ -576,7 +577,7 @@ static void meson_serial_port_write(struct uart_port *port, const char *s, +@@ -577,7 +577,7 @@ static void meson_serial_port_write(struct uart_port *port, const char *s, writel(val, port->membase + AML_UART_CONTROL); if (locked) @@ -5776,227 +5558,6 @@ index 677584cab57e..4c1d2089a0bb 100644 local_irq_restore(flags); } -@@ -615,21 +616,19 @@ static int meson_serial_console_setup(struct console *co, char *options) - return uart_set_options(port, co, baud, parity, bits, flow); - } - --static struct console meson_serial_console = { -- .name = AML_UART_DEV_NAME, -- .write = meson_serial_console_write, -- .device = uart_console_device, -- .setup = meson_serial_console_setup, -- .flags = CON_PRINTBUFFER, -- .index = -1, -- .data = &meson_uart_driver, --}; -+#define MESON_SERIAL_CONSOLE(_devname) \ -+ static struct console meson_serial_console_##_devname = { \ -+ .name = __stringify(_devname), \ -+ .write = meson_serial_console_write, \ -+ .device = uart_console_device, \ -+ .setup = meson_serial_console_setup, \ -+ .flags = CON_PRINTBUFFER, \ -+ .index = -1, \ -+ .data = &meson_uart_driver_##_devname, \ -+ } - --static int __init meson_serial_console_init(void) --{ -- register_console(&meson_serial_console); -- return 0; --} -+MESON_SERIAL_CONSOLE(ttyAML); -+MESON_SERIAL_CONSOLE(ttyS); - - static void meson_serial_early_console_write(struct console *co, - const char *s, -@@ -654,21 +653,22 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt - OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", - meson_serial_early_console_setup); - --#define MESON_SERIAL_CONSOLE (&meson_serial_console) -+#define MESON_SERIAL_CONSOLE_PTR(_devname) (&meson_serial_console_##_devname) - #else --static int __init meson_serial_console_init(void) { -- return 0; --} --#define MESON_SERIAL_CONSOLE NULL -+#define MESON_SERIAL_CONSOLE_PTR(_devname) (NULL) - #endif - --static struct uart_driver meson_uart_driver = { -- .owner = THIS_MODULE, -- .driver_name = "meson_uart", -- .dev_name = AML_UART_DEV_NAME, -- .nr = AML_UART_PORT_NUM, -- .cons = MESON_SERIAL_CONSOLE, --}; -+#define MESON_UART_DRIVER(_devname) \ -+ static struct uart_driver meson_uart_driver_##_devname = { \ -+ .owner = THIS_MODULE, \ -+ .driver_name = "meson_uart", \ -+ .dev_name = __stringify(_devname), \ -+ .nr = AML_UART_PORT_NUM, \ -+ .cons = MESON_SERIAL_CONSOLE_PTR(_devname), \ -+ } -+ -+MESON_UART_DRIVER(ttyAML); -+MESON_UART_DRIVER(ttyS); - - static int meson_uart_probe_clocks(struct platform_device *pdev, - struct uart_port *port) -@@ -694,8 +694,16 @@ static int meson_uart_probe_clocks(struct platform_device *pdev, - return 0; - } - -+static struct uart_driver *meson_uart_current(const struct meson_uart_data *pd) -+{ -+ return (pd && pd->uart_driver) ? -+ pd->uart_driver : &meson_uart_driver_ttyAML; -+} -+ - static int meson_uart_probe(struct platform_device *pdev) - { -+ const struct meson_uart_data *priv_data; -+ struct uart_driver *uart_driver; - struct resource *res_mem; - struct uart_port *port; - u32 fifosize = 64; /* Default is 64, 128 for EE UART_0 */ -@@ -732,8 +740,8 @@ static int meson_uart_probe(struct platform_device *pdev) - has_rtscts = of_property_read_bool(pdev->dev.of_node, "uart-has-rtscts"); - - if (meson_ports[pdev->id]) { -- dev_err(&pdev->dev, "port %d already allocated\n", pdev->id); -- return -EBUSY; -+ return dev_err_probe(&pdev->dev, -EBUSY, -+ "port %d already allocated\n", pdev->id); - } - - port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL); -@@ -744,6 +752,17 @@ static int meson_uart_probe(struct platform_device *pdev) - if (ret) - return ret; - -+ priv_data = device_get_match_data(&pdev->dev); -+ -+ uart_driver = meson_uart_current(priv_data); -+ -+ if (!uart_driver->state) { -+ ret = uart_register_driver(uart_driver); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, -+ "can't register uart driver\n"); -+ } -+ - port->iotype = UPIO_MEM; - port->mapbase = res_mem->start; - port->mapsize = resource_size(res_mem); -@@ -758,7 +777,7 @@ static int meson_uart_probe(struct platform_device *pdev) - port->x_char = 0; - port->ops = &meson_uart_ops; - port->fifosize = fifosize; -- port->private_data = (void *)device_get_match_data(&pdev->dev); -+ port->private_data = (void *)priv_data; - - meson_ports[pdev->id] = port; - platform_set_drvdata(pdev, port); -@@ -769,7 +788,7 @@ static int meson_uart_probe(struct platform_device *pdev) - meson_uart_release_port(port); - } - -- ret = uart_add_one_port(&meson_uart_driver, port); -+ ret = uart_add_one_port(uart_driver, port); - if (ret) - meson_ports[pdev->id] = NULL; - -@@ -778,12 +797,21 @@ static int meson_uart_probe(struct platform_device *pdev) - - static int meson_uart_remove(struct platform_device *pdev) - { -+ struct uart_driver *uart_driver; - struct uart_port *port; - - port = platform_get_drvdata(pdev); -- uart_remove_one_port(&meson_uart_driver, port); -+ uart_driver = meson_uart_current(port->private_data); -+ uart_remove_one_port(uart_driver, port); - meson_ports[pdev->id] = NULL; - -+ for (int id = 0; id < AML_UART_PORT_NUM; id++) -+ if (meson_ports[id]) -+ return 0; -+ -+ /* No more available uart ports, unregister uart driver */ -+ uart_unregister_driver(uart_driver); -+ - return 0; - } - -@@ -791,6 +819,16 @@ static struct meson_uart_data meson_g12a_uart_data = { - .has_xtal_div2 = true, - }; - -+static struct meson_uart_data meson_a1_uart_data = { -+ .uart_driver = &meson_uart_driver_ttyS, -+ .has_xtal_div2 = false, -+}; -+ -+static struct meson_uart_data meson_s4_uart_data = { -+ .uart_driver = &meson_uart_driver_ttyS, -+ .has_xtal_div2 = true, -+}; -+ - static const struct of_device_id meson_uart_dt_match[] = { - { .compatible = "amlogic,meson6-uart" }, - { .compatible = "amlogic,meson8-uart" }, -@@ -802,7 +840,11 @@ static const struct of_device_id meson_uart_dt_match[] = { - }, - { - .compatible = "amlogic,meson-s4-uart", -- .data = (void *)&meson_g12a_uart_data, -+ .data = (void *)&meson_s4_uart_data, -+ }, -+ { -+ .compatible = "amlogic,meson-a1-uart", -+ .data = (void *)&meson_a1_uart_data, - }, - { /* sentinel */ }, - }; -@@ -817,33 +859,7 @@ static struct platform_driver meson_uart_platform_driver = { - }, - }; - --static int __init meson_uart_init(void) --{ -- int ret; -- -- ret = meson_serial_console_init(); -- if (ret) -- return ret; -- -- ret = uart_register_driver(&meson_uart_driver); -- if (ret) -- return ret; -- -- ret = platform_driver_register(&meson_uart_platform_driver); -- if (ret) -- uart_unregister_driver(&meson_uart_driver); -- -- return ret; --} -- --static void __exit meson_uart_exit(void) --{ -- platform_driver_unregister(&meson_uart_platform_driver); -- uart_unregister_driver(&meson_uart_driver); --} -- --module_init(meson_uart_init); --module_exit(meson_uart_exit); -+module_platform_driver(meson_uart_platform_driver); - - MODULE_AUTHOR("Carlo Caione "); - MODULE_DESCRIPTION("Amlogic Meson serial port driver"); diff --git a/drivers/tty/serial/milbeaut_usio.c b/drivers/tty/serial/milbeaut_usio.c index 70a910085e93..db3b81f2aa57 100644 --- a/drivers/tty/serial/milbeaut_usio.c @@ -6116,7 +5677,7 @@ index 916507b8f31d..a252465e745f 100644 return ret; } diff --git a/drivers/tty/serial/mps2-uart.c b/drivers/tty/serial/mps2-uart.c -index 5da88cbeec73..2a4c09f3a834 100644 +index ea5a7911cb15..2a4c09f3a834 100644 --- a/drivers/tty/serial/mps2-uart.c +++ b/drivers/tty/serial/mps2-uart.c @@ -188,12 +188,12 @@ static irqreturn_t mps2_uart_rxirq(int irq, void *data) @@ -6182,16 +5743,6 @@ index 5da88cbeec73..2a4c09f3a834 100644 if (tty_termios_baud_rate(termios)) tty_termios_encode_baud_rate(termios, baud, baud); -@@ -538,8 +538,7 @@ static int mps2_init_port(struct platform_device *pdev, - struct resource *res; - int ret; - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- mps_port->port.membase = devm_ioremap_resource(&pdev->dev, res); -+ mps_port->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(mps_port->port.membase)) - return PTR_ERR(mps_port->port.membase); - diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c index 90953e679e38..597264b546fd 100644 --- a/drivers/tty/serial/msm_serial.c @@ -6341,7 +5892,7 @@ index 90953e679e38..597264b546fd 100644 local_irq_restore(flags); } diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c -index 31f739c7a08b..0255646bc175 100644 +index ea924e9b913b..0255646bc175 100644 --- a/drivers/tty/serial/mvebu-uart.c +++ b/drivers/tty/serial/mvebu-uart.c @@ -187,9 +187,9 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port) @@ -6412,42 +5963,8 @@ index 31f739c7a08b..0255646bc175 100644 } static int mvebu_uart_console_setup(struct console *co, char *options) -@@ -876,18 +876,13 @@ static int uart_num_counter; - - static int mvebu_uart_probe(struct platform_device *pdev) - { -- struct resource *reg = platform_get_resource(pdev, IORESOURCE_MEM, 0); - const struct of_device_id *match = of_match_device(mvebu_uart_of_match, - &pdev->dev); - struct uart_port *port; - struct mvebu_uart *mvuart; -+ struct resource *reg; - int id, irq; - -- if (!reg) { -- dev_err(&pdev->dev, "no registers defined\n"); -- return -EINVAL; -- } -- - /* Assume that all UART ports have a DT alias or none has */ - id = of_alias_get_id(pdev->dev.of_node, "serial"); - if (!pdev->dev.of_node || id < 0) -@@ -922,11 +917,11 @@ static int mvebu_uart_probe(struct platform_device *pdev) - */ - port->irq = 0; - port->irqflags = 0; -- port->mapbase = reg->start; - -- port->membase = devm_ioremap_resource(&pdev->dev, reg); -+ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, ®); - if (IS_ERR(port->membase)) - return PTR_ERR(port->membase); -+ port->mapbase = reg->start; - - mvuart = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_uart), - GFP_KERNEL); diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c -index a48255364bf9..90369adc33f0 100644 +index 916f2edfd7ea..90369adc33f0 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c @@ -390,10 +390,10 @@ static void serial_omap_throttle(struct uart_port *port) @@ -6628,17 +6145,7 @@ index a48255364bf9..90369adc33f0 100644 static int serial_omap_probe(struct platform_device *pdev) { struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev); -@@ -1565,8 +1562,7 @@ static int serial_omap_probe(struct platform_device *pdev) - if (!up) - return -ENOMEM; - -- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- base = devm_ioremap_resource(&pdev->dev, mem); -+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); - if (IS_ERR(base)) - return PTR_ERR(base); - -@@ -1604,11 +1600,17 @@ static int serial_omap_probe(struct platform_device *pdev) +@@ -1603,11 +1600,17 @@ static int serial_omap_probe(struct platform_device *pdev) dev_info(up->port.dev, "no wakeirq for uart%d\n", up->port.line); @@ -6656,7 +6163,7 @@ index a48255364bf9..90369adc33f0 100644 if (!up->port.uartclk) { up->port.uartclk = DEFAULT_CLK_SPEED; dev_warn(&pdev->dev, -@@ -1616,10 +1618,6 @@ static int serial_omap_probe(struct platform_device *pdev) +@@ -1615,10 +1618,6 @@ static int serial_omap_probe(struct platform_device *pdev) DEFAULT_CLK_SPEED); } @@ -7215,7 +6722,7 @@ index 73c60f5ea027..46e70e155aab 100644 clk_disable(up->clk); diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c -index e69c456bedb4..7e78f97e8f43 100644 +index 2e1b1c827dfe..7e78f97e8f43 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -482,9 +482,9 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s, @@ -7274,36 +6781,6 @@ index e69c456bedb4..7e78f97e8f43 100644 m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); -@@ -1052,6 +1050,11 @@ static int setup_fifos(struct qcom_geni_serial_port *port) - (port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE; - - if (port->rx_buf && (old_rx_fifo_depth != port->rx_fifo_depth) && port->rx_fifo_depth) { -+ /* -+ * Use krealloc rather than krealloc_array because rx_buf is -+ * accessed as 1 byte entries as well as 4 byte entries so it's -+ * not necessarily an array. -+ */ - port->rx_buf = devm_krealloc(uport->dev, port->rx_buf, - port->rx_fifo_depth * sizeof(u32), - GFP_KERNEL); -@@ -1239,7 +1242,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport, - goto out_restart_rx; - } - -- dev_dbg(port->se.dev, "desired_rate-%u, clk_rate-%lu, clk_div-%u\n", -+ dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n", - baud * sampling_rate, clk_rate, clk_div); - - uport->uartclk = clk_rate; -@@ -1748,7 +1751,7 @@ static int qcom_geni_serial_sys_hib_resume(struct device *dev) - private_data = uport->private_data; - - if (uart_console(uport)) { -- geni_icc_set_tag(&port->se, 0x7); -+ geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ALWAYS); - geni_icc_set_bw(&port->se); - ret = uart_resume_port(private_data->drv, uport); - /* diff --git a/drivers/tty/serial/rda-uart.c b/drivers/tty/serial/rda-uart.c index be5c842b5ba9..d824c8318f33 100644 --- a/drivers/tty/serial/rda-uart.c @@ -7605,18 +7082,10 @@ index ad011f1e2f4d..be7bcd75d9f4 100644 static const char *sa1100_type(struct uart_port *port) diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c -index 923d8ab81f2a..ee51a0368a55 100644 +index 6b8d4b4402e9..ee51a0368a55 100644 --- a/drivers/tty/serial/samsung_tty.c +++ b/drivers/tty/serial/samsung_tty.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -63,6 +64,7 @@ +@@ -64,6 +64,7 @@ #define RXSTAT_DUMMY_READ (0x10000000) enum s3c24xx_port_type { @@ -7624,7 +7093,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 TYPE_S3C6400, TYPE_APPLE_S5L, }; -@@ -126,6 +128,8 @@ struct s3c24xx_uart_dma { +@@ -127,6 +128,8 @@ struct s3c24xx_uart_dma { }; struct s3c24xx_uart_port { @@ -7633,7 +7102,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 unsigned char rx_enabled; unsigned char tx_enabled; unsigned int pm_level; -@@ -244,7 +248,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port) +@@ -245,7 +248,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port) unsigned int ucon, ufcon; int count = 10000; @@ -7642,7 +7111,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 while (--count && !s3c24xx_serial_txempty_nofifo(port)) udelay(100); -@@ -258,7 +262,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port) +@@ -259,7 +262,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port) wr_regl(port, S3C2410_UCON, ucon); ourport->rx_enabled = 1; @@ -7651,7 +7120,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static void s3c24xx_serial_rx_disable(struct uart_port *port) -@@ -267,14 +271,14 @@ static void s3c24xx_serial_rx_disable(struct uart_port *port) +@@ -268,14 +271,14 @@ static void s3c24xx_serial_rx_disable(struct uart_port *port) unsigned long flags; unsigned int ucon; @@ -7668,7 +7137,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static void s3c24xx_serial_stop_tx(struct uart_port *port) -@@ -340,7 +344,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args) +@@ -341,7 +344,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args) dma->tx_transfer_addr, dma->tx_size, DMA_TO_DEVICE); @@ -7677,7 +7146,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 uart_xmit_advance(port, count); ourport->tx_in_progress = 0; -@@ -349,7 +353,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args) +@@ -350,7 +353,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args) uart_write_wakeup(port); s3c24xx_serial_start_next_tx(ourport); @@ -7686,7 +7155,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static void enable_tx_dma(struct s3c24xx_uart_port *ourport) -@@ -615,7 +619,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args) +@@ -616,7 +619,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args) received = dma->rx_bytes_requested - state.residue; async_tx_ack(dma->rx_desc); @@ -7695,7 +7164,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 if (received) s3c24xx_uart_copy_rx_to_tty(ourport, t, received); -@@ -627,7 +631,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args) +@@ -628,7 +631,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args) s3c64xx_start_rx_dma(ourport); @@ -7704,7 +7173,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static void s3c64xx_start_rx_dma(struct s3c24xx_uart_port *ourport) -@@ -718,7 +722,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id) +@@ -719,7 +722,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id) utrstat = rd_regl(port, S3C2410_UTRSTAT); rd_regl(port, S3C2410_UFSTAT); @@ -7713,7 +7182,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 if (!(utrstat & S3C2410_UTRSTAT_TIMEOUT)) { s3c64xx_start_rx_dma(ourport); -@@ -747,7 +751,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id) +@@ -748,7 +751,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id) wr_regl(port, S3C2410_UTRSTAT, S3C2410_UTRSTAT_TIMEOUT); finish: @@ -7722,7 +7191,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 return IRQ_HANDLED; } -@@ -845,9 +849,9 @@ static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id) +@@ -846,9 +849,9 @@ static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id) struct s3c24xx_uart_port *ourport = dev_id; struct uart_port *port = &ourport->port; @@ -7734,7 +7203,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 return IRQ_HANDLED; } -@@ -928,11 +932,11 @@ static irqreturn_t s3c24xx_serial_tx_irq(int irq, void *id) +@@ -929,11 +932,11 @@ static irqreturn_t s3c24xx_serial_tx_irq(int irq, void *id) struct s3c24xx_uart_port *ourport = id; struct uart_port *port = &ourport->port; @@ -7748,7 +7217,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 return IRQ_HANDLED; } -@@ -1029,7 +1033,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) +@@ -1030,7 +1033,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) unsigned long flags; unsigned int ucon; @@ -7757,7 +7226,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 ucon = rd_regl(port, S3C2410_UCON); -@@ -1040,7 +1044,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) +@@ -1041,7 +1044,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) wr_regl(port, S3C2410_UCON, ucon); @@ -7766,7 +7235,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p) -@@ -1162,6 +1166,29 @@ static void s3c24xx_serial_release_dma(struct s3c24xx_uart_port *p) +@@ -1163,6 +1166,29 @@ static void s3c24xx_serial_release_dma(struct s3c24xx_uart_port *p) } } @@ -7796,7 +7265,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 static void s3c64xx_serial_shutdown(struct uart_port *port) { struct s3c24xx_uart_port *ourport = to_ourport(port); -@@ -1207,6 +1234,48 @@ static void apple_s5l_serial_shutdown(struct uart_port *port) +@@ -1208,6 +1234,48 @@ static void apple_s5l_serial_shutdown(struct uart_port *port) ourport->tx_in_progress = 0; } @@ -7845,7 +7314,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 static int s3c64xx_serial_startup(struct uart_port *port) { struct s3c24xx_uart_port *ourport = to_ourport(port); -@@ -1234,7 +1303,7 @@ static int s3c64xx_serial_startup(struct uart_port *port) +@@ -1235,7 +1303,7 @@ static int s3c64xx_serial_startup(struct uart_port *port) ourport->rx_enabled = 1; ourport->tx_enabled = 0; @@ -7854,7 +7323,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 ufcon = rd_regl(port, S3C2410_UFCON); ufcon |= S3C2410_UFCON_RESETRX | S5PV210_UFCON_RXTRIG8; -@@ -1244,7 +1313,7 @@ static int s3c64xx_serial_startup(struct uart_port *port) +@@ -1245,7 +1313,7 @@ static int s3c64xx_serial_startup(struct uart_port *port) enable_rx_pio(ourport); @@ -7863,7 +7332,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 /* Enable Rx Interrupt */ s3c24xx_clear_bit(port, S3C64XX_UINTM_RXD, S3C64XX_UINTM); -@@ -1272,7 +1341,7 @@ static int apple_s5l_serial_startup(struct uart_port *port) +@@ -1273,7 +1341,7 @@ static int apple_s5l_serial_startup(struct uart_port *port) ourport->rx_enabled = 1; ourport->tx_enabled = 0; @@ -7872,7 +7341,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 ufcon = rd_regl(port, S3C2410_UFCON); ufcon |= S3C2410_UFCON_RESETRX | S5PV210_UFCON_RXTRIG8; -@@ -1282,7 +1351,7 @@ static int apple_s5l_serial_startup(struct uart_port *port) +@@ -1283,7 +1351,7 @@ static int apple_s5l_serial_startup(struct uart_port *port) enable_rx_pio(ourport); @@ -7881,18 +7350,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 /* Enable Rx Interrupt */ s3c24xx_set_bit(port, APPLE_S5L_UCON_RXTHRESH_ENA, S3C2410_UCON); -@@ -1418,9 +1487,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, - } - quot--; - -- calc_deviation = req_baud - baud; -- if (calc_deviation < 0) -- calc_deviation = -calc_deviation; -+ calc_deviation = abs(req_baud - baud); - - if (calc_deviation < deviation) { - /* -@@ -1559,7 +1626,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, +@@ -1558,7 +1626,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, ulcon |= S3C2410_LCON_PNONE; } @@ -7901,7 +7359,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 dev_dbg(port->dev, "setting ulcon to %08x, brddiv to %d, udivslot %08x\n", -@@ -1617,7 +1684,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, +@@ -1616,7 +1684,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, if ((termios->c_cflag & CREAD) == 0) port->ignore_status_mask |= RXSTAT_DUMMY_READ; @@ -7910,7 +7368,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 } static const char *s3c24xx_serial_type(struct uart_port *port) -@@ -1625,6 +1692,8 @@ static const char *s3c24xx_serial_type(struct uart_port *port) +@@ -1624,6 +1692,8 @@ static const char *s3c24xx_serial_type(struct uart_port *port) const struct s3c24xx_uart_port *ourport = to_ourport(port); switch (ourport->info->type) { @@ -7919,7 +7377,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 case TYPE_S3C6400: return "S3C6400/10"; case TYPE_APPLE_S5L: -@@ -1684,6 +1753,27 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, +@@ -1683,6 +1753,27 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, unsigned char c); #endif @@ -7947,7 +7405,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 static const struct uart_ops s3c64xx_serial_ops = { .pm = s3c24xx_serial_pm, .tx_empty = s3c24xx_serial_tx_empty, -@@ -1746,6 +1836,7 @@ static void s3c24xx_serial_init_port_default(int index) { +@@ -1745,6 +1836,7 @@ static void s3c24xx_serial_init_port_default(int index) { port->iotype = UPIO_MEM; port->uartclk = 0; port->fifosize = 16; @@ -7955,7 +7413,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 port->flags = UPF_BOOT_AUTOCONF; port->line = index; } -@@ -1863,6 +1954,16 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, +@@ -1862,6 +1954,16 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, ourport->tx_irq = ret + 1; } @@ -7972,7 +7430,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 /* * DMA is currently supported only on DT platforms, if DMA properties * are specified. -@@ -1982,6 +2083,9 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) +@@ -1981,6 +2083,9 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) &ourport->drv_data->def_cfg; switch (ourport->info->type) { @@ -7982,19 +7440,7 @@ index 923d8ab81f2a..ee51a0368a55 100644 case TYPE_S3C6400: ourport->port.ops = &s3c64xx_serial_ops; break; -@@ -2170,9 +2274,8 @@ static int s3c24xx_serial_resume_noirq(struct device *dev) - } - - static const struct dev_pm_ops s3c24xx_serial_pm_ops = { -- .suspend = s3c24xx_serial_suspend, -- .resume = s3c24xx_serial_resume, -- .resume_noirq = s3c24xx_serial_resume_noirq, -+ SET_SYSTEM_SLEEP_PM_OPS(s3c24xx_serial_suspend, s3c24xx_serial_resume) -+ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, s3c24xx_serial_resume_noirq) - }; - #define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops) - -@@ -2273,14 +2376,14 @@ s3c24xx_serial_console_write(struct console *co, const char *s, +@@ -2271,14 +2376,14 @@ s3c24xx_serial_console_write(struct console *co, const char *s, if (cons_uart->sysrq) locked = false; else if (oops_in_progress) @@ -8824,7 +8270,7 @@ index dd06461eae8b..e5031658a4a6 100644 static void sc16is7xx_i2c_remove(struct i2c_client *client) diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c -index 1d1f79cf337d..6d4006b41975 100644 +index d4ec943cb8e9..6d4006b41975 100644 --- a/drivers/tty/serial/serial-tegra.c +++ b/drivers/tty/serial/serial-tegra.c @@ -411,7 +411,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud) @@ -8963,35 +8409,8 @@ index 1d1f79cf337d..6d4006b41975 100644 } static const char *tegra_uart_type(struct uart_port *u) -@@ -1581,22 +1581,15 @@ static int tegra_uart_probe(struct platform_device *pdev) - tup->cdata = cdata; - - platform_set_drvdata(pdev, tup); -- resource = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- if (!resource) { -- dev_err(&pdev->dev, "No IO memory resource\n"); -- return -ENODEV; -- } - -- u->mapbase = resource->start; -- u->membase = devm_ioremap_resource(&pdev->dev, resource); -+ u->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &resource); - if (IS_ERR(u->membase)) - return PTR_ERR(u->membase); -+ u->mapbase = resource->start; - - tup->uart_clk = devm_clk_get(&pdev->dev, NULL); -- if (IS_ERR(tup->uart_clk)) { -- dev_err(&pdev->dev, "Couldn't get the clock\n"); -- return PTR_ERR(tup->uart_clk); -- } -+ if (IS_ERR(tup->uart_clk)) -+ return dev_err_probe(&pdev->dev, PTR_ERR(tup->uart_clk), "Couldn't get the clock"); - - tup->rst = devm_reset_control_get_exclusive(&pdev->dev, "serial"); - if (IS_ERR(tup->rst)) { diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c -index e45d453d1ab1..ca43c238dd13 100644 +index 95a5bef81959..e38ebe899cf0 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -79,7 +79,7 @@ static inline void uart_port_deref(struct uart_port *uport) @@ -9023,24 +8442,6 @@ index e45d453d1ab1..ca43c238dd13 100644 struct uart_port *port = state->uart_port; struct serial_port_device *port_dev; int err; -@@ -147,7 +146,7 @@ static void __uart_start(struct tty_struct *tty) - - /* Increment the runtime PM usage count for the active check below */ - err = pm_runtime_get(&port_dev->dev); -- if (err < 0) { -+ if (err < 0 && err != -EINPROGRESS) { - pm_runtime_put_noidle(&port_dev->dev); - return; - } -@@ -157,7 +156,7 @@ static void __uart_start(struct tty_struct *tty) - * enabled, serial_port_runtime_resume() calls start_tx() again - * after enabling the device. - */ -- if (pm_runtime_active(&port_dev->dev)) -+ if (!pm_runtime_enabled(port->dev) || pm_runtime_active(port->dev)) - port->ops->start_tx(port); - pm_runtime_mark_last_busy(&port_dev->dev); - pm_runtime_put_autosuspend(&port_dev->dev); @@ -170,7 +169,7 @@ static void uart_start(struct tty_struct *tty) unsigned long flags; @@ -9197,58 +8598,19 @@ index e45d453d1ab1..ca43c238dd13 100644 uart_port_deref(uport); icount->cts = cnow.cts; -@@ -1376,28 +1370,20 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 - return; - } - -- rs485->flags &= supported_flags; -- - /* Pick sane settings if the user hasn't */ -- if (!(rs485->flags & SER_RS485_RTS_ON_SEND) == -+ if ((supported_flags & (SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND)) && -+ !(rs485->flags & SER_RS485_RTS_ON_SEND) == - !(rs485->flags & SER_RS485_RTS_AFTER_SEND)) { -- if (supported_flags & SER_RS485_RTS_ON_SEND) { -- rs485->flags |= SER_RS485_RTS_ON_SEND; -- rs485->flags &= ~SER_RS485_RTS_AFTER_SEND; -- -- dev_warn_ratelimited(port->dev, -- "%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n", -- port->name, port->line); -- } else { -- rs485->flags |= SER_RS485_RTS_AFTER_SEND; -- rs485->flags &= ~SER_RS485_RTS_ON_SEND; -- -- dev_warn_ratelimited(port->dev, -- "%s (%d): invalid RTS setting, using RTS_AFTER_SEND instead\n", -- port->name, port->line); -- } -+ dev_warn_ratelimited(port->dev, -+ "%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n", -+ port->name, port->line); -+ rs485->flags |= SER_RS485_RTS_ON_SEND; -+ rs485->flags &= ~SER_RS485_RTS_AFTER_SEND; -+ supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND; - } - -+ rs485->flags &= supported_flags; -+ - uart_sanitize_serial_rs485_delays(port, rs485); - - /* Return clean padding area to userspace */ -@@ -1427,9 +1413,9 @@ static int uart_rs485_config(struct uart_port *port) - uart_sanitize_serial_rs485(port, rs485); +@@ -1438,9 +1432,9 @@ static int uart_rs485_config(struct uart_port *port) uart_set_rs485_termination(port, rs485); + uart_set_rs485_rx_during_tx(port, rs485); - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); ret = port->rs485_config(port, NULL, rs485); - spin_unlock_irqrestore(&port->lock, flags); + uart_port_unlock_irqrestore(port, flags); - if (ret) + if (ret) { memset(rs485, 0, sizeof(*rs485)); - -@@ -1442,9 +1428,9 @@ static int uart_get_rs485_config(struct uart_port *port, + /* unset GPIOs */ +@@ -1457,9 +1451,9 @@ static int uart_get_rs485_config(struct uart_port *port, unsigned long flags; struct serial_rs485 aux; @@ -9260,34 +8622,25 @@ index e45d453d1ab1..ca43c238dd13 100644 if (copy_to_user(rs485, &aux, sizeof(aux))) return -EFAULT; -@@ -1459,7 +1445,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, - int ret; - unsigned long flags; - -- if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) -+ if (!port->rs485_config) - return -ENOTTY; - - if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user))) -@@ -1471,7 +1457,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, - uart_sanitize_serial_rs485(port, &rs485); +@@ -1487,7 +1481,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, uart_set_rs485_termination(port, &rs485); + uart_set_rs485_rx_during_tx(port, &rs485); - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); ret = port->rs485_config(port, &tty->termios, &rs485); if (!ret) { port->rs485 = rs485; -@@ -1480,7 +1466,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, +@@ -1496,7 +1490,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, if (!(rs485.flags & SER_RS485_ENABLED)) port->ops->set_mctrl(port, port->mctrl); } - spin_unlock_irqrestore(&port->lock, flags); + uart_port_unlock_irqrestore(port, flags); - if (ret) - return ret; - -@@ -1499,9 +1485,9 @@ static int uart_get_iso7816_config(struct uart_port *port, + if (ret) { + /* restore old GPIO settings */ + gpiod_set_value_cansleep(port->rs485_term_gpio, +@@ -1521,9 +1515,9 @@ static int uart_get_iso7816_config(struct uart_port *port, if (!port->iso7816_config) return -ENOTTY; @@ -9299,7 +8652,7 @@ index e45d453d1ab1..ca43c238dd13 100644 if (copy_to_user(iso7816, &aux, sizeof(aux))) return -EFAULT; -@@ -1530,9 +1516,9 @@ static int uart_set_iso7816_config(struct uart_port *port, +@@ -1552,9 +1546,9 @@ static int uart_set_iso7816_config(struct uart_port *port, if (iso7816.reserved[i]) return -EINVAL; @@ -9311,7 +8664,7 @@ index e45d453d1ab1..ca43c238dd13 100644 if (ret) return ret; -@@ -1749,9 +1735,9 @@ static void uart_tty_port_shutdown(struct tty_port *port) +@@ -1771,9 +1765,9 @@ static void uart_tty_port_shutdown(struct tty_port *port) if (WARN(!uport, "detached port still initialized!\n")) return; @@ -9323,7 +8676,7 @@ index e45d453d1ab1..ca43c238dd13 100644 uart_port_shutdown(port); -@@ -1765,10 +1751,10 @@ static void uart_tty_port_shutdown(struct tty_port *port) +@@ -1787,10 +1781,10 @@ static void uart_tty_port_shutdown(struct tty_port *port) /* * Free the transmit buffer. */ @@ -9336,7 +8689,7 @@ index e45d453d1ab1..ca43c238dd13 100644 free_page((unsigned long)buf); -@@ -1911,10 +1897,10 @@ static bool uart_carrier_raised(struct tty_port *port) +@@ -1933,10 +1927,10 @@ static bool uart_carrier_raised(struct tty_port *port) */ if (WARN_ON(!uport)) return true; @@ -9349,7 +8702,7 @@ index e45d453d1ab1..ca43c238dd13 100644 uart_port_deref(uport); return mctrl & TIOCM_CAR; -@@ -2031,9 +2017,9 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i) +@@ -2053,9 +2047,9 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i) pm_state = state->pm_state; if (pm_state != UART_PM_STATE_ON) uart_change_pm(state, UART_PM_STATE_ON); @@ -9361,7 +8714,7 @@ index e45d453d1ab1..ca43c238dd13 100644 if (pm_state != UART_PM_STATE_ON) uart_change_pm(state, pm_state); -@@ -2372,9 +2358,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2394,9 +2388,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) */ if (!console_suspend_enabled && uart_console(uport)) { if (uport->ops->start_rx) { @@ -9373,7 +8726,7 @@ index e45d453d1ab1..ca43c238dd13 100644 } goto unlock; } -@@ -2389,7 +2375,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2411,7 +2405,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) tty_port_set_suspended(port, true); tty_port_set_initialized(port, false); @@ -9382,7 +8735,7 @@ index e45d453d1ab1..ca43c238dd13 100644 ops->stop_tx(uport); if (!(uport->rs485.flags & SER_RS485_ENABLED)) ops->set_mctrl(uport, 0); -@@ -2397,7 +2383,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2419,7 +2413,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) mctrl = uport->mctrl; uport->mctrl = 0; ops->stop_rx(uport); @@ -9391,7 +8744,7 @@ index e45d453d1ab1..ca43c238dd13 100644 /* * Wait for the transmitter to empty. -@@ -2469,9 +2455,9 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2491,9 +2485,9 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) uart_change_pm(state, UART_PM_STATE_ON); uport->ops->set_termios(uport, &termios, NULL); if (!console_suspend_enabled && uport->ops->start_rx) { @@ -9403,7 +8756,7 @@ index e45d453d1ab1..ca43c238dd13 100644 } if (console_suspend_enabled) console_start(uport->cons); -@@ -2482,10 +2468,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2504,10 +2498,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) int ret; uart_change_pm(state, UART_PM_STATE_ON); @@ -9416,7 +8769,7 @@ index e45d453d1ab1..ca43c238dd13 100644 if (console_suspend_enabled || !uart_console(uport)) { /* Protected by port mutex for now */ struct tty_struct *tty = port->tty; -@@ -2495,11 +2481,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2517,11 +2511,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) if (tty) uart_change_line_settings(tty, state, NULL); uart_rs485_config(uport); @@ -9430,7 +8783,7 @@ index e45d453d1ab1..ca43c238dd13 100644 tty_port_set_initialized(port, true); } else { /* -@@ -2602,11 +2588,11 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, +@@ -2624,11 +2618,11 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, * keep the DTR setting that is set in uart_set_options() * We probably don't need a spinlock around this, but */ @@ -9444,7 +8797,7 @@ index e45d453d1ab1..ca43c238dd13 100644 uart_rs485_config(port); -@@ -3499,7 +3485,7 @@ EXPORT_SYMBOL_GPL(uart_handle_cts_change); +@@ -3521,7 +3515,7 @@ EXPORT_SYMBOL_GPL(uart_handle_cts_change); * @flag: flag for the character (see TTY_NORMAL and friends) */ void uart_insert_char(struct uart_port *port, unsigned int status, @@ -9453,78 +8806,6 @@ index e45d453d1ab1..ca43c238dd13 100644 { struct tty_port *tport = &port->state->port; -@@ -3518,7 +3504,7 @@ void uart_insert_char(struct uart_port *port, unsigned int status, - EXPORT_SYMBOL_GPL(uart_insert_char); - - #ifdef CONFIG_MAGIC_SYSRQ_SERIAL --static const char sysrq_toggle_seq[] = CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE; -+static const u8 sysrq_toggle_seq[] = CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE; - - static void uart_sysrq_on(struct work_struct *w) - { -@@ -3541,7 +3527,7 @@ static DECLARE_WORK(sysrq_enable_work, uart_sysrq_on); - * Returns: %false if @ch is out of enabling sequence and should be - * handled some other way, %true if @ch was consumed. - */ --bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) -+bool uart_try_toggle_sysrq(struct uart_port *port, u8 ch) - { - int sysrq_toggle_seq_len = strlen(sysrq_toggle_seq); - -@@ -3578,13 +3564,9 @@ int uart_get_rs485_mode(struct uart_port *port) - { - struct serial_rs485 *rs485conf = &port->rs485; - struct device *dev = port->dev; -- enum gpiod_flags dflags; -- struct gpio_desc *desc; - u32 rs485_delay[2]; - int ret; -- -- if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) -- return 0; -+ int rx_during_tx_gpio_flag; - - ret = device_property_read_u32_array(dev, "rs485-rts-delay", - rs485_delay, 2); -@@ -3623,21 +3605,26 @@ int uart_get_rs485_mode(struct uart_port *port) - * bus participants enable it, no communication is possible at all. - * Works fine for short cables and users may enable for longer cables. - */ -- desc = devm_gpiod_get_optional(dev, "rs485-term", GPIOD_OUT_LOW); -- if (IS_ERR(desc)) -- return dev_err_probe(dev, PTR_ERR(desc), "Cannot get rs485-term-gpios\n"); -- port->rs485_term_gpio = desc; -+ port->rs485_term_gpio = devm_gpiod_get_optional(dev, "rs485-term", -+ GPIOD_OUT_LOW); -+ if (IS_ERR(port->rs485_term_gpio)) { -+ ret = PTR_ERR(port->rs485_term_gpio); -+ port->rs485_term_gpio = NULL; -+ return dev_err_probe(dev, ret, "Cannot get rs485-term-gpios\n"); -+ } - if (port->rs485_term_gpio) - port->rs485_supported.flags |= SER_RS485_TERMINATE_BUS; - -- dflags = (rs485conf->flags & SER_RS485_RX_DURING_TX) ? -- GPIOD_OUT_HIGH : GPIOD_OUT_LOW; -- desc = devm_gpiod_get_optional(dev, "rs485-rx-during-tx", dflags); -- if (IS_ERR(desc)) -- return dev_err_probe(dev, PTR_ERR(desc), "Cannot get rs485-rx-during-tx-gpios\n"); -- port->rs485_rx_during_tx_gpio = desc; -- if (port->rs485_rx_during_tx_gpio) -- port->rs485_supported.flags |= SER_RS485_RX_DURING_TX; -+ rx_during_tx_gpio_flag = (rs485conf->flags & SER_RS485_RX_DURING_TX) ? -+ GPIOD_OUT_HIGH : GPIOD_OUT_LOW; -+ port->rs485_rx_during_tx_gpio = devm_gpiod_get_optional(dev, -+ "rs485-rx-during-tx", -+ rx_during_tx_gpio_flag); -+ if (IS_ERR(port->rs485_rx_during_tx_gpio)) { -+ ret = PTR_ERR(port->rs485_rx_during_tx_gpio); -+ port->rs485_rx_during_tx_gpio = NULL; -+ return dev_err_probe(dev, ret, "Cannot get rs485-rx-during-tx-gpios\n"); -+ } - - return 0; - } diff --git a/drivers/tty/serial/serial_mctrl_gpio.c b/drivers/tty/serial/serial_mctrl_gpio.c index 7d5aaa8d422b..e51ca593ab86 100644 --- a/drivers/tty/serial/serial_mctrl_gpio.c @@ -9929,7 +9210,7 @@ index a560b729fa3b..84ab434c94ba 100644 static int serial_console_setup(struct console *co, char *options) diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c -index eea6f123e95b..b296e57a9dee 100644 +index d195c5de52e7..b296e57a9dee 100644 --- a/drivers/tty/serial/sifive.c +++ b/drivers/tty/serial/sifive.c @@ -521,11 +521,11 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id) @@ -9994,57 +9275,8 @@ index eea6f123e95b..b296e57a9dee 100644 local_irq_restore(flags); } -@@ -917,12 +917,9 @@ static int sifive_serial_probe(struct platform_device *pdev) - if (irq < 0) - return -EPROBE_DEFER; - -- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- base = devm_ioremap_resource(&pdev->dev, mem); -- if (IS_ERR(base)) { -- dev_err(&pdev->dev, "could not acquire device memory\n"); -+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); -+ if (IS_ERR(base)) - return PTR_ERR(base); -- } - - clk = devm_clk_get_enabled(&pdev->dev, NULL); - if (IS_ERR(clk)) { -@@ -1022,6 +1019,23 @@ static int sifive_serial_remove(struct platform_device *dev) - return 0; - } - -+static int sifive_serial_suspend(struct device *dev) -+{ -+ struct sifive_serial_port *ssp = dev_get_drvdata(dev); -+ -+ return uart_suspend_port(&sifive_serial_uart_driver, &ssp->port); -+} -+ -+static int sifive_serial_resume(struct device *dev) -+{ -+ struct sifive_serial_port *ssp = dev_get_drvdata(dev); -+ -+ return uart_resume_port(&sifive_serial_uart_driver, &ssp->port); -+} -+ -+DEFINE_SIMPLE_DEV_PM_OPS(sifive_uart_pm_ops, sifive_serial_suspend, -+ sifive_serial_resume); -+ - static const struct of_device_id sifive_serial_of_match[] = { - { .compatible = "sifive,fu540-c000-uart0" }, - { .compatible = "sifive,uart0" }, -@@ -1034,7 +1048,8 @@ static struct platform_driver sifive_serial_platform_driver = { - .remove = sifive_serial_remove, - .driver = { - .name = SIFIVE_SERIAL_NAME, -- .of_match_table = of_match_ptr(sifive_serial_of_match), -+ .pm = pm_sleep_ptr(&sifive_uart_pm_ops), -+ .of_match_table = sifive_serial_of_match, - }, - }; - diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c -index e427dd2c7ed7..f257525f9299 100644 +index f328fa57231f..f257525f9299 100644 --- a/drivers/tty/serial/sprd_serial.c +++ b/drivers/tty/serial/sprd_serial.c @@ -247,7 +247,7 @@ static void sprd_complete_tx_dma(void *data) @@ -10169,18 +9401,8 @@ index e427dd2c7ed7..f257525f9299 100644 } static int sprd_console_setup(struct console *co, char *options) -@@ -1180,8 +1180,7 @@ static int sprd_probe(struct platform_device *pdev) - if (ret) - return ret; - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- up->membase = devm_ioremap_resource(&pdev->dev, res); -+ up->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(up->membase)) - return PTR_ERR(up->membase); - diff --git a/drivers/tty/serial/st-asc.c b/drivers/tty/serial/st-asc.c -index 9b32465405e7..a821f5d76a26 100644 +index 941695e0c79f..a821f5d76a26 100644 --- a/drivers/tty/serial/st-asc.c +++ b/drivers/tty/serial/st-asc.c @@ -319,7 +319,7 @@ static irqreturn_t asc_interrupt(int irq, void *ptr) @@ -10232,17 +9454,7 @@ index 9b32465405e7..a821f5d76a26 100644 } static const char *asc_type(struct uart_port *port) -@@ -691,8 +691,7 @@ static int asc_init_port(struct asc_port *ascport, - port->irq = platform_get_irq(pdev, 0); - port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_ST_ASC_CONSOLE); - -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- port->membase = devm_ioremap_resource(&pdev->dev, res); -+ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); - if (IS_ERR(port->membase)) - return PTR_ERR(port->membase); - port->mapbase = res->start; -@@ -704,7 +703,9 @@ static int asc_init_port(struct asc_port *ascport, +@@ -703,7 +703,9 @@ static int asc_init_port(struct asc_port *ascport, if (WARN_ON(IS_ERR(ascport->clk))) return -EINVAL; /* ensure that clk rate is correct by enabling the clk */ @@ -10253,7 +9465,7 @@ index 9b32465405e7..a821f5d76a26 100644 ascport->port.uartclk = clk_get_rate(ascport->clk); WARN_ON(ascport->port.uartclk == 0); clk_disable_unprepare(ascport->clk); -@@ -754,7 +755,7 @@ static struct asc_port *asc_of_get_asc_port(struct platform_device *pdev) +@@ -753,7 +755,7 @@ static struct asc_port *asc_of_get_asc_port(struct platform_device *pdev) asc_ports[id].hw_flow_control = of_property_read_bool(np, "uart-has-rtscts"); @@ -10262,7 +9474,7 @@ index 9b32465405e7..a821f5d76a26 100644 asc_ports[id].port.line = id; asc_ports[id].rts = NULL; -@@ -848,9 +849,9 @@ static void asc_console_write(struct console *co, const char *s, unsigned count) +@@ -847,9 +849,9 @@ static void asc_console_write(struct console *co, const char *s, unsigned count) if (port->sysrq) locked = 0; /* asc_interrupt has already claimed the lock */ else if (oops_in_progress) @@ -10274,7 +9486,7 @@ index 9b32465405e7..a821f5d76a26 100644 /* * Disable interrupts so we don't get the IRQ line bouncing -@@ -868,7 +869,7 @@ static void asc_console_write(struct console *co, const char *s, unsigned count) +@@ -867,7 +869,7 @@ static void asc_console_write(struct console *co, const char *s, unsigned count) asc_out(port, ASC_INTEN, intenable); if (locked) @@ -10284,215 +9496,30 @@ index 9b32465405e7..a821f5d76a26 100644 static int asc_console_setup(struct console *co, char *options) diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c -index be47cd343cf6..8c51ec9433d6 100644 +index e5f933beb6c0..f0901bedcc28 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c -@@ -289,15 +289,57 @@ static int stm32_usart_init_rs485(struct uart_port *port, - return uart_get_rs485_mode(port); - } - --static bool stm32_usart_rx_dma_enabled(struct uart_port *port) -+static bool stm32_usart_rx_dma_started(struct stm32_port *stm32_port) - { -- struct stm32_port *stm32_port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; -+ return stm32_port->rx_ch ? stm32_port->rx_dma_busy : false; -+} -+ -+static void stm32_usart_rx_dma_terminate(struct stm32_port *stm32_port) -+{ -+ dmaengine_terminate_async(stm32_port->rx_ch); -+ stm32_port->rx_dma_busy = false; -+} -+ -+static int stm32_usart_dma_pause_resume(struct stm32_port *stm32_port, -+ struct dma_chan *chan, -+ enum dma_status expected_status, -+ int dmaengine_pause_or_resume(struct dma_chan *), -+ bool stm32_usart_xx_dma_started(struct stm32_port *), -+ void stm32_usart_xx_dma_terminate(struct stm32_port *)) -+{ -+ struct uart_port *port = &stm32_port->port; -+ enum dma_status dma_status; -+ int ret; -+ -+ if (!stm32_usart_xx_dma_started(stm32_port)) -+ return -EPERM; -+ -+ dma_status = dmaengine_tx_status(chan, chan->cookie, NULL); -+ if (dma_status != expected_status) -+ return -EAGAIN; - -- if (!stm32_port->rx_ch) -- return false; -+ ret = dmaengine_pause_or_resume(chan); -+ if (ret) { -+ dev_err(port->dev, "DMA failed with error code: %d\n", ret); -+ stm32_usart_xx_dma_terminate(stm32_port); -+ } -+ return ret; -+} - -- return !!(readl_relaxed(port->membase + ofs->cr3) & USART_CR3_DMAR); -+static int stm32_usart_rx_dma_pause(struct stm32_port *stm32_port) -+{ -+ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->rx_ch, -+ DMA_IN_PROGRESS, dmaengine_pause, -+ stm32_usart_rx_dma_started, -+ stm32_usart_rx_dma_terminate); -+} -+ -+static int stm32_usart_rx_dma_resume(struct stm32_port *stm32_port) -+{ -+ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->rx_ch, -+ DMA_PAUSED, dmaengine_resume, -+ stm32_usart_rx_dma_started, -+ stm32_usart_rx_dma_terminate); - } - - /* Return true when data is pending (in pio mode), and false when no data is pending. */ -@@ -310,7 +352,7 @@ static bool stm32_usart_pending_rx_pio(struct uart_port *port, u32 *sr) - /* Get pending characters in RDR or FIFO */ - if (*sr & USART_SR_RXNE) { - /* Get all pending characters from the RDR or the FIFO when using interrupts */ -- if (!stm32_usart_rx_dma_enabled(port)) -+ if (!stm32_usart_rx_dma_started(stm32_port)) - return true; +@@ -251,9 +251,7 @@ static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *ter + writel_relaxed(cr3, port->membase + ofs->cr3); + writel_relaxed(cr1, port->membase + ofs->cr1); - /* Handle only RX data errors when using DMA */ -@@ -455,11 +497,12 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force - u32 sr; - unsigned int size = 0; - -- if (stm32_usart_rx_dma_enabled(port) || force_dma_flush) { -+ if (stm32_usart_rx_dma_started(stm32_port) || force_dma_flush) { - rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, - stm32_port->rx_ch->cookie, - &stm32_port->rx_dma_state); -- if (rx_dma_status == DMA_IN_PROGRESS) { -+ if (rx_dma_status == DMA_IN_PROGRESS || -+ rx_dma_status == DMA_PAUSED) { - /* Empty DMA buffer */ - size = stm32_usart_receive_chars_dma(port); - sr = readl_relaxed(port->membase + ofs->isr); -@@ -475,8 +518,7 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force - } - } else { - /* Disable RX DMA */ -- dmaengine_terminate_async(stm32_port->rx_ch); -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); -+ stm32_usart_rx_dma_terminate(stm32_port); - /* Fall back to interrupt mode */ - dev_dbg(port->dev, "DMA error, fallback to irq mode\n"); - size = stm32_usart_receive_chars_pio(port); -@@ -488,6 +530,76 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force - return size; - } - -+static void stm32_usart_rx_dma_complete(void *arg) -+{ -+ struct uart_port *port = arg; -+ struct tty_port *tport = &port->state->port; -+ unsigned int size; -+ unsigned long flags; -+ -+ uart_port_lock_irqsave(port, &flags); -+ size = stm32_usart_receive_chars(port, false); -+ uart_unlock_and_check_sysrq_irqrestore(port, flags); -+ if (size) -+ tty_flip_buffer_push(tport); -+} -+ -+static int stm32_usart_rx_dma_start_or_resume(struct uart_port *port) -+{ -+ struct stm32_port *stm32_port = to_stm32_port(port); -+ struct dma_async_tx_descriptor *desc; -+ enum dma_status rx_dma_status; -+ int ret; -+ -+ if (stm32_port->throttled) -+ return 0; -+ -+ if (stm32_port->rx_dma_busy) { -+ rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, -+ stm32_port->rx_ch->cookie, -+ NULL); -+ if (rx_dma_status == DMA_IN_PROGRESS) -+ return 0; -+ -+ if (rx_dma_status == DMA_PAUSED && !stm32_usart_rx_dma_resume(stm32_port)) -+ return 0; -+ -+ dev_err(port->dev, "DMA failed : status error.\n"); -+ stm32_usart_rx_dma_terminate(stm32_port); -+ } -+ -+ stm32_port->rx_dma_busy = true; -+ -+ stm32_port->last_res = RX_BUF_L; -+ /* Prepare a DMA cyclic transaction */ -+ desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch, -+ stm32_port->rx_dma_buf, -+ RX_BUF_L, RX_BUF_P, -+ DMA_DEV_TO_MEM, -+ DMA_PREP_INTERRUPT); -+ if (!desc) { -+ dev_err(port->dev, "rx dma prep cyclic failed\n"); -+ stm32_port->rx_dma_busy = false; -+ return -ENODEV; -+ } -+ -+ desc->callback = stm32_usart_rx_dma_complete; -+ desc->callback_param = port; -+ -+ /* Push current DMA transaction in the pending queue */ -+ ret = dma_submit_error(dmaengine_submit(desc)); -+ if (ret) { -+ dmaengine_terminate_sync(stm32_port->rx_ch); -+ stm32_port->rx_dma_busy = false; -+ return ret; -+ } -+ -+ /* Issue pending DMA requests */ -+ dma_async_issue_pending(stm32_port->rx_ch); -+ -+ return 0; -+} -+ - static void stm32_usart_tx_dma_terminate(struct stm32_port *stm32_port) - { - dmaengine_terminate_async(stm32_port->tx_ch); -@@ -506,27 +618,34 @@ static bool stm32_usart_tx_dma_started(struct stm32_port *stm32_port) - return stm32_port->tx_dma_busy; - } - --static bool stm32_usart_tx_dma_enabled(struct stm32_port *stm32_port) -+static int stm32_usart_tx_dma_pause(struct stm32_port *stm32_port) - { -- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; -+ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->tx_ch, -+ DMA_IN_PROGRESS, dmaengine_pause, -+ stm32_usart_tx_dma_started, -+ stm32_usart_tx_dma_terminate); -+} - -- return !!(readl_relaxed(stm32_port->port.membase + ofs->cr3) & USART_CR3_DMAT); -+static int stm32_usart_tx_dma_resume(struct stm32_port *stm32_port) -+{ -+ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->tx_ch, -+ DMA_PAUSED, dmaengine_resume, -+ stm32_usart_tx_dma_started, -+ stm32_usart_tx_dma_terminate); - } - - static void stm32_usart_tx_dma_complete(void *arg) - { - struct uart_port *port = arg; - struct stm32_port *stm32port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32port->info->ofs; +- if (!port->rs485_rx_during_tx_gpio) +- rs485conf->flags |= SER_RS485_RX_DURING_TX; +- ++ rs485conf->flags |= SER_RS485_RX_DURING_TX; + } else { + stm32_usart_clr_bits(port, ofs->cr3, + USART_CR3_DEM | USART_CR3_DEP); +@@ -535,7 +533,7 @@ static void stm32_usart_rx_dma_complete(void *arg) + unsigned int size; unsigned long flags; -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); +- spin_lock_irqsave(&port->lock, flags); ++ uart_port_lock_irqsave(port, &flags); + size = stm32_usart_receive_chars(port, false); + uart_unlock_and_check_sysrq_irqrestore(port, flags); + if (size) +@@ -641,9 +639,9 @@ static void stm32_usart_tx_dma_complete(void *arg) stm32_usart_tx_dma_terminate(stm32port); /* Let's see if we have pending data to send */ @@ -10504,116 +9531,16 @@ index be47cd343cf6..8c51ec9433d6 100644 } static void stm32_usart_tx_interrupt_enable(struct uart_port *port) -@@ -552,20 +671,6 @@ static void stm32_usart_tc_interrupt_enable(struct uart_port *port) - stm32_usart_set_bits(port, ofs->cr1, USART_CR1_TCIE); - } - --static void stm32_usart_rx_dma_complete(void *arg) --{ -- struct uart_port *port = arg; -- struct tty_port *tport = &port->state->port; -- unsigned int size; -- unsigned long flags; -- -- spin_lock_irqsave(&port->lock, flags); -- size = stm32_usart_receive_chars(port, false); -- uart_unlock_and_check_sysrq_irqrestore(port, flags); -- if (size) -- tty_flip_buffer_push(tport); --} -- - static void stm32_usart_tx_interrupt_disable(struct uart_port *port) - { - struct stm32_port *stm32_port = to_stm32_port(port); -@@ -591,9 +696,6 @@ static void stm32_usart_transmit_chars_pio(struct uart_port *port) - const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - struct circ_buf *xmit = &port->state->xmit; - -- if (stm32_usart_tx_dma_enabled(stm32_port)) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -- - while (!uart_circ_empty(xmit)) { - /* Check that TDR is empty before filling FIFO */ - if (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE)) -@@ -612,14 +714,15 @@ static void stm32_usart_transmit_chars_pio(struct uart_port *port) - static void stm32_usart_transmit_chars_dma(struct uart_port *port) - { - struct stm32_port *stm32port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32port->info->ofs; - struct circ_buf *xmit = &port->state->xmit; - struct dma_async_tx_descriptor *desc = NULL; - unsigned int count; -+ int ret; - - if (stm32_usart_tx_dma_started(stm32port)) { -- if (!stm32_usart_tx_dma_enabled(stm32port)) -- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); -+ ret = stm32_usart_tx_dma_resume(stm32port); -+ if (ret < 0 && ret != -EAGAIN) -+ goto fallback_err; - return; - } - -@@ -664,8 +767,10 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) - desc->callback_param = port; - - /* Push current DMA TX transaction in the pending queue */ -- if (dma_submit_error(dmaengine_submit(desc))) { -- /* dma no yet started, safe to free resources */ -+ /* DMA no yet started, safe to free resources */ -+ ret = dma_submit_error(dmaengine_submit(desc)); -+ if (ret) { -+ dev_err(port->dev, "DMA failed with error code: %d\n", ret); - stm32_usart_tx_dma_terminate(stm32port); - goto fallback_err; - } -@@ -673,8 +778,6 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) - /* Issue pending DMA TX requests */ - dma_async_issue_pending(stm32port->tx_ch); - -- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); -- - uart_xmit_advance(port, count); - - return; -@@ -700,9 +803,8 @@ static void stm32_usart_transmit_chars(struct uart_port *port) - } - - if (port->x_char) { -- if (stm32_usart_tx_dma_started(stm32_port) && -- stm32_usart_tx_dma_enabled(stm32_port)) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -+ /* dma terminate may have been called in case of dma pause failure */ -+ stm32_usart_tx_dma_pause(stm32_port); - - /* Check that TDR is empty before filling FIFO */ - ret = -@@ -716,8 +818,9 @@ static void stm32_usart_transmit_chars(struct uart_port *port) - writel_relaxed(port->x_char, port->membase + ofs->tdr); - port->x_char = 0; - port->icount.tx++; -- if (stm32_usart_tx_dma_started(stm32_port)) -- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); -+ -+ /* dma terminate may have been called in case of dma resume failure */ -+ stm32_usart_tx_dma_resume(stm32_port); - return; - } - -@@ -784,9 +887,9 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) - * line has been masked by HW and rx data are stacking in FIFO. - */ +@@ -887,7 +885,7 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) if (!stm32_port->throttled) { -- if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_enabled(port)) || -- ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_enabled(port))) { + if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) || + ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) { - spin_lock(&port->lock); -+ if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) || -+ ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) { + uart_port_lock(port); size = stm32_usart_receive_chars(port, false); uart_unlock_and_check_sysrq(port); if (size) -@@ -795,14 +898,14 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) +@@ -896,14 +894,14 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) } if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) { @@ -10625,43 +9552,13 @@ index be47cd343cf6..8c51ec9433d6 100644 } /* Receiver timeout irq for DMA RX */ -- if (stm32_usart_rx_dma_enabled(port) && !stm32_port->throttled) { + if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) { - spin_lock(&port->lock); -+ if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) { + uart_port_lock(port); size = stm32_usart_receive_chars(port, false); uart_unlock_and_check_sysrq(port); if (size) -@@ -850,11 +953,11 @@ static void stm32_usart_disable_ms(struct uart_port *port) - static void stm32_usart_stop_tx(struct uart_port *port) - { - struct stm32_port *stm32_port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - - stm32_usart_tx_interrupt_disable(port); -- if (stm32_usart_tx_dma_started(stm32_port) && stm32_usart_tx_dma_enabled(stm32_port)) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -+ -+ /* dma terminate may have been called in case of dma pause failure */ -+ stm32_usart_tx_dma_pause(stm32_port); - - stm32_usart_rs485_rts_disable(port); - } -@@ -878,12 +981,9 @@ static void stm32_usart_start_tx(struct uart_port *port) - static void stm32_usart_flush_buffer(struct uart_port *port) - { - struct stm32_port *stm32_port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - -- if (stm32_port->tx_ch) { -+ if (stm32_port->tx_ch) - stm32_usart_tx_dma_terminate(stm32_port); -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -- } - } - - /* Throttle the remote when input buffer is about to overflow. */ -@@ -893,21 +993,20 @@ static void stm32_usart_throttle(struct uart_port *port) +@@ -991,7 +989,7 @@ static void stm32_usart_throttle(struct uart_port *port) const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; unsigned long flags; @@ -10669,16 +9566,8 @@ index be47cd343cf6..8c51ec9433d6 100644 + uart_port_lock_irqsave(port, &flags); /* -- * Disable DMA request line if enabled, so the RX data gets queued into the FIFO. -+ * Pause DMA transfer, so the RX data gets queued into the FIFO. - * Hardware flow control is triggered when RX FIFO is full. - */ -- if (stm32_usart_rx_dma_enabled(port)) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); -+ stm32_usart_rx_dma_pause(stm32_port); - - stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq); - if (stm32_port->cr3_irq) + * Pause DMA transfer, so the RX data gets queued into the FIFO. +@@ -1004,7 +1002,7 @@ static void stm32_usart_throttle(struct uart_port *port) stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq); stm32_port->throttled = true; @@ -10687,7 +9576,7 @@ index be47cd343cf6..8c51ec9433d6 100644 } /* Unthrottle the remote, the input buffer can now accept data. */ -@@ -917,20 +1016,21 @@ static void stm32_usart_unthrottle(struct uart_port *port) +@@ -1014,7 +1012,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; unsigned long flags; @@ -10696,122 +9585,16 @@ index be47cd343cf6..8c51ec9433d6 100644 stm32_usart_set_bits(port, ofs->cr1, stm32_port->cr1_irq); if (stm32_port->cr3_irq) stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq); - -+ stm32_port->throttled = false; -+ - /* -- * Switch back to DMA mode (re-enable DMA request line). -+ * Switch back to DMA mode (resume DMA). - * Hardware flow control is stopped when FIFO is not full any more. - */ +@@ -1028,7 +1026,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) if (stm32_port->rx_ch) -- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR); -+ stm32_usart_rx_dma_start_or_resume(port); + stm32_usart_rx_dma_start_or_resume(port); -- stm32_port->throttled = false; - spin_unlock_irqrestore(&port->lock, flags); + uart_port_unlock_irqrestore(port, flags); } /* Receive stop */ -@@ -940,8 +1040,7 @@ static void stm32_usart_stop_rx(struct uart_port *port) - const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - - /* Disable DMA request line. */ -- if (stm32_port->rx_ch) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); -+ stm32_usart_rx_dma_pause(stm32_port); - - stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq); - if (stm32_port->cr3_irq) -@@ -953,48 +1052,6 @@ static void stm32_usart_break_ctl(struct uart_port *port, int break_state) - { - } - --static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port) --{ -- struct stm32_port *stm32_port = to_stm32_port(port); -- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; -- struct dma_async_tx_descriptor *desc; -- int ret; -- -- stm32_port->last_res = RX_BUF_L; -- /* Prepare a DMA cyclic transaction */ -- desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch, -- stm32_port->rx_dma_buf, -- RX_BUF_L, RX_BUF_P, -- DMA_DEV_TO_MEM, -- DMA_PREP_INTERRUPT); -- if (!desc) { -- dev_err(port->dev, "rx dma prep cyclic failed\n"); -- return -ENODEV; -- } -- -- desc->callback = stm32_usart_rx_dma_complete; -- desc->callback_param = port; -- -- /* Push current DMA transaction in the pending queue */ -- ret = dma_submit_error(dmaengine_submit(desc)); -- if (ret) { -- dmaengine_terminate_sync(stm32_port->rx_ch); -- return ret; -- } -- -- /* Issue pending DMA requests */ -- dma_async_issue_pending(stm32_port->rx_ch); -- -- /* -- * DMA request line not re-enabled at resume when port is throttled. -- * It will be re-enabled by unthrottle ops. -- */ -- if (!stm32_port->throttled) -- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR); -- -- return 0; --} -- - static int stm32_usart_startup(struct uart_port *port) - { - struct stm32_port *stm32_port = to_stm32_port(port); -@@ -1020,7 +1077,7 @@ static int stm32_usart_startup(struct uart_port *port) - writel_relaxed(USART_RQR_RXFRQ, port->membase + ofs->rqr); - - if (stm32_port->rx_ch) { -- ret = stm32_usart_start_rx_dma_cyclic(port); -+ ret = stm32_usart_rx_dma_start_or_resume(port); - if (ret) { - free_irq(port->irq, port); - return ret; -@@ -1042,12 +1099,12 @@ static void stm32_usart_shutdown(struct uart_port *port) - u32 val, isr; - int ret; - -- if (stm32_usart_tx_dma_enabled(stm32_port)) -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -- - if (stm32_usart_tx_dma_started(stm32_port)) - stm32_usart_tx_dma_terminate(stm32_port); - -+ if (stm32_port->tx_ch) -+ stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -+ - /* Disable modem control interrupts */ - stm32_usart_disable_ms(port); - -@@ -1066,8 +1123,10 @@ static void stm32_usart_shutdown(struct uart_port *port) - dev_err(port->dev, "Transmission is not complete\n"); - - /* Disable RX DMA. */ -- if (stm32_port->rx_ch) -- dmaengine_terminate_async(stm32_port->rx_ch); -+ if (stm32_port->rx_ch) { -+ stm32_usart_rx_dma_terminate(stm32_port); -+ dmaengine_synchronize(stm32_port->rx_ch); -+ } - - /* flush RX & TX FIFO */ - if (ofs->rqr != UNDEF_REG) -@@ -1099,7 +1158,7 @@ static void stm32_usart_set_termios(struct uart_port *port, +@@ -1156,7 +1154,7 @@ static void stm32_usart_set_termios(struct uart_port *port, baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 8); @@ -10820,17 +9603,7 @@ index be47cd343cf6..8c51ec9433d6 100644 ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, isr, -@@ -1258,6 +1317,9 @@ static void stm32_usart_set_termios(struct uart_port *port, - cr3 |= USART_CR3_DDRE; - } - -+ if (stm32_port->tx_ch) -+ cr3 |= USART_CR3_DMAT; -+ - if (rs485conf->flags & SER_RS485_ENABLED) { - stm32_usart_config_reg_rs485(&cr1, &cr3, - rs485conf->delay_rts_before_send, -@@ -1287,7 +1349,7 @@ static void stm32_usart_set_termios(struct uart_port *port, +@@ -1347,7 +1345,7 @@ static void stm32_usart_set_termios(struct uart_port *port, writel_relaxed(cr1, port->membase + ofs->cr1); stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); @@ -10839,7 +9612,7 @@ index be47cd343cf6..8c51ec9433d6 100644 /* Handle modem control interrupts */ if (UART_ENABLE_MS(port, termios->c_cflag)) -@@ -1337,9 +1399,9 @@ static void stm32_usart_pm(struct uart_port *port, unsigned int state, +@@ -1397,9 +1395,9 @@ static void stm32_usart_pm(struct uart_port *port, unsigned int state, pm_runtime_get_sync(port->dev); break; case UART_PM_STATE_OFF: @@ -10851,33 +9624,7 @@ index be47cd343cf6..8c51ec9433d6 100644 pm_runtime_put_sync(port->dev); break; } -@@ -1764,11 +1826,6 @@ static int stm32_usart_serial_remove(struct platform_device *pdev) - pm_runtime_put_noidle(&pdev->dev); - - stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_PEIE); -- cr3 = readl_relaxed(port->membase + ofs->cr3); -- cr3 &= ~USART_CR3_EIE; -- cr3 &= ~USART_CR3_DMAR; -- cr3 &= ~USART_CR3_DDRE; -- writel_relaxed(cr3, port->membase + ofs->cr3); - - if (stm32_port->tx_ch) { - stm32_usart_of_dma_tx_remove(stm32_port, pdev); -@@ -1780,7 +1837,12 @@ static int stm32_usart_serial_remove(struct platform_device *pdev) - dma_release_channel(stm32_port->rx_ch); - } - -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); -+ cr3 = readl_relaxed(port->membase + ofs->cr3); -+ cr3 &= ~USART_CR3_EIE; -+ cr3 &= ~USART_CR3_DMAR; -+ cr3 &= ~USART_CR3_DMAT; -+ cr3 &= ~USART_CR3_DDRE; -+ writel_relaxed(cr3, port->membase + ofs->cr3); - - if (stm32_port->wakeup_src) { - dev_pm_clear_wake_irq(&pdev->dev); -@@ -1822,9 +1884,9 @@ static void stm32_usart_console_write(struct console *co, const char *s, +@@ -1882,9 +1880,9 @@ static void stm32_usart_console_write(struct console *co, const char *s, int locked = 1; if (oops_in_progress) @@ -10889,7 +9636,7 @@ index be47cd343cf6..8c51ec9433d6 100644 /* Save and disable interrupts, enable the transmitter */ old_cr1 = readl_relaxed(port->membase + ofs->cr1); -@@ -1838,7 +1900,7 @@ static void stm32_usart_console_write(struct console *co, const char *s, +@@ -1898,7 +1896,7 @@ static void stm32_usart_console_write(struct console *co, const char *s, writel_relaxed(old_cr1, port->membase + ofs->cr1); if (locked) @@ -10898,41 +9645,15 @@ index be47cd343cf6..8c51ec9433d6 100644 } static int stm32_usart_console_setup(struct console *co, char *options) -@@ -1952,7 +2014,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, - const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - struct tty_port *tport = &port->state->port; - int ret; -- unsigned int size; -+ unsigned int size = 0; - unsigned long flags; - - if (!stm32_port->wakeup_src || !tty_port_initialized(tport)) -@@ -1973,12 +2035,11 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, +@@ -2033,7 +2031,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, * low-power mode. */ if (stm32_port->rx_ch) { - spin_lock_irqsave(&port->lock, flags); -- /* Avoid race with RX IRQ when DMAR is cleared */ -- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + uart_port_lock_irqsave(port, &flags); /* Poll data from DMA RX buffer if any */ -- size = stm32_usart_receive_chars(port, true); -- dmaengine_terminate_async(stm32_port->rx_ch); -+ if (!stm32_usart_rx_dma_pause(stm32_port)) -+ size += stm32_usart_receive_chars(port, true); -+ stm32_usart_rx_dma_terminate(stm32_port); - uart_unlock_and_check_sysrq_irqrestore(port, flags); - if (size) - tty_flip_buffer_push(tport); -@@ -1988,7 +2049,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, - stm32_usart_receive_chars(port, false); - } else { - if (stm32_port->rx_ch) { -- ret = stm32_usart_start_rx_dma_cyclic(port); -+ ret = stm32_usart_rx_dma_start_or_resume(port); - if (ret) - return ret; - } + if (!stm32_usart_rx_dma_pause(stm32_port)) + size += stm32_usart_receive_chars(port, true); diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c index c671d674bce4..5bfc0040f17b 100644 --- a/drivers/tty/serial/sunhv.c @@ -11789,7 +10510,7 @@ index 49457be37b3f..ed7a6bb5596a 100644 /* diff --git a/drivers/tty/serial/vt8500_serial.c b/drivers/tty/serial/vt8500_serial.c -index 32433e9b3e5f..78a1c1eea11b 100644 +index c5d5c2765119..78a1c1eea11b 100644 --- a/drivers/tty/serial/vt8500_serial.c +++ b/drivers/tty/serial/vt8500_serial.c @@ -227,7 +227,7 @@ static irqreturn_t vt8500_irq(int irq, void *dev_id) @@ -11828,28 +10549,8 @@ index 32433e9b3e5f..78a1c1eea11b 100644 } static const char *vt8500_type(struct uart_port *port) -@@ -611,10 +611,6 @@ static int vt8500_serial_probe(struct platform_device *pdev) - if (!flags) - return -EINVAL; - -- mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- if (!mmres) -- return -ENODEV; -- - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; -@@ -647,7 +643,7 @@ static int vt8500_serial_probe(struct platform_device *pdev) - if (!vt8500_port) - return -ENOMEM; - -- vt8500_port->uart.membase = devm_ioremap_resource(&pdev->dev, mmres); -+ vt8500_port->uart.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mmres); - if (IS_ERR(vt8500_port->uart.membase)) - return PTR_ERR(vt8500_port->uart.membase); - diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c -index 20a751663ef9..9c13dac1d4d1 100644 +index 2e5e86a00a77..9c13dac1d4d1 100644 --- a/drivers/tty/serial/xilinx_uartps.c +++ b/drivers/tty/serial/xilinx_uartps.c @@ -346,7 +346,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) @@ -12088,17 +10789,6 @@ index 20a751663ef9..9c13dac1d4d1 100644 } return uart_resume_port(cdns_uart->cdns_uart_driver, port); -@@ -1562,8 +1562,8 @@ static int cdns_uart_probe(struct platform_device *pdev) - } - - irq = platform_get_irq(pdev, 0); -- if (irq <= 0) { -- rc = -ENXIO; -+ if (irq < 0) { -+ rc = irq; - goto err_out_clk_disable; - } - diff --git a/drivers/tty/tty.h b/drivers/tty/tty.h index db7f3f87772f..50862f98273e 100644 --- a/drivers/tty/tty.h @@ -12620,7 +11310,7 @@ index ceb7a1ce9a4e..ec46e3b49ee9 100644 int serial8250_console_exit(struct uart_port *port); diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h -index e9f16ec252a0..245c11753eff 100644 +index e9f16ec252a0..367091bbf11a 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -459,7 +459,8 @@ struct uart_port { @@ -12792,7 +11482,7 @@ index e9f16ec252a0..245c11753eff 100644 /* * Baud rate helpers. */ -@@ -1004,16 +1009,16 @@ void uart_handle_dcd_change(struct uart_port *uport, bool active); +@@ -1004,7 +1009,7 @@ void uart_handle_dcd_change(struct uart_port *uport, bool active); void uart_handle_cts_change(struct uart_port *uport, bool active); void uart_insert_char(struct uart_port *port, unsigned int status, @@ -12801,11 +11491,9 @@ index e9f16ec252a0..245c11753eff 100644 void uart_xchar_out(struct uart_port *uport, int offset); - #ifdef CONFIG_MAGIC_SYSRQ_SERIAL - #define SYSRQ_TIMEOUT (HZ * 5) +@@ -1013,7 +1018,7 @@ void uart_xchar_out(struct uart_port *uport, int offset); --bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch); -+bool uart_try_toggle_sysrq(struct uart_port *port, u8 ch); + bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch); -static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) +static inline int uart_handle_sysrq_char(struct uart_port *port, u8 ch) diff --git a/patches.suse/printk-nbcon-move-locked_port-flag-to-struct-uart_port.patch b/patches.suse/printk-nbcon-move-locked_port-flag-to-struct-uart_port.patch index dc2fa08..c25f538 100644 --- a/patches.suse/printk-nbcon-move-locked_port-flag-to-struct-uart_port.patch +++ b/patches.suse/printk-nbcon-move-locked_port-flag-to-struct-uart_port.patch @@ -1,10 +1,8 @@ -From 8df8aa0fde50fae34cf5799698ab6ba1c3b337c2 Mon Sep 17 00:00:00 2001 +From c958a20f3f8bdf5a434609d38443f0ddcfb44c48 Mon Sep 17 00:00:00 2001 From: Junxiao Chang Date: Tue, 23 Jan 2024 05:40:32 +0000 Subject: [PATCH] printk: nbcon: move locked_port flag to struct uart_port -From fce60ec62bffefd5bf741742abc9b3eac7e1597b Mon Sep 17 00:00:00 2001 - References: bsc#1214683 (PREEMPT_RT prerequisite backports) Git-commit: b07c1d0e81140da5ac7871633737687213d1aadf Patch-mainline: v6.6.20 @@ -49,7 +47,7 @@ index 266b47d585ce..3877f010305e 100644 struct rcuwait rcuwait; struct irq_work irq_work; diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h -index 245c11753eff..b2221a50fcb2 100644 +index 367091bbf11a..f8878ec27d33 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -488,6 +488,7 @@ struct uart_port { diff --git a/patches.suse/rt-Add-documentation-describing-what-RT-kernel-config-changes-to-default.patch b/patches.suse/rt-Add-documentation-describing-what-RT-kernel-config-changes-to-default.patch index 5b22a17..554fcd1 100644 --- a/patches.suse/rt-Add-documentation-describing-what-RT-kernel-config-changes-to-default.patch +++ b/patches.suse/rt-Add-documentation-describing-what-RT-kernel-config-changes-to-default.patch @@ -1,4 +1,4 @@ -From e9fec4356192285154baca25843af64e890bcecd Mon Sep 17 00:00:00 2001 +From cd731e0d51178f32a4cf33b6a6c90a7fe5fdcf8c Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Tue, 22 Mar 2022 09:00:03 +0000 Subject: [PATCH] rt: Add documentation describing what RT kernel config @@ -24,6 +24,7 @@ PREEMPT_TRACER Disabled due to overhead, enabled on rt_debug DEBUG_PREEMPT Disabled due to overhead, enabled on rt_debug Signed-off-by: Mel Gorman + --- Documentation/rt-config-required | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/patches.suse/rt-Add-documentation-describing-what-kernel-debug-options-to-add-for-testing.patch b/patches.suse/rt-Add-documentation-describing-what-kernel-debug-options-to-add-for-testing.patch index 527b9fe..384d16f 100644 --- a/patches.suse/rt-Add-documentation-describing-what-kernel-debug-options-to-add-for-testing.patch +++ b/patches.suse/rt-Add-documentation-describing-what-kernel-debug-options-to-add-for-testing.patch @@ -1,4 +1,4 @@ -From 937801b9674429bc323b84f8dff06c28356fa708 Mon Sep 17 00:00:00 2001 +From 059ebb1a1d218eb509c79760f623d281ac4f6496 Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Fri, 20 May 2022 13:45:53 +0100 Subject: [PATCH] rt: Add documentation describing what kernel debug options to @@ -15,6 +15,7 @@ This documents the *additional* debug options required on top of the parent SLE debug configuration. Signed-off-by: Mel Gorman + --- Documentation/rt_debug-config-required | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/patches.suse/rt-Add-helper-script-to-refresh-RT-configs-based-on-the-parent.patch b/patches.suse/rt-Add-helper-script-to-refresh-RT-configs-based-on-the-parent.patch index 6280c5a..dfb052e 100644 --- a/patches.suse/rt-Add-helper-script-to-refresh-RT-configs-based-on-the-parent.patch +++ b/patches.suse/rt-Add-helper-script-to-refresh-RT-configs-based-on-the-parent.patch @@ -1,4 +1,4 @@ -From 0c919554ff4c73705ed9b02126da70da43859232 Mon Sep 17 00:00:00 2001 +From 486d45afbaac66a6a31208e8c40a203afd62f2e6 Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Thu, 6 Apr 2023 08:29:31 +0100 Subject: [PATCH] rt: Add helper script to refresh RT configs based on the @@ -13,12 +13,16 @@ add a helper script that takes the default flavour config from the parent project and apply RT-specific kconfig options to it. Signed-off-by: Mel Gorman + --- - Documentation/rt/scripts/config-setoption | 39 +++++ - Documentation/rt/scripts/config-unsetoption | 21 +++ - Documentation/rt/scripts/rt-refresh-configs | 183 ++++++++++++++++++++++++++++ + Documentation/rt/scripts/config-setoption | 39 ++++++ + Documentation/rt/scripts/config-unsetoption | 21 ++++ + Documentation/rt/scripts/rt-refresh-configs | 183 ++++++++++++++++++++++++++++ 3 files changed, 243 insertions(+) +diff --git a/Documentation/rt/scripts/config-setoption b/Documentation/rt/scripts/config-setoption +new file mode 100755 +index 000000000000..ad793f55da12 --- /dev/null +++ b/Documentation/rt/scripts/config-setoption @@ -0,0 +1,39 @@ @@ -61,6 +65,9 @@ Signed-off-by: Mel Gorman +fi + +exit 0 +diff --git a/Documentation/rt/scripts/config-unsetoption b/Documentation/rt/scripts/config-unsetoption +new file mode 100755 +index 000000000000..7acad4132780 --- /dev/null +++ b/Documentation/rt/scripts/config-unsetoption @@ -0,0 +1,21 @@ @@ -85,6 +92,9 @@ Signed-off-by: Mel Gorman + exit -1 +fi +exit 0 +diff --git a/Documentation/rt/scripts/rt-refresh-configs b/Documentation/rt/scripts/rt-refresh-configs +new file mode 100755 +index 000000000000..2c6dbce1b316 --- /dev/null +++ b/Documentation/rt/scripts/rt-refresh-configs @@ -0,0 +1,183 @@ diff --git a/patches.suse/serial-8250-implement-non-BKL-console.patch b/patches.suse/serial-8250-implement-non-BKL-console.patch index cfa5c11..1ad15e5 100644 --- a/patches.suse/serial-8250-implement-non-BKL-console.patch +++ b/patches.suse/serial-8250-implement-non-BKL-console.patch @@ -1,4 +1,4 @@ -From 5bc4a4ee9e2e175a7866cdb6f99fedbdfdc3bfa0 Mon Sep 17 00:00:00 2001 +From c13ea17d147d06cf960b97d6b8e28109c96f4b7c Mon Sep 17 00:00:00 2001 From: John Ogness Date: Fri, 3 Mar 2023 12:27:31 +0000 Subject: [PATCH] serial: 8250: implement non-BKL console @@ -23,6 +23,7 @@ For example: console=ttyS0,115200 Signed-off-by: John Ogness Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Mel Gorman + --- drivers/tty/serial/8250/8250.h | 269 +++++++++++++++++++- drivers/tty/serial/8250/8250_aspeed_vuart.c | 2 +- diff --git a/patches.suse/serial-Do-not-hold-the-port-lock-when-setting-rx-during-tx-GPIO.patch b/patches.suse/serial-Do-not-hold-the-port-lock-when-setting-rx-during-tx-GPIO.patch new file mode 100644 index 0000000..7bfe260 --- /dev/null +++ b/patches.suse/serial-Do-not-hold-the-port-lock-when-setting-rx-during-tx-GPIO.patch @@ -0,0 +1,148 @@ +From 668375a1e77f69f1173d6bd9125e2ae8e101f75c Mon Sep 17 00:00:00 2001 +From: Lino Sanfilippo +Date: Wed, 3 Jan 2024 07:18:12 +0100 +Subject: [PATCH] serial: Do not hold the port lock when setting rx-during-tx + GPIO + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6.15 +Git-commit: 07c30ea5861fb26a77dade8cdc787252f6122fb1 + +commit 07c30ea5861fb26a77dade8cdc787252f6122fb1 upstream. + +Both the imx and stm32 driver set the rx-during-tx GPIO in rs485_config(). +Since this function is called with the port lock held, this can be a +problem in case that setting the GPIO line can sleep (e.g. if a GPIO +expander is used which is connected via SPI or I2C). + +Avoid this issue by moving the GPIO setting outside of the port lock into +the serial core and thus making it a generic feature. + +Also with commit c54d48543689 ("serial: stm32: Add support for rs485 +RX_DURING_TX output GPIO") the SER_RS485_RX_DURING_TX flag is only set if a +rx-during-tx GPIO is _not_ available, which is wrong. Fix this, too. + +Furthermore reset old GPIO settings in case that changing the RS485 +configuration failed. + +Fixes: c54d48543689 ("serial: stm32: Add support for rs485 RX_DURING_TX output GPIO") +Fixes: ca530cfa968c ("serial: imx: Add support for RS485 RX_DURING_TX output GPIO") +Cc: Shawn Guo +Cc: Sascha Hauer +Cc: +Signed-off-by: Lino Sanfilippo +Link: https://lore.kernel.org/r/20240103061818.564-2-l.sanfilippo@kunbus.com +Signed-off-by: Lino Sanfilippo +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/imx.c | 4 ---- + drivers/tty/serial/serial_core.c | 26 ++++++++++++++++++++++++-- + drivers/tty/serial/stm32-usart.c | 8 ++------ + 3 files changed, 26 insertions(+), 12 deletions(-) + +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index bb77a887c61c..7c79792c5a0b 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -1961,10 +1961,6 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio + rs485conf->flags & SER_RS485_RX_DURING_TX) + imx_uart_start_rx(port); + +- if (port->rs485_rx_during_tx_gpio) +- gpiod_set_value_cansleep(port->rs485_rx_during_tx_gpio, +- !!(rs485conf->flags & SER_RS485_RX_DURING_TX)); +- + return 0; + } + +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index e45d453d1ab1..4c1844f7f798 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -1415,6 +1415,16 @@ static void uart_set_rs485_termination(struct uart_port *port, + !!(rs485->flags & SER_RS485_TERMINATE_BUS)); + } + ++static void uart_set_rs485_rx_during_tx(struct uart_port *port, ++ const struct serial_rs485 *rs485) ++{ ++ if (!(rs485->flags & SER_RS485_ENABLED)) ++ return; ++ ++ gpiod_set_value_cansleep(port->rs485_rx_during_tx_gpio, ++ !!(rs485->flags & SER_RS485_RX_DURING_TX)); ++} ++ + static int uart_rs485_config(struct uart_port *port) + { + struct serial_rs485 *rs485 = &port->rs485; +@@ -1426,12 +1436,17 @@ static int uart_rs485_config(struct uart_port *port) + + uart_sanitize_serial_rs485(port, rs485); + uart_set_rs485_termination(port, rs485); ++ uart_set_rs485_rx_during_tx(port, rs485); + + spin_lock_irqsave(&port->lock, flags); + ret = port->rs485_config(port, NULL, rs485); + spin_unlock_irqrestore(&port->lock, flags); +- if (ret) ++ if (ret) { + memset(rs485, 0, sizeof(*rs485)); ++ /* unset GPIOs */ ++ gpiod_set_value_cansleep(port->rs485_term_gpio, 0); ++ gpiod_set_value_cansleep(port->rs485_rx_during_tx_gpio, 0); ++ } + + return ret; + } +@@ -1470,6 +1485,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, + return ret; + uart_sanitize_serial_rs485(port, &rs485); + uart_set_rs485_termination(port, &rs485); ++ uart_set_rs485_rx_during_tx(port, &rs485); + + spin_lock_irqsave(&port->lock, flags); + ret = port->rs485_config(port, &tty->termios, &rs485); +@@ -1481,8 +1497,14 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, + port->ops->set_mctrl(port, port->mctrl); + } + spin_unlock_irqrestore(&port->lock, flags); +- if (ret) ++ if (ret) { ++ /* restore old GPIO settings */ ++ gpiod_set_value_cansleep(port->rs485_term_gpio, ++ !!(port->rs485.flags & SER_RS485_TERMINATE_BUS)); ++ gpiod_set_value_cansleep(port->rs485_rx_during_tx_gpio, ++ !!(port->rs485.flags & SER_RS485_RX_DURING_TX)); + return ret; ++ } + + if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485))) + return -EFAULT; +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index be47cd343cf6..111a4db22a26 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -226,12 +226,6 @@ static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *ter + + stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); + +- if (port->rs485_rx_during_tx_gpio) +- gpiod_set_value_cansleep(port->rs485_rx_during_tx_gpio, +- !!(rs485conf->flags & SER_RS485_RX_DURING_TX)); +- else +- rs485conf->flags |= SER_RS485_RX_DURING_TX; +- + if (rs485conf->flags & SER_RS485_ENABLED) { + cr1 = readl_relaxed(port->membase + ofs->cr1); + cr3 = readl_relaxed(port->membase + ofs->cr3); +@@ -256,6 +250,8 @@ static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *ter + + writel_relaxed(cr3, port->membase + ofs->cr3); + writel_relaxed(cr1, port->membase + ofs->cr1); ++ ++ rs485conf->flags |= SER_RS485_RX_DURING_TX; + } else { + stm32_usart_clr_bits(port, ofs->cr3, + USART_CR3_DEM | USART_CR3_DEP); diff --git a/patches.suse/serial-ar933x-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-ar933x-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..0233847 --- /dev/null +++ b/patches.suse/serial-ar933x-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,35 @@ +From afb778d45456a24ec930f3c104858621fb78fd2e Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:39 +0800 +Subject: [PATCH] serial: ar933x: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 7449c16d3760ec749d4a3892baeb921edb227ad9 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-1-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/ar933x_uart.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c +index 4c3d04c6826a..924c1a89347c 100644 +--- a/drivers/tty/serial/ar933x_uart.c ++++ b/drivers/tty/serial/ar933x_uart.c +@@ -749,8 +749,7 @@ static int ar933x_uart_probe(struct platform_device *pdev) + + port = &up->port; + +- mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- port->membase = devm_ioremap_resource(&pdev->dev, mem_res); ++ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); + diff --git a/patches.suse/serial-bcm63xx-uart-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-bcm63xx-uart-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..fa7c425 --- /dev/null +++ b/patches.suse/serial-bcm63xx-uart-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,43 @@ +From beb18d00075cf71627c09e060691dba053c96c8b Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:40 +0800 +Subject: [PATCH] serial: bcm63xx-uart: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: b03a4ecb407ec2b1dff2ee584d0e769c1e706d64 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-2-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/bcm63xx_uart.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c +index 55e82d0bf92d..0dd8cceb837c 100644 +--- a/drivers/tty/serial/bcm63xx_uart.c ++++ b/drivers/tty/serial/bcm63xx_uart.c +@@ -832,14 +832,10 @@ static int bcm_uart_probe(struct platform_device *pdev) + return -EBUSY; + memset(port, 0, sizeof(*port)); + +- res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (!res_mem) +- return -ENODEV; +- +- port->mapbase = res_mem->start; +- port->membase = devm_ioremap_resource(&pdev->dev, res_mem); ++ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); ++ port->mapbase = res_mem->start; + + ret = platform_get_irq(pdev, 0); + if (ret < 0) diff --git a/patches.suse/serial-clps711x-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-clps711x-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..b9b7145 --- /dev/null +++ b/patches.suse/serial-clps711x-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,36 @@ +From f96961b8da1a54ecb6e40ef896a731ed5b2f6edc Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:41 +0800 +Subject: [PATCH] serial: clps711x: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 0bb60bda3157a4bf1d7c4d958cd9f46a3c72e79c + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-3-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/clps711x.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/clps711x.c b/drivers/tty/serial/clps711x.c +index be8b8788d2e2..55d19937efbd 100644 +--- a/drivers/tty/serial/clps711x.c ++++ b/drivers/tty/serial/clps711x.c +@@ -451,8 +451,7 @@ static int uart_clps711x_probe(struct platform_device *pdev) + if (IS_ERR(uart_clk)) + return PTR_ERR(uart_clk); + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- s->port.membase = devm_ioremap_resource(&pdev->dev, res); ++ s->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(s->port.membase)) + return PTR_ERR(s->port.membase); + diff --git a/patches.suse/serial-core-Fix-checks-for-tx-runtime-PM-state.patch b/patches.suse/serial-core-Fix-checks-for-tx-runtime-PM-state.patch new file mode 100644 index 0000000..c5a4655 --- /dev/null +++ b/patches.suse/serial-core-Fix-checks-for-tx-runtime-PM-state.patch @@ -0,0 +1,59 @@ +From b73be8efd516d4095006883266b0c912b9152563 Mon Sep 17 00:00:00 2001 +From: Tony Lindgren +Date: Thu, 5 Oct 2023 10:56:42 +0300 +Subject: [PATCH] serial: core: Fix checks for tx runtime PM state + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc6 +Git-commit: 81a61051e0ce5fd7e09225c0d5985da08c7954a7 + +Maximilian reported that surface_serial_hub serdev tx does not work during +system suspend. During system suspend, runtime PM gets disabled in +__device_suspend_late(), and tx is unable to wake-up the serial core port +device that we use to check if tx is safe to start. Johan summarized the +regression noting that serdev tx no longer always works as earlier when the +serdev device is runtime PM active. + +The serdev device and the serial core controller devices are siblings of +the serial port hardware device. The runtime PM usage count from serdev +device does not propagate to the serial core device siblings, it only +propagates to the parent. + +In addition to the tx issue for suspend, testing for the serial core port +device can cause an unnecessary delay in enabling tx while waiting for the +serial core port device to wake-up. The serial core port device wake-up is +only needed to flush pending tx when the serial port hardware device was +in runtime PM suspended state. + +To fix the regression, we need to check the runtime PM state of the parent +serial port hardware device for tx instead of the serial core port device. + +As the serial port device drivers may or may not implement runtime PM, we +need to also add a check for pm_runtime_enabled(). + +Reported-by: Maximilian Luz +Cc: stable +Fixes: 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") +Signed-off-by: Tony Lindgren +Tested-by: Maximilian Luz +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20231005075644.25936-1-tony@atomide.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/serial_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index 8a594435dbab..95a5bef81959 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -157,7 +157,7 @@ static void __uart_start(struct tty_struct *tty) + * enabled, serial_port_runtime_resume() calls start_tx() again + * after enabling the device. + */ +- if (pm_runtime_active(&port_dev->dev)) ++ if (!pm_runtime_enabled(port->dev) || pm_runtime_active(port->dev)) + port->ops->start_tx(port); + pm_runtime_mark_last_busy(&port_dev->dev); + pm_runtime_put_autosuspend(&port_dev->dev); diff --git a/patches.suse/serial-core-Fix-runtime-PM-handling-for-pending-tx.patch b/patches.suse/serial-core-Fix-runtime-PM-handling-for-pending-tx.patch new file mode 100644 index 0000000..2e7e43e --- /dev/null +++ b/patches.suse/serial-core-Fix-runtime-PM-handling-for-pending-tx.patch @@ -0,0 +1,48 @@ +From 0500ed78ce38f4eefafc59c3a538f11a9f05138a Mon Sep 17 00:00:00 2001 +From: Tony Lindgren +Date: Mon, 23 Oct 2023 10:48:54 +0300 +Subject: [PATCH] serial: core: Fix runtime PM handling for pending tx + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6.1 +Git-commit: 6f699743aebf07538e506a46c5965eb8bdd2c716 + +commit 6f699743aebf07538e506a46c5965eb8bdd2c716 upstream. + +Richard reported that a serial port may end up sometimes with tx data +pending in the buffer for long periods of time. + +Turns out we bail out early on any errors from pm_runtime_get(), +including -EINPROGRESS. To fix the issue, we need to ignore -EINPROGRESS +as we only care about the runtime PM usage count at this point. We check +for an active runtime PM state later on for tx. + +Fixes: 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") +Cc: stable +Reported-by: Richard Purdie +Cc: Bruce Ashfield +Cc: Mikko Rapeli +Cc: Paul Gortmaker +Cc: Randy MacLeod +Signed-off-by: Tony Lindgren +Tested-by: Richard Purdie +Link: https://lore.kernel.org/r/20231023074856.61896-1-tony@atomide.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/serial_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index 4c1844f7f798..8a594435dbab 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -147,7 +147,7 @@ static void __uart_start(struct tty_struct *tty) + + /* Increment the runtime PM usage count for the active check below */ + err = pm_runtime_get(&port_dev->dev); +- if (err < 0) { ++ if (err < 0 && err != -EINPROGRESS) { + pm_runtime_put_noidle(&port_dev->dev); + return; + } diff --git a/patches.suse/serial-fsl_lpuart-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-fsl_lpuart-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..3497607 --- /dev/null +++ b/patches.suse/serial-fsl_lpuart-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,36 @@ +From 44eb21d49f41fbc5bef262154e4ca089b08ab66f Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:45 +0800 +Subject: [PATCH] serial: fsl_lpuart: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 8f3c8d8152532e0065070385258404e2aa7f1f45 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-7-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/fsl_lpuart.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index 4175502b9460..385b41275e8b 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -2851,8 +2851,7 @@ static int lpuart_probe(struct platform_device *pdev) + if (!sport) + return -ENOMEM; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- sport->port.membase = devm_ioremap_resource(&pdev->dev, res); ++ sport->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(sport->port.membase)) + return PTR_ERR(sport->port.membase); + diff --git a/patches.suse/serial-imx-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-imx-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..7f7c0cd --- /dev/null +++ b/patches.suse/serial-imx-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,35 @@ +From 1c9eac428901cc3da8cdc588666c53a4a69ae68e Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:52 +0800 +Subject: [PATCH] serial: imx: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 57c2dab5596a2bd0cda64fcc208efdefe296788f + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-14-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/imx.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 7c79792c5a0b..c77831e91ec2 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -2284,8 +2284,7 @@ static int imx_uart_probe(struct platform_device *pdev) + return -EINVAL; + } + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- base = devm_ioremap_resource(&pdev->dev, res); ++ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(base)) + return PTR_ERR(base); + diff --git a/patches.suse/serial-linflexuart-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-linflexuart-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..6604168 --- /dev/null +++ b/patches.suse/serial-linflexuart-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,43 @@ +From f99171e832e8e6674ee704416e39db4957044906 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:42 +0800 +Subject: [PATCH] serial: linflexuart: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 8c6d7e5fd50b451b4de1c42e8b9faad5257fa12e + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-4-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/fsl_linflexuart.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/tty/serial/fsl_linflexuart.c b/drivers/tty/serial/fsl_linflexuart.c +index f697751c2ad5..249cb380c3c6 100644 +--- a/drivers/tty/serial/fsl_linflexuart.c ++++ b/drivers/tty/serial/fsl_linflexuart.c +@@ -827,14 +827,10 @@ static int linflex_probe(struct platform_device *pdev) + + sport->line = ret; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (!res) +- return -ENODEV; +- +- sport->mapbase = res->start; +- sport->membase = devm_ioremap_resource(&pdev->dev, res); ++ sport->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(sport->membase)) + return PTR_ERR(sport->membase); ++ sport->mapbase = res->start; + + sport->dev = &pdev->dev; + sport->type = PORT_LINFLEXUART; diff --git a/patches.suse/serial-mps2-uart-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-mps2-uart-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..452aebf --- /dev/null +++ b/patches.suse/serial-mps2-uart-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,37 @@ +From 48dd5e4655aa64909773f897e651855820ae6823 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:47 +0800 +Subject: [PATCH] serial: mps2-uart: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 6b4cda0248360dd6315d066cea0595f3c1b62f9d + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Acked-by: Sudeep Holla +Link: https://lore.kernel.org/r/20230712062853.11007-9-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/mps2-uart.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/mps2-uart.c b/drivers/tty/serial/mps2-uart.c +index 5da88cbeec73..ea5a7911cb15 100644 +--- a/drivers/tty/serial/mps2-uart.c ++++ b/drivers/tty/serial/mps2-uart.c +@@ -538,8 +538,7 @@ static int mps2_init_port(struct platform_device *pdev, + struct resource *res; + int ret; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- mps_port->port.membase = devm_ioremap_resource(&pdev->dev, res); ++ mps_port->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(mps_port->port.membase)) + return PTR_ERR(mps_port->port.membase); + diff --git a/patches.suse/serial-mvebu-uart-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-mvebu-uart-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..e31ff68 --- /dev/null +++ b/patches.suse/serial-mvebu-uart-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,60 @@ +From 485ed8f7d5c54c1c4a47c8821d0a241782333011 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:50 +0800 +Subject: [PATCH] serial: mvebu-uart: Use + devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: ffd793eba4e75628460bcab3d3bb72ee39d7b49a + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-12-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/mvebu-uart.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c +index 31f739c7a08b..ea924e9b913b 100644 +--- a/drivers/tty/serial/mvebu-uart.c ++++ b/drivers/tty/serial/mvebu-uart.c +@@ -876,18 +876,13 @@ static int uart_num_counter; + + static int mvebu_uart_probe(struct platform_device *pdev) + { +- struct resource *reg = platform_get_resource(pdev, IORESOURCE_MEM, 0); + const struct of_device_id *match = of_match_device(mvebu_uart_of_match, + &pdev->dev); + struct uart_port *port; + struct mvebu_uart *mvuart; ++ struct resource *reg; + int id, irq; + +- if (!reg) { +- dev_err(&pdev->dev, "no registers defined\n"); +- return -EINVAL; +- } +- + /* Assume that all UART ports have a DT alias or none has */ + id = of_alias_get_id(pdev->dev.of_node, "serial"); + if (!pdev->dev.of_node || id < 0) +@@ -922,11 +917,11 @@ static int mvebu_uart_probe(struct platform_device *pdev) + */ + port->irq = 0; + port->irqflags = 0; +- port->mapbase = reg->start; + +- port->membase = devm_ioremap_resource(&pdev->dev, reg); ++ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, ®); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); ++ port->mapbase = reg->start; + + mvuart = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_uart), + GFP_KERNEL); diff --git a/patches.suse/serial-omap-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-omap-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..3b5060a --- /dev/null +++ b/patches.suse/serial-omap-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,35 @@ +From a2f8c72c88bd5eb71e3cd0b1e4e52ad52d76c36f Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:44 +0800 +Subject: [PATCH] serial: omap: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: fcf0be13e8d9b4fcf815d42479c513c2d0deb1a4 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-6-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/omap-serial.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c +index a48255364bf9..916f2edfd7ea 100644 +--- a/drivers/tty/serial/omap-serial.c ++++ b/drivers/tty/serial/omap-serial.c +@@ -1565,8 +1565,7 @@ static int serial_omap_probe(struct platform_device *pdev) + if (!up) + return -ENOMEM; + +- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- base = devm_ioremap_resource(&pdev->dev, mem); ++ base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); + if (IS_ERR(base)) + return PTR_ERR(base); + diff --git a/patches.suse/serial-qcom-geni-clean-up-clock-rate-debug-printk.patch b/patches.suse/serial-qcom-geni-clean-up-clock-rate-debug-printk.patch new file mode 100644 index 0000000..e891f01 --- /dev/null +++ b/patches.suse/serial-qcom-geni-clean-up-clock-rate-debug-printk.patch @@ -0,0 +1,37 @@ +From cbd7232854bfae7b3a9c0f92249a94a31516722c Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Fri, 14 Jul 2023 15:02:14 +0200 +Subject: [PATCH] serial: qcom-geni: clean up clock-rate debug printk + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 18536cc8fab81f7bc010f782e06d34a1546d0648 + +Make the clock-rate debug printk more readable by using an equal sign +instead of a dash as separator between names and values and adding some +spaces: + + qcom_geni_serial 988000.serial: desired_rate = 1843200, clk_rate = 7372800, clk_div = 4 + +Signed-off-by: Johan Hovold +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20230714130214.14552-3-johan+linaro@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/qcom_geni_serial.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c +index 58e74df25200..2e1b1c827dfe 100644 +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -1244,7 +1244,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport, + goto out_restart_rx; + } + +- dev_dbg(port->se.dev, "desired_rate-%u, clk_rate-%lu, clk_div-%u\n", ++ dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n", + baud * sampling_rate, clk_rate, clk_div); + + uport->uartclk = clk_rate; diff --git a/patches.suse/serial-qcom-geni-use-icc-tag-defines.patch b/patches.suse/serial-qcom-geni-use-icc-tag-defines.patch new file mode 100644 index 0000000..fdb255c --- /dev/null +++ b/patches.suse/serial-qcom-geni-use-icc-tag-defines.patch @@ -0,0 +1,34 @@ +From 26709094b5b864f2e891e317d6e946aebbdae0e8 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 11 Jul 2023 18:05:16 +0200 +Subject: [PATCH] serial: qcom-geni: use icc tag defines + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 51273792cb9be9a2f7bd9ef3e8237e2668067793 + +Use the Qualcomm interconnect defines rather than magic numbers for the +icc tags also in the restore() PM callback. + +Signed-off-by: Johan Hovold +Reviewed-by: Georgi Djakov +Link: https://lore.kernel.org/r/20230711160516.30502-1-johan+linaro@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/qcom_geni_serial.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c +index 47bd7acab3b5..58e74df25200 100644 +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -1753,7 +1753,7 @@ static int qcom_geni_serial_sys_hib_resume(struct device *dev) + private_data = uport->private_data; + + if (uart_console(uport)) { +- geni_icc_set_tag(&port->se, 0x7); ++ geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ALWAYS); + geni_icc_set_bw(&port->se); + ret = uart_resume_port(private_data->drv, uport); + /* diff --git a/patches.suse/serial-qcom_geni-Comment-use-of-devm_krealloc-rather-than-devm_krealloc_array.patch b/patches.suse/serial-qcom_geni-Comment-use-of-devm_krealloc-rather-than-devm_krealloc_array.patch new file mode 100644 index 0000000..a724cd8 --- /dev/null +++ b/patches.suse/serial-qcom_geni-Comment-use-of-devm_krealloc-rather-than-devm_krealloc_array.patch @@ -0,0 +1,39 @@ +From 424c93185bd6d5f038fdde6dca70a7ab0298108a Mon Sep 17 00:00:00 2001 +From: James Clark +Date: Tue, 9 May 2023 10:49:41 +0100 +Subject: [PATCH] serial: qcom_geni: Comment use of devm_krealloc rather than + devm_krealloc_array + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.5-rc1 +Git-commit: 9e6aa7c22d0777da16cec0d056382c9bd181aa78 + +Now that devm_krealloc_array is available, add a comment justifying not +changing this occurrence to avoid any future auto fixups. + +Link: https://lore.kernel.org/all/20230318173402.20a4f60d@jic23-huawei/ +Reviewed-by: Jonathan Cameron +Signed-off-by: James Clark +Link: https://lore.kernel.org/r/20230509094942.396150-5-james.clark@arm.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/qcom_geni_serial.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c +index e69c456bedb4..47bd7acab3b5 100644 +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -1052,6 +1052,11 @@ static int setup_fifos(struct qcom_geni_serial_port *port) + (port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE; + + if (port->rx_buf && (old_rx_fifo_depth != port->rx_fifo_depth) && port->rx_fifo_depth) { ++ /* ++ * Use krealloc rather than krealloc_array because rx_buf is ++ * accessed as 1 byte entries as well as 4 byte entries so it's ++ * not necessarily an array. ++ */ + port->rx_buf = devm_krealloc(uport->dev, port->rx_buf, + port->rx_fifo_depth * sizeof(u32), + GFP_KERNEL); diff --git a/patches.suse/serial-sccnxp-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-sccnxp-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..bb75883 --- /dev/null +++ b/patches.suse/serial-sccnxp-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,42 @@ +From 2839ec7e75bc542895b2abd05c1f4b6f7efe266e Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:49 +0800 +Subject: [PATCH] serial: sccnxp: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 0851efaf334e78e46a7000860659d7c8f5710820 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-11-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/sccnxp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/sccnxp.c b/drivers/tty/serial/sccnxp.c +index 791f2d6006e0..8269b0fb3083 100644 +--- a/drivers/tty/serial/sccnxp.c ++++ b/drivers/tty/serial/sccnxp.c +@@ -879,14 +879,14 @@ MODULE_DEVICE_TABLE(platform, sccnxp_id_table); + + static int sccnxp_probe(struct platform_device *pdev) + { +- struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev); ++ struct resource *res; + int i, ret, uartclk; + struct sccnxp_port *s; + void __iomem *membase; + struct clk *clk; + +- membase = devm_ioremap_resource(&pdev->dev, res); ++ membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(membase)) + return PTR_ERR(membase); + diff --git a/patches.suse/serial-sifive-Add-suspend-and-resume-operations.patch b/patches.suse/serial-sifive-Add-suspend-and-resume-operations.patch new file mode 100644 index 0000000..5087499 --- /dev/null +++ b/patches.suse/serial-sifive-Add-suspend-and-resume-operations.patch @@ -0,0 +1,58 @@ +From c65f203f7ede7d78f5540c88a265437936404be2 Mon Sep 17 00:00:00 2001 +From: Nick Hu +Date: Tue, 15 Aug 2023 17:02:16 +0800 +Subject: [PATCH] serial: sifive: Add suspend and resume operations + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 8a6498f2b94333f1793bc912b11830655f975470 + +If the Sifive Uart is not used as the wake up source, suspend the uart +before the system enter the suspend state to prevent it woken up by +unexpected uart interrupt. Resume the uart once the system woken up. + +Signed-off-by: Nick Hu +Reviewed-by: Ben Dooks +Link: https://lore.kernel.org/r/20230815090216.2575971-1-nick.hu@sifive.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/sifive.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c +index e2efc3f84eff..d195c5de52e7 100644 +--- a/drivers/tty/serial/sifive.c ++++ b/drivers/tty/serial/sifive.c +@@ -1019,6 +1019,23 @@ static int sifive_serial_remove(struct platform_device *dev) + return 0; + } + ++static int sifive_serial_suspend(struct device *dev) ++{ ++ struct sifive_serial_port *ssp = dev_get_drvdata(dev); ++ ++ return uart_suspend_port(&sifive_serial_uart_driver, &ssp->port); ++} ++ ++static int sifive_serial_resume(struct device *dev) ++{ ++ struct sifive_serial_port *ssp = dev_get_drvdata(dev); ++ ++ return uart_resume_port(&sifive_serial_uart_driver, &ssp->port); ++} ++ ++DEFINE_SIMPLE_DEV_PM_OPS(sifive_uart_pm_ops, sifive_serial_suspend, ++ sifive_serial_resume); ++ + static const struct of_device_id sifive_serial_of_match[] = { + { .compatible = "sifive,fu540-c000-uart0" }, + { .compatible = "sifive,uart0" }, +@@ -1031,6 +1048,7 @@ static struct platform_driver sifive_serial_platform_driver = { + .remove = sifive_serial_remove, + .driver = { + .name = SIFIVE_SERIAL_NAME, ++ .pm = pm_sleep_ptr(&sifive_uart_pm_ops), + .of_match_table = sifive_serial_of_match, + }, + }; diff --git a/patches.suse/serial-sifive-Remove-redundant-of_match_ptr.patch b/patches.suse/serial-sifive-Remove-redundant-of_match_ptr.patch new file mode 100644 index 0000000..def8a4e --- /dev/null +++ b/patches.suse/serial-sifive-Remove-redundant-of_match_ptr.patch @@ -0,0 +1,33 @@ +From 3700f86a199d2f224b6ebc02c37f781674fe172f Mon Sep 17 00:00:00 2001 +From: Ruan Jinjie +Date: Wed, 9 Aug 2023 16:55:41 +0800 +Subject: [PATCH] serial: sifive: Remove redundant of_match_ptr() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 0aaf78182b721991a594ad8f8fe96d806e75db5a + +The driver depends on CONFIG_OF, it is not necessary to use +of_match_ptr() here. + +Signed-off-by: Ruan Jinjie +Link: https://lore.kernel.org/r/20230809085541.2969654-1-ruanjinjie@huawei.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/sifive.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c +index 3ac9fbd0226e..e2efc3f84eff 100644 +--- a/drivers/tty/serial/sifive.c ++++ b/drivers/tty/serial/sifive.c +@@ -1031,7 +1031,7 @@ static struct platform_driver sifive_serial_platform_driver = { + .remove = sifive_serial_remove, + .driver = { + .name = SIFIVE_SERIAL_NAME, +- .of_match_table = of_match_ptr(sifive_serial_of_match), ++ .of_match_table = sifive_serial_of_match, + }, + }; + diff --git a/patches.suse/serial-sifive-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-sifive-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..ed21d42 --- /dev/null +++ b/patches.suse/serial-sifive-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,40 @@ +From 90ed7326910a5fad85df90c08a94464938243776 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:51 +0800 +Subject: [PATCH] serial: sifive: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: b75c1da925d991acae8b2abbb2e5ea321b9bbefb + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-13-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/sifive.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c +index eea6f123e95b..3ac9fbd0226e 100644 +--- a/drivers/tty/serial/sifive.c ++++ b/drivers/tty/serial/sifive.c +@@ -917,12 +917,9 @@ static int sifive_serial_probe(struct platform_device *pdev) + if (irq < 0) + return -EPROBE_DEFER; + +- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- base = devm_ioremap_resource(&pdev->dev, mem); +- if (IS_ERR(base)) { +- dev_err(&pdev->dev, "could not acquire device memory\n"); ++ base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); ++ if (IS_ERR(base)) + return PTR_ERR(base); +- } + + clk = devm_clk_get_enabled(&pdev->dev, NULL); + if (IS_ERR(clk)) { diff --git a/patches.suse/serial-sprd-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-sprd-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..20fa690 --- /dev/null +++ b/patches.suse/serial-sprd-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,35 @@ +From 74863891287ad8553fab05cd0cd87cf8727f5081 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:48 +0800 +Subject: [PATCH] serial: sprd: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: f60129c4e79543e7340515a02135d4fb04782d56 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-10-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/sprd_serial.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c +index e427dd2c7ed7..f328fa57231f 100644 +--- a/drivers/tty/serial/sprd_serial.c ++++ b/drivers/tty/serial/sprd_serial.c +@@ -1180,8 +1180,7 @@ static int sprd_probe(struct platform_device *pdev) + if (ret) + return ret; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- up->membase = devm_ioremap_resource(&pdev->dev, res); ++ up->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(up->membase)) + return PTR_ERR(up->membase); + diff --git a/patches.suse/serial-st-asc-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-st-asc-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..dbc24dd --- /dev/null +++ b/patches.suse/serial-st-asc-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,35 @@ +From 153b5594813dce9d7cb403d7e9b59678bef17523 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:53 +0800 +Subject: [PATCH] serial: st-asc: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 9b4e18f032db160a70d73d3cdf3a0bff229686b4 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-15-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/st-asc.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/st-asc.c b/drivers/tty/serial/st-asc.c +index 9b32465405e7..941695e0c79f 100644 +--- a/drivers/tty/serial/st-asc.c ++++ b/drivers/tty/serial/st-asc.c +@@ -691,8 +691,7 @@ static int asc_init_port(struct asc_port *ascport, + port->irq = platform_get_irq(pdev, 0); + port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_ST_ASC_CONSOLE); + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- port->membase = devm_ioremap_resource(&pdev->dev, res); ++ port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); + port->mapbase = res->start; diff --git a/patches.suse/serial-stm32-avoid-clearing-DMAT-bit-during-transfer.patch b/patches.suse/serial-stm32-avoid-clearing-DMAT-bit-during-transfer.patch new file mode 100644 index 0000000..7ecaeab --- /dev/null +++ b/patches.suse/serial-stm32-avoid-clearing-DMAT-bit-during-transfer.patch @@ -0,0 +1,184 @@ +From 1f2a790db75d58f2c047118a689888b8ea0b05cf Mon Sep 17 00:00:00 2001 +From: Valentin Caron +Date: Tue, 8 Aug 2023 18:19:01 +0200 +Subject: [PATCH] serial: stm32: avoid clearing DMAT bit during transfer + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: db89728abad5ab6b8f30349142897bd55f1f5b00 + +It's rather advised to rely on DMA pause / resume instead of +clearing/setting DMA request enable bit for the same purpose. Some DMA +request/acknowledge race may encountered by doing so. We prefer to use +dmaengine_pause and resume instead to pause a dma transfer when it is +necessary. + +It is also safer to close DMA before reset DMAT in stm32_usart_shutdown. + +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-2-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 76 +++++++++++++++++++++++----------------- + 1 file changed, 44 insertions(+), 32 deletions(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index 111a4db22a26..1762b2c62278 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -502,13 +502,6 @@ static bool stm32_usart_tx_dma_started(struct stm32_port *stm32_port) + return stm32_port->tx_dma_busy; + } + +-static bool stm32_usart_tx_dma_enabled(struct stm32_port *stm32_port) +-{ +- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; +- +- return !!(readl_relaxed(stm32_port->port.membase + ofs->cr3) & USART_CR3_DMAT); +-} +- + static void stm32_usart_tx_dma_complete(void *arg) + { + struct uart_port *port = arg; +@@ -587,9 +580,6 @@ static void stm32_usart_transmit_chars_pio(struct uart_port *port) + const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + struct circ_buf *xmit = &port->state->xmit; + +- if (stm32_usart_tx_dma_enabled(stm32_port)) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); +- + while (!uart_circ_empty(xmit)) { + /* Check that TDR is empty before filling FIFO */ + if (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE)) +@@ -612,10 +602,16 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + struct circ_buf *xmit = &port->state->xmit; + struct dma_async_tx_descriptor *desc = NULL; + unsigned int count; ++ int ret; + + if (stm32_usart_tx_dma_started(stm32port)) { +- if (!stm32_usart_tx_dma_enabled(stm32port)) +- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); ++ if (dmaengine_tx_status(stm32port->tx_ch, ++ stm32port->tx_ch->cookie, ++ NULL) == DMA_PAUSED) { ++ ret = dmaengine_resume(stm32port->tx_ch); ++ if (ret < 0) ++ goto dma_err; ++ } + return; + } + +@@ -660,11 +656,9 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + desc->callback_param = port; + + /* Push current DMA TX transaction in the pending queue */ +- if (dma_submit_error(dmaengine_submit(desc))) { +- /* dma no yet started, safe to free resources */ +- stm32_usart_tx_dma_terminate(stm32port); +- goto fallback_err; +- } ++ /* DMA no yet started, safe to free resources */ ++ if (dma_submit_error(dmaengine_submit(desc))) ++ goto dma_err; + + /* Issue pending DMA TX requests */ + dma_async_issue_pending(stm32port->tx_ch); +@@ -675,6 +669,10 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + + return; + ++dma_err: ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_tx_dma_terminate(stm32port); ++ + fallback_err: + stm32_usart_transmit_chars_pio(port); + } +@@ -697,9 +695,15 @@ static void stm32_usart_transmit_chars(struct uart_port *port) + + if (port->x_char) { + if (stm32_usart_tx_dma_started(stm32_port) && +- stm32_usart_tx_dma_enabled(stm32_port)) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); +- ++ dmaengine_tx_status(stm32_port->tx_ch, ++ stm32_port->tx_ch->cookie, ++ NULL) == DMA_IN_PROGRESS) { ++ ret = dmaengine_pause(stm32_port->tx_ch); ++ if (ret < 0) { ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_tx_dma_terminate(stm32_port); ++ } ++ } + /* Check that TDR is empty before filling FIFO */ + ret = + readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, +@@ -712,8 +716,14 @@ static void stm32_usart_transmit_chars(struct uart_port *port) + writel_relaxed(port->x_char, port->membase + ofs->tdr); + port->x_char = 0; + port->icount.tx++; +- if (stm32_usart_tx_dma_started(stm32_port)) +- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); ++ ++ if (stm32_usart_tx_dma_started(stm32_port)) { ++ ret = dmaengine_resume(stm32_port->tx_ch); ++ if (ret < 0) { ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_tx_dma_terminate(stm32_port); ++ } ++ } + return; + } + +@@ -846,11 +856,16 @@ static void stm32_usart_disable_ms(struct uart_port *port) + static void stm32_usart_stop_tx(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); +- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; ++ int ret; + + stm32_usart_tx_interrupt_disable(port); +- if (stm32_usart_tx_dma_started(stm32_port) && stm32_usart_tx_dma_enabled(stm32_port)) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); ++ if (stm32_usart_tx_dma_started(stm32_port)) { ++ ret = dmaengine_pause(stm32_port->tx_ch); ++ if (ret < 0) { ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_tx_dma_terminate(stm32_port); ++ } ++ } + + stm32_usart_rs485_rts_disable(port); + } +@@ -874,12 +889,9 @@ static void stm32_usart_start_tx(struct uart_port *port) + static void stm32_usart_flush_buffer(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); +- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + +- if (stm32_port->tx_ch) { ++ if (stm32_port->tx_ch) + stm32_usart_tx_dma_terminate(stm32_port); +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); +- } + } + + /* Throttle the remote when input buffer is about to overflow. */ +@@ -1038,12 +1050,12 @@ static void stm32_usart_shutdown(struct uart_port *port) + u32 val, isr; + int ret; + +- if (stm32_usart_tx_dma_enabled(stm32_port)) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); +- + if (stm32_usart_tx_dma_started(stm32_port)) + stm32_usart_tx_dma_terminate(stm32_port); + ++ if (stm32_port->tx_ch) ++ stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); ++ + /* Disable modem control interrupts */ + stm32_usart_disable_ms(port); + diff --git a/patches.suse/serial-stm32-do-not-always-set-SER_RS485_RX_DURING_TX-if-RS485-is-enabled.patch b/patches.suse/serial-stm32-do-not-always-set-SER_RS485_RX_DURING_TX-if-RS485-is-enabled.patch new file mode 100644 index 0000000..5df5f6a --- /dev/null +++ b/patches.suse/serial-stm32-do-not-always-set-SER_RS485_RX_DURING_TX-if-RS485-is-enabled.patch @@ -0,0 +1,46 @@ +From 703a290a6b350b6fb148b39382a4aff1f321e012 Mon Sep 17 00:00:00 2001 +From: Lino Sanfilippo +Date: Fri, 16 Feb 2024 23:47:07 +0100 +Subject: [PATCH] serial: stm32: do not always set SER_RS485_RX_DURING_TX if + RS485 is enabled + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6.19 +Git-commit: f418ae73311deb901c0110b08d1bbafc20c1820e + +commit f418ae73311deb901c0110b08d1bbafc20c1820e upstream. + +Before commit 07c30ea5861f ("serial: Do not hold the port lock when setting +rx-during-tx GPIO") the SER_RS485_RX_DURING_TX flag was only set if the +rx-during-tx mode was not controlled by a GPIO. Now the flag is set +unconditionally when RS485 is enabled. This results in an incorrect setting +if the rx-during-tx GPIO is not asserted. + +Fix this by setting the flag only if the rx-during-tx mode is not +controlled by a GPIO and thus restore the correct behaviour. + +Cc: stable@vger.kernel.org # 6.6+ +Fixes: 07c30ea5861f ("serial: Do not hold the port lock when setting rx-during-tx GPIO") +Signed-off-by: Lino Sanfilippo +Link: https://lore.kernel.org/r/20240216224709.9928-1-l.sanfilippo@kunbus.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index b6f4f436a565..e5f933beb6c0 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -251,7 +251,9 @@ static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *ter + writel_relaxed(cr3, port->membase + ofs->cr3); + writel_relaxed(cr1, port->membase + ofs->cr1); + +- rs485conf->flags |= SER_RS485_RX_DURING_TX; ++ if (!port->rs485_rx_during_tx_gpio) ++ rs485conf->flags |= SER_RS485_RX_DURING_TX; ++ + } else { + stm32_usart_clr_bits(port, ofs->cr3, + USART_CR3_DEM | USART_CR3_DEP); diff --git a/patches.suse/serial-stm32-group-dma-pause-resume-error-handling-into-single-function.patch b/patches.suse/serial-stm32-group-dma-pause-resume-error-handling-into-single-function.patch new file mode 100644 index 0000000..02d9e43 --- /dev/null +++ b/patches.suse/serial-stm32-group-dma-pause-resume-error-handling-into-single-function.patch @@ -0,0 +1,275 @@ +From 24f71c8da752e78f18055f06f448db97ffb768fc Mon Sep 17 00:00:00 2001 +From: Valentin Caron +Date: Tue, 8 Aug 2023 18:19:04 +0200 +Subject: [PATCH] serial: stm32: group dma pause/resume error handling into + single function + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 7f28bcea824e4fb192214c6121161053efe738a8 + +Create new function "stm32_usart_dma_pause_resume" that called dmaengine_ +pause/resume and in case of error, terminate dma transaction. + +Two other functions are created to facilitate the use of stm32_usart_dma +_pause_resume : stm32_usart_tx_dma_pause, stm32_usart_tx_dma_resume. +Equivalent functions for rx will be added in future patch. + +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-5-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 127 +++++++++++++++++++++++++-------------- + drivers/tty/serial/stm32-usart.h | 1 + + 2 files changed, 83 insertions(+), 45 deletions(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index 9d9b221a6f45..b04375f54bdf 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -286,14 +286,40 @@ static int stm32_usart_init_rs485(struct uart_port *port, + } + + static bool stm32_usart_rx_dma_started(struct stm32_port *stm32_port) ++{ ++ return stm32_port->rx_ch ? stm32_port->rx_dma_busy : false; ++} ++ ++static void stm32_usart_rx_dma_terminate(struct stm32_port *stm32_port) ++{ ++ dmaengine_terminate_async(stm32_port->rx_ch); ++ stm32_port->rx_dma_busy = false; ++} ++ ++static int stm32_usart_dma_pause_resume(struct stm32_port *stm32_port, ++ struct dma_chan *chan, ++ enum dma_status expected_status, ++ int dmaengine_pause_or_resume(struct dma_chan *), ++ bool stm32_usart_xx_dma_started(struct stm32_port *), ++ void stm32_usart_xx_dma_terminate(struct stm32_port *)) + { + struct uart_port *port = &stm32_port->port; +- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; ++ enum dma_status dma_status; ++ int ret; ++ ++ if (!stm32_usart_xx_dma_started(stm32_port)) ++ return -EPERM; + +- if (!stm32_port->rx_ch) +- return false; ++ dma_status = dmaengine_tx_status(chan, chan->cookie, NULL); ++ if (dma_status != expected_status) ++ return -EAGAIN; + +- return !!(readl_relaxed(port->membase + ofs->cr3) & USART_CR3_DMAR); ++ ret = dmaengine_pause_or_resume(chan); ++ if (ret) { ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_xx_dma_terminate(stm32_port); ++ } ++ return ret; + } + + /* Return true when data is pending (in pio mode), and false when no data is pending. */ +@@ -471,7 +497,7 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force + } + } else { + /* Disable RX DMA */ +- dmaengine_terminate_async(stm32_port->rx_ch); ++ stm32_usart_rx_dma_terminate(stm32_port); + stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + /* Fall back to interrupt mode */ + dev_dbg(port->dev, "DMA error, fallback to irq mode\n"); +@@ -502,6 +528,22 @@ static bool stm32_usart_tx_dma_started(struct stm32_port *stm32_port) + return stm32_port->tx_dma_busy; + } + ++static int stm32_usart_tx_dma_pause(struct stm32_port *stm32_port) ++{ ++ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->tx_ch, ++ DMA_IN_PROGRESS, dmaengine_pause, ++ stm32_usart_tx_dma_started, ++ stm32_usart_tx_dma_terminate); ++} ++ ++static int stm32_usart_tx_dma_resume(struct stm32_port *stm32_port) ++{ ++ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->tx_ch, ++ DMA_PAUSED, dmaengine_resume, ++ stm32_usart_tx_dma_started, ++ stm32_usart_tx_dma_terminate); ++} ++ + static void stm32_usart_tx_dma_complete(void *arg) + { + struct uart_port *port = arg; +@@ -602,13 +644,9 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + int ret; + + if (stm32_usart_tx_dma_started(stm32port)) { +- if (dmaengine_tx_status(stm32port->tx_ch, +- stm32port->tx_ch->cookie, +- NULL) == DMA_PAUSED) { +- ret = dmaengine_resume(stm32port->tx_ch); +- if (ret < 0) +- goto dma_err; +- } ++ ret = stm32_usart_tx_dma_resume(stm32port); ++ if (ret < 0 && ret != -EAGAIN) ++ goto fallback_err; + return; + } + +@@ -654,8 +692,12 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + + /* Push current DMA TX transaction in the pending queue */ + /* DMA no yet started, safe to free resources */ +- if (dma_submit_error(dmaengine_submit(desc))) +- goto dma_err; ++ ret = dma_submit_error(dmaengine_submit(desc)); ++ if (ret) { ++ dev_err(port->dev, "DMA failed with error code: %d\n", ret); ++ stm32_usart_tx_dma_terminate(stm32port); ++ goto fallback_err; ++ } + + /* Issue pending DMA TX requests */ + dma_async_issue_pending(stm32port->tx_ch); +@@ -664,10 +706,6 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + + return; + +-dma_err: +- dev_err(port->dev, "DMA failed with error code: %d\n", ret); +- stm32_usart_tx_dma_terminate(stm32port); +- + fallback_err: + stm32_usart_transmit_chars_pio(port); + } +@@ -689,16 +727,9 @@ static void stm32_usart_transmit_chars(struct uart_port *port) + } + + if (port->x_char) { +- if (stm32_usart_tx_dma_started(stm32_port) && +- dmaengine_tx_status(stm32_port->tx_ch, +- stm32_port->tx_ch->cookie, +- NULL) == DMA_IN_PROGRESS) { +- ret = dmaengine_pause(stm32_port->tx_ch); +- if (ret < 0) { +- dev_err(port->dev, "DMA failed with error code: %d\n", ret); +- stm32_usart_tx_dma_terminate(stm32_port); +- } +- } ++ /* dma terminate may have been called in case of dma pause failure */ ++ stm32_usart_tx_dma_pause(stm32_port); ++ + /* Check that TDR is empty before filling FIFO */ + ret = + readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, +@@ -712,13 +743,8 @@ static void stm32_usart_transmit_chars(struct uart_port *port) + port->x_char = 0; + port->icount.tx++; + +- if (stm32_usart_tx_dma_started(stm32_port)) { +- ret = dmaengine_resume(stm32_port->tx_ch); +- if (ret < 0) { +- dev_err(port->dev, "DMA failed with error code: %d\n", ret); +- stm32_usart_tx_dma_terminate(stm32_port); +- } +- } ++ /* dma terminate may have been called in case of dma resume failure */ ++ stm32_usart_tx_dma_resume(stm32_port); + return; + } + +@@ -851,16 +877,11 @@ static void stm32_usart_disable_ms(struct uart_port *port) + static void stm32_usart_stop_tx(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); +- int ret; + + stm32_usart_tx_interrupt_disable(port); +- if (stm32_usart_tx_dma_started(stm32_port)) { +- ret = dmaengine_pause(stm32_port->tx_ch); +- if (ret < 0) { +- dev_err(port->dev, "DMA failed with error code: %d\n", ret); +- stm32_usart_tx_dma_terminate(stm32_port); +- } +- } ++ ++ /* dma terminate may have been called in case of dma pause failure */ ++ stm32_usart_tx_dma_pause(stm32_port); + + stm32_usart_rs485_rts_disable(port); + } +@@ -961,8 +982,22 @@ static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port) + struct stm32_port *stm32_port = to_stm32_port(port); + const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + struct dma_async_tx_descriptor *desc; ++ enum dma_status rx_dma_status; + int ret; + ++ if (stm32_port->rx_dma_busy) { ++ rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, ++ stm32_port->rx_ch->cookie, ++ NULL); ++ if (rx_dma_status == DMA_IN_PROGRESS) ++ return 0; ++ ++ dev_err(port->dev, "DMA failed : status error.\n"); ++ stm32_usart_rx_dma_terminate(stm32_port); ++ } ++ ++ stm32_port->rx_dma_busy = true; ++ + stm32_port->last_res = RX_BUF_L; + /* Prepare a DMA cyclic transaction */ + desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch, +@@ -972,6 +1007,7 @@ static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port) + DMA_PREP_INTERRUPT); + if (!desc) { + dev_err(port->dev, "rx dma prep cyclic failed\n"); ++ stm32_port->rx_dma_busy = false; + return -ENODEV; + } + +@@ -982,6 +1018,7 @@ static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port) + ret = dma_submit_error(dmaengine_submit(desc)); + if (ret) { + dmaengine_terminate_sync(stm32_port->rx_ch); ++ stm32_port->rx_dma_busy = false; + return ret; + } + +@@ -1070,7 +1107,7 @@ static void stm32_usart_shutdown(struct uart_port *port) + + /* Disable RX DMA. */ + if (stm32_port->rx_ch) +- dmaengine_terminate_async(stm32_port->rx_ch); ++ stm32_usart_rx_dma_terminate(stm32_port); + + /* flush RX & TX FIFO */ + if (ofs->rqr != UNDEF_REG) +@@ -1984,7 +2021,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, + stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + /* Poll data from DMA RX buffer if any */ + size = stm32_usart_receive_chars(port, true); +- dmaengine_terminate_async(stm32_port->rx_ch); ++ stm32_usart_rx_dma_terminate(stm32_port); + uart_unlock_and_check_sysrq_irqrestore(port, flags); + if (size) + tty_flip_buffer_push(tport); +diff --git a/drivers/tty/serial/stm32-usart.h b/drivers/tty/serial/stm32-usart.h +index 903285b5aea7..f59f831b2a10 100644 +--- a/drivers/tty/serial/stm32-usart.h ++++ b/drivers/tty/serial/stm32-usart.h +@@ -199,6 +199,7 @@ struct stm32_port { + u32 cr3_irq; /* USART_CR3_RXFTIE */ + int last_res; + bool tx_dma_busy; /* dma tx transaction in progress */ ++ bool rx_dma_busy; /* dma rx transaction in progress */ + bool throttled; /* port throttled */ + bool hw_flow_control; + bool swap; /* swap RX & TX pins */ diff --git a/patches.suse/serial-stm32-modify-parameter-and-rename-stm32_usart_rx_dma_enabled.patch b/patches.suse/serial-stm32-modify-parameter-and-rename-stm32_usart_rx_dma_enabled.patch new file mode 100644 index 0000000..2f80d49 --- /dev/null +++ b/patches.suse/serial-stm32-modify-parameter-and-rename-stm32_usart_rx_dma_enabled.patch @@ -0,0 +1,87 @@ +From ec8bcefc637d475c93709fa559449991243c5c34 Mon Sep 17 00:00:00 2001 +From: Valentin Caron +Date: Tue, 8 Aug 2023 18:19:03 +0200 +Subject: [PATCH] serial: stm32: modify parameter and rename + stm32_usart_rx_dma_enabled + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 00d1f9c6af0d4c8b1ae8b9aecbd8aa6295b4abf2 + +Rename stm32_usart_rx_dma_enabled to stm32_usart_rx_dma_started in order +to match with stm32_usart_tx_dma_started. + +Modify argument of stm32_usart_rx_dma_started from uart_port structure to +stm32_port structure to match with stm32_usart_tx_dma_started. + +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-4-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index a75892980bb8..9d9b221a6f45 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -285,9 +285,9 @@ static int stm32_usart_init_rs485(struct uart_port *port, + return uart_get_rs485_mode(port); + } + +-static bool stm32_usart_rx_dma_enabled(struct uart_port *port) ++static bool stm32_usart_rx_dma_started(struct stm32_port *stm32_port) + { +- struct stm32_port *stm32_port = to_stm32_port(port); ++ struct uart_port *port = &stm32_port->port; + const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + + if (!stm32_port->rx_ch) +@@ -306,7 +306,7 @@ static bool stm32_usart_pending_rx_pio(struct uart_port *port, u32 *sr) + /* Get pending characters in RDR or FIFO */ + if (*sr & USART_SR_RXNE) { + /* Get all pending characters from the RDR or the FIFO when using interrupts */ +- if (!stm32_usart_rx_dma_enabled(port)) ++ if (!stm32_usart_rx_dma_started(stm32_port)) + return true; + + /* Handle only RX data errors when using DMA */ +@@ -451,7 +451,7 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force + u32 sr; + unsigned int size = 0; + +- if (stm32_usart_rx_dma_enabled(port) || force_dma_flush) { ++ if (stm32_usart_rx_dma_started(stm32_port) || force_dma_flush) { + rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, + stm32_port->rx_ch->cookie, + &stm32_port->rx_dma_state); +@@ -785,8 +785,8 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) + * line has been masked by HW and rx data are stacking in FIFO. + */ + if (!stm32_port->throttled) { +- if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_enabled(port)) || +- ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_enabled(port))) { ++ if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) || ++ ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) { + spin_lock(&port->lock); + size = stm32_usart_receive_chars(port, false); + uart_unlock_and_check_sysrq(port); +@@ -802,7 +802,7 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) + } + + /* Receiver timeout irq for DMA RX */ +- if (stm32_usart_rx_dma_enabled(port) && !stm32_port->throttled) { ++ if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) { + spin_lock(&port->lock); + size = stm32_usart_receive_chars(port, false); + uart_unlock_and_check_sysrq(port); +@@ -902,7 +902,7 @@ static void stm32_usart_throttle(struct uart_port *port) + * Disable DMA request line if enabled, so the RX data gets queued into the FIFO. + * Hardware flow control is triggered when RX FIFO is full. + */ +- if (stm32_usart_rx_dma_enabled(port)) ++ if (stm32_usart_rx_dma_started(stm32_port)) + stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + + stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq); diff --git a/patches.suse/serial-stm32-replace-access-to-DMAR-bit-by-dmaengine_pause-resume.patch b/patches.suse/serial-stm32-replace-access-to-DMAR-bit-by-dmaengine_pause-resume.patch new file mode 100644 index 0000000..7c13dbe --- /dev/null +++ b/patches.suse/serial-stm32-replace-access-to-DMAR-bit-by-dmaengine_pause-resume.patch @@ -0,0 +1,351 @@ +From 8372c510843eae4c1de8ac864cd0ece78dfdf889 Mon Sep 17 00:00:00 2001 +From: Valentin Caron +Date: Tue, 8 Aug 2023 18:19:05 +0200 +Subject: [PATCH] serial: stm32: replace access to DMAR bit by + dmaengine_pause/resume + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: a01ae50d7eae9e145e595b17fd16a7559e99492b + +It's rather advised to rely on DMA pause / resume instead of +clearing/setting DMA request enable bit for the same purpose. Some DMA +request/acknowledge race may encountered by doing so. We prefer to use +dmaengine_pause and resume instead to pause a dma transfer when it is +necessary. + +Create two new functions (stm32_usart_rx_dma_pause, stm32_usart_rx_dma +_resume) to handle dma error when pausing/resuming. + +And rename stm32_usart_start_rx_dma_cyclic() to +stm32_usart_rx_dma_start_or_resume() and use this function to resume an +rx dma transfer. If resume fail, stm32_usart_rx_dma_start_or_resume can +create a new transfer to continue. + +It is also safer to close DMA before reset DMAR in stm32_usart_shutdown. + +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-6-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 200 +++++++++++++++++++++------------------ + 1 file changed, 106 insertions(+), 94 deletions(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index b04375f54bdf..ca46711008ef 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -322,6 +322,22 @@ static int stm32_usart_dma_pause_resume(struct stm32_port *stm32_port, + return ret; + } + ++static int stm32_usart_rx_dma_pause(struct stm32_port *stm32_port) ++{ ++ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->rx_ch, ++ DMA_IN_PROGRESS, dmaengine_pause, ++ stm32_usart_rx_dma_started, ++ stm32_usart_rx_dma_terminate); ++} ++ ++static int stm32_usart_rx_dma_resume(struct stm32_port *stm32_port) ++{ ++ return stm32_usart_dma_pause_resume(stm32_port, stm32_port->rx_ch, ++ DMA_PAUSED, dmaengine_resume, ++ stm32_usart_rx_dma_started, ++ stm32_usart_rx_dma_terminate); ++} ++ + /* Return true when data is pending (in pio mode), and false when no data is pending. */ + static bool stm32_usart_pending_rx_pio(struct uart_port *port, u32 *sr) + { +@@ -481,7 +497,8 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force + rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, + stm32_port->rx_ch->cookie, + &stm32_port->rx_dma_state); +- if (rx_dma_status == DMA_IN_PROGRESS) { ++ if (rx_dma_status == DMA_IN_PROGRESS || ++ rx_dma_status == DMA_PAUSED) { + /* Empty DMA buffer */ + size = stm32_usart_receive_chars_dma(port); + sr = readl_relaxed(port->membase + ofs->isr); +@@ -498,7 +515,6 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force + } else { + /* Disable RX DMA */ + stm32_usart_rx_dma_terminate(stm32_port); +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + /* Fall back to interrupt mode */ + dev_dbg(port->dev, "DMA error, fallback to irq mode\n"); + size = stm32_usart_receive_chars_pio(port); +@@ -510,6 +526,76 @@ static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force + return size; + } + ++static void stm32_usart_rx_dma_complete(void *arg) ++{ ++ struct uart_port *port = arg; ++ struct tty_port *tport = &port->state->port; ++ unsigned int size; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ size = stm32_usart_receive_chars(port, false); ++ uart_unlock_and_check_sysrq_irqrestore(port, flags); ++ if (size) ++ tty_flip_buffer_push(tport); ++} ++ ++static int stm32_usart_rx_dma_start_or_resume(struct uart_port *port) ++{ ++ struct stm32_port *stm32_port = to_stm32_port(port); ++ struct dma_async_tx_descriptor *desc; ++ enum dma_status rx_dma_status; ++ int ret; ++ ++ if (stm32_port->throttled) ++ return 0; ++ ++ if (stm32_port->rx_dma_busy) { ++ rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, ++ stm32_port->rx_ch->cookie, ++ NULL); ++ if (rx_dma_status == DMA_IN_PROGRESS) ++ return 0; ++ ++ if (rx_dma_status == DMA_PAUSED && !stm32_usart_rx_dma_resume(stm32_port)) ++ return 0; ++ ++ dev_err(port->dev, "DMA failed : status error.\n"); ++ stm32_usart_rx_dma_terminate(stm32_port); ++ } ++ ++ stm32_port->rx_dma_busy = true; ++ ++ stm32_port->last_res = RX_BUF_L; ++ /* Prepare a DMA cyclic transaction */ ++ desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch, ++ stm32_port->rx_dma_buf, ++ RX_BUF_L, RX_BUF_P, ++ DMA_DEV_TO_MEM, ++ DMA_PREP_INTERRUPT); ++ if (!desc) { ++ dev_err(port->dev, "rx dma prep cyclic failed\n"); ++ stm32_port->rx_dma_busy = false; ++ return -ENODEV; ++ } ++ ++ desc->callback = stm32_usart_rx_dma_complete; ++ desc->callback_param = port; ++ ++ /* Push current DMA transaction in the pending queue */ ++ ret = dma_submit_error(dmaengine_submit(desc)); ++ if (ret) { ++ dmaengine_terminate_sync(stm32_port->rx_ch); ++ stm32_port->rx_dma_busy = false; ++ return ret; ++ } ++ ++ /* Issue pending DMA requests */ ++ dma_async_issue_pending(stm32_port->rx_ch); ++ ++ return 0; ++} ++ + static void stm32_usart_tx_dma_terminate(struct stm32_port *stm32_port) + { + dmaengine_terminate_async(stm32_port->tx_ch); +@@ -581,20 +667,6 @@ static void stm32_usart_tc_interrupt_enable(struct uart_port *port) + stm32_usart_set_bits(port, ofs->cr1, USART_CR1_TCIE); + } + +-static void stm32_usart_rx_dma_complete(void *arg) +-{ +- struct uart_port *port = arg; +- struct tty_port *tport = &port->state->port; +- unsigned int size; +- unsigned long flags; +- +- spin_lock_irqsave(&port->lock, flags); +- size = stm32_usart_receive_chars(port, false); +- uart_unlock_and_check_sysrq_irqrestore(port, flags); +- if (size) +- tty_flip_buffer_push(tport); +-} +- + static void stm32_usart_tx_interrupt_disable(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); +@@ -920,11 +992,10 @@ static void stm32_usart_throttle(struct uart_port *port) + spin_lock_irqsave(&port->lock, flags); + + /* +- * Disable DMA request line if enabled, so the RX data gets queued into the FIFO. ++ * Pause DMA transfer, so the RX data gets queued into the FIFO. + * Hardware flow control is triggered when RX FIFO is full. + */ +- if (stm32_usart_rx_dma_started(stm32_port)) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); ++ stm32_usart_rx_dma_pause(stm32_port); + + stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq); + if (stm32_port->cr3_irq) +@@ -946,14 +1017,15 @@ static void stm32_usart_unthrottle(struct uart_port *port) + if (stm32_port->cr3_irq) + stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq); + ++ stm32_port->throttled = false; ++ + /* +- * Switch back to DMA mode (re-enable DMA request line). ++ * Switch back to DMA mode (resume DMA). + * Hardware flow control is stopped when FIFO is not full any more. + */ + if (stm32_port->rx_ch) +- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR); ++ stm32_usart_rx_dma_start_or_resume(port); + +- stm32_port->throttled = false; + spin_unlock_irqrestore(&port->lock, flags); + } + +@@ -964,8 +1036,7 @@ static void stm32_usart_stop_rx(struct uart_port *port) + const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + + /* Disable DMA request line. */ +- if (stm32_port->rx_ch) +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); ++ stm32_usart_rx_dma_pause(stm32_port); + + stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq); + if (stm32_port->cr3_irq) +@@ -977,64 +1048,6 @@ static void stm32_usart_break_ctl(struct uart_port *port, int break_state) + { + } + +-static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port) +-{ +- struct stm32_port *stm32_port = to_stm32_port(port); +- const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; +- struct dma_async_tx_descriptor *desc; +- enum dma_status rx_dma_status; +- int ret; +- +- if (stm32_port->rx_dma_busy) { +- rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch, +- stm32_port->rx_ch->cookie, +- NULL); +- if (rx_dma_status == DMA_IN_PROGRESS) +- return 0; +- +- dev_err(port->dev, "DMA failed : status error.\n"); +- stm32_usart_rx_dma_terminate(stm32_port); +- } +- +- stm32_port->rx_dma_busy = true; +- +- stm32_port->last_res = RX_BUF_L; +- /* Prepare a DMA cyclic transaction */ +- desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch, +- stm32_port->rx_dma_buf, +- RX_BUF_L, RX_BUF_P, +- DMA_DEV_TO_MEM, +- DMA_PREP_INTERRUPT); +- if (!desc) { +- dev_err(port->dev, "rx dma prep cyclic failed\n"); +- stm32_port->rx_dma_busy = false; +- return -ENODEV; +- } +- +- desc->callback = stm32_usart_rx_dma_complete; +- desc->callback_param = port; +- +- /* Push current DMA transaction in the pending queue */ +- ret = dma_submit_error(dmaengine_submit(desc)); +- if (ret) { +- dmaengine_terminate_sync(stm32_port->rx_ch); +- stm32_port->rx_dma_busy = false; +- return ret; +- } +- +- /* Issue pending DMA requests */ +- dma_async_issue_pending(stm32_port->rx_ch); +- +- /* +- * DMA request line not re-enabled at resume when port is throttled. +- * It will be re-enabled by unthrottle ops. +- */ +- if (!stm32_port->throttled) +- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR); +- +- return 0; +-} +- + static int stm32_usart_startup(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); +@@ -1060,7 +1073,7 @@ static int stm32_usart_startup(struct uart_port *port) + writel_relaxed(USART_RQR_RXFRQ, port->membase + ofs->rqr); + + if (stm32_port->rx_ch) { +- ret = stm32_usart_start_rx_dma_cyclic(port); ++ ret = stm32_usart_rx_dma_start_or_resume(port); + if (ret) { + free_irq(port->irq, port); + return ret; +@@ -1807,11 +1820,6 @@ static int stm32_usart_serial_remove(struct platform_device *pdev) + pm_runtime_put_noidle(&pdev->dev); + + stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_PEIE); +- cr3 = readl_relaxed(port->membase + ofs->cr3); +- cr3 &= ~USART_CR3_EIE; +- cr3 &= ~USART_CR3_DMAR; +- cr3 &= ~USART_CR3_DDRE; +- writel_relaxed(cr3, port->membase + ofs->cr3); + + if (stm32_port->tx_ch) { + stm32_usart_of_dma_tx_remove(stm32_port, pdev); +@@ -1823,7 +1831,12 @@ static int stm32_usart_serial_remove(struct platform_device *pdev) + dma_release_channel(stm32_port->rx_ch); + } + +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); ++ cr3 = readl_relaxed(port->membase + ofs->cr3); ++ cr3 &= ~USART_CR3_EIE; ++ cr3 &= ~USART_CR3_DMAR; ++ cr3 &= ~USART_CR3_DMAT; ++ cr3 &= ~USART_CR3_DDRE; ++ writel_relaxed(cr3, port->membase + ofs->cr3); + + if (stm32_port->wakeup_src) { + dev_pm_clear_wake_irq(&pdev->dev); +@@ -1995,7 +2008,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, + const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + struct tty_port *tport = &port->state->port; + int ret; +- unsigned int size; ++ unsigned int size = 0; + unsigned long flags; + + if (!stm32_port->wakeup_src || !tty_port_initialized(tport)) +@@ -2017,10 +2030,9 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, + */ + if (stm32_port->rx_ch) { + spin_lock_irqsave(&port->lock, flags); +- /* Avoid race with RX IRQ when DMAR is cleared */ +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR); + /* Poll data from DMA RX buffer if any */ +- size = stm32_usart_receive_chars(port, true); ++ if (!stm32_usart_rx_dma_pause(stm32_port)) ++ size += stm32_usart_receive_chars(port, true); + stm32_usart_rx_dma_terminate(stm32_port); + uart_unlock_and_check_sysrq_irqrestore(port, flags); + if (size) +@@ -2031,7 +2043,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, + stm32_usart_receive_chars(port, false); + } else { + if (stm32_port->rx_ch) { +- ret = stm32_usart_start_rx_dma_cyclic(port); ++ ret = stm32_usart_rx_dma_start_or_resume(port); + if (ret) + return ret; + } diff --git a/patches.suse/serial-stm32-synchronize-RX-DMA-channel-in-shutdown.patch b/patches.suse/serial-stm32-synchronize-RX-DMA-channel-in-shutdown.patch new file mode 100644 index 0000000..d361fb1 --- /dev/null +++ b/patches.suse/serial-stm32-synchronize-RX-DMA-channel-in-shutdown.patch @@ -0,0 +1,40 @@ +From 7e09080c4e3dd47b823e19319be6538250554b17 Mon Sep 17 00:00:00 2001 +From: Amelie Delaunay +Date: Tue, 8 Aug 2023 18:19:06 +0200 +Subject: [PATCH] serial: stm32: synchronize RX DMA channel in shutdown + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 2490a0ca5735714bd2ba8ba8a41fa9343b422113 + +In shutdown, RX DMA channel is terminated. If the DMA RX callback is +scheduled but not yet executed, while a new RX DMA transfer is started, the +callback can be executed, and then disturb the ongoing RX DMA transfer. +To avoid such a case, call dmaengine_synchronize in shutdown, after the +DMA RX channel is terminated. + +Signed-off-by: Amelie Delaunay +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-7-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index ca46711008ef..b6f4f436a565 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -1119,8 +1119,10 @@ static void stm32_usart_shutdown(struct uart_port *port) + dev_err(port->dev, "Transmission is not complete\n"); + + /* Disable RX DMA. */ +- if (stm32_port->rx_ch) ++ if (stm32_port->rx_ch) { + stm32_usart_rx_dma_terminate(stm32_port); ++ dmaengine_synchronize(stm32_port->rx_ch); ++ } + + /* flush RX & TX FIFO */ + if (ofs->rqr != UNDEF_REG) diff --git a/patches.suse/serial-stm32-use-DMAT-as-a-configuration-bit.patch b/patches.suse/serial-stm32-use-DMAT-as-a-configuration-bit.patch new file mode 100644 index 0000000..f386241 --- /dev/null +++ b/patches.suse/serial-stm32-use-DMAT-as-a-configuration-bit.patch @@ -0,0 +1,65 @@ +From a0f0f397c0b410b5736ca24285300c559b982087 Mon Sep 17 00:00:00 2001 +From: Valentin Caron +Date: Tue, 8 Aug 2023 18:19:02 +0200 +Subject: [PATCH] serial: stm32: use DMAT as a configuration bit + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 00bc5e8fc91743753a3ac9de1e9567e844ae3967 + +DMAT is a configuration bit so it should be set at the startup of uart +port and not when a DMA transfer begins. + +This patch move set of DMAT into set_termios and remove DMAT reset except +in shutdown. + +Signed-off-by: Valentin Caron +Link: https://lore.kernel.org/r/20230808161906.178996-3-valentin.caron@foss.st.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/stm32-usart.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index 1762b2c62278..a75892980bb8 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -506,10 +506,8 @@ static void stm32_usart_tx_dma_complete(void *arg) + { + struct uart_port *port = arg; + struct stm32_port *stm32port = to_stm32_port(port); +- const struct stm32_usart_offsets *ofs = &stm32port->info->ofs; + unsigned long flags; + +- stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); + stm32_usart_tx_dma_terminate(stm32port); + + /* Let's see if we have pending data to send */ +@@ -598,7 +596,6 @@ static void stm32_usart_transmit_chars_pio(struct uart_port *port) + static void stm32_usart_transmit_chars_dma(struct uart_port *port) + { + struct stm32_port *stm32port = to_stm32_port(port); +- const struct stm32_usart_offsets *ofs = &stm32port->info->ofs; + struct circ_buf *xmit = &port->state->xmit; + struct dma_async_tx_descriptor *desc = NULL; + unsigned int count; +@@ -663,8 +660,6 @@ static void stm32_usart_transmit_chars_dma(struct uart_port *port) + /* Issue pending DMA TX requests */ + dma_async_issue_pending(stm32port->tx_ch); + +- stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT); +- + uart_xmit_advance(port, count); + + return; +@@ -1266,6 +1261,9 @@ static void stm32_usart_set_termios(struct uart_port *port, + cr3 |= USART_CR3_DDRE; + } + ++ if (stm32_port->tx_ch) ++ cr3 |= USART_CR3_DMAT; ++ + if (rs485conf->flags & SER_RS485_ENABLED) { + stm32_usart_config_reg_rs485(&cr1, &cr3, + rs485conf->delay_rts_before_send, diff --git a/patches.suse/serial-tegra-Don-t-print-error-on-probe-deferral.patch b/patches.suse/serial-tegra-Don-t-print-error-on-probe-deferral.patch new file mode 100644 index 0000000..ff48504 --- /dev/null +++ b/patches.suse/serial-tegra-Don-t-print-error-on-probe-deferral.patch @@ -0,0 +1,44 @@ +From e654710b5ab4f7a02453f1b8955eb40e20053a2b Mon Sep 17 00:00:00 2001 +From: Jon Hunter +Date: Mon, 3 Jul 2023 12:37:59 +0100 +Subject: [PATCH] serial: tegra: Don't print error on probe deferral + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: ad4484afe7de7869248b7c7a8e9722a62cb72bd0 + +If the Tegra serial driver is probe before clocks are available then the +following error is seen on boot: + + serial-tegra 3100000.serial: Couldn't get the clock + +This has been observed on Jetson AGX Orin. Fix this by calling +dev_err_probe() instead of dev_err() to avoid printing an error on probe +deferral. + +Signed-off-by: Jon Hunter +Acked-by: Thierry Reding +Link: https://lore.kernel.org/r/20230703113759.75608-1-jonathanh@nvidia.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/serial-tegra.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c +index 1d1f79cf337d..55f04e49ee90 100644 +--- a/drivers/tty/serial/serial-tegra.c ++++ b/drivers/tty/serial/serial-tegra.c +@@ -1593,10 +1593,8 @@ static int tegra_uart_probe(struct platform_device *pdev) + return PTR_ERR(u->membase); + + tup->uart_clk = devm_clk_get(&pdev->dev, NULL); +- if (IS_ERR(tup->uart_clk)) { +- dev_err(&pdev->dev, "Couldn't get the clock\n"); +- return PTR_ERR(tup->uart_clk); +- } ++ if (IS_ERR(tup->uart_clk)) ++ return dev_err_probe(&pdev->dev, PTR_ERR(tup->uart_clk), "Couldn't get the clock"); + + tup->rst = devm_reset_control_get_exclusive(&pdev->dev, "serial"); + if (IS_ERR(tup->rst)) { diff --git a/patches.suse/serial-tegra-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-tegra-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..4c88db5 --- /dev/null +++ b/patches.suse/serial-tegra-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,44 @@ +From 7d2c63cdfcb7d2b64b818ccf2abe74a2b9f9cd60 Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:43 +0800 +Subject: [PATCH] serial: tegra: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: f9061d3b7899e946f0db6ef7b727c40c01cfbd45 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-5-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/serial-tegra.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c +index 55f04e49ee90..d4ec943cb8e9 100644 +--- a/drivers/tty/serial/serial-tegra.c ++++ b/drivers/tty/serial/serial-tegra.c +@@ -1581,16 +1581,11 @@ static int tegra_uart_probe(struct platform_device *pdev) + tup->cdata = cdata; + + platform_set_drvdata(pdev, tup); +- resource = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (!resource) { +- dev_err(&pdev->dev, "No IO memory resource\n"); +- return -ENODEV; +- } + +- u->mapbase = resource->start; +- u->membase = devm_ioremap_resource(&pdev->dev, resource); ++ u->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &resource); + if (IS_ERR(u->membase)) + return PTR_ERR(u->membase); ++ u->mapbase = resource->start; + + tup->uart_clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(tup->uart_clk)) diff --git a/patches.suse/serial-vt8500-Use-devm_platform_get_and_ioremap_resource.patch b/patches.suse/serial-vt8500-Use-devm_platform_get_and_ioremap_resource.patch new file mode 100644 index 0000000..9294d3b --- /dev/null +++ b/patches.suse/serial-vt8500-Use-devm_platform_get_and_ioremap_resource.patch @@ -0,0 +1,45 @@ +From 457fcdad8947b158c31a0b2c0f9dfce2de37991f Mon Sep 17 00:00:00 2001 +From: Yangtao Li +Date: Wed, 12 Jul 2023 14:28:46 +0800 +Subject: [PATCH] serial: vt8500: Use devm_platform_get_and_ioremap_resource() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 0548688dfa3aeeefc28b1603fe9d004de119dd10 + +Convert platform_get_resource(), devm_ioremap_resource() to a single +call to devm_platform_get_and_ioremap_resource(), as this is exactly +what this function does. + +Signed-off-by: Yangtao Li +Link: https://lore.kernel.org/r/20230712062853.11007-8-frank.li@vivo.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/vt8500_serial.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/drivers/tty/serial/vt8500_serial.c b/drivers/tty/serial/vt8500_serial.c +index 32433e9b3e5f..c5d5c2765119 100644 +--- a/drivers/tty/serial/vt8500_serial.c ++++ b/drivers/tty/serial/vt8500_serial.c +@@ -611,10 +611,6 @@ static int vt8500_serial_probe(struct platform_device *pdev) + if (!flags) + return -EINVAL; + +- mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (!mmres) +- return -ENODEV; +- + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; +@@ -647,7 +643,7 @@ static int vt8500_serial_probe(struct platform_device *pdev) + if (!vt8500_port) + return -ENOMEM; + +- vt8500_port->uart.membase = devm_ioremap_resource(&pdev->dev, mmres); ++ vt8500_port->uart.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mmres); + if (IS_ERR(vt8500_port->uart.membase)) + return PTR_ERR(vt8500_port->uart.membase); + diff --git a/patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch b/patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch index b3d3115..8dba57c 100644 --- a/patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch +++ b/patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch @@ -1,11 +1,11 @@ -From 62286ce0028c81d57c3bf67c6e853b7dc9d574e3 Mon Sep 17 00:00:00 2001 +From 5a41940fa19445b2568a6256f1a4b3975ae7aa6e Mon Sep 17 00:00:00 2001 From: "Jiri Slaby (SUSE)" -Date: Tue, 19 Sep 2023 10:51:55 +0200 +Date: Tue, 19 Sep 2023 09:51:55 +0100 Subject: [PATCH] tty: don't check for signal_pending() in send_break() References: bsc#1214683 (PREEMPT_RT prerequisite backports) Patch-mainline: v6.6.14 -Git-commit: eefdb1be0c8be48d260787a0aa404deef790dac9 +Git-commit: fd99392b643b824813df2edbaebe26a2136d31e6 [ Upstream commit fd99392b643b824813df2edbaebe26a2136d31e6 ] @@ -18,6 +18,7 @@ Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") Signed-off-by: Sasha Levin Signed-off-by: Mel Gorman + --- drivers/tty/tty_io.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch b/patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch index d99ffb4..1e90e94 100644 --- a/patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch +++ b/patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch @@ -6,7 +6,7 @@ Subject: [PATCH] tty: early return from send_break() on References: bsc#1214683 (PREEMPT_RT prerequisite backports) Patch-mainline: v6.6.14 -Git-commit: ecf27e4765875ca24ee2fd02edb90290f0e9dd8e +Git-commit: 66619686d187b4a6395316b7f39881e945dce4bc [ Upstream commit 66619686d187b4a6395316b7f39881e945dce4bc ] diff --git a/patches.suse/tty-serial-fsl_lpuart-add-IDLE-interrupt-support-for-rx_dma-on-imx7ulp-imx8ulp-imx8qxp.patch b/patches.suse/tty-serial-fsl_lpuart-add-IDLE-interrupt-support-for-rx_dma-on-imx7ulp-imx8ulp-imx8qxp.patch new file mode 100644 index 0000000..80f66f5 --- /dev/null +++ b/patches.suse/tty-serial-fsl_lpuart-add-IDLE-interrupt-support-for-rx_dma-on-imx7ulp-imx8ulp-imx8qxp.patch @@ -0,0 +1,128 @@ +From 47af7c8464a1f0cf9f86c37a411db5f774e34558 Mon Sep 17 00:00:00 2001 +From: Sherry Sun +Date: Mon, 10 Jul 2023 09:38:57 +0800 +Subject: [PATCH] tty: serial: fsl_lpuart: add IDLE interrupt support for + rx_dma on imx7ulp/imx8ulp/imx8qxp + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: d9219528fab995c7cae79313867a8a92ee8e1f28 + +Add IDLE interrupt support for receive dma on imx7ulp/imx8ulp/imx8qxp +platforms to replace the receive dma timer function, because the receive +dma timer has bigger latency than idle interrupt triggering, which may +cause the Bluetooth Firmware download timeout on Android platform(it +has a limited FW download time window). + +Signed-off-by: Sherry Sun +Link: https://lore.kernel.org/r/20230710013857.7396-3-sherry.sun@nxp.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/fsl_lpuart.c | 44 +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 42 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index cf0047cd5d84..4175502b9460 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -288,6 +288,7 @@ struct lpuart_port { + wait_queue_head_t dma_wait; + bool is_cs7; /* Set to true when character size is 7 */ + /* and the parity is enabled */ ++ bool dma_idle_int; + }; + + struct lpuart_soc_data { +@@ -1246,7 +1247,8 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport) + spin_unlock_irqrestore(&sport->port.lock, flags); + + tty_flip_buffer_push(port); +- mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout); ++ if (!sport->dma_idle_int) ++ mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout); + } + + static void lpuart_dma_rx_complete(void *arg) +@@ -1256,6 +1258,28 @@ static void lpuart_dma_rx_complete(void *arg) + lpuart_copy_rx_to_tty(sport); + } + ++static void lpuart32_dma_idleint(struct lpuart_port *sport) ++{ ++ enum dma_status dmastat; ++ struct dma_chan *chan = sport->dma_rx_chan; ++ struct circ_buf *ring = &sport->rx_ring; ++ struct dma_tx_state state; ++ int count = 0; ++ ++ dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state); ++ if (dmastat == DMA_ERROR) { ++ dev_err(sport->port.dev, "Rx DMA transfer failed!\n"); ++ return; ++ } ++ ++ ring->head = sport->rx_sgl.length - state.residue; ++ count = CIRC_CNT(ring->head, ring->tail, sport->rx_sgl.length); ++ ++ /* Check if new data received before copying */ ++ if (count) ++ lpuart_copy_rx_to_tty(sport); ++} ++ + static irqreturn_t lpuart32_int(int irq, void *dev_id) + { + struct lpuart_port *sport = dev_id; +@@ -1271,6 +1295,9 @@ static irqreturn_t lpuart32_int(int irq, void *dev_id) + if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use) + lpuart32_txint(sport); + ++ if ((sts & UARTSTAT_IDLE) && sport->lpuart_dma_rx_use && sport->dma_idle_int) ++ lpuart32_dma_idleint(sport); ++ + lpuart32_write(&sport->port, sts, UARTSTAT); + return IRQ_HANDLED; + } +@@ -1391,6 +1418,12 @@ static inline int lpuart_start_rx_dma(struct lpuart_port *sport) + unsigned long temp = lpuart32_read(&sport->port, UARTBAUD); + + lpuart32_write(&sport->port, temp | UARTBAUD_RDMAE, UARTBAUD); ++ ++ if (sport->dma_idle_int) { ++ unsigned long ctrl = lpuart32_read(&sport->port, UARTCTRL); ++ ++ lpuart32_write(&sport->port, ctrl | UARTCTRL_ILIE, UARTCTRL); ++ } + } else { + writeb(readb(sport->port.membase + UARTCR5) | UARTCR5_RDMAS, + sport->port.membase + UARTCR5); +@@ -1406,7 +1439,9 @@ static void lpuart_dma_rx_free(struct uart_port *port) + struct dma_chan *chan = sport->dma_rx_chan; + + dmaengine_terminate_sync(chan); +- del_timer_sync(&sport->lpuart_timer); ++ if (!sport->dma_idle_int) ++ del_timer_sync(&sport->lpuart_timer); ++ + dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE); + kfree(sport->rx_ring.buf); + sport->rx_ring.tail = 0; +@@ -1668,6 +1703,9 @@ static void lpuart32_setup_watermark_enable(struct lpuart_port *sport) + + static void rx_dma_timer_init(struct lpuart_port *sport) + { ++ if (sport->dma_idle_int) ++ return; ++ + timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0); + sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout; + add_timer(&sport->lpuart_timer); +@@ -2824,6 +2862,8 @@ static int lpuart_probe(struct platform_device *pdev) + sport->port.type = PORT_LPUART; + sport->devtype = sdata->devtype; + sport->rx_watermark = sdata->rx_watermark; ++ sport->dma_idle_int = is_imx7ulp_lpuart(sport) || is_imx8ulp_lpuart(sport) || ++ is_imx8qxp_lpuart(sport); + ret = platform_get_irq(pdev, 0); + if (ret < 0) + return ret; diff --git a/patches.suse/tty-serial-fsl_lpuart-move-the-lpuart32_int-below.patch b/patches.suse/tty-serial-fsl_lpuart-move-the-lpuart32_int-below.patch new file mode 100644 index 0000000..db6b086 --- /dev/null +++ b/patches.suse/tty-serial-fsl_lpuart-move-the-lpuart32_int-below.patch @@ -0,0 +1,78 @@ +From 6597e38c4be08a38e2dd1920277b27fb79a3f39c Mon Sep 17 00:00:00 2001 +From: Sherry Sun +Date: Mon, 10 Jul 2023 09:38:56 +0800 +Subject: [PATCH] tty: serial: fsl_lpuart: move the lpuart32_int() below + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 9cb31a2824f9399930ef0c9c449cec258bac66e4 + +Move the lpuart32_int() below lpuart_copy_rx_to_tty(), this is a +preparation patch for the next patch to avoid the function declaration, +no actual functional changes. + +Signed-off-by: Sherry Sun +Link: https://lore.kernel.org/r/20230710013857.7396-2-sherry.sun@nxp.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/fsl_lpuart.c | 39 +++++++++++++++++++-------------------- + 1 file changed, 19 insertions(+), 20 deletions(-) + +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index 2e4a35adfcde..cf0047cd5d84 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -1064,26 +1064,6 @@ static irqreturn_t lpuart_int(int irq, void *dev_id) + return IRQ_HANDLED; + } + +-static irqreturn_t lpuart32_int(int irq, void *dev_id) +-{ +- struct lpuart_port *sport = dev_id; +- unsigned long sts, rxcount; +- +- sts = lpuart32_read(&sport->port, UARTSTAT); +- rxcount = lpuart32_read(&sport->port, UARTWATER); +- rxcount = rxcount >> UARTWATER_RXCNT_OFF; +- +- if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use) +- lpuart32_rxint(sport); +- +- if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use) +- lpuart32_txint(sport); +- +- lpuart32_write(&sport->port, sts, UARTSTAT); +- return IRQ_HANDLED; +-} +- +- + static inline void lpuart_handle_sysrq_chars(struct uart_port *port, + unsigned char *p, int count) + { +@@ -1276,6 +1256,25 @@ static void lpuart_dma_rx_complete(void *arg) + lpuart_copy_rx_to_tty(sport); + } + ++static irqreturn_t lpuart32_int(int irq, void *dev_id) ++{ ++ struct lpuart_port *sport = dev_id; ++ unsigned long sts, rxcount; ++ ++ sts = lpuart32_read(&sport->port, UARTSTAT); ++ rxcount = lpuart32_read(&sport->port, UARTWATER); ++ rxcount = rxcount >> UARTWATER_RXCNT_OFF; ++ ++ if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use) ++ lpuart32_rxint(sport); ++ ++ if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use) ++ lpuart32_txint(sport); ++ ++ lpuart32_write(&sport->port, sts, UARTSTAT); ++ return IRQ_HANDLED; ++} ++ + /* + * Timer function to simulate the hardware EOP (End Of Package) event. + * The timer callback is to check for new RX data and copy to TTY buffer. diff --git a/patches.suse/tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch b/patches.suse/tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch new file mode 100644 index 0000000..1b27f9b --- /dev/null +++ b/patches.suse/tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch @@ -0,0 +1,34 @@ +From be7cad8cc851e35df1a2a61715e4df8a4e5d32c6 Mon Sep 17 00:00:00 2001 +From: Lucas Tanure +Date: Mon, 14 Aug 2023 09:01:28 +0100 +Subject: [PATCH] tty: serial: meson: Add a earlycon for the T7 SoC + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 6a4197f9763325043abf7690a21124a9facbf52e + +The new Amlogic T7 SoC does not have a always-on uart, +so add OF_EARLYCON_DECLARE for it. + +Signed-off-by: Lucas Tanure +Acked-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230814080128.143613-2-tanure@linux.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 9388b9ddea3b..ad1079ca0e00 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -652,6 +652,8 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt + + OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + meson_serial_early_console_setup); ++OF_EARLYCON_DECLARE(meson, "amlogic,t7-uart", ++ meson_serial_early_console_setup); + + #define MESON_SERIAL_CONSOLE_PTR(_devname) (&meson_serial_console_##_devname) + #else diff --git a/patches.suse/tty-serial-meson-add-independent-uart_data-for-A1-SoC-family.patch b/patches.suse/tty-serial-meson-add-independent-uart_data-for-A1-SoC-family.patch new file mode 100644 index 0000000..da99f09 --- /dev/null +++ b/patches.suse/tty-serial-meson-add-independent-uart_data-for-A1-SoC-family.patch @@ -0,0 +1,50 @@ +From e123c91dfd5ab14f92c541a933ee44a33d973477 Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Wed, 5 Jul 2023 21:18:31 +0300 +Subject: [PATCH] tty: serial: meson: add independent uart_data for A1 SoC + family + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 5651f657097c1ad9674651bee91425a8bb9d5b9a + +Implement separate uart_data to ensure proper devname value for the A1 +SoC family. Use 'ttyS' devname, as required by the A1 architecture, +instead of the legacy gx architecture. + +Signed-off-by: Dmitry Rokosov +Reviewed-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230705181833.16137-6-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index b6a0ca648e3e..5ac1dd69b774 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -826,6 +826,11 @@ static struct meson_uart_data meson_g12a_uart_data = { + .has_xtal_div2 = true, + }; + ++static struct meson_uart_data meson_a1_uart_data = { ++ .uart_driver = &MESON_UART_DRIVER(ttyS), ++ .has_xtal_div2 = false, ++}; ++ + static struct meson_uart_data meson_s4_uart_data = { + .uart_driver = &MESON_UART_DRIVER(ttyS), + .has_xtal_div2 = true, +@@ -844,6 +849,10 @@ static const struct of_device_id meson_uart_dt_match[] = { + .compatible = "amlogic,meson-s4-uart", + .data = (void *)&meson_s4_uart_data, + }, ++ { ++ .compatible = "amlogic,meson-a1-uart", ++ .data = (void *)&meson_a1_uart_data, ++ }, + { /* sentinel */ }, + }; + MODULE_DEVICE_TABLE(of, meson_uart_dt_match); diff --git a/patches.suse/tty-serial-meson-apply-ttyS-devname-instead-of-ttyAML-for-new-SoCs.patch b/patches.suse/tty-serial-meson-apply-ttyS-devname-instead-of-ttyAML-for-new-SoCs.patch new file mode 100644 index 0000000..d3f4a84 --- /dev/null +++ b/patches.suse/tty-serial-meson-apply-ttyS-devname-instead-of-ttyAML-for-new-SoCs.patch @@ -0,0 +1,195 @@ +From 4d6a580fdd76a6e6d63adb15ac025f69f5ab0e8a Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Wed, 5 Jul 2023 21:18:29 +0300 +Subject: [PATCH] tty: serial: meson: apply ttyS devname instead of ttyAML for + new SoCs + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: e71aab9d613242bbb262f2344e377ecbc892df41 + +It is worth noting that the devname ttyS is a widely recognized tty name +and is commonly used by many uart device drivers. Given the established +usage and compatibility concerns, it may not be feasible to change the +devname for older SoCs. However, for new definitions, it is acceptable +and even recommended to use a new devname to help ensure clarity and +avoid any potential conflicts on lower or upper software levels. + +For more information please refer to IRC discussion at [1]. + +Links: + [1]: https://libera.irclog.whitequark.org/linux-amlogic/2023-07-03 + +Signed-off-by: Dmitry Rokosov +Link: https://lore.kernel.org/r/20230705181833.16137-4-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 82 ++++++++++++++++++++++++++++------------- + 1 file changed, 56 insertions(+), 26 deletions(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 523361569cb3..421706e10ebf 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -72,16 +72,22 @@ + + #define AML_UART_PORT_NUM 12 + #define AML_UART_PORT_OFFSET 6 +-#define AML_UART_DEV_NAME "ttyAML" + + #define AML_UART_POLL_USEC 5 + #define AML_UART_TIMEOUT_USEC 10000 + +-static struct uart_driver meson_uart_driver; ++#define MESON_UART_DRIVER(_devname) meson_uart_driver_##_devname ++ ++#define MESON_UART_DRIVER_DECLARE(_devname) \ ++ static struct uart_driver MESON_UART_DRIVER(_devname) ++ ++MESON_UART_DRIVER_DECLARE(ttyAML); ++MESON_UART_DRIVER_DECLARE(ttyS); + + static struct uart_port *meson_ports[AML_UART_PORT_NUM]; + + struct meson_uart_data { ++ struct uart_driver *uart_driver; + bool has_xtal_div2; + }; + +@@ -615,15 +621,21 @@ static int meson_serial_console_setup(struct console *co, char *options) + return uart_set_options(port, co, baud, parity, bits, flow); + } + +-static struct console meson_serial_console = { +- .name = AML_UART_DEV_NAME, +- .write = meson_serial_console_write, +- .device = uart_console_device, +- .setup = meson_serial_console_setup, +- .flags = CON_PRINTBUFFER, +- .index = -1, +- .data = &meson_uart_driver, +-}; ++#define MESON_SERIAL_CONSOLE(_devname) meson_serial_console_##_devname ++ ++#define MESON_SERIAL_CONSOLE_DEFINE(_devname) \ ++ static struct console MESON_SERIAL_CONSOLE(_devname) = { \ ++ .name = __stringify(_devname), \ ++ .write = meson_serial_console_write, \ ++ .device = uart_console_device, \ ++ .setup = meson_serial_console_setup, \ ++ .flags = CON_PRINTBUFFER, \ ++ .index = -1, \ ++ .data = &MESON_UART_DRIVER(_devname), \ ++ } ++ ++MESON_SERIAL_CONSOLE_DEFINE(ttyAML); ++MESON_SERIAL_CONSOLE_DEFINE(ttyS); + + static void meson_serial_early_console_write(struct console *co, + const char *s, +@@ -648,18 +660,22 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt + OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + meson_serial_early_console_setup); + +-#define MESON_SERIAL_CONSOLE (&meson_serial_console) ++#define MESON_SERIAL_CONSOLE_PTR(_devname) (&MESON_SERIAL_CONSOLE(_devname)) + #else +-#define MESON_SERIAL_CONSOLE NULL ++#define MESON_SERIAL_CONSOLE_PTR(_devname) (NULL) + #endif + +-static struct uart_driver meson_uart_driver = { +- .owner = THIS_MODULE, +- .driver_name = "meson_uart", +- .dev_name = AML_UART_DEV_NAME, +- .nr = AML_UART_PORT_NUM, +- .cons = MESON_SERIAL_CONSOLE, +-}; ++#define MESON_UART_DRIVER_DEFINE(_devname) \ ++ static struct uart_driver MESON_UART_DRIVER(_devname) = { \ ++ .owner = THIS_MODULE, \ ++ .driver_name = "meson_uart", \ ++ .dev_name = __stringify(_devname), \ ++ .nr = AML_UART_PORT_NUM, \ ++ .cons = MESON_SERIAL_CONSOLE_PTR(_devname), \ ++ } ++ ++MESON_UART_DRIVER_DEFINE(ttyAML); ++MESON_UART_DRIVER_DEFINE(ttyS); + + static int meson_uart_probe_clocks(struct platform_device *pdev, + struct uart_port *port) +@@ -685,8 +701,16 @@ static int meson_uart_probe_clocks(struct platform_device *pdev, + return 0; + } + ++static struct uart_driver *meson_uart_current(const struct meson_uart_data *pd) ++{ ++ return (pd && pd->uart_driver) ? ++ pd->uart_driver : &MESON_UART_DRIVER(ttyAML); ++} ++ + static int meson_uart_probe(struct platform_device *pdev) + { ++ const struct meson_uart_data *priv_data; ++ struct uart_driver *uart_driver; + struct resource *res_mem; + struct uart_port *port; + u32 fifosize = 64; /* Default is 64, 128 for EE UART_0 */ +@@ -735,8 +759,12 @@ static int meson_uart_probe(struct platform_device *pdev) + if (ret) + return ret; + +- if (!meson_uart_driver.state) { +- ret = uart_register_driver(&meson_uart_driver); ++ priv_data = device_get_match_data(&pdev->dev); ++ ++ uart_driver = meson_uart_current(priv_data); ++ ++ if (!uart_driver->state) { ++ ret = uart_register_driver(uart_driver); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "can't register uart driver\n"); +@@ -756,7 +784,7 @@ static int meson_uart_probe(struct platform_device *pdev) + port->x_char = 0; + port->ops = &meson_uart_ops; + port->fifosize = fifosize; +- port->private_data = (void *)device_get_match_data(&pdev->dev); ++ port->private_data = (void *)priv_data; + + meson_ports[pdev->id] = port; + platform_set_drvdata(pdev, port); +@@ -767,7 +795,7 @@ static int meson_uart_probe(struct platform_device *pdev) + meson_uart_release_port(port); + } + +- ret = uart_add_one_port(&meson_uart_driver, port); ++ ret = uart_add_one_port(uart_driver, port); + if (ret) + meson_ports[pdev->id] = NULL; + +@@ -776,10 +804,12 @@ static int meson_uart_probe(struct platform_device *pdev) + + static int meson_uart_remove(struct platform_device *pdev) + { ++ struct uart_driver *uart_driver; + struct uart_port *port; + + port = platform_get_drvdata(pdev); +- uart_remove_one_port(&meson_uart_driver, port); ++ uart_driver = meson_uart_current(port->private_data); ++ uart_remove_one_port(uart_driver, port); + meson_ports[pdev->id] = NULL; + + for (int id = 0; id < AML_UART_PORT_NUM; id++) +@@ -787,7 +817,7 @@ static int meson_uart_remove(struct platform_device *pdev) + return 0; + + /* No more available uart ports, unregister uart driver */ +- uart_unregister_driver(&meson_uart_driver); ++ uart_unregister_driver(uart_driver); + + return 0; + } diff --git a/patches.suse/tty-serial-meson-introduce-separate-uart_data-for-S4-SoC-family.patch b/patches.suse/tty-serial-meson-introduce-separate-uart_data-for-S4-SoC-family.patch new file mode 100644 index 0000000..1be2060 --- /dev/null +++ b/patches.suse/tty-serial-meson-introduce-separate-uart_data-for-S4-SoC-family.patch @@ -0,0 +1,49 @@ +From f9a4a43d7ec6cb111dd3901a0a39a024e27388ed Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Wed, 5 Jul 2023 21:18:30 +0300 +Subject: [PATCH] tty: serial: meson: introduce separate uart_data for S4 SoC + family + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: bd86980b5113e3bf59ad096c49bf5c39dbca8880 + +In order to use the correct devname value for the S4 SoC family, it +is imperative that we implement separate uart_data. Unlike the legacy +g12a architecture, the S4 architecture should employ the use of 'ttyS' +devname. + +Signed-off-by: Dmitry Rokosov +Reviewed-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230705181833.16137-5-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 421706e10ebf..b6a0ca648e3e 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -826,6 +826,11 @@ static struct meson_uart_data meson_g12a_uart_data = { + .has_xtal_div2 = true, + }; + ++static struct meson_uart_data meson_s4_uart_data = { ++ .uart_driver = &MESON_UART_DRIVER(ttyS), ++ .has_xtal_div2 = true, ++}; ++ + static const struct of_device_id meson_uart_dt_match[] = { + { .compatible = "amlogic,meson6-uart" }, + { .compatible = "amlogic,meson8-uart" }, +@@ -837,7 +842,7 @@ static const struct of_device_id meson_uart_dt_match[] = { + }, + { + .compatible = "amlogic,meson-s4-uart", +- .data = (void *)&meson_g12a_uart_data, ++ .data = (void *)&meson_s4_uart_data, + }, + { /* sentinel */ }, + }; diff --git a/patches.suse/tty-serial-meson-redesign-the-module-to-platform_driver.patch b/patches.suse/tty-serial-meson-redesign-the-module-to-platform_driver.patch new file mode 100644 index 0000000..3c2d85b --- /dev/null +++ b/patches.suse/tty-serial-meson-redesign-the-module-to-platform_driver.patch @@ -0,0 +1,119 @@ +From e8df9fc9b64087f1230ae8dbb97f52541a0c927d Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Wed, 5 Jul 2023 21:18:28 +0300 +Subject: [PATCH] tty: serial: meson: redesign the module to platform_driver + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: bcb5645f99ef93b3cad3cdb7937eb4b2cecfd560 + +Actually, the meson_uart module is already a platform_driver, but it is +currently registered manually and the uart core registration is run +outside the probe() scope, which results in some restrictions. For +instance, it is not possible to communicate with the OF subsystem +because it requires an initialized device object. + +To address this issue, apply module_platform_driver() instead of direct +module init/exit routines. Additionally, move uart_register_driver() to +the driver probe(), and destroy manual console registration because it's +already run in the uart_register_driver() flow. + +Signed-off-by: Dmitry Rokosov +Reviewed-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230705181833.16137-3-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 51 ++++++++++++----------------------------- + 1 file changed, 15 insertions(+), 36 deletions(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 0f6157c8be89..523361569cb3 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -625,12 +625,6 @@ static struct console meson_serial_console = { + .data = &meson_uart_driver, + }; + +-static int __init meson_serial_console_init(void) +-{ +- register_console(&meson_serial_console); +- return 0; +-} +- + static void meson_serial_early_console_write(struct console *co, + const char *s, + u_int count) +@@ -656,9 +650,6 @@ OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + + #define MESON_SERIAL_CONSOLE (&meson_serial_console) + #else +-static int __init meson_serial_console_init(void) { +- return 0; +-} + #define MESON_SERIAL_CONSOLE NULL + #endif + +@@ -744,6 +735,13 @@ static int meson_uart_probe(struct platform_device *pdev) + if (ret) + return ret; + ++ if (!meson_uart_driver.state) { ++ ret = uart_register_driver(&meson_uart_driver); ++ if (ret) ++ return dev_err_probe(&pdev->dev, ret, ++ "can't register uart driver\n"); ++ } ++ + port->iotype = UPIO_MEM; + port->mapbase = res_mem->start; + port->mapsize = resource_size(res_mem); +@@ -784,6 +782,13 @@ static int meson_uart_remove(struct platform_device *pdev) + uart_remove_one_port(&meson_uart_driver, port); + meson_ports[pdev->id] = NULL; + ++ for (int id = 0; id < AML_UART_PORT_NUM; id++) ++ if (meson_ports[id]) ++ return 0; ++ ++ /* No more available uart ports, unregister uart driver */ ++ uart_unregister_driver(&meson_uart_driver); ++ + return 0; + } + +@@ -817,33 +822,7 @@ static struct platform_driver meson_uart_platform_driver = { + }, + }; + +-static int __init meson_uart_init(void) +-{ +- int ret; +- +- ret = meson_serial_console_init(); +- if (ret) +- return ret; +- +- ret = uart_register_driver(&meson_uart_driver); +- if (ret) +- return ret; +- +- ret = platform_driver_register(&meson_uart_platform_driver); +- if (ret) +- uart_unregister_driver(&meson_uart_driver); +- +- return ret; +-} +- +-static void __exit meson_uart_exit(void) +-{ +- platform_driver_unregister(&meson_uart_platform_driver); +- uart_unregister_driver(&meson_uart_driver); +-} +- +-module_init(meson_uart_init); +-module_exit(meson_uart_exit); ++module_platform_driver(meson_uart_platform_driver); + + MODULE_AUTHOR("Carlo Caione "); + MODULE_DESCRIPTION("Amlogic Meson serial port driver"); diff --git a/patches.suse/tty-serial-meson-refactor-objects-definition-for-different-devnames.patch b/patches.suse/tty-serial-meson-refactor-objects-definition-for-different-devnames.patch new file mode 100644 index 0000000..10347e4 --- /dev/null +++ b/patches.suse/tty-serial-meson-refactor-objects-definition-for-different-devnames.patch @@ -0,0 +1,127 @@ +From dc82ab31314eaed5e6e4363775fb7dfd85824498 Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Fri, 28 Jul 2023 10:15:22 +0300 +Subject: [PATCH] tty: serial: meson: refactor objects definition for different + devnames + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 17be181b061b4b7b72d4ffb856d94a356592bfd7 + +Macroses for name generation are not useful. They hide the real place +for object declaration. Instead, use direct names such as +'meson_uart_driver_*' and 'meson_serial_console_*' for all objects. + +Additionally, rename 'MESON_SERIAL_CONSOLE_DEFINE()' to +'MESON_SERIAL_CONSOLE()', and 'MESON_UART_DRIVER_DEFINE()' to +'MESON_UART_DRIVER()' to simplify the code. + +Signed-off-by: Dmitry Rokosov +Suggested-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230728071522.17503-1-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 39 ++++++++++++++++----------------------- + 1 file changed, 16 insertions(+), 23 deletions(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 5ac1dd69b774..9388b9ddea3b 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -76,13 +76,8 @@ + #define AML_UART_POLL_USEC 5 + #define AML_UART_TIMEOUT_USEC 10000 + +-#define MESON_UART_DRIVER(_devname) meson_uart_driver_##_devname +- +-#define MESON_UART_DRIVER_DECLARE(_devname) \ +- static struct uart_driver MESON_UART_DRIVER(_devname) +- +-MESON_UART_DRIVER_DECLARE(ttyAML); +-MESON_UART_DRIVER_DECLARE(ttyS); ++static struct uart_driver meson_uart_driver_ttyAML; ++static struct uart_driver meson_uart_driver_ttyS; + + static struct uart_port *meson_ports[AML_UART_PORT_NUM]; + +@@ -621,21 +616,19 @@ static int meson_serial_console_setup(struct console *co, char *options) + return uart_set_options(port, co, baud, parity, bits, flow); + } + +-#define MESON_SERIAL_CONSOLE(_devname) meson_serial_console_##_devname +- +-#define MESON_SERIAL_CONSOLE_DEFINE(_devname) \ +- static struct console MESON_SERIAL_CONSOLE(_devname) = { \ ++#define MESON_SERIAL_CONSOLE(_devname) \ ++ static struct console meson_serial_console_##_devname = { \ + .name = __stringify(_devname), \ + .write = meson_serial_console_write, \ + .device = uart_console_device, \ + .setup = meson_serial_console_setup, \ + .flags = CON_PRINTBUFFER, \ + .index = -1, \ +- .data = &MESON_UART_DRIVER(_devname), \ ++ .data = &meson_uart_driver_##_devname, \ + } + +-MESON_SERIAL_CONSOLE_DEFINE(ttyAML); +-MESON_SERIAL_CONSOLE_DEFINE(ttyS); ++MESON_SERIAL_CONSOLE(ttyAML); ++MESON_SERIAL_CONSOLE(ttyS); + + static void meson_serial_early_console_write(struct console *co, + const char *s, +@@ -660,13 +653,13 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt + OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + meson_serial_early_console_setup); + +-#define MESON_SERIAL_CONSOLE_PTR(_devname) (&MESON_SERIAL_CONSOLE(_devname)) ++#define MESON_SERIAL_CONSOLE_PTR(_devname) (&meson_serial_console_##_devname) + #else +-#define MESON_SERIAL_CONSOLE_PTR(_devname) (NULL) ++#define MESON_SERIAL_CONSOLE_PTR(_devname) (NULL) + #endif + +-#define MESON_UART_DRIVER_DEFINE(_devname) \ +- static struct uart_driver MESON_UART_DRIVER(_devname) = { \ ++#define MESON_UART_DRIVER(_devname) \ ++ static struct uart_driver meson_uart_driver_##_devname = { \ + .owner = THIS_MODULE, \ + .driver_name = "meson_uart", \ + .dev_name = __stringify(_devname), \ +@@ -674,8 +667,8 @@ OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart", + .cons = MESON_SERIAL_CONSOLE_PTR(_devname), \ + } + +-MESON_UART_DRIVER_DEFINE(ttyAML); +-MESON_UART_DRIVER_DEFINE(ttyS); ++MESON_UART_DRIVER(ttyAML); ++MESON_UART_DRIVER(ttyS); + + static int meson_uart_probe_clocks(struct platform_device *pdev, + struct uart_port *port) +@@ -704,7 +697,7 @@ static int meson_uart_probe_clocks(struct platform_device *pdev, + static struct uart_driver *meson_uart_current(const struct meson_uart_data *pd) + { + return (pd && pd->uart_driver) ? +- pd->uart_driver : &MESON_UART_DRIVER(ttyAML); ++ pd->uart_driver : &meson_uart_driver_ttyAML; + } + + static int meson_uart_probe(struct platform_device *pdev) +@@ -827,12 +820,12 @@ static struct meson_uart_data meson_g12a_uart_data = { + }; + + static struct meson_uart_data meson_a1_uart_data = { +- .uart_driver = &MESON_UART_DRIVER(ttyS), ++ .uart_driver = &meson_uart_driver_ttyS, + .has_xtal_div2 = false, + }; + + static struct meson_uart_data meson_s4_uart_data = { +- .uart_driver = &MESON_UART_DRIVER(ttyS), ++ .uart_driver = &meson_uart_driver_ttyS, + .has_xtal_div2 = true, + }; + diff --git a/patches.suse/tty-serial-meson-use-dev_err_probe.patch b/patches.suse/tty-serial-meson-use-dev_err_probe.patch new file mode 100644 index 0000000..f3d84ef --- /dev/null +++ b/patches.suse/tty-serial-meson-use-dev_err_probe.patch @@ -0,0 +1,36 @@ +From d954c66abc731eaee36d136bdaad83bc327ffaea Mon Sep 17 00:00:00 2001 +From: Dmitry Rokosov +Date: Wed, 5 Jul 2023 21:18:27 +0300 +Subject: [PATCH] tty: serial: meson: use dev_err_probe + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: b6092f36a56866e81afcea0530cc84963ebb9bf6 + +Use dev_err_probe() helper for error checking and standard logging. +It makes the driver's probe() function a little bit shorter. + +Signed-off-by: Dmitry Rokosov +Reviewed-by: Neil Armstrong +Link: https://lore.kernel.org/r/20230705181833.16137-2-ddrokosov@sberdevices.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/meson_uart.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c +index 677584cab57e..0f6157c8be89 100644 +--- a/drivers/tty/serial/meson_uart.c ++++ b/drivers/tty/serial/meson_uart.c +@@ -732,8 +732,8 @@ static int meson_uart_probe(struct platform_device *pdev) + has_rtscts = of_property_read_bool(pdev->dev.of_node, "uart-has-rtscts"); + + if (meson_ports[pdev->id]) { +- dev_err(&pdev->dev, "port %d already allocated\n", pdev->id); +- return -EBUSY; ++ return dev_err_probe(&pdev->dev, -EBUSY, ++ "port %d already allocated\n", pdev->id); + } + + port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL); diff --git a/patches.suse/tty-serial-samsung-Set-missing-PM-ops-for-hibernation-support.patch b/patches.suse/tty-serial-samsung-Set-missing-PM-ops-for-hibernation-support.patch new file mode 100644 index 0000000..be57e1a --- /dev/null +++ b/patches.suse/tty-serial-samsung-Set-missing-PM-ops-for-hibernation-support.patch @@ -0,0 +1,40 @@ +From 8257e8ce253db38c54cfffdd40e9097c14838db7 Mon Sep 17 00:00:00 2001 +From: Anton Eliasson +Date: Thu, 3 Aug 2023 13:26:42 +0200 +Subject: [PATCH] tty: serial: samsung: Set missing PM ops for hibernation + support + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: c58f2ae0ee94901da078a60961262df03eab7552 + +At least freeze, restore and thaw need to be set in order for the driver +to support system hibernation. The existing suspend/resume functions can +be reused since those functions don't touch the device's power state or +wakeup capability. Use the helper macros SET_SYSTEM_SLEEP_PM_OPS and +SET_NOIRQ_SYSTEM_SLEEP_PM_OPS for symmetry with similar drivers. + +Signed-off-by: Anton Eliasson +Link: https://lore.kernel.org/r/20230803-samsung_tty_pm_ops-v1-1-1ea7be72194d@axis.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/samsung_tty.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c +index 790a6873d23c..6b8d4b4402e9 100644 +--- a/drivers/tty/serial/samsung_tty.c ++++ b/drivers/tty/serial/samsung_tty.c +@@ -2169,9 +2169,8 @@ static int s3c24xx_serial_resume_noirq(struct device *dev) + } + + static const struct dev_pm_ops s3c24xx_serial_pm_ops = { +- .suspend = s3c24xx_serial_suspend, +- .resume = s3c24xx_serial_resume, +- .resume_noirq = s3c24xx_serial_resume_noirq, ++ SET_SYSTEM_SLEEP_PM_OPS(s3c24xx_serial_suspend, s3c24xx_serial_resume) ++ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, s3c24xx_serial_resume_noirq) + }; + #define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops) + diff --git a/patches.suse/tty-serial-samsung_tty-Use-abs-to-simplify-some-code.patch b/patches.suse/tty-serial-samsung_tty-Use-abs-to-simplify-some-code.patch new file mode 100644 index 0000000..87e0397 --- /dev/null +++ b/patches.suse/tty-serial-samsung_tty-Use-abs-to-simplify-some-code.patch @@ -0,0 +1,45 @@ +From bc04ee5f6f6b9946507d8677376091b62a9135d3 Mon Sep 17 00:00:00 2001 +From: Christophe JAILLET +Date: Sat, 10 Jun 2023 17:59:27 +0200 +Subject: [PATCH] tty: serial: samsung_tty: Use abs() to simplify some code + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.5-rc1 +Git-commit: f3710f5e9e1a68da53202cffba73f4b604f05b15 + +Use abs() instead of hand-writing it. + +Suggested-by: Walter Harms +Signed-off-by: Christophe JAILLET +Reviewed-by: Andi Shyti +Reviewed-by: Jiri Slaby +Message-ID: <7bd165e82ed3675d4ddee343ab373031e995a126.1686412569.git.christophe.jaillet@wanadoo.fr> +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/samsung_tty.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c +index 923d8ab81f2a..790a6873d23c 100644 +--- a/drivers/tty/serial/samsung_tty.c ++++ b/drivers/tty/serial/samsung_tty.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1418,9 +1419,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, + } + quot--; + +- calc_deviation = req_baud - baud; +- if (calc_deviation < 0) +- calc_deviation = -calc_deviation; ++ calc_deviation = abs(req_baud - baud); + + if (calc_deviation < deviation) { + /* diff --git a/patches.suse/tty-serial-xilinx_uartps-Do-not-check-for-0-return-after-calling-platform_get_irq.patch b/patches.suse/tty-serial-xilinx_uartps-Do-not-check-for-0-return-after-calling-platform_get_irq.patch new file mode 100644 index 0000000..4642050 --- /dev/null +++ b/patches.suse/tty-serial-xilinx_uartps-Do-not-check-for-0-return-after-calling-platform_get_irq.patch @@ -0,0 +1,38 @@ +From e9e5f22f78f7b7c215728947f00e8bb99683b1df Mon Sep 17 00:00:00 2001 +From: Ruan Jinjie +Date: Thu, 3 Aug 2023 17:17:12 +0800 +Subject: [PATCH] tty: serial: xilinx_uartps: Do not check for 0 return after + calling platform_get_irq() + +References: bsc#1214683 (PREEMPT_RT prerequisite backports) +Patch-mainline: v6.6-rc1 +Git-commit: 2c2d01a9f724a88be2895c5011689337da103c3b + +Since commit a85a6c86c25b ("driver core: platform: Clarify that +IRQ 0 is invalid"), there is no possible for +platform_get_irq() to return 0. Use the return value +from platform_get_irq(). + +Signed-off-by: Ruan Jinjie +Link: https://lore.kernel.org/r/20230803091712.596987-1-ruanjinjie@huawei.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Mel Gorman +--- + drivers/tty/serial/xilinx_uartps.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c +index 20a751663ef9..2e5e86a00a77 100644 +--- a/drivers/tty/serial/xilinx_uartps.c ++++ b/drivers/tty/serial/xilinx_uartps.c +@@ -1562,8 +1562,8 @@ static int cdns_uart_probe(struct platform_device *pdev) + } + + irq = platform_get_irq(pdev, 0); +- if (irq <= 0) { +- rc = -ENXIO; ++ if (irq < 0) { ++ rc = irq; + goto err_out_clk_disable; + } + diff --git a/patches.suse/tty-use-if-in-send_break-instead-of-goto.patch b/patches.suse/tty-use-if-in-send_break-instead-of-goto.patch index a4c4289..e4b44c5 100644 --- a/patches.suse/tty-use-if-in-send_break-instead-of-goto.patch +++ b/patches.suse/tty-use-if-in-send_break-instead-of-goto.patch @@ -1,11 +1,11 @@ -From c9a05d694d971f0270bcc503e0e23b14cc156ded Mon Sep 17 00:00:00 2001 +From 8dad2f9e7033c9f50ed373980ad88c50bb933951 Mon Sep 17 00:00:00 2001 From: "Jiri Slaby (SUSE)" -Date: Tue, 19 Sep 2023 10:51:56 +0200 +Date: Tue, 19 Sep 2023 09:51:56 +0100 Subject: [PATCH] tty: use 'if' in send_break() instead of 'goto' References: bsc#1214683 (PREEMPT_RT prerequisite backports) Patch-mainline: v6.6.14 -Git-commit: 2433f050d31acf64fe340e28b0e41390ae871ca2 +Git-commit: 24f2cd019946fc2e88e632d2e24a34c2cc3f2be4 [ Upstream commit 24f2cd019946fc2e88e632d2e24a34c2cc3f2be4 ] @@ -18,6 +18,7 @@ Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") Signed-off-by: Sasha Levin Signed-off-by: Mel Gorman + --- drivers/tty/tty_io.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/patches.suse/usb-cdc-acm-return-correct-error-code-on-unsupported-break.patch b/patches.suse/usb-cdc-acm-return-correct-error-code-on-unsupported-break.patch index 53b4b75..9ff73dd 100644 --- a/patches.suse/usb-cdc-acm-return-correct-error-code-on-unsupported-break.patch +++ b/patches.suse/usb-cdc-acm-return-correct-error-code-on-unsupported-break.patch @@ -1,6 +1,6 @@ -From 0bbcdd47fac7fb758ba474cdc09b60303b417fab Mon Sep 17 00:00:00 2001 +From f71da319d62214f023d1841829836e8919e7f922 Mon Sep 17 00:00:00 2001 From: Oliver Neukum -Date: Thu, 7 Dec 2023 14:26:30 +0100 +Date: Thu, 7 Dec 2023 13:26:30 +0000 Subject: [PATCH] usb: cdc-acm: return correct error code on unsupported break References: bsc#1214683 (PREEMPT_RT prerequisite backports) @@ -27,6 +27,7 @@ Link: https://lore.kernel.org/r/20231207132639.18250-1-oneukum@suse.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Signed-off-by: Mel Gorman + --- drivers/tty/tty_io.c | 3 +++ drivers/usb/class/cdc-acm.c | 3 +++ diff --git a/series.conf b/series.conf index 2e70a4c..9c09222 100644 --- a/series.conf +++ b/series.conf @@ -20508,6 +20508,7 @@ patches.suse/cpuidle-Use-local_clock_noinstr.patch patches.suse/lockdep-Add-lock_set_cmp_fn-annotation.patch patches.suse/panic-hide-unused-global-functions.patch + patches.suse/serial-qcom_geni-Comment-use-of-devm_krealloc-rather-than-devm_krealloc_array.patch patches.suse/tty-serial-fsl_lpuart-optimize-the-timer-based-EOP-logic.patch patches.suse/serial-pl011-set-UART011_CR_RXE-in-pl011_set_termios-after-port-shutdown.patch patches.suse/serial-8250-omap-Fix-imprecise-external-abort-for-omap_8250_pm.patch @@ -20537,6 +20538,7 @@ patches.suse/serial-core-Fix-error-handling-for-serial_core_ctrl_device_add.patch patches.suse/serial-8250_mtk-Simplify-clock-sequencing-and-runtime-PM.patch patches.suse/serial-8250-Apply-FSL-workarounds-also-without-SERIAL_8250_CONSOLE.patch + patches.suse/tty-serial-samsung_tty-Use-abs-to-simplify-some-code.patch patches.suse/tty-tty_io-update-timestamps-on-all-device-nodes.patch patches.suse/tty_audit-use-TASK_COMM_LEN-for-task-comm.patch patches.suse/tty_audit-use-kzalloc-in-tty_audit_buf_alloc.patch @@ -20548,12 +20550,41 @@ patches.suse/serial-arc_uart-simplify-flags-handling-in-arc_serial_rx_chars.patch patches.suse/serial-omap-serial-remove-flag-from-serial_omap_rdi.patch patches.suse/serial-drivers-switch-ch-and-flag-to-u8.patch + patches.suse/serial-qcom-geni-use-icc-tag-defines.patch patches.suse/tty-Explicitly-include-correct-DT-includes.patch + patches.suse/serial-tegra-Don-t-print-error-on-probe-deferral.patch patches.suse/8250_men_mcb-Add-clockrate-speed-for-G215-F215-boards.patch patches.suse/8250_men_mcb-Read-num-ports-from-register-data.patch patches.suse/8250_men_mcb-Make-UART-config-auto-configurable.patch + patches.suse/tty-serial-meson-use-dev_err_probe.patch + patches.suse/tty-serial-meson-redesign-the-module-to-platform_driver.patch + patches.suse/tty-serial-meson-apply-ttyS-devname-instead-of-ttyAML-for-new-SoCs.patch + patches.suse/tty-serial-meson-introduce-separate-uart_data-for-S4-SoC-family.patch + patches.suse/tty-serial-meson-add-independent-uart_data-for-A1-SoC-family.patch patches.suse/tty-serial-8250-Define-earlycon-for-mrvl-mmp-uart.patch + patches.suse/tty-serial-fsl_lpuart-move-the-lpuart32_int-below.patch + patches.suse/tty-serial-fsl_lpuart-add-IDLE-interrupt-support-for-rx_dma-on-imx7ulp-imx8ulp-imx8qxp.patch + patches.suse/serial-qcom-geni-clean-up-clock-rate-debug-printk.patch + patches.suse/serial-ar933x-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-bcm63xx-uart-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-clps711x-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-linflexuart-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-tegra-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-omap-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-fsl_lpuart-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-vt8500-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-mps2-uart-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-sprd-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-sccnxp-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-mvebu-uart-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-sifive-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-imx-Use-devm_platform_get_and_ioremap_resource.patch + patches.suse/serial-st-asc-Use-devm_platform_get_and_ioremap_resource.patch patches.suse/8250_men_mcb-fix-error-handling-in-read_uarts_available_from_reg.patch + patches.suse/tty-serial-meson-refactor-objects-definition-for-different-devnames.patch + patches.suse/tty-serial-xilinx_uartps-Do-not-check-for-0-return-after-calling-platform_get_irq.patch + patches.suse/tty-serial-samsung-Set-missing-PM-ops-for-hibernation-support.patch + patches.suse/serial-sifive-Remove-redundant-of_match_ptr.patch patches.suse/tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch patches.suse/tty-don-t-pass-write-to-do_tty_write.patch patches.suse/tty-rename-and-de-inline-do_tty_write.patch @@ -20561,14 +20592,30 @@ patches.suse/tty-use-ssize_t-for-iterate_tty_read-returned-type.patch patches.suse/tty-switch-size-and-count-types-in-iterate_tty_read-to-size_t.patch patches.suse/tty-use-min-for-size-computation-in-iterate_tty_read.patch + patches.suse/serial-stm32-avoid-clearing-DMAT-bit-during-transfer.patch + patches.suse/serial-stm32-use-DMAT-as-a-configuration-bit.patch + patches.suse/serial-stm32-modify-parameter-and-rename-stm32_usart_rx_dma_enabled.patch + patches.suse/serial-stm32-group-dma-pause-resume-error-handling-into-single-function.patch + patches.suse/serial-stm32-replace-access-to-DMAR-bit-by-dmaengine_pause-resume.patch + patches.suse/serial-stm32-synchronize-RX-DMA-channel-in-shutdown.patch + patches.suse/tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch + patches.suse/serial-sifive-Add-suspend-and-resume-operations.patch patches.suse/serial-8250_bcm7271-improve-bcm7271-8250-port.patch + patches.suse/Revert-tty-serial-meson-Add-a-earlycon-for-the-T7-SoC.patch patches.suse/printk-Reduce-console_unblank-usage-in-unsafe-scenarios.patch patches.suse/printk-Keep-non-panic-CPUs-out-of-console-lock.patch patches.suse/printk-Do-not-take-console-lock-for-console_flush_on_panic.patch patches.suse/printk-Consolidate-console-deferred-printing.patch patches.suse/printk-Add-per-console-suspended-state.patch patches.suse/printk-Rename-abandon_console_lock_in_panic-to-other_cpu_in_panic.patch + patches.suse/serial-core-Fix-checks-for-tx-runtime-PM-state.patch + patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch + patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch + patches.suse/tty-use-if-in-send_break-instead-of-goto.patch patches.suse/serial-exar-Add-RS-485-support-for-Sealevel-XR17V35X-based-cards.patch + patches.suse/serial-core-Fix-runtime-PM-handling-for-pending-tx.patch + patches.suse/serial-Do-not-hold-the-port-lock-when-setting-rx-during-tx-GPIO.patch + patches.suse/serial-stm32-do-not-always-set-SER_RS485_RX_DURING_TX-if-RS485-is-enabled.patch ######################################################## # preempt-rt backport v6.5-rc7-rt4 @@ -20691,9 +20738,6 @@ patches.suse/printk-Update-the-printk-series.patch patches.suse/printk-nbcon-move-locked_port-flag-to-struct-uart_port.patch patches.suse/drm-i915-guc-Consider-also-RCU-depth-in-busy-loop.patch - patches.suse/tty-early-return-from-send_break-on-TTY_DRIVER_HARDWARE_BREAK.patch - patches.suse/tty-don-t-check-for-signal_pending-in-send_break.patch - patches.suse/tty-use-if-in-send_break-instead-of-goto.patch patches.suse/usb-cdc-acm-return-correct-error-code-on-unsupported-break.patch ########################################################