mt8188-afe-pcm.c 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek ALSA SoC AFE platform driver for 8188
  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/arm-smccc.h>
  11. #include <linux/delay.h>
  12. #include <linux/dma-mapping.h>
  13. #include <linux/module.h>
  14. #include <linux/mfd/syscon.h>
  15. #include <linux/of.h>
  16. #include <linux/of_address.h>
  17. #include <linux/of_platform.h>
  18. #include <linux/of_reserved_mem.h>
  19. #include <linux/pm_runtime.h>
  20. #include <linux/soc/mediatek/infracfg.h>
  21. #include <linux/reset.h>
  22. #include <sound/pcm_params.h>
  23. #include "mt8188-afe-common.h"
  24. #include "mt8188-afe-clk.h"
  25. #include "mt8188-reg.h"
  26. #include "../common/mtk-afe-platform-driver.h"
  27. #include "../common/mtk-afe-fe-dai.h"
  28. #define MT8188_MEMIF_BUFFER_BYTES_ALIGN (0x40)
  29. #define MT8188_MEMIF_DL7_MAX_PERIOD_SIZE (0x3fff)
  30. #define MEMIF_AXI_MINLEN 9 /* register default value */
  31. struct mtk_dai_memif_priv {
  32. unsigned int asys_timing_sel;
  33. unsigned int fs_timing;
  34. };
  35. static const struct snd_pcm_hardware mt8188_afe_hardware = {
  36. .info = SNDRV_PCM_INFO_MMAP |
  37. SNDRV_PCM_INFO_INTERLEAVED |
  38. SNDRV_PCM_INFO_MMAP_VALID,
  39. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  40. SNDRV_PCM_FMTBIT_S24_LE |
  41. SNDRV_PCM_FMTBIT_S32_LE,
  42. .period_bytes_min = 64,
  43. .period_bytes_max = 256 * 1024,
  44. .periods_min = 2,
  45. .periods_max = 256,
  46. .buffer_bytes_max = 256 * 2 * 1024,
  47. };
  48. struct mt8188_afe_rate {
  49. unsigned int rate;
  50. unsigned int reg_value;
  51. };
  52. static const struct mt8188_afe_rate mt8188_afe_rates[] = {
  53. { .rate = 8000, .reg_value = 0, },
  54. { .rate = 12000, .reg_value = 1, },
  55. { .rate = 16000, .reg_value = 2, },
  56. { .rate = 24000, .reg_value = 3, },
  57. { .rate = 32000, .reg_value = 4, },
  58. { .rate = 48000, .reg_value = 5, },
  59. { .rate = 96000, .reg_value = 6, },
  60. { .rate = 192000, .reg_value = 7, },
  61. { .rate = 384000, .reg_value = 8, },
  62. { .rate = 7350, .reg_value = 16, },
  63. { .rate = 11025, .reg_value = 17, },
  64. { .rate = 14700, .reg_value = 18, },
  65. { .rate = 22050, .reg_value = 19, },
  66. { .rate = 29400, .reg_value = 20, },
  67. { .rate = 44100, .reg_value = 21, },
  68. { .rate = 88200, .reg_value = 22, },
  69. { .rate = 176400, .reg_value = 23, },
  70. { .rate = 352800, .reg_value = 24, },
  71. };
  72. int mt8188_afe_fs_timing(unsigned int rate)
  73. {
  74. int i;
  75. for (i = 0; i < ARRAY_SIZE(mt8188_afe_rates); i++)
  76. if (mt8188_afe_rates[i].rate == rate)
  77. return mt8188_afe_rates[i].reg_value;
  78. return -EINVAL;
  79. }
  80. static int mt8188_memif_fs(struct snd_pcm_substream *substream,
  81. unsigned int rate)
  82. {
  83. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  84. struct snd_soc_component *component = NULL;
  85. struct mtk_base_afe *afe = NULL;
  86. struct mt8188_afe_private *afe_priv = NULL;
  87. struct mtk_base_afe_memif *memif = NULL;
  88. struct mtk_dai_memif_priv *memif_priv = NULL;
  89. int fs = mt8188_afe_fs_timing(rate);
  90. int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
  91. if (id < 0)
  92. return -EINVAL;
  93. component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  94. if (!component)
  95. return -EINVAL;
  96. afe = snd_soc_component_get_drvdata(component);
  97. memif = &afe->memif[id];
  98. switch (memif->data->id) {
  99. case MT8188_AFE_MEMIF_DL10:
  100. fs = MT8188_ETDM_OUT3_1X_EN;
  101. break;
  102. case MT8188_AFE_MEMIF_UL8:
  103. fs = MT8188_ETDM_IN1_NX_EN;
  104. break;
  105. case MT8188_AFE_MEMIF_UL3:
  106. fs = MT8188_ETDM_IN2_NX_EN;
  107. break;
  108. default:
  109. afe_priv = afe->platform_priv;
  110. memif_priv = afe_priv->dai_priv[id];
  111. if (memif_priv->fs_timing)
  112. fs = memif_priv->fs_timing;
  113. break;
  114. }
  115. return fs;
  116. }
  117. static int mt8188_irq_fs(struct snd_pcm_substream *substream,
  118. unsigned int rate)
  119. {
  120. int fs = mt8188_memif_fs(substream, rate);
  121. switch (fs) {
  122. case MT8188_ETDM_IN1_NX_EN:
  123. fs = MT8188_ETDM_IN1_1X_EN;
  124. break;
  125. case MT8188_ETDM_IN2_NX_EN:
  126. fs = MT8188_ETDM_IN2_1X_EN;
  127. break;
  128. default:
  129. break;
  130. }
  131. return fs;
  132. }
  133. enum {
  134. MT8188_AFE_CM0,
  135. MT8188_AFE_CM1,
  136. MT8188_AFE_CM2,
  137. MT8188_AFE_CM_NUM,
  138. };
  139. struct mt8188_afe_channel_merge {
  140. int id;
  141. int reg;
  142. unsigned int sel_shift;
  143. unsigned int sel_maskbit;
  144. unsigned int sel_default;
  145. unsigned int ch_num_shift;
  146. unsigned int ch_num_maskbit;
  147. unsigned int en_shift;
  148. unsigned int en_maskbit;
  149. unsigned int update_cnt_shift;
  150. unsigned int update_cnt_maskbit;
  151. unsigned int update_cnt_default;
  152. };
  153. static const struct mt8188_afe_channel_merge
  154. mt8188_afe_cm[MT8188_AFE_CM_NUM] = {
  155. [MT8188_AFE_CM0] = {
  156. .id = MT8188_AFE_CM0,
  157. .reg = AFE_CM0_CON,
  158. .sel_shift = 30,
  159. .sel_maskbit = 0x1,
  160. .sel_default = 1,
  161. .ch_num_shift = 2,
  162. .ch_num_maskbit = 0x3f,
  163. .en_shift = 0,
  164. .en_maskbit = 0x1,
  165. .update_cnt_shift = 16,
  166. .update_cnt_maskbit = 0x1fff,
  167. .update_cnt_default = 0x3,
  168. },
  169. [MT8188_AFE_CM1] = {
  170. .id = MT8188_AFE_CM1,
  171. .reg = AFE_CM1_CON,
  172. .sel_shift = 30,
  173. .sel_maskbit = 0x1,
  174. .sel_default = 1,
  175. .ch_num_shift = 2,
  176. .ch_num_maskbit = 0x1f,
  177. .en_shift = 0,
  178. .en_maskbit = 0x1,
  179. .update_cnt_shift = 16,
  180. .update_cnt_maskbit = 0x1fff,
  181. .update_cnt_default = 0x3,
  182. },
  183. [MT8188_AFE_CM2] = {
  184. .id = MT8188_AFE_CM2,
  185. .reg = AFE_CM2_CON,
  186. .sel_shift = 30,
  187. .sel_maskbit = 0x1,
  188. .sel_default = 1,
  189. .ch_num_shift = 2,
  190. .ch_num_maskbit = 0x1f,
  191. .en_shift = 0,
  192. .en_maskbit = 0x1,
  193. .update_cnt_shift = 16,
  194. .update_cnt_maskbit = 0x1fff,
  195. .update_cnt_default = 0x3,
  196. },
  197. };
  198. static int mt8188_afe_memif_is_ul(int id)
  199. {
  200. if (id >= MT8188_AFE_MEMIF_UL_START && id < MT8188_AFE_MEMIF_END)
  201. return 1;
  202. else
  203. return 0;
  204. }
  205. static const struct mt8188_afe_channel_merge *
  206. mt8188_afe_found_cm(struct snd_soc_dai *dai)
  207. {
  208. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  209. int id = -EINVAL;
  210. if (mt8188_afe_memif_is_ul(dai->id) == 0)
  211. return NULL;
  212. switch (dai->id) {
  213. case MT8188_AFE_MEMIF_UL9:
  214. id = MT8188_AFE_CM0;
  215. break;
  216. case MT8188_AFE_MEMIF_UL2:
  217. id = MT8188_AFE_CM1;
  218. break;
  219. case MT8188_AFE_MEMIF_UL10:
  220. id = MT8188_AFE_CM2;
  221. break;
  222. default:
  223. break;
  224. }
  225. if (id < 0) {
  226. dev_dbg(afe->dev, "%s, memif %d cannot find CM!\n", __func__, dai->id);
  227. return NULL;
  228. }
  229. return &mt8188_afe_cm[id];
  230. }
  231. static int mt8188_afe_config_cm(struct mtk_base_afe *afe,
  232. const struct mt8188_afe_channel_merge *cm,
  233. unsigned int channels)
  234. {
  235. if (!cm)
  236. return -EINVAL;
  237. regmap_update_bits(afe->regmap,
  238. cm->reg,
  239. cm->sel_maskbit << cm->sel_shift,
  240. cm->sel_default << cm->sel_shift);
  241. regmap_update_bits(afe->regmap,
  242. cm->reg,
  243. cm->ch_num_maskbit << cm->ch_num_shift,
  244. (channels - 1) << cm->ch_num_shift);
  245. regmap_update_bits(afe->regmap,
  246. cm->reg,
  247. cm->update_cnt_maskbit << cm->update_cnt_shift,
  248. cm->update_cnt_default << cm->update_cnt_shift);
  249. return 0;
  250. }
  251. static int mt8188_afe_enable_cm(struct mtk_base_afe *afe,
  252. const struct mt8188_afe_channel_merge *cm,
  253. bool enable)
  254. {
  255. if (!cm)
  256. return -EINVAL;
  257. regmap_update_bits(afe->regmap,
  258. cm->reg,
  259. cm->en_maskbit << cm->en_shift,
  260. enable << cm->en_shift);
  261. return 0;
  262. }
  263. static int mt8188_afe_fe_startup(struct snd_pcm_substream *substream,
  264. struct snd_soc_dai *dai)
  265. {
  266. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  267. struct snd_pcm_runtime *runtime = substream->runtime;
  268. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  269. int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
  270. int ret;
  271. ret = mtk_afe_fe_startup(substream, dai);
  272. snd_pcm_hw_constraint_step(runtime, 0,
  273. SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
  274. MT8188_MEMIF_BUFFER_BYTES_ALIGN);
  275. if (id != MT8188_AFE_MEMIF_DL7)
  276. goto out;
  277. ret = snd_pcm_hw_constraint_minmax(runtime,
  278. SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 1,
  279. MT8188_MEMIF_DL7_MAX_PERIOD_SIZE);
  280. if (ret < 0)
  281. dev_dbg(afe->dev, "hw_constraint_minmax failed\n");
  282. out:
  283. return ret;
  284. }
  285. static void mt8188_afe_fe_shutdown(struct snd_pcm_substream *substream,
  286. struct snd_soc_dai *dai)
  287. {
  288. mtk_afe_fe_shutdown(substream, dai);
  289. }
  290. static int mt8188_afe_fe_hw_params(struct snd_pcm_substream *substream,
  291. struct snd_pcm_hw_params *params,
  292. struct snd_soc_dai *dai)
  293. {
  294. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  295. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  296. int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
  297. struct mtk_base_afe_memif *memif = &afe->memif[id];
  298. const struct mtk_base_memif_data *data = memif->data;
  299. const struct mt8188_afe_channel_merge *cm = mt8188_afe_found_cm(dai);
  300. unsigned int channels = params_channels(params);
  301. mt8188_afe_config_cm(afe, cm, channels);
  302. if (data->ch_num_reg >= 0) {
  303. regmap_update_bits(afe->regmap, data->ch_num_reg,
  304. data->ch_num_maskbit << data->ch_num_shift,
  305. channels << data->ch_num_shift);
  306. }
  307. return mtk_afe_fe_hw_params(substream, params, dai);
  308. }
  309. static int mt8188_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
  310. struct snd_soc_dai *dai)
  311. {
  312. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  313. const struct mt8188_afe_channel_merge *cm = mt8188_afe_found_cm(dai);
  314. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  315. struct snd_pcm_runtime * const runtime = substream->runtime;
  316. int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
  317. struct mtk_base_afe_memif *memif = &afe->memif[id];
  318. struct mtk_base_afe_irq *irqs = &afe->irqs[memif->irq_usage];
  319. const struct mtk_base_irq_data *irq_data = irqs->irq_data;
  320. unsigned int counter = runtime->period_size;
  321. int fs;
  322. int ret;
  323. switch (cmd) {
  324. case SNDRV_PCM_TRIGGER_START:
  325. case SNDRV_PCM_TRIGGER_RESUME:
  326. mt8188_afe_enable_cm(afe, cm, true);
  327. ret = mtk_memif_set_enable(afe, id);
  328. if (ret) {
  329. dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
  330. __func__, id, ret);
  331. return ret;
  332. }
  333. /* set irq counter */
  334. regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
  335. irq_data->irq_cnt_maskbit << irq_data->irq_cnt_shift,
  336. counter << irq_data->irq_cnt_shift);
  337. /* set irq fs */
  338. fs = afe->irq_fs(substream, runtime->rate);
  339. if (fs < 0)
  340. return -EINVAL;
  341. if (irq_data->irq_fs_reg >= 0)
  342. regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
  343. irq_data->irq_fs_maskbit << irq_data->irq_fs_shift,
  344. fs << irq_data->irq_fs_shift);
  345. /* delay for uplink */
  346. if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
  347. u32 sample_delay;
  348. sample_delay = ((MEMIF_AXI_MINLEN + 1) * 64 +
  349. (runtime->channels * runtime->sample_bits - 1)) /
  350. (runtime->channels * runtime->sample_bits) + 1;
  351. udelay(sample_delay * 1000000 / runtime->rate);
  352. }
  353. /* enable interrupt */
  354. regmap_set_bits(afe->regmap, irq_data->irq_en_reg,
  355. BIT(irq_data->irq_en_shift));
  356. return 0;
  357. case SNDRV_PCM_TRIGGER_STOP:
  358. case SNDRV_PCM_TRIGGER_SUSPEND:
  359. mt8188_afe_enable_cm(afe, cm, false);
  360. ret = mtk_memif_set_disable(afe, id);
  361. if (ret)
  362. dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
  363. __func__, id, ret);
  364. /* disable interrupt */
  365. regmap_clear_bits(afe->regmap, irq_data->irq_en_reg,
  366. BIT(irq_data->irq_en_shift));
  367. /* and clear pending IRQ */
  368. regmap_write(afe->regmap, irq_data->irq_clr_reg,
  369. BIT(irq_data->irq_clr_shift));
  370. return ret;
  371. default:
  372. return -EINVAL;
  373. }
  374. }
  375. static const struct snd_soc_dai_ops mt8188_afe_fe_dai_ops = {
  376. .startup = mt8188_afe_fe_startup,
  377. .shutdown = mt8188_afe_fe_shutdown,
  378. .hw_params = mt8188_afe_fe_hw_params,
  379. .hw_free = mtk_afe_fe_hw_free,
  380. .prepare = mtk_afe_fe_prepare,
  381. .trigger = mt8188_afe_fe_trigger,
  382. };
  383. #define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
  384. SNDRV_PCM_RATE_88200 |\
  385. SNDRV_PCM_RATE_96000 |\
  386. SNDRV_PCM_RATE_176400 |\
  387. SNDRV_PCM_RATE_192000 |\
  388. SNDRV_PCM_RATE_352800 |\
  389. SNDRV_PCM_RATE_384000)
  390. #define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  391. SNDRV_PCM_FMTBIT_S24_LE |\
  392. SNDRV_PCM_FMTBIT_S32_LE)
  393. static struct snd_soc_dai_driver mt8188_memif_dai_driver[] = {
  394. /* FE DAIs: memory intefaces to CPU */
  395. {
  396. .name = "DL2",
  397. .id = MT8188_AFE_MEMIF_DL2,
  398. .playback = {
  399. .stream_name = "DL2",
  400. .channels_min = 1,
  401. .channels_max = 2,
  402. .rates = MTK_PCM_RATES,
  403. .formats = MTK_PCM_FORMATS,
  404. },
  405. .ops = &mt8188_afe_fe_dai_ops,
  406. },
  407. {
  408. .name = "DL3",
  409. .id = MT8188_AFE_MEMIF_DL3,
  410. .playback = {
  411. .stream_name = "DL3",
  412. .channels_min = 1,
  413. .channels_max = 2,
  414. .rates = MTK_PCM_RATES,
  415. .formats = MTK_PCM_FORMATS,
  416. },
  417. .ops = &mt8188_afe_fe_dai_ops,
  418. },
  419. {
  420. .name = "DL6",
  421. .id = MT8188_AFE_MEMIF_DL6,
  422. .playback = {
  423. .stream_name = "DL6",
  424. .channels_min = 1,
  425. .channels_max = 2,
  426. .rates = MTK_PCM_RATES,
  427. .formats = MTK_PCM_FORMATS,
  428. },
  429. .ops = &mt8188_afe_fe_dai_ops,
  430. },
  431. {
  432. .name = "DL7",
  433. .id = MT8188_AFE_MEMIF_DL7,
  434. .playback = {
  435. .stream_name = "DL7",
  436. .channels_min = 1,
  437. .channels_max = 2,
  438. .rates = MTK_PCM_RATES,
  439. .formats = MTK_PCM_FORMATS,
  440. },
  441. .ops = &mt8188_afe_fe_dai_ops,
  442. },
  443. {
  444. .name = "DL8",
  445. .id = MT8188_AFE_MEMIF_DL8,
  446. .playback = {
  447. .stream_name = "DL8",
  448. .channels_min = 1,
  449. .channels_max = 16,
  450. .rates = MTK_PCM_RATES,
  451. .formats = MTK_PCM_FORMATS,
  452. },
  453. .ops = &mt8188_afe_fe_dai_ops,
  454. },
  455. {
  456. .name = "DL10",
  457. .id = MT8188_AFE_MEMIF_DL10,
  458. .playback = {
  459. .stream_name = "DL10",
  460. .channels_min = 1,
  461. .channels_max = 8,
  462. .rates = MTK_PCM_RATES,
  463. .formats = MTK_PCM_FORMATS,
  464. },
  465. .ops = &mt8188_afe_fe_dai_ops,
  466. },
  467. {
  468. .name = "DL11",
  469. .id = MT8188_AFE_MEMIF_DL11,
  470. .playback = {
  471. .stream_name = "DL11",
  472. .channels_min = 1,
  473. .channels_max = 32,
  474. .rates = MTK_PCM_RATES,
  475. .formats = MTK_PCM_FORMATS,
  476. },
  477. .ops = &mt8188_afe_fe_dai_ops,
  478. },
  479. {
  480. .name = "UL1",
  481. .id = MT8188_AFE_MEMIF_UL1,
  482. .capture = {
  483. .stream_name = "UL1",
  484. .channels_min = 1,
  485. .channels_max = 8,
  486. .rates = MTK_PCM_RATES,
  487. .formats = MTK_PCM_FORMATS,
  488. },
  489. .ops = &mt8188_afe_fe_dai_ops,
  490. },
  491. {
  492. .name = "UL2",
  493. .id = MT8188_AFE_MEMIF_UL2,
  494. .capture = {
  495. .stream_name = "UL2",
  496. .channels_min = 1,
  497. .channels_max = 8,
  498. .rates = MTK_PCM_RATES,
  499. .formats = MTK_PCM_FORMATS,
  500. },
  501. .ops = &mt8188_afe_fe_dai_ops,
  502. },
  503. {
  504. .name = "UL3",
  505. .id = MT8188_AFE_MEMIF_UL3,
  506. .capture = {
  507. .stream_name = "UL3",
  508. .channels_min = 1,
  509. .channels_max = 16,
  510. .rates = MTK_PCM_RATES,
  511. .formats = MTK_PCM_FORMATS,
  512. },
  513. .ops = &mt8188_afe_fe_dai_ops,
  514. },
  515. {
  516. .name = "UL4",
  517. .id = MT8188_AFE_MEMIF_UL4,
  518. .capture = {
  519. .stream_name = "UL4",
  520. .channels_min = 1,
  521. .channels_max = 2,
  522. .rates = MTK_PCM_RATES,
  523. .formats = MTK_PCM_FORMATS,
  524. },
  525. .ops = &mt8188_afe_fe_dai_ops,
  526. },
  527. {
  528. .name = "UL5",
  529. .id = MT8188_AFE_MEMIF_UL5,
  530. .capture = {
  531. .stream_name = "UL5",
  532. .channels_min = 1,
  533. .channels_max = 2,
  534. .rates = MTK_PCM_RATES,
  535. .formats = MTK_PCM_FORMATS,
  536. },
  537. .ops = &mt8188_afe_fe_dai_ops,
  538. },
  539. {
  540. .name = "UL6",
  541. .id = MT8188_AFE_MEMIF_UL6,
  542. .capture = {
  543. .stream_name = "UL6",
  544. .channels_min = 1,
  545. .channels_max = 8,
  546. .rates = MTK_PCM_RATES,
  547. .formats = MTK_PCM_FORMATS,
  548. },
  549. .ops = &mt8188_afe_fe_dai_ops,
  550. },
  551. {
  552. .name = "UL8",
  553. .id = MT8188_AFE_MEMIF_UL8,
  554. .capture = {
  555. .stream_name = "UL8",
  556. .channels_min = 1,
  557. .channels_max = 24,
  558. .rates = MTK_PCM_RATES,
  559. .formats = MTK_PCM_FORMATS,
  560. },
  561. .ops = &mt8188_afe_fe_dai_ops,
  562. },
  563. {
  564. .name = "UL9",
  565. .id = MT8188_AFE_MEMIF_UL9,
  566. .capture = {
  567. .stream_name = "UL9",
  568. .channels_min = 1,
  569. .channels_max = 32,
  570. .rates = MTK_PCM_RATES,
  571. .formats = MTK_PCM_FORMATS,
  572. },
  573. .ops = &mt8188_afe_fe_dai_ops,
  574. },
  575. {
  576. .name = "UL10",
  577. .id = MT8188_AFE_MEMIF_UL10,
  578. .capture = {
  579. .stream_name = "UL10",
  580. .channels_min = 1,
  581. .channels_max = 4,
  582. .rates = MTK_PCM_RATES,
  583. .formats = MTK_PCM_FORMATS,
  584. },
  585. .ops = &mt8188_afe_fe_dai_ops,
  586. },
  587. };
  588. static const struct snd_kcontrol_new o002_mix[] = {
  589. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN2, 0, 1, 0),
  590. SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN2, 12, 1, 0),
  591. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN2, 20, 1, 0),
  592. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN2, 22, 1, 0),
  593. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN2_2, 6, 1, 0),
  594. SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN2_2, 8, 1, 0),
  595. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN2_5, 8, 1, 0),
  596. };
  597. static const struct snd_kcontrol_new o003_mix[] = {
  598. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN3, 1, 1, 0),
  599. SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN3, 13, 1, 0),
  600. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN3, 21, 1, 0),
  601. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN3, 23, 1, 0),
  602. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN3_2, 7, 1, 0),
  603. SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN3_2, 9, 1, 0),
  604. SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN3_5, 9, 1, 0),
  605. };
  606. static const struct snd_kcontrol_new o004_mix[] = {
  607. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN4, 0, 1, 0),
  608. SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN4, 14, 1, 0),
  609. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN4, 24, 1, 0),
  610. SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN4_2, 10, 1, 0),
  611. };
  612. static const struct snd_kcontrol_new o005_mix[] = {
  613. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN5, 1, 1, 0),
  614. SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN5, 15, 1, 0),
  615. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN5, 25, 1, 0),
  616. SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN5_2, 11, 1, 0),
  617. };
  618. static const struct snd_kcontrol_new o006_mix[] = {
  619. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN6, 0, 1, 0),
  620. SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN6, 16, 1, 0),
  621. SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN6, 26, 1, 0),
  622. SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN6_2, 12, 1, 0),
  623. };
  624. static const struct snd_kcontrol_new o007_mix[] = {
  625. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN7, 1, 1, 0),
  626. SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN7, 17, 1, 0),
  627. SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN7, 27, 1, 0),
  628. SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN7_2, 13, 1, 0),
  629. };
  630. static const struct snd_kcontrol_new o008_mix[] = {
  631. SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN8, 18, 1, 0),
  632. SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN8, 28, 1, 0),
  633. SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN8_2, 14, 1, 0),
  634. };
  635. static const struct snd_kcontrol_new o009_mix[] = {
  636. SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN9, 19, 1, 0),
  637. SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN9, 29, 1, 0),
  638. SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN9_2, 15, 1, 0),
  639. };
  640. static const struct snd_kcontrol_new o010_mix[] = {
  641. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN10, 22, 1, 0),
  642. SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN10, 30, 1, 0),
  643. SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN10_1, 14, 1, 0),
  644. SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN10_2, 8, 1, 0),
  645. SOC_DAPM_SINGLE_AUTODISABLE("I080 Switch", AFE_CONN10_2, 16, 1, 0),
  646. SOC_DAPM_SINGLE_AUTODISABLE("I188 Switch", AFE_CONN10_5, 28, 1, 0),
  647. };
  648. static const struct snd_kcontrol_new o011_mix[] = {
  649. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN11, 23, 1, 0),
  650. SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN11, 31, 1, 0),
  651. SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN11_1, 15, 1, 0),
  652. SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN11_2, 9, 1, 0),
  653. SOC_DAPM_SINGLE_AUTODISABLE("I081 Switch", AFE_CONN11_2, 17, 1, 0),
  654. SOC_DAPM_SINGLE_AUTODISABLE("I189 Switch", AFE_CONN11_5, 29, 1, 0),
  655. };
  656. static const struct snd_kcontrol_new o012_mix[] = {
  657. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN12, 24, 1, 0),
  658. SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN12_1, 0, 1, 0),
  659. SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN12_1, 16, 1, 0),
  660. SOC_DAPM_SINGLE_AUTODISABLE("I074 Switch", AFE_CONN12_2, 10, 1, 0),
  661. SOC_DAPM_SINGLE_AUTODISABLE("I082 Switch", AFE_CONN12_2, 18, 1, 0),
  662. SOC_DAPM_SINGLE_AUTODISABLE("I190 Switch", AFE_CONN12_5, 30, 1, 0),
  663. };
  664. static const struct snd_kcontrol_new o013_mix[] = {
  665. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN13, 25, 1, 0),
  666. SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN13_1, 1, 1, 0),
  667. SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN13_1, 17, 1, 0),
  668. SOC_DAPM_SINGLE_AUTODISABLE("I075 Switch", AFE_CONN13_2, 11, 1, 0),
  669. SOC_DAPM_SINGLE_AUTODISABLE("I083 Switch", AFE_CONN13_2, 19, 1, 0),
  670. SOC_DAPM_SINGLE_AUTODISABLE("I191 Switch", AFE_CONN13_5, 31, 1, 0),
  671. };
  672. static const struct snd_kcontrol_new o014_mix[] = {
  673. SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN14, 26, 1, 0),
  674. SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN14_1, 2, 1, 0),
  675. SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN14_1, 18, 1, 0),
  676. SOC_DAPM_SINGLE_AUTODISABLE("I076 Switch", AFE_CONN14_2, 12, 1, 0),
  677. SOC_DAPM_SINGLE_AUTODISABLE("I084 Switch", AFE_CONN14_2, 20, 1, 0),
  678. SOC_DAPM_SINGLE_AUTODISABLE("I192 Switch", AFE_CONN14_6, 0, 1, 0),
  679. };
  680. static const struct snd_kcontrol_new o015_mix[] = {
  681. SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN15, 27, 1, 0),
  682. SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN15_1, 3, 1, 0),
  683. SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN15_1, 19, 1, 0),
  684. SOC_DAPM_SINGLE_AUTODISABLE("I077 Switch", AFE_CONN15_2, 13, 1, 0),
  685. SOC_DAPM_SINGLE_AUTODISABLE("I085 Switch", AFE_CONN15_2, 21, 1, 0),
  686. SOC_DAPM_SINGLE_AUTODISABLE("I193 Switch", AFE_CONN15_6, 1, 1, 0),
  687. };
  688. static const struct snd_kcontrol_new o016_mix[] = {
  689. SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN16, 28, 1, 0),
  690. SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN16_1, 4, 1, 0),
  691. SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN16_1, 20, 1, 0),
  692. SOC_DAPM_SINGLE_AUTODISABLE("I078 Switch", AFE_CONN16_2, 14, 1, 0),
  693. SOC_DAPM_SINGLE_AUTODISABLE("I086 Switch", AFE_CONN16_2, 22, 1, 0),
  694. SOC_DAPM_SINGLE_AUTODISABLE("I194 Switch", AFE_CONN16_6, 2, 1, 0),
  695. };
  696. static const struct snd_kcontrol_new o017_mix[] = {
  697. SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN17, 29, 1, 0),
  698. SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN17_1, 5, 1, 0),
  699. SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN17_1, 21, 1, 0),
  700. SOC_DAPM_SINGLE_AUTODISABLE("I079 Switch", AFE_CONN17_2, 15, 1, 0),
  701. SOC_DAPM_SINGLE_AUTODISABLE("I087 Switch", AFE_CONN17_2, 23, 1, 0),
  702. SOC_DAPM_SINGLE_AUTODISABLE("I195 Switch", AFE_CONN17_6, 3, 1, 0),
  703. };
  704. static const struct snd_kcontrol_new o018_mix[] = {
  705. SOC_DAPM_SINGLE_AUTODISABLE("I080 Switch", AFE_CONN18_2, 16, 1, 0),
  706. };
  707. static const struct snd_kcontrol_new o019_mix[] = {
  708. SOC_DAPM_SINGLE_AUTODISABLE("I081 Switch", AFE_CONN19_2, 17, 1, 0),
  709. };
  710. static const struct snd_kcontrol_new o020_mix[] = {
  711. SOC_DAPM_SINGLE_AUTODISABLE("I082 Switch", AFE_CONN20_2, 18, 1, 0),
  712. };
  713. static const struct snd_kcontrol_new o021_mix[] = {
  714. SOC_DAPM_SINGLE_AUTODISABLE("I083 Switch", AFE_CONN21_2, 19, 1, 0),
  715. };
  716. static const struct snd_kcontrol_new o022_mix[] = {
  717. SOC_DAPM_SINGLE_AUTODISABLE("I084 Switch", AFE_CONN22_2, 20, 1, 0),
  718. };
  719. static const struct snd_kcontrol_new o023_mix[] = {
  720. SOC_DAPM_SINGLE_AUTODISABLE("I085 Switch", AFE_CONN23_2, 21, 1, 0),
  721. };
  722. static const struct snd_kcontrol_new o024_mix[] = {
  723. SOC_DAPM_SINGLE_AUTODISABLE("I086 Switch", AFE_CONN24_2, 22, 1, 0),
  724. };
  725. static const struct snd_kcontrol_new o025_mix[] = {
  726. SOC_DAPM_SINGLE_AUTODISABLE("I087 Switch", AFE_CONN25_2, 23, 1, 0),
  727. };
  728. static const struct snd_kcontrol_new o026_mix[] = {
  729. SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN26_1, 14, 1, 0),
  730. };
  731. static const struct snd_kcontrol_new o027_mix[] = {
  732. SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN27_1, 15, 1, 0),
  733. };
  734. static const struct snd_kcontrol_new o028_mix[] = {
  735. SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN28_1, 16, 1, 0),
  736. };
  737. static const struct snd_kcontrol_new o029_mix[] = {
  738. SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN29_1, 17, 1, 0),
  739. };
  740. static const struct snd_kcontrol_new o030_mix[] = {
  741. SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN30_1, 18, 1, 0),
  742. };
  743. static const struct snd_kcontrol_new o031_mix[] = {
  744. SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN31_1, 19, 1, 0),
  745. };
  746. static const struct snd_kcontrol_new o032_mix[] = {
  747. SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN32_1, 20, 1, 0),
  748. };
  749. static const struct snd_kcontrol_new o033_mix[] = {
  750. SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN33_1, 21, 1, 0),
  751. };
  752. static const struct snd_kcontrol_new o034_mix[] = {
  753. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN34, 0, 1, 0),
  754. SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN34, 2, 1, 0),
  755. SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN34, 12, 1, 0),
  756. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN34, 20, 1, 0),
  757. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN34_2, 6, 1, 0),
  758. SOC_DAPM_SINGLE_AUTODISABLE("I072 Switch", AFE_CONN34_2, 8, 1, 0),
  759. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN34_5, 8, 1, 0),
  760. };
  761. static const struct snd_kcontrol_new o035_mix[] = {
  762. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN35, 1, 1, 0),
  763. SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN35, 3, 1, 0),
  764. SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN35, 13, 1, 0),
  765. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN35, 21, 1, 0),
  766. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN35_2, 7, 1, 0),
  767. SOC_DAPM_SINGLE_AUTODISABLE("I073 Switch", AFE_CONN35_2, 9, 1, 0),
  768. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN35_5, 8, 1, 0),
  769. SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN35_5, 9, 1, 0),
  770. };
  771. static const struct snd_kcontrol_new o036_mix[] = {
  772. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN36, 0, 1, 0),
  773. SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN36, 12, 1, 0),
  774. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN36, 20, 1, 0),
  775. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN36_2, 6, 1, 0),
  776. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN36_5, 8, 1, 0),
  777. };
  778. static const struct snd_kcontrol_new o037_mix[] = {
  779. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN37, 1, 1, 0),
  780. SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN37, 13, 1, 0),
  781. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN37, 21, 1, 0),
  782. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN37_2, 7, 1, 0),
  783. SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN37_5, 9, 1, 0),
  784. };
  785. static const struct snd_kcontrol_new o038_mix[] = {
  786. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN38, 22, 1, 0),
  787. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN38_5, 8, 1, 0),
  788. };
  789. static const struct snd_kcontrol_new o039_mix[] = {
  790. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN39, 23, 1, 0),
  791. SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN39_5, 9, 1, 0),
  792. };
  793. static const struct snd_kcontrol_new o040_mix[] = {
  794. SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN40, 2, 1, 0),
  795. SOC_DAPM_SINGLE_AUTODISABLE("I012 Switch", AFE_CONN40, 12, 1, 0),
  796. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN40, 22, 1, 0),
  797. SOC_DAPM_SINGLE_AUTODISABLE("I168 Switch", AFE_CONN40_5, 8, 1, 0),
  798. };
  799. static const struct snd_kcontrol_new o041_mix[] = {
  800. SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN41, 3, 1, 0),
  801. SOC_DAPM_SINGLE_AUTODISABLE("I013 Switch", AFE_CONN41, 13, 1, 0),
  802. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN41, 23, 1, 0),
  803. SOC_DAPM_SINGLE_AUTODISABLE("I169 Switch", AFE_CONN41_5, 9, 1, 0),
  804. };
  805. static const struct snd_kcontrol_new o042_mix[] = {
  806. SOC_DAPM_SINGLE_AUTODISABLE("I014 Switch", AFE_CONN42, 14, 1, 0),
  807. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN42, 24, 1, 0),
  808. };
  809. static const struct snd_kcontrol_new o043_mix[] = {
  810. SOC_DAPM_SINGLE_AUTODISABLE("I015 Switch", AFE_CONN43, 15, 1, 0),
  811. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN43, 25, 1, 0),
  812. };
  813. static const struct snd_kcontrol_new o044_mix[] = {
  814. SOC_DAPM_SINGLE_AUTODISABLE("I016 Switch", AFE_CONN44, 16, 1, 0),
  815. SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN44, 26, 1, 0),
  816. };
  817. static const struct snd_kcontrol_new o045_mix[] = {
  818. SOC_DAPM_SINGLE_AUTODISABLE("I017 Switch", AFE_CONN45, 17, 1, 0),
  819. SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN45, 27, 1, 0),
  820. };
  821. static const struct snd_kcontrol_new o046_mix[] = {
  822. SOC_DAPM_SINGLE_AUTODISABLE("I018 Switch", AFE_CONN46, 18, 1, 0),
  823. SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN46, 28, 1, 0),
  824. };
  825. static const struct snd_kcontrol_new o047_mix[] = {
  826. SOC_DAPM_SINGLE_AUTODISABLE("I019 Switch", AFE_CONN47, 19, 1, 0),
  827. SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN47, 29, 1, 0),
  828. };
  829. static const struct snd_kcontrol_new o182_mix[] = {
  830. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN182, 20, 1, 0),
  831. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN182, 22, 1, 0),
  832. SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN182, 24, 1, 0),
  833. };
  834. static const struct snd_kcontrol_new o183_mix[] = {
  835. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN183, 21, 1, 0),
  836. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN183, 23, 1, 0),
  837. SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN183, 25, 1, 0),
  838. };
  839. static const char * const dl8_dl11_data_sel_mux_text[] = {
  840. "dl8", "dl11",
  841. };
  842. static SOC_ENUM_SINGLE_DECL(dl8_dl11_data_sel_mux_enum,
  843. AFE_DAC_CON2, 0, dl8_dl11_data_sel_mux_text);
  844. static const struct snd_kcontrol_new dl8_dl11_data_sel_mux =
  845. SOC_DAPM_ENUM("DL8_DL11 Sink",
  846. dl8_dl11_data_sel_mux_enum);
  847. static const struct snd_soc_dapm_widget mt8188_memif_widgets[] = {
  848. /* DL6 */
  849. SND_SOC_DAPM_MIXER("I000", SND_SOC_NOPM, 0, 0, NULL, 0),
  850. SND_SOC_DAPM_MIXER("I001", SND_SOC_NOPM, 0, 0, NULL, 0),
  851. /* DL3 */
  852. SND_SOC_DAPM_MIXER("I020", SND_SOC_NOPM, 0, 0, NULL, 0),
  853. SND_SOC_DAPM_MIXER("I021", SND_SOC_NOPM, 0, 0, NULL, 0),
  854. /* DL11 */
  855. SND_SOC_DAPM_MIXER("I022", SND_SOC_NOPM, 0, 0, NULL, 0),
  856. SND_SOC_DAPM_MIXER("I023", SND_SOC_NOPM, 0, 0, NULL, 0),
  857. SND_SOC_DAPM_MIXER("I024", SND_SOC_NOPM, 0, 0, NULL, 0),
  858. SND_SOC_DAPM_MIXER("I025", SND_SOC_NOPM, 0, 0, NULL, 0),
  859. SND_SOC_DAPM_MIXER("I026", SND_SOC_NOPM, 0, 0, NULL, 0),
  860. SND_SOC_DAPM_MIXER("I027", SND_SOC_NOPM, 0, 0, NULL, 0),
  861. SND_SOC_DAPM_MIXER("I028", SND_SOC_NOPM, 0, 0, NULL, 0),
  862. SND_SOC_DAPM_MIXER("I029", SND_SOC_NOPM, 0, 0, NULL, 0),
  863. SND_SOC_DAPM_MIXER("I030", SND_SOC_NOPM, 0, 0, NULL, 0),
  864. SND_SOC_DAPM_MIXER("I031", SND_SOC_NOPM, 0, 0, NULL, 0),
  865. SND_SOC_DAPM_MIXER("I032", SND_SOC_NOPM, 0, 0, NULL, 0),
  866. SND_SOC_DAPM_MIXER("I033", SND_SOC_NOPM, 0, 0, NULL, 0),
  867. SND_SOC_DAPM_MIXER("I034", SND_SOC_NOPM, 0, 0, NULL, 0),
  868. SND_SOC_DAPM_MIXER("I035", SND_SOC_NOPM, 0, 0, NULL, 0),
  869. SND_SOC_DAPM_MIXER("I036", SND_SOC_NOPM, 0, 0, NULL, 0),
  870. SND_SOC_DAPM_MIXER("I037", SND_SOC_NOPM, 0, 0, NULL, 0),
  871. /* DL11/DL8 */
  872. SND_SOC_DAPM_MIXER("I046", SND_SOC_NOPM, 0, 0, NULL, 0),
  873. SND_SOC_DAPM_MIXER("I047", SND_SOC_NOPM, 0, 0, NULL, 0),
  874. SND_SOC_DAPM_MIXER("I048", SND_SOC_NOPM, 0, 0, NULL, 0),
  875. SND_SOC_DAPM_MIXER("I049", SND_SOC_NOPM, 0, 0, NULL, 0),
  876. SND_SOC_DAPM_MIXER("I050", SND_SOC_NOPM, 0, 0, NULL, 0),
  877. SND_SOC_DAPM_MIXER("I051", SND_SOC_NOPM, 0, 0, NULL, 0),
  878. SND_SOC_DAPM_MIXER("I052", SND_SOC_NOPM, 0, 0, NULL, 0),
  879. SND_SOC_DAPM_MIXER("I053", SND_SOC_NOPM, 0, 0, NULL, 0),
  880. SND_SOC_DAPM_MIXER("I054", SND_SOC_NOPM, 0, 0, NULL, 0),
  881. SND_SOC_DAPM_MIXER("I055", SND_SOC_NOPM, 0, 0, NULL, 0),
  882. SND_SOC_DAPM_MIXER("I056", SND_SOC_NOPM, 0, 0, NULL, 0),
  883. SND_SOC_DAPM_MIXER("I057", SND_SOC_NOPM, 0, 0, NULL, 0),
  884. SND_SOC_DAPM_MIXER("I058", SND_SOC_NOPM, 0, 0, NULL, 0),
  885. SND_SOC_DAPM_MIXER("I059", SND_SOC_NOPM, 0, 0, NULL, 0),
  886. SND_SOC_DAPM_MIXER("I060", SND_SOC_NOPM, 0, 0, NULL, 0),
  887. SND_SOC_DAPM_MIXER("I061", SND_SOC_NOPM, 0, 0, NULL, 0),
  888. /* DL2 */
  889. SND_SOC_DAPM_MIXER("I070", SND_SOC_NOPM, 0, 0, NULL, 0),
  890. SND_SOC_DAPM_MIXER("I071", SND_SOC_NOPM, 0, 0, NULL, 0),
  891. SND_SOC_DAPM_MUX("DL8_DL11 Mux",
  892. SND_SOC_NOPM, 0, 0, &dl8_dl11_data_sel_mux),
  893. /* UL9 */
  894. SND_SOC_DAPM_MIXER("O002", SND_SOC_NOPM, 0, 0,
  895. o002_mix, ARRAY_SIZE(o002_mix)),
  896. SND_SOC_DAPM_MIXER("O003", SND_SOC_NOPM, 0, 0,
  897. o003_mix, ARRAY_SIZE(o003_mix)),
  898. SND_SOC_DAPM_MIXER("O004", SND_SOC_NOPM, 0, 0,
  899. o004_mix, ARRAY_SIZE(o004_mix)),
  900. SND_SOC_DAPM_MIXER("O005", SND_SOC_NOPM, 0, 0,
  901. o005_mix, ARRAY_SIZE(o005_mix)),
  902. SND_SOC_DAPM_MIXER("O006", SND_SOC_NOPM, 0, 0,
  903. o006_mix, ARRAY_SIZE(o006_mix)),
  904. SND_SOC_DAPM_MIXER("O007", SND_SOC_NOPM, 0, 0,
  905. o007_mix, ARRAY_SIZE(o007_mix)),
  906. SND_SOC_DAPM_MIXER("O008", SND_SOC_NOPM, 0, 0,
  907. o008_mix, ARRAY_SIZE(o008_mix)),
  908. SND_SOC_DAPM_MIXER("O009", SND_SOC_NOPM, 0, 0,
  909. o009_mix, ARRAY_SIZE(o009_mix)),
  910. SND_SOC_DAPM_MIXER("O010", SND_SOC_NOPM, 0, 0,
  911. o010_mix, ARRAY_SIZE(o010_mix)),
  912. SND_SOC_DAPM_MIXER("O011", SND_SOC_NOPM, 0, 0,
  913. o011_mix, ARRAY_SIZE(o011_mix)),
  914. SND_SOC_DAPM_MIXER("O012", SND_SOC_NOPM, 0, 0,
  915. o012_mix, ARRAY_SIZE(o012_mix)),
  916. SND_SOC_DAPM_MIXER("O013", SND_SOC_NOPM, 0, 0,
  917. o013_mix, ARRAY_SIZE(o013_mix)),
  918. SND_SOC_DAPM_MIXER("O014", SND_SOC_NOPM, 0, 0,
  919. o014_mix, ARRAY_SIZE(o014_mix)),
  920. SND_SOC_DAPM_MIXER("O015", SND_SOC_NOPM, 0, 0,
  921. o015_mix, ARRAY_SIZE(o015_mix)),
  922. SND_SOC_DAPM_MIXER("O016", SND_SOC_NOPM, 0, 0,
  923. o016_mix, ARRAY_SIZE(o016_mix)),
  924. SND_SOC_DAPM_MIXER("O017", SND_SOC_NOPM, 0, 0,
  925. o017_mix, ARRAY_SIZE(o017_mix)),
  926. SND_SOC_DAPM_MIXER("O018", SND_SOC_NOPM, 0, 0,
  927. o018_mix, ARRAY_SIZE(o018_mix)),
  928. SND_SOC_DAPM_MIXER("O019", SND_SOC_NOPM, 0, 0,
  929. o019_mix, ARRAY_SIZE(o019_mix)),
  930. SND_SOC_DAPM_MIXER("O020", SND_SOC_NOPM, 0, 0,
  931. o020_mix, ARRAY_SIZE(o020_mix)),
  932. SND_SOC_DAPM_MIXER("O021", SND_SOC_NOPM, 0, 0,
  933. o021_mix, ARRAY_SIZE(o021_mix)),
  934. SND_SOC_DAPM_MIXER("O022", SND_SOC_NOPM, 0, 0,
  935. o022_mix, ARRAY_SIZE(o022_mix)),
  936. SND_SOC_DAPM_MIXER("O023", SND_SOC_NOPM, 0, 0,
  937. o023_mix, ARRAY_SIZE(o023_mix)),
  938. SND_SOC_DAPM_MIXER("O024", SND_SOC_NOPM, 0, 0,
  939. o024_mix, ARRAY_SIZE(o024_mix)),
  940. SND_SOC_DAPM_MIXER("O025", SND_SOC_NOPM, 0, 0,
  941. o025_mix, ARRAY_SIZE(o025_mix)),
  942. SND_SOC_DAPM_MIXER("O026", SND_SOC_NOPM, 0, 0,
  943. o026_mix, ARRAY_SIZE(o026_mix)),
  944. SND_SOC_DAPM_MIXER("O027", SND_SOC_NOPM, 0, 0,
  945. o027_mix, ARRAY_SIZE(o027_mix)),
  946. SND_SOC_DAPM_MIXER("O028", SND_SOC_NOPM, 0, 0,
  947. o028_mix, ARRAY_SIZE(o028_mix)),
  948. SND_SOC_DAPM_MIXER("O029", SND_SOC_NOPM, 0, 0,
  949. o029_mix, ARRAY_SIZE(o029_mix)),
  950. SND_SOC_DAPM_MIXER("O030", SND_SOC_NOPM, 0, 0,
  951. o030_mix, ARRAY_SIZE(o030_mix)),
  952. SND_SOC_DAPM_MIXER("O031", SND_SOC_NOPM, 0, 0,
  953. o031_mix, ARRAY_SIZE(o031_mix)),
  954. SND_SOC_DAPM_MIXER("O032", SND_SOC_NOPM, 0, 0,
  955. o032_mix, ARRAY_SIZE(o032_mix)),
  956. SND_SOC_DAPM_MIXER("O033", SND_SOC_NOPM, 0, 0,
  957. o033_mix, ARRAY_SIZE(o033_mix)),
  958. /* UL4 */
  959. SND_SOC_DAPM_MIXER("O034", SND_SOC_NOPM, 0, 0,
  960. o034_mix, ARRAY_SIZE(o034_mix)),
  961. SND_SOC_DAPM_MIXER("O035", SND_SOC_NOPM, 0, 0,
  962. o035_mix, ARRAY_SIZE(o035_mix)),
  963. /* UL5 */
  964. SND_SOC_DAPM_MIXER("O036", SND_SOC_NOPM, 0, 0,
  965. o036_mix, ARRAY_SIZE(o036_mix)),
  966. SND_SOC_DAPM_MIXER("O037", SND_SOC_NOPM, 0, 0,
  967. o037_mix, ARRAY_SIZE(o037_mix)),
  968. /* UL10 */
  969. SND_SOC_DAPM_MIXER("O038", SND_SOC_NOPM, 0, 0,
  970. o038_mix, ARRAY_SIZE(o038_mix)),
  971. SND_SOC_DAPM_MIXER("O039", SND_SOC_NOPM, 0, 0,
  972. o039_mix, ARRAY_SIZE(o039_mix)),
  973. SND_SOC_DAPM_MIXER("O182", SND_SOC_NOPM, 0, 0,
  974. o182_mix, ARRAY_SIZE(o182_mix)),
  975. SND_SOC_DAPM_MIXER("O183", SND_SOC_NOPM, 0, 0,
  976. o183_mix, ARRAY_SIZE(o183_mix)),
  977. /* UL2 */
  978. SND_SOC_DAPM_MIXER("O040", SND_SOC_NOPM, 0, 0,
  979. o040_mix, ARRAY_SIZE(o040_mix)),
  980. SND_SOC_DAPM_MIXER("O041", SND_SOC_NOPM, 0, 0,
  981. o041_mix, ARRAY_SIZE(o041_mix)),
  982. SND_SOC_DAPM_MIXER("O042", SND_SOC_NOPM, 0, 0,
  983. o042_mix, ARRAY_SIZE(o042_mix)),
  984. SND_SOC_DAPM_MIXER("O043", SND_SOC_NOPM, 0, 0,
  985. o043_mix, ARRAY_SIZE(o043_mix)),
  986. SND_SOC_DAPM_MIXER("O044", SND_SOC_NOPM, 0, 0,
  987. o044_mix, ARRAY_SIZE(o044_mix)),
  988. SND_SOC_DAPM_MIXER("O045", SND_SOC_NOPM, 0, 0,
  989. o045_mix, ARRAY_SIZE(o045_mix)),
  990. SND_SOC_DAPM_MIXER("O046", SND_SOC_NOPM, 0, 0,
  991. o046_mix, ARRAY_SIZE(o046_mix)),
  992. SND_SOC_DAPM_MIXER("O047", SND_SOC_NOPM, 0, 0,
  993. o047_mix, ARRAY_SIZE(o047_mix)),
  994. };
  995. static const struct snd_soc_dapm_route mt8188_memif_routes[] = {
  996. {"I000", NULL, "DL6"},
  997. {"I001", NULL, "DL6"},
  998. {"I020", NULL, "DL3"},
  999. {"I021", NULL, "DL3"},
  1000. {"I022", NULL, "DL11"},
  1001. {"I023", NULL, "DL11"},
  1002. {"I024", NULL, "DL11"},
  1003. {"I025", NULL, "DL11"},
  1004. {"I026", NULL, "DL11"},
  1005. {"I027", NULL, "DL11"},
  1006. {"I028", NULL, "DL11"},
  1007. {"I029", NULL, "DL11"},
  1008. {"I030", NULL, "DL11"},
  1009. {"I031", NULL, "DL11"},
  1010. {"I032", NULL, "DL11"},
  1011. {"I033", NULL, "DL11"},
  1012. {"I034", NULL, "DL11"},
  1013. {"I035", NULL, "DL11"},
  1014. {"I036", NULL, "DL11"},
  1015. {"I037", NULL, "DL11"},
  1016. {"DL8_DL11 Mux", "dl8", "DL8"},
  1017. {"DL8_DL11 Mux", "dl11", "DL11"},
  1018. {"I046", NULL, "DL8_DL11 Mux"},
  1019. {"I047", NULL, "DL8_DL11 Mux"},
  1020. {"I048", NULL, "DL8_DL11 Mux"},
  1021. {"I049", NULL, "DL8_DL11 Mux"},
  1022. {"I050", NULL, "DL8_DL11 Mux"},
  1023. {"I051", NULL, "DL8_DL11 Mux"},
  1024. {"I052", NULL, "DL8_DL11 Mux"},
  1025. {"I053", NULL, "DL8_DL11 Mux"},
  1026. {"I054", NULL, "DL8_DL11 Mux"},
  1027. {"I055", NULL, "DL8_DL11 Mux"},
  1028. {"I056", NULL, "DL8_DL11 Mux"},
  1029. {"I057", NULL, "DL8_DL11 Mux"},
  1030. {"I058", NULL, "DL8_DL11 Mux"},
  1031. {"I059", NULL, "DL8_DL11 Mux"},
  1032. {"I060", NULL, "DL8_DL11 Mux"},
  1033. {"I061", NULL, "DL8_DL11 Mux"},
  1034. {"I070", NULL, "DL2"},
  1035. {"I071", NULL, "DL2"},
  1036. {"UL9", NULL, "O002"},
  1037. {"UL9", NULL, "O003"},
  1038. {"UL9", NULL, "O004"},
  1039. {"UL9", NULL, "O005"},
  1040. {"UL9", NULL, "O006"},
  1041. {"UL9", NULL, "O007"},
  1042. {"UL9", NULL, "O008"},
  1043. {"UL9", NULL, "O009"},
  1044. {"UL9", NULL, "O010"},
  1045. {"UL9", NULL, "O011"},
  1046. {"UL9", NULL, "O012"},
  1047. {"UL9", NULL, "O013"},
  1048. {"UL9", NULL, "O014"},
  1049. {"UL9", NULL, "O015"},
  1050. {"UL9", NULL, "O016"},
  1051. {"UL9", NULL, "O017"},
  1052. {"UL9", NULL, "O018"},
  1053. {"UL9", NULL, "O019"},
  1054. {"UL9", NULL, "O020"},
  1055. {"UL9", NULL, "O021"},
  1056. {"UL9", NULL, "O022"},
  1057. {"UL9", NULL, "O023"},
  1058. {"UL9", NULL, "O024"},
  1059. {"UL9", NULL, "O025"},
  1060. {"UL9", NULL, "O026"},
  1061. {"UL9", NULL, "O027"},
  1062. {"UL9", NULL, "O028"},
  1063. {"UL9", NULL, "O029"},
  1064. {"UL9", NULL, "O030"},
  1065. {"UL9", NULL, "O031"},
  1066. {"UL9", NULL, "O032"},
  1067. {"UL9", NULL, "O033"},
  1068. {"UL4", NULL, "O034"},
  1069. {"UL4", NULL, "O035"},
  1070. {"UL5", NULL, "O036"},
  1071. {"UL5", NULL, "O037"},
  1072. {"UL10", NULL, "O038"},
  1073. {"UL10", NULL, "O039"},
  1074. {"UL10", NULL, "O182"},
  1075. {"UL10", NULL, "O183"},
  1076. {"UL2", NULL, "O040"},
  1077. {"UL2", NULL, "O041"},
  1078. {"UL2", NULL, "O042"},
  1079. {"UL2", NULL, "O043"},
  1080. {"UL2", NULL, "O044"},
  1081. {"UL2", NULL, "O045"},
  1082. {"UL2", NULL, "O046"},
  1083. {"UL2", NULL, "O047"},
  1084. {"O004", "I000 Switch", "I000"},
  1085. {"O005", "I001 Switch", "I001"},
  1086. {"O006", "I000 Switch", "I000"},
  1087. {"O007", "I001 Switch", "I001"},
  1088. {"O010", "I022 Switch", "I022"},
  1089. {"O011", "I023 Switch", "I023"},
  1090. {"O012", "I024 Switch", "I024"},
  1091. {"O013", "I025 Switch", "I025"},
  1092. {"O014", "I026 Switch", "I026"},
  1093. {"O015", "I027 Switch", "I027"},
  1094. {"O016", "I028 Switch", "I028"},
  1095. {"O017", "I029 Switch", "I029"},
  1096. {"O010", "I046 Switch", "I046"},
  1097. {"O011", "I047 Switch", "I047"},
  1098. {"O012", "I048 Switch", "I048"},
  1099. {"O013", "I049 Switch", "I049"},
  1100. {"O014", "I050 Switch", "I050"},
  1101. {"O015", "I051 Switch", "I051"},
  1102. {"O016", "I052 Switch", "I052"},
  1103. {"O017", "I053 Switch", "I053"},
  1104. {"O002", "I022 Switch", "I022"},
  1105. {"O003", "I023 Switch", "I023"},
  1106. {"O004", "I024 Switch", "I024"},
  1107. {"O005", "I025 Switch", "I025"},
  1108. {"O006", "I026 Switch", "I026"},
  1109. {"O007", "I027 Switch", "I027"},
  1110. {"O008", "I028 Switch", "I028"},
  1111. {"O009", "I029 Switch", "I029"},
  1112. {"O010", "I030 Switch", "I030"},
  1113. {"O011", "I031 Switch", "I031"},
  1114. {"O012", "I032 Switch", "I032"},
  1115. {"O013", "I033 Switch", "I033"},
  1116. {"O014", "I034 Switch", "I034"},
  1117. {"O015", "I035 Switch", "I035"},
  1118. {"O016", "I036 Switch", "I036"},
  1119. {"O017", "I037 Switch", "I037"},
  1120. {"O026", "I046 Switch", "I046"},
  1121. {"O027", "I047 Switch", "I047"},
  1122. {"O028", "I048 Switch", "I048"},
  1123. {"O029", "I049 Switch", "I049"},
  1124. {"O030", "I050 Switch", "I050"},
  1125. {"O031", "I051 Switch", "I051"},
  1126. {"O032", "I052 Switch", "I052"},
  1127. {"O033", "I053 Switch", "I053"},
  1128. {"O002", "I000 Switch", "I000"},
  1129. {"O003", "I001 Switch", "I001"},
  1130. {"O002", "I020 Switch", "I020"},
  1131. {"O003", "I021 Switch", "I021"},
  1132. {"O002", "I070 Switch", "I070"},
  1133. {"O003", "I071 Switch", "I071"},
  1134. {"O034", "I000 Switch", "I000"},
  1135. {"O035", "I001 Switch", "I001"},
  1136. {"O034", "I002 Switch", "I002"},
  1137. {"O035", "I003 Switch", "I003"},
  1138. {"O034", "I012 Switch", "I012"},
  1139. {"O035", "I013 Switch", "I013"},
  1140. {"O034", "I020 Switch", "I020"},
  1141. {"O035", "I021 Switch", "I021"},
  1142. {"O034", "I070 Switch", "I070"},
  1143. {"O035", "I071 Switch", "I071"},
  1144. {"O034", "I072 Switch", "I072"},
  1145. {"O035", "I073 Switch", "I073"},
  1146. {"O036", "I000 Switch", "I000"},
  1147. {"O037", "I001 Switch", "I001"},
  1148. {"O036", "I012 Switch", "I012"},
  1149. {"O037", "I013 Switch", "I013"},
  1150. {"O036", "I020 Switch", "I020"},
  1151. {"O037", "I021 Switch", "I021"},
  1152. {"O036", "I070 Switch", "I070"},
  1153. {"O037", "I071 Switch", "I071"},
  1154. {"O036", "I168 Switch", "I168"},
  1155. {"O037", "I169 Switch", "I169"},
  1156. {"O038", "I022 Switch", "I022"},
  1157. {"O039", "I023 Switch", "I023"},
  1158. {"O182", "I024 Switch", "I024"},
  1159. {"O183", "I025 Switch", "I025"},
  1160. {"O038", "I168 Switch", "I168"},
  1161. {"O039", "I169 Switch", "I169"},
  1162. {"O182", "I020 Switch", "I020"},
  1163. {"O183", "I021 Switch", "I021"},
  1164. {"O182", "I022 Switch", "I022"},
  1165. {"O183", "I023 Switch", "I023"},
  1166. {"O040", "I022 Switch", "I022"},
  1167. {"O041", "I023 Switch", "I023"},
  1168. {"O042", "I024 Switch", "I024"},
  1169. {"O043", "I025 Switch", "I025"},
  1170. {"O044", "I026 Switch", "I026"},
  1171. {"O045", "I027 Switch", "I027"},
  1172. {"O046", "I028 Switch", "I028"},
  1173. {"O047", "I029 Switch", "I029"},
  1174. {"O040", "I002 Switch", "I002"},
  1175. {"O041", "I003 Switch", "I003"},
  1176. {"O002", "I012 Switch", "I012"},
  1177. {"O003", "I013 Switch", "I013"},
  1178. {"O004", "I014 Switch", "I014"},
  1179. {"O005", "I015 Switch", "I015"},
  1180. {"O006", "I016 Switch", "I016"},
  1181. {"O007", "I017 Switch", "I017"},
  1182. {"O008", "I018 Switch", "I018"},
  1183. {"O009", "I019 Switch", "I019"},
  1184. {"O010", "I188 Switch", "I188"},
  1185. {"O011", "I189 Switch", "I189"},
  1186. {"O012", "I190 Switch", "I190"},
  1187. {"O013", "I191 Switch", "I191"},
  1188. {"O014", "I192 Switch", "I192"},
  1189. {"O015", "I193 Switch", "I193"},
  1190. {"O016", "I194 Switch", "I194"},
  1191. {"O017", "I195 Switch", "I195"},
  1192. {"O040", "I012 Switch", "I012"},
  1193. {"O041", "I013 Switch", "I013"},
  1194. {"O042", "I014 Switch", "I014"},
  1195. {"O043", "I015 Switch", "I015"},
  1196. {"O044", "I016 Switch", "I016"},
  1197. {"O045", "I017 Switch", "I017"},
  1198. {"O046", "I018 Switch", "I018"},
  1199. {"O047", "I019 Switch", "I019"},
  1200. {"O002", "I072 Switch", "I072"},
  1201. {"O003", "I073 Switch", "I073"},
  1202. {"O004", "I074 Switch", "I074"},
  1203. {"O005", "I075 Switch", "I075"},
  1204. {"O006", "I076 Switch", "I076"},
  1205. {"O007", "I077 Switch", "I077"},
  1206. {"O008", "I078 Switch", "I078"},
  1207. {"O009", "I079 Switch", "I079"},
  1208. {"O010", "I080 Switch", "I080"},
  1209. {"O011", "I081 Switch", "I081"},
  1210. {"O012", "I082 Switch", "I082"},
  1211. {"O013", "I083 Switch", "I083"},
  1212. {"O014", "I084 Switch", "I084"},
  1213. {"O015", "I085 Switch", "I085"},
  1214. {"O016", "I086 Switch", "I086"},
  1215. {"O017", "I087 Switch", "I087"},
  1216. {"O010", "I072 Switch", "I072"},
  1217. {"O011", "I073 Switch", "I073"},
  1218. {"O012", "I074 Switch", "I074"},
  1219. {"O013", "I075 Switch", "I075"},
  1220. {"O014", "I076 Switch", "I076"},
  1221. {"O015", "I077 Switch", "I077"},
  1222. {"O016", "I078 Switch", "I078"},
  1223. {"O017", "I079 Switch", "I079"},
  1224. {"O018", "I080 Switch", "I080"},
  1225. {"O019", "I081 Switch", "I081"},
  1226. {"O020", "I082 Switch", "I082"},
  1227. {"O021", "I083 Switch", "I083"},
  1228. {"O022", "I084 Switch", "I084"},
  1229. {"O023", "I085 Switch", "I085"},
  1230. {"O024", "I086 Switch", "I086"},
  1231. {"O025", "I087 Switch", "I087"},
  1232. {"O002", "I168 Switch", "I168"},
  1233. {"O003", "I169 Switch", "I169"},
  1234. {"O034", "I168 Switch", "I168"},
  1235. {"O035", "I168 Switch", "I168"},
  1236. {"O035", "I169 Switch", "I169"},
  1237. {"O040", "I168 Switch", "I168"},
  1238. {"O041", "I169 Switch", "I169"},
  1239. };
  1240. static const char * const mt8188_afe_1x_en_sel_text[] = {
  1241. "a1sys_a2sys", "a3sys", "a4sys",
  1242. };
  1243. static const unsigned int mt8188_afe_1x_en_sel_values[] = {
  1244. 0, 1, 2,
  1245. };
  1246. static SOC_VALUE_ENUM_SINGLE_DECL(dl2_1x_en_sel_enum,
  1247. A3_A4_TIMING_SEL1, 18, 0x3,
  1248. mt8188_afe_1x_en_sel_text,
  1249. mt8188_afe_1x_en_sel_values);
  1250. static SOC_VALUE_ENUM_SINGLE_DECL(dl3_1x_en_sel_enum,
  1251. A3_A4_TIMING_SEL1, 20, 0x3,
  1252. mt8188_afe_1x_en_sel_text,
  1253. mt8188_afe_1x_en_sel_values);
  1254. static SOC_VALUE_ENUM_SINGLE_DECL(dl6_1x_en_sel_enum,
  1255. A3_A4_TIMING_SEL1, 22, 0x3,
  1256. mt8188_afe_1x_en_sel_text,
  1257. mt8188_afe_1x_en_sel_values);
  1258. static SOC_VALUE_ENUM_SINGLE_DECL(dl7_1x_en_sel_enum,
  1259. A3_A4_TIMING_SEL1, 24, 0x3,
  1260. mt8188_afe_1x_en_sel_text,
  1261. mt8188_afe_1x_en_sel_values);
  1262. static SOC_VALUE_ENUM_SINGLE_DECL(dl8_1x_en_sel_enum,
  1263. A3_A4_TIMING_SEL1, 26, 0x3,
  1264. mt8188_afe_1x_en_sel_text,
  1265. mt8188_afe_1x_en_sel_values);
  1266. static SOC_VALUE_ENUM_SINGLE_DECL(dl10_1x_en_sel_enum,
  1267. A3_A4_TIMING_SEL1, 28, 0x3,
  1268. mt8188_afe_1x_en_sel_text,
  1269. mt8188_afe_1x_en_sel_values);
  1270. static SOC_VALUE_ENUM_SINGLE_DECL(dl11_1x_en_sel_enum,
  1271. A3_A4_TIMING_SEL1, 30, 0x3,
  1272. mt8188_afe_1x_en_sel_text,
  1273. mt8188_afe_1x_en_sel_values);
  1274. static SOC_VALUE_ENUM_SINGLE_DECL(ul1_1x_en_sel_enum,
  1275. A3_A4_TIMING_SEL1, 0, 0x3,
  1276. mt8188_afe_1x_en_sel_text,
  1277. mt8188_afe_1x_en_sel_values);
  1278. static SOC_VALUE_ENUM_SINGLE_DECL(ul2_1x_en_sel_enum,
  1279. A3_A4_TIMING_SEL1, 2, 0x3,
  1280. mt8188_afe_1x_en_sel_text,
  1281. mt8188_afe_1x_en_sel_values);
  1282. static SOC_VALUE_ENUM_SINGLE_DECL(ul3_1x_en_sel_enum,
  1283. A3_A4_TIMING_SEL1, 4, 0x3,
  1284. mt8188_afe_1x_en_sel_text,
  1285. mt8188_afe_1x_en_sel_values);
  1286. static SOC_VALUE_ENUM_SINGLE_DECL(ul4_1x_en_sel_enum,
  1287. A3_A4_TIMING_SEL1, 6, 0x3,
  1288. mt8188_afe_1x_en_sel_text,
  1289. mt8188_afe_1x_en_sel_values);
  1290. static SOC_VALUE_ENUM_SINGLE_DECL(ul5_1x_en_sel_enum,
  1291. A3_A4_TIMING_SEL1, 8, 0x3,
  1292. mt8188_afe_1x_en_sel_text,
  1293. mt8188_afe_1x_en_sel_values);
  1294. static SOC_VALUE_ENUM_SINGLE_DECL(ul6_1x_en_sel_enum,
  1295. A3_A4_TIMING_SEL1, 10, 0x3,
  1296. mt8188_afe_1x_en_sel_text,
  1297. mt8188_afe_1x_en_sel_values);
  1298. static SOC_VALUE_ENUM_SINGLE_DECL(ul8_1x_en_sel_enum,
  1299. A3_A4_TIMING_SEL1, 12, 0x3,
  1300. mt8188_afe_1x_en_sel_text,
  1301. mt8188_afe_1x_en_sel_values);
  1302. static SOC_VALUE_ENUM_SINGLE_DECL(ul9_1x_en_sel_enum,
  1303. A3_A4_TIMING_SEL1, 14, 0x3,
  1304. mt8188_afe_1x_en_sel_text,
  1305. mt8188_afe_1x_en_sel_values);
  1306. static SOC_VALUE_ENUM_SINGLE_DECL(ul10_1x_en_sel_enum,
  1307. A3_A4_TIMING_SEL1, 16, 0x3,
  1308. mt8188_afe_1x_en_sel_text,
  1309. mt8188_afe_1x_en_sel_values);
  1310. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq1_1x_en_sel_enum,
  1311. A3_A4_TIMING_SEL6, 0, 0x3,
  1312. mt8188_afe_1x_en_sel_text,
  1313. mt8188_afe_1x_en_sel_values);
  1314. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq2_1x_en_sel_enum,
  1315. A3_A4_TIMING_SEL6, 2, 0x3,
  1316. mt8188_afe_1x_en_sel_text,
  1317. mt8188_afe_1x_en_sel_values);
  1318. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq3_1x_en_sel_enum,
  1319. A3_A4_TIMING_SEL6, 4, 0x3,
  1320. mt8188_afe_1x_en_sel_text,
  1321. mt8188_afe_1x_en_sel_values);
  1322. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq4_1x_en_sel_enum,
  1323. A3_A4_TIMING_SEL6, 6, 0x3,
  1324. mt8188_afe_1x_en_sel_text,
  1325. mt8188_afe_1x_en_sel_values);
  1326. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq5_1x_en_sel_enum,
  1327. A3_A4_TIMING_SEL6, 8, 0x3,
  1328. mt8188_afe_1x_en_sel_text,
  1329. mt8188_afe_1x_en_sel_values);
  1330. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq6_1x_en_sel_enum,
  1331. A3_A4_TIMING_SEL6, 10, 0x3,
  1332. mt8188_afe_1x_en_sel_text,
  1333. mt8188_afe_1x_en_sel_values);
  1334. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq7_1x_en_sel_enum,
  1335. A3_A4_TIMING_SEL6, 12, 0x3,
  1336. mt8188_afe_1x_en_sel_text,
  1337. mt8188_afe_1x_en_sel_values);
  1338. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq8_1x_en_sel_enum,
  1339. A3_A4_TIMING_SEL6, 14, 0x3,
  1340. mt8188_afe_1x_en_sel_text,
  1341. mt8188_afe_1x_en_sel_values);
  1342. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq9_1x_en_sel_enum,
  1343. A3_A4_TIMING_SEL6, 16, 0x3,
  1344. mt8188_afe_1x_en_sel_text,
  1345. mt8188_afe_1x_en_sel_values);
  1346. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq10_1x_en_sel_enum,
  1347. A3_A4_TIMING_SEL6, 18, 0x3,
  1348. mt8188_afe_1x_en_sel_text,
  1349. mt8188_afe_1x_en_sel_values);
  1350. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq11_1x_en_sel_enum,
  1351. A3_A4_TIMING_SEL6, 20, 0x3,
  1352. mt8188_afe_1x_en_sel_text,
  1353. mt8188_afe_1x_en_sel_values);
  1354. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq12_1x_en_sel_enum,
  1355. A3_A4_TIMING_SEL6, 22, 0x3,
  1356. mt8188_afe_1x_en_sel_text,
  1357. mt8188_afe_1x_en_sel_values);
  1358. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq13_1x_en_sel_enum,
  1359. A3_A4_TIMING_SEL6, 24, 0x3,
  1360. mt8188_afe_1x_en_sel_text,
  1361. mt8188_afe_1x_en_sel_values);
  1362. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq14_1x_en_sel_enum,
  1363. A3_A4_TIMING_SEL6, 26, 0x3,
  1364. mt8188_afe_1x_en_sel_text,
  1365. mt8188_afe_1x_en_sel_values);
  1366. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq15_1x_en_sel_enum,
  1367. A3_A4_TIMING_SEL6, 28, 0x3,
  1368. mt8188_afe_1x_en_sel_text,
  1369. mt8188_afe_1x_en_sel_values);
  1370. static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq16_1x_en_sel_enum,
  1371. A3_A4_TIMING_SEL6, 30, 0x3,
  1372. mt8188_afe_1x_en_sel_text,
  1373. mt8188_afe_1x_en_sel_values);
  1374. static const char * const mt8188_afe_fs_timing_sel_text[] = {
  1375. "asys",
  1376. "etdmout1_1x_en",
  1377. "etdmout2_1x_en",
  1378. "etdmout3_1x_en",
  1379. "etdmin1_1x_en",
  1380. "etdmin2_1x_en",
  1381. "etdmin1_nx_en",
  1382. "etdmin2_nx_en",
  1383. };
  1384. static const unsigned int mt8188_afe_fs_timing_sel_values[] = {
  1385. 0,
  1386. MT8188_ETDM_OUT1_1X_EN,
  1387. MT8188_ETDM_OUT2_1X_EN,
  1388. MT8188_ETDM_OUT3_1X_EN,
  1389. MT8188_ETDM_IN1_1X_EN,
  1390. MT8188_ETDM_IN2_1X_EN,
  1391. MT8188_ETDM_IN1_NX_EN,
  1392. MT8188_ETDM_IN2_NX_EN,
  1393. };
  1394. static SOC_VALUE_ENUM_SINGLE_DECL(dl2_fs_timing_sel_enum,
  1395. SND_SOC_NOPM, 0, 0,
  1396. mt8188_afe_fs_timing_sel_text,
  1397. mt8188_afe_fs_timing_sel_values);
  1398. static SOC_VALUE_ENUM_SINGLE_DECL(dl3_fs_timing_sel_enum,
  1399. SND_SOC_NOPM, 0, 0,
  1400. mt8188_afe_fs_timing_sel_text,
  1401. mt8188_afe_fs_timing_sel_values);
  1402. static SOC_VALUE_ENUM_SINGLE_DECL(dl6_fs_timing_sel_enum,
  1403. SND_SOC_NOPM, 0, 0,
  1404. mt8188_afe_fs_timing_sel_text,
  1405. mt8188_afe_fs_timing_sel_values);
  1406. static SOC_VALUE_ENUM_SINGLE_DECL(dl8_fs_timing_sel_enum,
  1407. SND_SOC_NOPM, 0, 0,
  1408. mt8188_afe_fs_timing_sel_text,
  1409. mt8188_afe_fs_timing_sel_values);
  1410. static SOC_VALUE_ENUM_SINGLE_DECL(dl11_fs_timing_sel_enum,
  1411. SND_SOC_NOPM, 0, 0,
  1412. mt8188_afe_fs_timing_sel_text,
  1413. mt8188_afe_fs_timing_sel_values);
  1414. static SOC_VALUE_ENUM_SINGLE_DECL(ul2_fs_timing_sel_enum,
  1415. SND_SOC_NOPM, 0, 0,
  1416. mt8188_afe_fs_timing_sel_text,
  1417. mt8188_afe_fs_timing_sel_values);
  1418. static SOC_VALUE_ENUM_SINGLE_DECL(ul4_fs_timing_sel_enum,
  1419. SND_SOC_NOPM, 0, 0,
  1420. mt8188_afe_fs_timing_sel_text,
  1421. mt8188_afe_fs_timing_sel_values);
  1422. static SOC_VALUE_ENUM_SINGLE_DECL(ul5_fs_timing_sel_enum,
  1423. SND_SOC_NOPM, 0, 0,
  1424. mt8188_afe_fs_timing_sel_text,
  1425. mt8188_afe_fs_timing_sel_values);
  1426. static SOC_VALUE_ENUM_SINGLE_DECL(ul9_fs_timing_sel_enum,
  1427. SND_SOC_NOPM, 0, 0,
  1428. mt8188_afe_fs_timing_sel_text,
  1429. mt8188_afe_fs_timing_sel_values);
  1430. static SOC_VALUE_ENUM_SINGLE_DECL(ul10_fs_timing_sel_enum,
  1431. SND_SOC_NOPM, 0, 0,
  1432. mt8188_afe_fs_timing_sel_text,
  1433. mt8188_afe_fs_timing_sel_values);
  1434. static int mt8188_memif_1x_en_sel_put(struct snd_kcontrol *kcontrol,
  1435. struct snd_ctl_elem_value *ucontrol)
  1436. {
  1437. struct snd_soc_component *component =
  1438. snd_soc_kcontrol_component(kcontrol);
  1439. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  1440. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1441. struct mtk_dai_memif_priv *memif_priv;
  1442. unsigned int dai_id = kcontrol->id.device;
  1443. long val = ucontrol->value.integer.value[0];
  1444. int ret = 0;
  1445. memif_priv = afe_priv->dai_priv[dai_id];
  1446. if (val == memif_priv->asys_timing_sel)
  1447. return 0;
  1448. ret = snd_soc_put_enum_double(kcontrol, ucontrol);
  1449. memif_priv->asys_timing_sel = val;
  1450. return ret;
  1451. }
  1452. static int mt8188_asys_irq_1x_en_sel_put(struct snd_kcontrol *kcontrol,
  1453. struct snd_ctl_elem_value *ucontrol)
  1454. {
  1455. struct snd_soc_component *component =
  1456. snd_soc_kcontrol_component(kcontrol);
  1457. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  1458. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1459. unsigned int id = kcontrol->id.device;
  1460. long val = ucontrol->value.integer.value[0];
  1461. int ret = 0;
  1462. if (val == afe_priv->irq_priv[id].asys_timing_sel)
  1463. return 0;
  1464. ret = snd_soc_put_enum_double(kcontrol, ucontrol);
  1465. afe_priv->irq_priv[id].asys_timing_sel = val;
  1466. return ret;
  1467. }
  1468. static int mt8188_memif_fs_timing_sel_get(struct snd_kcontrol *kcontrol,
  1469. struct snd_ctl_elem_value *ucontrol)
  1470. {
  1471. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  1472. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  1473. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1474. struct mtk_dai_memif_priv *memif_priv;
  1475. unsigned int dai_id = kcontrol->id.device;
  1476. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  1477. memif_priv = afe_priv->dai_priv[dai_id];
  1478. ucontrol->value.enumerated.item[0] =
  1479. snd_soc_enum_val_to_item(e, memif_priv->fs_timing);
  1480. return 0;
  1481. }
  1482. static int mt8188_memif_fs_timing_sel_put(struct snd_kcontrol *kcontrol,
  1483. struct snd_ctl_elem_value *ucontrol)
  1484. {
  1485. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  1486. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  1487. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  1488. struct mtk_dai_memif_priv *memif_priv;
  1489. unsigned int dai_id = kcontrol->id.device;
  1490. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  1491. unsigned int *item = ucontrol->value.enumerated.item;
  1492. unsigned int prev_item = 0;
  1493. if (item[0] >= e->items)
  1494. return -EINVAL;
  1495. memif_priv = afe_priv->dai_priv[dai_id];
  1496. prev_item = snd_soc_enum_val_to_item(e, memif_priv->fs_timing);
  1497. if (item[0] == prev_item)
  1498. return 0;
  1499. memif_priv->fs_timing = snd_soc_enum_item_to_val(e, item[0]);
  1500. return 1;
  1501. }
  1502. static const struct snd_kcontrol_new mt8188_memif_controls[] = {
  1503. MT8188_SOC_ENUM_EXT("dl2_1x_en_sel",
  1504. dl2_1x_en_sel_enum,
  1505. snd_soc_get_enum_double,
  1506. mt8188_memif_1x_en_sel_put,
  1507. MT8188_AFE_MEMIF_DL2),
  1508. MT8188_SOC_ENUM_EXT("dl3_1x_en_sel",
  1509. dl3_1x_en_sel_enum,
  1510. snd_soc_get_enum_double,
  1511. mt8188_memif_1x_en_sel_put,
  1512. MT8188_AFE_MEMIF_DL3),
  1513. MT8188_SOC_ENUM_EXT("dl6_1x_en_sel",
  1514. dl6_1x_en_sel_enum,
  1515. snd_soc_get_enum_double,
  1516. mt8188_memif_1x_en_sel_put,
  1517. MT8188_AFE_MEMIF_DL6),
  1518. MT8188_SOC_ENUM_EXT("dl7_1x_en_sel",
  1519. dl7_1x_en_sel_enum,
  1520. snd_soc_get_enum_double,
  1521. mt8188_memif_1x_en_sel_put,
  1522. MT8188_AFE_MEMIF_DL7),
  1523. MT8188_SOC_ENUM_EXT("dl8_1x_en_sel",
  1524. dl8_1x_en_sel_enum,
  1525. snd_soc_get_enum_double,
  1526. mt8188_memif_1x_en_sel_put,
  1527. MT8188_AFE_MEMIF_DL8),
  1528. MT8188_SOC_ENUM_EXT("dl10_1x_en_sel",
  1529. dl10_1x_en_sel_enum,
  1530. snd_soc_get_enum_double,
  1531. mt8188_memif_1x_en_sel_put,
  1532. MT8188_AFE_MEMIF_DL10),
  1533. MT8188_SOC_ENUM_EXT("dl11_1x_en_sel",
  1534. dl11_1x_en_sel_enum,
  1535. snd_soc_get_enum_double,
  1536. mt8188_memif_1x_en_sel_put,
  1537. MT8188_AFE_MEMIF_DL11),
  1538. MT8188_SOC_ENUM_EXT("ul1_1x_en_sel",
  1539. ul1_1x_en_sel_enum,
  1540. snd_soc_get_enum_double,
  1541. mt8188_memif_1x_en_sel_put,
  1542. MT8188_AFE_MEMIF_UL1),
  1543. MT8188_SOC_ENUM_EXT("ul2_1x_en_sel",
  1544. ul2_1x_en_sel_enum,
  1545. snd_soc_get_enum_double,
  1546. mt8188_memif_1x_en_sel_put,
  1547. MT8188_AFE_MEMIF_UL2),
  1548. MT8188_SOC_ENUM_EXT("ul3_1x_en_sel",
  1549. ul3_1x_en_sel_enum,
  1550. snd_soc_get_enum_double,
  1551. mt8188_memif_1x_en_sel_put,
  1552. MT8188_AFE_MEMIF_UL3),
  1553. MT8188_SOC_ENUM_EXT("ul4_1x_en_sel",
  1554. ul4_1x_en_sel_enum,
  1555. snd_soc_get_enum_double,
  1556. mt8188_memif_1x_en_sel_put,
  1557. MT8188_AFE_MEMIF_UL4),
  1558. MT8188_SOC_ENUM_EXT("ul5_1x_en_sel",
  1559. ul5_1x_en_sel_enum,
  1560. snd_soc_get_enum_double,
  1561. mt8188_memif_1x_en_sel_put,
  1562. MT8188_AFE_MEMIF_UL5),
  1563. MT8188_SOC_ENUM_EXT("ul6_1x_en_sel",
  1564. ul6_1x_en_sel_enum,
  1565. snd_soc_get_enum_double,
  1566. mt8188_memif_1x_en_sel_put,
  1567. MT8188_AFE_MEMIF_UL6),
  1568. MT8188_SOC_ENUM_EXT("ul8_1x_en_sel",
  1569. ul8_1x_en_sel_enum,
  1570. snd_soc_get_enum_double,
  1571. mt8188_memif_1x_en_sel_put,
  1572. MT8188_AFE_MEMIF_UL8),
  1573. MT8188_SOC_ENUM_EXT("ul9_1x_en_sel",
  1574. ul9_1x_en_sel_enum,
  1575. snd_soc_get_enum_double,
  1576. mt8188_memif_1x_en_sel_put,
  1577. MT8188_AFE_MEMIF_UL9),
  1578. MT8188_SOC_ENUM_EXT("ul10_1x_en_sel",
  1579. ul10_1x_en_sel_enum,
  1580. snd_soc_get_enum_double,
  1581. mt8188_memif_1x_en_sel_put,
  1582. MT8188_AFE_MEMIF_UL10),
  1583. MT8188_SOC_ENUM_EXT("asys_irq1_1x_en_sel",
  1584. asys_irq1_1x_en_sel_enum,
  1585. snd_soc_get_enum_double,
  1586. mt8188_asys_irq_1x_en_sel_put,
  1587. MT8188_AFE_IRQ_13),
  1588. MT8188_SOC_ENUM_EXT("asys_irq2_1x_en_sel",
  1589. asys_irq2_1x_en_sel_enum,
  1590. snd_soc_get_enum_double,
  1591. mt8188_asys_irq_1x_en_sel_put,
  1592. MT8188_AFE_IRQ_14),
  1593. MT8188_SOC_ENUM_EXT("asys_irq3_1x_en_sel",
  1594. asys_irq3_1x_en_sel_enum,
  1595. snd_soc_get_enum_double,
  1596. mt8188_asys_irq_1x_en_sel_put,
  1597. MT8188_AFE_IRQ_15),
  1598. MT8188_SOC_ENUM_EXT("asys_irq4_1x_en_sel",
  1599. asys_irq4_1x_en_sel_enum,
  1600. snd_soc_get_enum_double,
  1601. mt8188_asys_irq_1x_en_sel_put,
  1602. MT8188_AFE_IRQ_16),
  1603. MT8188_SOC_ENUM_EXT("asys_irq5_1x_en_sel",
  1604. asys_irq5_1x_en_sel_enum,
  1605. snd_soc_get_enum_double,
  1606. mt8188_asys_irq_1x_en_sel_put,
  1607. MT8188_AFE_IRQ_17),
  1608. MT8188_SOC_ENUM_EXT("asys_irq6_1x_en_sel",
  1609. asys_irq6_1x_en_sel_enum,
  1610. snd_soc_get_enum_double,
  1611. mt8188_asys_irq_1x_en_sel_put,
  1612. MT8188_AFE_IRQ_18),
  1613. MT8188_SOC_ENUM_EXT("asys_irq7_1x_en_sel",
  1614. asys_irq7_1x_en_sel_enum,
  1615. snd_soc_get_enum_double,
  1616. mt8188_asys_irq_1x_en_sel_put,
  1617. MT8188_AFE_IRQ_19),
  1618. MT8188_SOC_ENUM_EXT("asys_irq8_1x_en_sel",
  1619. asys_irq8_1x_en_sel_enum,
  1620. snd_soc_get_enum_double,
  1621. mt8188_asys_irq_1x_en_sel_put,
  1622. MT8188_AFE_IRQ_20),
  1623. MT8188_SOC_ENUM_EXT("asys_irq9_1x_en_sel",
  1624. asys_irq9_1x_en_sel_enum,
  1625. snd_soc_get_enum_double,
  1626. mt8188_asys_irq_1x_en_sel_put,
  1627. MT8188_AFE_IRQ_21),
  1628. MT8188_SOC_ENUM_EXT("asys_irq10_1x_en_sel",
  1629. asys_irq10_1x_en_sel_enum,
  1630. snd_soc_get_enum_double,
  1631. mt8188_asys_irq_1x_en_sel_put,
  1632. MT8188_AFE_IRQ_22),
  1633. MT8188_SOC_ENUM_EXT("asys_irq11_1x_en_sel",
  1634. asys_irq11_1x_en_sel_enum,
  1635. snd_soc_get_enum_double,
  1636. mt8188_asys_irq_1x_en_sel_put,
  1637. MT8188_AFE_IRQ_23),
  1638. MT8188_SOC_ENUM_EXT("asys_irq12_1x_en_sel",
  1639. asys_irq12_1x_en_sel_enum,
  1640. snd_soc_get_enum_double,
  1641. mt8188_asys_irq_1x_en_sel_put,
  1642. MT8188_AFE_IRQ_24),
  1643. MT8188_SOC_ENUM_EXT("asys_irq13_1x_en_sel",
  1644. asys_irq13_1x_en_sel_enum,
  1645. snd_soc_get_enum_double,
  1646. mt8188_asys_irq_1x_en_sel_put,
  1647. MT8188_AFE_IRQ_25),
  1648. MT8188_SOC_ENUM_EXT("asys_irq14_1x_en_sel",
  1649. asys_irq14_1x_en_sel_enum,
  1650. snd_soc_get_enum_double,
  1651. mt8188_asys_irq_1x_en_sel_put,
  1652. MT8188_AFE_IRQ_26),
  1653. MT8188_SOC_ENUM_EXT("asys_irq15_1x_en_sel",
  1654. asys_irq15_1x_en_sel_enum,
  1655. snd_soc_get_enum_double,
  1656. mt8188_asys_irq_1x_en_sel_put,
  1657. MT8188_AFE_IRQ_27),
  1658. MT8188_SOC_ENUM_EXT("asys_irq16_1x_en_sel",
  1659. asys_irq16_1x_en_sel_enum,
  1660. snd_soc_get_enum_double,
  1661. mt8188_asys_irq_1x_en_sel_put,
  1662. MT8188_AFE_IRQ_28),
  1663. MT8188_SOC_ENUM_EXT("dl2_fs_timing_sel",
  1664. dl2_fs_timing_sel_enum,
  1665. mt8188_memif_fs_timing_sel_get,
  1666. mt8188_memif_fs_timing_sel_put,
  1667. MT8188_AFE_MEMIF_DL2),
  1668. MT8188_SOC_ENUM_EXT("dl3_fs_timing_sel",
  1669. dl3_fs_timing_sel_enum,
  1670. mt8188_memif_fs_timing_sel_get,
  1671. mt8188_memif_fs_timing_sel_put,
  1672. MT8188_AFE_MEMIF_DL3),
  1673. MT8188_SOC_ENUM_EXT("dl6_fs_timing_sel",
  1674. dl6_fs_timing_sel_enum,
  1675. mt8188_memif_fs_timing_sel_get,
  1676. mt8188_memif_fs_timing_sel_put,
  1677. MT8188_AFE_MEMIF_DL6),
  1678. MT8188_SOC_ENUM_EXT("dl8_fs_timing_sel",
  1679. dl8_fs_timing_sel_enum,
  1680. mt8188_memif_fs_timing_sel_get,
  1681. mt8188_memif_fs_timing_sel_put,
  1682. MT8188_AFE_MEMIF_DL8),
  1683. MT8188_SOC_ENUM_EXT("dl11_fs_timing_sel",
  1684. dl11_fs_timing_sel_enum,
  1685. mt8188_memif_fs_timing_sel_get,
  1686. mt8188_memif_fs_timing_sel_put,
  1687. MT8188_AFE_MEMIF_DL11),
  1688. MT8188_SOC_ENUM_EXT("ul2_fs_timing_sel",
  1689. ul2_fs_timing_sel_enum,
  1690. mt8188_memif_fs_timing_sel_get,
  1691. mt8188_memif_fs_timing_sel_put,
  1692. MT8188_AFE_MEMIF_UL2),
  1693. MT8188_SOC_ENUM_EXT("ul4_fs_timing_sel",
  1694. ul4_fs_timing_sel_enum,
  1695. mt8188_memif_fs_timing_sel_get,
  1696. mt8188_memif_fs_timing_sel_put,
  1697. MT8188_AFE_MEMIF_UL4),
  1698. MT8188_SOC_ENUM_EXT("ul5_fs_timing_sel",
  1699. ul5_fs_timing_sel_enum,
  1700. mt8188_memif_fs_timing_sel_get,
  1701. mt8188_memif_fs_timing_sel_put,
  1702. MT8188_AFE_MEMIF_UL5),
  1703. MT8188_SOC_ENUM_EXT("ul9_fs_timing_sel",
  1704. ul9_fs_timing_sel_enum,
  1705. mt8188_memif_fs_timing_sel_get,
  1706. mt8188_memif_fs_timing_sel_put,
  1707. MT8188_AFE_MEMIF_UL9),
  1708. MT8188_SOC_ENUM_EXT("ul10_fs_timing_sel",
  1709. ul10_fs_timing_sel_enum,
  1710. mt8188_memif_fs_timing_sel_get,
  1711. mt8188_memif_fs_timing_sel_put,
  1712. MT8188_AFE_MEMIF_UL10),
  1713. };
  1714. static const struct mtk_base_memif_data memif_data[MT8188_AFE_MEMIF_NUM] = {
  1715. [MT8188_AFE_MEMIF_DL2] = {
  1716. .name = "DL2",
  1717. .id = MT8188_AFE_MEMIF_DL2,
  1718. .reg_ofs_base = AFE_DL2_BASE,
  1719. .reg_ofs_cur = AFE_DL2_CUR,
  1720. .reg_ofs_end = AFE_DL2_END,
  1721. .fs_reg = AFE_MEMIF_AGENT_FS_CON0,
  1722. .fs_shift = 10,
  1723. .fs_maskbit = 0x1f,
  1724. .mono_reg = -1,
  1725. .mono_shift = 0,
  1726. .int_odd_flag_reg = -1,
  1727. .int_odd_flag_shift = 0,
  1728. .enable_reg = AFE_DAC_CON0,
  1729. .enable_shift = 18,
  1730. .hd_reg = AFE_DL2_CON0,
  1731. .hd_shift = 5,
  1732. .agent_disable_reg = AUDIO_TOP_CON5,
  1733. .agent_disable_shift = 18,
  1734. .ch_num_reg = AFE_DL2_CON0,
  1735. .ch_num_shift = 0,
  1736. .ch_num_maskbit = 0x1f,
  1737. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1738. .msb_shift = 18,
  1739. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1740. .msb_end_shift = 18,
  1741. },
  1742. [MT8188_AFE_MEMIF_DL3] = {
  1743. .name = "DL3",
  1744. .id = MT8188_AFE_MEMIF_DL3,
  1745. .reg_ofs_base = AFE_DL3_BASE,
  1746. .reg_ofs_cur = AFE_DL3_CUR,
  1747. .reg_ofs_end = AFE_DL3_END,
  1748. .fs_reg = AFE_MEMIF_AGENT_FS_CON0,
  1749. .fs_shift = 15,
  1750. .fs_maskbit = 0x1f,
  1751. .mono_reg = -1,
  1752. .mono_shift = 0,
  1753. .int_odd_flag_reg = -1,
  1754. .int_odd_flag_shift = 0,
  1755. .enable_reg = AFE_DAC_CON0,
  1756. .enable_shift = 19,
  1757. .hd_reg = AFE_DL3_CON0,
  1758. .hd_shift = 5,
  1759. .agent_disable_reg = AUDIO_TOP_CON5,
  1760. .agent_disable_shift = 19,
  1761. .ch_num_reg = AFE_DL3_CON0,
  1762. .ch_num_shift = 0,
  1763. .ch_num_maskbit = 0x1f,
  1764. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1765. .msb_shift = 19,
  1766. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1767. .msb_end_shift = 19,
  1768. },
  1769. [MT8188_AFE_MEMIF_DL6] = {
  1770. .name = "DL6",
  1771. .id = MT8188_AFE_MEMIF_DL6,
  1772. .reg_ofs_base = AFE_DL6_BASE,
  1773. .reg_ofs_cur = AFE_DL6_CUR,
  1774. .reg_ofs_end = AFE_DL6_END,
  1775. .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  1776. .fs_shift = 0,
  1777. .fs_maskbit = 0x1f,
  1778. .mono_reg = -1,
  1779. .mono_shift = 0,
  1780. .int_odd_flag_reg = -1,
  1781. .int_odd_flag_shift = 0,
  1782. .enable_reg = AFE_DAC_CON0,
  1783. .enable_shift = 22,
  1784. .hd_reg = AFE_DL6_CON0,
  1785. .hd_shift = 5,
  1786. .agent_disable_reg = AUDIO_TOP_CON5,
  1787. .agent_disable_shift = 22,
  1788. .ch_num_reg = AFE_DL6_CON0,
  1789. .ch_num_shift = 0,
  1790. .ch_num_maskbit = 0x1f,
  1791. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1792. .msb_shift = 22,
  1793. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1794. .msb_end_shift = 22,
  1795. },
  1796. [MT8188_AFE_MEMIF_DL7] = {
  1797. .name = "DL7",
  1798. .id = MT8188_AFE_MEMIF_DL7,
  1799. .reg_ofs_base = AFE_DL7_BASE,
  1800. .reg_ofs_cur = AFE_DL7_CUR,
  1801. .reg_ofs_end = AFE_DL7_END,
  1802. .fs_reg = -1,
  1803. .fs_shift = 0,
  1804. .fs_maskbit = 0,
  1805. .mono_reg = -1,
  1806. .mono_shift = 0,
  1807. .int_odd_flag_reg = -1,
  1808. .int_odd_flag_shift = 0,
  1809. .enable_reg = AFE_DAC_CON0,
  1810. .enable_shift = 23,
  1811. .hd_reg = AFE_DL7_CON0,
  1812. .hd_shift = 5,
  1813. .agent_disable_reg = AUDIO_TOP_CON5,
  1814. .agent_disable_shift = 23,
  1815. .ch_num_reg = AFE_DL7_CON0,
  1816. .ch_num_shift = 0,
  1817. .ch_num_maskbit = 0x1f,
  1818. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1819. .msb_shift = 23,
  1820. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1821. .msb_end_shift = 23,
  1822. },
  1823. [MT8188_AFE_MEMIF_DL8] = {
  1824. .name = "DL8",
  1825. .id = MT8188_AFE_MEMIF_DL8,
  1826. .reg_ofs_base = AFE_DL8_BASE,
  1827. .reg_ofs_cur = AFE_DL8_CUR,
  1828. .reg_ofs_end = AFE_DL8_END,
  1829. .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  1830. .fs_shift = 10,
  1831. .fs_maskbit = 0x1f,
  1832. .mono_reg = -1,
  1833. .mono_shift = 0,
  1834. .int_odd_flag_reg = -1,
  1835. .int_odd_flag_shift = 0,
  1836. .enable_reg = AFE_DAC_CON0,
  1837. .enable_shift = 24,
  1838. .hd_reg = AFE_DL8_CON0,
  1839. .hd_shift = 6,
  1840. .agent_disable_reg = AUDIO_TOP_CON5,
  1841. .agent_disable_shift = 24,
  1842. .ch_num_reg = AFE_DL8_CON0,
  1843. .ch_num_shift = 0,
  1844. .ch_num_maskbit = 0x3f,
  1845. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1846. .msb_shift = 24,
  1847. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1848. .msb_end_shift = 24,
  1849. },
  1850. [MT8188_AFE_MEMIF_DL10] = {
  1851. .name = "DL10",
  1852. .id = MT8188_AFE_MEMIF_DL10,
  1853. .reg_ofs_base = AFE_DL10_BASE,
  1854. .reg_ofs_cur = AFE_DL10_CUR,
  1855. .reg_ofs_end = AFE_DL10_END,
  1856. .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  1857. .fs_shift = 20,
  1858. .fs_maskbit = 0x1f,
  1859. .mono_reg = -1,
  1860. .mono_shift = 0,
  1861. .int_odd_flag_reg = -1,
  1862. .int_odd_flag_shift = 0,
  1863. .enable_reg = AFE_DAC_CON0,
  1864. .enable_shift = 26,
  1865. .hd_reg = AFE_DL10_CON0,
  1866. .hd_shift = 5,
  1867. .agent_disable_reg = AUDIO_TOP_CON5,
  1868. .agent_disable_shift = 26,
  1869. .ch_num_reg = AFE_DL10_CON0,
  1870. .ch_num_shift = 0,
  1871. .ch_num_maskbit = 0x1f,
  1872. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1873. .msb_shift = 26,
  1874. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1875. .msb_end_shift = 26,
  1876. },
  1877. [MT8188_AFE_MEMIF_DL11] = {
  1878. .name = "DL11",
  1879. .id = MT8188_AFE_MEMIF_DL11,
  1880. .reg_ofs_base = AFE_DL11_BASE,
  1881. .reg_ofs_cur = AFE_DL11_CUR,
  1882. .reg_ofs_end = AFE_DL11_END,
  1883. .fs_reg = AFE_MEMIF_AGENT_FS_CON1,
  1884. .fs_shift = 25,
  1885. .fs_maskbit = 0x1f,
  1886. .mono_reg = -1,
  1887. .mono_shift = 0,
  1888. .int_odd_flag_reg = -1,
  1889. .int_odd_flag_shift = 0,
  1890. .enable_reg = AFE_DAC_CON0,
  1891. .enable_shift = 27,
  1892. .hd_reg = AFE_DL11_CON0,
  1893. .hd_shift = 7,
  1894. .agent_disable_reg = AUDIO_TOP_CON5,
  1895. .agent_disable_shift = 27,
  1896. .ch_num_reg = AFE_DL11_CON0,
  1897. .ch_num_shift = 0,
  1898. .ch_num_maskbit = 0x7f,
  1899. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1900. .msb_shift = 27,
  1901. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1902. .msb_end_shift = 27,
  1903. },
  1904. [MT8188_AFE_MEMIF_UL1] = {
  1905. .name = "UL1",
  1906. .id = MT8188_AFE_MEMIF_UL1,
  1907. .reg_ofs_base = AFE_UL1_BASE,
  1908. .reg_ofs_cur = AFE_UL1_CUR,
  1909. .reg_ofs_end = AFE_UL1_END,
  1910. .fs_reg = -1,
  1911. .fs_shift = 0,
  1912. .fs_maskbit = 0,
  1913. .mono_reg = AFE_UL1_CON0,
  1914. .mono_shift = 1,
  1915. .int_odd_flag_reg = AFE_UL1_CON0,
  1916. .int_odd_flag_shift = 0,
  1917. .enable_reg = AFE_DAC_CON0,
  1918. .enable_shift = 1,
  1919. .hd_reg = AFE_UL1_CON0,
  1920. .hd_shift = 5,
  1921. .agent_disable_reg = AUDIO_TOP_CON5,
  1922. .agent_disable_shift = 0,
  1923. .ch_num_reg = -1,
  1924. .ch_num_shift = 0,
  1925. .ch_num_maskbit = 0,
  1926. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1927. .msb_shift = 0,
  1928. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1929. .msb_end_shift = 0,
  1930. },
  1931. [MT8188_AFE_MEMIF_UL2] = {
  1932. .name = "UL2",
  1933. .id = MT8188_AFE_MEMIF_UL2,
  1934. .reg_ofs_base = AFE_UL2_BASE,
  1935. .reg_ofs_cur = AFE_UL2_CUR,
  1936. .reg_ofs_end = AFE_UL2_END,
  1937. .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  1938. .fs_shift = 5,
  1939. .fs_maskbit = 0x1f,
  1940. .mono_reg = AFE_UL2_CON0,
  1941. .mono_shift = 1,
  1942. .int_odd_flag_reg = AFE_UL2_CON0,
  1943. .int_odd_flag_shift = 0,
  1944. .enable_reg = AFE_DAC_CON0,
  1945. .enable_shift = 2,
  1946. .hd_reg = AFE_UL2_CON0,
  1947. .hd_shift = 5,
  1948. .agent_disable_reg = AUDIO_TOP_CON5,
  1949. .agent_disable_shift = 1,
  1950. .ch_num_reg = -1,
  1951. .ch_num_shift = 0,
  1952. .ch_num_maskbit = 0,
  1953. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1954. .msb_shift = 1,
  1955. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1956. .msb_end_shift = 1,
  1957. },
  1958. [MT8188_AFE_MEMIF_UL3] = {
  1959. .name = "UL3",
  1960. .id = MT8188_AFE_MEMIF_UL3,
  1961. .reg_ofs_base = AFE_UL3_BASE,
  1962. .reg_ofs_cur = AFE_UL3_CUR,
  1963. .reg_ofs_end = AFE_UL3_END,
  1964. .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  1965. .fs_shift = 10,
  1966. .fs_maskbit = 0x1f,
  1967. .mono_reg = AFE_UL3_CON0,
  1968. .mono_shift = 1,
  1969. .int_odd_flag_reg = AFE_UL3_CON0,
  1970. .int_odd_flag_shift = 0,
  1971. .enable_reg = AFE_DAC_CON0,
  1972. .enable_shift = 3,
  1973. .hd_reg = AFE_UL3_CON0,
  1974. .hd_shift = 5,
  1975. .agent_disable_reg = AUDIO_TOP_CON5,
  1976. .agent_disable_shift = 2,
  1977. .ch_num_reg = -1,
  1978. .ch_num_shift = 0,
  1979. .ch_num_maskbit = 0,
  1980. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  1981. .msb_shift = 2,
  1982. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  1983. .msb_end_shift = 2,
  1984. },
  1985. [MT8188_AFE_MEMIF_UL4] = {
  1986. .name = "UL4",
  1987. .id = MT8188_AFE_MEMIF_UL4,
  1988. .reg_ofs_base = AFE_UL4_BASE,
  1989. .reg_ofs_cur = AFE_UL4_CUR,
  1990. .reg_ofs_end = AFE_UL4_END,
  1991. .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  1992. .fs_shift = 15,
  1993. .fs_maskbit = 0x1f,
  1994. .mono_reg = AFE_UL4_CON0,
  1995. .mono_shift = 1,
  1996. .int_odd_flag_reg = AFE_UL4_CON0,
  1997. .int_odd_flag_shift = 0,
  1998. .enable_reg = AFE_DAC_CON0,
  1999. .enable_shift = 4,
  2000. .hd_reg = AFE_UL4_CON0,
  2001. .hd_shift = 5,
  2002. .agent_disable_reg = AUDIO_TOP_CON5,
  2003. .agent_disable_shift = 3,
  2004. .ch_num_reg = -1,
  2005. .ch_num_shift = 0,
  2006. .ch_num_maskbit = 0,
  2007. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2008. .msb_shift = 3,
  2009. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2010. .msb_end_shift = 3,
  2011. },
  2012. [MT8188_AFE_MEMIF_UL5] = {
  2013. .name = "UL5",
  2014. .id = MT8188_AFE_MEMIF_UL5,
  2015. .reg_ofs_base = AFE_UL5_BASE,
  2016. .reg_ofs_cur = AFE_UL5_CUR,
  2017. .reg_ofs_end = AFE_UL5_END,
  2018. .fs_reg = AFE_MEMIF_AGENT_FS_CON2,
  2019. .fs_shift = 20,
  2020. .fs_maskbit = 0x1f,
  2021. .mono_reg = AFE_UL5_CON0,
  2022. .mono_shift = 1,
  2023. .int_odd_flag_reg = AFE_UL5_CON0,
  2024. .int_odd_flag_shift = 0,
  2025. .enable_reg = AFE_DAC_CON0,
  2026. .enable_shift = 5,
  2027. .hd_reg = AFE_UL5_CON0,
  2028. .hd_shift = 5,
  2029. .agent_disable_reg = AUDIO_TOP_CON5,
  2030. .agent_disable_shift = 4,
  2031. .ch_num_reg = -1,
  2032. .ch_num_shift = 0,
  2033. .ch_num_maskbit = 0,
  2034. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2035. .msb_shift = 4,
  2036. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2037. .msb_end_shift = 4,
  2038. },
  2039. [MT8188_AFE_MEMIF_UL6] = {
  2040. .name = "UL6",
  2041. .id = MT8188_AFE_MEMIF_UL6,
  2042. .reg_ofs_base = AFE_UL6_BASE,
  2043. .reg_ofs_cur = AFE_UL6_CUR,
  2044. .reg_ofs_end = AFE_UL6_END,
  2045. .fs_reg = -1,
  2046. .fs_shift = 0,
  2047. .fs_maskbit = 0,
  2048. .mono_reg = AFE_UL6_CON0,
  2049. .mono_shift = 1,
  2050. .int_odd_flag_reg = AFE_UL6_CON0,
  2051. .int_odd_flag_shift = 0,
  2052. .enable_reg = AFE_DAC_CON0,
  2053. .enable_shift = 6,
  2054. .hd_reg = AFE_UL6_CON0,
  2055. .hd_shift = 5,
  2056. .agent_disable_reg = AUDIO_TOP_CON5,
  2057. .agent_disable_shift = 5,
  2058. .ch_num_reg = -1,
  2059. .ch_num_shift = 0,
  2060. .ch_num_maskbit = 0,
  2061. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2062. .msb_shift = 5,
  2063. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2064. .msb_end_shift = 5,
  2065. },
  2066. [MT8188_AFE_MEMIF_UL8] = {
  2067. .name = "UL8",
  2068. .id = MT8188_AFE_MEMIF_UL8,
  2069. .reg_ofs_base = AFE_UL8_BASE,
  2070. .reg_ofs_cur = AFE_UL8_CUR,
  2071. .reg_ofs_end = AFE_UL8_END,
  2072. .fs_reg = AFE_MEMIF_AGENT_FS_CON3,
  2073. .fs_shift = 5,
  2074. .fs_maskbit = 0x1f,
  2075. .mono_reg = AFE_UL8_CON0,
  2076. .mono_shift = 1,
  2077. .int_odd_flag_reg = AFE_UL8_CON0,
  2078. .int_odd_flag_shift = 0,
  2079. .enable_reg = AFE_DAC_CON0,
  2080. .enable_shift = 8,
  2081. .hd_reg = AFE_UL8_CON0,
  2082. .hd_shift = 5,
  2083. .agent_disable_reg = AUDIO_TOP_CON5,
  2084. .agent_disable_shift = 7,
  2085. .ch_num_reg = -1,
  2086. .ch_num_shift = 0,
  2087. .ch_num_maskbit = 0,
  2088. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2089. .msb_shift = 7,
  2090. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2091. .msb_end_shift = 7,
  2092. },
  2093. [MT8188_AFE_MEMIF_UL9] = {
  2094. .name = "UL9",
  2095. .id = MT8188_AFE_MEMIF_UL9,
  2096. .reg_ofs_base = AFE_UL9_BASE,
  2097. .reg_ofs_cur = AFE_UL9_CUR,
  2098. .reg_ofs_end = AFE_UL9_END,
  2099. .fs_reg = AFE_MEMIF_AGENT_FS_CON3,
  2100. .fs_shift = 10,
  2101. .fs_maskbit = 0x1f,
  2102. .mono_reg = AFE_UL9_CON0,
  2103. .mono_shift = 1,
  2104. .int_odd_flag_reg = AFE_UL9_CON0,
  2105. .int_odd_flag_shift = 0,
  2106. .enable_reg = AFE_DAC_CON0,
  2107. .enable_shift = 9,
  2108. .hd_reg = AFE_UL9_CON0,
  2109. .hd_shift = 5,
  2110. .agent_disable_reg = AUDIO_TOP_CON5,
  2111. .agent_disable_shift = 8,
  2112. .ch_num_reg = -1,
  2113. .ch_num_shift = 0,
  2114. .ch_num_maskbit = 0,
  2115. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2116. .msb_shift = 8,
  2117. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2118. .msb_end_shift = 8,
  2119. },
  2120. [MT8188_AFE_MEMIF_UL10] = {
  2121. .name = "UL10",
  2122. .id = MT8188_AFE_MEMIF_UL10,
  2123. .reg_ofs_base = AFE_UL10_BASE,
  2124. .reg_ofs_cur = AFE_UL10_CUR,
  2125. .reg_ofs_end = AFE_UL10_END,
  2126. .fs_reg = AFE_MEMIF_AGENT_FS_CON3,
  2127. .fs_shift = 15,
  2128. .fs_maskbit = 0x1f,
  2129. .mono_reg = AFE_UL10_CON0,
  2130. .mono_shift = 1,
  2131. .int_odd_flag_reg = AFE_UL10_CON0,
  2132. .int_odd_flag_shift = 0,
  2133. .enable_reg = AFE_DAC_CON0,
  2134. .enable_shift = 10,
  2135. .hd_reg = AFE_UL10_CON0,
  2136. .hd_shift = 5,
  2137. .agent_disable_reg = AUDIO_TOP_CON5,
  2138. .agent_disable_shift = 9,
  2139. .ch_num_reg = -1,
  2140. .ch_num_shift = 0,
  2141. .ch_num_maskbit = 0,
  2142. .msb_reg = AFE_NORMAL_BASE_ADR_MSB,
  2143. .msb_shift = 9,
  2144. .msb_end_reg = AFE_NORMAL_END_ADR_MSB,
  2145. .msb_end_shift = 9,
  2146. },
  2147. };
  2148. static const struct mtk_base_irq_data irq_data[MT8188_AFE_IRQ_NUM] = {
  2149. [MT8188_AFE_IRQ_1] = {
  2150. .id = MT8188_AFE_IRQ_1,
  2151. .irq_cnt_reg = -1,
  2152. .irq_cnt_shift = 0,
  2153. .irq_cnt_maskbit = 0,
  2154. .irq_fs_reg = -1,
  2155. .irq_fs_shift = 0,
  2156. .irq_fs_maskbit = 0,
  2157. .irq_en_reg = AFE_IRQ1_CON,
  2158. .irq_en_shift = 31,
  2159. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2160. .irq_clr_shift = 0,
  2161. .irq_status_shift = 16,
  2162. },
  2163. [MT8188_AFE_IRQ_2] = {
  2164. .id = MT8188_AFE_IRQ_2,
  2165. .irq_cnt_reg = -1,
  2166. .irq_cnt_shift = 0,
  2167. .irq_cnt_maskbit = 0,
  2168. .irq_fs_reg = -1,
  2169. .irq_fs_shift = 0,
  2170. .irq_fs_maskbit = 0,
  2171. .irq_en_reg = AFE_IRQ2_CON,
  2172. .irq_en_shift = 31,
  2173. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2174. .irq_clr_shift = 1,
  2175. .irq_status_shift = 17,
  2176. },
  2177. [MT8188_AFE_IRQ_3] = {
  2178. .id = MT8188_AFE_IRQ_3,
  2179. .irq_cnt_reg = AFE_IRQ3_CON,
  2180. .irq_cnt_shift = 0,
  2181. .irq_cnt_maskbit = 0xffffff,
  2182. .irq_fs_reg = -1,
  2183. .irq_fs_shift = 0,
  2184. .irq_fs_maskbit = 0,
  2185. .irq_en_reg = AFE_IRQ3_CON,
  2186. .irq_en_shift = 31,
  2187. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2188. .irq_clr_shift = 2,
  2189. .irq_status_shift = 18,
  2190. },
  2191. [MT8188_AFE_IRQ_8] = {
  2192. .id = MT8188_AFE_IRQ_8,
  2193. .irq_cnt_reg = -1,
  2194. .irq_cnt_shift = 0,
  2195. .irq_cnt_maskbit = 0,
  2196. .irq_fs_reg = -1,
  2197. .irq_fs_shift = 0,
  2198. .irq_fs_maskbit = 0,
  2199. .irq_en_reg = AFE_IRQ8_CON,
  2200. .irq_en_shift = 31,
  2201. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2202. .irq_clr_shift = 7,
  2203. .irq_status_shift = 23,
  2204. },
  2205. [MT8188_AFE_IRQ_9] = {
  2206. .id = MT8188_AFE_IRQ_9,
  2207. .irq_cnt_reg = AFE_IRQ9_CON,
  2208. .irq_cnt_shift = 0,
  2209. .irq_cnt_maskbit = 0xffffff,
  2210. .irq_fs_reg = -1,
  2211. .irq_fs_shift = 0,
  2212. .irq_fs_maskbit = 0,
  2213. .irq_en_reg = AFE_IRQ9_CON,
  2214. .irq_en_shift = 31,
  2215. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2216. .irq_clr_shift = 8,
  2217. .irq_status_shift = 24,
  2218. },
  2219. [MT8188_AFE_IRQ_10] = {
  2220. .id = MT8188_AFE_IRQ_10,
  2221. .irq_cnt_reg = -1,
  2222. .irq_cnt_shift = 0,
  2223. .irq_cnt_maskbit = 0,
  2224. .irq_fs_reg = -1,
  2225. .irq_fs_shift = 0,
  2226. .irq_fs_maskbit = 0,
  2227. .irq_en_reg = AFE_IRQ10_CON,
  2228. .irq_en_shift = 31,
  2229. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  2230. .irq_clr_shift = 9,
  2231. .irq_status_shift = 25,
  2232. },
  2233. [MT8188_AFE_IRQ_13] = {
  2234. .id = MT8188_AFE_IRQ_13,
  2235. .irq_cnt_reg = ASYS_IRQ1_CON,
  2236. .irq_cnt_shift = 0,
  2237. .irq_cnt_maskbit = 0xffffff,
  2238. .irq_fs_reg = ASYS_IRQ1_CON,
  2239. .irq_fs_shift = 24,
  2240. .irq_fs_maskbit = 0x1ffff,
  2241. .irq_en_reg = ASYS_IRQ1_CON,
  2242. .irq_en_shift = 31,
  2243. .irq_clr_reg = ASYS_IRQ_CLR,
  2244. .irq_clr_shift = 0,
  2245. .irq_status_shift = 0,
  2246. },
  2247. [MT8188_AFE_IRQ_14] = {
  2248. .id = MT8188_AFE_IRQ_14,
  2249. .irq_cnt_reg = ASYS_IRQ2_CON,
  2250. .irq_cnt_shift = 0,
  2251. .irq_cnt_maskbit = 0xffffff,
  2252. .irq_fs_reg = ASYS_IRQ2_CON,
  2253. .irq_fs_shift = 24,
  2254. .irq_fs_maskbit = 0x1ffff,
  2255. .irq_en_reg = ASYS_IRQ2_CON,
  2256. .irq_en_shift = 31,
  2257. .irq_clr_reg = ASYS_IRQ_CLR,
  2258. .irq_clr_shift = 1,
  2259. .irq_status_shift = 1,
  2260. },
  2261. [MT8188_AFE_IRQ_15] = {
  2262. .id = MT8188_AFE_IRQ_15,
  2263. .irq_cnt_reg = ASYS_IRQ3_CON,
  2264. .irq_cnt_shift = 0,
  2265. .irq_cnt_maskbit = 0xffffff,
  2266. .irq_fs_reg = ASYS_IRQ3_CON,
  2267. .irq_fs_shift = 24,
  2268. .irq_fs_maskbit = 0x1ffff,
  2269. .irq_en_reg = ASYS_IRQ3_CON,
  2270. .irq_en_shift = 31,
  2271. .irq_clr_reg = ASYS_IRQ_CLR,
  2272. .irq_clr_shift = 2,
  2273. .irq_status_shift = 2,
  2274. },
  2275. [MT8188_AFE_IRQ_16] = {
  2276. .id = MT8188_AFE_IRQ_16,
  2277. .irq_cnt_reg = ASYS_IRQ4_CON,
  2278. .irq_cnt_shift = 0,
  2279. .irq_cnt_maskbit = 0xffffff,
  2280. .irq_fs_reg = ASYS_IRQ4_CON,
  2281. .irq_fs_shift = 24,
  2282. .irq_fs_maskbit = 0x1ffff,
  2283. .irq_en_reg = ASYS_IRQ4_CON,
  2284. .irq_en_shift = 31,
  2285. .irq_clr_reg = ASYS_IRQ_CLR,
  2286. .irq_clr_shift = 3,
  2287. .irq_status_shift = 3,
  2288. },
  2289. [MT8188_AFE_IRQ_17] = {
  2290. .id = MT8188_AFE_IRQ_17,
  2291. .irq_cnt_reg = ASYS_IRQ5_CON,
  2292. .irq_cnt_shift = 0,
  2293. .irq_cnt_maskbit = 0xffffff,
  2294. .irq_fs_reg = ASYS_IRQ5_CON,
  2295. .irq_fs_shift = 24,
  2296. .irq_fs_maskbit = 0x1ffff,
  2297. .irq_en_reg = ASYS_IRQ5_CON,
  2298. .irq_en_shift = 31,
  2299. .irq_clr_reg = ASYS_IRQ_CLR,
  2300. .irq_clr_shift = 4,
  2301. .irq_status_shift = 4,
  2302. },
  2303. [MT8188_AFE_IRQ_18] = {
  2304. .id = MT8188_AFE_IRQ_18,
  2305. .irq_cnt_reg = ASYS_IRQ6_CON,
  2306. .irq_cnt_shift = 0,
  2307. .irq_cnt_maskbit = 0xffffff,
  2308. .irq_fs_reg = ASYS_IRQ6_CON,
  2309. .irq_fs_shift = 24,
  2310. .irq_fs_maskbit = 0x1ffff,
  2311. .irq_en_reg = ASYS_IRQ6_CON,
  2312. .irq_en_shift = 31,
  2313. .irq_clr_reg = ASYS_IRQ_CLR,
  2314. .irq_clr_shift = 5,
  2315. .irq_status_shift = 5,
  2316. },
  2317. [MT8188_AFE_IRQ_19] = {
  2318. .id = MT8188_AFE_IRQ_19,
  2319. .irq_cnt_reg = ASYS_IRQ7_CON,
  2320. .irq_cnt_shift = 0,
  2321. .irq_cnt_maskbit = 0xffffff,
  2322. .irq_fs_reg = ASYS_IRQ7_CON,
  2323. .irq_fs_shift = 24,
  2324. .irq_fs_maskbit = 0x1ffff,
  2325. .irq_en_reg = ASYS_IRQ7_CON,
  2326. .irq_en_shift = 31,
  2327. .irq_clr_reg = ASYS_IRQ_CLR,
  2328. .irq_clr_shift = 6,
  2329. .irq_status_shift = 6,
  2330. },
  2331. [MT8188_AFE_IRQ_20] = {
  2332. .id = MT8188_AFE_IRQ_20,
  2333. .irq_cnt_reg = ASYS_IRQ8_CON,
  2334. .irq_cnt_shift = 0,
  2335. .irq_cnt_maskbit = 0xffffff,
  2336. .irq_fs_reg = ASYS_IRQ8_CON,
  2337. .irq_fs_shift = 24,
  2338. .irq_fs_maskbit = 0x1ffff,
  2339. .irq_en_reg = ASYS_IRQ8_CON,
  2340. .irq_en_shift = 31,
  2341. .irq_clr_reg = ASYS_IRQ_CLR,
  2342. .irq_clr_shift = 7,
  2343. .irq_status_shift = 7,
  2344. },
  2345. [MT8188_AFE_IRQ_21] = {
  2346. .id = MT8188_AFE_IRQ_21,
  2347. .irq_cnt_reg = ASYS_IRQ9_CON,
  2348. .irq_cnt_shift = 0,
  2349. .irq_cnt_maskbit = 0xffffff,
  2350. .irq_fs_reg = ASYS_IRQ9_CON,
  2351. .irq_fs_shift = 24,
  2352. .irq_fs_maskbit = 0x1ffff,
  2353. .irq_en_reg = ASYS_IRQ9_CON,
  2354. .irq_en_shift = 31,
  2355. .irq_clr_reg = ASYS_IRQ_CLR,
  2356. .irq_clr_shift = 8,
  2357. .irq_status_shift = 8,
  2358. },
  2359. [MT8188_AFE_IRQ_22] = {
  2360. .id = MT8188_AFE_IRQ_22,
  2361. .irq_cnt_reg = ASYS_IRQ10_CON,
  2362. .irq_cnt_shift = 0,
  2363. .irq_cnt_maskbit = 0xffffff,
  2364. .irq_fs_reg = ASYS_IRQ10_CON,
  2365. .irq_fs_shift = 24,
  2366. .irq_fs_maskbit = 0x1ffff,
  2367. .irq_en_reg = ASYS_IRQ10_CON,
  2368. .irq_en_shift = 31,
  2369. .irq_clr_reg = ASYS_IRQ_CLR,
  2370. .irq_clr_shift = 9,
  2371. .irq_status_shift = 9,
  2372. },
  2373. [MT8188_AFE_IRQ_23] = {
  2374. .id = MT8188_AFE_IRQ_23,
  2375. .irq_cnt_reg = ASYS_IRQ11_CON,
  2376. .irq_cnt_shift = 0,
  2377. .irq_cnt_maskbit = 0xffffff,
  2378. .irq_fs_reg = ASYS_IRQ11_CON,
  2379. .irq_fs_shift = 24,
  2380. .irq_fs_maskbit = 0x1ffff,
  2381. .irq_en_reg = ASYS_IRQ11_CON,
  2382. .irq_en_shift = 31,
  2383. .irq_clr_reg = ASYS_IRQ_CLR,
  2384. .irq_clr_shift = 10,
  2385. .irq_status_shift = 10,
  2386. },
  2387. [MT8188_AFE_IRQ_24] = {
  2388. .id = MT8188_AFE_IRQ_24,
  2389. .irq_cnt_reg = ASYS_IRQ12_CON,
  2390. .irq_cnt_shift = 0,
  2391. .irq_cnt_maskbit = 0xffffff,
  2392. .irq_fs_reg = ASYS_IRQ12_CON,
  2393. .irq_fs_shift = 24,
  2394. .irq_fs_maskbit = 0x1ffff,
  2395. .irq_en_reg = ASYS_IRQ12_CON,
  2396. .irq_en_shift = 31,
  2397. .irq_clr_reg = ASYS_IRQ_CLR,
  2398. .irq_clr_shift = 11,
  2399. .irq_status_shift = 11,
  2400. },
  2401. [MT8188_AFE_IRQ_25] = {
  2402. .id = MT8188_AFE_IRQ_25,
  2403. .irq_cnt_reg = ASYS_IRQ13_CON,
  2404. .irq_cnt_shift = 0,
  2405. .irq_cnt_maskbit = 0xffffff,
  2406. .irq_fs_reg = ASYS_IRQ13_CON,
  2407. .irq_fs_shift = 24,
  2408. .irq_fs_maskbit = 0x1ffff,
  2409. .irq_en_reg = ASYS_IRQ13_CON,
  2410. .irq_en_shift = 31,
  2411. .irq_clr_reg = ASYS_IRQ_CLR,
  2412. .irq_clr_shift = 12,
  2413. .irq_status_shift = 12,
  2414. },
  2415. [MT8188_AFE_IRQ_26] = {
  2416. .id = MT8188_AFE_IRQ_26,
  2417. .irq_cnt_reg = ASYS_IRQ14_CON,
  2418. .irq_cnt_shift = 0,
  2419. .irq_cnt_maskbit = 0xffffff,
  2420. .irq_fs_reg = ASYS_IRQ14_CON,
  2421. .irq_fs_shift = 24,
  2422. .irq_fs_maskbit = 0x1ffff,
  2423. .irq_en_reg = ASYS_IRQ14_CON,
  2424. .irq_en_shift = 31,
  2425. .irq_clr_reg = ASYS_IRQ_CLR,
  2426. .irq_clr_shift = 13,
  2427. .irq_status_shift = 13,
  2428. },
  2429. [MT8188_AFE_IRQ_27] = {
  2430. .id = MT8188_AFE_IRQ_27,
  2431. .irq_cnt_reg = ASYS_IRQ15_CON,
  2432. .irq_cnt_shift = 0,
  2433. .irq_cnt_maskbit = 0xffffff,
  2434. .irq_fs_reg = ASYS_IRQ15_CON,
  2435. .irq_fs_shift = 24,
  2436. .irq_fs_maskbit = 0x1ffff,
  2437. .irq_en_reg = ASYS_IRQ15_CON,
  2438. .irq_en_shift = 31,
  2439. .irq_clr_reg = ASYS_IRQ_CLR,
  2440. .irq_clr_shift = 14,
  2441. .irq_status_shift = 14,
  2442. },
  2443. [MT8188_AFE_IRQ_28] = {
  2444. .id = MT8188_AFE_IRQ_28,
  2445. .irq_cnt_reg = ASYS_IRQ16_CON,
  2446. .irq_cnt_shift = 0,
  2447. .irq_cnt_maskbit = 0xffffff,
  2448. .irq_fs_reg = ASYS_IRQ16_CON,
  2449. .irq_fs_shift = 24,
  2450. .irq_fs_maskbit = 0x1ffff,
  2451. .irq_en_reg = ASYS_IRQ16_CON,
  2452. .irq_en_shift = 31,
  2453. .irq_clr_reg = ASYS_IRQ_CLR,
  2454. .irq_clr_shift = 15,
  2455. .irq_status_shift = 15,
  2456. },
  2457. };
  2458. static const int mt8188_afe_memif_const_irqs[MT8188_AFE_MEMIF_NUM] = {
  2459. [MT8188_AFE_MEMIF_DL2] = MT8188_AFE_IRQ_13,
  2460. [MT8188_AFE_MEMIF_DL3] = MT8188_AFE_IRQ_14,
  2461. [MT8188_AFE_MEMIF_DL6] = MT8188_AFE_IRQ_15,
  2462. [MT8188_AFE_MEMIF_DL7] = MT8188_AFE_IRQ_1,
  2463. [MT8188_AFE_MEMIF_DL8] = MT8188_AFE_IRQ_16,
  2464. [MT8188_AFE_MEMIF_DL10] = MT8188_AFE_IRQ_17,
  2465. [MT8188_AFE_MEMIF_DL11] = MT8188_AFE_IRQ_18,
  2466. [MT8188_AFE_MEMIF_UL1] = MT8188_AFE_IRQ_3,
  2467. [MT8188_AFE_MEMIF_UL2] = MT8188_AFE_IRQ_19,
  2468. [MT8188_AFE_MEMIF_UL3] = MT8188_AFE_IRQ_20,
  2469. [MT8188_AFE_MEMIF_UL4] = MT8188_AFE_IRQ_21,
  2470. [MT8188_AFE_MEMIF_UL5] = MT8188_AFE_IRQ_22,
  2471. [MT8188_AFE_MEMIF_UL6] = MT8188_AFE_IRQ_9,
  2472. [MT8188_AFE_MEMIF_UL8] = MT8188_AFE_IRQ_23,
  2473. [MT8188_AFE_MEMIF_UL9] = MT8188_AFE_IRQ_24,
  2474. [MT8188_AFE_MEMIF_UL10] = MT8188_AFE_IRQ_25,
  2475. };
  2476. static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg)
  2477. {
  2478. /* these auto-gen reg has read-only bit, so put it as volatile */
  2479. /* volatile reg cannot be cached, so cannot be set when power off */
  2480. switch (reg) {
  2481. case AUDIO_TOP_CON0:
  2482. case AUDIO_TOP_CON1:
  2483. case AUDIO_TOP_CON3:
  2484. case AUDIO_TOP_CON4:
  2485. case AUDIO_TOP_CON5:
  2486. case AUDIO_TOP_CON6:
  2487. case ASYS_IRQ_CLR:
  2488. case ASYS_IRQ_STATUS:
  2489. case ASYS_IRQ_MON1:
  2490. case ASYS_IRQ_MON2:
  2491. case AFE_IRQ_MCU_CLR:
  2492. case AFE_IRQ_STATUS:
  2493. case AFE_IRQ3_CON_MON:
  2494. case AFE_IRQ_MCU_MON2:
  2495. case ADSP_IRQ_STATUS:
  2496. case AUDIO_TOP_STA0:
  2497. case AUDIO_TOP_STA1:
  2498. case AFE_GAIN1_CUR:
  2499. case AFE_GAIN2_CUR:
  2500. case AFE_IEC_BURST_INFO:
  2501. case AFE_IEC_CHL_STAT0:
  2502. case AFE_IEC_CHL_STAT1:
  2503. case AFE_IEC_CHR_STAT0:
  2504. case AFE_IEC_CHR_STAT1:
  2505. case AFE_SPDIFIN_CHSTS1:
  2506. case AFE_SPDIFIN_CHSTS2:
  2507. case AFE_SPDIFIN_CHSTS3:
  2508. case AFE_SPDIFIN_CHSTS4:
  2509. case AFE_SPDIFIN_CHSTS5:
  2510. case AFE_SPDIFIN_CHSTS6:
  2511. case AFE_SPDIFIN_DEBUG1:
  2512. case AFE_SPDIFIN_DEBUG2:
  2513. case AFE_SPDIFIN_DEBUG3:
  2514. case AFE_SPDIFIN_DEBUG4:
  2515. case AFE_SPDIFIN_EC:
  2516. case AFE_SPDIFIN_CKLOCK_CFG:
  2517. case AFE_SPDIFIN_BR_DBG1:
  2518. case AFE_SPDIFIN_CKFBDIV:
  2519. case AFE_SPDIFIN_INT_EXT:
  2520. case AFE_SPDIFIN_INT_EXT2:
  2521. case SPDIFIN_FREQ_STATUS:
  2522. case SPDIFIN_USERCODE1:
  2523. case SPDIFIN_USERCODE2:
  2524. case SPDIFIN_USERCODE3:
  2525. case SPDIFIN_USERCODE4:
  2526. case SPDIFIN_USERCODE5:
  2527. case SPDIFIN_USERCODE6:
  2528. case SPDIFIN_USERCODE7:
  2529. case SPDIFIN_USERCODE8:
  2530. case SPDIFIN_USERCODE9:
  2531. case SPDIFIN_USERCODE10:
  2532. case SPDIFIN_USERCODE11:
  2533. case SPDIFIN_USERCODE12:
  2534. case AFE_LINEIN_APLL_TUNER_MON:
  2535. case AFE_EARC_APLL_TUNER_MON:
  2536. case AFE_CM0_MON:
  2537. case AFE_CM1_MON:
  2538. case AFE_CM2_MON:
  2539. case AFE_MPHONE_MULTI_DET_MON0:
  2540. case AFE_MPHONE_MULTI_DET_MON1:
  2541. case AFE_MPHONE_MULTI_DET_MON2:
  2542. case AFE_MPHONE_MULTI2_DET_MON0:
  2543. case AFE_MPHONE_MULTI2_DET_MON1:
  2544. case AFE_MPHONE_MULTI2_DET_MON2:
  2545. case AFE_ADDA_MTKAIF_MON0:
  2546. case AFE_ADDA_MTKAIF_MON1:
  2547. case AFE_AUD_PAD_TOP:
  2548. case AFE_ADDA6_MTKAIF_MON0:
  2549. case AFE_ADDA6_MTKAIF_MON1:
  2550. case AFE_ADDA6_SRC_DEBUG_MON0:
  2551. case AFE_ADDA6_UL_SRC_MON0:
  2552. case AFE_ADDA6_UL_SRC_MON1:
  2553. case AFE_ASRC11_NEW_CON8:
  2554. case AFE_ASRC11_NEW_CON9:
  2555. case AFE_ASRC12_NEW_CON8:
  2556. case AFE_ASRC12_NEW_CON9:
  2557. case AFE_LRCK_CNT:
  2558. case AFE_DAC_MON0:
  2559. case AFE_DAC_CON0:
  2560. case AFE_DL2_CUR:
  2561. case AFE_DL3_CUR:
  2562. case AFE_DL6_CUR:
  2563. case AFE_DL7_CUR:
  2564. case AFE_DL8_CUR:
  2565. case AFE_DL10_CUR:
  2566. case AFE_DL11_CUR:
  2567. case AFE_UL1_CUR:
  2568. case AFE_UL2_CUR:
  2569. case AFE_UL3_CUR:
  2570. case AFE_UL4_CUR:
  2571. case AFE_UL5_CUR:
  2572. case AFE_UL6_CUR:
  2573. case AFE_UL8_CUR:
  2574. case AFE_UL9_CUR:
  2575. case AFE_UL10_CUR:
  2576. case AFE_DL8_CHK_SUM1:
  2577. case AFE_DL8_CHK_SUM2:
  2578. case AFE_DL8_CHK_SUM3:
  2579. case AFE_DL8_CHK_SUM4:
  2580. case AFE_DL8_CHK_SUM5:
  2581. case AFE_DL8_CHK_SUM6:
  2582. case AFE_DL10_CHK_SUM1:
  2583. case AFE_DL10_CHK_SUM2:
  2584. case AFE_DL10_CHK_SUM3:
  2585. case AFE_DL10_CHK_SUM4:
  2586. case AFE_DL10_CHK_SUM5:
  2587. case AFE_DL10_CHK_SUM6:
  2588. case AFE_DL11_CHK_SUM1:
  2589. case AFE_DL11_CHK_SUM2:
  2590. case AFE_DL11_CHK_SUM3:
  2591. case AFE_DL11_CHK_SUM4:
  2592. case AFE_DL11_CHK_SUM5:
  2593. case AFE_DL11_CHK_SUM6:
  2594. case AFE_UL1_CHK_SUM1:
  2595. case AFE_UL1_CHK_SUM2:
  2596. case AFE_UL2_CHK_SUM1:
  2597. case AFE_UL2_CHK_SUM2:
  2598. case AFE_UL3_CHK_SUM1:
  2599. case AFE_UL3_CHK_SUM2:
  2600. case AFE_UL4_CHK_SUM1:
  2601. case AFE_UL4_CHK_SUM2:
  2602. case AFE_UL5_CHK_SUM1:
  2603. case AFE_UL5_CHK_SUM2:
  2604. case AFE_UL6_CHK_SUM1:
  2605. case AFE_UL6_CHK_SUM2:
  2606. case AFE_UL8_CHK_SUM1:
  2607. case AFE_UL8_CHK_SUM2:
  2608. case AFE_DL2_CHK_SUM1:
  2609. case AFE_DL2_CHK_SUM2:
  2610. case AFE_DL3_CHK_SUM1:
  2611. case AFE_DL3_CHK_SUM2:
  2612. case AFE_DL6_CHK_SUM1:
  2613. case AFE_DL6_CHK_SUM2:
  2614. case AFE_DL7_CHK_SUM1:
  2615. case AFE_DL7_CHK_SUM2:
  2616. case AFE_UL9_CHK_SUM1:
  2617. case AFE_UL9_CHK_SUM2:
  2618. case AFE_BUS_MON1:
  2619. case UL1_MOD2AGT_CNT_LAT:
  2620. case UL2_MOD2AGT_CNT_LAT:
  2621. case UL3_MOD2AGT_CNT_LAT:
  2622. case UL4_MOD2AGT_CNT_LAT:
  2623. case UL5_MOD2AGT_CNT_LAT:
  2624. case UL6_MOD2AGT_CNT_LAT:
  2625. case UL8_MOD2AGT_CNT_LAT:
  2626. case UL9_MOD2AGT_CNT_LAT:
  2627. case UL10_MOD2AGT_CNT_LAT:
  2628. case AFE_MEMIF_BUF_FULL_MON:
  2629. case AFE_MEMIF_BUF_MON1:
  2630. case AFE_MEMIF_BUF_MON3:
  2631. case AFE_MEMIF_BUF_MON4:
  2632. case AFE_MEMIF_BUF_MON5:
  2633. case AFE_MEMIF_BUF_MON6:
  2634. case AFE_MEMIF_BUF_MON7:
  2635. case AFE_MEMIF_BUF_MON8:
  2636. case AFE_MEMIF_BUF_MON9:
  2637. case AFE_MEMIF_BUF_MON10:
  2638. case DL2_AGENT2MODULE_CNT:
  2639. case DL3_AGENT2MODULE_CNT:
  2640. case DL6_AGENT2MODULE_CNT:
  2641. case DL7_AGENT2MODULE_CNT:
  2642. case DL8_AGENT2MODULE_CNT:
  2643. case DL10_AGENT2MODULE_CNT:
  2644. case DL11_AGENT2MODULE_CNT:
  2645. case UL1_MODULE2AGENT_CNT:
  2646. case UL2_MODULE2AGENT_CNT:
  2647. case UL3_MODULE2AGENT_CNT:
  2648. case UL4_MODULE2AGENT_CNT:
  2649. case UL5_MODULE2AGENT_CNT:
  2650. case UL6_MODULE2AGENT_CNT:
  2651. case UL8_MODULE2AGENT_CNT:
  2652. case UL9_MODULE2AGENT_CNT:
  2653. case UL10_MODULE2AGENT_CNT:
  2654. case AFE_DMIC0_SRC_DEBUG_MON0:
  2655. case AFE_DMIC0_UL_SRC_MON0:
  2656. case AFE_DMIC0_UL_SRC_MON1:
  2657. case AFE_DMIC1_SRC_DEBUG_MON0:
  2658. case AFE_DMIC1_UL_SRC_MON0:
  2659. case AFE_DMIC1_UL_SRC_MON1:
  2660. case AFE_DMIC2_SRC_DEBUG_MON0:
  2661. case AFE_DMIC2_UL_SRC_MON0:
  2662. case AFE_DMIC2_UL_SRC_MON1:
  2663. case AFE_DMIC3_SRC_DEBUG_MON0:
  2664. case AFE_DMIC3_UL_SRC_MON0:
  2665. case AFE_DMIC3_UL_SRC_MON1:
  2666. case DMIC_GAIN1_CUR:
  2667. case DMIC_GAIN2_CUR:
  2668. case DMIC_GAIN3_CUR:
  2669. case DMIC_GAIN4_CUR:
  2670. case ETDM_IN1_MONITOR:
  2671. case ETDM_IN2_MONITOR:
  2672. case ETDM_OUT1_MONITOR:
  2673. case ETDM_OUT2_MONITOR:
  2674. case ETDM_OUT3_MONITOR:
  2675. case AFE_ADDA_SRC_DEBUG_MON0:
  2676. case AFE_ADDA_SRC_DEBUG_MON1:
  2677. case AFE_ADDA_DL_SDM_FIFO_MON:
  2678. case AFE_ADDA_DL_SRC_LCH_MON:
  2679. case AFE_ADDA_DL_SRC_RCH_MON:
  2680. case AFE_ADDA_DL_SDM_OUT_MON:
  2681. case AFE_GASRC0_NEW_CON8:
  2682. case AFE_GASRC0_NEW_CON9:
  2683. case AFE_GASRC0_NEW_CON12:
  2684. case AFE_GASRC1_NEW_CON8:
  2685. case AFE_GASRC1_NEW_CON9:
  2686. case AFE_GASRC1_NEW_CON12:
  2687. case AFE_GASRC2_NEW_CON8:
  2688. case AFE_GASRC2_NEW_CON9:
  2689. case AFE_GASRC2_NEW_CON12:
  2690. case AFE_GASRC3_NEW_CON8:
  2691. case AFE_GASRC3_NEW_CON9:
  2692. case AFE_GASRC3_NEW_CON12:
  2693. case AFE_GASRC4_NEW_CON8:
  2694. case AFE_GASRC4_NEW_CON9:
  2695. case AFE_GASRC4_NEW_CON12:
  2696. case AFE_GASRC5_NEW_CON8:
  2697. case AFE_GASRC5_NEW_CON9:
  2698. case AFE_GASRC5_NEW_CON12:
  2699. case AFE_GASRC6_NEW_CON8:
  2700. case AFE_GASRC6_NEW_CON9:
  2701. case AFE_GASRC6_NEW_CON12:
  2702. case AFE_GASRC7_NEW_CON8:
  2703. case AFE_GASRC7_NEW_CON9:
  2704. case AFE_GASRC7_NEW_CON12:
  2705. case AFE_GASRC8_NEW_CON8:
  2706. case AFE_GASRC8_NEW_CON9:
  2707. case AFE_GASRC8_NEW_CON12:
  2708. case AFE_GASRC9_NEW_CON8:
  2709. case AFE_GASRC9_NEW_CON9:
  2710. case AFE_GASRC9_NEW_CON12:
  2711. case AFE_GASRC10_NEW_CON8:
  2712. case AFE_GASRC10_NEW_CON9:
  2713. case AFE_GASRC10_NEW_CON12:
  2714. case AFE_GASRC11_NEW_CON8:
  2715. case AFE_GASRC11_NEW_CON9:
  2716. case AFE_GASRC11_NEW_CON12:
  2717. return true;
  2718. default:
  2719. return false;
  2720. };
  2721. }
  2722. static const struct regmap_config mt8188_afe_regmap_config = {
  2723. .reg_bits = 32,
  2724. .reg_stride = 4,
  2725. .val_bits = 32,
  2726. .volatile_reg = mt8188_is_volatile_reg,
  2727. .max_register = AFE_MAX_REGISTER,
  2728. .num_reg_defaults_raw = ((AFE_MAX_REGISTER / 4) + 1),
  2729. .cache_type = REGCACHE_FLAT,
  2730. };
  2731. #define AFE_IRQ_CLR_BITS (0x387)
  2732. #define ASYS_IRQ_CLR_BITS (0xffff)
  2733. static irqreturn_t mt8188_afe_irq_handler(int irq_id, void *dev_id)
  2734. {
  2735. struct mtk_base_afe *afe = dev_id;
  2736. unsigned int val = 0;
  2737. unsigned int asys_irq_clr_bits = 0;
  2738. unsigned int afe_irq_clr_bits = 0;
  2739. unsigned int irq_status_bits = 0;
  2740. unsigned int irq_clr_bits = 0;
  2741. unsigned int mcu_irq_mask = 0;
  2742. int i = 0;
  2743. int ret = 0;
  2744. ret = regmap_read(afe->regmap, AFE_IRQ_STATUS, &val);
  2745. if (ret) {
  2746. dev_err(afe->dev, "%s irq status err\n", __func__);
  2747. afe_irq_clr_bits = AFE_IRQ_CLR_BITS;
  2748. asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;
  2749. goto err_irq;
  2750. }
  2751. ret = regmap_read(afe->regmap, AFE_IRQ_MASK, &mcu_irq_mask);
  2752. if (ret) {
  2753. dev_err(afe->dev, "%s read irq mask err\n", __func__);
  2754. afe_irq_clr_bits = AFE_IRQ_CLR_BITS;
  2755. asys_irq_clr_bits = ASYS_IRQ_CLR_BITS;
  2756. goto err_irq;
  2757. }
  2758. /* only clr cpu irq */
  2759. val &= mcu_irq_mask;
  2760. for (i = 0; i < MT8188_AFE_MEMIF_NUM; i++) {
  2761. struct mtk_base_afe_memif *memif = &afe->memif[i];
  2762. struct mtk_base_irq_data const *irq_data;
  2763. if (memif->irq_usage < 0)
  2764. continue;
  2765. irq_data = afe->irqs[memif->irq_usage].irq_data;
  2766. irq_status_bits = BIT(irq_data->irq_status_shift);
  2767. irq_clr_bits = BIT(irq_data->irq_clr_shift);
  2768. if (!(val & irq_status_bits))
  2769. continue;
  2770. if (irq_data->irq_clr_reg == ASYS_IRQ_CLR)
  2771. asys_irq_clr_bits |= irq_clr_bits;
  2772. else
  2773. afe_irq_clr_bits |= irq_clr_bits;
  2774. snd_pcm_period_elapsed(memif->substream);
  2775. }
  2776. err_irq:
  2777. /* clear irq */
  2778. if (asys_irq_clr_bits)
  2779. regmap_write(afe->regmap, ASYS_IRQ_CLR, asys_irq_clr_bits);
  2780. if (afe_irq_clr_bits)
  2781. regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, afe_irq_clr_bits);
  2782. return IRQ_HANDLED;
  2783. }
  2784. static int mt8188_afe_runtime_suspend(struct device *dev)
  2785. {
  2786. struct mtk_base_afe *afe = dev_get_drvdata(dev);
  2787. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2788. if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)
  2789. goto skip_regmap;
  2790. mt8188_afe_disable_main_clock(afe);
  2791. regcache_cache_only(afe->regmap, true);
  2792. regcache_mark_dirty(afe->regmap);
  2793. skip_regmap:
  2794. mt8188_afe_disable_reg_rw_clk(afe);
  2795. return 0;
  2796. }
  2797. static int mt8188_afe_runtime_resume(struct device *dev)
  2798. {
  2799. struct mtk_base_afe *afe = dev_get_drvdata(dev);
  2800. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2801. struct arm_smccc_res res;
  2802. arm_smccc_smc(MTK_SIP_AUDIO_CONTROL,
  2803. MTK_AUDIO_SMC_OP_DOMAIN_SIDEBANDS,
  2804. 0, 0, 0, 0, 0, 0, &res);
  2805. mt8188_afe_enable_reg_rw_clk(afe);
  2806. if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)
  2807. goto skip_regmap;
  2808. regcache_cache_only(afe->regmap, false);
  2809. regcache_sync(afe->regmap);
  2810. mt8188_afe_enable_main_clock(afe);
  2811. skip_regmap:
  2812. return 0;
  2813. }
  2814. static int init_memif_priv_data(struct mtk_base_afe *afe)
  2815. {
  2816. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2817. struct mtk_dai_memif_priv *memif_priv;
  2818. int i;
  2819. for (i = MT8188_AFE_MEMIF_START; i < MT8188_AFE_MEMIF_END; i++) {
  2820. memif_priv = devm_kzalloc(afe->dev,
  2821. sizeof(struct mtk_dai_memif_priv),
  2822. GFP_KERNEL);
  2823. if (!memif_priv)
  2824. return -ENOMEM;
  2825. afe_priv->dai_priv[i] = memif_priv;
  2826. }
  2827. return 0;
  2828. }
  2829. static int mt8188_dai_memif_register(struct mtk_base_afe *afe)
  2830. {
  2831. struct mtk_base_afe_dai *dai;
  2832. dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
  2833. if (!dai)
  2834. return -ENOMEM;
  2835. list_add(&dai->list, &afe->sub_dais);
  2836. dai->dai_drivers = mt8188_memif_dai_driver;
  2837. dai->num_dai_drivers = ARRAY_SIZE(mt8188_memif_dai_driver);
  2838. dai->dapm_widgets = mt8188_memif_widgets;
  2839. dai->num_dapm_widgets = ARRAY_SIZE(mt8188_memif_widgets);
  2840. dai->dapm_routes = mt8188_memif_routes;
  2841. dai->num_dapm_routes = ARRAY_SIZE(mt8188_memif_routes);
  2842. dai->controls = mt8188_memif_controls;
  2843. dai->num_controls = ARRAY_SIZE(mt8188_memif_controls);
  2844. return init_memif_priv_data(afe);
  2845. }
  2846. typedef int (*dai_register_cb)(struct mtk_base_afe *);
  2847. static const dai_register_cb dai_register_cbs[] = {
  2848. mt8188_dai_adda_register,
  2849. mt8188_dai_etdm_register,
  2850. mt8188_dai_pcm_register,
  2851. mt8188_dai_memif_register,
  2852. };
  2853. static const struct reg_sequence mt8188_afe_reg_defaults[] = {
  2854. { AFE_IRQ_MASK, 0x387ffff },
  2855. { AFE_IRQ3_CON, BIT(30) },
  2856. { AFE_IRQ9_CON, BIT(30) },
  2857. { ETDM_IN1_CON4, 0x12000100 },
  2858. { ETDM_IN2_CON4, 0x12000100 },
  2859. };
  2860. static const struct reg_sequence mt8188_cg_patch[] = {
  2861. { AUDIO_TOP_CON0, 0xfffffffb },
  2862. { AUDIO_TOP_CON1, 0xfffffff8 },
  2863. };
  2864. static int mt8188_afe_init_registers(struct mtk_base_afe *afe)
  2865. {
  2866. return regmap_multi_reg_write(afe->regmap,
  2867. mt8188_afe_reg_defaults,
  2868. ARRAY_SIZE(mt8188_afe_reg_defaults));
  2869. }
  2870. static int mt8188_afe_parse_of(struct mtk_base_afe *afe,
  2871. struct device_node *np)
  2872. {
  2873. #if IS_ENABLED(CONFIG_SND_SOC_MT6359)
  2874. struct mt8188_afe_private *afe_priv = afe->platform_priv;
  2875. afe_priv->topckgen = syscon_regmap_lookup_by_phandle(afe->dev->of_node,
  2876. "mediatek,topckgen");
  2877. if (IS_ERR(afe_priv->topckgen))
  2878. return dev_err_probe(afe->dev, PTR_ERR(afe_priv->topckgen),
  2879. "%s() Cannot find topckgen controller\n",
  2880. __func__);
  2881. #endif
  2882. return 0;
  2883. }
  2884. #define MT8188_DELAY_US 10
  2885. #define MT8188_TIMEOUT_US USEC_PER_SEC
  2886. static int bus_protect_enable(struct regmap *regmap)
  2887. {
  2888. int ret;
  2889. u32 val;
  2890. u32 mask;
  2891. val = 0;
  2892. mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;
  2893. regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);
  2894. ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,
  2895. val, (val & mask) == mask,
  2896. MT8188_DELAY_US, MT8188_TIMEOUT_US);
  2897. if (ret)
  2898. return ret;
  2899. val = 0;
  2900. mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;
  2901. regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_SET, mask);
  2902. ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,
  2903. val, (val & mask) == mask,
  2904. MT8188_DELAY_US, MT8188_TIMEOUT_US);
  2905. return ret;
  2906. }
  2907. static int bus_protect_disable(struct regmap *regmap)
  2908. {
  2909. int ret;
  2910. u32 val;
  2911. u32 mask;
  2912. val = 0;
  2913. mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2;
  2914. regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);
  2915. ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,
  2916. val, !(val & mask),
  2917. MT8188_DELAY_US, MT8188_TIMEOUT_US);
  2918. if (ret)
  2919. return ret;
  2920. val = 0;
  2921. mask = MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1;
  2922. regmap_write(regmap, MT8188_TOP_AXI_PROT_EN_2_CLR, mask);
  2923. ret = regmap_read_poll_timeout(regmap, MT8188_TOP_AXI_PROT_EN_2_STA,
  2924. val, !(val & mask),
  2925. MT8188_DELAY_US, MT8188_TIMEOUT_US);
  2926. return ret;
  2927. }
  2928. static int mt8188_afe_pcm_dev_probe(struct platform_device *pdev)
  2929. {
  2930. struct mtk_base_afe *afe;
  2931. struct mt8188_afe_private *afe_priv;
  2932. struct device *dev = &pdev->dev;
  2933. struct reset_control *rstc;
  2934. struct regmap *infra_ao;
  2935. int i, irq_id, ret;
  2936. ret = of_reserved_mem_device_init(dev);
  2937. if (ret)
  2938. dev_dbg(dev, "failed to assign memory region: %d\n", ret);
  2939. ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(33));
  2940. if (ret)
  2941. return ret;
  2942. afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
  2943. if (!afe)
  2944. return -ENOMEM;
  2945. afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
  2946. GFP_KERNEL);
  2947. if (!afe->platform_priv)
  2948. return -ENOMEM;
  2949. afe_priv = afe->platform_priv;
  2950. afe->dev = &pdev->dev;
  2951. afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
  2952. if (IS_ERR(afe->base_addr))
  2953. return dev_err_probe(dev, PTR_ERR(afe->base_addr),
  2954. "AFE base_addr not found\n");
  2955. infra_ao = syscon_regmap_lookup_by_phandle(dev->of_node,
  2956. "mediatek,infracfg");
  2957. if (IS_ERR(infra_ao))
  2958. return dev_err_probe(dev, PTR_ERR(infra_ao),
  2959. "%s() Cannot find infra_ao controller\n",
  2960. __func__);
  2961. /* reset controller to reset audio regs before regmap cache */
  2962. rstc = devm_reset_control_get_exclusive(dev, "audiosys");
  2963. if (IS_ERR(rstc))
  2964. return dev_err_probe(dev, PTR_ERR(rstc),
  2965. "could not get audiosys reset\n");
  2966. ret = bus_protect_enable(infra_ao);
  2967. if (ret) {
  2968. dev_err(dev, "bus_protect_enable failed\n");
  2969. return ret;
  2970. }
  2971. ret = reset_control_reset(rstc);
  2972. if (ret) {
  2973. dev_err(dev, "failed to trigger audio reset:%d\n", ret);
  2974. return ret;
  2975. }
  2976. ret = bus_protect_disable(infra_ao);
  2977. if (ret) {
  2978. dev_err(dev, "bus_protect_disable failed\n");
  2979. return ret;
  2980. }
  2981. /* initial audio related clock */
  2982. ret = mt8188_afe_init_clock(afe);
  2983. if (ret)
  2984. return dev_err_probe(dev, ret, "init clock error");
  2985. spin_lock_init(&afe_priv->afe_ctrl_lock);
  2986. mutex_init(&afe->irq_alloc_lock);
  2987. /* irq initialize */
  2988. afe->irqs_size = MT8188_AFE_IRQ_NUM;
  2989. afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
  2990. GFP_KERNEL);
  2991. if (!afe->irqs)
  2992. return -ENOMEM;
  2993. for (i = 0; i < afe->irqs_size; i++)
  2994. afe->irqs[i].irq_data = &irq_data[i];
  2995. /* init memif */
  2996. afe->memif_size = MT8188_AFE_MEMIF_NUM;
  2997. afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
  2998. GFP_KERNEL);
  2999. if (!afe->memif)
  3000. return -ENOMEM;
  3001. for (i = 0; i < afe->memif_size; i++) {
  3002. afe->memif[i].data = &memif_data[i];
  3003. afe->memif[i].irq_usage = mt8188_afe_memif_const_irqs[i];
  3004. afe->memif[i].const_irq = 1;
  3005. afe->irqs[afe->memif[i].irq_usage].irq_occupyed = true;
  3006. }
  3007. /* request irq */
  3008. irq_id = platform_get_irq(pdev, 0);
  3009. if (irq_id < 0)
  3010. return dev_err_probe(dev, irq_id, "no irq found");
  3011. ret = devm_request_irq(dev, irq_id, mt8188_afe_irq_handler,
  3012. IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
  3013. if (ret)
  3014. return dev_err_probe(dev, ret, "could not request_irq for asys-isr\n");
  3015. /* init sub_dais */
  3016. INIT_LIST_HEAD(&afe->sub_dais);
  3017. for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
  3018. ret = dai_register_cbs[i](afe);
  3019. if (ret)
  3020. return dev_err_probe(dev, ret, "dai register i %d fail\n", i);
  3021. }
  3022. /* init dai_driver and component_driver */
  3023. ret = mtk_afe_combine_sub_dai(afe);
  3024. if (ret)
  3025. return dev_err_probe(dev, ret, "mtk_afe_combine_sub_dai fail\n");
  3026. afe->mtk_afe_hardware = &mt8188_afe_hardware;
  3027. afe->memif_fs = mt8188_memif_fs;
  3028. afe->irq_fs = mt8188_irq_fs;
  3029. afe->runtime_resume = mt8188_afe_runtime_resume;
  3030. afe->runtime_suspend = mt8188_afe_runtime_suspend;
  3031. platform_set_drvdata(pdev, afe);
  3032. ret = mt8188_afe_parse_of(afe, pdev->dev.of_node);
  3033. if (ret)
  3034. return ret;
  3035. ret = devm_pm_runtime_enable(dev);
  3036. if (ret)
  3037. return ret;
  3038. /* enable clock for regcache get default value from hw */
  3039. afe_priv->pm_runtime_bypass_reg_ctl = true;
  3040. ret = pm_runtime_resume_and_get(dev);
  3041. if (ret)
  3042. return dev_err_probe(dev, ret, "failed to resume device\n");
  3043. afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,
  3044. &mt8188_afe_regmap_config);
  3045. if (IS_ERR(afe->regmap)) {
  3046. ret = PTR_ERR(afe->regmap);
  3047. goto err_pm_put;
  3048. }
  3049. ret = regmap_register_patch(afe->regmap, mt8188_cg_patch,
  3050. ARRAY_SIZE(mt8188_cg_patch));
  3051. if (ret < 0) {
  3052. dev_info(dev, "Failed to apply cg patch\n");
  3053. goto err_pm_put;
  3054. }
  3055. /* register component */
  3056. ret = devm_snd_soc_register_component(dev, &mtk_afe_pcm_platform,
  3057. afe->dai_drivers, afe->num_dai_drivers);
  3058. if (ret) {
  3059. dev_warn(dev, "err_platform\n");
  3060. goto err_pm_put;
  3061. }
  3062. mt8188_afe_init_registers(afe);
  3063. pm_runtime_put_sync(&pdev->dev);
  3064. afe_priv->pm_runtime_bypass_reg_ctl = false;
  3065. regcache_cache_only(afe->regmap, true);
  3066. regcache_mark_dirty(afe->regmap);
  3067. return 0;
  3068. err_pm_put:
  3069. pm_runtime_put_sync(dev);
  3070. return ret;
  3071. }
  3072. static const struct of_device_id mt8188_afe_pcm_dt_match[] = {
  3073. { .compatible = "mediatek,mt8188-afe", },
  3074. {},
  3075. };
  3076. MODULE_DEVICE_TABLE(of, mt8188_afe_pcm_dt_match);
  3077. static const struct dev_pm_ops mt8188_afe_pm_ops = {
  3078. SET_RUNTIME_PM_OPS(mt8188_afe_runtime_suspend,
  3079. mt8188_afe_runtime_resume, NULL)
  3080. };
  3081. static struct platform_driver mt8188_afe_pcm_driver = {
  3082. .driver = {
  3083. .name = "mt8188-audio",
  3084. .of_match_table = mt8188_afe_pcm_dt_match,
  3085. .pm = &mt8188_afe_pm_ops,
  3086. },
  3087. .probe = mt8188_afe_pcm_dev_probe,
  3088. };
  3089. module_platform_driver(mt8188_afe_pcm_driver);
  3090. MODULE_DESCRIPTION("MediaTek SoC AFE platform driver for ALSA 8188");
  3091. MODULE_AUTHOR("Chun-Chia.Chiu <chun-chia.chiu@mediatek.com>");
  3092. MODULE_LICENSE("GPL");