diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2004-03-02 11:32:59 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2004-03-02 11:32:59 +0000 |
commit | 111a972b65f5fcc2ef98a5164d0367e7e50f4b09 (patch) | |
tree | 84cdb473f8c439575ac99d90f94d636e7f25e731 | |
parent | aa5b23d6162a5ac6cbfc1d871ed9360ffa946c56 (diff) | |
download | rockbox-111a972b65f5fcc2ef98a5164d0367e7e50f4b09.tar.gz rockbox-111a972b65f5fcc2ef98a5164d0367e7e50f4b09.zip |
Made set_irq_level() an inline function, and optimized it by removing the bit shifts
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4330 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | docs/API | 3 | ||||
-rw-r--r-- | firmware/drivers/button.c | 5 | ||||
-rw-r--r-- | firmware/drivers/power.c | 2 | ||||
-rw-r--r-- | firmware/drivers/serial.c | 2 | ||||
-rw-r--r-- | firmware/export/system.h | 15 | ||||
-rw-r--r-- | firmware/kernel.c | 6 | ||||
-rw-r--r-- | firmware/mp3_playback.c | 2 | ||||
-rw-r--r-- | firmware/system.c | 12 |
8 files changed, 25 insertions, 22 deletions
@@ -227,7 +227,8 @@ Various | |||
227 | int set_irq_level(int level) | 227 | int set_irq_level(int level) |
228 | 228 | ||
229 | Sets the interrupt level (0 = lowest, 15 = highest) and returns the | 229 | Sets the interrupt level (0 = lowest, 15 = highest) and returns the |
230 | previous level. | 230 | previous level. Note that you must shift the argument 4 bits to the left: |
231 | set_irq_level(level << 4); | ||
231 | 232 | ||
232 | void queue_init(struct event_queue *q) | 233 | void queue_init(struct event_queue *q) |
233 | 234 | ||
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index 66c7e978fb..cbb6d58f7b 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "adc.h" | 30 | #include "adc.h" |
31 | #include "serial.h" | 31 | #include "serial.h" |
32 | #include "power.h" | 32 | #include "power.h" |
33 | #include "system.h" | ||
33 | 34 | ||
34 | struct event_queue button_queue; | 35 | struct event_queue button_queue; |
35 | 36 | ||
@@ -256,10 +257,10 @@ static int button_flip(int button) | |||
256 | */ | 257 | */ |
257 | void button_set_flip(bool flip) | 258 | void button_set_flip(bool flip) |
258 | { | 259 | { |
259 | if (flip != flipped) /* not the curent setting */ | 260 | if (flip != flipped) /* not the current setting */ |
260 | { | 261 | { |
261 | /* avoid race condition with the button_tick() */ | 262 | /* avoid race condition with the button_tick() */ |
262 | int oldlevel = set_irq_level(15); | 263 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
263 | lastbtn = button_flip(lastbtn); | 264 | lastbtn = button_flip(lastbtn); |
264 | flipped = flip; | 265 | flipped = flip; |
265 | set_irq_level(oldlevel); | 266 | set_irq_level(oldlevel); |
diff --git a/firmware/drivers/power.c b/firmware/drivers/power.c index 563ff3e25c..621f53e11e 100644 --- a/firmware/drivers/power.c +++ b/firmware/drivers/power.c | |||
@@ -118,7 +118,7 @@ bool ide_powered(void) | |||
118 | 118 | ||
119 | void power_off(void) | 119 | void power_off(void) |
120 | { | 120 | { |
121 | set_irq_level(15); | 121 | set_irq_level(HIGHEST_IRQ_LEVEL); |
122 | #ifdef HAVE_POWEROFF_ON_PBDR | 122 | #ifdef HAVE_POWEROFF_ON_PBDR |
123 | and_b(~0x10, &PBDRL); | 123 | and_b(~0x10, &PBDRL); |
124 | or_b(0x10, &PBIORL); | 124 | or_b(0x10, &PBIORL); |
diff --git a/firmware/drivers/serial.c b/firmware/drivers/serial.c index 5aae38e58c..2badf2e39f 100644 --- a/firmware/drivers/serial.c +++ b/firmware/drivers/serial.c | |||
@@ -172,7 +172,7 @@ static void screen_dump(void) | |||
172 | 172 | ||
173 | serial_enable_tx(); | 173 | serial_enable_tx(); |
174 | 174 | ||
175 | level = set_irq_level(15); | 175 | level = set_irq_level(HIGHEST_IRQ_LEVEL); |
176 | for(y = 0;y < LCD_HEIGHT/8;y++) | 176 | for(y = 0;y < LCD_HEIGHT/8;y++) |
177 | { | 177 | { |
178 | for(x = 0;x < LCD_WIDTH;x++) | 178 | for(x = 0;x < LCD_WIDTH;x++) |
diff --git a/firmware/export/system.h b/firmware/export/system.h index 5886145d7b..038d9567e0 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | extern void system_reboot (void); | 26 | extern void system_reboot (void); |
27 | extern void system_init(void); | 27 | extern void system_init(void); |
28 | extern int set_irq_level(int level); | ||
29 | 28 | ||
30 | #define FREQ CPU_FREQ | 29 | #define FREQ CPU_FREQ |
31 | #define BAUDRATE 9600 | 30 | #define BAUDRATE 9600 |
@@ -73,6 +72,20 @@ extern int set_irq_level(int level); | |||
73 | 72 | ||
74 | #ifndef SIMULATOR | 73 | #ifndef SIMULATOR |
75 | 74 | ||
75 | /**************************************************************************** | ||
76 | * Interrupt level setting | ||
77 | * The level is left shifted 4 bits | ||
78 | ****************************************************************************/ | ||
79 | #define HIGHEST_IRQ_LEVEL (15<<4) | ||
80 | static inline int set_irq_level(int level) | ||
81 | { | ||
82 | int i; | ||
83 | /* Read the old level and set the new one */ | ||
84 | asm volatile ("stc sr, %0" : "=r" (i)); | ||
85 | asm volatile ("ldc %0, sr" : : "r" (level)); | ||
86 | return i; | ||
87 | } | ||
88 | |||
76 | static inline short SWAB16(short value) | 89 | static inline short SWAB16(short value) |
77 | /* | 90 | /* |
78 | result[15..8] = value[ 7..0]; | 91 | result[15..8] = value[ 7..0]; |
diff --git a/firmware/kernel.c b/firmware/kernel.c index 1c37f004a4..84fb438b49 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -118,7 +118,7 @@ void queue_post(struct event_queue *q, int id, void *data) | |||
118 | int wr; | 118 | int wr; |
119 | int oldlevel; | 119 | int oldlevel; |
120 | 120 | ||
121 | oldlevel = set_irq_level(15); | 121 | oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
122 | wr = (q->write++) & QUEUE_LENGTH_MASK; | 122 | wr = (q->write++) & QUEUE_LENGTH_MASK; |
123 | 123 | ||
124 | q->events[wr].id = id; | 124 | q->events[wr].id = id; |
@@ -201,7 +201,7 @@ void IMIA0(void) | |||
201 | int tick_add_task(void (*f)(void)) | 201 | int tick_add_task(void (*f)(void)) |
202 | { | 202 | { |
203 | int i; | 203 | int i; |
204 | int oldlevel = set_irq_level(15); | 204 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
205 | 205 | ||
206 | /* Add a task if there is room */ | 206 | /* Add a task if there is room */ |
207 | for(i = 0;i < MAX_NUM_TICK_TASKS;i++) | 207 | for(i = 0;i < MAX_NUM_TICK_TASKS;i++) |
@@ -221,7 +221,7 @@ int tick_add_task(void (*f)(void)) | |||
221 | int tick_remove_task(void (*f)(void)) | 221 | int tick_remove_task(void (*f)(void)) |
222 | { | 222 | { |
223 | int i; | 223 | int i; |
224 | int oldlevel = set_irq_level(15); | 224 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
225 | 225 | ||
226 | /* Remove a task if it is there */ | 226 | /* Remove a task if it is there */ |
227 | for(i = 0;i < MAX_NUM_TICK_TASKS;i++) | 227 | for(i = 0;i < MAX_NUM_TICK_TASKS;i++) |
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c index 422a0e6822..a775ba4ff5 100644 --- a/firmware/mp3_playback.c +++ b/firmware/mp3_playback.c | |||
@@ -338,7 +338,7 @@ static void postpone_dma_tick(void) | |||
338 | #ifdef HAVE_MAS3587F | 338 | #ifdef HAVE_MAS3587F |
339 | void demand_irq_enable(bool on) | 339 | void demand_irq_enable(bool on) |
340 | { | 340 | { |
341 | int oldlevel = set_irq_level(15); | 341 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
342 | 342 | ||
343 | if(on) | 343 | if(on) |
344 | { | 344 | { |
diff --git a/firmware/system.c b/firmware/system.c index 3ec56f7c15..cb0cb29778 100644 --- a/firmware/system.c +++ b/firmware/system.c | |||
@@ -318,18 +318,6 @@ void system_reboot (void) | |||
318 | "r"(*(int*)0),"r"(4)); | 318 | "r"(*(int*)0),"r"(4)); |
319 | } | 319 | } |
320 | 320 | ||
321 | /**************************************************************************** | ||
322 | * Interrupt level setting | ||
323 | ****************************************************************************/ | ||
324 | int set_irq_level(int level) | ||
325 | { | ||
326 | int i; | ||
327 | /* Read the old level and set the new one */ | ||
328 | asm volatile ("stc sr, %0" : "=r" (i)); | ||
329 | asm volatile ("ldc %0, sr" : : "r" (level << 4)); | ||
330 | return (i >> 4) & 0x0f; | ||
331 | } | ||
332 | |||
333 | void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */ | 321 | void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */ |
334 | { | 322 | { |
335 | bool state = true; | 323 | bool state = true; |