.. | .. |
---|
41 | 41 | |
---|
42 | 42 | static const char serial21285_name[] = "Footbridge UART"; |
---|
43 | 43 | |
---|
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) |
---|
46 | 81 | |
---|
47 | 82 | /* |
---|
48 | 83 | * The documented expression for selecting the divisor is: |
---|
.. | .. |
---|
57 | 92 | |
---|
58 | 93 | static void serial21285_stop_tx(struct uart_port *port) |
---|
59 | 94 | { |
---|
60 | | - if (tx_enabled(port)) { |
---|
| 95 | + if (is_tx_enabled(port)) { |
---|
61 | 96 | disable_irq_nosync(IRQ_CONTX); |
---|
62 | | - tx_enabled(port) = 0; |
---|
| 97 | + tx_disable(port); |
---|
63 | 98 | } |
---|
64 | 99 | } |
---|
65 | 100 | |
---|
66 | 101 | static void serial21285_start_tx(struct uart_port *port) |
---|
67 | 102 | { |
---|
68 | | - if (!tx_enabled(port)) { |
---|
| 103 | + if (!is_tx_enabled(port)) { |
---|
69 | 104 | enable_irq(IRQ_CONTX); |
---|
70 | | - tx_enabled(port) = 1; |
---|
| 105 | + tx_enable(port); |
---|
71 | 106 | } |
---|
72 | 107 | } |
---|
73 | 108 | |
---|
74 | 109 | static void serial21285_stop_rx(struct uart_port *port) |
---|
75 | 110 | { |
---|
76 | | - if (rx_enabled(port)) { |
---|
| 111 | + if (is_rx_enabled(port)) { |
---|
77 | 112 | disable_irq_nosync(IRQ_CONRX); |
---|
78 | | - rx_enabled(port) = 0; |
---|
| 113 | + rx_disable(port); |
---|
79 | 114 | } |
---|
80 | 115 | } |
---|
81 | 116 | |
---|
.. | .. |
---|
185 | 220 | { |
---|
186 | 221 | int ret; |
---|
187 | 222 | |
---|
188 | | - tx_enabled(port) = 1; |
---|
189 | | - rx_enabled(port) = 1; |
---|
| 223 | + tx_enable(port); |
---|
| 224 | + rx_enable(port); |
---|
190 | 225 | |
---|
191 | 226 | ret = request_irq(IRQ_CONRX, serial21285_rx_chars, 0, |
---|
192 | 227 | serial21285_name, port); |
---|