diff options
Diffstat (limited to 'firmware/target/sh')
-rw-r--r-- | firmware/target/sh/archos/fm_v2/power-fm_v2.c | 5 | ||||
-rw-r--r-- | firmware/target/sh/archos/ondio/power-ondio.c | 5 | ||||
-rw-r--r-- | firmware/target/sh/archos/player/power-player.c | 5 | ||||
-rw-r--r-- | firmware/target/sh/archos/recorder/power-recorder.c | 5 | ||||
-rw-r--r-- | firmware/target/sh/system-sh.c | 2 | ||||
-rw-r--r-- | firmware/target/sh/system-target.h | 20 |
6 files changed, 28 insertions, 14 deletions
diff --git a/firmware/target/sh/archos/fm_v2/power-fm_v2.c b/firmware/target/sh/archos/fm_v2/power-fm_v2.c index 94a36339bb..ac23348d42 100644 --- a/firmware/target/sh/archos/fm_v2/power-fm_v2.c +++ b/firmware/target/sh/archos/fm_v2/power-fm_v2.c | |||
@@ -101,9 +101,8 @@ bool ide_powered(void) | |||
101 | 101 | ||
102 | void power_off(void) | 102 | void power_off(void) |
103 | { | 103 | { |
104 | set_irq_level(HIGHEST_IRQ_LEVEL); | 104 | disable_irq(); |
105 | and_b(~0x20, &PBDRL); | 105 | and_b(~0x20, &PBDRL); |
106 | or_b(0x20, &PBIORL); | 106 | or_b(0x20, &PBIORL); |
107 | while(1) | 107 | while(1); |
108 | yield(); | ||
109 | } | 108 | } |
diff --git a/firmware/target/sh/archos/ondio/power-ondio.c b/firmware/target/sh/archos/ondio/power-ondio.c index 156516afeb..87f365791b 100644 --- a/firmware/target/sh/archos/ondio/power-ondio.c +++ b/firmware/target/sh/archos/ondio/power-ondio.c | |||
@@ -66,13 +66,12 @@ void power_init(void) | |||
66 | 66 | ||
67 | void power_off(void) | 67 | void power_off(void) |
68 | { | 68 | { |
69 | set_irq_level(HIGHEST_IRQ_LEVEL); | 69 | disable_irq(); |
70 | #ifdef HAVE_BACKLIGHT | 70 | #ifdef HAVE_BACKLIGHT |
71 | /* Switch off the light on backlight-modded Ondios */ | 71 | /* Switch off the light on backlight-modded Ondios */ |
72 | _backlight_off(); | 72 | _backlight_off(); |
73 | #endif | 73 | #endif |
74 | and_b(~0x20, &PBDRL); | 74 | and_b(~0x20, &PBDRL); |
75 | or_b(0x20, &PBIORL); | 75 | or_b(0x20, &PBIORL); |
76 | while(1) | 76 | while(1); |
77 | yield(); | ||
78 | } | 77 | } |
diff --git a/firmware/target/sh/archos/player/power-player.c b/firmware/target/sh/archos/player/power-player.c index 7d9d0d7d16..b2f51b9280 100644 --- a/firmware/target/sh/archos/player/power-player.c +++ b/firmware/target/sh/archos/player/power-player.c | |||
@@ -79,9 +79,8 @@ bool ide_powered(void) | |||
79 | 79 | ||
80 | void power_off(void) | 80 | void power_off(void) |
81 | { | 81 | { |
82 | set_irq_level(HIGHEST_IRQ_LEVEL); | 82 | disable_irq(); |
83 | and_b(~0x08, &PADRH); | 83 | and_b(~0x08, &PADRH); |
84 | or_b(0x08, &PAIORH); | 84 | or_b(0x08, &PAIORH); |
85 | while(1) | 85 | while(1); |
86 | yield(); | ||
87 | } | 86 | } |
diff --git a/firmware/target/sh/archos/recorder/power-recorder.c b/firmware/target/sh/archos/recorder/power-recorder.c index 2af8df1bb6..1804bcb660 100644 --- a/firmware/target/sh/archos/recorder/power-recorder.c +++ b/firmware/target/sh/archos/recorder/power-recorder.c | |||
@@ -95,9 +95,8 @@ bool ide_powered(void) | |||
95 | 95 | ||
96 | void power_off(void) | 96 | void power_off(void) |
97 | { | 97 | { |
98 | set_irq_level(HIGHEST_IRQ_LEVEL); | 98 | disable_irq(); |
99 | and_b(~0x10, &PBDRL); | 99 | and_b(~0x10, &PBDRL); |
100 | or_b(0x10, &PBIORL); | 100 | or_b(0x10, &PBIORL); |
101 | while(1) | 101 | while(1); |
102 | yield(); | ||
103 | } | 102 | } |
diff --git a/firmware/target/sh/system-sh.c b/firmware/target/sh/system-sh.c index eec3ec18e4..f763e0ff53 100644 --- a/firmware/target/sh/system-sh.c +++ b/firmware/target/sh/system-sh.c | |||
@@ -360,7 +360,7 @@ void system_init(void) | |||
360 | 360 | ||
361 | void system_reboot (void) | 361 | void system_reboot (void) |
362 | { | 362 | { |
363 | set_irq_level(HIGHEST_IRQ_LEVEL); | 363 | disable_irq(); |
364 | 364 | ||
365 | asm volatile ("ldc\t%0,vbr" : : "r"(0)); | 365 | asm volatile ("ldc\t%0,vbr" : : "r"(0)); |
366 | 366 | ||
diff --git a/firmware/target/sh/system-target.h b/firmware/target/sh/system-target.h index 7fb8fecb6b..d641076694 100644 --- a/firmware/target/sh/system-target.h +++ b/firmware/target/sh/system-target.h | |||
@@ -52,11 +52,29 @@ static inline int set_irq_level(int level) | |||
52 | { | 52 | { |
53 | int i; | 53 | int i; |
54 | /* Read the old level and set the new one */ | 54 | /* Read the old level and set the new one */ |
55 | asm volatile ("stc sr, %0" : "=r" (i)); | 55 | |
56 | /* Not volatile - will be optimized away if the return value isn't used */ | ||
57 | asm ("stc sr, %0" : "=r" (i)); | ||
56 | asm volatile ("ldc %0, sr" : : "r" (level)); | 58 | asm volatile ("ldc %0, sr" : : "r" (level)); |
57 | return i; | 59 | return i; |
58 | } | 60 | } |
59 | 61 | ||
62 | static inline void enable_irq(void) | ||
63 | { | ||
64 | int i; | ||
65 | asm volatile ("mov %1, %0 \n" /* Save a constant load from RAM */ | ||
66 | "ldc %0, sr \n" : "=&r"(i) : "i"(0)); | ||
67 | } | ||
68 | |||
69 | #define disable_irq() \ | ||
70 | ((void)set_irq_level(HIGHEST_IRQ_LEVEL)) | ||
71 | |||
72 | #define disable_irq_save() \ | ||
73 | set_irq_level(HIGHEST_IRQ_LEVEL) | ||
74 | |||
75 | #define restore_irq(i) \ | ||
76 | ((void)set_irq_level(i)) | ||
77 | |||
60 | static inline uint16_t swap16(uint16_t value) | 78 | static inline uint16_t swap16(uint16_t value) |
61 | /* | 79 | /* |
62 | result[15..8] = value[ 7..0]; | 80 | result[15..8] = value[ 7..0]; |