ARM: OMAP: enable mailbox irq per instance
authorJuan Gutierrez <jgutierrez@ti.com>
Sun, 13 May 2012 12:33:04 +0000 (15:33 +0300)
committerOhad Ben-Cohen <ohad@wizery.com>
Sun, 13 May 2012 13:09:39 +0000 (16:09 +0300)
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>
arch/arm/mach-omap2/mailbox.c
arch/arm/plat-omap/mailbox.c

index 415a6f1..f727034 100644 (file)
@@ -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;
 }
 
index ad32621..5e13c38 100644 (file)
@@ -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);