| .. | .. |
|---|
| 19 | 19 | #include <linux/string.h> |
|---|
| 20 | 20 | #include <linux/tty.h> |
|---|
| 21 | 21 | #include <linux/8250_pci.h> |
|---|
| 22 | +#include <linux/delay.h> |
|---|
| 22 | 23 | |
|---|
| 23 | 24 | #include <asm/byteorder.h> |
|---|
| 24 | 25 | |
|---|
| 25 | 26 | #include "8250.h" |
|---|
| 26 | 27 | |
|---|
| 27 | | -#define PCI_DEVICE_ID_ACCES_COM_2S 0x1052 |
|---|
| 28 | | -#define PCI_DEVICE_ID_ACCES_COM_4S 0x105d |
|---|
| 29 | | -#define PCI_DEVICE_ID_ACCES_COM_8S 0x106c |
|---|
| 30 | | -#define PCI_DEVICE_ID_ACCES_COM232_8 0x10a8 |
|---|
| 31 | | -#define PCI_DEVICE_ID_ACCES_COM_2SM 0x10d2 |
|---|
| 32 | | -#define PCI_DEVICE_ID_ACCES_COM_4SM 0x10db |
|---|
| 33 | | -#define PCI_DEVICE_ID_ACCES_COM_8SM 0x10ea |
|---|
| 28 | +#define PCI_DEVICE_ID_ACCESSIO_COM_2S 0x1052 |
|---|
| 29 | +#define PCI_DEVICE_ID_ACCESSIO_COM_4S 0x105d |
|---|
| 30 | +#define PCI_DEVICE_ID_ACCESSIO_COM_8S 0x106c |
|---|
| 31 | +#define PCI_DEVICE_ID_ACCESSIO_COM232_8 0x10a8 |
|---|
| 32 | +#define PCI_DEVICE_ID_ACCESSIO_COM_2SM 0x10d2 |
|---|
| 33 | +#define PCI_DEVICE_ID_ACCESSIO_COM_4SM 0x10db |
|---|
| 34 | +#define PCI_DEVICE_ID_ACCESSIO_COM_8SM 0x10ea |
|---|
| 34 | 35 | |
|---|
| 35 | 36 | #define PCI_DEVICE_ID_COMMTECH_4224PCI335 0x0002 |
|---|
| 36 | 37 | #define PCI_DEVICE_ID_COMMTECH_4222PCI335 0x0004 |
|---|
| .. | .. |
|---|
| 39 | 40 | #define PCI_DEVICE_ID_COMMTECH_4224PCIE 0x0020 |
|---|
| 40 | 41 | #define PCI_DEVICE_ID_COMMTECH_4228PCIE 0x0021 |
|---|
| 41 | 42 | #define PCI_DEVICE_ID_COMMTECH_4222PCIE 0x0022 |
|---|
| 43 | + |
|---|
| 42 | 44 | #define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358 |
|---|
| 43 | 45 | #define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358 |
|---|
| 44 | 46 | |
|---|
| 47 | +#define PCI_SUBDEVICE_ID_USR_2980 0x0128 |
|---|
| 48 | +#define PCI_SUBDEVICE_ID_USR_2981 0x0129 |
|---|
| 49 | + |
|---|
| 50 | +#define PCI_DEVICE_ID_SEALEVEL_710xC 0x1001 |
|---|
| 51 | +#define PCI_DEVICE_ID_SEALEVEL_720xC 0x1002 |
|---|
| 52 | +#define PCI_DEVICE_ID_SEALEVEL_740xC 0x1004 |
|---|
| 53 | +#define PCI_DEVICE_ID_SEALEVEL_780xC 0x1008 |
|---|
| 54 | +#define PCI_DEVICE_ID_SEALEVEL_716xC 0x1010 |
|---|
| 55 | + |
|---|
| 45 | 56 | #define UART_EXAR_INT0 0x80 |
|---|
| 46 | 57 | #define UART_EXAR_8XMODE 0x88 /* 8X sampling rate select */ |
|---|
| 58 | +#define UART_EXAR_SLEEP 0x8b /* Sleep mode */ |
|---|
| 59 | +#define UART_EXAR_DVID 0x8d /* Device identification */ |
|---|
| 47 | 60 | |
|---|
| 48 | 61 | #define UART_EXAR_FCTR 0x08 /* Feature Control Register */ |
|---|
| 49 | 62 | #define UART_FCTR_EXAR_IRDA 0x10 /* IrDa data encode select */ |
|---|
| .. | .. |
|---|
| 132 | 145 | unsigned int nr; |
|---|
| 133 | 146 | struct exar8250_board *board; |
|---|
| 134 | 147 | void __iomem *virt; |
|---|
| 135 | | - int line[0]; |
|---|
| 148 | + int line[]; |
|---|
| 136 | 149 | }; |
|---|
| 150 | + |
|---|
| 151 | +static void exar_pm(struct uart_port *port, unsigned int state, unsigned int old) |
|---|
| 152 | +{ |
|---|
| 153 | + /* |
|---|
| 154 | + * Exar UARTs have a SLEEP register that enables or disables each UART |
|---|
| 155 | + * to enter sleep mode separately. On the XR17V35x the register |
|---|
| 156 | + * is accessible to each UART at the UART_EXAR_SLEEP offset, but |
|---|
| 157 | + * the UART channel may only write to the corresponding bit. |
|---|
| 158 | + */ |
|---|
| 159 | + serial_port_out(port, UART_EXAR_SLEEP, state ? 0xff : 0); |
|---|
| 160 | +} |
|---|
| 161 | + |
|---|
| 162 | +/* |
|---|
| 163 | + * XR17V35x UARTs have an extra fractional divisor register (DLD) |
|---|
| 164 | + * Calculate divisor with extra 4-bit fractional portion |
|---|
| 165 | + */ |
|---|
| 166 | +static unsigned int xr17v35x_get_divisor(struct uart_port *p, unsigned int baud, |
|---|
| 167 | + unsigned int *frac) |
|---|
| 168 | +{ |
|---|
| 169 | + unsigned int quot_16; |
|---|
| 170 | + |
|---|
| 171 | + quot_16 = DIV_ROUND_CLOSEST(p->uartclk, baud); |
|---|
| 172 | + *frac = quot_16 & 0x0f; |
|---|
| 173 | + |
|---|
| 174 | + return quot_16 >> 4; |
|---|
| 175 | +} |
|---|
| 176 | + |
|---|
| 177 | +static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud, |
|---|
| 178 | + unsigned int quot, unsigned int quot_frac) |
|---|
| 179 | +{ |
|---|
| 180 | + serial8250_do_set_divisor(p, baud, quot, quot_frac); |
|---|
| 181 | + |
|---|
| 182 | + /* Preserve bits not related to baudrate; DLD[7:4]. */ |
|---|
| 183 | + quot_frac |= serial_port_in(p, 0x2) & 0xf0; |
|---|
| 184 | + serial_port_out(p, 0x2, quot_frac); |
|---|
| 185 | +} |
|---|
| 186 | + |
|---|
| 187 | +static int xr17v35x_startup(struct uart_port *port) |
|---|
| 188 | +{ |
|---|
| 189 | + /* |
|---|
| 190 | + * First enable access to IER [7:5], ISR [5:4], FCR [5:4], |
|---|
| 191 | + * MCR [7:5] and MSR [7:0] |
|---|
| 192 | + */ |
|---|
| 193 | + serial_port_out(port, UART_XR_EFR, UART_EFR_ECB); |
|---|
| 194 | + |
|---|
| 195 | + /* |
|---|
| 196 | + * Make sure all interrups are masked until initialization is |
|---|
| 197 | + * complete and the FIFOs are cleared |
|---|
| 198 | + */ |
|---|
| 199 | + serial_port_out(port, UART_IER, 0); |
|---|
| 200 | + |
|---|
| 201 | + return serial8250_do_startup(port); |
|---|
| 202 | +} |
|---|
| 203 | + |
|---|
| 204 | +static void exar_shutdown(struct uart_port *port) |
|---|
| 205 | +{ |
|---|
| 206 | + unsigned char lsr; |
|---|
| 207 | + bool tx_complete = false; |
|---|
| 208 | + struct uart_8250_port *up = up_to_u8250p(port); |
|---|
| 209 | + struct circ_buf *xmit = &port->state->xmit; |
|---|
| 210 | + int i = 0; |
|---|
| 211 | + |
|---|
| 212 | + do { |
|---|
| 213 | + lsr = serial_in(up, UART_LSR); |
|---|
| 214 | + if (lsr & (UART_LSR_TEMT | UART_LSR_THRE)) |
|---|
| 215 | + tx_complete = true; |
|---|
| 216 | + else |
|---|
| 217 | + tx_complete = false; |
|---|
| 218 | + usleep_range(1000, 1100); |
|---|
| 219 | + } while (!uart_circ_empty(xmit) && !tx_complete && i++ < 1000); |
|---|
| 220 | + |
|---|
| 221 | + serial8250_do_shutdown(port); |
|---|
| 222 | +} |
|---|
| 137 | 223 | |
|---|
| 138 | 224 | static int default_setup(struct exar8250 *priv, struct pci_dev *pcidev, |
|---|
| 139 | 225 | int idx, unsigned int offset, |
|---|
| .. | .. |
|---|
| 141 | 227 | { |
|---|
| 142 | 228 | const struct exar8250_board *board = priv->board; |
|---|
| 143 | 229 | unsigned int bar = 0; |
|---|
| 230 | + unsigned char status; |
|---|
| 144 | 231 | |
|---|
| 145 | 232 | port->port.iotype = UPIO_MEM; |
|---|
| 146 | 233 | port->port.mapbase = pci_resource_start(pcidev, bar) + offset; |
|---|
| 147 | 234 | port->port.membase = priv->virt + offset; |
|---|
| 148 | 235 | port->port.regshift = board->reg_shift; |
|---|
| 236 | + |
|---|
| 237 | + /* |
|---|
| 238 | + * XR17V35x UARTs have an extra divisor register, DLD that gets enabled |
|---|
| 239 | + * with when DLAB is set which will cause the device to incorrectly match |
|---|
| 240 | + * and assign port type to PORT_16650. The EFR for this UART is found |
|---|
| 241 | + * at offset 0x09. Instead check the Deice ID (DVID) register |
|---|
| 242 | + * for a 2, 4 or 8 port UART. |
|---|
| 243 | + */ |
|---|
| 244 | + status = readb(port->port.membase + UART_EXAR_DVID); |
|---|
| 245 | + if (status == 0x82 || status == 0x84 || status == 0x88) { |
|---|
| 246 | + port->port.type = PORT_XR17V35X; |
|---|
| 247 | + |
|---|
| 248 | + port->port.get_divisor = xr17v35x_get_divisor; |
|---|
| 249 | + port->port.set_divisor = xr17v35x_set_divisor; |
|---|
| 250 | + |
|---|
| 251 | + port->port.startup = xr17v35x_startup; |
|---|
| 252 | + } else { |
|---|
| 253 | + port->port.type = PORT_XR17D15X; |
|---|
| 254 | + } |
|---|
| 255 | + |
|---|
| 256 | + port->port.pm = exar_pm; |
|---|
| 257 | + port->port.shutdown = exar_shutdown; |
|---|
| 149 | 258 | |
|---|
| 150 | 259 | return 0; |
|---|
| 151 | 260 | } |
|---|
| .. | .. |
|---|
| 379 | 488 | .register_gpio = iot2040_register_gpio, |
|---|
| 380 | 489 | }; |
|---|
| 381 | 490 | |
|---|
| 491 | +/* |
|---|
| 492 | + * For SIMATIC IOT2000, only IOT2040 and its variants have the Exar device, |
|---|
| 493 | + * IOT2020 doesn't have. Therefore it is sufficient to match on the common |
|---|
| 494 | + * board name after the device was found. |
|---|
| 495 | + */ |
|---|
| 382 | 496 | static const struct dmi_system_id exar_platforms[] = { |
|---|
| 383 | 497 | { |
|---|
| 384 | 498 | .matches = { |
|---|
| 385 | 499 | DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"), |
|---|
| 386 | | - DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG, |
|---|
| 387 | | - "6ES7647-0AA00-1YA2"), |
|---|
| 388 | 500 | }, |
|---|
| 389 | 501 | .driver_data = (void *)&iot2040_platform, |
|---|
| 390 | 502 | }, |
|---|
| .. | .. |
|---|
| 449 | 561 | port->port.private_data = NULL; |
|---|
| 450 | 562 | } |
|---|
| 451 | 563 | |
|---|
| 564 | +static inline void exar_misc_clear(struct exar8250 *priv) |
|---|
| 565 | +{ |
|---|
| 566 | + /* Clear all PCI interrupts by reading INT0. No effect on IIR */ |
|---|
| 567 | + readb(priv->virt + UART_EXAR_INT0); |
|---|
| 568 | + |
|---|
| 569 | + /* Clear INT0 for Expansion Interface slave ports, too */ |
|---|
| 570 | + if (priv->board->num_ports > 8) |
|---|
| 571 | + readb(priv->virt + 0x2000 + UART_EXAR_INT0); |
|---|
| 572 | +} |
|---|
| 573 | + |
|---|
| 452 | 574 | /* |
|---|
| 453 | 575 | * These Exar UARTs have an extra interrupt indicator that could fire for a |
|---|
| 454 | 576 | * few interrupts that are not presented/cleared through IIR. One of which is |
|---|
| .. | .. |
|---|
| 460 | 582 | */ |
|---|
| 461 | 583 | static irqreturn_t exar_misc_handler(int irq, void *data) |
|---|
| 462 | 584 | { |
|---|
| 463 | | - struct exar8250 *priv = data; |
|---|
| 464 | | - |
|---|
| 465 | | - /* Clear all PCI interrupts by reading INT0. No effect on IIR */ |
|---|
| 466 | | - readb(priv->virt + UART_EXAR_INT0); |
|---|
| 467 | | - |
|---|
| 468 | | - /* Clear INT0 for Expansion Interface slave ports, too */ |
|---|
| 469 | | - if (priv->board->num_ports > 8) |
|---|
| 470 | | - readb(priv->virt + 0x2000 + UART_EXAR_INT0); |
|---|
| 585 | + exar_misc_clear(data); |
|---|
| 471 | 586 | |
|---|
| 472 | 587 | return IRQ_HANDLED; |
|---|
| 473 | 588 | } |
|---|
| .. | .. |
|---|
| 491 | 606 | |
|---|
| 492 | 607 | maxnr = pci_resource_len(pcidev, bar) >> (board->reg_shift + 3); |
|---|
| 493 | 608 | |
|---|
| 494 | | - nr_ports = board->num_ports ? board->num_ports : pcidev->device & 0x0f; |
|---|
| 609 | + if (pcidev->vendor == PCI_VENDOR_ID_ACCESSIO) |
|---|
| 610 | + nr_ports = BIT(((pcidev->device & 0x38) >> 3) - 1); |
|---|
| 611 | + else if (board->num_ports) |
|---|
| 612 | + nr_ports = board->num_ports; |
|---|
| 613 | + else if (pcidev->vendor == PCI_VENDOR_ID_SEALEVEL) |
|---|
| 614 | + nr_ports = pcidev->device & 0xff; |
|---|
| 615 | + else |
|---|
| 616 | + nr_ports = pcidev->device & 0x0f; |
|---|
| 495 | 617 | |
|---|
| 496 | | - priv = devm_kzalloc(&pcidev->dev, sizeof(*priv) + |
|---|
| 497 | | - sizeof(unsigned int) * nr_ports, |
|---|
| 498 | | - GFP_KERNEL); |
|---|
| 618 | + priv = devm_kzalloc(&pcidev->dev, struct_size(priv, line, nr_ports), GFP_KERNEL); |
|---|
| 499 | 619 | if (!priv) |
|---|
| 500 | 620 | return -ENOMEM; |
|---|
| 501 | 621 | |
|---|
| .. | .. |
|---|
| 511 | 631 | return rc; |
|---|
| 512 | 632 | |
|---|
| 513 | 633 | memset(&uart, 0, sizeof(uart)); |
|---|
| 514 | | - uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ |
|---|
| 515 | | - | UPF_EXAR_EFR; |
|---|
| 634 | + uart.port.flags = UPF_SHARE_IRQ | UPF_EXAR_EFR | UPF_FIXED_TYPE | UPF_FIXED_PORT; |
|---|
| 516 | 635 | uart.port.irq = pci_irq_vector(pcidev, 0); |
|---|
| 517 | 636 | uart.port.dev = &pcidev->dev; |
|---|
| 518 | 637 | |
|---|
| .. | .. |
|---|
| 520 | 639 | IRQF_SHARED, "exar_uart", priv); |
|---|
| 521 | 640 | if (rc) |
|---|
| 522 | 641 | return rc; |
|---|
| 642 | + |
|---|
| 643 | + /* Clear interrupts */ |
|---|
| 644 | + exar_misc_clear(priv); |
|---|
| 523 | 645 | |
|---|
| 524 | 646 | for (i = 0; i < nr_ports && i < maxnr; i++) { |
|---|
| 525 | 647 | rc = board->setup(priv, pcidev, &uart, i); |
|---|
| .. | .. |
|---|
| 576 | 698 | |
|---|
| 577 | 699 | static int __maybe_unused exar_resume(struct device *dev) |
|---|
| 578 | 700 | { |
|---|
| 579 | | - struct pci_dev *pcidev = to_pci_dev(dev); |
|---|
| 580 | | - struct exar8250 *priv = pci_get_drvdata(pcidev); |
|---|
| 701 | + struct exar8250 *priv = dev_get_drvdata(dev); |
|---|
| 581 | 702 | unsigned int i; |
|---|
| 703 | + |
|---|
| 704 | + exar_misc_clear(priv); |
|---|
| 582 | 705 | |
|---|
| 583 | 706 | for (i = 0; i < priv->nr; i++) |
|---|
| 584 | 707 | if (priv->line[i] >= 0) |
|---|
| .. | .. |
|---|
| 588 | 711 | } |
|---|
| 589 | 712 | |
|---|
| 590 | 713 | static SIMPLE_DEV_PM_OPS(exar_pci_pm, exar_suspend, exar_resume); |
|---|
| 591 | | - |
|---|
| 592 | | -static const struct exar8250_board acces_com_2x = { |
|---|
| 593 | | - .num_ports = 2, |
|---|
| 594 | | - .setup = pci_xr17c154_setup, |
|---|
| 595 | | -}; |
|---|
| 596 | | - |
|---|
| 597 | | -static const struct exar8250_board acces_com_4x = { |
|---|
| 598 | | - .num_ports = 4, |
|---|
| 599 | | - .setup = pci_xr17c154_setup, |
|---|
| 600 | | -}; |
|---|
| 601 | | - |
|---|
| 602 | | -static const struct exar8250_board acces_com_8x = { |
|---|
| 603 | | - .num_ports = 8, |
|---|
| 604 | | - .setup = pci_xr17c154_setup, |
|---|
| 605 | | -}; |
|---|
| 606 | | - |
|---|
| 607 | 714 | |
|---|
| 608 | 715 | static const struct exar8250_board pbn_fastcom335_2 = { |
|---|
| 609 | 716 | .num_ports = 2, |
|---|
| .. | .. |
|---|
| 677 | 784 | (kernel_ulong_t)&bd \ |
|---|
| 678 | 785 | } |
|---|
| 679 | 786 | |
|---|
| 680 | | -#define EXAR_DEVICE(vend, devid, bd) { \ |
|---|
| 681 | | - PCI_VDEVICE(vend, PCI_DEVICE_ID_##devid), (kernel_ulong_t)&bd \ |
|---|
| 682 | | - } |
|---|
| 787 | +#define EXAR_DEVICE(vend, devid, bd) { PCI_DEVICE_DATA(vend, devid, &bd) } |
|---|
| 683 | 788 | |
|---|
| 684 | 789 | #define IBM_DEVICE(devid, sdevid, bd) { \ |
|---|
| 685 | 790 | PCI_DEVICE_SUB( \ |
|---|
| .. | .. |
|---|
| 690 | 795 | (kernel_ulong_t)&bd \ |
|---|
| 691 | 796 | } |
|---|
| 692 | 797 | |
|---|
| 693 | | -static const struct pci_device_id exar_pci_tbl[] = { |
|---|
| 694 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_2S, acces_com_2x), |
|---|
| 695 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_4S, acces_com_4x), |
|---|
| 696 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_8S, acces_com_8x), |
|---|
| 697 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM232_8, acces_com_8x), |
|---|
| 698 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_2SM, acces_com_2x), |
|---|
| 699 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_4SM, acces_com_4x), |
|---|
| 700 | | - EXAR_DEVICE(ACCESSIO, ACCES_COM_8SM, acces_com_8x), |
|---|
| 798 | +#define USR_DEVICE(devid, sdevid, bd) { \ |
|---|
| 799 | + PCI_DEVICE_SUB( \ |
|---|
| 800 | + PCI_VENDOR_ID_USR, \ |
|---|
| 801 | + PCI_DEVICE_ID_EXAR_##devid, \ |
|---|
| 802 | + PCI_VENDOR_ID_EXAR, \ |
|---|
| 803 | + PCI_SUBDEVICE_ID_USR_##sdevid), 0, 0, \ |
|---|
| 804 | + (kernel_ulong_t)&bd \ |
|---|
| 805 | + } |
|---|
| 701 | 806 | |
|---|
| 807 | +static const struct pci_device_id exar_pci_tbl[] = { |
|---|
| 808 | + EXAR_DEVICE(ACCESSIO, COM_2S, pbn_exar_XR17C15x), |
|---|
| 809 | + EXAR_DEVICE(ACCESSIO, COM_4S, pbn_exar_XR17C15x), |
|---|
| 810 | + EXAR_DEVICE(ACCESSIO, COM_8S, pbn_exar_XR17C15x), |
|---|
| 811 | + EXAR_DEVICE(ACCESSIO, COM232_8, pbn_exar_XR17C15x), |
|---|
| 812 | + EXAR_DEVICE(ACCESSIO, COM_2SM, pbn_exar_XR17C15x), |
|---|
| 813 | + EXAR_DEVICE(ACCESSIO, COM_4SM, pbn_exar_XR17C15x), |
|---|
| 814 | + EXAR_DEVICE(ACCESSIO, COM_8SM, pbn_exar_XR17C15x), |
|---|
| 702 | 815 | |
|---|
| 703 | 816 | CONNECT_DEVICE(XR17C152, UART_2_232, pbn_connect), |
|---|
| 704 | 817 | CONNECT_DEVICE(XR17C154, UART_4_232, pbn_connect), |
|---|
| .. | .. |
|---|
| 715 | 828 | |
|---|
| 716 | 829 | IBM_DEVICE(XR17C152, SATURN_SERIAL_ONE_PORT, pbn_exar_ibm_saturn), |
|---|
| 717 | 830 | |
|---|
| 831 | + /* USRobotics USR298x-OEM PCI Modems */ |
|---|
| 832 | + USR_DEVICE(XR17C152, 2980, pbn_exar_XR17C15x), |
|---|
| 833 | + USR_DEVICE(XR17C152, 2981, pbn_exar_XR17C15x), |
|---|
| 834 | + |
|---|
| 718 | 835 | /* Exar Corp. XR17C15[248] Dual/Quad/Octal UART */ |
|---|
| 719 | | - EXAR_DEVICE(EXAR, EXAR_XR17C152, pbn_exar_XR17C15x), |
|---|
| 720 | | - EXAR_DEVICE(EXAR, EXAR_XR17C154, pbn_exar_XR17C15x), |
|---|
| 721 | | - EXAR_DEVICE(EXAR, EXAR_XR17C158, pbn_exar_XR17C15x), |
|---|
| 836 | + EXAR_DEVICE(EXAR, XR17C152, pbn_exar_XR17C15x), |
|---|
| 837 | + EXAR_DEVICE(EXAR, XR17C154, pbn_exar_XR17C15x), |
|---|
| 838 | + EXAR_DEVICE(EXAR, XR17C158, pbn_exar_XR17C15x), |
|---|
| 722 | 839 | |
|---|
| 723 | 840 | /* Exar Corp. XR17V[48]35[248] Dual/Quad/Octal/Hexa PCIe UARTs */ |
|---|
| 724 | | - EXAR_DEVICE(EXAR, EXAR_XR17V352, pbn_exar_XR17V35x), |
|---|
| 725 | | - EXAR_DEVICE(EXAR, EXAR_XR17V354, pbn_exar_XR17V35x), |
|---|
| 726 | | - EXAR_DEVICE(EXAR, EXAR_XR17V358, pbn_exar_XR17V35x), |
|---|
| 727 | | - EXAR_DEVICE(EXAR, EXAR_XR17V4358, pbn_exar_XR17V4358), |
|---|
| 728 | | - EXAR_DEVICE(EXAR, EXAR_XR17V8358, pbn_exar_XR17V8358), |
|---|
| 729 | | - EXAR_DEVICE(COMMTECH, COMMTECH_4222PCIE, pbn_fastcom35x_2), |
|---|
| 730 | | - EXAR_DEVICE(COMMTECH, COMMTECH_4224PCIE, pbn_fastcom35x_4), |
|---|
| 731 | | - EXAR_DEVICE(COMMTECH, COMMTECH_4228PCIE, pbn_fastcom35x_8), |
|---|
| 841 | + EXAR_DEVICE(EXAR, XR17V352, pbn_exar_XR17V35x), |
|---|
| 842 | + EXAR_DEVICE(EXAR, XR17V354, pbn_exar_XR17V35x), |
|---|
| 843 | + EXAR_DEVICE(EXAR, XR17V358, pbn_exar_XR17V35x), |
|---|
| 844 | + EXAR_DEVICE(EXAR, XR17V4358, pbn_exar_XR17V4358), |
|---|
| 845 | + EXAR_DEVICE(EXAR, XR17V8358, pbn_exar_XR17V8358), |
|---|
| 846 | + EXAR_DEVICE(COMMTECH, 4222PCIE, pbn_fastcom35x_2), |
|---|
| 847 | + EXAR_DEVICE(COMMTECH, 4224PCIE, pbn_fastcom35x_4), |
|---|
| 848 | + EXAR_DEVICE(COMMTECH, 4228PCIE, pbn_fastcom35x_8), |
|---|
| 732 | 849 | |
|---|
| 733 | | - EXAR_DEVICE(COMMTECH, COMMTECH_4222PCI335, pbn_fastcom335_2), |
|---|
| 734 | | - EXAR_DEVICE(COMMTECH, COMMTECH_4224PCI335, pbn_fastcom335_4), |
|---|
| 735 | | - EXAR_DEVICE(COMMTECH, COMMTECH_2324PCI335, pbn_fastcom335_4), |
|---|
| 736 | | - EXAR_DEVICE(COMMTECH, COMMTECH_2328PCI335, pbn_fastcom335_8), |
|---|
| 850 | + EXAR_DEVICE(COMMTECH, 4222PCI335, pbn_fastcom335_2), |
|---|
| 851 | + EXAR_DEVICE(COMMTECH, 4224PCI335, pbn_fastcom335_4), |
|---|
| 852 | + EXAR_DEVICE(COMMTECH, 2324PCI335, pbn_fastcom335_4), |
|---|
| 853 | + EXAR_DEVICE(COMMTECH, 2328PCI335, pbn_fastcom335_8), |
|---|
| 854 | + |
|---|
| 855 | + EXAR_DEVICE(SEALEVEL, 710xC, pbn_exar_XR17V35x), |
|---|
| 856 | + EXAR_DEVICE(SEALEVEL, 720xC, pbn_exar_XR17V35x), |
|---|
| 857 | + EXAR_DEVICE(SEALEVEL, 740xC, pbn_exar_XR17V35x), |
|---|
| 858 | + EXAR_DEVICE(SEALEVEL, 780xC, pbn_exar_XR17V35x), |
|---|
| 859 | + EXAR_DEVICE(SEALEVEL, 716xC, pbn_exar_XR17V35x), |
|---|
| 737 | 860 | { 0, } |
|---|
| 738 | 861 | }; |
|---|
| 739 | 862 | MODULE_DEVICE_TABLE(pci, exar_pci_tbl); |
|---|