ARM: OMAP: enable mailbox irq per instance
The machine-specific omap2_mbox_startup is called only once to initialize the whole mbox module, and as a result, enabling the mbox irq at that point only works for the very first mailbox instance opened. Instead, this patch makes sure enable_irq() is called every time a new mbox instance is opened. In addition, we're now enabling the mbox's irq only after its notifier_block is registered, to avoid possible race of receiving an interrupt without invoking the user's notifier callback. Signed-off-by: Juan Gutierrez <jgutierrez@ti.com> Signed-off-by: Suman Anna <s-anna@ti.com> [ohad@wizery.com: slightly reworded the commit log] Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
This commit is contained in:
parent
d48b97b403
commit
1d8a0e963a
|
@ -83,8 +83,6 @@ static int omap2_mbox_startup(struct omap_mbox *mbox)
|
|||
l = mbox_read_reg(MAILBOX_REVISION);
|
||||
pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
|
||||
|
||||
omap2_mbox_enable_irq(mbox, IRQ_RX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -282,6 +282,8 @@ static int omap_mbox_startup(struct omap_mbox *mbox)
|
|||
}
|
||||
mbox->rxq = mq;
|
||||
mq->mbox = mbox;
|
||||
|
||||
omap_mbox_enable_irq(mbox, IRQ_RX);
|
||||
}
|
||||
mutex_unlock(&mbox_configured_lock);
|
||||
return 0;
|
||||
|
@ -305,6 +307,7 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
|
|||
mutex_lock(&mbox_configured_lock);
|
||||
|
||||
if (!--mbox->use_count) {
|
||||
omap_mbox_disable_irq(mbox, IRQ_RX);
|
||||
free_irq(mbox->irq, mbox);
|
||||
tasklet_kill(&mbox->txq->tasklet);
|
||||
flush_work_sync(&mbox->rxq->work);
|
||||
|
@ -338,13 +341,15 @@ struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)
|
|||
if (!mbox)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
ret = omap_mbox_startup(mbox);
|
||||
if (ret)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
if (nb)
|
||||
blocking_notifier_chain_register(&mbox->notifier, nb);
|
||||
|
||||
ret = omap_mbox_startup(mbox);
|
||||
if (ret) {
|
||||
blocking_notifier_chain_unregister(&mbox->notifier, nb);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
return mbox;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mbox_get);
|
||||
|
|
Loading…
Reference in New Issue