u32 exposure;
 
        struct work_struct work;
-       struct workqueue_struct *work_thread;
 
        u32 pktsz;                      /* (used by pkt_scan) */
        u16 npkt;
 
        sd->pktsz = sd->npkt = 0;
        sd->nchg = sd->short_mark = 0;
-       sd->work_thread = create_singlethread_workqueue(MODULE_NAME);
 
        return gspca_dev->usb_err;
 }
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       if (sd->work_thread != NULL) {
-               mutex_unlock(&gspca_dev->usb_lock);
-               destroy_workqueue(sd->work_thread);
-               mutex_lock(&gspca_dev->usb_lock);
-               sd->work_thread = NULL;
-       }
+       mutex_unlock(&gspca_dev->usb_lock);
+       flush_work(&sd->work);
+       mutex_lock(&gspca_dev->usb_lock);
 }
 
 static void do_autogain(struct gspca_dev *gspca_dev)
                                new_qual = QUALITY_MAX;
                        if (new_qual != sd->quality) {
                                sd->quality = new_qual;
-                               queue_work(sd->work_thread, &sd->work);
+                               schedule_work(&sd->work);
                        }
                }
        } else {