Skip to content

Commit

Permalink
dmaengine: qcom: bam_dma: Manage clocks when controlled_remotely is set
Browse files Browse the repository at this point in the history
When bam dma is "controlled remotely", thus far clocks were not controlled
from the Linux. In this scenario, Linux was disabling runtime pm in bam dma
driver and not doing any clock management in suspend/resume hooks.

With introduction of crypto engine bam dma, the clock is a rpmh resource
that can be controlled from both Linux and TZ/remote side.  Now bam dma
clock is getting enabled during probe even though the bam dma can be
"controlled remotely". But due to clocks not being handled properly,
bam_suspend generates a unbalanced clk_unprepare warning during system
suspend.

To fix the above issue and to enable proper clock-management, this patch
enables runtim-pm and handles bam dma clocks in suspend/resume hooks if
the clock node is present irrespective of controlled_remotely property.

Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: John Stultz <john.stultz@linaro.org>
Reviewed-by: Shawn Guo <shawn.guo@linaro.org>
Link: https://lore.kernel.org/r/20210126211859.790892-1-thara.gopinath@linaro.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
  • Loading branch information
Thara Gopinath authored and Vinod Koul committed Jan 27, 2021
1 parent 03d939c commit 123935a
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions drivers/dma/qcom/bam_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,13 +1274,13 @@ static int bam_dma_probe(struct platform_device *pdev)
dev_err(bdev->dev, "num-ees unspecified in dt\n");
}

bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
if (IS_ERR(bdev->bamclk)) {
if (!bdev->controlled_remotely)
return PTR_ERR(bdev->bamclk);
if (bdev->controlled_remotely)
bdev->bamclk = devm_clk_get_optional(bdev->dev, "bam_clk");
else
bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");

bdev->bamclk = NULL;
}
if (IS_ERR(bdev->bamclk))
return PTR_ERR(bdev->bamclk);

ret = clk_prepare_enable(bdev->bamclk);
if (ret) {
Expand Down Expand Up @@ -1354,7 +1354,7 @@ static int bam_dma_probe(struct platform_device *pdev)
if (ret)
goto err_unregister_dma;

if (bdev->controlled_remotely) {
if (!bdev->bamclk) {
pm_runtime_disable(&pdev->dev);
return 0;
}
Expand Down Expand Up @@ -1442,10 +1442,10 @@ static int __maybe_unused bam_dma_suspend(struct device *dev)
{
struct bam_device *bdev = dev_get_drvdata(dev);

if (!bdev->controlled_remotely)
if (bdev->bamclk) {
pm_runtime_force_suspend(dev);

clk_unprepare(bdev->bamclk);
clk_unprepare(bdev->bamclk);
}

return 0;
}
Expand All @@ -1455,12 +1455,13 @@ static int __maybe_unused bam_dma_resume(struct device *dev)
struct bam_device *bdev = dev_get_drvdata(dev);
int ret;

ret = clk_prepare(bdev->bamclk);
if (ret)
return ret;
if (bdev->bamclk) {
ret = clk_prepare(bdev->bamclk);
if (ret)
return ret;

if (!bdev->controlled_remotely)
pm_runtime_force_resume(dev);
}

return 0;
}
Expand Down

0 comments on commit 123935a

Please sign in to comment.