summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/qoriq/irq/irq.c
diff options
context:
space:
mode:
authorChristian Mauderer <christian.mauderer@embedded-brains.de>2024-01-11 15:41:45 +0100
committerChristian Mauderer <christian.mauderer@embedded-brains.de>2024-01-31 09:54:57 +0100
commit529b70c828ea5a981ae576ebc6d3a1b45b3b2ab8 (patch)
treee9dd2bafc39b7dbb515879121f032e1f3039dcc3 /bsps/powerpc/qoriq/irq/irq.c
parentbsps/qoriq: Add MMU regions for PCIe based on fdt (diff)
downloadrtems-529b70c828ea5a981ae576ebc6d3a1b45b3b2ab8.tar.bz2
bsps/qoriq: Allow setting EIRQ polarity and sense
Add a function that allows to set the polarity (active-low / negative edge triggered or active-high / positive edge triggered) and sense (level or edge sensitive) of the external interrupts.
Diffstat (limited to '')
-rw-r--r--bsps/powerpc/qoriq/irq/irq.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/bsps/powerpc/qoriq/irq/irq.c b/bsps/powerpc/qoriq/irq/irq.c
index 1a650ddc83..8d6afa6c12 100644
--- a/bsps/powerpc/qoriq/irq/irq.c
+++ b/bsps/powerpc/qoriq/irq/irq.c
@@ -338,6 +338,62 @@ rtems_status_code qoriq_pic_set_priority(
return sc;
}
+rtems_status_code qoriq_pic_set_sense_and_polarity(
+ rtems_vector_number vector,
+ qoriq_eirq_sense_and_polarity new_sense_and_polarity,
+ qoriq_eirq_sense_and_polarity *old_sense_and_polarity
+)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ uint32_t old_vpr = 0;
+ volatile qoriq_pic_src_cfg *src_cfg;
+ rtems_interrupt_lock_context lock_context;
+ uint32_t new_p_s = 0;
+
+ if (!QORIQ_IRQ_IS_EXT(vector)) {
+ return RTEMS_UNSATISFIED;
+ }
+
+ if (new_sense_and_polarity == QORIQ_EIRQ_TRIGGER_EDGE_RISING ||
+ new_sense_and_polarity == QORIQ_EIRQ_TRIGGER_LEVEL_HIGH) {
+ new_p_s |= VPR_P;
+ }
+
+ if (new_sense_and_polarity == QORIQ_EIRQ_TRIGGER_LEVEL_HIGH ||
+ new_sense_and_polarity == QORIQ_EIRQ_TRIGGER_LEVEL_LOW) {
+ new_p_s |= VPR_S;
+ }
+
+ src_cfg = get_src_cfg(vector);
+
+ rtems_interrupt_lock_acquire(&lock, &lock_context);
+ old_vpr = src_cfg->vpr;
+ src_cfg->vpr = (old_vpr & ~(VPR_P | VPR_S)) | new_p_s;
+ rtems_interrupt_lock_release(&lock, &lock_context);
+
+ if (old_sense_and_polarity != NULL) {
+ if ((old_vpr & VPR_P) == 0) {
+ if ((old_vpr & VPR_S) == 0) {
+ *old_sense_and_polarity =
+ QORIQ_EIRQ_TRIGGER_EDGE_FALLING;
+ } else {
+ *old_sense_and_polarity =
+ QORIQ_EIRQ_TRIGGER_LEVEL_LOW;
+ }
+ } else {
+ if ((old_vpr & VPR_S) == 0) {
+ *old_sense_and_polarity =
+ QORIQ_EIRQ_TRIGGER_EDGE_RISING;
+ } else {
+ *old_sense_and_polarity =
+ QORIQ_EIRQ_TRIGGER_LEVEL_HIGH;
+ }
+ }
+ }
+
+ return sc;
+}
+
rtems_status_code bsp_interrupt_set_affinity(
rtems_vector_number vector,
const Processor_mask *affinity