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

USB serial: add driver pointer to all usb-serial drivers

Every usb serial driver should have a pointer to the corresponding usb driver.
So the usb serial core can add a new id not only to the usb serial driver, but
also to the usb driver.

Also the usb drivers of ark3116, mos7720 and mos7840 missed the flag
no_dynamic_id=1. This is added now.

Signed-off-by: Johannes Hölzl <johannes.hoelzl@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>


authored by

Johannes Hölzl and committed by
Greg Kroah-Hartman
d9b1b787 93bacefc

+104 -45
+9 -7
drivers/usb/serial/aircable.c
··· 572 572 schedule_work(&priv->rx_work); 573 573 } 574 574 575 + static struct usb_driver aircable_driver = { 576 + .name = "aircable", 577 + .probe = usb_serial_probe, 578 + .disconnect = usb_serial_disconnect, 579 + .id_table = id_table, 580 + .no_dynamic_id = 1, 581 + }; 582 + 575 583 static struct usb_serial_driver aircable_device = { 576 584 .description = "aircable", 585 + .usb_driver = &aircable_driver, 577 586 .id_table = id_table, 578 587 .num_ports = 1, 579 588 .attach = aircable_attach, ··· 594 585 .read_bulk_callback = aircable_read_bulk_callback, 595 586 .throttle = aircable_throttle, 596 587 .unthrottle = aircable_unthrottle, 597 - }; 598 - 599 - static struct usb_driver aircable_driver = { 600 - .name = "aircable", 601 - .probe = usb_serial_probe, 602 - .disconnect = usb_serial_disconnect, 603 - .id_table = id_table, 604 588 }; 605 589 606 590 static int __init aircable_init (void)
+1
drivers/usb/serial/airprime.c
··· 277 277 .owner = THIS_MODULE, 278 278 .name = "airprime", 279 279 }, 280 + .usb_driver = &airprime_driver, 280 281 .id_table = id_table, 281 282 .num_interrupt_in = NUM_DONT_CARE, 282 283 .num_bulk_in = NUM_DONT_CARE,
+2
drivers/usb/serial/ark3116.c
··· 444 444 .probe = usb_serial_probe, 445 445 .disconnect = usb_serial_disconnect, 446 446 .id_table = id_table, 447 + .no_dynamic_id = 1, 447 448 }; 448 449 449 450 static struct usb_serial_driver ark3116_device = { ··· 453 452 .name = "ark3116", 454 453 }, 455 454 .id_table = id_table, 455 + .usb_driver = &ark3116_driver, 456 456 .num_interrupt_in = 1, 457 457 .num_bulk_in = 1, 458 458 .num_bulk_out = 1,
+1
drivers/usb/serial/belkin_sa.c
··· 126 126 .name = "belkin", 127 127 }, 128 128 .description = "Belkin / Peracom / GoHubs USB Serial Adapter", 129 + .usb_driver = &belkin_driver, 129 130 .id_table = id_table_combined, 130 131 .num_interrupt_in = 1, 131 132 .num_bulk_in = 1,
+1
drivers/usb/serial/cp2101.c
··· 89 89 .owner = THIS_MODULE, 90 90 .name = "cp2101", 91 91 }, 92 + .usb_driver = &cp2101_driver, 92 93 .id_table = id_table, 93 94 .num_interrupt_in = 0, 94 95 .num_bulk_in = 0,
+2 -1
drivers/usb/serial/cyberjack.c
··· 88 88 .name = "cyberjack", 89 89 }, 90 90 .description = "Reiner SCT Cyberjack USB card reader", 91 + .usb_driver = &cyberjack_driver, 91 92 .id_table = id_table, 92 93 .num_interrupt_in = 1, 93 94 .num_bulk_in = 1, ··· 99 98 .open = cyberjack_open, 100 99 .close = cyberjack_close, 101 100 .write = cyberjack_write, 102 - .write_room = cyberjack_write_room, 101 + .write_room = cyberjack_write_room, 103 102 .read_int_callback = cyberjack_read_int_callback, 104 103 .read_bulk_callback = cyberjack_read_bulk_callback, 105 104 .write_bulk_callback = cyberjack_write_bulk_callback,
+3
drivers/usb/serial/cypress_m8.c
··· 193 193 .name = "earthmate", 194 194 }, 195 195 .description = "DeLorme Earthmate USB", 196 + .usb_driver = &cypress_driver, 196 197 .id_table = id_table_earthmate, 197 198 .num_interrupt_in = 1, 198 199 .num_interrupt_out = 1, ··· 223 222 .name = "cyphidcom", 224 223 }, 225 224 .description = "HID->COM RS232 Adapter", 225 + .usb_driver = &cypress_driver, 226 226 .id_table = id_table_cyphidcomrs232, 227 227 .num_interrupt_in = 1, 228 228 .num_interrupt_out = 1, ··· 253 251 .name = "nokiaca42v2", 254 252 }, 255 253 .description = "Nokia CA-42 V2 Adapter", 254 + .usb_driver = &cypress_driver, 256 255 .id_table = id_table_nokiaca42v2, 257 256 .num_interrupt_in = 1, 258 257 .num_interrupt_out = 1,
+2
drivers/usb/serial/digi_acceleport.c
··· 509 509 .name = "digi_2", 510 510 }, 511 511 .description = "Digi 2 port USB adapter", 512 + .usb_driver = &digi_driver, 512 513 .id_table = id_table_2, 513 514 .num_interrupt_in = 0, 514 515 .num_bulk_in = 4, ··· 539 538 .name = "digi_4", 540 539 }, 541 540 .description = "Digi 4 port USB adapter", 541 + .usb_driver = &digi_driver, 542 542 .id_table = id_table_4, 543 543 .num_interrupt_in = 0, 544 544 .num_bulk_in = 5,
+1
drivers/usb/serial/empeg.c
··· 117 117 .name = "empeg", 118 118 }, 119 119 .id_table = id_table, 120 + .usb_driver = &empeg_driver, 120 121 .num_interrupt_in = 0, 121 122 .num_bulk_in = 1, 122 123 .num_bulk_out = 1,
+1
drivers/usb/serial/ftdi_sio.c
··· 615 615 .name = "ftdi_sio", 616 616 }, 617 617 .description = "FTDI USB Serial Device", 618 + .usb_driver = &ftdi_driver , 618 619 .id_table = id_table_combined, 619 620 .num_interrupt_in = 0, 620 621 .num_bulk_in = 1,
+1
drivers/usb/serial/funsoft.c
··· 58 58 .name = "funsoft", 59 59 }, 60 60 .id_table = id_table, 61 + .usb_driver = &funsoft_driver, 61 62 .num_interrupt_in = NUM_DONT_CARE, 62 63 .num_bulk_in = NUM_DONT_CARE, 63 64 .num_bulk_out = NUM_DONT_CARE,
+1
drivers/usb/serial/garmin_gps.c
··· 1566 1566 .name = "garmin_gps", 1567 1567 }, 1568 1568 .description = "Garmin GPS usb/tty", 1569 + .usb_driver = &garmin_driver, 1569 1570 .id_table = id_table, 1570 1571 .num_interrupt_in = 1, 1571 1572 .num_bulk_in = 1,
+20 -15
drivers/usb/serial/generic.c
··· 20 20 #include <linux/usb/serial.h> 21 21 #include <asm/uaccess.h> 22 22 23 + static int generic_probe(struct usb_interface *interface, 24 + const struct usb_device_id *id); 25 + 26 + 23 27 static int debug; 24 28 25 29 #ifdef CONFIG_USB_SERIAL_GENERIC ··· 38 34 39 35 static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */ 40 36 37 + /* we want to look at all devices, as the vendor/product id can change 38 + * depending on the command line argument */ 39 + static struct usb_device_id generic_serial_ids[] = { 40 + {.driver_info = 42}, 41 + {} 42 + }; 43 + 44 + static struct usb_driver generic_driver = { 45 + .name = "usbserial_generic", 46 + .probe = generic_probe, 47 + .disconnect = usb_serial_disconnect, 48 + .id_table = generic_serial_ids, 49 + .no_dynamic_id = 1, 50 + }; 51 + 41 52 /* All of the device info needed for the Generic Serial Converter */ 42 53 struct usb_serial_driver usb_serial_generic_device = { 43 54 .driver = { ··· 60 41 .name = "generic", 61 42 }, 62 43 .id_table = generic_device_ids, 44 + .usb_driver = &generic_driver, 63 45 .num_interrupt_in = NUM_DONT_CARE, 64 46 .num_bulk_in = NUM_DONT_CARE, 65 47 .num_bulk_out = NUM_DONT_CARE, 66 48 .num_ports = 1, 67 49 .shutdown = usb_serial_generic_shutdown, 68 - }; 69 - 70 - /* we want to look at all devices, as the vendor/product id can change 71 - * depending on the command line argument */ 72 - static struct usb_device_id generic_serial_ids[] = { 73 - {.driver_info = 42}, 74 - {} 75 50 }; 76 51 77 52 static int generic_probe(struct usb_interface *interface, ··· 78 65 return usb_serial_probe(interface, id); 79 66 return -ENODEV; 80 67 } 81 - 82 - static struct usb_driver generic_driver = { 83 - .name = "usbserial_generic", 84 - .probe = generic_probe, 85 - .disconnect = usb_serial_disconnect, 86 - .id_table = generic_serial_ids, 87 - .no_dynamic_id = 1, 88 - }; 89 68 #endif 90 69 91 70 int usb_serial_generic_register (int _debug)
+1
drivers/usb/serial/hp4x.c
··· 49 49 .name = "hp4X", 50 50 }, 51 51 .id_table = id_table, 52 + .usb_driver = &hp49gp_driver, 52 53 .num_interrupt_in = NUM_DONT_CARE, 53 54 .num_bulk_in = NUM_DONT_CARE, 54 55 .num_bulk_out = NUM_DONT_CARE,
-8
drivers/usb/serial/io_edgeport.c
··· 242 242 243 243 #include "io_tables.h" /* all of the devices that this driver supports */ 244 244 245 - static struct usb_driver io_driver = { 246 - .name = "io_edgeport", 247 - .probe = usb_serial_probe, 248 - .disconnect = usb_serial_disconnect, 249 - .id_table = id_table_combined, 250 - .no_dynamic_id = 1, 251 - }; 252 - 253 245 /* function prototypes for all of our local functions */ 254 246 static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned char *buffer, __u16 bufferLength); 255 247 static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3);
+11
drivers/usb/serial/io_tables.h
··· 95 95 96 96 MODULE_DEVICE_TABLE (usb, id_table_combined); 97 97 98 + static struct usb_driver io_driver = { 99 + .name = "io_edgeport", 100 + .probe = usb_serial_probe, 101 + .disconnect = usb_serial_disconnect, 102 + .id_table = id_table_combined, 103 + .no_dynamic_id = 1, 104 + }; 105 + 98 106 static struct usb_serial_driver edgeport_2port_device = { 99 107 .driver = { 100 108 .owner = THIS_MODULE, 101 109 .name = "edgeport_2", 102 110 }, 103 111 .description = "Edgeport 2 port adapter", 112 + .usb_driver = &io_driver, 104 113 .id_table = edgeport_2port_id_table, 105 114 .num_interrupt_in = 1, 106 115 .num_bulk_in = 1, ··· 140 131 .name = "edgeport_4", 141 132 }, 142 133 .description = "Edgeport 4 port adapter", 134 + .usb_driver = &io_driver, 143 135 .id_table = edgeport_4port_id_table, 144 136 .num_interrupt_in = 1, 145 137 .num_bulk_in = 1, ··· 171 161 .name = "edgeport_8", 172 162 }, 173 163 .description = "Edgeport 8 port adapter", 164 + .usb_driver = &io_driver, 174 165 .id_table = edgeport_8port_id_table, 175 166 .num_interrupt_in = 1, 176 167 .num_bulk_in = 1,
+2
drivers/usb/serial/io_ti.c
··· 2979 2979 .name = "edgeport_ti_1", 2980 2980 }, 2981 2981 .description = "Edgeport TI 1 port adapter", 2982 + .usb_driver = &io_driver, 2982 2983 .id_table = edgeport_1port_id_table, 2983 2984 .num_interrupt_in = 1, 2984 2985 .num_bulk_in = 1, ··· 3010 3009 .name = "edgeport_ti_2", 3011 3010 }, 3012 3011 .description = "Edgeport TI 2 port adapter", 3012 + .usb_driver = &io_driver, 3013 3013 .id_table = edgeport_2port_id_table, 3014 3014 .num_interrupt_in = 1, 3015 3015 .num_bulk_in = 2,
+1
drivers/usb/serial/ipaq.c
··· 563 563 .name = "ipaq", 564 564 }, 565 565 .description = "PocketPC PDA", 566 + .usb_driver = &ipaq_driver, 566 567 .id_table = ipaq_id_table, 567 568 .num_interrupt_in = NUM_DONT_CARE, 568 569 .num_bulk_in = 1,
+1
drivers/usb/serial/ipw.c
··· 442 442 .name = "ipw", 443 443 }, 444 444 .description = "IPWireless converter", 445 + .usb_driver = &usb_ipw_driver, 445 446 .id_table = usb_ipw_ids, 446 447 .num_interrupt_in = NUM_DONT_CARE, 447 448 .num_bulk_in = 1,
+1
drivers/usb/serial/ir-usb.c
··· 138 138 .name = "ir-usb", 139 139 }, 140 140 .description = "IR Dongle", 141 + .usb_driver = &ir_driver, 141 142 .id_table = id_table, 142 143 .num_interrupt_in = 1, 143 144 .num_bulk_in = 1,
+4
drivers/usb/serial/keyspan.h
··· 576 576 .name = "keyspan_no_firm", 577 577 }, 578 578 .description = "Keyspan - (without firmware)", 579 + .usb_driver = &keyspan_driver, 579 580 .id_table = keyspan_pre_ids, 580 581 .num_interrupt_in = NUM_DONT_CARE, 581 582 .num_bulk_in = NUM_DONT_CARE, ··· 591 590 .name = "keyspan_1", 592 591 }, 593 592 .description = "Keyspan 1 port adapter", 593 + .usb_driver = &keyspan_driver, 594 594 .id_table = keyspan_1port_ids, 595 595 .num_interrupt_in = NUM_DONT_CARE, 596 596 .num_bulk_in = NUM_DONT_CARE, ··· 619 617 .name = "keyspan_2", 620 618 }, 621 619 .description = "Keyspan 2 port adapter", 620 + .usb_driver = &keyspan_driver, 622 621 .id_table = keyspan_2port_ids, 623 622 .num_interrupt_in = NUM_DONT_CARE, 624 623 .num_bulk_in = NUM_DONT_CARE, ··· 647 644 .name = "keyspan_4", 648 645 }, 649 646 .description = "Keyspan 4 port adapter", 647 + .usb_driver = &keyspan_driver, 650 648 .id_table = keyspan_4port_ids, 651 649 .num_interrupt_in = NUM_DONT_CARE, 652 650 .num_bulk_in = 5,
+3
drivers/usb/serial/keyspan_pda.c
··· 793 793 .name = "keyspan_pda_pre", 794 794 }, 795 795 .description = "Keyspan PDA - (prerenumeration)", 796 + .usb_driver = &keyspan_pda_driver, 796 797 .id_table = id_table_fake, 797 798 .num_interrupt_in = NUM_DONT_CARE, 798 799 .num_bulk_in = NUM_DONT_CARE, ··· 810 809 .name = "xircom_no_firm", 811 810 }, 812 811 .description = "Xircom / Entregra PGS - (prerenumeration)", 812 + .usb_driver = &keyspan_pda_driver, 813 813 .id_table = id_table_fake_xircom, 814 814 .num_interrupt_in = NUM_DONT_CARE, 815 815 .num_bulk_in = NUM_DONT_CARE, ··· 826 824 .name = "keyspan_pda", 827 825 }, 828 826 .description = "Keyspan PDA", 827 + .usb_driver = &keyspan_pda_driver, 829 828 .id_table = id_table_std, 830 829 .num_interrupt_in = 1, 831 830 .num_bulk_in = 0,
+1
drivers/usb/serial/kl5kusb105.c
··· 124 124 .name = "kl5kusb105d", 125 125 }, 126 126 .description = "KL5KUSB105D / PalmConnect", 127 + .usb_driver = &kl5kusb105d_driver, 127 128 .id_table = id_table, 128 129 .num_interrupt_in = 1, 129 130 .num_bulk_in = 1,
+1
drivers/usb/serial/kobil_sct.c
··· 110 110 .name = "kobil", 111 111 }, 112 112 .description = "KOBIL USB smart card terminal", 113 + .usb_driver = &kobil_driver, 113 114 .id_table = id_table, 114 115 .num_interrupt_in = NUM_DONT_CARE, 115 116 .num_bulk_in = 0,
+1
drivers/usb/serial/mct_u232.c
··· 137 137 .name = "mct_u232", 138 138 }, 139 139 .description = "MCT U232", 140 + .usb_driver = &mct_u232_driver, 140 141 .id_table = id_table_combined, 141 142 .num_interrupt_in = 2, 142 143 .num_bulk_in = 0,
+9 -7
drivers/usb/serial/mos7720.c
··· 1605 1605 usb_set_serial_data(serial, NULL); 1606 1606 } 1607 1607 1608 + static struct usb_driver usb_driver = { 1609 + .name = "moschip7720", 1610 + .probe = usb_serial_probe, 1611 + .disconnect = usb_serial_disconnect, 1612 + .id_table = moschip_port_id_table, 1613 + .no_dynamic_id = 1, 1614 + }; 1615 + 1608 1616 static struct usb_serial_driver moschip7720_2port_driver = { 1609 1617 .driver = { 1610 1618 .owner = THIS_MODULE, 1611 1619 .name = "moschip7720", 1612 1620 }, 1613 1621 .description = "Moschip 2 port adapter", 1622 + .usb_driver = &usb_driver, 1614 1623 .id_table = moschip_port_id_table, 1615 1624 .num_interrupt_in = 1, 1616 1625 .num_bulk_in = 2, ··· 1638 1629 .chars_in_buffer = mos7720_chars_in_buffer, 1639 1630 .break_ctl = mos7720_break, 1640 1631 .read_bulk_callback = mos7720_bulk_in_callback, 1641 - }; 1642 - 1643 - static struct usb_driver usb_driver = { 1644 - .name = "moschip7720", 1645 - .probe = usb_serial_probe, 1646 - .disconnect = usb_serial_disconnect, 1647 - .id_table = moschip_port_id_table, 1648 1632 }; 1649 1633 1650 1634 static int __init moschip7720_init(void)
+9 -7
drivers/usb/serial/mos7840.c
··· 2834 2834 2835 2835 } 2836 2836 2837 + static struct usb_driver io_driver = { 2838 + .name = "mos7840", 2839 + .probe = usb_serial_probe, 2840 + .disconnect = usb_serial_disconnect, 2841 + .id_table = moschip_id_table_combined, 2842 + .no_dynamic_id = 1, 2843 + }; 2844 + 2837 2845 static struct usb_serial_driver moschip7840_4port_device = { 2838 2846 .driver = { 2839 2847 .owner = THIS_MODULE, 2840 2848 .name = "mos7840", 2841 2849 }, 2842 2850 .description = DRIVER_DESC, 2851 + .usb_driver = &io_driver, 2843 2852 .id_table = moschip_port_id_table, 2844 2853 .num_interrupt_in = 1, //NUM_DONT_CARE,//1, 2845 2854 #ifdef check ··· 2876 2867 .shutdown = mos7840_shutdown, 2877 2868 .read_bulk_callback = mos7840_bulk_in_callback, 2878 2869 .read_int_callback = mos7840_interrupt_callback, 2879 - }; 2880 - 2881 - static struct usb_driver io_driver = { 2882 - .name = "mos7840", 2883 - .probe = usb_serial_probe, 2884 - .disconnect = usb_serial_disconnect, 2885 - .id_table = moschip_id_table_combined, 2886 2870 }; 2887 2871 2888 2872 /****************************************************************************
+1
drivers/usb/serial/navman.c
··· 119 119 .name = "navman", 120 120 }, 121 121 .id_table = id_table, 122 + .usb_driver = &navman_driver, 122 123 .num_interrupt_in = NUM_DONT_CARE, 123 124 .num_bulk_in = NUM_DONT_CARE, 124 125 .num_bulk_out = NUM_DONT_CARE,
+1
drivers/usb/serial/omninet.c
··· 93 93 .name = "omninet", 94 94 }, 95 95 .description = "ZyXEL - omni.net lcd plus usb", 96 + .usb_driver = &omninet_driver, 96 97 .id_table = id_table, 97 98 .num_interrupt_in = 1, 98 99 .num_bulk_in = 1,
+1
drivers/usb/serial/option.c
··· 135 135 .name = "option1", 136 136 }, 137 137 .description = "GSM modem (1-port)", 138 + .usb_driver = &option_driver, 138 139 .id_table = option_ids1, 139 140 .num_interrupt_in = NUM_DONT_CARE, 140 141 .num_bulk_in = NUM_DONT_CARE,
+1
drivers/usb/serial/pl2303.c
··· 1118 1118 .name = "pl2303", 1119 1119 }, 1120 1120 .id_table = id_table, 1121 + .usb_driver = &pl2303_driver, 1121 1122 .num_interrupt_in = NUM_DONT_CARE, 1122 1123 .num_bulk_in = 1, 1123 1124 .num_bulk_out = 1,
+1
drivers/usb/serial/safe_serial.c
··· 402 402 .name = "safe_serial", 403 403 }, 404 404 .id_table = id_table, 405 + .usb_driver = &safe_driver, 405 406 .num_interrupt_in = NUM_DONT_CARE, 406 407 .num_bulk_in = NUM_DONT_CARE, 407 408 .num_bulk_out = NUM_DONT_CARE,
+2
drivers/usb/serial/sierra.c
··· 614 614 }, 615 615 .description = "Sierra USB modem (1 port)", 616 616 .id_table = id_table_1port, 617 + .usb_driver = &sierra_driver, 617 618 .num_interrupt_in = NUM_DONT_CARE, 618 619 .num_bulk_in = 1, 619 620 .num_bulk_out = 1, ··· 643 642 }, 644 643 .description = "Sierra USB modem (3 port)", 645 644 .id_table = id_table_3port, 645 + .usb_driver = &sierra_driver, 646 646 .num_interrupt_in = NUM_DONT_CARE, 647 647 .num_bulk_in = 3, 648 648 .num_bulk_out = 3,
+2
drivers/usb/serial/ti_usb_3410_5052.c
··· 262 262 .name = "ti_usb_3410_5052_1", 263 263 }, 264 264 .description = "TI USB 3410 1 port adapter", 265 + .usb_driver = &ti_usb_driver, 265 266 .id_table = ti_id_table_3410, 266 267 .num_interrupt_in = 1, 267 268 .num_bulk_in = 1, ··· 293 292 .name = "ti_usb_3410_5052_2", 294 293 }, 295 294 .description = "TI USB 5052 2 port adapter", 295 + .usb_driver = &ti_usb_driver, 296 296 .id_table = ti_id_table_5052, 297 297 .num_interrupt_in = 1, 298 298 .num_bulk_in = 2,
+3
drivers/usb/serial/visor.c
··· 189 189 .name = "visor", 190 190 }, 191 191 .description = "Handspring Visor / Palm OS", 192 + .usb_driver = &visor_driver, 192 193 .id_table = id_table, 193 194 .num_interrupt_in = NUM_DONT_CARE, 194 195 .num_bulk_in = 2, ··· 220 219 .name = "clie_5", 221 220 }, 222 221 .description = "Sony Clie 5.0", 222 + .usb_driver = &visor_driver, 223 223 .id_table = clie_id_5_table, 224 224 .num_interrupt_in = NUM_DONT_CARE, 225 225 .num_bulk_in = 2, ··· 251 249 .name = "clie_3.5", 252 250 }, 253 251 .description = "Sony Clie 3.5", 252 + .usb_driver = &visor_driver, 254 253 .id_table = clie_id_3_5_table, 255 254 .num_interrupt_in = 0, 256 255 .num_bulk_in = 1,
+2
drivers/usb/serial/whiteheat.c
··· 161 161 .name = "whiteheatnofirm", 162 162 }, 163 163 .description = "Connect Tech - WhiteHEAT - (prerenumeration)", 164 + .usb_driver = &whiteheat_driver, 164 165 .id_table = id_table_prerenumeration, 165 166 .num_interrupt_in = NUM_DONT_CARE, 166 167 .num_bulk_in = NUM_DONT_CARE, ··· 177 176 .name = "whiteheat", 178 177 }, 179 178 .description = "Connect Tech - WhiteHEAT", 179 + .usb_driver = &whiteheat_driver, 180 180 .id_table = id_table_std, 181 181 .num_interrupt_in = NUM_DONT_CARE, 182 182 .num_bulk_in = NUM_DONT_CARE,