Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parport/serial: add support for Timedia/SUNIX cards to parport_serial

Timedia/SUNIX PCI cards with both serial and parallel ports are
currently supported by 8250_pci and parport_pc individually. Moving
that support into parport_serial allows using both types of ports at the
same time.

This was successfully tested with a SUNIX 4079T.

Signed-off-by: Frédéric Brière <fbriere@fbriere.net>
Acked-by: Alan Cox <alan@linux.intel.com>
Cc: linux-serial@vger.kernel.org
Cc: linux-parport@lists.infradead.org
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Frédéric Brière and committed by
Greg Kroah-Hartman
b9b24558 5bf8f501

+186 -54
-54
drivers/parport/parport_pc.c
··· 2864 2864 lava_parallel_dual_b, 2865 2865 boca_ioppar, 2866 2866 plx_9050, 2867 - timedia_4078a, 2868 - timedia_4079h, 2869 - timedia_4085h, 2870 - timedia_4088a, 2871 - timedia_4089a, 2872 - timedia_4095a, 2873 - timedia_4096a, 2874 - timedia_4078u, 2875 - timedia_4079a, 2876 - timedia_4085u, 2877 - timedia_4079r, 2878 - timedia_4079s, 2879 - timedia_4079d, 2880 - timedia_4079e, 2881 - timedia_4079f, 2882 - timedia_9079a, 2883 - timedia_9079b, 2884 - timedia_9079c, 2885 2867 timedia_4006a, 2886 2868 timedia_4014, 2887 2869 timedia_4008a, ··· 2922 2940 /* lava_parallel_dual_b */ { 1, { { 0, -1 }, } }, 2923 2941 /* boca_ioppar */ { 1, { { 0, -1 }, } }, 2924 2942 /* plx_9050 */ { 2, { { 4, -1 }, { 5, -1 }, } }, 2925 - /* timedia_4078a */ { 1, { { 2, -1 }, } }, 2926 - /* timedia_4079h */ { 1, { { 2, 3 }, } }, 2927 - /* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } }, 2928 - /* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 2929 - /* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 2930 - /* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 2931 - /* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 2932 - /* timedia_4078u */ { 1, { { 2, -1 }, } }, 2933 - /* timedia_4079a */ { 1, { { 2, 3 }, } }, 2934 - /* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } }, 2935 - /* timedia_4079r */ { 1, { { 2, 3 }, } }, 2936 - /* timedia_4079s */ { 1, { { 2, 3 }, } }, 2937 - /* timedia_4079d */ { 1, { { 2, 3 }, } }, 2938 - /* timedia_4079e */ { 1, { { 2, 3 }, } }, 2939 - /* timedia_4079f */ { 1, { { 2, 3 }, } }, 2940 - /* timedia_9079a */ { 1, { { 2, 3 }, } }, 2941 - /* timedia_9079b */ { 1, { { 2, 3 }, } }, 2942 - /* timedia_9079c */ { 1, { { 2, 3 }, } }, 2943 2943 /* timedia_4006a */ { 1, { { 0, -1 }, } }, 2944 2944 /* timedia_4014 */ { 2, { { 0, -1 }, { 2, -1 }, } }, 2945 2945 /* timedia_4008a */ { 1, { { 0, 1 }, } }, ··· 2983 3019 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, 2984 3020 PCI_SUBVENDOR_ID_EXSYS, PCI_SUBDEVICE_ID_EXSYS_4014, 0, 0, plx_9050 }, 2985 3021 /* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/ 2986 - { 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a }, 2987 - { 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h }, 2988 - { 0x1409, 0x7168, 0x1409, 0x4085, 0, 0, timedia_4085h }, 2989 - { 0x1409, 0x7168, 0x1409, 0x4088, 0, 0, timedia_4088a }, 2990 - { 0x1409, 0x7168, 0x1409, 0x4089, 0, 0, timedia_4089a }, 2991 - { 0x1409, 0x7168, 0x1409, 0x4095, 0, 0, timedia_4095a }, 2992 - { 0x1409, 0x7168, 0x1409, 0x4096, 0, 0, timedia_4096a }, 2993 - { 0x1409, 0x7168, 0x1409, 0x5078, 0, 0, timedia_4078u }, 2994 - { 0x1409, 0x7168, 0x1409, 0x5079, 0, 0, timedia_4079a }, 2995 - { 0x1409, 0x7168, 0x1409, 0x5085, 0, 0, timedia_4085u }, 2996 - { 0x1409, 0x7168, 0x1409, 0x6079, 0, 0, timedia_4079r }, 2997 - { 0x1409, 0x7168, 0x1409, 0x7079, 0, 0, timedia_4079s }, 2998 - { 0x1409, 0x7168, 0x1409, 0x8079, 0, 0, timedia_4079d }, 2999 - { 0x1409, 0x7168, 0x1409, 0x9079, 0, 0, timedia_4079e }, 3000 - { 0x1409, 0x7168, 0x1409, 0xa079, 0, 0, timedia_4079f }, 3001 - { 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a }, 3002 - { 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b }, 3003 - { 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c }, 3004 3022 { 0x1409, 0x7268, 0x1409, 0x0101, 0, 0, timedia_4006a }, 3005 3023 { 0x1409, 0x7268, 0x1409, 0x0102, 0, 0, timedia_4014 }, 3006 3024 { 0x1409, 0x7268, 0x1409, 0x0103, 0, 0, timedia_4008a },
+163
drivers/parport/parport_serial.c
··· 44 44 siig_2p1s_20x, 45 45 siig_1s1p_20x, 46 46 siig_2s1p_20x, 47 + timedia_4078a, 48 + timedia_4079h, 49 + timedia_4085h, 50 + timedia_4088a, 51 + timedia_4089a, 52 + timedia_4095a, 53 + timedia_4096a, 54 + timedia_4078u, 55 + timedia_4079a, 56 + timedia_4085u, 57 + timedia_4079r, 58 + timedia_4079s, 59 + timedia_4079d, 60 + timedia_4079e, 61 + timedia_4079f, 62 + timedia_9079a, 63 + timedia_9079b, 64 + timedia_9079c, 47 65 }; 48 66 49 67 /* each element directly indexed from enum list, above */ ··· 127 109 /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } }, 128 110 /* siig_1s1p_20x */ { 1, { { 1, 2 }, } }, 129 111 /* siig_2s1p_20x */ { 1, { { 2, 3 }, } }, 112 + /* timedia_4078a */ { 1, { { 2, -1 }, } }, 113 + /* timedia_4079h */ { 1, { { 2, 3 }, } }, 114 + /* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } }, 115 + /* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 116 + /* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 117 + /* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 118 + /* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } }, 119 + /* timedia_4078u */ { 1, { { 2, -1 }, } }, 120 + /* timedia_4079a */ { 1, { { 2, 3 }, } }, 121 + /* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } }, 122 + /* timedia_4079r */ { 1, { { 2, 3 }, } }, 123 + /* timedia_4079s */ { 1, { { 2, 3 }, } }, 124 + /* timedia_4079d */ { 1, { { 2, 3 }, } }, 125 + /* timedia_4079e */ { 1, { { 2, 3 }, } }, 126 + /* timedia_4079f */ { 1, { { 2, 3 }, } }, 127 + /* timedia_9079a */ { 1, { { 2, 3 }, } }, 128 + /* timedia_9079b */ { 1, { { 2, 3 }, } }, 129 + /* timedia_9079c */ { 1, { { 2, 3 }, } }, 130 130 }; 131 131 132 132 static struct pci_device_id parport_serial_pci_tbl[] = { ··· 224 188 PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 225 189 { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, 226 190 PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, 191 + /* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/ 192 + { 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a }, 193 + { 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h }, 194 + { 0x1409, 0x7168, 0x1409, 0x4085, 0, 0, timedia_4085h }, 195 + { 0x1409, 0x7168, 0x1409, 0x4088, 0, 0, timedia_4088a }, 196 + { 0x1409, 0x7168, 0x1409, 0x4089, 0, 0, timedia_4089a }, 197 + { 0x1409, 0x7168, 0x1409, 0x4095, 0, 0, timedia_4095a }, 198 + { 0x1409, 0x7168, 0x1409, 0x4096, 0, 0, timedia_4096a }, 199 + { 0x1409, 0x7168, 0x1409, 0x5078, 0, 0, timedia_4078u }, 200 + { 0x1409, 0x7168, 0x1409, 0x5079, 0, 0, timedia_4079a }, 201 + { 0x1409, 0x7168, 0x1409, 0x5085, 0, 0, timedia_4085u }, 202 + { 0x1409, 0x7168, 0x1409, 0x6079, 0, 0, timedia_4079r }, 203 + { 0x1409, 0x7168, 0x1409, 0x7079, 0, 0, timedia_4079s }, 204 + { 0x1409, 0x7168, 0x1409, 0x8079, 0, 0, timedia_4079d }, 205 + { 0x1409, 0x7168, 0x1409, 0x9079, 0, 0, timedia_4079e }, 206 + { 0x1409, 0x7168, 0x1409, 0xa079, 0, 0, timedia_4079f }, 207 + { 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a }, 208 + { 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b }, 209 + { 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c }, 227 210 228 211 { 0, } /* terminate list */ 229 212 }; ··· 348 293 }, 349 294 [siig_2s1p_20x] = { 350 295 .flags = FL_BASE0, 296 + .num_ports = 1, 297 + .base_baud = 921600, 298 + .uart_offset = 8, 299 + }, 300 + [timedia_4078a] = { 301 + .flags = FL_BASE0|FL_BASE_BARS, 302 + .num_ports = 1, 303 + .base_baud = 921600, 304 + .uart_offset = 8, 305 + }, 306 + [timedia_4079h] = { 307 + .flags = FL_BASE0|FL_BASE_BARS, 308 + .num_ports = 1, 309 + .base_baud = 921600, 310 + .uart_offset = 8, 311 + }, 312 + [timedia_4085h] = { 313 + .flags = FL_BASE0|FL_BASE_BARS, 314 + .num_ports = 1, 315 + .base_baud = 921600, 316 + .uart_offset = 8, 317 + }, 318 + [timedia_4088a] = { 319 + .flags = FL_BASE0|FL_BASE_BARS, 320 + .num_ports = 1, 321 + .base_baud = 921600, 322 + .uart_offset = 8, 323 + }, 324 + [timedia_4089a] = { 325 + .flags = FL_BASE0|FL_BASE_BARS, 326 + .num_ports = 1, 327 + .base_baud = 921600, 328 + .uart_offset = 8, 329 + }, 330 + [timedia_4095a] = { 331 + .flags = FL_BASE0|FL_BASE_BARS, 332 + .num_ports = 1, 333 + .base_baud = 921600, 334 + .uart_offset = 8, 335 + }, 336 + [timedia_4096a] = { 337 + .flags = FL_BASE0|FL_BASE_BARS, 338 + .num_ports = 1, 339 + .base_baud = 921600, 340 + .uart_offset = 8, 341 + }, 342 + [timedia_4078u] = { 343 + .flags = FL_BASE0|FL_BASE_BARS, 344 + .num_ports = 1, 345 + .base_baud = 921600, 346 + .uart_offset = 8, 347 + }, 348 + [timedia_4079a] = { 349 + .flags = FL_BASE0|FL_BASE_BARS, 350 + .num_ports = 1, 351 + .base_baud = 921600, 352 + .uart_offset = 8, 353 + }, 354 + [timedia_4085u] = { 355 + .flags = FL_BASE0|FL_BASE_BARS, 356 + .num_ports = 1, 357 + .base_baud = 921600, 358 + .uart_offset = 8, 359 + }, 360 + [timedia_4079r] = { 361 + .flags = FL_BASE0|FL_BASE_BARS, 362 + .num_ports = 1, 363 + .base_baud = 921600, 364 + .uart_offset = 8, 365 + }, 366 + [timedia_4079s] = { 367 + .flags = FL_BASE0|FL_BASE_BARS, 368 + .num_ports = 1, 369 + .base_baud = 921600, 370 + .uart_offset = 8, 371 + }, 372 + [timedia_4079d] = { 373 + .flags = FL_BASE0|FL_BASE_BARS, 374 + .num_ports = 1, 375 + .base_baud = 921600, 376 + .uart_offset = 8, 377 + }, 378 + [timedia_4079e] = { 379 + .flags = FL_BASE0|FL_BASE_BARS, 380 + .num_ports = 1, 381 + .base_baud = 921600, 382 + .uart_offset = 8, 383 + }, 384 + [timedia_4079f] = { 385 + .flags = FL_BASE0|FL_BASE_BARS, 386 + .num_ports = 1, 387 + .base_baud = 921600, 388 + .uart_offset = 8, 389 + }, 390 + [timedia_9079a] = { 391 + .flags = FL_BASE0|FL_BASE_BARS, 392 + .num_ports = 1, 393 + .base_baud = 921600, 394 + .uart_offset = 8, 395 + }, 396 + [timedia_9079b] = { 397 + .flags = FL_BASE0|FL_BASE_BARS, 398 + .num_ports = 1, 399 + .base_baud = 921600, 400 + .uart_offset = 8, 401 + }, 402 + [timedia_9079c] = { 403 + .flags = FL_BASE0|FL_BASE_BARS, 351 404 .num_ports = 1, 352 405 .base_baud = 921600, 353 406 .uart_offset = 8,
+23
drivers/tty/serial/8250_pci.c
··· 575 575 { 8, timedia_eight_port } 576 576 }; 577 577 578 + /* 579 + * There are nearly 70 different Timedia/SUNIX PCI serial devices. Instead of 580 + * listing them individually, this driver merely grabs them all with 581 + * PCI_ANY_ID. Some of these devices, however, also feature a parallel port, 582 + * and should be left free to be claimed by parport_serial instead. 583 + */ 584 + static int pci_timedia_probe(struct pci_dev *dev) 585 + { 586 + /* 587 + * Check the third digit of the subdevice ID 588 + * (0,2,3,5,6: serial only -- 7,8,9: serial + parallel) 589 + */ 590 + if ((dev->subsystem_device & 0x00f0) >= 0x70) { 591 + dev_info(&dev->dev, 592 + "ignoring Timedia subdevice %04x for parport_serial\n", 593 + dev->subsystem_device); 594 + return -ENODEV; 595 + } 596 + 597 + return 0; 598 + } 599 + 578 600 static int pci_timedia_init(struct pci_dev *dev) 579 601 { 580 602 const unsigned short *ids; ··· 1485 1463 .device = PCI_DEVICE_ID_TIMEDIA_1889, 1486 1464 .subvendor = PCI_VENDOR_ID_TIMEDIA, 1487 1465 .subdevice = PCI_ANY_ID, 1466 + .probe = pci_timedia_probe, 1488 1467 .init = pci_timedia_init, 1489 1468 .setup = pci_timedia_setup, 1490 1469 },