Commit 273f74a2 authored by Yang Yingliang's avatar Yang Yingliang Committed by Georgi Djakov
Browse files

interconnect: fix error handling in qnoc_probe()



Add missing clk_disable_unprepare() and clk_bulk_disable_unprepare()
in the error path in qnoc_probe(). And when qcom_icc_qos_set() fails,
it needs remove nodes and disable clks.

Fixes: 2e2113c8 ("interconnect: qcom: rpm: Handle interface clocks")
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Link: https://lore.kernel.org/r/20230803130521.959487-1-yangyingliang@huawei.com


Signed-off-by: default avatarGeorgi Djakov <djakov@kernel.org>
parent 577a3c5a
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@ int qnoc_probe(struct platform_device *pdev)

	ret = devm_clk_bulk_get(dev, qp->num_intf_clks, qp->intf_clks);
	if (ret)
		return ret;
		goto err_disable_unprepare_clk;

	provider = &qp->provider;
	provider->dev = dev;
@@ -512,13 +512,15 @@ int qnoc_probe(struct platform_device *pdev)
	/* If this fails, bus accesses will crash the platform! */
	ret = clk_bulk_prepare_enable(qp->num_intf_clks, qp->intf_clks);
	if (ret)
		return ret;
		goto err_disable_unprepare_clk;

	for (i = 0; i < num_nodes; i++) {
		size_t j;

		node = icc_node_create(qnodes[i]->id);
		if (IS_ERR(node)) {
			clk_bulk_disable_unprepare(qp->num_intf_clks,
						   qp->intf_clks);
			ret = PTR_ERR(node);
			goto err_remove_nodes;
		}
@@ -534,8 +536,11 @@ int qnoc_probe(struct platform_device *pdev)
		if (qnodes[i]->qos.ap_owned &&
		    qnodes[i]->qos.qos_mode != NOC_QOS_MODE_INVALID) {
			ret = qcom_icc_qos_set(node);
			if (ret)
				return ret;
			if (ret) {
				clk_bulk_disable_unprepare(qp->num_intf_clks,
							   qp->intf_clks);
				goto err_remove_nodes;
			}
		}

		data->nodes[i] = node;
@@ -563,6 +568,7 @@ int qnoc_probe(struct platform_device *pdev)
	icc_provider_deregister(provider);
err_remove_nodes:
	icc_nodes_remove(provider);
err_disable_unprepare_clk:
	clk_disable_unprepare(qp->bus_clk);

	return ret;