forked from Minki/linux
dmaengine: qcom: bam_dma: Manage clocks when controlled_remotely is set
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>
This commit is contained in:
parent
03d939c7e3
commit
123935a4ca
@ -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) {
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user