[GIT pull] irq updates for 4.16

2018-02-18 Thread Thomas Gleixner
Linus,

please pull the latest irq-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
irq-urgent-for-linus

A small set of updates mostly for irq chip drivers:

  - A MIPS GIC fix for spurious, masked interrupts
  - A fix for a subtle IPI bug in GICv3
  - Do not probe GICv3 ITSs that are marked as disabled
  - Multi-MSI support for GICv2m
  - Various small cleanups

Thanks,

tglx

-->
Andy Shevchenko (1):
  irqdomain: Re-use DEFINE_SHOW_ATTRIBUTE() macro

Jaedon Shin (1):
  irqchip/bcm: Remove hashed address printing

Marc Zyngier (1):
  irqchip/gic-v2m: Add PCI Multi-MSI support

Mark Salter (1):
  irqchip/gic-v3: Change pr_debug message to pr_devel

Matt Redfearn (1):
  irqchip/mips-gic: Avoid spuriously handling masked interrupts

Shanker Donthineni (1):
  irqchip/gic-v3: Use wmb() instead of smb_wmb() in gic_raise_softirq()

Stephen Boyd (1):
  irqchip/gic-v3: Ignore disabled ITS nodes


 drivers/irqchip/irq-bcm7038-l1.c   |  3 --
 drivers/irqchip/irq-bcm7120-l2.c   |  3 --
 drivers/irqchip/irq-brcmstb-l2.c   |  3 --
 drivers/irqchip/irq-gic-v2m.c  | 46 +++---
 drivers/irqchip/irq-gic-v3-its-pci-msi.c   |  2 +
 drivers/irqchip/irq-gic-v3-its-platform-msi.c  |  2 +
 drivers/irqchip/irq-gic-v3-its.c   |  2 +
 drivers/irqchip/irq-gic-v3.c   |  4 +-
 drivers/irqchip/irq-mips-gic.c |  2 -
 .../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c |  2 +
 kernel/irq/irqdomain.c | 18 ++---
 11 files changed, 36 insertions(+), 51 deletions(-)

diff --git a/drivers/irqchip/irq-bcm7038-l1.c b/drivers/irqchip/irq-bcm7038-l1.c
index 55cfb986225b..faf734ff4cf3 100644
--- a/drivers/irqchip/irq-bcm7038-l1.c
+++ b/drivers/irqchip/irq-bcm7038-l1.c
@@ -339,9 +339,6 @@ int __init bcm7038_l1_of_init(struct device_node *dn,
goto out_unmap;
}
 
-   pr_info("registered BCM7038 L1 intc (mem: 0x%p, IRQs: %d)\n",
-   intc->cpus[0]->map_base, IRQS_PER_WORD * intc->n_words);
-
return 0;
 
 out_unmap:
diff --git a/drivers/irqchip/irq-bcm7120-l2.c b/drivers/irqchip/irq-bcm7120-l2.c
index 983640eba418..8968e5e93fcb 100644
--- a/drivers/irqchip/irq-bcm7120-l2.c
+++ b/drivers/irqchip/irq-bcm7120-l2.c
@@ -318,9 +318,6 @@ static int __init bcm7120_l2_intc_probe(struct device_node 
*dn,
}
}
 
-   pr_info("registered %s intc (mem: 0x%p, parent IRQ(s): %d)\n",
-   intc_name, data->map_base[0], data->num_parent_irqs);
-
return 0;
 
 out_free_domain:
diff --git a/drivers/irqchip/irq-brcmstb-l2.c b/drivers/irqchip/irq-brcmstb-l2.c
index 691d20eb0bec..0e65f609352e 100644
--- a/drivers/irqchip/irq-brcmstb-l2.c
+++ b/drivers/irqchip/irq-brcmstb-l2.c
@@ -262,9 +262,6 @@ static int __init brcmstb_l2_intc_of_init(struct 
device_node *np,
ct->chip.irq_set_wake = irq_gc_set_wake;
}
 
-   pr_info("registered L2 intc (mem: 0x%p, parent irq: %d)\n",
-   base, parent_irq);
-
return 0;
 
 out_free_domain:
diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c
index 993a8426a453..1ff38aff9f29 100644
--- a/drivers/irqchip/irq-gic-v2m.c
+++ b/drivers/irqchip/irq-gic-v2m.c
@@ -94,7 +94,7 @@ static struct irq_chip gicv2m_msi_irq_chip = {
 
 static struct msi_domain_info gicv2m_msi_domain_info = {
.flags  = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
-  MSI_FLAG_PCI_MSIX),
+  MSI_FLAG_PCI_MSIX | MSI_FLAG_MULTI_PCI_MSI),
.chip   = &gicv2m_msi_irq_chip,
 };
 
