Commit 2fb4f258 authored by Kiran Gunda's avatar Kiran Gunda Committed by Greg Kroah-Hartman

spmi: pmic-arb: Move the ownership check to irq_chip callback

Check the irq ownership in the irq_request_resources callback
instead of checking it during the irq mapping. This can prevent
installing the flow handler for the interrupt that is not owned by the EE
and allow the irq translation during the gpio driver probe.
Signed-off-by: default avatarKiran Gunda <kgunda@codeaurora.org>
Tested-by: default avatarShawn Guo <shawnguo@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e55fe64a
...@@ -666,6 +666,24 @@ static int qpnpint_get_irqchip_state(struct irq_data *d, ...@@ -666,6 +666,24 @@ static int qpnpint_get_irqchip_state(struct irq_data *d,
return 0; return 0;
} }
static int qpnpint_irq_request_resources(struct irq_data *d)
{
struct spmi_pmic_arb *pmic_arb = irq_data_get_irq_chip_data(d);
u16 periph = hwirq_to_per(d->hwirq);
u16 apid = hwirq_to_apid(d->hwirq);
u16 sid = hwirq_to_sid(d->hwirq);
u16 irq = hwirq_to_irq(d->hwirq);
if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) {
dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n",
sid, periph, irq, pmic_arb->ee,
pmic_arb->apid_data[apid].irq_ee);
return -ENODEV;
}
return 0;
}
static struct irq_chip pmic_arb_irqchip = { static struct irq_chip pmic_arb_irqchip = {
.name = "pmic_arb", .name = "pmic_arb",
.irq_ack = qpnpint_irq_ack, .irq_ack = qpnpint_irq_ack,
...@@ -674,6 +692,7 @@ static struct irq_chip pmic_arb_irqchip = { ...@@ -674,6 +692,7 @@ static struct irq_chip pmic_arb_irqchip = {
.irq_set_type = qpnpint_irq_set_type, .irq_set_type = qpnpint_irq_set_type,
.irq_set_wake = qpnpint_irq_set_wake, .irq_set_wake = qpnpint_irq_set_wake,
.irq_get_irqchip_state = qpnpint_get_irqchip_state, .irq_get_irqchip_state = qpnpint_get_irqchip_state,
.irq_request_resources = qpnpint_irq_request_resources,
.flags = IRQCHIP_MASK_ON_SUSPEND, .flags = IRQCHIP_MASK_ON_SUSPEND,
}; };
...@@ -707,13 +726,6 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, ...@@ -707,13 +726,6 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,
} }
apid = rc; apid = rc;
if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) {
dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n",
intspec[0], intspec[1], intspec[2], pmic_arb->ee,
pmic_arb->apid_data[apid].irq_ee);
return -ENODEV;
}
/* Keep track of {max,min}_apid for bounding search during interrupt */ /* Keep track of {max,min}_apid for bounding search during interrupt */
if (apid > pmic_arb->max_apid) if (apid > pmic_arb->max_apid)
pmic_arb->max_apid = apid; pmic_arb->max_apid = apid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment