6262#define UBIR 0xa4 /* BRM Incremental Register */
6363#define UBMR 0xa8 /* BRM Modulator Register */
6464#define UBRC 0xac /* Baud Rate Count Register */
65+ #ifdef CONFIG_ARCH_MX3
66+ #define ONEMS 0xb0 /* One Millisecond register */
67+ #define UTS 0xb4 /* UART Test Register */
68+ #endif
69+ #ifdef CONFIG_ARCH_IMX
6570#define BIPR1 0xb0 /* Incremental Preset Register 1 */
6671#define BIPR2 0xb4 /* Incremental Preset Register 2 */
6772#define BIPR3 0xb8 /* Incremental Preset Register 3 */
7176#define BMPR3 0xc8 /* BRM Modulator Register 3 */
7277#define BMPR4 0xcc /* BRM Modulator Register 4 */
7378#define UTS 0xd0 /* UART Test Register */
79+ #endif
7480
7581/* UART Control Register Bit Fields.*/
7682#define URXD_CHARRDY (1<<15)
9096#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */
9197#define UCR1_SNDBRK (1<<4) /* Send break */
9298#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */
99+ #ifdef CONFIG_ARCH_IMX
93100#define UCR1_UARTCLKEN (1<<2) /* UART clock enabled */
101+ #endif
102+ #ifdef CONFIG_ARCH_MX3
103+ #define UCR1_UARTCLKEN (0) /* not present on mx2/mx3 */
104+ #endif
94105#define UCR1_DOZE (1<<1) /* Doze */
95106#define UCR1_UARTEN (1<<0) /* UART enabled */
96107#define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */
164175#define UTS_SOFTRST (1<<0) /* Software reset */
165176
166177/* We've been assigned a range on the "Low-density serial ports" major */
178+ #ifdef CONFIG_ARCH_IMX
167179#define SERIAL_IMX_MAJOR 204
168180#define MINOR_START 41
181+ #define DEV_NAME "ttySMX"
182+ #define MAX_INTERNAL_IRQ IMX_IRQS
183+ #endif
184+
185+ #ifdef CONFIG_ARCH_MX3
186+ #define SERIAL_IMX_MAJOR 207
187+ #define MINOR_START 16
188+ #define DEV_NAME "ttymxc"
189+ #define MAX_INTERNAL_IRQ MXC_MAX_INT_LINES
190+ #endif
169191
170192/*
171193 * This determines how often we check the modem status signals
@@ -409,6 +431,26 @@ static irqreturn_t imx_rxint(int irq, void *dev_id)
409431 return IRQ_HANDLED ;
410432}
411433
434+ static irqreturn_t imx_int (int irq , void * dev_id )
435+ {
436+ struct imx_port * sport = dev_id ;
437+ unsigned int sts ;
438+
439+ sts = readl (sport -> port .membase + USR1 );
440+
441+ if (sts & USR1_RRDY )
442+ imx_rxint (irq , dev_id );
443+
444+ if (sts & USR1_TRDY &&
445+ readl (sport -> port .membase + UCR1 ) & UCR1_TXMPTYEN )
446+ imx_txint (irq , dev_id );
447+
448+ if (sts & USR1_RTSS )
449+ imx_rtsint (irq , dev_id );
450+
451+ return IRQ_HANDLED ;
452+ }
453+
412454/*
413455 * Return TIOCSER_TEMT when transmitter is not busy.
414456 */
@@ -514,21 +556,34 @@ static int imx_startup(struct uart_port *port)
514556 writel (temp & ~UCR4_DREN , sport -> port .membase + UCR4 );
515557
516558 /*
517- * Allocate the IRQ
559+ * Allocate the IRQ(s) i.MX1 has three interrupts whereas later
560+ * chips only have one interrupt.
518561 */
519- retval = request_irq (sport -> rxirq , imx_rxint , 0 ,
520- DRIVER_NAME , sport );
521- if (retval ) goto error_out1 ;
522-
523- retval = request_irq (sport -> txirq , imx_txint , 0 ,
524- DRIVER_NAME , sport );
525- if (retval ) goto error_out2 ;
526-
527- retval = request_irq (sport -> rtsirq , imx_rtsint ,
528- (sport -> rtsirq < IMX_IRQS ) ? 0 :
562+ if (sport -> txirq > 0 ) {
563+ retval = request_irq (sport -> rxirq , imx_rxint , 0 ,
564+ DRIVER_NAME , sport );
565+ if (retval )
566+ goto error_out1 ;
567+
568+ retval = request_irq (sport -> txirq , imx_txint , 0 ,
569+ DRIVER_NAME , sport );
570+ if (retval )
571+ goto error_out2 ;
572+
573+ retval = request_irq (sport -> rtsirq , imx_rtsint ,
574+ (sport -> rtsirq < MAX_INTERNAL_IRQ ) ? 0 :
529575 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING ,
530- DRIVER_NAME , sport );
531- if (retval ) goto error_out3 ;
576+ DRIVER_NAME , sport );
577+ if (retval )
578+ goto error_out3 ;
579+ } else {
580+ retval = request_irq (sport -> port .irq , imx_int , 0 ,
581+ DRIVER_NAME , sport );
582+ if (retval ) {
583+ free_irq (sport -> port .irq , sport );
584+ goto error_out1 ;
585+ }
586+ }
532587
533588 /*
534589 * Finally, clear and enable interrupts
@@ -553,9 +608,11 @@ static int imx_startup(struct uart_port *port)
553608 return 0 ;
554609
555610error_out3 :
556- free_irq (sport -> txirq , sport );
611+ if (sport -> txirq )
612+ free_irq (sport -> txirq , sport );
557613error_out2 :
558- free_irq (sport -> rxirq , sport );
614+ if (sport -> rxirq )
615+ free_irq (sport -> rxirq , sport );
559616error_out1 :
560617 return retval ;
561618}
@@ -573,9 +630,12 @@ static void imx_shutdown(struct uart_port *port)
573630 /*
574631 * Free the interrupts
575632 */
576- free_irq (sport -> rtsirq , sport );
577- free_irq (sport -> txirq , sport );
578- free_irq (sport -> rxirq , sport );
633+ if (sport -> txirq > 0 ) {
634+ free_irq (sport -> rtsirq , sport );
635+ free_irq (sport -> txirq , sport );
636+ free_irq (sport -> rxirq , sport );
637+ } else
638+ free_irq (sport -> port .irq , sport );
579639
580640 /*
581641 * Disable all interrupts, port and break condition.
@@ -973,7 +1033,7 @@ imx_console_setup(struct console *co, char *options)
9731033
9741034static struct uart_driver imx_reg ;
9751035static struct console imx_console = {
976- .name = "ttySMX" ,
1036+ .name = DEV_NAME ,
9771037 .write = imx_console_write ,
9781038 .device = uart_console_device ,
9791039 .setup = imx_console_setup ,
@@ -990,7 +1050,7 @@ static struct console imx_console = {
9901050static struct uart_driver imx_reg = {
9911051 .owner = THIS_MODULE ,
9921052 .driver_name = DRIVER_NAME ,
993- .dev_name = "ttySMX" ,
1053+ .dev_name = DEV_NAME ,
9941054 .major = SERIAL_IMX_MAJOR ,
9951055 .minor = MINOR_START ,
9961056 .nr = ARRAY_SIZE (imx_ports ),
0 commit comments