summaryrefslogtreecommitdiff
path: root/firmware/target/sh
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/sh')
-rw-r--r--firmware/target/sh/archos/fm_v2/power-fm_v2.c5
-rw-r--r--firmware/target/sh/archos/ondio/power-ondio.c5
-rw-r--r--firmware/target/sh/archos/player/power-player.c5
-rw-r--r--firmware/target/sh/archos/recorder/power-recorder.c5
-rw-r--r--firmware/target/sh/system-sh.c2
-rw-r--r--firmware/target/sh/system-target.h20
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
102void power_off(void) 102void 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
67void power_off(void) 67void 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
80void power_off(void) 80void 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
96void power_off(void) 96void 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
361void system_reboot (void) 361void 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
62static 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
60static inline uint16_t swap16(uint16_t value) 78static inline uint16_t swap16(uint16_t value)
61 /* 79 /*
62 result[15..8] = value[ 7..0]; 80 result[15..8] = value[ 7..0];