aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/serial/imx.c')
-rw-r--r--drivers/tty/serial/imx.c269
1 files changed, 128 insertions, 141 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 59819121fe9b..a220f77ceab6 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -48,8 +48,8 @@
48#include <linux/of.h> 48#include <linux/of.h>
49#include <linux/of_device.h> 49#include <linux/of_device.h>
50#include <linux/pinctrl/consumer.h> 50#include <linux/pinctrl/consumer.h>
51#include <linux/io.h>
51 52
52#include <asm/io.h>
53#include <asm/irq.h> 53#include <asm/irq.h>
54#include <linux/platform_data/serial-imx.h> 54#include <linux/platform_data/serial-imx.h>
55 55
@@ -73,102 +73,102 @@
73#define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/ 73#define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/
74 74
75/* UART Control Register Bit Fields.*/ 75/* UART Control Register Bit Fields.*/
76#define URXD_CHARRDY (1<<15) 76#define URXD_CHARRDY (1<<15)
77#define URXD_ERR (1<<14) 77#define URXD_ERR (1<<14)
78#define URXD_OVRRUN (1<<13) 78#define URXD_OVRRUN (1<<13)
79#define URXD_FRMERR (1<<12) 79#define URXD_FRMERR (1<<12)
80#define URXD_BRK (1<<11) 80#define URXD_BRK (1<<11)
81#define URXD_PRERR (1<<10) 81#define URXD_PRERR (1<<10)
82#define UCR1_ADEN (1<<15) /* Auto detect interrupt */ 82#define UCR1_ADEN (1<<15) /* Auto detect interrupt */
83#define UCR1_ADBR (1<<14) /* Auto detect baud rate */ 83#define UCR1_ADBR (1<<14) /* Auto detect baud rate */
84#define UCR1_TRDYEN (1<<13) /* Transmitter ready interrupt enable */ 84#define UCR1_TRDYEN (1<<13) /* Transmitter ready interrupt enable */
85#define UCR1_IDEN (1<<12) /* Idle condition interrupt */ 85#define UCR1_IDEN (1<<12) /* Idle condition interrupt */
86#define UCR1_RRDYEN (1<<9) /* Recv ready interrupt enable */ 86#define UCR1_RRDYEN (1<<9) /* Recv ready interrupt enable */
87#define UCR1_RDMAEN (1<<8) /* Recv ready DMA enable */ 87#define UCR1_RDMAEN (1<<8) /* Recv ready DMA enable */
88#define UCR1_IREN (1<<7) /* Infrared interface enable */ 88#define UCR1_IREN (1<<7) /* Infrared interface enable */
89#define UCR1_TXMPTYEN (1<<6) /* Transimitter empty interrupt enable */ 89#define UCR1_TXMPTYEN (1<<6) /* Transimitter empty interrupt enable */
90#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ 90#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */
91#define UCR1_SNDBRK (1<<4) /* Send break */ 91#define UCR1_SNDBRK (1<<4) /* Send break */
92#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ 92#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */
93#define IMX1_UCR1_UARTCLKEN (1<<2) /* UART clock enabled, i.mx1 only */ 93#define IMX1_UCR1_UARTCLKEN (1<<2) /* UART clock enabled, i.mx1 only */
94#define UCR1_DOZE (1<<1) /* Doze */ 94#define UCR1_DOZE (1<<1) /* Doze */
95#define UCR1_UARTEN (1<<0) /* UART enabled */ 95#define UCR1_UARTEN (1<<0) /* UART enabled */
96#define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */ 96#define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */
97#define UCR2_IRTS (1<<14) /* Ignore RTS pin */ 97#define UCR2_IRTS (1<<14) /* Ignore RTS pin */
98#define UCR2_CTSC (1<<13) /* CTS pin control */ 98#define UCR2_CTSC (1<<13) /* CTS pin control */
99#define UCR2_CTS (1<<12) /* Clear to send */ 99#define UCR2_CTS (1<<12) /* Clear to send */
100#define UCR2_ESCEN (1<<11) /* Escape enable */ 100#define UCR2_ESCEN (1<<11) /* Escape enable */
101#define UCR2_PREN (1<<8) /* Parity enable */ 101#define UCR2_PREN (1<<8) /* Parity enable */
102#define UCR2_PROE (1<<7) /* Parity odd/even */ 102#define UCR2_PROE (1<<7) /* Parity odd/even */
103#define UCR2_STPB (1<<6) /* Stop */ 103#define UCR2_STPB (1<<6) /* Stop */
104#define UCR2_WS (1<<5) /* Word size */ 104#define UCR2_WS (1<<5) /* Word size */
105#define UCR2_RTSEN (1<<4) /* Request to send interrupt enable */ 105#define UCR2_RTSEN (1<<4) /* Request to send interrupt enable */
106#define UCR2_ATEN (1<<3) /* Aging Timer Enable */ 106#define UCR2_ATEN (1<<3) /* Aging Timer Enable */
107#define UCR2_TXEN (1<<2) /* Transmitter enabled */ 107#define UCR2_TXEN (1<<2) /* Transmitter enabled */
108#define UCR2_RXEN (1<<1) /* Receiver enabled */ 108#define UCR2_RXEN (1<<1) /* Receiver enabled */
109#define UCR2_SRST (1<<0) /* SW reset */ 109#define UCR2_SRST (1<<0) /* SW reset */
110#define UCR3_DTREN (1<<13) /* DTR interrupt enable */ 110#define UCR3_DTREN (1<<13) /* DTR interrupt enable */
111#define UCR3_PARERREN (1<<12) /* Parity enable */ 111#define UCR3_PARERREN (1<<12) /* Parity enable */
112#define UCR3_FRAERREN (1<<11) /* Frame error interrupt enable */ 112#define UCR3_FRAERREN (1<<11) /* Frame error interrupt enable */
113#define UCR3_DSR (1<<10) /* Data set ready */ 113#define UCR3_DSR (1<<10) /* Data set ready */
114#define UCR3_DCD (1<<9) /* Data carrier detect */ 114#define UCR3_DCD (1<<9) /* Data carrier detect */
115#define UCR3_RI (1<<8) /* Ring indicator */ 115#define UCR3_RI (1<<8) /* Ring indicator */
116#define UCR3_TIMEOUTEN (1<<7) /* Timeout interrupt enable */ 116#define UCR3_TIMEOUTEN (1<<7) /* Timeout interrupt enable */
117#define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ 117#define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */
118#define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ 118#define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */
119#define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ 119#define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */
120#define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */ 120#define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */
121#define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ 121#define UCR3_INVT (1<<1) /* Inverted Infrared transmission */
122#define UCR3_BPEN (1<<0) /* Preset registers enable */ 122#define UCR3_BPEN (1<<0) /* Preset registers enable */
123#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */ 123#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */
124#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */ 124#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */
125#define UCR4_INVR (1<<9) /* Inverted infrared reception */ 125#define UCR4_INVR (1<<9) /* Inverted infrared reception */
126#define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ 126#define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */
127#define UCR4_WKEN (1<<7) /* Wake interrupt enable */ 127#define UCR4_WKEN (1<<7) /* Wake interrupt enable */
128#define UCR4_REF16 (1<<6) /* Ref freq 16 MHz */ 128#define UCR4_REF16 (1<<6) /* Ref freq 16 MHz */
129#define UCR4_IRSC (1<<5) /* IR special case */ 129#define UCR4_IRSC (1<<5) /* IR special case */
130#define UCR4_TCEN (1<<3) /* Transmit complete interrupt enable */ 130#define UCR4_TCEN (1<<3) /* Transmit complete interrupt enable */
131#define UCR4_BKEN (1<<2) /* Break condition interrupt enable */ 131#define UCR4_BKEN (1<<2) /* Break condition interrupt enable */
132#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ 132#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */
133#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ 133#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */
134#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ 134#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */
135#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */ 135#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */
136#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ 136#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */
137#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) 137#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7)
138#define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ 138#define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */
139#define USR1_PARITYERR (1<<15) /* Parity error interrupt flag */ 139#define USR1_PARITYERR (1<<15) /* Parity error interrupt flag */
140#define USR1_RTSS (1<<14) /* RTS pin status */ 140#define USR1_RTSS (1<<14) /* RTS pin status */
141#define USR1_TRDY (1<<13) /* Transmitter ready interrupt/dma flag */ 141#define USR1_TRDY (1<<13) /* Transmitter ready interrupt/dma flag */
142#define USR1_RTSD (1<<12) /* RTS delta */ 142#define USR1_RTSD (1<<12) /* RTS delta */
143#define USR1_ESCF (1<<11) /* Escape seq interrupt flag */ 143#define USR1_ESCF (1<<11) /* Escape seq interrupt flag */
144#define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */ 144#define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */
145#define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */ 145#define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */
146#define USR1_TIMEOUT (1<<7) /* Receive timeout interrupt status */ 146#define USR1_TIMEOUT (1<<7) /* Receive timeout interrupt status */
147#define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */ 147#define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */
148#define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */ 148#define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */
149#define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */ 149#define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */
150#define USR2_ADET (1<<15) /* Auto baud rate detect complete */ 150#define USR2_ADET (1<<15) /* Auto baud rate detect complete */
151#define USR2_TXFE (1<<14) /* Transmit buffer FIFO empty */ 151#define USR2_TXFE (1<<14) /* Transmit buffer FIFO empty */
152#define USR2_DTRF (1<<13) /* DTR edge interrupt flag */ 152#define USR2_DTRF (1<<13) /* DTR edge interrupt flag */
153#define USR2_IDLE (1<<12) /* Idle condition */ 153#define USR2_IDLE (1<<12) /* Idle condition */
154#define USR2_IRINT (1<<8) /* Serial infrared interrupt flag */ 154#define USR2_IRINT (1<<8) /* Serial infrared interrupt flag */
155#define USR2_WAKE (1<<7) /* Wake */ 155#define USR2_WAKE (1<<7) /* Wake */
156#define USR2_RTSF (1<<4) /* RTS edge interrupt flag */ 156#define USR2_RTSF (1<<4) /* RTS edge interrupt flag */
157#define USR2_TXDC (1<<3) /* Transmitter complete */ 157#define USR2_TXDC (1<<3) /* Transmitter complete */
158#define USR2_BRCD (1<<2) /* Break condition */ 158#define USR2_BRCD (1<<2) /* Break condition */
159#define USR2_ORE (1<<1) /* Overrun error */ 159#define USR2_ORE (1<<1) /* Overrun error */
160#define USR2_RDR (1<<0) /* Recv data ready */ 160#define USR2_RDR (1<<0) /* Recv data ready */
161#define UTS_FRCPERR (1<<13) /* Force parity error */ 161#define UTS_FRCPERR (1<<13) /* Force parity error */
162#define UTS_LOOP (1<<12) /* Loop tx and rx */ 162#define UTS_LOOP (1<<12) /* Loop tx and rx */
163#define UTS_TXEMPTY (1<<6) /* TxFIFO empty */ 163#define UTS_TXEMPTY (1<<6) /* TxFIFO empty */
164#define UTS_RXEMPTY (1<<5) /* RxFIFO empty */ 164#define UTS_RXEMPTY (1<<5) /* RxFIFO empty */
165#define UTS_TXFULL (1<<4) /* TxFIFO full */ 165#define UTS_TXFULL (1<<4) /* TxFIFO full */
166#define UTS_RXFULL (1<<3) /* RxFIFO full */ 166#define UTS_RXFULL (1<<3) /* RxFIFO full */
167#define UTS_SOFTRST (1<<0) /* Software reset */ 167#define UTS_SOFTRST (1<<0) /* Software reset */
168 168
169/* We've been assigned a range on the "Low-density serial ports" major */ 169/* We've been assigned a range on the "Low-density serial ports" major */
170#define SERIAL_IMX_MAJOR 207 170#define SERIAL_IMX_MAJOR 207
171#define MINOR_START 16 171#define MINOR_START 16
172#define DEV_NAME "ttymxc" 172#define DEV_NAME "ttymxc"
173 173
174/* 174/*
@@ -199,7 +199,7 @@ struct imx_port {
199 struct uart_port port; 199 struct uart_port port;
200 struct timer_list timer; 200 struct timer_list timer;
201 unsigned int old_status; 201 unsigned int old_status;
202 int txirq,rxirq,rtsirq; 202 int txirq, rxirq, rtsirq;
203 unsigned int have_rtscts:1; 203 unsigned int have_rtscts:1;
204 unsigned int use_irda:1; 204 unsigned int use_irda:1;
205 unsigned int irda_inv_rx:1; 205 unsigned int irda_inv_rx:1;
@@ -397,7 +397,7 @@ static void imx_stop_rx(struct uart_port *port)
397 unsigned long temp; 397 unsigned long temp;
398 398
399 temp = readl(sport->port.membase + UCR2); 399 temp = readl(sport->port.membase + UCR2);
400 writel(temp &~ UCR2_RXEN, sport->port.membase + UCR2); 400 writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2);
401} 401}
402 402
403/* 403/*
@@ -490,9 +490,8 @@ static irqreturn_t imx_txint(int irq, void *dev_id)
490 struct circ_buf *xmit = &sport->port.state->xmit; 490 struct circ_buf *xmit = &sport->port.state->xmit;
491 unsigned long flags; 491 unsigned long flags;
492 492
493 spin_lock_irqsave(&sport->port.lock,flags); 493 spin_lock_irqsave(&sport->port.lock, flags);
494 if (sport->port.x_char) 494 if (sport->port.x_char) {
495 {
496 /* Send next char */ 495 /* Send next char */
497 writel(sport->port.x_char, sport->port.membase + URTX0); 496 writel(sport->port.x_char, sport->port.membase + URTX0);
498 goto out; 497 goto out;
@@ -509,18 +508,18 @@ static irqreturn_t imx_txint(int irq, void *dev_id)
509 uart_write_wakeup(&sport->port); 508 uart_write_wakeup(&sport->port);
510 509
511out: 510out:
512 spin_unlock_irqrestore(&sport->port.lock,flags); 511 spin_unlock_irqrestore(&sport->port.lock, flags);
513 return IRQ_HANDLED; 512 return IRQ_HANDLED;
514} 513}
515 514
516static irqreturn_t imx_rxint(int irq, void *dev_id) 515static irqreturn_t imx_rxint(int irq, void *dev_id)
517{ 516{
518 struct imx_port *sport = dev_id; 517 struct imx_port *sport = dev_id;
519 unsigned int rx,flg,ignored = 0; 518 unsigned int rx, flg, ignored = 0;
520 struct tty_struct *tty = sport->port.state->port.tty; 519 struct tty_port *port = &sport->port.state->port;
521 unsigned long flags, temp; 520 unsigned long flags, temp;
522 521
523 spin_lock_irqsave(&sport->port.lock,flags); 522 spin_lock_irqsave(&sport->port.lock, flags);
524 523
525 while (readl(sport->port.membase + USR2) & USR2_RDR) { 524 while (readl(sport->port.membase + USR2) & USR2_RDR) {
526 flg = TTY_NORMAL; 525 flg = TTY_NORMAL;
@@ -570,12 +569,12 @@ static irqreturn_t imx_rxint(int irq, void *dev_id)
570#endif 569#endif
571 } 570 }
572 571
573 tty_insert_flip_char(tty, rx, flg); 572 tty_insert_flip_char(port, rx, flg);
574 } 573 }
575 574
576out: 575out:
577 spin_unlock_irqrestore(&sport->port.lock,flags); 576 spin_unlock_irqrestore(&sport->port.lock, flags);
578 tty_flip_buffer_push(tty); 577 tty_flip_buffer_push(port);
579 return IRQ_HANDLED; 578 return IRQ_HANDLED;
580} 579}
581 580
@@ -654,7 +653,7 @@ static void imx_break_ctl(struct uart_port *port, int break_state)
654 653
655 temp = readl(sport->port.membase + UCR1) & ~UCR1_SNDBRK; 654 temp = readl(sport->port.membase + UCR1) & ~UCR1_SNDBRK;
656 655
657 if ( break_state != 0 ) 656 if (break_state != 0)
658 temp |= UCR1_SNDBRK; 657 temp |= UCR1_SNDBRK;
659 658
660 writel(temp, sport->port.membase + UCR1); 659 writel(temp, sport->port.membase + UCR1);
@@ -696,8 +695,8 @@ static int imx_startup(struct uart_port *port)
696 temp |= UCR4_IRSC; 695 temp |= UCR4_IRSC;
697 696
698 /* set the trigger level for CTS */ 697 /* set the trigger level for CTS */
699 temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF); 698 temp &= ~(UCR4_CTSTL_MASK << UCR4_CTSTL_SHF);
700 temp |= CTSTL<< UCR4_CTSTL_SHF; 699 temp |= CTSTL << UCR4_CTSTL_SHF;
701 700
702 writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); 701 writel(temp & ~UCR4_DREN, sport->port.membase + UCR4);
703 702
@@ -799,7 +798,7 @@ static int imx_startup(struct uart_port *port)
799 * Enable modem status interrupts 798 * Enable modem status interrupts
800 */ 799 */
801 imx_enable_ms(&sport->port); 800 imx_enable_ms(&sport->port);
802 spin_unlock_irqrestore(&sport->port.lock,flags); 801 spin_unlock_irqrestore(&sport->port.lock, flags);
803 802
804 if (USE_IRDA(sport)) { 803 if (USE_IRDA(sport)) {
805 struct imxuart_platform_data *pdata; 804 struct imxuart_platform_data *pdata;
@@ -909,7 +908,7 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
909 ucr2 = UCR2_SRST | UCR2_IRTS; 908 ucr2 = UCR2_SRST | UCR2_IRTS;
910 909
911 if (termios->c_cflag & CRTSCTS) { 910 if (termios->c_cflag & CRTSCTS) {
912 if( sport->have_rtscts ) { 911 if (sport->have_rtscts) {
913 ucr2 &= ~UCR2_IRTS; 912 ucr2 &= ~UCR2_IRTS;
914 ucr2 |= UCR2_CTSC; 913 ucr2 |= UCR2_CTSC;
915 } else { 914 } else {
@@ -969,12 +968,12 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
969 writel(old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN), 968 writel(old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN),
970 sport->port.membase + UCR1); 969 sport->port.membase + UCR1);
971 970
972 while ( !(readl(sport->port.membase + USR2) & USR2_TXDC)) 971 while (!(readl(sport->port.membase + USR2) & USR2_TXDC))
973 barrier(); 972 barrier();
974 973
975 /* then, disable everything */ 974 /* then, disable everything */
976 old_txrxen = readl(sport->port.membase + UCR2); 975 old_txrxen = readl(sport->port.membase + UCR2);
977 writel(old_txrxen & ~( UCR2_TXEN | UCR2_RXEN), 976 writel(old_txrxen & ~(UCR2_TXEN | UCR2_RXEN),
978 sport->port.membase + UCR2); 977 sport->port.membase + UCR2);
979 old_txrxen &= (UCR2_TXEN | UCR2_RXEN); 978 old_txrxen &= (UCR2_TXEN | UCR2_RXEN);
980 979
@@ -1255,7 +1254,7 @@ imx_console_get_options(struct imx_port *sport, int *baud,
1255 1254
1256 if (readl(sport->port.membase + UCR1) & UCR1_UARTEN) { 1255 if (readl(sport->port.membase + UCR1) & UCR1_UARTEN) {
1257 /* ok, the port was enabled */ 1256 /* ok, the port was enabled */
1258 unsigned int ucr2, ubir,ubmr, uartclk; 1257 unsigned int ucr2, ubir, ubmr, uartclk;
1259 unsigned int baud_raw; 1258 unsigned int baud_raw;
1260 unsigned int ucfr_rfdiv; 1259 unsigned int ucfr_rfdiv;
1261 1260
@@ -1301,8 +1300,8 @@ imx_console_get_options(struct imx_port *sport, int *baud,
1301 *baud = (baud_raw + 50) / 100 * 100; 1300 *baud = (baud_raw + 50) / 100 * 100;
1302 } 1301 }
1303 1302
1304 if(*baud != baud_raw) 1303 if (*baud != baud_raw)
1305 printk(KERN_INFO "Serial: Console IMX rounded baud rate from %d to %d\n", 1304 pr_info("Console IMX rounded baud rate from %d to %d\n",
1306 baud_raw, *baud); 1305 baud_raw, *baud);
1307 } 1306 }
1308} 1307}
@@ -1324,7 +1323,7 @@ imx_console_setup(struct console *co, char *options)
1324 if (co->index == -1 || co->index >= ARRAY_SIZE(imx_ports)) 1323 if (co->index == -1 || co->index >= ARRAY_SIZE(imx_ports))
1325 co->index = 0; 1324 co->index = 0;
1326 sport = imx_ports[co->index]; 1325 sport = imx_ports[co->index];
1327 if(sport == NULL) 1326 if (sport == NULL)
1328 return -ENODEV; 1327 return -ENODEV;
1329 1328
1330 if (options) 1329 if (options)
@@ -1462,7 +1461,7 @@ static int serial_imx_probe(struct platform_device *pdev)
1462 struct resource *res; 1461 struct resource *res;
1463 struct pinctrl *pinctrl; 1462 struct pinctrl *pinctrl;
1464 1463
1465 sport = kzalloc(sizeof(*sport), GFP_KERNEL); 1464 sport = devm_kzalloc(&pdev->dev, sizeof(*sport), GFP_KERNEL);
1466 if (!sport) 1465 if (!sport)
1467 return -ENOMEM; 1466 return -ENOMEM;
1468 1467
@@ -1470,19 +1469,15 @@ static int serial_imx_probe(struct platform_device *pdev)
1470 if (ret > 0) 1469 if (ret > 0)
1471 serial_imx_probe_pdata(sport, pdev); 1470 serial_imx_probe_pdata(sport, pdev);
1472 else if (ret < 0) 1471 else if (ret < 0)
1473 goto free; 1472 return ret;
1474 1473
1475 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1474 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1476 if (!res) { 1475 if (!res)
1477 ret = -ENODEV; 1476 return -ENODEV;
1478 goto free;
1479 }
1480 1477
1481 base = ioremap(res->start, PAGE_SIZE); 1478 base = devm_ioremap(&pdev->dev, res->start, PAGE_SIZE);
1482 if (!base) { 1479 if (!base)
1483 ret = -ENOMEM; 1480 return -ENOMEM;
1484 goto free;
1485 }
1486 1481
1487 sport->port.dev = &pdev->dev; 1482 sport->port.dev = &pdev->dev;
1488 sport->port.mapbase = res->start; 1483 sport->port.mapbase = res->start;
@@ -1504,21 +1499,21 @@ static int serial_imx_probe(struct platform_device *pdev)
1504 if (IS_ERR(pinctrl)) { 1499 if (IS_ERR(pinctrl)) {
1505 ret = PTR_ERR(pinctrl); 1500 ret = PTR_ERR(pinctrl);
1506 dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret); 1501 dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret);
1507 goto unmap; 1502 return ret;
1508 } 1503 }
1509 1504
1510 sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); 1505 sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1511 if (IS_ERR(sport->clk_ipg)) { 1506 if (IS_ERR(sport->clk_ipg)) {
1512 ret = PTR_ERR(sport->clk_ipg); 1507 ret = PTR_ERR(sport->clk_ipg);
1513 dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret); 1508 dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
1514 goto unmap; 1509 return ret;
1515 } 1510 }
1516 1511
1517 sport->clk_per = devm_clk_get(&pdev->dev, "per"); 1512 sport->clk_per = devm_clk_get(&pdev->dev, "per");
1518 if (IS_ERR(sport->clk_per)) { 1513 if (IS_ERR(sport->clk_per)) {
1519 ret = PTR_ERR(sport->clk_per); 1514 ret = PTR_ERR(sport->clk_per);
1520 dev_err(&pdev->dev, "failed to get per clk: %d\n", ret); 1515 dev_err(&pdev->dev, "failed to get per clk: %d\n", ret);
1521 goto unmap; 1516 return ret;
1522 } 1517 }
1523 1518
1524 clk_prepare_enable(sport->clk_per); 1519 clk_prepare_enable(sport->clk_per);
@@ -1547,11 +1542,6 @@ deinit:
1547clkput: 1542clkput:
1548 clk_disable_unprepare(sport->clk_per); 1543 clk_disable_unprepare(sport->clk_per);
1549 clk_disable_unprepare(sport->clk_ipg); 1544 clk_disable_unprepare(sport->clk_ipg);
1550unmap:
1551 iounmap(sport->port.membase);
1552free:
1553 kfree(sport);
1554
1555 return ret; 1545 return ret;
1556} 1546}
1557 1547
@@ -1572,9 +1562,6 @@ static int serial_imx_remove(struct platform_device *pdev)
1572 if (pdata && pdata->exit) 1562 if (pdata && pdata->exit)
1573 pdata->exit(pdev); 1563 pdata->exit(pdev);
1574 1564
1575 iounmap(sport->port.membase);
1576 kfree(sport);
1577
1578 return 0; 1565 return 0;
1579} 1566}
1580 1567
@@ -1596,7 +1583,7 @@ static int __init imx_serial_init(void)
1596{ 1583{
1597 int ret; 1584 int ret;
1598 1585
1599 printk(KERN_INFO "Serial: IMX driver\n"); 1586 pr_info("Serial: IMX driver\n");
1600 1587
1601 ret = uart_register_driver(&imx_reg); 1588 ret = uart_register_driver(&imx_reg);
1602 if (ret) 1589 if (ret)