struct timer_list       clk_timer;
        spinlock_t              clk_lock;     /* for changing enabled state */
        unsigned int            fclk_enabled:1;
+       struct workqueue_struct *mmc_omap_wq;
 
        struct omap_mmc_platform_data *pdata;
 };
 
-static struct workqueue_struct *mmc_omap_wq;
 
 static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
 {
                host->next_slot = new_slot;
                host->mmc = new_slot->mmc;
                spin_unlock_irqrestore(&host->slot_lock, flags);
-               queue_work(mmc_omap_wq, &host->slot_release_work);
+               queue_work(host->mmc_omap_wq, &host->slot_release_work);
                return;
        }
 
        }
 
        host->stop_data = data;
-       queue_work(mmc_omap_wq, &host->send_stop_work);
+       queue_work(host->mmc_omap_wq, &host->send_stop_work);
 }
 
 static void
                OMAP_MMC_WRITE(host, IE, 0);
                disable_irq(host->irq);
                host->abort = 1;
-               queue_work(mmc_omap_wq, &host->cmd_abort_work);
+               queue_work(host->mmc_omap_wq, &host->cmd_abort_work);
        }
        spin_unlock_irqrestore(&host->slot_lock, flags);
 }
                host->abort = 1;
                OMAP_MMC_WRITE(host, IE, 0);
                disable_irq_nosync(host->irq);
-               queue_work(mmc_omap_wq, &host->cmd_abort_work);
+               queue_work(host->mmc_omap_wq, &host->cmd_abort_work);
                return IRQ_HANDLED;
        }
 
 
        tasklet_kill(&slot->cover_tasklet);
        del_timer_sync(&slot->cover_timer);
-       flush_workqueue(mmc_omap_wq);
+       flush_workqueue(slot->host->mmc_omap_wq);
 
        mmc_remove_host(mmc);
        mmc_free_host(mmc);
 
        host->reg_shift = (cpu_is_omap7xx() ? 1 : 2);
 
+       host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
+       if (!host->mmc_omap_wq)
+               goto err_plat_cleanup;
+
        return 0;
 
 err_plat_cleanup:
        iounmap(host->virt_base);
        release_mem_region(pdev->resource[0].start,
                           pdev->resource[0].end - pdev->resource[0].start + 1);
+       destroy_workqueue(host->mmc_omap_wq);
 
        kfree(host);
 
 
 static int __init mmc_omap_init(void)
 {
-       int ret;
-
-       mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
-       if (!mmc_omap_wq)
-               return -ENOMEM;
-
-       ret = platform_driver_probe(&mmc_omap_driver, mmc_omap_probe);
-       if (ret)
-               destroy_workqueue(mmc_omap_wq);
-       return ret;
+       return platform_driver_probe(&mmc_omap_driver, mmc_omap_probe);
 }
 
 static void __exit mmc_omap_exit(void)
 {
        platform_driver_unregister(&mmc_omap_driver);
-       destroy_workqueue(mmc_omap_wq);
 }
 
 module_init(mmc_omap_init);