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>
                schedule_work(&priv->rx_work);
 }
 
+static struct usb_driver aircable_driver = {
+       .name =         "aircable",
+       .probe =        usb_serial_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     id_table,
+       .no_dynamic_id =        1,
+};
+
 static struct usb_serial_driver aircable_device = {
        .description =          "aircable",
+       .usb_driver =           &aircable_driver,
        .id_table =             id_table,
        .num_ports =            1,
        .attach =               aircable_attach,
        .unthrottle =           aircable_unthrottle,
 };
 
-static struct usb_driver aircable_driver = {
-       .name =         "aircable",
-       .probe =        usb_serial_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     id_table,
-};
-
 static int __init aircable_init (void)
 {
        int retval;
 
                .owner =        THIS_MODULE,
                .name =         "airprime",
        },
+       .usb_driver =           &airprime_driver,
        .id_table =             id_table,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
 
        .probe =        usb_serial_probe,
        .disconnect =   usb_serial_disconnect,
        .id_table =     id_table,
+       .no_dynamic_id =        1,
 };
 
 static struct usb_serial_driver ark3116_device = {
                .name =         "ark3116",
        },
        .id_table =             id_table,
+       .usb_driver =           &ark3116_driver,
        .num_interrupt_in =     1,
        .num_bulk_in =          1,
        .num_bulk_out =         1,
 
                .name =         "belkin",
        },
        .description =          "Belkin / Peracom / GoHubs USB Serial Adapter",
+       .usb_driver =           &belkin_driver,
        .id_table =             id_table_combined,
        .num_interrupt_in =     1,
        .num_bulk_in =          1,
 
                .owner =        THIS_MODULE,
                .name =         "cp2101",
        },
+       .usb_driver             = &cp2101_driver,
        .id_table               = id_table,
        .num_interrupt_in       = 0,
        .num_bulk_in            = 0,
 
                .name =         "cyberjack",
        },
        .description =          "Reiner SCT Cyberjack USB card reader",
+       .usb_driver =           &cyberjack_driver,
        .id_table =             id_table,
        .num_interrupt_in =     1,
        .num_bulk_in =          1,
        .open =                 cyberjack_open,
        .close =                cyberjack_close,
        .write =                cyberjack_write,
-       .write_room =   cyberjack_write_room,
+       .write_room =           cyberjack_write_room,
        .read_int_callback =    cyberjack_read_int_callback,
        .read_bulk_callback =   cyberjack_read_bulk_callback,
        .write_bulk_callback =  cyberjack_write_bulk_callback,
 
                .name =                 "earthmate",
        },
        .description =                  "DeLorme Earthmate USB",
+       .usb_driver =                   &cypress_driver,
        .id_table =                     id_table_earthmate,
        .num_interrupt_in =             1,
        .num_interrupt_out =            1,
                .name =                 "cyphidcom",
        },
        .description =                  "HID->COM RS232 Adapter",
+       .usb_driver =                   &cypress_driver,
        .id_table =                     id_table_cyphidcomrs232,
        .num_interrupt_in =             1,
        .num_interrupt_out =            1,
                 .name =                        "nokiaca42v2",
        },
        .description =                  "Nokia CA-42 V2 Adapter",
+       .usb_driver =                   &cypress_driver,
        .id_table =                     id_table_nokiaca42v2,
        .num_interrupt_in =             1,
        .num_interrupt_out =            1,
 
                .name =                 "digi_2",
        },
        .description =                  "Digi 2 port USB adapter",
+       .usb_driver =                   &digi_driver,
        .id_table =                     id_table_2,
        .num_interrupt_in =             0,
        .num_bulk_in =                  4,
                .name =                 "digi_4",
        },
        .description =                  "Digi 4 port USB adapter",
+       .usb_driver =                   &digi_driver,
        .id_table =                     id_table_4,
        .num_interrupt_in =             0,
        .num_bulk_in =                  5,
 
                .name =         "empeg",
        },
        .id_table =             id_table,
+       .usb_driver =           &empeg_driver,
        .num_interrupt_in =     0,
        .num_bulk_in =          1,
        .num_bulk_out =         1,
 
                .name =         "ftdi_sio",
        },
        .description =          "FTDI USB Serial Device",
