summaryrefslogtreecommitdiff
path: root/drivers/spmi
diff options
context:
space:
mode:
authorAbhijeet Dharmapurikar <adharmap@codeaurora.org>2016-02-23 15:56:23 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:16:01 -0700
commite99c7baba085d294fa1d3ab333102323e3c9a0dc (patch)
tree175bc894e87fbfe776a3bd7a54e68176cff30887 /drivers/spmi
parentc704acd5e08562a1bf0f417e2f0da2a83b399ed5 (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.c52
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))) {