forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/drivers/tty/serial/21285.c
....@@ -41,8 +41,43 @@
4141
4242 static const char serial21285_name[] = "Footbridge UART";
4343
44
-#define tx_enabled(port) ((port)->unused[0])
45
-#define rx_enabled(port) ((port)->unused[1])
44
+/*
45
+ * We only need 2 bits of data, so instead of creating a whole structure for
46
+ * this, use bits of the private_data pointer of the uart port structure.
47
+ */
48
+#define tx_enabled_bit 0
49
+#define rx_enabled_bit 1
50
+
51
+static bool is_enabled(struct uart_port *port, int bit)
52
+{
53
+ unsigned long *private_data = (unsigned long *)&port->private_data;
54
+
55
+ if (test_bit(bit, private_data))
56
+ return true;
57
+ return false;
58
+}
59
+
60
+static void enable(struct uart_port *port, int bit)
61
+{
62
+ unsigned long *private_data = (unsigned long *)&port->private_data;
63
+
64
+ set_bit(bit, private_data);
65
+}
66
+
67
+static void disable(struct uart_port *port, int bit)
68
+{
69
+ unsigned long *private_data = (unsigned long *)&port->private_data;
70
+
71
+ clear_bit(bit, private_data);
72
+}
73
+
74
+#define is_tx_enabled(port) is_enabled(port, tx_enabled_bit)
75
+#define tx_enable(port) enable(port, tx_enabled_bit)
76
+#define tx_disable(port) disable(port, tx_enabled_bit)
77
+
78
+#define is_rx_enabled(port) is_enabled(port, rx_enabled_bit)
79
+#define rx_enable(port) enable(port, rx_enabled_bit)
80
+#define rx_disable(port) disable(port, rx_enabled_bit)
4681
4782 /*
4883 * The documented expression for selecting the divisor is:
....@@ -57,25 +92,25 @@
5792
5893 static void serial21285_stop_tx(struct uart_port *port)
5994 {
60
- if (tx_enabled(port)) {
95
+ if (is_tx_enabled(port)) {
6196 disable_irq_nosync(IRQ_CONTX);
62
- tx_enabled(port) = 0;
97
+ tx_disable(port);
6398 }
6499 }
65100
66101 static void serial21285_start_tx(struct uart_port *port)
67102 {
68
- if (!tx_enabled(port)) {
103
+ if (!is_tx_enabled(port)) {
69104 enable_irq(IRQ_CONTX);
70
- tx_enabled(port) = 1;
105
+ tx_enable(port);
71106 }
72107 }
73108
74109 static void serial21285_stop_rx(struct uart_port *port)
75110 {
76
- if (rx_enabled(port)) {
111
+ if (is_rx_enabled(port)) {
77112 disable_irq_nosync(IRQ_CONRX);
78
- rx_enabled(port) = 0;
113
+ rx_disable(port);
79114 }
80115 }
81116
....@@ -185,8 +220,8 @@
185220 {
186221 int ret;
187222
188
- tx_enabled(port) = 1;
189
- rx_enabled(port) = 1;
223
+ tx_enable(port);
224
+ rx_enable(port);
190225
191226 ret = request_irq(IRQ_CONRX, serial21285_rx_chars, 0,
192227 serial21285_name, port);