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

Commit 06fcb0c6 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds
Browse files

[PATCH] genirq: cleanup: misc code cleanups



Assorted code cleanups to the generic IRQ code.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2e60bbb6
Loading
Loading
Loading
Loading
+32 −22
Original line number Diff line number Diff line
#ifndef __irq_h
#define __irq_h
#ifndef _LINUX_IRQ_H
#define _LINUX_IRQ_H

/*
 * Please do not include this file in generic code.  There is currently
@@ -11,7 +11,7 @@

#include <linux/smp.h>

#if !defined(CONFIG_S390)
#ifndef CONFIG_S390

#include <linux/linkage.h>
#include <linux/cache.h>
@@ -33,7 +33,7 @@
#define IRQ_WAITING	32	/* IRQ not yet seen - for autodetection */
#define IRQ_LEVEL	64	/* IRQ level triggered */
#define IRQ_MASKED	128	/* IRQ masked - shouldn't be seen again */
#if defined(ARCH_HAS_IRQ_PER_CPU)
#ifdef ARCH_HAS_IRQ_PER_CPU
# define IRQ_PER_CPU	256	/* IRQ is per CPU */
# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
#else
@@ -92,6 +92,7 @@ extern irq_desc_t irq_desc [NR_IRQS];
extern int setup_irq(unsigned int irq, struct irqaction *new);

#ifdef CONFIG_GENERIC_HARDIRQS

#ifdef CONFIG_SMP
static inline void set_native_irq_info(int irq, cpumask_t mask)
{
@@ -127,7 +128,7 @@ static inline void set_irq_info(int irq, cpumask_t mask)
{
}

#else // CONFIG_PCI_MSI
#else /* CONFIG_PCI_MSI */

static inline void move_irq(int irq)
{
@@ -138,26 +139,36 @@ static inline void set_irq_info(int irq, cpumask_t mask)
{
	set_native_irq_info(irq, mask);
}
#endif // CONFIG_PCI_MSI

#else	// CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE
#endif /* CONFIG_PCI_MSI */

#else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */

static inline void move_irq(int irq)
{
}

static inline void move_native_irq(int irq)
{
}

static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
{
}

#define move_irq(x)
#define move_native_irq(x)
#define set_pending_irq(x,y)
static inline void set_irq_info(int irq, cpumask_t mask)
{
	set_native_irq_info(irq, mask);
}

#endif // CONFIG_GENERIC_PENDING_IRQ
#endif /* CONFIG_GENERIC_PENDING_IRQ */

#else // CONFIG_SMP
#else /* CONFIG_SMP */

#define move_irq(x)
#define move_native_irq(x)

#endif // CONFIG_SMP
#endif /* CONFIG_SMP */

#ifdef CONFIG_IRQBALANCE
extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask);
@@ -186,17 +197,16 @@ extern void init_irq_proc(void);
#ifdef CONFIG_AUTO_IRQ_AFFINITY
extern int select_smp_affinity(unsigned int irq);
#else
static inline int
select_smp_affinity(unsigned int irq)
static inline int select_smp_affinity(unsigned int irq)
{
	return 1;
}
#endif

#endif
#endif /* CONFIG_GENERIC_HARDIRQS */

extern hw_irq_controller no_irq_type;  /* needed in every arch ? */

#endif
#endif /* !CONFIG_S390 */

#endif /* __irq_h */
#endif /* _LINUX_IRQ_H */
+7 −9
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ static DEFINE_MUTEX(probing_active);
 */
unsigned long probe_irq_on(void)
{
	unsigned long val;
	unsigned long mask;
	irq_desc_t *desc;
	unsigned int i;

@@ -40,8 +40,8 @@ unsigned long probe_irq_on(void)
		desc = irq_desc + i;

		spin_lock_irq(&desc->lock);
		if (!irq_desc[i].action)
			irq_desc[i].chip->startup(i);
		if (!desc->action)
			desc->chip->startup(i);
		spin_unlock_irq(&desc->lock);
	}

@@ -73,11 +73,11 @@ unsigned long probe_irq_on(void)
	/*
	 * Now filter out any obviously spurious interrupts
	 */
	val = 0;
	mask = 0;
	for (i = 0; i < NR_IRQS; i++) {
		irq_desc_t *desc = irq_desc + i;
		unsigned int status;

		desc = irq_desc + i;
		spin_lock_irq(&desc->lock);
		status = desc->status;

@@ -88,14 +88,13 @@ unsigned long probe_irq_on(void)
				desc->chip->shutdown(i);
			} else
				if (i < 32)
					val |= 1 << i;
					mask |= 1 << i;
		}
		spin_unlock_irq(&desc->lock);
	}

	return val;
	return mask;
}

