[PATCH 3/6] lib: sbi_irqchip: Allow interrupt client to specify line sensing

Anup Patel anup.patel at oss.qualcomm.com
Wed Apr 22 22:23:36 PDT 2026


The interrupt client should be allowed to specify the line sensing
type of the hwirqs for which it is registering handler. To support
this, add hwirq_flags parameter to hwirq_setup() callback provided
by the irqchip driver.

Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
 include/sbi/sbi_irqchip.h | 13 +++++++++++--
 lib/sbi/sbi_irqchip.c     |  4 ++--
 lib/utils/irqchip/imsic.c |  4 ++--
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
index 77b54110..9035dcef 100644
--- a/include/sbi/sbi_irqchip.h
+++ b/include/sbi/sbi_irqchip.h
@@ -43,7 +43,16 @@ struct sbi_irqchip_device {
 	int (*process_hwirqs)(struct sbi_irqchip_device *chip);
 
 	/** Setup a hardware interrupt of this irqchip */
-	int (*hwirq_setup)(struct sbi_irqchip_device *chip, u32 hwirq);
+	int (*hwirq_setup)(struct sbi_irqchip_device *chip, u32 hwirq,
+			   u32 hwirq_flags);
+#define SBI_HWIRQ_FLAGS_NONE			0x00000000UL
+#define SBI_HWIRQ_FLAGS_EDGE_RISING		0x00000001UL
+#define SBI_HWIRQ_FLAGS_EDGE_FALLING		0x00000002UL
+#define SBI_HWIRQ_FLAGS_EDGE_BOTH		(SBI_HWIRQ_FLAGS_EDGE_RISING | \
+						 SBI_HWIRQ_FLAGS_EDGE_FALLING)
+#define SBI_HWIRQ_FLAGS_LEVEL_HIGH		0x00000004UL
+#define SBI_HWIRQ_FLAGS_LEVEL_LOW		0x00000008UL
+#define SBI_HWIRQ_FLAGS_LEVEL_SENSE_MASK	0x0000000fUL
 
 	/** Cleanup a hardware interrupt of this irqchip */
 	void (*hwirq_cleanup)(struct sbi_irqchip_device *chip, u32 hwirq);
@@ -91,7 +100,7 @@ int sbi_irqchip_set_raw_handler(struct sbi_irqchip_device *chip, u32 hwirq,
 
 /** Register a hardware interrupt handler */
 int sbi_irqchip_register_handler(struct sbi_irqchip_device *chip,
-				 u32 first_hwirq, u32 num_hwirq,
+				 u32 first_hwirq, u32 num_hwirq, u32 hwirq_flags,
 				 int (*callback)(u32 hwirq, void *opaque), void *opaque);
 
 /** Unregister a hardware interrupt handler */
diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
index f9e2eb5a..ea684303 100644
--- a/lib/sbi/sbi_irqchip.c
+++ b/lib/sbi/sbi_irqchip.c
@@ -136,7 +136,7 @@ int sbi_irqchip_set_raw_handler(struct sbi_irqchip_device *chip, u32 hwirq,
 }
 
 int sbi_irqchip_register_handler(struct sbi_irqchip_device *chip,
-				 u32 first_hwirq, u32 num_hwirq,
+				 u32 first_hwirq, u32 num_hwirq, u32 hwirq_flags,
 				 int (*callback)(u32 hwirq, void *opaque), void *priv)
 {
 	struct sbi_irqchip_handler *h, *th, *nh;
@@ -177,7 +177,7 @@ int sbi_irqchip_register_handler(struct sbi_irqchip_device *chip,
 
 	if (chip->hwirq_setup) {
 		for (i = 0; i < h->num_hwirq; i++) {
-			rc = chip->hwirq_setup(chip, h->first_hwirq + i);
+			rc = chip->hwirq_setup(chip, h->first_hwirq + i, hwirq_flags);
 			if (rc) {
 				if (chip->hwirq_cleanup) {
 					for (j = 0; j < i; j++)
diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
index 7559a069..877255f8 100644
--- a/lib/utils/irqchip/imsic.c
+++ b/lib/utils/irqchip/imsic.c
@@ -346,9 +346,9 @@ int imsic_data_check(struct imsic_data *imsic)
 	return 0;
 }
 
-static int imsic_hwirq_setup(struct sbi_irqchip_device *chip, u32 hwirq)
+static int imsic_hwirq_setup(struct sbi_irqchip_device *chip, u32 hwirq, u32 hwirq_flags)
 {
-	if (!hwirq || hwirq == IMSIC_IPI_ID)
+	if (!hwirq || hwirq == IMSIC_IPI_ID || hwirq_flags != SBI_HWIRQ_FLAGS_NONE)
 		return SBI_ENOTSUPP;
 	return 0;
 }
-- 
2.43.0




More information about the opensbi mailing list