summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/openpic/openpic.c')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/openpic/openpic.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
index 918ddfad10..22da8cac66 100644
--- a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
+++ b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
@@ -19,6 +19,7 @@
* Note: Interprocessor Interrupt (IPI) and Timer support is incomplete
*/
+#include <rtems.h>
#include <rtems/bspIo.h>
#include <bsp/openpic.h>
#include <bsp/pci.h>
@@ -94,7 +95,7 @@ static inline unsigned int openpic_read(volatile unsigned int *addr)
{
unsigned int val;
- val = ld_le32(addr);
+ val = in_le32(addr);
#ifdef REGISTER_DEBUG
printk("openpic_read(0x%08x) = 0x%08x\n", (unsigned int)addr, val);
#endif
@@ -251,10 +252,6 @@ void openpic_init(int main_pic, unsigned char *polarities, unsigned char *senses
}
/* Initialize external interrupts */
- /* SIOint (8259 cascade) is special */
- openpic_initirq(0, 8, OPENPIC_VEC_SOURCE, 1, 1);
- /* Processor 0 */
- openpic_mapirq(0, 1<<0);
for (i = 0; i < NumSources; i++) {
/* Enabled, Priority 8 */
openpic_initirq(i, 8, OPENPIC_VEC_SOURCE+i,
@@ -454,14 +451,20 @@ void openpic_maptimer(unsigned int timer, unsigned int cpumask)
void openpic_enable_irq(unsigned int irq)
{
+unsigned long flags;
check_arg_irq(irq);
+ rtems_interrupt_disable(flags);
openpic_clearfield(&OpenPIC->Source[irq].Vector_Priority, OPENPIC_MASK);
+ rtems_interrupt_enable(flags);
}
void openpic_disable_irq(unsigned int irq)
{
+unsigned long flags;
check_arg_irq(irq);
+ rtems_interrupt_disable(flags);
openpic_setfield(&OpenPIC->Source[irq].Vector_Priority, OPENPIC_MASK);
+ rtems_interrupt_enable(flags);
}
@@ -499,7 +502,28 @@ void openpic_mapirq(unsigned int irq, unsigned int cpumask)
openpic_write(&OpenPIC->Source[irq].Destination, cpumask);
}
+ /*
+ * Get the current priority of an external interrupt
+ */
+unsigned int openpic_get_source_priority(unsigned int irq)
+{
+ check_arg_irq(irq);
+ return openpic_readfield(&OpenPIC->Source[irq].Vector_Priority,
+ OPENPIC_PRIORITY_MASK) >> OPENPIC_PRIORITY_SHIFT;
+}
+void openpic_set_source_priority(unsigned int irq, unsigned int pri)
+{
+unsigned long flags;
+ check_arg_irq(irq);
+ check_arg_pri(pri);
+ rtems_interrupt_disable(flags);
+ openpic_writefield(
+ &OpenPIC->Source[irq].Vector_Priority,
+ OPENPIC_PRIORITY_MASK,
+ pri << OPENPIC_PRIORITY_SHIFT);
+ rtems_interrupt_enable(flags);
+}
/*
* Set the sense for an interrupt source (and disable it!)
*