Skip to content

Commit

Permalink
ASoC: rockchip: spdif: Handle clk by pm runtime
Browse files Browse the repository at this point in the history
This patch handle the clk by pm runtime mechanism to simplify
the clk management.

Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
Link: https://lore.kernel.org/r/1594635960-67855-1-git-send-email-sugar.zhang@rock-chips.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Sugar Zhang authored and Mark Brown committed Jul 13, 2020
1 parent 1c62ec5 commit f50d67f
Showing 1 changed file with 17 additions and 42 deletions.
59 changes: 17 additions & 42 deletions sound/soc/rockchip/rockchip_spdif.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,44 +306,22 @@ static int rk_spdif_probe(struct platform_device *pdev)
return -ENOMEM;

spdif->hclk = devm_clk_get(&pdev->dev, "hclk");
if (IS_ERR(spdif->hclk)) {
dev_err(&pdev->dev, "Can't retrieve rk_spdif bus clock\n");
if (IS_ERR(spdif->hclk))
return PTR_ERR(spdif->hclk);
}
ret = clk_prepare_enable(spdif->hclk);
if (ret) {
dev_err(spdif->dev, "hclock enable failed %d\n", ret);
return ret;
}

spdif->mclk = devm_clk_get(&pdev->dev, "mclk");
if (IS_ERR(spdif->mclk)) {
dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n");
ret = PTR_ERR(spdif->mclk);
goto err_disable_hclk;
}

ret = clk_prepare_enable(spdif->mclk);
if (ret) {
dev_err(spdif->dev, "clock enable failed %d\n", ret);
goto err_disable_clocks;
}
if (IS_ERR(spdif->mclk))
return PTR_ERR(spdif->mclk);

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(regs)) {
ret = PTR_ERR(regs);
goto err_disable_clocks;
}
if (IS_ERR(regs))
return PTR_ERR(regs);

spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs,
&rk_spdif_regmap_config);
if (IS_ERR(spdif->regmap)) {
dev_err(&pdev->dev,
"Failed to initialise managed register map\n");
ret = PTR_ERR(spdif->regmap);
goto err_disable_clocks;
}
if (IS_ERR(spdif->regmap))
return PTR_ERR(spdif->regmap);

spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR;
spdif->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
Expand All @@ -352,47 +330,44 @@ static int rk_spdif_probe(struct platform_device *pdev)
spdif->dev = &pdev->dev;
dev_set_drvdata(&pdev->dev, spdif);

pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);
pm_request_idle(&pdev->dev);
if (!pm_runtime_enabled(&pdev->dev)) {
ret = rk_spdif_runtime_resume(&pdev->dev);
if (ret)
goto err_pm_runtime;
}

ret = devm_snd_soc_register_component(&pdev->dev,
&rk_spdif_component,
&rk_spdif_dai, 1);
if (ret) {
dev_err(&pdev->dev, "Could not register DAI\n");
goto err_pm_runtime;
goto err_pm_suspend;
}

ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret) {
dev_err(&pdev->dev, "Could not register PCM\n");
goto err_pm_runtime;
goto err_pm_suspend;
}

return 0;

err_pm_suspend:
if (!pm_runtime_status_suspended(&pdev->dev))
rk_spdif_runtime_suspend(&pdev->dev);
err_pm_runtime:
pm_runtime_disable(&pdev->dev);
err_disable_clocks:
clk_disable_unprepare(spdif->mclk);
err_disable_hclk:
clk_disable_unprepare(spdif->hclk);

return ret;
}

static int rk_spdif_remove(struct platform_device *pdev)
{
struct rk_spdif_dev *spdif = dev_get_drvdata(&pdev->dev);

pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev))
rk_spdif_runtime_suspend(&pdev->dev);

clk_disable_unprepare(spdif->mclk);
clk_disable_unprepare(spdif->hclk);

return 0;
}

Expand Down

0 comments on commit f50d67f

Please sign in to comment.