mmc: update workqueue usages
Workqueue creation API has been updated and flush_scheduled_work() is deprecated and scheduled to be removed. * core/core.c: Use alloc_ordered_workqueue() instead of create_singlethread_workqueue(). This removes an unnecessary rescuer. * host/omap.c: Create, use and flush mmc_omap_wq instead of the system_wq. * Flush host->mmc_carddetect_work directly on removal instead of using flush_scheduled_work(). Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Chris Ball <cjb@laptop.org> Cc: linux-mmc@vger.kernel.org
This commit is contained in:
Родитель
afdb32f2e4
Коммит
0d9ee5b2e9
|
@ -1789,7 +1789,7 @@ static int __init mmc_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
workqueue = create_singlethread_workqueue("kmmcd");
|
workqueue = alloc_ordered_workqueue("kmmcd", 0);
|
||||||
if (!workqueue)
|
if (!workqueue)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,8 @@ struct mmc_omap_host {
|
||||||
struct omap_mmc_platform_data *pdata;
|
struct omap_mmc_platform_data *pdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct workqueue_struct *mmc_omap_wq;
|
||||||
|
|
||||||
static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
|
static void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
|
||||||
{
|
{
|
||||||
unsigned long tick_ns;
|
unsigned long tick_ns;
|
||||||
|
@ -289,7 +291,7 @@ static void mmc_omap_release_slot(struct mmc_omap_slot *slot, int clk_enabled)
|
||||||
host->next_slot = new_slot;
|
host->next_slot = new_slot;
|
||||||
host->mmc = new_slot->mmc;
|
host->mmc = new_slot->mmc;
|
||||||
spin_unlock_irqrestore(&host->slot_lock, flags);
|
spin_unlock_irqrestore(&host->slot_lock, flags);
|
||||||
schedule_work(&host->slot_release_work);
|
queue_work(mmc_omap_wq, &host->slot_release_work);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +459,7 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
host->stop_data = data;
|
host->stop_data = data;
|
||||||
schedule_work(&host->send_stop_work);
|
queue_work(mmc_omap_wq, &host->send_stop_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -637,7 +639,7 @@ mmc_omap_cmd_timer(unsigned long data)
|
||||||
OMAP_MMC_WRITE(host, IE, 0);
|
OMAP_MMC_WRITE(host, IE, 0);
|
||||||
disable_irq(host->irq);
|
disable_irq(host->irq);
|
||||||
host->abort = 1;
|
host->abort = 1;
|
||||||
schedule_work(&host->cmd_abort_work);
|
queue_work(mmc_omap_wq, &host->cmd_abort_work);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&host->slot_lock, flags);
|
spin_unlock_irqrestore(&host->slot_lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -826,7 +828,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
|
||||||
host->abort = 1;
|
host->abort = 1;
|
||||||
OMAP_MMC_WRITE(host, IE, 0);
|
OMAP_MMC_WRITE(host, IE, 0);
|
||||||
disable_irq_nosync(host->irq);
|
disable_irq_nosync(host->irq);
|
||||||
schedule_work(&host->cmd_abort_work);
|
queue_work(mmc_omap_wq, &host->cmd_abort_work);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1387,7 +1389,7 @@ static void mmc_omap_remove_slot(struct mmc_omap_slot *slot)
|
||||||
|
|
||||||
tasklet_kill(&slot->cover_tasklet);
|
tasklet_kill(&slot->cover_tasklet);
|
||||||
del_timer_sync(&slot->cover_timer);
|
del_timer_sync(&slot->cover_timer);
|
||||||
flush_scheduled_work();
|
flush_workqueue(mmc_omap_wq);
|
||||||
|
|
||||||
mmc_remove_host(mmc);
|
mmc_remove_host(mmc);
|
||||||
mmc_free_host(mmc);
|
mmc_free_host(mmc);
|
||||||
|
@ -1608,12 +1610,22 @@ static struct platform_driver mmc_omap_driver = {
|
||||||
|
|
||||||
static int __init mmc_omap_init(void)
|
static int __init mmc_omap_init(void)
|
||||||
{
|
{
|
||||||
return platform_driver_probe(&mmc_omap_driver, mmc_omap_probe);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit mmc_omap_exit(void)
|
static void __exit mmc_omap_exit(void)
|
||||||
{
|
{
|
||||||
platform_driver_unregister(&mmc_omap_driver);
|
platform_driver_unregister(&mmc_omap_driver);
|
||||||
|
destroy_workqueue(mmc_omap_wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(mmc_omap_init);
|
module_init(mmc_omap_init);
|
||||||
|
|
|
@ -2290,7 +2290,7 @@ static int omap_hsmmc_remove(struct platform_device *pdev)
|
||||||
free_irq(host->irq, host);
|
free_irq(host->irq, host);
|
||||||
if (mmc_slot(host).card_detect_irq)
|
if (mmc_slot(host).card_detect_irq)
|
||||||
free_irq(mmc_slot(host).card_detect_irq, host);
|
free_irq(mmc_slot(host).card_detect_irq, host);
|
||||||
flush_scheduled_work();
|
flush_work_sync(&host->mmc_carddetect_work);
|
||||||
|
|
||||||
mmc_host_disable(host->mmc);
|
mmc_host_disable(host->mmc);
|
||||||
clk_disable(host->iclk);
|
clk_disable(host->iclk);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче