diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-09-27 12:44:25 +0000 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-04 12:27:16 +0200 | 
| commit | ff7dcd44dd446db2c3e13bdedf2d52b8e0127f16 (patch) | |
| tree | ca03e829ea08aa536124a7777d99233dbbd89984 /kernel | |
| parent | 3bb9808e99bcc36eecb8e082bf70efb2a0bcdcb7 (diff) | |
| download | olio-linux-3.10-ff7dcd44dd446db2c3e13bdedf2d52b8e0127f16.tar.xz olio-linux-3.10-ff7dcd44dd446db2c3e13bdedf2d52b8e0127f16.zip  | |
genirq: Create irq_data
Low level chip functions need access to irq_desc->handler_data,
irq_desc->chip_data and irq_desc->msi_desc. We hand down the irq
number to the low level functions, so they need to lookup irq_desc.
With sparse irq this means a radix tree lookup.
We could hand down irq_desc itself, but low level chip functions have
no need to fiddle with it directly and we want to restrict access to
irq_desc further.
Preparatory patch for new chip functions.
Note, that the ugly anon union/struct is there to avoid a full tree
wide clean up for now. This is not going to last 3 years like __do_IRQ()
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20100927121841.645542300@linutronix.de>
Reviewed-by: H. Peter Anvin <hpa@zytor.com>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/handle.c | 39 | 
1 files changed, 19 insertions, 20 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 27e5c691122..099d4fc368c 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -75,12 +75,10 @@ EXPORT_SYMBOL_GPL(nr_irqs);  #ifdef CONFIG_SPARSE_IRQ  static struct irq_desc irq_desc_init = { -	.irq	    = -1, -	.status	    = IRQ_DISABLED, -	.chip	    = &no_irq_chip, -	.handle_irq = handle_bad_irq, -	.depth      = 1, -	.lock       = __RAW_SPIN_LOCK_UNLOCKED(irq_desc_init.lock), +	.status		= IRQ_DISABLED, +	.handle_irq	= handle_bad_irq, +	.depth		= 1, +	.lock		= __RAW_SPIN_LOCK_UNLOCKED(irq_desc_init.lock),  };  void __ref init_kstat_irqs(struct irq_desc *desc, int node, int nr) @@ -105,7 +103,7 @@ static void init_one_irq_desc(int irq, struct irq_desc *desc, int node)  	memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));  	raw_spin_lock_init(&desc->lock); -	desc->irq = irq; +	desc->irq_data.irq = irq;  #ifdef CONFIG_SMP  	desc->node = node;  #endif @@ -151,12 +149,10 @@ void replace_irq_desc(unsigned int irq, struct irq_desc *desc)  static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {  	[0 ... NR_IRQS_LEGACY-1] = { -		.irq	    = -1, -		.status	    = IRQ_DISABLED, -		.chip	    = &no_irq_chip, -		.handle_irq = handle_bad_irq, -		.depth	    = 1, -		.lock	    = __RAW_SPIN_LOCK_UNLOCKED(irq_desc_init.lock), +		.status		= IRQ_DISABLED, +		.handle_irq	= handle_bad_irq, +		.depth		= 1, +		.lock		= __RAW_SPIN_LOCK_UNLOCKED(irq_desc_init.lock),  	}  }; @@ -183,8 +179,11 @@ int __init early_irq_init(void)  	kstat_irqs_legacy = kzalloc_node(NR_IRQS_LEGACY * nr_cpu_ids *  					  sizeof(int), GFP_NOWAIT, node); +	irq_desc_init.irq_data.chip = &no_irq_chip; +  	for (i = 0; i < legacy_count; i++) { -		desc[i].irq = i; +		desc[i].irq_data.irq = i; +		desc[i].irq_data.chip = &no_irq_chip;  #ifdef CONFIG_SMP  		desc[i].node = node;  #endif @@ -241,11 +240,10 @@ out_unlock:  struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {  	[0 ... NR_IRQS-1] = { -		.status = IRQ_DISABLED, -		.chip = &no_irq_chip, -		.handle_irq = handle_bad_irq, -		.depth = 1, -		.lock = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock), +		.status		= IRQ_DISABLED, +		.handle_irq	= handle_bad_irq, +		.depth		= 1, +		.lock		= __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock),  	}  }; @@ -264,7 +262,8 @@ int __init early_irq_init(void)  	count = ARRAY_SIZE(irq_desc);  	for (i = 0; i < count; i++) { -		desc[i].irq = i; +		desc[i].irq_data.irq = i; +		desc[i].irq_data.chip = &no_irq_chip;  		alloc_desc_masks(&desc[i], 0, true);  		init_desc_masks(&desc[i]);  		desc[i].kstat_irqs = kstat_irqs_all[i];  |