[PATCH v3 31/62] arm/acpi: Add a helper function to get interrupt type

shannon.zhao at linaro.org shannon.zhao at linaro.org
Tue Nov 17 01:40:30 PST 2015


From: Shannon Zhao <shannon.zhao at linaro.org>

Add a helper funtion to get the type of interrupts in ACPI table.

Signed-off-by: Shannon Zhao <shannon.zhao at linaro.org>
---
 xen/arch/arm/acpi/lib.c    | 27 +++++++++++++++++++++++++++
 xen/include/asm-arm/acpi.h | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/xen/arch/arm/acpi/lib.c b/xen/arch/arm/acpi/lib.c
index d8b7635..47f4c6a 100644
--- a/xen/arch/arm/acpi/lib.c
+++ b/xen/arch/arm/acpi/lib.c
@@ -43,3 +43,30 @@ bool_t __init acpi_psci_hvc_present(void)
 {
     return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
 }
+
+unsigned int acpi_get_irq_type(u32 flags)
+{
+    int trigger, polarity;
+
+    trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE
+               : ACPI_LEVEL_SENSITIVE;
+
+    polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW
+                : ACPI_ACTIVE_HIGH;
+
+    switch (polarity) {
+    case ACPI_ACTIVE_LOW:
+        return trigger == ACPI_EDGE_SENSITIVE ?
+            ACPI_IRQ_TYPE_EDGE_FALLING :
+            ACPI_IRQ_TYPE_LEVEL_LOW;
+    case ACPI_ACTIVE_HIGH:
+        return trigger == ACPI_EDGE_SENSITIVE ?
+            ACPI_IRQ_TYPE_EDGE_RISING :
+            ACPI_IRQ_TYPE_LEVEL_HIGH;
+    case ACPI_ACTIVE_BOTH:
+        if (trigger == ACPI_EDGE_SENSITIVE)
+            return ACPI_IRQ_TYPE_EDGE_BOTH;
+    default:
+        return ACPI_IRQ_TYPE_NONE;
+    }
+}
diff --git a/xen/include/asm-arm/acpi.h b/xen/include/asm-arm/acpi.h
index 714e596..214fc4e 100644
--- a/xen/include/asm-arm/acpi.h
+++ b/xen/include/asm-arm/acpi.h
@@ -34,10 +34,12 @@ extern bool_t acpi_disabled;
 bool_t __init acpi_psci_present(void);
 bool_t __init acpi_psci_hvc_present(void);
 void __init acpi_smp_init_cpus(void);
+unsigned int acpi_get_irq_type(u32 flags);
 #else
 static inline bool_t acpi_psci_present(void) { return false; }
 static inline bool_t acpi_psci_hvc_present(void) {return false; }
 static inline void acpi_smp_init_cpus(void) { }
+static inline unsigned int acpi_get_irq_type(u32 flags) { return 0; }
 #endif /* CONFIG_ACPI */
 
 /* Basic configuration for ACPI */
@@ -48,4 +50,41 @@ static inline void disable_acpi(void)
 
 #define ACPI_GTDT_INTR_MASK ( ACPI_GTDT_INTERRUPT_MODE | ACPI_GTDT_INTERRUPT_POLARITY )
 
+/* Triggering */
+
+#define ACPI_LEVEL_SENSITIVE            (u8) 0x00
+#define ACPI_EDGE_SENSITIVE             (u8) 0x01
+
+/* Polarity */
+
+#define ACPI_ACTIVE_HIGH                (u8) 0x00
+#define ACPI_ACTIVE_LOW                 (u8) 0x01
+#define ACPI_ACTIVE_BOTH                (u8) 0x02
+
+/**
+ * IRQ line type.
+ *
+ * ACPI_IRQ_TYPE_NONE            - default, unspecified type
+ * ACPI_IRQ_TYPE_EDGE_RISING     - rising edge triggered
+ * ACPI_IRQ_TYPE_EDGE_FALLING    - falling edge triggered
+ * ACPI_IRQ_TYPE_EDGE_BOTH       - rising and falling edge triggered
+ * ACPI_IRQ_TYPE_LEVEL_HIGH      - high level triggered
+ * ACPI_IRQ_TYPE_LEVEL_LOW       - low level triggered
+ * ACPI_IRQ_TYPE_LEVEL_MASK      - Mask to filter out the level bits
+ * ACPI_IRQ_TYPE_SENSE_MASK      - Mask for all the above bits
+ * ACPI_IRQ_TYPE_INVALID         - Use to initialize the type
+ */
+#define ACPI_IRQ_TYPE_NONE           0x00000000
+#define ACPI_IRQ_TYPE_EDGE_RISING    0x00000001
+#define ACPI_IRQ_TYPE_EDGE_FALLING   0x00000002
+#define ACPI_IRQ_TYPE_EDGE_BOTH                           \
+    (ACPI_IRQ_TYPE_EDGE_FALLING | ACPI_IRQ_TYPE_EDGE_RISING)
+#define ACPI_IRQ_TYPE_LEVEL_HIGH     0x00000004
+#define ACPI_IRQ_TYPE_LEVEL_LOW      0x00000008
+#define ACPI_IRQ_TYPE_LEVEL_MASK                          \
+    (ACPI_IRQ_TYPE_LEVEL_LOW | ACPI_IRQ_TYPE_LEVEL_HIGH)
+#define ACPI_IRQ_TYPE_SENSE_MASK     0x0000000f
+
+#define ACPI_IRQ_TYPE_INVALID        0x00000010
+
 #endif /*_ASM_ARM_ACPI_H*/
-- 
2.1.0




More information about the linux-arm-kernel mailing list