mt8188-mt6359.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mt8188-mt6359.c -- MT8188-MT6359 ALSA SoC machine driver
  4. *
  5. * Copyright (c) 2022 MediaTek Inc.
  6. * Author: Trevor Wu <trevor.wu@mediatek.com>
  7. */
  8. #include <linux/bitfield.h>
  9. #include <linux/input.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/pm_runtime.h>
  13. #include <sound/jack.h>
  14. #include <sound/pcm_params.h>
  15. #include <sound/soc.h>
  16. #include "mt8188-afe-common.h"
  17. #include "../../codecs/nau8825.h"
  18. #include "../../codecs/mt6359.h"
  19. #include "../../codecs/rt5682.h"
  20. #include "../common/mtk-afe-platform-driver.h"
  21. #include "../common/mtk-soundcard-driver.h"
  22. #include "../common/mtk-dsp-sof-common.h"
  23. #include "../common/mtk-soc-card.h"
  24. #define CKSYS_AUD_TOP_CFG 0x032c
  25. #define RG_TEST_ON BIT(0)
  26. #define RG_TEST_TYPE BIT(2)
  27. #define CKSYS_AUD_TOP_MON 0x0330
  28. #define TEST_MISO_COUNT_1 GENMASK(3, 0)
  29. #define TEST_MISO_COUNT_2 GENMASK(7, 4)
  30. #define TEST_MISO_DONE_1 BIT(28)
  31. #define TEST_MISO_DONE_2 BIT(29)
  32. #define NAU8825_HS_PRESENT BIT(0)
  33. #define RT5682S_HS_PRESENT BIT(1)
  34. #define ES8326_HS_PRESENT BIT(2)
  35. #define MAX98390_TWO_AMP BIT(3)
  36. /*
  37. * Maxim MAX98390
  38. */
  39. #define MAX98390_CODEC_DAI "max98390-aif1"
  40. #define MAX98390_DEV0_NAME "max98390.0-0038" /* rear right */
  41. #define MAX98390_DEV1_NAME "max98390.0-0039" /* rear left */
  42. #define MAX98390_DEV2_NAME "max98390.0-003a" /* front right */
  43. #define MAX98390_DEV3_NAME "max98390.0-003b" /* front left */
  44. /*
  45. * Nau88l25
  46. */
  47. #define NAU8825_CODEC_DAI "nau8825-hifi"
  48. /*
  49. * ES8326
  50. */
  51. #define ES8326_CODEC_DAI "ES8326 HiFi"
  52. #define SOF_DMA_DL2 "SOF_DMA_DL2"
  53. #define SOF_DMA_DL3 "SOF_DMA_DL3"
  54. #define SOF_DMA_UL4 "SOF_DMA_UL4"
  55. #define SOF_DMA_UL5 "SOF_DMA_UL5"
  56. #define RT5682S_CODEC_DAI "rt5682s-aif1"
  57. /* FE */
  58. SND_SOC_DAILINK_DEFS(playback2,
  59. DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
  60. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  61. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  62. SND_SOC_DAILINK_DEFS(playback3,
  63. DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
  64. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  65. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  66. SND_SOC_DAILINK_DEFS(playback6,
  67. DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
  68. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  69. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  70. SND_SOC_DAILINK_DEFS(playback7,
  71. DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
  72. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  73. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  74. SND_SOC_DAILINK_DEFS(playback8,
  75. DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
  76. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  77. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  78. SND_SOC_DAILINK_DEFS(playback10,
  79. DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
  80. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  81. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  82. SND_SOC_DAILINK_DEFS(playback11,
  83. DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
  84. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  85. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  86. SND_SOC_DAILINK_DEFS(capture1,
  87. DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
  88. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  89. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  90. SND_SOC_DAILINK_DEFS(capture2,
  91. DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
  92. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  93. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  94. SND_SOC_DAILINK_DEFS(capture3,
  95. DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
  96. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  97. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  98. SND_SOC_DAILINK_DEFS(capture4,
  99. DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
  100. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  101. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  102. SND_SOC_DAILINK_DEFS(capture5,
  103. DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
  104. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  105. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  106. SND_SOC_DAILINK_DEFS(capture6,
  107. DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
  108. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  109. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  110. SND_SOC_DAILINK_DEFS(capture8,
  111. DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
  112. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  113. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  114. SND_SOC_DAILINK_DEFS(capture9,
  115. DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
  116. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  117. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  118. SND_SOC_DAILINK_DEFS(capture10,
  119. DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
  120. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  121. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  122. /* BE */
  123. SND_SOC_DAILINK_DEFS(dl_src,
  124. DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
  125. DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
  126. "mt6359-snd-codec-aif1")),
  127. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  128. SND_SOC_DAILINK_DEFS(dptx,
  129. DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
  130. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  131. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  132. SND_SOC_DAILINK_DEFS(etdm1_in,
  133. DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
  134. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  135. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  136. SND_SOC_DAILINK_DEFS(etdm2_in,
  137. DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
  138. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  139. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  140. SND_SOC_DAILINK_DEFS(etdm1_out,
  141. DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
  142. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  143. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  144. SND_SOC_DAILINK_DEFS(etdm2_out,
  145. DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
  146. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  147. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  148. SND_SOC_DAILINK_DEFS(etdm3_out,
  149. DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
  150. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  151. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  152. SND_SOC_DAILINK_DEFS(pcm1,
  153. DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
  154. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  155. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  156. SND_SOC_DAILINK_DEFS(ul_src,
  157. DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
  158. DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
  159. "mt6359-snd-codec-aif1")),
  160. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  161. SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
  162. DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
  163. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  164. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  165. SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
  166. DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
  167. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  168. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  169. SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
  170. DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
  171. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  172. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  173. SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
  174. DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
  175. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  176. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  177. static const struct sof_conn_stream g_sof_conn_streams[] = {
  178. {
  179. .sof_link = "AFE_SOF_DL2",
  180. .sof_dma = SOF_DMA_DL2,
  181. .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
  182. },
  183. {
  184. .sof_link = "AFE_SOF_DL3",
  185. .sof_dma = SOF_DMA_DL3,
  186. .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
  187. },
  188. {
  189. .sof_link = "AFE_SOF_UL4",
  190. .sof_dma = SOF_DMA_UL4,
  191. .stream_dir = SNDRV_PCM_STREAM_CAPTURE
  192. },
  193. {
  194. .sof_link = "AFE_SOF_UL5",
  195. .sof_dma = SOF_DMA_UL5,
  196. .stream_dir = SNDRV_PCM_STREAM_CAPTURE
  197. },
  198. };
  199. enum mt8188_jacks {
  200. MT8188_JACK_HEADSET,
  201. MT8188_JACK_DP,
  202. MT8188_JACK_HDMI,
  203. MT8188_JACK_MAX,
  204. };
  205. static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
  206. {
  207. .pin = "HDMI",
  208. .mask = SND_JACK_LINEOUT,
  209. },
  210. };
  211. static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
  212. {
  213. .pin = "DP",
  214. .mask = SND_JACK_LINEOUT,
  215. },
  216. };
  217. static struct snd_soc_jack_pin nau8825_jack_pins[] = {
  218. {
  219. .pin = "Headphone Jack",
  220. .mask = SND_JACK_HEADPHONE,
  221. },
  222. {
  223. .pin = "Headset Mic",
  224. .mask = SND_JACK_MICROPHONE,
  225. },
  226. };
  227. static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
  228. SOC_DAPM_PIN_SWITCH("Ext Spk"),
  229. };
  230. static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
  231. SND_SOC_DAPM_SPK("Ext Spk", NULL),
  232. };
  233. static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
  234. SOC_DAPM_PIN_SWITCH("Left Spk"),
  235. SOC_DAPM_PIN_SWITCH("Right Spk"),
  236. };
  237. static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
  238. SND_SOC_DAPM_SPK("Left Spk", NULL),
  239. SND_SOC_DAPM_SPK("Right Spk", NULL),
  240. };
  241. static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
  242. SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
  243. SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
  244. };
  245. static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
  246. SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
  247. SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
  248. };
  249. static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
  250. SND_SOC_DAPM_HP("Headphone", NULL),
  251. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  252. SND_SOC_DAPM_SINK("HDMI"),
  253. SND_SOC_DAPM_SINK("DP"),
  254. SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
  255. SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
  256. SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
  257. SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
  258. /* dynamic pinctrl */
  259. SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
  260. SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
  261. SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
  262. };
  263. static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
  264. SOC_DAPM_PIN_SWITCH("Headphone"),
  265. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  266. };
  267. static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
  268. SND_SOC_DAPM_HP("Headphone Jack", NULL),
  269. };
  270. static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
  271. SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  272. };
  273. static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
  274. /* SOF Uplink */
  275. {SOF_DMA_UL4, NULL, "O034"},
  276. {SOF_DMA_UL4, NULL, "O035"},
  277. {SOF_DMA_UL5, NULL, "O036"},
  278. {SOF_DMA_UL5, NULL, "O037"},
  279. /* SOF Downlink */
  280. {"I070", NULL, SOF_DMA_DL2},
  281. {"I071", NULL, SOF_DMA_DL2},
  282. {"I020", NULL, SOF_DMA_DL3},
  283. {"I021", NULL, SOF_DMA_DL3},
  284. };
  285. static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
  286. {
  287. struct snd_soc_component *cmpnt_afe =
  288. snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  289. struct snd_soc_component *cmpnt_codec =
  290. snd_soc_rtd_to_codec(rtd, 0)->component;
  291. struct snd_soc_dapm_widget *pin_w = NULL, *w;
  292. struct mtk_base_afe *afe;
  293. struct mt8188_afe_private *afe_priv;
  294. struct mtkaif_param *param;
  295. int chosen_phase_1, chosen_phase_2;
  296. int prev_cycle_1, prev_cycle_2;
  297. u8 test_done_1, test_done_2;
  298. int cycle_1, cycle_2;
  299. int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
  300. int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
  301. int mtkaif_calibration_num_phase;
  302. bool mtkaif_calibration_ok;
  303. u32 monitor = 0;
  304. int counter;
  305. int phase;
  306. int i;
  307. if (!cmpnt_afe)
  308. return -EINVAL;
  309. afe = snd_soc_component_get_drvdata(cmpnt_afe);
  310. afe_priv = afe->platform_priv;
  311. param = &afe_priv->mtkaif_params;
  312. dev_dbg(afe->dev, "%s(), start\n", __func__);
  313. param->mtkaif_calibration_ok = false;
  314. for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
  315. param->mtkaif_chosen_phase[i] = -1;
  316. param->mtkaif_phase_cycle[i] = 0;
  317. mtkaif_chosen_phase[i] = -1;
  318. mtkaif_phase_cycle[i] = 0;
  319. }
  320. if (IS_ERR(afe_priv->topckgen)) {
  321. dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
  322. __func__);
  323. return 0;
  324. }
  325. for_each_card_widgets(rtd->card, w) {
  326. if (!strcmp(w->name, "MTKAIF_PIN")) {
  327. pin_w = w;
  328. break;
  329. }
  330. }
  331. if (pin_w)
  332. dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
  333. else
  334. dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
  335. pm_runtime_get_sync(afe->dev);
  336. mt6359_mtkaif_calibration_enable(cmpnt_codec);
  337. /* set test type to synchronizer pulse */
  338. regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
  339. mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */
  340. mtkaif_calibration_ok = true;
  341. for (phase = 0;
  342. phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
  343. phase++) {
  344. mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
  345. phase, phase, phase);
  346. regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
  347. test_done_1 = 0;
  348. test_done_2 = 0;
  349. cycle_1 = -1;
  350. cycle_2 = -1;
  351. counter = 0;
  352. while (!(test_done_1 & test_done_2)) {
  353. regmap_read(afe_priv->topckgen,
  354. CKSYS_AUD_TOP_MON, &monitor);
  355. test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
  356. test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
  357. if (test_done_1 == 1)
  358. cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
  359. if (test_done_2 == 1)
  360. cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
  361. /* handle if never test done */
  362. if (++counter > 10000) {
  363. dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
  364. __func__, cycle_1, cycle_2, monitor);
  365. mtkaif_calibration_ok = false;
  366. break;
  367. }
  368. }
  369. if (phase == 0) {
  370. prev_cycle_1 = cycle_1;
  371. prev_cycle_2 = cycle_2;
  372. }
  373. if (cycle_1 != prev_cycle_1 &&
  374. mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
  375. mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
  376. mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
  377. }
  378. if (cycle_2 != prev_cycle_2 &&
  379. mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
  380. mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
  381. mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
  382. }
  383. regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
  384. if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
  385. mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
  386. break;
  387. }
  388. if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
  389. mtkaif_calibration_ok = false;
  390. chosen_phase_1 = 0;
  391. } else {
  392. chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
  393. }
  394. if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
  395. mtkaif_calibration_ok = false;
  396. chosen_phase_2 = 0;
  397. } else {
  398. chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
  399. }
  400. mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
  401. chosen_phase_1,
  402. chosen_phase_2,
  403. 0);
  404. mt6359_mtkaif_calibration_disable(cmpnt_codec);
  405. pm_runtime_put(afe->dev);
  406. param->mtkaif_calibration_ok = mtkaif_calibration_ok;
  407. param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
  408. param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
  409. for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
  410. param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
  411. if (pin_w)
  412. dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
  413. dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
  414. __func__, param->mtkaif_calibration_ok);
  415. return 0;
  416. }
  417. static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
  418. {
  419. struct snd_soc_component *cmpnt_codec =
  420. snd_soc_rtd_to_codec(rtd, 0)->component;
  421. /* set mtkaif protocol */
  422. mt6359_set_mtkaif_protocol(cmpnt_codec,
  423. MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
  424. /* mtkaif calibration */
  425. mt8188_mt6359_mtkaif_calibration(rtd);
  426. return 0;
  427. }
  428. enum {
  429. DAI_LINK_DL2_FE,
  430. DAI_LINK_DL3_FE,
  431. DAI_LINK_DL6_FE,
  432. DAI_LINK_DL7_FE,
  433. DAI_LINK_DL8_FE,
  434. DAI_LINK_DL10_FE,
  435. DAI_LINK_DL11_FE,
  436. DAI_LINK_UL1_FE,
  437. DAI_LINK_UL2_FE,
  438. DAI_LINK_UL3_FE,
  439. DAI_LINK_UL4_FE,
  440. DAI_LINK_UL5_FE,
  441. DAI_LINK_UL6_FE,
  442. DAI_LINK_UL8_FE,
  443. DAI_LINK_UL9_FE,
  444. DAI_LINK_UL10_FE,
  445. DAI_LINK_DL_SRC_BE,
  446. DAI_LINK_DPTX_BE,
  447. DAI_LINK_ETDM1_IN_BE,
  448. DAI_LINK_ETDM2_IN_BE,
  449. DAI_LINK_ETDM1_OUT_BE,
  450. DAI_LINK_ETDM2_OUT_BE,
  451. DAI_LINK_ETDM3_OUT_BE,
  452. DAI_LINK_PCM1_BE,
  453. DAI_LINK_UL_SRC_BE,
  454. DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
  455. DAI_LINK_SOF_START,
  456. DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
  457. DAI_LINK_SOF_DL3_BE,
  458. DAI_LINK_SOF_UL4_BE,
  459. DAI_LINK_SOF_UL5_BE,
  460. DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
  461. };
  462. #define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1)
  463. static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
  464. struct snd_pcm_hw_params *params)
  465. {
  466. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  467. unsigned int rate = params_rate(params);
  468. unsigned int mclk_fs_ratio = 256;
  469. unsigned int mclk_fs = rate * mclk_fs_ratio;
  470. struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
  471. return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
  472. }
  473. static const struct snd_soc_ops mt8188_dptx_ops = {
  474. .hw_params = mt8188_dptx_hw_params,
  475. };
  476. static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  477. struct snd_pcm_hw_params *params)
  478. {
  479. /* fix BE i2s format to 32bit, clean param mask first */
  480. snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
  481. 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
  482. params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
  483. return 0;
  484. }
  485. static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
  486. {
  487. struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
  488. struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI];
  489. struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
  490. int ret = 0;
  491. ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
  492. SND_JACK_LINEOUT, jack,
  493. mt8188_hdmi_jack_pins,
  494. ARRAY_SIZE(mt8188_hdmi_jack_pins));
  495. if (ret) {
  496. dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
  497. return ret;
  498. }
  499. ret = snd_soc_component_set_jack(component, jack, NULL);
  500. if (ret) {
  501. dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
  502. __func__, component->name, ret);
  503. return ret;
  504. }
  505. return 0;
  506. }
  507. static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
  508. {
  509. struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
  510. struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP];
  511. struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
  512. int ret = 0;
  513. ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT,
  514. jack, mt8188_dp_jack_pins,
  515. ARRAY_SIZE(mt8188_dp_jack_pins));
  516. if (ret) {
  517. dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
  518. return ret;
  519. }
  520. ret = snd_soc_component_set_jack(component, jack, NULL);
  521. if (ret) {
  522. dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
  523. __func__, component->name, ret);
  524. return ret;
  525. }
  526. return 0;
  527. }
  528. static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
  529. {
  530. struct snd_soc_card *card = rtd->card;
  531. int ret = 0;
  532. ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets,
  533. ARRAY_SIZE(mt8188_dumb_spk_widgets));
  534. if (ret) {
  535. dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
  536. return ret;
  537. }
  538. ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
  539. ARRAY_SIZE(mt8188_dumb_spk_controls));
  540. if (ret) {
  541. dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
  542. return ret;
  543. }
  544. return 0;
  545. }
  546. static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
  547. struct snd_pcm_hw_params *params)
  548. {
  549. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  550. unsigned int bit_width = params_width(params);
  551. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  552. struct snd_soc_dai *codec_dai;
  553. int i;
  554. snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
  555. for_each_rtd_codec_dais(rtd, i, codec_dai) {
  556. if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
  557. snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
  558. if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
  559. snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
  560. if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
  561. snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
  562. if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
  563. snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
  564. }
  565. return 0;
  566. }
  567. static const struct snd_soc_ops mt8188_max98390_ops = {
  568. .hw_params = mt8188_max98390_hw_params,
  569. };
  570. static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
  571. {
  572. struct snd_soc_card *card = rtd->card;
  573. int ret;
  574. /* add regular speakers dapm route */
  575. ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets,
  576. ARRAY_SIZE(mt8188_dual_spk_widgets));
  577. if (ret) {
  578. dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
  579. return ret;
  580. }
  581. ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
  582. ARRAY_SIZE(mt8188_dual_spk_controls));
  583. if (ret) {
  584. dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
  585. return ret;
  586. }
  587. if (rtd->dai_link->num_codecs <= 2)
  588. return 0;
  589. /* add widgets/controls/dapm for rear speakers */
  590. ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets,
  591. ARRAY_SIZE(mt8188_rear_spk_widgets));
  592. if (ret) {
  593. dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
  594. /* Don't need to add routes if widget addition failed */
  595. return ret;
  596. }
  597. ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
  598. ARRAY_SIZE(mt8188_rear_spk_controls));
  599. if (ret) {
  600. dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
  601. return ret;
  602. }
  603. return 0;
  604. }
  605. static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
  606. {
  607. struct snd_soc_card *card = rtd->card;
  608. struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
  609. struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
  610. struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
  611. struct mtk_platform_card_data *card_data = soc_card_data->card_data;
  612. int ret;
  613. ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
  614. ARRAY_SIZE(mt8188_nau8825_widgets));
  615. if (ret) {
  616. dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
  617. return ret;
  618. }
  619. ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
  620. ARRAY_SIZE(mt8188_nau8825_controls));
  621. if (ret) {
  622. dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
  623. return ret;
  624. }
  625. ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
  626. SND_JACK_HEADSET | SND_JACK_BTN_0 |
  627. SND_JACK_BTN_1 | SND_JACK_BTN_2 |
  628. SND_JACK_BTN_3,
  629. jack,
  630. nau8825_jack_pins,
  631. ARRAY_SIZE(nau8825_jack_pins));
  632. if (ret) {
  633. dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
  634. return ret;
  635. }
  636. if (card_data->flags & ES8326_HS_PRESENT) {
  637. snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  638. snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
  639. snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
  640. snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
  641. } else {
  642. snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  643. snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  644. snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  645. snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  646. }
  647. ret = snd_soc_component_set_jack(component, jack, NULL);
  648. if (ret) {
  649. dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
  650. return ret;
  651. }
  652. return 0;
  653. };
  654. static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd)
  655. {
  656. struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
  657. snd_soc_component_set_jack(component, NULL, NULL);
  658. }
  659. static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
  660. struct snd_pcm_hw_params *params)
  661. {
  662. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  663. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  664. unsigned int rate = params_rate(params);
  665. unsigned int bit_width = params_width(params);
  666. int clk_freq, ret;
  667. clk_freq = rate * 2 * bit_width;
  668. /* Configure clock for codec */
  669. ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
  670. SND_SOC_CLOCK_IN);
  671. if (ret < 0) {
  672. dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
  673. return ret;
  674. }
  675. /* Configure pll for codec */
  676. ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
  677. params_rate(params) * 256);
  678. if (ret < 0) {
  679. dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
  680. return ret;
  681. }
  682. return 0;
  683. }
  684. static const struct snd_soc_ops mt8188_nau8825_ops = {
  685. .hw_params = mt8188_nau8825_hw_params,
  686. };
  687. static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
  688. struct snd_pcm_hw_params *params)
  689. {
  690. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  691. struct snd_soc_card *card = rtd->card;
  692. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  693. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  694. unsigned int rate = params_rate(params);
  695. int bitwidth;
  696. int ret;
  697. bitwidth = snd_pcm_format_width(params_format(params));
  698. if (bitwidth < 0) {
  699. dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
  700. return bitwidth;
  701. }
  702. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
  703. if (ret) {
  704. dev_err(card->dev, "failed to set tdm slot\n");
  705. return ret;
  706. }
  707. ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
  708. rate * 32, rate * 512);
  709. if (ret) {
  710. dev_err(card->dev, "failed to set pll\n");
  711. return ret;
  712. }
  713. ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
  714. rate * 512, SND_SOC_CLOCK_IN);
  715. if (ret) {
  716. dev_err(card->dev, "failed to set sysclk\n");
  717. return ret;
  718. }
  719. return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
  720. SND_SOC_CLOCK_OUT);
  721. }
  722. static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
  723. .hw_params = mt8188_rt5682s_i2s_hw_params,
  724. };
  725. static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
  726. struct snd_pcm_hw_params *params)
  727. {
  728. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  729. struct snd_soc_component *cmpnt_afe = NULL;
  730. struct snd_soc_pcm_runtime *runtime;
  731. /* find afe component */
  732. for_each_card_rtds(rtd->card, runtime) {
  733. cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
  734. if (cmpnt_afe)
  735. break;
  736. }
  737. if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
  738. dev_err(rtd->dev, "afe pm runtime is not active!!\n");
  739. return -EINVAL;
  740. }
  741. return 0;
  742. }
  743. static const struct snd_soc_ops mt8188_sof_be_ops = {
  744. .hw_params = mt8188_sof_be_hw_params,
  745. };
  746. static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream,
  747. struct snd_pcm_hw_params *params)
  748. {
  749. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  750. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  751. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  752. unsigned int rate = params_rate(params);
  753. int ret;
  754. /* Configure MCLK for codec */
  755. ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN);
  756. if (ret < 0) {
  757. dev_err(codec_dai->dev, "can't set MCLK %d\n", ret);
  758. return ret;
  759. }
  760. /* Configure MCLK for cpu */
  761. return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT);
  762. }
  763. static const struct snd_soc_ops mt8188_es8326_ops = {
  764. .hw_params = mt8188_es8326_hw_params,
  765. };
  766. static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
  767. /* FE */
  768. [DAI_LINK_DL2_FE] = {
  769. .name = "DL2_FE",
  770. .stream_name = "DL2 Playback",
  771. .trigger = {
  772. SND_SOC_DPCM_TRIGGER_POST,
  773. SND_SOC_DPCM_TRIGGER_POST,
  774. },
  775. .dynamic = 1,
  776. .dpcm_playback = 1,
  777. .dpcm_merged_chan = 1,
  778. .dpcm_merged_rate = 1,
  779. .dpcm_merged_format = 1,
  780. SND_SOC_DAILINK_REG(playback2),
  781. },
  782. [DAI_LINK_DL3_FE] = {
  783. .name = "DL3_FE",
  784. .stream_name = "DL3 Playback",
  785. .trigger = {
  786. SND_SOC_DPCM_TRIGGER_POST,
  787. SND_SOC_DPCM_TRIGGER_POST,
  788. },
  789. .dynamic = 1,
  790. .dpcm_playback = 1,
  791. .dpcm_merged_chan = 1,
  792. .dpcm_merged_rate = 1,
  793. .dpcm_merged_format = 1,
  794. SND_SOC_DAILINK_REG(playback3),
  795. },
  796. [DAI_LINK_DL6_FE] = {
  797. .name = "DL6_FE",
  798. .stream_name = "DL6 Playback",
  799. .trigger = {
  800. SND_SOC_DPCM_TRIGGER_POST,
  801. SND_SOC_DPCM_TRIGGER_POST,
  802. },
  803. .dynamic = 1,
  804. .dpcm_playback = 1,
  805. .dpcm_merged_chan = 1,
  806. .dpcm_merged_rate = 1,
  807. .dpcm_merged_format = 1,
  808. SND_SOC_DAILINK_REG(playback6),
  809. },
  810. [DAI_LINK_DL7_FE] = {
  811. .name = "DL7_FE",
  812. .stream_name = "DL7 Playback",
  813. .trigger = {
  814. SND_SOC_DPCM_TRIGGER_PRE,
  815. SND_SOC_DPCM_TRIGGER_PRE,
  816. },
  817. .dynamic = 1,
  818. .dpcm_playback = 1,
  819. SND_SOC_DAILINK_REG(playback7),
  820. },
  821. [DAI_LINK_DL8_FE] = {
  822. .name = "DL8_FE",
  823. .stream_name = "DL8 Playback",
  824. .trigger = {
  825. SND_SOC_DPCM_TRIGGER_POST,
  826. SND_SOC_DPCM_TRIGGER_POST,
  827. },
  828. .dynamic = 1,
  829. .dpcm_playback = 1,
  830. SND_SOC_DAILINK_REG(playback8),
  831. },
  832. [DAI_LINK_DL10_FE] = {
  833. .name = "DL10_FE",
  834. .stream_name = "DL10 Playback",
  835. .trigger = {
  836. SND_SOC_DPCM_TRIGGER_POST,
  837. SND_SOC_DPCM_TRIGGER_POST,
  838. },
  839. .dynamic = 1,
  840. .dpcm_playback = 1,
  841. SND_SOC_DAILINK_REG(playback10),
  842. },
  843. [DAI_LINK_DL11_FE] = {
  844. .name = "DL11_FE",
  845. .stream_name = "DL11 Playback",
  846. .trigger = {
  847. SND_SOC_DPCM_TRIGGER_POST,
  848. SND_SOC_DPCM_TRIGGER_POST,
  849. },
  850. .dynamic = 1,
  851. .dpcm_playback = 1,
  852. SND_SOC_DAILINK_REG(playback11),
  853. },
  854. [DAI_LINK_UL1_FE] = {
  855. .name = "UL1_FE",
  856. .stream_name = "UL1 Capture",
  857. .trigger = {
  858. SND_SOC_DPCM_TRIGGER_PRE,
  859. SND_SOC_DPCM_TRIGGER_PRE,
  860. },
  861. .dynamic = 1,
  862. .dpcm_capture = 1,
  863. SND_SOC_DAILINK_REG(capture1),
  864. },
  865. [DAI_LINK_UL2_FE] = {
  866. .name = "UL2_FE",
  867. .stream_name = "UL2 Capture",
  868. .trigger = {
  869. SND_SOC_DPCM_TRIGGER_POST,
  870. SND_SOC_DPCM_TRIGGER_POST,
  871. },
  872. .dynamic = 1,
  873. .dpcm_capture = 1,
  874. SND_SOC_DAILINK_REG(capture2),
  875. },
  876. [DAI_LINK_UL3_FE] = {
  877. .name = "UL3_FE",
  878. .stream_name = "UL3 Capture",
  879. .trigger = {
  880. SND_SOC_DPCM_TRIGGER_POST,
  881. SND_SOC_DPCM_TRIGGER_POST,
  882. },
  883. .dynamic = 1,
  884. .dpcm_capture = 1,
  885. SND_SOC_DAILINK_REG(capture3),
  886. },
  887. [DAI_LINK_UL4_FE] = {
  888. .name = "UL4_FE",
  889. .stream_name = "UL4 Capture",
  890. .trigger = {
  891. SND_SOC_DPCM_TRIGGER_POST,
  892. SND_SOC_DPCM_TRIGGER_POST,
  893. },
  894. .dynamic = 1,
  895. .dpcm_capture = 1,
  896. .dpcm_merged_chan = 1,
  897. .dpcm_merged_rate = 1,
  898. .dpcm_merged_format = 1,
  899. SND_SOC_DAILINK_REG(capture4),
  900. },
  901. [DAI_LINK_UL5_FE] = {
  902. .name = "UL5_FE",
  903. .stream_name = "UL5 Capture",
  904. .trigger = {
  905. SND_SOC_DPCM_TRIGGER_POST,
  906. SND_SOC_DPCM_TRIGGER_POST,
  907. },
  908. .dynamic = 1,
  909. .dpcm_capture = 1,
  910. .dpcm_merged_chan = 1,
  911. .dpcm_merged_rate = 1,
  912. .dpcm_merged_format = 1,
  913. SND_SOC_DAILINK_REG(capture5),
  914. },
  915. [DAI_LINK_UL6_FE] = {
  916. .name = "UL6_FE",
  917. .stream_name = "UL6 Capture",
  918. .trigger = {
  919. SND_SOC_DPCM_TRIGGER_PRE,
  920. SND_SOC_DPCM_TRIGGER_PRE,
  921. },
  922. .dynamic = 1,
  923. .dpcm_capture = 1,
  924. SND_SOC_DAILINK_REG(capture6),
  925. },
  926. [DAI_LINK_UL8_FE] = {
  927. .name = "UL8_FE",
  928. .stream_name = "UL8 Capture",
  929. .trigger = {
  930. SND_SOC_DPCM_TRIGGER_POST,
  931. SND_SOC_DPCM_TRIGGER_POST,
  932. },
  933. .dynamic = 1,
  934. .dpcm_capture = 1,
  935. SND_SOC_DAILINK_REG(capture8),
  936. },
  937. [DAI_LINK_UL9_FE] = {
  938. .name = "UL9_FE",
  939. .stream_name = "UL9 Capture",
  940. .trigger = {
  941. SND_SOC_DPCM_TRIGGER_POST,
  942. SND_SOC_DPCM_TRIGGER_POST,
  943. },
  944. .dynamic = 1,
  945. .dpcm_capture = 1,
  946. SND_SOC_DAILINK_REG(capture9),
  947. },
  948. [DAI_LINK_UL10_FE] = {
  949. .name = "UL10_FE",
  950. .stream_name = "UL10 Capture",
  951. .trigger = {
  952. SND_SOC_DPCM_TRIGGER_POST,
  953. SND_SOC_DPCM_TRIGGER_POST,
  954. },
  955. .dynamic = 1,
  956. .dpcm_capture = 1,
  957. SND_SOC_DAILINK_REG(capture10),
  958. },
  959. /* BE */
  960. [DAI_LINK_DL_SRC_BE] = {
  961. .name = "DL_SRC_BE",
  962. .no_pcm = 1,
  963. .dpcm_playback = 1,
  964. SND_SOC_DAILINK_REG(dl_src),
  965. },
  966. [DAI_LINK_DPTX_BE] = {
  967. .name = "DPTX_BE",
  968. .ops = &mt8188_dptx_ops,
  969. .be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
  970. .no_pcm = 1,
  971. .dpcm_playback = 1,
  972. SND_SOC_DAILINK_REG(dptx),
  973. },
  974. [DAI_LINK_ETDM1_IN_BE] = {
  975. .name = "ETDM1_IN_BE",
  976. .no_pcm = 1,
  977. .dai_fmt = SND_SOC_DAIFMT_I2S |
  978. SND_SOC_DAIFMT_NB_NF |
  979. SND_SOC_DAIFMT_CBP_CFP,
  980. .dpcm_capture = 1,
  981. .ignore_suspend = 1,
  982. SND_SOC_DAILINK_REG(etdm1_in),
  983. },
  984. [DAI_LINK_ETDM2_IN_BE] = {
  985. .name = "ETDM2_IN_BE",
  986. .no_pcm = 1,
  987. .dai_fmt = SND_SOC_DAIFMT_I2S |
  988. SND_SOC_DAIFMT_NB_NF |
  989. SND_SOC_DAIFMT_CBP_CFP,
  990. .dpcm_capture = 1,
  991. SND_SOC_DAILINK_REG(etdm2_in),
  992. },
  993. [DAI_LINK_ETDM1_OUT_BE] = {
  994. .name = "ETDM1_OUT_BE",
  995. .no_pcm = 1,
  996. .dai_fmt = SND_SOC_DAIFMT_I2S |
  997. SND_SOC_DAIFMT_NB_NF |
  998. SND_SOC_DAIFMT_CBC_CFC,
  999. .dpcm_playback = 1,
  1000. SND_SOC_DAILINK_REG(etdm1_out),
  1001. },
  1002. [DAI_LINK_ETDM2_OUT_BE] = {
  1003. .name = "ETDM2_OUT_BE",
  1004. .no_pcm = 1,
  1005. .dai_fmt = SND_SOC_DAIFMT_I2S |
  1006. SND_SOC_DAIFMT_NB_NF |
  1007. SND_SOC_DAIFMT_CBC_CFC,
  1008. .dpcm_playback = 1,
  1009. SND_SOC_DAILINK_REG(etdm2_out),
  1010. },
  1011. [DAI_LINK_ETDM3_OUT_BE] = {
  1012. .name = "ETDM3_OUT_BE",
  1013. .no_pcm = 1,
  1014. .dai_fmt = SND_SOC_DAIFMT_I2S |
  1015. SND_SOC_DAIFMT_NB_NF |
  1016. SND_SOC_DAIFMT_CBC_CFC,
  1017. .dpcm_playback = 1,
  1018. SND_SOC_DAILINK_REG(etdm3_out),
  1019. },
  1020. [DAI_LINK_PCM1_BE] = {
  1021. .name = "PCM1_BE",
  1022. .no_pcm = 1,
  1023. .dai_fmt = SND_SOC_DAIFMT_I2S |
  1024. SND_SOC_DAIFMT_NB_NF |
  1025. SND_SOC_DAIFMT_CBC_CFC,
  1026. .dpcm_playback = 1,
  1027. .dpcm_capture = 1,
  1028. SND_SOC_DAILINK_REG(pcm1),
  1029. },
  1030. [DAI_LINK_UL_SRC_BE] = {
  1031. .name = "UL_SRC_BE",
  1032. .no_pcm = 1,
  1033. .dpcm_capture = 1,
  1034. SND_SOC_DAILINK_REG(ul_src),
  1035. },
  1036. /* SOF BE */
  1037. [DAI_LINK_SOF_DL2_BE] = {
  1038. .name = "AFE_SOF_DL2",
  1039. .no_pcm = 1,
  1040. .dpcm_playback = 1,
  1041. .ops = &mt8188_sof_be_ops,
  1042. SND_SOC_DAILINK_REG(AFE_SOF_DL2),
  1043. },
  1044. [DAI_LINK_SOF_DL3_BE] = {
  1045. .name = "AFE_SOF_DL3",
  1046. .no_pcm = 1,
  1047. .dpcm_playback = 1,
  1048. .ops = &mt8188_sof_be_ops,
  1049. SND_SOC_DAILINK_REG(AFE_SOF_DL3),
  1050. },
  1051. [DAI_LINK_SOF_UL4_BE] = {
  1052. .name = "AFE_SOF_UL4",
  1053. .no_pcm = 1,
  1054. .dpcm_capture = 1,
  1055. .ops = &mt8188_sof_be_ops,
  1056. SND_SOC_DAILINK_REG(AFE_SOF_UL4),
  1057. },
  1058. [DAI_LINK_SOF_UL5_BE] = {
  1059. .name = "AFE_SOF_UL5",
  1060. .no_pcm = 1,
  1061. .dpcm_capture = 1,
  1062. .ops = &mt8188_sof_be_ops,
  1063. SND_SOC_DAILINK_REG(AFE_SOF_UL5),
  1064. },
  1065. };
  1066. static void mt8188_fixup_controls(struct snd_soc_card *card)
  1067. {
  1068. struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
  1069. struct mtk_platform_card_data *card_data = soc_card_data->card_data;
  1070. struct snd_kcontrol *kctl;
  1071. if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) {
  1072. struct snd_soc_dapm_widget *w, *next_w;
  1073. for_each_card_widgets_safe(card, w, next_w) {
  1074. if (strcmp(w->name, "Headphone"))
  1075. continue;
  1076. snd_soc_dapm_free_widget(w);
  1077. }
  1078. kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
  1079. if (kctl)
  1080. snd_ctl_remove(card->snd_card, kctl);
  1081. else
  1082. dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
  1083. }
  1084. }
  1085. static struct snd_soc_card mt8188_mt6359_soc_card = {
  1086. .owner = THIS_MODULE,
  1087. .dai_link = mt8188_mt6359_dai_links,
  1088. .num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
  1089. .dapm_widgets = mt8188_mt6359_widgets,
  1090. .num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
  1091. .dapm_routes = mt8188_mt6359_routes,
  1092. .num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
  1093. .controls = mt8188_mt6359_controls,
  1094. .num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
  1095. .fixup_controls = mt8188_fixup_controls,
  1096. };
  1097. static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
  1098. {
  1099. struct mtk_platform_card_data *card_data = soc_card_data->card_data;
  1100. struct snd_soc_card *card = soc_card_data->card_data->card;
  1101. struct snd_soc_dai_link *dai_link;
  1102. bool init_mt6359 = false;
  1103. bool init_es8326 = false;
  1104. bool init_nau8825 = false;
  1105. bool init_rt5682s = false;
  1106. bool init_max98390 = false;
  1107. bool init_dumb = false;
  1108. int i;
  1109. if (legacy)
  1110. return -EINVAL;
  1111. for_each_card_prelinks(card, i, dai_link) {
  1112. if (strcmp(dai_link->name, "DPTX_BE") == 0) {
  1113. if (dai_link->num_codecs &&
  1114. strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
  1115. dai_link->init = mt8188_dptx_codec_init;
  1116. } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
  1117. if (dai_link->num_codecs &&
  1118. strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
  1119. dai_link->init = mt8188_hdmi_codec_init;
  1120. } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
  1121. strcmp(dai_link->name, "UL_SRC_BE") == 0) {
  1122. if (!init_mt6359) {
  1123. dai_link->init = mt8188_mt6359_init;
  1124. init_mt6359 = true;
  1125. }
  1126. } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
  1127. strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
  1128. strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
  1129. strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
  1130. if (!dai_link->num_codecs)
  1131. continue;
  1132. if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
  1133. /*
  1134. * The TDM protocol settings with fixed 4 slots are defined in
  1135. * mt8188_max98390_ops. Two amps is I2S mode,
  1136. * SOC and codec don't require TDM settings.
  1137. */
  1138. if (!(card_data->flags & MAX98390_TWO_AMP)) {
  1139. dai_link->ops = &mt8188_max98390_ops;
  1140. }
  1141. if (!init_max98390) {
  1142. dai_link->init = mt8188_max98390_codec_init;
  1143. init_max98390 = true;
  1144. }
  1145. } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
  1146. dai_link->ops = &mt8188_nau8825_ops;
  1147. if (!init_nau8825) {
  1148. dai_link->init = mt8188_headset_codec_init;
  1149. dai_link->exit = mt8188_headset_codec_exit;
  1150. init_nau8825 = true;
  1151. }
  1152. } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
  1153. dai_link->ops = &mt8188_rt5682s_i2s_ops;
  1154. if (!init_rt5682s) {
  1155. dai_link->init = mt8188_headset_codec_init;
  1156. dai_link->exit = mt8188_headset_codec_exit;
  1157. init_rt5682s = true;
  1158. }
  1159. } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) {
  1160. dai_link->ops = &mt8188_es8326_ops;
  1161. if (!init_es8326) {
  1162. dai_link->init = mt8188_headset_codec_init;
  1163. dai_link->exit = mt8188_headset_codec_exit;
  1164. init_es8326 = true;
  1165. }
  1166. } else {
  1167. if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) {
  1168. if (!init_dumb) {
  1169. dai_link->init = mt8188_dumb_amp_init;
  1170. init_dumb = true;
  1171. }
  1172. }
  1173. }
  1174. }
  1175. }
  1176. return 0;
  1177. }
  1178. static const struct mtk_sof_priv mt8188_sof_priv = {
  1179. .conn_streams = g_sof_conn_streams,
  1180. .num_streams = ARRAY_SIZE(g_sof_conn_streams),
  1181. };
  1182. static const struct mtk_soundcard_pdata mt8188_evb_card = {
  1183. .card_name = "mt8188_mt6359",
  1184. .card_data = &(struct mtk_platform_card_data) {
  1185. .card = &mt8188_mt6359_soc_card,
  1186. .num_jacks = MT8188_JACK_MAX,
  1187. },
  1188. .sof_priv = &mt8188_sof_priv,
  1189. .soc_probe = mt8188_mt6359_soc_card_probe,
  1190. };
  1191. static const struct mtk_soundcard_pdata mt8188_nau8825_card = {
  1192. .card_name = "mt8188_nau8825",
  1193. .card_data = &(struct mtk_platform_card_data) {
  1194. .card = &mt8188_mt6359_soc_card,
  1195. .num_jacks = MT8188_JACK_MAX,
  1196. .flags = NAU8825_HS_PRESENT
  1197. },
  1198. .sof_priv = &mt8188_sof_priv,
  1199. .soc_probe = mt8188_mt6359_soc_card_probe,
  1200. };
  1201. static const struct mtk_soundcard_pdata mt8188_rt5682s_card = {
  1202. .card_name = "mt8188_rt5682s",
  1203. .card_data = &(struct mtk_platform_card_data) {
  1204. .card = &mt8188_mt6359_soc_card,
  1205. .num_jacks = MT8188_JACK_MAX,
  1206. .flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP
  1207. },
  1208. .sof_priv = &mt8188_sof_priv,
  1209. .soc_probe = mt8188_mt6359_soc_card_probe,
  1210. };
  1211. static const struct mtk_soundcard_pdata mt8188_es8326_card = {
  1212. .card_name = "mt8188_es8326",
  1213. .card_data = &(struct mtk_platform_card_data) {
  1214. .card = &mt8188_mt6359_soc_card,
  1215. .num_jacks = MT8188_JACK_MAX,
  1216. .flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP
  1217. },
  1218. .sof_priv = &mt8188_sof_priv,
  1219. .soc_probe = mt8188_mt6359_soc_card_probe,
  1220. };
  1221. static const struct of_device_id mt8188_mt6359_dt_match[] = {
  1222. { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
  1223. { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
  1224. { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
  1225. { .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
  1226. { /* sentinel */ },
  1227. };
  1228. MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
  1229. static struct platform_driver mt8188_mt6359_driver = {
  1230. .driver = {
  1231. .name = "mt8188_mt6359",
  1232. .of_match_table = mt8188_mt6359_dt_match,
  1233. .pm = &snd_soc_pm_ops,
  1234. },
  1235. .probe = mtk_soundcard_common_probe,
  1236. };
  1237. module_platform_driver(mt8188_mt6359_driver);
  1238. /* Module information */
  1239. MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
  1240. MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
  1241. MODULE_LICENSE("GPL");
  1242. MODULE_ALIAS("mt8188 mt6359 soc card");