diff options
Diffstat (limited to 'drivers/sh/intc')
| -rw-r--r-- | drivers/sh/intc/chip.c | 6 | ||||
| -rw-r--r-- | drivers/sh/intc/core.c | 4 | ||||
| -rw-r--r-- | drivers/sh/intc/internals.h | 10 | ||||
| -rw-r--r-- | drivers/sh/intc/virq.c | 29 | 
4 files changed, 23 insertions, 26 deletions
| diff --git a/drivers/sh/intc/chip.c b/drivers/sh/intc/chip.c index 46427b48e2f1..358df7510186 100644 --- a/drivers/sh/intc/chip.c +++ b/drivers/sh/intc/chip.c @@ -22,7 +22,7 @@ void _intc_enable(struct irq_data *data, unsigned long handle)  	for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_E(handle)); cpu++) {  #ifdef CONFIG_SMP -		if (!cpumask_test_cpu(cpu, data->affinity)) +		if (!cpumask_test_cpu(cpu, irq_data_get_affinity_mask(data)))  			continue;  #endif  		addr = INTC_REG(d, _INTC_ADDR_E(handle), cpu); @@ -50,7 +50,7 @@ static void intc_disable(struct irq_data *data)  	for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_D(handle)); cpu++) {  #ifdef CONFIG_SMP -		if (!cpumask_test_cpu(cpu, data->affinity)) +		if (!cpumask_test_cpu(cpu, irq_data_get_affinity_mask(data)))  			continue;  #endif  		addr = INTC_REG(d, _INTC_ADDR_D(handle), cpu); @@ -72,7 +72,7 @@ static int intc_set_affinity(struct irq_data *data,  	if (!cpumask_intersects(cpumask, cpu_online_mask))  		return -1; -	cpumask_copy(data->affinity, cpumask); +	cpumask_copy(irq_data_get_affinity_mask(data), cpumask);  	return IRQ_SET_MASK_OK_NOCOPY;  } diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 156b790072b4..8e72bcbd3d6d 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -65,9 +65,9 @@ void intc_set_prio_level(unsigned int irq, unsigned int level)  	raw_spin_unlock_irqrestore(&intc_big_lock, flags);  } -static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc) +static void intc_redirect_irq(struct irq_desc *desc)  { -	generic_handle_irq((unsigned int)irq_get_handler_data(irq)); +	generic_handle_irq((unsigned int)irq_desc_get_handler_data(desc));  }  static void __init intc_register_irq(struct intc_desc *desc, diff --git a/drivers/sh/intc/internals.h b/drivers/sh/intc/internals.h index 7dff08e2a071..6ce7f0d26dcf 100644 --- a/drivers/sh/intc/internals.h +++ b/drivers/sh/intc/internals.h @@ -99,15 +99,7 @@ static inline struct intc_desc_int *get_intc_desc(unsigned int irq)   */  static inline void activate_irq(int irq)  { -#ifdef CONFIG_ARM -	/* ARM requires an extra step to clear IRQ_NOREQUEST, which it -	 * sets on behalf of every irq_chip.  Also sets IRQ_NOPROBE. -	 */ -	set_irq_flags(irq, IRQF_VALID); -#else -	/* same effect on other architectures */ -	irq_set_noprobe(irq); -#endif +	irq_modify_status(irq, IRQ_NOREQUEST, IRQ_NOPROBE);  }  static inline int intc_handle_int_cmp(const void *a, const void *b) diff --git a/drivers/sh/intc/virq.c b/drivers/sh/intc/virq.c index f5f1b821241a..e7899624aa0b 100644 --- a/drivers/sh/intc/virq.c +++ b/drivers/sh/intc/virq.c @@ -83,12 +83,11 @@ EXPORT_SYMBOL_GPL(intc_irq_lookup);  static int add_virq_to_pirq(unsigned int irq, unsigned int virq)  { -	struct intc_virq_list **last, *entry; -	struct irq_data *data = irq_get_irq_data(irq); +	struct intc_virq_list *entry; +	struct intc_virq_list **last = NULL;  	/* scan for duplicates */ -	last = (struct intc_virq_list **)&data->handler_data; -	for_each_virq(entry, data->handler_data) { +	for_each_virq(entry, irq_get_handler_data(irq)) {  		if (entry->irq == virq)  			return 0;  		last = &entry->next; @@ -102,14 +101,18 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq)  	entry->irq = virq; -	*last = entry; +	if (last) +		*last = entry; +	else +		irq_set_handler_data(irq, entry);  	return 0;  } -static void intc_virq_handler(unsigned int irq, struct irq_desc *desc) +static void intc_virq_handler(struct irq_desc *desc)  { -	struct irq_data *data = irq_get_irq_data(irq); +	unsigned int irq = irq_desc_get_irq(desc); +	struct irq_data *data = irq_desc_get_irq_data(desc);  	struct irq_chip *chip = irq_data_get_irq_chip(data);  	struct intc_virq_list *entry, *vlist = irq_data_get_irq_handler_data(data);  	struct intc_desc_int *d = get_intc_desc(irq); @@ -118,12 +121,14 @@ static void intc_virq_handler(unsigned int irq, struct irq_desc *desc)  	for_each_virq(entry, vlist) {  		unsigned long addr, handle; +		struct irq_desc *vdesc = irq_to_desc(entry->irq); -		handle = (unsigned long)irq_get_handler_data(entry->irq); -		addr = INTC_REG(d, _INTC_ADDR_E(handle), 0); - -		if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0)) -			generic_handle_irq(entry->irq); +		if (vdesc) { +			handle = (unsigned long)irq_desc_get_handler_data(vdesc); +			addr = INTC_REG(d, _INTC_ADDR_E(handle), 0); +			if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0)) +				generic_handle_irq_desc(vdesc); +		}  	}  	chip->irq_unmask(data); |