diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 64 | 
1 files changed, 34 insertions, 30 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index f9744853b656..ad1b064f94fe 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -115,6 +115,14 @@ EXPORT_SYMBOL(synchronize_irq);  #ifdef CONFIG_SMP  cpumask_var_t irq_default_affinity; +static int __irq_can_set_affinity(struct irq_desc *desc) +{ +	if (!desc || !irqd_can_balance(&desc->irq_data) || +	    !desc->irq_data.chip || !desc->irq_data.chip->irq_set_affinity) +		return 0; +	return 1; +} +  /**   *	irq_can_set_affinity - Check if the affinity of a given irq can be set   *	@irq:		Interrupt to check @@ -122,13 +130,7 @@ cpumask_var_t irq_default_affinity;   */  int irq_can_set_affinity(unsigned int irq)  { -	struct irq_desc *desc = irq_to_desc(irq); - -	if (!desc || !irqd_can_balance(&desc->irq_data) || -	    !desc->irq_data.chip || !desc->irq_data.chip->irq_set_affinity) -		return 0; - -	return 1; +	return __irq_can_set_affinity(irq_to_desc(irq));  }  /** @@ -359,14 +361,13 @@ EXPORT_SYMBOL_GPL(irq_set_affinity_notifier);  /*   * Generic version of the affinity autoselector.   */ -static int -setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) +static int setup_affinity(struct irq_desc *desc, struct cpumask *mask)  {  	struct cpumask *set = irq_default_affinity;  	int node = irq_desc_get_node(desc);  	/* Excludes PER_CPU and NO_BALANCE interrupts */ -	if (!irq_can_set_affinity(irq)) +	if (!__irq_can_set_affinity(desc))  		return 0;  	/* @@ -393,10 +394,10 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)  	return 0;  }  #else -static inline int -setup_affinity(unsigned int irq, struct irq_desc *d, struct cpumask *mask) +/* Wrapper for ALPHA specific affinity selector magic */ +static inline int setup_affinity(struct irq_desc *d, struct cpumask *mask)  { -	return irq_select_affinity(irq); +	return irq_select_affinity(irq_desc_get_irq(d));  }  #endif @@ -410,20 +411,20 @@ int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask)  	int ret;  	raw_spin_lock_irqsave(&desc->lock, flags); -	ret = setup_affinity(irq, desc, mask); +	ret = setup_affinity(desc, mask);  	raw_spin_unlock_irqrestore(&desc->lock, flags);  	return ret;  }  #else  static inline int -setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) +setup_affinity(struct irq_desc *desc, struct cpumask *mask)  {  	return 0;  }  #endif -void __disable_irq(struct irq_desc *desc, unsigned int irq) +void __disable_irq(struct irq_desc *desc)  {  	if (!desc->depth++)  		irq_disable(desc); @@ -436,7 +437,7 @@ static int __disable_irq_nosync(unsigned int irq)  	if (!desc)  		return -EINVAL; -	__disable_irq(desc, irq); +	__disable_irq(desc);  	irq_put_desc_busunlock(desc, flags);  	return 0;  } @@ -503,12 +504,13 @@ bool disable_hardirq(unsigned int irq)  }  EXPORT_SYMBOL_GPL(disable_hardirq); -void __enable_irq(struct irq_desc *desc, unsigned int irq) +void __enable_irq(struct irq_desc *desc)  {  	switch (desc->depth) {  	case 0:   err_out: -		WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); +		WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", +		     irq_desc_get_irq(desc));  		break;  	case 1: {  		if (desc->istate & IRQS_SUSPENDED) @@ -516,7 +518,7 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq)  		/* Prevent probing on this irq: */  		irq_settings_set_noprobe(desc);  		irq_enable(desc); -		check_irq_resend(desc, irq); +		check_irq_resend(desc);  		/* fall-through */  	}  	default: @@ -546,7 +548,7 @@ void enable_irq(unsigned int irq)  		 KERN_ERR "enable_irq before setup/request_irq: irq %u\n", irq))  		goto out; -	__enable_irq(desc, irq); +	__enable_irq(desc);  out:  	irq_put_desc_busunlock(desc, flags);  } @@ -637,8 +639,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags)  	return canrequest;  } -int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, -		      unsigned long flags) +int __irq_set_trigger(struct irq_desc *desc, unsigned long flags)  {  	struct irq_chip *chip = desc->irq_data.chip;  	int ret, unmask = 0; @@ -648,7 +649,8 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,  		 * IRQF_TRIGGER_* but the PIC does not support multiple  		 * flow-types?  		 */ -		pr_debug("No set_type function for IRQ %d (%s)\n", irq, +		pr_debug("No set_type function for IRQ %d (%s)\n", +			 irq_desc_get_irq(desc),  			 chip ? (chip->name ? : "unknown") : "unknown");  		return 0;  	} @@ -685,7 +687,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,  		break;  	default:  		pr_err("Setting trigger mode %lu for irq %u failed (%pF)\n", -		       flags, irq, chip->irq_set_type); +		       flags, irq_desc_get_irq(desc), chip->irq_set_type);  	}  	if (unmask)  		unmask_irq(desc); @@ -1221,8 +1223,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)  		/* Setup the type (level, edge polarity) if configured: */  		if (new->flags & IRQF_TRIGGER_MASK) { -			ret = __irq_set_trigger(desc, irq, -					new->flags & IRQF_TRIGGER_MASK); +			ret = __irq_set_trigger(desc, +						new->flags & IRQF_TRIGGER_MASK);  			if (ret)  				goto out_mask; @@ -1253,7 +1255,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)  		}  		/* Set default affinity mask once everything is setup */ -		setup_affinity(irq, desc, mask); +		setup_affinity(desc, mask);  	} else if (new->flags & IRQF_TRIGGER_MASK) {  		unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK; @@ -1280,7 +1282,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)  	 */  	if (shared && (desc->istate & IRQS_SPURIOUS_DISABLED)) {  		desc->istate &= ~IRQS_SPURIOUS_DISABLED; -		__enable_irq(desc, irq); +		__enable_irq(desc);  	}  	raw_spin_unlock_irqrestore(&desc->lock, flags); @@ -1650,7 +1652,7 @@ void enable_percpu_irq(unsigned int irq, unsigned int type)  	if (type != IRQ_TYPE_NONE) {  		int ret; -		ret = __irq_set_trigger(desc, irq, type); +		ret = __irq_set_trigger(desc, type);  		if (ret) {  			WARN(1, "failed to set type for IRQ%d\n", irq); @@ -1875,6 +1877,7 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which,  	irq_put_desc_busunlock(desc, flags);  	return err;  } +EXPORT_SYMBOL_GPL(irq_get_irqchip_state);  /**   *	irq_set_irqchip_state - set the state of a forwarded interrupt. @@ -1920,3 +1923,4 @@ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,  	irq_put_desc_busunlock(desc, flags);  	return err;  } +EXPORT_SYMBOL_GPL(irq_set_irqchip_state);  |