diff options
Diffstat (limited to 'include/asm-v850/gbus_int.h')
-rw-r--r-- | include/asm-v850/gbus_int.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/include/asm-v850/gbus_int.h b/include/asm-v850/gbus_int.h new file mode 100644 index 000000000000..0c4bce753c7e --- /dev/null +++ b/include/asm-v850/gbus_int.h | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * include/asm-v850/gbus_int.h -- Midas labs GBUS interrupt support | ||
3 | * | ||
4 | * Copyright (C) 2001,02 NEC Corporation | ||
5 | * Copyright (C) 2001,02 Miles Bader <miles@gnu.org> | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General | ||
8 | * Public License. See the file COPYING in the main directory of this | ||
9 | * archive for more details. | ||
10 | * | ||
11 | * Written by Miles Bader <miles@gnu.org> | ||
12 | */ | ||
13 | |||
14 | #ifndef __V850_GBUS_INT_H__ | ||
15 | #define __V850_GBUS_INT_H__ | ||
16 | |||
17 | |||
18 | /* The GBUS interrupt interface has 32 interrupts shared among 4 | ||
19 | processor interrupts. The 32 GBUS interrupts are divided into two | ||
20 | sets of 16 each, for allocating among control registers, etc (there | ||
21 | are two of each control register, with bits 0-15 controlling an | ||
22 | interrupt each). */ | ||
23 | |||
24 | /* The GBUS interrupts themselves. */ | ||
25 | #define IRQ_GBUS_INT(n) (GBUS_INT_BASE_IRQ + (n)) | ||
26 | #define IRQ_GBUS_INT_NUM 32 | ||
27 | |||
28 | /* Control registers. */ | ||
29 | #define GBUS_INT_STATUS_ADDR(w) (GBUS_INT_BASE_ADDR + (w)*0x40) | ||
30 | #define GBUS_INT_STATUS(w) (*(volatile u16 *)GBUS_INT_STATUS_ADDR(w)) | ||
31 | #define GBUS_INT_CLEAR_ADDR(w) (GBUS_INT_BASE_ADDR + 0x10 + (w)*0x40) | ||
32 | #define GBUS_INT_CLEAR(w) (*(volatile u16 *)GBUS_INT_CLEAR_ADDR(w)) | ||
33 | #define GBUS_INT_EDGE_ADDR(w) (GBUS_INT_BASE_ADDR + 0x20 + (w)*0x40) | ||
34 | #define GBUS_INT_EDGE(w) (*(volatile u16 *)GBUS_INT_EDGE_ADDR(w)) | ||
35 | #define GBUS_INT_POLARITY_ADDR(w) (GBUS_INT_BASE_ADDR + 0x30 + (w)*0x40) | ||
36 | #define GBUS_INT_POLARITY(w) (*(volatile u16 *)GBUS_INT_POLARITY_ADDR(w)) | ||
37 | /* This allows enabling interrupt bits in word W for interrupt GINTn. */ | ||
38 | #define GBUS_INT_ENABLE_ADDR(w, n) \ | ||
39 | (GBUS_INT_BASE_ADDR + 0x100 + (w)*0x10 + (n)*0x20) | ||
40 | #define GBUS_INT_ENABLE(w, n) (*(volatile u16 *)GBUS_INT_ENABLE_ADDR(w, n)) | ||
41 | |||
42 | /* Mapping between kernel interrupt numbers and hardware control regs/bits. */ | ||
43 | #define GBUS_INT_BITS_PER_WORD 16 | ||
44 | #define GBUS_INT_NUM_WORDS (IRQ_GBUS_INT_NUM / GBUS_INT_BITS_PER_WORD) | ||
45 | #define GBUS_INT_IRQ_WORD(irq) (((irq) - GBUS_INT_BASE_IRQ) >> 4) | ||
46 | #define GBUS_INT_IRQ_BIT(irq) (((irq) - GBUS_INT_BASE_IRQ) & 0xF) | ||
47 | #define GBUS_INT_IRQ_MASK(irq) (1 << GBUS_INT_IRQ_BIT(irq)) | ||
48 | |||
49 | |||
50 | /* Possible priorities for GBUS interrupts. */ | ||
51 | #define GBUS_INT_PRIORITY_HIGH 2 | ||
52 | #define GBUS_INT_PRIORITY_MEDIUM 4 | ||
53 | #define GBUS_INT_PRIORITY_LOW 6 | ||
54 | |||
55 | |||
56 | #ifndef __ASSEMBLY__ | ||
57 | |||
58 | /* Enable interrupt handling for interrupt IRQ. */ | ||
59 | extern void gbus_int_enable_irq (unsigned irq); | ||
60 | /* Disable interrupt handling for interrupt IRQ. Note that any | ||
61 | interrupts received while disabled will be delivered once the | ||
62 | interrupt is enabled again, unless they are explicitly cleared using | ||
63 | `gbus_int_clear_pending_irq'. */ | ||
64 | extern void gbus_int_disable_irq (unsigned irq); | ||
65 | /* Return true if interrupt handling for interrupt IRQ is enabled. */ | ||
66 | extern int gbus_int_irq_enabled (unsigned irq); | ||
67 | /* Disable all GBUS irqs. */ | ||
68 | extern void gbus_int_disable_irqs (void); | ||
69 | /* Clear any pending interrupts for IRQ. */ | ||
70 | extern void gbus_int_clear_pending_irq (unsigned irq); | ||
71 | /* Return true if interrupt IRQ is pending (but disabled). */ | ||
72 | extern int gbus_int_irq_pending (unsigned irq); | ||
73 | |||
74 | |||
75 | struct gbus_int_irq_init { | ||
76 | const char *name; /* name of interrupt type */ | ||
77 | |||
78 | /* Range of kernel irq numbers for this type: | ||
79 | BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM */ | ||
80 | unsigned base, num, interval; | ||
81 | |||
82 | unsigned priority; /* interrupt priority to assign */ | ||
83 | }; | ||
84 | struct hw_interrupt_type; /* fwd decl */ | ||
85 | |||
86 | /* Initialize HW_IRQ_TYPES for GBUS irqs described in array | ||
87 | INITS (which is terminated by an entry with the name field == 0). */ | ||
88 | extern void gbus_int_init_irq_types (struct gbus_int_irq_init *inits, | ||
89 | struct hw_interrupt_type *hw_irq_types); | ||
90 | |||
91 | /* Initialize GBUS interrupts. */ | ||
92 | extern void gbus_int_init_irqs (void); | ||
93 | |||
94 | #endif /* !__ASSEMBLY__ */ | ||
95 | |||
96 | |||
97 | #endif /* __V850_GBUS_INT_H__ */ | ||