]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 <[email protected]> | |
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 <[email protected]> | |
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__ */ |