lib: sbi_irqchip: Allow interrupt client to specify line sensing

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@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20260423052339.356900-4-anup.patel@oss.qualcomm.com
Signed-off-by: Anup Patel <anup@brainfault.org>
diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
index 77b5411..9035dce 100644
--- a/include/sbi/sbi_irqchip.h
+++ b/include/sbi/sbi_irqchip.h
@@ -43,7 +43,16 @@
 	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 @@
 
 /** 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 f9e2eb5..ea68430 100644
--- a/lib/sbi/sbi_irqchip.c
+++ b/lib/sbi/sbi_irqchip.c
@@ -136,7 +136,7 @@
 }
 
 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 @@
 
 	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 7559a06..877255f 100644
--- a/lib/utils/irqchip/imsic.c
+++ b/lib/utils/irqchip/imsic.c
@@ -346,9 +346,9 @@
 	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;
 }