mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 15:11:48 -04:00
Merge "spmi-pmic-arb: add support to dispatch interrupt based on IRQ status"
This commit is contained in:
commit
e2b87b2af2
1 changed files with 28 additions and 0 deletions
|
|
@ -525,12 +525,18 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
|
|||
u8 ee = pmic_arb->ee;
|
||||
u32 status, enable;
|
||||
int i, id, apid;
|
||||
/* status based dispatch */
|
||||
bool acc_valid = false;
|
||||
u32 irq_status = 0;
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
|
||||
for (i = first; i <= last; ++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);
|
||||
|
|
@ -548,6 +554,28 @@ 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 = pmic_arb->min_apid; i <= pmic_arb->max_apid; 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);
|
||||
periph_interrupt(pmic_arb, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue