summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Troast <ntroast@codeaurora.org>2016-08-05 11:04:45 -0700
committerHarry Yang <harryy@codeaurora.org>2016-08-18 13:30:41 -0700
commit59e8c0d0d5555196abbda8c7d54afa841feb0b12 (patch)
treecb79dc7e8b073bebb59d838d2ce277f01aa713dc
parentfa0dc60444f8a52470f5ff91db41d8bc09431de8 (diff)
qcom-charger: qpnp-fg-gen3: add flag to bypass SRAM read/write wake lock
In the suspend path a wakelock should not be held. Add a flag to bypass holding a wakelock during an SRAM read or write so that they can be used in the suspend path. Change-Id: I74ccae4e9b5aeccf261cc94e9bb89138d7d48345 Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
-rw-r--r--drivers/power/qcom-charger/fg-core.h5
-rw-r--r--drivers/power/qcom-charger/fg-util.c12
2 files changed, 11 insertions, 6 deletions
diff --git a/drivers/power/qcom-charger/fg-core.h b/drivers/power/qcom-charger/fg-core.h
index ef4ea8172035..cdcbb8011df2 100644
--- a/drivers/power/qcom-charger/fg-core.h
+++ b/drivers/power/qcom-charger/fg-core.h
@@ -68,8 +68,9 @@ enum fg_debug_flag {
/* SRAM access */
enum sram_access_flags {
- FG_IMA_DEFAULT = 0,
- FG_IMA_ATOMIC,
+ FG_IMA_DEFAULT = 0,
+ FG_IMA_ATOMIC = BIT(0),
+ FG_IMA_NO_WLOCK = BIT(1),
};
/* JEITA */
diff --git a/drivers/power/qcom-charger/fg-util.c b/drivers/power/qcom-charger/fg-util.c
index 9f2d9973e04b..5f133d6f39c1 100644
--- a/drivers/power/qcom-charger/fg-util.c
+++ b/drivers/power/qcom-charger/fg-util.c
@@ -66,7 +66,8 @@ int fg_sram_write(struct fg_chip *chip, u16 address, u8 offset,
if (!fg_sram_address_valid(address, len))
return -EFAULT;
- vote(chip->awake_votable, SRAM_WRITE, true, 0);
+ if (!(flags & FG_IMA_NO_WLOCK))
+ vote(chip->awake_votable, SRAM_WRITE, true, 0);
mutex_lock(&chip->sram_rw_lock);
if ((flags & FG_IMA_ATOMIC) && chip->irqs[SOC_UPDATE_IRQ].irq) {
@@ -113,7 +114,8 @@ out:
disable_irq_nosync(chip->irqs[SOC_UPDATE_IRQ].irq);
mutex_unlock(&chip->sram_rw_lock);
- vote(chip->awake_votable, SRAM_WRITE, false, 0);
+ if (!(flags & FG_IMA_NO_WLOCK))
+ vote(chip->awake_votable, SRAM_WRITE, false, 0);
return rc;
}
@@ -128,7 +130,8 @@ int fg_sram_read(struct fg_chip *chip, u16 address, u8 offset,
if (!fg_sram_address_valid(address, len))
return -EFAULT;
- vote(chip->awake_votable, SRAM_READ, true, 0);
+ if (!(flags & FG_IMA_NO_WLOCK))
+ vote(chip->awake_votable, SRAM_READ, true, 0);
mutex_lock(&chip->sram_rw_lock);
rc = fg_interleaved_mem_read(chip, address, offset, val, len);
@@ -137,7 +140,8 @@ int fg_sram_read(struct fg_chip *chip, u16 address, u8 offset,
address, offset, rc);
mutex_unlock(&chip->sram_rw_lock);
- vote(chip->awake_votable, SRAM_READ, false, 0);
+ if (!(flags & FG_IMA_NO_WLOCK))
+ vote(chip->awake_votable, SRAM_READ, false, 0);
return rc;
}