diff options
Diffstat (limited to 'kernel/irq/chip.c')
| -rw-r--r-- | kernel/irq/chip.c | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 23958980189d..f51b7b6d2451 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -1000,7 +1000,7 @@ EXPORT_SYMBOL_GPL(irq_set_chip_and_handler_name);  void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)  { -	unsigned long flags; +	unsigned long flags, trigger, tmp;  	struct irq_desc *desc = irq_get_desc_lock(irq, &flags, 0);  	if (!desc) @@ -1014,6 +1014,8 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)  	irq_settings_clr_and_set(desc, clr, set); +	trigger = irqd_get_trigger_type(&desc->irq_data); +  	irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU |  		   IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT);  	if (irq_settings_has_no_balance_set(desc)) @@ -1025,7 +1027,11 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)  	if (irq_settings_is_level(desc))  		irqd_set(&desc->irq_data, IRQD_LEVEL); -	irqd_set(&desc->irq_data, irq_settings_get_trigger_mask(desc)); +	tmp = irq_settings_get_trigger_mask(desc); +	if (tmp != IRQ_TYPE_NONE) +		trigger = tmp; + +	irqd_set(&desc->irq_data, trigger);  	irq_put_desc_unlock(desc, flags);  } | 
