diff options
Diffstat (limited to 'drivers/tty/serial/8250/8250_pci.c')
| -rw-r--r-- | drivers/tty/serial/8250/8250_pci.c | 205 |
1 files changed, 139 insertions, 66 deletions
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 28e7c7cce893..fdab80a4e063 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c | |||
| @@ -44,7 +44,7 @@ struct pci_serial_quirk { | |||
| 44 | int (*init)(struct pci_dev *dev); | 44 | int (*init)(struct pci_dev *dev); |
| 45 | int (*setup)(struct serial_private *, | 45 | int (*setup)(struct serial_private *, |
| 46 | const struct pciserial_board *, | 46 | const struct pciserial_board *, |
| 47 | struct uart_port *, int); | 47 | struct uart_8250_port *, int); |
| 48 | void (*exit)(struct pci_dev *dev); | 48 | void (*exit)(struct pci_dev *dev); |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| @@ -59,7 +59,7 @@ struct serial_private { | |||
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | static int pci_default_setup(struct serial_private*, | 61 | static int pci_default_setup(struct serial_private*, |
| 62 | const struct pciserial_board*, struct uart_port*, int); | 62 | const struct pciserial_board*, struct uart_8250_port *, int); |
| 63 | 63 | ||
| 64 | static void moan_device(const char *str, struct pci_dev *dev) | 64 | static void moan_device(const char *str, struct pci_dev *dev) |
| 65 | { | 65 | { |
| @@ -74,7 +74,7 @@ static void moan_device(const char *str, struct pci_dev *dev) | |||
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | static int | 76 | static int |
| 77 | setup_port(struct serial_private *priv, struct uart_port *port, | 77 | setup_port(struct serial_private *priv, struct uart_8250_port *port, |
| 78 | int bar, int offset, int regshift) | 78 | int bar, int offset, int regshift) |
| 79 | { | 79 | { |
| 80 | struct pci_dev *dev = priv->dev; | 80 | struct pci_dev *dev = priv->dev; |
| @@ -93,17 +93,17 @@ setup_port(struct serial_private *priv, struct uart_port *port, | |||
| 93 | if (!priv->remapped_bar[bar]) | 93 | if (!priv->remapped_bar[bar]) |
| 94 | return -ENOMEM; | 94 | return -ENOMEM; |
| 95 | 95 | ||
| 96 | port->iotype = UPIO_MEM; | 96 | port->port.iotype = UPIO_MEM; |
| 97 | port->iobase = 0; | 97 | port->port.iobase = 0; |
| 98 | port->mapbase = base + offset; | 98 | port->port.mapbase = base + offset; |
| 99 | port->membase = priv->remapped_bar[bar] + offset; | 99 | port->port.membase = priv->remapped_bar[bar] + offset; |
| 100 | port->regshift = regshift; | 100 | port->port.regshift = regshift; |
| 101 | } else { | 101 | } else { |
| 102 | port->iotype = UPIO_PORT; | 102 | port->port.iotype = UPIO_PORT; |
| 103 | port->iobase = base + offset; | 103 | port->port.iobase = base + offset; |
| 104 | port->mapbase = 0; | 104 | port->port.mapbase = 0; |
| 105 | port->membase = NULL; | 105 | port->port.membase = NULL; |
| 106 | port->regshift = 0; | 106 | port->port.regshift = 0; |
| 107 | } | 107 | } |
| 108 | return 0; | 108 | return 0; |
| 109 | } | 109 | } |
| @@ -113,7 +113,7 @@ setup_port(struct serial_private *priv, struct uart_port *port, | |||
| 113 | */ | 113 | */ |
| 114 | static int addidata_apci7800_setup(struct serial_private *priv, | 114 | static int addidata_apci7800_setup(struct serial_private *priv, |
| 115 | const struct pciserial_board *board, | 115 | const struct pciserial_board *board, |
| 116 | struct uart_port *port, int idx) | 116 | struct uart_8250_port *port, int idx) |
| 117 | { | 117 | { |
| 118 | unsigned int bar = 0, offset = board->first_offset; | 118 | unsigned int bar = 0, offset = board->first_offset; |
| 119 | bar = FL_GET_BASE(board->flags); | 119 | bar = FL_GET_BASE(board->flags); |
| @@ -140,7 +140,7 @@ static int addidata_apci7800_setup(struct serial_private *priv, | |||
| 140 | */ | 140 | */ |
| 141 | static int | 141 | static int |
| 142 | afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, | 142 | afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, |
| 143 | struct uart_port *port, int idx) | 143 | struct uart_8250_port *port, int idx) |
| 144 | { | 144 | { |
| 145 | unsigned int bar, offset = board->first_offset; | 145 | unsigned int bar, offset = board->first_offset; |
| 146 | 146 | ||
| @@ -195,7 +195,7 @@ static int pci_hp_diva_init(struct pci_dev *dev) | |||
| 195 | static int | 195 | static int |
| 196 | pci_hp_diva_setup(struct serial_private *priv, | 196 | pci_hp_diva_setup(struct serial_private *priv, |
| 197 | const struct pciserial_board *board, | 197 | const struct pciserial_board *board, |
| 198 | struct uart_port *port, int idx) | 198 | struct uart_8250_port *port, int idx) |
| 199 | { | 199 | { |
| 200 | unsigned int offset = board->first_offset; | 200 | unsigned int offset = board->first_offset; |
| 201 | unsigned int bar = FL_GET_BASE(board->flags); | 201 | unsigned int bar = FL_GET_BASE(board->flags); |
| @@ -370,7 +370,7 @@ static void __devexit pci_ni8430_exit(struct pci_dev *dev) | |||
| 370 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ | 370 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ |
| 371 | static int | 371 | static int |
| 372 | sbs_setup(struct serial_private *priv, const struct pciserial_board *board, | 372 | sbs_setup(struct serial_private *priv, const struct pciserial_board *board, |
| 373 | struct uart_port *port, int idx) | 373 | struct uart_8250_port *port, int idx) |
| 374 | { | 374 | { |
| 375 | unsigned int bar, offset = board->first_offset; | 375 | unsigned int bar, offset = board->first_offset; |
| 376 | 376 | ||
| @@ -525,7 +525,7 @@ static int pci_siig_init(struct pci_dev *dev) | |||
| 525 | 525 | ||
| 526 | static int pci_siig_setup(struct serial_private *priv, | 526 | static int pci_siig_setup(struct serial_private *priv, |
| 527 | const struct pciserial_board *board, | 527 | const struct pciserial_board *board, |
| 528 | struct uart_port *port, int idx) | 528 | struct uart_8250_port *port, int idx) |
| 529 | { | 529 | { |
| 530 | unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; | 530 | unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; |
| 531 | 531 | ||
| @@ -619,7 +619,7 @@ static int pci_timedia_init(struct pci_dev *dev) | |||
| 619 | static int | 619 | static int |
| 620 | pci_timedia_setup(struct serial_private *priv, | 620 | pci_timedia_setup(struct serial_private *priv, |
| 621 | const struct pciserial_board *board, | 621 | const struct pciserial_board *board, |
| 622 | struct uart_port *port, int idx) | 622 | struct uart_8250_port *port, int idx) |
| 623 | { | 623 | { |
| 624 | unsigned int bar = 0, offset = board->first_offset; | 624 | unsigned int bar = 0, offset = board->first_offset; |
| 625 | 625 | ||
| @@ -653,7 +653,7 @@ pci_timedia_setup(struct serial_private *priv, | |||
| 653 | static int | 653 | static int |
| 654 | titan_400l_800l_setup(struct serial_private *priv, | 654 | titan_400l_800l_setup(struct serial_private *priv, |
| 655 | const struct pciserial_board *board, | 655 | const struct pciserial_board *board, |
| 656 | struct uart_port *port, int idx) | 656 | struct uart_8250_port *port, int idx) |
| 657 | { | 657 | { |
| 658 | unsigned int bar, offset = board->first_offset; | 658 | unsigned int bar, offset = board->first_offset; |
| 659 | 659 | ||
| @@ -754,7 +754,7 @@ static int pci_ni8430_init(struct pci_dev *dev) | |||
| 754 | static int | 754 | static int |
| 755 | pci_ni8430_setup(struct serial_private *priv, | 755 | pci_ni8430_setup(struct serial_private *priv, |
| 756 | const struct pciserial_board *board, | 756 | const struct pciserial_board *board, |
| 757 | struct uart_port *port, int idx) | 757 | struct uart_8250_port *port, int idx) |
| 758 | { | 758 | { |
| 759 | void __iomem *p; | 759 | void __iomem *p; |
| 760 | unsigned long base, len; | 760 | unsigned long base, len; |
| @@ -781,7 +781,7 @@ pci_ni8430_setup(struct serial_private *priv, | |||
| 781 | 781 | ||
| 782 | static int pci_netmos_9900_setup(struct serial_private *priv, | 782 | static int pci_netmos_9900_setup(struct serial_private *priv, |
| 783 | const struct pciserial_board *board, | 783 | const struct pciserial_board *board, |
| 784 | struct uart_port *port, int idx) | 784 | struct uart_8250_port *port, int idx) |
| 785 | { | 785 | { |
| 786 | unsigned int bar; | 786 | unsigned int bar; |
| 787 | 787 | ||
| @@ -1032,10 +1032,17 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev) | |||
| 1032 | return number_uarts; | 1032 | return number_uarts; |
| 1033 | } | 1033 | } |
| 1034 | 1034 | ||
| 1035 | static int | 1035 | static int pci_asix_setup(struct serial_private *priv, |
| 1036 | pci_default_setup(struct serial_private *priv, | ||
| 1037 | const struct pciserial_board *board, | 1036 | const struct pciserial_board *board, |
| 1038 | struct uart_port *port, int idx) | 1037 | struct uart_8250_port *port, int idx) |
| 1038 | { | ||
| 1039 | port->bugs |= UART_BUG_PARITY; | ||
| 1040 | return pci_default_setup(priv, board, port, idx); | ||
| 1041 | } | ||
| 1042 | |||
| 1043 | static int pci_default_setup(struct serial_private *priv, | ||
| 1044 | const struct pciserial_board *board, | ||
| 1045 | struct uart_8250_port *port, int idx) | ||
| 1039 | { | 1046 | { |
| 1040 | unsigned int bar, offset = board->first_offset, maxnr; | 1047 | unsigned int bar, offset = board->first_offset, maxnr; |
| 1041 | 1048 | ||
| @@ -1057,15 +1064,15 @@ pci_default_setup(struct serial_private *priv, | |||
| 1057 | static int | 1064 | static int |
| 1058 | ce4100_serial_setup(struct serial_private *priv, | 1065 | ce4100_serial_setup(struct serial_private *priv, |
| 1059 | const struct pciserial_board *board, | 1066 | const struct pciserial_board *board, |
| 1060 | struct uart_port *port, int idx) | 1067 | struct uart_8250_port *port, int idx) |
| 1061 | { | 1068 | { |
| 1062 | int ret; | 1069 | int ret; |
| 1063 | 1070 | ||
| 1064 | ret = setup_port(priv, port, 0, 0, board->reg_shift); | 1071 | ret = setup_port(priv, port, 0, 0, board->reg_shift); |
| 1065 | port->iotype = UPIO_MEM32; | 1072 | port->port.iotype = UPIO_MEM32; |
| 1066 | port->type = PORT_XSCALE; | 1073 | port->port.type = PORT_XSCALE; |
| 1067 | port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); | 1074 | port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); |
| 1068 | port->regshift = 2; | 1075 | port->port.regshift = 2; |
| 1069 | 1076 | ||
| 1070 | return ret; | 1077 | return ret; |
| 1071 | } | 1078 | } |
| @@ -1073,16 +1080,16 @@ ce4100_serial_setup(struct serial_private *priv, | |||
| 1073 | static int | 1080 | static int |
| 1074 | pci_omegapci_setup(struct serial_private *priv, | 1081 | pci_omegapci_setup(struct serial_private *priv, |
| 1075 | const struct pciserial_board *board, | 1082 | const struct pciserial_board *board, |
| 1076 | struct uart_port *port, int idx) | 1083 | struct uart_8250_port *port, int idx) |
| 1077 | { | 1084 | { |
| 1078 | return setup_port(priv, port, 2, idx * 8, 0); | 1085 | return setup_port(priv, port, 2, idx * 8, 0); |
| 1079 | } | 1086 | } |
| 1080 | 1087 | ||
| 1081 | static int skip_tx_en_setup(struct serial_private *priv, | 1088 | static int skip_tx_en_setup(struct serial_private *priv, |
| 1082 | const struct pciserial_board *board, | 1089 | const struct pciserial_board *board, |
| 1083 | struct uart_port *port, int idx) | 1090 | struct uart_8250_port *port, int idx) |
| 1084 | { | 1091 | { |
| 1085 | port->flags |= UPF_NO_TXEN_TEST; | 1092 | port->port.flags |= UPF_NO_TXEN_TEST; |
| 1086 | printk(KERN_DEBUG "serial8250: skipping TxEn test for device " | 1093 | printk(KERN_DEBUG "serial8250: skipping TxEn test for device " |
| 1087 | "[%04x:%04x] subsystem [%04x:%04x]\n", | 1094 | "[%04x:%04x] subsystem [%04x:%04x]\n", |
| 1088 | priv->dev->vendor, | 1095 | priv->dev->vendor, |
| @@ -1131,11 +1138,11 @@ static unsigned int kt_serial_in(struct uart_port *p, int offset) | |||
| 1131 | 1138 | ||
| 1132 | static int kt_serial_setup(struct serial_private *priv, | 1139 | static int kt_serial_setup(struct serial_private *priv, |
| 1133 | const struct pciserial_board *board, | 1140 | const struct pciserial_board *board, |
| 1134 | struct uart_port *port, int idx) | 1141 | struct uart_8250_port *port, int idx) |
| 1135 | { | 1142 | { |
| 1136 | port->flags |= UPF_BUG_THRE; | 1143 | port->port.flags |= UPF_BUG_THRE; |
| 1137 | port->serial_in = kt_serial_in; | 1144 | port->port.serial_in = kt_serial_in; |
| 1138 | port->handle_break = kt_handle_break; | 1145 | port->port.handle_break = kt_handle_break; |
| 1139 | return skip_tx_en_setup(priv, board, port, idx); | 1146 | return skip_tx_en_setup(priv, board, port, idx); |
| 1140 | } | 1147 | } |
| 1141 | 1148 | ||
| @@ -1151,9 +1158,19 @@ static int pci_eg20t_init(struct pci_dev *dev) | |||
| 1151 | static int | 1158 | static int |
| 1152 | pci_xr17c154_setup(struct serial_private *priv, | 1159 | pci_xr17c154_setup(struct serial_private *priv, |
| 1153 | const struct pciserial_board *board, | 1160 | const struct pciserial_board *board, |
| 1154 | struct uart_port *port, int idx) | 1161 | struct uart_8250_port *port, int idx) |
| 1162 | { | ||
| 1163 | port->port.flags |= UPF_EXAR_EFR; | ||
| 1164 | return pci_default_setup(priv, board, port, idx); | ||
| 1165 | } | ||
| 1166 | |||
| 1167 | static int | ||
| 1168 | pci_wch_ch353_setup(struct serial_private *priv, | ||
| 1169 | const struct pciserial_board *board, | ||
| 1170 | struct uart_8250_port *port, int idx) | ||
| 1155 | { | 1171 | { |
| 1156 | port->flags |= UPF_EXAR_EFR; | 1172 | port->port.flags |= UPF_FIXED_TYPE; |
| 1173 | port->port.type = PORT_16550A; | ||
| 1157 | return pci_default_setup(priv, board, port, idx); | 1174 | return pci_default_setup(priv, board, port, idx); |
| 1158 | } | 1175 | } |
| 1159 | 1176 | ||
| @@ -1187,6 +1204,13 @@ pci_xr17c154_setup(struct serial_private *priv, | |||
| 1187 | #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 | 1204 | #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 |
| 1188 | #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 | 1205 | #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 |
| 1189 | #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d | 1206 | #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d |
| 1207 | #define PCI_VENDOR_ID_WCH 0x4348 | ||
| 1208 | #define PCI_DEVICE_ID_WCH_CH353_4S 0x3453 | ||
| 1209 | #define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046 | ||
| 1210 | #define PCI_DEVICE_ID_WCH_CH353_2S1P 0x7053 | ||
| 1211 | #define PCI_VENDOR_ID_AGESTAR 0x5372 | ||
| 1212 | #define PCI_DEVICE_ID_AGESTAR_9375 0x6872 | ||
| 1213 | #define PCI_VENDOR_ID_ASIX 0x9710 | ||
| 1190 | 1214 | ||
| 1191 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | 1215 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ |
| 1192 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | 1216 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 |
| @@ -1726,7 +1750,41 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { | |||
| 1726 | .subvendor = PCI_ANY_ID, | 1750 | .subvendor = PCI_ANY_ID, |
| 1727 | .subdevice = PCI_ANY_ID, | 1751 | .subdevice = PCI_ANY_ID, |
| 1728 | .setup = pci_omegapci_setup, | 1752 | .setup = pci_omegapci_setup, |
| 1729 | }, | 1753 | }, |
| 1754 | /* WCH CH353 2S1P card (16550 clone) */ | ||
| 1755 | { | ||
| 1756 | .vendor = PCI_VENDOR_ID_WCH, | ||
| 1757 | .device = PCI_DEVICE_ID_WCH_CH353_2S1P, | ||
| 1758 | .subvendor = PCI_ANY_ID, | ||
| 1759 | .subdevice = PCI_ANY_ID, | ||
| 1760 | .setup = pci_wch_ch353_setup, | ||
| 1761 | }, | ||
| 1762 | /* WCH CH353 4S card (16550 clone) */ | ||
| 1763 | { | ||
| 1764 | .vendor = PCI_VENDOR_ID_WCH, | ||
| 1765 | .device = PCI_DEVICE_ID_WCH_CH353_4S, | ||
| 1766 | .subvendor = PCI_ANY_ID, | ||
| 1767 | .subdevice = PCI_ANY_ID, | ||
| 1768 | .setup = pci_wch_ch353_setup, | ||
| 1769 | }, | ||
| 1770 | /* WCH CH353 2S1PF card (16550 clone) */ | ||
| 1771 | { | ||
| 1772 | .vendor = PCI_VENDOR_ID_WCH, | ||
| 1773 | .device = PCI_DEVICE_ID_WCH_CH353_2S1PF, | ||
| 1774 | .subvendor = PCI_ANY_ID, | ||
| 1775 | .subdevice = PCI_ANY_ID, | ||
| 1776 | .setup = pci_wch_ch353_setup, | ||
| 1777 | }, | ||
| 1778 | /* | ||
| 1779 | * ASIX devices with FIFO bug | ||
| 1780 | */ | ||
| 1781 | { | ||
| 1782 | .vendor = PCI_VENDOR_ID_ASIX, | ||
| 1783 | .device = PCI_ANY_ID, | ||
| 1784 | .subvendor = PCI_ANY_ID, | ||
| 1785 | .subdevice = PCI_ANY_ID, | ||
| 1786 | .setup = pci_asix_setup, | ||
| 1787 | }, | ||
| 1730 | /* | 1788 | /* |
| 1731 | * Default "match everything" terminator entry | 1789 | * Default "match everything" terminator entry |
| 1732 | */ | 1790 | */ |
| @@ -1887,7 +1945,6 @@ enum pci_board_num_t { | |||
| 1887 | pbn_panacom, | 1945 | pbn_panacom, |
| 1888 | pbn_panacom2, | 1946 | pbn_panacom2, |
| 1889 | pbn_panacom4, | 1947 | pbn_panacom4, |
| 1890 | pbn_exsys_4055, | ||
| 1891 | pbn_plx_romulus, | 1948 | pbn_plx_romulus, |
| 1892 | pbn_oxsemi, | 1949 | pbn_oxsemi, |
| 1893 | pbn_oxsemi_1_4000000, | 1950 | pbn_oxsemi_1_4000000, |
| @@ -2393,13 +2450,6 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
| 2393 | .reg_shift = 7, | 2450 | .reg_shift = 7, |
| 2394 | }, | 2451 | }, |
| 2395 | 2452 | ||
| 2396 | [pbn_exsys_4055] = { | ||
| 2397 | .flags = FL_BASE2, | ||
| 2398 | .num_ports = 4, | ||
| 2399 | .base_baud = 115200, | ||
| 2400 | .uart_offset = 8, | ||
| 2401 | }, | ||
| 2402 | |||
| 2403 | /* I think this entry is broken - the first_offset looks wrong --rmk */ | 2453 | /* I think this entry is broken - the first_offset looks wrong --rmk */ |
| 2404 | [pbn_plx_romulus] = { | 2454 | [pbn_plx_romulus] = { |
| 2405 | .flags = FL_BASE2, | 2455 | .flags = FL_BASE2, |
| @@ -2624,10 +2674,14 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
| 2624 | }, | 2674 | }, |
| 2625 | }; | 2675 | }; |
| 2626 | 2676 | ||
| 2627 | static const struct pci_device_id softmodem_blacklist[] = { | 2677 | static const struct pci_device_id blacklist[] = { |
| 2678 | /* softmodems */ | ||
| 2628 | { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */ | 2679 | { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */ |
| 2629 | { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */ | 2680 | { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */ |
| 2630 | { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */ | 2681 | { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */ |
| 2682 | |||
| 2683 | /* multi-io cards handled by parport_serial */ | ||
| 2684 | { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */ | ||
| 2631 | }; | 2685 | }; |
| 2632 | 2686 | ||
| 2633 | /* | 2687 | /* |
| @@ -2638,7 +2692,7 @@ static const struct pci_device_id softmodem_blacklist[] = { | |||
| 2638 | static int __devinit | 2692 | static int __devinit |
| 2639 | serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) | 2693 | serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) |
| 2640 | { | 2694 | { |
| 2641 | const struct pci_device_id *blacklist; | 2695 | const struct pci_device_id *bldev; |
| 2642 | int num_iomem, num_port, first_port = -1, i; | 2696 | int num_iomem, num_port, first_port = -1, i; |
| 2643 | 2697 | ||
| 2644 | /* | 2698 | /* |
| @@ -2655,13 +2709,13 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) | |||
| 2655 | 2709 | ||
| 2656 | /* | 2710 | /* |
| 2657 | * Do not access blacklisted devices that are known not to | 2711 | * Do not access blacklisted devices that are known not to |
| 2658 | * feature serial ports. | 2712 | * feature serial ports or are handled by other modules. |
| 2659 | */ | 2713 | */ |
| 2660 | for (blacklist = softmodem_blacklist; | 2714 | for (bldev = blacklist; |
| 2661 | blacklist < softmodem_blacklist + ARRAY_SIZE(softmodem_blacklist); | 2715 | bldev < blacklist + ARRAY_SIZE(blacklist); |
| 2662 | blacklist++) { | 2716 | bldev++) { |
| 2663 | if (dev->vendor == blacklist->vendor && | 2717 | if (dev->vendor == bldev->vendor && |
| 2664 | dev->device == blacklist->device) | 2718 | dev->device == bldev->device) |
| 2665 | return -ENODEV; | 2719 | return -ENODEV; |
| 2666 | } | 2720 | } |
| 2667 | 2721 | ||
| @@ -2728,7 +2782,7 @@ serial_pci_matches(const struct pciserial_board *board, | |||
| 2728 | struct serial_private * | 2782 | struct serial_private * |
| 2729 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) | 2783 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) |
| 2730 | { | 2784 | { |
| 2731 | struct uart_port serial_port; | 2785 | struct uart_8250_port uart; |
| 2732 | struct serial_private *priv; | 2786 | struct serial_private *priv; |
| 2733 | struct pci_serial_quirk *quirk; | 2787 | struct pci_serial_quirk *quirk; |
| 2734 | int rc, nr_ports, i; | 2788 | int rc, nr_ports, i; |
| @@ -2768,22 +2822,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) | |||
| 2768 | priv->dev = dev; | 2822 | priv->dev = dev; |
| 2769 | priv->quirk = quirk; | 2823 | priv->quirk = quirk; |
| 2770 | 2824 | ||
| 2771 | memset(&serial_port, 0, sizeof(struct uart_port)); | 2825 | memset(&uart, 0, sizeof(uart)); |
| 2772 | serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | 2826 | uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; |
| 2773 | serial_port.uartclk = board->base_baud * 16; | 2827 | uart.port.uartclk = board->base_baud * 16; |
| 2774 | serial_port.irq = get_pci_irq(dev, board); | 2828 | uart.port.irq = get_pci_irq(dev, board); |
| 2775 | serial_port.dev = &dev->dev; | 2829 | uart.port.dev = &dev->dev; |
| 2776 | 2830 | ||
| 2777 | for (i = 0; i < nr_ports; i++) { | 2831 | for (i = 0; i < nr_ports; i++) { |
| 2778 | if (quirk->setup(priv, board, &serial_port, i)) | 2832 | if (quirk->setup(priv, board, &uart, i)) |
| 2779 | break; | 2833 | break; |
| 2780 | 2834 | ||
| 2781 | #ifdef SERIAL_DEBUG_PCI | 2835 | #ifdef SERIAL_DEBUG_PCI |
| 2782 | printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", | 2836 | printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", |
| 2783 | serial_port.iobase, serial_port.irq, serial_port.iotype); | 2837 | uart.port.iobase, uart.port.irq, uart.port.iotype); |
| 2784 | #endif | 2838 | #endif |
| 2785 | 2839 | ||
| 2786 | priv->line[i] = serial8250_register_port(&serial_port); | 2840 | priv->line[i] = serial8250_register_8250_port(&uart); |
| 2787 | if (priv->line[i] < 0) { | 2841 | if (priv->line[i] < 0) { |
| 2788 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); | 2842 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); |
| 2789 | break; | 2843 | break; |
| @@ -3193,7 +3247,7 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
| 3193 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, | 3247 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, |
| 3194 | PCI_SUBVENDOR_ID_EXSYS, | 3248 | PCI_SUBVENDOR_ID_EXSYS, |
| 3195 | PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, | 3249 | PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, |
| 3196 | pbn_exsys_4055 }, | 3250 | pbn_b2_4_115200 }, |
| 3197 | /* | 3251 | /* |
| 3198 | * Megawolf Romulus PCI Serial Card, from Mike Hudson | 3252 | * Megawolf Romulus PCI Serial Card, from Mike Hudson |
| 3199 | * (Exoray@isys.ca) | 3253 | * (Exoray@isys.ca) |
| @@ -4179,6 +4233,25 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
| 4179 | pbn_omegapci }, | 4233 | pbn_omegapci }, |
| 4180 | 4234 | ||
| 4181 | /* | 4235 | /* |
| 4236 | * AgeStar as-prs2-009 | ||
| 4237 | */ | ||
| 4238 | { PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375, | ||
| 4239 | PCI_ANY_ID, PCI_ANY_ID, | ||
| 4240 | 0, 0, pbn_b0_bt_2_115200 }, | ||
| 4241 | |||
| 4242 | /* | ||
| 4243 | * WCH CH353 series devices: The 2S1P is handled by parport_serial | ||
| 4244 | * so not listed here. | ||
| 4245 | */ | ||
| 4246 | { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S, | ||
| 4247 | PCI_ANY_ID, PCI_ANY_ID, | ||
| 4248 | 0, 0, pbn_b0_bt_4_115200 }, | ||
| 4249 | |||
| 4250 | { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF, | ||
| 4251 | PCI_ANY_ID, PCI_ANY_ID, | ||
| 4252 | 0, 0, pbn_b0_bt_2_115200 }, | ||
| 4253 | |||
| 4254 | /* | ||
| 4182 | * These entries match devices with class COMMUNICATION_SERIAL, | 4255 | * These entries match devices with class COMMUNICATION_SERIAL, |
| 4183 | * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL | 4256 | * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL |
| 4184 | */ | 4257 | */ |
