/* Unique indices for remoteproc devices */
 static DEFINE_IDA(rproc_dev_index);
+static struct workqueue_struct *rproc_recovery_wq;
 
 static const char * const rproc_crash_names[] = {
        [RPROC_MMUFAULT]        = "mmufault",
        dev_err(&rproc->dev, "crash detected in %s: type %s\n",
                rproc->name, rproc_crash_to_string(type));
 
-       /* Have a worker handle the error; ensure system is not suspended */
-       queue_work(system_freezable_wq, &rproc->crash_handler);
+       queue_work(rproc_recovery_wq, &rproc->crash_handler);
 }
 EXPORT_SYMBOL(rproc_report_crash);
 
 
 static int __init remoteproc_init(void)
 {
+       rproc_recovery_wq = alloc_workqueue("rproc_recovery_wq",
+                                               WQ_UNBOUND | WQ_FREEZABLE, 0);
+       if (!rproc_recovery_wq) {
+               pr_err("remoteproc: creation of rproc_recovery_wq failed\n");
+               return -ENOMEM;
+       }
+
        rproc_init_sysfs();
        rproc_init_debugfs();
        rproc_init_cdev();
 {
        ida_destroy(&rproc_dev_index);
 
+       if (!rproc_recovery_wq)
+               return;
+
        rproc_exit_panic();
        rproc_exit_debugfs();
        rproc_exit_sysfs();
+       destroy_workqueue(rproc_recovery_wq);
 }
 module_exit(remoteproc_exit);