mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-13 08:07:32 -04:00
soc: pinctrl-lpi: Protect core_hw_vote status with lock
During SSR and lpi gpio read/write use cases, core_hw_vote status flag might be checked and modified in parallel. Protect the core_hw_vote status with mutex lock to avoid any race conditions. Change-Id: I313908dfa72430cc49d7d11e6ce8c1bb7af0a1c3 Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
This commit is contained in:
parent
89924096d7
commit
fd90ac4b16
1 changed files with 5 additions and 4 deletions
|
|
@ -148,6 +148,7 @@ static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr)
|
|||
return 0;
|
||||
}
|
||||
pm_runtime_get_sync(lpi_dev);
|
||||
mutex_lock(&state->core_hw_vote_lock);
|
||||
if (!state->core_hw_vote_status) {
|
||||
pr_err_ratelimited("%s: core hw vote clk is not enabled\n",
|
||||
__func__);
|
||||
|
|
@ -160,6 +161,7 @@ static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr)
|
|||
pr_err("%s: read 0x%x failed\n", __func__, addr);
|
||||
|
||||
err:
|
||||
mutex_unlock(&state->core_hw_vote_lock);
|
||||
pm_runtime_mark_last_busy(lpi_dev);
|
||||
pm_runtime_put_autosuspend(lpi_dev);
|
||||
return ret;
|
||||
|
|
@ -177,6 +179,7 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr,
|
|||
return 0;
|
||||
}
|
||||
pm_runtime_get_sync(lpi_dev);
|
||||
mutex_lock(&state->core_hw_vote_lock);
|
||||
if (!state->core_hw_vote_status) {
|
||||
pr_err_ratelimited("%s: core hw vote clk is not enabled\n",
|
||||
__func__);
|
||||
|
|
@ -186,6 +189,7 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr,
|
|||
|
||||
iowrite32(val, pad->base + pad->offset + addr);
|
||||
err:
|
||||
mutex_unlock(&state->core_hw_vote_lock);
|
||||
pm_runtime_mark_last_busy(lpi_dev);
|
||||
pm_runtime_put_autosuspend(lpi_dev);
|
||||
return ret;
|
||||
|
|
@ -484,11 +488,8 @@ static struct notifier_block service_nb = {
|
|||
|
||||
static void lpi_pinctrl_ssr_disable(struct device *dev, void *data)
|
||||
{
|
||||
struct lpi_gpio_state *state = dev_get_drvdata(dev);
|
||||
|
||||
lpi_dev_up = false;
|
||||
if (state->core_hw_vote_status)
|
||||
lpi_pinctrl_runtime_suspend(dev);
|
||||
lpi_pinctrl_runtime_suspend(dev);
|
||||
}
|
||||
|
||||
static const struct snd_event_ops lpi_pinctrl_ssr_ops = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue