parport: parport_serial: add WCH device 1c00:3450 and disable IRQ

Jiawei liu posted 1 patch 1 month, 2 weeks ago
drivers/parport/parport_serial.c | 607 +++++++++++++++++++++----------
1 file changed, 412 insertions(+), 195 deletions(-)
parport: parport_serial: add WCH device 1c00:3450 and disable IRQ
Posted by Jiawei liu 1 month, 2 weeks ago
    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