From 8fb9b4c3ba5caf4330c68af01505cacc5d4b11b1 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Tue, 28 Nov 2023 08:51:15 +0800 Subject: [PATCH] ASoC: rockchip: i2s-tdm: Register PCM before DAI component API snd_soc_register_component will try to rebind card per each component register. and the ASoC allow no-pcm card instance. devm_snd_soc_register_component snd_soc_try_rebind_card snd_soc_bind_card snd_soc_add_pcm_runtime devm_snd_dmaengine_pcm_register So, we should register PCM before DAI component. Signed-off-by: Sugar Zhang Change-Id: I578b7c54b96cfa89fd2f8cf346832e2b68a1d355 --- sound/soc/rockchip/rockchip_i2s_tdm.c | 43 +++++++++++++++++---------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c index 4140c731222e..612c2639c52b 100644 --- a/sound/soc/rockchip/rockchip_i2s_tdm.c +++ b/sound/soc/rockchip/rockchip_i2s_tdm.c @@ -2673,6 +2673,29 @@ static int rockchip_i2s_tdm_keep_clk_always_on(struct rk_i2s_tdm_dev *i2s_tdm) return 0; } +static int rockchip_i2s_tdm_register_platform(struct device *dev) +{ + int ret = 0; + + if (device_property_read_bool(dev, "rockchip,no-dmaengine")) { + dev_info(dev, "Used for Multi-DAI\n"); + return 0; + } + + if (device_property_read_bool(dev, "rockchip,digital-loopback")) { + ret = devm_snd_dmaengine_dlp_register(dev, &dconfig); + if (ret) + dev_err(dev, "Could not register DLP\n"); + return ret; + } + + ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0); + if (ret) + dev_err(dev, "Could not register PCM\n"); + + return ret; +} + static int rockchip_i2s_tdm_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; @@ -2950,30 +2973,18 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev) goto err_pm_disable; } + ret = rockchip_i2s_tdm_register_platform(&pdev->dev); + if (ret) + goto err_suspend; + ret = devm_snd_soc_register_component(&pdev->dev, &rockchip_i2s_tdm_component, soc_dai, 1); - if (ret) { dev_err(&pdev->dev, "Could not register DAI\n"); goto err_suspend; } - if (of_property_read_bool(node, "rockchip,no-dmaengine")) { - dev_info(&pdev->dev, "Used for Multi-DAI\n"); - return 0; - } - - if (of_property_read_bool(node, "rockchip,digital-loopback")) - ret = devm_snd_dmaengine_dlp_register(&pdev->dev, &dconfig); - else - ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); - - if (ret) { - dev_err(&pdev->dev, "Could not register PCM\n"); - return ret; - } - return 0; err_suspend: