aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap/mailbox.c
diff options
context:
space:
mode:
authorRob Clark <rob@ti.com>2010-01-04 08:52:03 -0500
committerTony Lindgren <tony@atomide.com>2010-02-23 18:29:22 -0500
commit8250a5c381cc6714a061a39cfd29d7453e8ad64b (patch)
tree0127f143ac9715fbfe45b8ef0c1e4da34982f709 /arch/arm/plat-omap/mailbox.c
parent4499ce42935db68debba0a2d2ab8280627e4b692 (diff)
omap2/3/4: mailbox: use dedicated work queue for handling mailbox rx interrupt
keventd_wq is a shared work-queue, and should not be used when we need fast deterministic response. Instead mailbox driver should use it's own private work-queue, with it's own thread, to ensure that handling of RX interrupts are not delayed by other drivers. The tasklet is still used for transmission of mbox messages. Signed-off-by: Rob Clark <rob@ti.com> Signed-off-by: C A Subramaniam <subramaniam.ca@ti.com> Signed-off-by: Suman Anna <s-anna@ti.com> Acked-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/plat-omap/mailbox.c')
-rw-r--r--arch/arm/plat-omap/mailbox.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c
index 8e90633e4cb9..4229cec53140 100644
--- a/arch/arm/plat-omap/mailbox.c
+++ b/arch/arm/plat-omap/mailbox.c
@@ -28,6 +28,7 @@
28 28
29#include <plat/mailbox.h> 29#include <plat/mailbox.h>
30 30
31static struct workqueue_struct *mboxd;
31static struct omap_mbox *mboxes; 32static struct omap_mbox *mboxes;
32static DEFINE_RWLOCK(mboxes_lock); 33static DEFINE_RWLOCK(mboxes_lock);
33 34
@@ -188,7 +189,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
188 /* no more messages in the fifo. clear IRQ source. */ 189 /* no more messages in the fifo. clear IRQ source. */
189 ack_mbox_irq(mbox, IRQ_RX); 190 ack_mbox_irq(mbox, IRQ_RX);
190nomem: 191nomem:
191 schedule_work(&mbox->rxq->work); 192 queue_work(mboxd, &mbox->rxq->work);
192} 193}
193 194
194static irqreturn_t mbox_interrupt(int irq, void *p) 195static irqreturn_t mbox_interrupt(int irq, void *p)
@@ -401,12 +402,17 @@ EXPORT_SYMBOL(omap_mbox_unregister);
401 402
402static int __init omap_mbox_init(void) 403static int __init omap_mbox_init(void)
403{ 404{
405 mboxd = create_workqueue("mboxd");
406 if (!mboxd)
407 return -ENOMEM;
408
404 return 0; 409 return 0;
405} 410}
406module_init(omap_mbox_init); 411module_init(omap_mbox_init);
407 412
408static void __exit omap_mbox_exit(void) 413static void __exit omap_mbox_exit(void)
409{ 414{
415 destroy_workqueue(mboxd);
410} 416}
411module_exit(omap_mbox_exit); 417module_exit(omap_mbox_exit);
412 418