diff options
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 637389088b3f..be3c34e4f2ac 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -76,7 +76,6 @@ int irq_set_irq_type(unsigned int irq, unsigned int type) | |||
76 | if (!desc) | 76 | if (!desc) |
77 | return -EINVAL; | 77 | return -EINVAL; |
78 | 78 | ||
79 | type &= IRQ_TYPE_SENSE_MASK; | ||
80 | ret = __irq_set_trigger(desc, type); | 79 | ret = __irq_set_trigger(desc, type); |
81 | irq_put_desc_busunlock(desc, flags); | 80 | irq_put_desc_busunlock(desc, flags); |
82 | return ret; | 81 | return ret; |
@@ -756,7 +755,6 @@ void handle_percpu_devid_irq(struct irq_desc *desc) | |||
756 | { | 755 | { |
757 | struct irq_chip *chip = irq_desc_get_chip(desc); | 756 | struct irq_chip *chip = irq_desc_get_chip(desc); |
758 | struct irqaction *action = desc->action; | 757 | struct irqaction *action = desc->action; |
759 | void *dev_id = raw_cpu_ptr(action->percpu_dev_id); | ||
760 | unsigned int irq = irq_desc_get_irq(desc); | 758 | unsigned int irq = irq_desc_get_irq(desc); |
761 | irqreturn_t res; | 759 | irqreturn_t res; |
762 | 760 | ||
@@ -765,15 +763,26 @@ void handle_percpu_devid_irq(struct irq_desc *desc) | |||
765 | if (chip->irq_ack) | 763 | if (chip->irq_ack) |
766 | chip->irq_ack(&desc->irq_data); | 764 | chip->irq_ack(&desc->irq_data); |
767 | 765 | ||
768 | trace_irq_handler_entry(irq, action); | 766 | if (likely(action)) { |
769 | res = action->handler(irq, dev_id); | 767 | trace_irq_handler_entry(irq, action); |
770 | trace_irq_handler_exit(irq, action, res); | 768 | res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id)); |
769 | trace_irq_handler_exit(irq, action, res); | ||
770 | } else { | ||
771 | unsigned int cpu = smp_processor_id(); | ||
772 | bool enabled = cpumask_test_cpu(cpu, desc->percpu_enabled); | ||
773 | |||
774 | if (enabled) | ||
775 | irq_percpu_disable(desc, cpu); | ||
776 | |||
777 | pr_err_once("Spurious%s percpu IRQ%u on CPU%u\n", | ||
778 | enabled ? " and unmasked" : "", irq, cpu); | ||
779 | } | ||
771 | 780 | ||
772 | if (chip->irq_eoi) | 781 | if (chip->irq_eoi) |
773 | chip->irq_eoi(&desc->irq_data); | 782 | chip->irq_eoi(&desc->irq_data); |
774 | } | 783 | } |
775 | 784 | ||
776 | void | 785 | static void |
777 | __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, | 786 | __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, |
778 | int is_chained, const char *name) | 787 | int is_chained, const char *name) |
779 | { | 788 | { |
@@ -820,6 +829,8 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, | |||
820 | desc->name = name; | 829 | desc->name = name; |
821 | 830 | ||
822 | if (handle != handle_bad_irq && is_chained) { | 831 | if (handle != handle_bad_irq && is_chained) { |
832 | unsigned int type = irqd_get_trigger_type(&desc->irq_data); | ||
833 | |||
823 | /* | 834 | /* |
824 | * We're about to start this interrupt immediately, | 835 | * We're about to start this interrupt immediately, |
825 | * hence the need to set the trigger configuration. | 836 | * hence the need to set the trigger configuration. |
@@ -828,8 +839,10 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, | |||
828 | * chained interrupt. Reset it immediately because we | 839 | * chained interrupt. Reset it immediately because we |
829 | * do know better. | 840 | * do know better. |
830 | */ | 841 | */ |
831 | __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data)); | 842 | if (type != IRQ_TYPE_NONE) { |
832 | desc->handle_irq = handle; | 843 | __irq_set_trigger(desc, type); |
844 | desc->handle_irq = handle; | ||
845 | } | ||
833 | 846 | ||
834 | irq_settings_set_noprobe(desc); | 847 | irq_settings_set_noprobe(desc); |
835 | irq_settings_set_norequest(desc); | 848 | irq_settings_set_norequest(desc); |