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

Commit 90dca6b4 authored by Mao Jinlong's avatar Mao Jinlong
Browse files

CSR: Keep qdss clk being on for msr register before msr_reset



Swao msr registers' value will be reset to 0 when qdss clock is off.
Enable the qdss clock before set the msr register value and disable
the qdss clock after msr rest. It will make sure that the msr register
value won't be reset during tpdm enabled.

Change-Id: I79a26c47e7c5db88cf67a1b88bc9b2046c87b78e
Signed-off-by: default avatarMao Jinlong <jinlmao@codeaurora.org>
parent 303f69ea
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ struct csr_drvdata {
	struct device		*dev;
	struct coresight_device	*csdev;
	uint32_t		*msr;
	atomic_t		*msr_refcnt;
	uint32_t		blksize;
	uint32_t		flushperiod;
	struct coresight_csr		csr;
@@ -398,9 +399,12 @@ static ssize_t msr_store(struct device *dev,
	if (offset >= MSR_NUM)
		return -EINVAL;

	if (atomic_read(drvdata->msr_refcnt) == 0) {
		ret = clk_prepare_enable(drvdata->clk);
		if (ret)
			return ret;
		atomic_inc(drvdata->msr_refcnt);
	}

	spin_lock_irqsave(&drvdata->spin_lock, flags);
	CSR_UNLOCK(drvdata);
@@ -409,7 +413,6 @@ static ssize_t msr_store(struct device *dev,
	drvdata->msr[offset] = rval;
	CSR_LOCK(drvdata);
	spin_unlock_irqrestore(&drvdata->spin_lock, flags);
	clk_disable_unprepare(drvdata->clk);
	return size;
}

@@ -421,7 +424,7 @@ static ssize_t msr_reset_store(struct device *dev,
				 size_t size)
{
	unsigned long flags, val;
	int i, ret;
	int i;
	struct csr_drvdata *drvdata = dev_get_drvdata(dev->parent);

	if (IS_ERR_OR_NULL(drvdata) || !drvdata->msr_support ||
@@ -431,10 +434,10 @@ static ssize_t msr_reset_store(struct device *dev,
	if (kstrtoul(buf, 0, &val) || val != 1)
		return -EINVAL;

	ret = clk_prepare_enable(drvdata->clk);
	if (ret)
		return ret;
	if (atomic_read(drvdata->msr_refcnt) == 0)
		return -EINVAL;

	atomic_set(drvdata->msr_refcnt, 0);
	spin_lock_irqsave(&drvdata->spin_lock, flags);
	CSR_UNLOCK(drvdata);
	for (i = 0; i < MSR_NUM; i++) {
@@ -603,6 +606,12 @@ static int csr_probe(struct platform_device *pdev)
						GFP_KERNEL);
		if (!drvdata->msr)
			return -ENOMEM;

		drvdata->msr_refcnt = devm_kzalloc(dev, sizeof(atomic_t),
				GFP_KERNEL);
		if (!drvdata->msr_refcnt)
			return -ENOMEM;
		atomic_set(drvdata->msr_refcnt, 0);
		dev_dbg(dev, "msr_support operation supported\n");
	}