| .. | .. |
|---|
| 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); |
|---|