aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/cell/spider-pic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/platforms/cell/spider-pic.c')
-rw-r--r--arch/powerpc/platforms/cell/spider-pic.c43
1 files changed, 23 insertions, 20 deletions
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
82static void spider_unmask_irq(unsigned int virq) 82static 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
90static void spider_mask_irq(unsigned int virq) 90static 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
98static void spider_ack_irq(unsigned int virq) 98static 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
116static int spider_set_irq_type(unsigned int virq, unsigned int type) 116static 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
170static struct irq_chip spider_pic = { 170static 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
178static int spider_host_map(struct irq_host *h, unsigned int virq, 178static 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
208static void spider_irq_cascade(unsigned int irq, struct irq_desc *desc) 208static 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