Quoting Brian Masney (2019-02-07 18:16:25) > Check to see if the hwirq is already associated with another virq on > this IRQ domain. If so, then disassociate it before associating the > hwirq with the new virq. > > This is a temporary hack that is needed in order to not break git > bisect for existing boards. The next patch in this series converts > ssbi-gpio to be a hierarchical IRQ chip, then there are several patches > to update all of the device tree files, and finally this patch will be > reverted within the same patch series. > > IRQs for ssbi-gpio are all initially setup without an IRQ hierarchy > this driver is probed due to the interrupts property in device tree. > Once ssbi-gpio is converted to be a hierarchical IRQ chip in the next > patch, existing users of gpio[d]_to_irq() will call pmic_gpio_to_irq(), > and that will use the new IRQ chip code in ssbi-gpio that sets up the > IRQ in an IRQ hierarchy. The hwirq is now associated with two Linux > virqs and interrupts will not work as expected. This patch corrects > that issue. > > This change was tested on an APQ8060 DragonBoard. > > Signed-off-by: Brian Masney <masneyb@xxxxxxxxxxxxx> > Tested-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > Changes since v1: > - None > > drivers/mfd/qcom-pm8xxx.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/mfd/qcom-pm8xxx.c b/drivers/mfd/qcom-pm8xxx.c > index 8eb2528793f9..2f99a98ccee5 100644 > --- a/drivers/mfd/qcom-pm8xxx.c > +++ b/drivers/mfd/qcom-pm8xxx.c > @@ -380,6 +380,12 @@ static void pm8xxx_irq_domain_map(struct pm_irq_chip *chip, > struct irq_domain *domain, unsigned int irq, > irq_hw_number_t hwirq, unsigned int type) > { > + unsigned int old_virq; > + > + old_virq = irq_find_mapping(domain, hwirq); > + if (old_virq) > + irq_domain_disassociate(domain, old_virq); Is it possible to pass 'true' for the 'realloc' argument to __irq_domain_alloc_irqs() and then this disassociate change isn't needed? > + > irq_domain_set_info(domain, irq, hwirq, chip->pm_irq_data->irq_chip, > chip, handle_level_irq, NULL, NULL); > irq_set_noprobe(irq);