[PATCH RESEND 5/5] tty/serial: at91: add interrupts for modem control lines
Richard Genoud
richard.genoud at gmail.com
Mon Sep 1 02:26:59 PDT 2014
2014-08-10 21:33 GMT+02:00 Peter Hurley <peter at hurleysoftware.com>:
> Hi Richard,
Hi !
Sorry for the delay !
> On 05/13/2014 02:20 PM, Richard Genoud wrote:
>> Handle CTS/DSR/RI/DCD GPIO interrupts in atmel_serial.
>>
>> Signed-off-by: Richard Genoud <richard.genoud at gmail.com>
>> Acked-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
>> Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>
>> ---
>> drivers/tty/serial/atmel_serial.c | 125 ++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 122 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
>> index 43ca659..3fceae0 100644
>> --- a/drivers/tty/serial/atmel_serial.c
>> +++ b/drivers/tty/serial/atmel_serial.c
>> @@ -45,6 +45,7 @@
>> #include <linux/gpio.h>
>> #include <linux/gpio/consumer.h>
>> #include <linux/err.h>
>> +#include <linux/irq.h>
>>
>> #include <asm/io.h>
>> #include <asm/ioctls.h>
>> @@ -167,7 +168,9 @@ struct atmel_uart_port {
>>
>> struct serial_rs485 rs485; /* rs485 settings */
>> struct mctrl_gpios *gpios;
>> + int gpio_irq[UART_GPIO_MAX];
>> unsigned int tx_done_mask;
>> + bool ms_irq_enabled;
>> bool is_usart; /* usart or uart */
>> struct timer_list uart_timer; /* uart timer */
>> int (*prepare_rx)(struct uart_port *port);
>> @@ -489,8 +492,38 @@ static void atmel_stop_rx(struct uart_port *port)
>> */
>> static void atmel_enable_ms(struct uart_port *port)
>> {
>> - UART_PUT_IER(port, ATMEL_US_RIIC | ATMEL_US_DSRIC
>> - | ATMEL_US_DCDIC | ATMEL_US_CTSIC);
>> + struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
>> + uint32_t ier = 0;
>> +
>> + /*
>> + * Interrupt should not be enabled twice
>> + */
>> + if (atmel_port->ms_irq_enabled)
>> + return;
>> +
>> + atmel_port->ms_irq_enabled = true;
>> +
>> + if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0)
>> + enable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]);
>> + else
>> + ier |= ATMEL_US_CTSIC;
>> +
>> + if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0)
>> + enable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]);
>> + else
>> + ier |= ATMEL_US_DSRIC;
>> +
>> + if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0)
>> + enable_irq(atmel_port->gpio_irq[UART_GPIO_RI]);
>> + else
>> + ier |= ATMEL_US_RIIC;
>> +
>> + if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0)
>> + enable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]);
>> + else
>> + ier |= ATMEL_US_DCDIC;
>
> Where are these gpio irqs disabled if !UART_ENABLE_MS()?
They are disabled in atmel_shutdown()/atmel_free_gpio_irq().
Like the doc says in Documentation/serial/driver
enable_ms(port)
Enable the modem status interrupts.
This method may be called multiple times. Modem status
interrupts should be disabled when the shutdown method is
called.
Regards,
Richard.
More information about the linux-arm-kernel
mailing list