diff options
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/imx.c | 111 | ||||
-rw-r--r-- | drivers/serial/mcfserial.c | 1 | ||||
-rw-r--r-- | drivers/serial/sh-sci.c | 7 | ||||
-rw-r--r-- | drivers/serial/sh-sci.h | 60 |
4 files changed, 104 insertions, 75 deletions
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 16ba9ac7a566..5a375bf0ebf4 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -166,15 +166,6 @@ | |||
166 | #define SERIAL_IMX_MAJOR 204 | 166 | #define SERIAL_IMX_MAJOR 204 |
167 | #define MINOR_START 41 | 167 | #define MINOR_START 41 |
168 | 168 | ||
169 | #define NR_PORTS 2 | ||
170 | |||
171 | #define IMX_ISR_PASS_LIMIT 256 | ||
172 | |||
173 | /* | ||
174 | * This is the size of our serial port register set. | ||
175 | */ | ||
176 | #define UART_PORT_SIZE 0x100 | ||
177 | |||
178 | /* | 169 | /* |
179 | * This determines how often we check the modem status signals | 170 | * This determines how often we check the modem status signals |
180 | * for any change. They generally aren't connected to an IRQ | 171 | * for any change. They generally aren't connected to an IRQ |
@@ -358,66 +349,60 @@ static irqreturn_t imx_rxint(int irq, void *dev_id) | |||
358 | struct tty_struct *tty = sport->port.info->tty; | 349 | struct tty_struct *tty = sport->port.info->tty; |
359 | unsigned long flags, temp; | 350 | unsigned long flags, temp; |
360 | 351 | ||
361 | rx = readl(sport->port.membase + URXD0); | ||
362 | spin_lock_irqsave(&sport->port.lock,flags); | 352 | spin_lock_irqsave(&sport->port.lock,flags); |
363 | 353 | ||
364 | do { | 354 | while (readl(sport->port.membase + USR2) & USR2_RDR) { |
365 | flg = TTY_NORMAL; | 355 | flg = TTY_NORMAL; |
366 | sport->port.icount.rx++; | 356 | sport->port.icount.rx++; |
367 | 357 | ||
358 | rx = readl(sport->port.membase + URXD0); | ||
359 | |||
368 | temp = readl(sport->port.membase + USR2); | 360 | temp = readl(sport->port.membase + USR2); |
369 | if( temp & USR2_BRCD ) { | 361 | if (temp & USR2_BRCD) { |
370 | writel(temp | USR2_BRCD, sport->port.membase + USR2); | 362 | writel(temp | USR2_BRCD, sport->port.membase + USR2); |
371 | if(uart_handle_break(&sport->port)) | 363 | if (uart_handle_break(&sport->port)) |
372 | goto ignore_char; | 364 | continue; |
373 | } | 365 | } |
374 | 366 | ||
375 | if (uart_handle_sysrq_char | 367 | if (uart_handle_sysrq_char |
376 | (&sport->port, (unsigned char)rx)) | 368 | (&sport->port, (unsigned char)rx)) |
377 | goto ignore_char; | 369 | continue; |
370 | |||
371 | if (rx & (URXD_PRERR | URXD_OVRRUN | URXD_FRMERR) ) { | ||
372 | if (rx & URXD_PRERR) | ||
373 | sport->port.icount.parity++; | ||
374 | else if (rx & URXD_FRMERR) | ||
375 | sport->port.icount.frame++; | ||
376 | if (rx & URXD_OVRRUN) | ||
377 | sport->port.icount.overrun++; | ||
378 | |||
379 | if (rx & sport->port.ignore_status_mask) { | ||
380 | if (++ignored > 100) | ||
381 | goto out; | ||
382 | continue; | ||
383 | } | ||
384 | |||
385 | rx &= sport->port.read_status_mask; | ||
386 | |||
387 | if (rx & URXD_PRERR) | ||
388 | flg = TTY_PARITY; | ||
389 | else if (rx & URXD_FRMERR) | ||
390 | flg = TTY_FRAME; | ||
391 | if (rx & URXD_OVRRUN) | ||
392 | flg = TTY_OVERRUN; | ||
378 | 393 | ||
379 | if( rx & (URXD_PRERR | URXD_OVRRUN | URXD_FRMERR) ) | 394 | #ifdef SUPPORT_SYSRQ |
380 | goto handle_error; | 395 | sport->port.sysrq = 0; |
396 | #endif | ||
397 | } | ||
381 | 398 | ||
382 | error_return: | ||
383 | tty_insert_flip_char(tty, rx, flg); | 399 | tty_insert_flip_char(tty, rx, flg); |
384 | 400 | } | |
385 | ignore_char: | ||
386 | rx = readl(sport->port.membase + URXD0); | ||
387 | } while(rx & URXD_CHARRDY); | ||
388 | 401 | ||
389 | out: | 402 | out: |
390 | spin_unlock_irqrestore(&sport->port.lock,flags); | 403 | spin_unlock_irqrestore(&sport->port.lock,flags); |
391 | tty_flip_buffer_push(tty); | 404 | tty_flip_buffer_push(tty); |
392 | return IRQ_HANDLED; | 405 | return IRQ_HANDLED; |
393 | |||
394 | handle_error: | ||
395 | if (rx & URXD_PRERR) | ||
396 | sport->port.icount.parity++; | ||
397 | else if (rx & URXD_FRMERR) | ||
398 | sport->port.icount.frame++; | ||
399 | if (rx & URXD_OVRRUN) | ||
400 | sport->port.icount.overrun++; | ||
401 | |||
402 | if (rx & sport->port.ignore_status_mask) { | ||
403 | if (++ignored > 100) | ||
404 | goto out; | ||
405 | goto ignore_char; | ||
406 | } | ||
407 | |||
408 | rx &= sport->port.read_status_mask; | ||
409 | |||
410 | if (rx & URXD_PRERR) | ||
411 | flg = TTY_PARITY; | ||
412 | else if (rx & URXD_FRMERR) | ||
413 | flg = TTY_FRAME; | ||
414 | if (rx & URXD_OVRRUN) | ||
415 | flg = TTY_OVERRUN; | ||
416 | |||
417 | #ifdef SUPPORT_SYSRQ | ||
418 | sport->port.sysrq = 0; | ||
419 | #endif | ||
420 | goto error_return; | ||
421 | } | 406 | } |
422 | 407 | ||
423 | /* | 408 | /* |
@@ -546,7 +531,7 @@ static int imx_startup(struct uart_port *port) | |||
546 | writel(USR1_RTSD, sport->port.membase + USR1); | 531 | writel(USR1_RTSD, sport->port.membase + USR1); |
547 | 532 | ||
548 | temp = readl(sport->port.membase + UCR1); | 533 | temp = readl(sport->port.membase + UCR1); |
549 | temp |= (UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN); | 534 | temp |= UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN; |
550 | writel(temp, sport->port.membase + UCR1); | 535 | writel(temp, sport->port.membase + UCR1); |
551 | 536 | ||
552 | temp = readl(sport->port.membase + UCR2); | 537 | temp = readl(sport->port.membase + UCR2); |
@@ -731,9 +716,11 @@ static const char *imx_type(struct uart_port *port) | |||
731 | */ | 716 | */ |
732 | static void imx_release_port(struct uart_port *port) | 717 | static void imx_release_port(struct uart_port *port) |
733 | { | 718 | { |
734 | struct imx_port *sport = (struct imx_port *)port; | 719 | struct platform_device *pdev = to_platform_device(port->dev); |
720 | struct resource *mmres; | ||
735 | 721 | ||
736 | release_mem_region(sport->port.mapbase, UART_PORT_SIZE); | 722 | mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
723 | release_mem_region(mmres->start, mmres->end - mmres->start + 1); | ||
737 | } | 724 | } |
738 | 725 | ||
739 | /* | 726 | /* |
@@ -741,10 +728,18 @@ static void imx_release_port(struct uart_port *port) | |||
741 | */ | 728 | */ |
742 | static int imx_request_port(struct uart_port *port) | 729 | static int imx_request_port(struct uart_port *port) |
743 | { | 730 | { |
744 | struct imx_port *sport = (struct imx_port *)port; | 731 | struct platform_device *pdev = to_platform_device(port->dev); |
732 | struct resource *mmres; | ||
733 | void *ret; | ||
734 | |||
735 | mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
736 | if (!mmres) | ||
737 | return -ENODEV; | ||
738 | |||
739 | ret = request_mem_region(mmres->start, mmres->end - mmres->start + 1, | ||
740 | "imx-uart"); | ||
745 | 741 | ||
746 | return request_mem_region(sport->port.mapbase, UART_PORT_SIZE, | 742 | return ret ? 0 : -EBUSY; |
747 | "imx-uart") != NULL ? 0 : -EBUSY; | ||
748 | } | 743 | } |
749 | 744 | ||
750 | /* | 745 | /* |
@@ -815,7 +810,7 @@ static struct imx_port imx_ports[] = { | |||
815 | .type = PORT_IMX, | 810 | .type = PORT_IMX, |
816 | .iotype = UPIO_MEM, | 811 | .iotype = UPIO_MEM, |
817 | .membase = (void *)IMX_UART1_BASE, | 812 | .membase = (void *)IMX_UART1_BASE, |
818 | .mapbase = IMX_UART1_BASE, /* FIXME */ | 813 | .mapbase = 0x00206000, |
819 | .irq = UART1_MINT_RX, | 814 | .irq = UART1_MINT_RX, |
820 | .uartclk = 16000000, | 815 | .uartclk = 16000000, |
821 | .fifosize = 32, | 816 | .fifosize = 32, |
@@ -831,7 +826,7 @@ static struct imx_port imx_ports[] = { | |||
831 | .type = PORT_IMX, | 826 | .type = PORT_IMX, |
832 | .iotype = UPIO_MEM, | 827 | .iotype = UPIO_MEM, |
833 | .membase = (void *)IMX_UART2_BASE, | 828 | .membase = (void *)IMX_UART2_BASE, |
834 | .mapbase = IMX_UART2_BASE, /* FIXME */ | 829 | .mapbase = 0x00207000, |
835 | .irq = UART2_MINT_RX, | 830 | .irq = UART2_MINT_RX, |
836 | .uartclk = 16000000, | 831 | .uartclk = 16000000, |
837 | .fifosize = 32, | 832 | .fifosize = 32, |
diff --git a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c index 99af084c7cec..ddd3aa50d4ad 100644 --- a/drivers/serial/mcfserial.c +++ b/drivers/serial/mcfserial.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | #include <asm/irq.h> | 41 | #include <asm/irq.h> |
42 | #include <asm/system.h> | 42 | #include <asm/system.h> |
43 | #include <asm/semaphore.h> | ||
44 | #include <asm/delay.h> | 43 | #include <asm/delay.h> |
45 | #include <asm/coldfire.h> | 44 | #include <asm/coldfire.h> |
46 | #include <asm/mcfsim.h> | 45 | #include <asm/mcfsim.h> |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index eff593080d4f..c2ea5d4df44a 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -333,7 +333,6 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | |||
333 | } | 333 | } |
334 | sci_out(port, SCFCR, fcr_val); | 334 | sci_out(port, SCFCR, fcr_val); |
335 | } | 335 | } |
336 | |||
337 | #elif defined(CONFIG_CPU_SH3) | 336 | #elif defined(CONFIG_CPU_SH3) |
338 | /* For SH7705, SH7706, SH7707, SH7709, SH7709A, SH7729 */ | 337 | /* For SH7705, SH7706, SH7707, SH7709, SH7709A, SH7729 */ |
339 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | 338 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) |
@@ -384,6 +383,12 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | |||
384 | 383 | ||
385 | sci_out(port, SCFCR, fcr_val); | 384 | sci_out(port, SCFCR, fcr_val); |
386 | } | 385 | } |
386 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
387 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | ||
388 | { | ||
389 | /* Nothing to do here.. */ | ||
390 | sci_out(port, SCFCR, 0); | ||
391 | } | ||
387 | #else | 392 | #else |
388 | /* For SH7750 */ | 393 | /* For SH7750 */ |
389 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | 394 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) |
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h index 01a9dd715f5d..fa8700a968fc 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h | |||
@@ -1,20 +1,5 @@ | |||
1 | /* $Id: sh-sci.h,v 1.4 2004/02/19 16:43:56 lethal Exp $ | ||
2 | * | ||
3 | * linux/drivers/serial/sh-sci.h | ||
4 | * | ||
5 | * SuperH on-chip serial module support. (SCI with no FIFO / with FIFO) | ||
6 | * Copyright (C) 1999, 2000 Niibe Yutaka | ||
7 | * Copyright (C) 2000 Greg Banks | ||
8 | * Copyright (C) 2002, 2003 Paul Mundt | ||
9 | * Modified to support multiple serial ports. Stuart Menefy (May 2000). | ||
10 | * Modified to support SH7300(SH-Mobile) SCIF. Takashi Kusuda (Jun 2003). | ||
11 | * Modified to support H8/300 Series Yoshinori Sato (Feb 2004). | ||
12 | * Removed SH7300 support (Jul 2007). | ||
13 | * Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Aug 2007). | ||
14 | */ | ||
15 | #include <linux/serial_core.h> | 1 | #include <linux/serial_core.h> |
16 | #include <asm/io.h> | 2 | #include <asm/io.h> |
17 | |||
18 | #include <asm/gpio.h> | 3 | #include <asm/gpio.h> |
19 | 4 | ||
20 | #if defined(CONFIG_H83007) || defined(CONFIG_H83068) | 5 | #if defined(CONFIG_H83007) || defined(CONFIG_H83068) |
@@ -102,6 +87,15 @@ | |||
102 | # define SCSPTR0 SCPDR0 | 87 | # define SCSPTR0 SCPDR0 |
103 | # define SCIF_ORER 0x0001 /* overrun error bit */ | 88 | # define SCIF_ORER 0x0001 /* overrun error bit */ |
104 | # define SCSCR_INIT(port) 0x0038 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ | 89 | # define SCSCR_INIT(port) 0x0038 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ |
90 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
91 | # define SCSPTR0 0xa4050160 | ||
92 | # define SCSPTR1 0xa405013e | ||
93 | # define SCSPTR2 0xa4050160 | ||
94 | # define SCSPTR3 0xa405013e | ||
95 | # define SCSPTR4 0xa4050128 | ||
96 | # define SCSPTR5 0xa4050128 | ||
97 | # define SCIF_ORER 0x0001 /* overrun error bit */ | ||
98 | # define SCSCR_INIT(port) 0x0038 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ | ||
105 | # define SCIF_ONLY | 99 | # define SCIF_ONLY |
106 | #elif defined(CONFIG_CPU_SUBTYPE_SH4_202) | 100 | #elif defined(CONFIG_CPU_SUBTYPE_SH4_202) |
107 | # define SCSPTR2 0xffe80020 /* 16 bit SCIF */ | 101 | # define SCSPTR2 0xffe80020 /* 16 bit SCIF */ |
@@ -395,6 +389,11 @@ | |||
395 | h8_sci_offset, h8_sci_size) \ | 389 | h8_sci_offset, h8_sci_size) \ |
396 | CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size) | 390 | CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size) |
397 | #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) | 391 | #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) |
392 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
393 | #define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scif_offset, sh4_scif_size) \ | ||
394 | CPU_SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scif_offset, sh4_scif_size) | ||
395 | #define SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) \ | ||
396 | CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) | ||
398 | #else | 397 | #else |
399 | #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \ | 398 | #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \ |
400 | sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \ | 399 | sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \ |
@@ -419,6 +418,18 @@ SCIF_FNS(SCFDR, 0x1c, 16) | |||
419 | SCIF_FNS(SCxTDR, 0x20, 8) | 418 | SCIF_FNS(SCxTDR, 0x20, 8) |
420 | SCIF_FNS(SCxRDR, 0x24, 8) | 419 | SCIF_FNS(SCxRDR, 0x24, 8) |
421 | SCIF_FNS(SCLSR, 0x24, 16) | 420 | SCIF_FNS(SCLSR, 0x24, 16) |
421 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
422 | SCIx_FNS(SCSMR, 0x00, 16, 0x00, 16) | ||
423 | SCIx_FNS(SCBRR, 0x04, 8, 0x04, 8) | ||
424 | SCIx_FNS(SCSCR, 0x08, 16, 0x08, 16) | ||
425 | SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8) | ||
426 | SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16) | ||
427 | SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8) | ||
428 | SCIF_FNS(SCTDSR, 0x0c, 8) | ||
429 | SCIF_FNS(SCFER, 0x10, 16) | ||
430 | SCIF_FNS(SCFCR, 0x18, 16) | ||
431 | SCIF_FNS(SCFDR, 0x1c, 16) | ||
432 | SCIF_FNS(SCLSR, 0x24, 16) | ||
422 | #else | 433 | #else |
423 | /* reg SCI/SH3 SCI/SH4 SCIF/SH3 SCIF/SH4 SCI/H8*/ | 434 | /* reg SCI/SH3 SCI/SH4 SCIF/SH3 SCIF/SH4 SCI/H8*/ |
424 | /* name off sz off sz off sz off sz off sz*/ | 435 | /* name off sz off sz off sz off sz off sz*/ |
@@ -589,6 +600,23 @@ static inline int sci_rxd_in(struct uart_port *port) | |||
589 | return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */ | 600 | return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */ |
590 | return 1; | 601 | return 1; |
591 | } | 602 | } |
603 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
604 | static inline int sci_rxd_in(struct uart_port *port) | ||
605 | { | ||
606 | if (port->mapbase == 0xffe00000) | ||
607 | return ctrl_inb(SCSPTR0) & 0x0008 ? 1 : 0; /* SCIF0 */ | ||
608 | if (port->mapbase == 0xffe10000) | ||
609 | return ctrl_inb(SCSPTR1) & 0x0020 ? 1 : 0; /* SCIF1 */ | ||
610 | if (port->mapbase == 0xffe20000) | ||
611 | return ctrl_inb(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF2 */ | ||
612 | if (port->mapbase == 0xa4e30000) | ||
613 | return ctrl_inb(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF3 */ | ||
614 | if (port->mapbase == 0xa4e40000) | ||
615 | return ctrl_inb(SCSPTR4) & 0x0001 ? 1 : 0; /* SCIF4 */ | ||
616 | if (port->mapbase == 0xa4e50000) | ||
617 | return ctrl_inb(SCSPTR5) & 0x0008 ? 1 : 0; /* SCIF5 */ | ||
618 | return 1; | ||
619 | } | ||
592 | #elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103) | 620 | #elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103) |
593 | static inline int sci_rxd_in(struct uart_port *port) | 621 | static inline int sci_rxd_in(struct uart_port *port) |
594 | { | 622 | { |
@@ -727,6 +755,8 @@ static inline int sci_rxd_in(struct uart_port *port) | |||
727 | defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | 755 | defined(CONFIG_CPU_SUBTYPE_SH7720) || \ |
728 | defined(CONFIG_CPU_SUBTYPE_SH7721) | 756 | defined(CONFIG_CPU_SUBTYPE_SH7721) |
729 | #define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1) | 757 | #define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1) |
758 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
759 | #define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(16*bps)-1) | ||
730 | #elif defined(__H8300H__) || defined(__H8300S__) | 760 | #elif defined(__H8300H__) || defined(__H8300S__) |
731 | #define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1) | 761 | #define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1) |
732 | #elif defined(CONFIG_SUPERH64) | 762 | #elif defined(CONFIG_SUPERH64) |