Skip to content

Commit 0fce1c9

Browse files
juhosggregkh
authored andcommitted
firmware: qcom_scm: disable clocks if qcom_scm_bw_enable() fails
[ Upstream commit 0c50b7f ] There are several functions which are calling qcom_scm_bw_enable() then returns immediately if the call fails and leaves the clocks enabled. Change the code of these functions to disable clocks when the qcom_scm_bw_enable() call fails. This also fixes a possible dma buffer leak in the qcom_scm_pas_init_image() function. Compile tested only due to lack of hardware with interconnect support. Cc: [email protected] Fixes: 65b7ebd ("firmware: qcom_scm: Add bw voting support to the SCM interface") Signed-off-by: Gabor Juhos <[email protected]> Reviewed-by: Mukesh Ojha <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Andersson <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 5ee241f commit 0fce1c9

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

drivers/firmware/qcom_scm.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -495,13 +495,14 @@ int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size,
495495

496496
ret = qcom_scm_bw_enable();
497497
if (ret)
498-
return ret;
498+
goto disable_clk;
499499

500500
desc.args[1] = mdata_phys;
501501

502502
ret = qcom_scm_call(__scm->dev, &desc, &res);
503-
504503
qcom_scm_bw_disable();
504+
505+
disable_clk:
505506
qcom_scm_clk_disable();
506507

507508
out:
@@ -563,10 +564,12 @@ int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size)
563564

564565
ret = qcom_scm_bw_enable();
565566
if (ret)
566-
return ret;
567+
goto disable_clk;
567568

568569
ret = qcom_scm_call(__scm->dev, &desc, &res);
569570
qcom_scm_bw_disable();
571+
572+
disable_clk:
570573
qcom_scm_clk_disable();
571574

572575
return ret ? : res.result[0];
@@ -598,10 +601,12 @@ int qcom_scm_pas_auth_and_reset(u32 peripheral)
598601

599602
ret = qcom_scm_bw_enable();
600603
if (ret)
601-
return ret;
604+
goto disable_clk;
602605

603606
ret = qcom_scm_call(__scm->dev, &desc, &res);
604607
qcom_scm_bw_disable();
608+
609+
disable_clk:
605610
qcom_scm_clk_disable();
606611

607612
return ret ? : res.result[0];
@@ -632,11 +637,12 @@ int qcom_scm_pas_shutdown(u32 peripheral)
632637

633638
ret = qcom_scm_bw_enable();
634639
if (ret)
635-
return ret;
640+
goto disable_clk;
636641

637642
ret = qcom_scm_call(__scm->dev, &desc, &res);
638-
639643
qcom_scm_bw_disable();
644+
645+
disable_clk:
640646
qcom_scm_clk_disable();
641647

642648
return ret ? : res.result[0];

0 commit comments

Comments
 (0)