summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2004-03-02 11:32:59 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2004-03-02 11:32:59 +0000
commit111a972b65f5fcc2ef98a5164d0367e7e50f4b09 (patch)
tree84cdb473f8c439575ac99d90f94d636e7f25e731 /firmware
parentaa5b23d6162a5ac6cbfc1d871ed9360ffa946c56 (diff)
downloadrockbox-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
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/button.c5
-rw-r--r--firmware/drivers/power.c2
-rw-r--r--firmware/drivers/serial.c2
-rw-r--r--firmware/export/system.h15
-rw-r--r--firmware/kernel.c6
-rw-r--r--firmware/mp3_playback.c2
-rw-r--r--firmware/system.c12
7 files changed, 23 insertions, 21 deletions
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
34struct event_queue button_queue; 35struct event_queue button_queue;
35 36
@@ -256,10 +257,10 @@ static int button_flip(int button)
256 */ 257 */
257void button_set_flip(bool flip) 258void 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
119void power_off(void) 119void 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
26extern void system_reboot (void); 26extern void system_reboot (void);
27extern void system_init(void); 27extern void system_init(void);
28extern 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)
80static 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
76static inline short SWAB16(short value) 89static 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)
201int tick_add_task(void (*f)(void)) 201int 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))
221int tick_remove_task(void (*f)(void)) 221int 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
339void demand_irq_enable(bool on) 339void 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 ****************************************************************************/
324int 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
333void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */ 321void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */
334{ 322{
335 bool state = true; 323 bool state = true;