diff options
| author | Jeff Garzik <jgarzik@pretzel.yyz.us> | 2005-06-26 23:38:58 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-26 23:38:58 -0400 |
| commit | 5696c1944a33b4434a9a1ebb6383b906afd43a10 (patch) | |
| tree | 16fbe6ba431bcf949ee8645510b0c2fd39b5810f /drivers/serial | |
| parent | 66b04a80eea60cabf9d89fd34deb3234a740052f (diff) | |
| parent | 020f46a39eb7b99a575b9f4d105fce2b142acdf1 (diff) | |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'drivers/serial')
| -rw-r--r-- | drivers/serial/68328serial.c | 9 | ||||
| -rw-r--r-- | drivers/serial/68360serial.c | 9 | ||||
| -rw-r--r-- | drivers/serial/8250.c | 64 | ||||
| -rw-r--r-- | drivers/serial/8250.h | 3 | ||||
| -rw-r--r-- | drivers/serial/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/serial/Makefile | 2 | ||||
| -rw-r--r-- | drivers/serial/au1x00_uart.c | 10 | ||||
| -rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_cpm2.c | 9 | ||||
| -rw-r--r-- | drivers/serial/icom.h | 2 | ||||
| -rw-r--r-- | drivers/serial/ioc4_serial.c | 336 | ||||
| -rw-r--r-- | drivers/serial/m32r_sio.c | 10 | ||||
| -rw-r--r-- | drivers/serial/mpsc.c | 8 | ||||
| -rw-r--r-- | drivers/serial/pxa.c | 10 | ||||
| -rw-r--r-- | drivers/serial/s3c2410.c | 4 | ||||
| -rw-r--r-- | drivers/serial/sa1100.c | 2 | ||||
| -rw-r--r-- | drivers/serial/sn_console.c | 1 | ||||
| -rw-r--r-- | drivers/serial/sunzilog.c | 8 | ||||
| -rw-r--r-- | drivers/serial/vr41xx_siu.c | 66 |
18 files changed, 260 insertions, 304 deletions
diff --git a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c index db92a0ceda79..feb8e73fc1c9 100644 --- a/drivers/serial/68328serial.c +++ b/drivers/serial/68328serial.c | |||
| @@ -992,18 +992,17 @@ static int get_lsr_info(struct m68k_serial * info, unsigned int *value) | |||
| 992 | /* | 992 | /* |
| 993 | * This routine sends a break character out the serial port. | 993 | * This routine sends a break character out the serial port. |
| 994 | */ | 994 | */ |
| 995 | static void send_break( struct m68k_serial * info, int duration) | 995 | static void send_break(struct m68k_serial * info, unsigned int duration) |
| 996 | { | 996 | { |
| 997 | m68328_uart *uart = &uart_addr[info->line]; | 997 | m68328_uart *uart = &uart_addr[info->line]; |
| 998 | unsigned long flags; | 998 | unsigned long flags; |
| 999 | if (!info->port) | 999 | if (!info->port) |
| 1000 | return; | 1000 | return; |
| 1001 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 1002 | save_flags(flags); | 1001 | save_flags(flags); |
| 1003 | cli(); | 1002 | cli(); |
| 1004 | #ifdef USE_INTS | 1003 | #ifdef USE_INTS |
| 1005 | uart->utx.w |= UTX_SEND_BREAK; | 1004 | uart->utx.w |= UTX_SEND_BREAK; |
| 1006 | schedule_timeout(duration); | 1005 | msleep_interruptible(duration); |
| 1007 | uart->utx.w &= ~UTX_SEND_BREAK; | 1006 | uart->utx.w &= ~UTX_SEND_BREAK; |
| 1008 | #endif | 1007 | #endif |
| 1009 | restore_flags(flags); | 1008 | restore_flags(flags); |
| @@ -1033,14 +1032,14 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file, | |||
| 1033 | return retval; | 1032 | return retval; |
| 1034 | tty_wait_until_sent(tty, 0); | 1033 | tty_wait_until_sent(tty, 0); |
| 1035 | if (!arg) | 1034 | if (!arg) |
| 1036 | send_break(info, HZ/4); /* 1/4 second */ | 1035 | send_break(info, 250); /* 1/4 second */ |
| 1037 | return 0; | 1036 | return 0; |
| 1038 | case TCSBRKP: /* support for POSIX tcsendbreak() */ | 1037 | case TCSBRKP: /* support for POSIX tcsendbreak() */ |
| 1039 | retval = tty_check_change(tty); | 1038 | retval = tty_check_change(tty); |
| 1040 | if (retval) | 1039 | if (retval) |
| 1041 | return retval; | 1040 | return retval; |
| 1042 | tty_wait_until_sent(tty, 0); | 1041 | tty_wait_until_sent(tty, 0); |
| 1043 | send_break(info, arg ? arg*(HZ/10) : HZ/4); | 1042 | send_break(info, arg ? arg*(100) : 250); |
| 1044 | return 0; | 1043 | return 0; |
| 1045 | case TIOCGSOFTCAR: | 1044 | case TIOCGSOFTCAR: |
| 1046 | error = put_user(C_CLOCAL(tty) ? 1 : 0, | 1045 | error = put_user(C_CLOCAL(tty) ? 1 : 0, |
diff --git a/drivers/serial/68360serial.c b/drivers/serial/68360serial.c index f148022b6b4e..b116122e569a 100644 --- a/drivers/serial/68360serial.c +++ b/drivers/serial/68360serial.c | |||
| @@ -1394,14 +1394,13 @@ static void end_break(ser_info_t *info) | |||
| 1394 | /* | 1394 | /* |
| 1395 | * This routine sends a break character out the serial port. | 1395 | * This routine sends a break character out the serial port. |
| 1396 | */ | 1396 | */ |
| 1397 | static void send_break(ser_info_t *info, int duration) | 1397 | static void send_break(ser_info_t *info, unsigned int duration) |
| 1398 | { | 1398 | { |
| 1399 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 1400 | #ifdef SERIAL_DEBUG_SEND_BREAK | 1399 | #ifdef SERIAL_DEBUG_SEND_BREAK |
| 1401 | printk("rs_send_break(%d) jiff=%lu...", duration, jiffies); | 1400 | printk("rs_send_break(%d) jiff=%lu...", duration, jiffies); |
| 1402 | #endif | 1401 | #endif |
| 1403 | begin_break(info); | 1402 | begin_break(info); |
| 1404 | schedule_timeout(duration); | 1403 | msleep_interruptible(duration); |
| 1405 | end_break(info); | 1404 | end_break(info); |
| 1406 | #ifdef SERIAL_DEBUG_SEND_BREAK | 1405 | #ifdef SERIAL_DEBUG_SEND_BREAK |
| 1407 | printk("done jiffies=%lu\n", jiffies); | 1406 | printk("done jiffies=%lu\n", jiffies); |
| @@ -1436,7 +1435,7 @@ static int rs_360_ioctl(struct tty_struct *tty, struct file * file, | |||
| 1436 | if (signal_pending(current)) | 1435 | if (signal_pending(current)) |
| 1437 | return -EINTR; | 1436 | return -EINTR; |
| 1438 | if (!arg) { | 1437 | if (!arg) { |
| 1439 | send_break(info, HZ/4); /* 1/4 second */ | 1438 | send_break(info, 250); /* 1/4 second */ |
| 1440 | if (signal_pending(current)) | 1439 | if (signal_pending(current)) |
| 1441 | return -EINTR; | 1440 | return -EINTR; |
| 1442 | } | 1441 | } |
| @@ -1448,7 +1447,7 @@ static int rs_360_ioctl(struct tty_struct *tty, struct file * file, | |||
| 1448 | tty_wait_until_sent(tty, 0); | 1447 | tty_wait_until_sent(tty, 0); |
| 1449 | if (signal_pending(current)) | 1448 | if (signal_pending(current)) |
| 1450 | return -EINTR; | 1449 | return -EINTR; |
| 1451 | send_break(info, arg ? arg*(HZ/10) : HZ/4); | 1450 | send_break(info, arg ? arg*100 : 250); |
| 1452 | if (signal_pending(current)) | 1451 | if (signal_pending(current)) |
| 1453 | return -EINTR; | 1452 | return -EINTR; |
| 1454 | return 0; | 1453 | return 0; |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 30e8beb71430..d8b9d2b8c200 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
| @@ -132,9 +132,9 @@ struct uart_8250_port { | |||
| 132 | struct uart_port port; | 132 | struct uart_port port; |
| 133 | struct timer_list timer; /* "no irq" timer */ | 133 | struct timer_list timer; /* "no irq" timer */ |
| 134 | struct list_head list; /* ports on this IRQ */ | 134 | struct list_head list; /* ports on this IRQ */ |
| 135 | unsigned int capabilities; /* port capabilities */ | 135 | unsigned short capabilities; /* port capabilities */ |
| 136 | unsigned short bugs; /* port bugs */ | ||
| 136 | unsigned int tx_loadsz; /* transmit fifo load size */ | 137 | unsigned int tx_loadsz; /* transmit fifo load size */ |
| 137 | unsigned short rev; | ||
| 138 | unsigned char acr; | 138 | unsigned char acr; |
| 139 | unsigned char ier; | 139 | unsigned char ier; |
| 140 | unsigned char lcr; | 140 | unsigned char lcr; |
| @@ -560,7 +560,14 @@ static void autoconfig_has_efr(struct uart_8250_port *up) | |||
| 560 | if (id1 == 0x16 && id2 == 0xC9 && | 560 | if (id1 == 0x16 && id2 == 0xC9 && |
| 561 | (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { | 561 | (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { |
| 562 | up->port.type = PORT_16C950; | 562 | up->port.type = PORT_16C950; |
| 563 | up->rev = rev | (id3 << 8); | 563 | |
| 564 | /* | ||
| 565 | * Enable work around for the Oxford Semiconductor 952 rev B | ||
| 566 | * chip which causes it to seriously miscalculate baud rates | ||
| 567 | * when DLL is 0. | ||
| 568 | */ | ||
| 569 | if (id3 == 0x52 && rev == 0x01) | ||
| 570 | up->bugs |= UART_BUG_QUOT; | ||
| 564 | return; | 571 | return; |
| 565 | } | 572 | } |
| 566 | 573 | ||
| @@ -577,8 +584,6 @@ static void autoconfig_has_efr(struct uart_8250_port *up) | |||
| 577 | 584 | ||
| 578 | id2 = id1 >> 8; | 585 | id2 = id1 >> 8; |
| 579 | if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { | 586 | if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { |
| 580 | if (id2 == 0x10) | ||
| 581 | up->rev = id1 & 255; | ||
| 582 | up->port.type = PORT_16850; | 587 | up->port.type = PORT_16850; |
| 583 | return; | 588 | return; |
| 584 | } | 589 | } |
| @@ -809,6 +814,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) | |||
| 809 | // save_flags(flags); cli(); | 814 | // save_flags(flags); cli(); |
| 810 | 815 | ||
| 811 | up->capabilities = 0; | 816 | up->capabilities = 0; |
| 817 | up->bugs = 0; | ||
| 812 | 818 | ||
| 813 | if (!(up->port.flags & UPF_BUGGY_UART)) { | 819 | if (!(up->port.flags & UPF_BUGGY_UART)) { |
| 814 | /* | 820 | /* |
| @@ -1021,6 +1027,8 @@ static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
| 1021 | } | 1027 | } |
| 1022 | } | 1028 | } |
| 1023 | 1029 | ||
| 1030 | static void transmit_chars(struct uart_8250_port *up); | ||
| 1031 | |||
| 1024 | static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) | 1032 | static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) |
| 1025 | { | 1033 | { |
| 1026 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 1034 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
| @@ -1028,6 +1036,14 @@ static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) | |||
| 1028 | if (!(up->ier & UART_IER_THRI)) { | 1036 | if (!(up->ier & UART_IER_THRI)) { |
| 1029 | up->ier |= UART_IER_THRI; | 1037 | up->ier |= UART_IER_THRI; |
| 1030 | serial_out(up, UART_IER, up->ier); | 1038 | serial_out(up, UART_IER, up->ier); |
| 1039 | |||
| 1040 | if (up->bugs & UART_BUG_TXEN) { | ||
| 1041 | unsigned char lsr, iir; | ||
| 1042 | lsr = serial_in(up, UART_LSR); | ||
| 1043 | iir = serial_in(up, UART_IIR); | ||
| 1044 | if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) | ||
| 1045 | transmit_chars(up); | ||
| 1046 | } | ||
| 1031 | } | 1047 | } |
| 1032 | /* | 1048 | /* |
| 1033 | * We only do this from uart_start | 1049 | * We only do this from uart_start |
| @@ -1433,6 +1449,7 @@ static int serial8250_startup(struct uart_port *port) | |||
| 1433 | { | 1449 | { |
| 1434 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 1450 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
| 1435 | unsigned long flags; | 1451 | unsigned long flags; |
| 1452 | unsigned char lsr, iir; | ||
| 1436 | int retval; | 1453 | int retval; |
| 1437 | 1454 | ||
| 1438 | up->capabilities = uart_config[up->port.type].flags; | 1455 | up->capabilities = uart_config[up->port.type].flags; |
| @@ -1536,6 +1553,26 @@ static int serial8250_startup(struct uart_port *port) | |||
| 1536 | up->port.mctrl |= TIOCM_OUT2; | 1553 | up->port.mctrl |= TIOCM_OUT2; |
| 1537 | 1554 | ||
| 1538 | serial8250_set_mctrl(&up->port, up->port.mctrl); | 1555 | serial8250_set_mctrl(&up->port, up->port.mctrl); |
| 1556 | |||
| 1557 | /* | ||
| 1558 | * Do a quick test to see if we receive an | ||
| 1559 | * interrupt when we enable the TX irq. | ||
| 1560 | */ | ||
| 1561 | serial_outp(up, UART_IER, UART_IER_THRI); | ||
| 1562 | lsr = serial_in(up, UART_LSR); | ||
| 1563 | iir = serial_in(up, UART_IIR); | ||
| 1564 | serial_outp(up, UART_IER, 0); | ||
| 1565 | |||
| 1566 | if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { | ||
| 1567 | if (!(up->bugs & UART_BUG_TXEN)) { | ||
| 1568 | up->bugs |= UART_BUG_TXEN; | ||
| 1569 | pr_debug("ttyS%d - enabling bad tx status workarounds\n", | ||
| 1570 | port->line); | ||
| 1571 | } | ||
| 1572 | } else { | ||
| 1573 | up->bugs &= ~UART_BUG_TXEN; | ||
| 1574 | } | ||
| 1575 | |||
| 1539 | spin_unlock_irqrestore(&up->port.lock, flags); | 1576 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 1540 | 1577 | ||
| 1541 | /* | 1578 | /* |
| @@ -1645,22 +1682,22 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, | |||
| 1645 | 1682 | ||
| 1646 | switch (termios->c_cflag & CSIZE) { | 1683 | switch (termios->c_cflag & CSIZE) { |
| 1647 | case CS5: | 1684 | case CS5: |
| 1648 | cval = 0x00; | 1685 | cval = UART_LCR_WLEN5; |
| 1649 | break; | 1686 | break; |
| 1650 | case CS6: | 1687 | case CS6: |
| 1651 | cval = 0x01; | 1688 | cval = UART_LCR_WLEN6; |
| 1652 | break; | 1689 | break; |
| 1653 | case CS7: | 1690 | case CS7: |
| 1654 | cval = 0x02; | 1691 | cval = UART_LCR_WLEN7; |
| 1655 | break; | 1692 | break; |
| 1656 | default: | 1693 | default: |
| 1657 | case CS8: | 1694 | case CS8: |
| 1658 | cval = 0x03; | 1695 | cval = UART_LCR_WLEN8; |
| 1659 | break; | 1696 | break; |
| 1660 | } | 1697 | } |
| 1661 | 1698 | ||
| 1662 | if (termios->c_cflag & CSTOPB) | 1699 | if (termios->c_cflag & CSTOPB) |
| 1663 | cval |= 0x04; | 1700 | cval |= UART_LCR_STOP; |
| 1664 | if (termios->c_cflag & PARENB) | 1701 | if (termios->c_cflag & PARENB) |
| 1665 | cval |= UART_LCR_PARITY; | 1702 | cval |= UART_LCR_PARITY; |
| 1666 | if (!(termios->c_cflag & PARODD)) | 1703 | if (!(termios->c_cflag & PARODD)) |
| @@ -1677,12 +1714,9 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, | |||
| 1677 | quot = serial8250_get_divisor(port, baud); | 1714 | quot = serial8250_get_divisor(port, baud); |
| 1678 | 1715 | ||
| 1679 | /* | 1716 | /* |
| 1680 | * Work around a bug in the Oxford Semiconductor 952 rev B | 1717 | * Oxford Semi 952 rev B workaround |
| 1681 | * chip which causes it to seriously miscalculate baud rates | ||
| 1682 | * when DLL is 0. | ||
| 1683 | */ | 1718 | */ |
| 1684 | if ((quot & 0xff) == 0 && up->port.type == PORT_16C950 && | 1719 | if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0) |
| 1685 | up->rev == 0x5201) | ||
| 1686 | quot ++; | 1720 | quot ++; |
| 1687 | 1721 | ||
| 1688 | if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { | 1722 | if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { |
diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h index 4f3d62f222f4..9225c82faeb8 100644 --- a/drivers/serial/8250.h +++ b/drivers/serial/8250.h | |||
| @@ -51,6 +51,9 @@ struct serial8250_config { | |||
| 51 | #define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */ | 51 | #define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */ |
| 52 | #define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */ | 52 | #define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */ |
| 53 | 53 | ||
| 54 | #define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */ | ||
| 55 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ | ||
| 56 | |||
| 54 | #if defined(__i386__) && (defined(CONFIG_M386) || defined(CONFIG_M486)) | 57 | #if defined(__i386__) && (defined(CONFIG_M386) || defined(CONFIG_M486)) |
| 55 | #define _INLINE_ inline | 58 | #define _INLINE_ inline |
| 56 | #else | 59 | #else |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 6e44b46c9e9d..25fcef2c42de 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
| @@ -753,7 +753,7 @@ config SERIAL_MPC52xx_CONSOLE_BAUD | |||
| 753 | 753 | ||
| 754 | config SERIAL_ICOM | 754 | config SERIAL_ICOM |
| 755 | tristate "IBM Multiport Serial Adapter" | 755 | tristate "IBM Multiport Serial Adapter" |
| 756 | depends on PPC_ISERIES || PPC_PSERIES | 756 | depends on PCI && (PPC_ISERIES || PPC_PSERIES) |
| 757 | select SERIAL_CORE | 757 | select SERIAL_CORE |
| 758 | help | 758 | help |
| 759 | This driver is for a family of multiport serial adapters | 759 | This driver is for a family of multiport serial adapters |
| @@ -843,4 +843,13 @@ config SERIAL_JSM | |||
| 843 | To compile this driver as a module, choose M here: the | 843 | To compile this driver as a module, choose M here: the |
| 844 | module will be called jsm. | 844 | module will be called jsm. |
| 845 | 845 | ||
| 846 | config SERIAL_SGI_IOC4 | ||
| 847 | tristate "SGI IOC4 controller serial support" | ||
| 848 | depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC4 | ||
| 849 | select SERIAL_CORE | ||
| 850 | help | ||
| 851 | If you have an SGI Altix with an IOC4 based Base IO card | ||
| 852 | and wish to use the serial ports on this card, say Y. | ||
| 853 | Otherwise, say N. | ||
| 854 | |||
| 846 | endmenu | 855 | endmenu |
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 81b77d769b84..8f1cdde7dbed 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile | |||
| @@ -51,4 +51,4 @@ obj-$(CONFIG_ETRAX_SERIAL) += crisv10.o | |||
| 51 | obj-$(CONFIG_SERIAL_JSM) += jsm/ | 51 | obj-$(CONFIG_SERIAL_JSM) += jsm/ |
| 52 | obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o | 52 | obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o |
| 53 | obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o | 53 | obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o |
| 54 | obj-$(CONFIG_BLK_DEV_SGIIOC4) += ioc4_serial.o | 54 | obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o |
diff --git a/drivers/serial/au1x00_uart.c b/drivers/serial/au1x00_uart.c index b6d3d5034940..5400dc2c087e 100644 --- a/drivers/serial/au1x00_uart.c +++ b/drivers/serial/au1x00_uart.c | |||
| @@ -773,22 +773,22 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, | |||
| 773 | 773 | ||
| 774 | switch (termios->c_cflag & CSIZE) { | 774 | switch (termios->c_cflag & CSIZE) { |
| 775 | case CS5: | 775 | case CS5: |
| 776 | cval = 0x00; | 776 | cval = UART_LCR_WLEN5; |
| 777 | break; | 777 | break; |
| 778 | case CS6: | 778 | case CS6: |
| 779 | cval = 0x01; | 779 | cval = UART_LCR_WLEN6; |
| 780 | break; | 780 | break; |
| 781 | case CS7: | 781 | case CS7: |
| 782 | cval = 0x02; | 782 | cval = UART_LCR_WLEN7; |
| 783 | break; | 783 | break; |
| 784 | default: | 784 | default: |
| 785 | case CS8: | 785 | case CS8: |
| 786 | cval = 0x03; | 786 | cval = UART_LCR_WLEN8; |
| 787 | break; | 787 | break; |
| 788 | } | 788 | } |
| 789 | 789 | ||
| 790 | if (termios->c_cflag & CSTOPB) | 790 | if (termios->c_cflag & CSTOPB) |
| 791 | cval |= 0x04; | 791 | cval |= UART_LCR_STOP; |
| 792 | if (termios->c_cflag & PARENB) | 792 | if (termios->c_cflag & PARENB) |
| 793 | cval |= UART_LCR_PARITY; | 793 | cval |= UART_LCR_PARITY; |
| 794 | if (!(termios->c_cflag & PARODD)) | 794 | if (!(termios->c_cflag & PARODD)) |
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm2.c b/drivers/serial/cpm_uart/cpm_uart_cpm2.c index b422c3abfba6..c4c8f4b44f53 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c | |||
| @@ -134,12 +134,21 @@ void scc1_lineif(struct uart_cpm_port *pinfo) | |||
| 134 | 134 | ||
| 135 | void scc2_lineif(struct uart_cpm_port *pinfo) | 135 | void scc2_lineif(struct uart_cpm_port *pinfo) |
| 136 | { | 136 | { |
| 137 | /* | ||
| 138 | * STx GP3 uses the SCC2 secondary option pin assignment | ||
| 139 | * which this driver doesn't account for in the static | ||
| 140 | * pin assignments. This kind of board specific info | ||
| 141 | * really has to get out of the driver so boards can | ||
| 142 | * be supported in a sane fashion. | ||
| 143 | */ | ||
| 144 | #ifndef CONFIG_STX_GP3 | ||
| 137 | volatile iop_cpm2_t *io = &cpm2_immr->im_ioport; | 145 | volatile iop_cpm2_t *io = &cpm2_immr->im_ioport; |
| 138 | io->iop_pparb |= 0x008b0000; | 146 | io->iop_pparb |= 0x008b0000; |
| 139 | io->iop_pdirb |= 0x00880000; | 147 | io->iop_pdirb |= 0x00880000; |
| 140 | io->iop_psorb |= 0x00880000; | 148 | io->iop_psorb |= 0x00880000; |
| 141 | io->iop_pdirb &= ~0x00030000; | 149 | io->iop_pdirb &= ~0x00030000; |
| 142 | io->iop_psorb &= ~0x00030000; | 150 | io->iop_psorb &= ~0x00030000; |
| 151 | #endif | ||
| 143 | cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff; | 152 | cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff; |
| 144 | cpm2_immr->im_cpmux.cmx_scr |= 0x00090000; | 153 | cpm2_immr->im_cpmux.cmx_scr |= 0x00090000; |
| 145 | pinfo->brg = 2; | 154 | pinfo->brg = 2; |
diff --git a/drivers/serial/icom.h b/drivers/serial/icom.h index 23dc0f7ddf8b..798f1ef23712 100644 --- a/drivers/serial/icom.h +++ b/drivers/serial/icom.h | |||
| @@ -286,5 +286,3 @@ struct lookup_int_table { | |||
| 286 | u32 __iomem *global_int_mask; | 286 | u32 __iomem *global_int_mask; |
| 287 | unsigned long processor_id; | 287 | unsigned long processor_id; |
| 288 | }; | 288 | }; |
| 289 | |||
| 290 | #define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000) | ||
diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index ba4e13a22a50..793c3a7cbe47 100644 --- a/drivers/serial/ioc4_serial.c +++ b/drivers/serial/ioc4_serial.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include <linux/serial_reg.h> | 20 | #include <linux/serial_reg.h> |
| 21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
| 22 | #include <linux/pci.h> | 22 | #include <linux/pci.h> |
| 23 | #include <linux/ioc4_common.h> | 23 | #include <linux/ioc4.h> |
| 24 | #include <linux/serial_core.h> | 24 | #include <linux/serial_core.h> |
| 25 | 25 | ||
| 26 | /* | 26 | /* |
| @@ -130,12 +130,19 @@ | |||
| 130 | IOC4_SIO_IR_S3_TX_EXPLICIT) | 130 | IOC4_SIO_IR_S3_TX_EXPLICIT) |
| 131 | 131 | ||
| 132 | /* Bitmasks for IOC4_OTHER_IR, IOC4_OTHER_IEC, and IOC4_OTHER_IES */ | 132 | /* Bitmasks for IOC4_OTHER_IR, IOC4_OTHER_IEC, and IOC4_OTHER_IES */ |
| 133 | #define IOC4_OTHER_IR_ATA_INT 0x00000001 /* ATAPI intr pass-thru */ | 133 | #define IOC4_OTHER_IR_ATA_INT 0x00000001 /* ATAPI intr pass-thru */ |
| 134 | #define IOC4_OTHER_IR_ATA_MEMERR 0x00000002 /* ATAPI DMA PCI error */ | 134 | #define IOC4_OTHER_IR_ATA_MEMERR 0x00000002 /* ATAPI DMA PCI error */ |
| 135 | #define IOC4_OTHER_IR_S0_MEMERR 0x00000004 /* Port 0 PCI error */ | 135 | #define IOC4_OTHER_IR_S0_MEMERR 0x00000004 /* Port 0 PCI error */ |
| 136 | #define IOC4_OTHER_IR_S1_MEMERR 0x00000008 /* Port 1 PCI error */ | 136 | #define IOC4_OTHER_IR_S1_MEMERR 0x00000008 /* Port 1 PCI error */ |
| 137 | #define IOC4_OTHER_IR_S2_MEMERR 0x00000010 /* Port 2 PCI error */ | 137 | #define IOC4_OTHER_IR_S2_MEMERR 0x00000010 /* Port 2 PCI error */ |
| 138 | #define IOC4_OTHER_IR_S3_MEMERR 0x00000020 /* Port 3 PCI error */ | 138 | #define IOC4_OTHER_IR_S3_MEMERR 0x00000020 /* Port 3 PCI error */ |
| 139 | #define IOC4_OTHER_IR_KBD_INT 0x00000040 /* Keyboard/mouse */ | ||
| 140 | #define IOC4_OTHER_IR_RESERVED 0x007fff80 /* Reserved */ | ||
| 141 | #define IOC4_OTHER_IR_RT_INT 0x00800000 /* INT_OUT section output */ | ||
| 142 | #define IOC4_OTHER_IR_GEN_INT 0xff000000 /* Generic pins */ | ||
| 143 | |||
| 144 | #define IOC4_OTHER_IR_SER_MEMERR (IOC4_OTHER_IR_S0_MEMERR | IOC4_OTHER_IR_S1_MEMERR | \ | ||
| 145 | IOC4_OTHER_IR_S2_MEMERR | IOC4_OTHER_IR_S3_MEMERR) | ||
| 139 | 146 | ||
| 140 | /* Bitmasks for IOC4_SIO_CR */ | 147 | /* Bitmasks for IOC4_SIO_CR */ |
| 141 | #define IOC4_SIO_CR_CMD_PULSE_SHIFT 0 /* byte bus strobe shift */ | 148 | #define IOC4_SIO_CR_CMD_PULSE_SHIFT 0 /* byte bus strobe shift */ |
| @@ -274,70 +281,24 @@ struct ioc4_uartregs { | |||
| 274 | #define i4u_dlm u2.dlm | 281 | #define i4u_dlm u2.dlm |
| 275 | #define i4u_fcr u3.fcr | 282 | #define i4u_fcr u3.fcr |
| 276 | 283 | ||
| 277 | /* PCI memory space register map addressed using pci_bar0 */ | 284 | /* Serial port registers used for DMA serial I/O */ |
| 278 | struct ioc4_memregs { | 285 | struct ioc4_serial { |
| 279 | struct ioc4_mem { | 286 | uint32_t sbbr01_l; |
| 280 | /* Miscellaneous IOC4 registers */ | 287 | uint32_t sbbr01_h; |
| 281 | uint32_t pci_err_addr_l; | 288 | uint32_t sbbr23_l; |
| 282 | uint32_t pci_err_addr_h; | 289 | uint32_t sbbr23_h; |
| 283 | uint32_t sio_ir; | 290 | |
| 284 | uint32_t other_ir; | 291 | struct ioc4_serialregs port_0; |
| 285 | 292 | struct ioc4_serialregs port_1; | |
| 286 | /* These registers are read-only for general kernel code. */ | 293 | struct ioc4_serialregs port_2; |
| 287 | uint32_t sio_ies_ro; | 294 | struct ioc4_serialregs port_3; |
| 288 | uint32_t other_ies_ro; | 295 | struct ioc4_uartregs uart_0; |
| 289 | uint32_t sio_iec_ro; | 296 | struct ioc4_uartregs uart_1; |
| 290 | uint32_t other_iec_ro; | 297 | struct ioc4_uartregs uart_2; |
| 291 | uint32_t sio_cr; | 298 | struct ioc4_uartregs uart_3; |
| 292 | uint32_t misc_fill1; | 299 | } ioc4_serial; |
| 293 | uint32_t int_out; | ||
| 294 | uint32_t misc_fill2; | ||
| 295 | uint32_t gpcr_s; | ||
| 296 | uint32_t gpcr_c; | ||
| 297 | uint32_t gpdr; | ||
| 298 | uint32_t misc_fill3; | ||
| 299 | uint32_t gppr_0; | ||
| 300 | uint32_t gppr_1; | ||
| 301 | uint32_t gppr_2; | ||
| 302 | uint32_t gppr_3; | ||
| 303 | uint32_t gppr_4; | ||
| 304 | uint32_t gppr_5; | ||
| 305 | uint32_t gppr_6; | ||
| 306 | uint32_t gppr_7; | ||
| 307 | } ioc4_mem; | ||
| 308 | |||
| 309 | char misc_fill4[0x100 - 0x5C - 4]; | ||
| 310 | |||
| 311 | /* ATA/ATAP registers */ | ||
| 312 | uint32_t ata_notused[9]; | ||
| 313 | char ata_fill1[0x140 - 0x120 - 4]; | ||
| 314 | uint32_t ata_notused1[8]; | ||
| 315 | char ata_fill2[0x200 - 0x15C - 4]; | ||
| 316 | |||
| 317 | /* Keyboard and mouse registers */ | ||
| 318 | uint32_t km_notused[5];; | ||
| 319 | char km_fill1[0x300 - 0x210 - 4]; | ||
| 320 | |||
| 321 | /* Serial port registers used for DMA serial I/O */ | ||
| 322 | struct ioc4_serial { | ||
| 323 | uint32_t sbbr01_l; | ||
| 324 | uint32_t sbbr01_h; | ||
| 325 | uint32_t sbbr23_l; | ||
| 326 | uint32_t sbbr23_h; | ||
| 327 | |||
| 328 | struct ioc4_serialregs port_0; | ||
| 329 | struct ioc4_serialregs port_1; | ||
| 330 | struct ioc4_serialregs port_2; | ||
| 331 | struct ioc4_serialregs port_3; | ||
| 332 | struct ioc4_uartregs uart_0; | ||
| 333 | struct ioc4_uartregs uart_1; | ||
| 334 | struct ioc4_uartregs uart_2; | ||
| 335 | struct ioc4_uartregs uart_3; | ||
| 336 | } ioc4_serial; | ||
| 337 | }; | ||
| 338 | 300 | ||
| 339 | /* UART clock speed */ | 301 | /* UART clock speed */ |
| 340 | #define IOC4_SER_XIN_CLK IOC4_SER_XIN_CLK_66 | ||
| 341 | #define IOC4_SER_XIN_CLK_66 66666667 | 302 | #define IOC4_SER_XIN_CLK_66 66666667 |
| 342 | #define IOC4_SER_XIN_CLK_33 33333333 | 303 | #define IOC4_SER_XIN_CLK_33 33333333 |
| 343 | 304 | ||
| @@ -412,8 +373,8 @@ enum sio_proto { | |||
| 412 | | UART_LCR_WLEN7 | UART_LCR_WLEN8) | 373 | | UART_LCR_WLEN7 | UART_LCR_WLEN8) |
| 413 | #define LCR_MASK_STOP_BITS (UART_LCR_STOP) | 374 | #define LCR_MASK_STOP_BITS (UART_LCR_STOP) |
| 414 | 375 | ||
| 415 | #define PENDING(_p) (readl(&(_p)->ip_mem->sio_ir) & _p->ip_ienb) | 376 | #define PENDING(_p) (readl(&(_p)->ip_mem->sio_ir.raw) & _p->ip_ienb) |
| 416 | #define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir) | 377 | #define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir.raw) |
| 417 | 378 | ||
| 418 | /* Default to 4k buffers */ | 379 | /* Default to 4k buffers */ |
| 419 | #ifdef IOC4_1K_BUFFERS | 380 | #ifdef IOC4_1K_BUFFERS |
| @@ -447,7 +408,7 @@ struct ioc4_control { | |||
| 447 | */ | 408 | */ |
| 448 | #define MAX_IOC4_INTR_ENTS (8 * sizeof(uint32_t)) | 409 | #define MAX_IOC4_INTR_ENTS (8 * sizeof(uint32_t)) |
| 449 | struct ioc4_soft { | 410 | struct ioc4_soft { |
| 450 | struct ioc4_mem __iomem *is_ioc4_mem_addr; | 411 | struct ioc4_misc_regs __iomem *is_ioc4_misc_addr; |
| 451 | struct ioc4_serial __iomem *is_ioc4_serial_addr; | 412 | struct ioc4_serial __iomem *is_ioc4_serial_addr; |
| 452 | 413 | ||
| 453 | /* Each interrupt type has an entry in the array */ | 414 | /* Each interrupt type has an entry in the array */ |
| @@ -486,7 +447,7 @@ struct ioc4_port { | |||
| 486 | struct ioc4_soft *ip_ioc4_soft; | 447 | struct ioc4_soft *ip_ioc4_soft; |
| 487 | 448 | ||
| 488 | /* pci mem addresses */ | 449 | /* pci mem addresses */ |
| 489 | struct ioc4_mem __iomem *ip_mem; | 450 | struct ioc4_misc_regs __iomem *ip_mem; |
| 490 | struct ioc4_serial __iomem *ip_serial; | 451 | struct ioc4_serial __iomem *ip_serial; |
| 491 | struct ioc4_serialregs __iomem *ip_serial_regs; | 452 | struct ioc4_serialregs __iomem *ip_serial_regs; |
| 492 | struct ioc4_uartregs __iomem *ip_uart_regs; | 453 | struct ioc4_uartregs __iomem *ip_uart_regs; |
| @@ -553,7 +514,7 @@ struct hooks { | |||
| 553 | uint32_t intr_dma_error; | 514 | uint32_t intr_dma_error; |
| 554 | uint32_t intr_clear; | 515 | uint32_t intr_clear; |
| 555 | uint32_t intr_all; | 516 | uint32_t intr_all; |
| 556 | char rs422_select_pin; | 517 | int rs422_select_pin; |
| 557 | }; | 518 | }; |
| 558 | 519 | ||
| 559 | static struct hooks hooks_array[IOC4_NUM_SERIAL_PORTS] = { | 520 | static struct hooks hooks_array[IOC4_NUM_SERIAL_PORTS] = { |
| @@ -669,7 +630,7 @@ static void handle_intr(void *arg, uint32_t sio_ir); | |||
| 669 | static inline void | 630 | static inline void |
| 670 | write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) | 631 | write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) |
| 671 | { | 632 | { |
| 672 | struct ioc4_mem __iomem *mem = ioc4_soft->is_ioc4_mem_addr; | 633 | struct ioc4_misc_regs __iomem *mem = ioc4_soft->is_ioc4_misc_addr; |
| 673 | unsigned long flags; | 634 | unsigned long flags; |
| 674 | 635 | ||
| 675 | spin_lock_irqsave(&ioc4_soft->is_ir_lock, flags); | 636 | spin_lock_irqsave(&ioc4_soft->is_ir_lock, flags); |
| @@ -678,11 +639,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) | |||
| 678 | case IOC4_SIO_INTR_TYPE: | 639 | case IOC4_SIO_INTR_TYPE: |
| 679 | switch (which) { | 640 | switch (which) { |
| 680 | case IOC4_W_IES: | 641 | case IOC4_W_IES: |
| 681 | writel(val, &mem->sio_ies_ro); | 642 | writel(val, &mem->sio_ies.raw); |
| 682 | break; | 643 | break; |
| 683 | 644 | ||
| 684 | case IOC4_W_IEC: | 645 | case IOC4_W_IEC: |
| 685 | writel(val, &mem->sio_iec_ro); | 646 | writel(val, &mem->sio_iec.raw); |
| 686 | break; | 647 | break; |
| 687 | } | 648 | } |
| 688 | break; | 649 | break; |
| @@ -690,11 +651,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) | |||
| 690 | case IOC4_OTHER_INTR_TYPE: | 651 | case IOC4_OTHER_INTR_TYPE: |
| 691 | switch (which) { | 652 | switch (which) { |
| 692 | case IOC4_W_IES: | 653 | case IOC4_W_IES: |
| 693 | writel(val, &mem->other_ies_ro); | 654 | writel(val, &mem->other_ies.raw); |
| 694 | break; | 655 | break; |
| 695 | 656 | ||
| 696 | case IOC4_W_IEC: | 657 | case IOC4_W_IEC: |
| 697 | writel(val, &mem->other_iec_ro); | 658 | writel(val, &mem->other_iec.raw); |
| 698 | break; | 659 | break; |
| 699 | } | 660 | } |
| 700 | break; | 661 | break; |
| @@ -747,7 +708,8 @@ static int set_baud(struct ioc4_port *port, int baud) | |||
| 747 | */ | 708 | */ |
| 748 | static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) | 709 | static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) |
| 749 | { | 710 | { |
| 750 | struct ioc4_control *control = dev_get_drvdata(the_port->dev); | 711 | struct ioc4_driver_data *idd = dev_get_drvdata(the_port->dev); |
| 712 | struct ioc4_control *control = idd->idd_serial_data; | ||
| 751 | int ii; | 713 | int ii; |
| 752 | 714 | ||
| 753 | if (control) { | 715 | if (control) { |
| @@ -782,7 +744,7 @@ static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) | |||
| 782 | static inline uint32_t | 744 | static inline uint32_t |
| 783 | pending_intrs(struct ioc4_soft *soft, int type) | 745 | pending_intrs(struct ioc4_soft *soft, int type) |
| 784 | { | 746 | { |
| 785 | struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr; | 747 | struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr; |
| 786 | unsigned long flag; | 748 | unsigned long flag; |
| 787 | uint32_t intrs = 0; | 749 | uint32_t intrs = 0; |
| 788 | 750 | ||
| @@ -793,11 +755,11 @@ pending_intrs(struct ioc4_soft *soft, int type) | |||
| 793 | 755 | ||
| 794 | switch (type) { | 756 | switch (type) { |
| 795 | case IOC4_SIO_INTR_TYPE: | 757 | case IOC4_SIO_INTR_TYPE: |
| 796 | intrs = readl(&mem->sio_ir) & readl(&mem->sio_ies_ro); | 758 | intrs = readl(&mem->sio_ir.raw) & readl(&mem->sio_ies.raw); |
| 797 | break; | 759 | break; |
| 798 | 760 | ||
| 799 | case IOC4_OTHER_INTR_TYPE: | 761 | case IOC4_OTHER_INTR_TYPE: |
| 800 | intrs = readl(&mem->other_ir) & readl(&mem->other_ies_ro); | 762 | intrs = readl(&mem->other_ir.raw) & readl(&mem->other_ies.raw); |
| 801 | 763 | ||
| 802 | /* Don't process any ATA interrupte */ | 764 | /* Don't process any ATA interrupte */ |
| 803 | intrs &= ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); | 765 | intrs &= ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); |
| @@ -826,7 +788,7 @@ static int inline port_init(struct ioc4_port *port) | |||
| 826 | 788 | ||
| 827 | /* Wait until any pending bus activity for this port has ceased */ | 789 | /* Wait until any pending bus activity for this port has ceased */ |
| 828 | do | 790 | do |
| 829 | sio_cr = readl(&port->ip_mem->sio_cr); | 791 | sio_cr = readl(&port->ip_mem->sio_cr.raw); |
| 830 | while (!(sio_cr & IOC4_SIO_CR_SIO_DIAG_IDLE)); | 792 | while (!(sio_cr & IOC4_SIO_CR_SIO_DIAG_IDLE)); |
| 831 | 793 | ||
| 832 | /* Finish reset sequence */ | 794 | /* Finish reset sequence */ |
| @@ -899,7 +861,7 @@ static int inline port_init(struct ioc4_port *port) | |||
| 899 | write_ireg(port->ip_ioc4_soft, hooks->intr_clear, | 861 | write_ireg(port->ip_ioc4_soft, hooks->intr_clear, |
| 900 | IOC4_W_IEC, IOC4_SIO_INTR_TYPE); | 862 | IOC4_W_IEC, IOC4_SIO_INTR_TYPE); |
| 901 | port->ip_ienb &= ~hooks->intr_clear; | 863 | port->ip_ienb &= ~hooks->intr_clear; |
| 902 | writel(hooks->intr_clear, &port->ip_mem->sio_ir); | 864 | writel(hooks->intr_clear, &port->ip_mem->sio_ir.raw); |
| 903 | return 0; | 865 | return 0; |
| 904 | } | 866 | } |
| 905 | 867 | ||
| @@ -918,23 +880,23 @@ static void handle_dma_error_intr(void *arg, uint32_t other_ir) | |||
| 918 | spin_lock_irqsave(&port->ip_lock, flags); | 880 | spin_lock_irqsave(&port->ip_lock, flags); |
| 919 | 881 | ||
| 920 | /* ACK the interrupt */ | 882 | /* ACK the interrupt */ |
| 921 | writel(hooks->intr_dma_error, &port->ip_mem->other_ir); | 883 | writel(hooks->intr_dma_error, &port->ip_mem->other_ir.raw); |
| 922 | 884 | ||
| 923 | if (readl(&port->ip_mem->pci_err_addr_l) & IOC4_PCI_ERR_ADDR_VLD) { | 885 | if (readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_VLD) { |
| 924 | printk(KERN_ERR | 886 | printk(KERN_ERR |
| 925 | "PCI error address is 0x%lx, " | 887 | "PCI error address is 0x%lx, " |
| 926 | "master is serial port %c %s\n", | 888 | "master is serial port %c %s\n", |
| 927 | (((uint64_t)readl(&port->ip_mem->pci_err_addr_h) | 889 | (((uint64_t)readl(&port->ip_mem->pci_err_addr_h) |
| 928 | << 32) | 890 | << 32) |
| 929 | | readl(&port->ip_mem->pci_err_addr_l)) | 891 | | readl(&port->ip_mem->pci_err_addr_l.raw)) |
| 930 | & IOC4_PCI_ERR_ADDR_ADDR_MSK, '1' + | 892 | & IOC4_PCI_ERR_ADDR_ADDR_MSK, '1' + |
| 931 | ((char)(readl(&port->ip_mem-> pci_err_addr_l) & | 893 | ((char)(readl(&port->ip_mem->pci_err_addr_l.raw) & |
| 932 | IOC4_PCI_ERR_ADDR_MST_NUM_MSK) >> 1), | 894 | IOC4_PCI_ERR_ADDR_MST_NUM_MSK) >> 1), |
| 933 | (readl(&port->ip_mem->pci_err_addr_l) | 895 | (readl(&port->ip_mem->pci_err_addr_l.raw) |
| 934 | & IOC4_PCI_ERR_ADDR_MST_TYP_MSK) | 896 | & IOC4_PCI_ERR_ADDR_MST_TYP_MSK) |
| 935 | ? "RX" : "TX"); | 897 | ? "RX" : "TX"); |
| 936 | 898 | ||
| 937 | if (readl(&port->ip_mem->pci_err_addr_l) | 899 | if (readl(&port->ip_mem->pci_err_addr_l.raw) |
| 938 | & IOC4_PCI_ERR_ADDR_MUL_ERR) { | 900 | & IOC4_PCI_ERR_ADDR_MUL_ERR) { |
| 939 | printk(KERN_ERR | 901 | printk(KERN_ERR |
| 940 | "Multiple errors occurred\n"); | 902 | "Multiple errors occurred\n"); |
| @@ -1018,26 +980,26 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) | |||
| 1018 | "other_ies = 0x%x\n", | 980 | "other_ies = 0x%x\n", |
| 1019 | (intr_type == IOC4_SIO_INTR_TYPE) ? "sio" : | 981 | (intr_type == IOC4_SIO_INTR_TYPE) ? "sio" : |
| 1020 | "other", this_ir, | 982 | "other", this_ir, |
| 1021 | readl(&soft->is_ioc4_mem_addr->sio_ir), | 983 | readl(&soft->is_ioc4_misc_addr->sio_ir.raw), |
| 1022 | readl(&soft->is_ioc4_mem_addr->sio_ies_ro), | 984 | readl(&soft->is_ioc4_misc_addr->sio_ies.raw), |
| 1023 | readl(&soft->is_ioc4_mem_addr->other_ir), | 985 | readl(&soft->is_ioc4_misc_addr->other_ir.raw), |
| 1024 | readl(&soft->is_ioc4_mem_addr->other_ies_ro)); | 986 | readl(&soft->is_ioc4_misc_addr->other_ies.raw)); |
| 1025 | } | 987 | } |
| 1026 | } | 988 | } |
| 1027 | #ifdef DEBUG_INTERRUPTS | 989 | #ifdef DEBUG_INTERRUPTS |
| 1028 | { | 990 | { |
| 1029 | struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr; | 991 | struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr; |
| 1030 | spinlock_t *lp = &soft->is_ir_lock; | 992 | spinlock_t *lp = &soft->is_ir_lock; |
| 1031 | unsigned long flag; | 993 | unsigned long flag; |
| 1032 | 994 | ||
| 1033 | spin_lock_irqsave(&soft->is_ir_lock, flag); | 995 | spin_lock_irqsave(&soft->is_ir_lock, flag); |
| 1034 | printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies_ro 0x%x " | 996 | printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies 0x%x " |
| 1035 | "other_ir 0x%x other_ies_ro 0x%x mask 0x%x\n", | 997 | "other_ir 0x%x other_ies 0x%x mask 0x%x\n", |
| 1036 | __FUNCTION__, __LINE__, | 998 | __FUNCTION__, __LINE__, |
| 1037 | (void *)mem, readl(&mem->sio_ir), | 999 | (void *)mem, readl(&mem->sio_ir.raw), |
| 1038 | readl(&mem->sio_ies_ro), | 1000 | readl(&mem->sio_ies.raw), |
| 1039 | readl(&mem->other_ir), | 1001 | readl(&mem->other_ir.raw), |
| 1040 | readl(&mem->other_ies_ro), | 1002 | readl(&mem->other_ies.raw), |
| 1041 | IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); | 1003 | IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); |
| 1042 | spin_unlock_irqrestore(&soft->is_ir_lock, flag); | 1004 | spin_unlock_irqrestore(&soft->is_ir_lock, flag); |
| 1043 | } | 1005 | } |
| @@ -1049,21 +1011,20 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) | |||
| 1049 | * ioc4_attach_local - Device initialization. | 1011 | * ioc4_attach_local - Device initialization. |
| 1050 | * Called at *_attach() time for each | 1012 | * Called at *_attach() time for each |
| 1051 | * IOC4 with serial ports in the system. | 1013 | * IOC4 with serial ports in the system. |
| 1052 | * @control: ioc4_control ptr | 1014 | * @idd: Master module data for this IOC4 |
| 1053 | * @pdev: PCI handle for this device | ||
| 1054 | * @soft: soft struct for this device | ||
| 1055 | * @ioc4: ioc4 mem space | ||
| 1056 | */ | 1015 | */ |
| 1057 | static int inline ioc4_attach_local(struct pci_dev *pdev, | 1016 | static int inline ioc4_attach_local(struct ioc4_driver_data *idd) |
| 1058 | struct ioc4_control *control, | ||
| 1059 | struct ioc4_soft *soft, void __iomem *ioc4_mem, | ||
| 1060 | void __iomem *ioc4_serial) | ||
| 1061 | { | 1017 | { |
| 1062 | struct ioc4_port *port; | 1018 | struct ioc4_port *port; |
| 1063 | struct ioc4_port *ports[IOC4_NUM_SERIAL_PORTS]; | 1019 | struct ioc4_port *ports[IOC4_NUM_SERIAL_PORTS]; |
| 1064 | int port_number; | 1020 | int port_number; |
| 1065 | uint16_t ioc4_revid_min = 62; | 1021 | uint16_t ioc4_revid_min = 62; |
| 1066 | uint16_t ioc4_revid; | 1022 | uint16_t ioc4_revid; |
| 1023 | struct pci_dev *pdev = idd->idd_pdev; | ||
| 1024 | struct ioc4_control* control = idd->idd_serial_data; | ||
| 1025 | struct ioc4_soft *soft = control->ic_soft; | ||
| 1026 | void __iomem *ioc4_misc = idd->idd_misc_regs; | ||
| 1027 | void __iomem *ioc4_serial = soft->is_ioc4_serial_addr; | ||
| 1067 | 1028 | ||
| 1068 | /* IOC4 firmware must be at least rev 62 */ | 1029 | /* IOC4 firmware must be at least rev 62 */ |
| 1069 | pci_read_config_word(pdev, PCI_COMMAND_SPECIAL, &ioc4_revid); | 1030 | pci_read_config_word(pdev, PCI_COMMAND_SPECIAL, &ioc4_revid); |
| @@ -1076,7 +1037,7 @@ static int inline ioc4_attach_local(struct pci_dev *pdev, | |||
| 1076 | ioc4_revid, ioc4_revid_min); | 1037 | ioc4_revid, ioc4_revid_min); |
| 1077 | return -EPERM; | 1038 | return -EPERM; |
| 1078 | } | 1039 | } |
| 1079 | BUG_ON(ioc4_mem == NULL); | 1040 | BUG_ON(ioc4_misc == NULL); |
| 1080 | BUG_ON(ioc4_serial == NULL); | 1041 | BUG_ON(ioc4_serial == NULL); |
| 1081 | 1042 | ||
| 1082 | /* Create port structures for each port */ | 1043 | /* Create port structures for each port */ |
| @@ -1100,10 +1061,18 @@ static int inline ioc4_attach_local(struct pci_dev *pdev, | |||
| 1100 | port->ip_ioc4_soft = soft; | 1061 | port->ip_ioc4_soft = soft; |
| 1101 | port->ip_pdev = pdev; | 1062 | port->ip_pdev = pdev; |
| 1102 | port->ip_ienb = 0; | 1063 | port->ip_ienb = 0; |
| 1103 | port->ip_pci_bus_speed = IOC4_SER_XIN_CLK; | 1064 | /* Use baud rate calculations based on detected PCI |
| 1065 | * bus speed. Simply test whether the PCI clock is | ||
| 1066 | * running closer to 66MHz or 33MHz. | ||
| 1067 | */ | ||
| 1068 | if (idd->count_period/IOC4_EXTINT_COUNT_DIVISOR < 20) { | ||
| 1069 | port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_66; | ||
| 1070 | } else { | ||
| 1071 | port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_33; | ||
| 1072 | } | ||
| 1104 | port->ip_baud = 9600; | 1073 | port->ip_baud = 9600; |
| 1105 | port->ip_control = control; | 1074 | port->ip_control = control; |
| 1106 | port->ip_mem = ioc4_mem; | 1075 | port->ip_mem = ioc4_misc; |
| 1107 | port->ip_serial = ioc4_serial; | 1076 | port->ip_serial = ioc4_serial; |
| 1108 | 1077 | ||
| 1109 | /* point to the right hook */ | 1078 | /* point to the right hook */ |
| @@ -1604,14 +1573,12 @@ static int ioc4_set_proto(struct ioc4_port *port, enum sio_proto proto) | |||
| 1604 | switch (proto) { | 1573 | switch (proto) { |
| 1605 | case PROTO_RS232: | 1574 | case PROTO_RS232: |
| 1606 | /* Clear the appropriate GIO pin */ | 1575 | /* Clear the appropriate GIO pin */ |
| 1607 | writel(0, (&port->ip_mem->gppr_0 + | 1576 | writel(0, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw)); |
| 1608 | hooks->rs422_select_pin)); | ||
| 1609 | break; | 1577 | break; |
| 1610 | 1578 | ||
| 1611 | case PROTO_RS422: | 1579 | case PROTO_RS422: |
| 1612 | /* Set the appropriate GIO pin */ | 1580 | /* Set the appropriate GIO pin */ |
| 1613 | writel(1, (&port->ip_mem->gppr_0 + | 1581 | writel(1, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw)); |
| 1614 | hooks->rs422_select_pin)); | ||
| 1615 | break; | 1582 | break; |
| 1616 | 1583 | ||
| 1617 | default: | 1584 | default: |
| @@ -1885,7 +1852,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) | |||
| 1885 | if (sio_ir & hooks->intr_delta_dcd) { | 1852 | if (sio_ir & hooks->intr_delta_dcd) { |
| 1886 | /* ACK the interrupt */ | 1853 | /* ACK the interrupt */ |
| 1887 | writel(hooks->intr_delta_dcd, | 1854 | writel(hooks->intr_delta_dcd, |
| 1888 | &port->ip_mem->sio_ir); | 1855 | &port->ip_mem->sio_ir.raw); |
| 1889 | 1856 | ||
| 1890 | shadow = readl(&port->ip_serial_regs->shadow); | 1857 | shadow = readl(&port->ip_serial_regs->shadow); |
| 1891 | 1858 | ||
| @@ -1907,7 +1874,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) | |||
| 1907 | if (sio_ir & hooks->intr_delta_cts) { | 1874 | if (sio_ir & hooks->intr_delta_cts) { |
| 1908 | /* ACK the interrupt */ | 1875 | /* ACK the interrupt */ |
| 1909 | writel(hooks->intr_delta_cts, | 1876 | writel(hooks->intr_delta_cts, |
| 1910 | &port->ip_mem->sio_ir); | 1877 | &port->ip_mem->sio_ir.raw); |
| 1911 | 1878 | ||
| 1912 | shadow = readl(&port->ip_serial_regs->shadow); | 1879 | shadow = readl(&port->ip_serial_regs->shadow); |
| 1913 | 1880 | ||
| @@ -1928,7 +1895,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) | |||
| 1928 | if (sio_ir & hooks->intr_rx_timer) { | 1895 | if (sio_ir & hooks->intr_rx_timer) { |
| 1929 | /* ACK the interrupt */ | 1896 | /* ACK the interrupt */ |
| 1930 | writel(hooks->intr_rx_timer, | 1897 | writel(hooks->intr_rx_timer, |
| 1931 | &port->ip_mem->sio_ir); | 1898 | &port->ip_mem->sio_ir.raw); |
| 1932 | 1899 | ||
| 1933 | if ((port->ip_notify & N_DATA_READY) | 1900 | if ((port->ip_notify & N_DATA_READY) |
| 1934 | && (port->ip_port)) { | 1901 | && (port->ip_port)) { |
| @@ -1974,7 +1941,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) | |||
| 1974 | 1941 | ||
| 1975 | /* ACK the interrupt */ | 1942 | /* ACK the interrupt */ |
| 1976 | writel(hooks->intr_tx_explicit, | 1943 | writel(hooks->intr_tx_explicit, |
| 1977 | &port->ip_mem->sio_ir); | 1944 | &port->ip_mem->sio_ir.raw); |
| 1978 | 1945 | ||
| 1979 | if (port->ip_notify & N_OUTPUT_LOWAT) | 1946 | if (port->ip_notify & N_OUTPUT_LOWAT) |
| 1980 | ioc4_cb_output_lowat(port); | 1947 | ioc4_cb_output_lowat(port); |
| @@ -2634,7 +2601,8 @@ ioc4_serial_core_attach(struct pci_dev *pdev) | |||
| 2634 | { | 2601 | { |
| 2635 | struct ioc4_port *port; | 2602 | struct ioc4_port *port; |
| 2636 | struct uart_port *the_port; | 2603 | struct uart_port *the_port; |
| 2637 | struct ioc4_control *control = pci_get_drvdata(pdev); | 2604 | struct ioc4_driver_data *idd = pci_get_drvdata(pdev); |
| 2605 | struct ioc4_control *control = idd->idd_serial_data; | ||
| 2638 | int ii; | 2606 | int ii; |
| 2639 | 2607 | ||
| 2640 | DPRINT_CONFIG(("%s: attach pdev 0x%p - control 0x%p\n", | 2608 | DPRINT_CONFIG(("%s: attach pdev 0x%p - control 0x%p\n", |
| @@ -2680,55 +2648,29 @@ ioc4_serial_core_attach(struct pci_dev *pdev) | |||
| 2680 | 2648 | ||
| 2681 | /** | 2649 | /** |
| 2682 | * ioc4_serial_attach_one - register attach function | 2650 | * ioc4_serial_attach_one - register attach function |
| 2683 | * called per card found from ioc4_serial_detect as part | 2651 | * called per card found from IOC4 master module. |
| 2684 | * of module_init(). | 2652 | * @idd: Master module data for this IOC4 |
| 2685 | * @pdev: handle for this card | ||
| 2686 | * @pci_id: pci id for this card | ||
| 2687 | */ | 2653 | */ |
| 2688 | int | 2654 | int |
| 2689 | ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) | 2655 | ioc4_serial_attach_one(struct ioc4_driver_data *idd) |
| 2690 | { | 2656 | { |
| 2691 | struct ioc4_mem __iomem *mem; | 2657 | unsigned long tmp_addr1; |
| 2692 | unsigned long tmp_addr, tmp_addr1; | ||
| 2693 | struct ioc4_serial __iomem *serial; | 2658 | struct ioc4_serial __iomem *serial; |
| 2694 | struct ioc4_soft *soft; | 2659 | struct ioc4_soft *soft; |
| 2695 | struct ioc4_control *control; | 2660 | struct ioc4_control *control; |
| 2696 | int tmp, ret = 0; | 2661 | int ret = 0; |
| 2697 | 2662 | ||
| 2698 | 2663 | ||
| 2699 | DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, pdev, pci_id)); | 2664 | DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev, idd->idd_pci_id)); |
| 2700 | |||
| 2701 | /* Map in the ioc4 memory */ | ||
| 2702 | tmp_addr = pci_resource_start(pdev, 0); | ||
| 2703 | if (!tmp_addr) { | ||
| 2704 | printk(KERN_WARNING | ||
| 2705 | "ioc4 (%p) : unable to get PIO mapping for " | ||
| 2706 | "MEM space\n", (void *)pdev); | ||
| 2707 | return -ENODEV; | ||
| 2708 | } | ||
| 2709 | if (!request_region(tmp_addr, sizeof(struct ioc4_mem), "sioc4_mem")) { | ||
| 2710 | printk(KERN_ALERT | ||
| 2711 | "ioc4 (%p): unable to get request region for " | ||
| 2712 | "MEM space\n", (void *)pdev); | ||
| 2713 | return -ENODEV; | ||
| 2714 | } | ||
| 2715 | mem = ioremap(tmp_addr, sizeof(struct ioc4_mem)); | ||
| 2716 | if (!mem) { | ||
| 2717 | printk(KERN_WARNING | ||
| 2718 | "ioc4 (%p) : unable to remap ioc4 memory\n", | ||
| 2719 | (void *)pdev); | ||
| 2720 | ret = -ENODEV; | ||
| 2721 | goto out1; | ||
| 2722 | } | ||
| 2723 | 2665 | ||
| 2724 | /* request serial registers */ | 2666 | /* request serial registers */ |
| 2725 | tmp_addr1 = pci_resource_start(pdev, 0) + IOC4_SERIAL_OFFSET; | 2667 | tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET; |
| 2726 | 2668 | ||
| 2727 | if (!request_region(tmp_addr1, sizeof(struct ioc4_serial), | 2669 | if (!request_region(tmp_addr1, sizeof(struct ioc4_serial), |
| 2728 | "sioc4_uart")) { | 2670 | "sioc4_uart")) { |
| 2729 | printk(KERN_WARNING | 2671 | printk(KERN_WARNING |
| 2730 | "ioc4 (%p): unable to get request region for " | 2672 | "ioc4 (%p): unable to get request region for " |
| 2731 | "uart space\n", (void *)pdev); | 2673 | "uart space\n", (void *)idd->idd_pdev); |
| 2732 | ret = -ENODEV; | 2674 | ret = -ENODEV; |
| 2733 | goto out1; | 2675 | goto out1; |
| 2734 | } | 2676 | } |
| @@ -2736,12 +2678,12 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) | |||
| 2736 | if (!serial) { | 2678 | if (!serial) { |
| 2737 | printk(KERN_WARNING | 2679 | printk(KERN_WARNING |
| 2738 | "ioc4 (%p) : unable to remap ioc4 serial register\n", | 2680 | "ioc4 (%p) : unable to remap ioc4 serial register\n", |
| 2739 | (void *)pdev); | 2681 | (void *)idd->idd_pdev); |
| 2740 | ret = -ENODEV; | 2682 | ret = -ENODEV; |
| 2741 | goto out2; | 2683 | goto out2; |
| 2742 | } | 2684 | } |
| 2743 | DPRINT_CONFIG(("%s : mem 0x%p, serial 0x%p\n", | 2685 | DPRINT_CONFIG(("%s : mem 0x%p, serial 0x%p\n", |
| 2744 | __FUNCTION__, (void *)mem, (void *)serial)); | 2686 | __FUNCTION__, (void *)idd->idd_misc_regs, (void *)serial)); |
| 2745 | 2687 | ||
| 2746 | /* Get memory for the new card */ | 2688 | /* Get memory for the new card */ |
| 2747 | control = kmalloc(sizeof(struct ioc4_control) * IOC4_NUM_SERIAL_PORTS, | 2689 | control = kmalloc(sizeof(struct ioc4_control) * IOC4_NUM_SERIAL_PORTS, |
| @@ -2754,59 +2696,56 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) | |||
| 2754 | goto out2; | 2696 | goto out2; |
| 2755 | } | 2697 | } |
| 2756 | memset(control, 0, sizeof(struct ioc4_control)); | 2698 | memset(control, 0, sizeof(struct ioc4_control)); |
| 2757 | pci_set_drvdata(pdev, control); | 2699 | idd->idd_serial_data = control; |
| 2758 | 2700 | ||
| 2759 | /* Allocate the soft structure */ | 2701 | /* Allocate the soft structure */ |
| 2760 | soft = kmalloc(sizeof(struct ioc4_soft), GFP_KERNEL); | 2702 | soft = kmalloc(sizeof(struct ioc4_soft), GFP_KERNEL); |
| 2761 | if (!soft) { | 2703 | if (!soft) { |
| 2762 | printk(KERN_WARNING | 2704 | printk(KERN_WARNING |
| 2763 | "ioc4 (%p): unable to get memory for the soft struct\n", | 2705 | "ioc4 (%p): unable to get memory for the soft struct\n", |
| 2764 | (void *)pdev); | 2706 | (void *)idd->idd_pdev); |
| 2765 | ret = -ENOMEM; | 2707 | ret = -ENOMEM; |
| 2766 | goto out3; | 2708 | goto out3; |
| 2767 | } | 2709 | } |
| 2768 | memset(soft, 0, sizeof(struct ioc4_soft)); | 2710 | memset(soft, 0, sizeof(struct ioc4_soft)); |
| 2769 | 2711 | ||
| 2770 | spin_lock_init(&soft->is_ir_lock); | 2712 | spin_lock_init(&soft->is_ir_lock); |
| 2771 | soft->is_ioc4_mem_addr = mem; | 2713 | soft->is_ioc4_misc_addr = idd->idd_misc_regs; |
| 2772 | soft->is_ioc4_serial_addr = serial; | 2714 | soft->is_ioc4_serial_addr = serial; |
| 2773 | 2715 | ||
| 2774 | /* Init the IOC4 */ | 2716 | /* Init the IOC4 */ |
| 2775 | pci_read_config_dword(pdev, PCI_COMMAND, &tmp); | 2717 | writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT, |
| 2776 | pci_write_config_dword(pdev, PCI_COMMAND, | 2718 | &idd->idd_misc_regs->sio_cr.raw); |
| 2777 | tmp | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); | ||
| 2778 | |||
| 2779 | writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT, &mem->sio_cr); | ||
| 2780 | 2719 | ||
| 2781 | /* Enable serial port mode select generic PIO pins as outputs */ | 2720 | /* Enable serial port mode select generic PIO pins as outputs */ |
| 2782 | writel(IOC4_GPCR_UART0_MODESEL | IOC4_GPCR_UART1_MODESEL | 2721 | writel(IOC4_GPCR_UART0_MODESEL | IOC4_GPCR_UART1_MODESEL |
| 2783 | | IOC4_GPCR_UART2_MODESEL | IOC4_GPCR_UART3_MODESEL, | 2722 | | IOC4_GPCR_UART2_MODESEL | IOC4_GPCR_UART3_MODESEL, |
| 2784 | &mem->gpcr_s); | 2723 | &idd->idd_misc_regs->gpcr_s.raw); |
| 2785 | 2724 | ||
| 2786 | /* Clear and disable all interrupts */ | 2725 | /* Clear and disable all serial interrupts */ |
| 2787 | write_ireg(soft, ~0, IOC4_W_IEC, IOC4_SIO_INTR_TYPE); | 2726 | write_ireg(soft, ~0, IOC4_W_IEC, IOC4_SIO_INTR_TYPE); |
| 2788 | writel(~0, &mem->sio_ir); | 2727 | writel(~0, &idd->idd_misc_regs->sio_ir.raw); |
| 2789 | write_ireg(soft, ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR), | 2728 | write_ireg(soft, IOC4_OTHER_IR_SER_MEMERR, IOC4_W_IEC, |
| 2790 | IOC4_W_IEC, IOC4_OTHER_INTR_TYPE); | 2729 | IOC4_OTHER_INTR_TYPE); |
| 2791 | writel(~(IOC4_OTHER_IR_ATA_MEMERR | IOC4_OTHER_IR_ATA_MEMERR), | 2730 | writel(IOC4_OTHER_IR_SER_MEMERR, &idd->idd_misc_regs->other_ir.raw); |
| 2792 | &mem->other_ir); | ||
| 2793 | control->ic_soft = soft; | 2731 | control->ic_soft = soft; |
| 2794 | if (!request_irq(pdev->irq, ioc4_intr, SA_SHIRQ, | 2732 | |
| 2733 | /* Hook up interrupt handler */ | ||
| 2734 | if (!request_irq(idd->idd_pdev->irq, ioc4_intr, SA_SHIRQ, | ||
| 2795 | "sgi-ioc4serial", (void *)soft)) { | 2735 | "sgi-ioc4serial", (void *)soft)) { |
| 2796 | control->ic_irq = pdev->irq; | 2736 | control->ic_irq = idd->idd_pdev->irq; |
| 2797 | } else { | 2737 | } else { |
| 2798 | printk(KERN_WARNING | 2738 | printk(KERN_WARNING |
| 2799 | "%s : request_irq fails for IRQ 0x%x\n ", | 2739 | "%s : request_irq fails for IRQ 0x%x\n ", |
| 2800 | __FUNCTION__, pdev->irq); | 2740 | __FUNCTION__, idd->idd_pdev->irq); |
| 2801 | } | 2741 | } |
| 2802 | if ((ret = ioc4_attach_local(pdev, control, soft, | 2742 | ret = ioc4_attach_local(idd); |
| 2803 | soft->is_ioc4_mem_addr, | 2743 | if (ret) |
| 2804 | soft->is_ioc4_serial_addr))) | ||
| 2805 | goto out4; | 2744 | goto out4; |
| 2806 | 2745 | ||
| 2807 | /* register port with the serial core */ | 2746 | /* register port with the serial core */ |
| 2808 | 2747 | ||
| 2809 | if ((ret = ioc4_serial_core_attach(pdev))) | 2748 | if ((ret = ioc4_serial_core_attach(idd->idd_pdev))) |
| 2810 | goto out4; | 2749 | goto out4; |
| 2811 | 2750 | ||
| 2812 | return ret; | 2751 | return ret; |
| @@ -2819,7 +2758,6 @@ out3: | |||
| 2819 | out2: | 2758 | out2: |
| 2820 | release_region(tmp_addr1, sizeof(struct ioc4_serial)); | 2759 | release_region(tmp_addr1, sizeof(struct ioc4_serial)); |
| 2821 | out1: | 2760 | out1: |
| 2822 | release_region(tmp_addr, sizeof(struct ioc4_mem)); | ||
| 2823 | 2761 | ||
| 2824 | return ret; | 2762 | return ret; |
| 2825 | } | 2763 | } |
| @@ -2828,11 +2766,10 @@ out1: | |||
| 2828 | /** | 2766 | /** |
| 2829 | * ioc4_serial_remove_one - detach function | 2767 | * ioc4_serial_remove_one - detach function |
| 2830 | * | 2768 | * |
| 2831 | * @pdev: handle for this card | 2769 | * @idd: IOC4 master module data for this IOC4 |
| 2832 | */ | 2770 | */ |
| 2833 | 2771 | ||
| 2834 | #if 0 | 2772 | int ioc4_serial_remove_one(struct ioc4_driver_data *idd) |
| 2835 | void ioc4_serial_remove_one(struct pci_dev *pdev) | ||
| 2836 | { | 2773 | { |
| 2837 | int ii; | 2774 | int ii; |
| 2838 | struct ioc4_control *control; | 2775 | struct ioc4_control *control; |
| @@ -2840,7 +2777,7 @@ void ioc4_serial_remove_one(struct pci_dev *pdev) | |||
| 2840 | struct ioc4_port *port; | 2777 | struct ioc4_port *port; |
| 2841 | struct ioc4_soft *soft; | 2778 | struct ioc4_soft *soft; |
| 2842 | 2779 | ||
| 2843 | control = pci_get_drvdata(pdev); | 2780 | control = idd->idd_serial_data; |
| 2844 | 2781 | ||
| 2845 | for (ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++) { | 2782 | for (ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++) { |
| 2846 | the_port = &control->ic_port[ii].icp_uart_port; | 2783 | the_port = &control->ic_port[ii].icp_uart_port; |
| @@ -2867,10 +2804,17 @@ void ioc4_serial_remove_one(struct pci_dev *pdev) | |||
| 2867 | kfree(soft); | 2804 | kfree(soft); |
| 2868 | } | 2805 | } |
| 2869 | kfree(control); | 2806 | kfree(control); |
| 2870 | pci_set_drvdata(pdev, NULL); | 2807 | idd->idd_serial_data = NULL; |
| 2871 | uart_unregister_driver(&ioc4_uart); | 2808 | |
| 2809 | return 0; | ||
| 2872 | } | 2810 | } |
| 2873 | #endif | 2811 | |
| 2812 | static struct ioc4_submodule ioc4_serial_submodule = { | ||
| 2813 | .is_name = "IOC4_serial", | ||
| 2814 | .is_owner = THIS_MODULE, | ||
| 2815 | .is_probe = ioc4_serial_attach_one, | ||
| 2816 | .is_remove = ioc4_serial_remove_one, | ||
| 2817 | }; | ||
| 2874 | 2818 | ||
| 2875 | /** | 2819 | /** |
| 2876 | * ioc4_serial_init - module init | 2820 | * ioc4_serial_init - module init |
| @@ -2886,12 +2830,20 @@ int ioc4_serial_init(void) | |||
| 2886 | __FUNCTION__); | 2830 | __FUNCTION__); |
| 2887 | return ret; | 2831 | return ret; |
| 2888 | } | 2832 | } |
| 2889 | return 0; | 2833 | |
| 2834 | /* register with IOC4 main module */ | ||
| 2835 | return ioc4_register_submodule(&ioc4_serial_submodule); | ||
| 2836 | } | ||
| 2837 | |||
| 2838 | static void __devexit ioc4_serial_exit(void) | ||
| 2839 | { | ||
| 2840 | ioc4_unregister_submodule(&ioc4_serial_submodule); | ||
| 2841 | uart_unregister_driver(&ioc4_uart); | ||
| 2890 | } | 2842 | } |
| 2891 | 2843 | ||
| 2844 | module_init(ioc4_serial_init); | ||
| 2845 | module_exit(ioc4_serial_exit); | ||
| 2846 | |||
| 2892 | MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) <pfg@sgi.com>"); | 2847 | MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) <pfg@sgi.com>"); |
| 2893 | MODULE_DESCRIPTION("Serial PCI driver module for SGI IOC4 Base-IO Card"); | 2848 | MODULE_DESCRIPTION("Serial PCI driver module for SGI IOC4 Base-IO Card"); |
| 2894 | MODULE_LICENSE("GPL"); | 2849 | MODULE_LICENSE("GPL"); |
| 2895 | |||
| 2896 | EXPORT_SYMBOL(ioc4_serial_init); | ||
| 2897 | EXPORT_SYMBOL(ioc4_serial_attach_one); | ||
diff --git a/drivers/serial/m32r_sio.c b/drivers/serial/m32r_sio.c index 08d61f13edc6..0301feacbde4 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c | |||
| @@ -724,22 +724,22 @@ static void m32r_sio_set_termios(struct uart_port *port, | |||
| 724 | 724 | ||
| 725 | switch (termios->c_cflag & CSIZE) { | 725 | switch (termios->c_cflag & CSIZE) { |
| 726 | case CS5: | 726 | case CS5: |
| 727 | cval = 0x00; | 727 | cval = UART_LCR_WLEN5; |
| 728 | break; | 728 | break; |
| 729 | case CS6: | 729 | case CS6: |
| 730 | cval = 0x01; | 730 | cval = UART_LCR_WLEN6; |
| 731 | break; | 731 | break; |
| 732 | case CS7: | 732 | case CS7: |
| 733 | cval = 0x02; | 733 | cval = UART_LCR_WLEN7; |
| 734 | break; | 734 | break; |
| 735 | default: | 735 | default: |
| 736 | case CS8: | 736 | case CS8: |
| 737 | cval = 0x03; | 737 | cval = UART_LCR_WLEN8; |
| 738 | break; | 738 | break; |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | if (termios->c_cflag & CSTOPB) | 741 | if (termios->c_cflag & CSTOPB) |
| 742 | cval |= 0x04; | 742 | cval |= UART_LCR_STOP; |
| 743 | if (termios->c_cflag & PARENB) | 743 | if (termios->c_cflag & PARENB) |
| 744 | cval |= UART_LCR_PARITY; | 744 | cval |= UART_LCR_PARITY; |
| 745 | if (!(termios->c_cflag & PARODD)) | 745 | if (!(termios->c_cflag & PARODD)) |
diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c index a8314aee2ab8..a2a643318002 100644 --- a/drivers/serial/mpsc.c +++ b/drivers/serial/mpsc.c | |||
| @@ -67,7 +67,11 @@ | |||
| 67 | 67 | ||
| 68 | static struct mpsc_port_info mpsc_ports[MPSC_NUM_CTLRS]; | 68 | static struct mpsc_port_info mpsc_ports[MPSC_NUM_CTLRS]; |
| 69 | static struct mpsc_shared_regs mpsc_shared_regs; | 69 | static struct mpsc_shared_regs mpsc_shared_regs; |
| 70 | static struct uart_driver mpsc_reg; | ||
| 70 | 71 | ||
| 72 | static void mpsc_start_rx(struct mpsc_port_info *pi); | ||
| 73 | static void mpsc_free_ring_mem(struct mpsc_port_info *pi); | ||
| 74 | static void mpsc_release_port(struct uart_port *port); | ||
| 71 | /* | 75 | /* |
| 72 | ****************************************************************************** | 76 | ****************************************************************************** |
| 73 | * | 77 | * |
| @@ -546,7 +550,6 @@ static int | |||
| 546 | mpsc_alloc_ring_mem(struct mpsc_port_info *pi) | 550 | mpsc_alloc_ring_mem(struct mpsc_port_info *pi) |
| 547 | { | 551 | { |
| 548 | int rc = 0; | 552 | int rc = 0; |
| 549 | static void mpsc_free_ring_mem(struct mpsc_port_info *pi); | ||
| 550 | 553 | ||
| 551 | pr_debug("mpsc_alloc_ring_mem[%d]: Allocating ring mem\n", | 554 | pr_debug("mpsc_alloc_ring_mem[%d]: Allocating ring mem\n", |
| 552 | pi->port.line); | 555 | pi->port.line); |
| @@ -745,7 +748,6 @@ mpsc_rx_intr(struct mpsc_port_info *pi, struct pt_regs *regs) | |||
| 745 | int rc = 0; | 748 | int rc = 0; |
| 746 | u8 *bp; | 749 | u8 *bp; |
| 747 | char flag = TTY_NORMAL; | 750 | char flag = TTY_NORMAL; |
| 748 | static void mpsc_start_rx(struct mpsc_port_info *pi); | ||
| 749 | 751 | ||
| 750 | pr_debug("mpsc_rx_intr[%d]: Handling Rx intr\n", pi->port.line); | 752 | pr_debug("mpsc_rx_intr[%d]: Handling Rx intr\n", pi->port.line); |
| 751 | 753 | ||
| @@ -1178,7 +1180,6 @@ static void | |||
| 1178 | mpsc_shutdown(struct uart_port *port) | 1180 | mpsc_shutdown(struct uart_port *port) |
| 1179 | { | 1181 | { |
| 1180 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; | 1182 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; |
| 1181 | static void mpsc_release_port(struct uart_port *port); | ||
| 1182 | 1183 | ||
| 1183 | pr_debug("mpsc_shutdown[%d]: Shutting down MPSC\n", port->line); | 1184 | pr_debug("mpsc_shutdown[%d]: Shutting down MPSC\n", port->line); |
| 1184 | 1185 | ||
| @@ -1448,7 +1449,6 @@ mpsc_console_setup(struct console *co, char *options) | |||
| 1448 | return uart_set_options(&pi->port, co, baud, parity, bits, flow); | 1449 | return uart_set_options(&pi->port, co, baud, parity, bits, flow); |
| 1449 | } | 1450 | } |
| 1450 | 1451 | ||
| 1451 | extern struct uart_driver mpsc_reg; | ||
| 1452 | static struct console mpsc_console = { | 1452 | static struct console mpsc_console = { |
| 1453 | .name = MPSC_DEV_NAME, | 1453 | .name = MPSC_DEV_NAME, |
| 1454 | .write = mpsc_console_write, | 1454 | .write = mpsc_console_write, |
diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index 9dc151d8fa61..08b08d6ae904 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c | |||
| @@ -455,22 +455,22 @@ serial_pxa_set_termios(struct uart_port *port, struct termios *termios, | |||
| 455 | 455 | ||
| 456 | switch (termios->c_cflag & CSIZE) { | 456 | switch (termios->c_cflag & CSIZE) { |
| 457 | case CS5: | 457 | case CS5: |
| 458 | cval = 0x00; | 458 | cval = UART_LCR_WLEN5; |
| 459 | break; | 459 | break; |
| 460 | case CS6: | 460 | case CS6: |
| 461 | cval = 0x01; | 461 | cval = UART_LCR_WLEN6; |
| 462 | break; | 462 | break; |
| 463 | case CS7: | 463 | case CS7: |
| 464 | cval = 0x02; | 464 | cval = UART_LCR_WLEN7; |
| 465 | break; | 465 | break; |
| 466 | default: | 466 | default: |
| 467 | case CS8: | 467 | case CS8: |
| 468 | cval = 0x03; | 468 | cval = UART_LCR_WLEN8; |
| 469 | break; | 469 | break; |
| 470 | } | 470 | } |
| 471 | 471 | ||
| 472 | if (termios->c_cflag & CSTOPB) | 472 | if (termios->c_cflag & CSTOPB) |
| 473 | cval |= 0x04; | 473 | cval |= UART_LCR_STOP; |
| 474 | if (termios->c_cflag & PARENB) | 474 | if (termios->c_cflag & PARENB) |
| 475 | cval |= UART_LCR_PARITY; | 475 | cval |= UART_LCR_PARITY; |
| 476 | if (!(termios->c_cflag & PARODD)) | 476 | if (!(termios->c_cflag & PARODD)) |
diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c index 2a9f7ade2c9d..5c4678478b1d 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c | |||
| @@ -198,7 +198,7 @@ static inline struct s3c24xx_uart_port *to_ourport(struct uart_port *port) | |||
| 198 | 198 | ||
| 199 | /* translate a port to the device name */ | 199 | /* translate a port to the device name */ |
| 200 | 200 | ||
| 201 | static inline char *s3c24xx_serial_portname(struct uart_port *port) | 201 | static inline const char *s3c24xx_serial_portname(struct uart_port *port) |
| 202 | { | 202 | { |
| 203 | return to_platform_device(port->dev)->name; | 203 | return to_platform_device(port->dev)->name; |
| 204 | } | 204 | } |
| @@ -903,7 +903,7 @@ static void s3c24xx_serial_release_port(struct uart_port *port) | |||
| 903 | 903 | ||
| 904 | static int s3c24xx_serial_request_port(struct uart_port *port) | 904 | static int s3c24xx_serial_request_port(struct uart_port *port) |
| 905 | { | 905 | { |
| 906 | char *name = s3c24xx_serial_portname(port); | 906 | const char *name = s3c24xx_serial_portname(port); |
| 907 | return request_mem_region(port->mapbase, MAP_SIZE, name) ? 0 : -EBUSY; | 907 | return request_mem_region(port->mapbase, MAP_SIZE, name) ? 0 : -EBUSY; |
| 908 | } | 908 | } |
| 909 | 909 | ||
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index 22565a67a57c..98641c3f5ab9 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c | |||
| @@ -197,7 +197,7 @@ static void | |||
| 197 | sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs) | 197 | sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs) |
| 198 | { | 198 | { |
| 199 | struct tty_struct *tty = sport->port.info->tty; | 199 | struct tty_struct *tty = sport->port.info->tty; |
| 200 | unsigned int status, ch, flg, ignored = 0; | 200 | unsigned int status, ch, flg; |
| 201 | 201 | ||
| 202 | status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | | 202 | status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | |
| 203 | UTSR0_TO_SM(UART_GET_UTSR0(sport)); | 203 | UTSR0_TO_SM(UART_GET_UTSR0(sport)); |
diff --git a/drivers/serial/sn_console.c b/drivers/serial/sn_console.c index fee6418e84c4..840815fde49b 100644 --- a/drivers/serial/sn_console.c +++ b/drivers/serial/sn_console.c | |||
| @@ -572,6 +572,7 @@ static void sn_transmit_chars(struct sn_cons_port *port, int raw) | |||
| 572 | 572 | ||
| 573 | if (uart_circ_empty(xmit) || uart_tx_stopped(&port->sc_port)) { | 573 | if (uart_circ_empty(xmit) || uart_tx_stopped(&port->sc_port)) { |
| 574 | /* Nothing to do. */ | 574 | /* Nothing to do. */ |
| 575 | ia64_sn_console_intr_disable(SAL_CONSOLE_INTR_XMIT); | ||
| 575 | return; | 576 | return; |
| 576 | } | 577 | } |
| 577 | 578 | ||
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index 5c4231ae295b..8e65206d3d76 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c | |||
| @@ -1071,7 +1071,7 @@ static void __init sunzilog_alloc_tables(void) | |||
| 1071 | */ | 1071 | */ |
| 1072 | static struct zilog_layout __iomem * __init get_zs_sun4u(int chip, int zsnode) | 1072 | static struct zilog_layout __iomem * __init get_zs_sun4u(int chip, int zsnode) |
| 1073 | { | 1073 | { |
| 1074 | unsigned long mapped_addr; | 1074 | void __iomem *mapped_addr; |
| 1075 | unsigned int sun4u_ino; | 1075 | unsigned int sun4u_ino; |
| 1076 | struct sbus_bus *sbus = NULL; | 1076 | struct sbus_bus *sbus = NULL; |
| 1077 | struct sbus_dev *sdev = NULL; | 1077 | struct sbus_dev *sdev = NULL; |
| @@ -1111,9 +1111,9 @@ static struct zilog_layout __iomem * __init get_zs_sun4u(int chip, int zsnode) | |||
| 1111 | apply_fhc_ranges(central_bus->child, | 1111 | apply_fhc_ranges(central_bus->child, |
| 1112 | &zsregs[0], 1); | 1112 | &zsregs[0], 1); |
| 1113 | apply_central_ranges(central_bus, &zsregs[0], 1); | 1113 | apply_central_ranges(central_bus, &zsregs[0], 1); |
| 1114 | mapped_addr = | 1114 | mapped_addr = (void __iomem *) |
| 1115 | (((u64)zsregs[0].which_io)<<32UL) | | 1115 | ((((u64)zsregs[0].which_io)<<32UL) | |
| 1116 | ((u64)zsregs[0].phys_addr); | 1116 | ((u64)zsregs[0].phys_addr)); |
| 1117 | } | 1117 | } |
| 1118 | 1118 | ||
| 1119 | if (zilog_irq == -1) { | 1119 | if (zilog_irq == -1) { |
diff --git a/drivers/serial/vr41xx_siu.c b/drivers/serial/vr41xx_siu.c index 5d2ceb623e6f..1f985327b0d4 100644 --- a/drivers/serial/vr41xx_siu.c +++ b/drivers/serial/vr41xx_siu.c | |||
| @@ -234,7 +234,7 @@ static inline const char *siu_type_name(struct uart_port *port) | |||
| 234 | return "DSIU"; | 234 | return "DSIU"; |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | return "unknown"; | 237 | return NULL; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | static unsigned int siu_tx_empty(struct uart_port *port) | 240 | static unsigned int siu_tx_empty(struct uart_port *port) |
| @@ -482,9 +482,6 @@ static irqreturn_t siu_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 482 | struct uart_port *port; | 482 | struct uart_port *port; |
| 483 | uint8_t iir, lsr; | 483 | uint8_t iir, lsr; |
| 484 | 484 | ||
| 485 | if (dev_id == NULL) | ||
| 486 | return IRQ_NONE; | ||
| 487 | |||
| 488 | port = (struct uart_port *)dev_id; | 485 | port = (struct uart_port *)dev_id; |
| 489 | 486 | ||
| 490 | iir = siu_read(port, UART_IIR); | 487 | iir = siu_read(port, UART_IIR); |
| @@ -507,6 +504,9 @@ static int siu_startup(struct uart_port *port) | |||
| 507 | { | 504 | { |
| 508 | int retval; | 505 | int retval; |
| 509 | 506 | ||
| 507 | if (port->membase == NULL) | ||
| 508 | return -ENODEV; | ||
| 509 | |||
| 510 | siu_clear_fifo(port); | 510 | siu_clear_fifo(port); |
| 511 | 511 | ||
| 512 | (void)siu_read(port, UART_LSR); | 512 | (void)siu_read(port, UART_LSR); |
| @@ -545,9 +545,6 @@ static void siu_shutdown(struct uart_port *port) | |||
| 545 | unsigned long flags; | 545 | unsigned long flags; |
| 546 | uint8_t lcr; | 546 | uint8_t lcr; |
| 547 | 547 | ||
| 548 | if (port->membase == NULL) | ||
| 549 | return; | ||
| 550 | |||
| 551 | siu_write(port, UART_IER, 0); | 548 | siu_write(port, UART_IER, 0); |
| 552 | 549 | ||
| 553 | spin_lock_irqsave(&port->lock, flags); | 550 | spin_lock_irqsave(&port->lock, flags); |
| @@ -802,53 +799,6 @@ static int siu_init_ports(void) | |||
| 802 | 799 | ||
| 803 | #ifdef CONFIG_SERIAL_VR41XX_CONSOLE | 800 | #ifdef CONFIG_SERIAL_VR41XX_CONSOLE |
| 804 | 801 | ||
| 805 | static void early_set_termios(struct uart_port *port, struct termios *new, | ||
| 806 | struct termios *old) | ||
| 807 | { | ||
| 808 | tcflag_t c_cflag; | ||
| 809 | uint8_t lcr; | ||
| 810 | unsigned int baud, quot; | ||
| 811 | |||
| 812 | c_cflag = new->c_cflag; | ||
| 813 | switch (c_cflag & CSIZE) { | ||
| 814 | case CS5: | ||
| 815 | lcr = UART_LCR_WLEN5; | ||
| 816 | break; | ||
| 817 | case CS6: | ||
| 818 | lcr = UART_LCR_WLEN6; | ||
| 819 | break; | ||
| 820 | case CS7: | ||
| 821 | lcr = UART_LCR_WLEN7; | ||
| 822 | break; | ||
| 823 | default: | ||
| 824 | lcr = UART_LCR_WLEN8; | ||
| 825 | break; | ||
| 826 | } | ||
| 827 | |||
| 828 | if (c_cflag & CSTOPB) | ||
| 829 | lcr |= UART_LCR_STOP; | ||
| 830 | if (c_cflag & PARENB) | ||
| 831 | lcr |= UART_LCR_PARITY; | ||
| 832 | if ((c_cflag & PARODD) != PARODD) | ||
| 833 | lcr |= UART_LCR_EPAR; | ||
| 834 | if (c_cflag & CMSPAR) | ||
| 835 | lcr |= UART_LCR_SPAR; | ||
| 836 | |||
| 837 | baud = uart_get_baud_rate(port, new, old, 0, port->uartclk/16); | ||
| 838 | quot = uart_get_divisor(port, baud); | ||
| 839 | |||
| 840 | siu_write(port, UART_LCR, lcr | UART_LCR_DLAB); | ||
| 841 | |||
| 842 | siu_write(port, UART_DLL, (uint8_t)quot); | ||
| 843 | siu_write(port, UART_DLM, (uint8_t)(quot >> 8)); | ||
| 844 | |||
| 845 | siu_write(port, UART_LCR, lcr); | ||
| 846 | } | ||
| 847 | |||
| 848 | static struct uart_ops early_uart_ops = { | ||
| 849 | .set_termios = early_set_termios, | ||
| 850 | }; | ||
| 851 | |||
| 852 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | 802 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
| 853 | 803 | ||
| 854 | static void wait_for_xmitr(struct uart_port *port) | 804 | static void wait_for_xmitr(struct uart_port *port) |
| @@ -915,7 +865,7 @@ static int siu_console_setup(struct console *con, char *options) | |||
| 915 | if (port->membase == NULL) { | 865 | if (port->membase == NULL) { |
| 916 | if (port->mapbase == 0) | 866 | if (port->mapbase == 0) |
| 917 | return -ENODEV; | 867 | return -ENODEV; |
| 918 | port->membase = (unsigned char __iomem *)KSEG1ADDR(port->mapbase); | 868 | port->membase = ioremap(port->mapbase, siu_port_size(port)); |
| 919 | } | 869 | } |
| 920 | 870 | ||
| 921 | vr41xx_select_siu_interface(SIU_INTERFACE_RS232C); | 871 | vr41xx_select_siu_interface(SIU_INTERFACE_RS232C); |
| @@ -949,7 +899,7 @@ static int __devinit siu_console_init(void) | |||
| 949 | 899 | ||
| 950 | for (i = 0; i < num; i++) { | 900 | for (i = 0; i < num; i++) { |
| 951 | port = &siu_uart_ports[i]; | 901 | port = &siu_uart_ports[i]; |
| 952 | port->ops = &early_uart_ops; | 902 | port->ops = &siu_uart_ops; |
| 953 | } | 903 | } |
| 954 | 904 | ||
| 955 | register_console(&siu_console); | 905 | register_console(&siu_console); |
| @@ -994,8 +944,10 @@ static int siu_probe(struct device *dev) | |||
| 994 | port->dev = dev; | 944 | port->dev = dev; |
| 995 | 945 | ||
| 996 | retval = uart_add_one_port(&siu_uart_driver, port); | 946 | retval = uart_add_one_port(&siu_uart_driver, port); |
| 997 | if (retval) | 947 | if (retval < 0) { |
| 948 | port->dev = NULL; | ||
| 998 | break; | 949 | break; |
| 950 | } | ||
| 999 | } | 951 | } |
| 1000 | 952 | ||
| 1001 | if (i == 0 && retval < 0) { | 953 | if (i == 0 && retval < 0) { |
