summaryrefslogtreecommitdiffstats
path: root/drivers/spmi
diff options
context:
space:
mode:
authorBrian Masney <masneyb@onstation.org>2019-01-19 15:42:43 -0500
committerLinus Walleij <linus.walleij@linaro.org>2019-01-24 09:33:04 -0500
commit682aefaa81e6c9b76bf45391f92a2b9c6ec96a0c (patch)
tree143669088883faf138d36ae6cd2f110ead879290 /drivers/spmi
parentef74f70e5a10cc2a78cc5529e564170cabcda9af (diff)
spmi: pmic-arb: disassociate old virq if hwirq mapping already exists
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 spmi-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 spmi-gpio are all initially setup without an IRQ hierarchy on pmic-arb when mfd/qcom-spmi-pmic.c is probed (via the devm_of_platform_populate call) due to the interrupts property in device tree. Once spmi-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 spmi-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. Driver was tested using gpio-keys and iadc/vadc on the LG Nexus 5 (hammerhead) phone. Signed-off-by: Brian Masney <masneyb@onstation.org> Reviewed-by: Stephen Boyd <sboyd@kernel.org> Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/spmi')
-rw-r--r--drivers/spmi/spmi-pmic-arb.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 928759242e42..bc7dc1d6e4b2 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -745,10 +745,15 @@ static void qpnpint_irq_domain_map(struct spmi_pmic_arb *pmic_arb,
745 irq_hw_number_t hwirq, unsigned int type) 745 irq_hw_number_t hwirq, unsigned int type)
746{ 746{
747 irq_flow_handler_t handler; 747 irq_flow_handler_t handler;
748 unsigned int old_virq;
748 749
749 dev_dbg(&pmic_arb->spmic->dev, "virq = %u, hwirq = %lu, type = %u\n", 750 dev_dbg(&pmic_arb->spmic->dev, "virq = %u, hwirq = %lu, type = %u\n",
750 virq, hwirq, type); 751 virq, hwirq, type);
751 752
753 old_virq = irq_find_mapping(domain, hwirq);
754 if (old_virq)
755 irq_domain_disassociate(domain, old_virq);
756
752 if (type & IRQ_TYPE_EDGE_BOTH) 757 if (type & IRQ_TYPE_EDGE_BOTH)
753 handler = handle_edge_irq; 758 handler = handle_edge_irq;
754 else 759 else