drivers/parport/parport_serial.c | 607 +++++++++++++++++++++---------- 1 file changed, 412 insertions(+), 195 deletions(-)
Add PCI device ID 1c00:3450 for WCH parallel port devices.
The generic parport_serial driver requests IRQs for this
device, but the interrupt handler does not properly handle
the device-generated interrupts, which may result in
spurious or unhandled IRQs.
Disable IRQ usage for this device to ensure stable operation.
Signed-off-by: Jiawei Liu <liujiawei4419@gmail.com>
From 288769e2f438346b9af6145df1459a3a68e6b88d Mon Sep 17 00:00:00 2001
From: Jiawei Liu <liujiawei4419@gmail.com>
Date: Tue, 28 Apr 2026 15:18:56 +0800
Subject: [PATCH 2/2] parport: parport_serial: add WCH device 1c00:3450 and
disable IRQ
Add PCI device ID 1c00:3450 for WCH parallel port devices.
The generic parport_serial driver requests IRQs for this
device, but the interrupt handler does not properly handle
the device-generated interrupts, which may result in
spurious or unhandled IRQs.
Disable IRQ usage for this device to ensure stable operation.
Signed-off-by: Jiawei Liu <liujiawei4419@gmail.com>
---
drivers/parport/parport_serial.c | 607 +++++++++++++++++++++----------
1 file changed, 412 insertions(+), 195 deletions(-)
diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c
index 24d4f3a3ec3d0..ee200bee6695d 100644
--- a/drivers/parport/parport_serial.c
+++ b/drivers/parport/parport_serial.c
@@ -60,6 +60,7 @@ enum parport_pc_pci_cards {
wch_ch353_2s1p,
wch_ch382_0s1p,
wch_ch382_2s1p,
+ wch_ch384_4s1p,
brainboxes_5s1p,
sunix_4008a,
sunix_5069a,
@@ -84,13 +85,13 @@ struct parport_pc_pci {
/* If set, this is called immediately after pci_enable_device.
* If it returns non-zero, no probing will take place and the
* ports will not be used. */
- int (*preinit_hook) (struct pci_dev *pdev, struct parport_pc_pci *card,
- int autoirq, int autodma);
+ int (*preinit_hook)(struct pci_dev *pdev, struct parport_pc_pci *card,
+ int autoirq, int autodma);
/* If set, this is called after probing for ports. If 'failed'
* is non-zero we couldn't use any of the ports. */
- void (*postinit_hook) (struct pci_dev *pdev,
- struct parport_pc_pci *card, int failed);
+ void (*postinit_hook)(struct pci_dev *pdev, struct parport_pc_pci *card,
+ int failed);
};
static int netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par,
@@ -98,8 +99,8 @@ static int netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par,
{
/* the rule described below doesn't hold for this device */
if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
- dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
- dev->subsystem_device == 0x0299)
+ dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
+ dev->subsystem_device == 0x0299)
return -ENODEV;
if (dev->device == PCI_DEVICE_ID_NETMOS_9912) {
@@ -119,132 +120,337 @@ static int netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par,
}
static struct parport_pc_pci cards[] = {
- /* titan_110l */ { 1, { { 3, -1 }, } },
- /* titan_210l */ { 1, { { 3, -1 }, } },
- /* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init },
- /* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init },
- /* netmos_9855_2p */ { 2, { { 0, -1 }, { 2, -1 }, } },
- /* netmos_9900 */ {1, { { 3, 4 }, }, netmos_parallel_init },
- /* netmos_9900_2p */ {2, { { 0, 1 }, { 3, 4 }, } },
- /* netmos_99xx_1p */ {1, { { 0, 1 }, } },
- /* avlab_1s1p */ { 1, { { 1, 2}, } },
- /* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} },
- /* avlab_2s1p */ { 1, { { 2, 3}, } },
- /* siig_1s1p_10x */ { 1, { { 3, 4 }, } },
- /* siig_2s1p_10x */ { 1, { { 4, 5 }, } },
- /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } },
- /* siig_1s1p_20x */ { 1, { { 1, 2 }, } },
- /* siig_2s1p_20x */ { 1, { { 2, 3 }, } },
- /* timedia_4078a */ { 1, { { 2, -1 }, } },
- /* timedia_4079h */ { 1, { { 2, 3 }, } },
- /* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } },
- /* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } },
- /* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } },
- /* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } },
- /* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } },
- /* timedia_4078u */ { 1, { { 2, -1 }, } },
- /* timedia_4079a */ { 1, { { 2, 3 }, } },
- /* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } },
- /* timedia_4079r */ { 1, { { 2, 3 }, } },
- /* timedia_4079s */ { 1, { { 2, 3 }, } },
- /* timedia_4079d */ { 1, { { 2, 3 }, } },
- /* timedia_4079e */ { 1, { { 2, 3 }, } },
- /* timedia_4079f */ { 1, { { 2, 3 }, } },
- /* timedia_9079a */ { 1, { { 2, 3 }, } },
- /* timedia_9079b */ { 1, { { 2, 3 }, } },
- /* timedia_9079c */ { 1, { { 2, 3 }, } },
- /* wch_ch353_1s1p*/ { 1, { { 1, -1}, } },
- /* wch_ch353_2s1p*/ { 1, { { 2, -1}, } },
- /* wch_ch382_0s1p*/ { 1, { { 2, -1}, } },
- /* wch_ch382_2s1p*/ { 1, { { 2, -1}, } },
- /* brainboxes_5s1p */ { 1, { { 3, -1 }, } },
- /* sunix_4008a */ { 1, { { 1, 2 }, } },
- /* sunix_5069a */ { 1, { { 1, 2 }, } },
- /* sunix_5079a */ { 1, { { 1, 2 }, } },
- /* sunix_5099a */ { 1, { { 1, 2 }, } },
- /* brainboxes_uc257 */ { 1, { { 3, -1 }, } },
- /* brainboxes_is300 */ { 1, { { 3, -1 }, } },
- /* brainboxes_uc414 */ { 1, { { 3, -1 }, } },
- /* brainboxes_px263 */ { 1, { { 3, -1 }, } },
+ /* titan_110l */ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* titan_210l */
+ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* netmos_9xx5_combo */
+ { 1,
+ {
+ { 2, -1 },
+ },
+ netmos_parallel_init },
+ /* netmos_9855 */
+ { 1,
+ {
+ { 0, -1 },
+ },
+ netmos_parallel_init },
+ /* netmos_9855_2p */
+ { 2,
+ {
+ { 0, -1 },
+ { 2, -1 },
+ } },
+ /* netmos_9900 */
+ { 1,
+ {
+ { 3, 4 },
+ },
+ netmos_parallel_init },
+ /* netmos_9900_2p */
+ { 2,
+ {
+ { 0, 1 },
+ { 3, 4 },
+ } },
+ /* netmos_99xx_1p */
+ { 1,
+ {
+ { 0, 1 },
+ } },
+ /* avlab_1s1p */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* avlab_1s2p */
+ { 2,
+ {
+ { 1, 2 },
+ { 3, 4 },
+ } },
+ /* avlab_2s1p */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* siig_1s1p_10x */
+ { 1,
+ {
+ { 3, 4 },
+ } },
+ /* siig_2s1p_10x */
+ { 1,
+ {
+ { 4, 5 },
+ } },
+ /* siig_2p1s_20x */
+ { 2,
+ {
+ { 1, 2 },
+ { 3, 4 },
+ } },
+ /* siig_1s1p_20x */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* siig_2s1p_20x */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4078a */
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* timedia_4079h */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4085h */
+ { 2,
+ {
+ { 2, -1 },
+ { 4, -1 },
+ } },
+ /* timedia_4088a */
+ { 2,
+ {
+ { 2, 3 },
+ { 4, 5 },
+ } },
+ /* timedia_4089a */
+ { 2,
+ {
+ { 2, 3 },
+ { 4, 5 },
+ } },
+ /* timedia_4095a */
+ { 2,
+ {
+ { 2, 3 },
+ { 4, 5 },
+ } },
+ /* timedia_4096a */
+ { 2,
+ {
+ { 2, 3 },
+ { 4, 5 },
+ } },
+ /* timedia_4078u */
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* timedia_4079a */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4085u */
+ { 2,
+ {
+ { 2, -1 },
+ { 4, -1 },
+ } },
+ /* timedia_4079r */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4079s */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4079d */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4079e */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_4079f */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_9079a */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_9079b */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* timedia_9079c */
+ { 1,
+ {
+ { 2, 3 },
+ } },
+ /* wch_ch353_1s1p*/
+ { 1,
+ {
+ { 1, -1 },
+ } },
+ /* wch_ch353_2s1p*/
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* wch_ch382_0s1p*/
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* wch_ch382_2s1p*/
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* wch_ch384_4s1p*/
+ { 1,
+ {
+ { 2, -1 },
+ } },
+ /* brainboxes_5s1p */
+ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* sunix_4008a */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* sunix_5069a */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* sunix_5079a */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* sunix_5099a */
+ { 1,
+ {
+ { 1, 2 },
+ } },
+ /* brainboxes_uc257 */
+ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* brainboxes_is300 */
+ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* brainboxes_uc414 */
+ { 1,
+ {
+ { 3, -1 },
+ } },
+ /* brainboxes_px263 */
+ { 1,
+ {
+ { 3, -1 },
+ } },
};
static struct pci_device_id parport_serial_pci_tbl[] = {
/* PCI cards */
- { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_110L,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_110l },
- { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_210L,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_210l },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9735,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9745,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
- 0x1000, 0x0020, 0, 0, netmos_9855_2p },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
- 0x1000, 0x0022, 0, 0, netmos_9855_2p },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
- 0xA000, 0x3011, 0, 0, netmos_9900 },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
- 0xA000, 0x3012, 0, 0, netmos_9900 },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
- 0xA000, 0x3020, 0, 0, netmos_9900_2p },
- { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
- 0xA000, 0x2000, 0, 0, netmos_99xx_1p },
+ { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_110L, PCI_ANY_ID, PCI_ANY_ID,
+ 0, 0, titan_110l },
+ { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_210L, PCI_ANY_ID, PCI_ANY_ID,
+ 0, 0, titan_210l },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9735, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9745, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, 0x1000, 0x0020, 0, 0,
+ netmos_9855_2p },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, 0x1000, 0x0022, 0, 0,
+ netmos_9855_2p },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, netmos_9855 },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 0xA000, 0x3011, 0, 0,
+ netmos_9900 },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 0xA000, 0x3012, 0, 0,
+ netmos_9900 },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, 0xA000, 0x3020, 0, 0,
+ netmos_9900_2p },
+ { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912, 0xA000, 0x2000, 0, 0,
+ netmos_99xx_1p },
/* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/
- { PCI_VENDOR_ID_AFAVLAB, 0x2110,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2111,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2112,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2140,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2141,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2142,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2160,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2161,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p },
- { PCI_VENDOR_ID_AFAVLAB, 0x2162,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2110, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s1p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2111, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s1p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2112, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s1p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2140, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s2p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2141, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s2p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2142, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_1s2p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2160, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_2s1p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2161, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_2s1p },
+ { PCI_VENDOR_ID_AFAVLAB, 0x2162, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ avlab_2s1p },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_1s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_1s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_1s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_10x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2p1s_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2p1s_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2p1s_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_1s1p_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_1s1p_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_20x },
+ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, siig_2s1p_20x },
/* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/
{ 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a },
{ 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h },
@@ -266,18 +472,19 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
{ 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c },
/* WCH CARDS */
- { PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_1S1P,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch353_1s1p },
- { PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_2S1P,
- 0x4348, 0x3253, 0, 0, wch_ch353_2s1p },
- { PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_0S1P,
- 0x1c00, 0x3050, 0, 0, wch_ch382_0s1p },
- { PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_2S1P,
- 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p },
+ { PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_1S1P, PCI_ANY_ID,
+ PCI_ANY_ID, 0, 0, wch_ch353_1s1p },
+ { PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_2S1P, 0x4348, 0x3253,
+ 0, 0, wch_ch353_2s1p },
+ { PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_0S1P, 0x1c00, 0x3050,
+ 0, 0, wch_ch382_0s1p },
+ { PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_2S1P, 0x1c00, 0x3250,
+ 0, 0, wch_ch382_2s1p },
+ { 0x1c00, 0x3450, 0x1c00, 0x3450, 0, 0, wch_ch384_4s1p },
/* BrainBoxes PX272/PX306 MIO card */
- { PCI_VENDOR_ID_INTASHIELD, 0x4100,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_5s1p },
+ { PCI_VENDOR_ID_INTASHIELD, 0x4100, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_5s1p },
/* Sunix boards */
{ PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999, PCI_VENDOR_ID_SUNIX,
@@ -290,40 +497,42 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
0x0104, 0, 0, sunix_5099a },
/* Brainboxes UC-203 */
- { PCI_VENDOR_ID_INTASHIELD, 0x0bc1,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
- { PCI_VENDOR_ID_INTASHIELD, 0x0bc2,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0bc1, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0bc2, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
/* Brainboxes UC-257 */
- { PCI_VENDOR_ID_INTASHIELD, 0x0861,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
- { PCI_VENDOR_ID_INTASHIELD, 0x0862,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
- { PCI_VENDOR_ID_INTASHIELD, 0x0863,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0861, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0862, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0863, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
/* Brainboxes UC-414 */
- { PCI_VENDOR_ID_INTASHIELD, 0x0e61,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc414 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0e61, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc414 },
/* Brainboxes UC-475 */
- { PCI_VENDOR_ID_INTASHIELD, 0x0981,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
- { PCI_VENDOR_ID_INTASHIELD, 0x0982,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0981, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0982, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_uc257 },
/* Brainboxes IS-300/IS-500 */
- { PCI_VENDOR_ID_INTASHIELD, 0x0da0,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_is300 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x0da0, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_is300 },
/* Brainboxes PX-263/PX-295 */
- { PCI_VENDOR_ID_INTASHIELD, 0x402c,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_px263 },
+ { PCI_VENDOR_ID_INTASHIELD, 0x402c, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ brainboxes_px263 },
- { 0, } /* terminate list */
+ {
+ 0,
+ } /* terminate list */
};
-MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl);
+MODULE_DEVICE_TABLE(pci, parport_serial_pci_tbl);
/*
* This table describes the serial "geometry" of these boards. Any
@@ -538,29 +747,32 @@ static struct pciserial_board pci_parport_serial_boards[] = {
.uart_offset = 8,
},
[wch_ch353_1s1p] = {
- .flags = FL_BASE0|FL_BASE_BARS,
- .num_ports = 1,
- .base_baud = 115200,
- .uart_offset = 8,
+ // .flags = FL_BASE0|FL_BASE_BARS,
+ .num_ports = 0,
+ // .base_baud = 115200,
+ // .uart_offset = 8,
},
[wch_ch353_2s1p] = {
- .flags = FL_BASE0|FL_BASE_BARS,
- .num_ports = 2,
- .base_baud = 115200,
- .uart_offset = 8,
+ // .flags = FL_BASE0|FL_BASE_BARS,
+ .num_ports = 0,
+ // .base_baud = 115200,
+ // .uart_offset = 8,
},
[wch_ch382_0s1p] = {
- .flags = FL_BASE0,
+ // .flags = FL_BASE0,
.num_ports = 0,
- .base_baud = 115200,
- .uart_offset = 8,
+ // .base_baud = 115200,
+ // .uart_offset = 8,
},
[wch_ch382_2s1p] = {
- .flags = FL_BASE0,
- .num_ports = 2,
- .base_baud = 115200,
- .uart_offset = 8,
- .first_offset = 0xC0,
+ // .flags = FL_BASE0,
+ .num_ports = 0,
+ // .base_baud = 115200,
+ // .uart_offset = 8,
+ // .first_offset = 0xC0,
+ },
+ [wch_ch384_4s1p] = {
+ .num_ports = 0,
},
[brainboxes_5s1p] = {
.flags = FL_BASE2,
@@ -613,7 +825,7 @@ static struct pciserial_board pci_parport_serial_boards[] = {
};
struct parport_serial_private {
- struct serial_private *serial;
+ struct serial_private *serial;
int num_par;
struct parport *port[PARPORT_MAX];
struct parport_pc_pci par;
@@ -622,7 +834,7 @@ struct parport_serial_private {
/* Register the serial port(s) of a PCI card. */
static int serial_register(struct pci_dev *dev, const struct pci_device_id *id)
{
- struct parport_serial_private *priv = pci_get_drvdata (dev);
+ struct parport_serial_private *priv = pci_get_drvdata(dev);
struct pciserial_board *board;
struct serial_private *serial;
@@ -642,13 +854,13 @@ static int serial_register(struct pci_dev *dev, const struct pci_device_id *id)
static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
{
struct parport_pc_pci *card;
- struct parport_serial_private *priv = pci_get_drvdata (dev);
+ struct parport_serial_private *priv = pci_get_drvdata(dev);
int n, success = 0;
priv->par = cards[id->driver_data];
card = &priv->par;
if (card->preinit_hook &&
- card->preinit_hook (dev, card, PARPORT_IRQ_NONE, PARPORT_DMA_NONE))
+ card->preinit_hook(dev, card, PARPORT_IRQ_NONE, PARPORT_DMA_NONE))
return -ENODEV;
for (n = 0; n < card->numports; n++) {
@@ -658,23 +870,27 @@ static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
unsigned long io_lo, io_hi;
int irq;
- if (priv->num_par == ARRAY_SIZE (priv->port)) {
- dev_warn(&dev->dev,
- "only %zu parallel ports supported (%d reported)\n",
- ARRAY_SIZE(priv->port), card->numports);
+ if (priv->num_par == ARRAY_SIZE(priv->port)) {
+ dev_warn(
+ &dev->dev,
+ "only %zu parallel ports supported (%d reported)\n",
+ ARRAY_SIZE(priv->port), card->numports);
break;
}
- io_lo = pci_resource_start (dev, lo);
+ io_lo = pci_resource_start(dev, lo);
io_hi = 0;
if ((hi >= 0) && (hi <= 6))
- io_hi = pci_resource_start (dev, hi);
+ io_hi = pci_resource_start(dev, hi);
else if (hi > 6)
io_lo += hi; /* Reinterpret the meaning of
"hi" as an offset (see SYBA
def.) */
/* TODO: test if sharing interrupts works */
- irq = pci_irq_vector(dev, 0);
+ if (id->vendor == 0x1c00 || id->vendor == 0x4348)
+ irq = PARPORT_IRQ_NONE;
+ else
+ irq = pci_irq_vector(dev, 0);
if (irq < 0)
return irq;
if (irq == 0)
@@ -688,8 +904,9 @@ static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
"PCI parallel port detected: I/O at %#lx(%#lx), IRQ %d\n",
io_lo, io_hi, irq);
}
- port = parport_pc_probe_port (io_lo, io_hi, irq,
- PARPORT_DMA_NONE, &dev->dev, IRQF_SHARED);
+ port = parport_pc_probe_port(io_lo, io_hi, irq,
+ PARPORT_DMA_NONE, &dev->dev,
+ IRQF_SHARED);
if (port) {
priv->port[priv->num_par++] = port;
success = 1;
@@ -697,7 +914,7 @@ static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
}
if (card->postinit_hook)
- card->postinit_hook (dev, card, !success);
+ card->postinit_hook(dev, card, !success);
return 0;
}
@@ -712,7 +929,7 @@ static int parport_serial_pci_probe(struct pci_dev *dev,
if (!priv)
return -ENOMEM;
- pci_set_drvdata (dev, priv);
+ pci_set_drvdata(dev, priv);
err = pcim_enable_device(dev);
if (err)
@@ -726,7 +943,7 @@ static int parport_serial_pci_probe(struct pci_dev *dev,
if (err) {
int i;
for (i = 0; i < priv->num_par; i++)
- parport_pc_unregister_port (priv->port[i]);
+ parport_pc_unregister_port(priv->port[i]);
return err;
}
@@ -735,7 +952,7 @@ static int parport_serial_pci_probe(struct pci_dev *dev,
static void parport_serial_pci_remove(struct pci_dev *dev)
{
- struct parport_serial_private *priv = pci_get_drvdata (dev);
+ struct parport_serial_private *priv = pci_get_drvdata(dev);
int i;
// Serial ports
@@ -744,7 +961,7 @@ static void parport_serial_pci_remove(struct pci_dev *dev)
// Parallel ports
for (i = 0; i < priv->num_par; i++)
- parport_pc_unregister_port (priv->port[i]);
+ parport_pc_unregister_port(priv->port[i]);
return;
}
@@ -771,8 +988,8 @@ static int __maybe_unused parport_serial_pci_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(parport_serial_pm_ops,
- parport_serial_pci_suspend, parport_serial_pci_resume);
+static SIMPLE_DEV_PM_OPS(parport_serial_pm_ops, parport_serial_pci_suspend,
+ parport_serial_pci_resume);
static struct pci_driver parport_serial_pci_driver = {
.name = "parport_serial",
--
2.34.1
© 2016 - 2026 Red Hat, Inc.