Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d8a0e96 authored by Juan Gutierrez's avatar Juan Gutierrez Committed by Ohad Ben-Cohen
Browse files

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: default avatarJuan Gutierrez <jgutierrez@ti.com>
Signed-off-by: default avatarSuman Anna <s-anna@ti.com>
[ohad@wizery.com: slightly reworded the commit log]
Signed-off-by: default avatarOhad Ben-Cohen <ohad@wizery.com>
parent d48b97b4
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -83,8 +83,6 @@ static int omap2_mbox_startup(struct omap_mbox *mbox)
	l = mbox_read_reg(MAILBOX_REVISION);
	l = mbox_read_reg(MAILBOX_REVISION);
	pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
	pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));


	omap2_mbox_enable_irq(mbox, IRQ_RX);

	return 0;
	return 0;
}
}


+9 −4
Original line number Original line Diff line number Diff line
@@ -282,6 +282,8 @@ static int omap_mbox_startup(struct omap_mbox *mbox)
		}
		}
		mbox->rxq = mq;
		mbox->rxq = mq;
		mq->mbox = mbox;
		mq->mbox = mbox;

		omap_mbox_enable_irq(mbox, IRQ_RX);
	}
	}
	mutex_unlock(&mbox_configured_lock);
	mutex_unlock(&mbox_configured_lock);
	return 0;
	return 0;
@@ -305,6 +307,7 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
	mutex_lock(&mbox_configured_lock);
	mutex_lock(&mbox_configured_lock);


	if (!--mbox->use_count) {
	if (!--mbox->use_count) {
		omap_mbox_disable_irq(mbox, IRQ_RX);
		free_irq(mbox->irq, mbox);
		free_irq(mbox->irq, mbox);
		tasklet_kill(&mbox->txq->tasklet);
		tasklet_kill(&mbox->txq->tasklet);
		flush_work_sync(&mbox->rxq->work);
		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)
	if (!mbox)
		return ERR_PTR(-ENOENT);
		return ERR_PTR(-ENOENT);


	ret = omap_mbox_startup(mbox);
	if (ret)
		return ERR_PTR(-ENODEV);

	if (nb)
	if (nb)
		blocking_notifier_chain_register(&mbox->notifier, 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;
	return mbox;
}
}
EXPORT_SYMBOL(omap_mbox_get);
EXPORT_SYMBOL(omap_mbox_get);