adm8668: add support for 3.3
[openwrt.git] / target / linux / adm8668 / patches-3.3 / a01-adm8668-irq-code-fixes.patch
1 --- a/arch/mips/adm8668/irq.c
2 +++ b/arch/mips/adm8668/irq.c
3 @@ -20,28 +20,7 @@
4  #include <asm/irq.h>
5  #include <adm8668.h>
6  
7 -
8 -void enable_adm8668_irq(unsigned int irq);
9 -void disable_adm8668_irq(unsigned int irq);
10 -void adm8668_irq_cascade(void);
11 -
12 -void plat_irq_dispatch(void)
13 -{
14 -       unsigned int pending;
15 -
16 -       pending = read_c0_cause() & read_c0_status() & ST0_IM;
17 -
18 -       /* timer interrupt, that we renumbered */
19 -       if (pending & STATUSF_IP7)
20 -               do_IRQ(MIPS_CPU_IRQ_BASE + 7);
21 -       if (pending & STATUSF_IP2)
22 -               adm8668_irq_cascade();
23 -}
24 -
25 -/*
26 - * System irq dispatch
27 - */
28 -void adm8668_irq_cascade()
29 +static void adm8668_irq_cascade(void)
30  {
31         int i;
32         unsigned long intsrc;
33 @@ -53,49 +32,53 @@ void adm8668_irq_cascade()
34  }
35  
36  /*
37 - * irq enable
38 + * System irq dispatch
39   */
40 -static __inline void _irq_enable(int irql)
41 +void plat_irq_dispatch(void)
42  {
43 -       ADM8668_INTC_REG(IRQ_ENABLE_REG) = (1 << irql);
44 -}
45 +       unsigned int pending;
46  
47 +       pending = read_c0_cause() & read_c0_status() & ST0_IM;
48  
49 -/*
50 - * irq disable
51 - */
52 -static __inline void _irq_disable(int irql)
53 -{
54 -       ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irql);
55 +       /* timer interrupt, that we renumbered */
56 +       if (pending & STATUSF_IP7)
57 +               do_IRQ(MIPS_CPU_IRQ_BASE + 7);
58 +       if (pending & STATUSF_IP2)
59 +               adm8668_irq_cascade();
60  }
61  
62 -
63  /*
64   * enable 8668 irq
65   */
66 -void enable_adm8668_irq(unsigned int irq)
67 +static void enable_adm8668_irq(struct irq_data *d)
68  {
69 +       int irq = d->irq;
70 +
71         if ((irq < 0) || (irq > NR_IRQS))
72                 return;
73  
74 -       _irq_enable(irq);
75 +       ADM8668_INTC_REG(IRQ_ENABLE_REG) = (1 << irq);
76  }
77  
78  
79  /*
80   * disable 8668 irq
81   */
82 -void disable_adm8668_irq(unsigned int irq)
83 +static void disable_adm8668_irq(struct irq_data *d)
84  {
85 +       int irq = d->irq;
86 +
87         if ((irq < 0) || (irq > NR_IRQS))
88                 return;
89  
90 -       _irq_disable(irq);
91 +       ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq);
92  }
93  
94 -static inline void ack_adm8668_irq(unsigned int irq_nr)
95 +static void ack_adm8668_irq(struct irq_data *d)
96  {
97 -       ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq_nr);
98 +       int irq = d->irq;
99 +
100 +       ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << irq);
101  }
102  
103  /*
104 @@ -104,20 +87,20 @@ static inline void ack_adm8668_irq(unsig
105  
106  static struct irq_chip adm8668_irq_type = {
107         .name = "adm8668",
108 -       .ack = ack_adm8668_irq,
109 -       .mask = disable_adm8668_irq,
110 -       .unmask = enable_adm8668_irq
111 +       .irq_ack = ack_adm8668_irq,
112 +       .irq_mask = disable_adm8668_irq,
113 +       .irq_unmask = enable_adm8668_irq
114  };
115  
116  /*
117   * irq init
118   */
119 -void __init init_adm8668_irqs(void)
120 +static void __init init_adm8668_irqs(void)
121  {
122         int i;
123  
124         for (i = 0; i <= INT_LVL_MAX; i++)
125 -               set_irq_chip_and_handler(i, &adm8668_irq_type,
126 +               irq_set_chip_and_handler(i, &adm8668_irq_type,
127                         handle_level_irq);
128  
129         /* hw0 is where our interrupts are uh.. interrupted at. */