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"
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
324327static 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
360363static 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
377380static 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 );
12381202err_headset_codec :
12391203 of_node_put (speaker_codec );
12401204err_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
12481266static 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
12821300module_platform_driver (mt8192_mt6359_driver );
0 commit comments