Lines Matching +full:cpu +full:- +full:intc
77 static inline unsigned int reg_status(struct bcm7038_l1_chip *intc, in reg_status() argument
80 return (0 * intc->n_words + word) * sizeof(u32); in reg_status()
83 static inline unsigned int reg_mask_status(struct bcm7038_l1_chip *intc, in reg_mask_status() argument
86 return (1 * intc->n_words + word) * sizeof(u32); in reg_mask_status()
89 static inline unsigned int reg_mask_set(struct bcm7038_l1_chip *intc, in reg_mask_set() argument
92 return (2 * intc->n_words + word) * sizeof(u32); in reg_mask_set()
95 static inline unsigned int reg_mask_clr(struct bcm7038_l1_chip *intc, in reg_mask_clr() argument
98 return (3 * intc->n_words + word) * sizeof(u32); in reg_mask_clr()
119 struct bcm7038_l1_chip *intc = irq_desc_get_handler_data(desc); in bcm7038_l1_irq_handle() local
120 struct bcm7038_l1_cpu *cpu; in bcm7038_l1_irq_handle() local
125 cpu = intc->cpus[cpu_logical_map(smp_processor_id())]; in bcm7038_l1_irq_handle()
127 cpu = intc->cpus[0]; in bcm7038_l1_irq_handle()
132 for (idx = 0; idx < intc->n_words; idx++) { in bcm7038_l1_irq_handle()
137 raw_spin_lock_irqsave(&intc->lock, flags); in bcm7038_l1_irq_handle()
138 pending = l1_readl(cpu->map_base + reg_status(intc, idx)) & in bcm7038_l1_irq_handle()
139 ~cpu->mask_cache[idx]; in bcm7038_l1_irq_handle()
140 raw_spin_unlock_irqrestore(&intc->lock, flags); in bcm7038_l1_irq_handle()
143 generic_handle_irq(irq_find_mapping(intc->domain, in bcm7038_l1_irq_handle()
153 struct bcm7038_l1_chip *intc = irq_data_get_irq_chip_data(d); in __bcm7038_l1_unmask() local
154 u32 word = d->hwirq / IRQS_PER_WORD; in __bcm7038_l1_unmask()
155 u32 mask = BIT(d->hwirq % IRQS_PER_WORD); in __bcm7038_l1_unmask()
157 intc->cpus[cpu_idx]->mask_cache[word] &= ~mask; in __bcm7038_l1_unmask()
158 l1_writel(mask, intc->cpus[cpu_idx]->map_base + in __bcm7038_l1_unmask()
159 reg_mask_clr(intc, word)); in __bcm7038_l1_unmask()
164 struct bcm7038_l1_chip *intc = irq_data_get_irq_chip_data(d); in __bcm7038_l1_mask() local
165 u32 word = d->hwirq / IRQS_PER_WORD; in __bcm7038_l1_mask()
166 u32 mask = BIT(d->hwirq % IRQS_PER_WORD); in __bcm7038_l1_mask()
168 intc->cpus[cpu_idx]->mask_cache[word] |= mask; in __bcm7038_l1_mask()
169 l1_writel(mask, intc->cpus[cpu_idx]->map_base + in __bcm7038_l1_mask()
170 reg_mask_set(intc, word)); in __bcm7038_l1_mask()
175 struct bcm7038_l1_chip *intc = irq_data_get_irq_chip_data(d); in bcm7038_l1_unmask() local
178 raw_spin_lock_irqsave(&intc->lock, flags); in bcm7038_l1_unmask()
179 __bcm7038_l1_unmask(d, intc->affinity[d->hwirq]); in bcm7038_l1_unmask()
180 raw_spin_unlock_irqrestore(&intc->lock, flags); in bcm7038_l1_unmask()
185 struct bcm7038_l1_chip *intc = irq_data_get_irq_chip_data(d); in bcm7038_l1_mask() local
188 raw_spin_lock_irqsave(&intc->lock, flags); in bcm7038_l1_mask()
189 __bcm7038_l1_mask(d, intc->affinity[d->hwirq]); in bcm7038_l1_mask()
190 raw_spin_unlock_irqrestore(&intc->lock, flags); in bcm7038_l1_mask()
197 struct bcm7038_l1_chip *intc = irq_data_get_irq_chip_data(d); in bcm7038_l1_set_affinity() local
199 irq_hw_number_t hw = d->hwirq; in bcm7038_l1_set_affinity()
205 raw_spin_lock_irqsave(&intc->lock, flags); in bcm7038_l1_set_affinity()
207 was_disabled = !!(intc->cpus[intc->affinity[hw]]->mask_cache[word] & in bcm7038_l1_set_affinity()
209 __bcm7038_l1_mask(d, intc->affinity[hw]); in bcm7038_l1_set_affinity()
210 intc->affinity[hw] = first_cpu; in bcm7038_l1_set_affinity()
214 raw_spin_unlock_irqrestore(&intc->lock, flags); in bcm7038_l1_set_affinity()
224 int cpu = smp_processor_id(); in bcm7038_l1_cpu_offline() local
227 /* This CPU was not on the affinity mask */ in bcm7038_l1_cpu_offline()
228 if (!cpumask_test_cpu(cpu, mask)) in bcm7038_l1_cpu_offline()
233 * Multiple CPU affinity, remove this CPU from the affinity in bcm7038_l1_cpu_offline()
237 cpumask_clear_cpu(cpu, &new_affinity); in bcm7038_l1_cpu_offline()
239 /* Only CPU, put on the lowest online CPU */ in bcm7038_l1_cpu_offline()
249 struct bcm7038_l1_chip *intc) in bcm7038_l1_init_one() argument
253 struct bcm7038_l1_cpu *cpu; in bcm7038_l1_init_one() local
257 return -EINVAL; in bcm7038_l1_init_one()
262 return -EINVAL; in bcm7038_l1_init_one()
263 else if (!intc->n_words) in bcm7038_l1_init_one()
264 intc->n_words = n_words; in bcm7038_l1_init_one()
265 else if (intc->n_words != n_words) in bcm7038_l1_init_one()
266 return -EINVAL; in bcm7038_l1_init_one()
268 cpu = intc->cpus[idx] = kzalloc(sizeof(*cpu) + n_words * sizeof(u32), in bcm7038_l1_init_one()
270 if (!cpu) in bcm7038_l1_init_one()
271 return -ENOMEM; in bcm7038_l1_init_one()
273 cpu->map_base = ioremap(res.start, sz); in bcm7038_l1_init_one()
274 if (!cpu->map_base) in bcm7038_l1_init_one()
275 return -ENOMEM; in bcm7038_l1_init_one()
278 l1_writel(0xffffffff, cpu->map_base + reg_mask_set(intc, i)); in bcm7038_l1_init_one()
279 cpu->mask_cache[i] = 0xffffffff; in bcm7038_l1_init_one()
285 return -EINVAL; in bcm7038_l1_init_one()
288 if (of_property_read_bool(dn, "brcm,irq-can-wake")) in bcm7038_l1_init_one()
292 intc); in bcm7038_l1_init_one()
298 .name = "bcm7038-l1",
311 irq_set_chip_data(virq, d->host_data); in bcm7038_l1_map()
324 struct bcm7038_l1_chip *intc; in bcm7038_l1_of_init() local
327 intc = kzalloc(sizeof(*intc), GFP_KERNEL); in bcm7038_l1_of_init()
328 if (!intc) in bcm7038_l1_of_init()
329 return -ENOMEM; in bcm7038_l1_of_init()
331 raw_spin_lock_init(&intc->lock); in bcm7038_l1_of_init()
333 ret = bcm7038_l1_init_one(dn, idx, intc); in bcm7038_l1_of_init()
337 pr_err("failed to remap intc L1 registers\n"); in bcm7038_l1_of_init()
342 intc->domain = irq_domain_add_linear(dn, IRQS_PER_WORD * intc->n_words, in bcm7038_l1_of_init()
344 intc); in bcm7038_l1_of_init()
345 if (!intc->domain) { in bcm7038_l1_of_init()
346 ret = -ENOMEM; in bcm7038_l1_of_init()
354 struct bcm7038_l1_cpu *cpu = intc->cpus[idx]; in bcm7038_l1_of_init() local
356 if (cpu) { in bcm7038_l1_of_init()
357 if (cpu->map_base) in bcm7038_l1_of_init()
358 iounmap(cpu->map_base); in bcm7038_l1_of_init()
359 kfree(cpu); in bcm7038_l1_of_init()
363 kfree(intc); in bcm7038_l1_of_init()
367 IRQCHIP_DECLARE(bcm7038_l1, "brcm,bcm7038-l1-intc", bcm7038_l1_of_init);