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

Commit ec7a6dac authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: dccv2: Add sanity checks to make sure we have a valid list"

parents 0abf9e88 1d42f9de
Loading
Loading
Loading
Loading
+53 −12
Original line number Original line Diff line number Diff line
@@ -671,13 +671,14 @@ static ssize_t dcc_store_func_type(struct device *dev,
	if (sscanf(buf, "%s", str) != 1)
	if (sscanf(buf, "%s", str) != 1)
		return -EINVAL;
		return -EINVAL;


	mutex_lock(&drvdata->mutex);
	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev,
		dev_err(dev,
			"Select link list to program using curr_list\n");
			"Select link list to program using curr_list\n");
		return -EINVAL;
		ret = -EINVAL;
		goto out;
	}
	}


	mutex_lock(&drvdata->mutex);
	if (drvdata->enable[drvdata->curr_list]) {
	if (drvdata->enable[drvdata->curr_list]) {
		ret = -EBUSY;
		ret = -EBUSY;
		goto out;
		goto out;
@@ -771,10 +772,21 @@ static DEVICE_ATTR(trigger, 0200, NULL, dcc_store_trigger);
static ssize_t dcc_show_enable(struct device *dev,
static ssize_t dcc_show_enable(struct device *dev,
			       struct device_attribute *attr, char *buf)
			       struct device_attribute *attr, char *buf)
{
{
	int ret;
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);


	return scnprintf(buf, PAGE_SIZE, "%u\n",
	mutex_lock(&drvdata->mutex);
	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto err;
	}

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


static ssize_t dcc_store_enable(struct device *dev,
static ssize_t dcc_store_enable(struct device *dev,
@@ -812,10 +824,13 @@ static ssize_t dcc_show_config(struct device *dev,


	buf[0] = '\0';
	buf[0] = '\0';


	if (drvdata->curr_list >= DCC_MAX_LINK_LIST)
		return -EINVAL;

	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);
	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		count = -EINVAL;
		goto err;
	}

	list_for_each_entry(entry,
	list_for_each_entry(entry,
			    &drvdata->cfg_head[drvdata->curr_list], list) {
			    &drvdata->cfg_head[drvdata->curr_list], list) {
		switch (entry->desc_type) {
		switch (entry->desc_type) {
@@ -852,8 +867,8 @@ static ssize_t dcc_show_config(struct device *dev,
		count += len;
		count += len;
	}
	}


err:
	mutex_unlock(&drvdata->mutex);
	mutex_unlock(&drvdata->mutex);

	return count;
	return count;
}
}


@@ -866,6 +881,12 @@ static int dcc_config_add(struct dcc_drvdata *drvdata, unsigned int addr,


	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);


	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(drvdata->dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto err;
	}

	if (!len) {
	if (!len) {
		dev_err(drvdata->dev, "DCC: Invalid length\n");
		dev_err(drvdata->dev, "DCC: Invalid length\n");
		ret = -EINVAL;
		ret = -EINVAL;
@@ -959,11 +980,6 @@ static ssize_t dcc_store_config(struct device *dev,
	if (nval <= 0 || nval > 3)
	if (nval <= 0 || nval > 3)
		return -EINVAL;
		return -EINVAL;


	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		return -EINVAL;
	}

	if (nval == 1) {
	if (nval == 1) {
		len = 1;
		len = 1;
		apb_bus = 0;
		apb_bus = 0;
@@ -1028,6 +1044,12 @@ static ssize_t dcc_show_crc_error(struct device *dev,
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);


	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);
	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto err;
	}

	if (!drvdata->enable[drvdata->curr_list]) {
	if (!drvdata->enable[drvdata->curr_list]) {
		ret = -EINVAL;
		ret = -EINVAL;
		goto err;
		goto err;
@@ -1049,6 +1071,13 @@ static ssize_t dcc_show_ready(struct device *dev,
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);
	struct dcc_drvdata *drvdata = dev_get_drvdata(dev);


	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);

	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto err;
	}

	if (!drvdata->enable[drvdata->curr_list]) {
	if (!drvdata->enable[drvdata->curr_list]) {
		ret = -EINVAL;
		ret = -EINVAL;
		goto err;
		goto err;
@@ -1159,6 +1188,12 @@ static ssize_t dcc_rd_mod_wr(struct device *dev,
		goto err;
		goto err;
	}
	}


	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto err;
	}

	if (list_empty(&drvdata->cfg_head[drvdata->curr_list])) {
	if (list_empty(&drvdata->cfg_head[drvdata->curr_list])) {
		dev_err(drvdata->dev, "DCC: No read address programmed\n");
		dev_err(drvdata->dev, "DCC: No read address programmed\n");
		ret = -EPERM;
		ret = -EPERM;
@@ -1266,6 +1301,12 @@ static ssize_t dcc_store_cti_trig(struct device *dev,


	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);


	if (drvdata->curr_list >= DCC_MAX_LINK_LIST) {
		dev_err(dev, "Select link list to program using curr_list\n");
		ret = -EINVAL;
		goto out;
	}

	if (drvdata->enable[drvdata->curr_list]) {
	if (drvdata->enable[drvdata->curr_list]) {
		ret = -EBUSY;
		ret = -EBUSY;
		goto out;
		goto out;