Blame view
include/linux/sh_intc.h
2.84 KB
bbfbd8b15
|
1 2 |
#ifndef __SH_INTC_H #define __SH_INTC_H |
dec710b77
|
3 |
#include <linux/ioport.h> |
bbfbd8b15
|
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
typedef unsigned char intc_enum; struct intc_vect { intc_enum enum_id; unsigned short vect; }; #define INTC_VECT(enum_id, vect) { enum_id, vect } #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) struct intc_group { intc_enum enum_id; intc_enum enum_ids[32]; }; #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } struct intc_mask_reg { unsigned long set_reg, clr_reg, reg_width; intc_enum enum_ids[32]; |
dc825b179
|
24 25 26 |
#ifdef CONFIG_INTC_BALANCING unsigned long dist_reg; #endif |
bbfbd8b15
|
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#ifdef CONFIG_SMP unsigned long smp; #endif }; struct intc_prio_reg { unsigned long set_reg, clr_reg, reg_width, field_width; intc_enum enum_ids[16]; #ifdef CONFIG_SMP unsigned long smp; #endif }; struct intc_sense_reg { unsigned long reg, reg_width, field_width; intc_enum enum_ids[16]; }; |
dc825b179
|
44 45 46 47 48 |
#ifdef CONFIG_INTC_BALANCING #define INTC_SMP_BALANCING(reg) .dist_reg = (reg) #else #define INTC_SMP_BALANCING(reg) #endif |
bbfbd8b15
|
49 |
#ifdef CONFIG_SMP |
dc825b179
|
50 |
#define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) |
bbfbd8b15
|
51 52 53 |
#else #define INTC_SMP(stride, nr) #endif |
577cd7584
|
54 |
struct intc_hw_desc { |
bbfbd8b15
|
55 56 57 58 59 60 61 62 63 64 |
struct intc_vect *vectors; unsigned int nr_vectors; struct intc_group *groups; unsigned int nr_groups; struct intc_mask_reg *mask_regs; unsigned int nr_mask_regs; struct intc_prio_reg *prio_regs; unsigned int nr_prio_regs; struct intc_sense_reg *sense_regs; unsigned int nr_sense_regs; |
bbfbd8b15
|
65 66 |
struct intc_mask_reg *ack_regs; unsigned int nr_ack_regs; |
bbfbd8b15
|
67 68 69 |
}; #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) |
577cd7584
|
70 71 72 73 74 75 76 77 78 79 |
#define INTC_HW_DESC(vectors, groups, mask_regs, \ prio_regs, sense_regs, ack_regs) \ { \ _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ _INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs), \ } struct intc_desc { char *name; |
dec710b77
|
80 81 |
struct resource *resource; unsigned int num_resources; |
d51909534
|
82 |
intc_enum force_enable; |
d85429a31
|
83 |
intc_enum force_disable; |
577cd7584
|
84 85 |
struct intc_hw_desc hw; }; |
bbfbd8b15
|
86 87 88 |
#define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ mask_regs, prio_regs, sense_regs) \ struct intc_desc symbol __initdata = { \ |
577cd7584
|
89 90 91 |
.name = chipname, \ .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ prio_regs, sense_regs, NULL), \ |
bbfbd8b15
|
92 |
} |
bbfbd8b15
|
93 94 95 |
#define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ mask_regs, prio_regs, sense_regs, ack_regs) \ struct intc_desc symbol __initdata = { \ |
577cd7584
|
96 97 98 |
.name = chipname, \ .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ prio_regs, sense_regs, ack_regs), \ |
bbfbd8b15
|
99 |
} |
bbfbd8b15
|
100 |
|
01e9651a2
|
101 |
int __init register_intc_controller(struct intc_desc *desc); |
bbfbd8b15
|
102 |
int intc_set_priority(unsigned int irq, unsigned int prio); |
43b8774dc
|
103 104 105 106 107 108 109 110 |
#ifdef CONFIG_INTC_USERIMASK int register_intc_userimask(unsigned long addr); #else static inline int register_intc_userimask(unsigned long addr) { return 0; } #endif |
45b9deaf1
|
111 112 |
int reserve_irq_vector(unsigned int irq); void reserve_irq_legacy(void); |
bbfbd8b15
|
113 |
#endif /* __SH_INTC_H */ |