Message ID | 20230725035304.2864-1-trevor.wu@mediatek.com |
---|---|
Headers | show |
Series | ASoC: mt8188-mt6359: add SOF support | expand |
On Tue, 2023-07-25 at 09:11 +0200, AngeloGioacchino Del Regno wrote: > Il 25/07/23 05:53, Trevor Wu ha scritto: > > SOF is enabled when adsp phandle is assigned to "mediatek,adsp". > > The required callback will be assigned when SOF is enabled. > > > > Additionally, "mediatek,dai-link" is introduced to decide the > > supported > > dai links for a project, so user can reuse the machine driver > > regardless > > of dai link combination. > > > > Signed-off-by: Trevor Wu <trevor.wu@mediatek.com> > > --- > > sound/soc/mediatek/mt8188/mt8188-mt6359.c | 217 > > ++++++++++++++++++++-- > > 1 file changed, 205 insertions(+), 12 deletions(-) > > > > diff --git a/sound/soc/mediatek/mt8188/mt8188-mt6359.c > > b/sound/soc/mediatek/mt8188/mt8188-mt6359.c > > index 667d79f33bf2..e205de2899a9 100644 > > --- a/sound/soc/mediatek/mt8188/mt8188-mt6359.c > > +++ b/sound/soc/mediatek/mt8188/mt8188-mt6359.c > > ..snip.. > > > @@ -1074,21 +1215,64 @@ static int mt8188_mt6359_dev_probe(struct > > platform_device *pdev) > > if (!card->name) > > card->name = card_data->name; > > > > - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > > - if (!priv) > > - return -ENOMEM; > > - > > if (of_property_read_bool(pdev->dev.of_node, "audio-routing")) > > { > > ret = snd_soc_of_parse_audio_routing(card, "audio- > > routing"); > > if (ret) > > return ret; > > } > > > > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > > + if (!priv) > > + return -ENOMEM; > > + > > + soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), > > GFP_KERNEL); > > + if (!soc_card_data) > > + return -ENOMEM; > > + > > + soc_card_data->mach_priv = priv; > > + > > + adsp_node = of_parse_phandle(pdev->dev.of_node, > > "mediatek,adsp", 0); > > + if (adsp_node) { > > + struct mtk_sof_priv *sof_priv; > > + > > + sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), > > GFP_KERNEL); > > + if (!sof_priv) { > > + ret = -ENOMEM; > > + goto err_adsp_node; > > + } > > + sof_priv->conn_streams = g_sof_conn_streams; > > + sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams); > > + soc_card_data->sof_priv = sof_priv; > > + card->probe = mtk_sof_card_probe; > > + card->late_probe = mtk_sof_card_late_probe; > > + if (!card->topology_shortname_created) { > > + snprintf(card->topology_shortname, 32, "sof- > > %s", card->name); > > + card->topology_shortname_created = true; > > + } > > + card->name = card->topology_shortname; > > + } > > + > > + if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai- > > link")) { > > + ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node, > > + "mediatek,dai-link", > > + mt8188_mt6359_dai_links, > > + ARRAY_SIZE(mt8188_mt6359 > > _dai_links)); > > + if (ret) { > > + dev_err_probe(&pdev->dev, ret, "Parse dai-link > > fail\n"); > > + goto err_adsp_node; > > + } > > + } else { > > + if (!adsp_node) > > + card->num_links = DAI_LINK_REGULAR_NUM; > > + } > > + > > platform_node = of_parse_phandle(pdev->dev.of_node, > > "mediatek,platform", 0); > > if (!platform_node) { > > ret = -EINVAL; > > - return dev_err_probe(&pdev->dev, ret, "Property > > 'platform' missing or invalid\n"); > > + dev_err_probe(&pdev->dev, ret, "Property 'platform' > > missing or invalid\n"); > > We could shorten this with > > ret = dev_err_probe(&pdev->dev, -EINVAL, "Property ...."); > goto err_adsp_node; > > ...but I don't have strong opinions about that, it's your choice. > It is concise. I will apply it in v2. > > + goto err_platform_node; > > + > > } > > > > ret = parse_dai_link_info(card); > > @@ -1096,8 +1280,12 @@ static int mt8188_mt6359_dev_probe(struct > > platform_device *pdev) > > goto err; > > > > for_each_card_prelinks(card, i, dai_link) { > > - if (!dai_link->platforms->name) > > - dai_link->platforms->of_node = platform_node; > > + if (!dai_link->platforms->name) { > > + if (!strncmp(dai_link->name, "AFE_SOF", > > strlen("AFE_SOF")) && adsp_node) > > + dai_link->platforms->of_node = > > adsp_node; > > + else > > + dai_link->platforms->of_node = > > platform_node; > > + } > > > > if (strcmp(dai_link->name, "DPTX_BE") == 0) { > > if (strcmp(dai_link->codecs->dai_name, "snd- > > soc-dummy-dai")) > > @@ -1140,7 +1328,7 @@ static int mt8188_mt6359_dev_probe(struct > > platform_device *pdev) > > } > > > > priv->private_data = card_data; > > - snd_soc_card_set_drvdata(card, priv); > > + snd_soc_card_set_drvdata(card, soc_card_data); > > > > ret = devm_snd_soc_register_card(&pdev->dev, card); > > if (ret) > > @@ -1149,6 +1337,11 @@ static int mt8188_mt6359_dev_probe(struct > > platform_device *pdev) > > err: > > of_node_put(platform_node); > > clean_card_reference(card); > > + > > +err_adsp_node: > > +err_platform_node: > > Just one label is enough. Keep err_adsp_node, remove > err_platform_node. > OK. I will remove one label in v2. Thanks, Trevor