forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/drivers/tty/serial/mvebu-uart.c
....@@ -73,6 +73,7 @@
7373
7474 #define UART_OSAMP 0x14
7575 #define OSAMP_DEFAULT_DIVISOR 16
76
+#define OSAMP_DIVISORS_MASK 0x3F3F3F3F
7677
7778 #define MVEBU_NR_UARTS 2
7879
....@@ -237,6 +238,7 @@
237238 struct tty_port *tport = &port->state->port;
238239 unsigned char ch = 0;
239240 char flag = 0;
241
+ int ret;
240242
241243 do {
242244 if (status & STAT_RX_RDY(port)) {
....@@ -247,6 +249,16 @@
247249
248250 if (status & STAT_PAR_ERR)
249251 port->icount.parity++;
252
+ }
253
+
254
+ /*
255
+ * For UART2, error bits are not cleared on buffer read.
256
+ * This causes interrupt loop and system hang.
257
+ */
258
+ if (IS_EXTENDED(port) && (status & STAT_BRK_ERR)) {
259
+ ret = readl(port->membase + UART_STAT);
260
+ ret |= STAT_BRK_ERR;
261
+ writel(ret, port->membase + UART_STAT);
250262 }
251263
252264 if (status & STAT_BRK_DET) {
....@@ -442,14 +454,13 @@
442454 }
443455 }
444456
445
-static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
457
+static unsigned int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
446458 {
447
- struct mvebu_uart *mvuart = to_mvuart(port);
448459 unsigned int d_divisor, m_divisor;
449
- u32 brdv;
460
+ u32 brdv, osamp;
450461
451
- if (IS_ERR(mvuart->clk))
452
- return -PTR_ERR(mvuart->clk);
462
+ if (!port->uartclk)
463
+ return 0;
453464
454465 /*
455466 * The baudrate is derived from the UART clock thanks to two divisors:
....@@ -469,7 +480,11 @@
469480 brdv |= d_divisor;
470481 writel(brdv, port->membase + UART_BRDV);
471482
472
- return 0;
483
+ osamp = readl(port->membase + UART_OSAMP);
484
+ osamp &= ~OSAMP_DIVISORS_MASK;
485
+ writel(osamp, port->membase + UART_OSAMP);
486
+
487
+ return DIV_ROUND_CLOSEST(port->uartclk, d_divisor * m_divisor);
473488 }
474489
475490 static void mvebu_uart_set_termios(struct uart_port *port,
....@@ -506,15 +521,11 @@
506521 max_baud = 230400;
507522
508523 baud = uart_get_baud_rate(port, termios, old, min_baud, max_baud);
509
- if (mvebu_uart_baud_rate_set(port, baud)) {
510
- /* No clock available, baudrate cannot be changed */
511
- if (old)
512
- baud = uart_get_baud_rate(port, old, NULL,
513
- min_baud, max_baud);
514
- } else {
515
- tty_termios_encode_baud_rate(termios, baud, baud);
516
- uart_update_timeout(port, termios->c_cflag, baud);
517
- }
524
+ baud = mvebu_uart_baud_rate_set(port, baud);
525
+
526
+ /* In case baudrate cannot be changed, report previous old value */
527
+ if (baud == 0 && old)
528
+ baud = tty_termios_baud_rate(old);
518529
519530 /* Only the following flag changes are supported */
520531 if (old) {
....@@ -523,6 +534,11 @@
523534 termios->c_cflag &= CREAD | CBAUD;
524535 termios->c_cflag |= old->c_cflag & ~(CREAD | CBAUD);
525536 termios->c_cflag |= CS8;
537
+ }
538
+
539
+ if (baud != 0) {
540
+ tty_termios_encode_baud_rate(termios, baud, baud);
541
+ uart_update_timeout(port, termios->c_cflag, baud);
526542 }
527543
528544 spin_unlock_irqrestore(&port->lock, flags);
....@@ -811,7 +827,7 @@
811827 &pdev->dev);
812828 struct uart_port *port;
813829 struct mvebu_uart *mvuart;
814
- int ret, id, irq;
830
+ int id, irq;
815831
816832 if (!reg) {
817833 dev_err(&pdev->dev, "no registers defined\n");
....@@ -889,10 +905,8 @@
889905 if (platform_irq_count(pdev) == 1) {
890906 /* Old bindings: no name on the single unamed UART0 IRQ */
891907 irq = platform_get_irq(pdev, 0);
892
- if (irq < 0) {
893
- dev_err(&pdev->dev, "unable to get UART IRQ\n");
908
+ if (irq < 0)
894909 return irq;
895
- }
896910
897911 mvuart->irq[UART_IRQ_SUM] = irq;
898912 } else {
....@@ -902,18 +916,14 @@
902916 * uart-sum of UART0 port.
903917 */
904918 irq = platform_get_irq_byname(pdev, "uart-rx");
905
- if (irq < 0) {
906
- dev_err(&pdev->dev, "unable to get 'uart-rx' IRQ\n");
919
+ if (irq < 0)
907920 return irq;
908
- }
909921
910922 mvuart->irq[UART_RX_IRQ] = irq;
911923
912924 irq = platform_get_irq_byname(pdev, "uart-tx");
913
- if (irq < 0) {
914
- dev_err(&pdev->dev, "unable to get 'uart-tx' IRQ\n");
925
+ if (irq < 0)
915926 return irq;
916
- }
917927
918928 mvuart->irq[UART_TX_IRQ] = irq;
919929 }
....@@ -923,10 +933,7 @@
923933 udelay(1);
924934 writel(0, port->membase + UART_CTRL(port));
925935
926
- ret = uart_add_one_port(&mvebu_uart_driver, port);
927
- if (ret)
928
- return ret;
929
- return 0;
936
+ return uart_add_one_port(&mvebu_uart_driver, port);
930937 }
931938
932939 static struct mvebu_uart_driver_data uart_std_driver_data = {