summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2015-09-28 23:19:33 +1000
committerDamien Zammit <damien@zamaudio.com>2015-09-28 23:19:33 +1000
commitead48b1aa9401c3dc06e21656823e1f4246b4772 (patch)
tree442b9875865665497cea9e9f93f9f7e379c2909d
parentd4afb299b7a8b4ebbca25a1e3a597a6536bdb1d5 (diff)
Fixing interrupts
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--firmware/servicereq.c7
-rw-r--r--firmware/smu.c3
-rw-r--r--firmware/smu.h3
3 files changed, 10 insertions, 3 deletions
diff --git a/firmware/servicereq.c b/firmware/servicereq.c
index 5f9ece3..3ae0edc 100644
--- a/firmware/servicereq.c
+++ b/firmware/servicereq.c
@@ -5560,7 +5560,9 @@ void smu_service_request(unsigned int level, void* dummy)
static u32 bapm = 0;
int requestid;
- write32(0xe0003004, 1);
+ // Acknowledge and clear all other pending interrupts
+ write32(0xe0003004, INTACK);
+ asm volatile ("wcsr ip, %0"::"r"(0xffffffff));
requestid = read32(0xe0003000);
requestid &= 0x1fffe;
@@ -5654,8 +5656,7 @@ void smu_service_request(unsigned int level, void* dummy)
default:
break;
}
- write32(0xe0003004, 3);
- write32(0xe0003000, 1);
+ write32(0xe0003004, INTACK | INTDONE);
}
void MicoISRHandler(void)
diff --git a/firmware/smu.c b/firmware/smu.c
index 62bd479..a8735ad 100644
--- a/firmware/smu.c
+++ b/firmware/smu.c
@@ -41,6 +41,9 @@ void main(void)
asm volatile ("wcsr im, %0"::"r"(im));
}
+ /* clear all pending interrupts */
+ asm volatile ("wcsr ip, %0"::"r"(0xffffffff));
+
/* enable interrupts */
ie |= 0x1;
asm volatile ("wcsr ie, %0"::"r"(ie));
diff --git a/firmware/smu.h b/firmware/smu.h
index e7e9129..b6eb864 100644
--- a/firmware/smu.h
+++ b/firmware/smu.h
@@ -60,6 +60,9 @@ typedef unsigned int u32;
#define write32(addr, val) (*((volatile u32 *)(addr))) = (val)
#define read32(addr) (*((volatile u32 *)(addr)))
+#define INTACK 1
+#define INTDONE 2
+
/// x1F200
typedef union {
struct {