aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/chip.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r--kernel/irq/chip.c29
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
776void 785static 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);