summaryrefslogtreecommitdiff
path: root/gxp-hw-mailbox-driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'gxp-hw-mailbox-driver.c')
-rw-r--r--gxp-hw-mailbox-driver.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/gxp-hw-mailbox-driver.c b/gxp-hw-mailbox-driver.c
index 3019897..4858585 100644
--- a/gxp-hw-mailbox-driver.c
+++ b/gxp-hw-mailbox-driver.c
@@ -45,6 +45,8 @@ static irqreturn_t mailbox_irq_handler(int irq, void *arg)
{
u32 masked_status;
struct gxp_mailbox *mailbox = (struct gxp_mailbox *) arg;
+ struct work_struct **handlers = mailbox->interrupt_handlers;
+ u32 next_int;
/* Contains only the non-masked, pending interrupt bits */
masked_status = gxp_mailbox_get_host_mask_status(mailbox);
@@ -57,15 +59,17 @@ static irqreturn_t mailbox_irq_handler(int irq, void *arg)
masked_status &= ~MBOX_DEVICE_TO_HOST_RESPONSE_IRQ_MASK;
}
- if (masked_status & mailbox->debug_dump_int_mask) {
- mailbox->handle_debug_dump_irq(mailbox);
- masked_status &= ~mailbox->debug_dump_int_mask;
- }
+ while ((next_int = ffs(masked_status))) {
+ next_int--; /* ffs returns 1-based indices */
+ masked_status &= ~BIT(next_int);
- if (masked_status)
- pr_err_ratelimited(
- "mailbox%d: received unknown interrupt bits 0x%x\n",
- mailbox->core_id, masked_status);
+ if (handlers[next_int])
+ schedule_work(handlers[next_int]);
+ else
+ pr_err_ratelimited(
+ "mailbox%d: received unknown interrupt bit 0x%X\n",
+ mailbox->core_id, next_int);
+ }
return IRQ_HANDLED;
}
@@ -109,13 +113,11 @@ static void unregister_irq(struct gxp_mailbox *mailbox)
void gxp_mailbox_driver_init(struct gxp_mailbox *mailbox)
{
register_irq(mailbox);
- return;
}
void gxp_mailbox_driver_exit(struct gxp_mailbox *mailbox)
{
unregister_irq(mailbox);
- return;
}
void __iomem *gxp_mailbox_get_csr_base(struct gxp_dev *gxp, uint index)