+       .usb_driver =           &ftdi_driver ,
        .id_table =             id_table_combined,
        .num_interrupt_in =     0,
        .num_bulk_in =          1,
 
                .name =         "funsoft",
        },
        .id_table =             id_table,
+       .usb_driver =           &funsoft_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
 
                .name        = "garmin_gps",
        },
        .description         = "Garmin GPS usb/tty",
+       .usb_driver          = &garmin_driver,
        .id_table            = id_table,
        .num_interrupt_in    = 1,
        .num_bulk_in         = 1,
 
 #include <linux/usb/serial.h>
 #include <asm/uaccess.h>
 
+static int generic_probe(struct usb_interface *interface,
+                        const struct usb_device_id *id);
+
+
 static int debug;
 
 #ifdef CONFIG_USB_SERIAL_GENERIC
 
 static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
 
+/* we want to look at all devices, as the vendor/product id can change
+ * depending on the command line argument */
+static struct usb_device_id generic_serial_ids[] = {
+       {.driver_info = 42},
+       {}
+};
+
+static struct usb_driver generic_driver = {
+       .name =         "usbserial_generic",
+       .probe =        generic_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     generic_serial_ids,
+       .no_dynamic_id =        1,
+};
+
 /* All of the device info needed for the Generic Serial Converter */
 struct usb_serial_driver usb_serial_generic_device = {
        .driver = {
                .name =         "generic",
        },
        .id_table =             generic_device_ids,
+       .usb_driver =           &generic_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
        .shutdown =             usb_serial_generic_shutdown,
 };
 
-/* we want to look at all devices, as the vendor/product id can change
- * depending on the command line argument */
-static struct usb_device_id generic_serial_ids[] = {
-       {.driver_info = 42},
-       {}
-};
-
 static int generic_probe(struct usb_interface *interface,
                               const struct usb_device_id *id)
 {
                return usb_serial_probe(interface, id);
        return -ENODEV;
 }
-
-static struct usb_driver generic_driver = {
-       .name =         "usbserial_generic",
-       .probe =        generic_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     generic_serial_ids,
-       .no_dynamic_id =        1,
-};
 #endif
 
 int usb_serial_generic_register (int _debug)
 
                .name =         "hp4X",
        },
        .id_table =             id_table,
+       .usb_driver =           &hp49gp_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
 
 
 #include "io_tables.h" /* all of the devices that this driver supports */
 
-static struct usb_driver io_driver = {
-       .name =         "io_edgeport",
-       .probe =        usb_serial_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     id_table_combined,
-       .no_dynamic_id =        1,
-};
-
 /* function prototypes for all of our local functions */
 static void  process_rcvd_data         (struct edgeport_serial *edge_serial, unsigned char *buffer, __u16 bufferLength);
 static void process_rcvd_status                (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3);
 
 
 MODULE_DEVICE_TABLE (usb, id_table_combined);
 
+static struct usb_driver io_driver = {
+       .name =         "io_edgeport",
+       .probe =        usb_serial_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     id_table_combined,
+       .no_dynamic_id =        1,
+};
+
 static struct usb_serial_driver edgeport_2port_device = {
        .driver = {
                .owner          = THIS_MODULE,
                .name           = "edgeport_2",
        },
        .description            = "Edgeport 2 port adapter",
+       .usb_driver             = &io_driver,
        .id_table               = edgeport_2port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 1,
                .name           = "edgeport_4",
        },
        .description            = "Edgeport 4 port adapter",
+       .usb_driver             = &io_driver,
        .id_table               = edgeport_4port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 1,
                .name           = "edgeport_8",
        },
        .description            = "Edgeport 8 port adapter",
+       .usb_driver             = &io_driver,
        .id_table               = edgeport_8port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 1,
 
                .name           = "edgeport_ti_1",
        },
        .description            = "Edgeport TI 1 port adapter",
+       .usb_driver             = &io_driver,
        .id_table               = edgeport_1port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 1,
                .name           = "edgeport_ti_2",
        },
        .description            = "Edgeport TI 2 port adapter",
+       .usb_driver             = &io_driver,
        .id_table               = edgeport_2port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 2,
 
                .name =         "ipaq",
        },
        .description =          "PocketPC PDA",
+       .usb_driver =           &ipaq_driver,
        .id_table =             ipaq_id_table,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          1,
 
                .name =         "ipw",
        },
        .description =          "IPWireless converter",
+       .usb_driver =           &usb_ipw_driver,
        .id_table =             usb_ipw_ids,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          1,
 
                .name =         "ir-usb",
        },
        .description =          "IR Dongle",
+       .usb_driver =           &ir_driver,
        .id_table =             id_table,
        .num_interrupt_in =     1,
        .num_bulk_in =          1,
 
                .name           = "keyspan_no_firm",
        },
        .description            = "Keyspan - (without firmware)",
+       .usb_driver             = &keyspan_driver,
        .id_table               = keyspan_pre_ids,
        .num_interrupt_in       = NUM_DONT_CARE,
        .num_bulk_in            = NUM_DONT_CARE,
                .name           = "keyspan_1",
        },
        .description            = "Keyspan 1 port adapter",
+       .usb_driver             = &keyspan_driver,
        .id_table               = keyspan_1port_ids,
        .num_interrupt_in       = NUM_DONT_CARE,
        .num_bulk_in            = NUM_DONT_CARE,
                .name           = "keyspan_2",
        },
        .description            = "Keyspan 2 port adapter",
+       .usb_driver             = &keyspan_driver,
        .id_table               = keyspan_2port_ids,
        .num_interrupt_in       = NUM_DONT_CARE,
        .num_bulk_in            = NUM_DONT_CARE,
                .name           = "keyspan_4",
        },
        .description            = "Keyspan 4 port adapter",
+       .usb_driver             = &keyspan_driver,
        .id_table               = keyspan_4port_ids,
        .num_interrupt_in       = NUM_DONT_CARE,
        .num_bulk_in            = 5,
 
                .name =         "keyspan_pda_pre",
        },
        .description =          "Keyspan PDA - (prerenumeration)",
+       .usb_driver =           &keyspan_pda_driver,
        .id_table =             id_table_fake,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
                .name =         "xircom_no_firm",
        },
        .description =          "Xircom / Entregra PGS - (prerenumeration)",
+       .usb_driver =           &keyspan_pda_driver,
        .id_table =             id_table_fake_xircom,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
                .name =         "keyspan_pda",
        },
        .description =          "Keyspan PDA",
+       .usb_driver =           &keyspan_pda_driver,
        .id_table =             id_table_std,
        .num_interrupt_in =     1,
        .num_bulk_in =          0,
 
                .name =         "kl5kusb105d",
        },
        .description =       "KL5KUSB105D / PalmConnect",
+       .usb_driver =        &kl5kusb105d_driver,
        .id_table =          id_table,
        .num_interrupt_in =  1,
        .num_bulk_in =       1,
 
                .name =         "kobil",
        },
        .description =          "KOBIL USB smart card terminal",
+       .usb_driver =           &kobil_driver,
        .id_table =             id_table,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          0,
 
                .name =         "mct_u232",
        },
        .description =       "MCT U232",
+       .usb_driver =        &mct_u232_driver,
        .id_table =          id_table_combined,
        .num_interrupt_in =  2,
        .num_bulk_in =       0,
 
        usb_set_serial_data(serial, NULL);
 }
 
+static struct usb_driver usb_driver = {
+       .name =         "moschip7720",
+       .probe =        usb_serial_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     moschip_port_id_table,
+       .no_dynamic_id =        1,
+};
+
 static struct usb_serial_driver moschip7720_2port_driver = {
        .driver = {
                .owner =        THIS_MODULE,
                .name =         "moschip7720",
        },
        .description            = "Moschip 2 port adapter",
+       .usb_driver             = &usb_driver,
        .id_table               = moschip_port_id_table,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 2,
        .read_bulk_callback     = mos7720_bulk_in_callback,
 };
 
-static struct usb_driver usb_driver = {
-       .name =         "moschip7720",
-       .probe =        usb_serial_probe,
-       .disconnect =   usb_serial_disconnect,
-       .id_table =     moschip_port_id_table,
-};
-
 static int __init moschip7720_init(void)
 {
        int retval;
 
 
 }
 
