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

Commit 54b3fc0d authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "dcc_v2: Check enable status of dcc when changing curr_list"

parents 5d7ed52c 04a4548f
Loading
Loading
Loading
Loading
+49 −4
Original line number Diff line number Diff line
@@ -679,13 +679,48 @@ static void dcc_disable(struct dcc_drvdata *drvdata)
	mutex_unlock(&drvdata->mutex);
}

static ssize_t dcc_curr_list(struct device *dev,
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 dcc_show_curr_list(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 dcc_store_curr_list(struct device *dev,
				   struct device_attribute *attr,
				   const char *buf, size_t size)
{
	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;
@@ -695,6 +730,13 @@ static ssize_t dcc_curr_list(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");
@@ -706,8 +748,8 @@ static ssize_t dcc_curr_list(struct device *dev,

	return size;
}
static DEVICE_ATTR(curr_list, 0200,
		   NULL, dcc_curr_list);
static DEVICE_ATTR(curr_list, 0644,
			dcc_show_curr_list, dcc_store_curr_list);

static ssize_t dcc_show_func_type(struct device *dev,
				  struct device_attribute *attr, char *buf)
@@ -850,6 +892,7 @@ static ssize_t dcc_show_enable(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);
@@ -859,8 +902,10 @@ static ssize_t dcc_show_enable(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;