• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/src/linux/linux-2.6/arch/blackfin/mach-bf537/boards/
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
17ENTRY(_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
61ENTRY(_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
84ENTRY(_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
108ENTRY(_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
131ENTRY(_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
160ENTRY(_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