mt8188-dai-etdm.c 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek ALSA SoC Audio DAI eTDM Control
  4. *
  5. * Copyright (c) 2022 MediaTek Inc.
  6. * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
  7. * Trevor Wu <trevor.wu@mediatek.com>
  8. * Chun-Chia Chiu <chun-chia.chiu@mediatek.com>
  9. */
  10. #include <linux/bitfield.h>
  11. #include <linux/pm_runtime.h>
  12. #include <linux/regmap.h>
  13. #include <sound/pcm_params.h>
  14. #include "mt8188-afe-clk.h"
  15. #include "mt8188-afe-common.h"
  16. #include "mt8188-reg.h"
  17. #define MT8188_ETDM_MAX_CHANNELS 16
  18. #define MT8188_ETDM_NORMAL_MAX_BCK_RATE 24576000
  19. #define ETDM_TO_DAI_ID(x) ((x) + MT8188_AFE_IO_ETDM_START)
  20. #define ENUM_TO_STR(x) #x
  21. enum {
  22. SUPPLY_SEQ_APLL,
  23. SUPPLY_SEQ_ETDM_MCLK,
  24. SUPPLY_SEQ_ETDM_CG,
  25. SUPPLY_SEQ_DPTX_EN,
  26. SUPPLY_SEQ_ETDM_EN,
  27. };
  28. enum {
  29. MTK_DAI_ETDM_FORMAT_I2S = 0,
  30. MTK_DAI_ETDM_FORMAT_LJ,
  31. MTK_DAI_ETDM_FORMAT_RJ,
  32. MTK_DAI_ETDM_FORMAT_EIAJ,
  33. MTK_DAI_ETDM_FORMAT_DSPA,
  34. MTK_DAI_ETDM_FORMAT_DSPB,
  35. };
  36. enum {
  37. MTK_DAI_ETDM_DATA_ONE_PIN = 0,
  38. MTK_DAI_ETDM_DATA_MULTI_PIN,
  39. };
  40. enum {
  41. ETDM_IN,
  42. ETDM_OUT,
  43. };
  44. enum {
  45. COWORK_ETDM_NONE = 0,
  46. COWORK_ETDM_IN1_M = 2,
  47. COWORK_ETDM_IN1_S = 3,
  48. COWORK_ETDM_IN2_M = 4,
  49. COWORK_ETDM_IN2_S = 5,
  50. COWORK_ETDM_OUT1_M = 10,
  51. COWORK_ETDM_OUT1_S = 11,
  52. COWORK_ETDM_OUT2_M = 12,
  53. COWORK_ETDM_OUT2_S = 13,
  54. COWORK_ETDM_OUT3_M = 14,
  55. COWORK_ETDM_OUT3_S = 15,
  56. };
  57. enum {
  58. ETDM_RELATCH_TIMING_A1A2SYS,
  59. ETDM_RELATCH_TIMING_A3SYS,
  60. ETDM_RELATCH_TIMING_A4SYS,
  61. };
  62. enum {
  63. ETDM_SYNC_NONE,
  64. ETDM_SYNC_FROM_IN1 = 2,
  65. ETDM_SYNC_FROM_IN2 = 4,
  66. ETDM_SYNC_FROM_OUT1 = 10,
  67. ETDM_SYNC_FROM_OUT2 = 12,
  68. ETDM_SYNC_FROM_OUT3 = 14,
  69. };
  70. struct etdm_con_reg {
  71. unsigned int con0;
  72. unsigned int con1;
  73. unsigned int con2;
  74. unsigned int con3;
  75. unsigned int con4;
  76. unsigned int con5;
  77. };
  78. struct mtk_dai_etdm_rate {
  79. unsigned int rate;
  80. unsigned int reg_value;
  81. };
  82. struct mtk_dai_etdm_priv {
  83. unsigned int data_mode;
  84. bool slave_mode;
  85. bool lrck_inv;
  86. bool bck_inv;
  87. unsigned int rate;
  88. unsigned int format;
  89. unsigned int slots;
  90. unsigned int lrck_width;
  91. unsigned int mclk_freq;
  92. unsigned int mclk_fixed_apll;
  93. unsigned int mclk_apll;
  94. unsigned int mclk_dir;
  95. int cowork_source_id; //dai id
  96. unsigned int cowork_slv_count;
  97. int cowork_slv_id[MT8188_AFE_IO_ETDM_NUM - 1]; //dai_id
  98. bool in_disable_ch[MT8188_ETDM_MAX_CHANNELS];
  99. };
  100. static const struct mtk_dai_etdm_rate mt8188_etdm_rates[] = {
  101. { .rate = 8000, .reg_value = 0, },
  102. { .rate = 12000, .reg_value = 1, },
  103. { .rate = 16000, .reg_value = 2, },
  104. { .rate = 24000, .reg_value = 3, },
  105. { .rate = 32000, .reg_value = 4, },
  106. { .rate = 48000, .reg_value = 5, },
  107. { .rate = 96000, .reg_value = 7, },
  108. { .rate = 192000, .reg_value = 9, },
  109. { .rate = 384000, .reg_value = 11, },
  110. { .rate = 11025, .reg_value = 16, },
  111. { .rate = 22050, .reg_value = 17, },
  112. { .rate = 44100, .reg_value = 18, },
  113. { .rate = 88200, .reg_value = 19, },
  114. { .rate = 176400, .reg_value = 20, },
  115. { .rate = 352800, .reg_value = 21, },
  116. };
  117. static int get_etdm_fs_timing(unsigned int rate)
  118. {
  119. int i;
  120. for (i = 0; i < ARRAY_SIZE(mt8188_etdm_rates); i++)
  121. if (mt8188_etdm_rates[i].rate == rate)
  122. return mt8188_etdm_rates[i].reg_value;
  123. return -EINVAL;
  124. }
  125. static unsigned int get_etdm_ch_fixup(unsigned int channels)
  126. {
  127. if (channels > 16)
  128. return 24;
  129. else if (channels > 8)
  130. return 16;
  131. else if (channels > 4)
  132. return 8;
  133. else if (channels > 2)
  134. return 4;
  135. else
  136. return 2;
  137. }
  138. static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)
  139. {
  140. switch (dai_id) {
  141. case MT8188_AFE_IO_ETDM1_IN:
  142. etdm_reg->con0 = ETDM_IN1_CON0;
  143. etdm_reg->con1 = ETDM_IN1_CON1;
  144. etdm_reg->con2 = ETDM_IN1_CON2;
  145. etdm_reg->con3 = ETDM_IN1_CON3;
  146. etdm_reg->con4 = ETDM_IN1_CON4;
  147. etdm_reg->con5 = ETDM_IN1_CON5;
  148. break;
  149. case MT8188_AFE_IO_ETDM2_IN:
  150. etdm_reg->con0 = ETDM_IN2_CON0;
  151. etdm_reg->con1 = ETDM_IN2_CON1;
  152. etdm_reg->con2 = ETDM_IN2_CON2;
  153. etdm_reg->con3 = ETDM_IN2_CON3;
  154. etdm_reg->con4 = ETDM_IN2_CON4;
  155. etdm_reg->con5 = ETDM_IN2_CON5;
  156. break;
  157. case MT8188_AFE_IO_ETDM1_OUT:
  158. etdm_reg->con0 = ETDM_OUT1_CON0;
  159. etdm_reg->con1 = ETDM_OUT1_CON1;
  160. etdm_reg->con2 = ETDM_OUT1_CON2;
  161. etdm_reg->con3 = ETDM_OUT1_CON3;
  162. etdm_reg->con4 = ETDM_OUT1_CON4;
  163. etdm_reg->con5 = ETDM_OUT1_CON5;
  164. break;
  165. case MT8188_AFE_IO_ETDM2_OUT:
  166. etdm_reg->con0 = ETDM_OUT2_CON0;
  167. etdm_reg->con1 = ETDM_OUT2_CON1;
  168. etdm_reg->con2 = ETDM_OUT2_CON2;
  169. etdm_reg->con3 = ETDM_OUT2_CON3;
  170. etdm_reg->con4 = ETDM_OUT2_CON4;
  171. etdm_reg->con5 = ETDM_OUT2_CON5;
  172. break;
  173. case MT8188_AFE_IO_ETDM3_OUT:
  174. case MT8188_AFE_IO_DPTX:
  175. etdm_reg->con0 = ETDM_OUT3_CON0;
  176. etdm_reg->con1 = ETDM_OUT3_CON1;
  177. etdm_reg->con2 = ETDM_OUT3_CON2;
  178. etdm_reg->con3 = ETDM_OUT3_CON3;
  179. etdm_reg->con4 = ETDM_OUT3_CON4;
  180. etdm_reg->con5 = ETDM_OUT3_CON5;
  181. break;
  182. default:
  183. return -EINVAL;
  184. }
  185. return 0;
  186. }
  187. static int get_etdm_dir(unsigned int dai_id)
  188. {
  189. switch (dai_id) {
  190. case MT8188_AFE_IO_ETDM1_IN:
  191. case MT8188_AFE_IO_ETDM2_IN:
  192. return ETDM_IN;
  193. case MT8188_AFE_IO_ETDM1_OUT:
  194. case MT8188_AFE_IO_ETDM2_OUT:
  195. case MT8188_AFE_IO_ETDM3_OUT:
  196. return ETDM_OUT;
  197. default:
  198. return -EINVAL;
  199. }
  200. }
  201. static int get_etdm_wlen(unsigned int bitwidth)
  202. {
  203. return bitwidth <= 16 ? 16 : 32;
  204. }
  205. static bool is_valid_etdm_dai(int dai_id)
  206. {
  207. switch (dai_id) {
  208. case MT8188_AFE_IO_ETDM1_IN:
  209. fallthrough;
  210. case MT8188_AFE_IO_ETDM2_IN:
  211. fallthrough;
  212. case MT8188_AFE_IO_ETDM1_OUT:
  213. fallthrough;
  214. case MT8188_AFE_IO_ETDM2_OUT:
  215. fallthrough;
  216. case MT8188_AFE_IO_DPTX:
  217. fallthrough;
  218. case MT8188_AFE_IO_ETDM3_OUT:
  219. return true;
  220. default:
  221. return false;
  222. }
  223. }
  224. static int is_cowork_mode(struct snd_soc_dai *dai)
  225. {
  226. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  227. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  228. struct mtk_dai_etdm_priv *etdm_data;
  229. if (!is_valid_etdm_dai(dai->id))
  230. return -EINVAL;
  231. etdm_data = afe_priv->dai_priv[dai->id];
  232. return (etdm_data->cowork_slv_count > 0 ||
  233. etdm_data->cowork_source_id != COWORK_ETDM_NONE);
  234. }
  235. static int sync_to_dai_id(int source_sel)
  236. {
  237. switch (source_sel) {
  238. case ETDM_SYNC_FROM_IN1:
  239. return MT8188_AFE_IO_ETDM1_IN;
  240. case ETDM_SYNC_FROM_IN2:
  241. return MT8188_AFE_IO_ETDM2_IN;
  242. case ETDM_SYNC_FROM_OUT1:
  243. return MT8188_AFE_IO_ETDM1_OUT;
  244. case ETDM_SYNC_FROM_OUT2:
  245. return MT8188_AFE_IO_ETDM2_OUT;
  246. case ETDM_SYNC_FROM_OUT3:
  247. return MT8188_AFE_IO_ETDM3_OUT;
  248. default:
  249. return 0;
  250. }
  251. }
  252. static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)
  253. {
  254. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  255. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  256. struct mtk_dai_etdm_priv *etdm_data;
  257. int dai_id;
  258. if (!is_valid_etdm_dai(dai->id))
  259. return -EINVAL;
  260. etdm_data = afe_priv->dai_priv[dai->id];
  261. dai_id = etdm_data->cowork_source_id;
  262. if (dai_id == COWORK_ETDM_NONE)
  263. dai_id = dai->id;
  264. return dai_id;
  265. }
  266. static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)
  267. {
  268. switch (dai_id) {
  269. case MT8188_AFE_IO_DPTX:
  270. return MT8188_CLK_AUD_HDMI_OUT;
  271. case MT8188_AFE_IO_ETDM1_IN:
  272. return MT8188_CLK_AUD_TDM_IN;
  273. case MT8188_AFE_IO_ETDM2_IN:
  274. return MT8188_CLK_AUD_I2SIN;
  275. case MT8188_AFE_IO_ETDM1_OUT:
  276. return MT8188_CLK_AUD_TDM_OUT;
  277. case MT8188_AFE_IO_ETDM2_OUT:
  278. return MT8188_CLK_AUD_I2S_OUT;
  279. case MT8188_AFE_IO_ETDM3_OUT:
  280. return MT8188_CLK_AUD_HDMI_OUT;
  281. default:
  282. return -EINVAL;
  283. }
  284. }
  285. static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)
  286. {
  287. switch (dai_id) {
  288. case MT8188_AFE_IO_DPTX:
  289. return MT8188_CLK_TOP_DPTX_M_SEL;
  290. case MT8188_AFE_IO_ETDM1_IN:
  291. return MT8188_CLK_TOP_I2SI1_M_SEL;
  292. case MT8188_AFE_IO_ETDM2_IN:
  293. return MT8188_CLK_TOP_I2SI2_M_SEL;
  294. case MT8188_AFE_IO_ETDM1_OUT:
  295. return MT8188_CLK_TOP_I2SO1_M_SEL;
  296. case MT8188_AFE_IO_ETDM2_OUT:
  297. return MT8188_CLK_TOP_I2SO2_M_SEL;
  298. case MT8188_AFE_IO_ETDM3_OUT:
  299. default:
  300. return -EINVAL;
  301. }
  302. }
  303. static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)
  304. {
  305. switch (dai_id) {
  306. case MT8188_AFE_IO_DPTX:
  307. return MT8188_CLK_TOP_APLL12_DIV9;
  308. case MT8188_AFE_IO_ETDM1_IN:
  309. return MT8188_CLK_TOP_APLL12_DIV0;
  310. case MT8188_AFE_IO_ETDM2_IN:
  311. return MT8188_CLK_TOP_APLL12_DIV1;
  312. case MT8188_AFE_IO_ETDM1_OUT:
  313. return MT8188_CLK_TOP_APLL12_DIV2;
  314. case MT8188_AFE_IO_ETDM2_OUT:
  315. return MT8188_CLK_TOP_APLL12_DIV3;
  316. case MT8188_AFE_IO_ETDM3_OUT:
  317. default:
  318. return -EINVAL;
  319. }
  320. }
  321. static int get_etdm_id_by_name(struct mtk_base_afe *afe,
  322. const char *name)
  323. {
  324. if (!strncmp(name, "ETDM1_IN", strlen("ETDM1_IN")))
  325. return MT8188_AFE_IO_ETDM1_IN;
  326. else if (!strncmp(name, "ETDM2_IN", strlen("ETDM2_IN")))
  327. return MT8188_AFE_IO_ETDM2_IN;
  328. else if (!strncmp(name, "ETDM1_OUT", strlen("ETDM1_OUT")))
  329. return MT8188_AFE_IO_ETDM1_OUT;
  330. else if (!strncmp(name, "ETDM2_OUT", strlen("ETDM2_OUT")))
  331. return MT8188_AFE_IO_ETDM2_OUT;
  332. else if (!strncmp(name, "ETDM3_OUT", strlen("ETDM3_OUT")))
  333. return MT8188_AFE_IO_ETDM3_OUT;
  334. else if (!strncmp(name, "DPTX", strlen("DPTX")))
  335. return MT8188_AFE_IO_ETDM3_OUT;
  336. else
  337. return -EINVAL;
  338. }
  339. static struct mtk_dai_etdm_priv *get_etdm_priv_by_name(struct mtk_base_afe *afe,
  340. const char *name)
  341. {
  342. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  343. int dai_id = get_etdm_id_by_name(afe, name);
  344. if (dai_id < MT8188_AFE_IO_ETDM_START ||
  345. dai_id >= MT8188_AFE_IO_ETDM_END)
  346. return NULL;
  347. return afe_priv->dai_priv[dai_id];
  348. }
  349. static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)
  350. {
  351. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  352. struct mtk_dai_etdm_priv *etdm_data;
  353. struct etdm_con_reg etdm_reg;
  354. unsigned int val = 0;
  355. unsigned int mask;
  356. int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
  357. int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
  358. int apll_clk_id;
  359. int apll;
  360. int ret;
  361. if (!is_valid_etdm_dai(dai_id))
  362. return -EINVAL;
  363. etdm_data = afe_priv->dai_priv[dai_id];
  364. apll = etdm_data->mclk_apll;
  365. apll_clk_id = mt8188_afe_get_mclk_source_clk_id(apll);
  366. if (clkmux_id < 0 || clkdiv_id < 0)
  367. return -EINVAL;
  368. if (apll_clk_id < 0)
  369. return apll_clk_id;
  370. ret = get_etdm_reg(dai_id, &etdm_reg);
  371. if (ret < 0)
  372. return ret;
  373. mask = ETDM_CON1_MCLK_OUTPUT;
  374. if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
  375. val = ETDM_CON1_MCLK_OUTPUT;
  376. regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
  377. /* enable parent clock before select apll*/
  378. mt8188_afe_enable_clk(afe, afe_priv->clk[clkmux_id]);
  379. /* select apll */
  380. ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[clkmux_id],
  381. afe_priv->clk[apll_clk_id]);
  382. if (ret)
  383. return ret;
  384. /* set rate */
  385. ret = mt8188_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],
  386. etdm_data->mclk_freq);
  387. mt8188_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);
  388. return 0;
  389. }
  390. static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)
  391. {
  392. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  393. int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
  394. int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
  395. if (clkmux_id < 0 || clkdiv_id < 0)
  396. return -EINVAL;
  397. mt8188_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);
  398. mt8188_afe_disable_clk(afe, afe_priv->clk[clkmux_id]);
  399. return 0;
  400. }
  401. static int mtk_afe_etdm_apll_connect(struct snd_soc_dapm_widget *source,
  402. struct snd_soc_dapm_widget *sink)
  403. {
  404. struct snd_soc_dapm_widget *w = sink;
  405. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  406. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  407. struct mtk_dai_etdm_priv *etdm_priv;
  408. int cur_apll;
  409. int need_apll;
  410. etdm_priv = get_etdm_priv_by_name(afe, w->name);
  411. if (!etdm_priv) {
  412. dev_dbg(afe->dev, "etdm_priv == NULL\n");
  413. return 0;
  414. }
  415. cur_apll = mt8188_get_apll_by_name(afe, source->name);
  416. need_apll = mt8188_get_apll_by_rate(afe, etdm_priv->rate);
  417. return (need_apll == cur_apll) ? 1 : 0;
  418. }
  419. static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,
  420. struct snd_soc_dapm_widget *sink)
  421. {
  422. struct snd_soc_dapm_widget *w = sink;
  423. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  424. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  425. struct mtk_dai_etdm_priv *etdm_priv;
  426. int cur_apll;
  427. etdm_priv = get_etdm_priv_by_name(afe, w->name);
  428. cur_apll = mt8188_get_apll_by_name(afe, source->name);
  429. return (etdm_priv->mclk_apll == cur_apll) ? 1 : 0;
  430. }
  431. static int mtk_etdm_mclk_connect(struct snd_soc_dapm_widget *source,
  432. struct snd_soc_dapm_widget *sink)
  433. {
  434. struct snd_soc_dapm_widget *w = sink;
  435. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  436. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  437. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  438. struct mtk_dai_etdm_priv *etdm_priv;
  439. int mclk_id;
  440. mclk_id = get_etdm_id_by_name(afe, source->name);
  441. if (mclk_id < 0) {
  442. dev_dbg(afe->dev, "mclk_id < 0\n");
  443. return 0;
  444. }
  445. etdm_priv = get_etdm_priv_by_name(afe, w->name);
  446. if (!etdm_priv) {
  447. dev_dbg(afe->dev, "etdm_priv == NULL\n");
  448. return 0;
  449. }
  450. if (get_etdm_id_by_name(afe, sink->name) == mclk_id)
  451. return !!(etdm_priv->mclk_freq > 0);
  452. if (etdm_priv->cowork_source_id == mclk_id) {
  453. etdm_priv = afe_priv->dai_priv[mclk_id];
  454. return !!(etdm_priv->mclk_freq > 0);
  455. }
  456. return 0;
  457. }
  458. static int mtk_etdm_cowork_connect(struct snd_soc_dapm_widget *source,
  459. struct snd_soc_dapm_widget *sink)
  460. {
  461. struct snd_soc_dapm_widget *w = sink;
  462. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  463. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  464. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  465. struct mtk_dai_etdm_priv *etdm_priv;
  466. int source_id;
  467. int i;
  468. source_id = get_etdm_id_by_name(afe, source->name);
  469. if (source_id < 0) {
  470. dev_dbg(afe->dev, "%s() source_id < 0\n", __func__);
  471. return 0;
  472. }
  473. etdm_priv = get_etdm_priv_by_name(afe, w->name);
  474. if (!etdm_priv) {
  475. dev_dbg(afe->dev, "%s() etdm_priv == NULL\n", __func__);
  476. return 0;
  477. }
  478. if (etdm_priv->cowork_source_id != COWORK_ETDM_NONE) {
  479. if (etdm_priv->cowork_source_id == source_id)
  480. return 1;
  481. etdm_priv = afe_priv->dai_priv[etdm_priv->cowork_source_id];
  482. for (i = 0; i < etdm_priv->cowork_slv_count; i++) {
  483. if (etdm_priv->cowork_slv_id[i] == source_id)
  484. return 1;
  485. }
  486. } else {
  487. for (i = 0; i < etdm_priv->cowork_slv_count; i++) {
  488. if (etdm_priv->cowork_slv_id[i] == source_id)
  489. return 1;
  490. }
  491. }
  492. return 0;
  493. }
  494. static int mtk_apll_event(struct snd_soc_dapm_widget *w,
  495. struct snd_kcontrol *kcontrol,
  496. int event)
  497. {
  498. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  499. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  500. dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
  501. __func__, w->name, event);
  502. switch (event) {
  503. case SND_SOC_DAPM_PRE_PMU:
  504. if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
  505. mt8188_apll1_enable(afe);
  506. else
  507. mt8188_apll2_enable(afe);
  508. break;
  509. case SND_SOC_DAPM_POST_PMD:
  510. if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
  511. mt8188_apll1_disable(afe);
  512. else
  513. mt8188_apll2_disable(afe);
  514. break;
  515. default:
  516. break;
  517. }
  518. return 0;
  519. }
  520. static int mtk_etdm_mclk_event(struct snd_soc_dapm_widget *w,
  521. struct snd_kcontrol *kcontrol,
  522. int event)
  523. {
  524. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  525. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  526. int mclk_id = get_etdm_id_by_name(afe, w->name);
  527. if (mclk_id < 0) {
  528. dev_dbg(afe->dev, "%s() mclk_id < 0\n", __func__);
  529. return 0;
  530. }
  531. dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
  532. __func__, w->name, event);
  533. switch (event) {
  534. case SND_SOC_DAPM_PRE_PMU:
  535. mtk_dai_etdm_enable_mclk(afe, mclk_id);
  536. break;
  537. case SND_SOC_DAPM_POST_PMD:
  538. mtk_dai_etdm_disable_mclk(afe, mclk_id);
  539. break;
  540. default:
  541. break;
  542. }
  543. return 0;
  544. }
  545. static int mtk_dptx_mclk_event(struct snd_soc_dapm_widget *w,
  546. struct snd_kcontrol *kcontrol,
  547. int event)
  548. {
  549. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  550. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  551. dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
  552. __func__, w->name, event);
  553. switch (event) {
  554. case SND_SOC_DAPM_PRE_PMU:
  555. mtk_dai_etdm_enable_mclk(afe, MT8188_AFE_IO_DPTX);
  556. break;
  557. case SND_SOC_DAPM_POST_PMD:
  558. mtk_dai_etdm_disable_mclk(afe, MT8188_AFE_IO_DPTX);
  559. break;
  560. default:
  561. break;
  562. }
  563. return 0;
  564. }
  565. static int mtk_etdm_cg_event(struct snd_soc_dapm_widget *w,
  566. struct snd_kcontrol *kcontrol,
  567. int event)
  568. {
  569. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  570. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  571. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  572. int etdm_id;
  573. int cg_id;
  574. etdm_id = get_etdm_id_by_name(afe, w->name);
  575. if (etdm_id < 0) {
  576. dev_dbg(afe->dev, "%s() etdm_id < 0\n", __func__);
  577. return 0;
  578. }
  579. cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(etdm_id);
  580. if (cg_id < 0) {
  581. dev_dbg(afe->dev, "%s() cg_id < 0\n", __func__);
  582. return 0;
  583. }
  584. dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
  585. __func__, w->name, event);
  586. switch (event) {
  587. case SND_SOC_DAPM_PRE_PMU:
  588. mt8188_afe_enable_clk(afe, afe_priv->clk[cg_id]);
  589. break;
  590. case SND_SOC_DAPM_POST_PMD:
  591. mt8188_afe_disable_clk(afe, afe_priv->clk[cg_id]);
  592. break;
  593. default:
  594. break;
  595. }
  596. return 0;
  597. }
  598. static int mtk_etdm3_cg_event(struct snd_soc_dapm_widget *w,
  599. struct snd_kcontrol *kcontrol,
  600. int event)
  601. {
  602. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  603. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  604. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  605. dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
  606. __func__, w->name, event);
  607. switch (event) {
  608. case SND_SOC_DAPM_PRE_PMU:
  609. mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);
  610. break;
  611. case SND_SOC_DAPM_POST_PMD:
  612. mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);
  613. break;
  614. default:
  615. break;
  616. }
  617. return 0;
  618. }
  619. static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {
  620. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),
  621. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),
  622. SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),
  623. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),
  624. };
  625. static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {
  626. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),
  627. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),
  628. SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),
  629. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),
  630. };
  631. static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {
  632. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),
  633. SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),
  634. };
  635. static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {
  636. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),
  637. SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),
  638. };
  639. static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {
  640. SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),
  641. SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),
  642. };
  643. static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {
  644. SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),
  645. SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),
  646. };
  647. static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {
  648. SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),
  649. SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),
  650. };
  651. static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {
  652. SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),
  653. SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),
  654. };
  655. static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {
  656. SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),
  657. SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),
  658. };
  659. static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {
  660. SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),
  661. SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),
  662. };
  663. static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {
  664. SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),
  665. SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),
  666. };
  667. static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {
  668. SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),
  669. SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),
  670. };
  671. static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {
  672. SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),
  673. SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),
  674. };
  675. static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {
  676. SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),
  677. SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),
  678. };
  679. static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {
  680. SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),
  681. SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),
  682. };
  683. static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {
  684. SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),
  685. SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),
  686. };
  687. static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {
  688. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),
  689. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),
  690. SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),
  691. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),
  692. };
  693. static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {
  694. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),
  695. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),
  696. SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),
  697. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),
  698. };
  699. static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {
  700. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),
  701. SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),
  702. };
  703. static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {
  704. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),
  705. SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),
  706. };
  707. static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {
  708. SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),
  709. SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),
  710. };
  711. static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {
  712. SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),
  713. SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),
  714. };
  715. static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {
  716. SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),
  717. SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),
  718. };
  719. static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {
  720. SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),
  721. SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),
  722. };
  723. static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {
  724. SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),
  725. SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),
  726. };
  727. static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {
  728. SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),
  729. SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),
  730. };
  731. static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {
  732. SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),
  733. SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),
  734. };
  735. static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {
  736. SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),
  737. SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),
  738. };
  739. static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {
  740. SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),
  741. SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),
  742. };
  743. static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {
  744. SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),
  745. SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),
  746. };
  747. static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {
  748. SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),
  749. SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),
  750. };
  751. static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {
  752. SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),
  753. SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),
  754. };
  755. static const char * const mt8188_etdm_clk_src_sel_text[] = {
  756. "26m",
  757. "a1sys_a2sys",
  758. "a3sys",
  759. "a4sys",
  760. };
  761. static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,
  762. mt8188_etdm_clk_src_sel_text);
  763. static const char * const hdmitx_dptx_mux_map[] = {
  764. "Disconnect", "Connect",
  765. };
  766. static int hdmitx_dptx_mux_map_value[] = {
  767. 0, 1,
  768. };
  769. /* HDMI_OUT_MUX */
  770. static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,
  771. SND_SOC_NOPM,
  772. 0,
  773. 1,
  774. hdmitx_dptx_mux_map,
  775. hdmitx_dptx_mux_map_value);
  776. static const struct snd_kcontrol_new hdmi_out_mux_control =
  777. SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);
  778. /* DPTX_OUT_MUX */
  779. static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,
  780. SND_SOC_NOPM,
  781. 0,
  782. 1,
  783. hdmitx_dptx_mux_map,
  784. hdmitx_dptx_mux_map_value);
  785. static const struct snd_kcontrol_new dptx_out_mux_control =
  786. SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);
  787. /* HDMI_CH0_MUX ~ HDMI_CH7_MUX */
  788. static const char *const afe_conn_hdmi_mux_map[] = {
  789. "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",
  790. };
  791. static int afe_conn_hdmi_mux_map_value[] = {
  792. 0, 1, 2, 3, 4, 5, 6, 7,
  793. };
  794. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,
  795. AFE_TDMOUT_CONN0,
  796. 0,
  797. 0xf,
  798. afe_conn_hdmi_mux_map,
  799. afe_conn_hdmi_mux_map_value);
  800. static const struct snd_kcontrol_new hdmi_ch0_mux_control =
  801. SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);
  802. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,
  803. AFE_TDMOUT_CONN0,
  804. 4,
  805. 0xf,
  806. afe_conn_hdmi_mux_map,
  807. afe_conn_hdmi_mux_map_value);
  808. static const struct snd_kcontrol_new hdmi_ch1_mux_control =
  809. SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);
  810. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,
  811. AFE_TDMOUT_CONN0,
  812. 8,
  813. 0xf,
  814. afe_conn_hdmi_mux_map,
  815. afe_conn_hdmi_mux_map_value);
  816. static const struct snd_kcontrol_new hdmi_ch2_mux_control =
  817. SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);
  818. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,
  819. AFE_TDMOUT_CONN0,
  820. 12,
  821. 0xf,
  822. afe_conn_hdmi_mux_map,
  823. afe_conn_hdmi_mux_map_value);
  824. static const struct snd_kcontrol_new hdmi_ch3_mux_control =
  825. SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);
  826. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,
  827. AFE_TDMOUT_CONN0,
  828. 16,
  829. 0xf,
  830. afe_conn_hdmi_mux_map,
  831. afe_conn_hdmi_mux_map_value);
  832. static const struct snd_kcontrol_new hdmi_ch4_mux_control =
  833. SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);
  834. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,
  835. AFE_TDMOUT_CONN0,
  836. 20,
  837. 0xf,
  838. afe_conn_hdmi_mux_map,
  839. afe_conn_hdmi_mux_map_value);
  840. static const struct snd_kcontrol_new hdmi_ch5_mux_control =
  841. SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);
  842. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,
  843. AFE_TDMOUT_CONN0,
  844. 24,
  845. 0xf,
  846. afe_conn_hdmi_mux_map,
  847. afe_conn_hdmi_mux_map_value);
  848. static const struct snd_kcontrol_new hdmi_ch6_mux_control =
  849. SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);
  850. static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,
  851. AFE_TDMOUT_CONN0,
  852. 28,
  853. 0xf,
  854. afe_conn_hdmi_mux_map,
  855. afe_conn_hdmi_mux_map_value);
  856. static const struct snd_kcontrol_new hdmi_ch7_mux_control =
  857. SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);
  858. static int mt8188_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,
  859. struct snd_ctl_elem_value *ucontrol)
  860. {
  861. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  862. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  863. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  864. unsigned int source = ucontrol->value.enumerated.item[0];
  865. unsigned int val;
  866. unsigned int old_val;
  867. unsigned int mask;
  868. unsigned int reg;
  869. if (source >= e->items)
  870. return -EINVAL;
  871. if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
  872. reg = ETDM_OUT1_CON4;
  873. mask = ETDM_OUT_CON4_CLOCK_MASK;
  874. val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
  875. } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
  876. reg = ETDM_OUT2_CON4;
  877. mask = ETDM_OUT_CON4_CLOCK_MASK;
  878. val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
  879. } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
  880. reg = ETDM_OUT3_CON4;
  881. mask = ETDM_OUT_CON4_CLOCK_MASK;
  882. val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
  883. } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
  884. reg = ETDM_IN1_CON2;
  885. mask = ETDM_IN_CON2_CLOCK_MASK;
  886. val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);
  887. } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
  888. reg = ETDM_IN2_CON2;
  889. mask = ETDM_IN_CON2_CLOCK_MASK;
  890. val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);
  891. } else {
  892. return -EINVAL;
  893. }
  894. regmap_read(afe->regmap, reg, &old_val);
  895. old_val &= mask;
  896. if (old_val == val)
  897. return 0;
  898. regmap_update_bits(afe->regmap, reg, mask, val);
  899. return 1;
  900. }
  901. static int mt8188_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,
  902. struct snd_ctl_elem_value *ucontrol)
  903. {
  904. struct snd_soc_component *component =
  905. snd_soc_kcontrol_component(kcontrol);
  906. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  907. unsigned int value;
  908. unsigned int reg;
  909. unsigned int mask;
  910. unsigned int shift;
  911. if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
  912. reg = ETDM_OUT1_CON4;
  913. mask = ETDM_OUT_CON4_CLOCK_MASK;
  914. shift = ETDM_OUT_CON4_CLOCK_SHIFT;
  915. } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
  916. reg = ETDM_OUT2_CON4;
  917. mask = ETDM_OUT_CON4_CLOCK_MASK;
  918. shift = ETDM_OUT_CON4_CLOCK_SHIFT;
  919. } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
  920. reg = ETDM_OUT3_CON4;
  921. mask = ETDM_OUT_CON4_CLOCK_MASK;
  922. shift = ETDM_OUT_CON4_CLOCK_SHIFT;
  923. } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
  924. reg = ETDM_IN1_CON2;
  925. mask = ETDM_IN_CON2_CLOCK_MASK;
  926. shift = ETDM_IN_CON2_CLOCK_SHIFT;
  927. } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
  928. reg = ETDM_IN2_CON2;
  929. mask = ETDM_IN_CON2_CLOCK_MASK;
  930. shift = ETDM_IN_CON2_CLOCK_SHIFT;
  931. } else {
  932. return -EINVAL;
  933. }
  934. regmap_read(afe->regmap, reg, &value);
  935. value &= mask;
  936. value >>= shift;
  937. ucontrol->value.enumerated.item[0] = value;
  938. return 0;
  939. }
  940. static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {
  941. SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", etdmout_clk_src_enum,
  942. mt8188_etdm_clk_src_sel_get,
  943. mt8188_etdm_clk_src_sel_put),
  944. SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", etdmout_clk_src_enum,
  945. mt8188_etdm_clk_src_sel_get,
  946. mt8188_etdm_clk_src_sel_put),
  947. SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", etdmout_clk_src_enum,
  948. mt8188_etdm_clk_src_sel_get,
  949. mt8188_etdm_clk_src_sel_put),
  950. SOC_ENUM_EXT("ETDM_IN1_Clock_Source", etdmout_clk_src_enum,
  951. mt8188_etdm_clk_src_sel_get,
  952. mt8188_etdm_clk_src_sel_put),
  953. SOC_ENUM_EXT("ETDM_IN2_Clock_Source", etdmout_clk_src_enum,
  954. mt8188_etdm_clk_src_sel_get,
  955. mt8188_etdm_clk_src_sel_put),
  956. };
  957. static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {
  958. /* eTDM_IN2 */
  959. SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),
  960. SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),
  961. SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),
  962. SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),
  963. SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),
  964. SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),
  965. SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),
  966. SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),
  967. SND_SOC_DAPM_MIXER("I188", SND_SOC_NOPM, 0, 0, NULL, 0),
  968. SND_SOC_DAPM_MIXER("I189", SND_SOC_NOPM, 0, 0, NULL, 0),
  969. SND_SOC_DAPM_MIXER("I190", SND_SOC_NOPM, 0, 0, NULL, 0),
  970. SND_SOC_DAPM_MIXER("I191", SND_SOC_NOPM, 0, 0, NULL, 0),
  971. SND_SOC_DAPM_MIXER("I192", SND_SOC_NOPM, 0, 0, NULL, 0),
  972. SND_SOC_DAPM_MIXER("I193", SND_SOC_NOPM, 0, 0, NULL, 0),
  973. SND_SOC_DAPM_MIXER("I194", SND_SOC_NOPM, 0, 0, NULL, 0),
  974. SND_SOC_DAPM_MIXER("I195", SND_SOC_NOPM, 0, 0, NULL, 0),
  975. /* eTDM_IN1 */
  976. SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),
  977. SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),
  978. SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),
  979. SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),
  980. SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),
  981. SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),
  982. SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),
  983. SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),
  984. SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),
  985. SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),
  986. SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),
  987. SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),
  988. SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),
  989. SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),
  990. SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),
  991. SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),
  992. /* eTDM_OUT2 */
  993. SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,
  994. mtk_dai_etdm_o048_mix, ARRAY_SIZE(mtk_dai_etdm_o048_mix)),
  995. SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,
  996. mtk_dai_etdm_o049_mix, ARRAY_SIZE(mtk_dai_etdm_o049_mix)),
  997. SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,
  998. mtk_dai_etdm_o050_mix, ARRAY_SIZE(mtk_dai_etdm_o050_mix)),
  999. SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,
  1000. mtk_dai_etdm_o051_mix, ARRAY_SIZE(mtk_dai_etdm_o051_mix)),
  1001. SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,
  1002. mtk_dai_etdm_o052_mix, ARRAY_SIZE(mtk_dai_etdm_o052_mix)),
  1003. SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,
  1004. mtk_dai_etdm_o053_mix, ARRAY_SIZE(mtk_dai_etdm_o053_mix)),
  1005. SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,
  1006. mtk_dai_etdm_o054_mix, ARRAY_SIZE(mtk_dai_etdm_o054_mix)),
  1007. SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,
  1008. mtk_dai_etdm_o055_mix, ARRAY_SIZE(mtk_dai_etdm_o055_mix)),
  1009. SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,
  1010. mtk_dai_etdm_o056_mix, ARRAY_SIZE(mtk_dai_etdm_o056_mix)),
  1011. SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,
  1012. mtk_dai_etdm_o057_mix, ARRAY_SIZE(mtk_dai_etdm_o057_mix)),
  1013. SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,
  1014. mtk_dai_etdm_o058_mix, ARRAY_SIZE(mtk_dai_etdm_o058_mix)),
  1015. SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,
  1016. mtk_dai_etdm_o059_mix, ARRAY_SIZE(mtk_dai_etdm_o059_mix)),
  1017. SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,
  1018. mtk_dai_etdm_o060_mix, ARRAY_SIZE(mtk_dai_etdm_o060_mix)),
  1019. SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,
  1020. mtk_dai_etdm_o061_mix, ARRAY_SIZE(mtk_dai_etdm_o061_mix)),
  1021. SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,
  1022. mtk_dai_etdm_o062_mix, ARRAY_SIZE(mtk_dai_etdm_o062_mix)),
  1023. SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,
  1024. mtk_dai_etdm_o063_mix, ARRAY_SIZE(mtk_dai_etdm_o063_mix)),
  1025. /* eTDM_OUT1 */
  1026. SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,
  1027. mtk_dai_etdm_o072_mix, ARRAY_SIZE(mtk_dai_etdm_o072_mix)),
  1028. SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,
  1029. mtk_dai_etdm_o073_mix, ARRAY_SIZE(mtk_dai_etdm_o073_mix)),
  1030. SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,
  1031. mtk_dai_etdm_o074_mix, ARRAY_SIZE(mtk_dai_etdm_o074_mix)),
  1032. SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,
  1033. mtk_dai_etdm_o075_mix, ARRAY_SIZE(mtk_dai_etdm_o075_mix)),
  1034. SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,
  1035. mtk_dai_etdm_o076_mix, ARRAY_SIZE(mtk_dai_etdm_o076_mix)),
  1036. SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,
  1037. mtk_dai_etdm_o077_mix, ARRAY_SIZE(mtk_dai_etdm_o077_mix)),
  1038. SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,
  1039. mtk_dai_etdm_o078_mix, ARRAY_SIZE(mtk_dai_etdm_o078_mix)),
  1040. SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,
  1041. mtk_dai_etdm_o079_mix, ARRAY_SIZE(mtk_dai_etdm_o079_mix)),
  1042. SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,
  1043. mtk_dai_etdm_o080_mix, ARRAY_SIZE(mtk_dai_etdm_o080_mix)),
  1044. SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,
  1045. mtk_dai_etdm_o081_mix, ARRAY_SIZE(mtk_dai_etdm_o081_mix)),
  1046. SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,
  1047. mtk_dai_etdm_o082_mix, ARRAY_SIZE(mtk_dai_etdm_o082_mix)),
  1048. SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,
  1049. mtk_dai_etdm_o083_mix, ARRAY_SIZE(mtk_dai_etdm_o083_mix)),
  1050. SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,
  1051. mtk_dai_etdm_o084_mix, ARRAY_SIZE(mtk_dai_etdm_o084_mix)),
  1052. SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,
  1053. mtk_dai_etdm_o085_mix, ARRAY_SIZE(mtk_dai_etdm_o085_mix)),
  1054. SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,
  1055. mtk_dai_etdm_o086_mix, ARRAY_SIZE(mtk_dai_etdm_o086_mix)),
  1056. SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,
  1057. mtk_dai_etdm_o087_mix, ARRAY_SIZE(mtk_dai_etdm_o087_mix)),
  1058. /* eTDM_OUT3 */
  1059. SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,
  1060. &hdmi_out_mux_control),
  1061. SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,
  1062. &dptx_out_mux_control),
  1063. SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,
  1064. &hdmi_ch0_mux_control),
  1065. SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,
  1066. &hdmi_ch1_mux_control),
  1067. SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,
  1068. &hdmi_ch2_mux_control),
  1069. SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,
  1070. &hdmi_ch3_mux_control),
  1071. SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,
  1072. &hdmi_ch4_mux_control),
  1073. SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,
  1074. &hdmi_ch5_mux_control),
  1075. SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,
  1076. &hdmi_ch6_mux_control),
  1077. SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,
  1078. &hdmi_ch7_mux_control),
  1079. /* mclk en */
  1080. SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,
  1081. SND_SOC_NOPM, 0, 0,
  1082. mtk_etdm_mclk_event,
  1083. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1084. SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,
  1085. SND_SOC_NOPM, 0, 0,
  1086. mtk_etdm_mclk_event,
  1087. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1088. SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,
  1089. SND_SOC_NOPM, 0, 0,
  1090. mtk_etdm_mclk_event,
  1091. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1092. SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,
  1093. SND_SOC_NOPM, 0, 0,
  1094. mtk_etdm_mclk_event,
  1095. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1096. SND_SOC_DAPM_SUPPLY_S("DPTX_MCLK", SUPPLY_SEQ_ETDM_MCLK,
  1097. SND_SOC_NOPM, 0, 0,
  1098. mtk_dptx_mclk_event,
  1099. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1100. /* cg */
  1101. SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_CG", SUPPLY_SEQ_ETDM_CG,
  1102. SND_SOC_NOPM, 0, 0,
  1103. mtk_etdm_cg_event,
  1104. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1105. SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_CG", SUPPLY_SEQ_ETDM_CG,
  1106. SND_SOC_NOPM, 0, 0,
  1107. mtk_etdm_cg_event,
  1108. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1109. SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_CG", SUPPLY_SEQ_ETDM_CG,
  1110. SND_SOC_NOPM, 0, 0,
  1111. mtk_etdm_cg_event,
  1112. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1113. SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_CG", SUPPLY_SEQ_ETDM_CG,
  1114. SND_SOC_NOPM, 0, 0,
  1115. mtk_etdm_cg_event,
  1116. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1117. SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_CG", SUPPLY_SEQ_ETDM_CG,
  1118. SND_SOC_NOPM, 0, 0,
  1119. mtk_etdm3_cg_event,
  1120. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1121. /* en */
  1122. SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_EN", SUPPLY_SEQ_ETDM_EN,
  1123. ETDM_IN1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
  1124. SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_EN", SUPPLY_SEQ_ETDM_EN,
  1125. ETDM_IN2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
  1126. SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_EN", SUPPLY_SEQ_ETDM_EN,
  1127. ETDM_OUT1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
  1128. SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_EN", SUPPLY_SEQ_ETDM_EN,
  1129. ETDM_OUT2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
  1130. SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_EN", SUPPLY_SEQ_ETDM_EN,
  1131. ETDM_OUT3_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
  1132. SND_SOC_DAPM_SUPPLY_S("DPTX_EN", SUPPLY_SEQ_DPTX_EN,
  1133. AFE_DPTX_CON, AFE_DPTX_CON_ON_SHIFT, 0, NULL, 0),
  1134. /* apll */
  1135. SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,
  1136. SND_SOC_NOPM, 0, 0,
  1137. mtk_apll_event,
  1138. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1139. SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,
  1140. SND_SOC_NOPM, 0, 0,
  1141. mtk_apll_event,
  1142. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1143. SND_SOC_DAPM_INPUT("ETDM_INPUT"),
  1144. SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),
  1145. };
  1146. static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {
  1147. /* mclk */
  1148. {"ETDM1_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
  1149. {"ETDM1_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
  1150. {"ETDM1_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
  1151. {"ETDM1_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
  1152. {"ETDM2_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
  1153. {"ETDM2_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
  1154. {"ETDM2_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
  1155. {"ETDM2_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
  1156. {"ETDM1_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
  1157. {"ETDM1_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
  1158. {"ETDM1_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
  1159. {"ETDM1_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
  1160. {"ETDM2_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
  1161. {"ETDM2_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
  1162. {"ETDM2_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
  1163. {"ETDM2_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
  1164. {"DPTX", NULL, "DPTX_MCLK"},
  1165. {"ETDM1_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
  1166. {"ETDM1_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
  1167. {"ETDM2_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
  1168. {"ETDM2_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
  1169. {"ETDM1_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
  1170. {"ETDM1_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
  1171. {"ETDM2_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
  1172. {"ETDM2_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
  1173. {"DPTX_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
  1174. {"DPTX_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
  1175. /* cg */
  1176. {"ETDM1_IN", NULL, "ETDM1_IN_CG"},
  1177. {"ETDM1_IN", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
  1178. {"ETDM1_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
  1179. {"ETDM1_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
  1180. {"ETDM2_IN", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
  1181. {"ETDM2_IN", NULL, "ETDM2_IN_CG"},
  1182. {"ETDM2_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
  1183. {"ETDM2_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
  1184. {"ETDM1_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
  1185. {"ETDM1_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
  1186. {"ETDM1_OUT", NULL, "ETDM1_OUT_CG"},
  1187. {"ETDM1_OUT", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
  1188. {"ETDM2_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
  1189. {"ETDM2_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
  1190. {"ETDM2_OUT", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
  1191. {"ETDM2_OUT", NULL, "ETDM2_OUT_CG"},
  1192. {"ETDM3_OUT", NULL, "ETDM3_OUT_CG"},
  1193. {"DPTX", NULL, "ETDM3_OUT_CG"},
  1194. /* en */
  1195. {"ETDM1_IN", NULL, "ETDM1_IN_EN"},
  1196. {"ETDM1_IN", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
  1197. {"ETDM1_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
  1198. {"ETDM1_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
  1199. {"ETDM2_IN", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
  1200. {"ETDM2_IN", NULL, "ETDM2_IN_EN"},
  1201. {"ETDM2_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
  1202. {"ETDM2_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
  1203. {"ETDM1_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
  1204. {"ETDM1_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
  1205. {"ETDM1_OUT", NULL, "ETDM1_OUT_EN"},
  1206. {"ETDM1_OUT", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
  1207. {"ETDM2_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
  1208. {"ETDM2_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
  1209. {"ETDM2_OUT", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
  1210. {"ETDM2_OUT", NULL, "ETDM2_OUT_EN"},
  1211. {"ETDM3_OUT", NULL, "ETDM3_OUT_EN"},
  1212. {"DPTX", NULL, "ETDM3_OUT_EN"},
  1213. {"DPTX", NULL, "DPTX_EN"},
  1214. {"ETDM1_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
  1215. {"ETDM1_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
  1216. {"ETDM2_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
  1217. {"ETDM2_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
  1218. {"ETDM1_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
  1219. {"ETDM1_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
  1220. {"ETDM2_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
  1221. {"ETDM2_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
  1222. {"ETDM3_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
  1223. {"ETDM3_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
  1224. {"I012", NULL, "ETDM2_IN"},
  1225. {"I013", NULL, "ETDM2_IN"},
  1226. {"I014", NULL, "ETDM2_IN"},
  1227. {"I015", NULL, "ETDM2_IN"},
  1228. {"I016", NULL, "ETDM2_IN"},
  1229. {"I017", NULL, "ETDM2_IN"},
  1230. {"I018", NULL, "ETDM2_IN"},
  1231. {"I019", NULL, "ETDM2_IN"},
  1232. {"I188", NULL, "ETDM2_IN"},
  1233. {"I189", NULL, "ETDM2_IN"},
  1234. {"I190", NULL, "ETDM2_IN"},
  1235. {"I191", NULL, "ETDM2_IN"},
  1236. {"I192", NULL, "ETDM2_IN"},
  1237. {"I193", NULL, "ETDM2_IN"},
  1238. {"I194", NULL, "ETDM2_IN"},
  1239. {"I195", NULL, "ETDM2_IN"},
  1240. {"I072", NULL, "ETDM1_IN"},
  1241. {"I073", NULL, "ETDM1_IN"},
  1242. {"I074", NULL, "ETDM1_IN"},
  1243. {"I075", NULL, "ETDM1_IN"},
  1244. {"I076", NULL, "ETDM1_IN"},
  1245. {"I077", NULL, "ETDM1_IN"},
  1246. {"I078", NULL, "ETDM1_IN"},
  1247. {"I079", NULL, "ETDM1_IN"},
  1248. {"I080", NULL, "ETDM1_IN"},
  1249. {"I081", NULL, "ETDM1_IN"},
  1250. {"I082", NULL, "ETDM1_IN"},
  1251. {"I083", NULL, "ETDM1_IN"},
  1252. {"I084", NULL, "ETDM1_IN"},
  1253. {"I085", NULL, "ETDM1_IN"},
  1254. {"I086", NULL, "ETDM1_IN"},
  1255. {"I087", NULL, "ETDM1_IN"},
  1256. {"UL8", NULL, "ETDM1_IN"},
  1257. {"UL3", NULL, "ETDM2_IN"},
  1258. {"ETDM2_OUT", NULL, "O048"},
  1259. {"ETDM2_OUT", NULL, "O049"},
  1260. {"ETDM2_OUT", NULL, "O050"},
  1261. {"ETDM2_OUT", NULL, "O051"},
  1262. {"ETDM2_OUT", NULL, "O052"},
  1263. {"ETDM2_OUT", NULL, "O053"},
  1264. {"ETDM2_OUT", NULL, "O054"},
  1265. {"ETDM2_OUT", NULL, "O055"},
  1266. {"ETDM2_OUT", NULL, "O056"},
  1267. {"ETDM2_OUT", NULL, "O057"},
  1268. {"ETDM2_OUT", NULL, "O058"},
  1269. {"ETDM2_OUT", NULL, "O059"},
  1270. {"ETDM2_OUT", NULL, "O060"},
  1271. {"ETDM2_OUT", NULL, "O061"},
  1272. {"ETDM2_OUT", NULL, "O062"},
  1273. {"ETDM2_OUT", NULL, "O063"},
  1274. {"ETDM1_OUT", NULL, "O072"},
  1275. {"ETDM1_OUT", NULL, "O073"},
  1276. {"ETDM1_OUT", NULL, "O074"},
  1277. {"ETDM1_OUT", NULL, "O075"},
  1278. {"ETDM1_OUT", NULL, "O076"},
  1279. {"ETDM1_OUT", NULL, "O077"},
  1280. {"ETDM1_OUT", NULL, "O078"},
  1281. {"ETDM1_OUT", NULL, "O079"},
  1282. {"ETDM1_OUT", NULL, "O080"},
  1283. {"ETDM1_OUT", NULL, "O081"},
  1284. {"ETDM1_OUT", NULL, "O082"},
  1285. {"ETDM1_OUT", NULL, "O083"},
  1286. {"ETDM1_OUT", NULL, "O084"},
  1287. {"ETDM1_OUT", NULL, "O085"},
  1288. {"ETDM1_OUT", NULL, "O086"},
  1289. {"ETDM1_OUT", NULL, "O087"},
  1290. {"O048", "I020 Switch", "I020"},
  1291. {"O049", "I021 Switch", "I021"},
  1292. {"O048", "I022 Switch", "I022"},
  1293. {"O049", "I023 Switch", "I023"},
  1294. {"O050", "I024 Switch", "I024"},
  1295. {"O051", "I025 Switch", "I025"},
  1296. {"O052", "I026 Switch", "I026"},
  1297. {"O053", "I027 Switch", "I027"},
  1298. {"O054", "I028 Switch", "I028"},
  1299. {"O055", "I029 Switch", "I029"},
  1300. {"O056", "I030 Switch", "I030"},
  1301. {"O057", "I031 Switch", "I031"},
  1302. {"O058", "I032 Switch", "I032"},
  1303. {"O059", "I033 Switch", "I033"},
  1304. {"O060", "I034 Switch", "I034"},
  1305. {"O061", "I035 Switch", "I035"},
  1306. {"O062", "I036 Switch", "I036"},
  1307. {"O063", "I037 Switch", "I037"},
  1308. {"O048", "I046 Switch", "I046"},
  1309. {"O049", "I047 Switch", "I047"},
  1310. {"O050", "I048 Switch", "I048"},
  1311. {"O051", "I049 Switch", "I049"},
  1312. {"O052", "I050 Switch", "I050"},
  1313. {"O053", "I051 Switch", "I051"},
  1314. {"O054", "I052 Switch", "I052"},
  1315. {"O055", "I053 Switch", "I053"},
  1316. {"O056", "I054 Switch", "I054"},
  1317. {"O057", "I055 Switch", "I055"},
  1318. {"O058", "I056 Switch", "I056"},
  1319. {"O059", "I057 Switch", "I057"},
  1320. {"O060", "I058 Switch", "I058"},
  1321. {"O061", "I059 Switch", "I059"},
  1322. {"O062", "I060 Switch", "I060"},
  1323. {"O063", "I061 Switch", "I061"},
  1324. {"O048", "I070 Switch", "I070"},
  1325. {"O049", "I071 Switch", "I071"},
  1326. {"O072", "I020 Switch", "I020"},
  1327. {"O073", "I021 Switch", "I021"},
  1328. {"O072", "I022 Switch", "I022"},
  1329. {"O073", "I023 Switch", "I023"},
  1330. {"O074", "I024 Switch", "I024"},
  1331. {"O075", "I025 Switch", "I025"},
  1332. {"O076", "I026 Switch", "I026"},
  1333. {"O077", "I027 Switch", "I027"},
  1334. {"O078", "I028 Switch", "I028"},
  1335. {"O079", "I029 Switch", "I029"},
  1336. {"O080", "I030 Switch", "I030"},
  1337. {"O081", "I031 Switch", "I031"},
  1338. {"O082", "I032 Switch", "I032"},
  1339. {"O083", "I033 Switch", "I033"},
  1340. {"O084", "I034 Switch", "I034"},
  1341. {"O085", "I035 Switch", "I035"},
  1342. {"O086", "I036 Switch", "I036"},
  1343. {"O087", "I037 Switch", "I037"},
  1344. {"O072", "I046 Switch", "I046"},
  1345. {"O073", "I047 Switch", "I047"},
  1346. {"O074", "I048 Switch", "I048"},
  1347. {"O075", "I049 Switch", "I049"},
  1348. {"O076", "I050 Switch", "I050"},
  1349. {"O077", "I051 Switch", "I051"},
  1350. {"O078", "I052 Switch", "I052"},
  1351. {"O079", "I053 Switch", "I053"},
  1352. {"O080", "I054 Switch", "I054"},
  1353. {"O081", "I055 Switch", "I055"},
  1354. {"O082", "I056 Switch", "I056"},
  1355. {"O083", "I057 Switch", "I057"},
  1356. {"O084", "I058 Switch", "I058"},
  1357. {"O085", "I059 Switch", "I059"},
  1358. {"O086", "I060 Switch", "I060"},
  1359. {"O087", "I061 Switch", "I061"},
  1360. {"O072", "I070 Switch", "I070"},
  1361. {"O073", "I071 Switch", "I071"},
  1362. {"HDMI_CH0_MUX", "CH0", "DL10"},
  1363. {"HDMI_CH0_MUX", "CH1", "DL10"},
  1364. {"HDMI_CH0_MUX", "CH2", "DL10"},
  1365. {"HDMI_CH0_MUX", "CH3", "DL10"},
  1366. {"HDMI_CH0_MUX", "CH4", "DL10"},
  1367. {"HDMI_CH0_MUX", "CH5", "DL10"},
  1368. {"HDMI_CH0_MUX", "CH6", "DL10"},
  1369. {"HDMI_CH0_MUX", "CH7", "DL10"},
  1370. {"HDMI_CH1_MUX", "CH0", "DL10"},
  1371. {"HDMI_CH1_MUX", "CH1", "DL10"},
  1372. {"HDMI_CH1_MUX", "CH2", "DL10"},
  1373. {"HDMI_CH1_MUX", "CH3", "DL10"},
  1374. {"HDMI_CH1_MUX", "CH4", "DL10"},
  1375. {"HDMI_CH1_MUX", "CH5", "DL10"},
  1376. {"HDMI_CH1_MUX", "CH6", "DL10"},
  1377. {"HDMI_CH1_MUX", "CH7", "DL10"},
  1378. {"HDMI_CH2_MUX", "CH0", "DL10"},
  1379. {"HDMI_CH2_MUX", "CH1", "DL10"},
  1380. {"HDMI_CH2_MUX", "CH2", "DL10"},
  1381. {"HDMI_CH2_MUX", "CH3", "DL10"},
  1382. {"HDMI_CH2_MUX", "CH4", "DL10"},
  1383. {"HDMI_CH2_MUX", "CH5", "DL10"},
  1384. {"HDMI_CH2_MUX", "CH6", "DL10"},
  1385. {"HDMI_CH2_MUX", "CH7", "DL10"},
  1386. {"HDMI_CH3_MUX", "CH0", "DL10"},
  1387. {"HDMI_CH3_MUX", "CH1", "DL10"},
  1388. {"HDMI_CH3_MUX", "CH2", "DL10"},
  1389. {"HDMI_CH3_MUX", "CH3", "DL10"},
  1390. {"HDMI_CH3_MUX", "CH4", "DL10"},
  1391. {"HDMI_CH3_MUX", "CH5", "DL10"},
  1392. {"HDMI_CH3_MUX", "CH6", "DL10"},
  1393. {"HDMI_CH3_MUX", "CH7", "DL10"},
  1394. {"HDMI_CH4_MUX", "CH0", "DL10"},
  1395. {"HDMI_CH4_MUX", "CH1", "DL10"},
  1396. {"HDMI_CH4_MUX", "CH2", "DL10"},
  1397. {"HDMI_CH4_MUX", "CH3", "DL10"},
  1398. {"HDMI_CH4_MUX", "CH4", "DL10"},
  1399. {"HDMI_CH4_MUX", "CH5", "DL10"},
  1400. {"HDMI_CH4_MUX", "CH6", "DL10"},
  1401. {"HDMI_CH4_MUX", "CH7", "DL10"},
  1402. {"HDMI_CH5_MUX", "CH0", "DL10"},
  1403. {"HDMI_CH5_MUX", "CH1", "DL10"},
  1404. {"HDMI_CH5_MUX", "CH2", "DL10"},
  1405. {"HDMI_CH5_MUX", "CH3", "DL10"},
  1406. {"HDMI_CH5_MUX", "CH4", "DL10"},
  1407. {"HDMI_CH5_MUX", "CH5", "DL10"},
  1408. {"HDMI_CH5_MUX", "CH6", "DL10"},
  1409. {"HDMI_CH5_MUX", "CH7", "DL10"},
  1410. {"HDMI_CH6_MUX", "CH0", "DL10"},
  1411. {"HDMI_CH6_MUX", "CH1", "DL10"},
  1412. {"HDMI_CH6_MUX", "CH2", "DL10"},
  1413. {"HDMI_CH6_MUX", "CH3", "DL10"},
  1414. {"HDMI_CH6_MUX", "CH4", "DL10"},
  1415. {"HDMI_CH6_MUX", "CH5", "DL10"},
  1416. {"HDMI_CH6_MUX", "CH6", "DL10"},
  1417. {"HDMI_CH6_MUX", "CH7", "DL10"},
  1418. {"HDMI_CH7_MUX", "CH0", "DL10"},
  1419. {"HDMI_CH7_MUX", "CH1", "DL10"},
  1420. {"HDMI_CH7_MUX", "CH2", "DL10"},
  1421. {"HDMI_CH7_MUX", "CH3", "DL10"},
  1422. {"HDMI_CH7_MUX", "CH4", "DL10"},
  1423. {"HDMI_CH7_MUX", "CH5", "DL10"},
  1424. {"HDMI_CH7_MUX", "CH6", "DL10"},
  1425. {"HDMI_CH7_MUX", "CH7", "DL10"},
  1426. {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
  1427. {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
  1428. {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
  1429. {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
  1430. {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
  1431. {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
  1432. {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
  1433. {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
  1434. {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
  1435. {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
  1436. {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
  1437. {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
  1438. {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
  1439. {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
  1440. {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
  1441. {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
  1442. {"ETDM3_OUT", NULL, "HDMI_OUT_MUX"},
  1443. {"DPTX", NULL, "DPTX_OUT_MUX"},
  1444. {"ETDM_OUTPUT", NULL, "DPTX"},
  1445. {"ETDM_OUTPUT", NULL, "ETDM1_OUT"},
  1446. {"ETDM_OUTPUT", NULL, "ETDM2_OUT"},
  1447. {"ETDM_OUTPUT", NULL, "ETDM3_OUT"},
  1448. {"ETDM1_IN", NULL, "ETDM_INPUT"},
  1449. {"ETDM2_IN", NULL, "ETDM_INPUT"},
  1450. };
  1451. static int etdm_cowork_slv_sel(int id, int slave_mode)
  1452. {
  1453. if (slave_mode) {
  1454. switch (id) {
  1455. case MT8188_AFE_IO_ETDM1_IN:
  1456. return COWORK_ETDM_IN1_S;
  1457. case MT8188_AFE_IO_ETDM2_IN:
  1458. return COWORK_ETDM_IN2_S;
  1459. case MT8188_AFE_IO_ETDM1_OUT:
  1460. return COWORK_ETDM_OUT1_S;
  1461. case MT8188_AFE_IO_ETDM2_OUT:
  1462. return COWORK_ETDM_OUT2_S;
  1463. case MT8188_AFE_IO_ETDM3_OUT:
  1464. return COWORK_ETDM_OUT3_S;
  1465. default:
  1466. return -EINVAL;
  1467. }
  1468. } else {
  1469. switch (id) {
  1470. case MT8188_AFE_IO_ETDM1_IN:
  1471. return COWORK_ETDM_IN1_M;
  1472. case MT8188_AFE_IO_ETDM2_IN:
  1473. return COWORK_ETDM_IN2_M;
  1474. case MT8188_AFE_IO_ETDM1_OUT:
  1475. return COWORK_ETDM_OUT1_M;
  1476. case MT8188_AFE_IO_ETDM2_OUT:
  1477. return COWORK_ETDM_OUT2_M;
  1478. case MT8188_AFE_IO_ETDM3_OUT:
  1479. return COWORK_ETDM_OUT3_M;
  1480. default:
  1481. return -EINVAL;
  1482. }
  1483. }
  1484. }
  1485. static int etdm_cowork_sync_sel(int id)
  1486. {
  1487. switch (id) {
  1488. case MT8188_AFE_IO_ETDM1_IN:
  1489. return ETDM_SYNC_FROM_IN1;
  1490. case MT8188_AFE_IO_ETDM2_IN:
  1491. return ETDM_SYNC_FROM_IN2;
  1492. case MT8188_AFE_IO_ETDM1_OUT:
  1493. return ETDM_SYNC_FROM_OUT1;
  1494. case MT8188_AFE_IO_ETDM2_OUT:
  1495. return ETDM_SYNC_FROM_OUT2;
  1496. case MT8188_AFE_IO_ETDM3_OUT:
  1497. return ETDM_SYNC_FROM_OUT3;
  1498. default:
  1499. return -EINVAL;
  1500. }
  1501. }
  1502. static int mt8188_etdm_sync_mode_slv(struct mtk_base_afe *afe, int dai_id)
  1503. {
  1504. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1505. struct mtk_dai_etdm_priv *etdm_data;
  1506. unsigned int reg = 0;
  1507. unsigned int mask;
  1508. unsigned int val;
  1509. int cowork_source_sel;
  1510. if (!is_valid_etdm_dai(dai_id))
  1511. return -EINVAL;
  1512. etdm_data = afe_priv->dai_priv[dai_id];
  1513. cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,
  1514. true);
  1515. if (cowork_source_sel < 0)
  1516. return cowork_source_sel;
  1517. switch (dai_id) {
  1518. case MT8188_AFE_IO_ETDM1_IN:
  1519. reg = ETDM_COWORK_CON1;
  1520. mask = ETDM_IN1_SLAVE_SEL_MASK;
  1521. val = FIELD_PREP(ETDM_IN1_SLAVE_SEL_MASK, cowork_source_sel);
  1522. break;
  1523. case MT8188_AFE_IO_ETDM2_IN:
  1524. reg = ETDM_COWORK_CON2;
  1525. mask = ETDM_IN2_SLAVE_SEL_MASK;
  1526. val = FIELD_PREP(ETDM_IN2_SLAVE_SEL_MASK, cowork_source_sel);
  1527. break;
  1528. case MT8188_AFE_IO_ETDM1_OUT:
  1529. reg = ETDM_COWORK_CON0;
  1530. mask = ETDM_OUT1_SLAVE_SEL_MASK;
  1531. val = FIELD_PREP(ETDM_OUT1_SLAVE_SEL_MASK, cowork_source_sel);
  1532. break;
  1533. case MT8188_AFE_IO_ETDM2_OUT:
  1534. reg = ETDM_COWORK_CON2;
  1535. mask = ETDM_OUT2_SLAVE_SEL_MASK;
  1536. val = FIELD_PREP(ETDM_OUT2_SLAVE_SEL_MASK, cowork_source_sel);
  1537. break;
  1538. case MT8188_AFE_IO_ETDM3_OUT:
  1539. reg = ETDM_COWORK_CON2;
  1540. mask = ETDM_OUT3_SLAVE_SEL_MASK;
  1541. val = FIELD_PREP(ETDM_OUT3_SLAVE_SEL_MASK, cowork_source_sel);
  1542. break;
  1543. default:
  1544. return 0;
  1545. }
  1546. regmap_update_bits(afe->regmap, reg, mask, val);
  1547. return 0;
  1548. }
  1549. static int mt8188_etdm_sync_mode_mst(struct mtk_base_afe *afe, int dai_id)
  1550. {
  1551. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1552. struct mtk_dai_etdm_priv *etdm_data;
  1553. struct etdm_con_reg etdm_reg;
  1554. unsigned int reg = 0;
  1555. unsigned int mask;
  1556. unsigned int val;
  1557. int cowork_source_sel;
  1558. int ret;
  1559. if (!is_valid_etdm_dai(dai_id))
  1560. return -EINVAL;
  1561. etdm_data = afe_priv->dai_priv[dai_id];
  1562. cowork_source_sel = etdm_cowork_sync_sel(etdm_data->cowork_source_id);
  1563. if (cowork_source_sel < 0)
  1564. return cowork_source_sel;
  1565. switch (dai_id) {
  1566. case MT8188_AFE_IO_ETDM1_IN:
  1567. reg = ETDM_COWORK_CON1;
  1568. mask = ETDM_IN1_SYNC_SEL_MASK;
  1569. val = FIELD_PREP(ETDM_IN1_SYNC_SEL_MASK, cowork_source_sel);
  1570. break;
  1571. case MT8188_AFE_IO_ETDM2_IN:
  1572. reg = ETDM_COWORK_CON2;
  1573. mask = ETDM_IN2_SYNC_SEL_MASK;
  1574. val = FIELD_PREP(ETDM_IN2_SYNC_SEL_MASK, cowork_source_sel);
  1575. break;
  1576. case MT8188_AFE_IO_ETDM1_OUT:
  1577. reg = ETDM_COWORK_CON0;
  1578. mask = ETDM_OUT1_SYNC_SEL_MASK;
  1579. val = FIELD_PREP(ETDM_OUT1_SYNC_SEL_MASK, cowork_source_sel);
  1580. break;
  1581. case MT8188_AFE_IO_ETDM2_OUT:
  1582. reg = ETDM_COWORK_CON2;
  1583. mask = ETDM_OUT2_SYNC_SEL_MASK;
  1584. val = FIELD_PREP(ETDM_OUT2_SYNC_SEL_MASK, cowork_source_sel);
  1585. break;
  1586. case MT8188_AFE_IO_ETDM3_OUT:
  1587. reg = ETDM_COWORK_CON2;
  1588. mask = ETDM_OUT3_SYNC_SEL_MASK;
  1589. val = FIELD_PREP(ETDM_OUT3_SYNC_SEL_MASK, cowork_source_sel);
  1590. break;
  1591. default:
  1592. return 0;
  1593. }
  1594. ret = get_etdm_reg(dai_id, &etdm_reg);
  1595. if (ret < 0)
  1596. return ret;
  1597. regmap_update_bits(afe->regmap, reg, mask, val);
  1598. regmap_set_bits(afe->regmap, etdm_reg.con0, ETDM_CON0_SYNC_MODE);
  1599. return 0;
  1600. }
  1601. static int mt8188_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)
  1602. {
  1603. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1604. struct mtk_dai_etdm_priv *etdm_data;
  1605. if (!is_valid_etdm_dai(dai_id))
  1606. return -EINVAL;
  1607. etdm_data = afe_priv->dai_priv[dai_id];
  1608. if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)
  1609. return 0;
  1610. if (etdm_data->slave_mode)
  1611. mt8188_etdm_sync_mode_slv(afe, dai_id);
  1612. else
  1613. mt8188_etdm_sync_mode_mst(afe, dai_id);
  1614. return 0;
  1615. }
  1616. /* dai ops */
  1617. static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,
  1618. int dai_id, unsigned int rate)
  1619. {
  1620. unsigned int mode = 0;
  1621. unsigned int reg = 0;
  1622. unsigned int val = 0;
  1623. unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);
  1624. if (rate != 0)
  1625. mode = mt8188_afe_fs_timing(rate);
  1626. switch (dai_id) {
  1627. case MT8188_AFE_IO_ETDM1_IN:
  1628. reg = ETDM_IN1_AFIFO_CON;
  1629. if (rate == 0)
  1630. mode = MT8188_ETDM_IN1_1X_EN;
  1631. break;
  1632. case MT8188_AFE_IO_ETDM2_IN:
  1633. reg = ETDM_IN2_AFIFO_CON;
  1634. if (rate == 0)
  1635. mode = MT8188_ETDM_IN2_1X_EN;
  1636. break;
  1637. default:
  1638. return -EINVAL;
  1639. }
  1640. val = (mode | ETDM_IN_USE_AFIFO);
  1641. regmap_update_bits(afe->regmap, reg, mask, val);
  1642. return 0;
  1643. }
  1644. static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,
  1645. unsigned int rate,
  1646. unsigned int channels,
  1647. int dai_id)
  1648. {
  1649. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1650. struct mtk_dai_etdm_priv *etdm_data;
  1651. struct etdm_con_reg etdm_reg;
  1652. bool slave_mode;
  1653. unsigned int data_mode;
  1654. unsigned int lrck_width;
  1655. unsigned int val = 0;
  1656. unsigned int mask = 0;
  1657. int ret;
  1658. int i;
  1659. if (!is_valid_etdm_dai(dai_id))
  1660. return -EINVAL;
  1661. etdm_data = afe_priv->dai_priv[dai_id];
  1662. slave_mode = etdm_data->slave_mode;
  1663. data_mode = etdm_data->data_mode;
  1664. lrck_width = etdm_data->lrck_width;
  1665. dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
  1666. __func__, rate, channels, dai_id);
  1667. ret = get_etdm_reg(dai_id, &etdm_reg);
  1668. if (ret < 0)
  1669. return ret;
  1670. /* afifo */
  1671. if (slave_mode)
  1672. mtk_dai_etdm_fifo_mode(afe, dai_id, 0);
  1673. else
  1674. mtk_dai_etdm_fifo_mode(afe, dai_id, rate);
  1675. /* con1 */
  1676. if (lrck_width > 0) {
  1677. mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |
  1678. ETDM_IN_CON1_LRCK_WIDTH_MASK);
  1679. val |= FIELD_PREP(ETDM_IN_CON1_LRCK_WIDTH_MASK, lrck_width - 1);
  1680. }
  1681. regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
  1682. mask = 0;
  1683. val = 0;
  1684. /* con2 */
  1685. if (!slave_mode) {
  1686. mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;
  1687. if (rate == 352800 || rate == 384000)
  1688. val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 4);
  1689. else
  1690. val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 3);
  1691. }
  1692. mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |
  1693. ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);
  1694. if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {
  1695. val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |
  1696. FIELD_PREP(ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK, channels - 1);
  1697. }
  1698. regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);
  1699. mask = 0;
  1700. val = 0;
  1701. /* con3 */
  1702. mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;
  1703. for (i = 0; i < channels; i += 2) {
  1704. if (etdm_data->in_disable_ch[i] &&
  1705. etdm_data->in_disable_ch[i + 1])
  1706. val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);
  1707. }
  1708. if (!slave_mode) {
  1709. mask |= ETDM_IN_CON3_FS_MASK;
  1710. val |= FIELD_PREP(ETDM_IN_CON3_FS_MASK, get_etdm_fs_timing(rate));
  1711. }
  1712. regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);
  1713. mask = 0;
  1714. val = 0;
  1715. /* con4 */
  1716. mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |
  1717. ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);
  1718. if (slave_mode) {
  1719. if (etdm_data->lrck_inv)
  1720. val |= ETDM_IN_CON4_SLAVE_LRCK_INV;
  1721. if (etdm_data->bck_inv)
  1722. val |= ETDM_IN_CON4_SLAVE_BCK_INV;
  1723. } else {
  1724. if (etdm_data->lrck_inv)
  1725. val |= ETDM_IN_CON4_MASTER_LRCK_INV;
  1726. if (etdm_data->bck_inv)
  1727. val |= ETDM_IN_CON4_MASTER_BCK_INV;
  1728. }
  1729. regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
  1730. mask = 0;
  1731. val = 0;
  1732. /* con5 */
  1733. mask |= ETDM_IN_CON5_LR_SWAP_MASK;
  1734. mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;
  1735. for (i = 0; i < channels; i += 2) {
  1736. if (etdm_data->in_disable_ch[i] &&
  1737. !etdm_data->in_disable_ch[i + 1]) {
  1738. val |= ETDM_IN_CON5_LR_SWAP(i >> 1);
  1739. val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
  1740. } else if (!etdm_data->in_disable_ch[i] &&
  1741. etdm_data->in_disable_ch[i + 1]) {
  1742. val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
  1743. }
  1744. }
  1745. regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
  1746. return 0;
  1747. }
  1748. static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,
  1749. unsigned int rate,
  1750. unsigned int channels,
  1751. int dai_id)
  1752. {
  1753. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1754. struct mtk_dai_etdm_priv *etdm_data;
  1755. struct etdm_con_reg etdm_reg;
  1756. bool slave_mode;
  1757. unsigned int lrck_width;
  1758. unsigned int val = 0;
  1759. unsigned int mask = 0;
  1760. int fs = 0;
  1761. int ret;
  1762. if (!is_valid_etdm_dai(dai_id))
  1763. return -EINVAL;
  1764. etdm_data = afe_priv->dai_priv[dai_id];
  1765. slave_mode = etdm_data->slave_mode;
  1766. lrck_width = etdm_data->lrck_width;
  1767. dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
  1768. __func__, rate, channels, dai_id);
  1769. ret = get_etdm_reg(dai_id, &etdm_reg);
  1770. if (ret < 0)
  1771. return ret;
  1772. /* con0 */
  1773. mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;
  1774. val = FIELD_PREP(ETDM_OUT_CON0_RELATCH_DOMAIN_MASK,
  1775. ETDM_RELATCH_TIMING_A1A2SYS);
  1776. regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
  1777. mask = 0;
  1778. val = 0;
  1779. /* con1 */
  1780. if (lrck_width > 0) {
  1781. mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |
  1782. ETDM_OUT_CON1_LRCK_WIDTH_MASK);
  1783. val |= FIELD_PREP(ETDM_OUT_CON1_LRCK_WIDTH_MASK, lrck_width - 1);
  1784. }
  1785. regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
  1786. mask = 0;
  1787. val = 0;
  1788. if (!slave_mode) {
  1789. /* con4 */
  1790. mask |= ETDM_OUT_CON4_FS_MASK;
  1791. val |= FIELD_PREP(ETDM_OUT_CON4_FS_MASK, get_etdm_fs_timing(rate));
  1792. }
  1793. mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;
  1794. if (dai_id == MT8188_AFE_IO_ETDM1_OUT)
  1795. fs = MT8188_ETDM_OUT1_1X_EN;
  1796. else if (dai_id == MT8188_AFE_IO_ETDM2_OUT)
  1797. fs = MT8188_ETDM_OUT2_1X_EN;
  1798. val |= FIELD_PREP(ETDM_OUT_CON4_RELATCH_EN_MASK, fs);
  1799. regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
  1800. mask = 0;
  1801. val = 0;
  1802. /* con5 */
  1803. mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |
  1804. ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);
  1805. if (slave_mode) {
  1806. if (etdm_data->lrck_inv)
  1807. val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;
  1808. if (etdm_data->bck_inv)
  1809. val |= ETDM_OUT_CON5_SLAVE_BCK_INV;
  1810. } else {
  1811. if (etdm_data->lrck_inv)
  1812. val |= ETDM_OUT_CON5_MASTER_LRCK_INV;
  1813. if (etdm_data->bck_inv)
  1814. val |= ETDM_OUT_CON5_MASTER_BCK_INV;
  1815. }
  1816. regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
  1817. return 0;
  1818. }
  1819. static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,
  1820. unsigned int rate,
  1821. unsigned int channels,
  1822. unsigned int bit_width,
  1823. int dai_id)
  1824. {
  1825. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1826. struct mtk_dai_etdm_priv *etdm_data;
  1827. struct etdm_con_reg etdm_reg;
  1828. bool slave_mode;
  1829. unsigned int etdm_channels;
  1830. unsigned int val = 0;
  1831. unsigned int mask = 0;
  1832. unsigned int bck;
  1833. unsigned int wlen = get_etdm_wlen(bit_width);
  1834. int ret;
  1835. if (!is_valid_etdm_dai(dai_id))
  1836. return -EINVAL;
  1837. etdm_data = afe_priv->dai_priv[dai_id];
  1838. slave_mode = etdm_data->slave_mode;
  1839. etdm_data->rate = rate;
  1840. ret = get_etdm_reg(dai_id, &etdm_reg);
  1841. if (ret < 0)
  1842. return ret;
  1843. dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, slv %u\n",
  1844. __func__, etdm_data->format, etdm_data->data_mode,
  1845. etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,
  1846. etdm_data->slave_mode);
  1847. dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",
  1848. __func__, rate, channels, bit_width, dai_id);
  1849. etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?
  1850. get_etdm_ch_fixup(channels) : 2;
  1851. bck = rate * etdm_channels * wlen;
  1852. if (bck > MT8188_ETDM_NORMAL_MAX_BCK_RATE) {
  1853. dev_err(afe->dev, "%s bck rate %u not support\n",
  1854. __func__, bck);
  1855. return -EINVAL;
  1856. }
  1857. /* con0 */
  1858. mask |= ETDM_CON0_BIT_LEN_MASK;
  1859. val |= FIELD_PREP(ETDM_CON0_BIT_LEN_MASK, bit_width - 1);
  1860. mask |= ETDM_CON0_WORD_LEN_MASK;
  1861. val |= FIELD_PREP(ETDM_CON0_WORD_LEN_MASK, wlen - 1);
  1862. mask |= ETDM_CON0_FORMAT_MASK;
  1863. val |= FIELD_PREP(ETDM_CON0_FORMAT_MASK, etdm_data->format);
  1864. mask |= ETDM_CON0_CH_NUM_MASK;
  1865. val |= FIELD_PREP(ETDM_CON0_CH_NUM_MASK, etdm_channels - 1);
  1866. mask |= ETDM_CON0_SLAVE_MODE;
  1867. if (slave_mode) {
  1868. if (dai_id == MT8188_AFE_IO_ETDM1_OUT) {
  1869. dev_err(afe->dev, "%s id %d only support master mode\n",
  1870. __func__, dai_id);
  1871. return -EINVAL;
  1872. }
  1873. val |= ETDM_CON0_SLAVE_MODE;
  1874. }
  1875. regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
  1876. if (get_etdm_dir(dai_id) == ETDM_IN)
  1877. mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);
  1878. else
  1879. mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);
  1880. return 0;
  1881. }
  1882. static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,
  1883. struct snd_pcm_hw_params *params,
  1884. struct snd_soc_dai *dai)
  1885. {
  1886. unsigned int rate = params_rate(params);
  1887. unsigned int bit_width = params_width(params);
  1888. unsigned int channels = params_channels(params);
  1889. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  1890. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1891. struct mtk_dai_etdm_priv *mst_etdm_data;
  1892. int mst_dai_id;
  1893. int slv_dai_id;
  1894. int ret;
  1895. int i;
  1896. dev_dbg(afe->dev, "%s '%s' period %u-%u\n",
  1897. __func__, snd_pcm_stream_str(substream),
  1898. params_period_size(params), params_periods(params));
  1899. if (is_cowork_mode(dai)) {
  1900. mst_dai_id = get_etdm_cowork_master_id(dai);
  1901. if (!is_valid_etdm_dai(mst_dai_id))
  1902. return -EINVAL;
  1903. mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
  1904. if (mst_etdm_data->slots)
  1905. channels = mst_etdm_data->slots;
  1906. ret = mtk_dai_etdm_configure(afe, rate, channels,
  1907. bit_width, mst_dai_id);
  1908. if (ret)
  1909. return ret;
  1910. for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
  1911. slv_dai_id = mst_etdm_data->cowork_slv_id[i];
  1912. ret = mtk_dai_etdm_configure(afe, rate, channels,
  1913. bit_width, slv_dai_id);
  1914. if (ret)
  1915. return ret;
  1916. ret = mt8188_etdm_sync_mode_configure(afe, slv_dai_id);
  1917. if (ret)
  1918. return ret;
  1919. }
  1920. } else {
  1921. if (!is_valid_etdm_dai(dai->id))
  1922. return -EINVAL;
  1923. mst_etdm_data = afe_priv->dai_priv[dai->id];
  1924. if (mst_etdm_data->slots)
  1925. channels = mst_etdm_data->slots;
  1926. ret = mtk_dai_etdm_configure(afe, rate, channels,
  1927. bit_width, dai->id);
  1928. if (ret)
  1929. return ret;
  1930. }
  1931. return 0;
  1932. }
  1933. static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)
  1934. {
  1935. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1936. struct mtk_dai_etdm_priv *etdm_data;
  1937. int apll_rate;
  1938. int apll;
  1939. if (!is_valid_etdm_dai(dai_id))
  1940. return -EINVAL;
  1941. etdm_data = afe_priv->dai_priv[dai_id];
  1942. if (freq == 0) {
  1943. etdm_data->mclk_freq = freq;
  1944. return 0;
  1945. }
  1946. if (etdm_data->mclk_fixed_apll == 0)
  1947. apll = mt8188_afe_get_default_mclk_source_by_rate(freq);
  1948. else
  1949. apll = etdm_data->mclk_apll;
  1950. apll_rate = mt8188_afe_get_mclk_source_rate(afe, apll);
  1951. if (freq > apll_rate) {
  1952. dev_err(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);
  1953. return -EINVAL;
  1954. }
  1955. if (apll_rate % freq != 0) {
  1956. dev_err(afe->dev, "APLL%d cannot generate freq Hz\n", apll);
  1957. return -EINVAL;
  1958. }
  1959. if (etdm_data->mclk_fixed_apll == 0)
  1960. etdm_data->mclk_apll = apll;
  1961. etdm_data->mclk_freq = freq;
  1962. return 0;
  1963. }
  1964. static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,
  1965. int clk_id, unsigned int freq, int dir)
  1966. {
  1967. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  1968. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1969. struct mtk_dai_etdm_priv *etdm_data;
  1970. int dai_id;
  1971. dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
  1972. __func__, dai->id, freq, dir);
  1973. if (is_cowork_mode(dai))
  1974. dai_id = get_etdm_cowork_master_id(dai);
  1975. else
  1976. dai_id = dai->id;
  1977. if (!is_valid_etdm_dai(dai_id))
  1978. return -EINVAL;
  1979. etdm_data = afe_priv->dai_priv[dai_id];
  1980. etdm_data->mclk_dir = dir;
  1981. return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);
  1982. }
  1983. static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,
  1984. unsigned int tx_mask, unsigned int rx_mask,
  1985. int slots, int slot_width)
  1986. {
  1987. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  1988. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1989. struct mtk_dai_etdm_priv *etdm_data;
  1990. int dai_id;
  1991. if (is_cowork_mode(dai))
  1992. dai_id = get_etdm_cowork_master_id(dai);
  1993. else
  1994. dai_id = dai->id;
  1995. if (!is_valid_etdm_dai(dai_id))
  1996. return -EINVAL;
  1997. etdm_data = afe_priv->dai_priv[dai_id];
  1998. dev_dbg(dai->dev, "%s id %d slot_width %d\n",
  1999. __func__, dai->id, slot_width);
  2000. etdm_data->slots = slots;
  2001. etdm_data->lrck_width = slot_width;
  2002. return 0;
  2003. }
  2004. static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
  2005. {
  2006. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  2007. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2008. struct mtk_dai_etdm_priv *etdm_data;
  2009. if (!is_valid_etdm_dai(dai->id))
  2010. return -EINVAL;
  2011. etdm_data = afe_priv->dai_priv[dai->id];
  2012. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  2013. case SND_SOC_DAIFMT_I2S:
  2014. etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;
  2015. break;
  2016. case SND_SOC_DAIFMT_LEFT_J:
  2017. etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;
  2018. break;
  2019. case SND_SOC_DAIFMT_RIGHT_J:
  2020. etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;
  2021. break;
  2022. case SND_SOC_DAIFMT_DSP_A:
  2023. etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;
  2024. break;
  2025. case SND_SOC_DAIFMT_DSP_B:
  2026. etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;
  2027. break;
  2028. default:
  2029. return -EINVAL;
  2030. }
  2031. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  2032. case SND_SOC_DAIFMT_NB_NF:
  2033. etdm_data->bck_inv = false;
  2034. etdm_data->lrck_inv = false;
  2035. break;
  2036. case SND_SOC_DAIFMT_NB_IF:
  2037. etdm_data->bck_inv = false;
  2038. etdm_data->lrck_inv = true;
  2039. break;
  2040. case SND_SOC_DAIFMT_IB_NF:
  2041. etdm_data->bck_inv = true;
  2042. etdm_data->lrck_inv = false;
  2043. break;
  2044. case SND_SOC_DAIFMT_IB_IF:
  2045. etdm_data->bck_inv = true;
  2046. etdm_data->lrck_inv = true;
  2047. break;
  2048. default:
  2049. return -EINVAL;
  2050. }
  2051. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  2052. case SND_SOC_DAIFMT_BC_FC:
  2053. etdm_data->slave_mode = true;
  2054. break;
  2055. case SND_SOC_DAIFMT_BP_FP:
  2056. etdm_data->slave_mode = false;
  2057. break;
  2058. default:
  2059. return -EINVAL;
  2060. }
  2061. return 0;
  2062. }
  2063. static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)
  2064. {
  2065. switch (channel) {
  2066. case 1 ... 2:
  2067. return AFE_DPTX_CON_CH_EN_2CH;
  2068. case 3 ... 4:
  2069. return AFE_DPTX_CON_CH_EN_4CH;
  2070. case 5 ... 6:
  2071. return AFE_DPTX_CON_CH_EN_6CH;
  2072. case 7 ... 8:
  2073. return AFE_DPTX_CON_CH_EN_8CH;
  2074. default:
  2075. return AFE_DPTX_CON_CH_EN_2CH;
  2076. }
  2077. }
  2078. static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)
  2079. {
  2080. return (ch > 2) ?
  2081. AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;
  2082. }
  2083. static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)
  2084. {
  2085. return snd_pcm_format_physical_width(format) <= 16 ?
  2086. AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;
  2087. }
  2088. static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,
  2089. struct snd_pcm_hw_params *params,
  2090. struct snd_soc_dai *dai)
  2091. {
  2092. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  2093. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2094. struct mtk_dai_etdm_priv *etdm_data;
  2095. unsigned int rate = params_rate(params);
  2096. unsigned int channels = params_channels(params);
  2097. snd_pcm_format_t format = params_format(params);
  2098. int width = snd_pcm_format_physical_width(format);
  2099. int ret;
  2100. if (!is_valid_etdm_dai(dai->id))
  2101. return -EINVAL;
  2102. etdm_data = afe_priv->dai_priv[dai->id];
  2103. /* dptx configure */
  2104. if (dai->id == MT8188_AFE_IO_DPTX) {
  2105. regmap_update_bits(afe->regmap, AFE_DPTX_CON,
  2106. AFE_DPTX_CON_CH_EN_MASK,
  2107. mtk_dai_get_dptx_ch_en(channels));
  2108. regmap_update_bits(afe->regmap, AFE_DPTX_CON,
  2109. AFE_DPTX_CON_CH_NUM_MASK,
  2110. mtk_dai_get_dptx_ch(channels));
  2111. regmap_update_bits(afe->regmap, AFE_DPTX_CON,
  2112. AFE_DPTX_CON_16BIT_MASK,
  2113. mtk_dai_get_dptx_wlen(format));
  2114. if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {
  2115. etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;
  2116. channels = 8;
  2117. } else {
  2118. channels = 2;
  2119. }
  2120. } else {
  2121. etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;
  2122. }
  2123. ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);
  2124. return ret;
  2125. }
  2126. static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,
  2127. int clk_id,
  2128. unsigned int freq,
  2129. int dir)
  2130. {
  2131. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  2132. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2133. struct mtk_dai_etdm_priv *etdm_data;
  2134. if (!is_valid_etdm_dai(dai->id))
  2135. return -EINVAL;
  2136. etdm_data = afe_priv->dai_priv[dai->id];
  2137. dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
  2138. __func__, dai->id, freq, dir);
  2139. etdm_data->mclk_dir = dir;
  2140. return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);
  2141. }
  2142. static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {
  2143. .hw_params = mtk_dai_etdm_hw_params,
  2144. .set_sysclk = mtk_dai_etdm_set_sysclk,
  2145. .set_fmt = mtk_dai_etdm_set_fmt,
  2146. .set_tdm_slot = mtk_dai_etdm_set_tdm_slot,
  2147. };
  2148. static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {
  2149. .hw_params = mtk_dai_hdmitx_dptx_hw_params,
  2150. .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,
  2151. .set_fmt = mtk_dai_etdm_set_fmt,
  2152. };
  2153. /* dai driver */
  2154. #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_192000)
  2155. #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  2156. SNDRV_PCM_FMTBIT_S24_LE |\
  2157. SNDRV_PCM_FMTBIT_S32_LE)
  2158. static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {
  2159. {
  2160. .name = "DPTX",
  2161. .id = MT8188_AFE_IO_DPTX,
  2162. .playback = {
  2163. .stream_name = "DPTX",
  2164. .channels_min = 1,
  2165. .channels_max = 8,
  2166. .rates = MTK_ETDM_RATES,
  2167. .formats = MTK_ETDM_FORMATS,
  2168. },
  2169. .ops = &mtk_dai_hdmitx_dptx_ops,
  2170. },
  2171. {
  2172. .name = "ETDM1_IN",
  2173. .id = MT8188_AFE_IO_ETDM1_IN,
  2174. .capture = {
  2175. .stream_name = "ETDM1_IN",
  2176. .channels_min = 1,
  2177. .channels_max = 16,
  2178. .rates = MTK_ETDM_RATES,
  2179. .formats = MTK_ETDM_FORMATS,
  2180. },
  2181. .ops = &mtk_dai_etdm_ops,
  2182. },
  2183. {
  2184. .name = "ETDM2_IN",
  2185. .id = MT8188_AFE_IO_ETDM2_IN,
  2186. .capture = {
  2187. .stream_name = "ETDM2_IN",
  2188. .channels_min = 1,
  2189. .channels_max = 16,
  2190. .rates = MTK_ETDM_RATES,
  2191. .formats = MTK_ETDM_FORMATS,
  2192. },
  2193. .ops = &mtk_dai_etdm_ops,
  2194. },
  2195. {
  2196. .name = "ETDM1_OUT",
  2197. .id = MT8188_AFE_IO_ETDM1_OUT,
  2198. .playback = {
  2199. .stream_name = "ETDM1_OUT",
  2200. .channels_min = 1,
  2201. .channels_max = 16,
  2202. .rates = MTK_ETDM_RATES,
  2203. .formats = MTK_ETDM_FORMATS,
  2204. },
  2205. .ops = &mtk_dai_etdm_ops,
  2206. },
  2207. {
  2208. .name = "ETDM2_OUT",
  2209. .id = MT8188_AFE_IO_ETDM2_OUT,
  2210. .playback = {
  2211. .stream_name = "ETDM2_OUT",
  2212. .channels_min = 1,
  2213. .channels_max = 16,
  2214. .rates = MTK_ETDM_RATES,
  2215. .formats = MTK_ETDM_FORMATS,
  2216. },
  2217. .ops = &mtk_dai_etdm_ops,
  2218. },
  2219. {
  2220. .name = "ETDM3_OUT",
  2221. .id = MT8188_AFE_IO_ETDM3_OUT,
  2222. .playback = {
  2223. .stream_name = "ETDM3_OUT",
  2224. .channels_min = 1,
  2225. .channels_max = 8,
  2226. .rates = MTK_ETDM_RATES,
  2227. .formats = MTK_ETDM_FORMATS,
  2228. },
  2229. .ops = &mtk_dai_hdmitx_dptx_ops,
  2230. },
  2231. };
  2232. static void mt8188_etdm_update_sync_info(struct mtk_base_afe *afe)
  2233. {
  2234. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2235. struct mtk_dai_etdm_priv *etdm_data;
  2236. struct mtk_dai_etdm_priv *mst_data;
  2237. int mst_dai_id;
  2238. int i;
  2239. for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {
  2240. etdm_data = afe_priv->dai_priv[i];
  2241. if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {
  2242. mst_dai_id = etdm_data->cowork_source_id;
  2243. mst_data = afe_priv->dai_priv[mst_dai_id];
  2244. if (mst_data->cowork_source_id != COWORK_ETDM_NONE)
  2245. dev_err(afe->dev, "%s [%d] wrong sync source\n",
  2246. __func__, i);
  2247. mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;
  2248. mst_data->cowork_slv_count++;
  2249. }
  2250. }
  2251. }
  2252. static void mt8188_dai_etdm_parse_of(struct mtk_base_afe *afe)
  2253. {
  2254. const struct device_node *of_node = afe->dev->of_node;
  2255. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2256. struct mtk_dai_etdm_priv *etdm_data;
  2257. char prop[48];
  2258. u8 disable_chn[MT8188_ETDM_MAX_CHANNELS];
  2259. int max_chn = MT8188_ETDM_MAX_CHANNELS;
  2260. unsigned int sync_id;
  2261. u32 sel;
  2262. int ret;
  2263. int dai_id;
  2264. int i, j;
  2265. struct {
  2266. const char *name;
  2267. const unsigned int sync_id;
  2268. } of_afe_etdms[MT8188_AFE_IO_ETDM_NUM] = {
  2269. {"etdm-in1", ETDM_SYNC_FROM_IN1},
  2270. {"etdm-in2", ETDM_SYNC_FROM_IN2},
  2271. {"etdm-out1", ETDM_SYNC_FROM_OUT1},
  2272. {"etdm-out2", ETDM_SYNC_FROM_OUT2},
  2273. {"etdm-out3", ETDM_SYNC_FROM_OUT3},
  2274. };
  2275. for (i = 0; i < MT8188_AFE_IO_ETDM_NUM; i++) {
  2276. dai_id = ETDM_TO_DAI_ID(i);
  2277. etdm_data = afe_priv->dai_priv[dai_id];
  2278. snprintf(prop, sizeof(prop), "mediatek,%s-multi-pin-mode",
  2279. of_afe_etdms[i].name);
  2280. etdm_data->data_mode = of_property_read_bool(of_node, prop);
  2281. snprintf(prop, sizeof(prop), "mediatek,%s-cowork-source",
  2282. of_afe_etdms[i].name);
  2283. ret = of_property_read_u32(of_node, prop, &sel);
  2284. if (ret == 0) {
  2285. if (sel >= MT8188_AFE_IO_ETDM_NUM) {
  2286. dev_err(afe->dev, "%s invalid id=%d\n",
  2287. __func__, sel);
  2288. etdm_data->cowork_source_id = COWORK_ETDM_NONE;
  2289. } else {
  2290. sync_id = of_afe_etdms[sel].sync_id;
  2291. etdm_data->cowork_source_id =
  2292. sync_to_dai_id(sync_id);
  2293. }
  2294. } else {
  2295. etdm_data->cowork_source_id = COWORK_ETDM_NONE;
  2296. }
  2297. }
  2298. /* etdm in only */
  2299. for (i = 0; i < 2; i++) {
  2300. dai_id = ETDM_TO_DAI_ID(i);
  2301. etdm_data = afe_priv->dai_priv[dai_id];
  2302. snprintf(prop, sizeof(prop), "mediatek,%s-chn-disabled",
  2303. of_afe_etdms[i].name);
  2304. ret = of_property_read_variable_u8_array(of_node, prop,
  2305. disable_chn,
  2306. 1, max_chn);
  2307. if (ret < 0)
  2308. continue;
  2309. for (j = 0; j < ret; j++) {
  2310. if (disable_chn[j] >= MT8188_ETDM_MAX_CHANNELS)
  2311. dev_err(afe->dev, "%s [%d] invalid chn %u\n",
  2312. __func__, j, disable_chn[j]);
  2313. else
  2314. etdm_data->in_disable_ch[disable_chn[j]] = true;
  2315. }
  2316. }
  2317. mt8188_etdm_update_sync_info(afe);
  2318. }
  2319. static int init_etdm_priv_data(struct mtk_base_afe *afe)
  2320. {
  2321. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2322. struct mtk_dai_etdm_priv *etdm_priv;
  2323. int i;
  2324. for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {
  2325. etdm_priv = devm_kzalloc(afe->dev,
  2326. sizeof(struct mtk_dai_etdm_priv),
  2327. GFP_KERNEL);
  2328. if (!etdm_priv)
  2329. return -ENOMEM;
  2330. afe_priv->dai_priv[i] = etdm_priv;
  2331. }
  2332. afe_priv->dai_priv[MT8188_AFE_IO_DPTX] =
  2333. afe_priv->dai_priv[MT8188_AFE_IO_ETDM3_OUT];
  2334. mt8188_dai_etdm_parse_of(afe);
  2335. return 0;
  2336. }
  2337. int mt8188_dai_etdm_register(struct mtk_base_afe *afe)
  2338. {
  2339. struct mtk_base_afe_dai *dai;
  2340. dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
  2341. if (!dai)
  2342. return -ENOMEM;
  2343. list_add(&dai->list, &afe->sub_dais);
  2344. dai->dai_drivers = mtk_dai_etdm_driver;
  2345. dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);
  2346. dai->dapm_widgets = mtk_dai_etdm_widgets;
  2347. dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);
  2348. dai->dapm_routes = mtk_dai_etdm_routes;
  2349. dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);
  2350. dai->controls = mtk_dai_etdm_controls;
  2351. dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);
  2352. return init_etdm_priv_data(afe);
  2353. }