From nobody Wed Nov 13 14:58:56 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD8EAC433F5 for ; Fri, 11 Mar 2022 16:22:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344165AbiCKQXh (ORCPT ); Fri, 11 Mar 2022 11:23:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236822AbiCKQX1 (ORCPT ); Fri, 11 Mar 2022 11:23:27 -0500 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A3871D17AD; Fri, 11 Mar 2022 08:22:23 -0800 (PST) X-UUID: d29245aabc5c419d9c5a0f40e7bf4b03-20220312 X-UUID: d29245aabc5c419d9c5a0f40e7bf4b03-20220312 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 775471799; Sat, 12 Mar 2022 00:22:19 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.15; Sat, 12 Mar 2022 00:22:17 +0800 Received: from localhost.localdomain (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 12 Mar 2022 00:22:16 +0800 From: Jiaxin Yu To: , CC: , , , , , , , , , , , Jiaxin Yu , kernel test robot Subject: [v4 2/2] ASoC: mediatek: mt8192: support rt1015p_rt5682s Date: Sat, 12 Mar 2022 00:22:13 +0800 Message-ID: <20220311162213.6942-3-jiaxin.yu@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220311162213.6942-1-jiaxin.yu@mediatek.com> References: <20220311162213.6942-1-jiaxin.yu@mediatek.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Supports machines with rt1015p and rt5682s. Uses new proposed compatible string "mt8192_mt6359_rt1015p_rt5682s". Using define to simplifies card name and compatible name, and uses the snd_soc_of_get_dai_link_codecs() to complete the configuration of dai_link's codecs. Signed-off-by: Jiaxin Yu Reported-by: kernel test robot --- sound/soc/mediatek/Kconfig | 1 + .../mt8192/mt8192-mt6359-rt1015-rt5682.c | 204 +++++++++++------- 2 files changed, 128 insertions(+), 77 deletions(-) diff --git a/sound/soc/mediatek/Kconfig b/sound/soc/mediatek/Kconfig index 0d154350f180..bb774dfe867f 100644 --- a/sound/soc/mediatek/Kconfig +++ b/sound/soc/mediatek/Kconfig @@ -179,6 +179,7 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682 select SND_SOC_RT1015 select SND_SOC_RT1015P select SND_SOC_RT5682_I2C + select SND_SOC_RT5682S select SND_SOC_DMIC help This adds ASoC driver for Mediatek MT8192 boards diff --git a/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c b/soun= d/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c index ee91569c0911..c140d3a5978e 100644 --- a/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c +++ b/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c @@ -28,8 +28,13 @@ #define RT1015_DEV0_NAME "rt1015.1-0028" #define RT1015_DEV1_NAME "rt1015.1-0029" =20 -#define RT5682_CODEC_DAI "rt5682-aif1" -#define RT5682_DEV0_NAME "rt5682.1-001a" +#define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682" +#define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682" +#define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s" + +#define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682" +#define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682" +#define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s" =20 struct mt8192_mt6359_priv { struct snd_soc_jack headset_jack; @@ -71,8 +76,8 @@ static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_sub= stream *substream, return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); } =20 -static int mt8192_rt5682_i2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) +static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substrea= m, + struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd =3D asoc_substream_to_rtd(substream); struct snd_soc_card *card =3D rtd->card; @@ -121,8 +126,8 @@ static const struct snd_soc_ops mt8192_rt1015_i2s_ops = =3D { .hw_params =3D mt8192_rt1015_i2s_hw_params, }; =20 -static const struct snd_soc_ops mt8192_rt5682_i2s_ops =3D { - .hw_params =3D mt8192_rt5682_i2s_hw_params, +static const struct snd_soc_ops mt8192_rt5682x_i2s_ops =3D { + .hw_params =3D mt8192_rt5682x_i2s_hw_params, }; =20 static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rt= d) @@ -604,17 +609,9 @@ SND_SOC_DAILINK_DEFS(i2s2, DAILINK_COMP_ARRAY(COMP_DUMMY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); =20 -SND_SOC_DAILINK_DEFS(i2s3_rt1015, - DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), - DAILINK_COMP_ARRAY(COMP_CODEC(RT1015_DEV0_NAME, - RT1015_CODEC_DAI), - COMP_CODEC(RT1015_DEV1_NAME, - RT1015_CODEC_DAI)), - DAILINK_COMP_ARRAY(COMP_EMPTY())); - -SND_SOC_DAILINK_DEFS(i2s3_rt1015p, +SND_SOC_DAILINK_DEFS(i2s3, DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), - DAILINK_COMP_ARRAY(COMP_CODEC("rt1015p", "HiFi")), + DAILINK_COMP_ARRAY(COMP_EMPTY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); =20 SND_SOC_DAILINK_DEFS(i2s5, @@ -634,14 +631,12 @@ SND_SOC_DAILINK_DEFS(i2s7, =20 SND_SOC_DAILINK_DEFS(i2s8, DAILINK_COMP_ARRAY(COMP_CPU("I2S8")), - DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME, - RT5682_CODEC_DAI)), + DAILINK_COMP_ARRAY(COMP_EMPTY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); =20 SND_SOC_DAILINK_DEFS(i2s9, DAILINK_COMP_ARRAY(COMP_CPU("I2S9")), - DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME, - RT5682_CODEC_DAI)), + DAILINK_COMP_ARRAY(COMP_EMPTY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); =20 SND_SOC_DAILINK_DEFS(connsys_i2s, @@ -929,6 +924,7 @@ static struct snd_soc_dai_link mt8192_mt6359_dai_links[= ] =3D { .dpcm_playback =3D 1, .ignore_suspend =3D 1, .be_hw_params_fixup =3D mt8192_i2s_hw_params_fixup, + SND_SOC_DAILINK_REG(i2s3), }, { .name =3D "I2S5", @@ -962,7 +958,7 @@ static struct snd_soc_dai_link mt8192_mt6359_dai_links[= ] =3D { .init =3D mt8192_rt5682_init, .be_hw_params_fixup =3D mt8192_i2s_hw_params_fixup, SND_SOC_DAILINK_REG(i2s8), - .ops =3D &mt8192_rt5682_i2s_ops, + .ops =3D &mt8192_rt5682x_i2s_ops, }, { .name =3D "I2S9", @@ -971,7 +967,7 @@ static struct snd_soc_dai_link mt8192_mt6359_dai_links[= ] =3D { .ignore_suspend =3D 1, .be_hw_params_fixup =3D mt8192_i2s_hw_params_fixup, SND_SOC_DAILINK_REG(i2s9), - .ops =3D &mt8192_rt5682_i2s_ops, + .ops =3D &mt8192_rt5682x_i2s_ops, }, { .name =3D "CONNSYS_I2S", @@ -1051,7 +1047,7 @@ static struct snd_soc_codec_conf rt1015_amp_conf[] = =3D { }; =20 static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card =3D { - .name =3D "mt8192_mt6359_rt1015_rt5682", + .name =3D RT1015_RT5682_CARD_NAME, .owner =3D THIS_MODULE, .dai_link =3D mt8192_mt6359_dai_links, .num_links =3D ARRAY_SIZE(mt8192_mt6359_dai_links), @@ -1066,13 +1062,13 @@ static struct snd_soc_card mt8192_mt6359_rt1015_rt5= 682_card =3D { }; =20 static const struct snd_soc_dapm_widget -mt8192_mt6359_rt1015p_rt5682_widgets[] =3D { +mt8192_mt6359_rt1015p_rt5682x_widgets[] =3D { SND_SOC_DAPM_SPK("Speakers", NULL), SND_SOC_DAPM_HP("Headphone Jack", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), }; =20 -static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682_routes= [] =3D { +static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_route= s[] =3D { /* speaker */ { "Speakers", NULL, "Speaker" }, /* headset */ @@ -1081,74 +1077,112 @@ static const struct snd_soc_dapm_route mt8192_mt63= 59_rt1015p_rt5682_routes[] =3D { { "IN1P", NULL, "Headset Mic" }, }; =20 -static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682_controls= [] =3D { +static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_control= s[] =3D { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Headphone Jack"), SOC_DAPM_PIN_SWITCH("Headset Mic"), }; =20 -static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682_card =3D { - .name =3D "mt8192_mt6359_rt1015p_rt5682", +static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card =3D { .owner =3D THIS_MODULE, .dai_link =3D mt8192_mt6359_dai_links, .num_links =3D ARRAY_SIZE(mt8192_mt6359_dai_links), - .controls =3D mt8192_mt6359_rt1015p_rt5682_controls, - .num_controls =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_controls), - .dapm_widgets =3D mt8192_mt6359_rt1015p_rt5682_widgets, - .num_dapm_widgets =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_widgets), - .dapm_routes =3D mt8192_mt6359_rt1015p_rt5682_routes, - .num_dapm_routes =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_routes), + .controls =3D mt8192_mt6359_rt1015p_rt5682x_controls, + .num_controls =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls), + .dapm_widgets =3D mt8192_mt6359_rt1015p_rt5682x_widgets, + .num_dapm_widgets =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets), + .dapm_routes =3D mt8192_mt6359_rt1015p_rt5682x_routes, + .num_dapm_routes =3D ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes), }; =20 +static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card, + struct snd_soc_dai_link *link, + struct device_node *node, + char *link_name) +{ + int ret; + + if (node && strcmp(link->name, link_name) =3D=3D 0) { + ret =3D snd_soc_of_get_dai_link_codecs(card->dev, node, link); + if (ret < 0) { + dev_err(card->dev, "get dai link codecs fail\n"); + return ret; + } + } + + return 0; +} + static int mt8192_mt6359_dev_probe(struct platform_device *pdev) { struct snd_soc_card *card; - struct device_node *platform_node, *hdmi_codec; + struct device_node *platform_node, *hdmi_codec, *headset_codec, *speaker_= codec; int ret, i; struct snd_soc_dai_link *dai_link; struct mt8192_mt6359_priv *priv; + struct device *dev; =20 - platform_node =3D of_parse_phandle(pdev->dev.of_node, - "mediatek,platform", 0); - if (!platform_node) { - dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); + card =3D (struct snd_soc_card *)of_device_get_match_data(&pdev->dev); + if (!card) return -EINVAL; + card->dev =3D &pdev->dev; + dev =3D &pdev->dev; + + if (of_device_is_compatible(dev->of_node, RT1015P_RT5682_OF_NAME)) + card->name =3D RT1015P_RT5682_CARD_NAME; + else if (of_device_is_compatible(dev->of_node, RT1015P_RT5682S_OF_NAME)) + card->name =3D RT1015P_RT5682S_CARD_NAME; + else + dev_dbg(dev, "No need to set card name\n"); + + platform_node =3D of_parse_phandle(dev->of_node, "mediatek,platform", 0); + if (!platform_node) { + ret =3D -EINVAL; + dev_err_probe(dev, ret, "Property 'platform' missing or invalid\n"); + goto err_platform_node; } =20 - card =3D (struct snd_soc_card *)of_device_get_match_data(&pdev->dev); - if (!card) { + hdmi_codec =3D of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0); + if (!hdmi_codec) { ret =3D -EINVAL; - goto put_platform_node; + dev_err_probe(dev, ret, "Property 'hdmi-codec' missing or invalid\n"); + goto err_hdmi_codec; } - card->dev =3D &pdev->dev; =20 - hdmi_codec =3D of_parse_phandle(pdev->dev.of_node, - "mediatek,hdmi-codec", 0); + speaker_codec =3D of_get_child_by_name(dev->of_node, "mediatek,speaker-co= dec"); + if (!speaker_codec) { + ret =3D -EINVAL; + dev_err_probe(dev, ret, "Property 'speaker_codec' missing or invalid\n"); + goto err_speaker_codec; + } + + headset_codec =3D of_get_child_by_name(dev->of_node, "mediatek,headset-co= dec"); + if (!headset_codec) { + ret =3D -EINVAL; + dev_err_probe(dev, ret, "Property 'headset_codec' missing or invalid\n"); + goto err_headset_codec; + } =20 for_each_card_prelinks(card, i, dai_link) { - if (strcmp(dai_link->name, "I2S3") =3D=3D 0) { - if (card =3D=3D &mt8192_mt6359_rt1015_rt5682_card) { - dai_link->ops =3D &mt8192_rt1015_i2s_ops; - dai_link->cpus =3D i2s3_rt1015_cpus; - dai_link->num_cpus =3D - ARRAY_SIZE(i2s3_rt1015_cpus); - dai_link->codecs =3D i2s3_rt1015_codecs; - dai_link->num_codecs =3D - ARRAY_SIZE(i2s3_rt1015_codecs); - dai_link->platforms =3D i2s3_rt1015_platforms; - dai_link->num_platforms =3D - ARRAY_SIZE(i2s3_rt1015_platforms); - } else if (card =3D=3D &mt8192_mt6359_rt1015p_rt5682_card) { - dai_link->cpus =3D i2s3_rt1015p_cpus; - dai_link->num_cpus =3D - ARRAY_SIZE(i2s3_rt1015p_cpus); - dai_link->codecs =3D i2s3_rt1015p_codecs; - dai_link->num_codecs =3D - ARRAY_SIZE(i2s3_rt1015p_codecs); - dai_link->platforms =3D i2s3_rt1015p_platforms; - dai_link->num_platforms =3D - ARRAY_SIZE(i2s3_rt1015p_platforms); - } + ret =3D mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I= 2S3"); + if (ret) { + dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n", + dai_link->name); + goto err_probe; + } + + ret =3D mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I= 2S8"); + if (ret) { + dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", + dai_link->name); + goto err_probe; + } + + ret =3D mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I= 2S9"); + if (ret) { + dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", + dai_link->name); + goto err_probe; } =20 if (hdmi_codec && strcmp(dai_link->name, "TDM") =3D=3D 0) { @@ -1156,6 +1190,9 @@ static int mt8192_mt6359_dev_probe(struct platform_de= vice *pdev) dai_link->ignore =3D 0; } =20 + if (strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) =3D=3D 0) + dai_link->ops =3D &mt8192_rt1015_i2s_ops; + if (!dai_link->platforms->name) dai_link->platforms->of_node =3D platform_node; } @@ -1163,34 +1200,47 @@ static int mt8192_mt6359_dev_probe(struct platform_= device *pdev) priv =3D devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) { ret =3D -ENOMEM; - goto put_hdmi_codec; + goto err_probe; } snd_soc_card_set_drvdata(card, priv); =20 ret =3D mt8192_afe_gpio_init(&pdev->dev); if (ret) { - dev_err(&pdev->dev, "init gpio error %d\n", ret); - goto put_hdmi_codec; + dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__); + goto err_probe; } =20 ret =3D devm_snd_soc_register_card(&pdev->dev, card); - -put_hdmi_codec: + if (ret) + dev_err_probe(&pdev->dev, ret, + "%s snd_soc_register_card fail\n", __func__); + +err_probe: + of_node_put(headset_codec); +err_headset_codec: + of_node_put(speaker_codec); +err_speaker_codec: of_node_put(hdmi_codec); -put_platform_node: +err_hdmi_codec: of_node_put(platform_node); +err_platform_node: + return ret; } =20 #ifdef CONFIG_OF static const struct of_device_id mt8192_mt6359_dt_match[] =3D { { - .compatible =3D "mediatek,mt8192_mt6359_rt1015_rt5682", + .compatible =3D RT1015_RT5682_OF_NAME, .data =3D &mt8192_mt6359_rt1015_rt5682_card, }, { - .compatible =3D "mediatek,mt8192_mt6359_rt1015p_rt5682", - .data =3D &mt8192_mt6359_rt1015p_rt5682_card, + .compatible =3D RT1015P_RT5682_OF_NAME, + .data =3D &mt8192_mt6359_rt1015p_rt5682x_card, + }, + { + .compatible =3D RT1015P_RT5682S_OF_NAME, + .data =3D &mt8192_mt6359_rt1015p_rt5682x_card, }, {} }; --=20 2.18.0