aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2016-03-24 09:24:25 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-04-30 12:26:55 -0400
commit27e16501052e5341934d3d327d580dc9a90f1212 (patch)
tree63ae64117f7a21b32e565fffa440516edc61a0ef /drivers/tty/serial
parent66f95884928bd1b4114531b7a472601acf285130 (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.c20
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);