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

Commit 53dae756 authored by Mao Jinlong's avatar Mao Jinlong Committed by Gerrit - the friendly Code Review server
Browse files

dcc_v2: Check enable status of dcc when changing curr_list



Avoid changing curr_list when dcc is enabled. Dcc needs to be disabled
before changing the curr_list. If any link list is enabled,the enable
status of dcc will be true.

Change-Id: I571b172a85b97e3a5e4d55531fad90641283b61e
Signed-off-by: default avatarMao Jinlong <jinlmao@codeaurora.org>
parent 3d91e789
Loading
Loading
Loading
Loading
+47 −2
Original line number Diff line number Diff line
@@ -666,6 +666,40 @@ static void dcc_disable(struct dcc_drvdata *drvdata)
	mutex_unlock(&drvdata->mutex);
}

static bool is_dcc_enabled(struct dcc_drvdata *drvdata)
{
	bool dcc_enable = false;
	int list;

	for (list = 0; list < DCC_MAX_LINK_LIST; list++) {
		if (drvdata->enable[list]) {
			dcc_enable = true;
			break;
		}
	}

	return dcc_enable;
}

static ssize_t curr_list_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
{
	int ret;
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);

	mutex_lock(&drvdata->mutex);
	if (drvdata->curr_list == DCC_INVALID_LINK_LIST) {
		dev_err(dev, "curr_list is not set.\n");
		ret = -EINVAL;
		goto err;
	}

	ret = scnprintf(buf, PAGE_SIZE, "%d\n",	drvdata->curr_list);
err:
	mutex_unlock(&drvdata->mutex);
	return ret;
}

static ssize_t curr_list_store(struct device *dev,
				   struct device_attribute *attr,
				   const char *buf, size_t size)
@@ -673,6 +707,7 @@ static ssize_t curr_list_store(struct device *dev,
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);
	unsigned long val;
	uint32_t lock_reg;
	bool dcc_enable = false;

	if (kstrtoul(buf, 16, &val))
		return -EINVAL;
@@ -682,6 +717,13 @@ static ssize_t curr_list_store(struct device *dev,

	mutex_lock(&drvdata->mutex);

	dcc_enable = is_dcc_enabled(drvdata);
	if (drvdata->curr_list != DCC_INVALID_LINK_LIST	&& dcc_enable) {
		dev_err(drvdata->dev, "DCC is enabled, please disable it first.\n");
		mutex_unlock(&drvdata->mutex);
		return -EINVAL;
	}

	lock_reg = dcc_readl(drvdata, DCC_LL_LOCK(val));
	if (lock_reg & 0x1) {
		dev_err(drvdata->dev, "DCC linked list is already configured\n");
@@ -693,7 +735,7 @@ static ssize_t curr_list_store(struct device *dev,

	return size;
}
static DEVICE_ATTR_WO(curr_list);
static DEVICE_ATTR_RW(curr_list);

static ssize_t func_type_show(struct device *dev,
				  struct device_attribute *attr, char *buf)
@@ -834,6 +876,7 @@ static ssize_t enable_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
{
	int ret;
	bool dcc_enable = false;
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);

	mutex_lock(&drvdata->mutex);
@@ -843,8 +886,10 @@ static ssize_t enable_show(struct device *dev,
		goto err;
	}

	dcc_enable = is_dcc_enabled(drvdata);

	ret = scnprintf(buf, PAGE_SIZE, "%u\n",
			 (unsigned int)drvdata->enable[drvdata->curr_list]);
			 (unsigned int)dcc_enable);
err:
	mutex_unlock(&drvdata->mutex);
	return ret;