18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Support for common PCI multi-I/O cards (which is most of them) 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2001 Tim Waugh <twaugh@redhat.com> 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Multi-function PCI cards are supposed to present separate logical 88c2ecf20Sopenharmony_ci * devices on the bus. A common thing to do seems to be to just use 98c2ecf20Sopenharmony_ci * one logical device with lots of base address registers for both 108c2ecf20Sopenharmony_ci * parallel ports and serial ports. This driver is for dealing with 118c2ecf20Sopenharmony_ci * that. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 158c2ecf20Sopenharmony_ci#include <linux/module.h> 168c2ecf20Sopenharmony_ci#include <linux/parport.h> 178c2ecf20Sopenharmony_ci#include <linux/parport_pc.h> 188c2ecf20Sopenharmony_ci#include <linux/pci.h> 198c2ecf20Sopenharmony_ci#include <linux/slab.h> 208c2ecf20Sopenharmony_ci#include <linux/types.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#include <linux/8250_pci.h> 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cienum parport_pc_pci_cards { 258c2ecf20Sopenharmony_ci titan_110l = 0, 268c2ecf20Sopenharmony_ci titan_210l, 278c2ecf20Sopenharmony_ci netmos_9xx5_combo, 288c2ecf20Sopenharmony_ci netmos_9855, 298c2ecf20Sopenharmony_ci netmos_9855_2p, 308c2ecf20Sopenharmony_ci netmos_9900, 318c2ecf20Sopenharmony_ci netmos_9900_2p, 328c2ecf20Sopenharmony_ci netmos_99xx_1p, 338c2ecf20Sopenharmony_ci avlab_1s1p, 348c2ecf20Sopenharmony_ci avlab_1s2p, 358c2ecf20Sopenharmony_ci avlab_2s1p, 368c2ecf20Sopenharmony_ci siig_1s1p_10x, 378c2ecf20Sopenharmony_ci siig_2s1p_10x, 388c2ecf20Sopenharmony_ci siig_2p1s_20x, 398c2ecf20Sopenharmony_ci siig_1s1p_20x, 408c2ecf20Sopenharmony_ci siig_2s1p_20x, 418c2ecf20Sopenharmony_ci timedia_4078a, 428c2ecf20Sopenharmony_ci timedia_4079h, 438c2ecf20Sopenharmony_ci timedia_4085h, 448c2ecf20Sopenharmony_ci timedia_4088a, 458c2ecf20Sopenharmony_ci timedia_4089a, 468c2ecf20Sopenharmony_ci timedia_4095a, 478c2ecf20Sopenharmony_ci timedia_4096a, 488c2ecf20Sopenharmony_ci timedia_4078u, 498c2ecf20Sopenharmony_ci timedia_4079a, 508c2ecf20Sopenharmony_ci timedia_4085u, 518c2ecf20Sopenharmony_ci timedia_4079r, 528c2ecf20Sopenharmony_ci timedia_4079s, 538c2ecf20Sopenharmony_ci timedia_4079d, 548c2ecf20Sopenharmony_ci timedia_4079e, 558c2ecf20Sopenharmony_ci timedia_4079f, 568c2ecf20Sopenharmony_ci timedia_9079a, 578c2ecf20Sopenharmony_ci timedia_9079b, 588c2ecf20Sopenharmony_ci timedia_9079c, 598c2ecf20Sopenharmony_ci wch_ch353_1s1p, 608c2ecf20Sopenharmony_ci wch_ch353_2s1p, 618c2ecf20Sopenharmony_ci wch_ch382_0s1p, 628c2ecf20Sopenharmony_ci wch_ch382_2s1p, 638c2ecf20Sopenharmony_ci brainboxes_5s1p, 648c2ecf20Sopenharmony_ci sunix_4008a, 658c2ecf20Sopenharmony_ci sunix_5069a, 668c2ecf20Sopenharmony_ci sunix_5079a, 678c2ecf20Sopenharmony_ci sunix_5099a, 688c2ecf20Sopenharmony_ci brainboxes_uc257, 698c2ecf20Sopenharmony_ci brainboxes_is300, 708c2ecf20Sopenharmony_ci brainboxes_uc414, 718c2ecf20Sopenharmony_ci brainboxes_px263, 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* each element directly indexed from enum list, above */ 758c2ecf20Sopenharmony_cistruct parport_pc_pci { 768c2ecf20Sopenharmony_ci int numports; 778c2ecf20Sopenharmony_ci struct { /* BAR (base address registers) numbers in the config 788c2ecf20Sopenharmony_ci space header */ 798c2ecf20Sopenharmony_ci int lo; 808c2ecf20Sopenharmony_ci int hi; /* -1 if not there, >6 for offset-method (max 818c2ecf20Sopenharmony_ci BAR is 6) */ 828c2ecf20Sopenharmony_ci } addr[4]; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci /* If set, this is called immediately after pci_enable_device. 858c2ecf20Sopenharmony_ci * If it returns non-zero, no probing will take place and the 868c2ecf20Sopenharmony_ci * ports will not be used. */ 878c2ecf20Sopenharmony_ci int (*preinit_hook) (struct pci_dev *pdev, struct parport_pc_pci *card, 888c2ecf20Sopenharmony_ci int autoirq, int autodma); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci /* If set, this is called after probing for ports. If 'failed' 918c2ecf20Sopenharmony_ci * is non-zero we couldn't use any of the ports. */ 928c2ecf20Sopenharmony_ci void (*postinit_hook) (struct pci_dev *pdev, 938c2ecf20Sopenharmony_ci struct parport_pc_pci *card, int failed); 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic int netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par, 978c2ecf20Sopenharmony_ci int autoirq, int autodma) 988c2ecf20Sopenharmony_ci{ 998c2ecf20Sopenharmony_ci /* the rule described below doesn't hold for this device */ 1008c2ecf20Sopenharmony_ci if (dev->device == PCI_DEVICE_ID_NETMOS_9835 && 1018c2ecf20Sopenharmony_ci dev->subsystem_vendor == PCI_VENDOR_ID_IBM && 1028c2ecf20Sopenharmony_ci dev->subsystem_device == 0x0299) 1038c2ecf20Sopenharmony_ci return -ENODEV; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci if (dev->device == PCI_DEVICE_ID_NETMOS_9912) { 1068c2ecf20Sopenharmony_ci par->numports = 1; 1078c2ecf20Sopenharmony_ci } else { 1088c2ecf20Sopenharmony_ci /* 1098c2ecf20Sopenharmony_ci * Netmos uses the subdevice ID to indicate the number of parallel 1108c2ecf20Sopenharmony_ci * and serial ports. The form is 0x00PS, where <P> is the number of 1118c2ecf20Sopenharmony_ci * parallel ports and <S> is the number of serial ports. 1128c2ecf20Sopenharmony_ci */ 1138c2ecf20Sopenharmony_ci par->numports = (dev->subsystem_device & 0xf0) >> 4; 1148c2ecf20Sopenharmony_ci if (par->numports > ARRAY_SIZE(par->addr)) 1158c2ecf20Sopenharmony_ci par->numports = ARRAY_SIZE(par->addr); 1168c2ecf20Sopenharmony_ci } 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci return 0; 1198c2ecf20Sopenharmony_ci} 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic struct parport_pc_pci cards[] = { 1228c2ecf20Sopenharmony_ci /* titan_110l */ { 1, { { 3, -1 }, } }, 1238c2ecf20Sopenharmony_ci /* titan_210l */ { 1, { { 3, -1 }, } }, 1248c2ecf20Sopenharmony_ci /* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init }, 1258c2ecf20Sopenharmony_ci /* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init }, 1268c2ecf20Sopenharmony_ci /* netmos_9855_2p */ { 2, { { 0, -1 }, { 2, -1 }, } }, 1278c2ecf20Sopenharmony_ci /* netmos_9900 */ {1, { { 3, 4 }, }, netmos_parallel_init }, 1288c2ecf20Sopenharmony_ci /* netmos_9900_2p */ {2, { { 0, 1 }, { 3, 4 }, } }, 1298c2ecf20Sopenharmony_ci /* netmos_99xx_1p */ {1, { { 0, 1 }, } }, 1308c2ecf20Sopenharmony_ci /* avlab_1s1p */ { 1, { { 1, 2}, } }, 1318c2ecf20Sopenharmony_ci /* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} }, 1328c2ecf20Sopenharmony_ci /* avlab_2s1p */ { 1, { { 2, 3}, } }, 1338c2ecf20Sopenharmony_ci /* siig_1s1p_10x */ { 1, { { 3, 4 }, } }, 1348c2ecf20Sopenharmony_ci /* siig_2s1p_10x */ { 1, { { 4, 5 }, } }, 1358c2ecf20Sopenharmony_ci /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } }, 1368c2ecf20Sopenharmony_ci /* siig_1s1p_20x */ { 1, { { 1, 2 }, } }, 1378c2ecf20Sopenharmony_ci /* siig_2s1p_20x */ { 1, { { 2, 3 }, } }, 1388c2ecf20Sopenharmony_ci /* timedia_4078a */ { 1, { { 2, -1 }, } }, 1398c2ecf20Sopenharmony_ci /* timedia_4079h */ { 1, { { 2, 3 }, } }, 1408c2ecf20Sopenharmony_ci /* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } }, 1418c2ecf20Sopenharmony_ci /* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 1428c2ecf20Sopenharmony_ci /* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 1438c2ecf20Sopenharmony_ci /* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 1448c2ecf20Sopenharmony_ci /* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 1458c2ecf20Sopenharmony_ci /* timedia_4078u */ { 1, { { 2, -1 }, } }, 1468c2ecf20Sopenharmony_ci /* timedia_4079a */ { 1, { { 2, 3 }, } }, 1478c2ecf20Sopenharmony_ci /* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } }, 1488c2ecf20Sopenharmony_ci /* timedia_4079r */ { 1, { { 2, 3 }, } }, 1498c2ecf20Sopenharmony_ci /* timedia_4079s */ { 1, { { 2, 3 }, } }, 1508c2ecf20Sopenharmony_ci /* timedia_4079d */ { 1, { { 2, 3 }, } }, 1518c2ecf20Sopenharmony_ci /* timedia_4079e */ { 1, { { 2, 3 }, } }, 1528c2ecf20Sopenharmony_ci /* timedia_4079f */ { 1, { { 2, 3 }, } }, 1538c2ecf20Sopenharmony_ci /* timedia_9079a */ { 1, { { 2, 3 }, } }, 1548c2ecf20Sopenharmony_ci /* timedia_9079b */ { 1, { { 2, 3 }, } }, 1558c2ecf20Sopenharmony_ci /* timedia_9079c */ { 1, { { 2, 3 }, } }, 1568c2ecf20Sopenharmony_ci /* wch_ch353_1s1p*/ { 1, { { 1, -1}, } }, 1578c2ecf20Sopenharmony_ci /* wch_ch353_2s1p*/ { 1, { { 2, -1}, } }, 1588c2ecf20Sopenharmony_ci /* wch_ch382_0s1p*/ { 1, { { 2, -1}, } }, 1598c2ecf20Sopenharmony_ci /* wch_ch382_2s1p*/ { 1, { { 2, -1}, } }, 1608c2ecf20Sopenharmony_ci /* brainboxes_5s1p */ { 1, { { 3, -1 }, } }, 1618c2ecf20Sopenharmony_ci /* sunix_4008a */ { 1, { { 1, 2 }, } }, 1628c2ecf20Sopenharmony_ci /* sunix_5069a */ { 1, { { 1, 2 }, } }, 1638c2ecf20Sopenharmony_ci /* sunix_5079a */ { 1, { { 1, 2 }, } }, 1648c2ecf20Sopenharmony_ci /* sunix_5099a */ { 1, { { 1, 2 }, } }, 1658c2ecf20Sopenharmony_ci /* brainboxes_uc257 */ { 1, { { 3, -1 }, } }, 1668c2ecf20Sopenharmony_ci /* brainboxes_is300 */ { 1, { { 3, -1 }, } }, 1678c2ecf20Sopenharmony_ci /* brainboxes_uc414 */ { 1, { { 3, -1 }, } }, 1688c2ecf20Sopenharmony_ci /* brainboxes_px263 */ { 1, { { 3, -1 }, } }, 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_cistatic struct pci_device_id parport_serial_pci_tbl[] = { 1728c2ecf20Sopenharmony_ci /* PCI cards */ 1738c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_110L, 1748c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_110l }, 1758c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_210L, 1768c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_210l }, 1778c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9735, 1788c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, 1798c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9745, 1808c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, 1818c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, 1828c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, 1838c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845, 1848c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo }, 1858c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, 1868c2ecf20Sopenharmony_ci 0x1000, 0x0020, 0, 0, netmos_9855_2p }, 1878c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, 1888c2ecf20Sopenharmony_ci 0x1000, 0x0022, 0, 0, netmos_9855_2p }, 1898c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, 1908c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 }, 1918c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 1928c2ecf20Sopenharmony_ci 0xA000, 0x3011, 0, 0, netmos_9900 }, 1938c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 1948c2ecf20Sopenharmony_ci 0xA000, 0x3012, 0, 0, netmos_9900 }, 1958c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 1968c2ecf20Sopenharmony_ci 0xA000, 0x3020, 0, 0, netmos_9900_2p }, 1978c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912, 1988c2ecf20Sopenharmony_ci 0xA000, 0x2000, 0, 0, netmos_99xx_1p }, 1998c2ecf20Sopenharmony_ci /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/ 2008c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2110, 2018c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, 2028c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2111, 2038c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, 2048c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2112, 2058c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, 2068c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2140, 2078c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, 2088c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2141, 2098c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, 2108c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2142, 2118c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p }, 2128c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2160, 2138c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, 2148c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2161, 2158c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, 2168c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_AFAVLAB, 0x2162, 2178c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p }, 2188c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, 2198c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x }, 2208c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, 2218c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x }, 2228c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, 2238c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x }, 2248c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, 2258c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x }, 2268c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, 2278c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x }, 2288c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, 2298c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x }, 2308c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, 2318c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x }, 2328c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, 2338c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x }, 2348c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, 2358c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x }, 2368c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, 2378c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 2388c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, 2398c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x }, 2408c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, 2418c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x }, 2428c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, 2438c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 2448c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, 2458c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 2468c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, 2478c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 2488c2ecf20Sopenharmony_ci /* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/ 2498c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a }, 2508c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h }, 2518c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4085, 0, 0, timedia_4085h }, 2528c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4088, 0, 0, timedia_4088a }, 2538c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4089, 0, 0, timedia_4089a }, 2548c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4095, 0, 0, timedia_4095a }, 2558c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x4096, 0, 0, timedia_4096a }, 2568c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x5078, 0, 0, timedia_4078u }, 2578c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x5079, 0, 0, timedia_4079a }, 2588c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x5085, 0, 0, timedia_4085u }, 2598c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x6079, 0, 0, timedia_4079r }, 2608c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x7079, 0, 0, timedia_4079s }, 2618c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x8079, 0, 0, timedia_4079d }, 2628c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0x9079, 0, 0, timedia_4079e }, 2638c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0xa079, 0, 0, timedia_4079f }, 2648c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a }, 2658c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b }, 2668c2ecf20Sopenharmony_ci { 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c }, 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci /* WCH CARDS */ 2698c2ecf20Sopenharmony_ci { 0x4348, 0x5053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch353_1s1p}, 2708c2ecf20Sopenharmony_ci { 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p}, 2718c2ecf20Sopenharmony_ci { 0x1c00, 0x3050, 0x1c00, 0x3050, 0, 0, wch_ch382_0s1p}, 2728c2ecf20Sopenharmony_ci { 0x1c00, 0x3250, 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p}, 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci /* BrainBoxes PX272/PX306 MIO card */ 2758c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x4100, 2768c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_5s1p }, 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci /* Sunix boards */ 2798c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX, 2808c2ecf20Sopenharmony_ci 0x0100, 0, 0, sunix_4008a }, 2818c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX, 2828c2ecf20Sopenharmony_ci 0x0101, 0, 0, sunix_5069a }, 2838c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX, 2848c2ecf20Sopenharmony_ci 0x0102, 0, 0, sunix_5079a }, 2858c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX, 2868c2ecf20Sopenharmony_ci 0x0104, 0, 0, sunix_5099a }, 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci /* Brainboxes UC-203 */ 2898c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0bc1, 2908c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 2918c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0bc2, 2928c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci /* Brainboxes UC-257 */ 2958c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0861, 2968c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 2978c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0862, 2988c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 2998c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0863, 3008c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci /* Brainboxes UC-414 */ 3038c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0e61, 3048c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc414 }, 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci /* Brainboxes UC-475 */ 3078c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0981, 3088c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 3098c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0982, 3108c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 }, 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci /* Brainboxes IS-300/IS-500 */ 3138c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x0da0, 3148c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_is300 }, 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci /* Brainboxes PX-263/PX-295 */ 3178c2ecf20Sopenharmony_ci { PCI_VENDOR_ID_INTASHIELD, 0x402c, 3188c2ecf20Sopenharmony_ci PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_px263 }, 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci { 0, } /* terminate list */ 3218c2ecf20Sopenharmony_ci}; 3228c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl); 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci/* 3258c2ecf20Sopenharmony_ci * This table describes the serial "geometry" of these boards. Any 3268c2ecf20Sopenharmony_ci * quirks for these can be found in drivers/serial/8250_pci.c 3278c2ecf20Sopenharmony_ci * 3288c2ecf20Sopenharmony_ci * Cards not tested are marked n/t 3298c2ecf20Sopenharmony_ci * If you have one of these cards and it works for you, please tell me.. 3308c2ecf20Sopenharmony_ci */ 3318c2ecf20Sopenharmony_cistatic struct pciserial_board pci_parport_serial_boards[] = { 3328c2ecf20Sopenharmony_ci [titan_110l] = { 3338c2ecf20Sopenharmony_ci .flags = FL_BASE1 | FL_BASE_BARS, 3348c2ecf20Sopenharmony_ci .num_ports = 1, 3358c2ecf20Sopenharmony_ci .base_baud = 921600, 3368c2ecf20Sopenharmony_ci .uart_offset = 8, 3378c2ecf20Sopenharmony_ci }, 3388c2ecf20Sopenharmony_ci [titan_210l] = { 3398c2ecf20Sopenharmony_ci .flags = FL_BASE1 | FL_BASE_BARS, 3408c2ecf20Sopenharmony_ci .num_ports = 2, 3418c2ecf20Sopenharmony_ci .base_baud = 921600, 3428c2ecf20Sopenharmony_ci .uart_offset = 8, 3438c2ecf20Sopenharmony_ci }, 3448c2ecf20Sopenharmony_ci [netmos_9xx5_combo] = { 3458c2ecf20Sopenharmony_ci .flags = FL_BASE0 | FL_BASE_BARS, 3468c2ecf20Sopenharmony_ci .num_ports = 1, 3478c2ecf20Sopenharmony_ci .base_baud = 115200, 3488c2ecf20Sopenharmony_ci .uart_offset = 8, 3498c2ecf20Sopenharmony_ci }, 3508c2ecf20Sopenharmony_ci [netmos_9855] = { 3518c2ecf20Sopenharmony_ci .flags = FL_BASE2 | FL_BASE_BARS, 3528c2ecf20Sopenharmony_ci .num_ports = 1, 3538c2ecf20Sopenharmony_ci .base_baud = 115200, 3548c2ecf20Sopenharmony_ci .uart_offset = 8, 3558c2ecf20Sopenharmony_ci }, 3568c2ecf20Sopenharmony_ci [netmos_9855_2p] = { 3578c2ecf20Sopenharmony_ci .flags = FL_BASE4 | FL_BASE_BARS, 3588c2ecf20Sopenharmony_ci .num_ports = 1, 3598c2ecf20Sopenharmony_ci .base_baud = 115200, 3608c2ecf20Sopenharmony_ci .uart_offset = 8, 3618c2ecf20Sopenharmony_ci }, 3628c2ecf20Sopenharmony_ci [netmos_9900] = { /* n/t */ 3638c2ecf20Sopenharmony_ci .flags = FL_BASE0 | FL_BASE_BARS, 3648c2ecf20Sopenharmony_ci .num_ports = 1, 3658c2ecf20Sopenharmony_ci .base_baud = 115200, 3668c2ecf20Sopenharmony_ci .uart_offset = 8, 3678c2ecf20Sopenharmony_ci }, 3688c2ecf20Sopenharmony_ci [netmos_9900_2p] = { /* parallel only */ /* n/t */ 3698c2ecf20Sopenharmony_ci .flags = FL_BASE0, 3708c2ecf20Sopenharmony_ci .num_ports = 0, 3718c2ecf20Sopenharmony_ci .base_baud = 115200, 3728c2ecf20Sopenharmony_ci .uart_offset = 8, 3738c2ecf20Sopenharmony_ci }, 3748c2ecf20Sopenharmony_ci [netmos_99xx_1p] = { /* parallel only */ /* n/t */ 3758c2ecf20Sopenharmony_ci .flags = FL_BASE0, 3768c2ecf20Sopenharmony_ci .num_ports = 0, 3778c2ecf20Sopenharmony_ci .base_baud = 115200, 3788c2ecf20Sopenharmony_ci .uart_offset = 8, 3798c2ecf20Sopenharmony_ci }, 3808c2ecf20Sopenharmony_ci [avlab_1s1p] = { /* n/t */ 3818c2ecf20Sopenharmony_ci .flags = FL_BASE0 | FL_BASE_BARS, 3828c2ecf20Sopenharmony_ci .num_ports = 1, 3838c2ecf20Sopenharmony_ci .base_baud = 115200, 3848c2ecf20Sopenharmony_ci .uart_offset = 8, 3858c2ecf20Sopenharmony_ci }, 3868c2ecf20Sopenharmony_ci [avlab_1s2p] = { /* n/t */ 3878c2ecf20Sopenharmony_ci .flags = FL_BASE0 | FL_BASE_BARS, 3888c2ecf20Sopenharmony_ci .num_ports = 1, 3898c2ecf20Sopenharmony_ci .base_baud = 115200, 3908c2ecf20Sopenharmony_ci .uart_offset = 8, 3918c2ecf20Sopenharmony_ci }, 3928c2ecf20Sopenharmony_ci [avlab_2s1p] = { /* n/t */ 3938c2ecf20Sopenharmony_ci .flags = FL_BASE0 | FL_BASE_BARS, 3948c2ecf20Sopenharmony_ci .num_ports = 2, 3958c2ecf20Sopenharmony_ci .base_baud = 115200, 3968c2ecf20Sopenharmony_ci .uart_offset = 8, 3978c2ecf20Sopenharmony_ci }, 3988c2ecf20Sopenharmony_ci [siig_1s1p_10x] = { 3998c2ecf20Sopenharmony_ci .flags = FL_BASE2, 4008c2ecf20Sopenharmony_ci .num_ports = 1, 4018c2ecf20Sopenharmony_ci .base_baud = 460800, 4028c2ecf20Sopenharmony_ci .uart_offset = 8, 4038c2ecf20Sopenharmony_ci }, 4048c2ecf20Sopenharmony_ci [siig_2s1p_10x] = { 4058c2ecf20Sopenharmony_ci .flags = FL_BASE2, 4068c2ecf20Sopenharmony_ci .num_ports = 1, 4078c2ecf20Sopenharmony_ci .base_baud = 921600, 4088c2ecf20Sopenharmony_ci .uart_offset = 8, 4098c2ecf20Sopenharmony_ci }, 4108c2ecf20Sopenharmony_ci [siig_2p1s_20x] = { 4118c2ecf20Sopenharmony_ci .flags = FL_BASE0, 4128c2ecf20Sopenharmony_ci .num_ports = 1, 4138c2ecf20Sopenharmony_ci .base_baud = 921600, 4148c2ecf20Sopenharmony_ci .uart_offset = 8, 4158c2ecf20Sopenharmony_ci }, 4168c2ecf20Sopenharmony_ci [siig_1s1p_20x] = { 4178c2ecf20Sopenharmony_ci .flags = FL_BASE0, 4188c2ecf20Sopenharmony_ci .num_ports = 1, 4198c2ecf20Sopenharmony_ci .base_baud = 921600, 4208c2ecf20Sopenharmony_ci .uart_offset = 8, 4218c2ecf20Sopenharmony_ci }, 4228c2ecf20Sopenharmony_ci [siig_2s1p_20x] = { 4238c2ecf20Sopenharmony_ci .flags = FL_BASE0, 4248c2ecf20Sopenharmony_ci .num_ports = 1, 4258c2ecf20Sopenharmony_ci .base_baud = 921600, 4268c2ecf20Sopenharmony_ci .uart_offset = 8, 4278c2ecf20Sopenharmony_ci }, 4288c2ecf20Sopenharmony_ci [timedia_4078a] = { 4298c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4308c2ecf20Sopenharmony_ci .num_ports = 1, 4318c2ecf20Sopenharmony_ci .base_baud = 921600, 4328c2ecf20Sopenharmony_ci .uart_offset = 8, 4338c2ecf20Sopenharmony_ci }, 4348c2ecf20Sopenharmony_ci [timedia_4079h] = { 4358c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4368c2ecf20Sopenharmony_ci .num_ports = 1, 4378c2ecf20Sopenharmony_ci .base_baud = 921600, 4388c2ecf20Sopenharmony_ci .uart_offset = 8, 4398c2ecf20Sopenharmony_ci }, 4408c2ecf20Sopenharmony_ci [timedia_4085h] = { 4418c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4428c2ecf20Sopenharmony_ci .num_ports = 1, 4438c2ecf20Sopenharmony_ci .base_baud = 921600, 4448c2ecf20Sopenharmony_ci .uart_offset = 8, 4458c2ecf20Sopenharmony_ci }, 4468c2ecf20Sopenharmony_ci [timedia_4088a] = { 4478c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4488c2ecf20Sopenharmony_ci .num_ports = 1, 4498c2ecf20Sopenharmony_ci .base_baud = 921600, 4508c2ecf20Sopenharmony_ci .uart_offset = 8, 4518c2ecf20Sopenharmony_ci }, 4528c2ecf20Sopenharmony_ci [timedia_4089a] = { 4538c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4548c2ecf20Sopenharmony_ci .num_ports = 1, 4558c2ecf20Sopenharmony_ci .base_baud = 921600, 4568c2ecf20Sopenharmony_ci .uart_offset = 8, 4578c2ecf20Sopenharmony_ci }, 4588c2ecf20Sopenharmony_ci [timedia_4095a] = { 4598c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4608c2ecf20Sopenharmony_ci .num_ports = 1, 4618c2ecf20Sopenharmony_ci .base_baud = 921600, 4628c2ecf20Sopenharmony_ci .uart_offset = 8, 4638c2ecf20Sopenharmony_ci }, 4648c2ecf20Sopenharmony_ci [timedia_4096a] = { 4658c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4668c2ecf20Sopenharmony_ci .num_ports = 1, 4678c2ecf20Sopenharmony_ci .base_baud = 921600, 4688c2ecf20Sopenharmony_ci .uart_offset = 8, 4698c2ecf20Sopenharmony_ci }, 4708c2ecf20Sopenharmony_ci [timedia_4078u] = { 4718c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4728c2ecf20Sopenharmony_ci .num_ports = 1, 4738c2ecf20Sopenharmony_ci .base_baud = 921600, 4748c2ecf20Sopenharmony_ci .uart_offset = 8, 4758c2ecf20Sopenharmony_ci }, 4768c2ecf20Sopenharmony_ci [timedia_4079a] = { 4778c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4788c2ecf20Sopenharmony_ci .num_ports = 1, 4798c2ecf20Sopenharmony_ci .base_baud = 921600, 4808c2ecf20Sopenharmony_ci .uart_offset = 8, 4818c2ecf20Sopenharmony_ci }, 4828c2ecf20Sopenharmony_ci [timedia_4085u] = { 4838c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4848c2ecf20Sopenharmony_ci .num_ports = 1, 4858c2ecf20Sopenharmony_ci .base_baud = 921600, 4868c2ecf20Sopenharmony_ci .uart_offset = 8, 4878c2ecf20Sopenharmony_ci }, 4888c2ecf20Sopenharmony_ci [timedia_4079r] = { 4898c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4908c2ecf20Sopenharmony_ci .num_ports = 1, 4918c2ecf20Sopenharmony_ci .base_baud = 921600, 4928c2ecf20Sopenharmony_ci .uart_offset = 8, 4938c2ecf20Sopenharmony_ci }, 4948c2ecf20Sopenharmony_ci [timedia_4079s] = { 4958c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 4968c2ecf20Sopenharmony_ci .num_ports = 1, 4978c2ecf20Sopenharmony_ci .base_baud = 921600, 4988c2ecf20Sopenharmony_ci .uart_offset = 8, 4998c2ecf20Sopenharmony_ci }, 5008c2ecf20Sopenharmony_ci [timedia_4079d] = { 5018c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5028c2ecf20Sopenharmony_ci .num_ports = 1, 5038c2ecf20Sopenharmony_ci .base_baud = 921600, 5048c2ecf20Sopenharmony_ci .uart_offset = 8, 5058c2ecf20Sopenharmony_ci }, 5068c2ecf20Sopenharmony_ci [timedia_4079e] = { 5078c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5088c2ecf20Sopenharmony_ci .num_ports = 1, 5098c2ecf20Sopenharmony_ci .base_baud = 921600, 5108c2ecf20Sopenharmony_ci .uart_offset = 8, 5118c2ecf20Sopenharmony_ci }, 5128c2ecf20Sopenharmony_ci [timedia_4079f] = { 5138c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5148c2ecf20Sopenharmony_ci .num_ports = 1, 5158c2ecf20Sopenharmony_ci .base_baud = 921600, 5168c2ecf20Sopenharmony_ci .uart_offset = 8, 5178c2ecf20Sopenharmony_ci }, 5188c2ecf20Sopenharmony_ci [timedia_9079a] = { 5198c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5208c2ecf20Sopenharmony_ci .num_ports = 1, 5218c2ecf20Sopenharmony_ci .base_baud = 921600, 5228c2ecf20Sopenharmony_ci .uart_offset = 8, 5238c2ecf20Sopenharmony_ci }, 5248c2ecf20Sopenharmony_ci [timedia_9079b] = { 5258c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5268c2ecf20Sopenharmony_ci .num_ports = 1, 5278c2ecf20Sopenharmony_ci .base_baud = 921600, 5288c2ecf20Sopenharmony_ci .uart_offset = 8, 5298c2ecf20Sopenharmony_ci }, 5308c2ecf20Sopenharmony_ci [timedia_9079c] = { 5318c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5328c2ecf20Sopenharmony_ci .num_ports = 1, 5338c2ecf20Sopenharmony_ci .base_baud = 921600, 5348c2ecf20Sopenharmony_ci .uart_offset = 8, 5358c2ecf20Sopenharmony_ci }, 5368c2ecf20Sopenharmony_ci [wch_ch353_1s1p] = { 5378c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5388c2ecf20Sopenharmony_ci .num_ports = 1, 5398c2ecf20Sopenharmony_ci .base_baud = 115200, 5408c2ecf20Sopenharmony_ci .uart_offset = 8, 5418c2ecf20Sopenharmony_ci }, 5428c2ecf20Sopenharmony_ci [wch_ch353_2s1p] = { 5438c2ecf20Sopenharmony_ci .flags = FL_BASE0|FL_BASE_BARS, 5448c2ecf20Sopenharmony_ci .num_ports = 2, 5458c2ecf20Sopenharmony_ci .base_baud = 115200, 5468c2ecf20Sopenharmony_ci .uart_offset = 8, 5478c2ecf20Sopenharmony_ci }, 5488c2ecf20Sopenharmony_ci [wch_ch382_0s1p] = { 5498c2ecf20Sopenharmony_ci .flags = FL_BASE0, 5508c2ecf20Sopenharmony_ci .num_ports = 0, 5518c2ecf20Sopenharmony_ci .base_baud = 115200, 5528c2ecf20Sopenharmony_ci .uart_offset = 8, 5538c2ecf20Sopenharmony_ci }, 5548c2ecf20Sopenharmony_ci [wch_ch382_2s1p] = { 5558c2ecf20Sopenharmony_ci .flags = FL_BASE0, 5568c2ecf20Sopenharmony_ci .num_ports = 2, 5578c2ecf20Sopenharmony_ci .base_baud = 115200, 5588c2ecf20Sopenharmony_ci .uart_offset = 8, 5598c2ecf20Sopenharmony_ci .first_offset = 0xC0, 5608c2ecf20Sopenharmony_ci }, 5618c2ecf20Sopenharmony_ci [brainboxes_5s1p] = { 5628c2ecf20Sopenharmony_ci .flags = FL_BASE2, 5638c2ecf20Sopenharmony_ci .num_ports = 5, 5648c2ecf20Sopenharmony_ci .base_baud = 921600, 5658c2ecf20Sopenharmony_ci .uart_offset = 8, 5668c2ecf20Sopenharmony_ci }, 5678c2ecf20Sopenharmony_ci [sunix_4008a] = { 5688c2ecf20Sopenharmony_ci .num_ports = 0, 5698c2ecf20Sopenharmony_ci }, 5708c2ecf20Sopenharmony_ci [sunix_5069a] = { 5718c2ecf20Sopenharmony_ci .num_ports = 1, 5728c2ecf20Sopenharmony_ci .base_baud = 921600, 5738c2ecf20Sopenharmony_ci .uart_offset = 0x8, 5748c2ecf20Sopenharmony_ci }, 5758c2ecf20Sopenharmony_ci [sunix_5079a] = { 5768c2ecf20Sopenharmony_ci .num_ports = 2, 5778c2ecf20Sopenharmony_ci .base_baud = 921600, 5788c2ecf20Sopenharmony_ci .uart_offset = 0x8, 5798c2ecf20Sopenharmony_ci }, 5808c2ecf20Sopenharmony_ci [sunix_5099a] = { 5818c2ecf20Sopenharmony_ci .num_ports = 4, 5828c2ecf20Sopenharmony_ci .base_baud = 921600, 5838c2ecf20Sopenharmony_ci .uart_offset = 0x8, 5848c2ecf20Sopenharmony_ci }, 5858c2ecf20Sopenharmony_ci [brainboxes_uc257] = { 5868c2ecf20Sopenharmony_ci .flags = FL_BASE2, 5878c2ecf20Sopenharmony_ci .num_ports = 2, 5888c2ecf20Sopenharmony_ci .base_baud = 115200, 5898c2ecf20Sopenharmony_ci .uart_offset = 8, 5908c2ecf20Sopenharmony_ci }, 5918c2ecf20Sopenharmony_ci [brainboxes_is300] = { 5928c2ecf20Sopenharmony_ci .flags = FL_BASE2, 5938c2ecf20Sopenharmony_ci .num_ports = 1, 5948c2ecf20Sopenharmony_ci .base_baud = 115200, 5958c2ecf20Sopenharmony_ci .uart_offset = 8, 5968c2ecf20Sopenharmony_ci }, 5978c2ecf20Sopenharmony_ci [brainboxes_uc414] = { 5988c2ecf20Sopenharmony_ci .flags = FL_BASE2, 5998c2ecf20Sopenharmony_ci .num_ports = 4, 6008c2ecf20Sopenharmony_ci .base_baud = 115200, 6018c2ecf20Sopenharmony_ci .uart_offset = 8, 6028c2ecf20Sopenharmony_ci }, 6038c2ecf20Sopenharmony_ci [brainboxes_px263] = { 6048c2ecf20Sopenharmony_ci .flags = FL_BASE2, 6058c2ecf20Sopenharmony_ci .num_ports = 4, 6068c2ecf20Sopenharmony_ci .base_baud = 921600, 6078c2ecf20Sopenharmony_ci .uart_offset = 8, 6088c2ecf20Sopenharmony_ci }, 6098c2ecf20Sopenharmony_ci}; 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_cistruct parport_serial_private { 6128c2ecf20Sopenharmony_ci struct serial_private *serial; 6138c2ecf20Sopenharmony_ci int num_par; 6148c2ecf20Sopenharmony_ci struct parport *port[PARPORT_MAX]; 6158c2ecf20Sopenharmony_ci struct parport_pc_pci par; 6168c2ecf20Sopenharmony_ci}; 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_ci/* Register the serial port(s) of a PCI card. */ 6198c2ecf20Sopenharmony_cistatic int serial_register(struct pci_dev *dev, const struct pci_device_id *id) 6208c2ecf20Sopenharmony_ci{ 6218c2ecf20Sopenharmony_ci struct parport_serial_private *priv = pci_get_drvdata (dev); 6228c2ecf20Sopenharmony_ci struct pciserial_board *board; 6238c2ecf20Sopenharmony_ci struct serial_private *serial; 6248c2ecf20Sopenharmony_ci 6258c2ecf20Sopenharmony_ci board = &pci_parport_serial_boards[id->driver_data]; 6268c2ecf20Sopenharmony_ci if (board->num_ports == 0) 6278c2ecf20Sopenharmony_ci return 0; 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_ci serial = pciserial_init_ports(dev, board); 6308c2ecf20Sopenharmony_ci if (IS_ERR(serial)) 6318c2ecf20Sopenharmony_ci return PTR_ERR(serial); 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_ci priv->serial = serial; 6348c2ecf20Sopenharmony_ci return 0; 6358c2ecf20Sopenharmony_ci} 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ci/* Register the parallel port(s) of a PCI card. */ 6388c2ecf20Sopenharmony_cistatic int parport_register(struct pci_dev *dev, const struct pci_device_id *id) 6398c2ecf20Sopenharmony_ci{ 6408c2ecf20Sopenharmony_ci struct parport_pc_pci *card; 6418c2ecf20Sopenharmony_ci struct parport_serial_private *priv = pci_get_drvdata (dev); 6428c2ecf20Sopenharmony_ci int n, success = 0; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_ci priv->par = cards[id->driver_data]; 6458c2ecf20Sopenharmony_ci card = &priv->par; 6468c2ecf20Sopenharmony_ci if (card->preinit_hook && 6478c2ecf20Sopenharmony_ci card->preinit_hook (dev, card, PARPORT_IRQ_NONE, PARPORT_DMA_NONE)) 6488c2ecf20Sopenharmony_ci return -ENODEV; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci for (n = 0; n < card->numports; n++) { 6518c2ecf20Sopenharmony_ci struct parport *port; 6528c2ecf20Sopenharmony_ci int lo = card->addr[n].lo; 6538c2ecf20Sopenharmony_ci int hi = card->addr[n].hi; 6548c2ecf20Sopenharmony_ci unsigned long io_lo, io_hi; 6558c2ecf20Sopenharmony_ci int irq; 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_ci if (priv->num_par == ARRAY_SIZE (priv->port)) { 6588c2ecf20Sopenharmony_ci dev_warn(&dev->dev, 6598c2ecf20Sopenharmony_ci "only %zu parallel ports supported (%d reported)\n", 6608c2ecf20Sopenharmony_ci ARRAY_SIZE(priv->port), card->numports); 6618c2ecf20Sopenharmony_ci break; 6628c2ecf20Sopenharmony_ci } 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_ci io_lo = pci_resource_start (dev, lo); 6658c2ecf20Sopenharmony_ci io_hi = 0; 6668c2ecf20Sopenharmony_ci if ((hi >= 0) && (hi <= 6)) 6678c2ecf20Sopenharmony_ci io_hi = pci_resource_start (dev, hi); 6688c2ecf20Sopenharmony_ci else if (hi > 6) 6698c2ecf20Sopenharmony_ci io_lo += hi; /* Reinterpret the meaning of 6708c2ecf20Sopenharmony_ci "hi" as an offset (see SYBA 6718c2ecf20Sopenharmony_ci def.) */ 6728c2ecf20Sopenharmony_ci /* TODO: test if sharing interrupts works */ 6738c2ecf20Sopenharmony_ci irq = dev->irq; 6748c2ecf20Sopenharmony_ci if (irq == IRQ_NONE) { 6758c2ecf20Sopenharmony_ci dev_dbg(&dev->dev, 6768c2ecf20Sopenharmony_ci "PCI parallel port detected: I/O at %#lx(%#lx)\n", 6778c2ecf20Sopenharmony_ci io_lo, io_hi); 6788c2ecf20Sopenharmony_ci irq = PARPORT_IRQ_NONE; 6798c2ecf20Sopenharmony_ci } else { 6808c2ecf20Sopenharmony_ci dev_dbg(&dev->dev, 6818c2ecf20Sopenharmony_ci "PCI parallel port detected: I/O at %#lx(%#lx), IRQ %d\n", 6828c2ecf20Sopenharmony_ci io_lo, io_hi, irq); 6838c2ecf20Sopenharmony_ci } 6848c2ecf20Sopenharmony_ci port = parport_pc_probe_port (io_lo, io_hi, irq, 6858c2ecf20Sopenharmony_ci PARPORT_DMA_NONE, &dev->dev, IRQF_SHARED); 6868c2ecf20Sopenharmony_ci if (port) { 6878c2ecf20Sopenharmony_ci priv->port[priv->num_par++] = port; 6888c2ecf20Sopenharmony_ci success = 1; 6898c2ecf20Sopenharmony_ci } 6908c2ecf20Sopenharmony_ci } 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci if (card->postinit_hook) 6938c2ecf20Sopenharmony_ci card->postinit_hook (dev, card, !success); 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci return 0; 6968c2ecf20Sopenharmony_ci} 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_cistatic int parport_serial_pci_probe(struct pci_dev *dev, 6998c2ecf20Sopenharmony_ci const struct pci_device_id *id) 7008c2ecf20Sopenharmony_ci{ 7018c2ecf20Sopenharmony_ci struct parport_serial_private *priv; 7028c2ecf20Sopenharmony_ci int err; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_ci priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); 7058c2ecf20Sopenharmony_ci if (!priv) 7068c2ecf20Sopenharmony_ci return -ENOMEM; 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci pci_set_drvdata (dev, priv); 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci err = pcim_enable_device(dev); 7118c2ecf20Sopenharmony_ci if (err) 7128c2ecf20Sopenharmony_ci return err; 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci err = parport_register(dev, id); 7158c2ecf20Sopenharmony_ci if (err) 7168c2ecf20Sopenharmony_ci return err; 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci err = serial_register(dev, id); 7198c2ecf20Sopenharmony_ci if (err) { 7208c2ecf20Sopenharmony_ci int i; 7218c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_par; i++) 7228c2ecf20Sopenharmony_ci parport_pc_unregister_port (priv->port[i]); 7238c2ecf20Sopenharmony_ci return err; 7248c2ecf20Sopenharmony_ci } 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci return 0; 7278c2ecf20Sopenharmony_ci} 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_cistatic void parport_serial_pci_remove(struct pci_dev *dev) 7308c2ecf20Sopenharmony_ci{ 7318c2ecf20Sopenharmony_ci struct parport_serial_private *priv = pci_get_drvdata (dev); 7328c2ecf20Sopenharmony_ci int i; 7338c2ecf20Sopenharmony_ci 7348c2ecf20Sopenharmony_ci // Serial ports 7358c2ecf20Sopenharmony_ci if (priv->serial) 7368c2ecf20Sopenharmony_ci pciserial_remove_ports(priv->serial); 7378c2ecf20Sopenharmony_ci 7388c2ecf20Sopenharmony_ci // Parallel ports 7398c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_par; i++) 7408c2ecf20Sopenharmony_ci parport_pc_unregister_port (priv->port[i]); 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci return; 7438c2ecf20Sopenharmony_ci} 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_cistatic int __maybe_unused parport_serial_pci_suspend(struct device *dev) 7468c2ecf20Sopenharmony_ci{ 7478c2ecf20Sopenharmony_ci struct parport_serial_private *priv = dev_get_drvdata(dev); 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci if (priv->serial) 7508c2ecf20Sopenharmony_ci pciserial_suspend_ports(priv->serial); 7518c2ecf20Sopenharmony_ci 7528c2ecf20Sopenharmony_ci /* FIXME: What about parport? */ 7538c2ecf20Sopenharmony_ci return 0; 7548c2ecf20Sopenharmony_ci} 7558c2ecf20Sopenharmony_ci 7568c2ecf20Sopenharmony_cistatic int __maybe_unused parport_serial_pci_resume(struct device *dev) 7578c2ecf20Sopenharmony_ci{ 7588c2ecf20Sopenharmony_ci struct parport_serial_private *priv = dev_get_drvdata(dev); 7598c2ecf20Sopenharmony_ci 7608c2ecf20Sopenharmony_ci if (priv->serial) 7618c2ecf20Sopenharmony_ci pciserial_resume_ports(priv->serial); 7628c2ecf20Sopenharmony_ci 7638c2ecf20Sopenharmony_ci /* FIXME: What about parport? */ 7648c2ecf20Sopenharmony_ci return 0; 7658c2ecf20Sopenharmony_ci} 7668c2ecf20Sopenharmony_ci 7678c2ecf20Sopenharmony_cistatic SIMPLE_DEV_PM_OPS(parport_serial_pm_ops, 7688c2ecf20Sopenharmony_ci parport_serial_pci_suspend, parport_serial_pci_resume); 7698c2ecf20Sopenharmony_ci 7708c2ecf20Sopenharmony_cistatic struct pci_driver parport_serial_pci_driver = { 7718c2ecf20Sopenharmony_ci .name = "parport_serial", 7728c2ecf20Sopenharmony_ci .id_table = parport_serial_pci_tbl, 7738c2ecf20Sopenharmony_ci .probe = parport_serial_pci_probe, 7748c2ecf20Sopenharmony_ci .remove = parport_serial_pci_remove, 7758c2ecf20Sopenharmony_ci .driver = { 7768c2ecf20Sopenharmony_ci .pm = &parport_serial_pm_ops, 7778c2ecf20Sopenharmony_ci }, 7788c2ecf20Sopenharmony_ci}; 7798c2ecf20Sopenharmony_cimodule_pci_driver(parport_serial_pci_driver); 7808c2ecf20Sopenharmony_ci 7818c2ecf20Sopenharmony_ciMODULE_AUTHOR("Tim Waugh <twaugh@redhat.com>"); 7828c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Driver for common parallel+serial multi-I/O PCI cards"); 7838c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 784