2121#include "../common/mtk-afe-platform-driver.h"
2222#include "../common/mtk-dsp-sof-common.h"
2323#include "../common/mtk-soc-card.h"
24+ #include "../common/mtk-soundcard-driver.h"
2425#include "mt8186-afe-common.h"
2526#include "mt8186-afe-clk.h"
2627#include "mt8186-afe-gpio.h"
3839#define SOF_DMA_UL2 "SOF_DMA_UL2"
3940
4041struct mt8186_mt6366_rt1019_rt5682s_priv {
41- struct snd_soc_jack headset_jack , hdmi_jack ;
4242 struct gpio_desc * dmic_sel ;
4343 int dmic_switch ;
4444};
4545
46+ enum mt8186_jacks {
47+ MT8186_JACK_HEADSET ,
48+ MT8186_JACK_HDMI ,
49+ MT8186_JACK_MAX ,
50+ };
51+
4652/* Headset jack detection DAPM pins */
4753static struct snd_soc_jack_pin mt8186_jack_pins [] = {
4854 {
@@ -165,8 +171,7 @@ static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
165171 struct mtk_base_afe * afe = snd_soc_component_get_drvdata (cmpnt_afe );
166172 struct mtk_soc_card_data * soc_card_data =
167173 snd_soc_card_get_drvdata (rtd -> card );
168- struct mt8186_mt6366_rt1019_rt5682s_priv * priv = soc_card_data -> mach_priv ;
169- struct snd_soc_jack * jack = & priv -> headset_jack ;
174+ struct snd_soc_jack * jack = & soc_card_data -> card_data -> jacks [MT8186_JACK_HEADSET ];
170175 struct snd_soc_component * cmpnt_codec =
171176 snd_soc_rtd_to_codec (rtd , 0 )-> component ;
172177 int ret ;
@@ -257,7 +262,7 @@ static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rt
257262 snd_soc_rtd_to_codec (rtd , 0 )-> component ;
258263 struct mtk_soc_card_data * soc_card_data =
259264 snd_soc_card_get_drvdata (rtd -> card );
260- struct mt8186_mt6366_rt1019_rt5682s_priv * priv = soc_card_data -> mach_priv ;
265+ struct snd_soc_jack * jack = & soc_card_data -> card_data -> jacks [ MT8186_JACK_HDMI ] ;
261266 int ret ;
262267
263268 ret = mt8186_dai_i2s_set_share (afe , "I2S2" , "I2S3" );
@@ -266,13 +271,13 @@ static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rt
266271 return ret ;
267272 }
268273
269- ret = snd_soc_card_jack_new (rtd -> card , "HDMI Jack" , SND_JACK_LINEOUT , & priv -> hdmi_jack );
274+ ret = snd_soc_card_jack_new (rtd -> card , "HDMI Jack" , SND_JACK_LINEOUT , jack );
270275 if (ret ) {
271276 dev_err (rtd -> dev , "HDMI Jack creation failed: %d\n" , ret );
272277 return ret ;
273278 }
274279
275- return snd_soc_component_set_jack (cmpnt_codec , & priv -> hdmi_jack , NULL );
280+ return snd_soc_component_set_jack (cmpnt_codec , jack , NULL );
276281}
277282
278283static int mt8186_hw_params_fixup (struct snd_soc_pcm_runtime * rtd ,
@@ -1134,166 +1139,133 @@ static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {
11341139 .num_configs = ARRAY_SIZE (mt8186_mt6366_rt1019_rt5682s_codec_conf ),
11351140};
11361141
1137- static int mt8186_mt6366_rt1019_rt5682s_dev_probe (struct platform_device * pdev )
1142+ static int mt8186_mt6366_legacy_probe (struct mtk_soc_card_data * soc_card_data )
11381143{
1139- struct snd_soc_card * card ;
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 ;
11401147 struct snd_soc_dai_link * dai_link ;
1141- struct mtk_soc_card_data * soc_card_data ;
1142- struct mt8186_mt6366_rt1019_rt5682s_priv * mach_priv ;
1143- struct device_node * platform_node , * headset_codec , * playback_codec , * adsp_node ;
1144- int sof_on = 0 ;
1148+ struct device_node * headset_codec , * playback_codec ;
11451149 int ret , i ;
11461150
1147- card = (struct snd_soc_card * )device_get_match_data (& pdev -> dev );
1148- if (!card )
1149- return - EINVAL ;
1150- card -> dev = & pdev -> dev ;
1151-
1152- soc_card_data = devm_kzalloc (& pdev -> dev , sizeof (* soc_card_data ), GFP_KERNEL );
1153- if (!soc_card_data )
1154- return - ENOMEM ;
1155- mach_priv = devm_kzalloc (& pdev -> dev , sizeof (* mach_priv ), GFP_KERNEL );
1156- if (!mach_priv )
1157- return - ENOMEM ;
1158-
1159- soc_card_data -> mach_priv = mach_priv ;
1160-
1161- mach_priv -> dmic_sel = devm_gpiod_get_optional (& pdev -> dev ,
1162- "dmic" , GPIOD_OUT_LOW );
1163- if (IS_ERR (mach_priv -> dmic_sel )) {
1164- dev_err (& pdev -> dev , "DMIC gpio failed err=%ld\n" ,
1165- PTR_ERR (mach_priv -> dmic_sel ));
1166- return PTR_ERR (mach_priv -> dmic_sel );
1167- }
1168-
1169- adsp_node = of_parse_phandle (pdev -> dev .of_node , "mediatek,adsp" , 0 );
1170- if (adsp_node ) {
1171- struct mtk_sof_priv * sof_priv ;
1151+ playback_codec = of_get_child_by_name (dev -> of_node , "playback-codecs" );
1152+ if (!playback_codec )
1153+ return dev_err_probe (dev , - EINVAL ,
1154+ "Property 'playback-codecs' missing or invalid\n" );
11721155
1173- sof_priv = devm_kzalloc (& pdev -> dev , sizeof (* sof_priv ), GFP_KERNEL );
1174- if (!sof_priv ) {
1175- ret = - ENOMEM ;
1176- goto err_adsp_node ;
1177- }
1178- sof_priv -> conn_streams = g_sof_conn_streams ;
1179- sof_priv -> num_streams = ARRAY_SIZE (g_sof_conn_streams );
1180- sof_priv -> sof_dai_link_fixup = mt8186_sof_dai_link_fixup ;
1181- soc_card_data -> sof_priv = sof_priv ;
1182- card -> probe = mtk_sof_card_probe ;
1183- card -> late_probe = mtk_sof_card_late_probe ;
1184- if (!card -> topology_shortname_created ) {
1185- snprintf (card -> topology_shortname , 32 , "sof-%s" , card -> name );
1186- card -> topology_shortname_created = true;
1187- }
1188- card -> name = card -> topology_shortname ;
1189- sof_on = 1 ;
1190- } else {
1191- dev_dbg (& pdev -> dev , "Probe without adsp\n" );
1192- }
1193-
1194- if (of_property_read_bool (pdev -> dev .of_node , "mediatek,dai-link" )) {
1195- ret = mtk_sof_dailink_parse_of (card , pdev -> dev .of_node ,
1196- "mediatek,dai-link" ,
1197- mt8186_mt6366_rt1019_rt5682s_dai_links ,
1198- ARRAY_SIZE (mt8186_mt6366_rt1019_rt5682s_dai_links ));
1199- if (ret ) {
1200- dev_dbg (& pdev -> dev , "Parse dai-link fail\n" );
1201- goto err_adsp_node ;
1202- }
1203- } else {
1204- if (!sof_on )
1205- card -> num_links = ARRAY_SIZE (mt8186_mt6366_rt1019_rt5682s_dai_links )
1206- - ARRAY_SIZE (g_sof_conn_streams );
1207- }
1208-
1209- platform_node = of_parse_phandle (pdev -> dev .of_node , "mediatek,platform" , 0 );
1210- if (!platform_node ) {
1211- ret = - EINVAL ;
1212- dev_err_probe (& pdev -> dev , ret , "Property 'platform' missing or invalid\n" );
1213- goto err_platform_node ;
1214- }
1215-
1216- playback_codec = of_get_child_by_name (pdev -> dev .of_node , "playback-codecs" );
1217- if (!playback_codec ) {
1218- ret = - EINVAL ;
1219- dev_err_probe (& pdev -> dev , ret , "Property 'playback-codecs' missing or invalid\n" );
1220- goto err_playback_codec ;
1221- }
1222-
1223- headset_codec = of_get_child_by_name (pdev -> dev .of_node , "headset-codec" );
1156+ headset_codec = of_get_child_by_name (dev -> of_node , "headset-codec" );
12241157 if (!headset_codec ) {
1225- ret = - EINVAL ;
1226- dev_err_probe (& pdev -> dev , ret , "Property 'headset-codec' missing or invalid\n" );
1227- goto err_headset_codec ;
1158+ of_node_put ( playback_codec ) ;
1159+ return dev_err_probe (dev , - EINVAL ,
1160+ "Property 'headset-codec' missing or invalid\n" ) ;
12281161 }
12291162
12301163 for_each_card_prelinks (card , i , dai_link ) {
12311164 ret = mt8186_mt6366_card_set_be_link (card , dai_link , playback_codec , "I2S3" );
12321165 if (ret ) {
1233- dev_err_probe (& pdev -> dev , ret , "%s set playback_codec fail\n" ,
1166+ dev_err_probe (dev , ret , "%s set playback_codec fail\n" ,
12341167 dai_link -> name );
1235- goto err_probe ;
1168+ break ;
12361169 }
12371170
12381171 ret = mt8186_mt6366_card_set_be_link (card , dai_link , headset_codec , "I2S0" );
12391172 if (ret ) {
1240- dev_err_probe (& pdev -> dev , ret , "%s set headset_codec fail\n" ,
1173+ dev_err_probe (dev , ret , "%s set headset_codec fail\n" ,
12411174 dai_link -> name );
1242- goto err_probe ;
1175+ break ;
12431176 }
12441177
12451178 ret = mt8186_mt6366_card_set_be_link (card , dai_link , headset_codec , "I2S1" );
12461179 if (ret ) {
1247- dev_err_probe (& pdev -> dev , ret , "%s set headset_codec fail\n" ,
1180+ dev_err_probe (dev , ret , "%s set headset_codec fail\n" ,
12481181 dai_link -> name );
1249- goto err_probe ;
1182+ break ;
12501183 }
1184+ }
1185+ of_node_put (headset_codec );
1186+ of_node_put (playback_codec );
12511187
1252- if (! strncmp ( dai_link -> name , "AFE_SOF" , strlen ( "AFE_SOF" )) && sof_on )
1253- dai_link -> platforms -> of_node = adsp_node ;
1188+ return ret ;
1189+ }
12541190
1255- if (!dai_link -> platforms -> name && !dai_link -> platforms -> of_node )
1256- dai_link -> platforms -> of_node = platform_node ;
1257- }
1191+ static int mt8186_mt6366_soc_card_probe (struct mtk_soc_card_data * soc_card_data , bool legacy )
1192+ {
1193+ struct mtk_platform_card_data * card_data = soc_card_data -> card_data ;
1194+ struct snd_soc_card * card = card_data -> card ;
1195+ struct mt8186_mt6366_rt1019_rt5682s_priv * mach_priv ;
1196+ int ret ;
12581197
1259- snd_soc_card_set_drvdata (card , soc_card_data );
1198+ mach_priv = devm_kzalloc (card -> dev , sizeof (* mach_priv ), GFP_KERNEL );
1199+ if (!mach_priv )
1200+ return - ENOMEM ;
12601201
1261- ret = mt8186_afe_gpio_init (& pdev -> dev );
1262- if (ret ) {
1263- dev_err_probe (& pdev -> dev , ret , "%s init gpio error\n" , __func__ );
1264- goto err_probe ;
1202+ soc_card_data -> mach_priv = mach_priv ;
1203+
1204+ mach_priv -> dmic_sel = devm_gpiod_get_optional (card -> dev ,
1205+ "dmic" , GPIOD_OUT_LOW );
1206+ if (IS_ERR (mach_priv -> dmic_sel ))
1207+ return dev_err_probe (card -> dev , PTR_ERR (mach_priv -> dmic_sel ),
1208+ "DMIC gpio failed\n" );
1209+
1210+ if (legacy ) {
1211+ ret = mt8186_mt6366_legacy_probe (soc_card_data );
1212+ if (ret )
1213+ return ret ;
12651214 }
12661215
1267- ret = devm_snd_soc_register_card ( & pdev -> dev , card );
1216+ ret = mt8186_afe_gpio_init ( card -> dev );
12681217 if (ret )
1269- dev_err_probe (& pdev -> dev , ret , "%s snd_soc_register_card fail \n" , __func__ );
1218+ return dev_err_probe (card -> dev , ret , "init AFE gpio error \n" );
12701219
1271- err_probe :
1272- of_node_put (headset_codec );
1273- err_headset_codec :
1274- of_node_put (playback_codec );
1275- err_playback_codec :
1276- of_node_put (platform_node );
1277- err_platform_node :
1278- err_adsp_node :
1279- of_node_put (adsp_node );
1280-
1281- return ret ;
1220+ return 0 ;
12821221}
12831222
1223+ static const struct mtk_sof_priv mt8186_sof_priv = {
1224+ .conn_streams = g_sof_conn_streams ,
1225+ .num_streams = ARRAY_SIZE (g_sof_conn_streams ),
1226+ .sof_dai_link_fixup = mt8186_sof_dai_link_fixup
1227+ };
1228+
1229+ static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {
1230+ .card_data = & (struct mtk_platform_card_data ) {
1231+ .card = & mt8186_mt6366_rt1019_rt5682s_soc_card ,
1232+ .num_jacks = MT8186_JACK_MAX ,
1233+ },
1234+ .sof_priv = & mt8186_sof_priv ,
1235+ .soc_probe = mt8186_mt6366_soc_card_probe
1236+ };
1237+
1238+ static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {
1239+ .card_data = & (struct mtk_platform_card_data ) {
1240+ .card = & mt8186_mt6366_rt5682s_max98360_soc_card ,
1241+ .num_jacks = MT8186_JACK_MAX ,
1242+ },
1243+ .sof_priv = & mt8186_sof_priv ,
1244+ .soc_probe = mt8186_mt6366_soc_card_probe
1245+ };
1246+
1247+ static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {
1248+ .card_data = & (struct mtk_platform_card_data ) {
1249+ .card = & mt8186_mt6366_rt5650_soc_card ,
1250+ .num_jacks = MT8186_JACK_MAX ,
1251+ },
1252+ .sof_priv = & mt8186_sof_priv ,
1253+ .soc_probe = mt8186_mt6366_soc_card_probe
1254+ };
1255+
12841256#if IS_ENABLED (CONFIG_OF )
12851257static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match [] = {
12861258 {
12871259 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound" ,
1288- .data = & mt8186_mt6366_rt1019_rt5682s_soc_card ,
1260+ .data = & mt8186_mt6366_rt1019_rt5682s_pdata ,
12891261 },
12901262 {
12911263 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound" ,
1292- .data = & mt8186_mt6366_rt5682s_max98360_soc_card ,
1264+ .data = & mt8186_mt6366_rt5682s_max98360_pdata ,
12931265 },
12941266 {
12951267 .compatible = "mediatek,mt8186-mt6366-rt5650-sound" ,
1296- .data = & mt8186_mt6366_rt5650_soc_card ,
1268+ .data = & mt8186_mt6366_rt5650_pdata ,
12971269 },
12981270 {}
12991271};
@@ -1308,7 +1280,7 @@ static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
13081280#endif
13091281 .pm = & snd_soc_pm_ops ,
13101282 },
1311- .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe ,
1283+ .probe = mtk_soundcard_common_probe ,
13121284};
13131285
13141286module_platform_driver (mt8186_mt6366_rt1019_rt5682s_driver );
0 commit comments