From 01757b5982f2ee5be616ce0ec5294ff78d51a0fb Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Thu, 23 Mar 2017 11:59:40 +0100
Subject: [PATCH] IRQ: pass irq number in call to handler

---
 arch/sparc/kernel/irq.c | 14 +++++++++-----
 include/kernel/irq.h    |  2 +-
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c
index a372b8a..38d2c37 100644
--- a/arch/sparc/kernel/irq.c
+++ b/arch/sparc/kernel/irq.c
@@ -424,6 +424,10 @@ static int leon_irq_queue(struct irl_vector_elem *p_elem)
 /**
  *
  * @brief execute deferred (low-priority) handlers
+ *
+ * @note see todo
+ * @todo TODO we do not track deferred handler IRQ numbers, so we'll just
+ *	 pass -1 for now and hope the user knows what he's doing -.-
  */
 
 void leon_irq_queue_execute(void)
@@ -442,7 +446,7 @@ void leon_irq_queue_execute(void)
 
 		if (likely(p_elem->handler)) {
 
-			if (p_elem->handler(p_elem->data))
+			if (p_elem->handler(-1, p_elem->data))
 				leon_irq_queue(p_elem);
 			else
 				list_add_tail(&p_elem->handler_node,
@@ -480,9 +484,9 @@ static int leon_irq_dispatch(unsigned int irq)
 
 	list_for_each_entry(p_elem, &irl_vector[irq], handler_node) {
 		if (likely(p_elem->priority == ISR_PRIORITY_NOW))
-			p_elem->handler(p_elem->data);
+			p_elem->handler(irq, p_elem->data);
 		else if (leon_irq_queue(p_elem) < 0)
-			p_elem->handler(p_elem->data);
+			p_elem->handler(irq, p_elem->data);
 	}
 
 	return 0;
@@ -557,9 +561,9 @@ static int leon_eirq_dispatch(unsigned int irq)
 			 * queueing fails
 			 */
 			if (likely(p_elem->priority == ISR_PRIORITY_NOW))
-				p_elem->handler(p_elem->data);
+				p_elem->handler(eirq, p_elem->data);
 			else if (leon_irq_queue(p_elem) < 0)
-				p_elem->handler(p_elem->data);
+				p_elem->handler(eirq, p_elem->data);
 		}
 	}
 
diff --git a/include/kernel/irq.h b/include/kernel/irq.h
index dc3afdc..911f76e 100644
--- a/include/kernel/irq.h
+++ b/include/kernel/irq.h
@@ -29,7 +29,7 @@ enum irqreturn {
 
 typedef enum irqreturn irqreturn_t;
 
-typedef irqreturn_t (*irq_handler_t)(void *);
+typedef irqreturn_t (*irq_handler_t)(unsigned int irq, void *);
 enum isr_exec_priority {ISR_PRIORITY_NOW, ISR_PRIORITY_DEFERRED};
 
 
-- 
GitLab