Skip to content

Commit 2d72cbb

Browse files
AngeloGioacchino Del Regnobroonie
authored andcommitted
ASoC: mediatek: mt8192: Migrate to mtk_soundcard_common_probe
Add mtk_soundcard_pdata platform data for the MediaTek common sound card probe mechanism, including a driver/soc-specific probe extension (used for bits that cannot be commonized hence specific to this driver), and change the probe function to mtk_soundcard_common_probe. This is also adding the possibility of specifying the links and routing with the audio-routing property and (x)-dai-link nodes in device trees to stop hardcoding machine specific links in the card driver assupported by the common probe function, but support for legacy device trees is retained with a legacy_probe function, which is used only in case the new properties are not found. Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20240416071410.75620-6-angelogioacchino.delregno@collabora.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 6718e1e commit 2d72cbb

1 file changed

Lines changed: 91 additions & 73 deletions

File tree

sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c

Lines changed: 91 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "../../codecs/rt1015.h"
2121
#include "../../codecs/rt5682.h"
2222
#include "../common/mtk-afe-platform-driver.h"
23+
#include "../common/mtk-soc-card.h"
24+
#include "../common/mtk-soundcard-driver.h"
2325
#include "mt8192-afe-common.h"
2426
#include "mt8192-afe-clk.h"
2527
#include "mt8192-afe-gpio.h"
@@ -38,9 +40,10 @@
3840
#define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"
3941
#define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"
4042

41-
struct mt8192_mt6359_priv {
42-
struct snd_soc_jack headset_jack;
43-
struct snd_soc_jack hdmi_jack;
43+
enum mt8192_jacks {
44+
MT8192_JACK_HEADSET,
45+
MT8192_JACK_HDMI,
46+
MT8192_JACK_MAX,
4447
};
4548

4649
/* Headset jack detection DAPM pins */
@@ -323,13 +326,13 @@ static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
323326

324327
static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
325328
{
329+
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
330+
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HEADSET];
326331
struct snd_soc_component *cmpnt_afe =
327332
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
328333
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
329334
struct snd_soc_component *cmpnt_codec =
330335
snd_soc_rtd_to_codec(rtd, 0)->component;
331-
struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
332-
struct snd_soc_jack *jack = &priv->headset_jack;
333336
int ret;
334337

335338
ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9");
@@ -359,19 +362,19 @@ static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
359362

360363
static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)
361364
{
365+
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
366+
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HDMI];
362367
struct snd_soc_component *cmpnt_codec =
363368
snd_soc_rtd_to_codec(rtd, 0)->component;
364-
struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
365369
int ret;
366370

367-
ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
368-
&priv->hdmi_jack);
371+
ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);
369372
if (ret) {
370373
dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
371374
return ret;
372375
}
373376

374-
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
377+
return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
375378
}
376379

377380
static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
@@ -1136,71 +1139,53 @@ static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,
11361139
return 0;
11371140
}
11381141

1139-
static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
1142+
static int mt8192_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data)
11401143
{
1141-
struct snd_soc_card *card;
1142-
struct device_node *platform_node, *hdmi_codec, *headset_codec, *speaker_codec;
1143-
int ret, i;
1144+
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1145+
struct snd_soc_card *card = card_data->card;
1146+
struct device *dev = card->dev;
1147+
struct device_node *hdmi_codec, *headset_codec, *speaker_codec;
11441148
struct snd_soc_dai_link *dai_link;
1145-
struct mt8192_mt6359_priv *priv;
1146-
1147-
card = (struct snd_soc_card *)of_device_get_match_data(&pdev->dev);
1148-
if (!card)
1149-
return -EINVAL;
1150-
card->dev = &pdev->dev;
1151-
1152-
if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682_OF_NAME))
1153-
card->name = RT1015P_RT5682_CARD_NAME;
1154-
else if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682S_OF_NAME))
1155-
card->name = RT1015P_RT5682S_CARD_NAME;
1156-
else
1157-
dev_dbg(&pdev->dev, "No need to set card name\n");
1149+
int ret, i;
11581150

1159-
hdmi_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,hdmi-codec", 0);
1151+
hdmi_codec = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0);
11601152
if (!hdmi_codec)
1161-
dev_dbg(&pdev->dev, "The machine has no hdmi-codec\n");
1153+
dev_dbg(dev, "The machine has no hdmi-codec\n");
11621154

1163-
platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1164-
if (!platform_node) {
1165-
ret = -EINVAL;
1166-
dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1167-
goto err_platform_node;
1168-
}
1169-
1170-
speaker_codec = of_get_child_by_name(pdev->dev.of_node, "speaker-codecs");
1155+
speaker_codec = of_get_child_by_name(dev->of_node, "speaker-codecs");
11711156
if (!speaker_codec) {
11721157
ret = -EINVAL;
1173-
dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1158+
dev_err_probe(dev, ret, "Property 'speaker-codecs' missing or invalid\n");
11741159
goto err_speaker_codec;
11751160
}
11761161

1177-
headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1162+
headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");
11781163
if (!headset_codec) {
11791164
ret = -EINVAL;
1180-
dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1165+
dev_err_probe(dev, ret, "Property 'headset-codec' missing or invalid\n");
11811166
goto err_headset_codec;
11821167
}
11831168

