Skip to content

Commit 273f74a

Browse files
Yang YingliangGeorgi Djakov
authored andcommitted
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: 2e2113c ("interconnect: qcom: rpm: Handle interface clocks") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Link: https://lore.kernel.org/r/20230803130521.959487-1-yangyingliang@huawei.com Signed-off-by: Georgi Djakov <djakov@kernel.org>
1 parent 577a3c5 commit 273f74a

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

drivers/interconnect/qcom/icc-rpm.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ int qnoc_probe(struct platform_device *pdev)
497497

498498
ret = devm_clk_bulk_get(dev, qp->num_intf_clks, qp->intf_clks);
499499
if (ret)
500-
return ret;
500+
goto err_disable_unprepare_clk;
501501

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

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

520520
node = icc_node_create(qnodes[i]->id);
521521
if (IS_ERR(node)) {
522+
clk_bulk_disable_unprepare(qp->num_intf_clks,
523+
qp->intf_clks);
522524
ret = PTR_ERR(node);
523525
goto err_remove_nodes;
524526
}
@@ -534,8 +536,11 @@ int qnoc_probe(struct platform_device *pdev)
534536
if (qnodes[i]->qos.ap_owned &&
535537
qnodes[i]->qos.qos_mode != NOC_QOS_MODE_INVALID) {
536538
ret = qcom_icc_qos_set(node);
537-
if (ret)
538-
return ret;
539+
if (ret) {
540+
clk_bulk_disable_unprepare(qp->num_intf_clks,
541+
qp->intf_clks);
542+
goto err_remove_nodes;
543+
}
539544
}
540545

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

568574
return ret;

0 commit comments

Comments
 (0)