static DEFINE_SPINLOCK(wwan_hwsim_devs_lock);
 static LIST_HEAD(wwan_hwsim_devs);
 static unsigned int wwan_hwsim_dev_idx;
+static struct workqueue_struct *wwan_wq;
 
 struct wwan_hwsim_dev {
        struct list_head list;
         * waiting this callback to finish in the debugfs_remove() call. So,
         * use workqueue.
         */
-       schedule_work(&port->del_work);
+       queue_work(wwan_wq, &port->del_work);
 
        return count;
 }
         * waiting this callback to finish in the debugfs_remove() call. So,
         * use workqueue.
         */
-       schedule_work(&dev->del_work);
+       queue_work(wwan_wq, &dev->del_work);
 
        return count;
 }
        if (wwan_hwsim_devsnum < 0 || wwan_hwsim_devsnum > 128)
                return -EINVAL;
 
+       wwan_wq = alloc_workqueue("wwan_wq", 0, 0);
+       if (!wwan_wq)
+               return -ENOMEM;
+
        wwan_hwsim_class = class_create(THIS_MODULE, "wwan_hwsim");
-       if (IS_ERR(wwan_hwsim_class))
-               return PTR_ERR(wwan_hwsim_class);
+       if (IS_ERR(wwan_hwsim_class)) {
+               err = PTR_ERR(wwan_hwsim_class);
+               goto err_wq_destroy;
+       }
 
        wwan_hwsim_debugfs_topdir = debugfs_create_dir("wwan_hwsim", NULL);
        wwan_hwsim_debugfs_devcreate =
        return 0;
 
 err_clean_devs:
+       debugfs_remove(wwan_hwsim_debugfs_devcreate);   /* Avoid new devs */
        wwan_hwsim_free_devs();
+       flush_workqueue(wwan_wq);       /* Wait deletion works completion */
        debugfs_remove(wwan_hwsim_debugfs_topdir);
        class_destroy(wwan_hwsim_class);
+err_wq_destroy:
+       destroy_workqueue(wwan_wq);
 
        return err;
 }
 {
        debugfs_remove(wwan_hwsim_debugfs_devcreate);   /* Avoid new devs */
        wwan_hwsim_free_devs();
-       flush_scheduled_work();         /* Wait deletion works completion */
+       flush_workqueue(wwan_wq);       /* Wait deletion works completion */
        debugfs_remove(wwan_hwsim_debugfs_topdir);
        class_destroy(wwan_hwsim_class);
+       destroy_workqueue(wwan_wq);
 }
 
 module_init(wwan_hwsim_init);