diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-10-01 15:17:14 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-04 13:40:24 +0200 | 
| commit | bd151412263a67b5321e9dd1d5b4bf6d96fdebf3 (patch) | |
| tree | 7571b3eaf7ebc2ef200fb00688543f00a451c5f9 | |
| parent | 21e2b8c62cca8f7dbec0c8c131ca1637e4a5670f (diff) | |
| download | olio-linux-3.10-bd151412263a67b5321e9dd1d5b4bf6d96fdebf3.tar.xz olio-linux-3.10-bd151412263a67b5321e9dd1d5b4bf6d96fdebf3.zip  | |
genirq: Provide config option to disable deprecated code
This option covers now the old chip functions and the irq_desc data
fields which are moving to struct irq_data. More stuff will follow.
Pretty handy for testing a conversion, whether something broke or not.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | include/linux/irq.h | 8 | ||||
| -rw-r--r-- | kernel/irq/Kconfig | 4 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 8 | ||||
| -rw-r--r-- | kernel/irq/handle.c | 9 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 10 | ||||
| -rw-r--r-- | kernel/irq/spurious.c | 6 | 
6 files changed, 39 insertions, 6 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 0c83cbd2df4..82ed8231394 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -155,6 +155,7 @@ struct irq_data {   */  struct irq_chip {  	const char	*name; +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED  	unsigned int	(*startup)(unsigned int irq);  	void		(*shutdown)(unsigned int irq);  	void		(*enable)(unsigned int irq); @@ -175,7 +176,7 @@ struct irq_chip {  	void		(*bus_lock)(unsigned int irq);  	void		(*bus_sync_unlock)(unsigned int irq); - +#endif  	unsigned int	(*irq_startup)(struct irq_data *data);  	void		(*irq_shutdown)(struct irq_data *data);  	void		(*irq_enable)(struct irq_data *data); @@ -225,6 +226,9 @@ struct irq_2_iommu;   */  struct irq_desc { +#ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED +	struct irq_data		irq_data; +#else  	/*  	 * This union will go away, once we fixed the direct access to  	 * irq_desc all over the place. The direct fields are a 1:1 @@ -247,6 +251,8 @@ struct irq_desc {  #endif  		};  	}; +#endif +  	struct timer_rand_state *timer_rand_state;  	unsigned int            *kstat_irqs;  	irq_flow_handler_t	handle_irq; diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig index e0fc6cd78aa..a42c0191d71 100644 --- a/kernel/irq/Kconfig +++ b/kernel/irq/Kconfig @@ -12,6 +12,10 @@ config GENERIC_HARDIRQS  config GENERIC_HARDIRQS_NO__DO_IRQ         def_bool y +# Select this to disable the deprecated stuff +config GENERIC_HARDIRQS_NO_DEPRECATED +       def_bool n +  # Options selectable by the architecture code  config HAVE_SPARSE_IRQ         def_bool n diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index f2c4d28c508..323547983f1 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -324,6 +324,7 @@ static void default_shutdown(struct irq_data *data)  	desc->status |= IRQ_MASKED;  } +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED  /* Temporary migration helpers */  static void compat_irq_mask(struct irq_data *data)  { @@ -400,12 +401,14 @@ static void compat_bus_sync_unlock(struct irq_data *data)  {  	data->chip->bus_sync_unlock(data->irq);  } +#endif  /*   * Fixup enable/disable function pointers   */  void irq_chip_set_defaults(struct irq_chip *chip)  { +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED  	/*  	 * Compat fixup functions need to be before we set the  	 * defaults for enable/disable/startup/shutdown @@ -418,7 +421,7 @@ void irq_chip_set_defaults(struct irq_chip *chip)  		chip->irq_shutdown = compat_irq_shutdown;  	if (chip->startup)  		chip->irq_startup = compat_irq_startup; - +#endif  	/*  	 * The real defaults  	 */ @@ -437,6 +440,8 @@ void irq_chip_set_defaults(struct irq_chip *chip)  	if (!chip->irq_shutdown)  		chip->irq_shutdown = chip->irq_disable != default_disable ?  			chip->irq_disable : default_shutdown; + +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED  	if (!chip->end)  		chip->end = dummy_irq_chip.end; @@ -465,6 +470,7 @@ void irq_chip_set_defaults(struct irq_chip *chip)  		chip->irq_set_wake = compat_irq_set_wake;  	if (chip->retrigger)  		chip->irq_retrigger = compat_irq_retrigger; +#endif  }  static inline void mask_ack_irq(struct irq_desc *desc) diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 8d0697f892a..3fcef37154a 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -309,7 +309,12 @@ static unsigned int noop_ret(struct irq_data *data)  	return 0;  } +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED  static void compat_noop(unsigned int irq) { } +#define END_INIT .end = compat_noop +#else +#define END_INIT +#endif  /*   * Generic no controller implementation @@ -321,7 +326,7 @@ struct irq_chip no_irq_chip = {  	.irq_enable	= noop,  	.irq_disable	= noop,  	.irq_ack	= ack_bad, -	.end		= compat_noop, +	END_INIT  };  /* @@ -337,7 +342,7 @@ struct irq_chip dummy_irq_chip = {  	.irq_ack	= noop,  	.irq_mask	= noop,  	.irq_unmask	= noop, -	.end		= compat_noop, +	END_INIT  };  /* diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index ecafbfee5b1..b905f0ab1bb 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -42,6 +42,16 @@ extern int irq_select_affinity_usr(unsigned int irq);  extern void irq_set_thread_affinity(struct irq_desc *desc); +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED +static inline void irq_end(unsigned int irq, struct irq_desc *desc) +{ +	if (desc->irq_data.chip && desc->irq_data.chip->end) +		desc->irq_data.chip->end(irq); +} +#else +static inline void irq_end(unsigned int irq, struct irq_desc *desc) { } +#endif +  /* Inline functions for support of irq chips on slow busses */  static inline void chip_bus_lock(struct irq_desc *desc)  { diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index 9ee704d3a23..3089d3b9d5f 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c @@ -14,6 +14,8 @@  #include <linux/moduleparam.h>  #include <linux/timer.h> +#include "internals.h" +  static int irqfixup __read_mostly;  #define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10) @@ -78,8 +80,8 @@ static int try_one_irq(int irq, struct irq_desc *desc)  	 * If we did actual work for the real IRQ line we must let the  	 * IRQ controller clean up too  	 */ -	if (work && desc->irq_data.chip && desc->irq_data.chip->end) -		desc->irq_data.chip->end(irq); +	if (work) +		irq_end(irq, desc);  	raw_spin_unlock(&desc->lock);  	return ok;  |