Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f4fe1c5 authored by Jilai Wang's avatar Jilai Wang
Browse files

msm: npu: Use mutex to protect power on/off



Since there are multiple ways to turn on/off npu power, it's
necessary to use mutex to protect it to avoid race condition.

Change-Id: I01cce44d8baf31ac735fae989fd89defd57dbfc3
Signed-off-by: default avatarJilai Wang <jilaiw@codeaurora.org>
parent dabca6e5
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -335,26 +335,28 @@ int npu_enable_core_power(struct npu_device *npu_dev)
	struct npu_pwrctrl *pwr = &npu_dev->pwrctrl;
	int ret = 0;

	mutex_lock(&npu_dev->dev_lock);
	if (!pwr->pwr_vote_num) {
		ret = npu_enable_regulators(npu_dev);
		if (ret)
			return ret;
			goto fail;

		ret = npu_set_bw(npu_dev, 100, 100);
		if (ret) {
			npu_disable_regulators(npu_dev);
			return ret;
			goto fail;
		}

		ret = npu_enable_core_clocks(npu_dev);
		if (ret) {
			npu_set_bw(npu_dev, 0, 0);
			npu_disable_regulators(npu_dev);
			pwr->pwr_vote_num = 0;
			return ret;
			goto fail;
		}
	}
	pwr->pwr_vote_num++;
fail:
	mutex_unlock(&npu_dev->dev_lock);

	return ret;
}
@@ -363,8 +365,12 @@ void npu_disable_core_power(struct npu_device *npu_dev)
{
	struct npu_pwrctrl *pwr = &npu_dev->pwrctrl;

	if (!pwr->pwr_vote_num)
	mutex_lock(&npu_dev->dev_lock);
	if (!pwr->pwr_vote_num) {
		mutex_unlock(&npu_dev->dev_lock);
		return;
	}

	pwr->pwr_vote_num--;
	if (!pwr->pwr_vote_num) {
		npu_disable_core_clocks(npu_dev);
@@ -376,6 +382,7 @@ void npu_disable_core_power(struct npu_device *npu_dev)
		NPU_DBG("setting back to power level=%d\n",
			pwr->active_pwrlevel);
	}
	mutex_unlock(&npu_dev->dev_lock);
}

static int npu_enable_core_clocks(struct npu_device *npu_dev)
@@ -792,7 +799,13 @@ static int npu_enable_regulators(struct npu_device *npu_dev)
				regulators[i].regulator_name);
		}
	}

	if (rc) {
		for (i--; i >= 0; i--)
			regulator_disable(regulators[i].regulator);
	} else {
		host_ctx->power_vote_num++;
	}
	return rc;
}