1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Probe module for 8250/16550-type PCI serial ports.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Copyright (C) 2001 Russell King, All Rights Reserved.
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun #undef DEBUG
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/pci.h>
12*4882a593Smuzhiyun #include <linux/string.h>
13*4882a593Smuzhiyun #include <linux/kernel.h>
14*4882a593Smuzhiyun #include <linux/slab.h>
15*4882a593Smuzhiyun #include <linux/delay.h>
16*4882a593Smuzhiyun #include <linux/tty.h>
17*4882a593Smuzhiyun #include <linux/serial_reg.h>
18*4882a593Smuzhiyun #include <linux/serial_core.h>
19*4882a593Smuzhiyun #include <linux/8250_pci.h>
20*4882a593Smuzhiyun #include <linux/bitops.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include <asm/byteorder.h>
23*4882a593Smuzhiyun #include <asm/io.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include "8250.h"
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun * init function returns:
29*4882a593Smuzhiyun * > 0 - number of ports
30*4882a593Smuzhiyun * = 0 - use board->num_ports
31*4882a593Smuzhiyun * < 0 - error
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun struct pci_serial_quirk {
34*4882a593Smuzhiyun u32 vendor;
35*4882a593Smuzhiyun u32 device;
36*4882a593Smuzhiyun u32 subvendor;
37*4882a593Smuzhiyun u32 subdevice;
38*4882a593Smuzhiyun int (*probe)(struct pci_dev *dev);
39*4882a593Smuzhiyun int (*init)(struct pci_dev *dev);
40*4882a593Smuzhiyun int (*setup)(struct serial_private *,
41*4882a593Smuzhiyun const struct pciserial_board *,
42*4882a593Smuzhiyun struct uart_8250_port *, int);
43*4882a593Smuzhiyun void (*exit)(struct pci_dev *dev);
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun struct f815xxa_data {
47*4882a593Smuzhiyun spinlock_t lock;
48*4882a593Smuzhiyun int idx;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun struct serial_private {
52*4882a593Smuzhiyun struct pci_dev *dev;
53*4882a593Smuzhiyun unsigned int nr;
54*4882a593Smuzhiyun struct pci_serial_quirk *quirk;
55*4882a593Smuzhiyun const struct pciserial_board *board;
56*4882a593Smuzhiyun int line[];
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define PCI_DEVICE_ID_HPE_PCI_SERIAL 0x37e
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun static const struct pci_device_id pci_use_msi[] = {
62*4882a593Smuzhiyun { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
63*4882a593Smuzhiyun 0xA000, 0x1000) },
64*4882a593Smuzhiyun { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
65*4882a593Smuzhiyun 0xA000, 0x1000) },
66*4882a593Smuzhiyun { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
67*4882a593Smuzhiyun 0xA000, 0x1000) },
68*4882a593Smuzhiyun { PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
69*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID) },
70*4882a593Smuzhiyun { }
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun static int pci_default_setup(struct serial_private*,
74*4882a593Smuzhiyun const struct pciserial_board*, struct uart_8250_port *, int);
75*4882a593Smuzhiyun
moan_device(const char * str,struct pci_dev * dev)76*4882a593Smuzhiyun static void moan_device(const char *str, struct pci_dev *dev)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun pci_err(dev, "%s\n"
79*4882a593Smuzhiyun "Please send the output of lspci -vv, this\n"
80*4882a593Smuzhiyun "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
81*4882a593Smuzhiyun "manufacturer and name of serial board or\n"
82*4882a593Smuzhiyun "modem board to <linux-serial@vger.kernel.org>.\n",
83*4882a593Smuzhiyun str, dev->vendor, dev->device,
84*4882a593Smuzhiyun dev->subsystem_vendor, dev->subsystem_device);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun static int
setup_port(struct serial_private * priv,struct uart_8250_port * port,u8 bar,unsigned int offset,int regshift)88*4882a593Smuzhiyun setup_port(struct serial_private *priv, struct uart_8250_port *port,
89*4882a593Smuzhiyun u8 bar, unsigned int offset, int regshift)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun struct pci_dev *dev = priv->dev;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun if (bar >= PCI_STD_NUM_BARS)
94*4882a593Smuzhiyun return -EINVAL;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) {
97*4882a593Smuzhiyun if (!pcim_iomap(dev, bar, 0) && !pcim_iomap_table(dev))
98*4882a593Smuzhiyun return -ENOMEM;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun port->port.iotype = UPIO_MEM;
101*4882a593Smuzhiyun port->port.iobase = 0;
102*4882a593Smuzhiyun port->port.mapbase = pci_resource_start(dev, bar) + offset;
103*4882a593Smuzhiyun port->port.membase = pcim_iomap_table(dev)[bar] + offset;
104*4882a593Smuzhiyun port->port.regshift = regshift;
105*4882a593Smuzhiyun } else {
106*4882a593Smuzhiyun port->port.iotype = UPIO_PORT;
107*4882a593Smuzhiyun port->port.iobase = pci_resource_start(dev, bar) + offset;
108*4882a593Smuzhiyun port->port.mapbase = 0;
109*4882a593Smuzhiyun port->port.membase = NULL;
110*4882a593Smuzhiyun port->port.regshift = 0;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun return 0;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /*
116*4882a593Smuzhiyun * ADDI-DATA GmbH communication cards <info@addi-data.com>
117*4882a593Smuzhiyun */
addidata_apci7800_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)118*4882a593Smuzhiyun static int addidata_apci7800_setup(struct serial_private *priv,
119*4882a593Smuzhiyun const struct pciserial_board *board,
120*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun unsigned int bar = 0, offset = board->first_offset;
123*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun if (idx < 2) {
126*4882a593Smuzhiyun offset += idx * board->uart_offset;
127*4882a593Smuzhiyun } else if ((idx >= 2) && (idx < 4)) {
128*4882a593Smuzhiyun bar += 1;
129*4882a593Smuzhiyun offset += ((idx - 2) * board->uart_offset);
130*4882a593Smuzhiyun } else if ((idx >= 4) && (idx < 6)) {
131*4882a593Smuzhiyun bar += 2;
132*4882a593Smuzhiyun offset += ((idx - 4) * board->uart_offset);
133*4882a593Smuzhiyun } else if (idx >= 6) {
134*4882a593Smuzhiyun bar += 3;
135*4882a593Smuzhiyun offset += ((idx - 6) * board->uart_offset);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun * AFAVLAB uses a different mixture of BARs and offsets
143*4882a593Smuzhiyun * Not that ugly ;) -- HW
144*4882a593Smuzhiyun */
145*4882a593Smuzhiyun static int
afavlab_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)146*4882a593Smuzhiyun afavlab_setup(struct serial_private *priv, const struct pciserial_board *board,
147*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
152*4882a593Smuzhiyun if (idx < 4)
153*4882a593Smuzhiyun bar += idx;
154*4882a593Smuzhiyun else {
155*4882a593Smuzhiyun bar = 4;
156*4882a593Smuzhiyun offset += (idx - 4) * board->uart_offset;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /*
163*4882a593Smuzhiyun * HP's Remote Management Console. The Diva chip came in several
164*4882a593Smuzhiyun * different versions. N-class, L2000 and A500 have two Diva chips, each
165*4882a593Smuzhiyun * with 3 UARTs (the third UART on the second chip is unused). Superdome
166*4882a593Smuzhiyun * and Keystone have one Diva chip with 3 UARTs. Some later machines have
167*4882a593Smuzhiyun * one Diva chip, but it has been expanded to 5 UARTs.
168*4882a593Smuzhiyun */
pci_hp_diva_init(struct pci_dev * dev)169*4882a593Smuzhiyun static int pci_hp_diva_init(struct pci_dev *dev)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun int rc = 0;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun switch (dev->subsystem_device) {
174*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_TOSCA1:
175*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_HALFDOME:
176*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_KEYSTONE:
177*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_EVEREST:
178*4882a593Smuzhiyun rc = 3;
179*4882a593Smuzhiyun break;
180*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_TOSCA2:
181*4882a593Smuzhiyun rc = 2;
182*4882a593Smuzhiyun break;
183*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
184*4882a593Smuzhiyun rc = 4;
185*4882a593Smuzhiyun break;
186*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_POWERBAR:
187*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_HURRICANE:
188*4882a593Smuzhiyun rc = 1;
189*4882a593Smuzhiyun break;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun return rc;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun /*
196*4882a593Smuzhiyun * HP's Diva chip puts the 4th/5th serial port further out, and
197*4882a593Smuzhiyun * some serial ports are supposed to be hidden on certain models.
198*4882a593Smuzhiyun */
199*4882a593Smuzhiyun static int
pci_hp_diva_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)200*4882a593Smuzhiyun pci_hp_diva_setup(struct serial_private *priv,
201*4882a593Smuzhiyun const struct pciserial_board *board,
202*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun unsigned int offset = board->first_offset;
205*4882a593Smuzhiyun unsigned int bar = FL_GET_BASE(board->flags);
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun switch (priv->dev->subsystem_device) {
208*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
209*4882a593Smuzhiyun if (idx == 3)
210*4882a593Smuzhiyun idx++;
211*4882a593Smuzhiyun break;
212*4882a593Smuzhiyun case PCI_DEVICE_ID_HP_DIVA_EVEREST:
213*4882a593Smuzhiyun if (idx > 0)
214*4882a593Smuzhiyun idx++;
215*4882a593Smuzhiyun if (idx > 2)
216*4882a593Smuzhiyun idx++;
217*4882a593Smuzhiyun break;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun if (idx > 2)
220*4882a593Smuzhiyun offset = 0x18;
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun offset += idx * board->uart_offset;
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /*
228*4882a593Smuzhiyun * Added for EKF Intel i960 serial boards
229*4882a593Smuzhiyun */
pci_inteli960ni_init(struct pci_dev * dev)230*4882a593Smuzhiyun static int pci_inteli960ni_init(struct pci_dev *dev)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun u32 oldval;
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun if (!(dev->subsystem_device & 0x1000))
235*4882a593Smuzhiyun return -ENODEV;
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /* is firmware started? */
238*4882a593Smuzhiyun pci_read_config_dword(dev, 0x44, &oldval);
239*4882a593Smuzhiyun if (oldval == 0x00001000L) { /* RESET value */
240*4882a593Smuzhiyun pci_dbg(dev, "Local i960 firmware missing\n");
241*4882a593Smuzhiyun return -ENODEV;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun return 0;
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /*
247*4882a593Smuzhiyun * Some PCI serial cards using the PLX 9050 PCI interface chip require
248*4882a593Smuzhiyun * that the card interrupt be explicitly enabled or disabled. This
249*4882a593Smuzhiyun * seems to be mainly needed on card using the PLX which also use I/O
250*4882a593Smuzhiyun * mapped memory.
251*4882a593Smuzhiyun */
pci_plx9050_init(struct pci_dev * dev)252*4882a593Smuzhiyun static int pci_plx9050_init(struct pci_dev *dev)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun u8 irq_config;
255*4882a593Smuzhiyun void __iomem *p;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun if ((pci_resource_flags(dev, 0) & IORESOURCE_MEM) == 0) {
258*4882a593Smuzhiyun moan_device("no memory in bar 0", dev);
259*4882a593Smuzhiyun return 0;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun irq_config = 0x41;
263*4882a593Smuzhiyun if (dev->vendor == PCI_VENDOR_ID_PANACOM ||
264*4882a593Smuzhiyun dev->subsystem_vendor == PCI_SUBVENDOR_ID_EXSYS)
265*4882a593Smuzhiyun irq_config = 0x43;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
268*4882a593Smuzhiyun (dev->device == PCI_DEVICE_ID_PLX_ROMULUS))
269*4882a593Smuzhiyun /*
270*4882a593Smuzhiyun * As the megawolf cards have the int pins active
271*4882a593Smuzhiyun * high, and have 2 UART chips, both ints must be
272*4882a593Smuzhiyun * enabled on the 9050. Also, the UARTS are set in
273*4882a593Smuzhiyun * 16450 mode by default, so we have to enable the
274*4882a593Smuzhiyun * 16C950 'enhanced' mode so that we can use the
275*4882a593Smuzhiyun * deep FIFOs
276*4882a593Smuzhiyun */
277*4882a593Smuzhiyun irq_config = 0x5b;
278*4882a593Smuzhiyun /*
279*4882a593Smuzhiyun * enable/disable interrupts
280*4882a593Smuzhiyun */
281*4882a593Smuzhiyun p = ioremap(pci_resource_start(dev, 0), 0x80);
282*4882a593Smuzhiyun if (p == NULL)
283*4882a593Smuzhiyun return -ENOMEM;
284*4882a593Smuzhiyun writel(irq_config, p + 0x4c);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun /*
287*4882a593Smuzhiyun * Read the register back to ensure that it took effect.
288*4882a593Smuzhiyun */
289*4882a593Smuzhiyun readl(p + 0x4c);
290*4882a593Smuzhiyun iounmap(p);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun return 0;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
pci_plx9050_exit(struct pci_dev * dev)295*4882a593Smuzhiyun static void pci_plx9050_exit(struct pci_dev *dev)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun u8 __iomem *p;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if ((pci_resource_flags(dev, 0) & IORESOURCE_MEM) == 0)
300*4882a593Smuzhiyun return;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /*
303*4882a593Smuzhiyun * disable interrupts
304*4882a593Smuzhiyun */
305*4882a593Smuzhiyun p = ioremap(pci_resource_start(dev, 0), 0x80);
306*4882a593Smuzhiyun if (p != NULL) {
307*4882a593Smuzhiyun writel(0, p + 0x4c);
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun /*
310*4882a593Smuzhiyun * Read the register back to ensure that it took effect.
311*4882a593Smuzhiyun */
312*4882a593Smuzhiyun readl(p + 0x4c);
313*4882a593Smuzhiyun iounmap(p);
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun #define NI8420_INT_ENABLE_REG 0x38
318*4882a593Smuzhiyun #define NI8420_INT_ENABLE_BIT 0x2000
319*4882a593Smuzhiyun
pci_ni8420_exit(struct pci_dev * dev)320*4882a593Smuzhiyun static void pci_ni8420_exit(struct pci_dev *dev)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun void __iomem *p;
323*4882a593Smuzhiyun unsigned int bar = 0;
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
326*4882a593Smuzhiyun moan_device("no memory in bar", dev);
327*4882a593Smuzhiyun return;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun p = pci_ioremap_bar(dev, bar);
331*4882a593Smuzhiyun if (p == NULL)
332*4882a593Smuzhiyun return;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun /* Disable the CPU Interrupt */
335*4882a593Smuzhiyun writel(readl(p + NI8420_INT_ENABLE_REG) & ~(NI8420_INT_ENABLE_BIT),
336*4882a593Smuzhiyun p + NI8420_INT_ENABLE_REG);
337*4882a593Smuzhiyun iounmap(p);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun /* MITE registers */
342*4882a593Smuzhiyun #define MITE_IOWBSR1 0xc4
343*4882a593Smuzhiyun #define MITE_IOWCR1 0xf4
344*4882a593Smuzhiyun #define MITE_LCIMR1 0x08
345*4882a593Smuzhiyun #define MITE_LCIMR2 0x10
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun #define MITE_LCIMR2_CLR_CPU_IE (1 << 30)
348*4882a593Smuzhiyun
pci_ni8430_exit(struct pci_dev * dev)349*4882a593Smuzhiyun static void pci_ni8430_exit(struct pci_dev *dev)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun void __iomem *p;
352*4882a593Smuzhiyun unsigned int bar = 0;
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
355*4882a593Smuzhiyun moan_device("no memory in bar", dev);
356*4882a593Smuzhiyun return;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun p = pci_ioremap_bar(dev, bar);
360*4882a593Smuzhiyun if (p == NULL)
361*4882a593Smuzhiyun return;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /* Disable the CPU Interrupt */
364*4882a593Smuzhiyun writel(MITE_LCIMR2_CLR_CPU_IE, p + MITE_LCIMR2);
365*4882a593Smuzhiyun iounmap(p);
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
369*4882a593Smuzhiyun static int
sbs_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)370*4882a593Smuzhiyun sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
371*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset;
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun bar = 0;
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun if (idx < 4) {
378*4882a593Smuzhiyun /* first four channels map to 0, 0x100, 0x200, 0x300 */
379*4882a593Smuzhiyun offset += idx * board->uart_offset;
380*4882a593Smuzhiyun } else if (idx < 8) {
381*4882a593Smuzhiyun /* last four channels map to 0x1000, 0x1100, 0x1200, 0x1300 */
382*4882a593Smuzhiyun offset += idx * board->uart_offset + 0xC00;
383*4882a593Smuzhiyun } else /* we have only 8 ports on PMC-OCTALPRO */
384*4882a593Smuzhiyun return 1;
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun /*
390*4882a593Smuzhiyun * This does initialization for PMC OCTALPRO cards:
391*4882a593Smuzhiyun * maps the device memory, resets the UARTs (needed, bc
392*4882a593Smuzhiyun * if the module is removed and inserted again, the card
393*4882a593Smuzhiyun * is in the sleep mode) and enables global interrupt.
394*4882a593Smuzhiyun */
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /* global control register offset for SBS PMC-OctalPro */
397*4882a593Smuzhiyun #define OCT_REG_CR_OFF 0x500
398*4882a593Smuzhiyun
sbs_init(struct pci_dev * dev)399*4882a593Smuzhiyun static int sbs_init(struct pci_dev *dev)
400*4882a593Smuzhiyun {
401*4882a593Smuzhiyun u8 __iomem *p;
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun p = pci_ioremap_bar(dev, 0);
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun if (p == NULL)
406*4882a593Smuzhiyun return -ENOMEM;
407*4882a593Smuzhiyun /* Set bit-4 Control Register (UART RESET) in to reset the uarts */
408*4882a593Smuzhiyun writeb(0x10, p + OCT_REG_CR_OFF);
409*4882a593Smuzhiyun udelay(50);
410*4882a593Smuzhiyun writeb(0x0, p + OCT_REG_CR_OFF);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun /* Set bit-2 (INTENABLE) of Control Register */
413*4882a593Smuzhiyun writeb(0x4, p + OCT_REG_CR_OFF);
414*4882a593Smuzhiyun iounmap(p);
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun return 0;
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun /*
420*4882a593Smuzhiyun * Disables the global interrupt of PMC-OctalPro
421*4882a593Smuzhiyun */
422*4882a593Smuzhiyun
sbs_exit(struct pci_dev * dev)423*4882a593Smuzhiyun static void sbs_exit(struct pci_dev *dev)
424*4882a593Smuzhiyun {
425*4882a593Smuzhiyun u8 __iomem *p;
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun p = pci_ioremap_bar(dev, 0);
428*4882a593Smuzhiyun /* FIXME: What if resource_len < OCT_REG_CR_OFF */
429*4882a593Smuzhiyun if (p != NULL)
430*4882a593Smuzhiyun writeb(0, p + OCT_REG_CR_OFF);
431*4882a593Smuzhiyun iounmap(p);
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun /*
435*4882a593Smuzhiyun * SIIG serial cards have an PCI interface chip which also controls
436*4882a593Smuzhiyun * the UART clocking frequency. Each UART can be clocked independently
437*4882a593Smuzhiyun * (except cards equipped with 4 UARTs) and initial clocking settings
438*4882a593Smuzhiyun * are stored in the EEPROM chip. It can cause problems because this
439*4882a593Smuzhiyun * version of serial driver doesn't support differently clocked UART's
440*4882a593Smuzhiyun * on single PCI card. To prevent this, initialization functions set
441*4882a593Smuzhiyun * high frequency clocking for all UART's on given card. It is safe (I
442*4882a593Smuzhiyun * hope) because it doesn't touch EEPROM settings to prevent conflicts
443*4882a593Smuzhiyun * with other OSes (like M$ DOS).
444*4882a593Smuzhiyun *
445*4882a593Smuzhiyun * SIIG support added by Andrey Panin <pazke@donpac.ru>, 10/1999
446*4882a593Smuzhiyun *
447*4882a593Smuzhiyun * There is two family of SIIG serial cards with different PCI
448*4882a593Smuzhiyun * interface chip and different configuration methods:
449*4882a593Smuzhiyun * - 10x cards have control registers in IO and/or memory space;
450*4882a593Smuzhiyun * - 20x cards have control registers in standard PCI configuration space.
451*4882a593Smuzhiyun *
452*4882a593Smuzhiyun * Note: all 10x cards have PCI device ids 0x10..
453*4882a593Smuzhiyun * all 20x cards have PCI device ids 0x20..
454*4882a593Smuzhiyun *
455*4882a593Smuzhiyun * There are also Quartet Serial cards which use Oxford Semiconductor
456*4882a593Smuzhiyun * 16954 quad UART PCI chip clocked by 18.432 MHz quartz.
457*4882a593Smuzhiyun *
458*4882a593Smuzhiyun * Note: some SIIG cards are probed by the parport_serial object.
459*4882a593Smuzhiyun */
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun #define PCI_DEVICE_ID_SIIG_1S_10x (PCI_DEVICE_ID_SIIG_1S_10x_550 & 0xfffc)
462*4882a593Smuzhiyun #define PCI_DEVICE_ID_SIIG_2S_10x (PCI_DEVICE_ID_SIIG_2S_10x_550 & 0xfff8)
463*4882a593Smuzhiyun
pci_siig10x_init(struct pci_dev * dev)464*4882a593Smuzhiyun static int pci_siig10x_init(struct pci_dev *dev)
465*4882a593Smuzhiyun {
466*4882a593Smuzhiyun u16 data;
467*4882a593Smuzhiyun void __iomem *p;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun switch (dev->device & 0xfff8) {
470*4882a593Smuzhiyun case PCI_DEVICE_ID_SIIG_1S_10x: /* 1S */
471*4882a593Smuzhiyun data = 0xffdf;
472*4882a593Smuzhiyun break;
473*4882a593Smuzhiyun case PCI_DEVICE_ID_SIIG_2S_10x: /* 2S, 2S1P */
474*4882a593Smuzhiyun data = 0xf7ff;
475*4882a593Smuzhiyun break;
476*4882a593Smuzhiyun default: /* 1S1P, 4S */
477*4882a593Smuzhiyun data = 0xfffb;
478*4882a593Smuzhiyun break;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun p = ioremap(pci_resource_start(dev, 0), 0x80);
482*4882a593Smuzhiyun if (p == NULL)
483*4882a593Smuzhiyun return -ENOMEM;
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun writew(readw(p + 0x28) & data, p + 0x28);
486*4882a593Smuzhiyun readw(p + 0x28);
487*4882a593Smuzhiyun iounmap(p);
488*4882a593Smuzhiyun return 0;
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun #define PCI_DEVICE_ID_SIIG_2S_20x (PCI_DEVICE_ID_SIIG_2S_20x_550 & 0xfffc)
492*4882a593Smuzhiyun #define PCI_DEVICE_ID_SIIG_2S1P_20x (PCI_DEVICE_ID_SIIG_2S1P_20x_550 & 0xfffc)
493*4882a593Smuzhiyun
pci_siig20x_init(struct pci_dev * dev)494*4882a593Smuzhiyun static int pci_siig20x_init(struct pci_dev *dev)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun u8 data;
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* Change clock frequency for the first UART. */
499*4882a593Smuzhiyun pci_read_config_byte(dev, 0x6f, &data);
500*4882a593Smuzhiyun pci_write_config_byte(dev, 0x6f, data & 0xef);
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun /* If this card has 2 UART, we have to do the same with second UART. */
503*4882a593Smuzhiyun if (((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S_20x) ||
504*4882a593Smuzhiyun ((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S1P_20x)) {
505*4882a593Smuzhiyun pci_read_config_byte(dev, 0x73, &data);
506*4882a593Smuzhiyun pci_write_config_byte(dev, 0x73, data & 0xef);
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun return 0;
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun
pci_siig_init(struct pci_dev * dev)511*4882a593Smuzhiyun static int pci_siig_init(struct pci_dev *dev)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun unsigned int type = dev->device & 0xff00;
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun if (type == 0x1000)
516*4882a593Smuzhiyun return pci_siig10x_init(dev);
517*4882a593Smuzhiyun else if (type == 0x2000)
518*4882a593Smuzhiyun return pci_siig20x_init(dev);
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun moan_device("Unknown SIIG card", dev);
521*4882a593Smuzhiyun return -ENODEV;
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
pci_siig_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)524*4882a593Smuzhiyun static int pci_siig_setup(struct serial_private *priv,
525*4882a593Smuzhiyun const struct pciserial_board *board,
526*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun if (idx > 3) {
531*4882a593Smuzhiyun bar = 4;
532*4882a593Smuzhiyun offset = (idx - 4) * 8;
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, 0);
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun /*
539*4882a593Smuzhiyun * Timedia has an explosion of boards, and to avoid the PCI table from
540*4882a593Smuzhiyun * growing *huge*, we use this function to collapse some 70 entries
541*4882a593Smuzhiyun * in the PCI table into one, for sanity's and compactness's sake.
542*4882a593Smuzhiyun */
543*4882a593Smuzhiyun static const unsigned short timedia_single_port[] = {
544*4882a593Smuzhiyun 0x4025, 0x4027, 0x4028, 0x5025, 0x5027, 0
545*4882a593Smuzhiyun };
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun static const unsigned short timedia_dual_port[] = {
548*4882a593Smuzhiyun 0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
549*4882a593Smuzhiyun 0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
550*4882a593Smuzhiyun 0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
551*4882a593Smuzhiyun 0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
552*4882a593Smuzhiyun 0xD079, 0
553*4882a593Smuzhiyun };
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun static const unsigned short timedia_quad_port[] = {
556*4882a593Smuzhiyun 0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
557*4882a593Smuzhiyun 0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
558*4882a593Smuzhiyun 0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
559*4882a593Smuzhiyun 0xB157, 0
560*4882a593Smuzhiyun };
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun static const unsigned short timedia_eight_port[] = {
563*4882a593Smuzhiyun 0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
564*4882a593Smuzhiyun 0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun static const struct timedia_struct {
568*4882a593Smuzhiyun int num;
569*4882a593Smuzhiyun const unsigned short *ids;
570*4882a593Smuzhiyun } timedia_data[] = {
571*4882a593Smuzhiyun { 1, timedia_single_port },
572*4882a593Smuzhiyun { 2, timedia_dual_port },
573*4882a593Smuzhiyun { 4, timedia_quad_port },
574*4882a593Smuzhiyun { 8, timedia_eight_port }
575*4882a593Smuzhiyun };
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun /*
578*4882a593Smuzhiyun * There are nearly 70 different Timedia/SUNIX PCI serial devices. Instead of
579*4882a593Smuzhiyun * listing them individually, this driver merely grabs them all with
580*4882a593Smuzhiyun * PCI_ANY_ID. Some of these devices, however, also feature a parallel port,
581*4882a593Smuzhiyun * and should be left free to be claimed by parport_serial instead.
582*4882a593Smuzhiyun */
pci_timedia_probe(struct pci_dev * dev)583*4882a593Smuzhiyun static int pci_timedia_probe(struct pci_dev *dev)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun /*
586*4882a593Smuzhiyun * Check the third digit of the subdevice ID
587*4882a593Smuzhiyun * (0,2,3,5,6: serial only -- 7,8,9: serial + parallel)
588*4882a593Smuzhiyun */
589*4882a593Smuzhiyun if ((dev->subsystem_device & 0x00f0) >= 0x70) {
590*4882a593Smuzhiyun pci_info(dev, "ignoring Timedia subdevice %04x for parport_serial\n",
591*4882a593Smuzhiyun dev->subsystem_device);
592*4882a593Smuzhiyun return -ENODEV;
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun return 0;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
pci_timedia_init(struct pci_dev * dev)598*4882a593Smuzhiyun static int pci_timedia_init(struct pci_dev *dev)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun const unsigned short *ids;
601*4882a593Smuzhiyun int i, j;
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(timedia_data); i++) {
604*4882a593Smuzhiyun ids = timedia_data[i].ids;
605*4882a593Smuzhiyun for (j = 0; ids[j]; j++)
606*4882a593Smuzhiyun if (dev->subsystem_device == ids[j])
607*4882a593Smuzhiyun return timedia_data[i].num;
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun return 0;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun /*
613*4882a593Smuzhiyun * Timedia/SUNIX uses a mixture of BARs and offsets
614*4882a593Smuzhiyun * Ugh, this is ugly as all hell --- TYT
615*4882a593Smuzhiyun */
616*4882a593Smuzhiyun static int
pci_timedia_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)617*4882a593Smuzhiyun pci_timedia_setup(struct serial_private *priv,
618*4882a593Smuzhiyun const struct pciserial_board *board,
619*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
620*4882a593Smuzhiyun {
621*4882a593Smuzhiyun unsigned int bar = 0, offset = board->first_offset;
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun switch (idx) {
624*4882a593Smuzhiyun case 0:
625*4882a593Smuzhiyun bar = 0;
626*4882a593Smuzhiyun break;
627*4882a593Smuzhiyun case 1:
628*4882a593Smuzhiyun offset = board->uart_offset;
629*4882a593Smuzhiyun bar = 0;
630*4882a593Smuzhiyun break;
631*4882a593Smuzhiyun case 2:
632*4882a593Smuzhiyun bar = 1;
633*4882a593Smuzhiyun break;
634*4882a593Smuzhiyun case 3:
635*4882a593Smuzhiyun offset = board->uart_offset;
636*4882a593Smuzhiyun fallthrough;
637*4882a593Smuzhiyun case 4: /* BAR 2 */
638*4882a593Smuzhiyun case 5: /* BAR 3 */
639*4882a593Smuzhiyun case 6: /* BAR 4 */
640*4882a593Smuzhiyun case 7: /* BAR 5 */
641*4882a593Smuzhiyun bar = idx - 2;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun /*
648*4882a593Smuzhiyun * Some Titan cards are also a little weird
649*4882a593Smuzhiyun */
650*4882a593Smuzhiyun static int
titan_400l_800l_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)651*4882a593Smuzhiyun titan_400l_800l_setup(struct serial_private *priv,
652*4882a593Smuzhiyun const struct pciserial_board *board,
653*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
654*4882a593Smuzhiyun {
655*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset;
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun switch (idx) {
658*4882a593Smuzhiyun case 0:
659*4882a593Smuzhiyun bar = 1;
660*4882a593Smuzhiyun break;
661*4882a593Smuzhiyun case 1:
662*4882a593Smuzhiyun bar = 2;
663*4882a593Smuzhiyun break;
664*4882a593Smuzhiyun default:
665*4882a593Smuzhiyun bar = 4;
666*4882a593Smuzhiyun offset = (idx - 2) * board->uart_offset;
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
pci_xircom_init(struct pci_dev * dev)672*4882a593Smuzhiyun static int pci_xircom_init(struct pci_dev *dev)
673*4882a593Smuzhiyun {
674*4882a593Smuzhiyun msleep(100);
675*4882a593Smuzhiyun return 0;
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun
pci_ni8420_init(struct pci_dev * dev)678*4882a593Smuzhiyun static int pci_ni8420_init(struct pci_dev *dev)
679*4882a593Smuzhiyun {
680*4882a593Smuzhiyun void __iomem *p;
681*4882a593Smuzhiyun unsigned int bar = 0;
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
684*4882a593Smuzhiyun moan_device("no memory in bar", dev);
685*4882a593Smuzhiyun return 0;
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun p = pci_ioremap_bar(dev, bar);
689*4882a593Smuzhiyun if (p == NULL)
690*4882a593Smuzhiyun return -ENOMEM;
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun /* Enable CPU Interrupt */
693*4882a593Smuzhiyun writel(readl(p + NI8420_INT_ENABLE_REG) | NI8420_INT_ENABLE_BIT,
694*4882a593Smuzhiyun p + NI8420_INT_ENABLE_REG);
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun iounmap(p);
697*4882a593Smuzhiyun return 0;
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun #define MITE_IOWBSR1_WSIZE 0xa
701*4882a593Smuzhiyun #define MITE_IOWBSR1_WIN_OFFSET 0x800
702*4882a593Smuzhiyun #define MITE_IOWBSR1_WENAB (1 << 7)
703*4882a593Smuzhiyun #define MITE_LCIMR1_IO_IE_0 (1 << 24)
704*4882a593Smuzhiyun #define MITE_LCIMR2_SET_CPU_IE (1 << 31)
705*4882a593Smuzhiyun #define MITE_IOWCR1_RAMSEL_MASK 0xfffffffe
706*4882a593Smuzhiyun
pci_ni8430_init(struct pci_dev * dev)707*4882a593Smuzhiyun static int pci_ni8430_init(struct pci_dev *dev)
708*4882a593Smuzhiyun {
709*4882a593Smuzhiyun void __iomem *p;
710*4882a593Smuzhiyun struct pci_bus_region region;
711*4882a593Smuzhiyun u32 device_window;
712*4882a593Smuzhiyun unsigned int bar = 0;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
715*4882a593Smuzhiyun moan_device("no memory in bar", dev);
716*4882a593Smuzhiyun return 0;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun p = pci_ioremap_bar(dev, bar);
720*4882a593Smuzhiyun if (p == NULL)
721*4882a593Smuzhiyun return -ENOMEM;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /*
724*4882a593Smuzhiyun * Set device window address and size in BAR0, while acknowledging that
725*4882a593Smuzhiyun * the resource structure may contain a translated address that differs
726*4882a593Smuzhiyun * from the address the device responds to.
727*4882a593Smuzhiyun */
728*4882a593Smuzhiyun pcibios_resource_to_bus(dev->bus, ®ion, &dev->resource[bar]);
729*4882a593Smuzhiyun device_window = ((region.start + MITE_IOWBSR1_WIN_OFFSET) & 0xffffff00)
730*4882a593Smuzhiyun | MITE_IOWBSR1_WENAB | MITE_IOWBSR1_WSIZE;
731*4882a593Smuzhiyun writel(device_window, p + MITE_IOWBSR1);
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun /* Set window access to go to RAMSEL IO address space */
734*4882a593Smuzhiyun writel((readl(p + MITE_IOWCR1) & MITE_IOWCR1_RAMSEL_MASK),
735*4882a593Smuzhiyun p + MITE_IOWCR1);
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun /* Enable IO Bus Interrupt 0 */
738*4882a593Smuzhiyun writel(MITE_LCIMR1_IO_IE_0, p + MITE_LCIMR1);
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun /* Enable CPU Interrupt */
741*4882a593Smuzhiyun writel(MITE_LCIMR2_SET_CPU_IE, p + MITE_LCIMR2);
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun iounmap(p);
744*4882a593Smuzhiyun return 0;
745*4882a593Smuzhiyun }
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun /* UART Port Control Register */
748*4882a593Smuzhiyun #define NI8430_PORTCON 0x0f
749*4882a593Smuzhiyun #define NI8430_PORTCON_TXVR_ENABLE (1 << 3)
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun static int
pci_ni8430_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)752*4882a593Smuzhiyun pci_ni8430_setup(struct serial_private *priv,
753*4882a593Smuzhiyun const struct pciserial_board *board,
754*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
755*4882a593Smuzhiyun {
756*4882a593Smuzhiyun struct pci_dev *dev = priv->dev;
757*4882a593Smuzhiyun void __iomem *p;
758*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset;
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun if (idx >= board->num_ports)
761*4882a593Smuzhiyun return 1;
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
764*4882a593Smuzhiyun offset += idx * board->uart_offset;
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun p = pci_ioremap_bar(dev, bar);
767*4882a593Smuzhiyun if (!p)
768*4882a593Smuzhiyun return -ENOMEM;
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun /* enable the transceiver */
771*4882a593Smuzhiyun writeb(readb(p + offset + NI8430_PORTCON) | NI8430_PORTCON_TXVR_ENABLE,
772*4882a593Smuzhiyun p + offset + NI8430_PORTCON);
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun iounmap(p);
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
777*4882a593Smuzhiyun }
778*4882a593Smuzhiyun
pci_netmos_9900_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)779*4882a593Smuzhiyun static int pci_netmos_9900_setup(struct serial_private *priv,
780*4882a593Smuzhiyun const struct pciserial_board *board,
781*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
782*4882a593Smuzhiyun {
783*4882a593Smuzhiyun unsigned int bar;
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun if ((priv->dev->device != PCI_DEVICE_ID_NETMOS_9865) &&
786*4882a593Smuzhiyun (priv->dev->subsystem_device & 0xff00) == 0x3000) {
787*4882a593Smuzhiyun /* netmos apparently orders BARs by datasheet layout, so serial
788*4882a593Smuzhiyun * ports get BARs 0 and 3 (or 1 and 4 for memmapped)
789*4882a593Smuzhiyun */
790*4882a593Smuzhiyun bar = 3 * idx;
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun return setup_port(priv, port, bar, 0, board->reg_shift);
793*4882a593Smuzhiyun } else {
794*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
795*4882a593Smuzhiyun }
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun /* the 99xx series comes with a range of device IDs and a variety
799*4882a593Smuzhiyun * of capabilities:
800*4882a593Smuzhiyun *
801*4882a593Smuzhiyun * 9900 has varying capabilities and can cascade to sub-controllers
802*4882a593Smuzhiyun * (cascading should be purely internal)
803*4882a593Smuzhiyun * 9904 is hardwired with 4 serial ports
804*4882a593Smuzhiyun * 9912 and 9922 are hardwired with 2 serial ports
805*4882a593Smuzhiyun */
pci_netmos_9900_numports(struct pci_dev * dev)806*4882a593Smuzhiyun static int pci_netmos_9900_numports(struct pci_dev *dev)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun unsigned int c = dev->class;
809*4882a593Smuzhiyun unsigned int pi;
810*4882a593Smuzhiyun unsigned short sub_serports;
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun pi = c & 0xff;
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun if (pi == 2)
815*4882a593Smuzhiyun return 1;
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun if ((pi == 0) && (dev->device == PCI_DEVICE_ID_NETMOS_9900)) {
818*4882a593Smuzhiyun /* two possibilities: 0x30ps encodes number of parallel and
819*4882a593Smuzhiyun * serial ports, or 0x1000 indicates *something*. This is not
820*4882a593Smuzhiyun * immediately obvious, since the 2s1p+4s configuration seems
821*4882a593Smuzhiyun * to offer all functionality on functions 0..2, while still
822*4882a593Smuzhiyun * advertising the same function 3 as the 4s+2s1p config.
823*4882a593Smuzhiyun */
824*4882a593Smuzhiyun sub_serports = dev->subsystem_device & 0xf;
825*4882a593Smuzhiyun if (sub_serports > 0)
826*4882a593Smuzhiyun return sub_serports;
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun pci_err(dev, "NetMos/Mostech serial driver ignoring port on ambiguous config.\n");
829*4882a593Smuzhiyun return 0;
830*4882a593Smuzhiyun }
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun moan_device("unknown NetMos/Mostech program interface", dev);
833*4882a593Smuzhiyun return 0;
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun
pci_netmos_init(struct pci_dev * dev)836*4882a593Smuzhiyun static int pci_netmos_init(struct pci_dev *dev)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun /* subdevice 0x00PS means <P> parallel, <S> serial */
839*4882a593Smuzhiyun unsigned int num_serial = dev->subsystem_device & 0xf;
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun if ((dev->device == PCI_DEVICE_ID_NETMOS_9901) ||
842*4882a593Smuzhiyun (dev->device == PCI_DEVICE_ID_NETMOS_9865))
843*4882a593Smuzhiyun return 0;
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
846*4882a593Smuzhiyun dev->subsystem_device == 0x0299)
847*4882a593Smuzhiyun return 0;
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun switch (dev->device) { /* FALLTHROUGH on all */
850*4882a593Smuzhiyun case PCI_DEVICE_ID_NETMOS_9904:
851*4882a593Smuzhiyun case PCI_DEVICE_ID_NETMOS_9912:
852*4882a593Smuzhiyun case PCI_DEVICE_ID_NETMOS_9922:
853*4882a593Smuzhiyun case PCI_DEVICE_ID_NETMOS_9900:
854*4882a593Smuzhiyun num_serial = pci_netmos_9900_numports(dev);
855*4882a593Smuzhiyun break;
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun default:
858*4882a593Smuzhiyun break;
859*4882a593Smuzhiyun }
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun if (num_serial == 0) {
862*4882a593Smuzhiyun moan_device("unknown NetMos/Mostech device", dev);
863*4882a593Smuzhiyun return -ENODEV;
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun return num_serial;
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun /*
870*4882a593Smuzhiyun * These chips are available with optionally one parallel port and up to
871*4882a593Smuzhiyun * two serial ports. Unfortunately they all have the same product id.
872*4882a593Smuzhiyun *
873*4882a593Smuzhiyun * Basic configuration is done over a region of 32 I/O ports. The base
874*4882a593Smuzhiyun * ioport is called INTA or INTC, depending on docs/other drivers.
875*4882a593Smuzhiyun *
876*4882a593Smuzhiyun * The region of the 32 I/O ports is configured in POSIO0R...
877*4882a593Smuzhiyun */
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun /* registers */
880*4882a593Smuzhiyun #define ITE_887x_MISCR 0x9c
881*4882a593Smuzhiyun #define ITE_887x_INTCBAR 0x78
882*4882a593Smuzhiyun #define ITE_887x_UARTBAR 0x7c
883*4882a593Smuzhiyun #define ITE_887x_PS0BAR 0x10
884*4882a593Smuzhiyun #define ITE_887x_POSIO0 0x60
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun /* I/O space size */
887*4882a593Smuzhiyun #define ITE_887x_IOSIZE 32
888*4882a593Smuzhiyun /* I/O space size (bits 26-24; 8 bytes = 011b) */
889*4882a593Smuzhiyun #define ITE_887x_POSIO_IOSIZE_8 (3 << 24)
890*4882a593Smuzhiyun /* I/O space size (bits 26-24; 32 bytes = 101b) */
891*4882a593Smuzhiyun #define ITE_887x_POSIO_IOSIZE_32 (5 << 24)
892*4882a593Smuzhiyun /* Decoding speed (1 = slow, 2 = medium, 3 = fast) */
893*4882a593Smuzhiyun #define ITE_887x_POSIO_SPEED (3 << 29)
894*4882a593Smuzhiyun /* enable IO_Space bit */
895*4882a593Smuzhiyun #define ITE_887x_POSIO_ENABLE (1 << 31)
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun /* inta_addr are the configuration addresses of the ITE */
898*4882a593Smuzhiyun static const short inta_addr[] = { 0x2a0, 0x2c0, 0x220, 0x240, 0x1e0, 0x200, 0x280 };
pci_ite887x_init(struct pci_dev * dev)899*4882a593Smuzhiyun static int pci_ite887x_init(struct pci_dev *dev)
900*4882a593Smuzhiyun {
901*4882a593Smuzhiyun int ret, i, type;
902*4882a593Smuzhiyun struct resource *iobase = NULL;
903*4882a593Smuzhiyun u32 miscr, uartbar, ioport;
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun /* search for the base-ioport */
906*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(inta_addr); i++) {
907*4882a593Smuzhiyun iobase = request_region(inta_addr[i], ITE_887x_IOSIZE,
908*4882a593Smuzhiyun "ite887x");
909*4882a593Smuzhiyun if (iobase != NULL) {
910*4882a593Smuzhiyun /* write POSIO0R - speed | size | ioport */
911*4882a593Smuzhiyun pci_write_config_dword(dev, ITE_887x_POSIO0,
912*4882a593Smuzhiyun ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
913*4882a593Smuzhiyun ITE_887x_POSIO_IOSIZE_32 | inta_addr[i]);
914*4882a593Smuzhiyun /* write INTCBAR - ioport */
915*4882a593Smuzhiyun pci_write_config_dword(dev, ITE_887x_INTCBAR,
916*4882a593Smuzhiyun inta_addr[i]);
917*4882a593Smuzhiyun ret = inb(inta_addr[i]);
918*4882a593Smuzhiyun if (ret != 0xff) {
919*4882a593Smuzhiyun /* ioport connected */
920*4882a593Smuzhiyun break;
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun release_region(iobase->start, ITE_887x_IOSIZE);
923*4882a593Smuzhiyun }
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun if (i == ARRAY_SIZE(inta_addr)) {
927*4882a593Smuzhiyun pci_err(dev, "could not find iobase\n");
928*4882a593Smuzhiyun return -ENODEV;
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun /* start of undocumented type checking (see parport_pc.c) */
932*4882a593Smuzhiyun type = inb(iobase->start + 0x18) & 0x0f;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun switch (type) {
935*4882a593Smuzhiyun case 0x2: /* ITE8871 (1P) */
936*4882a593Smuzhiyun case 0xa: /* ITE8875 (1P) */
937*4882a593Smuzhiyun ret = 0;
938*4882a593Smuzhiyun break;
939*4882a593Smuzhiyun case 0xe: /* ITE8872 (2S1P) */
940*4882a593Smuzhiyun ret = 2;
941*4882a593Smuzhiyun break;
942*4882a593Smuzhiyun case 0x6: /* ITE8873 (1S) */
943*4882a593Smuzhiyun ret = 1;
944*4882a593Smuzhiyun break;
945*4882a593Smuzhiyun case 0x8: /* ITE8874 (2S) */
946*4882a593Smuzhiyun ret = 2;
947*4882a593Smuzhiyun break;
948*4882a593Smuzhiyun default:
949*4882a593Smuzhiyun moan_device("Unknown ITE887x", dev);
950*4882a593Smuzhiyun ret = -ENODEV;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun /* configure all serial ports */
954*4882a593Smuzhiyun for (i = 0; i < ret; i++) {
955*4882a593Smuzhiyun /* read the I/O port from the device */
956*4882a593Smuzhiyun pci_read_config_dword(dev, ITE_887x_PS0BAR + (0x4 * (i + 1)),
957*4882a593Smuzhiyun &ioport);
958*4882a593Smuzhiyun ioport &= 0x0000FF00; /* the actual base address */
959*4882a593Smuzhiyun pci_write_config_dword(dev, ITE_887x_POSIO0 + (0x4 * (i + 1)),
960*4882a593Smuzhiyun ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
961*4882a593Smuzhiyun ITE_887x_POSIO_IOSIZE_8 | ioport);
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun /* write the ioport to the UARTBAR */
964*4882a593Smuzhiyun pci_read_config_dword(dev, ITE_887x_UARTBAR, &uartbar);
965*4882a593Smuzhiyun uartbar &= ~(0xffff << (16 * i)); /* clear half the reg */
966*4882a593Smuzhiyun uartbar |= (ioport << (16 * i)); /* set the ioport */
967*4882a593Smuzhiyun pci_write_config_dword(dev, ITE_887x_UARTBAR, uartbar);
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun /* get current config */
970*4882a593Smuzhiyun pci_read_config_dword(dev, ITE_887x_MISCR, &miscr);
971*4882a593Smuzhiyun /* disable interrupts (UARTx_Routing[3:0]) */
972*4882a593Smuzhiyun miscr &= ~(0xf << (12 - 4 * i));
973*4882a593Smuzhiyun /* activate the UART (UARTx_En) */
974*4882a593Smuzhiyun miscr |= 1 << (23 - i);
975*4882a593Smuzhiyun /* write new config with activated UART */
976*4882a593Smuzhiyun pci_write_config_dword(dev, ITE_887x_MISCR, miscr);
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun if (ret <= 0) {
980*4882a593Smuzhiyun /* the device has no UARTs if we get here */
981*4882a593Smuzhiyun release_region(iobase->start, ITE_887x_IOSIZE);
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun return ret;
985*4882a593Smuzhiyun }
986*4882a593Smuzhiyun
pci_ite887x_exit(struct pci_dev * dev)987*4882a593Smuzhiyun static void pci_ite887x_exit(struct pci_dev *dev)
988*4882a593Smuzhiyun {
989*4882a593Smuzhiyun u32 ioport;
990*4882a593Smuzhiyun /* the ioport is bit 0-15 in POSIO0R */
991*4882a593Smuzhiyun pci_read_config_dword(dev, ITE_887x_POSIO0, &ioport);
992*4882a593Smuzhiyun ioport &= 0xffff;
993*4882a593Smuzhiyun release_region(ioport, ITE_887x_IOSIZE);
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun /*
997*4882a593Smuzhiyun * Oxford Semiconductor Inc.
998*4882a593Smuzhiyun * Check if an OxSemi device is part of the Tornado range of devices.
999*4882a593Smuzhiyun */
1000*4882a593Smuzhiyun #define PCI_VENDOR_ID_ENDRUN 0x7401
1001*4882a593Smuzhiyun #define PCI_DEVICE_ID_ENDRUN_1588 0xe100
1002*4882a593Smuzhiyun
pci_oxsemi_tornado_p(struct pci_dev * dev)1003*4882a593Smuzhiyun static bool pci_oxsemi_tornado_p(struct pci_dev *dev)
1004*4882a593Smuzhiyun {
1005*4882a593Smuzhiyun /* OxSemi Tornado devices are all 0xCxxx */
1006*4882a593Smuzhiyun if (dev->vendor == PCI_VENDOR_ID_OXSEMI &&
1007*4882a593Smuzhiyun (dev->device & 0xf000) != 0xc000)
1008*4882a593Smuzhiyun return false;
1009*4882a593Smuzhiyun
1010*4882a593Smuzhiyun /* EndRun devices are all 0xExxx */
1011*4882a593Smuzhiyun if (dev->vendor == PCI_VENDOR_ID_ENDRUN &&
1012*4882a593Smuzhiyun (dev->device & 0xf000) != 0xe000)
1013*4882a593Smuzhiyun return false;
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun return true;
1016*4882a593Smuzhiyun }
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun /*
1019*4882a593Smuzhiyun * Determine the number of ports available on a Tornado device.
1020*4882a593Smuzhiyun */
pci_oxsemi_tornado_init(struct pci_dev * dev)1021*4882a593Smuzhiyun static int pci_oxsemi_tornado_init(struct pci_dev *dev)
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun u8 __iomem *p;
1024*4882a593Smuzhiyun unsigned long deviceID;
1025*4882a593Smuzhiyun unsigned int number_uarts = 0;
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun if (!pci_oxsemi_tornado_p(dev))
1028*4882a593Smuzhiyun return 0;
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun p = pci_iomap(dev, 0, 5);
1031*4882a593Smuzhiyun if (p == NULL)
1032*4882a593Smuzhiyun return -ENOMEM;
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun deviceID = ioread32(p);
1035*4882a593Smuzhiyun /* Tornado device */
1036*4882a593Smuzhiyun if (deviceID == 0x07000200) {
1037*4882a593Smuzhiyun number_uarts = ioread8(p + 4);
1038*4882a593Smuzhiyun pci_dbg(dev, "%d ports detected on %s PCI Express device\n",
1039*4882a593Smuzhiyun number_uarts,
1040*4882a593Smuzhiyun dev->vendor == PCI_VENDOR_ID_ENDRUN ?
1041*4882a593Smuzhiyun "EndRun" : "Oxford");
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun pci_iounmap(dev, p);
1044*4882a593Smuzhiyun return number_uarts;
1045*4882a593Smuzhiyun }
1046*4882a593Smuzhiyun
pci_asix_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1047*4882a593Smuzhiyun static int pci_asix_setup(struct serial_private *priv,
1048*4882a593Smuzhiyun const struct pciserial_board *board,
1049*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1050*4882a593Smuzhiyun {
1051*4882a593Smuzhiyun port->bugs |= UART_BUG_PARITY;
1052*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1053*4882a593Smuzhiyun }
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun /* Quatech devices have their own extra interface features */
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun struct quatech_feature {
1058*4882a593Smuzhiyun u16 devid;
1059*4882a593Smuzhiyun bool amcc;
1060*4882a593Smuzhiyun };
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun #define QPCR_TEST_FOR1 0x3F
1063*4882a593Smuzhiyun #define QPCR_TEST_GET1 0x00
1064*4882a593Smuzhiyun #define QPCR_TEST_FOR2 0x40
1065*4882a593Smuzhiyun #define QPCR_TEST_GET2 0x40
1066*4882a593Smuzhiyun #define QPCR_TEST_FOR3 0x80
1067*4882a593Smuzhiyun #define QPCR_TEST_GET3 0x40
1068*4882a593Smuzhiyun #define QPCR_TEST_FOR4 0xC0
1069*4882a593Smuzhiyun #define QPCR_TEST_GET4 0x80
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun #define QOPR_CLOCK_X1 0x0000
1072*4882a593Smuzhiyun #define QOPR_CLOCK_X2 0x0001
1073*4882a593Smuzhiyun #define QOPR_CLOCK_X4 0x0002
1074*4882a593Smuzhiyun #define QOPR_CLOCK_X8 0x0003
1075*4882a593Smuzhiyun #define QOPR_CLOCK_RATE_MASK 0x0003
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun static struct quatech_feature quatech_cards[] = {
1079*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_QSC100, 1 },
1080*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSC100, 1 },
1081*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSC100E, 0 },
1082*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSC200, 1 },
1083*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSC200E, 0 },
1084*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_ESC100D, 1 },
1085*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_ESC100M, 1 },
1086*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_QSCP100, 1 },
1087*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSCP100, 1 },
1088*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_QSCP200, 1 },
1089*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSCP200, 1 },
1090*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_ESCLP100, 0 },
1091*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_QSCLP100, 0 },
1092*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSCLP100, 0 },
1093*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_SSCLP100, 0 },
1094*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_QSCLP200, 0 },
1095*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_DSCLP200, 0 },
1096*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_SSCLP200, 0 },
1097*4882a593Smuzhiyun { PCI_DEVICE_ID_QUATECH_SPPXP_100, 0 },
1098*4882a593Smuzhiyun { 0, }
1099*4882a593Smuzhiyun };
1100*4882a593Smuzhiyun
pci_quatech_amcc(struct pci_dev * dev)1101*4882a593Smuzhiyun static int pci_quatech_amcc(struct pci_dev *dev)
1102*4882a593Smuzhiyun {
1103*4882a593Smuzhiyun struct quatech_feature *qf = &quatech_cards[0];
1104*4882a593Smuzhiyun while (qf->devid) {
1105*4882a593Smuzhiyun if (qf->devid == dev->device)
1106*4882a593Smuzhiyun return qf->amcc;
1107*4882a593Smuzhiyun qf++;
1108*4882a593Smuzhiyun }
1109*4882a593Smuzhiyun pci_err(dev, "unknown port type '0x%04X'.\n", dev->device);
1110*4882a593Smuzhiyun return 0;
1111*4882a593Smuzhiyun };
1112*4882a593Smuzhiyun
pci_quatech_rqopr(struct uart_8250_port * port)1113*4882a593Smuzhiyun static int pci_quatech_rqopr(struct uart_8250_port *port)
1114*4882a593Smuzhiyun {
1115*4882a593Smuzhiyun unsigned long base = port->port.iobase;
1116*4882a593Smuzhiyun u8 LCR, val;
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun LCR = inb(base + UART_LCR);
1119*4882a593Smuzhiyun outb(0xBF, base + UART_LCR);
1120*4882a593Smuzhiyun val = inb(base + UART_SCR);
1121*4882a593Smuzhiyun outb(LCR, base + UART_LCR);
1122*4882a593Smuzhiyun return val;
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun
pci_quatech_wqopr(struct uart_8250_port * port,u8 qopr)1125*4882a593Smuzhiyun static void pci_quatech_wqopr(struct uart_8250_port *port, u8 qopr)
1126*4882a593Smuzhiyun {
1127*4882a593Smuzhiyun unsigned long base = port->port.iobase;
1128*4882a593Smuzhiyun u8 LCR;
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun LCR = inb(base + UART_LCR);
1131*4882a593Smuzhiyun outb(0xBF, base + UART_LCR);
1132*4882a593Smuzhiyun inb(base + UART_SCR);
1133*4882a593Smuzhiyun outb(qopr, base + UART_SCR);
1134*4882a593Smuzhiyun outb(LCR, base + UART_LCR);
1135*4882a593Smuzhiyun }
1136*4882a593Smuzhiyun
pci_quatech_rqmcr(struct uart_8250_port * port)1137*4882a593Smuzhiyun static int pci_quatech_rqmcr(struct uart_8250_port *port)
1138*4882a593Smuzhiyun {
1139*4882a593Smuzhiyun unsigned long base = port->port.iobase;
1140*4882a593Smuzhiyun u8 LCR, val, qmcr;
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun LCR = inb(base + UART_LCR);
1143*4882a593Smuzhiyun outb(0xBF, base + UART_LCR);
1144*4882a593Smuzhiyun val = inb(base + UART_SCR);
1145*4882a593Smuzhiyun outb(val | 0x10, base + UART_SCR);
1146*4882a593Smuzhiyun qmcr = inb(base + UART_MCR);
1147*4882a593Smuzhiyun outb(val, base + UART_SCR);
1148*4882a593Smuzhiyun outb(LCR, base + UART_LCR);
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun return qmcr;
1151*4882a593Smuzhiyun }
1152*4882a593Smuzhiyun
pci_quatech_wqmcr(struct uart_8250_port * port,u8 qmcr)1153*4882a593Smuzhiyun static void pci_quatech_wqmcr(struct uart_8250_port *port, u8 qmcr)
1154*4882a593Smuzhiyun {
1155*4882a593Smuzhiyun unsigned long base = port->port.iobase;
1156*4882a593Smuzhiyun u8 LCR, val;
1157*4882a593Smuzhiyun
1158*4882a593Smuzhiyun LCR = inb(base + UART_LCR);
1159*4882a593Smuzhiyun outb(0xBF, base + UART_LCR);
1160*4882a593Smuzhiyun val = inb(base + UART_SCR);
1161*4882a593Smuzhiyun outb(val | 0x10, base + UART_SCR);
1162*4882a593Smuzhiyun outb(qmcr, base + UART_MCR);
1163*4882a593Smuzhiyun outb(val, base + UART_SCR);
1164*4882a593Smuzhiyun outb(LCR, base + UART_LCR);
1165*4882a593Smuzhiyun }
1166*4882a593Smuzhiyun
pci_quatech_has_qmcr(struct uart_8250_port * port)1167*4882a593Smuzhiyun static int pci_quatech_has_qmcr(struct uart_8250_port *port)
1168*4882a593Smuzhiyun {
1169*4882a593Smuzhiyun unsigned long base = port->port.iobase;
1170*4882a593Smuzhiyun u8 LCR, val;
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun LCR = inb(base + UART_LCR);
1173*4882a593Smuzhiyun outb(0xBF, base + UART_LCR);
1174*4882a593Smuzhiyun val = inb(base + UART_SCR);
1175*4882a593Smuzhiyun if (val & 0x20) {
1176*4882a593Smuzhiyun outb(0x80, UART_LCR);
1177*4882a593Smuzhiyun if (!(inb(UART_SCR) & 0x20)) {
1178*4882a593Smuzhiyun outb(LCR, base + UART_LCR);
1179*4882a593Smuzhiyun return 1;
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun return 0;
1183*4882a593Smuzhiyun }
1184*4882a593Smuzhiyun
pci_quatech_test(struct uart_8250_port * port)1185*4882a593Smuzhiyun static int pci_quatech_test(struct uart_8250_port *port)
1186*4882a593Smuzhiyun {
1187*4882a593Smuzhiyun u8 reg, qopr;
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun qopr = pci_quatech_rqopr(port);
1190*4882a593Smuzhiyun pci_quatech_wqopr(port, qopr & QPCR_TEST_FOR1);
1191*4882a593Smuzhiyun reg = pci_quatech_rqopr(port) & 0xC0;
1192*4882a593Smuzhiyun if (reg != QPCR_TEST_GET1)
1193*4882a593Smuzhiyun return -EINVAL;
1194*4882a593Smuzhiyun pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR2);
1195*4882a593Smuzhiyun reg = pci_quatech_rqopr(port) & 0xC0;
1196*4882a593Smuzhiyun if (reg != QPCR_TEST_GET2)
1197*4882a593Smuzhiyun return -EINVAL;
1198*4882a593Smuzhiyun pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR3);
1199*4882a593Smuzhiyun reg = pci_quatech_rqopr(port) & 0xC0;
1200*4882a593Smuzhiyun if (reg != QPCR_TEST_GET3)
1201*4882a593Smuzhiyun return -EINVAL;
1202*4882a593Smuzhiyun pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR4);
1203*4882a593Smuzhiyun reg = pci_quatech_rqopr(port) & 0xC0;
1204*4882a593Smuzhiyun if (reg != QPCR_TEST_GET4)
1205*4882a593Smuzhiyun return -EINVAL;
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun pci_quatech_wqopr(port, qopr);
1208*4882a593Smuzhiyun return 0;
1209*4882a593Smuzhiyun }
1210*4882a593Smuzhiyun
pci_quatech_clock(struct uart_8250_port * port)1211*4882a593Smuzhiyun static int pci_quatech_clock(struct uart_8250_port *port)
1212*4882a593Smuzhiyun {
1213*4882a593Smuzhiyun u8 qopr, reg, set;
1214*4882a593Smuzhiyun unsigned long clock;
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun if (pci_quatech_test(port) < 0)
1217*4882a593Smuzhiyun return 1843200;
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun qopr = pci_quatech_rqopr(port);
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun pci_quatech_wqopr(port, qopr & ~QOPR_CLOCK_X8);
1222*4882a593Smuzhiyun reg = pci_quatech_rqopr(port);
1223*4882a593Smuzhiyun if (reg & QOPR_CLOCK_X8) {
1224*4882a593Smuzhiyun clock = 1843200;
1225*4882a593Smuzhiyun goto out;
1226*4882a593Smuzhiyun }
1227*4882a593Smuzhiyun pci_quatech_wqopr(port, qopr | QOPR_CLOCK_X8);
1228*4882a593Smuzhiyun reg = pci_quatech_rqopr(port);
1229*4882a593Smuzhiyun if (!(reg & QOPR_CLOCK_X8)) {
1230*4882a593Smuzhiyun clock = 1843200;
1231*4882a593Smuzhiyun goto out;
1232*4882a593Smuzhiyun }
1233*4882a593Smuzhiyun reg &= QOPR_CLOCK_X8;
1234*4882a593Smuzhiyun if (reg == QOPR_CLOCK_X2) {
1235*4882a593Smuzhiyun clock = 3685400;
1236*4882a593Smuzhiyun set = QOPR_CLOCK_X2;
1237*4882a593Smuzhiyun } else if (reg == QOPR_CLOCK_X4) {
1238*4882a593Smuzhiyun clock = 7372800;
1239*4882a593Smuzhiyun set = QOPR_CLOCK_X4;
1240*4882a593Smuzhiyun } else if (reg == QOPR_CLOCK_X8) {
1241*4882a593Smuzhiyun clock = 14745600;
1242*4882a593Smuzhiyun set = QOPR_CLOCK_X8;
1243*4882a593Smuzhiyun } else {
1244*4882a593Smuzhiyun clock = 1843200;
1245*4882a593Smuzhiyun set = QOPR_CLOCK_X1;
1246*4882a593Smuzhiyun }
1247*4882a593Smuzhiyun qopr &= ~QOPR_CLOCK_RATE_MASK;
1248*4882a593Smuzhiyun qopr |= set;
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun out:
1251*4882a593Smuzhiyun pci_quatech_wqopr(port, qopr);
1252*4882a593Smuzhiyun return clock;
1253*4882a593Smuzhiyun }
1254*4882a593Smuzhiyun
pci_quatech_rs422(struct uart_8250_port * port)1255*4882a593Smuzhiyun static int pci_quatech_rs422(struct uart_8250_port *port)
1256*4882a593Smuzhiyun {
1257*4882a593Smuzhiyun u8 qmcr;
1258*4882a593Smuzhiyun int rs422 = 0;
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun if (!pci_quatech_has_qmcr(port))
1261*4882a593Smuzhiyun return 0;
1262*4882a593Smuzhiyun qmcr = pci_quatech_rqmcr(port);
1263*4882a593Smuzhiyun pci_quatech_wqmcr(port, 0xFF);
1264*4882a593Smuzhiyun if (pci_quatech_rqmcr(port))
1265*4882a593Smuzhiyun rs422 = 1;
1266*4882a593Smuzhiyun pci_quatech_wqmcr(port, qmcr);
1267*4882a593Smuzhiyun return rs422;
1268*4882a593Smuzhiyun }
1269*4882a593Smuzhiyun
pci_quatech_init(struct pci_dev * dev)1270*4882a593Smuzhiyun static int pci_quatech_init(struct pci_dev *dev)
1271*4882a593Smuzhiyun {
1272*4882a593Smuzhiyun if (pci_quatech_amcc(dev)) {
1273*4882a593Smuzhiyun unsigned long base = pci_resource_start(dev, 0);
1274*4882a593Smuzhiyun if (base) {
1275*4882a593Smuzhiyun u32 tmp;
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun outl(inl(base + 0x38) | 0x00002000, base + 0x38);
1278*4882a593Smuzhiyun tmp = inl(base + 0x3c);
1279*4882a593Smuzhiyun outl(tmp | 0x01000000, base + 0x3c);
1280*4882a593Smuzhiyun outl(tmp &= ~0x01000000, base + 0x3c);
1281*4882a593Smuzhiyun }
1282*4882a593Smuzhiyun }
1283*4882a593Smuzhiyun return 0;
1284*4882a593Smuzhiyun }
1285*4882a593Smuzhiyun
pci_quatech_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1286*4882a593Smuzhiyun static int pci_quatech_setup(struct serial_private *priv,
1287*4882a593Smuzhiyun const struct pciserial_board *board,
1288*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1289*4882a593Smuzhiyun {
1290*4882a593Smuzhiyun /* Needed by pci_quatech calls below */
1291*4882a593Smuzhiyun port->port.iobase = pci_resource_start(priv->dev, FL_GET_BASE(board->flags));
1292*4882a593Smuzhiyun /* Set up the clocking */
1293*4882a593Smuzhiyun port->port.uartclk = pci_quatech_clock(port);
1294*4882a593Smuzhiyun /* For now just warn about RS422 */
1295*4882a593Smuzhiyun if (pci_quatech_rs422(port))
1296*4882a593Smuzhiyun pci_warn(priv->dev, "software control of RS422 features not currently supported.\n");
1297*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1298*4882a593Smuzhiyun }
1299*4882a593Smuzhiyun
pci_quatech_exit(struct pci_dev * dev)1300*4882a593Smuzhiyun static void pci_quatech_exit(struct pci_dev *dev)
1301*4882a593Smuzhiyun {
1302*4882a593Smuzhiyun }
1303*4882a593Smuzhiyun
pci_default_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1304*4882a593Smuzhiyun static int pci_default_setup(struct serial_private *priv,
1305*4882a593Smuzhiyun const struct pciserial_board *board,
1306*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1307*4882a593Smuzhiyun {
1308*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset, maxnr;
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
1311*4882a593Smuzhiyun if (board->flags & FL_BASE_BARS)
1312*4882a593Smuzhiyun bar += idx;
1313*4882a593Smuzhiyun else
1314*4882a593Smuzhiyun offset += idx * board->uart_offset;
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1317*4882a593Smuzhiyun (board->reg_shift + 3);
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1320*4882a593Smuzhiyun return 1;
1321*4882a593Smuzhiyun
1322*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun static void
pericom_do_set_divisor(struct uart_port * port,unsigned int baud,unsigned int quot,unsigned int quot_frac)1325*4882a593Smuzhiyun pericom_do_set_divisor(struct uart_port *port, unsigned int baud,
1326*4882a593Smuzhiyun unsigned int quot, unsigned int quot_frac)
1327*4882a593Smuzhiyun {
1328*4882a593Smuzhiyun int scr;
1329*4882a593Smuzhiyun int lcr;
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun for (scr = 16; scr > 4; scr--) {
1332*4882a593Smuzhiyun unsigned int maxrate = port->uartclk / scr;
1333*4882a593Smuzhiyun unsigned int divisor = max(maxrate / baud, 1U);
1334*4882a593Smuzhiyun int delta = maxrate / divisor - baud;
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun if (baud > maxrate + baud / 50)
1337*4882a593Smuzhiyun continue;
1338*4882a593Smuzhiyun
1339*4882a593Smuzhiyun if (delta > baud / 50)
1340*4882a593Smuzhiyun divisor++;
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun if (divisor > 0xffff)
1343*4882a593Smuzhiyun continue;
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun /* Update delta due to possible divisor change */
1346*4882a593Smuzhiyun delta = maxrate / divisor - baud;
1347*4882a593Smuzhiyun if (abs(delta) < baud / 50) {
1348*4882a593Smuzhiyun lcr = serial_port_in(port, UART_LCR);
1349*4882a593Smuzhiyun serial_port_out(port, UART_LCR, lcr | 0x80);
1350*4882a593Smuzhiyun serial_port_out(port, UART_DLL, divisor & 0xff);
1351*4882a593Smuzhiyun serial_port_out(port, UART_DLM, divisor >> 8 & 0xff);
1352*4882a593Smuzhiyun serial_port_out(port, 2, 16 - scr);
1353*4882a593Smuzhiyun serial_port_out(port, UART_LCR, lcr);
1354*4882a593Smuzhiyun return;
1355*4882a593Smuzhiyun }
1356*4882a593Smuzhiyun }
1357*4882a593Smuzhiyun }
pci_pericom_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1358*4882a593Smuzhiyun static int pci_pericom_setup(struct serial_private *priv,
1359*4882a593Smuzhiyun const struct pciserial_board *board,
1360*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1361*4882a593Smuzhiyun {
1362*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset, maxnr;
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
1365*4882a593Smuzhiyun if (board->flags & FL_BASE_BARS)
1366*4882a593Smuzhiyun bar += idx;
1367*4882a593Smuzhiyun else
1368*4882a593Smuzhiyun offset += idx * board->uart_offset;
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun
1371*4882a593Smuzhiyun maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1372*4882a593Smuzhiyun (board->reg_shift + 3);
1373*4882a593Smuzhiyun
1374*4882a593Smuzhiyun if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1375*4882a593Smuzhiyun return 1;
1376*4882a593Smuzhiyun
1377*4882a593Smuzhiyun port->port.set_divisor = pericom_do_set_divisor;
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
1380*4882a593Smuzhiyun }
1381*4882a593Smuzhiyun
pci_pericom_setup_four_at_eight(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1382*4882a593Smuzhiyun static int pci_pericom_setup_four_at_eight(struct serial_private *priv,
1383*4882a593Smuzhiyun const struct pciserial_board *board,
1384*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1385*4882a593Smuzhiyun {
1386*4882a593Smuzhiyun unsigned int bar, offset = board->first_offset, maxnr;
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun bar = FL_GET_BASE(board->flags);
1389*4882a593Smuzhiyun if (board->flags & FL_BASE_BARS)
1390*4882a593Smuzhiyun bar += idx;
1391*4882a593Smuzhiyun else
1392*4882a593Smuzhiyun offset += idx * board->uart_offset;
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun if (idx==3)
1395*4882a593Smuzhiyun offset = 0x38;
1396*4882a593Smuzhiyun
1397*4882a593Smuzhiyun maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1398*4882a593Smuzhiyun (board->reg_shift + 3);
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1401*4882a593Smuzhiyun return 1;
1402*4882a593Smuzhiyun
1403*4882a593Smuzhiyun port->port.set_divisor = pericom_do_set_divisor;
1404*4882a593Smuzhiyun
1405*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, board->reg_shift);
1406*4882a593Smuzhiyun }
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun static int
ce4100_serial_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1409*4882a593Smuzhiyun ce4100_serial_setup(struct serial_private *priv,
1410*4882a593Smuzhiyun const struct pciserial_board *board,
1411*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1412*4882a593Smuzhiyun {
1413*4882a593Smuzhiyun int ret;
1414*4882a593Smuzhiyun
1415*4882a593Smuzhiyun ret = setup_port(priv, port, idx, 0, board->reg_shift);
1416*4882a593Smuzhiyun port->port.iotype = UPIO_MEM32;
1417*4882a593Smuzhiyun port->port.type = PORT_XSCALE;
1418*4882a593Smuzhiyun port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
1419*4882a593Smuzhiyun port->port.regshift = 2;
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun return ret;
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun static int
pci_omegapci_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1425*4882a593Smuzhiyun pci_omegapci_setup(struct serial_private *priv,
1426*4882a593Smuzhiyun const struct pciserial_board *board,
1427*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1428*4882a593Smuzhiyun {
1429*4882a593Smuzhiyun return setup_port(priv, port, 2, idx * 8, 0);
1430*4882a593Smuzhiyun }
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun static int
pci_brcm_trumanage_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1433*4882a593Smuzhiyun pci_brcm_trumanage_setup(struct serial_private *priv,
1434*4882a593Smuzhiyun const struct pciserial_board *board,
1435*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1436*4882a593Smuzhiyun {
1437*4882a593Smuzhiyun int ret = pci_default_setup(priv, board, port, idx);
1438*4882a593Smuzhiyun
1439*4882a593Smuzhiyun port->port.type = PORT_BRCM_TRUMANAGE;
1440*4882a593Smuzhiyun port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
1441*4882a593Smuzhiyun return ret;
1442*4882a593Smuzhiyun }
1443*4882a593Smuzhiyun
1444*4882a593Smuzhiyun /* RTS will control by MCR if this bit is 0 */
1445*4882a593Smuzhiyun #define FINTEK_RTS_CONTROL_BY_HW BIT(4)
1446*4882a593Smuzhiyun /* only worked with FINTEK_RTS_CONTROL_BY_HW on */
1447*4882a593Smuzhiyun #define FINTEK_RTS_INVERT BIT(5)
1448*4882a593Smuzhiyun
1449*4882a593Smuzhiyun /* We should do proper H/W transceiver setting before change to RS485 mode */
pci_fintek_rs485_config(struct uart_port * port,struct serial_rs485 * rs485)1450*4882a593Smuzhiyun static int pci_fintek_rs485_config(struct uart_port *port,
1451*4882a593Smuzhiyun struct serial_rs485 *rs485)
1452*4882a593Smuzhiyun {
1453*4882a593Smuzhiyun struct pci_dev *pci_dev = to_pci_dev(port->dev);
1454*4882a593Smuzhiyun u8 setting;
1455*4882a593Smuzhiyun u8 *index = (u8 *) port->private_data;
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun pci_read_config_byte(pci_dev, 0x40 + 8 * *index + 7, &setting);
1458*4882a593Smuzhiyun
1459*4882a593Smuzhiyun if (!rs485)
1460*4882a593Smuzhiyun rs485 = &port->rs485;
1461*4882a593Smuzhiyun else if (rs485->flags & SER_RS485_ENABLED)
1462*4882a593Smuzhiyun memset(rs485->padding, 0, sizeof(rs485->padding));
1463*4882a593Smuzhiyun else
1464*4882a593Smuzhiyun memset(rs485, 0, sizeof(*rs485));
1465*4882a593Smuzhiyun
1466*4882a593Smuzhiyun /* F81504/508/512 not support RTS delay before or after send */
1467*4882a593Smuzhiyun rs485->flags &= SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND;
1468*4882a593Smuzhiyun
1469*4882a593Smuzhiyun if (rs485->flags & SER_RS485_ENABLED) {
1470*4882a593Smuzhiyun /* Enable RTS H/W control mode */
1471*4882a593Smuzhiyun setting |= FINTEK_RTS_CONTROL_BY_HW;
1472*4882a593Smuzhiyun
1473*4882a593Smuzhiyun if (rs485->flags & SER_RS485_RTS_ON_SEND) {
1474*4882a593Smuzhiyun /* RTS driving high on TX */
1475*4882a593Smuzhiyun setting &= ~FINTEK_RTS_INVERT;
1476*4882a593Smuzhiyun } else {
1477*4882a593Smuzhiyun /* RTS driving low on TX */
1478*4882a593Smuzhiyun setting |= FINTEK_RTS_INVERT;
1479*4882a593Smuzhiyun }
1480*4882a593Smuzhiyun
1481*4882a593Smuzhiyun rs485->delay_rts_after_send = 0;
1482*4882a593Smuzhiyun rs485->delay_rts_before_send = 0;
1483*4882a593Smuzhiyun } else {
1484*4882a593Smuzhiyun /* Disable RTS H/W control mode */
1485*4882a593Smuzhiyun setting &= ~(FINTEK_RTS_CONTROL_BY_HW | FINTEK_RTS_INVERT);
1486*4882a593Smuzhiyun }
1487*4882a593Smuzhiyun
1488*4882a593Smuzhiyun pci_write_config_byte(pci_dev, 0x40 + 8 * *index + 7, setting);
1489*4882a593Smuzhiyun
1490*4882a593Smuzhiyun if (rs485 != &port->rs485)
1491*4882a593Smuzhiyun port->rs485 = *rs485;
1492*4882a593Smuzhiyun
1493*4882a593Smuzhiyun return 0;
1494*4882a593Smuzhiyun }
1495*4882a593Smuzhiyun
pci_fintek_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1496*4882a593Smuzhiyun static int pci_fintek_setup(struct serial_private *priv,
1497*4882a593Smuzhiyun const struct pciserial_board *board,
1498*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1499*4882a593Smuzhiyun {
1500*4882a593Smuzhiyun struct pci_dev *pdev = priv->dev;
1501*4882a593Smuzhiyun u8 *data;
1502*4882a593Smuzhiyun u8 config_base;
1503*4882a593Smuzhiyun u16 iobase;
1504*4882a593Smuzhiyun
1505*4882a593Smuzhiyun config_base = 0x40 + 0x08 * idx;
1506*4882a593Smuzhiyun
1507*4882a593Smuzhiyun /* Get the io address from configuration space */
1508*4882a593Smuzhiyun pci_read_config_word(pdev, config_base + 4, &iobase);
1509*4882a593Smuzhiyun
1510*4882a593Smuzhiyun pci_dbg(pdev, "idx=%d iobase=0x%x", idx, iobase);
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun port->port.iotype = UPIO_PORT;
1513*4882a593Smuzhiyun port->port.iobase = iobase;
1514*4882a593Smuzhiyun port->port.rs485_config = pci_fintek_rs485_config;
1515*4882a593Smuzhiyun
1516*4882a593Smuzhiyun data = devm_kzalloc(&pdev->dev, sizeof(u8), GFP_KERNEL);
1517*4882a593Smuzhiyun if (!data)
1518*4882a593Smuzhiyun return -ENOMEM;
1519*4882a593Smuzhiyun
1520*4882a593Smuzhiyun /* preserve index in PCI configuration space */
1521*4882a593Smuzhiyun *data = idx;
1522*4882a593Smuzhiyun port->port.private_data = data;
1523*4882a593Smuzhiyun
1524*4882a593Smuzhiyun return 0;
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun
pci_fintek_init(struct pci_dev * dev)1527*4882a593Smuzhiyun static int pci_fintek_init(struct pci_dev *dev)
1528*4882a593Smuzhiyun {
1529*4882a593Smuzhiyun unsigned long iobase;
1530*4882a593Smuzhiyun u32 max_port, i;
1531*4882a593Smuzhiyun resource_size_t bar_data[3];
1532*4882a593Smuzhiyun u8 config_base;
1533*4882a593Smuzhiyun struct serial_private *priv = pci_get_drvdata(dev);
1534*4882a593Smuzhiyun
1535*4882a593Smuzhiyun if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
1536*4882a593Smuzhiyun !(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
1537*4882a593Smuzhiyun !(pci_resource_flags(dev, 3) & IORESOURCE_IO))
1538*4882a593Smuzhiyun return -ENODEV;
1539*4882a593Smuzhiyun
1540*4882a593Smuzhiyun switch (dev->device) {
1541*4882a593Smuzhiyun case 0x1104: /* 4 ports */
1542*4882a593Smuzhiyun case 0x1108: /* 8 ports */
1543*4882a593Smuzhiyun max_port = dev->device & 0xff;
1544*4882a593Smuzhiyun break;
1545*4882a593Smuzhiyun case 0x1112: /* 12 ports */
1546*4882a593Smuzhiyun max_port = 12;
1547*4882a593Smuzhiyun break;
1548*4882a593Smuzhiyun default:
1549*4882a593Smuzhiyun return -EINVAL;
1550*4882a593Smuzhiyun }
1551*4882a593Smuzhiyun
1552*4882a593Smuzhiyun /* Get the io address dispatch from the BIOS */
1553*4882a593Smuzhiyun bar_data[0] = pci_resource_start(dev, 5);
1554*4882a593Smuzhiyun bar_data[1] = pci_resource_start(dev, 4);
1555*4882a593Smuzhiyun bar_data[2] = pci_resource_start(dev, 3);
1556*4882a593Smuzhiyun
1557*4882a593Smuzhiyun for (i = 0; i < max_port; ++i) {
1558*4882a593Smuzhiyun /* UART0 configuration offset start from 0x40 */
1559*4882a593Smuzhiyun config_base = 0x40 + 0x08 * i;
1560*4882a593Smuzhiyun
1561*4882a593Smuzhiyun /* Calculate Real IO Port */
1562*4882a593Smuzhiyun iobase = (bar_data[i / 4] & 0xffffffe0) + (i % 4) * 8;
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun /* Enable UART I/O port */
1565*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x00, 0x01);
1566*4882a593Smuzhiyun
1567*4882a593Smuzhiyun /* Select 128-byte FIFO and 8x FIFO threshold */
1568*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x01, 0x33);
1569*4882a593Smuzhiyun
1570*4882a593Smuzhiyun /* LSB UART */
1571*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x04,
1572*4882a593Smuzhiyun (u8)(iobase & 0xff));
1573*4882a593Smuzhiyun
1574*4882a593Smuzhiyun /* MSB UART */
1575*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x05,
1576*4882a593Smuzhiyun (u8)((iobase & 0xff00) >> 8));
1577*4882a593Smuzhiyun
1578*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x06, dev->irq);
1579*4882a593Smuzhiyun
1580*4882a593Smuzhiyun if (!priv) {
1581*4882a593Smuzhiyun /* First init without port data
1582*4882a593Smuzhiyun * force init to RS232 Mode
1583*4882a593Smuzhiyun */
1584*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x07, 0x01);
1585*4882a593Smuzhiyun }
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun
1588*4882a593Smuzhiyun return max_port;
1589*4882a593Smuzhiyun }
1590*4882a593Smuzhiyun
f815xxa_mem_serial_out(struct uart_port * p,int offset,int value)1591*4882a593Smuzhiyun static void f815xxa_mem_serial_out(struct uart_port *p, int offset, int value)
1592*4882a593Smuzhiyun {
1593*4882a593Smuzhiyun struct f815xxa_data *data = p->private_data;
1594*4882a593Smuzhiyun unsigned long flags;
1595*4882a593Smuzhiyun
1596*4882a593Smuzhiyun spin_lock_irqsave(&data->lock, flags);
1597*4882a593Smuzhiyun writeb(value, p->membase + offset);
1598*4882a593Smuzhiyun readb(p->membase + UART_SCR); /* Dummy read for flush pcie tx queue */
1599*4882a593Smuzhiyun spin_unlock_irqrestore(&data->lock, flags);
1600*4882a593Smuzhiyun }
1601*4882a593Smuzhiyun
pci_fintek_f815xxa_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1602*4882a593Smuzhiyun static int pci_fintek_f815xxa_setup(struct serial_private *priv,
1603*4882a593Smuzhiyun const struct pciserial_board *board,
1604*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1605*4882a593Smuzhiyun {
1606*4882a593Smuzhiyun struct pci_dev *pdev = priv->dev;
1607*4882a593Smuzhiyun struct f815xxa_data *data;
1608*4882a593Smuzhiyun
1609*4882a593Smuzhiyun data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
1610*4882a593Smuzhiyun if (!data)
1611*4882a593Smuzhiyun return -ENOMEM;
1612*4882a593Smuzhiyun
1613*4882a593Smuzhiyun data->idx = idx;
1614*4882a593Smuzhiyun spin_lock_init(&data->lock);
1615*4882a593Smuzhiyun
1616*4882a593Smuzhiyun port->port.private_data = data;
1617*4882a593Smuzhiyun port->port.iotype = UPIO_MEM;
1618*4882a593Smuzhiyun port->port.flags |= UPF_IOREMAP;
1619*4882a593Smuzhiyun port->port.mapbase = pci_resource_start(pdev, 0) + 8 * idx;
1620*4882a593Smuzhiyun port->port.serial_out = f815xxa_mem_serial_out;
1621*4882a593Smuzhiyun
1622*4882a593Smuzhiyun return 0;
1623*4882a593Smuzhiyun }
1624*4882a593Smuzhiyun
pci_fintek_f815xxa_init(struct pci_dev * dev)1625*4882a593Smuzhiyun static int pci_fintek_f815xxa_init(struct pci_dev *dev)
1626*4882a593Smuzhiyun {
1627*4882a593Smuzhiyun u32 max_port, i;
1628*4882a593Smuzhiyun int config_base;
1629*4882a593Smuzhiyun
1630*4882a593Smuzhiyun if (!(pci_resource_flags(dev, 0) & IORESOURCE_MEM))
1631*4882a593Smuzhiyun return -ENODEV;
1632*4882a593Smuzhiyun
1633*4882a593Smuzhiyun switch (dev->device) {
1634*4882a593Smuzhiyun case 0x1204: /* 4 ports */
1635*4882a593Smuzhiyun case 0x1208: /* 8 ports */
1636*4882a593Smuzhiyun max_port = dev->device & 0xff;
1637*4882a593Smuzhiyun break;
1638*4882a593Smuzhiyun case 0x1212: /* 12 ports */
1639*4882a593Smuzhiyun max_port = 12;
1640*4882a593Smuzhiyun break;
1641*4882a593Smuzhiyun default:
1642*4882a593Smuzhiyun return -EINVAL;
1643*4882a593Smuzhiyun }
1644*4882a593Smuzhiyun
1645*4882a593Smuzhiyun /* Set to mmio decode */
1646*4882a593Smuzhiyun pci_write_config_byte(dev, 0x209, 0x40);
1647*4882a593Smuzhiyun
1648*4882a593Smuzhiyun for (i = 0; i < max_port; ++i) {
1649*4882a593Smuzhiyun /* UART0 configuration offset start from 0x2A0 */
1650*4882a593Smuzhiyun config_base = 0x2A0 + 0x08 * i;
1651*4882a593Smuzhiyun
1652*4882a593Smuzhiyun /* Select 128-byte FIFO and 8x FIFO threshold */
1653*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0x01, 0x33);
1654*4882a593Smuzhiyun
1655*4882a593Smuzhiyun /* Enable UART I/O port */
1656*4882a593Smuzhiyun pci_write_config_byte(dev, config_base + 0, 0x01);
1657*4882a593Smuzhiyun }
1658*4882a593Smuzhiyun
1659*4882a593Smuzhiyun return max_port;
1660*4882a593Smuzhiyun }
1661*4882a593Smuzhiyun
skip_tx_en_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1662*4882a593Smuzhiyun static int skip_tx_en_setup(struct serial_private *priv,
1663*4882a593Smuzhiyun const struct pciserial_board *board,
1664*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1665*4882a593Smuzhiyun {
1666*4882a593Smuzhiyun port->port.quirks |= UPQ_NO_TXEN_TEST;
1667*4882a593Smuzhiyun pci_dbg(priv->dev,
1668*4882a593Smuzhiyun "serial8250: skipping TxEn test for device [%04x:%04x] subsystem [%04x:%04x]\n",
1669*4882a593Smuzhiyun priv->dev->vendor, priv->dev->device,
1670*4882a593Smuzhiyun priv->dev->subsystem_vendor, priv->dev->subsystem_device);
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1673*4882a593Smuzhiyun }
1674*4882a593Smuzhiyun
kt_handle_break(struct uart_port * p)1675*4882a593Smuzhiyun static void kt_handle_break(struct uart_port *p)
1676*4882a593Smuzhiyun {
1677*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(p);
1678*4882a593Smuzhiyun /*
1679*4882a593Smuzhiyun * On receipt of a BI, serial device in Intel ME (Intel
1680*4882a593Smuzhiyun * management engine) needs to have its fifos cleared for sane
1681*4882a593Smuzhiyun * SOL (Serial Over Lan) output.
1682*4882a593Smuzhiyun */
1683*4882a593Smuzhiyun serial8250_clear_and_reinit_fifos(up);
1684*4882a593Smuzhiyun }
1685*4882a593Smuzhiyun
kt_serial_in(struct uart_port * p,int offset)1686*4882a593Smuzhiyun static unsigned int kt_serial_in(struct uart_port *p, int offset)
1687*4882a593Smuzhiyun {
1688*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(p);
1689*4882a593Smuzhiyun unsigned int val;
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun /*
1692*4882a593Smuzhiyun * When the Intel ME (management engine) gets reset its serial
1693*4882a593Smuzhiyun * port registers could return 0 momentarily. Functions like
1694*4882a593Smuzhiyun * serial8250_console_write, read and save the IER, perform
1695*4882a593Smuzhiyun * some operation and then restore it. In order to avoid
1696*4882a593Smuzhiyun * setting IER register inadvertently to 0, if the value read
1697*4882a593Smuzhiyun * is 0, double check with ier value in uart_8250_port and use
1698*4882a593Smuzhiyun * that instead. up->ier should be the same value as what is
1699*4882a593Smuzhiyun * currently configured.
1700*4882a593Smuzhiyun */
1701*4882a593Smuzhiyun val = inb(p->iobase + offset);
1702*4882a593Smuzhiyun if (offset == UART_IER) {
1703*4882a593Smuzhiyun if (val == 0)
1704*4882a593Smuzhiyun val = up->ier;
1705*4882a593Smuzhiyun }
1706*4882a593Smuzhiyun return val;
1707*4882a593Smuzhiyun }
1708*4882a593Smuzhiyun
kt_serial_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1709*4882a593Smuzhiyun static int kt_serial_setup(struct serial_private *priv,
1710*4882a593Smuzhiyun const struct pciserial_board *board,
1711*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1712*4882a593Smuzhiyun {
1713*4882a593Smuzhiyun port->port.flags |= UPF_BUG_THRE;
1714*4882a593Smuzhiyun port->port.serial_in = kt_serial_in;
1715*4882a593Smuzhiyun port->port.handle_break = kt_handle_break;
1716*4882a593Smuzhiyun return skip_tx_en_setup(priv, board, port, idx);
1717*4882a593Smuzhiyun }
1718*4882a593Smuzhiyun
pci_eg20t_init(struct pci_dev * dev)1719*4882a593Smuzhiyun static int pci_eg20t_init(struct pci_dev *dev)
1720*4882a593Smuzhiyun {
1721*4882a593Smuzhiyun #if defined(CONFIG_SERIAL_PCH_UART) || defined(CONFIG_SERIAL_PCH_UART_MODULE)
1722*4882a593Smuzhiyun return -ENODEV;
1723*4882a593Smuzhiyun #else
1724*4882a593Smuzhiyun return 0;
1725*4882a593Smuzhiyun #endif
1726*4882a593Smuzhiyun }
1727*4882a593Smuzhiyun
1728*4882a593Smuzhiyun static int
pci_wch_ch353_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1729*4882a593Smuzhiyun pci_wch_ch353_setup(struct serial_private *priv,
1730*4882a593Smuzhiyun const struct pciserial_board *board,
1731*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1732*4882a593Smuzhiyun {
1733*4882a593Smuzhiyun port->port.flags |= UPF_FIXED_TYPE;
1734*4882a593Smuzhiyun port->port.type = PORT_16550A;
1735*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1736*4882a593Smuzhiyun }
1737*4882a593Smuzhiyun
1738*4882a593Smuzhiyun static int
pci_wch_ch355_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1739*4882a593Smuzhiyun pci_wch_ch355_setup(struct serial_private *priv,
1740*4882a593Smuzhiyun const struct pciserial_board *board,
1741*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1742*4882a593Smuzhiyun {
1743*4882a593Smuzhiyun port->port.flags |= UPF_FIXED_TYPE;
1744*4882a593Smuzhiyun port->port.type = PORT_16550A;
1745*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1746*4882a593Smuzhiyun }
1747*4882a593Smuzhiyun
1748*4882a593Smuzhiyun static int
pci_wch_ch38x_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1749*4882a593Smuzhiyun pci_wch_ch38x_setup(struct serial_private *priv,
1750*4882a593Smuzhiyun const struct pciserial_board *board,
1751*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1752*4882a593Smuzhiyun {
1753*4882a593Smuzhiyun port->port.flags |= UPF_FIXED_TYPE;
1754*4882a593Smuzhiyun port->port.type = PORT_16850;
1755*4882a593Smuzhiyun return pci_default_setup(priv, board, port, idx);
1756*4882a593Smuzhiyun }
1757*4882a593Smuzhiyun
1758*4882a593Smuzhiyun
1759*4882a593Smuzhiyun #define CH384_XINT_ENABLE_REG 0xEB
1760*4882a593Smuzhiyun #define CH384_XINT_ENABLE_BIT 0x02
1761*4882a593Smuzhiyun
pci_wch_ch38x_init(struct pci_dev * dev)1762*4882a593Smuzhiyun static int pci_wch_ch38x_init(struct pci_dev *dev)
1763*4882a593Smuzhiyun {
1764*4882a593Smuzhiyun int max_port;
1765*4882a593Smuzhiyun unsigned long iobase;
1766*4882a593Smuzhiyun
1767*4882a593Smuzhiyun
1768*4882a593Smuzhiyun switch (dev->device) {
1769*4882a593Smuzhiyun case 0x3853: /* 8 ports */
1770*4882a593Smuzhiyun max_port = 8;
1771*4882a593Smuzhiyun break;
1772*4882a593Smuzhiyun default:
1773*4882a593Smuzhiyun return -EINVAL;
1774*4882a593Smuzhiyun }
1775*4882a593Smuzhiyun
1776*4882a593Smuzhiyun iobase = pci_resource_start(dev, 0);
1777*4882a593Smuzhiyun outb(CH384_XINT_ENABLE_BIT, iobase + CH384_XINT_ENABLE_REG);
1778*4882a593Smuzhiyun
1779*4882a593Smuzhiyun return max_port;
1780*4882a593Smuzhiyun }
1781*4882a593Smuzhiyun
pci_wch_ch38x_exit(struct pci_dev * dev)1782*4882a593Smuzhiyun static void pci_wch_ch38x_exit(struct pci_dev *dev)
1783*4882a593Smuzhiyun {
1784*4882a593Smuzhiyun unsigned long iobase;
1785*4882a593Smuzhiyun
1786*4882a593Smuzhiyun iobase = pci_resource_start(dev, 0);
1787*4882a593Smuzhiyun outb(0x0, iobase + CH384_XINT_ENABLE_REG);
1788*4882a593Smuzhiyun }
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun
1791*4882a593Smuzhiyun static int
pci_sunix_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1792*4882a593Smuzhiyun pci_sunix_setup(struct serial_private *priv,
1793*4882a593Smuzhiyun const struct pciserial_board *board,
1794*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1795*4882a593Smuzhiyun {
1796*4882a593Smuzhiyun int bar;
1797*4882a593Smuzhiyun int offset;
1798*4882a593Smuzhiyun
1799*4882a593Smuzhiyun port->port.flags |= UPF_FIXED_TYPE;
1800*4882a593Smuzhiyun port->port.type = PORT_SUNIX;
1801*4882a593Smuzhiyun
1802*4882a593Smuzhiyun if (idx < 4) {
1803*4882a593Smuzhiyun bar = 0;
1804*4882a593Smuzhiyun offset = idx * board->uart_offset;
1805*4882a593Smuzhiyun } else {
1806*4882a593Smuzhiyun bar = 1;
1807*4882a593Smuzhiyun idx -= 4;
1808*4882a593Smuzhiyun idx = div_s64_rem(idx, 4, &offset);
1809*4882a593Smuzhiyun offset = idx * 64 + offset * board->uart_offset;
1810*4882a593Smuzhiyun }
1811*4882a593Smuzhiyun
1812*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, 0);
1813*4882a593Smuzhiyun }
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun static int
pci_moxa_setup(struct serial_private * priv,const struct pciserial_board * board,struct uart_8250_port * port,int idx)1816*4882a593Smuzhiyun pci_moxa_setup(struct serial_private *priv,
1817*4882a593Smuzhiyun const struct pciserial_board *board,
1818*4882a593Smuzhiyun struct uart_8250_port *port, int idx)
1819*4882a593Smuzhiyun {
1820*4882a593Smuzhiyun unsigned int bar = FL_GET_BASE(board->flags);
1821*4882a593Smuzhiyun int offset;
1822*4882a593Smuzhiyun
1823*4882a593Smuzhiyun if (board->num_ports == 4 && idx == 3)
1824*4882a593Smuzhiyun offset = 7 * board->uart_offset;
1825*4882a593Smuzhiyun else
1826*4882a593Smuzhiyun offset = idx * board->uart_offset;
1827*4882a593Smuzhiyun
1828*4882a593Smuzhiyun return setup_port(priv, port, bar, offset, 0);
1829*4882a593Smuzhiyun }
1830*4882a593Smuzhiyun
1831*4882a593Smuzhiyun #define PCI_VENDOR_ID_SBSMODULARIO 0x124B
1832*4882a593Smuzhiyun #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
1833*4882a593Smuzhiyun #define PCI_DEVICE_ID_OCTPRO 0x0001
1834*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_OCTPRO232 0x0108
1835*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208
1836*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_POCTAL232 0x0308
1837*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_POCTAL422 0x0408
1838*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_SIIG_DUAL_00 0x2500
1839*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_SIIG_DUAL_30 0x2530
1840*4882a593Smuzhiyun #define PCI_VENDOR_ID_ADVANTECH 0x13fe
1841*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66
1842*4882a593Smuzhiyun #define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620
1843*4882a593Smuzhiyun #define PCI_DEVICE_ID_ADVANTECH_PCI3618 0x3618
1844*4882a593Smuzhiyun #define PCI_DEVICE_ID_ADVANTECH_PCIf618 0xf618
1845*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_200I 0x8028
1846*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_400I 0x8048
1847*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800I 0x8088
1848*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800EH 0xA007
1849*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800EHB 0xA008
1850*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_400EH 0xA009
1851*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_100E 0xA010
1852*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_200E 0xA012
1853*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_400E 0xA013
1854*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800E 0xA014
1855*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_200EI 0xA016
1856*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_200EISI 0xA017
1857*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_200V3 0xA306
1858*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_400V3 0xA310
1859*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_410V3 0xA312
1860*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800V3 0xA314
1861*4882a593Smuzhiyun #define PCI_DEVICE_ID_TITAN_800V3B 0xA315
1862*4882a593Smuzhiyun #define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538
1863*4882a593Smuzhiyun #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6
1864*4882a593Smuzhiyun #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
1865*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
1866*4882a593Smuzhiyun #define PCI_VENDOR_ID_WCH 0x4348
1867*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH352_2S 0x3253
1868*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH353_4S 0x3453
1869*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046
1870*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH353_1S1P 0x5053
1871*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH353_2S1P 0x7053
1872*4882a593Smuzhiyun #define PCI_DEVICE_ID_WCH_CH355_4S 0x7173
1873*4882a593Smuzhiyun #define PCI_VENDOR_ID_AGESTAR 0x5372
1874*4882a593Smuzhiyun #define PCI_DEVICE_ID_AGESTAR_9375 0x6872
1875*4882a593Smuzhiyun #define PCI_VENDOR_ID_ASIX 0x9710
1876*4882a593Smuzhiyun #define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
1877*4882a593Smuzhiyun #define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun #define PCIE_VENDOR_ID_WCH 0x1c00
1880*4882a593Smuzhiyun #define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250
1881*4882a593Smuzhiyun #define PCIE_DEVICE_ID_WCH_CH384_4S 0x3470
1882*4882a593Smuzhiyun #define PCIE_DEVICE_ID_WCH_CH384_8S 0x3853
1883*4882a593Smuzhiyun #define PCIE_DEVICE_ID_WCH_CH382_2S 0x3253
1884*4882a593Smuzhiyun
1885*4882a593Smuzhiyun #define PCI_VENDOR_ID_ACCESIO 0x494f
1886*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB 0x1051
1887*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S 0x1053
1888*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB 0x105C
1889*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S 0x105E
1890*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB 0x1091
1891*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2 0x1093
1892*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB 0x1099
1893*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4 0x109B
1894*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB 0x10D1
1895*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM 0x10D3
1896*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB 0x10DA
1897*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM 0x10DC
1898*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 0x1108
1899*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2 0x1110
1900*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2 0x1111
1901*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4 0x1118
1902*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4 0x1119
1903*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S 0x1152
1904*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S 0x115A
1905*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2 0x1190
1906*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2 0x1191
1907*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4 0x1198
1908*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4 0x1199
1909*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM 0x11D0
1910*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4 0x105A
1911*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4 0x105B
1912*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8 0x106A
1913*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8 0x106B
1914*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 0x1098
1915*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8 0x10A9
1916*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM 0x10D9
1917*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM 0x10E9
1918*4882a593Smuzhiyun #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM 0x11D8
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun
1921*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP102E 0x1024
1922*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP102EL 0x1025
1923*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP104EL_A 0x1045
1924*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP114EL 0x1144
1925*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP116E_A_A 0x1160
1926*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP116E_A_B 0x1161
1927*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP118EL_A 0x1182
1928*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP118E_A_I 0x1183
1929*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP132EL 0x1322
1930*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP134EL_A 0x1342
1931*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP138E_A 0x1381
1932*4882a593Smuzhiyun #define PCI_DEVICE_ID_MOXA_CP168EL_A 0x1683
1933*4882a593Smuzhiyun
1934*4882a593Smuzhiyun /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
1935*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
1936*4882a593Smuzhiyun #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun /*
1939*4882a593Smuzhiyun * Master list of serial port init/setup/exit quirks.
1940*4882a593Smuzhiyun * This does not describe the general nature of the port.
1941*4882a593Smuzhiyun * (ie, baud base, number and location of ports, etc)
1942*4882a593Smuzhiyun *
1943*4882a593Smuzhiyun * This list is ordered alphabetically by vendor then device.
1944*4882a593Smuzhiyun * Specific entries must come before more generic entries.
1945*4882a593Smuzhiyun */
1946*4882a593Smuzhiyun static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1947*4882a593Smuzhiyun /*
1948*4882a593Smuzhiyun * ADDI-DATA GmbH communication cards <info@addi-data.com>
1949*4882a593Smuzhiyun */
1950*4882a593Smuzhiyun {
1951*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_AMCC,
1952*4882a593Smuzhiyun .device = PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800,
1953*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
1954*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
1955*4882a593Smuzhiyun .setup = addidata_apci7800_setup,
1956*4882a593Smuzhiyun },
1957*4882a593Smuzhiyun /*
1958*4882a593Smuzhiyun * AFAVLAB cards - these may be called via parport_serial
1959*4882a593Smuzhiyun * It is not clear whether this applies to all products.
1960*4882a593Smuzhiyun */
1961*4882a593Smuzhiyun {
1962*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_AFAVLAB,
1963*4882a593Smuzhiyun .device = PCI_ANY_ID,
1964*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
1965*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
1966*4882a593Smuzhiyun .setup = afavlab_setup,
1967*4882a593Smuzhiyun },
1968*4882a593Smuzhiyun /*
1969*4882a593Smuzhiyun * HP Diva
1970*4882a593Smuzhiyun */
1971*4882a593Smuzhiyun {
1972*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_HP,
1973*4882a593Smuzhiyun .device = PCI_DEVICE_ID_HP_DIVA,
1974*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
1975*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
1976*4882a593Smuzhiyun .init = pci_hp_diva_init,
1977*4882a593Smuzhiyun .setup = pci_hp_diva_setup,
1978*4882a593Smuzhiyun },
1979*4882a593Smuzhiyun /*
1980*4882a593Smuzhiyun * HPE PCI serial device
1981*4882a593Smuzhiyun */
1982*4882a593Smuzhiyun {
1983*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_HP_3PAR,
1984*4882a593Smuzhiyun .device = PCI_DEVICE_ID_HPE_PCI_SERIAL,
1985*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
1986*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
1987*4882a593Smuzhiyun .setup = pci_hp_diva_setup,
1988*4882a593Smuzhiyun },
1989*4882a593Smuzhiyun /*
1990*4882a593Smuzhiyun * Intel
1991*4882a593Smuzhiyun */
1992*4882a593Smuzhiyun {
1993*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
1994*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_80960_RP,
1995*4882a593Smuzhiyun .subvendor = 0xe4bf,
1996*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
1997*4882a593Smuzhiyun .init = pci_inteli960ni_init,
1998*4882a593Smuzhiyun .setup = pci_default_setup,
1999*4882a593Smuzhiyun },
2000*4882a593Smuzhiyun {
2001*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2002*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_8257X_SOL,
2003*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2004*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2005*4882a593Smuzhiyun .setup = skip_tx_en_setup,
2006*4882a593Smuzhiyun },
2007*4882a593Smuzhiyun {
2008*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2009*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_82573L_SOL,
2010*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2011*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2012*4882a593Smuzhiyun .setup = skip_tx_en_setup,
2013*4882a593Smuzhiyun },
2014*4882a593Smuzhiyun {
2015*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2016*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_82573E_SOL,
2017*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2018*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2019*4882a593Smuzhiyun .setup = skip_tx_en_setup,
2020*4882a593Smuzhiyun },
2021*4882a593Smuzhiyun {
2022*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2023*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_CE4100_UART,
2024*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2025*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2026*4882a593Smuzhiyun .setup = ce4100_serial_setup,
2027*4882a593Smuzhiyun },
2028*4882a593Smuzhiyun {
2029*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2030*4882a593Smuzhiyun .device = PCI_DEVICE_ID_INTEL_PATSBURG_KT,
2031*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2032*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2033*4882a593Smuzhiyun .setup = kt_serial_setup,
2034*4882a593Smuzhiyun },
2035*4882a593Smuzhiyun /*
2036*4882a593Smuzhiyun * ITE
2037*4882a593Smuzhiyun */
2038*4882a593Smuzhiyun {
2039*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ITE,
2040*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ITE_8872,
2041*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2042*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2043*4882a593Smuzhiyun .init = pci_ite887x_init,
2044*4882a593Smuzhiyun .setup = pci_default_setup,
2045*4882a593Smuzhiyun .exit = pci_ite887x_exit,
2046*4882a593Smuzhiyun },
2047*4882a593Smuzhiyun /*
2048*4882a593Smuzhiyun * National Instruments
2049*4882a593Smuzhiyun */
2050*4882a593Smuzhiyun {
2051*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2052*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI23216,
2053*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2054*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2055*4882a593Smuzhiyun .init = pci_ni8420_init,
2056*4882a593Smuzhiyun .setup = pci_default_setup,
2057*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2058*4882a593Smuzhiyun },
2059*4882a593Smuzhiyun {
2060*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2061*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI2328,
2062*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2063*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2064*4882a593Smuzhiyun .init = pci_ni8420_init,
2065*4882a593Smuzhiyun .setup = pci_default_setup,
2066*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2067*4882a593Smuzhiyun },
2068*4882a593Smuzhiyun {
2069*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2070*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI2324,
2071*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2072*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2073*4882a593Smuzhiyun .init = pci_ni8420_init,
2074*4882a593Smuzhiyun .setup = pci_default_setup,
2075*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2076*4882a593Smuzhiyun },
2077*4882a593Smuzhiyun {
2078*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2079*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI2322,
2080*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2081*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2082*4882a593Smuzhiyun .init = pci_ni8420_init,
2083*4882a593Smuzhiyun .setup = pci_default_setup,
2084*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2085*4882a593Smuzhiyun },
2086*4882a593Smuzhiyun {
2087*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2088*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI2324I,
2089*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2090*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2091*4882a593Smuzhiyun .init = pci_ni8420_init,
2092*4882a593Smuzhiyun .setup = pci_default_setup,
2093*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2094*4882a593Smuzhiyun },
2095*4882a593Smuzhiyun {
2096*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2097*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PCI2322I,
2098*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2099*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2100*4882a593Smuzhiyun .init = pci_ni8420_init,
2101*4882a593Smuzhiyun .setup = pci_default_setup,
2102*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2103*4882a593Smuzhiyun },
2104*4882a593Smuzhiyun {
2105*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2106*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8420_23216,
2107*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2108*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2109*4882a593Smuzhiyun .init = pci_ni8420_init,
2110*4882a593Smuzhiyun .setup = pci_default_setup,
2111*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2112*4882a593Smuzhiyun },
2113*4882a593Smuzhiyun {
2114*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2115*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8420_2328,
2116*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2117*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2118*4882a593Smuzhiyun .init = pci_ni8420_init,
2119*4882a593Smuzhiyun .setup = pci_default_setup,
2120*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2121*4882a593Smuzhiyun },
2122*4882a593Smuzhiyun {
2123*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2124*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8420_2324,
2125*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2126*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2127*4882a593Smuzhiyun .init = pci_ni8420_init,
2128*4882a593Smuzhiyun .setup = pci_default_setup,
2129*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2130*4882a593Smuzhiyun },
2131*4882a593Smuzhiyun {
2132*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2133*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8420_2322,
2134*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2135*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2136*4882a593Smuzhiyun .init = pci_ni8420_init,
2137*4882a593Smuzhiyun .setup = pci_default_setup,
2138*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2139*4882a593Smuzhiyun },
2140*4882a593Smuzhiyun {
2141*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2142*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8422_2324,
2143*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2144*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2145*4882a593Smuzhiyun .init = pci_ni8420_init,
2146*4882a593Smuzhiyun .setup = pci_default_setup,
2147*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2148*4882a593Smuzhiyun },
2149*4882a593Smuzhiyun {
2150*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2151*4882a593Smuzhiyun .device = PCI_DEVICE_ID_NI_PXI8422_2322,
2152*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2153*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2154*4882a593Smuzhiyun .init = pci_ni8420_init,
2155*4882a593Smuzhiyun .setup = pci_default_setup,
2156*4882a593Smuzhiyun .exit = pci_ni8420_exit,
2157*4882a593Smuzhiyun },
2158*4882a593Smuzhiyun {
2159*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NI,
2160*4882a593Smuzhiyun .device = PCI_ANY_ID,
2161*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2162*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2163*4882a593Smuzhiyun .init = pci_ni8430_init,
2164*4882a593Smuzhiyun .setup = pci_ni8430_setup,
2165*4882a593Smuzhiyun .exit = pci_ni8430_exit,
2166*4882a593Smuzhiyun },
2167*4882a593Smuzhiyun /* Quatech */
2168*4882a593Smuzhiyun {
2169*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_QUATECH,
2170*4882a593Smuzhiyun .device = PCI_ANY_ID,
2171*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2172*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2173*4882a593Smuzhiyun .init = pci_quatech_init,
2174*4882a593Smuzhiyun .setup = pci_quatech_setup,
2175*4882a593Smuzhiyun .exit = pci_quatech_exit,
2176*4882a593Smuzhiyun },
2177*4882a593Smuzhiyun /*
2178*4882a593Smuzhiyun * Panacom
2179*4882a593Smuzhiyun */
2180*4882a593Smuzhiyun {
2181*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PANACOM,
2182*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PANACOM_QUADMODEM,
2183*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2184*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2185*4882a593Smuzhiyun .init = pci_plx9050_init,
2186*4882a593Smuzhiyun .setup = pci_default_setup,
2187*4882a593Smuzhiyun .exit = pci_plx9050_exit,
2188*4882a593Smuzhiyun },
2189*4882a593Smuzhiyun {
2190*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PANACOM,
2191*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PANACOM_DUALMODEM,
2192*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2193*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2194*4882a593Smuzhiyun .init = pci_plx9050_init,
2195*4882a593Smuzhiyun .setup = pci_default_setup,
2196*4882a593Smuzhiyun .exit = pci_plx9050_exit,
2197*4882a593Smuzhiyun },
2198*4882a593Smuzhiyun /*
2199*4882a593Smuzhiyun * Pericom (Only 7954 - It have a offset jump for port 4)
2200*4882a593Smuzhiyun */
2201*4882a593Smuzhiyun {
2202*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PERICOM,
2203*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PERICOM_PI7C9X7954,
2204*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2205*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2206*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2207*4882a593Smuzhiyun },
2208*4882a593Smuzhiyun /*
2209*4882a593Smuzhiyun * PLX
2210*4882a593Smuzhiyun */
2211*4882a593Smuzhiyun {
2212*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PLX,
2213*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PLX_9050,
2214*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_EXSYS,
2215*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_EXSYS_4055,
2216*4882a593Smuzhiyun .init = pci_plx9050_init,
2217*4882a593Smuzhiyun .setup = pci_default_setup,
2218*4882a593Smuzhiyun .exit = pci_plx9050_exit,
2219*4882a593Smuzhiyun },
2220*4882a593Smuzhiyun {
2221*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PLX,
2222*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PLX_9050,
2223*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_KEYSPAN,
2224*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_KEYSPAN_SX2,
2225*4882a593Smuzhiyun .init = pci_plx9050_init,
2226*4882a593Smuzhiyun .setup = pci_default_setup,
2227*4882a593Smuzhiyun .exit = pci_plx9050_exit,
2228*4882a593Smuzhiyun },
2229*4882a593Smuzhiyun {
2230*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PLX,
2231*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PLX_ROMULUS,
2232*4882a593Smuzhiyun .subvendor = PCI_VENDOR_ID_PLX,
2233*4882a593Smuzhiyun .subdevice = PCI_DEVICE_ID_PLX_ROMULUS,
2234*4882a593Smuzhiyun .init = pci_plx9050_init,
2235*4882a593Smuzhiyun .setup = pci_default_setup,
2236*4882a593Smuzhiyun .exit = pci_plx9050_exit,
2237*4882a593Smuzhiyun },
2238*4882a593Smuzhiyun {
2239*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2240*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
2241*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2242*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2243*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2244*4882a593Smuzhiyun },
2245*4882a593Smuzhiyun {
2246*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2247*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S,
2248*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2249*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2250*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2251*4882a593Smuzhiyun },
2252*4882a593Smuzhiyun {
2253*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2254*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
2255*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2256*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2257*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2258*4882a593Smuzhiyun },
2259*4882a593Smuzhiyun {
2260*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2261*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4,
2262*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2263*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2264*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2265*4882a593Smuzhiyun },
2266*4882a593Smuzhiyun {
2267*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2268*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
2269*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2270*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2271*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2272*4882a593Smuzhiyun },
2273*4882a593Smuzhiyun {
2274*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2275*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM,
2276*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2277*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2278*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2279*4882a593Smuzhiyun },
2280*4882a593Smuzhiyun {
2281*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2282*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
2283*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2284*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2285*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2286*4882a593Smuzhiyun },
2287*4882a593Smuzhiyun {
2288*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2289*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4,
2290*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2291*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2292*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2293*4882a593Smuzhiyun },
2294*4882a593Smuzhiyun {
2295*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2296*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
2297*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2298*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2299*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2300*4882a593Smuzhiyun },
2301*4882a593Smuzhiyun {
2302*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2303*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
2304*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2305*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2306*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2307*4882a593Smuzhiyun },
2308*4882a593Smuzhiyun {
2309*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2310*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4,
2311*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2312*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2313*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2314*4882a593Smuzhiyun },
2315*4882a593Smuzhiyun {
2316*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2317*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
2318*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2319*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2320*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2321*4882a593Smuzhiyun },
2322*4882a593Smuzhiyun {
2323*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2324*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
2325*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2326*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2327*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2328*4882a593Smuzhiyun },
2329*4882a593Smuzhiyun {
2330*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2331*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
2332*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2333*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2334*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2335*4882a593Smuzhiyun },
2336*4882a593Smuzhiyun {
2337*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2338*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
2339*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2340*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2341*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2342*4882a593Smuzhiyun },
2343*4882a593Smuzhiyun {
2344*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2345*4882a593Smuzhiyun .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
2346*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2347*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2348*4882a593Smuzhiyun .setup = pci_pericom_setup_four_at_eight,
2349*4882a593Smuzhiyun },
2350*4882a593Smuzhiyun {
2351*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ACCESIO,
2352*4882a593Smuzhiyun .device = PCI_ANY_ID,
2353*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2354*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2355*4882a593Smuzhiyun .setup = pci_pericom_setup,
2356*4882a593Smuzhiyun }, /*
2357*4882a593Smuzhiyun * SBS Technologies, Inc., PMC-OCTALPRO 232
2358*4882a593Smuzhiyun */
2359*4882a593Smuzhiyun {
2360*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2361*4882a593Smuzhiyun .device = PCI_DEVICE_ID_OCTPRO,
2362*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2363*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_OCTPRO232,
2364*4882a593Smuzhiyun .init = sbs_init,
2365*4882a593Smuzhiyun .setup = sbs_setup,
2366*4882a593Smuzhiyun .exit = sbs_exit,
2367*4882a593Smuzhiyun },
2368*4882a593Smuzhiyun /*
2369*4882a593Smuzhiyun * SBS Technologies, Inc., PMC-OCTALPRO 422
2370*4882a593Smuzhiyun */
2371*4882a593Smuzhiyun {
2372*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2373*4882a593Smuzhiyun .device = PCI_DEVICE_ID_OCTPRO,
2374*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2375*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_OCTPRO422,
2376*4882a593Smuzhiyun .init = sbs_init,
2377*4882a593Smuzhiyun .setup = sbs_setup,
2378*4882a593Smuzhiyun .exit = sbs_exit,
2379*4882a593Smuzhiyun },
2380*4882a593Smuzhiyun /*
2381*4882a593Smuzhiyun * SBS Technologies, Inc., P-Octal 232
2382*4882a593Smuzhiyun */
2383*4882a593Smuzhiyun {
2384*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2385*4882a593Smuzhiyun .device = PCI_DEVICE_ID_OCTPRO,
2386*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2387*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_POCTAL232,
2388*4882a593Smuzhiyun .init = sbs_init,
2389*4882a593Smuzhiyun .setup = sbs_setup,
2390*4882a593Smuzhiyun .exit = sbs_exit,
2391*4882a593Smuzhiyun },
2392*4882a593Smuzhiyun /*
2393*4882a593Smuzhiyun * SBS Technologies, Inc., P-Octal 422
2394*4882a593Smuzhiyun */
2395*4882a593Smuzhiyun {
2396*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2397*4882a593Smuzhiyun .device = PCI_DEVICE_ID_OCTPRO,
2398*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2399*4882a593Smuzhiyun .subdevice = PCI_SUBDEVICE_ID_POCTAL422,
2400*4882a593Smuzhiyun .init = sbs_init,
2401*4882a593Smuzhiyun .setup = sbs_setup,
2402*4882a593Smuzhiyun .exit = sbs_exit,
2403*4882a593Smuzhiyun },
2404*4882a593Smuzhiyun /*
2405*4882a593Smuzhiyun * SIIG cards - these may be called via parport_serial
2406*4882a593Smuzhiyun */
2407*4882a593Smuzhiyun {
2408*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SIIG,
2409*4882a593Smuzhiyun .device = PCI_ANY_ID,
2410*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2411*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2412*4882a593Smuzhiyun .init = pci_siig_init,
2413*4882a593Smuzhiyun .setup = pci_siig_setup,
2414*4882a593Smuzhiyun },
2415*4882a593Smuzhiyun /*
2416*4882a593Smuzhiyun * Titan cards
2417*4882a593Smuzhiyun */
2418*4882a593Smuzhiyun {
2419*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_TITAN,
2420*4882a593Smuzhiyun .device = PCI_DEVICE_ID_TITAN_400L,
2421*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2422*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2423*4882a593Smuzhiyun .setup = titan_400l_800l_setup,
2424*4882a593Smuzhiyun },
2425*4882a593Smuzhiyun {
2426*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_TITAN,
2427*4882a593Smuzhiyun .device = PCI_DEVICE_ID_TITAN_800L,
2428*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2429*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2430*4882a593Smuzhiyun .setup = titan_400l_800l_setup,
2431*4882a593Smuzhiyun },
2432*4882a593Smuzhiyun /*
2433*4882a593Smuzhiyun * Timedia cards
2434*4882a593Smuzhiyun */
2435*4882a593Smuzhiyun {
2436*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_TIMEDIA,
2437*4882a593Smuzhiyun .device = PCI_DEVICE_ID_TIMEDIA_1889,
2438*4882a593Smuzhiyun .subvendor = PCI_VENDOR_ID_TIMEDIA,
2439*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2440*4882a593Smuzhiyun .probe = pci_timedia_probe,
2441*4882a593Smuzhiyun .init = pci_timedia_init,
2442*4882a593Smuzhiyun .setup = pci_timedia_setup,
2443*4882a593Smuzhiyun },
2444*4882a593Smuzhiyun {
2445*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_TIMEDIA,
2446*4882a593Smuzhiyun .device = PCI_ANY_ID,
2447*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2448*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2449*4882a593Smuzhiyun .setup = pci_timedia_setup,
2450*4882a593Smuzhiyun },
2451*4882a593Smuzhiyun /*
2452*4882a593Smuzhiyun * Sunix PCI serial boards
2453*4882a593Smuzhiyun */
2454*4882a593Smuzhiyun {
2455*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_SUNIX,
2456*4882a593Smuzhiyun .device = PCI_DEVICE_ID_SUNIX_1999,
2457*4882a593Smuzhiyun .subvendor = PCI_VENDOR_ID_SUNIX,
2458*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2459*4882a593Smuzhiyun .setup = pci_sunix_setup,
2460*4882a593Smuzhiyun },
2461*4882a593Smuzhiyun /*
2462*4882a593Smuzhiyun * Xircom cards
2463*4882a593Smuzhiyun */
2464*4882a593Smuzhiyun {
2465*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_XIRCOM,
2466*4882a593Smuzhiyun .device = PCI_DEVICE_ID_XIRCOM_X3201_MDM,
2467*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2468*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2469*4882a593Smuzhiyun .init = pci_xircom_init,
2470*4882a593Smuzhiyun .setup = pci_default_setup,
2471*4882a593Smuzhiyun },
2472*4882a593Smuzhiyun /*
2473*4882a593Smuzhiyun * Netmos cards - these may be called via parport_serial
2474*4882a593Smuzhiyun */
2475*4882a593Smuzhiyun {
2476*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_NETMOS,
2477*4882a593Smuzhiyun .device = PCI_ANY_ID,
2478*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2479*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2480*4882a593Smuzhiyun .init = pci_netmos_init,
2481*4882a593Smuzhiyun .setup = pci_netmos_9900_setup,
2482*4882a593Smuzhiyun },
2483*4882a593Smuzhiyun /*
2484*4882a593Smuzhiyun * EndRun Technologies
2485*4882a593Smuzhiyun */
2486*4882a593Smuzhiyun {
2487*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ENDRUN,
2488*4882a593Smuzhiyun .device = PCI_ANY_ID,
2489*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2490*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2491*4882a593Smuzhiyun .init = pci_oxsemi_tornado_init,
2492*4882a593Smuzhiyun .setup = pci_default_setup,
2493*4882a593Smuzhiyun },
2494*4882a593Smuzhiyun /*
2495*4882a593Smuzhiyun * For Oxford Semiconductor Tornado based devices
2496*4882a593Smuzhiyun */
2497*4882a593Smuzhiyun {
2498*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_OXSEMI,
2499*4882a593Smuzhiyun .device = PCI_ANY_ID,
2500*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2501*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2502*4882a593Smuzhiyun .init = pci_oxsemi_tornado_init,
2503*4882a593Smuzhiyun .setup = pci_default_setup,
2504*4882a593Smuzhiyun },
2505*4882a593Smuzhiyun {
2506*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_MAINPINE,
2507*4882a593Smuzhiyun .device = PCI_ANY_ID,
2508*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2509*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2510*4882a593Smuzhiyun .init = pci_oxsemi_tornado_init,
2511*4882a593Smuzhiyun .setup = pci_default_setup,
2512*4882a593Smuzhiyun },
2513*4882a593Smuzhiyun {
2514*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_DIGI,
2515*4882a593Smuzhiyun .device = PCIE_DEVICE_ID_NEO_2_OX_IBM,
2516*4882a593Smuzhiyun .subvendor = PCI_SUBVENDOR_ID_IBM,
2517*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2518*4882a593Smuzhiyun .init = pci_oxsemi_tornado_init,
2519*4882a593Smuzhiyun .setup = pci_default_setup,
2520*4882a593Smuzhiyun },
2521*4882a593Smuzhiyun {
2522*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2523*4882a593Smuzhiyun .device = 0x8811,
2524*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2525*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2526*4882a593Smuzhiyun .init = pci_eg20t_init,
2527*4882a593Smuzhiyun .setup = pci_default_setup,
2528*4882a593Smuzhiyun },
2529*4882a593Smuzhiyun {
2530*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2531*4882a593Smuzhiyun .device = 0x8812,
2532*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2533*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2534*4882a593Smuzhiyun .init = pci_eg20t_init,
2535*4882a593Smuzhiyun .setup = pci_default_setup,
2536*4882a593Smuzhiyun },
2537*4882a593Smuzhiyun {
2538*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2539*4882a593Smuzhiyun .device = 0x8813,
2540*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2541*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2542*4882a593Smuzhiyun .init = pci_eg20t_init,
2543*4882a593Smuzhiyun .setup = pci_default_setup,
2544*4882a593Smuzhiyun },
2545*4882a593Smuzhiyun {
2546*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_INTEL,
2547*4882a593Smuzhiyun .device = 0x8814,
2548*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2549*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2550*4882a593Smuzhiyun .init = pci_eg20t_init,
2551*4882a593Smuzhiyun .setup = pci_default_setup,
2552*4882a593Smuzhiyun },
2553*4882a593Smuzhiyun {
2554*4882a593Smuzhiyun .vendor = 0x10DB,
2555*4882a593Smuzhiyun .device = 0x8027,
2556*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2557*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2558*4882a593Smuzhiyun .init = pci_eg20t_init,
2559*4882a593Smuzhiyun .setup = pci_default_setup,
2560*4882a593Smuzhiyun },
2561*4882a593Smuzhiyun {
2562*4882a593Smuzhiyun .vendor = 0x10DB,
2563*4882a593Smuzhiyun .device = 0x8028,
2564*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2565*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2566*4882a593Smuzhiyun .init = pci_eg20t_init,
2567*4882a593Smuzhiyun .setup = pci_default_setup,
2568*4882a593Smuzhiyun },
2569*4882a593Smuzhiyun {
2570*4882a593Smuzhiyun .vendor = 0x10DB,
2571*4882a593Smuzhiyun .device = 0x8029,
2572*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2573*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2574*4882a593Smuzhiyun .init = pci_eg20t_init,
2575*4882a593Smuzhiyun .setup = pci_default_setup,
2576*4882a593Smuzhiyun },
2577*4882a593Smuzhiyun {
2578*4882a593Smuzhiyun .vendor = 0x10DB,
2579*4882a593Smuzhiyun .device = 0x800C,
2580*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2581*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2582*4882a593Smuzhiyun .init = pci_eg20t_init,
2583*4882a593Smuzhiyun .setup = pci_default_setup,
2584*4882a593Smuzhiyun },
2585*4882a593Smuzhiyun {
2586*4882a593Smuzhiyun .vendor = 0x10DB,
2587*4882a593Smuzhiyun .device = 0x800D,
2588*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2589*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2590*4882a593Smuzhiyun .init = pci_eg20t_init,
2591*4882a593Smuzhiyun .setup = pci_default_setup,
2592*4882a593Smuzhiyun },
2593*4882a593Smuzhiyun /*
2594*4882a593Smuzhiyun * Cronyx Omega PCI (PLX-chip based)
2595*4882a593Smuzhiyun */
2596*4882a593Smuzhiyun {
2597*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_PLX,
2598*4882a593Smuzhiyun .device = PCI_DEVICE_ID_PLX_CRONYX_OMEGA,
2599*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2600*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2601*4882a593Smuzhiyun .setup = pci_omegapci_setup,
2602*4882a593Smuzhiyun },
2603*4882a593Smuzhiyun /* WCH CH353 1S1P card (16550 clone) */
2604*4882a593Smuzhiyun {
2605*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2606*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH353_1S1P,
2607*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2608*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2609*4882a593Smuzhiyun .setup = pci_wch_ch353_setup,
2610*4882a593Smuzhiyun },
2611*4882a593Smuzhiyun /* WCH CH353 2S1P card (16550 clone) */
2612*4882a593Smuzhiyun {
2613*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2614*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH353_2S1P,
2615*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2616*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2617*4882a593Smuzhiyun .setup = pci_wch_ch353_setup,
2618*4882a593Smuzhiyun },
2619*4882a593Smuzhiyun /* WCH CH353 4S card (16550 clone) */
2620*4882a593Smuzhiyun {
2621*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2622*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH353_4S,
2623*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2624*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2625*4882a593Smuzhiyun .setup = pci_wch_ch353_setup,
2626*4882a593Smuzhiyun },
2627*4882a593Smuzhiyun /* WCH CH353 2S1PF card (16550 clone) */
2628*4882a593Smuzhiyun {
2629*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2630*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH353_2S1PF,
2631*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2632*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2633*4882a593Smuzhiyun .setup = pci_wch_ch353_setup,
2634*4882a593Smuzhiyun },
2635*4882a593Smuzhiyun /* WCH CH352 2S card (16550 clone) */
2636*4882a593Smuzhiyun {
2637*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2638*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH352_2S,
2639*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2640*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2641*4882a593Smuzhiyun .setup = pci_wch_ch353_setup,
2642*4882a593Smuzhiyun },
2643*4882a593Smuzhiyun /* WCH CH355 4S card (16550 clone) */
2644*4882a593Smuzhiyun {
2645*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_WCH,
2646*4882a593Smuzhiyun .device = PCI_DEVICE_ID_WCH_CH355_4S,
2647*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2648*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2649*4882a593Smuzhiyun .setup = pci_wch_ch355_setup,
2650*4882a593Smuzhiyun },
2651*4882a593Smuzhiyun /* WCH CH382 2S card (16850 clone) */
2652*4882a593Smuzhiyun {
2653*4882a593Smuzhiyun .vendor = PCIE_VENDOR_ID_WCH,
2654*4882a593Smuzhiyun .device = PCIE_DEVICE_ID_WCH_CH382_2S,
2655*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2656*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2657*4882a593Smuzhiyun .setup = pci_wch_ch38x_setup,
2658*4882a593Smuzhiyun },
2659*4882a593Smuzhiyun /* WCH CH382 2S1P card (16850 clone) */
2660*4882a593Smuzhiyun {
2661*4882a593Smuzhiyun .vendor = PCIE_VENDOR_ID_WCH,
2662*4882a593Smuzhiyun .device = PCIE_DEVICE_ID_WCH_CH382_2S1P,
2663*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2664*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2665*4882a593Smuzhiyun .setup = pci_wch_ch38x_setup,
2666*4882a593Smuzhiyun },
2667*4882a593Smuzhiyun /* WCH CH384 4S card (16850 clone) */
2668*4882a593Smuzhiyun {
2669*4882a593Smuzhiyun .vendor = PCIE_VENDOR_ID_WCH,
2670*4882a593Smuzhiyun .device = PCIE_DEVICE_ID_WCH_CH384_4S,
2671*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2672*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2673*4882a593Smuzhiyun .setup = pci_wch_ch38x_setup,
2674*4882a593Smuzhiyun },
2675*4882a593Smuzhiyun /* WCH CH384 8S card (16850 clone) */
2676*4882a593Smuzhiyun {
2677*4882a593Smuzhiyun .vendor = PCIE_VENDOR_ID_WCH,
2678*4882a593Smuzhiyun .device = PCIE_DEVICE_ID_WCH_CH384_8S,
2679*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2680*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2681*4882a593Smuzhiyun .init = pci_wch_ch38x_init,
2682*4882a593Smuzhiyun .exit = pci_wch_ch38x_exit,
2683*4882a593Smuzhiyun .setup = pci_wch_ch38x_setup,
2684*4882a593Smuzhiyun },
2685*4882a593Smuzhiyun /*
2686*4882a593Smuzhiyun * ASIX devices with FIFO bug
2687*4882a593Smuzhiyun */
2688*4882a593Smuzhiyun {
2689*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_ASIX,
2690*4882a593Smuzhiyun .device = PCI_ANY_ID,
2691*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2692*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2693*4882a593Smuzhiyun .setup = pci_asix_setup,
2694*4882a593Smuzhiyun },
2695*4882a593Smuzhiyun /*
2696*4882a593Smuzhiyun * Broadcom TruManage (NetXtreme)
2697*4882a593Smuzhiyun */
2698*4882a593Smuzhiyun {
2699*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_BROADCOM,
2700*4882a593Smuzhiyun .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
2701*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2702*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2703*4882a593Smuzhiyun .setup = pci_brcm_trumanage_setup,
2704*4882a593Smuzhiyun },
2705*4882a593Smuzhiyun {
2706*4882a593Smuzhiyun .vendor = 0x1c29,
2707*4882a593Smuzhiyun .device = 0x1104,
2708*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2709*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2710*4882a593Smuzhiyun .setup = pci_fintek_setup,
2711*4882a593Smuzhiyun .init = pci_fintek_init,
2712*4882a593Smuzhiyun },
2713*4882a593Smuzhiyun {
2714*4882a593Smuzhiyun .vendor = 0x1c29,
2715*4882a593Smuzhiyun .device = 0x1108,
2716*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2717*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2718*4882a593Smuzhiyun .setup = pci_fintek_setup,
2719*4882a593Smuzhiyun .init = pci_fintek_init,
2720*4882a593Smuzhiyun },
2721*4882a593Smuzhiyun {
2722*4882a593Smuzhiyun .vendor = 0x1c29,
2723*4882a593Smuzhiyun .device = 0x1112,
2724*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2725*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2726*4882a593Smuzhiyun .setup = pci_fintek_setup,
2727*4882a593Smuzhiyun .init = pci_fintek_init,
2728*4882a593Smuzhiyun },
2729*4882a593Smuzhiyun /*
2730*4882a593Smuzhiyun * MOXA
2731*4882a593Smuzhiyun */
2732*4882a593Smuzhiyun {
2733*4882a593Smuzhiyun .vendor = PCI_VENDOR_ID_MOXA,
2734*4882a593Smuzhiyun .device = PCI_ANY_ID,
2735*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2736*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2737*4882a593Smuzhiyun .setup = pci_moxa_setup,
2738*4882a593Smuzhiyun },
2739*4882a593Smuzhiyun {
2740*4882a593Smuzhiyun .vendor = 0x1c29,
2741*4882a593Smuzhiyun .device = 0x1204,
2742*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2743*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2744*4882a593Smuzhiyun .setup = pci_fintek_f815xxa_setup,
2745*4882a593Smuzhiyun .init = pci_fintek_f815xxa_init,
2746*4882a593Smuzhiyun },
2747*4882a593Smuzhiyun {
2748*4882a593Smuzhiyun .vendor = 0x1c29,
2749*4882a593Smuzhiyun .device = 0x1208,
2750*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2751*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2752*4882a593Smuzhiyun .setup = pci_fintek_f815xxa_setup,
2753*4882a593Smuzhiyun .init = pci_fintek_f815xxa_init,
2754*4882a593Smuzhiyun },
2755*4882a593Smuzhiyun {
2756*4882a593Smuzhiyun .vendor = 0x1c29,
2757*4882a593Smuzhiyun .device = 0x1212,
2758*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2759*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2760*4882a593Smuzhiyun .setup = pci_fintek_f815xxa_setup,
2761*4882a593Smuzhiyun .init = pci_fintek_f815xxa_init,
2762*4882a593Smuzhiyun },
2763*4882a593Smuzhiyun
2764*4882a593Smuzhiyun /*
2765*4882a593Smuzhiyun * Default "match everything" terminator entry
2766*4882a593Smuzhiyun */
2767*4882a593Smuzhiyun {
2768*4882a593Smuzhiyun .vendor = PCI_ANY_ID,
2769*4882a593Smuzhiyun .device = PCI_ANY_ID,
2770*4882a593Smuzhiyun .subvendor = PCI_ANY_ID,
2771*4882a593Smuzhiyun .subdevice = PCI_ANY_ID,
2772*4882a593Smuzhiyun .setup = pci_default_setup,
2773*4882a593Smuzhiyun }
2774*4882a593Smuzhiyun };
2775*4882a593Smuzhiyun
quirk_id_matches(u32 quirk_id,u32 dev_id)2776*4882a593Smuzhiyun static inline int quirk_id_matches(u32 quirk_id, u32 dev_id)
2777*4882a593Smuzhiyun {
2778*4882a593Smuzhiyun return quirk_id == PCI_ANY_ID || quirk_id == dev_id;
2779*4882a593Smuzhiyun }
2780*4882a593Smuzhiyun
find_quirk(struct pci_dev * dev)2781*4882a593Smuzhiyun static struct pci_serial_quirk *find_quirk(struct pci_dev *dev)
2782*4882a593Smuzhiyun {
2783*4882a593Smuzhiyun struct pci_serial_quirk *quirk;
2784*4882a593Smuzhiyun
2785*4882a593Smuzhiyun for (quirk = pci_serial_quirks; ; quirk++)
2786*4882a593Smuzhiyun if (quirk_id_matches(quirk->vendor, dev->vendor) &&
2787*4882a593Smuzhiyun quirk_id_matches(quirk->device, dev->device) &&
2788*4882a593Smuzhiyun quirk_id_matches(quirk->subvendor, dev->subsystem_vendor) &&
2789*4882a593Smuzhiyun quirk_id_matches(quirk->subdevice, dev->subsystem_device))
2790*4882a593Smuzhiyun break;
2791*4882a593Smuzhiyun return quirk;
2792*4882a593Smuzhiyun }
2793*4882a593Smuzhiyun
2794*4882a593Smuzhiyun /*
2795*4882a593Smuzhiyun * This is the configuration table for all of the PCI serial boards
2796*4882a593Smuzhiyun * which we support. It is directly indexed by the pci_board_num_t enum
2797*4882a593Smuzhiyun * value, which is encoded in the pci_device_id PCI probe table's
2798*4882a593Smuzhiyun * driver_data member.
2799*4882a593Smuzhiyun *
2800*4882a593Smuzhiyun * The makeup of these names are:
2801*4882a593Smuzhiyun * pbn_bn{_bt}_n_baud{_offsetinhex}
2802*4882a593Smuzhiyun *
2803*4882a593Smuzhiyun * bn = PCI BAR number
2804*4882a593Smuzhiyun * bt = Index using PCI BARs
2805*4882a593Smuzhiyun * n = number of serial ports
2806*4882a593Smuzhiyun * baud = baud rate
2807*4882a593Smuzhiyun * offsetinhex = offset for each sequential port (in hex)
2808*4882a593Smuzhiyun *
2809*4882a593Smuzhiyun * This table is sorted by (in order): bn, bt, baud, offsetindex, n.
2810*4882a593Smuzhiyun *
2811*4882a593Smuzhiyun * Please note: in theory if n = 1, _bt infix should make no difference.
2812*4882a593Smuzhiyun * ie, pbn_b0_1_115200 is the same as pbn_b0_bt_1_115200
2813*4882a593Smuzhiyun */
2814*4882a593Smuzhiyun enum pci_board_num_t {
2815*4882a593Smuzhiyun pbn_default = 0,
2816*4882a593Smuzhiyun
2817*4882a593Smuzhiyun pbn_b0_1_115200,
2818*4882a593Smuzhiyun pbn_b0_2_115200,
2819*4882a593Smuzhiyun pbn_b0_4_115200,
2820*4882a593Smuzhiyun pbn_b0_5_115200,
2821*4882a593Smuzhiyun pbn_b0_8_115200,
2822*4882a593Smuzhiyun
2823*4882a593Smuzhiyun pbn_b0_1_921600,
2824*4882a593Smuzhiyun pbn_b0_2_921600,
2825*4882a593Smuzhiyun pbn_b0_4_921600,
2826*4882a593Smuzhiyun
2827*4882a593Smuzhiyun pbn_b0_2_1130000,
2828*4882a593Smuzhiyun
2829*4882a593Smuzhiyun pbn_b0_4_1152000,
2830*4882a593Smuzhiyun
2831*4882a593Smuzhiyun pbn_b0_4_1250000,
2832*4882a593Smuzhiyun
2833*4882a593Smuzhiyun pbn_b0_2_1843200,
2834*4882a593Smuzhiyun pbn_b0_4_1843200,
2835*4882a593Smuzhiyun
2836*4882a593Smuzhiyun pbn_b0_1_3906250,
2837*4882a593Smuzhiyun
2838*4882a593Smuzhiyun pbn_b0_bt_1_115200,
2839*4882a593Smuzhiyun pbn_b0_bt_2_115200,
2840*4882a593Smuzhiyun pbn_b0_bt_4_115200,
2841*4882a593Smuzhiyun pbn_b0_bt_8_115200,
2842*4882a593Smuzhiyun
2843*4882a593Smuzhiyun pbn_b0_bt_1_460800,
2844*4882a593Smuzhiyun pbn_b0_bt_2_460800,
2845*4882a593Smuzhiyun pbn_b0_bt_4_460800,
2846*4882a593Smuzhiyun
2847*4882a593Smuzhiyun pbn_b0_bt_1_921600,
2848*4882a593Smuzhiyun pbn_b0_bt_2_921600,
2849*4882a593Smuzhiyun pbn_b0_bt_4_921600,
2850*4882a593Smuzhiyun pbn_b0_bt_8_921600,
2851*4882a593Smuzhiyun
2852*4882a593Smuzhiyun pbn_b1_1_115200,
2853*4882a593Smuzhiyun pbn_b1_2_115200,
2854*4882a593Smuzhiyun pbn_b1_4_115200,
2855*4882a593Smuzhiyun pbn_b1_8_115200,
2856*4882a593Smuzhiyun pbn_b1_16_115200,
2857*4882a593Smuzhiyun
2858*4882a593Smuzhiyun pbn_b1_1_921600,
2859*4882a593Smuzhiyun pbn_b1_2_921600,
2860*4882a593Smuzhiyun pbn_b1_4_921600,
2861*4882a593Smuzhiyun pbn_b1_8_921600,
2862*4882a593Smuzhiyun
2863*4882a593Smuzhiyun pbn_b1_2_1250000,
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun pbn_b1_bt_1_115200,
2866*4882a593Smuzhiyun pbn_b1_bt_2_115200,
2867*4882a593Smuzhiyun pbn_b1_bt_4_115200,
2868*4882a593Smuzhiyun
2869*4882a593Smuzhiyun pbn_b1_bt_2_921600,
2870*4882a593Smuzhiyun
2871*4882a593Smuzhiyun pbn_b1_1_1382400,
2872*4882a593Smuzhiyun pbn_b1_2_1382400,
2873*4882a593Smuzhiyun pbn_b1_4_1382400,
2874*4882a593Smuzhiyun pbn_b1_8_1382400,
2875*4882a593Smuzhiyun
2876*4882a593Smuzhiyun pbn_b2_1_115200,
2877*4882a593Smuzhiyun pbn_b2_2_115200,
2878*4882a593Smuzhiyun pbn_b2_4_115200,
2879*4882a593Smuzhiyun pbn_b2_8_115200,
2880*4882a593Smuzhiyun
2881*4882a593Smuzhiyun pbn_b2_1_460800,
2882*4882a593Smuzhiyun pbn_b2_4_460800,
2883*4882a593Smuzhiyun pbn_b2_8_460800,
2884*4882a593Smuzhiyun pbn_b2_16_460800,
2885*4882a593Smuzhiyun
2886*4882a593Smuzhiyun pbn_b2_1_921600,
2887*4882a593Smuzhiyun pbn_b2_4_921600,
2888*4882a593Smuzhiyun pbn_b2_8_921600,
2889*4882a593Smuzhiyun
2890*4882a593Smuzhiyun pbn_b2_8_1152000,
2891*4882a593Smuzhiyun
2892*4882a593Smuzhiyun pbn_b2_bt_1_115200,
2893*4882a593Smuzhiyun pbn_b2_bt_2_115200,
2894*4882a593Smuzhiyun pbn_b2_bt_4_115200,
2895*4882a593Smuzhiyun
2896*4882a593Smuzhiyun pbn_b2_bt_2_921600,
2897*4882a593Smuzhiyun pbn_b2_bt_4_921600,
2898*4882a593Smuzhiyun
2899*4882a593Smuzhiyun pbn_b3_2_115200,
2900*4882a593Smuzhiyun pbn_b3_4_115200,
2901*4882a593Smuzhiyun pbn_b3_8_115200,
2902*4882a593Smuzhiyun
2903*4882a593Smuzhiyun pbn_b4_bt_2_921600,
2904*4882a593Smuzhiyun pbn_b4_bt_4_921600,
2905*4882a593Smuzhiyun pbn_b4_bt_8_921600,
2906*4882a593Smuzhiyun
2907*4882a593Smuzhiyun /*
2908*4882a593Smuzhiyun * Board-specific versions.
2909*4882a593Smuzhiyun */
2910*4882a593Smuzhiyun pbn_panacom,
2911*4882a593Smuzhiyun pbn_panacom2,
2912*4882a593Smuzhiyun pbn_panacom4,
2913*4882a593Smuzhiyun pbn_plx_romulus,
2914*4882a593Smuzhiyun pbn_oxsemi,
2915*4882a593Smuzhiyun pbn_oxsemi_1_3906250,
2916*4882a593Smuzhiyun pbn_oxsemi_2_3906250,
2917*4882a593Smuzhiyun pbn_oxsemi_4_3906250,
2918*4882a593Smuzhiyun pbn_oxsemi_8_3906250,
2919*4882a593Smuzhiyun pbn_intel_i960,
2920*4882a593Smuzhiyun pbn_sgi_ioc3,
2921*4882a593Smuzhiyun pbn_computone_4,
2922*4882a593Smuzhiyun pbn_computone_6,
2923*4882a593Smuzhiyun pbn_computone_8,
2924*4882a593Smuzhiyun pbn_sbsxrsio,
2925*4882a593Smuzhiyun pbn_pasemi_1682M,
2926*4882a593Smuzhiyun pbn_ni8430_2,
2927*4882a593Smuzhiyun pbn_ni8430_4,
2928*4882a593Smuzhiyun pbn_ni8430_8,
2929*4882a593Smuzhiyun pbn_ni8430_16,
2930*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_1_3906250,
2931*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_2_3906250,
2932*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_4_3906250,
2933*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_8_3906250,
2934*4882a593Smuzhiyun pbn_ce4100_1_115200,
2935*4882a593Smuzhiyun pbn_omegapci,
2936*4882a593Smuzhiyun pbn_NETMOS9900_2s_115200,
2937*4882a593Smuzhiyun pbn_brcm_trumanage,
2938*4882a593Smuzhiyun pbn_fintek_4,
2939*4882a593Smuzhiyun pbn_fintek_8,
2940*4882a593Smuzhiyun pbn_fintek_12,
2941*4882a593Smuzhiyun pbn_fintek_F81504A,
2942*4882a593Smuzhiyun pbn_fintek_F81508A,
2943*4882a593Smuzhiyun pbn_fintek_F81512A,
2944*4882a593Smuzhiyun pbn_wch382_2,
2945*4882a593Smuzhiyun pbn_wch384_4,
2946*4882a593Smuzhiyun pbn_wch384_8,
2947*4882a593Smuzhiyun pbn_pericom_PI7C9X7951,
2948*4882a593Smuzhiyun pbn_pericom_PI7C9X7952,
2949*4882a593Smuzhiyun pbn_pericom_PI7C9X7954,
2950*4882a593Smuzhiyun pbn_pericom_PI7C9X7958,
2951*4882a593Smuzhiyun pbn_sunix_pci_1s,
2952*4882a593Smuzhiyun pbn_sunix_pci_2s,
2953*4882a593Smuzhiyun pbn_sunix_pci_4s,
2954*4882a593Smuzhiyun pbn_sunix_pci_8s,
2955*4882a593Smuzhiyun pbn_sunix_pci_16s,
2956*4882a593Smuzhiyun pbn_titan_1_4000000,
2957*4882a593Smuzhiyun pbn_titan_2_4000000,
2958*4882a593Smuzhiyun pbn_titan_4_4000000,
2959*4882a593Smuzhiyun pbn_titan_8_4000000,
2960*4882a593Smuzhiyun pbn_moxa8250_2p,
2961*4882a593Smuzhiyun pbn_moxa8250_4p,
2962*4882a593Smuzhiyun pbn_moxa8250_8p,
2963*4882a593Smuzhiyun };
2964*4882a593Smuzhiyun
2965*4882a593Smuzhiyun /*
2966*4882a593Smuzhiyun * uart_offset - the space between channels
2967*4882a593Smuzhiyun * reg_shift - describes how the UART registers are mapped
2968*4882a593Smuzhiyun * to PCI memory by the card.
2969*4882a593Smuzhiyun * For example IER register on SBS, Inc. PMC-OctPro is located at
2970*4882a593Smuzhiyun * offset 0x10 from the UART base, while UART_IER is defined as 1
2971*4882a593Smuzhiyun * in include/linux/serial_reg.h,
2972*4882a593Smuzhiyun * see first lines of serial_in() and serial_out() in 8250.c
2973*4882a593Smuzhiyun */
2974*4882a593Smuzhiyun
2975*4882a593Smuzhiyun static struct pciserial_board pci_boards[] = {
2976*4882a593Smuzhiyun [pbn_default] = {
2977*4882a593Smuzhiyun .flags = FL_BASE0,
2978*4882a593Smuzhiyun .num_ports = 1,
2979*4882a593Smuzhiyun .base_baud = 115200,
2980*4882a593Smuzhiyun .uart_offset = 8,
2981*4882a593Smuzhiyun },
2982*4882a593Smuzhiyun [pbn_b0_1_115200] = {
2983*4882a593Smuzhiyun .flags = FL_BASE0,
2984*4882a593Smuzhiyun .num_ports = 1,
2985*4882a593Smuzhiyun .base_baud = 115200,
2986*4882a593Smuzhiyun .uart_offset = 8,
2987*4882a593Smuzhiyun },
2988*4882a593Smuzhiyun [pbn_b0_2_115200] = {
2989*4882a593Smuzhiyun .flags = FL_BASE0,
2990*4882a593Smuzhiyun .num_ports = 2,
2991*4882a593Smuzhiyun .base_baud = 115200,
2992*4882a593Smuzhiyun .uart_offset = 8,
2993*4882a593Smuzhiyun },
2994*4882a593Smuzhiyun [pbn_b0_4_115200] = {
2995*4882a593Smuzhiyun .flags = FL_BASE0,
2996*4882a593Smuzhiyun .num_ports = 4,
2997*4882a593Smuzhiyun .base_baud = 115200,
2998*4882a593Smuzhiyun .uart_offset = 8,
2999*4882a593Smuzhiyun },
3000*4882a593Smuzhiyun [pbn_b0_5_115200] = {
3001*4882a593Smuzhiyun .flags = FL_BASE0,
3002*4882a593Smuzhiyun .num_ports = 5,
3003*4882a593Smuzhiyun .base_baud = 115200,
3004*4882a593Smuzhiyun .uart_offset = 8,
3005*4882a593Smuzhiyun },
3006*4882a593Smuzhiyun [pbn_b0_8_115200] = {
3007*4882a593Smuzhiyun .flags = FL_BASE0,
3008*4882a593Smuzhiyun .num_ports = 8,
3009*4882a593Smuzhiyun .base_baud = 115200,
3010*4882a593Smuzhiyun .uart_offset = 8,
3011*4882a593Smuzhiyun },
3012*4882a593Smuzhiyun [pbn_b0_1_921600] = {
3013*4882a593Smuzhiyun .flags = FL_BASE0,
3014*4882a593Smuzhiyun .num_ports = 1,
3015*4882a593Smuzhiyun .base_baud = 921600,
3016*4882a593Smuzhiyun .uart_offset = 8,
3017*4882a593Smuzhiyun },
3018*4882a593Smuzhiyun [pbn_b0_2_921600] = {
3019*4882a593Smuzhiyun .flags = FL_BASE0,
3020*4882a593Smuzhiyun .num_ports = 2,
3021*4882a593Smuzhiyun .base_baud = 921600,
3022*4882a593Smuzhiyun .uart_offset = 8,
3023*4882a593Smuzhiyun },
3024*4882a593Smuzhiyun [pbn_b0_4_921600] = {
3025*4882a593Smuzhiyun .flags = FL_BASE0,
3026*4882a593Smuzhiyun .num_ports = 4,
3027*4882a593Smuzhiyun .base_baud = 921600,
3028*4882a593Smuzhiyun .uart_offset = 8,
3029*4882a593Smuzhiyun },
3030*4882a593Smuzhiyun
3031*4882a593Smuzhiyun [pbn_b0_2_1130000] = {
3032*4882a593Smuzhiyun .flags = FL_BASE0,
3033*4882a593Smuzhiyun .num_ports = 2,
3034*4882a593Smuzhiyun .base_baud = 1130000,
3035*4882a593Smuzhiyun .uart_offset = 8,
3036*4882a593Smuzhiyun },
3037*4882a593Smuzhiyun
3038*4882a593Smuzhiyun [pbn_b0_4_1152000] = {
3039*4882a593Smuzhiyun .flags = FL_BASE0,
3040*4882a593Smuzhiyun .num_ports = 4,
3041*4882a593Smuzhiyun .base_baud = 1152000,
3042*4882a593Smuzhiyun .uart_offset = 8,
3043*4882a593Smuzhiyun },
3044*4882a593Smuzhiyun
3045*4882a593Smuzhiyun [pbn_b0_4_1250000] = {
3046*4882a593Smuzhiyun .flags = FL_BASE0,
3047*4882a593Smuzhiyun .num_ports = 4,
3048*4882a593Smuzhiyun .base_baud = 1250000,
3049*4882a593Smuzhiyun .uart_offset = 8,
3050*4882a593Smuzhiyun },
3051*4882a593Smuzhiyun
3052*4882a593Smuzhiyun [pbn_b0_2_1843200] = {
3053*4882a593Smuzhiyun .flags = FL_BASE0,
3054*4882a593Smuzhiyun .num_ports = 2,
3055*4882a593Smuzhiyun .base_baud = 1843200,
3056*4882a593Smuzhiyun .uart_offset = 8,
3057*4882a593Smuzhiyun },
3058*4882a593Smuzhiyun [pbn_b0_4_1843200] = {
3059*4882a593Smuzhiyun .flags = FL_BASE0,
3060*4882a593Smuzhiyun .num_ports = 4,
3061*4882a593Smuzhiyun .base_baud = 1843200,
3062*4882a593Smuzhiyun .uart_offset = 8,
3063*4882a593Smuzhiyun },
3064*4882a593Smuzhiyun
3065*4882a593Smuzhiyun [pbn_b0_1_3906250] = {
3066*4882a593Smuzhiyun .flags = FL_BASE0,
3067*4882a593Smuzhiyun .num_ports = 1,
3068*4882a593Smuzhiyun .base_baud = 3906250,
3069*4882a593Smuzhiyun .uart_offset = 8,
3070*4882a593Smuzhiyun },
3071*4882a593Smuzhiyun
3072*4882a593Smuzhiyun [pbn_b0_bt_1_115200] = {
3073*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3074*4882a593Smuzhiyun .num_ports = 1,
3075*4882a593Smuzhiyun .base_baud = 115200,
3076*4882a593Smuzhiyun .uart_offset = 8,
3077*4882a593Smuzhiyun },
3078*4882a593Smuzhiyun [pbn_b0_bt_2_115200] = {
3079*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3080*4882a593Smuzhiyun .num_ports = 2,
3081*4882a593Smuzhiyun .base_baud = 115200,
3082*4882a593Smuzhiyun .uart_offset = 8,
3083*4882a593Smuzhiyun },
3084*4882a593Smuzhiyun [pbn_b0_bt_4_115200] = {
3085*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3086*4882a593Smuzhiyun .num_ports = 4,
3087*4882a593Smuzhiyun .base_baud = 115200,
3088*4882a593Smuzhiyun .uart_offset = 8,
3089*4882a593Smuzhiyun },
3090*4882a593Smuzhiyun [pbn_b0_bt_8_115200] = {
3091*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3092*4882a593Smuzhiyun .num_ports = 8,
3093*4882a593Smuzhiyun .base_baud = 115200,
3094*4882a593Smuzhiyun .uart_offset = 8,
3095*4882a593Smuzhiyun },
3096*4882a593Smuzhiyun
3097*4882a593Smuzhiyun [pbn_b0_bt_1_460800] = {
3098*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3099*4882a593Smuzhiyun .num_ports = 1,
3100*4882a593Smuzhiyun .base_baud = 460800,
3101*4882a593Smuzhiyun .uart_offset = 8,
3102*4882a593Smuzhiyun },
3103*4882a593Smuzhiyun [pbn_b0_bt_2_460800] = {
3104*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3105*4882a593Smuzhiyun .num_ports = 2,
3106*4882a593Smuzhiyun .base_baud = 460800,
3107*4882a593Smuzhiyun .uart_offset = 8,
3108*4882a593Smuzhiyun },
3109*4882a593Smuzhiyun [pbn_b0_bt_4_460800] = {
3110*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3111*4882a593Smuzhiyun .num_ports = 4,
3112*4882a593Smuzhiyun .base_baud = 460800,
3113*4882a593Smuzhiyun .uart_offset = 8,
3114*4882a593Smuzhiyun },
3115*4882a593Smuzhiyun
3116*4882a593Smuzhiyun [pbn_b0_bt_1_921600] = {
3117*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3118*4882a593Smuzhiyun .num_ports = 1,
3119*4882a593Smuzhiyun .base_baud = 921600,
3120*4882a593Smuzhiyun .uart_offset = 8,
3121*4882a593Smuzhiyun },
3122*4882a593Smuzhiyun [pbn_b0_bt_2_921600] = {
3123*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3124*4882a593Smuzhiyun .num_ports = 2,
3125*4882a593Smuzhiyun .base_baud = 921600,
3126*4882a593Smuzhiyun .uart_offset = 8,
3127*4882a593Smuzhiyun },
3128*4882a593Smuzhiyun [pbn_b0_bt_4_921600] = {
3129*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3130*4882a593Smuzhiyun .num_ports = 4,
3131*4882a593Smuzhiyun .base_baud = 921600,
3132*4882a593Smuzhiyun .uart_offset = 8,
3133*4882a593Smuzhiyun },
3134*4882a593Smuzhiyun [pbn_b0_bt_8_921600] = {
3135*4882a593Smuzhiyun .flags = FL_BASE0|FL_BASE_BARS,
3136*4882a593Smuzhiyun .num_ports = 8,
3137*4882a593Smuzhiyun .base_baud = 921600,
3138*4882a593Smuzhiyun .uart_offset = 8,
3139*4882a593Smuzhiyun },
3140*4882a593Smuzhiyun
3141*4882a593Smuzhiyun [pbn_b1_1_115200] = {
3142*4882a593Smuzhiyun .flags = FL_BASE1,
3143*4882a593Smuzhiyun .num_ports = 1,
3144*4882a593Smuzhiyun .base_baud = 115200,
3145*4882a593Smuzhiyun .uart_offset = 8,
3146*4882a593Smuzhiyun },
3147*4882a593Smuzhiyun [pbn_b1_2_115200] = {
3148*4882a593Smuzhiyun .flags = FL_BASE1,
3149*4882a593Smuzhiyun .num_ports = 2,
3150*4882a593Smuzhiyun .base_baud = 115200,
3151*4882a593Smuzhiyun .uart_offset = 8,
3152*4882a593Smuzhiyun },
3153*4882a593Smuzhiyun [pbn_b1_4_115200] = {
3154*4882a593Smuzhiyun .flags = FL_BASE1,
3155*4882a593Smuzhiyun .num_ports = 4,
3156*4882a593Smuzhiyun .base_baud = 115200,
3157*4882a593Smuzhiyun .uart_offset = 8,
3158*4882a593Smuzhiyun },
3159*4882a593Smuzhiyun [pbn_b1_8_115200] = {
3160*4882a593Smuzhiyun .flags = FL_BASE1,
3161*4882a593Smuzhiyun .num_ports = 8,
3162*4882a593Smuzhiyun .base_baud = 115200,
3163*4882a593Smuzhiyun .uart_offset = 8,
3164*4882a593Smuzhiyun },
3165*4882a593Smuzhiyun [pbn_b1_16_115200] = {
3166*4882a593Smuzhiyun .flags = FL_BASE1,
3167*4882a593Smuzhiyun .num_ports = 16,
3168*4882a593Smuzhiyun .base_baud = 115200,
3169*4882a593Smuzhiyun .uart_offset = 8,
3170*4882a593Smuzhiyun },
3171*4882a593Smuzhiyun
3172*4882a593Smuzhiyun [pbn_b1_1_921600] = {
3173*4882a593Smuzhiyun .flags = FL_BASE1,
3174*4882a593Smuzhiyun .num_ports = 1,
3175*4882a593Smuzhiyun .base_baud = 921600,
3176*4882a593Smuzhiyun .uart_offset = 8,
3177*4882a593Smuzhiyun },
3178*4882a593Smuzhiyun [pbn_b1_2_921600] = {
3179*4882a593Smuzhiyun .flags = FL_BASE1,
3180*4882a593Smuzhiyun .num_ports = 2,
3181*4882a593Smuzhiyun .base_baud = 921600,
3182*4882a593Smuzhiyun .uart_offset = 8,
3183*4882a593Smuzhiyun },
3184*4882a593Smuzhiyun [pbn_b1_4_921600] = {
3185*4882a593Smuzhiyun .flags = FL_BASE1,
3186*4882a593Smuzhiyun .num_ports = 4,
3187*4882a593Smuzhiyun .base_baud = 921600,
3188*4882a593Smuzhiyun .uart_offset = 8,
3189*4882a593Smuzhiyun },
3190*4882a593Smuzhiyun [pbn_b1_8_921600] = {
3191*4882a593Smuzhiyun .flags = FL_BASE1,
3192*4882a593Smuzhiyun .num_ports = 8,
3193*4882a593Smuzhiyun .base_baud = 921600,
3194*4882a593Smuzhiyun .uart_offset = 8,
3195*4882a593Smuzhiyun },
3196*4882a593Smuzhiyun [pbn_b1_2_1250000] = {
3197*4882a593Smuzhiyun .flags = FL_BASE1,
3198*4882a593Smuzhiyun .num_ports = 2,
3199*4882a593Smuzhiyun .base_baud = 1250000,
3200*4882a593Smuzhiyun .uart_offset = 8,
3201*4882a593Smuzhiyun },
3202*4882a593Smuzhiyun
3203*4882a593Smuzhiyun [pbn_b1_bt_1_115200] = {
3204*4882a593Smuzhiyun .flags = FL_BASE1|FL_BASE_BARS,
3205*4882a593Smuzhiyun .num_ports = 1,
3206*4882a593Smuzhiyun .base_baud = 115200,
3207*4882a593Smuzhiyun .uart_offset = 8,
3208*4882a593Smuzhiyun },
3209*4882a593Smuzhiyun [pbn_b1_bt_2_115200] = {
3210*4882a593Smuzhiyun .flags = FL_BASE1|FL_BASE_BARS,
3211*4882a593Smuzhiyun .num_ports = 2,
3212*4882a593Smuzhiyun .base_baud = 115200,
3213*4882a593Smuzhiyun .uart_offset = 8,
3214*4882a593Smuzhiyun },
3215*4882a593Smuzhiyun [pbn_b1_bt_4_115200] = {
3216*4882a593Smuzhiyun .flags = FL_BASE1|FL_BASE_BARS,
3217*4882a593Smuzhiyun .num_ports = 4,
3218*4882a593Smuzhiyun .base_baud = 115200,
3219*4882a593Smuzhiyun .uart_offset = 8,
3220*4882a593Smuzhiyun },
3221*4882a593Smuzhiyun
3222*4882a593Smuzhiyun [pbn_b1_bt_2_921600] = {
3223*4882a593Smuzhiyun .flags = FL_BASE1|FL_BASE_BARS,
3224*4882a593Smuzhiyun .num_ports = 2,
3225*4882a593Smuzhiyun .base_baud = 921600,
3226*4882a593Smuzhiyun .uart_offset = 8,
3227*4882a593Smuzhiyun },
3228*4882a593Smuzhiyun
3229*4882a593Smuzhiyun [pbn_b1_1_1382400] = {
3230*4882a593Smuzhiyun .flags = FL_BASE1,
3231*4882a593Smuzhiyun .num_ports = 1,
3232*4882a593Smuzhiyun .base_baud = 1382400,
3233*4882a593Smuzhiyun .uart_offset = 8,
3234*4882a593Smuzhiyun },
3235*4882a593Smuzhiyun [pbn_b1_2_1382400] = {
3236*4882a593Smuzhiyun .flags = FL_BASE1,
3237*4882a593Smuzhiyun .num_ports = 2,
3238*4882a593Smuzhiyun .base_baud = 1382400,
3239*4882a593Smuzhiyun .uart_offset = 8,
3240*4882a593Smuzhiyun },
3241*4882a593Smuzhiyun [pbn_b1_4_1382400] = {
3242*4882a593Smuzhiyun .flags = FL_BASE1,
3243*4882a593Smuzhiyun .num_ports = 4,
3244*4882a593Smuzhiyun .base_baud = 1382400,
3245*4882a593Smuzhiyun .uart_offset = 8,
3246*4882a593Smuzhiyun },
3247*4882a593Smuzhiyun [pbn_b1_8_1382400] = {
3248*4882a593Smuzhiyun .flags = FL_BASE1,
3249*4882a593Smuzhiyun .num_ports = 8,
3250*4882a593Smuzhiyun .base_baud = 1382400,
3251*4882a593Smuzhiyun .uart_offset = 8,
3252*4882a593Smuzhiyun },
3253*4882a593Smuzhiyun
3254*4882a593Smuzhiyun [pbn_b2_1_115200] = {
3255*4882a593Smuzhiyun .flags = FL_BASE2,
3256*4882a593Smuzhiyun .num_ports = 1,
3257*4882a593Smuzhiyun .base_baud = 115200,
3258*4882a593Smuzhiyun .uart_offset = 8,
3259*4882a593Smuzhiyun },
3260*4882a593Smuzhiyun [pbn_b2_2_115200] = {
3261*4882a593Smuzhiyun .flags = FL_BASE2,
3262*4882a593Smuzhiyun .num_ports = 2,
3263*4882a593Smuzhiyun .base_baud = 115200,
3264*4882a593Smuzhiyun .uart_offset = 8,
3265*4882a593Smuzhiyun },
3266*4882a593Smuzhiyun [pbn_b2_4_115200] = {
3267*4882a593Smuzhiyun .flags = FL_BASE2,
3268*4882a593Smuzhiyun .num_ports = 4,
3269*4882a593Smuzhiyun .base_baud = 115200,
3270*4882a593Smuzhiyun .uart_offset = 8,
3271*4882a593Smuzhiyun },
3272*4882a593Smuzhiyun [pbn_b2_8_115200] = {
3273*4882a593Smuzhiyun .flags = FL_BASE2,
3274*4882a593Smuzhiyun .num_ports = 8,
3275*4882a593Smuzhiyun .base_baud = 115200,
3276*4882a593Smuzhiyun .uart_offset = 8,
3277*4882a593Smuzhiyun },
3278*4882a593Smuzhiyun
3279*4882a593Smuzhiyun [pbn_b2_1_460800] = {
3280*4882a593Smuzhiyun .flags = FL_BASE2,
3281*4882a593Smuzhiyun .num_ports = 1,
3282*4882a593Smuzhiyun .base_baud = 460800,
3283*4882a593Smuzhiyun .uart_offset = 8,
3284*4882a593Smuzhiyun },
3285*4882a593Smuzhiyun [pbn_b2_4_460800] = {
3286*4882a593Smuzhiyun .flags = FL_BASE2,
3287*4882a593Smuzhiyun .num_ports = 4,
3288*4882a593Smuzhiyun .base_baud = 460800,
3289*4882a593Smuzhiyun .uart_offset = 8,
3290*4882a593Smuzhiyun },
3291*4882a593Smuzhiyun [pbn_b2_8_460800] = {
3292*4882a593Smuzhiyun .flags = FL_BASE2,
3293*4882a593Smuzhiyun .num_ports = 8,
3294*4882a593Smuzhiyun .base_baud = 460800,
3295*4882a593Smuzhiyun .uart_offset = 8,
3296*4882a593Smuzhiyun },
3297*4882a593Smuzhiyun [pbn_b2_16_460800] = {
3298*4882a593Smuzhiyun .flags = FL_BASE2,
3299*4882a593Smuzhiyun .num_ports = 16,
3300*4882a593Smuzhiyun .base_baud = 460800,
3301*4882a593Smuzhiyun .uart_offset = 8,
3302*4882a593Smuzhiyun },
3303*4882a593Smuzhiyun
3304*4882a593Smuzhiyun [pbn_b2_1_921600] = {
3305*4882a593Smuzhiyun .flags = FL_BASE2,
3306*4882a593Smuzhiyun .num_ports = 1,
3307*4882a593Smuzhiyun .base_baud = 921600,
3308*4882a593Smuzhiyun .uart_offset = 8,
3309*4882a593Smuzhiyun },
3310*4882a593Smuzhiyun [pbn_b2_4_921600] = {
3311*4882a593Smuzhiyun .flags = FL_BASE2,
3312*4882a593Smuzhiyun .num_ports = 4,
3313*4882a593Smuzhiyun .base_baud = 921600,
3314*4882a593Smuzhiyun .uart_offset = 8,
3315*4882a593Smuzhiyun },
3316*4882a593Smuzhiyun [pbn_b2_8_921600] = {
3317*4882a593Smuzhiyun .flags = FL_BASE2,
3318*4882a593Smuzhiyun .num_ports = 8,
3319*4882a593Smuzhiyun .base_baud = 921600,
3320*4882a593Smuzhiyun .uart_offset = 8,
3321*4882a593Smuzhiyun },
3322*4882a593Smuzhiyun
3323*4882a593Smuzhiyun [pbn_b2_8_1152000] = {
3324*4882a593Smuzhiyun .flags = FL_BASE2,
3325*4882a593Smuzhiyun .num_ports = 8,
3326*4882a593Smuzhiyun .base_baud = 1152000,
3327*4882a593Smuzhiyun .uart_offset = 8,
3328*4882a593Smuzhiyun },
3329*4882a593Smuzhiyun
3330*4882a593Smuzhiyun [pbn_b2_bt_1_115200] = {
3331*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3332*4882a593Smuzhiyun .num_ports = 1,
3333*4882a593Smuzhiyun .base_baud = 115200,
3334*4882a593Smuzhiyun .uart_offset = 8,
3335*4882a593Smuzhiyun },
3336*4882a593Smuzhiyun [pbn_b2_bt_2_115200] = {
3337*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3338*4882a593Smuzhiyun .num_ports = 2,
3339*4882a593Smuzhiyun .base_baud = 115200,
3340*4882a593Smuzhiyun .uart_offset = 8,
3341*4882a593Smuzhiyun },
3342*4882a593Smuzhiyun [pbn_b2_bt_4_115200] = {
3343*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3344*4882a593Smuzhiyun .num_ports = 4,
3345*4882a593Smuzhiyun .base_baud = 115200,
3346*4882a593Smuzhiyun .uart_offset = 8,
3347*4882a593Smuzhiyun },
3348*4882a593Smuzhiyun
3349*4882a593Smuzhiyun [pbn_b2_bt_2_921600] = {
3350*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3351*4882a593Smuzhiyun .num_ports = 2,
3352*4882a593Smuzhiyun .base_baud = 921600,
3353*4882a593Smuzhiyun .uart_offset = 8,
3354*4882a593Smuzhiyun },
3355*4882a593Smuzhiyun [pbn_b2_bt_4_921600] = {
3356*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3357*4882a593Smuzhiyun .num_ports = 4,
3358*4882a593Smuzhiyun .base_baud = 921600,
3359*4882a593Smuzhiyun .uart_offset = 8,
3360*4882a593Smuzhiyun },
3361*4882a593Smuzhiyun
3362*4882a593Smuzhiyun [pbn_b3_2_115200] = {
3363*4882a593Smuzhiyun .flags = FL_BASE3,
3364*4882a593Smuzhiyun .num_ports = 2,
3365*4882a593Smuzhiyun .base_baud = 115200,
3366*4882a593Smuzhiyun .uart_offset = 8,
3367*4882a593Smuzhiyun },
3368*4882a593Smuzhiyun [pbn_b3_4_115200] = {
3369*4882a593Smuzhiyun .flags = FL_BASE3,
3370*4882a593Smuzhiyun .num_ports = 4,
3371*4882a593Smuzhiyun .base_baud = 115200,
3372*4882a593Smuzhiyun .uart_offset = 8,
3373*4882a593Smuzhiyun },
3374*4882a593Smuzhiyun [pbn_b3_8_115200] = {
3375*4882a593Smuzhiyun .flags = FL_BASE3,
3376*4882a593Smuzhiyun .num_ports = 8,
3377*4882a593Smuzhiyun .base_baud = 115200,
3378*4882a593Smuzhiyun .uart_offset = 8,
3379*4882a593Smuzhiyun },
3380*4882a593Smuzhiyun
3381*4882a593Smuzhiyun [pbn_b4_bt_2_921600] = {
3382*4882a593Smuzhiyun .flags = FL_BASE4,
3383*4882a593Smuzhiyun .num_ports = 2,
3384*4882a593Smuzhiyun .base_baud = 921600,
3385*4882a593Smuzhiyun .uart_offset = 8,
3386*4882a593Smuzhiyun },
3387*4882a593Smuzhiyun [pbn_b4_bt_4_921600] = {
3388*4882a593Smuzhiyun .flags = FL_BASE4,
3389*4882a593Smuzhiyun .num_ports = 4,
3390*4882a593Smuzhiyun .base_baud = 921600,
3391*4882a593Smuzhiyun .uart_offset = 8,
3392*4882a593Smuzhiyun },
3393*4882a593Smuzhiyun [pbn_b4_bt_8_921600] = {
3394*4882a593Smuzhiyun .flags = FL_BASE4,
3395*4882a593Smuzhiyun .num_ports = 8,
3396*4882a593Smuzhiyun .base_baud = 921600,
3397*4882a593Smuzhiyun .uart_offset = 8,
3398*4882a593Smuzhiyun },
3399*4882a593Smuzhiyun
3400*4882a593Smuzhiyun /*
3401*4882a593Smuzhiyun * Entries following this are board-specific.
3402*4882a593Smuzhiyun */
3403*4882a593Smuzhiyun
3404*4882a593Smuzhiyun /*
3405*4882a593Smuzhiyun * Panacom - IOMEM
3406*4882a593Smuzhiyun */
3407*4882a593Smuzhiyun [pbn_panacom] = {
3408*4882a593Smuzhiyun .flags = FL_BASE2,
3409*4882a593Smuzhiyun .num_ports = 2,
3410*4882a593Smuzhiyun .base_baud = 921600,
3411*4882a593Smuzhiyun .uart_offset = 0x400,
3412*4882a593Smuzhiyun .reg_shift = 7,
3413*4882a593Smuzhiyun },
3414*4882a593Smuzhiyun [pbn_panacom2] = {
3415*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3416*4882a593Smuzhiyun .num_ports = 2,
3417*4882a593Smuzhiyun .base_baud = 921600,
3418*4882a593Smuzhiyun .uart_offset = 0x400,
3419*4882a593Smuzhiyun .reg_shift = 7,
3420*4882a593Smuzhiyun },
3421*4882a593Smuzhiyun [pbn_panacom4] = {
3422*4882a593Smuzhiyun .flags = FL_BASE2|FL_BASE_BARS,
3423*4882a593Smuzhiyun .num_ports = 4,
3424*4882a593Smuzhiyun .base_baud = 921600,
3425*4882a593Smuzhiyun .uart_offset = 0x400,
3426*4882a593Smuzhiyun .reg_shift = 7,
3427*4882a593Smuzhiyun },
3428*4882a593Smuzhiyun
3429*4882a593Smuzhiyun /* I think this entry is broken - the first_offset looks wrong --rmk */
3430*4882a593Smuzhiyun [pbn_plx_romulus] = {
3431*4882a593Smuzhiyun .flags = FL_BASE2,
3432*4882a593Smuzhiyun .num_ports = 4,
3433*4882a593Smuzhiyun .base_baud = 921600,
3434*4882a593Smuzhiyun .uart_offset = 8 << 2,
3435*4882a593Smuzhiyun .reg_shift = 2,
3436*4882a593Smuzhiyun .first_offset = 0x03,
3437*4882a593Smuzhiyun },
3438*4882a593Smuzhiyun
3439*4882a593Smuzhiyun /*
3440*4882a593Smuzhiyun * This board uses the size of PCI Base region 0 to
3441*4882a593Smuzhiyun * signal now many ports are available
3442*4882a593Smuzhiyun */
3443*4882a593Smuzhiyun [pbn_oxsemi] = {
3444*4882a593Smuzhiyun .flags = FL_BASE0|FL_REGION_SZ_CAP,
3445*4882a593Smuzhiyun .num_ports = 32,
3446*4882a593Smuzhiyun .base_baud = 115200,
3447*4882a593Smuzhiyun .uart_offset = 8,
3448*4882a593Smuzhiyun },
3449*4882a593Smuzhiyun [pbn_oxsemi_1_3906250] = {
3450*4882a593Smuzhiyun .flags = FL_BASE0,
3451*4882a593Smuzhiyun .num_ports = 1,
3452*4882a593Smuzhiyun .base_baud = 3906250,
3453*4882a593Smuzhiyun .uart_offset = 0x200,
3454*4882a593Smuzhiyun .first_offset = 0x1000,
3455*4882a593Smuzhiyun },
3456*4882a593Smuzhiyun [pbn_oxsemi_2_3906250] = {
3457*4882a593Smuzhiyun .flags = FL_BASE0,
3458*4882a593Smuzhiyun .num_ports = 2,
3459*4882a593Smuzhiyun .base_baud = 3906250,
3460*4882a593Smuzhiyun .uart_offset = 0x200,
3461*4882a593Smuzhiyun .first_offset = 0x1000,
3462*4882a593Smuzhiyun },
3463*4882a593Smuzhiyun [pbn_oxsemi_4_3906250] = {
3464*4882a593Smuzhiyun .flags = FL_BASE0,
3465*4882a593Smuzhiyun .num_ports = 4,
3466*4882a593Smuzhiyun .base_baud = 3906250,
3467*4882a593Smuzhiyun .uart_offset = 0x200,
3468*4882a593Smuzhiyun .first_offset = 0x1000,
3469*4882a593Smuzhiyun },
3470*4882a593Smuzhiyun [pbn_oxsemi_8_3906250] = {
3471*4882a593Smuzhiyun .flags = FL_BASE0,
3472*4882a593Smuzhiyun .num_ports = 8,
3473*4882a593Smuzhiyun .base_baud = 3906250,
3474*4882a593Smuzhiyun .uart_offset = 0x200,
3475*4882a593Smuzhiyun .first_offset = 0x1000,
3476*4882a593Smuzhiyun },
3477*4882a593Smuzhiyun
3478*4882a593Smuzhiyun
3479*4882a593Smuzhiyun /*
3480*4882a593Smuzhiyun * EKF addition for i960 Boards form EKF with serial port.
3481*4882a593Smuzhiyun * Max 256 ports.
3482*4882a593Smuzhiyun */
3483*4882a593Smuzhiyun [pbn_intel_i960] = {
3484*4882a593Smuzhiyun .flags = FL_BASE0,
3485*4882a593Smuzhiyun .num_ports = 32,
3486*4882a593Smuzhiyun .base_baud = 921600,
3487*4882a593Smuzhiyun .uart_offset = 8 << 2,
3488*4882a593Smuzhiyun .reg_shift = 2,
3489*4882a593Smuzhiyun .first_offset = 0x10000,
3490*4882a593Smuzhiyun },
3491*4882a593Smuzhiyun [pbn_sgi_ioc3] = {
3492*4882a593Smuzhiyun .flags = FL_BASE0|FL_NOIRQ,
3493*4882a593Smuzhiyun .num_ports = 1,
3494*4882a593Smuzhiyun .base_baud = 458333,
3495*4882a593Smuzhiyun .uart_offset = 8,
3496*4882a593Smuzhiyun .reg_shift = 0,
3497*4882a593Smuzhiyun .first_offset = 0x20178,
3498*4882a593Smuzhiyun },
3499*4882a593Smuzhiyun
3500*4882a593Smuzhiyun /*
3501*4882a593Smuzhiyun * Computone - uses IOMEM.
3502*4882a593Smuzhiyun */
3503*4882a593Smuzhiyun [pbn_computone_4] = {
3504*4882a593Smuzhiyun .flags = FL_BASE0,
3505*4882a593Smuzhiyun .num_ports = 4,
3506*4882a593Smuzhiyun .base_baud = 921600,
3507*4882a593Smuzhiyun .uart_offset = 0x40,
3508*4882a593Smuzhiyun .reg_shift = 2,
3509*4882a593Smuzhiyun .first_offset = 0x200,
3510*4882a593Smuzhiyun },
3511*4882a593Smuzhiyun [pbn_computone_6] = {
3512*4882a593Smuzhiyun .flags = FL_BASE0,
3513*4882a593Smuzhiyun .num_ports = 6,
3514*4882a593Smuzhiyun .base_baud = 921600,
3515*4882a593Smuzhiyun .uart_offset = 0x40,
3516*4882a593Smuzhiyun .reg_shift = 2,
3517*4882a593Smuzhiyun .first_offset = 0x200,
3518*4882a593Smuzhiyun },
3519*4882a593Smuzhiyun [pbn_computone_8] = {
3520*4882a593Smuzhiyun .flags = FL_BASE0,
3521*4882a593Smuzhiyun .num_ports = 8,
3522*4882a593Smuzhiyun .base_baud = 921600,
3523*4882a593Smuzhiyun .uart_offset = 0x40,
3524*4882a593Smuzhiyun .reg_shift = 2,
3525*4882a593Smuzhiyun .first_offset = 0x200,
3526*4882a593Smuzhiyun },
3527*4882a593Smuzhiyun [pbn_sbsxrsio] = {
3528*4882a593Smuzhiyun .flags = FL_BASE0,
3529*4882a593Smuzhiyun .num_ports = 8,
3530*4882a593Smuzhiyun .base_baud = 460800,
3531*4882a593Smuzhiyun .uart_offset = 256,
3532*4882a593Smuzhiyun .reg_shift = 4,
3533*4882a593Smuzhiyun },
3534*4882a593Smuzhiyun /*
3535*4882a593Smuzhiyun * PA Semi PWRficient PA6T-1682M on-chip UART
3536*4882a593Smuzhiyun */
3537*4882a593Smuzhiyun [pbn_pasemi_1682M] = {
3538*4882a593Smuzhiyun .flags = FL_BASE0,
3539*4882a593Smuzhiyun .num_ports = 1,
3540*4882a593Smuzhiyun .base_baud = 8333333,
3541*4882a593Smuzhiyun },
3542*4882a593Smuzhiyun /*
3543*4882a593Smuzhiyun * National Instruments 843x
3544*4882a593Smuzhiyun */
3545*4882a593Smuzhiyun [pbn_ni8430_16] = {
3546*4882a593Smuzhiyun .flags = FL_BASE0,
3547*4882a593Smuzhiyun .num_ports = 16,
3548*4882a593Smuzhiyun .base_baud = 3686400,
3549*4882a593Smuzhiyun .uart_offset = 0x10,
3550*4882a593Smuzhiyun .first_offset = 0x800,
3551*4882a593Smuzhiyun },
3552*4882a593Smuzhiyun [pbn_ni8430_8] = {
3553*4882a593Smuzhiyun .flags = FL_BASE0,
3554*4882a593Smuzhiyun .num_ports = 8,
3555*4882a593Smuzhiyun .base_baud = 3686400,
3556*4882a593Smuzhiyun .uart_offset = 0x10,
3557*4882a593Smuzhiyun .first_offset = 0x800,
3558*4882a593Smuzhiyun },
3559*4882a593Smuzhiyun [pbn_ni8430_4] = {
3560*4882a593Smuzhiyun .flags = FL_BASE0,
3561*4882a593Smuzhiyun .num_ports = 4,
3562*4882a593Smuzhiyun .base_baud = 3686400,
3563*4882a593Smuzhiyun .uart_offset = 0x10,
3564*4882a593Smuzhiyun .first_offset = 0x800,
3565*4882a593Smuzhiyun },
3566*4882a593Smuzhiyun [pbn_ni8430_2] = {
3567*4882a593Smuzhiyun .flags = FL_BASE0,
3568*4882a593Smuzhiyun .num_ports = 2,
3569*4882a593Smuzhiyun .base_baud = 3686400,
3570*4882a593Smuzhiyun .uart_offset = 0x10,
3571*4882a593Smuzhiyun .first_offset = 0x800,
3572*4882a593Smuzhiyun },
3573*4882a593Smuzhiyun /*
3574*4882a593Smuzhiyun * ADDI-DATA GmbH PCI-Express communication cards <info@addi-data.com>
3575*4882a593Smuzhiyun */
3576*4882a593Smuzhiyun [pbn_ADDIDATA_PCIe_1_3906250] = {
3577*4882a593Smuzhiyun .flags = FL_BASE0,
3578*4882a593Smuzhiyun .num_ports = 1,
3579*4882a593Smuzhiyun .base_baud = 3906250,
3580*4882a593Smuzhiyun .uart_offset = 0x200,
3581*4882a593Smuzhiyun .first_offset = 0x1000,
3582*4882a593Smuzhiyun },
3583*4882a593Smuzhiyun [pbn_ADDIDATA_PCIe_2_3906250] = {
3584*4882a593Smuzhiyun .flags = FL_BASE0,
3585*4882a593Smuzhiyun .num_ports = 2,
3586*4882a593Smuzhiyun .base_baud = 3906250,
3587*4882a593Smuzhiyun .uart_offset = 0x200,
3588*4882a593Smuzhiyun .first_offset = 0x1000,
3589*4882a593Smuzhiyun },
3590*4882a593Smuzhiyun [pbn_ADDIDATA_PCIe_4_3906250] = {
3591*4882a593Smuzhiyun .flags = FL_BASE0,
3592*4882a593Smuzhiyun .num_ports = 4,
3593*4882a593Smuzhiyun .base_baud = 3906250,
3594*4882a593Smuzhiyun .uart_offset = 0x200,
3595*4882a593Smuzhiyun .first_offset = 0x1000,
3596*4882a593Smuzhiyun },
3597*4882a593Smuzhiyun [pbn_ADDIDATA_PCIe_8_3906250] = {
3598*4882a593Smuzhiyun .flags = FL_BASE0,
3599*4882a593Smuzhiyun .num_ports = 8,
3600*4882a593Smuzhiyun .base_baud = 3906250,
3601*4882a593Smuzhiyun .uart_offset = 0x200,
3602*4882a593Smuzhiyun .first_offset = 0x1000,
3603*4882a593Smuzhiyun },
3604*4882a593Smuzhiyun [pbn_ce4100_1_115200] = {
3605*4882a593Smuzhiyun .flags = FL_BASE_BARS,
3606*4882a593Smuzhiyun .num_ports = 2,
3607*4882a593Smuzhiyun .base_baud = 921600,
3608*4882a593Smuzhiyun .reg_shift = 2,
3609*4882a593Smuzhiyun },
3610*4882a593Smuzhiyun [pbn_omegapci] = {
3611*4882a593Smuzhiyun .flags = FL_BASE0,
3612*4882a593Smuzhiyun .num_ports = 8,
3613*4882a593Smuzhiyun .base_baud = 115200,
3614*4882a593Smuzhiyun .uart_offset = 0x200,
3615*4882a593Smuzhiyun },
3616*4882a593Smuzhiyun [pbn_NETMOS9900_2s_115200] = {
3617*4882a593Smuzhiyun .flags = FL_BASE0,
3618*4882a593Smuzhiyun .num_ports = 2,
3619*4882a593Smuzhiyun .base_baud = 115200,
3620*4882a593Smuzhiyun },
3621*4882a593Smuzhiyun [pbn_brcm_trumanage] = {
3622*4882a593Smuzhiyun .flags = FL_BASE0,
3623*4882a593Smuzhiyun .num_ports = 1,
3624*4882a593Smuzhiyun .reg_shift = 2,
3625*4882a593Smuzhiyun .base_baud = 115200,
3626*4882a593Smuzhiyun },
3627*4882a593Smuzhiyun [pbn_fintek_4] = {
3628*4882a593Smuzhiyun .num_ports = 4,
3629*4882a593Smuzhiyun .uart_offset = 8,
3630*4882a593Smuzhiyun .base_baud = 115200,
3631*4882a593Smuzhiyun .first_offset = 0x40,
3632*4882a593Smuzhiyun },
3633*4882a593Smuzhiyun [pbn_fintek_8] = {
3634*4882a593Smuzhiyun .num_ports = 8,
3635*4882a593Smuzhiyun .uart_offset = 8,
3636*4882a593Smuzhiyun .base_baud = 115200,
3637*4882a593Smuzhiyun .first_offset = 0x40,
3638*4882a593Smuzhiyun },
3639*4882a593Smuzhiyun [pbn_fintek_12] = {
3640*4882a593Smuzhiyun .num_ports = 12,
3641*4882a593Smuzhiyun .uart_offset = 8,
3642*4882a593Smuzhiyun .base_baud = 115200,
3643*4882a593Smuzhiyun .first_offset = 0x40,
3644*4882a593Smuzhiyun },
3645*4882a593Smuzhiyun [pbn_fintek_F81504A] = {
3646*4882a593Smuzhiyun .num_ports = 4,
3647*4882a593Smuzhiyun .uart_offset = 8,
3648*4882a593Smuzhiyun .base_baud = 115200,
3649*4882a593Smuzhiyun },
3650*4882a593Smuzhiyun [pbn_fintek_F81508A] = {
3651*4882a593Smuzhiyun .num_ports = 8,
3652*4882a593Smuzhiyun .uart_offset = 8,
3653*4882a593Smuzhiyun .base_baud = 115200,
3654*4882a593Smuzhiyun },
3655*4882a593Smuzhiyun [pbn_fintek_F81512A] = {
3656*4882a593Smuzhiyun .num_ports = 12,
3657*4882a593Smuzhiyun .uart_offset = 8,
3658*4882a593Smuzhiyun .base_baud = 115200,
3659*4882a593Smuzhiyun },
3660*4882a593Smuzhiyun [pbn_wch382_2] = {
3661*4882a593Smuzhiyun .flags = FL_BASE0,
3662*4882a593Smuzhiyun .num_ports = 2,
3663*4882a593Smuzhiyun .base_baud = 115200,
3664*4882a593Smuzhiyun .uart_offset = 8,
3665*4882a593Smuzhiyun .first_offset = 0xC0,
3666*4882a593Smuzhiyun },
3667*4882a593Smuzhiyun [pbn_wch384_4] = {
3668*4882a593Smuzhiyun .flags = FL_BASE0,
3669*4882a593Smuzhiyun .num_ports = 4,
3670*4882a593Smuzhiyun .base_baud = 115200,
3671*4882a593Smuzhiyun .uart_offset = 8,
3672*4882a593Smuzhiyun .first_offset = 0xC0,
3673*4882a593Smuzhiyun },
3674*4882a593Smuzhiyun [pbn_wch384_8] = {
3675*4882a593Smuzhiyun .flags = FL_BASE0,
3676*4882a593Smuzhiyun .num_ports = 8,
3677*4882a593Smuzhiyun .base_baud = 115200,
3678*4882a593Smuzhiyun .uart_offset = 8,
3679*4882a593Smuzhiyun .first_offset = 0x00,
3680*4882a593Smuzhiyun },
3681*4882a593Smuzhiyun /*
3682*4882a593Smuzhiyun * Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART
3683*4882a593Smuzhiyun */
3684*4882a593Smuzhiyun [pbn_pericom_PI7C9X7951] = {
3685*4882a593Smuzhiyun .flags = FL_BASE0,
3686*4882a593Smuzhiyun .num_ports = 1,
3687*4882a593Smuzhiyun .base_baud = 921600,
3688*4882a593Smuzhiyun .uart_offset = 0x8,
3689*4882a593Smuzhiyun },
3690*4882a593Smuzhiyun [pbn_pericom_PI7C9X7952] = {
3691*4882a593Smuzhiyun .flags = FL_BASE0,
3692*4882a593Smuzhiyun .num_ports = 2,
3693*4882a593Smuzhiyun .base_baud = 921600,
3694*4882a593Smuzhiyun .uart_offset = 0x8,
3695*4882a593Smuzhiyun },
3696*4882a593Smuzhiyun [pbn_pericom_PI7C9X7954] = {
3697*4882a593Smuzhiyun .flags = FL_BASE0,
3698*4882a593Smuzhiyun .num_ports = 4,
3699*4882a593Smuzhiyun .base_baud = 921600,
3700*4882a593Smuzhiyun .uart_offset = 0x8,
3701*4882a593Smuzhiyun },
3702*4882a593Smuzhiyun [pbn_pericom_PI7C9X7958] = {
3703*4882a593Smuzhiyun .flags = FL_BASE0,
3704*4882a593Smuzhiyun .num_ports = 8,
3705*4882a593Smuzhiyun .base_baud = 921600,
3706*4882a593Smuzhiyun .uart_offset = 0x8,
3707*4882a593Smuzhiyun },
3708*4882a593Smuzhiyun [pbn_sunix_pci_1s] = {
3709*4882a593Smuzhiyun .num_ports = 1,
3710*4882a593Smuzhiyun .base_baud = 921600,
3711*4882a593Smuzhiyun .uart_offset = 0x8,
3712*4882a593Smuzhiyun },
3713*4882a593Smuzhiyun [pbn_sunix_pci_2s] = {
3714*4882a593Smuzhiyun .num_ports = 2,
3715*4882a593Smuzhiyun .base_baud = 921600,
3716*4882a593Smuzhiyun .uart_offset = 0x8,
3717*4882a593Smuzhiyun },
3718*4882a593Smuzhiyun [pbn_sunix_pci_4s] = {
3719*4882a593Smuzhiyun .num_ports = 4,
3720*4882a593Smuzhiyun .base_baud = 921600,
3721*4882a593Smuzhiyun .uart_offset = 0x8,
3722*4882a593Smuzhiyun },
3723*4882a593Smuzhiyun [pbn_sunix_pci_8s] = {
3724*4882a593Smuzhiyun .num_ports = 8,
3725*4882a593Smuzhiyun .base_baud = 921600,
3726*4882a593Smuzhiyun .uart_offset = 0x8,
3727*4882a593Smuzhiyun },
3728*4882a593Smuzhiyun [pbn_sunix_pci_16s] = {
3729*4882a593Smuzhiyun .num_ports = 16,
3730*4882a593Smuzhiyun .base_baud = 921600,
3731*4882a593Smuzhiyun .uart_offset = 0x8,
3732*4882a593Smuzhiyun },
3733*4882a593Smuzhiyun [pbn_titan_1_4000000] = {
3734*4882a593Smuzhiyun .flags = FL_BASE0,
3735*4882a593Smuzhiyun .num_ports = 1,
3736*4882a593Smuzhiyun .base_baud = 4000000,
3737*4882a593Smuzhiyun .uart_offset = 0x200,
3738*4882a593Smuzhiyun .first_offset = 0x1000,
3739*4882a593Smuzhiyun },
3740*4882a593Smuzhiyun [pbn_titan_2_4000000] = {
3741*4882a593Smuzhiyun .flags = FL_BASE0,
3742*4882a593Smuzhiyun .num_ports = 2,
3743*4882a593Smuzhiyun .base_baud = 4000000,
3744*4882a593Smuzhiyun .uart_offset = 0x200,
3745*4882a593Smuzhiyun .first_offset = 0x1000,
3746*4882a593Smuzhiyun },
3747*4882a593Smuzhiyun [pbn_titan_4_4000000] = {
3748*4882a593Smuzhiyun .flags = FL_BASE0,
3749*4882a593Smuzhiyun .num_ports = 4,
3750*4882a593Smuzhiyun .base_baud = 4000000,
3751*4882a593Smuzhiyun .uart_offset = 0x200,
3752*4882a593Smuzhiyun .first_offset = 0x1000,
3753*4882a593Smuzhiyun },
3754*4882a593Smuzhiyun [pbn_titan_8_4000000] = {
3755*4882a593Smuzhiyun .flags = FL_BASE0,
3756*4882a593Smuzhiyun .num_ports = 8,
3757*4882a593Smuzhiyun .base_baud = 4000000,
3758*4882a593Smuzhiyun .uart_offset = 0x200,
3759*4882a593Smuzhiyun .first_offset = 0x1000,
3760*4882a593Smuzhiyun },
3761*4882a593Smuzhiyun [pbn_moxa8250_2p] = {
3762*4882a593Smuzhiyun .flags = FL_BASE1,
3763*4882a593Smuzhiyun .num_ports = 2,
3764*4882a593Smuzhiyun .base_baud = 921600,
3765*4882a593Smuzhiyun .uart_offset = 0x200,
3766*4882a593Smuzhiyun },
3767*4882a593Smuzhiyun [pbn_moxa8250_4p] = {
3768*4882a593Smuzhiyun .flags = FL_BASE1,
3769*4882a593Smuzhiyun .num_ports = 4,
3770*4882a593Smuzhiyun .base_baud = 921600,
3771*4882a593Smuzhiyun .uart_offset = 0x200,
3772*4882a593Smuzhiyun },
3773*4882a593Smuzhiyun [pbn_moxa8250_8p] = {
3774*4882a593Smuzhiyun .flags = FL_BASE1,
3775*4882a593Smuzhiyun .num_ports = 8,
3776*4882a593Smuzhiyun .base_baud = 921600,
3777*4882a593Smuzhiyun .uart_offset = 0x200,
3778*4882a593Smuzhiyun },
3779*4882a593Smuzhiyun };
3780*4882a593Smuzhiyun
3781*4882a593Smuzhiyun static const struct pci_device_id blacklist[] = {
3782*4882a593Smuzhiyun /* softmodems */
3783*4882a593Smuzhiyun { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */
3784*4882a593Smuzhiyun { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */
3785*4882a593Smuzhiyun { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */
3786*4882a593Smuzhiyun
3787*4882a593Smuzhiyun /* multi-io cards handled by parport_serial */
3788*4882a593Smuzhiyun { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */
3789*4882a593Smuzhiyun { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */
3790*4882a593Smuzhiyun { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */
3791*4882a593Smuzhiyun
3792*4882a593Smuzhiyun /* Intel platforms with MID UART */
3793*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x081b), },
3794*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x081c), },
3795*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x081d), },
3796*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x1191), },
3797*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x18d8), },
3798*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x19d8), },
3799*4882a593Smuzhiyun
3800*4882a593Smuzhiyun /* Intel platforms with DesignWare UART */
3801*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x0936), },
3802*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x0f0a), },
3803*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x0f0c), },
3804*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x228a), },
3805*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x228c), },
3806*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b96), },
3807*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b97), },
3808*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b98), },
3809*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b99), },
3810*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b9a), },
3811*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x4b9b), },
3812*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x9ce3), },
3813*4882a593Smuzhiyun { PCI_VDEVICE(INTEL, 0x9ce4), },
3814*4882a593Smuzhiyun
3815*4882a593Smuzhiyun /* Exar devices */
3816*4882a593Smuzhiyun { PCI_VDEVICE(EXAR, PCI_ANY_ID), },
3817*4882a593Smuzhiyun { PCI_VDEVICE(COMMTECH, PCI_ANY_ID), },
3818*4882a593Smuzhiyun
3819*4882a593Smuzhiyun /* End of the black list */
3820*4882a593Smuzhiyun { }
3821*4882a593Smuzhiyun };
3822*4882a593Smuzhiyun
serial_pci_is_class_communication(struct pci_dev * dev)3823*4882a593Smuzhiyun static int serial_pci_is_class_communication(struct pci_dev *dev)
3824*4882a593Smuzhiyun {
3825*4882a593Smuzhiyun /*
3826*4882a593Smuzhiyun * If it is not a communications device or the programming
3827*4882a593Smuzhiyun * interface is greater than 6, give up.
3828*4882a593Smuzhiyun */
3829*4882a593Smuzhiyun if ((((dev->class >> 8) != PCI_CLASS_COMMUNICATION_SERIAL) &&
3830*4882a593Smuzhiyun ((dev->class >> 8) != PCI_CLASS_COMMUNICATION_MULTISERIAL) &&
3831*4882a593Smuzhiyun ((dev->class >> 8) != PCI_CLASS_COMMUNICATION_MODEM)) ||
3832*4882a593Smuzhiyun (dev->class & 0xff) > 6)
3833*4882a593Smuzhiyun return -ENODEV;
3834*4882a593Smuzhiyun
3835*4882a593Smuzhiyun return 0;
3836*4882a593Smuzhiyun }
3837*4882a593Smuzhiyun
3838*4882a593Smuzhiyun /*
3839*4882a593Smuzhiyun * Given a complete unknown PCI device, try to use some heuristics to
3840*4882a593Smuzhiyun * guess what the configuration might be, based on the pitiful PCI
3841*4882a593Smuzhiyun * serial specs. Returns 0 on success, -ENODEV on failure.
3842*4882a593Smuzhiyun */
3843*4882a593Smuzhiyun static int
serial_pci_guess_board(struct pci_dev * dev,struct pciserial_board * board)3844*4882a593Smuzhiyun serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
3845*4882a593Smuzhiyun {
3846*4882a593Smuzhiyun int num_iomem, num_port, first_port = -1, i;
3847*4882a593Smuzhiyun int rc;
3848*4882a593Smuzhiyun
3849*4882a593Smuzhiyun rc = serial_pci_is_class_communication(dev);
3850*4882a593Smuzhiyun if (rc)
3851*4882a593Smuzhiyun return rc;
3852*4882a593Smuzhiyun
3853*4882a593Smuzhiyun /*
3854*4882a593Smuzhiyun * Should we try to make guesses for multiport serial devices later?
3855*4882a593Smuzhiyun */
3856*4882a593Smuzhiyun if ((dev->class >> 8) == PCI_CLASS_COMMUNICATION_MULTISERIAL)
3857*4882a593Smuzhiyun return -ENODEV;
3858*4882a593Smuzhiyun
3859*4882a593Smuzhiyun num_iomem = num_port = 0;
3860*4882a593Smuzhiyun for (i = 0; i < PCI_STD_NUM_BARS; i++) {
3861*4882a593Smuzhiyun if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
3862*4882a593Smuzhiyun num_port++;
3863*4882a593Smuzhiyun if (first_port == -1)
3864*4882a593Smuzhiyun first_port = i;
3865*4882a593Smuzhiyun }
3866*4882a593Smuzhiyun if (pci_resource_flags(dev, i) & IORESOURCE_MEM)
3867*4882a593Smuzhiyun num_iomem++;
3868*4882a593Smuzhiyun }
3869*4882a593Smuzhiyun
3870*4882a593Smuzhiyun /*
3871*4882a593Smuzhiyun * If there is 1 or 0 iomem regions, and exactly one port,
3872*4882a593Smuzhiyun * use it. We guess the number of ports based on the IO
3873*4882a593Smuzhiyun * region size.
3874*4882a593Smuzhiyun */
3875*4882a593Smuzhiyun if (num_iomem <= 1 && num_port == 1) {
3876*4882a593Smuzhiyun board->flags = first_port;
3877*4882a593Smuzhiyun board->num_ports = pci_resource_len(dev, first_port) / 8;
3878*4882a593Smuzhiyun return 0;
3879*4882a593Smuzhiyun }
3880*4882a593Smuzhiyun
3881*4882a593Smuzhiyun /*
3882*4882a593Smuzhiyun * Now guess if we've got a board which indexes by BARs.
3883*4882a593Smuzhiyun * Each IO BAR should be 8 bytes, and they should follow
3884*4882a593Smuzhiyun * consecutively.
3885*4882a593Smuzhiyun */
3886*4882a593Smuzhiyun first_port = -1;
3887*4882a593Smuzhiyun num_port = 0;
3888*4882a593Smuzhiyun for (i = 0; i < PCI_STD_NUM_BARS; i++) {
3889*4882a593Smuzhiyun if (pci_resource_flags(dev, i) & IORESOURCE_IO &&
3890*4882a593Smuzhiyun pci_resource_len(dev, i) == 8 &&
3891*4882a593Smuzhiyun (first_port == -1 || (first_port + num_port) == i)) {
3892*4882a593Smuzhiyun num_port++;
3893*4882a593Smuzhiyun if (first_port == -1)
3894*4882a593Smuzhiyun first_port = i;
3895*4882a593Smuzhiyun }
3896*4882a593Smuzhiyun }
3897*4882a593Smuzhiyun
3898*4882a593Smuzhiyun if (num_port > 1) {
3899*4882a593Smuzhiyun board->flags = first_port | FL_BASE_BARS;
3900*4882a593Smuzhiyun board->num_ports = num_port;
3901*4882a593Smuzhiyun return 0;
3902*4882a593Smuzhiyun }
3903*4882a593Smuzhiyun
3904*4882a593Smuzhiyun return -ENODEV;
3905*4882a593Smuzhiyun }
3906*4882a593Smuzhiyun
3907*4882a593Smuzhiyun static inline int
serial_pci_matches(const struct pciserial_board * board,const struct pciserial_board * guessed)3908*4882a593Smuzhiyun serial_pci_matches(const struct pciserial_board *board,
3909*4882a593Smuzhiyun const struct pciserial_board *guessed)
3910*4882a593Smuzhiyun {
3911*4882a593Smuzhiyun return
3912*4882a593Smuzhiyun board->num_ports == guessed->num_ports &&
3913*4882a593Smuzhiyun board->base_baud == guessed->base_baud &&
3914*4882a593Smuzhiyun board->uart_offset == guessed->uart_offset &&
3915*4882a593Smuzhiyun board->reg_shift == guessed->reg_shift &&
3916*4882a593Smuzhiyun board->first_offset == guessed->first_offset;
3917*4882a593Smuzhiyun }
3918*4882a593Smuzhiyun
3919*4882a593Smuzhiyun struct serial_private *
pciserial_init_ports(struct pci_dev * dev,const struct pciserial_board * board)3920*4882a593Smuzhiyun pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
3921*4882a593Smuzhiyun {
3922*4882a593Smuzhiyun struct uart_8250_port uart;
3923*4882a593Smuzhiyun struct serial_private *priv;
3924*4882a593Smuzhiyun struct pci_serial_quirk *quirk;
3925*4882a593Smuzhiyun int rc, nr_ports, i;
3926*4882a593Smuzhiyun
3927*4882a593Smuzhiyun nr_ports = board->num_ports;
3928*4882a593Smuzhiyun
3929*4882a593Smuzhiyun /*
3930*4882a593Smuzhiyun * Find an init and setup quirks.
3931*4882a593Smuzhiyun */
3932*4882a593Smuzhiyun quirk = find_quirk(dev);
3933*4882a593Smuzhiyun
3934*4882a593Smuzhiyun /*
3935*4882a593Smuzhiyun * Run the new-style initialization function.
3936*4882a593Smuzhiyun * The initialization function returns:
3937*4882a593Smuzhiyun * <0 - error
3938*4882a593Smuzhiyun * 0 - use board->num_ports
3939*4882a593Smuzhiyun * >0 - number of ports
3940*4882a593Smuzhiyun */
3941*4882a593Smuzhiyun if (quirk->init) {
3942*4882a593Smuzhiyun rc = quirk->init(dev);
3943*4882a593Smuzhiyun if (rc < 0) {
3944*4882a593Smuzhiyun priv = ERR_PTR(rc);
3945*4882a593Smuzhiyun goto err_out;
3946*4882a593Smuzhiyun }
3947*4882a593Smuzhiyun if (rc)
3948*4882a593Smuzhiyun nr_ports = rc;
3949*4882a593Smuzhiyun }
3950*4882a593Smuzhiyun
3951*4882a593Smuzhiyun priv = kzalloc(sizeof(struct serial_private) +
3952*4882a593Smuzhiyun sizeof(unsigned int) * nr_ports,
3953*4882a593Smuzhiyun GFP_KERNEL);
3954*4882a593Smuzhiyun if (!priv) {
3955*4882a593Smuzhiyun priv = ERR_PTR(-ENOMEM);
3956*4882a593Smuzhiyun goto err_deinit;
3957*4882a593Smuzhiyun }
3958*4882a593Smuzhiyun
3959*4882a593Smuzhiyun priv->dev = dev;
3960*4882a593Smuzhiyun priv->quirk = quirk;
3961*4882a593Smuzhiyun
3962*4882a593Smuzhiyun memset(&uart, 0, sizeof(uart));
3963*4882a593Smuzhiyun uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
3964*4882a593Smuzhiyun uart.port.uartclk = board->base_baud * 16;
3965*4882a593Smuzhiyun
3966*4882a593Smuzhiyun if (board->flags & FL_NOIRQ) {
3967*4882a593Smuzhiyun uart.port.irq = 0;
3968*4882a593Smuzhiyun } else {
3969*4882a593Smuzhiyun if (pci_match_id(pci_use_msi, dev)) {
3970*4882a593Smuzhiyun pci_dbg(dev, "Using MSI(-X) interrupts\n");
3971*4882a593Smuzhiyun pci_set_master(dev);
3972*4882a593Smuzhiyun uart.port.flags &= ~UPF_SHARE_IRQ;
3973*4882a593Smuzhiyun rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES);
3974*4882a593Smuzhiyun } else {
3975*4882a593Smuzhiyun pci_dbg(dev, "Using legacy interrupts\n");
3976*4882a593Smuzhiyun rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY);
3977*4882a593Smuzhiyun }
3978*4882a593Smuzhiyun if (rc < 0) {
3979*4882a593Smuzhiyun kfree(priv);
3980*4882a593Smuzhiyun priv = ERR_PTR(rc);
3981*4882a593Smuzhiyun goto err_deinit;
3982*4882a593Smuzhiyun }
3983*4882a593Smuzhiyun
3984*4882a593Smuzhiyun uart.port.irq = pci_irq_vector(dev, 0);
3985*4882a593Smuzhiyun }
3986*4882a593Smuzhiyun
3987*4882a593Smuzhiyun uart.port.dev = &dev->dev;
3988*4882a593Smuzhiyun
3989*4882a593Smuzhiyun for (i = 0; i < nr_ports; i++) {
3990*4882a593Smuzhiyun if (quirk->setup(priv, board, &uart, i))
3991*4882a593Smuzhiyun break;
3992*4882a593Smuzhiyun
3993*4882a593Smuzhiyun pci_dbg(dev, "Setup PCI port: port %lx, irq %d, type %d\n",
3994*4882a593Smuzhiyun uart.port.iobase, uart.port.irq, uart.port.iotype);
3995*4882a593Smuzhiyun
3996*4882a593Smuzhiyun priv->line[i] = serial8250_register_8250_port(&uart);
3997*4882a593Smuzhiyun if (priv->line[i] < 0) {
3998*4882a593Smuzhiyun pci_err(dev,
3999*4882a593Smuzhiyun "Couldn't register serial port %lx, irq %d, type %d, error %d\n",
4000*4882a593Smuzhiyun uart.port.iobase, uart.port.irq,
4001*4882a593Smuzhiyun uart.port.iotype, priv->line[i]);
4002*4882a593Smuzhiyun break;
4003*4882a593Smuzhiyun }
4004*4882a593Smuzhiyun }
4005*4882a593Smuzhiyun priv->nr = i;
4006*4882a593Smuzhiyun priv->board = board;
4007*4882a593Smuzhiyun return priv;
4008*4882a593Smuzhiyun
4009*4882a593Smuzhiyun err_deinit:
4010*4882a593Smuzhiyun if (quirk->exit)
4011*4882a593Smuzhiyun quirk->exit(dev);
4012*4882a593Smuzhiyun err_out:
4013*4882a593Smuzhiyun return priv;
4014*4882a593Smuzhiyun }
4015*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pciserial_init_ports);
4016*4882a593Smuzhiyun
pciserial_detach_ports(struct serial_private * priv)4017*4882a593Smuzhiyun static void pciserial_detach_ports(struct serial_private *priv)
4018*4882a593Smuzhiyun {
4019*4882a593Smuzhiyun struct pci_serial_quirk *quirk;
4020*4882a593Smuzhiyun int i;
4021*4882a593Smuzhiyun
4022*4882a593Smuzhiyun for (i = 0; i < priv->nr; i++)
4023*4882a593Smuzhiyun serial8250_unregister_port(priv->line[i]);
4024*4882a593Smuzhiyun
4025*4882a593Smuzhiyun /*
4026*4882a593Smuzhiyun * Find the exit quirks.
4027*4882a593Smuzhiyun */
4028*4882a593Smuzhiyun quirk = find_quirk(priv->dev);
4029*4882a593Smuzhiyun if (quirk->exit)
4030*4882a593Smuzhiyun quirk->exit(priv->dev);
4031*4882a593Smuzhiyun }
4032*4882a593Smuzhiyun
pciserial_remove_ports(struct serial_private * priv)4033*4882a593Smuzhiyun void pciserial_remove_ports(struct serial_private *priv)
4034*4882a593Smuzhiyun {
4035*4882a593Smuzhiyun pciserial_detach_ports(priv);
4036*4882a593Smuzhiyun kfree(priv);
4037*4882a593Smuzhiyun }
4038*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pciserial_remove_ports);
4039*4882a593Smuzhiyun
pciserial_suspend_ports(struct serial_private * priv)4040*4882a593Smuzhiyun void pciserial_suspend_ports(struct serial_private *priv)
4041*4882a593Smuzhiyun {
4042*4882a593Smuzhiyun int i;
4043*4882a593Smuzhiyun
4044*4882a593Smuzhiyun for (i = 0; i < priv->nr; i++)
4045*4882a593Smuzhiyun if (priv->line[i] >= 0)
4046*4882a593Smuzhiyun serial8250_suspend_port(priv->line[i]);
4047*4882a593Smuzhiyun
4048*4882a593Smuzhiyun /*
4049*4882a593Smuzhiyun * Ensure that every init quirk is properly torn down
4050*4882a593Smuzhiyun */
4051*4882a593Smuzhiyun if (priv->quirk->exit)
4052*4882a593Smuzhiyun priv->quirk->exit(priv->dev);
4053*4882a593Smuzhiyun }
4054*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pciserial_suspend_ports);
4055*4882a593Smuzhiyun
pciserial_resume_ports(struct serial_private * priv)4056*4882a593Smuzhiyun void pciserial_resume_ports(struct serial_private *priv)
4057*4882a593Smuzhiyun {
4058*4882a593Smuzhiyun int i;
4059*4882a593Smuzhiyun
4060*4882a593Smuzhiyun /*
4061*4882a593Smuzhiyun * Ensure that the board is correctly configured.
4062*4882a593Smuzhiyun */
4063*4882a593Smuzhiyun if (priv->quirk->init)
4064*4882a593Smuzhiyun priv->quirk->init(priv->dev);
4065*4882a593Smuzhiyun
4066*4882a593Smuzhiyun for (i = 0; i < priv->nr; i++)
4067*4882a593Smuzhiyun if (priv->line[i] >= 0)
4068*4882a593Smuzhiyun serial8250_resume_port(priv->line[i]);
4069*4882a593Smuzhiyun }
4070*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pciserial_resume_ports);
4071*4882a593Smuzhiyun
4072*4882a593Smuzhiyun /*
4073*4882a593Smuzhiyun * Probe one serial board. Unfortunately, there is no rhyme nor reason
4074*4882a593Smuzhiyun * to the arrangement of serial ports on a PCI card.
4075*4882a593Smuzhiyun */
4076*4882a593Smuzhiyun static int
pciserial_init_one(struct pci_dev * dev,const struct pci_device_id * ent)4077*4882a593Smuzhiyun pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
4078*4882a593Smuzhiyun {
4079*4882a593Smuzhiyun struct pci_serial_quirk *quirk;
4080*4882a593Smuzhiyun struct serial_private *priv;
4081*4882a593Smuzhiyun const struct pciserial_board *board;
4082*4882a593Smuzhiyun const struct pci_device_id *exclude;
4083*4882a593Smuzhiyun struct pciserial_board tmp;
4084*4882a593Smuzhiyun int rc;
4085*4882a593Smuzhiyun
4086*4882a593Smuzhiyun quirk = find_quirk(dev);
4087*4882a593Smuzhiyun if (quirk->probe) {
4088*4882a593Smuzhiyun rc = quirk->probe(dev);
4089*4882a593Smuzhiyun if (rc)
4090*4882a593Smuzhiyun return rc;
4091*4882a593Smuzhiyun }
4092*4882a593Smuzhiyun
4093*4882a593Smuzhiyun if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
4094*4882a593Smuzhiyun pci_err(dev, "invalid driver_data: %ld\n", ent->driver_data);
4095*4882a593Smuzhiyun return -EINVAL;
4096*4882a593Smuzhiyun }
4097*4882a593Smuzhiyun
4098*4882a593Smuzhiyun board = &pci_boards[ent->driver_data];
4099*4882a593Smuzhiyun
4100*4882a593Smuzhiyun exclude = pci_match_id(blacklist, dev);
4101*4882a593Smuzhiyun if (exclude)
4102*4882a593Smuzhiyun return -ENODEV;
4103*4882a593Smuzhiyun
4104*4882a593Smuzhiyun rc = pcim_enable_device(dev);
4105*4882a593Smuzhiyun pci_save_state(dev);
4106*4882a593Smuzhiyun if (rc)
4107*4882a593Smuzhiyun return rc;
4108*4882a593Smuzhiyun
4109*4882a593Smuzhiyun if (ent->driver_data == pbn_default) {
4110*4882a593Smuzhiyun /*
4111*4882a593Smuzhiyun * Use a copy of the pci_board entry for this;
4112*4882a593Smuzhiyun * avoid changing entries in the table.
4113*4882a593Smuzhiyun */
4114*4882a593Smuzhiyun memcpy(&tmp, board, sizeof(struct pciserial_board));
4115*4882a593Smuzhiyun board = &tmp;
4116*4882a593Smuzhiyun
4117*4882a593Smuzhiyun /*
4118*4882a593Smuzhiyun * We matched one of our class entries. Try to
4119*4882a593Smuzhiyun * determine the parameters of this board.
4120*4882a593Smuzhiyun */
4121*4882a593Smuzhiyun rc = serial_pci_guess_board(dev, &tmp);
4122*4882a593Smuzhiyun if (rc)
4123*4882a593Smuzhiyun return rc;
4124*4882a593Smuzhiyun } else {
4125*4882a593Smuzhiyun /*
4126*4882a593Smuzhiyun * We matched an explicit entry. If we are able to
4127*4882a593Smuzhiyun * detect this boards settings with our heuristic,
4128*4882a593Smuzhiyun * then we no longer need this entry.
4129*4882a593Smuzhiyun */
4130*4882a593Smuzhiyun memcpy(&tmp, &pci_boards[pbn_default],
4131*4882a593Smuzhiyun sizeof(struct pciserial_board));
4132*4882a593Smuzhiyun rc = serial_pci_guess_board(dev, &tmp);
4133*4882a593Smuzhiyun if (rc == 0 && serial_pci_matches(board, &tmp))
4134*4882a593Smuzhiyun moan_device("Redundant entry in serial pci_table.",
4135*4882a593Smuzhiyun dev);
4136*4882a593Smuzhiyun }
4137*4882a593Smuzhiyun
4138*4882a593Smuzhiyun priv = pciserial_init_ports(dev, board);
4139*4882a593Smuzhiyun if (IS_ERR(priv))
4140*4882a593Smuzhiyun return PTR_ERR(priv);
4141*4882a593Smuzhiyun
4142*4882a593Smuzhiyun pci_set_drvdata(dev, priv);
4143*4882a593Smuzhiyun return 0;
4144*4882a593Smuzhiyun }
4145*4882a593Smuzhiyun
pciserial_remove_one(struct pci_dev * dev)4146*4882a593Smuzhiyun static void pciserial_remove_one(struct pci_dev *dev)
4147*4882a593Smuzhiyun {
4148*4882a593Smuzhiyun struct serial_private *priv = pci_get_drvdata(dev);
4149*4882a593Smuzhiyun
4150*4882a593Smuzhiyun pciserial_remove_ports(priv);
4151*4882a593Smuzhiyun }
4152*4882a593Smuzhiyun
4153*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
pciserial_suspend_one(struct device * dev)4154*4882a593Smuzhiyun static int pciserial_suspend_one(struct device *dev)
4155*4882a593Smuzhiyun {
4156*4882a593Smuzhiyun struct serial_private *priv = dev_get_drvdata(dev);
4157*4882a593Smuzhiyun
4158*4882a593Smuzhiyun if (priv)
4159*4882a593Smuzhiyun pciserial_suspend_ports(priv);
4160*4882a593Smuzhiyun
4161*4882a593Smuzhiyun return 0;
4162*4882a593Smuzhiyun }
4163*4882a593Smuzhiyun
pciserial_resume_one(struct device * dev)4164*4882a593Smuzhiyun static int pciserial_resume_one(struct device *dev)
4165*4882a593Smuzhiyun {
4166*4882a593Smuzhiyun struct pci_dev *pdev = to_pci_dev(dev);
4167*4882a593Smuzhiyun struct serial_private *priv = pci_get_drvdata(pdev);
4168*4882a593Smuzhiyun int err;
4169*4882a593Smuzhiyun
4170*4882a593Smuzhiyun if (priv) {
4171*4882a593Smuzhiyun /*
4172*4882a593Smuzhiyun * The device may have been disabled. Re-enable it.
4173*4882a593Smuzhiyun */
4174*4882a593Smuzhiyun err = pci_enable_device(pdev);
4175*4882a593Smuzhiyun /* FIXME: We cannot simply error out here */
4176*4882a593Smuzhiyun if (err)
4177*4882a593Smuzhiyun pci_err(pdev, "Unable to re-enable ports, trying to continue.\n");
4178*4882a593Smuzhiyun pciserial_resume_ports(priv);
4179*4882a593Smuzhiyun }
4180*4882a593Smuzhiyun return 0;
4181*4882a593Smuzhiyun }
4182*4882a593Smuzhiyun #endif
4183*4882a593Smuzhiyun
4184*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(pciserial_pm_ops, pciserial_suspend_one,
4185*4882a593Smuzhiyun pciserial_resume_one);
4186*4882a593Smuzhiyun
4187*4882a593Smuzhiyun static const struct pci_device_id serial_pci_tbl[] = {
4188*4882a593Smuzhiyun /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
4189*4882a593Smuzhiyun { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
4190*4882a593Smuzhiyun PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
4191*4882a593Smuzhiyun pbn_b2_8_921600 },
4192*4882a593Smuzhiyun /* Advantech also use 0x3618 and 0xf618 */
4193*4882a593Smuzhiyun { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3618,
4194*4882a593Smuzhiyun PCI_DEVICE_ID_ADVANTECH_PCI3618, PCI_ANY_ID, 0, 0,
4195*4882a593Smuzhiyun pbn_b0_4_921600 },
4196*4882a593Smuzhiyun { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCIf618,
4197*4882a593Smuzhiyun PCI_DEVICE_ID_ADVANTECH_PCI3618, PCI_ANY_ID, 0, 0,
4198*4882a593Smuzhiyun pbn_b0_4_921600 },
4199*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4200*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4201*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
4202*4882a593Smuzhiyun pbn_b1_8_1382400 },
4203*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4204*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4205*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, 0, 0,
4206*4882a593Smuzhiyun pbn_b1_4_1382400 },
4207*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4208*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4209*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, 0, 0,
4210*4882a593Smuzhiyun pbn_b1_2_1382400 },
4211*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4212*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4213*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
4214*4882a593Smuzhiyun pbn_b1_8_1382400 },
4215*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4216*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4217*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, 0, 0,
4218*4882a593Smuzhiyun pbn_b1_4_1382400 },
4219*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4220*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4221*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, 0, 0,
4222*4882a593Smuzhiyun pbn_b1_2_1382400 },
4223*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4224*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4225*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485, 0, 0,
4226*4882a593Smuzhiyun pbn_b1_8_921600 },
4227*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4228*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4229*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4, 0, 0,
4230*4882a593Smuzhiyun pbn_b1_8_921600 },
4231*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4232*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4233*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485, 0, 0,
4234*4882a593Smuzhiyun pbn_b1_4_921600 },
4235*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4236*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4237*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2, 0, 0,
4238*4882a593Smuzhiyun pbn_b1_4_921600 },
4239*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4240*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4241*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485, 0, 0,
4242*4882a593Smuzhiyun pbn_b1_2_921600 },
4243*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4244*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4245*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_2_6, 0, 0,
4246*4882a593Smuzhiyun pbn_b1_8_921600 },
4247*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4248*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4249*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH081101V1, 0, 0,
4250*4882a593Smuzhiyun pbn_b1_8_921600 },
4251*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4252*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4253*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH041101V1, 0, 0,
4254*4882a593Smuzhiyun pbn_b1_4_921600 },
4255*4882a593Smuzhiyun { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4256*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4257*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_20MHZ, 0, 0,
4258*4882a593Smuzhiyun pbn_b1_2_1250000 },
4259*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4260*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4261*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_2, 0, 0,
4262*4882a593Smuzhiyun pbn_b0_2_1843200 },
4263*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4264*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CONNECT_TECH,
4265*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_4, 0, 0,
4266*4882a593Smuzhiyun pbn_b0_4_1843200 },
4267*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4268*4882a593Smuzhiyun PCI_VENDOR_ID_AFAVLAB,
4269*4882a593Smuzhiyun PCI_SUBDEVICE_ID_AFAVLAB_P061, 0, 0,
4270*4882a593Smuzhiyun pbn_b0_4_1152000 },
4271*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530,
4272*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4273*4882a593Smuzhiyun pbn_b2_bt_1_115200 },
4274*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM2,
4275*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4276*4882a593Smuzhiyun pbn_b2_bt_2_115200 },
4277*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM422,
4278*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4279*4882a593Smuzhiyun pbn_b2_bt_4_115200 },
4280*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM232,
4281*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4282*4882a593Smuzhiyun pbn_b2_bt_2_115200 },
4283*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM4,
4284*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4285*4882a593Smuzhiyun pbn_b2_bt_4_115200 },
4286*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8,
4287*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4288*4882a593Smuzhiyun pbn_b2_8_115200 },
4289*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_7803,
4290*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4291*4882a593Smuzhiyun pbn_b2_8_460800 },
4292*4882a593Smuzhiyun { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM8,
4293*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4294*4882a593Smuzhiyun pbn_b2_8_115200 },
4295*4882a593Smuzhiyun
4296*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_GTEK_SERIAL2,
4297*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4298*4882a593Smuzhiyun pbn_b2_bt_2_115200 },
4299*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM200,
4300*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4301*4882a593Smuzhiyun pbn_b2_bt_2_921600 },
4302*4882a593Smuzhiyun /*
4303*4882a593Smuzhiyun * VScom SPCOM800, from sl@s.pl
4304*4882a593Smuzhiyun */
4305*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM800,
4306*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4307*4882a593Smuzhiyun pbn_b2_8_921600 },
4308*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_1077,
4309*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4310*4882a593Smuzhiyun pbn_b2_4_921600 },
4311*4882a593Smuzhiyun /* Unknown card - subdevice 0x1584 */
4312*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4313*4882a593Smuzhiyun PCI_VENDOR_ID_PLX,
4314*4882a593Smuzhiyun PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
4315*4882a593Smuzhiyun pbn_b2_4_115200 },
4316*4882a593Smuzhiyun /* Unknown card - subdevice 0x1588 */
4317*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4318*4882a593Smuzhiyun PCI_VENDOR_ID_PLX,
4319*4882a593Smuzhiyun PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0,
4320*4882a593Smuzhiyun pbn_b2_8_115200 },
4321*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4322*4882a593Smuzhiyun PCI_SUBVENDOR_ID_KEYSPAN,
4323*4882a593Smuzhiyun PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
4324*4882a593Smuzhiyun pbn_panacom },
4325*4882a593Smuzhiyun { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_QUADMODEM,
4326*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4327*4882a593Smuzhiyun pbn_panacom4 },
4328*4882a593Smuzhiyun { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_DUALMODEM,
4329*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4330*4882a593Smuzhiyun pbn_panacom2 },
4331*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
4332*4882a593Smuzhiyun PCI_VENDOR_ID_ESDGMBH,
4333*4882a593Smuzhiyun PCI_DEVICE_ID_ESDGMBH_CPCIASIO4, 0, 0,
4334*4882a593Smuzhiyun pbn_b2_4_115200 },
4335*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4336*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4337*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIFAST4, 0, 0,
4338*4882a593Smuzhiyun pbn_b2_4_460800 },
4339*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4340*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4341*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIFAST8, 0, 0,
4342*4882a593Smuzhiyun pbn_b2_8_460800 },
4343*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4344*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4345*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIFAST16, 0, 0,
4346*4882a593Smuzhiyun pbn_b2_16_460800 },
4347*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4348*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4349*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIFAST16FMC, 0, 0,
4350*4882a593Smuzhiyun pbn_b2_16_460800 },
4351*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4352*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIRAS,
4353*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIRAS4, 0, 0,
4354*4882a593Smuzhiyun pbn_b2_4_460800 },
4355*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4356*4882a593Smuzhiyun PCI_SUBVENDOR_ID_CHASE_PCIRAS,
4357*4882a593Smuzhiyun PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0,
4358*4882a593Smuzhiyun pbn_b2_8_460800 },
4359*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4360*4882a593Smuzhiyun PCI_SUBVENDOR_ID_EXSYS,
4361*4882a593Smuzhiyun PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
4362*4882a593Smuzhiyun pbn_b2_4_115200 },
4363*4882a593Smuzhiyun /*
4364*4882a593Smuzhiyun * Megawolf Romulus PCI Serial Card, from Mike Hudson
4365*4882a593Smuzhiyun * (Exoray@isys.ca)
4366*4882a593Smuzhiyun */
4367*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_ROMULUS,
4368*4882a593Smuzhiyun 0x10b5, 0x106a, 0, 0,
4369*4882a593Smuzhiyun pbn_plx_romulus },
4370*4882a593Smuzhiyun /*
4371*4882a593Smuzhiyun * Quatech cards. These actually have configurable clocks but for
4372*4882a593Smuzhiyun * now we just use the default.
4373*4882a593Smuzhiyun *
4374*4882a593Smuzhiyun * 100 series are RS232, 200 series RS422,
4375*4882a593Smuzhiyun */
4376*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100,
4377*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4378*4882a593Smuzhiyun pbn_b1_4_115200 },
4379*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100,
4380*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4381*4882a593Smuzhiyun pbn_b1_2_115200 },
4382*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100E,
4383*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4384*4882a593Smuzhiyun pbn_b2_2_115200 },
4385*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200,
4386*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4387*4882a593Smuzhiyun pbn_b1_2_115200 },
4388*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200E,
4389*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4390*4882a593Smuzhiyun pbn_b2_2_115200 },
4391*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC200,
4392*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4393*4882a593Smuzhiyun pbn_b1_4_115200 },
4394*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D,
4395*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4396*4882a593Smuzhiyun pbn_b1_8_115200 },
4397*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M,
4398*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4399*4882a593Smuzhiyun pbn_b1_8_115200 },
4400*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP100,
4401*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4402*4882a593Smuzhiyun pbn_b1_4_115200 },
4403*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP100,
4404*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4405*4882a593Smuzhiyun pbn_b1_2_115200 },
4406*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP200,
4407*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4408*4882a593Smuzhiyun pbn_b1_4_115200 },
4409*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP200,
4410*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4411*4882a593Smuzhiyun pbn_b1_2_115200 },
4412*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP100,
4413*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4414*4882a593Smuzhiyun pbn_b2_4_115200 },
4415*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP100,
4416*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4417*4882a593Smuzhiyun pbn_b2_2_115200 },
4418*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP100,
4419*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4420*4882a593Smuzhiyun pbn_b2_1_115200 },
4421*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP200,
4422*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4423*4882a593Smuzhiyun pbn_b2_4_115200 },
4424*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP200,
4425*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4426*4882a593Smuzhiyun pbn_b2_2_115200 },
4427*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP200,
4428*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4429*4882a593Smuzhiyun pbn_b2_1_115200 },
4430*4882a593Smuzhiyun { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESCLP100,
4431*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4432*4882a593Smuzhiyun pbn_b0_8_115200 },
4433*4882a593Smuzhiyun
4434*4882a593Smuzhiyun { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954,
4435*4882a593Smuzhiyun PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4,
4436*4882a593Smuzhiyun 0, 0,
4437*4882a593Smuzhiyun pbn_b0_4_921600 },
4438*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4439*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL,
4440*4882a593Smuzhiyun 0, 0,
4441*4882a593Smuzhiyun pbn_b0_4_1152000 },
4442*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0x9505,
4443*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4444*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4445*4882a593Smuzhiyun
4446*4882a593Smuzhiyun /*
4447*4882a593Smuzhiyun * The below card is a little controversial since it is the
4448*4882a593Smuzhiyun * subject of a PCI vendor/device ID clash. (See
4449*4882a593Smuzhiyun * www.ussg.iu.edu/hypermail/linux/kernel/0303.1/0516.html).
4450*4882a593Smuzhiyun * For now just used the hex ID 0x950a.
4451*4882a593Smuzhiyun */
4452*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0x950a,
4453*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_00,
4454*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
4455*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0x950a,
4456*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_30,
4457*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
4458*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0x950a,
4459*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4460*4882a593Smuzhiyun pbn_b0_2_1130000 },
4461*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_C950,
4462*4882a593Smuzhiyun PCI_VENDOR_ID_OXSEMI, PCI_SUBDEVICE_ID_OXSEMI_C950, 0, 0,
4463*4882a593Smuzhiyun pbn_b0_1_921600 },
4464*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4465*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4466*4882a593Smuzhiyun pbn_b0_4_115200 },
4467*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952,
4468*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4469*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4470*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI958,
4471*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4472*4882a593Smuzhiyun pbn_b2_8_1152000 },
4473*4882a593Smuzhiyun
4474*4882a593Smuzhiyun /*
4475*4882a593Smuzhiyun * Oxford Semiconductor Inc. Tornado PCI express device range.
4476*4882a593Smuzhiyun */
4477*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc101, /* OXPCIe952 1 Legacy UART */
4478*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4479*4882a593Smuzhiyun pbn_b0_1_3906250 },
4480*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc105, /* OXPCIe952 1 Legacy UART */
4481*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4482*4882a593Smuzhiyun pbn_b0_1_3906250 },
4483*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc11b, /* OXPCIe952 1 Native UART */
4484*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4485*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4486*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc11f, /* OXPCIe952 1 Native UART */
4487*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4488*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4489*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc120, /* OXPCIe952 1 Legacy UART */
4490*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4491*4882a593Smuzhiyun pbn_b0_1_3906250 },
4492*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc124, /* OXPCIe952 1 Legacy UART */
4493*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4494*4882a593Smuzhiyun pbn_b0_1_3906250 },
4495*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc138, /* OXPCIe952 1 Native UART */
4496*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4497*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4498*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc13d, /* OXPCIe952 1 Native UART */
4499*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4500*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4501*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc140, /* OXPCIe952 1 Legacy UART */
4502*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4503*4882a593Smuzhiyun pbn_b0_1_3906250 },
4504*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc141, /* OXPCIe952 1 Legacy UART */
4505*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4506*4882a593Smuzhiyun pbn_b0_1_3906250 },
4507*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc144, /* OXPCIe952 1 Legacy UART */
4508*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4509*4882a593Smuzhiyun pbn_b0_1_3906250 },
4510*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc145, /* OXPCIe952 1 Legacy UART */
4511*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4512*4882a593Smuzhiyun pbn_b0_1_3906250 },
4513*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc158, /* OXPCIe952 2 Native UART */
4514*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4515*4882a593Smuzhiyun pbn_oxsemi_2_3906250 },
4516*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc15d, /* OXPCIe952 2 Native UART */
4517*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4518*4882a593Smuzhiyun pbn_oxsemi_2_3906250 },
4519*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc208, /* OXPCIe954 4 Native UART */
4520*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4521*4882a593Smuzhiyun pbn_oxsemi_4_3906250 },
4522*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc20d, /* OXPCIe954 4 Native UART */
4523*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4524*4882a593Smuzhiyun pbn_oxsemi_4_3906250 },
4525*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc308, /* OXPCIe958 8 Native UART */
4526*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4527*4882a593Smuzhiyun pbn_oxsemi_8_3906250 },
4528*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc30d, /* OXPCIe958 8 Native UART */
4529*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4530*4882a593Smuzhiyun pbn_oxsemi_8_3906250 },
4531*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc40b, /* OXPCIe200 1 Native UART */
4532*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4533*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4534*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc40f, /* OXPCIe200 1 Native UART */
4535*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4536*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4537*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc41b, /* OXPCIe200 1 Native UART */
4538*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4539*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4540*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc41f, /* OXPCIe200 1 Native UART */
4541*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4542*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4543*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc42b, /* OXPCIe200 1 Native UART */
4544*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4545*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4546*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc42f, /* OXPCIe200 1 Native UART */
4547*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4548*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4549*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc43b, /* OXPCIe200 1 Native UART */
4550*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4551*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4552*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc43f, /* OXPCIe200 1 Native UART */
4553*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4554*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4555*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc44b, /* OXPCIe200 1 Native UART */
4556*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4557*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4558*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc44f, /* OXPCIe200 1 Native UART */
4559*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4560*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4561*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc45b, /* OXPCIe200 1 Native UART */
4562*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4563*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4564*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc45f, /* OXPCIe200 1 Native UART */
4565*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4566*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4567*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc46b, /* OXPCIe200 1 Native UART */
4568*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4569*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4570*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc46f, /* OXPCIe200 1 Native UART */
4571*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4572*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4573*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc47b, /* OXPCIe200 1 Native UART */
4574*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4575*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4576*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc47f, /* OXPCIe200 1 Native UART */
4577*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4578*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4579*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc48b, /* OXPCIe200 1 Native UART */
4580*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4581*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4582*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc48f, /* OXPCIe200 1 Native UART */
4583*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4584*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4585*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc49b, /* OXPCIe200 1 Native UART */
4586*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4587*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4588*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc49f, /* OXPCIe200 1 Native UART */
4589*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4590*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4591*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4ab, /* OXPCIe200 1 Native UART */
4592*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4593*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4594*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4af, /* OXPCIe200 1 Native UART */
4595*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4596*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4597*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4bb, /* OXPCIe200 1 Native UART */
4598*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4599*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4600*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4bf, /* OXPCIe200 1 Native UART */
4601*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4602*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4603*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4cb, /* OXPCIe200 1 Native UART */
4604*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4605*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4606*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, 0xc4cf, /* OXPCIe200 1 Native UART */
4607*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4608*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4609*4882a593Smuzhiyun /*
4610*4882a593Smuzhiyun * Mainpine Inc. IQ Express "Rev3" utilizing OxSemi Tornado
4611*4882a593Smuzhiyun */
4612*4882a593Smuzhiyun { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 1 Port V.34 Super-G3 Fax */
4613*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x4001, 0, 0,
4614*4882a593Smuzhiyun pbn_oxsemi_1_3906250 },
4615*4882a593Smuzhiyun { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 2 Port V.34 Super-G3 Fax */
4616*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x4002, 0, 0,
4617*4882a593Smuzhiyun pbn_oxsemi_2_3906250 },
4618*4882a593Smuzhiyun { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 4 Port V.34 Super-G3 Fax */
4619*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x4004, 0, 0,
4620*4882a593Smuzhiyun pbn_oxsemi_4_3906250 },
4621*4882a593Smuzhiyun { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 8 Port V.34 Super-G3 Fax */
4622*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x4008, 0, 0,
4623*4882a593Smuzhiyun pbn_oxsemi_8_3906250 },
4624*4882a593Smuzhiyun
4625*4882a593Smuzhiyun /*
4626*4882a593Smuzhiyun * Digi/IBM PCIe 2-port Async EIA-232 Adapter utilizing OxSemi Tornado
4627*4882a593Smuzhiyun */
4628*4882a593Smuzhiyun { PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_2_OX_IBM,
4629*4882a593Smuzhiyun PCI_SUBVENDOR_ID_IBM, PCI_ANY_ID, 0, 0,
4630*4882a593Smuzhiyun pbn_oxsemi_2_3906250 },
4631*4882a593Smuzhiyun /*
4632*4882a593Smuzhiyun * EndRun Technologies. PCI express device range.
4633*4882a593Smuzhiyun * EndRun PTP/1588 has 2 Native UARTs utilizing OxSemi 952.
4634*4882a593Smuzhiyun */
4635*4882a593Smuzhiyun { PCI_VENDOR_ID_ENDRUN, PCI_DEVICE_ID_ENDRUN_1588,
4636*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4637*4882a593Smuzhiyun pbn_oxsemi_2_3906250 },
4638*4882a593Smuzhiyun
4639*4882a593Smuzhiyun /*
4640*4882a593Smuzhiyun * SBS Technologies, Inc. P-Octal and PMC-OCTPRO cards,
4641*4882a593Smuzhiyun * from skokodyn@yahoo.com
4642*4882a593Smuzhiyun */
4643*4882a593Smuzhiyun { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4644*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_OCTPRO232, 0, 0,
4645*4882a593Smuzhiyun pbn_sbsxrsio },
4646*4882a593Smuzhiyun { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4647*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_OCTPRO422, 0, 0,
4648*4882a593Smuzhiyun pbn_sbsxrsio },
4649*4882a593Smuzhiyun { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4650*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_POCTAL232, 0, 0,
4651*4882a593Smuzhiyun pbn_sbsxrsio },
4652*4882a593Smuzhiyun { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4653*4882a593Smuzhiyun PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_POCTAL422, 0, 0,
4654*4882a593Smuzhiyun pbn_sbsxrsio },
4655*4882a593Smuzhiyun
4656*4882a593Smuzhiyun /*
4657*4882a593Smuzhiyun * Digitan DS560-558, from jimd@esoft.com
4658*4882a593Smuzhiyun */
4659*4882a593Smuzhiyun { PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_ATT_VENUS_MODEM,
4660*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4661*4882a593Smuzhiyun pbn_b1_1_115200 },
4662*4882a593Smuzhiyun
4663*4882a593Smuzhiyun /*
4664*4882a593Smuzhiyun * Titan Electronic cards
4665*4882a593Smuzhiyun * The 400L and 800L have a custom setup quirk.
4666*4882a593Smuzhiyun */
4667*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100,
4668*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4669*4882a593Smuzhiyun pbn_b0_1_921600 },
4670*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200,
4671*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4672*4882a593Smuzhiyun pbn_b0_2_921600 },
4673*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400,
4674*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4675*4882a593Smuzhiyun pbn_b0_4_921600 },
4676*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800B,
4677*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4678*4882a593Smuzhiyun pbn_b0_4_921600 },
4679*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100L,
4680*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4681*4882a593Smuzhiyun pbn_b1_1_921600 },
4682*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200L,
4683*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4684*4882a593Smuzhiyun pbn_b1_bt_2_921600 },
4685*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400L,
4686*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4687*4882a593Smuzhiyun pbn_b0_bt_4_921600 },
4688*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800L,
4689*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4690*4882a593Smuzhiyun pbn_b0_bt_8_921600 },
4691*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200I,
4692*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4693*4882a593Smuzhiyun pbn_b4_bt_2_921600 },
4694*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400I,
4695*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4696*4882a593Smuzhiyun pbn_b4_bt_4_921600 },
4697*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800I,
4698*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4699*4882a593Smuzhiyun pbn_b4_bt_8_921600 },
4700*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400EH,
4701*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4702*4882a593Smuzhiyun pbn_b0_4_921600 },
4703*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800EH,
4704*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4705*4882a593Smuzhiyun pbn_b0_4_921600 },
4706*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800EHB,
4707*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4708*4882a593Smuzhiyun pbn_b0_4_921600 },
4709*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100E,
4710*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4711*4882a593Smuzhiyun pbn_titan_1_4000000 },
4712*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200E,
4713*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4714*4882a593Smuzhiyun pbn_titan_2_4000000 },
4715*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400E,
4716*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4717*4882a593Smuzhiyun pbn_titan_4_4000000 },
4718*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800E,
4719*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4720*4882a593Smuzhiyun pbn_titan_8_4000000 },
4721*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EI,
4722*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4723*4882a593Smuzhiyun pbn_titan_2_4000000 },
4724*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EISI,
4725*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4726*4882a593Smuzhiyun pbn_titan_2_4000000 },
4727*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200V3,
4728*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4729*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4730*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400V3,
4731*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4732*4882a593Smuzhiyun pbn_b0_4_921600 },
4733*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_410V3,
4734*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4735*4882a593Smuzhiyun pbn_b0_4_921600 },
4736*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3,
4737*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4738*4882a593Smuzhiyun pbn_b0_4_921600 },
4739*4882a593Smuzhiyun { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3B,
4740*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4741*4882a593Smuzhiyun pbn_b0_4_921600 },
4742*4882a593Smuzhiyun
4743*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_550,
4744*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4745*4882a593Smuzhiyun pbn_b2_1_460800 },
4746*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_650,
4747*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4748*4882a593Smuzhiyun pbn_b2_1_460800 },
4749*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_850,
4750*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4751*4882a593Smuzhiyun pbn_b2_1_460800 },
4752*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_550,
4753*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4754*4882a593Smuzhiyun pbn_b2_bt_2_921600 },
4755*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_650,
4756*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4757*4882a593Smuzhiyun pbn_b2_bt_2_921600 },
4758*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_850,
4759*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4760*4882a593Smuzhiyun pbn_b2_bt_2_921600 },
4761*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_550,
4762*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4763*4882a593Smuzhiyun pbn_b2_bt_4_921600 },
4764*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_650,
4765*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4766*4882a593Smuzhiyun pbn_b2_bt_4_921600 },
4767*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_850,
4768*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4769*4882a593Smuzhiyun pbn_b2_bt_4_921600 },
4770*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_550,
4771*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4772*4882a593Smuzhiyun pbn_b0_1_921600 },
4773*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_650,
4774*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4775*4882a593Smuzhiyun pbn_b0_1_921600 },
4776*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_850,
4777*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4778*4882a593Smuzhiyun pbn_b0_1_921600 },
4779*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_550,
4780*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4781*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4782*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_650,
4783*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4784*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4785*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_850,
4786*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4787*4882a593Smuzhiyun pbn_b0_bt_2_921600 },
4788*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_550,
4789*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4790*4882a593Smuzhiyun pbn_b0_bt_4_921600 },
4791*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_650,
4792*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4793*4882a593Smuzhiyun pbn_b0_bt_4_921600 },
4794*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_850,
4795*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4796*4882a593Smuzhiyun pbn_b0_bt_4_921600 },
4797*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_550,
4798*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4799*4882a593Smuzhiyun pbn_b0_bt_8_921600 },
4800*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_650,
4801*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4802*4882a593Smuzhiyun pbn_b0_bt_8_921600 },
4803*4882a593Smuzhiyun { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_850,
4804*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4805*4882a593Smuzhiyun pbn_b0_bt_8_921600 },
4806*4882a593Smuzhiyun
4807*4882a593Smuzhiyun /*
4808*4882a593Smuzhiyun * Computone devices submitted by Doug McNash dmcnash@computone.com
4809*4882a593Smuzhiyun */
4810*4882a593Smuzhiyun { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4811*4882a593Smuzhiyun PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG4,
4812*4882a593Smuzhiyun 0, 0, pbn_computone_4 },
4813*4882a593Smuzhiyun { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4814*4882a593Smuzhiyun PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG8,
4815*4882a593Smuzhiyun 0, 0, pbn_computone_8 },
4816*4882a593Smuzhiyun { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4817*4882a593Smuzhiyun PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG6,
4818*4882a593Smuzhiyun 0, 0, pbn_computone_6 },
4819*4882a593Smuzhiyun
4820*4882a593Smuzhiyun { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI95N,
4821*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4822*4882a593Smuzhiyun pbn_oxsemi },
4823*4882a593Smuzhiyun { PCI_VENDOR_ID_TIMEDIA, PCI_DEVICE_ID_TIMEDIA_1889,
4824*4882a593Smuzhiyun PCI_VENDOR_ID_TIMEDIA, PCI_ANY_ID, 0, 0,
4825*4882a593Smuzhiyun pbn_b0_bt_1_921600 },
4826*4882a593Smuzhiyun
4827*4882a593Smuzhiyun /*
4828*4882a593Smuzhiyun * Sunix PCI serial boards
4829*4882a593Smuzhiyun */
4830*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4831*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0001, 0, 0,
4832*4882a593Smuzhiyun pbn_sunix_pci_1s },
4833*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4834*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0002, 0, 0,
4835*4882a593Smuzhiyun pbn_sunix_pci_2s },
4836*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4837*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0004, 0, 0,
4838*4882a593Smuzhiyun pbn_sunix_pci_4s },
4839*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4840*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0084, 0, 0,
4841*4882a593Smuzhiyun pbn_sunix_pci_4s },
4842*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4843*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0008, 0, 0,
4844*4882a593Smuzhiyun pbn_sunix_pci_8s },
4845*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4846*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0088, 0, 0,
4847*4882a593Smuzhiyun pbn_sunix_pci_8s },
4848*4882a593Smuzhiyun { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4849*4882a593Smuzhiyun PCI_VENDOR_ID_SUNIX, 0x0010, 0, 0,
4850*4882a593Smuzhiyun pbn_sunix_pci_16s },
4851*4882a593Smuzhiyun
4852*4882a593Smuzhiyun /*
4853*4882a593Smuzhiyun * AFAVLAB serial card, from Harald Welte <laforge@gnumonks.org>
4854*4882a593Smuzhiyun */
4855*4882a593Smuzhiyun { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P028,
4856*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4857*4882a593Smuzhiyun pbn_b0_bt_8_115200 },
4858*4882a593Smuzhiyun { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P030,
4859*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4860*4882a593Smuzhiyun pbn_b0_bt_8_115200 },
4861*4882a593Smuzhiyun
4862*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DSERIAL,
4863*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4864*4882a593Smuzhiyun pbn_b0_bt_2_115200 },
4865*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_A,
4866*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4867*4882a593Smuzhiyun pbn_b0_bt_2_115200 },
4868*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_B,
4869*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4870*4882a593Smuzhiyun pbn_b0_bt_2_115200 },
4871*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATTRO_A,
4872*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4873*4882a593Smuzhiyun pbn_b0_bt_2_115200 },
4874*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATTRO_B,
4875*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4876*4882a593Smuzhiyun pbn_b0_bt_2_115200 },
4877*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_A,
4878*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4879*4882a593Smuzhiyun pbn_b0_bt_4_460800 },
4880*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_B,
4881*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4882*4882a593Smuzhiyun pbn_b0_bt_4_460800 },
4883*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_PLUS,
4884*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4885*4882a593Smuzhiyun pbn_b0_bt_2_460800 },
4886*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_A,
4887*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4888*4882a593Smuzhiyun pbn_b0_bt_2_460800 },
4889*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_B,
4890*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4891*4882a593Smuzhiyun pbn_b0_bt_2_460800 },
4892*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_SSERIAL,
4893*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4894*4882a593Smuzhiyun pbn_b0_bt_1_115200 },
4895*4882a593Smuzhiyun { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_650,
4896*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4897*4882a593Smuzhiyun pbn_b0_bt_1_460800 },
4898*4882a593Smuzhiyun
4899*4882a593Smuzhiyun /*
4900*4882a593Smuzhiyun * Korenix Jetcard F0/F1 cards (JC1204, JC1208, JC1404, JC1408).
4901*4882a593Smuzhiyun * Cards are identified by their subsystem vendor IDs, which
4902*4882a593Smuzhiyun * (in hex) match the model number.
4903*4882a593Smuzhiyun *
4904*4882a593Smuzhiyun * Note that JC140x are RS422/485 cards which require ox950
4905*4882a593Smuzhiyun * ACR = 0x10, and as such are not currently fully supported.
4906*4882a593Smuzhiyun */
4907*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4908*4882a593Smuzhiyun 0x1204, 0x0004, 0, 0,
4909*4882a593Smuzhiyun pbn_b0_4_921600 },
4910*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4911*4882a593Smuzhiyun 0x1208, 0x0004, 0, 0,
4912*4882a593Smuzhiyun pbn_b0_4_921600 },
4913*4882a593Smuzhiyun /* { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4914*4882a593Smuzhiyun 0x1402, 0x0002, 0, 0,
4915*4882a593Smuzhiyun pbn_b0_2_921600 }, */
4916*4882a593Smuzhiyun /* { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4917*4882a593Smuzhiyun 0x1404, 0x0004, 0, 0,
4918*4882a593Smuzhiyun pbn_b0_4_921600 }, */
4919*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF1,
4920*4882a593Smuzhiyun 0x1208, 0x0004, 0, 0,
4921*4882a593Smuzhiyun pbn_b0_4_921600 },
4922*4882a593Smuzhiyun
4923*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF2,
4924*4882a593Smuzhiyun 0x1204, 0x0004, 0, 0,
4925*4882a593Smuzhiyun pbn_b0_4_921600 },
4926*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF2,
4927*4882a593Smuzhiyun 0x1208, 0x0004, 0, 0,
4928*4882a593Smuzhiyun pbn_b0_4_921600 },
4929*4882a593Smuzhiyun { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF3,
4930*4882a593Smuzhiyun 0x1208, 0x0004, 0, 0,
4931*4882a593Smuzhiyun pbn_b0_4_921600 },
4932*4882a593Smuzhiyun /*
4933*4882a593Smuzhiyun * Dell Remote Access Card 4 - Tim_T_Murphy@Dell.com
4934*4882a593Smuzhiyun */
4935*4882a593Smuzhiyun { PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_RAC4,
4936*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4937*4882a593Smuzhiyun pbn_b1_1_1382400 },
4938*4882a593Smuzhiyun
4939*4882a593Smuzhiyun /*
4940*4882a593Smuzhiyun * Dell Remote Access Card III - Tim_T_Murphy@Dell.com
4941*4882a593Smuzhiyun */
4942*4882a593Smuzhiyun { PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_RACIII,
4943*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4944*4882a593Smuzhiyun pbn_b1_1_1382400 },
4945*4882a593Smuzhiyun
4946*4882a593Smuzhiyun /*
4947*4882a593Smuzhiyun * RAStel 2 port modem, gerg@moreton.com.au
4948*4882a593Smuzhiyun */
4949*4882a593Smuzhiyun { PCI_VENDOR_ID_MORETON, PCI_DEVICE_ID_RASTEL_2PORT,
4950*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4951*4882a593Smuzhiyun pbn_b2_bt_2_115200 },
4952*4882a593Smuzhiyun
4953*4882a593Smuzhiyun /*
4954*4882a593Smuzhiyun * EKF addition for i960 Boards form EKF with serial port
4955*4882a593Smuzhiyun */
4956*4882a593Smuzhiyun { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80960_RP,
4957*4882a593Smuzhiyun 0xE4BF, PCI_ANY_ID, 0, 0,
4958*4882a593Smuzhiyun pbn_intel_i960 },
4959*4882a593Smuzhiyun
4960*4882a593Smuzhiyun /*
4961*4882a593Smuzhiyun * Xircom Cardbus/Ethernet combos
4962*4882a593Smuzhiyun */
4963*4882a593Smuzhiyun { PCI_VENDOR_ID_XIRCOM, PCI_DEVICE_ID_XIRCOM_X3201_MDM,
4964*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4965*4882a593Smuzhiyun pbn_b0_1_115200 },
4966*4882a593Smuzhiyun /*
4967*4882a593Smuzhiyun * Xircom RBM56G cardbus modem - Dirk Arnold (temp entry)
4968*4882a593Smuzhiyun */
4969*4882a593Smuzhiyun { PCI_VENDOR_ID_XIRCOM, PCI_DEVICE_ID_XIRCOM_RBM56G,
4970*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4971*4882a593Smuzhiyun pbn_b0_1_115200 },
4972*4882a593Smuzhiyun
4973*4882a593Smuzhiyun /*
4974*4882a593Smuzhiyun * Untested PCI modems, sent in from various folks...
4975*4882a593Smuzhiyun */
4976*4882a593Smuzhiyun
4977*4882a593Smuzhiyun /*
4978*4882a593Smuzhiyun * Elsa Model 56K PCI Modem, from Andreas Rath <arh@01019freenet.de>
4979*4882a593Smuzhiyun */
4980*4882a593Smuzhiyun { PCI_VENDOR_ID_ROCKWELL, 0x1004,
4981*4882a593Smuzhiyun 0x1048, 0x1500, 0, 0,
4982*4882a593Smuzhiyun pbn_b1_1_115200 },
4983*4882a593Smuzhiyun
4984*4882a593Smuzhiyun { PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3,
4985*4882a593Smuzhiyun 0xFF00, 0, 0, 0,
4986*4882a593Smuzhiyun pbn_sgi_ioc3 },
4987*4882a593Smuzhiyun
4988*4882a593Smuzhiyun /*
4989*4882a593Smuzhiyun * HP Diva card
4990*4882a593Smuzhiyun */
4991*4882a593Smuzhiyun { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
4992*4882a593Smuzhiyun PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_RMP3, 0, 0,
4993*4882a593Smuzhiyun pbn_b1_1_115200 },
4994*4882a593Smuzhiyun { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
4995*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4996*4882a593Smuzhiyun pbn_b0_5_115200 },
4997*4882a593Smuzhiyun { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
4998*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4999*4882a593Smuzhiyun pbn_b2_1_115200 },
5000*4882a593Smuzhiyun /* HPE PCI serial device */
5001*4882a593Smuzhiyun { PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
5002*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5003*4882a593Smuzhiyun pbn_b1_1_115200 },
5004*4882a593Smuzhiyun
5005*4882a593Smuzhiyun { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM2,
5006*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5007*4882a593Smuzhiyun pbn_b3_2_115200 },
5008*4882a593Smuzhiyun { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM4,
5009*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5010*4882a593Smuzhiyun pbn_b3_4_115200 },
5011*4882a593Smuzhiyun { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM8,
5012*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5013*4882a593Smuzhiyun pbn_b3_8_115200 },
5014*4882a593Smuzhiyun /*
5015*4882a593Smuzhiyun * Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART
5016*4882a593Smuzhiyun */
5017*4882a593Smuzhiyun { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7951,
5018*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5019*4882a593Smuzhiyun 0,
5020*4882a593Smuzhiyun 0, pbn_pericom_PI7C9X7951 },
5021*4882a593Smuzhiyun { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7952,
5022*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5023*4882a593Smuzhiyun 0,
5024*4882a593Smuzhiyun 0, pbn_pericom_PI7C9X7952 },
5025*4882a593Smuzhiyun { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7954,
5026*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5027*4882a593Smuzhiyun 0,
5028*4882a593Smuzhiyun 0, pbn_pericom_PI7C9X7954 },
5029*4882a593Smuzhiyun { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7958,
5030*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5031*4882a593Smuzhiyun 0,
5032*4882a593Smuzhiyun 0, pbn_pericom_PI7C9X7958 },
5033*4882a593Smuzhiyun /*
5034*4882a593Smuzhiyun * ACCES I/O Products quad
5035*4882a593Smuzhiyun */
5036*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB,
5037*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5038*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5039*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S,
5040*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5041*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5042*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
5043*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5044*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5045*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S,
5046*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5047*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5048*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB,
5049*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5050*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5051*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2,
5052*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5053*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5054*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
5055*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5056*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5057*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4,
5058*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5059*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5060*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB,
5061*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5062*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5063*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM,
5064*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5065*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5066*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
5067*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5068*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5069*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM,
5070*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5071*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5072*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1,
5073*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5074*4882a593Smuzhiyun pbn_pericom_PI7C9X7951 },
5075*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2,
5076*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5077*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5078*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2,
5079*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5080*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5081*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
5082*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5083*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5084*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4,
5085*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5086*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5087*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S,
5088*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5089*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5090*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
5091*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5092*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5093*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2,
5094*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5095*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5096*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2,
5097*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5098*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5099*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
5100*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5101*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5102*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4,
5103*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5104*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5105*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM,
5106*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5107*4882a593Smuzhiyun pbn_pericom_PI7C9X7952 },
5108*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
5109*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5110*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5111*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
5112*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5113*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5114*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8,
5115*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5116*4882a593Smuzhiyun pbn_pericom_PI7C9X7958 },
5117*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8,
5118*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5119*4882a593Smuzhiyun pbn_pericom_PI7C9X7958 },
5120*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
5121*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5122*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5123*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8,
5124*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5125*4882a593Smuzhiyun pbn_pericom_PI7C9X7958 },
5126*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
5127*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5128*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5129*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM,
5130*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5131*4882a593Smuzhiyun pbn_pericom_PI7C9X7958 },
5132*4882a593Smuzhiyun { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
5133*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5134*4882a593Smuzhiyun pbn_pericom_PI7C9X7954 },
5135*4882a593Smuzhiyun /*
5136*4882a593Smuzhiyun * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke)
5137*4882a593Smuzhiyun */
5138*4882a593Smuzhiyun { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560,
5139*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5140*4882a593Smuzhiyun pbn_b0_1_115200 },
5141*4882a593Smuzhiyun /*
5142*4882a593Smuzhiyun * ITE
5143*4882a593Smuzhiyun */
5144*4882a593Smuzhiyun { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8872,
5145*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5146*4882a593Smuzhiyun 0, 0,
5147*4882a593Smuzhiyun pbn_b1_bt_1_115200 },
5148*4882a593Smuzhiyun
5149*4882a593Smuzhiyun /*
5150*4882a593Smuzhiyun * IntaShield IS-200
5151*4882a593Smuzhiyun */
5152*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS200,
5153*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0811 */
5154*4882a593Smuzhiyun pbn_b2_2_115200 },
5155*4882a593Smuzhiyun /*
5156*4882a593Smuzhiyun * IntaShield IS-400
5157*4882a593Smuzhiyun */
5158*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS400,
5159*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0dc0 */
5160*4882a593Smuzhiyun pbn_b2_4_115200 },
5161*4882a593Smuzhiyun /* Brainboxes Devices */
5162*4882a593Smuzhiyun /*
5163*4882a593Smuzhiyun * Brainboxes UC-101
5164*4882a593Smuzhiyun */
5165*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0BA1,
5166*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5167*4882a593Smuzhiyun 0, 0,
5168*4882a593Smuzhiyun pbn_b2_2_115200 },
5169*4882a593Smuzhiyun /*
5170*4882a593Smuzhiyun * Brainboxes UC-235/246
5171*4882a593Smuzhiyun */
5172*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0AA1,
5173*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5174*4882a593Smuzhiyun 0, 0,
5175*4882a593Smuzhiyun pbn_b2_1_115200 },
5176*4882a593Smuzhiyun /*
5177*4882a593Smuzhiyun * Brainboxes UC-257
5178*4882a593Smuzhiyun */
5179*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0861,
5180*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5181*4882a593Smuzhiyun 0, 0,
5182*4882a593Smuzhiyun pbn_b2_2_115200 },
5183*4882a593Smuzhiyun /*
5184*4882a593Smuzhiyun * Brainboxes UC-260/271/701/756
5185*4882a593Smuzhiyun */
5186*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0D21,
5187*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5188*4882a593Smuzhiyun PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
5189*4882a593Smuzhiyun pbn_b2_4_115200 },
5190*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0E34,
5191*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5192*4882a593Smuzhiyun PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
5193*4882a593Smuzhiyun pbn_b2_4_115200 },
5194*4882a593Smuzhiyun /*
5195*4882a593Smuzhiyun * Brainboxes UC-268
5196*4882a593Smuzhiyun */
5197*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0841,
5198*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5199*4882a593Smuzhiyun 0, 0,
5200*4882a593Smuzhiyun pbn_b2_4_115200 },
5201*4882a593Smuzhiyun /*
5202*4882a593Smuzhiyun * Brainboxes UC-275/279
5203*4882a593Smuzhiyun */
5204*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0881,
5205*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5206*4882a593Smuzhiyun 0, 0,
5207*4882a593Smuzhiyun pbn_b2_8_115200 },
5208*4882a593Smuzhiyun /*
5209*4882a593Smuzhiyun * Brainboxes UC-302
5210*4882a593Smuzhiyun */
5211*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x08E1,
5212*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5213*4882a593Smuzhiyun 0, 0,
5214*4882a593Smuzhiyun pbn_b2_2_115200 },
5215*4882a593Smuzhiyun /*
5216*4882a593Smuzhiyun * Brainboxes UC-310
5217*4882a593Smuzhiyun */
5218*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x08C1,
5219*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5220*4882a593Smuzhiyun 0, 0,
5221*4882a593Smuzhiyun pbn_b2_2_115200 },
5222*4882a593Smuzhiyun /*
5223*4882a593Smuzhiyun * Brainboxes UC-313
5224*4882a593Smuzhiyun */
5225*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x08A3,
5226*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5227*4882a593Smuzhiyun 0, 0,
5228*4882a593Smuzhiyun pbn_b2_2_115200 },
5229*4882a593Smuzhiyun /*
5230*4882a593Smuzhiyun * Brainboxes UC-320/324
5231*4882a593Smuzhiyun */
5232*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0A61,
5233*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5234*4882a593Smuzhiyun 0, 0,
5235*4882a593Smuzhiyun pbn_b2_1_115200 },
5236*4882a593Smuzhiyun /*
5237*4882a593Smuzhiyun * Brainboxes UC-346
5238*4882a593Smuzhiyun */
5239*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0B02,
5240*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5241*4882a593Smuzhiyun 0, 0,
5242*4882a593Smuzhiyun pbn_b2_4_115200 },
5243*4882a593Smuzhiyun /*
5244*4882a593Smuzhiyun * Brainboxes UC-357
5245*4882a593Smuzhiyun */
5246*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0A81,
5247*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5248*4882a593Smuzhiyun 0, 0,
5249*4882a593Smuzhiyun pbn_b2_2_115200 },
5250*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0A83,
5251*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5252*4882a593Smuzhiyun 0, 0,
5253*4882a593Smuzhiyun pbn_b2_2_115200 },
5254*4882a593Smuzhiyun /*
5255*4882a593Smuzhiyun * Brainboxes UC-368
5256*4882a593Smuzhiyun */
5257*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0C41,
5258*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5259*4882a593Smuzhiyun 0, 0,
5260*4882a593Smuzhiyun pbn_b2_4_115200 },
5261*4882a593Smuzhiyun /*
5262*4882a593Smuzhiyun * Brainboxes UC-420/431
5263*4882a593Smuzhiyun */
5264*4882a593Smuzhiyun { PCI_VENDOR_ID_INTASHIELD, 0x0921,
5265*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5266*4882a593Smuzhiyun 0, 0,
5267*4882a593Smuzhiyun pbn_b2_4_115200 },
5268*4882a593Smuzhiyun /*
5269*4882a593Smuzhiyun * Perle PCI-RAS cards
5270*4882a593Smuzhiyun */
5271*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
5272*4882a593Smuzhiyun PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS4,
5273*4882a593Smuzhiyun 0, 0, pbn_b2_4_921600 },
5274*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
5275*4882a593Smuzhiyun PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS8,
5276*4882a593Smuzhiyun 0, 0, pbn_b2_8_921600 },
5277*4882a593Smuzhiyun
5278*4882a593Smuzhiyun /*
5279*4882a593Smuzhiyun * Mainpine series cards: Fairly standard layout but fools
5280*4882a593Smuzhiyun * parts of the autodetect in some cases and uses otherwise
5281*4882a593Smuzhiyun * unmatched communications subclasses in the PCI Express case
5282*4882a593Smuzhiyun */
5283*4882a593Smuzhiyun
5284*4882a593Smuzhiyun { /* RockForceDUO */
5285*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5286*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0200,
5287*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5288*4882a593Smuzhiyun { /* RockForceQUATRO */
5289*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5290*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0300,
5291*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5292*4882a593Smuzhiyun { /* RockForceDUO+ */
5293*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5294*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0400,
5295*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5296*4882a593Smuzhiyun { /* RockForceQUATRO+ */
5297*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5298*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0500,
5299*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5300*4882a593Smuzhiyun { /* RockForce+ */
5301*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5302*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0600,
5303*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5304*4882a593Smuzhiyun { /* RockForce+ */
5305*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5306*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0700,
5307*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5308*4882a593Smuzhiyun { /* RockForceOCTO+ */
5309*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5310*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0800,
5311*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5312*4882a593Smuzhiyun { /* RockForceDUO+ */
5313*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5314*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0C00,
5315*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5316*4882a593Smuzhiyun { /* RockForceQUARTRO+ */
5317*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5318*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x0D00,
5319*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5320*4882a593Smuzhiyun { /* RockForceOCTO+ */
5321*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5322*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x1D00,
5323*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5324*4882a593Smuzhiyun { /* RockForceD1 */
5325*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5326*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2000,
5327*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5328*4882a593Smuzhiyun { /* RockForceF1 */
5329*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5330*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2100,
5331*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5332*4882a593Smuzhiyun { /* RockForceD2 */
5333*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5334*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2200,
5335*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5336*4882a593Smuzhiyun { /* RockForceF2 */
5337*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5338*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2300,
5339*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5340*4882a593Smuzhiyun { /* RockForceD4 */
5341*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5342*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2400,
5343*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5344*4882a593Smuzhiyun { /* RockForceF4 */
5345*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5346*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2500,
5347*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5348*4882a593Smuzhiyun { /* RockForceD8 */
5349*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5350*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2600,
5351*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5352*4882a593Smuzhiyun { /* RockForceF8 */
5353*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5354*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x2700,
5355*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5356*4882a593Smuzhiyun { /* IQ Express D1 */
5357*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5358*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3000,
5359*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5360*4882a593Smuzhiyun { /* IQ Express F1 */
5361*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5362*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3100,
5363*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5364*4882a593Smuzhiyun { /* IQ Express D2 */
5365*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5366*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3200,
5367*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5368*4882a593Smuzhiyun { /* IQ Express F2 */
5369*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5370*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3300,
5371*4882a593Smuzhiyun 0, 0, pbn_b0_2_115200 },
5372*4882a593Smuzhiyun { /* IQ Express D4 */
5373*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5374*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3400,
5375*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5376*4882a593Smuzhiyun { /* IQ Express F4 */
5377*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5378*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3500,
5379*4882a593Smuzhiyun 0, 0, pbn_b0_4_115200 },
5380*4882a593Smuzhiyun { /* IQ Express D8 */
5381*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5382*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3C00,
5383*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5384*4882a593Smuzhiyun { /* IQ Express F8 */
5385*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5386*4882a593Smuzhiyun PCI_VENDOR_ID_MAINPINE, 0x3D00,
5387*4882a593Smuzhiyun 0, 0, pbn_b0_8_115200 },
5388*4882a593Smuzhiyun
5389*4882a593Smuzhiyun
5390*4882a593Smuzhiyun /*
5391*4882a593Smuzhiyun * PA Semi PA6T-1682M on-chip UART
5392*4882a593Smuzhiyun */
5393*4882a593Smuzhiyun { PCI_VENDOR_ID_PASEMI, 0xa004,
5394*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5395*4882a593Smuzhiyun pbn_pasemi_1682M },
5396*4882a593Smuzhiyun
5397*4882a593Smuzhiyun /*
5398*4882a593Smuzhiyun * National Instruments
5399*4882a593Smuzhiyun */
5400*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI23216,
5401*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5402*4882a593Smuzhiyun pbn_b1_16_115200 },
5403*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2328,
5404*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5405*4882a593Smuzhiyun pbn_b1_8_115200 },
5406*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324,
5407*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5408*4882a593Smuzhiyun pbn_b1_bt_4_115200 },
5409*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322,
5410*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5411*4882a593Smuzhiyun pbn_b1_bt_2_115200 },
5412*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324I,
5413*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5414*4882a593Smuzhiyun pbn_b1_bt_4_115200 },
5415*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322I,
5416*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5417*4882a593Smuzhiyun pbn_b1_bt_2_115200 },
5418*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_23216,
5419*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5420*4882a593Smuzhiyun pbn_b1_16_115200 },
5421*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2328,
5422*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5423*4882a593Smuzhiyun pbn_b1_8_115200 },
5424*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2324,
5425*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5426*4882a593Smuzhiyun pbn_b1_bt_4_115200 },
5427*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2322,
5428*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5429*4882a593Smuzhiyun pbn_b1_bt_2_115200 },
5430*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2324,
5431*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5432*4882a593Smuzhiyun pbn_b1_bt_4_115200 },
5433*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2322,
5434*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5435*4882a593Smuzhiyun pbn_b1_bt_2_115200 },
5436*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2322,
5437*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5438*4882a593Smuzhiyun pbn_ni8430_2 },
5439*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2322,
5440*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5441*4882a593Smuzhiyun pbn_ni8430_2 },
5442*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2324,
5443*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5444*4882a593Smuzhiyun pbn_ni8430_4 },
5445*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2324,
5446*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5447*4882a593Smuzhiyun pbn_ni8430_4 },
5448*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2328,
5449*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5450*4882a593Smuzhiyun pbn_ni8430_8 },
5451*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2328,
5452*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5453*4882a593Smuzhiyun pbn_ni8430_8 },
5454*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_23216,
5455*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5456*4882a593Smuzhiyun pbn_ni8430_16 },
5457*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_23216,
5458*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5459*4882a593Smuzhiyun pbn_ni8430_16 },
5460*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2322,
5461*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5462*4882a593Smuzhiyun pbn_ni8430_2 },
5463*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2322,
5464*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5465*4882a593Smuzhiyun pbn_ni8430_2 },
5466*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2324,
5467*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5468*4882a593Smuzhiyun pbn_ni8430_4 },
5469*4882a593Smuzhiyun { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2324,
5470*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5471*4882a593Smuzhiyun pbn_ni8430_4 },
5472*4882a593Smuzhiyun
5473*4882a593Smuzhiyun /*
5474*4882a593Smuzhiyun * MOXA
5475*4882a593Smuzhiyun */
5476*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102E,
5477*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5478*4882a593Smuzhiyun pbn_moxa8250_2p },
5479*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102EL,
5480*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5481*4882a593Smuzhiyun pbn_moxa8250_2p },
5482*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104EL_A,
5483*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5484*4882a593Smuzhiyun pbn_moxa8250_4p },
5485*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP114EL,
5486*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5487*4882a593Smuzhiyun pbn_moxa8250_4p },
5488*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_A,
5489*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5490*4882a593Smuzhiyun pbn_moxa8250_8p },
5491*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_B,
5492*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5493*4882a593Smuzhiyun pbn_moxa8250_8p },
5494*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118EL_A,
5495*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5496*4882a593Smuzhiyun pbn_moxa8250_8p },
5497*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118E_A_I,
5498*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5499*4882a593Smuzhiyun pbn_moxa8250_8p },
5500*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132EL,
5501*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5502*4882a593Smuzhiyun pbn_moxa8250_2p },
5503*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP134EL_A,
5504*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5505*4882a593Smuzhiyun pbn_moxa8250_4p },
5506*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP138E_A,
5507*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5508*4882a593Smuzhiyun pbn_moxa8250_8p },
5509*4882a593Smuzhiyun { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168EL_A,
5510*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5511*4882a593Smuzhiyun pbn_moxa8250_8p },
5512*4882a593Smuzhiyun
5513*4882a593Smuzhiyun /*
5514*4882a593Smuzhiyun * ADDI-DATA GmbH communication cards <info@addi-data.com>
5515*4882a593Smuzhiyun */
5516*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5517*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7500,
5518*4882a593Smuzhiyun PCI_ANY_ID,
5519*4882a593Smuzhiyun PCI_ANY_ID,
5520*4882a593Smuzhiyun 0,
5521*4882a593Smuzhiyun 0,
5522*4882a593Smuzhiyun pbn_b0_4_115200 },
5523*4882a593Smuzhiyun
5524*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5525*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7420,
5526*4882a593Smuzhiyun PCI_ANY_ID,
5527*4882a593Smuzhiyun PCI_ANY_ID,
5528*4882a593Smuzhiyun 0,
5529*4882a593Smuzhiyun 0,
5530*4882a593Smuzhiyun pbn_b0_2_115200 },
5531*4882a593Smuzhiyun
5532*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5533*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7300,
5534*4882a593Smuzhiyun PCI_ANY_ID,
5535*4882a593Smuzhiyun PCI_ANY_ID,
5536*4882a593Smuzhiyun 0,
5537*4882a593Smuzhiyun 0,
5538*4882a593Smuzhiyun pbn_b0_1_115200 },
5539*4882a593Smuzhiyun
5540*4882a593Smuzhiyun { PCI_VENDOR_ID_AMCC,
5541*4882a593Smuzhiyun PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800,
5542*4882a593Smuzhiyun PCI_ANY_ID,
5543*4882a593Smuzhiyun PCI_ANY_ID,
5544*4882a593Smuzhiyun 0,
5545*4882a593Smuzhiyun 0,
5546*4882a593Smuzhiyun pbn_b1_8_115200 },
5547*4882a593Smuzhiyun
5548*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5549*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7500_2,
5550*4882a593Smuzhiyun PCI_ANY_ID,
5551*4882a593Smuzhiyun PCI_ANY_ID,
5552*4882a593Smuzhiyun 0,
5553*4882a593Smuzhiyun 0,
5554*4882a593Smuzhiyun pbn_b0_4_115200 },
5555*4882a593Smuzhiyun
5556*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5557*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7420_2,
5558*4882a593Smuzhiyun PCI_ANY_ID,
5559*4882a593Smuzhiyun PCI_ANY_ID,
5560*4882a593Smuzhiyun 0,
5561*4882a593Smuzhiyun 0,
5562*4882a593Smuzhiyun pbn_b0_2_115200 },
5563*4882a593Smuzhiyun
5564*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5565*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7300_2,
5566*4882a593Smuzhiyun PCI_ANY_ID,
5567*4882a593Smuzhiyun PCI_ANY_ID,
5568*4882a593Smuzhiyun 0,
5569*4882a593Smuzhiyun 0,
5570*4882a593Smuzhiyun pbn_b0_1_115200 },
5571*4882a593Smuzhiyun
5572*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5573*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7500_3,
5574*4882a593Smuzhiyun PCI_ANY_ID,
5575*4882a593Smuzhiyun PCI_ANY_ID,
5576*4882a593Smuzhiyun 0,
5577*4882a593Smuzhiyun 0,
5578*4882a593Smuzhiyun pbn_b0_4_115200 },
5579*4882a593Smuzhiyun
5580*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5581*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7420_3,
5582*4882a593Smuzhiyun PCI_ANY_ID,
5583*4882a593Smuzhiyun PCI_ANY_ID,
5584*4882a593Smuzhiyun 0,
5585*4882a593Smuzhiyun 0,
5586*4882a593Smuzhiyun pbn_b0_2_115200 },
5587*4882a593Smuzhiyun
5588*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5589*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7300_3,
5590*4882a593Smuzhiyun PCI_ANY_ID,
5591*4882a593Smuzhiyun PCI_ANY_ID,
5592*4882a593Smuzhiyun 0,
5593*4882a593Smuzhiyun 0,
5594*4882a593Smuzhiyun pbn_b0_1_115200 },
5595*4882a593Smuzhiyun
5596*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5597*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCI7800_3,
5598*4882a593Smuzhiyun PCI_ANY_ID,
5599*4882a593Smuzhiyun PCI_ANY_ID,
5600*4882a593Smuzhiyun 0,
5601*4882a593Smuzhiyun 0,
5602*4882a593Smuzhiyun pbn_b0_8_115200 },
5603*4882a593Smuzhiyun
5604*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5605*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCIe7500,
5606*4882a593Smuzhiyun PCI_ANY_ID,
5607*4882a593Smuzhiyun PCI_ANY_ID,
5608*4882a593Smuzhiyun 0,
5609*4882a593Smuzhiyun 0,
5610*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_4_3906250 },
5611*4882a593Smuzhiyun
5612*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5613*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCIe7420,
5614*4882a593Smuzhiyun PCI_ANY_ID,
5615*4882a593Smuzhiyun PCI_ANY_ID,
5616*4882a593Smuzhiyun 0,
5617*4882a593Smuzhiyun 0,
5618*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_2_3906250 },
5619*4882a593Smuzhiyun
5620*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5621*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCIe7300,
5622*4882a593Smuzhiyun PCI_ANY_ID,
5623*4882a593Smuzhiyun PCI_ANY_ID,
5624*4882a593Smuzhiyun 0,
5625*4882a593Smuzhiyun 0,
5626*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_1_3906250 },
5627*4882a593Smuzhiyun
5628*4882a593Smuzhiyun { PCI_VENDOR_ID_ADDIDATA,
5629*4882a593Smuzhiyun PCI_DEVICE_ID_ADDIDATA_APCIe7800,
5630*4882a593Smuzhiyun PCI_ANY_ID,
5631*4882a593Smuzhiyun PCI_ANY_ID,
5632*4882a593Smuzhiyun 0,
5633*4882a593Smuzhiyun 0,
5634*4882a593Smuzhiyun pbn_ADDIDATA_PCIe_8_3906250 },
5635*4882a593Smuzhiyun
5636*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
5637*4882a593Smuzhiyun PCI_VENDOR_ID_IBM, 0x0299,
5638*4882a593Smuzhiyun 0, 0, pbn_b0_bt_2_115200 },
5639*4882a593Smuzhiyun
5640*4882a593Smuzhiyun /*
5641*4882a593Smuzhiyun * other NetMos 9835 devices are most likely handled by the
5642*4882a593Smuzhiyun * parport_serial driver, check drivers/parport/parport_serial.c
5643*4882a593Smuzhiyun * before adding them here.
5644*4882a593Smuzhiyun */
5645*4882a593Smuzhiyun
5646*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901,
5647*4882a593Smuzhiyun 0xA000, 0x1000,
5648*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5649*4882a593Smuzhiyun
5650*4882a593Smuzhiyun /* the 9901 is a rebranded 9912 */
5651*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
5652*4882a593Smuzhiyun 0xA000, 0x1000,
5653*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5654*4882a593Smuzhiyun
5655*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
5656*4882a593Smuzhiyun 0xA000, 0x1000,
5657*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5658*4882a593Smuzhiyun
5659*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9904,
5660*4882a593Smuzhiyun 0xA000, 0x1000,
5661*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5662*4882a593Smuzhiyun
5663*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
5664*4882a593Smuzhiyun 0xA000, 0x1000,
5665*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5666*4882a593Smuzhiyun
5667*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
5668*4882a593Smuzhiyun 0xA000, 0x3002,
5669*4882a593Smuzhiyun 0, 0, pbn_NETMOS9900_2s_115200 },
5670*4882a593Smuzhiyun
5671*4882a593Smuzhiyun /*
5672*4882a593Smuzhiyun * Best Connectivity and Rosewill PCI Multi I/O cards
5673*4882a593Smuzhiyun */
5674*4882a593Smuzhiyun
5675*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5676*4882a593Smuzhiyun 0xA000, 0x1000,
5677*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5678*4882a593Smuzhiyun
5679*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5680*4882a593Smuzhiyun 0xA000, 0x3002,
5681*4882a593Smuzhiyun 0, 0, pbn_b0_bt_2_115200 },
5682*4882a593Smuzhiyun
5683*4882a593Smuzhiyun { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5684*4882a593Smuzhiyun 0xA000, 0x3004,
5685*4882a593Smuzhiyun 0, 0, pbn_b0_bt_4_115200 },
5686*4882a593Smuzhiyun /* Intel CE4100 */
5687*4882a593Smuzhiyun { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
5688*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5689*4882a593Smuzhiyun pbn_ce4100_1_115200 },
5690*4882a593Smuzhiyun
5691*4882a593Smuzhiyun /*
5692*4882a593Smuzhiyun * Cronyx Omega PCI
5693*4882a593Smuzhiyun */
5694*4882a593Smuzhiyun { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_CRONYX_OMEGA,
5695*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5696*4882a593Smuzhiyun pbn_omegapci },
5697*4882a593Smuzhiyun
5698*4882a593Smuzhiyun /*
5699*4882a593Smuzhiyun * Broadcom TruManage
5700*4882a593Smuzhiyun */
5701*4882a593Smuzhiyun { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
5702*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5703*4882a593Smuzhiyun pbn_brcm_trumanage },
5704*4882a593Smuzhiyun
5705*4882a593Smuzhiyun /*
5706*4882a593Smuzhiyun * AgeStar as-prs2-009
5707*4882a593Smuzhiyun */
5708*4882a593Smuzhiyun { PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
5709*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5710*4882a593Smuzhiyun 0, 0, pbn_b0_bt_2_115200 },
5711*4882a593Smuzhiyun
5712*4882a593Smuzhiyun /*
5713*4882a593Smuzhiyun * WCH CH353 series devices: The 2S1P is handled by parport_serial
5714*4882a593Smuzhiyun * so not listed here.
5715*4882a593Smuzhiyun */
5716*4882a593Smuzhiyun { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S,
5717*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5718*4882a593Smuzhiyun 0, 0, pbn_b0_bt_4_115200 },
5719*4882a593Smuzhiyun
5720*4882a593Smuzhiyun { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF,
5721*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5722*4882a593Smuzhiyun 0, 0, pbn_b0_bt_2_115200 },
5723*4882a593Smuzhiyun
5724*4882a593Smuzhiyun { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH355_4S,
5725*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5726*4882a593Smuzhiyun 0, 0, pbn_b0_bt_4_115200 },
5727*4882a593Smuzhiyun
5728*4882a593Smuzhiyun { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH382_2S,
5729*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5730*4882a593Smuzhiyun 0, 0, pbn_wch382_2 },
5731*4882a593Smuzhiyun
5732*4882a593Smuzhiyun { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S,
5733*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5734*4882a593Smuzhiyun 0, 0, pbn_wch384_4 },
5735*4882a593Smuzhiyun
5736*4882a593Smuzhiyun { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_8S,
5737*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5738*4882a593Smuzhiyun 0, 0, pbn_wch384_8 },
5739*4882a593Smuzhiyun /*
5740*4882a593Smuzhiyun * Realtek RealManage
5741*4882a593Smuzhiyun */
5742*4882a593Smuzhiyun { PCI_VENDOR_ID_REALTEK, 0x816a,
5743*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5744*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5745*4882a593Smuzhiyun
5746*4882a593Smuzhiyun { PCI_VENDOR_ID_REALTEK, 0x816b,
5747*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5748*4882a593Smuzhiyun 0, 0, pbn_b0_1_115200 },
5749*4882a593Smuzhiyun
5750*4882a593Smuzhiyun /* Fintek PCI serial cards */
5751*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
5752*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
5753*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1112), .driver_data = pbn_fintek_12 },
5754*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1204), .driver_data = pbn_fintek_F81504A },
5755*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1208), .driver_data = pbn_fintek_F81508A },
5756*4882a593Smuzhiyun { PCI_DEVICE(0x1c29, 0x1212), .driver_data = pbn_fintek_F81512A },
5757*4882a593Smuzhiyun
5758*4882a593Smuzhiyun /* MKS Tenta SCOM-080x serial cards */
5759*4882a593Smuzhiyun { PCI_DEVICE(0x1601, 0x0800), .driver_data = pbn_b0_4_1250000 },
5760*4882a593Smuzhiyun { PCI_DEVICE(0x1601, 0xa801), .driver_data = pbn_b0_4_1250000 },
5761*4882a593Smuzhiyun
5762*4882a593Smuzhiyun /* Amazon PCI serial device */
5763*4882a593Smuzhiyun { PCI_DEVICE(0x1d0f, 0x8250), .driver_data = pbn_b0_1_115200 },
5764*4882a593Smuzhiyun
5765*4882a593Smuzhiyun /*
5766*4882a593Smuzhiyun * These entries match devices with class COMMUNICATION_SERIAL,
5767*4882a593Smuzhiyun * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
5768*4882a593Smuzhiyun */
5769*4882a593Smuzhiyun { PCI_ANY_ID, PCI_ANY_ID,
5770*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5771*4882a593Smuzhiyun PCI_CLASS_COMMUNICATION_SERIAL << 8,
5772*4882a593Smuzhiyun 0xffff00, pbn_default },
5773*4882a593Smuzhiyun { PCI_ANY_ID, PCI_ANY_ID,
5774*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5775*4882a593Smuzhiyun PCI_CLASS_COMMUNICATION_MODEM << 8,
5776*4882a593Smuzhiyun 0xffff00, pbn_default },
5777*4882a593Smuzhiyun { PCI_ANY_ID, PCI_ANY_ID,
5778*4882a593Smuzhiyun PCI_ANY_ID, PCI_ANY_ID,
5779*4882a593Smuzhiyun PCI_CLASS_COMMUNICATION_MULTISERIAL << 8,
5780*4882a593Smuzhiyun 0xffff00, pbn_default },
5781*4882a593Smuzhiyun { 0, }
5782*4882a593Smuzhiyun };
5783*4882a593Smuzhiyun
serial8250_io_error_detected(struct pci_dev * dev,pci_channel_state_t state)5784*4882a593Smuzhiyun static pci_ers_result_t serial8250_io_error_detected(struct pci_dev *dev,
5785*4882a593Smuzhiyun pci_channel_state_t state)
5786*4882a593Smuzhiyun {
5787*4882a593Smuzhiyun struct serial_private *priv = pci_get_drvdata(dev);
5788*4882a593Smuzhiyun
5789*4882a593Smuzhiyun if (state == pci_channel_io_perm_failure)
5790*4882a593Smuzhiyun return PCI_ERS_RESULT_DISCONNECT;
5791*4882a593Smuzhiyun
5792*4882a593Smuzhiyun if (priv)
5793*4882a593Smuzhiyun pciserial_detach_ports(priv);
5794*4882a593Smuzhiyun
5795*4882a593Smuzhiyun pci_disable_device(dev);
5796*4882a593Smuzhiyun
5797*4882a593Smuzhiyun return PCI_ERS_RESULT_NEED_RESET;
5798*4882a593Smuzhiyun }
5799*4882a593Smuzhiyun
serial8250_io_slot_reset(struct pci_dev * dev)5800*4882a593Smuzhiyun static pci_ers_result_t serial8250_io_slot_reset(struct pci_dev *dev)
5801*4882a593Smuzhiyun {
5802*4882a593Smuzhiyun int rc;
5803*4882a593Smuzhiyun
5804*4882a593Smuzhiyun rc = pci_enable_device(dev);
5805*4882a593Smuzhiyun
5806*4882a593Smuzhiyun if (rc)
5807*4882a593Smuzhiyun return PCI_ERS_RESULT_DISCONNECT;
5808*4882a593Smuzhiyun
5809*4882a593Smuzhiyun pci_restore_state(dev);
5810*4882a593Smuzhiyun pci_save_state(dev);
5811*4882a593Smuzhiyun
5812*4882a593Smuzhiyun return PCI_ERS_RESULT_RECOVERED;
5813*4882a593Smuzhiyun }
5814*4882a593Smuzhiyun
serial8250_io_resume(struct pci_dev * dev)5815*4882a593Smuzhiyun static void serial8250_io_resume(struct pci_dev *dev)
5816*4882a593Smuzhiyun {
5817*4882a593Smuzhiyun struct serial_private *priv = pci_get_drvdata(dev);
5818*4882a593Smuzhiyun struct serial_private *new;
5819*4882a593Smuzhiyun
5820*4882a593Smuzhiyun if (!priv)
5821*4882a593Smuzhiyun return;
5822*4882a593Smuzhiyun
5823*4882a593Smuzhiyun new = pciserial_init_ports(dev, priv->board);
5824*4882a593Smuzhiyun if (!IS_ERR(new)) {
5825*4882a593Smuzhiyun pci_set_drvdata(dev, new);
5826*4882a593Smuzhiyun kfree(priv);
5827*4882a593Smuzhiyun }
5828*4882a593Smuzhiyun }
5829*4882a593Smuzhiyun
5830*4882a593Smuzhiyun static const struct pci_error_handlers serial8250_err_handler = {
5831*4882a593Smuzhiyun .error_detected = serial8250_io_error_detected,
5832*4882a593Smuzhiyun .slot_reset = serial8250_io_slot_reset,
5833*4882a593Smuzhiyun .resume = serial8250_io_resume,
5834*4882a593Smuzhiyun };
5835*4882a593Smuzhiyun
5836*4882a593Smuzhiyun static struct pci_driver serial_pci_driver = {
5837*4882a593Smuzhiyun .name = "serial",
5838*4882a593Smuzhiyun .probe = pciserial_init_one,
5839*4882a593Smuzhiyun .remove = pciserial_remove_one,
5840*4882a593Smuzhiyun .driver = {
5841*4882a593Smuzhiyun .pm = &pciserial_pm_ops,
5842*4882a593Smuzhiyun },
5843*4882a593Smuzhiyun .id_table = serial_pci_tbl,
5844*4882a593Smuzhiyun .err_handler = &serial8250_err_handler,
5845*4882a593Smuzhiyun };
5846*4882a593Smuzhiyun
5847*4882a593Smuzhiyun module_pci_driver(serial_pci_driver);
5848*4882a593Smuzhiyun
5849*4882a593Smuzhiyun MODULE_LICENSE("GPL");
5850*4882a593Smuzhiyun MODULE_DESCRIPTION("Generic 8250/16x50 PCI serial probe module");
5851*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, serial_pci_tbl);
5852