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