Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ARM] 5250/1: unbalanced enable_irq() for serial_ks8695.c fix

The function ks8695uart_set_termios() would cause an unbalanced
enable_irq() generated message to be printk()ed. This is because
there was no book keeping support to remember if the calls to
enable_irq() and disable_irq() were balanced for the modem
control irq.

Signed-off-by: Dick Hollenbeck <dick@softplc.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by

Dick Hollenbeck and committed by
Russell King
457cd4f5 b8e6c91c

+52 -9
+52 -9
drivers/serial/serial_ks8695.c
··· 63 63 #define UART_DUMMY_LSR_RX 0x100 64 64 #define UART_PORT_SIZE (KS8695_USR - KS8695_URRB + 4) 65 65 66 - #define tx_enabled(port) ((port)->unused[0]) 67 - #define rx_enabled(port) ((port)->unused[1]) 66 + static inline int tx_enabled(struct uart_port *port) 67 + { 68 + return port->unused[0] & 1; 69 + } 70 + 71 + static inline int rx_enabled(struct uart_port *port) 72 + { 73 + return port->unused[0] & 2; 74 + } 75 + 76 + static inline int ms_enabled(struct uart_port *port) 77 + { 78 + return port->unused[0] & 4; 79 + } 80 + 81 + static inline void ms_enable(struct uart_port *port, int enabled) 82 + { 83 + if(enabled) 84 + port->unused[0] |= 4; 85 + else 86 + port->unused[0] &= ~4; 87 + } 88 + 89 + static inline void rx_enable(struct uart_port *port, int enabled) 90 + { 91 + if(enabled) 92 + port->unused[0] |= 2; 93 + else 94 + port->unused[0] &= ~2; 95 + } 96 + 97 + static inline void tx_enable(struct uart_port *port, int enabled) 98 + { 99 + if(enabled) 100 + port->unused[0] |= 1; 101 + else 102 + port->unused[0] &= ~1; 103 + } 68 104 69 105 70 106 #ifdef SUPPORT_SYSRQ ··· 111 75 { 112 76 if (tx_enabled(port)) { 113 77 disable_irq(KS8695_IRQ_UART_TX); 114 - tx_enabled(port) = 0; 78 + tx_enable(port, 0); 115 79 } 116 80 } 117 81 ··· 119 83 { 120 84 if (!tx_enabled(port)) { 121 85 enable_irq(KS8695_IRQ_UART_TX); 122 - tx_enabled(port) = 1; 86 + tx_enable(port, 1); 123 87 } 124 88 } 125 89 ··· 127 91 { 128 92 if (rx_enabled(port)) { 129 93 disable_irq(KS8695_IRQ_UART_RX); 130 - rx_enabled(port) = 0; 94 + rx_enable(port, 0); 131 95 } 132 96 } 133 97 134 98 static void ks8695uart_enable_ms(struct uart_port *port) 135 99 { 136 - enable_irq(KS8695_IRQ_UART_MODEM_STATUS); 100 + if (!ms_enabled(port)) { 101 + enable_irq(KS8695_IRQ_UART_MODEM_STATUS); 102 + ms_enable(port,1); 103 + } 137 104 } 138 105 139 106 static void ks8695uart_disable_ms(struct uart_port *port) 140 107 { 141 - disable_irq(KS8695_IRQ_UART_MODEM_STATUS); 108 + if (ms_enabled(port)) { 109 + disable_irq(KS8695_IRQ_UART_MODEM_STATUS); 110 + ms_enable(port,0); 111 + } 142 112 } 143 113 144 114 static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id) ··· 327 285 int retval; 328 286 329 287 set_irq_flags(KS8695_IRQ_UART_TX, IRQF_VALID | IRQF_NOAUTOEN); 330 - tx_enabled(port) = 0; 331 - rx_enabled(port) = 1; 288 + tx_enable(port, 0); 289 + rx_enable(port, 1); 290 + ms_enable(port, 1); 332 291 333 292 /* 334 293 * Allocate the IRQ