Commit 4df88fe5 authored by Ashay Jaiswal's avatar Ashay Jaiswal Committed by Greg Kroah-Hartman

spmi: pmic-arb: add support to dispatch interrupt based on IRQ status

Current implementation of SPMI arbiter dispatches interrupt based on the
Arbiter's accumulator status, in some cases the accumulator status may
remain zero and the interrupt remains un-handled. Add logic to dispatch
interrupts based Arbiter's IRQ status if the accumulator status is zero.
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
Signed-off-by: default avatarDavid Collins <collinsd@codeaurora.org>
Signed-off-by: default avatarFenglin Wu <quic_fenglinw@quicinc.com>
Link: https://lore.kernel.org/r/1655004286-11493-6-git-send-email-quic_fenglinw@quicinc.comSigned-off-by: default avatarStephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20220930005019.2663064-7-sboyd@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 191adbdd
......@@ -630,12 +630,18 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
u8 ee = pmic_arb->ee;
u32 status, enable, handled = 0;
int i, id, apid;
/* status based dispatch */
bool acc_valid = false;
u32 irq_status = 0;
chained_irq_enter(chip, desc);
for (i = first >> 5; i <= last >> 5; ++i) {
status = readl_relaxed(
ver_ops->owner_acc_status(pmic_arb, ee, i));
if (status)
acc_valid = true;
while (status) {
id = ffs(status) - 1;
status &= ~BIT(id);
......@@ -653,6 +659,29 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
}
}
/* ACC_STATUS is empty but IRQ fired check IRQ_STATUS */
if (!acc_valid) {
for (i = first; i <= last; i++) {
/* skip if APPS is not irq owner */
if (pmic_arb->apid_data[i].irq_ee != pmic_arb->ee)
continue;
irq_status = readl_relaxed(
ver_ops->irq_status(pmic_arb, i));
if (irq_status) {
enable = readl_relaxed(
ver_ops->acc_enable(pmic_arb, i));
if (enable & SPMI_PIC_ACC_ENABLE_BIT) {
dev_dbg(&pmic_arb->spmic->dev,
"Dispatching IRQ for apid=%d status=%x\n",
i, irq_status);
if (periph_interrupt(pmic_arb, i) != 0)
handled++;
}
}
}
}
if (handled == 0)
handle_bad_irq(desc);
......
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