+static struct usb_driver io_driver = {
+       .name = "mos7840",
+       .probe = usb_serial_probe,
+       .disconnect = usb_serial_disconnect,
+       .id_table = moschip_id_table_combined,
+       .no_dynamic_id = 1,
+};
+
 static struct usb_serial_driver moschip7840_4port_device = {
        .driver = {
                   .owner = THIS_MODULE,
                   .name = "mos7840",
                   },
        .description = DRIVER_DESC,
+       .usb_driver = &io_driver,
        .id_table = moschip_port_id_table,
        .num_interrupt_in = 1,  //NUM_DONT_CARE,//1,
 #ifdef check
        .read_int_callback = mos7840_interrupt_callback,
 };
 
-static struct usb_driver io_driver = {
-       .name = "mos7840",
-       .probe = usb_serial_probe,
-       .disconnect = usb_serial_disconnect,
-       .id_table = moschip_id_table_combined,
-};
-
 /****************************************************************************
  * moschip7840_init
  *     This is called by the module subsystem, or on startup to initialize us
 
                .name =         "navman",
        },
        .id_table =             id_table,
+       .usb_driver =           &navman_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
 
                .name =         "omninet",
        },
        .description =          "ZyXEL - omni.net lcd plus usb",
+       .usb_driver =           &omninet_driver,
        .id_table =             id_table,
        .num_interrupt_in =     1,
        .num_bulk_in =          1,
 
                .name =         "option1",
        },
        .description       = "GSM modem (1-port)",
+       .usb_driver        = &option_driver,
        .id_table          = option_ids1,
        .num_interrupt_in  = NUM_DONT_CARE,
        .num_bulk_in       = NUM_DONT_CARE,
 
                .name =         "pl2303",
        },
        .id_table =             id_table,
+       .usb_driver =           &pl2303_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          1,
        .num_bulk_out =         1,
 
                .name =         "safe_serial",
        },
        .id_table =             id_table,
+       .usb_driver =           &safe_driver,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
 
        },
        .description       = "Sierra USB modem (1 port)",
        .id_table          = id_table_1port,
+       .usb_driver        = &sierra_driver,
        .num_interrupt_in  = NUM_DONT_CARE,
        .num_bulk_in       = 1,
        .num_bulk_out      = 1,
        },
        .description       = "Sierra USB modem (3 port)",
        .id_table          = id_table_3port,
+       .usb_driver        = &sierra_driver,
        .num_interrupt_in  = NUM_DONT_CARE,
        .num_bulk_in       = 3,
        .num_bulk_out      = 3,
 
                .name           = "ti_usb_3410_5052_1",
        },
        .description            = "TI USB 3410 1 port adapter",
+       .usb_driver             = &ti_usb_driver,
        .id_table               = ti_id_table_3410,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 1,
                .name           = "ti_usb_3410_5052_2",
        },
        .description            = "TI USB 5052 2 port adapter",
+       .usb_driver             = &ti_usb_driver,
        .id_table               = ti_id_table_5052,
        .num_interrupt_in       = 1,
        .num_bulk_in            = 2,
 
                .name =         "visor",
        },
        .description =          "Handspring Visor / Palm OS",
+       .usb_driver =           &visor_driver,
        .id_table =             id_table,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          2,
                .name =         "clie_5",
        },
        .description =          "Sony Clie 5.0",
+       .usb_driver =           &visor_driver,
        .id_table =             clie_id_5_table,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          2,
                .name =         "clie_3.5",
        },
        .description =          "Sony Clie 3.5",
+       .usb_driver =           &visor_driver,
        .id_table =             clie_id_3_5_table,
        .num_interrupt_in =     0,
        .num_bulk_in =          1,
 
                .name =         "whiteheatnofirm",
        },
        .description =          "Connect Tech - WhiteHEAT - (prerenumeration)",
+       .usb_driver =           &whiteheat_driver,
        .id_table =             id_table_prerenumeration,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,
                .name =         "whiteheat",
        },
        .description =          "Connect Tech - WhiteHEAT",
+       .usb_driver =           &whiteheat_driver,
        .id_table =             id_table_std,
        .num_interrupt_in =     NUM_DONT_CARE,
        .num_bulk_in =          NUM_DONT_CARE,