Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
881 theseven 1
#include "global.h"
2
#include "soc/s5l87xx/irq.h"
3
#include "soc/s5l87xx/regs.h"
4
#include "cpu/arm/old/armutil.h"
5
#include "sys/util.h"
6
 
7
__attribute__((weak)) void unhandled_irq_handler()
8
{
9
    fault_handler();
10
}
11
 
12
 
13
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq0_irqhandler();
14
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq1_irqhandler();
15
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq2_irqhandler();
16
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq3_irqhandler();
17
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq4_irqhandler();
18
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq5_irqhandler();
19
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq6_irqhandler();
20
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq7_irqhandler();
21
__attribute__((weak,alias("unhandled_irq_handler"))) void int_timer_irqhandler();
22
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq9_irqhandler();
23
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq10_irqhandler();
24
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq11_irqhandler();
25
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq12_irqhandler();
26
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq13_irqhandler();
27
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq14_irqhandler();
28
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq15_irqhandler();
29
__attribute__((weak,alias("unhandled_irq_handler"))) void int_dmac0_irqhandler();
30
__attribute__((weak,alias("unhandled_irq_handler"))) void int_dmac1_irqhandler();
31
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq18_irqhandler();
32
__attribute__((weak,alias("unhandled_irq_handler"))) void int_usb_func_irqhandler();
33
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq20_irqhandler();
34
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq21_irqhandler();
35
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq22_irqhandler();
36
__attribute__((weak,alias("unhandled_irq_handler"))) void int_wheel_irqhandler();
37
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq24_irqhandler();
38
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq25_irqhandler();
39
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq26_irqhandler();
40
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq27_irqhandler();
41
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq28_irqhandler();
42
__attribute__((weak,alias("unhandled_irq_handler"))) void int_ata_irqhandler();
43
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq30_irqhandler();
44
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq31_irqhandler();
45
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq32_irqhandler();
46
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq33_irqhandler();
47
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq34_irqhandler();
48
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq35_irqhandler();
49
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq36_irqhandler();
50
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq37_irqhandler();
51
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq38_irqhandler();
52
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq39_irqhandler();
53
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq40_irqhandler();
54
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq41_irqhandler();
55
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq42_irqhandler();
56
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq43_irqhandler();
57
__attribute__((weak,alias("unhandled_irq_handler"))) void int_mmc_irqhandler();
58
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq45_irqhandler();
59
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq46_irqhandler();
60
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq47_irqhandler();
61
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq48_irqhandler();
62
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq49_irqhandler();
63
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq50_irqhandler();
64
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq51_irqhandler();
65
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq52_irqhandler();
66
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq53_irqhandler();
67
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq54_irqhandler();
68
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq55_irqhandler();
69
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq56_irqhandler();
70
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq57_irqhandler();
71
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq58_irqhandler();
72
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq59_irqhandler();
73
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq60_irqhandler();
74
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq61_irqhandler();
75
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq62_irqhandler();
76
__attribute__((weak,alias("unhandled_irq_handler"))) void int_irq63_irqhandler();
77
 
78
static void (* s5l87xx_irq_vector[])(void) =
79
{
80
    int_irq0_irqhandler,
81
    int_irq1_irqhandler,
82
    int_irq2_irqhandler,
83
    int_irq3_irqhandler,
84
    int_irq4_irqhandler,
85
    int_irq5_irqhandler,
86
    int_irq6_irqhandler,
87
    int_irq7_irqhandler,
88
    int_timer_irqhandler,
89
    int_irq9_irqhandler,
90
    int_irq10_irqhandler,
91
    int_irq11_irqhandler,
92
    int_irq12_irqhandler,
93
    int_irq13_irqhandler,
94
    int_irq14_irqhandler,
95
    int_irq15_irqhandler,
96
    int_dmac0_irqhandler,
97
    int_dmac1_irqhandler,
98
    int_irq18_irqhandler,
99
    int_usb_func_irqhandler,
100
    int_irq20_irqhandler,
101
    int_irq21_irqhandler,
102
    int_irq22_irqhandler,
103
    int_wheel_irqhandler,
104
    int_irq24_irqhandler,
105
    int_irq25_irqhandler,
106
    int_irq26_irqhandler,
107
    int_irq27_irqhandler,
108
    int_irq28_irqhandler,
109
    int_ata_irqhandler,
110
    int_irq30_irqhandler,
111
    int_irq31_irqhandler,
112
    int_irq32_irqhandler,
113
    int_irq33_irqhandler,
114
    int_irq34_irqhandler,
115
    int_irq35_irqhandler,
116
    int_irq36_irqhandler,
117
    int_irq37_irqhandler,
118
    int_irq38_irqhandler,
119
    int_irq39_irqhandler,
120
    int_irq40_irqhandler,
121
    int_irq41_irqhandler,
122
    int_irq42_irqhandler,
123
    int_irq43_irqhandler,
124
    int_mmc_irqhandler,
125
    int_irq45_irqhandler,
126
    int_irq46_irqhandler,
127
    int_irq47_irqhandler,
128
    int_irq48_irqhandler,
129
    int_irq49_irqhandler,
130
    int_irq50_irqhandler,
131
    int_irq51_irqhandler,
132
    int_irq52_irqhandler,
133
    int_irq53_irqhandler,
134
    int_irq54_irqhandler,
135
    int_irq55_irqhandler,
136
    int_irq56_irqhandler,
137
    int_irq57_irqhandler,
138
    int_irq58_irqhandler,
139
    int_irq59_irqhandler,
140
    int_irq60_irqhandler,
141
    int_irq61_irqhandler,
142
    int_irq62_irqhandler,
143
    int_irq63_irqhandler,
144
};
145
 
146
__attribute__((interrupt("IRQ"))) void _irq_handler(void)
147
{
148
    void* dummy __attribute__((unused)) = VIC0ADDRESS;
149
    dummy = VIC1ADDRESS;
150
    uint32_t irqs0 = VIC0IRQSTATUS;
151
    uint32_t irqs1 = VIC1IRQSTATUS;
152
    int irq;
153
    for (irq = 0; irqs0; irq++, irqs0 >>= 1)
154
        if (irqs0 & 1)
155
            s5l87xx_irq_vector[irq]();
156
    for (irq = 32; irqs1; irq++, irqs1 >>= 1)
157
        if (irqs1 & 1)
158
            s5l87xx_irq_vector[irq]();
159
    VIC0ADDRESS = NULL;
160
    VIC1ADDRESS = NULL;
161
}
162
 
163
void s5l87xx_irq_enable(int irq, bool state)
164
{
165
    if (state) VICINTENABLE(irq >> 5) = 1 << (irq & 0x1f);
166
    else VICINTENCLEAR(irq >> 5) = 1 << (irq & 0x1f);
167
}