return 0;
 }
 
+static void line6_startup_work(struct work_struct *work)
+{
+       struct usb_line6 *line6 =
+               container_of(work, struct usb_line6, startup_work.work);
+
+       if (line6->startup)
+               line6->startup(line6);
+}
+
 /*
        Probe USB device.
 */
        line6->properties = properties;
        line6->usbdev = usbdev;
        line6->ifcdev = &interface->dev;
+       INIT_DELAYED_WORK(&line6->startup_work, line6_startup_work);
 
        strcpy(card->id, properties->id);
        strcpy(card->driver, driver_name);
        if (WARN_ON(usbdev != line6->usbdev))
                return;
 
+       cancel_delayed_work(&line6->startup_work);
+
        if (line6->urb_listen != NULL)
                line6_stop_listen(line6);
 
 
                        fifo;
        } messages;
 
+       /* Work for delayed PCM startup */
+       struct delayed_work startup_work;
+
        /* If MIDI is supported, buffer_message contains the pre-processed data;
         * otherwise the data is only in urb_listen (buffer_incoming).
         */
        void (*process_message)(struct usb_line6 *);
        void (*disconnect)(struct usb_line6 *line6);
+       void (*startup)(struct usb_line6 *line6);
 };
 
 extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
 
        /* Firmware version (x 100) */
        u8 firmware_version;
 
-       /* Work for delayed PCM startup */
-       struct delayed_work pcm_work;
-
        /* Device type */
        enum line6_device_type type;
 
        return 1;
 }
 
-static void toneport_start_pcm(struct work_struct *work)
+static void toneport_startup(struct usb_line6 *line6)
 {
-       struct usb_line6_toneport *toneport =
-               container_of(work, struct usb_line6_toneport, pcm_work.work);
-       struct usb_line6 *line6 = &toneport->line6;
-
        line6_pcm_acquire(line6->line6pcm, LINE6_STREAM_MONITOR, true);
 }
 
        if (toneport_has_led(toneport))
                toneport_update_led(toneport);
 
-       schedule_delayed_work(&toneport->pcm_work,
+       schedule_delayed_work(&toneport->line6.startup_work,
                              msecs_to_jiffies(TONEPORT_PCM_DELAY * 1000));
        return 0;
 }
        struct usb_line6_toneport *toneport =
                (struct usb_line6_toneport *)line6;
 
-       cancel_delayed_work_sync(&toneport->pcm_work);
-
        if (toneport_has_led(toneport))
                toneport_remove_leds(toneport);
 }
        struct usb_line6_toneport *toneport =  (struct usb_line6_toneport *) line6;
 
        toneport->type = id->driver_info;
-       INIT_DELAYED_WORK(&toneport->pcm_work, toneport_start_pcm);
 
        line6->disconnect = line6_toneport_disconnect;
+       line6->startup = toneport_startup;
 
        /* initialize PCM subsystem: */
        err = line6_init_pcm(line6, &toneport_pcm_properties);