Browse Source

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 <[email protected]>
Aditya Bavanari 5 years ago
parent
commit
fd90ac4b16
1 changed files with 5 additions and 4 deletions
  1. 5 4
      soc/pinctrl-lpi.c

+ 5 - 4
soc/pinctrl-lpi.c

@@ -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 = {