176
176
EXPORT_SYMBOL(disable_percpu_irq);
178
178
/* Mask an interrupt. */
179
static void tile_irq_chip_mask(unsigned int irq)
179
static void tile_irq_chip_mask(struct irq_data *d)
181
mask_irqs(1UL << irq);
181
mask_irqs(1UL << d->irq);
184
184
/* Unmask an interrupt. */
185
static void tile_irq_chip_unmask(unsigned int irq)
185
static void tile_irq_chip_unmask(struct irq_data *d)
187
unmask_irqs(1UL << irq);
187
unmask_irqs(1UL << d->irq);
191
191
* Clear an interrupt before processing it so that any new assertions
192
192
* will trigger another irq.
194
static void tile_irq_chip_ack(unsigned int irq)
194
static void tile_irq_chip_ack(struct irq_data *d)
196
if ((unsigned long)get_irq_chip_data(irq) != IS_HW_CLEARED)
197
clear_irqs(1UL << irq);
196
if ((unsigned long)irq_data_get_irq_chip_data(d) != IS_HW_CLEARED)
197
clear_irqs(1UL << d->irq);
201
201
* For per-cpu interrupts, we need to avoid unmasking any interrupts
202
202
* that we disabled via disable_percpu_irq().
204
static void tile_irq_chip_eoi(unsigned int irq)
204
static void tile_irq_chip_eoi(struct irq_data *d)
206
if (!(__get_cpu_var(irq_disable_mask) & (1UL << irq)))
207
unmask_irqs(1UL << irq);
206
if (!(__get_cpu_var(irq_disable_mask) & (1UL << d->irq)))
207
unmask_irqs(1UL << d->irq);
210
210
static struct irq_chip tile_irq_chip = {
211
211
.name = "tile_irq_chip",
212
.ack = tile_irq_chip_ack,
213
.eoi = tile_irq_chip_eoi,
214
.mask = tile_irq_chip_mask,
215
.unmask = tile_irq_chip_unmask,
212
.irq_ack = tile_irq_chip_ack,
213
.irq_eoi = tile_irq_chip_eoi,
214
.irq_mask = tile_irq_chip_mask,
215
.irq_unmask = tile_irq_chip_unmask,
218
218
void __init init_IRQ(void)
241
241
irq_flow_handler_t handle = handle_level_irq;
242
242
if (tile_irq_type == TILE_IRQ_PERCPU)
243
243
handle = handle_percpu_irq;
244
set_irq_chip_and_handler(irq, &tile_irq_chip, handle);
244
irq_set_chip_and_handler(irq, &tile_irq_chip, handle);
247
247
* Flag interrupts that are hardware-cleared so that ack()
248
248
* won't clear them.
250
250
if (tile_irq_type == TILE_IRQ_HW_CLEAR)
251
set_irq_chip_data(irq, (void *)IS_HW_CLEARED);
251
irq_set_chip_data(irq, (void *)IS_HW_CLEARED);
253
253
EXPORT_SYMBOL(tile_irq_activate);
262
262
* Generic, controller-independent functions:
265
int show_interrupts(struct seq_file *p, void *v)
267
int i = *(loff_t *) v, j;
268
struct irqaction *action;
273
for (j = 0; j < NR_CPUS; j++)
275
seq_printf(p, "CPU%-8d", j);
280
raw_spin_lock_irqsave(&irq_desc[i].lock, flags);
281
action = irq_desc[i].action;
284
seq_printf(p, "%3d: ", i);
286
seq_printf(p, "%10u ", kstat_irqs(i));
288
for_each_online_cpu(j)
289
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
291
seq_printf(p, " %14s", irq_desc[i].chip->name);
292
seq_printf(p, " %s", action->name);
294
for (action = action->next; action; action = action->next)
295
seq_printf(p, ", %s", action->name);
299
raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags);
304
265
#if CHIP_HAS_IPI()
305
266
int create_irq(void)