hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
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
....@@ -1307,10 +1311,13 @@
13071311
13081312 pm_runtime_get_sync(up->dev);
13091313
1310
- if (up->port.sysrq || oops_in_progress)
1311
- locked = spin_trylock_irqsave(&up->port.lock, flags);
1314
+ local_irq_save(flags);
1315
+ if (up->port.sysrq)
1316
+ locked = 0;
1317
+ else if (oops_in_progress)
1318
+ locked = spin_trylock(&up->port.lock);
13121319 else
1313
- spin_lock_irqsave(&up->port.lock, flags);
1320
+ spin_lock(&up->port.lock);
13141321
13151322 /*
13161323 * First save the IER then disable the interrupts
....@@ -1339,7 +1346,8 @@
13391346 pm_runtime_mark_last_busy(up->dev);
13401347 pm_runtime_put_autosuspend(up->dev);
13411348 if (locked)
1342
- spin_unlock_irqrestore(&up->port.lock, flags);
1349
+ spin_unlock(&up->port.lock);
1350
+ local_irq_restore(flags);
13431351 }
13441352
13451353 static int __init
....@@ -1409,18 +1417,13 @@
14091417 /* store new config */
14101418 port->rs485 = *rs485;
14111419
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)) {
1420
+ if (up->rts_gpiod) {
14171421 /* enable / disable rts */
14181422 val = (port->rs485.flags & SER_RS485_ENABLED) ?
14191423 SER_RS485_RTS_AFTER_SEND : SER_RS485_RTS_ON_SEND;
14201424 val = (port->rs485.flags & val) ? 1 : 0;
1421
- gpio_set_value(up->rts_gpio, val);
1422
- } else
1423
- port->rs485.flags &= ~SER_RS485_ENABLED;
1425
+ gpiod_set_value(up->rts_gpiod, val);
1426
+ }
14241427
14251428 /* Enable interrupts */
14261429 up->ier = mode;
....@@ -1595,18 +1598,22 @@
15951598 }
15961599
15971600 static int serial_omap_probe_rs485(struct uart_omap_port *up,
1598
- struct device_node *np)
1601
+ struct device *dev)
15991602 {
16001603 struct serial_rs485 *rs485conf = &up->port.rs485;
1604
+ struct device_node *np = dev->of_node;
1605
+ enum gpiod_flags gflags;
16011606 int ret;
16021607
16031608 rs485conf->flags = 0;
1604
- up->rts_gpio = -EINVAL;
1609
+ up->rts_gpiod = NULL;
16051610
16061611 if (!np)
16071612 return 0;
16081613
1609
- uart_get_rs485_mode(up->dev, rs485conf);
1614
+ ret = uart_get_rs485_mode(&up->port);
1615
+ if (ret)
1616
+ return ret;
16101617
16111618 if (of_property_read_bool(np, "rs485-rts-active-high")) {
16121619 rs485conf->flags |= SER_RS485_RTS_ON_SEND;
....@@ -1617,19 +1624,20 @@
16171624 }
16181625
16191626 /* 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)
1627
+ gflags = rs485conf->flags & SER_RS485_RTS_AFTER_SEND ?
1628
+ GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
1629
+ up->rts_gpiod = devm_gpiod_get_optional(dev, "rts", gflags);
1630
+ if (IS_ERR(up->rts_gpiod)) {
1631
+ ret = PTR_ERR(up->rts_gpiod);
1632
+ if (ret == -EPROBE_DEFER)
16241633 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;
1634
+ /*
1635
+ * FIXME: the code historically ignored any other error than
1636
+ * -EPROBE_DEFER and just went on without GPIO.
1637
+ */
1638
+ up->rts_gpiod = NULL;
16311639 } else {
1632
- up->rts_gpio = -EINVAL;
1640
+ gpiod_set_consumer_name(up->rts_gpiod, "omap-serial");
16331641 }
16341642
16351643 return 0;
....@@ -1676,6 +1684,7 @@
16761684 up->port.regshift = 2;
16771685 up->port.fifosize = 64;
16781686 up->port.ops = &serial_omap_pops;
1687
+ up->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_OMAP_CONSOLE);
16791688
16801689 if (pdev->dev.of_node)
16811690 ret = of_alias_get_id(pdev->dev.of_node, "serial");
....@@ -1701,7 +1710,7 @@
17011710 dev_info(up->port.dev, "no wakeirq for uart%d\n",
17021711 up->port.line);
17031712
1704
- ret = serial_omap_probe_rs485(up, pdev->dev.of_node);
1713
+ ret = serial_omap_probe_rs485(up, &pdev->dev);
17051714 if (ret < 0)
17061715 goto err_rs485;
17071716
....@@ -1718,10 +1727,9 @@
17181727 DEFAULT_CLK_SPEED);
17191728 }
17201729
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);
1730
+ up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
1731
+ up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
1732
+ cpu_latency_qos_add_request(&up->pm_qos_request, up->latency);
17251733 INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);
17261734
17271735 platform_set_drvdata(pdev, up);
....@@ -1755,7 +1763,7 @@
17551763 pm_runtime_dont_use_autosuspend(&pdev->dev);
17561764 pm_runtime_put_sync(&pdev->dev);
17571765 pm_runtime_disable(&pdev->dev);
1758
- pm_qos_remove_request(&up->pm_qos_request);
1766
+ cpu_latency_qos_remove_request(&up->pm_qos_request);
17591767 device_init_wakeup(up->dev, false);
17601768 err_rs485:
17611769 err_port_line:
....@@ -1773,7 +1781,7 @@
17731781 pm_runtime_dont_use_autosuspend(up->dev);
17741782 pm_runtime_put_sync(up->dev);
17751783 pm_runtime_disable(up->dev);
1776
- pm_qos_remove_request(&up->pm_qos_request);
1784
+ cpu_latency_qos_remove_request(&up->pm_qos_request);
17771785 device_init_wakeup(&dev->dev, false);
17781786
17791787 return 0;
....@@ -1865,7 +1873,7 @@
18651873
18661874 serial_omap_enable_wakeup(up, true);
18671875
1868
- up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
1876
+ up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
18691877 schedule_work(&up->qos_work);
18701878
18711879 return 0;