EXPORT_SYMBOL(probe_irq_on);

/**
@@ -184,6 +183,5 @@ int probe_irq_off(unsigned long val)

	return irq_found;
}

EXPORT_SYMBOL(probe_irq_off);
+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
 * Linux has a controller-independent interrupt architecture.
 * Every controller has a 'controller-template', that is used
 * by the main code to do the right thing. Each driver-visible
 * interrupt source is transparently wired to the apropriate
 * interrupt source is transparently wired to the appropriate
 * controller. Thus drivers need not be aware of the
 * interrupt-controller.
 *
+12 −17
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ void synchronize_irq(unsigned int irq)
	while (desc->status & IRQ_INPROGRESS)
		cpu_relax();
}

EXPORT_SYMBOL(synchronize_irq);

#endif
@@ -71,7 +70,6 @@ void disable_irq_nosync(unsigned int irq)
	}
	spin_unlock_irqrestore(&desc->lock, flags);
}

EXPORT_SYMBOL(disable_irq_nosync);

/**
@@ -97,7 +95,6 @@ void disable_irq(unsigned int irq)
	if (desc->action)
		synchronize_irq(irq);
}

EXPORT_SYMBOL(disable_irq);

/**
@@ -139,7 +136,6 @@ void enable_irq(unsigned int irq)
	}
	spin_unlock_irqrestore(&desc->lock, flags);
}

EXPORT_SYMBOL(enable_irq);

/*
@@ -200,7 +196,8 @@ int setup_irq(unsigned int irq, struct irqaction * new)
	 */
	spin_lock_irqsave(&desc->lock, flags);
	p = &desc->action;
	if ((old = *p) != NULL) {
	old = *p;
	if (old) {
		/* Can't share interrupts unless both agree to */
		if (!(old->flags & new->flags & SA_SHIRQ))
			goto mismatch;
@@ -317,7 +314,6 @@ void free_irq(unsigned int irq, void *dev_id)
		return;
	}
}

EXPORT_SYMBOL(free_irq);

/**
@@ -388,6 +384,5 @@ int request_irq(unsigned int irq,

	return retval;
}

EXPORT_SYMBOL(request_irq);
+13 −10
Original line number Diff line number Diff line
@@ -16,22 +16,20 @@ static int irqfixup __read_mostly;
/*
 * Recovery handler for misrouted interrupts.
 */

static int misrouted_irq(int irq, struct pt_regs *regs)
{
	int i;
	irq_desc_t *desc;
	int ok = 0;
	int work = 0;	/* Did we do work for a real IRQ */

	for (i = 1; i < NR_IRQS; i++) {
		struct irq_desc *desc = irq_desc + i;
		struct irqaction *action;

		if (i == irq)	/* Already tried */
			continue;
		desc = &irq_desc[i];

		spin_lock(&desc->lock);
		action = desc->action;
		/* Already running on another processor */
		if (desc->status & IRQ_INPROGRESS) {
			/*
@@ -45,7 +43,9 @@ static int misrouted_irq(int irq, struct pt_regs *regs)
		}
		/* Honour the normal IRQ locking */
		desc->status |= IRQ_INPROGRESS;
		action = desc->action;
		spin_unlock(&desc->lock);

		while (action) {
			/* Only shared IRQ handlers are safe to call */
			if (action->flags & SA_SHIRQ) {
@@ -62,9 +62,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs)

		/*
		 * While we were looking for a fixup someone queued a real
		 * IRQ clashing with our walk
		 * IRQ clashing with our walk:
		 */

		while ((desc->status & IRQ_PENDING) && action) {
			/*
			 * Perform real IRQ processing for the IRQ we deferred
@@ -113,6 +112,7 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret)
	}
	dump_stack();
	printk(KERN_ERR "handlers:\n");

	action = desc->action;
	while (action) {
		printk(KERN_ERR "[<%p>]", action->handler);
@@ -123,7 +123,8 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret)
	}
}

static void report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret)
static void
report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret)
{
	static int count = 100;

@@ -177,6 +178,7 @@ int __init noirqdebug_setup(char *str)
{
	noirqdebug = 1;
	printk(KERN_INFO "IRQ lockup detection disabled\n");

	return 1;
}

@@ -187,6 +189,7 @@ static int __init irqfixup_setup(char *str)
	irqfixup = 1;
	printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n");
	printk(KERN_WARNING "This may impact system performance.\n");

	return 1;
}