@@ -155,18 +155,12 @@ static int gicv2m_irq_gic_domain_alloc(struct irq_domain 
*domain,
return 0;
 }
 
-static void gicv2m_unalloc_msi(struct v2m_data *v2m, unsigned int hwirq)
+static void gicv2m_unalloc_msi(struct v2m_data *v2m, unsigned int hwirq,
+  int nr_irqs)
 {
-   int pos;
-
-   pos = hwirq - v2m->spi_start;
-   if (pos < 0 || pos >= v2m->nr_spis) {
-   pr_err("Failed to teardown msi. Invalid hwirq %d\n", hwirq);
-   return;
-   }
-
spin_lock(&v2m_lock);
-   __clear_bit(pos, v2m->bm);
+   bitmap_release_region(v2m->bm, hwirq - v2m->spi_start,
+ get_count_order(nr_irqs));
spin_unlock(&v2m_lock);
 }
 
@@ -174,13 +168,13 @@ static int gicv2m_irq_domain_alloc(struct irq_domain 
*domain, unsigned int virq,
   unsigned int nr_irqs, void *args)
 {
struct v2m_data *v2m = NULL, *tmp;
-   int hwirq, offset, err = 0;
+   int hwirq, offset, i, err = 0;
 
spin_lock(&v2m_lock);
list_for_each_entry(tmp, &v2m_nodes, entry) {
-   offset = find_first_zero_bit(tmp->bm, tmp->nr_spis);
-   if (offset < t

[GIT pull] irq updates for 4.16

2018-02-04 Thread Thomas Gleixner
Linus,

please pull the latest irq-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
irq-urgent-for-linus

Two small changes:

  - A fix for a interrupt regression caused by the vector management
changes in 4.15 affecting museum pieces which rely on interrupt probing
for legacy (e.g. parallel port) devices. One of the startup calls in
the autoprobe code was not changed to the new activate_and_startup()
function resulting in a warning and as a consequence failing to
discover the device interrupt.

  - A trivial update to the copyright/license header of the STM32 irq chip
driver.

Thanks,

tglx

-->
Benjamin Gaignard (1):
  irqchip/stm32: Fix copyright

Thomas Gleixner (1):
  genirq: Make legacy autoprobing work again


 drivers/irqchip/irq-stm32-exti.c | 3 ++-
 kernel/irq/autoprobe.c   | 2 +-
 kernel/irq/chip.c| 6 +++---
 kernel/irq/internals.h   | 2 +-
 4 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/irqchip/irq-stm32-exti.c b/drivers/irqchip/irq-stm32-exti.c
index 31ab0dee2ce7..36f0fbe36c35 100644
--- a/drivers/irqchip/irq-stm32-exti.c
+++ b/drivers/irqchip/irq-stm32-exti.c
@@ -1,7 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) Maxime Coquelin 2015
+ * Copyright (C) STMicroelectronics 2017
  * Author:  Maxime Coquelin 
- * License terms:  GNU General Public License (GPL), version 2
  */
 
 #include 
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c
index 4e8089b319ae..8c82ea26e837 100644
--- a/kernel/irq/autoprobe.c
+++ b/kernel/irq/autoprobe.c
@@ -71,7 +71,7 @@ unsigned long probe_irq_on(void)
raw_spin_lock_irq(&desc->lock);
if (!desc->action && irq_settings_can_probe(desc)) {
desc->istate |= IRQS_AUTODETECT | IRQS_WAITING;
-   if (irq_startup(desc, IRQ_NORESEND, IRQ_START_FORCE))
+   if (irq_activate_and_startup(desc, IRQ_NORESEND))
desc->istate |= IRQS_PENDING;
}
raw_spin_unlock_irq(&desc->lock);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 043bfc35b353..c69357a43849 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -294,11 +294,11 @@ int irq_activate(struct irq_desc *desc)
return 0;
 }
 
-void irq_activate_and_startup(struct irq_desc *desc, bool resend)
+int irq_activate_and_startup(struct irq_desc *desc, bool resend)
 {
if (WARN_ON(irq_activate(desc)))
-   return;
-   irq_startup(desc, resend, IRQ_START_FORCE);
+   return 0;
+   return irq_startup(desc, resend, IRQ_START_FORCE);
 }
 
 static void __irq_disable(struct irq_desc *desc, bool mask);
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index ab19371eab9b..ca6afa267070 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -76,7 +76,7 @@ extern void __enable_irq(struct irq_desc *desc);
 #define IRQ_START_COND false
 
 extern int irq_activate(struct irq_desc *desc);
-extern void irq_activate_and_startup(struct irq_desc *desc, bool resend);
+extern int irq_activate_and_startup(struct irq_desc *desc, bool resend);
 extern int irq_startup(struct irq_desc *desc, bool resend, bool force);
 
 extern void irq_shutdown(struct irq_desc *desc);