summaryrefslogtreecommitdiffstats
path: root/target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch')
-rw-r--r--target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch b/target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch
new file mode 100644
index 000000000..79f5596b2
--- /dev/null
+++ b/target/linux/adm8668/patches-3.3/a01-adm8668-irq-code-fixes.patch
@@ -0,0 +1,129 @@
+--- a/arch/mips/adm8668/irq.c
++++ b/arch/mips/adm8668/irq.c
+@@ -20,28 +20,7 @@
+ #include <asm/irq.h>
+ #include <adm8668.h>
+
+-
+-void enable_adm8668_irq(unsigned int irq);
+-void disable_adm8668_irq(unsigned int irq);
+-void adm8668_irq_cascade(void);
+-
+-void plat_irq_dispatch(void)
+-{
+- unsigned int pending;
+-
+- pending = read_c0_cause() & read_c0_status() & ST0_IM;
+-
+- /* timer interrupt, that we renumbered */
+- if (pending & STATUSF_IP7)
+- do_IRQ(MIPS_CPU_IRQ_BASE + 7);
+- if (pending & STATUSF_IP2)
+- adm8668_irq_cascade();
+-}
+-
+-/*
+- * System irq dispatch
+- */
+-void adm8668_irq_cascade()
++static void adm8668_irq_cascade(void)
+ {
+ int i;
+ unsigned long intsrc;
+@@ -53,49 +32,53 @@ void adm8668_irq_cascade()
+ }
+
+ /*
+- * irq enable
++ * System irq dispatch
+ */
+-static __inline void _irq_enable(int irql)
++void plat_irq_dispatch(void)
+ {
+- ADM8668_INTC_REG(IRQ_ENABLE_REG) = (1 << irql);
+-}
++ unsigned int pending;
+
++ pending = read_c0_cause() & read_c0_status() & ST0_IM;
+
+-/*
+- * irq disable
+- */
+-static __inline void _irq_disable(int irql)
+-{
+- ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irql);
++ /* timer interrupt, that we renumbered */
++ if (pending & STATUSF_IP7)
++ do_IRQ(MIPS_CPU_IRQ_BASE + 7);
++ if (pending & STATUSF_IP2)
++ adm8668_irq_cascade();
+ }
+
+-
+ /*
+ * enable 8668 irq
+ */
+-void enable_adm8668_irq(unsigned int irq)
++static void enable_adm8668_irq(struct irq_data *d)
+ {
++ int irq = d->irq;
++
+ if ((irq < 0) || (irq > NR_IRQS))
+ return;
+
+- _irq_enable(irq);
++ ADM8668_INTC_REG(IRQ_ENABLE_REG) = (1 << irq);
+ }
+
+
+ /*
+ * disable 8668 irq
+ */
+-void disable_adm8668_irq(unsigned int irq)
++static void disable_adm8668_irq(struct irq_data *d)
+ {
++ int irq = d->irq;
++
+ if ((irq < 0) || (irq > NR_IRQS))
+ return;
+
+- _irq_disable(irq);
++ ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq);
+ }
+
+-static inline void ack_adm8668_irq(unsigned int irq_nr)
++static void ack_adm8668_irq(struct irq_data *d)
+ {
+- ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq_nr);
++ int irq = d->irq;
++
++ ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq);
+ }
+
+ /*
+@@ -104,20 +87,20 @@ static inline void ack_adm8668_irq(unsig
+
+ static struct irq_chip adm8668_irq_type = {
+ .name = "adm8668",
+- .ack = ack_adm8668_irq,
+- .mask = disable_adm8668_irq,
+- .unmask = enable_adm8668_irq
++ .irq_ack = ack_adm8668_irq,
++ .irq_mask = disable_adm8668_irq,
++ .irq_unmask = enable_adm8668_irq
+ };
+
+ /*
+ * irq init
+ */
+-void __init init_adm8668_irqs(void)
++static void __init init_adm8668_irqs(void)
+ {
+ int i;
+
+ for (i = 0; i <= INT_LVL_MAX; i++)
+- set_irq_chip_and_handler(i, &adm8668_irq_type,
++ irq_set_chip_and_handler(i, &adm8668_irq_type,
+ handle_level_irq);
+
+ /* hw0 is where our interrupts are uh.. interrupted at. */