|
@@ -526,6 +526,45 @@ static void atmel_enable_ms(struct uart_port *port)
|
|
|
UART_PUT_IER(port, ier);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Disable modem status interrupts
|
|
|
+ */
|
|
|
+static void atmel_disable_ms(struct uart_port *port)
|
|
|
+{
|
|
|
+ struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
|
|
+ uint32_t idr = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Interrupt should not be disabled twice
|
|
|
+ */
|
|
|
+ if (!atmel_port->ms_irq_enabled)
|
|
|
+ return;
|
|
|
+
|
|
|
+ atmel_port->ms_irq_enabled = false;
|
|
|
+
|
|
|
+ if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0)
|
|
|
+ disable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]);
|
|
|
+ else
|
|
|
+ idr |= ATMEL_US_CTSIC;
|
|
|
+
|
|
|
+ if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0)
|
|
|
+ disable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]);
|
|
|
+ else
|
|
|
+ idr |= ATMEL_US_DSRIC;
|
|
|
+
|
|
|
+ if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0)
|
|
|
+ disable_irq(atmel_port->gpio_irq[UART_GPIO_RI]);
|
|
|
+ else
|
|
|
+ idr |= ATMEL_US_RIIC;
|
|
|
+
|
|
|
+ if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0)
|
|
|
+ disable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]);
|
|
|
+ else
|
|
|
+ idr |= ATMEL_US_DCDIC;
|
|
|
+
|
|
|
+ UART_PUT_IDR(port, idr);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Control the transmission of a break signal
|
|
|
*/
|
|
@@ -1993,7 +2032,9 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
|
|
|
/* CTS flow-control and modem-status interrupts */
|
|
|
if (UART_ENABLE_MS(port, termios->c_cflag))
|
|
|
- port->ops->enable_ms(port);
|
|
|
+ atmel_enable_ms(port);
|
|
|
+ else
|
|
|
+ atmel_disable_ms(port);
|
|
|
|
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
|
}
|