diff options
Diffstat (limited to 'kernel/irq/irqdesc.c')
| -rw-r--r-- | kernel/irq/irqdesc.c | 36 | 
1 files changed, 28 insertions, 8 deletions
| diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 2c039c9b9383..4c60a50e66b2 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -22,7 +22,7 @@   */  static struct lock_class_key irq_desc_lock_class; -#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS) +#if defined(CONFIG_SMP)  static void __init init_irq_default_affinity(void)  {  	alloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT); @@ -257,13 +257,11 @@ int __init early_irq_init(void)  	count = ARRAY_SIZE(irq_desc);  	for (i = 0; i < count; i++) { -		desc[i].irq_data.irq = i; -		desc[i].irq_data.chip = &no_irq_chip;  		desc[i].kstat_irqs = alloc_percpu(unsigned int); -		irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS); -		alloc_masks(desc + i, GFP_KERNEL, node); -		desc_smp_init(desc + i, node); +		alloc_masks(&desc[i], GFP_KERNEL, node); +		raw_spin_lock_init(&desc[i].lock);  		lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); +		desc_set_defaults(i, &desc[i], node);  	}  	return arch_early_irq_init();  } @@ -290,6 +288,22 @@ static int irq_expand_nr_irqs(unsigned int nr)  #endif /* !CONFIG_SPARSE_IRQ */ +/** + * generic_handle_irq - Invoke the handler for a particular irq + * @irq:	The irq number to handle + * + */ +int generic_handle_irq(unsigned int irq) +{ +	struct irq_desc *desc = irq_to_desc(irq); + +	if (!desc) +		return -EINVAL; +	generic_handle_irq_desc(irq, desc); +	return 0; +} +EXPORT_SYMBOL_GPL(generic_handle_irq); +  /* Dynamic interrupt handling */  /** @@ -311,6 +325,7 @@ void irq_free_descs(unsigned int from, unsigned int cnt)  	bitmap_clear(allocated_irqs, from, cnt);  	mutex_unlock(&sparse_irq_lock);  } +EXPORT_SYMBOL_GPL(irq_free_descs);  /**   * irq_alloc_descs - allocate and initialize a range of irq descriptors @@ -329,6 +344,12 @@ irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node)  	if (!cnt)  		return -EINVAL; +	if (irq >= 0) { +		if (from > irq) +			return -EINVAL; +		from = irq; +	} +  	mutex_lock(&sparse_irq_lock);  	start = bitmap_find_next_zero_area(allocated_irqs, IRQ_BITMAP_BITS, @@ -351,6 +372,7 @@ err:  	mutex_unlock(&sparse_irq_lock);  	return ret;  } +EXPORT_SYMBOL_GPL(irq_alloc_descs);  /**   * irq_reserve_irqs - mark irqs allocated @@ -430,7 +452,6 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)  			*per_cpu_ptr(desc->kstat_irqs, cpu) : 0;  } -#ifdef CONFIG_GENERIC_HARDIRQS  unsigned int kstat_irqs(unsigned int irq)  {  	struct irq_desc *desc = irq_to_desc(irq); @@ -443,4 +464,3 @@ unsigned int kstat_irqs(unsigned int irq)  		sum += *per_cpu_ptr(desc->kstat_irqs, cpu);  	return sum;  } -#endif /* CONFIG_GENERIC_HARDIRQS */ | 
