]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Jul 2022 15:19:47 +0000 (17:19 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Jul 2022 15:19:47 +0000 (17:19 +0200)
added patches:
serial-mvebu-uart-correctly-report-configured-baudrate-value.patch

queue-5.10/serial-mvebu-uart-correctly-report-configured-baudrate-value.patch [new file with mode: 0644]
queue-5.10/series

diff --git a/queue-5.10/serial-mvebu-uart-correctly-report-configured-baudrate-value.patch b/queue-5.10/serial-mvebu-uart-correctly-report-configured-baudrate-value.patch
new file mode 100644 (file)
index 0000000..bfb3b62
--- /dev/null
@@ -0,0 +1,92 @@
+From 4f532c1e25319e42996ec18a1f473fd50c8e575d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
+Date: Tue, 28 Jun 2022 12:09:22 +0200
+Subject: serial: mvebu-uart: correctly report configured baudrate value
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pali Rohár <pali@kernel.org>
+
+commit 4f532c1e25319e42996ec18a1f473fd50c8e575d upstream.
+
+Functions tty_termios_encode_baud_rate() and uart_update_timeout() should
+be called with the baudrate value which was set to hardware. Linux then
+report exact values via ioctl(TCGETS2) to userspace.
+
+Change mvebu_uart_baud_rate_set() function to return baudrate value which
+was set to hardware and propagate this value to above mentioned functions.
+
+With this change userspace would see precise value in termios c_ospeed
+field.
+
+Fixes: 68a0db1d7da2 ("serial: mvebu-uart: add function to change baudrate")
+Cc: stable <stable@kernel.org>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Link: https://lore.kernel.org/r/20220628100922.10717-1-pali@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/mvebu-uart.c |   25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+--- a/drivers/tty/serial/mvebu-uart.c
++++ b/drivers/tty/serial/mvebu-uart.c
+@@ -443,13 +443,13 @@ static void mvebu_uart_shutdown(struct u
+       }
+ }
+-static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
++static unsigned int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
+ {
+       unsigned int d_divisor, m_divisor;
+       u32 brdv, osamp;
+       if (!port->uartclk)
+-              return -EOPNOTSUPP;
++              return 0;
+       /*
+        * The baudrate is derived from the UART clock thanks to two divisors:
+@@ -473,7 +473,7 @@ static int mvebu_uart_baud_rate_set(stru
+       osamp &= ~OSAMP_DIVISORS_MASK;
+       writel(osamp, port->membase + UART_OSAMP);
+-      return 0;
++      return DIV_ROUND_CLOSEST(port->uartclk, d_divisor * m_divisor);
+ }
+ static void mvebu_uart_set_termios(struct uart_port *port,
+@@ -510,15 +510,11 @@ static void mvebu_uart_set_termios(struc
+       max_baud = 230400;
+       baud = uart_get_baud_rate(port, termios, old, min_baud, max_baud);
+-      if (mvebu_uart_baud_rate_set(port, baud)) {
+-              /* No clock available, baudrate cannot be changed */
+-              if (old)
+-                      baud = uart_get_baud_rate(port, old, NULL,
+-                                                min_baud, max_baud);
+-      } else {
+-              tty_termios_encode_baud_rate(termios, baud, baud);
+-              uart_update_timeout(port, termios->c_cflag, baud);
+-      }
++      baud = mvebu_uart_baud_rate_set(port, baud);
++
++      /* In case baudrate cannot be changed, report previous old value */
++      if (baud == 0 && old)
++              baud = tty_termios_baud_rate(old);
+       /* Only the following flag changes are supported */
+       if (old) {
+@@ -529,6 +525,11 @@ static void mvebu_uart_set_termios(struc
+               termios->c_cflag |= CS8;
+       }
++      if (baud != 0) {
++              tty_termios_encode_baud_rate(termios, baud, baud);
++              uart_update_timeout(port, termios->c_cflag, baud);
++      }
++
+       spin_unlock_irqrestore(&port->lock, flags);
+ }
index 027ac9edcbb7dd1aa03ab86372e85397e03a627f..4ca8d367290942193f2b3234b1d1392596cbd764 100644 (file)
@@ -18,3 +18,4 @@ pci-hv-fix-multi-msi-to-allow-more-than-one-msi-vector.patch
 pci-hv-fix-hv_arch_irq_unmask-for-multi-msi.patch
 pci-hv-reuse-existing-irte-allocation-in-compose_msi_msg.patch
 pci-hv-fix-interrupt-mapping-for-multi-msi.patch
+serial-mvebu-uart-correctly-report-configured-baudrate-value.patch