aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/omap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/host/omap.c')
-rw-r--r--drivers/mmc/host/omap.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index 0c7e37f496ef..379d2ffe4c87 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -173,6 +173,8 @@ struct mmc_omap_host {
173 struct omap_mmc_platform_data *pdata; 173 struct omap_mmc_platform_data *pdata;
174}; 174};
175 175
176static struct workqueue_struct *mmc_omap_wq;
177
176static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot) 178static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
177{ 179{
178 unsigned long tick_ns; 180 unsigned long tick_ns;
@@ -289,7 +291,7 @@ static void mmc_omap_release_slot(struct mmc_omap_slot *slot, int clk_enabled)
289 host->next_slot = new_slot; 291 host->next_slot = new_slot;
290 host->mmc = new_slot->mmc; 292 host->mmc = new_slot->mmc;
291 spin_unlock_irqrestore(&host->slot_lock, flags); 293 spin_unlock_irqrestore(&host->slot_lock, flags);
292 schedule_work(&host->slot_release_work); 294 queue_work(mmc_omap_wq, &host->slot_release_work);
293 return; 295 return;
294 } 296 }
295 297
@@ -457,7 +459,7 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data)
457 } 459 }
458 460
459 host->stop_data = data; 461 host->stop_data = data;
460 schedule_work(&host->send_stop_work); 462 queue_work(mmc_omap_wq, &host->send_stop_work);
461} 463}
462 464
463static void 465static void
@@ -637,7 +639,7 @@ mmc_omap_cmd_timer(unsigned long data)
637 OMAP_MMC_WRITE(host, IE, 0); 639 OMAP_MMC_WRITE(host, IE, 0);
638 disable_irq(host->irq); 640 disable_irq(host->irq);
639 host->abort = 1; 641 host->abort = 1;
640 schedule_work(&host->cmd_abort_work); 642 queue_work(mmc_omap_wq, &host->cmd_abort_work);
641 } 643 }
642 spin_unlock_irqrestore(&host->slot_lock, flags); 644 spin_unlock_irqrestore(&host->slot_lock, flags);
643} 645}
@@ -826,7 +828,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
826 host->abort = 1; 828 host->abort = 1;
827 OMAP_MMC_WRITE(host, IE, 0); 829 OMAP_MMC_WRITE(host, IE, 0);
828 disable_irq_nosync(host->irq); 830 disable_irq_nosync(host->irq);
829 schedule_work(&host->cmd_abort_work); 831 queue_work(mmc_omap_wq, &host->cmd_abort_work);
830 return IRQ_HANDLED; 832 return IRQ_HANDLED;
831 } 833 }
832 834
@@ -1387,7 +1389,7 @@ static void mmc_omap_remove_slot(struct mmc_omap_slot *slot)
1387 1389
1388 tasklet_kill(&slot->cover_tasklet); 1390 tasklet_kill(&slot->cover_tasklet);
1389 del_timer_sync(&slot->cover_timer); 1391 del_timer_sync(&slot->cover_timer);
1390 flush_scheduled_work(); 1392 flush_workqueue(mmc_omap_wq);
1391 1393
1392 mmc_remove_host(mmc); 1394 mmc_remove_host(mmc);
1393 mmc_free_host(mmc); 1395 mmc_free_host(mmc);
@@ -1608,12 +1610,22 @@ static struct platform_driver mmc_omap_driver = {
1608 1610
1609static int __init mmc_omap_init(void) 1611static int __init mmc_omap_init(void)
1610{ 1612{
1611 return platform_driver_probe(&mmc_omap_driver, mmc_omap_probe); 1613 int ret;
1614
1615 mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
1616 if (!mmc_omap_wq)
1617 return -ENOMEM;
1618
1619 ret = platform_driver_probe(&mmc_omap_driver, mmc_omap_probe);
1620 if (ret)
1621 destroy_workqueue(mmc_omap_wq);
1622 return ret;
1612} 1623}
1613 1624
1614static void __exit mmc_omap_exit(void) 1625static void __exit mmc_omap_exit(void)
1615{ 1626{
1616 platform_driver_unregister(&mmc_omap_driver); 1627 platform_driver_unregister(&mmc_omap_driver);
1628 destroy_workqueue(mmc_omap_wq);
1617} 1629}
1618 1630
1619module_init(mmc_omap_init); 1631module_init(mmc_omap_init);