diff options
| author | Juan Gutierrez <jgutierrez@ti.com> | 2012-05-13 15:33:04 +0300 | 
|---|---|---|
| committer | Ohad Ben-Cohen <ohad@wizery.com> | 2012-05-13 16:09:39 +0300 | 
| commit | 1d8a0e963ac532e038d93ab0d30bbfad072f3bf8 (patch) | |
| tree | 536607fafd1014ff9f189092944e7d023b08f93b /arch/arm/plat-omap/mailbox.c | |
| parent | d48b97b403d23f6df0b990cee652bdf9a52337a3 (diff) | |
| download | olio-linux-3.10-1d8a0e963ac532e038d93ab0d30bbfad072f3bf8.tar.xz olio-linux-3.10-1d8a0e963ac532e038d93ab0d30bbfad072f3bf8.zip  | |
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>
Diffstat (limited to 'arch/arm/plat-omap/mailbox.c')
| -rw-r--r-- | arch/arm/plat-omap/mailbox.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index ad32621aa52..5e13c3884aa 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -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);  |