11841169
for_each_card_prelinks(card, i, dai_link) {
11851170
ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");
11861171
if (ret) {
1187-
dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1172+
dev_err_probe(dev, ret, "%s set speaker_codec fail\n",
11881173
dai_link->name);
1189-
goto err_probe;
1174+
break;
11901175
}
11911176

11921177
ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");
11931178
if (ret) {
1194-
dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1179+
dev_err_probe(dev, ret, "%s set headset_codec fail\n",
11951180
dai_link->name);
1196-
goto err_probe;
1181+
break;
11971182
}
11981183

11991184
ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");
12001185
if (ret) {
1201-
dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1186+
dev_err_probe(dev, ret, "%s set headset_codec fail\n",
12021187
dai_link->name);
1203-
goto err_probe;
1188+
break;
12041189
}
12051190

12061191
if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {
@@ -1211,52 +1196,85 @@ static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
12111196
if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&
12121197
strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
12131198
dai_link->ops = &mt8192_rt1015_i2s_ops;
1214-
1215-
if (!dai_link->platforms->name)
1216-
dai_link->platforms->of_node = platform_node;
1217-
}
1218-
1219-
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1220-
if (!priv) {
1221-
ret = -ENOMEM;
1222-
goto err_probe;
1223-
}
1224-
snd_soc_card_set_drvdata(card, priv);
1225-
1226-
ret = mt8192_afe_gpio_init(&pdev->dev);
1227-
if (ret) {
1228-
dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1229-
goto err_probe;
12301199
}
12311200

1232-
ret = devm_snd_soc_register_card(&pdev->dev, card);
1233-
if (ret)
1234-
dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1235-
1236-
err_probe:
12371201
of_node_put(headset_codec);
12381202
err_headset_codec:
12391203
of_node_put(speaker_codec);
12401204
err_speaker_codec:
1241-
of_node_put(platform_node);
1242-
err_platform_node:
1243-
of_node_put(hdmi_codec);
1205+
if (hdmi_codec)
1206+
of_node_put(hdmi_codec);
1207+
12441208
return ret;
12451209
}
12461210

1211+
static int mt8192_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1212+
{
1213+
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1214+
struct snd_soc_card *card = card_data->card;
1215+
int ret;
1216+
1217+
if (legacy) {
1218+
ret = mt8192_mt6359_legacy_probe(soc_card_data);
1219+
if (ret)
1220+
return ret;
1221+
} else {
1222+
struct snd_soc_dai_link *dai_link;
1223+
int i;
1224+
1225+
for_each_card_prelinks(card, i, dai_link)
1226+
if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&
1227+
strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
1228+
dai_link->ops = &mt8192_rt1015_i2s_ops;
1229+
}
1230+
1231+
ret = mt8192_afe_gpio_init(card->dev);
1232+
if (ret)
1233+
return dev_err_probe(card->dev, ret, "%s init gpio error\n", __func__);
1234+
1235+
return 0;
1236+
}
1237+
1238+
static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015_rt5682_pdata = {
1239+
.card_name = RT1015_RT5682_CARD_NAME,
1240+
.card_data = &(struct mtk_platform_card_data) {
1241+
.card = &mt8192_mt6359_rt1015_rt5682_card,
1242+
.num_jacks = MT8192_JACK_MAX,
1243+
},
1244+
.soc_probe = mt8192_mt6359_soc_card_probe
1245+
};
1246+
1247+
static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682_pdata = {
1248+
.card_name = RT1015P_RT5682_CARD_NAME,
1249+
.card_data = &(struct mtk_platform_card_data) {
1250+
.card = &mt8192_mt6359_rt1015p_rt5682x_card,
1251+
.num_jacks = MT8192_JACK_MAX,
1252+
},
1253+
.soc_probe = mt8192_mt6359_soc_card_probe
1254+
};
1255+
1256+
static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682s_pdata = {
1257+
.card_name = RT1015P_RT5682S_CARD_NAME,
1258+
.card_data = &(struct mtk_platform_card_data) {
1259+
.card = &mt8192_mt6359_rt1015p_rt5682x_card,
1260+
.num_jacks = MT8192_JACK_MAX,
1261+
},
1262+
.soc_probe = mt8192_mt6359_soc_card_probe
1263+
};
1264+
12471265
#ifdef CONFIG_OF
12481266
static const struct of_device_id mt8192_mt6359_dt_match[] = {
12491267
{
12501268
.compatible = RT1015_RT5682_OF_NAME,
1251-
.data = &mt8192_mt6359_rt1015_rt5682_card,
1269+
.data = &mt8192_mt6359_rt1015_rt5682_pdata,
12521270
},
12531271
{
12541272
.compatible = RT1015P_RT5682_OF_NAME,
1255-
.data = &mt8192_mt6359_rt1015p_rt5682x_card,
1273+
.data = &mt8192_mt6359_rt1015p_rt5682_pdata,
12561274
},
12571275
{
12581276
.compatible = RT1015P_RT5682S_OF_NAME,
1259-
.data = &mt8192_mt6359_rt1015p_rt5682x_card,
1277+
.data = &mt8192_mt6359_rt1015p_rt5682s_pdata,
12601278
},
12611279
{}
12621280
};
@@ -1276,7 +1294,7 @@ static struct platform_driver mt8192_mt6359_driver = {
12761294
#endif
12771295
.pm = &mt8192_mt6359_pm_ops,
12781296
},
1279-
.probe = mt8192_mt6359_dev_probe,
1297+
.probe = mtk_soundcard_common_probe,
12801298
};
12811299

12821300
module_platform_driver(mt8192_mt6359_driver);

0 commit comments

Comments
 (0)