diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2016-03-24 09:24:25 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-04-30 12:26:55 -0400 |
commit | 27e16501052e5341934d3d327d580dc9a90f1212 (patch) | |
tree | 63ae64117f7a21b32e565fffa440516edc61a0ef /drivers/tty/serial | |
parent | 66f95884928bd1b4114531b7a472601acf285130 (diff) |
serial: imx: implement DSR irq handling for DTE mode
Enable reporting of DSR events (which is named DTR in the registers
because Freescale uses the names as seem from a DCE).
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r-- | drivers/tty/serial/imx.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 161e9ed768e4..4b38392f4bd6 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c | |||
@@ -114,6 +114,7 @@ | |||
114 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ | 114 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ |
115 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ | 115 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ |
116 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ | 116 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ |
117 | #define UCR3_DTRDEN (1<<3) /* Data Terminal Ready Delta Enable. */ | ||
117 | #define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */ | 118 | #define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */ |
118 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ | 119 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ |
119 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ | 120 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ |
@@ -142,7 +143,7 @@ | |||
142 | #define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */ | 143 | #define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */ |
143 | #define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */ | 144 | #define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */ |
144 | #define USR1_AGTIM (1<<8) /* Ageing timer interrupt flag */ | 145 | #define USR1_AGTIM (1<<8) /* Ageing timer interrupt flag */ |
145 | #define USR1_TIMEOUT (1<<7) /* Receive timeout interrupt status */ | 146 | #define USR1_DTRD (1<<7) /* DTR Delta */ |
146 | #define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */ | 147 | #define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */ |
147 | #define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */ | 148 | #define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */ |
148 | #define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */ | 149 | #define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */ |
@@ -807,6 +808,19 @@ static irqreturn_t imx_int(int irq, void *dev_id) | |||
807 | ret = IRQ_HANDLED; | 808 | ret = IRQ_HANDLED; |
808 | } | 809 | } |
809 | 810 | ||
811 | if (sts & USR1_DTRD) { | ||
812 | unsigned long flags; | ||
813 | |||
814 | if (sts & USR1_DTRD) | ||
815 | writel(USR1_DTRD, sport->port.membase + USR1); | ||
816 | |||
817 | spin_lock_irqsave(&sport->port.lock, flags); | ||
818 | imx_mctrl_check(sport); | ||
819 | spin_unlock_irqrestore(&sport->port.lock, flags); | ||
820 | |||
821 | ret = IRQ_HANDLED; | ||
822 | } | ||
823 | |||
810 | if (sts & USR1_RTSD) { | 824 | if (sts & USR1_RTSD) { |
811 | imx_rtsint(irq, dev_id); | 825 | imx_rtsint(irq, dev_id); |
812 | ret = IRQ_HANDLED; | 826 | ret = IRQ_HANDLED; |
@@ -1205,7 +1219,7 @@ static int imx_startup(struct uart_port *port) | |||
1205 | /* | 1219 | /* |
1206 | * Finally, clear and enable interrupts | 1220 | * Finally, clear and enable interrupts |
1207 | */ | 1221 | */ |
1208 | writel(USR1_RTSD, sport->port.membase + USR1); | 1222 | writel(USR1_RTSD | USR1_DTRD, sport->port.membase + USR1); |
1209 | writel(USR2_ORE, sport->port.membase + USR2); | 1223 | writel(USR2_ORE, sport->port.membase + USR2); |
1210 | 1224 | ||
1211 | if (sport->dma_is_inited && !sport->dma_is_enabled) | 1225 | if (sport->dma_is_inited && !sport->dma_is_enabled) |
@@ -1245,7 +1259,7 @@ static int imx_startup(struct uart_port *port) | |||
1245 | * now, too. | 1259 | * now, too. |
1246 | */ | 1260 | */ |
1247 | temp |= IMX21_UCR3_RXDMUXSEL | UCR3_ADNIMP | | 1261 | temp |= IMX21_UCR3_RXDMUXSEL | UCR3_ADNIMP | |
1248 | UCR3_RI | UCR3_DCD; | 1262 | UCR3_DTRDEN | UCR3_RI | UCR3_DCD; |
1249 | 1263 | ||
1250 | if (sport->dte_mode) | 1264 | if (sport->dte_mode) |
1251 | temp &= ~(UCR3_RI | UCR3_DCD); | 1265 | temp &= ~(UCR3_RI | UCR3_DCD); |