Merge branch 'drm-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied...
[linux-2.6] / arch / blackfin / mach-bf537 / boards / led.S
1 /****************************************************
2  * LED1 ---- PF6        LED2 ---- PF7               *
3  * LED3 ---- PF8        LED4 ---- PF9               *
4  * LED5 ---- PF10       LED6 ---- PF11              *
5  ****************************************************/
6
7 #include <linux/linkage.h>
8 #include <asm/blackfin.h>
9
10 /* All functions in this file save the registers they uses.
11    So there is no need to save any registers before calling them.  */
12
13         .text;
14
15 /* Initialize LEDs.  */
16
17 ENTRY(_led_init)
18         LINK 12;
19         [--SP] = P0;
20         [--SP] = R0;
21         [--SP] = R1;
22         [--SP] = R2;
23         R1 = PF6|PF7|PF8|PF9|PF10|PF11 (Z);
24         R2 = ~R1;
25
26         P0.H = hi(PORTF_FER);
27         P0.L = lo(PORTF_FER);
28         R0 = W[P0](Z);
29         SSYNC;
30         R0 = R0 & R2;
31         W[P0] = R0.L;
32         SSYNC;
33
34         P0.H = hi(PORTFIO_DIR);
35         P0.L = lo(PORTFIO_DIR);
36         R0 = W[P0](Z);
37         SSYNC;
38         R0 = R0 | R1;
39         W[P0] = R0.L;
40         SSYNC;
41
42         P0.H = hi(PORTFIO_INEN);
43         P0.L = lo(PORTFIO_INEN);
44         R0 = W[P0](Z);
45         SSYNC;
46         R0 = R0 & R2;
47         W[P0] = R0.L;
48         SSYNC;
49
50         R2 = [SP++];
51         R1 = [SP++];
52         R0 = [SP++];
53         P0 = [SP++];
54         UNLINK;
55         RTS;
56         .size   _led_init, .-_led_init
57
58 /* Set one LED on. Leave other LEDs unchanged.
59    It expects the LED number passed through R0.  */
60
61 ENTRY(_led_on)
62         LINK 12;
63         [--SP] = P0;
64         [--SP] = R1;
65         CALL _led_init;
66         R1 = 1;
67         R0 += 5;
68         R1 <<= R0;
69         P0.H = hi(PORTFIO);
70         P0.L = lo(PORTFIO);
71         R0 = W[P0](Z);
72         SSYNC;
73         R0 = R0 | R1;
74         W[P0] = R0.L;
75         SSYNC;
76         R1 = [SP++];
77         P0 = [SP++];
78         UNLINK;
79         RTS;
80         .size   _led_on, .-_led_on
81
82 /* Set one LED off. Leave other LEDs unchanged.  */
83
84 ENTRY(_led_off)
85         LINK 12;
86         [--SP] = P0;
87         [--SP] = R1;
88         CALL _led_init;
89         R1 = 1;
90         R0 += 5;
91         R1 <<= R0;
92         R1 = ~R1;
93         P0.H = hi(PORTFIO);
94         P0.L = lo(PORTFIO);
95         R0 = W[P0](Z);
96         SSYNC;
97         R0 = R0 & R1;
98         W[P0] = R0.L;
99         SSYNC;
100         R1 = [SP++];
101         P0 = [SP++];
102         UNLINK;
103         RTS;
104         .size   _led_off, .-_led_off
105
106 /* Toggle one LED. Leave other LEDs unchanged.  */
107
108 ENTRY(_led_toggle)
109         LINK 12;
110         [--SP] = P0;
111         [--SP] = R1;
112         CALL _led_init;
113         R1 = 1;
114         R0 += 5;
115         R1 <<= R0;
116         P0.H = hi(PORTFIO);
117         P0.L = lo(PORTFIO);
118         R0 = W[P0](Z);
119         SSYNC;
120         R0 = R0 ^ R1;
121         W[P0] = R0.L;
122         SSYNC;
123         R1 = [SP++];
124         P0 = [SP++];
125         UNLINK;
126         RTS;
127         .size   _led_toggle, .-_led_toggle
128
129 /* Display the number using LEDs in binary format.  */
130
131 ENTRY(_led_disp_num)
132         LINK 12;
133         [--SP] = P0;
134         [--SP] = R1;
135         [--SP] = R2;
136         CALL _led_init;
137         R1 = 0x3f(X);
138         R0 = R0 & R1;
139         R2 = 6(X);
140         R0 <<= R2;
141         R1 <<= R2;
142         P0.H = hi(PORTFIO);
143         P0.L = lo(PORTFIO);
144         R2 = W[P0](Z);
145         SSYNC;
146         R1 = ~R1;
147         R2 = R2 & R1;
148         R2 = R2 | R0;
149         W[P0] = R2.L;
150         SSYNC;
151         R2 = [SP++];
152         R1 = [SP++];
153         P0 = [SP++];
154         UNLINK;
155         RTS;
156         .size   _led_disp_num, .-_led_disp_num
157
158 /* Toggle the number using LEDs in binary format.  */
159
160 ENTRY(_led_toggle_num)
161         LINK 12;
162         [--SP] = P0;
163         [--SP] = R1;
164         [--SP] = R2;
165         CALL _led_init;
166         R1 = 0x3f(X);
167         R0 = R0 & R1;
168         R1 = 6(X);
169         R0 <<= R1;
170         P0.H = hi(PORTFIO);
171         P0.L = lo(PORTFIO);
172         R1 = W[P0](Z);
173         SSYNC;
174         R1 = R1 ^ R0;
175         W[P0] = R1.L;
176         SSYNC;
177         R2 = [SP++];
178         R1 = [SP++];
179         P0 = [SP++];
180         UNLINK;
181         RTS;
182         .size   _led_toggle_num, .-_led_toggle_num
183