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

serial: altera: don't enable any irq if the device doesn't feature an irq

If the irq line of an altera UART device isn't used to report interrupts
for this device the driver better ensures that this device doesn't pull
this line to active state and so disturb the whatever might be connected
to this line.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Uwe Kleine-König and committed by
Greg Kroah-Hartman
2ea6ad8b 0e254963

+22 -8
+22 -8
drivers/tty/serial/altera_uart.c
··· 109 109 return sigs; 110 110 } 111 111 112 + static void altera_uart_update_ctrl_reg(struct altera_uart *pp) 113 + { 114 + unsigned short imr = pp->imr; 115 + 116 + /* 117 + * If the device doesn't have an irq, ensure that the irq bits are 118 + * masked out to keep the irq line inactive. 119 + */ 120 + if (!pp->port.irq) 121 + imr &= ALTERA_UART_CONTROL_TRBK_MSK | ALTERA_UART_CONTROL_RTS_MSK; 122 + 123 + altera_uart_writel(&pp->port, imr, ALTERA_UART_CONTROL_REG); 124 + } 125 + 112 126 static void altera_uart_set_mctrl(struct uart_port *port, unsigned int sigs) 113 127 { 114 128 struct altera_uart *pp = container_of(port, struct altera_uart, port); ··· 132 118 pp->imr |= ALTERA_UART_CONTROL_RTS_MSK; 133 119 else 134 120 pp->imr &= ~ALTERA_UART_CONTROL_RTS_MSK; 135 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 121 + altera_uart_update_ctrl_reg(pp); 136 122 } 137 123 138 124 static void altera_uart_start_tx(struct uart_port *port) ··· 140 126 struct altera_uart *pp = container_of(port, struct altera_uart, port); 141 127 142 128 pp->imr |= ALTERA_UART_CONTROL_TRDY_MSK; 143 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 129 + altera_uart_update_ctrl_reg(pp); 144 130 } 145 131 146 132 static void altera_uart_stop_tx(struct uart_port *port) ··· 148 134 struct altera_uart *pp = container_of(port, struct altera_uart, port); 149 135 150 136 pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK; 151 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 137 + altera_uart_update_ctrl_reg(pp); 152 138 } 153 139 154 140 static void altera_uart_stop_rx(struct uart_port *port) ··· 156 142 struct altera_uart *pp = container_of(port, struct altera_uart, port); 157 143 158 144 pp->imr &= ~ALTERA_UART_CONTROL_RRDY_MSK; 159 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 145 + altera_uart_update_ctrl_reg(pp); 160 146 } 161 147 162 148 static void altera_uart_break_ctl(struct uart_port *port, int break_state) ··· 169 155 pp->imr |= ALTERA_UART_CONTROL_TRBK_MSK; 170 156 else 171 157 pp->imr &= ~ALTERA_UART_CONTROL_TRBK_MSK; 172 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 158 + altera_uart_update_ctrl_reg(pp); 173 159 spin_unlock_irqrestore(&port->lock, flags); 174 160 } 175 161 ··· 276 262 277 263 if (xmit->head == xmit->tail) { 278 264 pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK; 279 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 265 + altera_uart_update_ctrl_reg(pp); 280 266 } 281 267 } 282 268 ··· 341 327 342 328 /* Enable RX interrupts now */ 343 329 pp->imr = ALTERA_UART_CONTROL_RRDY_MSK; 344 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 330 + altera_uart_update_ctrl_reg(pp); 345 331 346 332 spin_unlock_irqrestore(&port->lock, flags); 347 333 ··· 357 343 358 344 /* Disable all interrupts now */ 359 345 pp->imr = 0; 360 - altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG); 346 + altera_uart_update_ctrl_reg(pp); 361 347 362 348 spin_unlock_irqrestore(&port->lock, flags); 363 349