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

Commit 19bb62e0 authored by Saranya Chidura's avatar Saranya Chidura
Browse files

soc: qcom: dccv2: Add XO clock support



GCC_DCC_XO_CLK is voted and enabled in
the probe to enable DCC Hardware to write
data in SRAM address space.

Change-Id: I5eb55cfc8bf1f0a539012e179f9a9f944c540579
Signed-off-by: default avatarSaranya Chidura <schidura@codeaurora.org>
parent 34dacfee
Loading
Loading
Loading
Loading
+54 −8
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ struct dcc_drvdata {
	void __iomem		*ram_base;
	uint32_t		ram_size;
	struct clk		*clk;
	struct clk		*xo_clk;
	uint32_t		ram_offset;
	enum dcc_data_sink	data_sink;
	enum dcc_func_type	func_type[DCC_MAX_LINK_LIST];
@@ -203,6 +204,13 @@ static int dcc_sw_trigger(struct dcc_drvdata *drvdata)
	mutex_lock(&drvdata->mutex);

	if (drvdata->clk) {
		ret = clk_prepare_enable(drvdata->xo_clk);
		if (ret) {
			dev_err(drvdata->dev, "DCC xo clk enable failed\n");
			mutex_unlock(&drvdata->mutex);
			return ret;
		}

		ret = clk_prepare_enable(drvdata->clk);
		if (ret) {
			dev_err(drvdata->dev, "DCC clk enable failed\n");
@@ -234,8 +242,10 @@ static int dcc_sw_trigger(struct dcc_drvdata *drvdata)
	ret = dcc_read_status(drvdata);

err:
	if (drvdata->clk)
	if (drvdata->clk) {
		clk_disable_unprepare(drvdata->clk);
		clk_disable_unprepare(drvdata->xo_clk);
	}
	mutex_unlock(&drvdata->mutex);
	return ret;
}
@@ -552,6 +562,12 @@ static int dcc_enable(struct dcc_drvdata *drvdata)
	mutex_lock(&drvdata->mutex);

	if (drvdata->clk) {
		ret = clk_prepare_enable(drvdata->xo_clk);
		if (ret) {
			dev_info(drvdata->dev, "DCC xo clk enable failed\n");
			goto err;
		}

		ret = clk_prepare_enable(drvdata->clk);
		if (ret) {
			dev_info(drvdata->dev, "DCC clk enable failed\n");
@@ -573,8 +589,10 @@ static int dcc_enable(struct dcc_drvdata *drvdata)
		ret = __dcc_ll_cfg(drvdata, list);
		if (ret) {
			dev_info(drvdata->dev, "DCC ram programming failed\n");
			if (drvdata->clk && !drvdata->enable[list])
			if (drvdata->clk && !drvdata->enable[list]) {
				clk_disable_unprepare(drvdata->clk);
				clk_disable_unprepare(drvdata->xo_clk);
			}
			goto err;
		}

@@ -635,8 +653,10 @@ static void dcc_disable(struct dcc_drvdata *drvdata)
	drvdata->ram_cfg = 0;
	drvdata->ram_start = 0;

	if (drvdata->clk)
	if (drvdata->clk) {
		clk_disable_unprepare(drvdata->clk);
		clk_disable_unprepare(drvdata->xo_clk);
	}
	mutex_unlock(&drvdata->mutex);
}

@@ -657,8 +677,16 @@ static ssize_t dcc_curr_list(struct device *dev,
	mutex_lock(&drvdata->mutex);

	if (drvdata->clk) {
		int ret = clk_prepare_enable(drvdata->clk);
		int ret = clk_prepare_enable(drvdata->xo_clk);

		if (ret) {
			dev_err(drvdata->dev, "DCC xo clk enable failed\n");
			mutex_unlock(&drvdata->mutex);
			return -EINVAL;
		}


		ret = clk_prepare_enable(drvdata->clk);
		if (ret) {
			dev_err(drvdata->dev, "DCC clk enable failed\n");
			mutex_unlock(&drvdata->mutex);
@@ -673,8 +701,10 @@ static ssize_t dcc_curr_list(struct device *dev,
		return -EINVAL;
	}
	drvdata->curr_list = val;
	if (drvdata->clk)
	if (drvdata->clk) {
		clk_disable_unprepare(drvdata->clk);
		clk_disable_unprepare(drvdata->xo_clk);
	}
	mutex_unlock(&drvdata->mutex);

	return size;
@@ -1425,6 +1455,11 @@ static ssize_t dcc_sram_read(struct file *file, char __user *data,
		return -ENOMEM;

	if (drvdata->clk) {
		ret = clk_prepare_enable(drvdata->xo_clk);
		if (ret) {
			kfree(buf);
			return ret;
		}
		ret = clk_prepare_enable(drvdata->clk);
		if (ret) {
			kfree(buf);
@@ -1434,8 +1469,10 @@ static ssize_t dcc_sram_read(struct file *file, char __user *data,

	memcpy_fromio(buf, (drvdata->ram_base + *ppos), len);

	if (drvdata->clk)
	if (drvdata->clk) {
		clk_disable_unprepare(drvdata->clk);
		clk_disable_unprepare(drvdata->xo_clk);
	}

	if (copy_to_user(data, buf, len)) {
		dev_err(drvdata->dev,
@@ -1610,10 +1647,17 @@ static int dcc_probe(struct platform_device *pdev)

	if (of_property_read_bool(pdev->dev.of_node, "clk-enable")) {
		drvdata->clk = devm_clk_get(dev, "dcc_clk");
		if (IS_ERR(drvdata->clk)) {
		drvdata->xo_clk = devm_clk_get(dev, "dcc_xo_clk");
		if (IS_ERR(drvdata->clk) && IS_ERR(drvdata->xo_clk)) {
			dev_info(dev, "devm_clk_get failed, probing deffered\n");
			return -EPROBE_DEFER;
		}
		ret = clk_prepare_enable(drvdata->xo_clk);
		if (ret) {
			dev_err(dev, "xo clk prepare enable failed\n");
			return -EINVAL;
		}

		ret = clk_prepare_enable(drvdata->clk);
		if (ret) {
			dev_err(dev, "clk prepare enable failed\n");
@@ -1654,8 +1698,10 @@ static int dcc_probe(struct platform_device *pdev)

	memset_io(drvdata->ram_base, 0, drvdata->ram_size);

	if (of_property_read_bool(pdev->dev.of_node, "clk-enable"))
	if (of_property_read_bool(pdev->dev.of_node, "clk-enable")) {
		clk_disable_unprepare(drvdata->clk);
		clk_disable_unprepare(drvdata->xo_clk);
	}

	drvdata->data_sink = DCC_DATA_SINK_SRAM;
	ret = of_property_read_string(pdev->dev.of_node, "qcom,data-sink",