Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a891b393 authored by Kyle McMartin's avatar Kyle McMartin Committed by Matt Turner
Browse files

alpha: irq clean up



Stop touching irq_desc[irq] directly, instead use accessor
functions provided. Use irq_has_action instead of directly
testing the irq_desc.

Tested-by: default avatarMichael Cree <mcree@orcon.net.nz>
Signed-off-by: default avatarKyle McMartin <kyle@redhat.com>
Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
parent d5ccde0a
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -44,10 +44,11 @@ static char irq_user_affinity[NR_IRQS];

int irq_select_affinity(unsigned int irq)
{
	struct irq_desc *desc = irq_to_desc[irq];
	static int last_cpu;
	int cpu = last_cpu + 1;

	if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq])
	if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq])
		return 1;

	while (!cpu_possible(cpu) ||
@@ -55,8 +56,8 @@ int irq_select_affinity(unsigned int irq)
		cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
	last_cpu = cpu;

	cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu));
	irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu));
	cpumask_copy(desc->affinity, cpumask_of(cpu));
	get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu));
	return 0;
}
#endif /* CONFIG_SMP */
@@ -67,6 +68,7 @@ show_interrupts(struct seq_file *p, void *v)
	int j;
	int irq = *(loff_t *) v;
	struct irqaction * action;
	struct irq_desc *desc;
	unsigned long flags;

#ifdef CONFIG_SMP
@@ -79,8 +81,13 @@ show_interrupts(struct seq_file *p, void *v)
#endif

	if (irq < ACTUAL_NR_IRQS) {
		raw_spin_lock_irqsave(&irq_desc[irq].lock, flags);
		action = irq_desc[irq].action;
		desc = irq_to_desc(irq);

		if (!desc)
			return 0;

		raw_spin_lock_irqsave(&desc->lock, flags);
		action = desc->action;
		if (!action) 
			goto unlock;
		seq_printf(p, "%3d: ", irq);
@@ -90,7 +97,7 @@ show_interrupts(struct seq_file *p, void *v)
		for_each_online_cpu(j)
			seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j));
#endif
		seq_printf(p, " %14s", irq_desc[irq].chip->name);
		seq_printf(p, " %14s", get_irq_desc_chip(desc)->name);
		seq_printf(p, "  %c%s",
			(action->flags & IRQF_DISABLED)?'+':' ',
			action->name);
@@ -103,7 +110,7 @@ show_interrupts(struct seq_file *p, void *v)

		seq_putc(p, '\n');
unlock:
		raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
		raw_spin_unlock_irqrestore(&desc->lock, flags);
	} else if (irq == ACTUAL_NR_IRQS) {
#ifdef CONFIG_SMP
		seq_puts(p, "IPI: ");
@@ -142,8 +149,10 @@ handle_irq(int irq)
	 * handled by some other CPU. (or is disabled)
	 */
	static unsigned int illegal_count=0;
	struct irq_desc *desc = irq_to_desc(irq);
	
	if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
	if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS &&
	    illegal_count < MAX_ILLEGAL_IRQS)) {
		irq_err_count++;
		illegal_count++;
		printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
@@ -159,7 +168,7 @@ handle_irq(int irq)
	 * at IPL 0.
	 */
	local_irq_disable();
	generic_handle_irq(irq);
	generic_handle_irq_desc(irq, desc);
	irq_exit();
}

+7 −3
Original line number Diff line number Diff line
@@ -241,10 +241,14 @@ static struct irq_chip rtc_irq_type = {
void __init
init_rtc_irq(void)
{
	irq_desc[RTC_IRQ].status = IRQ_DISABLED;
	irq_desc[RTC_IRQ].chip = &rtc_irq_type;
	struct irq_desc *desc = irq_to_desc(RTC_IRQ);

	if (desc) {
		desc->status |= IRQ_DISABLED;
		set_irq_chip(RTC_IRQ, &rtc_irq_type);
		setup_irq(RTC_IRQ, &timer_irqaction);
	}
}

/* Dummy irqactions.  */
struct irqaction isa_cascade_irqaction = {
+2 −1
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@ i8259a_startup_irq(unsigned int irq)
void
i8259a_end_irq(unsigned int irq)
{
	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
	struct irq_desc *desc = irq_to_desc(irq);
	if (desc || !(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		i8259a_enable_irq(irq);
}

+3 −2
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ pyxis_startup_irq(unsigned int irq)
static void
pyxis_end_irq(unsigned int irq)
{
	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
	struct irq_desc *desc = irq_to_desc(irq);
	if (desc || !(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		pyxis_enable_irq(irq);
}

@@ -120,7 +121,7 @@ init_pyxis_irqs(unsigned long ignore_mask)
		if ((ignore_mask >> i) & 1)
			continue;
		set_irq_chip_and_handler(i, &pyxis_irq_type, alpha_do_IRQ);
		irq_desc[i].status |= IRQ_LEVEL;
		irq_to_desc(i)->status |= IRQ_LEVEL;
	}

	setup_irq(16+7, &isa_cascade_irqaction);
+2 −2
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ srm_startup_irq(unsigned int irq)
static void
srm_end_irq(unsigned int irq)
{
	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
	if (!(irq_to_desc(irq)->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		srm_enable_irq(irq);
}

@@ -68,8 +68,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)
	for (i = 16; i < max; ++i) {
		if (i < 64 && ((ignore_mask >> i) & 1))
			continue;
		irq_desc[i].status |= IRQ_LEVEL;
		set_irq_chip_and_handler(i, &srm_irq_type, alpha_do_IRQ);
		irq_to_desc(i)->status |= IRQ_LEVEL;
	}
}

Loading