Merge tag 'irqchip-4.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm...
authorThomas Gleixner <tglx@linutronix.de>
Wed, 14 Sep 2016 18:53:26 +0000 (20:53 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 14 Sep 2016 18:53:26 +0000 (20:53 +0200)
Merge the first drop of irqchip updates for 4.9 from Marc Zyngier:

- ACPI IORT core code
- IORT support for the GICv3 ITS
- A few of GIC cleanups

1  2 
kernel/irq/chip.c
kernel/irq/manage.c

diff --combined kernel/irq/chip.c
@@@ -76,6 -76,7 +76,6 @@@ int irq_set_irq_type(unsigned int irq, 
        if (!desc)
                return -EINVAL;
  
 -      type &= IRQ_TYPE_SENSE_MASK;
        ret = __irq_set_trigger(desc, type);
        irq_put_desc_busunlock(desc, flags);
        return ret;
@@@ -755,6 -756,7 +755,6 @@@ void handle_percpu_devid_irq(struct irq
  {
        struct irq_chip *chip = irq_desc_get_chip(desc);
        struct irqaction *action = desc->action;
 -      void *dev_id = raw_cpu_ptr(action->percpu_dev_id);
        unsigned int irq = irq_desc_get_irq(desc);
        irqreturn_t res;
  
        if (chip->irq_ack)
                chip->irq_ack(&desc->irq_data);
  
 -      trace_irq_handler_entry(irq, action);
 -      res = action->handler(irq, dev_id);
 -      trace_irq_handler_exit(irq, action, res);
 +      if (likely(action)) {
 +              trace_irq_handler_entry(irq, action);
 +              res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id));
 +              trace_irq_handler_exit(irq, action, res);
 +      } else {
 +              unsigned int cpu = smp_processor_id();
 +              bool enabled = cpumask_test_cpu(cpu, desc->percpu_enabled);
 +
 +              if (enabled)
 +                      irq_percpu_disable(desc, cpu);
 +
 +              pr_err_once("Spurious%s percpu IRQ%u on CPU%u\n",
 +                          enabled ? " and unmasked" : "", irq, cpu);
 +      }
  
        if (chip->irq_eoi)
                chip->irq_eoi(&desc->irq_data);
@@@ -829,6 -820,17 +829,17 @@@ __irq_do_set_handler(struct irq_desc *d
        desc->name = name;
  
        if (handle != handle_bad_irq && is_chained) {
+               /*
+                * We're about to start this interrupt immediately,
+                * hence the need to set the trigger configuration.
+                * But the .set_type callback may have overridden the
+                * flow handler, ignoring that we're dealing with a
+                * chained interrupt. Reset it immediately because we
+                * do know better.
+                */
+               __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
+               desc->handle_irq = handle;
                irq_settings_set_noprobe(desc);
                irq_settings_set_norequest(desc);
                irq_settings_set_nothread(desc);
diff --combined kernel/irq/manage.c
@@@ -669,6 -669,8 +669,6 @@@ int __irq_set_trigger(struct irq_desc *
                return 0;
        }
  
 -      flags &= IRQ_TYPE_SENSE_MASK;
 -
        if (chip->flags & IRQCHIP_SET_TYPE_MASKED) {
                if (!irqd_irq_masked(&desc->irq_data))
                        mask_irq(desc);
                        unmask = 1;
        }
  
 -      /* caller masked out all except trigger mode flags */
 +      /* Mask all flags except trigger mode */
 +      flags &= IRQ_TYPE_SENSE_MASK;
        ret = chip->irq_set_type(&desc->irq_data, flags);
  
        switch (ret) {
@@@ -1680,8 -1681,10 +1680,10 @@@ int request_threaded_irq(unsigned int i
        action->dev_id = dev_id;
  
        retval = irq_chip_pm_get(&desc->irq_data);
-       if (retval < 0)
+       if (retval < 0) {
+               kfree(action);
                return retval;
+       }
  
        chip_bus_lock(desc);
        retval = __setup_irq(irq, desc, action);
@@@ -1984,8 -1987,10 +1986,10 @@@ int request_percpu_irq(unsigned int irq
        action->percpu_dev_id = dev_id;
  
        retval = irq_chip_pm_get(&desc->irq_data);
-       if (retval < 0)
+       if (retval < 0) {
+               kfree(action);
                return retval;
+       }
  
        chip_bus_lock(desc);
        retval = __setup_irq(irq, desc, action);