diff options
author | Abhijeet Dharmapurikar <adharmap@codeaurora.org> | 2016-02-23 15:56:23 -0800 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:16:01 -0700 |
commit | e99c7baba085d294fa1d3ab333102323e3c9a0dc (patch) | |
tree | 175bc894e87fbfe776a3bd7a54e68176cff30887 /drivers/spmi | |
parent | c704acd5e08562a1bf0f417e2f0da2a83b399ed5 (diff) |
spmi: pmic_arb: remove disabling of ACC bit
The interrupt controller code in the arbiter disables
the peripheral accumulated interrupt (ACC) bit when none of the
interrupts in the peripheral is enabled.
This is not required since the controller disables the interrupt
at the pmic.
So leave the ACC bit enabled while masking an interrupt. Also
ensure that the ACC bit is enabled while unmasking an interrupt.
There is no issues with enabling ACC bit if it were already enabled.
Change-Id: Idbea562157e65a4dfe0c51b7a25eed5ce000068d
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Diffstat (limited to 'drivers/spmi')
-rw-r--r-- | drivers/spmi/spmi-pmic-arb.c | 52 |
1 files changed, 6 insertions, 46 deletions
diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index 30211248edb6..be1f7fd2cc02 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -101,7 +101,6 @@ struct pmic_arb_ver_ops; struct apid_data { u16 ppid; u8 owner; - u8 enabled_irq_mask; }; /** @@ -488,7 +487,6 @@ static void qpnpint_spmi_read(struct irq_data *d, u8 reg, void *buf, size_t len) static void cleanup_irq(struct spmi_pmic_arb *pa, u8 apid, int id) { - u32 status; u16 ppid = pa->apid_data[apid].ppid; u8 sid = ppid >> 8; u8 per = ppid & 0xFF; @@ -497,15 +495,11 @@ static void cleanup_irq(struct spmi_pmic_arb *pa, u8 apid, int id) raw_spin_lock_irqsave(&pa->lock, flags); writel_relaxed(irq_mask, pa->intr + pa->ver_ops->irq_clear(apid)); - if (pa->apid_data[apid].enabled_irq_mask == 0) { - status = readl_relaxed(pa->intr + pa->ver_ops->acc_enable(apid)); - status = status & ~SPMI_PIC_ACC_ENABLE_BIT; - writel_relaxed(status, pa->intr + pa->ver_ops->acc_enable(apid)); - } + raw_spin_unlock_irqrestore(&pa->lock, flags); if (pmic_arb_write_cmd(pa->spmic, SPMI_CMD_EXT_WRITEL, sid, - (per << 8) + QPNPINT_REG_LATCHED_CLR, &irq_mask, 1)) + (per << 8) + QPNPINT_REG_LATCHED_CLR, &irq_mask, 1)) dev_err_ratelimited(&pa->spmic->dev, "failed to ack irq_mask = 0x%x for ppid = %x\n", irq_mask, ppid); @@ -582,29 +576,8 @@ static void qpnpint_irq_ack(struct irq_data *d) static void qpnpint_irq_mask(struct irq_data *d) { - struct spmi_pmic_arb *pa = irq_data_get_irq_chip_data(d); u8 irq = d->hwirq >> 8; - u8 apid = d->hwirq; - unsigned long flags; - u32 status; u8 data = BIT(irq); - u8 prev_enabled_irq_mask; - - prev_enabled_irq_mask = pa->apid_data[apid].enabled_irq_mask; - pa->apid_data[apid].enabled_irq_mask &= ~BIT(irq); - - if (prev_enabled_irq_mask != 0 && - pa->apid_data[apid].enabled_irq_mask == 0) { - raw_spin_lock_irqsave(&pa->lock, flags); - status = readl_relaxed(pa->intr - + pa->ver_ops->acc_enable(apid)); - if (status & SPMI_PIC_ACC_ENABLE_BIT) { - status = status & ~SPMI_PIC_ACC_ENABLE_BIT; - writel_relaxed(status, pa->intr + - pa->ver_ops->acc_enable(apid)); - } - raw_spin_unlock_irqrestore(&pa->lock, flags); - } qpnpint_spmi_write(d, QPNPINT_REG_EN_CLR, &data, 1); } @@ -615,25 +588,12 @@ static void qpnpint_irq_unmask(struct irq_data *d) u8 irq = d->hwirq >> 8; u8 apid = d->hwirq; unsigned long flags; - u32 status; - u8 prev_enabled_irq_mask; u8 buf[2]; - prev_enabled_irq_mask = pa->apid_data[apid].enabled_irq_mask; - pa->apid_data[apid].enabled_irq_mask &= ~BIT(irq); - pa->apid_data[apid].enabled_irq_mask |= BIT(irq); - - if (prev_enabled_irq_mask == 0 && - pa->apid_data[apid].enabled_irq_mask != 0) { - raw_spin_lock_irqsave(&pa->lock, flags); - status = readl_relaxed(pa->intr - + pa->ver_ops->acc_enable(apid)); - if (!(status & SPMI_PIC_ACC_ENABLE_BIT)) { - writel_relaxed(status | SPMI_PIC_ACC_ENABLE_BIT, - pa->intr + pa->ver_ops->acc_enable(apid)); - } - raw_spin_unlock_irqrestore(&pa->lock, flags); - } + raw_spin_lock_irqsave(&pa->lock, flags); + writel_relaxed(SPMI_PIC_ACC_ENABLE_BIT, + pa->intr + pa->ver_ops->acc_enable(apid)); + raw_spin_unlock_irqrestore(&pa->lock, flags); qpnpint_spmi_read(d, QPNPINT_REG_EN_SET, &buf[0], 1); if (!(buf[0] & BIT(irq))) { |