]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/arch/arm/mach-lpc17xx/libs/hal/hal.c
Contributed support for LCP17xx devices and PiKRON's LMC1 board.
[lincan.git] / embedded / arch / arm / mach-lpc17xx / libs / hal / hal.c
1 #include <stdio.h>
2 #include <cpu_def.h>
3 #include <LPC17xx.h>
4
5 #define IRQ_TABLE_SIZE  (16+33)
6
7 __attribute__ ((section(".irqarea")))
8 irq_handler_t *irq_handler_table_start[IRQ_TABLE_SIZE];
9 void *irq_context_table_start[IRQ_TABLE_SIZE];
10
11 void **irq_context_table = irq_context_table_start;
12 irq_handler_t **irq_handler_table = irq_handler_table_start;
13 unsigned int irq_table_size = IRQ_TABLE_SIZE; 
14
15 void disable_irq(unsigned int irqnum)
16 {
17   NVIC_DisableIRQ(irqnum);
18   __memory_barrier();
19 }
20 void enable_irq(unsigned int irqnum)
21 {
22   __memory_barrier();
23   NVIC_EnableIRQ(irqnum);
24 }
25
26 int
27 request_irq(unsigned int irqnum, irq_handler_t *handler, unsigned long flags,
28             const char *name, void *context)
29 {
30   unsigned int irqidx=irq_irqnum2irqidx(irqnum);
31   
32   if (irqidx>=irq_table_size) 
33     return -1;
34   
35   disable_irq(irqnum);
36   irq_handler_table[irqidx]=handler;
37   irq_context_table[irqidx]=context;
38   enable_irq(irqnum);
39   
40   return 0;
41 }
42
43 void free_irq(unsigned int irqnum, void *context)
44 {
45   unsigned int irqidx=irq_irqnum2irqidx(irqnum);
46
47   if (irqidx>=irq_table_size) 
48     return;
49   
50   disable_irq(irqnum);
51   irq_handler_table[irqidx]=NULL;
52   irq_context_table[irqidx]=NULL;
53 }