diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2011-03-07 08:59:28 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-03-09 19:03:58 -0500 |
commit | d1ae63d4d3e49fd69183cfd92bde4c412aa9eda6 (patch) | |
tree | 5500cffdf82670c46b751a6aafb69801a043eae8 /arch/powerpc | |
parent | cfe4a109940db985b567105bb8f25ebebf953370 (diff) |
powerpc: platforms/cell irq_data conversion.
Signed-off-by: Lennert Buytenhek <buytenh@secretlab.ca>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/platforms/cell/axon_msi.c | 3 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/beat_interrupt.c | 36 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/interrupt.c | 30 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/setup.c | 6 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spider-pic.c | 43 |
5 files changed, 64 insertions, 54 deletions
diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/cell/axon_msi.c index e3e379c6caa7..c07930f16e6c 100644 --- a/arch/powerpc/platforms/cell/axon_msi.c +++ b/arch/powerpc/platforms/cell/axon_msi.c | |||
@@ -93,6 +93,7 @@ static void msic_dcr_write(struct axon_msic *msic, unsigned int dcr_n, u32 val) | |||
93 | 93 | ||
94 | static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) | 94 | static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) |
95 | { | 95 | { |
96 | struct irq_chip *chip = get_irq_desc_chip(desc); | ||
96 | struct axon_msic *msic = get_irq_data(irq); | 97 | struct axon_msic *msic = get_irq_data(irq); |
97 | u32 write_offset, msi; | 98 | u32 write_offset, msi; |
98 | int idx; | 99 | int idx; |
@@ -145,7 +146,7 @@ static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) | |||
145 | msic->read_offset &= MSIC_FIFO_SIZE_MASK; | 146 | msic->read_offset &= MSIC_FIFO_SIZE_MASK; |
146 | } | 147 | } |
147 | 148 | ||
148 | desc->chip->eoi(irq); | 149 | chip->irq_eoi(&desc->irq_data); |
149 | } | 150 | } |
150 | 151 | ||
151 | static struct axon_msic *find_msi_translator(struct pci_dev *dev) | 152 | static struct axon_msic *find_msi_translator(struct pci_dev *dev) |
diff --git a/arch/powerpc/platforms/cell/beat_interrupt.c b/arch/powerpc/platforms/cell/beat_interrupt.c index 682af97321a8..0b8f7d7135c5 100644 --- a/arch/powerpc/platforms/cell/beat_interrupt.c +++ b/arch/powerpc/platforms/cell/beat_interrupt.c | |||
@@ -61,59 +61,59 @@ static inline void beatic_update_irq_mask(unsigned int irq_plug) | |||
61 | panic("Failed to set mask IRQ!"); | 61 | panic("Failed to set mask IRQ!"); |
62 | } | 62 | } |
63 | 63 | ||
64 | static void beatic_mask_irq(unsigned int irq_plug) | 64 | static void beatic_mask_irq(struct irq_data *d) |
65 | { | 65 | { |
66 | unsigned long flags; | 66 | unsigned long flags; |
67 | 67 | ||
68 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); | 68 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); |
69 | beatic_irq_mask_enable[irq_plug/64] &= ~(1UL << (63 - (irq_plug%64))); | 69 | beatic_irq_mask_enable[d->irq/64] &= ~(1UL << (63 - (d->irq%64))); |
70 | beatic_update_irq_mask(irq_plug); | 70 | beatic_update_irq_mask(d->irq); |
71 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); | 71 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); |
72 | } | 72 | } |
73 | 73 | ||
74 | static void beatic_unmask_irq(unsigned int irq_plug) | 74 | static void beatic_unmask_irq(struct irq_data *d) |
75 | { | 75 | { |
76 | unsigned long flags; | 76 | unsigned long flags; |
77 | 77 | ||
78 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); | 78 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); |
79 | beatic_irq_mask_enable[irq_plug/64] |= 1UL << (63 - (irq_plug%64)); | 79 | beatic_irq_mask_enable[d->irq/64] |= 1UL << (63 - (d->irq%64)); |
80 | beatic_update_irq_mask(irq_plug); | 80 | beatic_update_irq_mask(d->irq); |
81 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); | 81 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); |
82 | } | 82 | } |
83 | 83 | ||
84 | static void beatic_ack_irq(unsigned int irq_plug) | 84 | static void beatic_ack_irq(struct irq_data *d) |
85 | { | 85 | { |
86 | unsigned long flags; | 86 | unsigned long flags; |
87 | 87 | ||
88 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); | 88 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); |
89 | beatic_irq_mask_ack[irq_plug/64] &= ~(1UL << (63 - (irq_plug%64))); | 89 | beatic_irq_mask_ack[d->irq/64] &= ~(1UL << (63 - (d->irq%64))); |
90 | beatic_update_irq_mask(irq_plug); | 90 | beatic_update_irq_mask(d->irq); |
91 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); | 91 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); |
92 | } | 92 | } |
93 | 93 | ||
94 | static void beatic_end_irq(unsigned int irq_plug) | 94 | static void beatic_end_irq(struct irq_data *d) |
95 | { | 95 | { |
96 | s64 err; | 96 | s64 err; |
97 | unsigned long flags; | 97 | unsigned long flags; |
98 | 98 | ||
99 | err = beat_downcount_of_interrupt(irq_plug); | 99 | err = beat_downcount_of_interrupt(d->irq); |
100 | if (err != 0) { | 100 | if (err != 0) { |
101 | if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */ | 101 | if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */ |
102 | panic("Failed to downcount IRQ! Error = %16llx", err); | 102 | panic("Failed to downcount IRQ! Error = %16llx", err); |
103 | 103 | ||
104 | printk(KERN_ERR "IRQ over-downcounted, plug %d\n", irq_plug); | 104 | printk(KERN_ERR "IRQ over-downcounted, plug %d\n", d->irq); |
105 | } | 105 | } |
106 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); | 106 | raw_spin_lock_irqsave(&beatic_irq_mask_lock, flags); |
107 | beatic_irq_mask_ack[irq_plug/64] |= 1UL << (63 - (irq_plug%64)); | 107 | beatic_irq_mask_ack[d->irq/64] |= 1UL << (63 - (d->irq%64)); |
108 | beatic_update_irq_mask(irq_plug); | 108 | beatic_update_irq_mask(d->irq); |
109 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); | 109 | raw_spin_unlock_irqrestore(&beatic_irq_mask_lock, flags); |
110 | } | 110 | } |
111 | 111 | ||
112 | static struct irq_chip beatic_pic = { | 112 | static struct irq_chip beatic_pic = { |
113 | .name = "CELL-BEAT", | 113 | .name = "CELL-BEAT", |
114 | .unmask = beatic_unmask_irq, | 114 | .irq_unmask = beatic_unmask_irq, |
115 | .mask = beatic_mask_irq, | 115 | .irq_mask = beatic_mask_irq, |
116 | .eoi = beatic_end_irq, | 116 | .irq_eoi = beatic_end_irq, |
117 | }; | 117 | }; |
118 | 118 | ||
119 | /* | 119 | /* |
@@ -232,7 +232,7 @@ unsigned int beatic_get_irq(void) | |||
232 | 232 | ||
233 | ret = beatic_get_irq_plug(); | 233 | ret = beatic_get_irq_plug(); |
234 | if (ret != NO_IRQ) | 234 | if (ret != NO_IRQ) |
235 | beatic_ack_irq(ret); | 235 | beatic_ack_irq(irq_get_irq_data(ret)); |
236 | return ret; | 236 | return ret; |
237 | } | 237 | } |
238 | 238 | ||
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 10eb1a443626..624d26e72f1d 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -72,15 +72,15 @@ static irq_hw_number_t iic_pending_to_hwnum(struct cbe_iic_pending_bits bits) | |||
72 | return (node << IIC_IRQ_NODE_SHIFT) | (class << 4) | unit; | 72 | return (node << IIC_IRQ_NODE_SHIFT) | (class << 4) | unit; |
73 | } | 73 | } |
74 | 74 | ||
75 | static void iic_mask(unsigned int irq) | 75 | static void iic_mask(struct irq_data *d) |
76 | { | 76 | { |
77 | } | 77 | } |
78 | 78 | ||
79 | static void iic_unmask(unsigned int irq) | 79 | static void iic_unmask(struct irq_data *d) |
80 | { | 80 | { |
81 | } | 81 | } |
82 | 82 | ||
83 | static void iic_eoi(unsigned int irq) | 83 | static void iic_eoi(struct irq_data *d) |
84 | { | 84 | { |
85 | struct iic *iic = &__get_cpu_var(cpu_iic); | 85 | struct iic *iic = &__get_cpu_var(cpu_iic); |
86 | out_be64(&iic->regs->prio, iic->eoi_stack[--iic->eoi_ptr]); | 86 | out_be64(&iic->regs->prio, iic->eoi_stack[--iic->eoi_ptr]); |
@@ -89,19 +89,21 @@ static void iic_eoi(unsigned int irq) | |||
89 | 89 | ||
90 | static struct irq_chip iic_chip = { | 90 | static struct irq_chip iic_chip = { |
91 | .name = "CELL-IIC", | 91 | .name = "CELL-IIC", |
92 | .mask = iic_mask, | 92 | .irq_mask = iic_mask, |
93 | .unmask = iic_unmask, | 93 | .irq_unmask = iic_unmask, |
94 | .eoi = iic_eoi, | 94 | .irq_eoi = iic_eoi, |
95 | }; | 95 | }; |
96 | 96 | ||
97 | 97 | ||
98 | static void iic_ioexc_eoi(unsigned int irq) | 98 | static void iic_ioexc_eoi(struct irq_data *d) |
99 | { | 99 | { |
100 | } | 100 | } |
101 | 101 | ||
102 | static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc) | 102 | static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc) |
103 | { | 103 | { |
104 | struct cbe_iic_regs __iomem *node_iic = (void __iomem *)desc->handler_data; | 104 | struct irq_chip *chip = get_irq_desc_chip(desc); |
105 | struct cbe_iic_regs __iomem *node_iic = | ||
106 | (void __iomem *)get_irq_desc_data(desc); | ||
105 | unsigned int base = (irq & 0xffffff00) | IIC_IRQ_TYPE_IOEXC; | 107 | unsigned int base = (irq & 0xffffff00) | IIC_IRQ_TYPE_IOEXC; |
106 | unsigned long bits, ack; | 108 | unsigned long bits, ack; |
107 | int cascade; | 109 | int cascade; |
@@ -128,15 +130,15 @@ static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc) | |||
128 | if (ack) | 130 | if (ack) |
129 | out_be64(&node_iic->iic_is, ack); | 131 | out_be64(&node_iic->iic_is, ack); |
130 | } | 132 | } |
131 | desc->chip->eoi(irq); | 133 | chip->irq_eoi(&desc->irq_data); |
132 | } | 134 | } |
133 | 135 | ||
134 | 136 | ||
135 | static struct irq_chip iic_ioexc_chip = { | 137 | static struct irq_chip iic_ioexc_chip = { |
136 | .name = "CELL-IOEX", | 138 | .name = "CELL-IOEX", |
137 | .mask = iic_mask, | 139 | .irq_mask = iic_mask, |
138 | .unmask = iic_unmask, | 140 | .irq_unmask = iic_unmask, |
139 | .eoi = iic_ioexc_eoi, | 141 | .irq_eoi = iic_ioexc_eoi, |
140 | }; | 142 | }; |
141 | 143 | ||
142 | /* Get an IRQ number from the pending state register of the IIC */ | 144 | /* Get an IRQ number from the pending state register of the IIC */ |
@@ -237,6 +239,8 @@ extern int noirqdebug; | |||
237 | 239 | ||
238 | static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) | 240 | static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) |
239 | { | 241 | { |
242 | struct irq_chip *chip = get_irq_desc_chip(desc); | ||
243 | |||
240 | raw_spin_lock(&desc->lock); | 244 | raw_spin_lock(&desc->lock); |
241 | 245 | ||
242 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | 246 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); |
@@ -275,7 +279,7 @@ static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) | |||
275 | 279 | ||
276 | desc->status &= ~IRQ_INPROGRESS; | 280 | desc->status &= ~IRQ_INPROGRESS; |
277 | out_eoi: | 281 | out_eoi: |
278 | desc->chip->eoi(irq); | 282 | chip->irq_eoi(&desc->irq_data); |
279 | raw_spin_unlock(&desc->lock); | 283 | raw_spin_unlock(&desc->lock); |
280 | } | 284 | } |
281 | 285 | ||
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index 691995761b3d..6a28d027d959 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c | |||
@@ -187,13 +187,15 @@ machine_subsys_initcall(cell, cell_publish_devices); | |||
187 | 187 | ||
188 | static void cell_mpic_cascade(unsigned int irq, struct irq_desc *desc) | 188 | static void cell_mpic_cascade(unsigned int irq, struct irq_desc *desc) |
189 | { | 189 | { |
190 | struct mpic *mpic = desc->handler_data; | 190 | struct irq_chip *chip = get_irq_desc_chip(desc); |
191 | struct mpic *mpic = get_irq_desc_data(desc); | ||
191 | unsigned int virq; | 192 | unsigned int virq; |
192 | 193 | ||
193 | virq = mpic_get_one_irq(mpic); | 194 | virq = mpic_get_one_irq(mpic); |
194 | if (virq != NO_IRQ) | 195 | if (virq != NO_IRQ) |
195 | generic_handle_irq(virq); | 196 | generic_handle_irq(virq); |
196 | desc->chip->eoi(irq); | 197 | |
198 | chip->irq_eoi(&desc->irq_data); | ||
197 | } | 199 | } |
198 | 200 | ||
199 | static void __init mpic_init_IRQ(void) | 201 | static void __init mpic_init_IRQ(void) |
diff --git a/arch/powerpc/platforms/cell/spider-pic.c b/arch/powerpc/platforms/cell/spider-pic.c index 3f2e557344a3..b38cdfc1deb8 100644 --- a/arch/powerpc/platforms/cell/spider-pic.c +++ b/arch/powerpc/platforms/cell/spider-pic.c | |||
@@ -79,30 +79,30 @@ static void __iomem *spider_get_irq_config(struct spider_pic *pic, | |||
79 | return pic->regs + TIR_CFGA + 8 * src; | 79 | return pic->regs + TIR_CFGA + 8 * src; |
80 | } | 80 | } |
81 | 81 | ||
82 | static void spider_unmask_irq(unsigned int virq) | 82 | static void spider_unmask_irq(struct irq_data *d) |
83 | { | 83 | { |
84 | struct spider_pic *pic = spider_virq_to_pic(virq); | 84 | struct spider_pic *pic = spider_virq_to_pic(d->irq); |
85 | void __iomem *cfg = spider_get_irq_config(pic, irq_map[virq].hwirq); | 85 | void __iomem *cfg = spider_get_irq_config(pic, irq_map[d->irq].hwirq); |
86 | 86 | ||
87 | out_be32(cfg, in_be32(cfg) | 0x30000000u); | 87 | out_be32(cfg, in_be32(cfg) | 0x30000000u); |
88 | } | 88 | } |
89 | 89 | ||
90 | static void spider_mask_irq(unsigned int virq) | 90 | static void spider_mask_irq(struct irq_data *d) |
91 | { | 91 | { |
92 | struct spider_pic *pic = spider_virq_to_pic(virq); | 92 | struct spider_pic *pic = spider_virq_to_pic(d->irq); |
93 | void __iomem *cfg = spider_get_irq_config(pic, irq_map[virq].hwirq); | 93 | void __iomem *cfg = spider_get_irq_config(pic, irq_map[d->irq].hwirq); |
94 | 94 | ||
95 | out_be32(cfg, in_be32(cfg) & ~0x30000000u); | 95 | out_be32(cfg, in_be32(cfg) & ~0x30000000u); |
96 | } | 96 | } |
97 | 97 | ||
98 | static void spider_ack_irq(unsigned int virq) | 98 | static void spider_ack_irq(struct irq_data *d) |
99 | { | 99 | { |
100 | struct spider_pic *pic = spider_virq_to_pic(virq); | 100 | struct spider_pic *pic = spider_virq_to_pic(d->irq); |
101 | unsigned int src = irq_map[virq].hwirq; | 101 | unsigned int src = irq_map[d->irq].hwirq; |
102 | 102 | ||
103 | /* Reset edge detection logic if necessary | 103 | /* Reset edge detection logic if necessary |
104 | */ | 104 | */ |
105 | if (irq_to_desc(virq)->status & IRQ_LEVEL) | 105 | if (irq_to_desc(d->irq)->status & IRQ_LEVEL) |
106 | return; | 106 | return; |
107 | 107 | ||
108 | /* Only interrupts 47 to 50 can be set to edge */ | 108 | /* Only interrupts 47 to 50 can be set to edge */ |
@@ -113,13 +113,13 @@ static void spider_ack_irq(unsigned int virq) | |||
113 | out_be32(pic->regs + TIR_EDC, 0x100 | (src & 0xf)); | 113 | out_be32(pic->regs + TIR_EDC, 0x100 | (src & 0xf)); |
114 | } | 114 | } |
115 | 115 | ||
116 | static int spider_set_irq_type(unsigned int virq, unsigned int type) | 116 | static int spider_set_irq_type(struct irq_data *d, unsigned int type) |
117 | { | 117 | { |
118 | unsigned int sense = type & IRQ_TYPE_SENSE_MASK; | 118 | unsigned int sense = type & IRQ_TYPE_SENSE_MASK; |
119 | struct spider_pic *pic = spider_virq_to_pic(virq); | 119 | struct spider_pic *pic = spider_virq_to_pic(d->irq); |
120 | unsigned int hw = irq_map[virq].hwirq; | 120 | unsigned int hw = irq_map[d->irq].hwirq; |
121 | void __iomem *cfg = spider_get_irq_config(pic, hw); | 121 | void __iomem *cfg = spider_get_irq_config(pic, hw); |
122 | struct irq_desc *desc = irq_to_desc(virq); | 122 | struct irq_desc *desc = irq_to_desc(d->irq); |
123 | u32 old_mask; | 123 | u32 old_mask; |
124 | u32 ic; | 124 | u32 ic; |
125 | 125 | ||
@@ -169,10 +169,10 @@ static int spider_set_irq_type(unsigned int virq, unsigned int type) | |||
169 | 169 | ||
170 | static struct irq_chip spider_pic = { | 170 | static struct irq_chip spider_pic = { |
171 | .name = "SPIDER", | 171 | .name = "SPIDER", |
172 | .unmask = spider_unmask_irq, | 172 | .irq_unmask = spider_unmask_irq, |
173 | .mask = spider_mask_irq, | 173 | .irq_mask = spider_mask_irq, |
174 | .ack = spider_ack_irq, | 174 | .irq_ack = spider_ack_irq, |
175 | .set_type = spider_set_irq_type, | 175 | .irq_set_type = spider_set_irq_type, |
176 | }; | 176 | }; |
177 | 177 | ||
178 | static int spider_host_map(struct irq_host *h, unsigned int virq, | 178 | static int spider_host_map(struct irq_host *h, unsigned int virq, |
@@ -207,7 +207,8 @@ static struct irq_host_ops spider_host_ops = { | |||
207 | 207 | ||
208 | static void spider_irq_cascade(unsigned int irq, struct irq_desc *desc) | 208 | static void spider_irq_cascade(unsigned int irq, struct irq_desc *desc) |
209 | { | 209 | { |
210 | struct spider_pic *pic = desc->handler_data; | 210 | struct irq_chip *chip = get_irq_desc_chip(desc); |
211 | struct spider_pic *pic = get_irq_desc_data(desc); | ||
211 | unsigned int cs, virq; | 212 | unsigned int cs, virq; |
212 | 213 | ||
213 | cs = in_be32(pic->regs + TIR_CS) >> 24; | 214 | cs = in_be32(pic->regs + TIR_CS) >> 24; |
@@ -215,9 +216,11 @@ static void spider_irq_cascade(unsigned int irq, struct irq_desc *desc) | |||
215 | virq = NO_IRQ; | 216 | virq = NO_IRQ; |
216 | else | 217 | else |
217 | virq = irq_linear_revmap(pic->host, cs); | 218 | virq = irq_linear_revmap(pic->host, cs); |
219 | |||
218 | if (virq != NO_IRQ) | 220 | if (virq != NO_IRQ) |
219 | generic_handle_irq(virq); | 221 | generic_handle_irq(virq); |
220 | desc->chip->eoi(irq); | 222 | |
223 | chip->irq_eoi(&desc->irq_data); | ||
221 | } | 224 | } |
222 | 225 | ||
223 | /* For hooking up the cascace we have a problem. Our device-tree is | 226 | /* For hooking up the cascace we have a problem. Our device-tree is |