mt8186-mt6366-rt1019-rt5682s.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // mt8186-mt6366-rt1019-rt5682s.c
  4. // -- MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver
  5. //
  6. // Copyright (c) 2022 MediaTek Inc.
  7. // Author: Jiaxin Yu <[email protected]>
  8. //
  9. #include <linux/input.h>
  10. #include <linux/module.h>
  11. #include <linux/of_device.h>
  12. #include <linux/pm_runtime.h>
  13. #include <sound/jack.h>
  14. #include <sound/pcm_params.h>
  15. #include <sound/rt5682.h>
  16. #include <sound/soc.h>
  17. #include "../../codecs/mt6358.h"
  18. #include "../../codecs/rt5682.h"
  19. #include "../common/mtk-afe-platform-driver.h"
  20. #include "../common/mtk-dsp-sof-common.h"
  21. #include "../common/mtk-soc-card.h"
  22. #include "mt8186-afe-common.h"
  23. #include "mt8186-afe-clk.h"
  24. #include "mt8186-afe-gpio.h"
  25. #include "mt8186-mt6366-common.h"
  26. #define RT1019_CODEC_DAI "HiFi"
  27. #define RT1019_DEV0_NAME "rt1019p"
  28. #define RT5682S_CODEC_DAI "rt5682s-aif1"
  29. #define RT5682S_DEV0_NAME "rt5682s.5-001a"
  30. #define SOF_DMA_DL1 "SOF_DMA_DL1"
  31. #define SOF_DMA_DL2 "SOF_DMA_DL2"
  32. #define SOF_DMA_UL1 "SOF_DMA_UL1"
  33. #define SOF_DMA_UL2 "SOF_DMA_UL2"
  34. struct mt8186_mt6366_rt1019_rt5682s_priv {
  35. struct snd_soc_jack headset_jack, hdmi_jack;
  36. };
  37. /* Headset jack detection DAPM pins */
  38. static struct snd_soc_jack_pin mt8186_jack_pins[] = {
  39. {
  40. .pin = "Headphone",
  41. .mask = SND_JACK_HEADPHONE,
  42. },
  43. {
  44. .pin = "Headset Mic",
  45. .mask = SND_JACK_MICROPHONE,
  46. },
  47. };
  48. static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
  49. {
  50. .dlc = COMP_CODEC_CONF("mt6358-sound"),
  51. .name_prefix = "Mt6366",
  52. },
  53. {
  54. .dlc = COMP_CODEC_CONF("bt-sco"),
  55. .name_prefix = "Mt8186 bt",
  56. },
  57. {
  58. .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
  59. .name_prefix = "Mt8186 hdmi",
  60. },
  61. };
  62. static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
  63. {
  64. struct snd_soc_component *cmpnt_afe =
  65. snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  66. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
  67. struct mtk_soc_card_data *soc_card_data =
  68. snd_soc_card_get_drvdata(rtd->card);
  69. struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
  70. struct snd_soc_jack *jack = &priv->headset_jack;
  71. struct snd_soc_component *cmpnt_codec =
  72. asoc_rtd_to_codec(rtd, 0)->component;
  73. int ret;
  74. ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
  75. if (ret) {
  76. dev_err(rtd->dev, "Failed to set up shared clocks\n");
  77. return ret;
  78. }
  79. ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
  80. SND_JACK_HEADSET | SND_JACK_BTN_0 |
  81. SND_JACK_BTN_1 | SND_JACK_BTN_2 |
  82. SND_JACK_BTN_3,
  83. jack, mt8186_jack_pins,
  84. ARRAY_SIZE(mt8186_jack_pins));
  85. if (ret) {
  86. dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
  87. return ret;
  88. }
  89. snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  90. snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  91. snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  92. snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  93. return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
  94. }
  95. static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
  96. struct snd_pcm_hw_params *params)
  97. {
  98. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  99. struct snd_soc_card *card = rtd->card;
  100. struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
  101. struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
  102. unsigned int rate = params_rate(params);
  103. unsigned int mclk_fs_ratio = 128;
  104. unsigned int mclk_fs = rate * mclk_fs_ratio;
  105. int bitwidth;
  106. int ret;
  107. bitwidth = snd_pcm_format_width(params_format(params));
  108. if (bitwidth < 0) {
  109. dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
  110. return bitwidth;
  111. }
  112. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
  113. if (ret) {
  114. dev_err(card->dev, "failed to set tdm slot\n");
  115. return ret;
  116. }
  117. ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
  118. RT5682_PLL1_S_BCLK1,
  119. params_rate(params) * 64,
  120. params_rate(params) * 512);
  121. if (ret) {
  122. dev_err(card->dev, "failed to set pll\n");
  123. return ret;
  124. }
  125. ret = snd_soc_dai_set_sysclk(codec_dai,
  126. RT5682_SCLK_S_PLL1,
  127. params_rate(params) * 512,
  128. SND_SOC_CLOCK_IN);
  129. if (ret) {
  130. dev_err(card->dev, "failed to set sysclk\n");
  131. return ret;
  132. }
  133. return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
  134. }
  135. static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
  136. .hw_params = mt8186_rt5682s_i2s_hw_params,
  137. };
  138. static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
  139. {
  140. struct snd_soc_component *cmpnt_afe =
  141. snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  142. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
  143. struct snd_soc_component *cmpnt_codec =
  144. asoc_rtd_to_codec(rtd, 0)->component;
  145. struct mtk_soc_card_data *soc_card_data =
  146. snd_soc_card_get_drvdata(rtd->card);
  147. struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
  148. int ret;
  149. ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
  150. if (ret) {
  151. dev_err(rtd->dev, "Failed to set up shared clocks\n");
  152. return ret;
  153. }
  154. ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack);
  155. if (ret) {
  156. dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
  157. return ret;
  158. }
  159. return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
  160. }
  161. static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  162. struct snd_pcm_hw_params *params,
  163. snd_pcm_format_t fmt)
  164. {
  165. struct snd_interval *channels = hw_param_interval(params,
  166. SNDRV_PCM_HW_PARAM_CHANNELS);
  167. dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
  168. /* fix BE i2s channel to 2 channel */
  169. channels->min = 2;
  170. channels->max = 2;
  171. /* clean param mask first */
  172. snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
  173. 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
  174. params_set_format(params, fmt);
  175. return 0;
  176. }
  177. static int mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  178. struct snd_pcm_hw_params *params)
  179. {
  180. return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
  181. }
  182. static int mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  183. struct snd_pcm_hw_params *params)
  184. {
  185. return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
  186. }
  187. /* fixup the BE DAI link to match any values from topology */
  188. static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
  189. struct snd_pcm_hw_params *params)
  190. {
  191. int ret;
  192. ret = mtk_sof_dai_link_fixup(rtd, params);
  193. if (!strcmp(rtd->dai_link->name, "I2S0") ||
  194. !strcmp(rtd->dai_link->name, "I2S1") ||
  195. !strcmp(rtd->dai_link->name, "I2S2"))
  196. mt8186_i2s_hw_params_fixup(rtd, params);
  197. else if (!strcmp(rtd->dai_link->name, "I2S3"))
  198. mt8186_it6505_i2s_hw_params_fixup(rtd, params);
  199. return ret;
  200. }
  201. static int mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream *substream)
  202. {
  203. static const unsigned int rates[] = {
  204. 48000
  205. };
  206. static const unsigned int channels[] = {
  207. 2
  208. };
  209. static const struct snd_pcm_hw_constraint_list constraints_rates = {
  210. .count = ARRAY_SIZE(rates),
  211. .list = rates,
  212. .mask = 0,
  213. };
  214. static const struct snd_pcm_hw_constraint_list constraints_channels = {
  215. .count = ARRAY_SIZE(channels),
  216. .list = channels,
  217. .mask = 0,
  218. };
  219. struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  220. struct snd_pcm_runtime *runtime = substream->runtime;
  221. int ret;
  222. ret = snd_pcm_hw_constraint_list(runtime, 0,
  223. SNDRV_PCM_HW_PARAM_RATE,
  224. &constraints_rates);
  225. if (ret < 0) {
  226. dev_err(rtd->dev, "hw_constraint_list rate failed\n");
  227. return ret;
  228. }
  229. ret = snd_pcm_hw_constraint_list(runtime, 0,
  230. SNDRV_PCM_HW_PARAM_CHANNELS,
  231. &constraints_channels);
  232. if (ret < 0) {
  233. dev_err(rtd->dev, "hw_constraint_list channel failed\n");
  234. return ret;
  235. }
  236. return 0;
  237. }
  238. static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_playback_ops = {
  239. .startup = mt8186_mt6366_rt1019_rt5682s_playback_startup,
  240. };
  241. static int mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream *substream)
  242. {
  243. static const unsigned int rates[] = {
  244. 48000
  245. };
  246. static const unsigned int channels[] = {
  247. 1, 2
  248. };
  249. static const struct snd_pcm_hw_constraint_list constraints_rates = {
  250. .count = ARRAY_SIZE(rates),
  251. .list = rates,
  252. .mask = 0,
  253. };
  254. static const struct snd_pcm_hw_constraint_list constraints_channels = {
  255. .count = ARRAY_SIZE(channels),
  256. .list = channels,
  257. .mask = 0,
  258. };
  259. struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  260. struct snd_pcm_runtime *runtime = substream->runtime;
  261. int ret;
  262. ret = snd_pcm_hw_constraint_list(runtime, 0,
  263. SNDRV_PCM_HW_PARAM_RATE,
  264. &constraints_rates);
  265. if (ret < 0) {
  266. dev_err(rtd->dev, "hw_constraint_list rate failed\n");
  267. return ret;
  268. }
  269. ret = snd_pcm_hw_constraint_list(runtime, 0,
  270. SNDRV_PCM_HW_PARAM_CHANNELS,
  271. &constraints_channels);
  272. if (ret < 0) {
  273. dev_err(rtd->dev, "hw_constraint_list channel failed\n");
  274. return ret;
  275. }
  276. return 0;
  277. }
  278. static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_capture_ops = {
  279. .startup = mt8186_mt6366_rt1019_rt5682s_capture_startup,
  280. };
  281. /* FE */
  282. SND_SOC_DAILINK_DEFS(playback1,
  283. DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
  284. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  285. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  286. SND_SOC_DAILINK_DEFS(playback12,
  287. DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
  288. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  289. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  290. SND_SOC_DAILINK_DEFS(playback2,
  291. DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
  292. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  293. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  294. SND_SOC_DAILINK_DEFS(playback3,
  295. DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
  296. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  297. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  298. SND_SOC_DAILINK_DEFS(playback4,
  299. DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
  300. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  301. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  302. SND_SOC_DAILINK_DEFS(playback5,
  303. DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
  304. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  305. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  306. SND_SOC_DAILINK_DEFS(playback6,
  307. DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
  308. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  309. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  310. SND_SOC_DAILINK_DEFS(playback7,
  311. DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
  312. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  313. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  314. SND_SOC_DAILINK_DEFS(playback8,
  315. DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
  316. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  317. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  318. SND_SOC_DAILINK_DEFS(capture1,
  319. DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
  320. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  321. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  322. SND_SOC_DAILINK_DEFS(capture2,
  323. DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
  324. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  325. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  326. SND_SOC_DAILINK_DEFS(capture3,
  327. DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
  328. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  329. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  330. SND_SOC_DAILINK_DEFS(capture4,
  331. DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
  332. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  333. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  334. SND_SOC_DAILINK_DEFS(capture5,
  335. DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
  336. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  337. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  338. SND_SOC_DAILINK_DEFS(capture6,
  339. DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
  340. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  341. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  342. SND_SOC_DAILINK_DEFS(capture7,
  343. DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
  344. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  345. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  346. /* hostless */
  347. SND_SOC_DAILINK_DEFS(hostless_lpbk,
  348. DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
  349. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  350. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  351. SND_SOC_DAILINK_DEFS(hostless_fm,
  352. DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
  353. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  354. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  355. SND_SOC_DAILINK_DEFS(hostless_src1,
  356. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),
  357. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  358. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  359. SND_SOC_DAILINK_DEFS(hostless_src_bargein,
  360. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),
  361. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  362. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  363. /* BE */
  364. SND_SOC_DAILINK_DEFS(adda,
  365. DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
  366. DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
  367. "mt6358-snd-codec-aif1"),
  368. COMP_CODEC("dmic-codec",
  369. "dmic-hifi")),
  370. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  371. SND_SOC_DAILINK_DEFS(i2s0,
  372. DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
  373. DAILINK_COMP_ARRAY(COMP_EMPTY()),
  374. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  375. SND_SOC_DAILINK_DEFS(i2s1,
  376. DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
  377. DAILINK_COMP_ARRAY(COMP_EMPTY()),
  378. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  379. SND_SOC_DAILINK_DEFS(i2s2,
  380. DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
  381. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  382. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  383. SND_SOC_DAILINK_DEFS(i2s3,
  384. DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
  385. DAILINK_COMP_ARRAY(COMP_EMPTY()),
  386. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  387. SND_SOC_DAILINK_DEFS(hw_gain1,
  388. DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),
  389. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  390. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  391. SND_SOC_DAILINK_DEFS(hw_gain2,
  392. DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),
  393. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  394. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  395. SND_SOC_DAILINK_DEFS(hw_src1,
  396. DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),
  397. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  398. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  399. SND_SOC_DAILINK_DEFS(hw_src2,
  400. DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),
  401. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  402. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  403. SND_SOC_DAILINK_DEFS(connsys_i2s,
  404. DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
  405. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  406. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  407. SND_SOC_DAILINK_DEFS(pcm1,
  408. DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
  409. DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
  410. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  411. SND_SOC_DAILINK_DEFS(tdm_in,
  412. DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
  413. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  414. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  415. /* hostless */
  416. SND_SOC_DAILINK_DEFS(hostless_ul1,
  417. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
  418. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  419. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  420. SND_SOC_DAILINK_DEFS(hostless_ul2,
  421. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
  422. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  423. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  424. SND_SOC_DAILINK_DEFS(hostless_ul3,
  425. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
  426. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  427. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  428. SND_SOC_DAILINK_DEFS(hostless_ul5,
  429. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
  430. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  431. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  432. SND_SOC_DAILINK_DEFS(hostless_ul6,
  433. DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
  434. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  435. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  436. SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,
  437. DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
  438. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  439. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  440. SND_SOC_DAILINK_DEFS(hostless_src_aaudio,
  441. DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
  442. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  443. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  444. SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,
  445. DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),
  446. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  447. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  448. SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
  449. DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
  450. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  451. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  452. SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,
  453. DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),
  454. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  455. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  456. SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,
  457. DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),
  458. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  459. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  460. static const struct sof_conn_stream g_sof_conn_streams[] = {
  461. { "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},
  462. { "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
  463. { "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},
  464. { "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},
  465. };
  466. static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
  467. /* Front End DAI links */
  468. {
  469. .name = "Playback_1",
  470. .stream_name = "Playback_1",
  471. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  472. SND_SOC_DPCM_TRIGGER_PRE},
  473. .dynamic = 1,
  474. .dpcm_playback = 1,
  475. .dpcm_merged_format = 1,
  476. .dpcm_merged_chan = 1,
  477. .dpcm_merged_rate = 1,
  478. .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
  479. SND_SOC_DAILINK_REG(playback1),
  480. },
  481. {
  482. .name = "Playback_12",
  483. .stream_name = "Playback_12",
  484. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  485. SND_SOC_DPCM_TRIGGER_PRE},
  486. .dynamic = 1,
  487. .dpcm_playback = 1,
  488. SND_SOC_DAILINK_REG(playback12),
  489. },
  490. {
  491. .name = "Playback_2",
  492. .stream_name = "Playback_2",
  493. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  494. SND_SOC_DPCM_TRIGGER_PRE},
  495. .dynamic = 1,
  496. .dpcm_playback = 1,
  497. .dpcm_merged_format = 1,
  498. .dpcm_merged_chan = 1,
  499. .dpcm_merged_rate = 1,
  500. SND_SOC_DAILINK_REG(playback2),
  501. },
  502. {
  503. .name = "Playback_3",
  504. .stream_name = "Playback_3",
  505. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  506. SND_SOC_DPCM_TRIGGER_PRE},
  507. .dynamic = 1,
  508. .dpcm_playback = 1,
  509. .dpcm_merged_format = 1,
  510. .dpcm_merged_chan = 1,
  511. .dpcm_merged_rate = 1,
  512. .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
  513. SND_SOC_DAILINK_REG(playback3),
  514. },
  515. {
  516. .name = "Playback_4",
  517. .stream_name = "Playback_4",
  518. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  519. SND_SOC_DPCM_TRIGGER_PRE},
  520. .dynamic = 1,
  521. .dpcm_playback = 1,
  522. SND_SOC_DAILINK_REG(playback4),
  523. },
  524. {
  525. .name = "Playback_5",
  526. .stream_name = "Playback_5",
  527. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  528. SND_SOC_DPCM_TRIGGER_PRE},
  529. .dynamic = 1,
  530. .dpcm_playback = 1,
  531. SND_SOC_DAILINK_REG(playback5),
  532. },
  533. {
  534. .name = "Playback_6",
  535. .stream_name = "Playback_6",
  536. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  537. SND_SOC_DPCM_TRIGGER_PRE},
  538. .dynamic = 1,
  539. .dpcm_playback = 1,
  540. SND_SOC_DAILINK_REG(playback6),
  541. },
  542. {
  543. .name = "Playback_7",
  544. .stream_name = "Playback_7",
  545. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  546. SND_SOC_DPCM_TRIGGER_PRE},
  547. .dynamic = 1,
  548. .dpcm_playback = 1,
  549. SND_SOC_DAILINK_REG(playback7),
  550. },
  551. {
  552. .name = "Playback_8",
  553. .stream_name = "Playback_8",
  554. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  555. SND_SOC_DPCM_TRIGGER_PRE},
  556. .dynamic = 1,
  557. .dpcm_playback = 1,
  558. SND_SOC_DAILINK_REG(playback8),
  559. },
  560. {
  561. .name = "Capture_1",
  562. .stream_name = "Capture_1",
  563. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  564. SND_SOC_DPCM_TRIGGER_PRE},
  565. .dynamic = 1,
  566. .dpcm_capture = 1,
  567. SND_SOC_DAILINK_REG(capture1),
  568. },
  569. {
  570. .name = "Capture_2",
  571. .stream_name = "Capture_2",
  572. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  573. SND_SOC_DPCM_TRIGGER_PRE},
  574. .dynamic = 1,
  575. .dpcm_capture = 1,
  576. .dpcm_merged_format = 1,
  577. .dpcm_merged_chan = 1,
  578. .dpcm_merged_rate = 1,
  579. .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
  580. SND_SOC_DAILINK_REG(capture2),
  581. },
  582. {
  583. .name = "Capture_3",
  584. .stream_name = "Capture_3",
  585. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  586. SND_SOC_DPCM_TRIGGER_PRE},
  587. .dynamic = 1,
  588. .dpcm_capture = 1,
  589. SND_SOC_DAILINK_REG(capture3),
  590. },
  591. {
  592. .name = "Capture_4",
  593. .stream_name = "Capture_4",
  594. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  595. SND_SOC_DPCM_TRIGGER_PRE},
  596. .dynamic = 1,
  597. .dpcm_capture = 1,
  598. .dpcm_merged_format = 1,
  599. .dpcm_merged_chan = 1,
  600. .dpcm_merged_rate = 1,
  601. .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
  602. SND_SOC_DAILINK_REG(capture4),
  603. },
  604. {
  605. .name = "Capture_5",
  606. .stream_name = "Capture_5",
  607. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  608. SND_SOC_DPCM_TRIGGER_PRE},
  609. .dynamic = 1,
  610. .dpcm_capture = 1,
  611. SND_SOC_DAILINK_REG(capture5),
  612. },
  613. {
  614. .name = "Capture_6",
  615. .stream_name = "Capture_6",
  616. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  617. SND_SOC_DPCM_TRIGGER_PRE},
  618. .dynamic = 1,
  619. .dpcm_capture = 1,
  620. .dpcm_merged_format = 1,
  621. .dpcm_merged_chan = 1,
  622. .dpcm_merged_rate = 1,
  623. SND_SOC_DAILINK_REG(capture6),
  624. },
  625. {
  626. .name = "Capture_7",
  627. .stream_name = "Capture_7",
  628. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  629. SND_SOC_DPCM_TRIGGER_PRE},
  630. .dynamic = 1,
  631. .dpcm_capture = 1,
  632. SND_SOC_DAILINK_REG(capture7),
  633. },
  634. {
  635. .name = "Hostless_LPBK",
  636. .stream_name = "Hostless_LPBK",
  637. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  638. SND_SOC_DPCM_TRIGGER_PRE},
  639. .dynamic = 1,
  640. .dpcm_playback = 1,
  641. .dpcm_capture = 1,
  642. .ignore_suspend = 1,
  643. SND_SOC_DAILINK_REG(hostless_lpbk),
  644. },
  645. {
  646. .name = "Hostless_FM",
  647. .stream_name = "Hostless_FM",
  648. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  649. SND_SOC_DPCM_TRIGGER_PRE},
  650. .dynamic = 1,
  651. .dpcm_playback = 1,
  652. .dpcm_capture = 1,
  653. .ignore_suspend = 1,
  654. SND_SOC_DAILINK_REG(hostless_fm),
  655. },
  656. {
  657. .name = "Hostless_SRC_1",
  658. .stream_name = "Hostless_SRC_1",
  659. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  660. SND_SOC_DPCM_TRIGGER_PRE},
  661. .dynamic = 1,
  662. .dpcm_playback = 1,
  663. .dpcm_capture = 1,
  664. .ignore_suspend = 1,
  665. SND_SOC_DAILINK_REG(hostless_src1),
  666. },
  667. {
  668. .name = "Hostless_SRC_Bargein",
  669. .stream_name = "Hostless_SRC_Bargein",
  670. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  671. SND_SOC_DPCM_TRIGGER_PRE},
  672. .dynamic = 1,
  673. .dpcm_playback = 1,
  674. .dpcm_capture = 1,
  675. .ignore_suspend = 1,
  676. SND_SOC_DAILINK_REG(hostless_src_bargein),
  677. },
  678. {
  679. .name = "Hostless_HW_Gain_AAudio",
  680. .stream_name = "Hostless_HW_Gain_AAudio",
  681. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  682. SND_SOC_DPCM_TRIGGER_PRE},
  683. .dynamic = 1,
  684. .dpcm_capture = 1,
  685. .ignore_suspend = 1,
  686. SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
  687. },
  688. {
  689. .name = "Hostless_SRC_AAudio",
  690. .stream_name = "Hostless_SRC_AAudio",
  691. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  692. SND_SOC_DPCM_TRIGGER_PRE},
  693. .dynamic = 1,
  694. .dpcm_playback = 1,
  695. .dpcm_capture = 1,
  696. .ignore_suspend = 1,
  697. SND_SOC_DAILINK_REG(hostless_src_aaudio),
  698. },
  699. /* Back End DAI links */
  700. {
  701. .name = "Primary Codec",
  702. .no_pcm = 1,
  703. .dpcm_playback = 1,
  704. .dpcm_capture = 1,
  705. .ignore_suspend = 1,
  706. .init = mt8186_mt6366_init,
  707. SND_SOC_DAILINK_REG(adda),
  708. },
  709. {
  710. .name = "I2S3",
  711. .no_pcm = 1,
  712. .dai_fmt = SND_SOC_DAIFMT_I2S |
  713. SND_SOC_DAIFMT_IB_IF |
  714. SND_SOC_DAIFMT_CBM_CFM,
  715. .dpcm_playback = 1,
  716. .ignore_suspend = 1,
  717. .init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,
  718. .be_hw_params_fixup = mt8186_it6505_i2s_hw_params_fixup,
  719. SND_SOC_DAILINK_REG(i2s3),
  720. },
  721. {
  722. .name = "I2S0",
  723. .no_pcm = 1,
  724. .dpcm_capture = 1,
  725. .ignore_suspend = 1,
  726. .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
  727. .ops = &mt8186_rt5682s_i2s_ops,
  728. SND_SOC_DAILINK_REG(i2s0),
  729. },
  730. {
  731. .name = "I2S1",
  732. .no_pcm = 1,
  733. .dpcm_playback = 1,
  734. .ignore_suspend = 1,
  735. .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
  736. .init = mt8186_rt5682s_init,
  737. .ops = &mt8186_rt5682s_i2s_ops,
  738. SND_SOC_DAILINK_REG(i2s1),
  739. },
  740. {
  741. .name = "I2S2",
  742. .no_pcm = 1,
  743. .dpcm_capture = 1,
  744. .ignore_suspend = 1,
  745. .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
  746. SND_SOC_DAILINK_REG(i2s2),
  747. },
  748. {
  749. .name = "HW Gain 1",
  750. .no_pcm = 1,
  751. .dpcm_playback = 1,
  752. .dpcm_capture = 1,
  753. .ignore_suspend = 1,
  754. SND_SOC_DAILINK_REG(hw_gain1),
  755. },
  756. {
  757. .name = "HW Gain 2",
  758. .no_pcm = 1,
  759. .dpcm_playback = 1,
  760. .dpcm_capture = 1,
  761. .ignore_suspend = 1,
  762. SND_SOC_DAILINK_REG(hw_gain2),
  763. },
  764. {
  765. .name = "HW_SRC_1",
  766. .no_pcm = 1,
  767. .dpcm_playback = 1,
  768. .dpcm_capture = 1,
  769. .ignore_suspend = 1,
  770. SND_SOC_DAILINK_REG(hw_src1),
  771. },
  772. {
  773. .name = "HW_SRC_2",
  774. .no_pcm = 1,
  775. .dpcm_playback = 1,
  776. .dpcm_capture = 1,
  777. .ignore_suspend = 1,
  778. SND_SOC_DAILINK_REG(hw_src2),
  779. },
  780. {
  781. .name = "CONNSYS_I2S",
  782. .no_pcm = 1,
  783. .dpcm_capture = 1,
  784. .ignore_suspend = 1,
  785. SND_SOC_DAILINK_REG(connsys_i2s),
  786. },
  787. {
  788. .name = "PCM 1",
  789. .dai_fmt = SND_SOC_DAIFMT_I2S |
  790. SND_SOC_DAIFMT_NB_IF,
  791. .no_pcm = 1,
  792. .dpcm_playback = 1,
  793. .dpcm_capture = 1,
  794. .ignore_suspend = 1,
  795. SND_SOC_DAILINK_REG(pcm1),
  796. },
  797. {
  798. .name = "TDM IN",
  799. .no_pcm = 1,
  800. .dpcm_capture = 1,
  801. .ignore_suspend = 1,
  802. SND_SOC_DAILINK_REG(tdm_in),
  803. },
  804. /* dummy BE for ul memif to record from dl memif */
  805. {
  806. .name = "Hostless_UL1",
  807. .no_pcm = 1,
  808. .dpcm_capture = 1,
  809. .ignore_suspend = 1,
  810. SND_SOC_DAILINK_REG(hostless_ul1),
  811. },
  812. {
  813. .name = "Hostless_UL2",
  814. .no_pcm = 1,
  815. .dpcm_capture = 1,
  816. .ignore_suspend = 1,
  817. SND_SOC_DAILINK_REG(hostless_ul2),
  818. },
  819. {
  820. .name = "Hostless_UL3",
  821. .no_pcm = 1,
  822. .dpcm_capture = 1,
  823. .ignore_suspend = 1,
  824. SND_SOC_DAILINK_REG(hostless_ul3),
  825. },
  826. {
  827. .name = "Hostless_UL5",
  828. .no_pcm = 1,
  829. .dpcm_capture = 1,
  830. .ignore_suspend = 1,
  831. SND_SOC_DAILINK_REG(hostless_ul5),
  832. },
  833. {
  834. .name = "Hostless_UL6",
  835. .no_pcm = 1,
  836. .dpcm_capture = 1,
  837. .ignore_suspend = 1,
  838. SND_SOC_DAILINK_REG(hostless_ul6),
  839. },
  840. /* SOF BE */
  841. {
  842. .name = "AFE_SOF_DL1",
  843. .no_pcm = 1,
  844. .dpcm_playback = 1,
  845. SND_SOC_DAILINK_REG(AFE_SOF_DL1),
  846. },
  847. {
  848. .name = "AFE_SOF_DL2",
  849. .no_pcm = 1,
  850. .dpcm_playback = 1,
  851. SND_SOC_DAILINK_REG(AFE_SOF_DL2),
  852. },
  853. {
  854. .name = "AFE_SOF_UL1",
  855. .no_pcm = 1,
  856. .dpcm_capture = 1,
  857. SND_SOC_DAILINK_REG(AFE_SOF_UL1),
  858. },
  859. {
  860. .name = "AFE_SOF_UL2",
  861. .no_pcm = 1,
  862. .dpcm_capture = 1,
  863. SND_SOC_DAILINK_REG(AFE_SOF_UL2),
  864. },
  865. };
  866. static const struct snd_soc_dapm_widget
  867. mt8186_mt6366_rt1019_rt5682s_widgets[] = {
  868. SND_SOC_DAPM_SPK("Speakers", NULL),
  869. SND_SOC_DAPM_HP("Headphone", NULL),
  870. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  871. SND_SOC_DAPM_OUTPUT("HDMI1"),
  872. SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
  873. SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
  874. SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
  875. SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
  876. };
  877. static const struct snd_soc_dapm_route
  878. mt8186_mt6366_rt1019_rt5682s_routes[] = {
  879. /* SPK */
  880. { "Speakers", NULL, "Speaker" },
  881. /* Headset */
  882. { "Headphone", NULL, "HPOL" },
  883. { "Headphone", NULL, "HPOR" },
  884. { "IN1P", NULL, "Headset Mic" },
  885. /* HDMI */
  886. { "HDMI1", NULL, "TX" },
  887. /* SOF Uplink */
  888. {SOF_DMA_UL1, NULL, "UL1_CH1"},
  889. {SOF_DMA_UL1, NULL, "UL1_CH2"},
  890. {SOF_DMA_UL2, NULL, "UL2_CH1"},
  891. {SOF_DMA_UL2, NULL, "UL2_CH2"},
  892. /* SOF Downlink */
  893. {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
  894. {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
  895. };
  896. static const struct snd_kcontrol_new
  897. mt8186_mt6366_rt1019_rt5682s_controls[] = {
  898. SOC_DAPM_PIN_SWITCH("Speakers"),
  899. SOC_DAPM_PIN_SWITCH("Headphone"),
  900. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  901. SOC_DAPM_PIN_SWITCH("HDMI1"),
  902. };
  903. static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
  904. .name = "mt8186_rt1019_rt5682s",
  905. .owner = THIS_MODULE,
  906. .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
  907. .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
  908. .controls = mt8186_mt6366_rt1019_rt5682s_controls,
  909. .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
  910. .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
  911. .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
  912. .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
  913. .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
  914. .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
  915. .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
  916. };
  917. static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
  918. .name = "mt8186_rt5682s_max98360",
  919. .owner = THIS_MODULE,
  920. .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
  921. .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
  922. .controls = mt8186_mt6366_rt1019_rt5682s_controls,
  923. .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
  924. .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
  925. .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
  926. .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
  927. .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
  928. .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
  929. .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
  930. };
  931. static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
  932. {
  933. struct snd_soc_card *card;
  934. struct snd_soc_dai_link *dai_link;
  935. struct mtk_soc_card_data *soc_card_data;
  936. struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
  937. struct device_node *platform_node, *headset_codec, *playback_codec, *adsp_node;
  938. int sof_on = 0;
  939. int ret, i;
  940. card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
  941. if (!card)
  942. return -EINVAL;
  943. card->dev = &pdev->dev;
  944. soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
  945. if (!soc_card_data)
  946. return -ENOMEM;
  947. mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
  948. if (!mach_priv)
  949. return -ENOMEM;
  950. soc_card_data->mach_priv = mach_priv;
  951. adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
  952. if (adsp_node) {
  953. struct mtk_sof_priv *sof_priv;
  954. sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
  955. if (!sof_priv) {
  956. ret = -ENOMEM;
  957. goto err_adsp_node;
  958. }
  959. sof_priv->conn_streams = g_sof_conn_streams;
  960. sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
  961. sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup;
  962. soc_card_data->sof_priv = sof_priv;
  963. card->probe = mtk_sof_card_probe;
  964. card->late_probe = mtk_sof_card_late_probe;
  965. if (!card->topology_shortname_created) {
  966. snprintf(card->topology_shortname, 32, "sof-%s", card->name);
  967. card->topology_shortname_created = true;
  968. }
  969. card->name = card->topology_shortname;
  970. sof_on = 1;
  971. } else {
  972. dev_info(&pdev->dev, "Probe without adsp\n");
  973. }
  974. if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
  975. ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
  976. "mediatek,dai-link",
  977. mt8186_mt6366_rt1019_rt5682s_dai_links,
  978. ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links));
  979. if (ret) {
  980. dev_dbg(&pdev->dev, "Parse dai-link fail\n");
  981. goto err_adsp_node;
  982. }
  983. } else {
  984. if (!sof_on)
  985. card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
  986. - ARRAY_SIZE(g_sof_conn_streams);
  987. }
  988. platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
  989. if (!platform_node) {
  990. ret = -EINVAL;
  991. dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
  992. goto err_platform_node;
  993. }
  994. playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
  995. if (!playback_codec) {
  996. ret = -EINVAL;
  997. dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n");
  998. goto err_playback_codec;
  999. }
  1000. headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
  1001. if (!headset_codec) {
  1002. ret = -EINVAL;
  1003. dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
  1004. goto err_headset_codec;
  1005. }
  1006. for_each_card_prelinks(card, i, dai_link) {
  1007. ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
  1008. if (ret) {
  1009. dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n",
  1010. dai_link->name);
  1011. goto err_probe;
  1012. }
  1013. ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
  1014. if (ret) {
  1015. dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
  1016. dai_link->name);
  1017. goto err_probe;
  1018. }
  1019. ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
  1020. if (ret) {
  1021. dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
  1022. dai_link->name);
  1023. goto err_probe;
  1024. }
  1025. if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
  1026. dai_link->platforms->of_node = adsp_node;
  1027. if (!dai_link->platforms->name && !dai_link->platforms->of_node)
  1028. dai_link->platforms->of_node = platform_node;
  1029. }
  1030. snd_soc_card_set_drvdata(card, soc_card_data);
  1031. ret = mt8186_afe_gpio_init(&pdev->dev);
  1032. if (ret) {
  1033. dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
  1034. goto err_probe;
  1035. }
  1036. ret = devm_snd_soc_register_card(&pdev->dev, card);
  1037. if (ret)
  1038. dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
  1039. err_probe:
  1040. of_node_put(headset_codec);
  1041. err_headset_codec:
  1042. of_node_put(playback_codec);
  1043. err_playback_codec:
  1044. of_node_put(platform_node);
  1045. err_platform_node:
  1046. err_adsp_node:
  1047. of_node_put(adsp_node);
  1048. return ret;
  1049. }
  1050. #if IS_ENABLED(CONFIG_OF)
  1051. static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
  1052. {
  1053. .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
  1054. .data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
  1055. },
  1056. {
  1057. .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
  1058. .data = &mt8186_mt6366_rt5682s_max98360_soc_card,
  1059. },
  1060. {}
  1061. };
  1062. #endif
  1063. static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
  1064. .driver = {
  1065. .name = "mt8186_mt6366_rt1019_rt5682s",
  1066. #if IS_ENABLED(CONFIG_OF)
  1067. .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
  1068. #endif
  1069. .pm = &snd_soc_pm_ops,
  1070. },
  1071. .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
  1072. };
  1073. module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
  1074. /* Module information */
  1075. MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver");
  1076. MODULE_AUTHOR("Jiaxin Yu <[email protected]>");
  1077. MODULE_LICENSE("GPL v2");
  1078. MODULE_ALIAS("mt8186_mt6366_rt1019_rt5682s soc card");