diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-09-28 23:19:33 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-09-28 23:19:33 +1000 |
commit | ead48b1aa9401c3dc06e21656823e1f4246b4772 (patch) | |
tree | 442b9875865665497cea9e9f93f9f7e379c2909d | |
parent | d4afb299b7a8b4ebbca25a1e3a597a6536bdb1d5 (diff) |
Fixing interrupts
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | firmware/servicereq.c | 7 | ||||
-rw-r--r-- | firmware/smu.c | 3 | ||||
-rw-r--r-- | firmware/smu.h | 3 |
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 { |