forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/tty/serial/omap-serial.c
....@@ -16,10 +16,6 @@
1616 * this driver as required for the omap-platform.
1717 */
1818
19
-#if defined(CONFIG_SERIAL_OMAP_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20
-#define SUPPORT_SYSRQ
21
-#endif
22
-
2319 #include <linux/module.h>
2420 #include <linux/init.h>
2521 #include <linux/console.h>
....@@ -37,11 +33,8 @@
3733 #include <linux/pm_wakeirq.h>
3834 #include <linux/of.h>
3935 #include <linux/of_irq.h>
40
-#include <linux/gpio.h>
41
-#include <linux/of_gpio.h>
36
+#include <linux/gpio/consumer.h>
4237 #include <linux/platform_data/serial-omap.h>
43
-
44
-#include <dt-bindings/gpio/gpio.h>
4538
4639 #define OMAP_MAX_HSUART_PORTS 10
4740
....@@ -159,13 +152,15 @@
159152 u32 errata;
160153 u32 features;
161154
162
- int rts_gpio;
155
+ struct gpio_desc *rts_gpiod;
163156
164157 struct pm_qos_request pm_qos_request;
165158 u32 latency;
166159 u32 calc_latency;
167160 struct work_struct qos_work;
168161 bool is_suspending;
162
+
163
+ unsigned int rs485_tx_filter_count;
169164 };
170165
171166 #define to_uart_omap_port(p) ((container_of((p), struct uart_omap_port, port)))
....@@ -309,11 +304,12 @@
309304 serial_out(up, UART_OMAP_SCR, up->scr);
310305 res = (port->rs485.flags & SER_RS485_RTS_AFTER_SEND) ?
311306 1 : 0;
312
- if (gpio_get_value(up->rts_gpio) != res) {
307
+ if (up->rts_gpiod &&
308
+ gpiod_get_value(up->rts_gpiod) != res) {
313309 if (port->rs485.delay_rts_after_send > 0)
314310 mdelay(
315311 port->rs485.delay_rts_after_send);
316
- gpio_set_value(up->rts_gpio, res);
312
+ gpiod_set_value(up->rts_gpiod, res);
317313 }
318314 } else {
319315 /* We're asked to stop, but there's still stuff in the
....@@ -332,19 +328,6 @@
332328
333329 if (up->ier & UART_IER_THRI) {
334330 up->ier &= ~UART_IER_THRI;
335
- serial_out(up, UART_IER, up->ier);
336
- }
337
-
338
- if ((port->rs485.flags & SER_RS485_ENABLED) &&
339
- !(port->rs485.flags & SER_RS485_RX_DURING_TX)) {
340
- /*
341
- * Empty the RX FIFO, we are not interested in anything
342
- * received during the half-duplex transmission.
343
- */
344
- serial_out(up, UART_FCR, up->fcr | UART_FCR_CLEAR_RCVR);
345
- /* Re-enable RX interrupts */
346
- up->ier |= UART_IER_RLSI | UART_IER_RDI;
347
- up->port.read_status_mask |= UART_LSR_DR;
348331 serial_out(up, UART_IER, up->ier);
349332 }
350333
....@@ -373,6 +356,10 @@
373356 serial_out(up, UART_TX, up->port.x_char);
374357 up->port.icount.tx++;
375358 up->port.x_char = 0;
359
+ if ((up->port.rs485.flags & SER_RS485_ENABLED) &&
360
+ !(up->port.rs485.flags & SER_RS485_RX_DURING_TX))
361
+ up->rs485_tx_filter_count++;
362
+
376363 return;
377364 }
378365 if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
....@@ -384,6 +371,10 @@
384371 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
385372 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
386373 up->port.icount.tx++;
374
+ if ((up->port.rs485.flags & SER_RS485_ENABLED) &&
375
+ !(up->port.rs485.flags & SER_RS485_RX_DURING_TX))
376
+ up->rs485_tx_filter_count++;
377
+
387378 if (uart_circ_empty(xmit))
388379 break;
389380 } while (--count > 0);
....@@ -418,8 +409,8 @@
418409
419410 /* if rts not already enabled */
420411 res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0;
421
- if (gpio_get_value(up->rts_gpio) != res) {
422
- gpio_set_value(up->rts_gpio, res);
412
+ if (up->rts_gpiod && gpiod_get_value(up->rts_gpiod) != res) {
413
+ gpiod_set_value(up->rts_gpiod, res);
423414 if (port->rs485.delay_rts_before_send > 0)
424415 mdelay(port->rs485.delay_rts_before_send);
425416 }
....@@ -427,7 +418,7 @@
427418
428419 if ((port->rs485.flags & SER_RS485_ENABLED) &&
429420 !(port->rs485.flags & SER_RS485_RX_DURING_TX))
430
- serial_omap_stop_rx(port);
421
+ up->rs485_tx_filter_count = 0;
431422
432423 serial_omap_enable_ier_thri(up);
433424 pm_runtime_mark_last_busy(up->dev);
....@@ -493,10 +484,18 @@
493484 static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr)
494485 {
495486 unsigned int flag;
496
- unsigned char ch = 0;
497487
498
- if (likely(lsr & UART_LSR_DR))
499
- ch = serial_in(up, UART_RX);
488
+ /*
489
+ * Read one data character out to avoid stalling the receiver according
490
+ * to the table 23-246 of the omap4 TRM.
491
+ */
492
+ if (likely(lsr & UART_LSR_DR)) {
493
+ serial_in(up, UART_RX);
494
+ if ((up->port.rs485.flags & SER_RS485_ENABLED) &&
495
+ !(up->port.rs485.flags & SER_RS485_RX_DURING_TX) &&
496
+ up->rs485_tx_filter_count)
497
+ up->rs485_tx_filter_count--;
498
+ }
500499
501500 up->port.icount.rx++;
502501 flag = TTY_NORMAL;
....@@ -547,6 +546,13 @@
547546 return;
548547
549548 ch = serial_in(up, UART_RX);
549
+ if ((up->port.rs485.flags & SER_RS485_ENABLED) &&
550
+ !(up->port.rs485.flags & SER_RS485_RX_DURING_TX) &&
551
+ up->rs485_tx_filter_count) {
552
+ up->rs485_tx_filter_count--;
553
+ return;
554
+ }
555
+
550556 flag = TTY_NORMAL;
551557 up->port.icount.rx++;
552558
....@@ -591,7 +597,6 @@
591597 transmit_chars(up, lsr);
592598 break;
593599 case UART_IIR_RX_TIMEOUT:
594
- /* FALLTHROUGH */
595600 case UART_IIR_RDI:
596601 serial_omap_rdi(up, lsr);
597602 break;
....@@ -602,7 +607,6 @@
602607 /* simply try again */
603608 break;
604609 case UART_IIR_XOFF:
605
- /* FALLTHROUGH */
606610 default:
607611 break;
608612 }
....@@ -832,7 +836,7 @@
832836 struct uart_omap_port *up = container_of(work, struct uart_omap_port,
833837 qos_work);
834838
835
- pm_qos_update_request(&up->pm_qos_request, up->latency);
839
+ cpu_latency_qos_update_request(&up->pm_qos_request, up->latency);
836840 }
837841
838842 static void
....@@ -1409,18 +1413,13 @@
14091413 /* store new config */
14101414 port->rs485 = *rs485;
14111415
1412
- /*
1413
- * Just as a precaution, only allow rs485
1414
- * to be enabled if the gpio pin is valid
1415
- */
1416
- if (gpio_is_valid(up->rts_gpio)) {
1416
+ if (up->rts_gpiod) {
14171417 /* enable / disable rts */
14181418 val = (port->rs485.flags & SER_RS485_ENABLED) ?
14191419 SER_RS485_RTS_AFTER_SEND : SER_RS485_RTS_ON_SEND;
14201420 val = (port->rs485.flags & val) ? 1 : 0;
1421
- gpio_set_value(up->rts_gpio, val);
1422
- } else
1423
- port->rs485.flags &= ~SER_RS485_ENABLED;
1421
+ gpiod_set_value(up->rts_gpiod, val);
1422
+ }
14241423
14251424 /* Enable interrupts */
14261425 up->ier = mode;
....@@ -1595,18 +1594,22 @@
15951594 }
15961595
15971596 static int serial_omap_probe_rs485(struct uart_omap_port *up,
1598
- struct device_node *np)
1597
+ struct device *dev)
15991598 {
16001599 struct serial_rs485 *rs485conf = &up->port.rs485;
1600
+ struct device_node *np = dev->of_node;
1601
+ enum gpiod_flags gflags;
16011602 int ret;
16021603
16031604 rs485conf->flags = 0;
1604
- up->rts_gpio = -EINVAL;
1605
+ up->rts_gpiod = NULL;
16051606
16061607 if (!np)
16071608 return 0;
16081609
1609
- uart_get_rs485_mode(up->dev, rs485conf);
1610
+ ret = uart_get_rs485_mode(&up->port);
1611
+ if (ret)
1612
+ return ret;
16101613
16111614 if (of_property_read_bool(np, "rs485-rts-active-high")) {
16121615 rs485conf->flags |= SER_RS485_RTS_ON_SEND;
....@@ -1617,19 +1620,20 @@
16171620 }
16181621
16191622 /* check for tx enable gpio */
1620
- up->rts_gpio = of_get_named_gpio(np, "rts-gpio", 0);
1621
- if (gpio_is_valid(up->rts_gpio)) {
1622
- ret = devm_gpio_request(up->dev, up->rts_gpio, "omap-serial");
1623
- if (ret < 0)
1623
+ gflags = rs485conf->flags & SER_RS485_RTS_AFTER_SEND ?
1624
+ GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
1625
+ up->rts_gpiod = devm_gpiod_get_optional(dev, "rts", gflags);
1626
+ if (IS_ERR(up->rts_gpiod)) {
1627
+ ret = PTR_ERR(up->rts_gpiod);
1628
+ if (ret == -EPROBE_DEFER)
16241629 return ret;
1625
- ret = rs485conf->flags & SER_RS485_RTS_AFTER_SEND ? 1 : 0;
1626
- ret = gpio_direction_output(up->rts_gpio, ret);
1627
- if (ret < 0)
1628
- return ret;
1629
- } else if (up->rts_gpio == -EPROBE_DEFER) {
1630
- return -EPROBE_DEFER;
1630
+ /*
1631
+ * FIXME: the code historically ignored any other error than
1632
+ * -EPROBE_DEFER and just went on without GPIO.
1633
+ */
1634
+ up->rts_gpiod = NULL;
16311635 } else {
1632
- up->rts_gpio = -EINVAL;
1636
+ gpiod_set_consumer_name(up->rts_gpiod, "omap-serial");
16331637 }
16341638
16351639 return 0;
....@@ -1676,6 +1680,7 @@
16761680 up->port.regshift = 2;
16771681 up->port.fifosize = 64;
16781682 up->port.ops = &serial_omap_pops;
1683
+ up->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_OMAP_CONSOLE);
16791684
16801685 if (pdev->dev.of_node)
16811686 ret = of_alias_get_id(pdev->dev.of_node, "serial");
....@@ -1701,7 +1706,7 @@
17011706 dev_info(up->port.dev, "no wakeirq for uart%d\n",
17021707 up->port.line);
17031708
1704
- ret = serial_omap_probe_rs485(up, pdev->dev.of_node);
1709
+ ret = serial_omap_probe_rs485(up, &pdev->dev);
17051710 if (ret < 0)
17061711 goto err_rs485;
17071712
....@@ -1718,10 +1723,9 @@
17181723 DEFAULT_CLK_SPEED);
17191724 }
17201725
1721
- up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
1722
- up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
1723
- pm_qos_add_request(&up->pm_qos_request,
1724
- PM_QOS_CPU_DMA_LATENCY, up->latency);
1726
+ up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
1727
+ up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
1728
+ cpu_latency_qos_add_request(&up->pm_qos_request, up->latency);
17251729 INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);
17261730
17271731 platform_set_drvdata(pdev, up);
....@@ -1755,7 +1759,7 @@
17551759 pm_runtime_dont_use_autosuspend(&pdev->dev);
17561760 pm_runtime_put_sync(&pdev->dev);
17571761 pm_runtime_disable(&pdev->dev);
1758
- pm_qos_remove_request(&up->pm_qos_request);
1762
+ cpu_latency_qos_remove_request(&up->pm_qos_request);
17591763 device_init_wakeup(up->dev, false);
17601764 err_rs485:
17611765 err_port_line:
....@@ -1773,7 +1777,7 @@
17731777 pm_runtime_dont_use_autosuspend(up->dev);
17741778 pm_runtime_put_sync(up->dev);
17751779 pm_runtime_disable(up->dev);
1776
- pm_qos_remove_request(&up->pm_qos_request);
1780
+ cpu_latency_qos_remove_request(&up->pm_qos_request);
17771781 device_init_wakeup(&dev->dev, false);
17781782
17791783 return 0;
....@@ -1865,7 +1869,7 @@
18651869
18661870 serial_omap_enable_wakeup(up, true);
18671871
1868
- up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
1872
+ up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
18691873 schedule_work(&up->qos_work);
18701874
18711875 return 0;