mt_afe_control.c 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523
  1. /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/types.h>
  13. #include "mt_afe_def.h"
  14. #include "mt_afe_reg.h"
  15. #include "mt_afe_clk.h"
  16. #include "mt_afe_control.h"
  17. #include <linux/slab.h>
  18. #include <linux/delay.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/spinlock.h>
  21. #include <linux/dma-mapping.h>
  22. #include <linux/gpio.h>
  23. #include <linux/of.h>
  24. #include <linux/of_irq.h>
  25. #include <linux/pm_runtime.h>
  26. /* #define DEBUG_IRQ_STATUS */
  27. #ifdef DEBUG_IRQ_STATUS
  28. #include <mach/mt_gpt.h>
  29. static unsigned long long irq1_counter;
  30. static unsigned int pre_irq1_gpt_cnt;
  31. #endif
  32. static DEFINE_SPINLOCK(afe_control_lock);
  33. #define MT8173_AFE_MCU_IRQ_LINE (134 + 32)
  34. #define BOARD_CHANNEL_TYPE_PROPERTY "mediatek,board-channel-type"
  35. /*
  36. * global variable control
  37. */
  38. /* static variable */
  39. static struct mt_afe_merge_interface *audio_mrg;
  40. static struct mt_afe_digital_dai_bt *audio_dai_bt;
  41. static struct mt_afe_digital_i2s *audio_adc_i2s;
  42. static const bool audio_adc_i2s_status;
  43. static struct mt_afe_digital_i2s *audio_2nd_i2s;
  44. static struct mt_afe_irq_status *audio_mcu_mode[MT_AFE_IRQ_MCU_MODE_NUM] = { NULL };
  45. static struct mt_afe_mem_if_attribute *audio_mem_if[MT_AFE_DIGITAL_BLOCK_NUM] = { NULL };
  46. static struct mt_afe_mem_control_t *afe_mem_control_context[MT_AFE_MEM_CTX_COUNT] = { NULL };
  47. static int apll_clock_divider_power_refcount[MT_AFE_APLL_CLOCK_TYPE_NUM] = { 0 };
  48. static struct mt_afe_suspend_reg suspend_reg;
  49. static bool aud_drv_suspend_status;
  50. static unsigned int audio_irq_id = MT8173_AFE_MCU_IRQ_LINE;
  51. static unsigned int board_channel_type;
  52. static struct device *mach_dev;
  53. static bool audio_power_status;
  54. /*
  55. * static function declaration
  56. */
  57. static void mt_afe_init_control(void *dev);
  58. static int mt_afe_register_irq(void *dev);
  59. static irqreturn_t mt_afe_irq_handler(int irq, void *dev_id);
  60. static uint32_t mt_afe_rate_to_idx(uint32_t sample_rate);
  61. static void mt_afe_dl_interrupt_handler(void);
  62. static void mt_afe_dl2_interrupt_handler(void);
  63. static void mt_afe_ul_interrupt_handler(void);
  64. static void mt_afe_hdmi_interrupt_handler(void);
  65. static void mt_afe_hdmi_raw_interrupt_handler(void);
  66. static void mt_afe_spdif_interrupt_handler(void);
  67. static void mt_afe_handle_mem_context(enum mt_afe_mem_context mem_context);
  68. static void mt_afe_clean_predistortion(void);
  69. static bool mt_afe_set_dl_src2(uint32_t sample_rate);
  70. static bool mt_afe_is_memif_enable(void);
  71. static bool mt_afe_is_ul_memif_enable(void);
  72. static uint32_t mt_afe_get_apll_by_rate(uint32_t sample_rate);
  73. static void mt_afe_store_reg(struct mt_afe_suspend_reg *backup_reg);
  74. static void mt_afe_recover_reg(struct mt_afe_suspend_reg *backup_reg);
  75. static void mt_afe_enable_i2s_div_power(uint32_t divider);
  76. static void mt_afe_disable_i2s_div_power(uint32_t divider);
  77. /*
  78. * function implementation
  79. */
  80. int mt_afe_platform_init(void *dev)
  81. {
  82. struct device *pdev = dev;
  83. int ret = 0;
  84. unsigned int irq_id = 0;
  85. if (!pdev->of_node) {
  86. pr_warn("%s invalid of_node\n", __func__);
  87. return -ENODEV;
  88. }
  89. irq_id = irq_of_parse_and_map(pdev->of_node, 0);
  90. if (irq_id)
  91. audio_irq_id = irq_id;
  92. else
  93. pr_warn("%s irq_of_parse_and_map invalid irq\n", __func__);
  94. ret = of_property_read_u32(pdev->of_node, BOARD_CHANNEL_TYPE_PROPERTY,
  95. &board_channel_type);
  96. if (ret) {
  97. pr_warn("%s read property %s fail in node %s\n", __func__,
  98. BOARD_CHANNEL_TYPE_PROPERTY, pdev->of_node->full_name);
  99. }
  100. ret = mt_afe_reg_remap(dev);
  101. if (ret)
  102. return ret;
  103. ret = mt_afe_init_clock(dev);
  104. if (ret)
  105. return ret;
  106. pm_runtime_enable(dev);
  107. ret = pm_runtime_get_sync(dev);
  108. if (ret < 0) {
  109. pr_warn("%s pm_runtime_get_sync fail %d\n", __func__, ret);
  110. return ret;
  111. }
  112. mt_afe_power_off_default_clock();
  113. mt_afe_register_irq(dev);
  114. mt_afe_apb_bus_init();
  115. mt_afe_init_control(dev);
  116. mach_dev = dev;
  117. audio_power_status = true;
  118. return ret;
  119. }
  120. void mt_afe_platform_deinit(void *dev)
  121. {
  122. mt_afe_reg_unmap();
  123. if (audio_power_status) {
  124. pm_runtime_put_sync(dev);
  125. audio_power_status = false;
  126. }
  127. pm_runtime_disable(dev);
  128. mt_afe_deinit_clock(dev);
  129. }
  130. void mt_afe_set_sample_rate(uint32_t aud_block, uint32_t sample_rate)
  131. {
  132. pr_debug("%s aud_block = %u sample_rate = %u\n", __func__, aud_block, sample_rate);
  133. sample_rate = mt_afe_rate_to_idx(sample_rate);
  134. switch (aud_block) {
  135. case MT_AFE_DIGITAL_BLOCK_MEM_DL1:
  136. mt_afe_set_reg(AFE_DAC_CON1, sample_rate, 0x0000000f);
  137. break;
  138. case MT_AFE_DIGITAL_BLOCK_MEM_DL1_DATA2:
  139. mt_afe_set_reg(AFE_DAC_CON0, sample_rate << 16, 0x000f0000);
  140. break;
  141. case MT_AFE_DIGITAL_BLOCK_MEM_DL2:
  142. mt_afe_set_reg(AFE_DAC_CON1, sample_rate << 4, 0x000000f0);
  143. break;
  144. case MT_AFE_DIGITAL_BLOCK_MEM_I2S:
  145. mt_afe_set_reg(AFE_DAC_CON1, sample_rate << 8, 0x00000f00);
  146. break;
  147. case MT_AFE_DIGITAL_BLOCK_MEM_AWB:
  148. mt_afe_set_reg(AFE_DAC_CON1, sample_rate << 12, 0x0000f000);
  149. break;
  150. case MT_AFE_DIGITAL_BLOCK_MEM_VUL:
  151. mt_afe_set_reg(AFE_DAC_CON1, sample_rate << 16, 0x000f0000);
  152. break;
  153. case MT_AFE_DIGITAL_BLOCK_MEM_VUL_DATA2:
  154. mt_afe_set_reg(AFE_DAC_CON0, sample_rate << 20, 0x00f00000);
  155. break;
  156. case MT_AFE_DIGITAL_BLOCK_MEM_DAI:
  157. if (sample_rate == MT_AFE_I2S_SAMPLERATE_8K)
  158. mt_afe_set_reg(AFE_DAC_CON0, 0 << 24, 1 << 24);
  159. else if (sample_rate == MT_AFE_I2S_SAMPLERATE_16K)
  160. mt_afe_set_reg(AFE_DAC_CON0, 1 << 24, 1 << 24);
  161. else if (sample_rate == MT_AFE_I2S_SAMPLERATE_32K)
  162. mt_afe_set_reg(AFE_DAC_CON0, 2 << 24, 1 << 24);
  163. else
  164. pr_warn("%s aud_block = %u invalid sample_rate = %u\n", __func__,
  165. aud_block, sample_rate);
  166. break;
  167. case MT_AFE_DIGITAL_BLOCK_MEM_MOD_DAI:
  168. if (sample_rate == MT_AFE_I2S_SAMPLERATE_8K)
  169. mt_afe_set_reg(AFE_DAC_CON1, 0 << 30, 1 << 30);
  170. else if (sample_rate == MT_AFE_I2S_SAMPLERATE_16K)
  171. mt_afe_set_reg(AFE_DAC_CON1, 1 << 30, 1 << 30);
  172. else if (sample_rate == MT_AFE_I2S_SAMPLERATE_32K)
  173. mt_afe_set_reg(AFE_DAC_CON1, 2 << 30, 1 << 30);
  174. else
  175. pr_warn("%s aud_block = %u invalid sample_rate = %u\n", __func__,
  176. aud_block, sample_rate);
  177. break;
  178. default:
  179. pr_debug("%s unexpected aud_block = %u\n", __func__, aud_block);
  180. break;
  181. }
  182. }
  183. void mt_afe_set_channels(uint32_t memory_interface, uint32_t channel)
  184. {
  185. uint32_t mono = (channel == 1) ? 1 : 0;
  186. switch (memory_interface) {
  187. case MT_AFE_DIGITAL_BLOCK_MEM_DL1:
  188. mt_afe_set_reg(AFE_DAC_CON1, mono << 21, 1 << 21);
  189. break;
  190. case MT_AFE_DIGITAL_BLOCK_MEM_DL1_DATA2:
  191. mt_afe_set_reg(AFE_DAC_CON1, mono << 20, 1 << 20);
  192. break;
  193. case MT_AFE_DIGITAL_BLOCK_MEM_DL2:
  194. mt_afe_set_reg(AFE_DAC_CON1, mono << 22, 1 << 22);
  195. break;
  196. case MT_AFE_DIGITAL_BLOCK_MEM_AWB:
  197. mt_afe_set_reg(AFE_DAC_CON1, mono << 24, 1 << 24);
  198. break;
  199. case MT_AFE_DIGITAL_BLOCK_MEM_VUL:
  200. mt_afe_set_reg(AFE_DAC_CON1, mono << 27, 1 << 27);
  201. break;
  202. case MT_AFE_DIGITAL_BLOCK_MEM_VUL_DATA2:
  203. mt_afe_set_reg(AFE_DAC_CON0, mono << 10, 1 << 10);
  204. break;
  205. default:
  206. pr_warn("%s unexpected memory interface = %u channel = %u\n",
  207. __func__, memory_interface, channel);
  208. break;
  209. }
  210. }
  211. void mt_afe_set_mono_type(uint32_t memory_interface, uint32_t mono_type)
  212. {
  213. switch (memory_interface) {
  214. case MT_AFE_DIGITAL_BLOCK_MEM_AWB:
  215. mt_afe_set_reg(AFE_DAC_CON1, mono_type << 25, 1 << 25);
  216. break;
  217. case MT_AFE_DIGITAL_BLOCK_MEM_VUL:
  218. mt_afe_set_reg(AFE_DAC_CON1, mono_type << 28, 1 << 28);
  219. break;
  220. case MT_AFE_DIGITAL_BLOCK_MEM_VUL_DATA2:
  221. mt_afe_set_reg(AFE_DAC_CON0, mono_type << 11, 1 << 11);
  222. break;
  223. default:
  224. pr_warn("%s unexpected memory interface = %u\n",
  225. __func__, memory_interface);
  226. break;
  227. }
  228. }
  229. void mt_afe_set_irq_counter(uint32_t irq_mode, uint32_t counter)
  230. {
  231. switch (irq_mode) {
  232. case MT_AFE_IRQ_MCU_MODE_IRQ1:
  233. mt_afe_set_reg(AFE_IRQ_MCU_CNT1, counter, 0x0003ffff);
  234. break;
  235. case MT_AFE_IRQ_MCU_MODE_IRQ2:
  236. mt_afe_set_reg(AFE_IRQ_MCU_CNT2, counter, 0x0003ffff);
  237. break;
  238. case MT_AFE_IRQ_MCU_MODE_IRQ5:
  239. mt_afe_set_reg(AFE_IRQ_MCU_CNT5, counter, 0x0003ffff);
  240. break;
  241. case MT_AFE_IRQ_MCU_MODE_IRQ3:
  242. mt_afe_set_reg(AFE_IRQ_MCU_CNT1, counter << 20, 0xfff00000);
  243. break;
  244. case MT_AFE_IRQ_MCU_MODE_IRQ4:
  245. mt_afe_set_reg(AFE_IRQ_MCU_CNT2, counter << 20, 0xfff00000);
  246. break;
  247. case MT_AFE_IRQ_MCU_MODE_IRQ7:
  248. mt_afe_set_reg(AFE_IRQ_MCU_CNT7, counter, 0x0003ffff);
  249. break;
  250. default:
  251. break;
  252. }
  253. }
  254. void mt_afe_set_irq_rate(uint32_t irq_mode, uint32_t sample_rate)
  255. {
  256. switch (irq_mode) {
  257. case MT_AFE_IRQ_MCU_MODE_IRQ1:
  258. mt_afe_set_reg(AFE_IRQ_MCU_CON, (mt_afe_rate_to_idx(sample_rate) << 4),
  259. 0x000000f0);
  260. break;
  261. case MT_AFE_IRQ_MCU_MODE_IRQ2:
  262. mt_afe_set_reg(AFE_IRQ_MCU_CON, (mt_afe_rate_to_idx(sample_rate) << 8),
  263. 0x00000f00);
  264. break;
  265. case MT_AFE_IRQ_MCU_MODE_IRQ3:
  266. mt_afe_set_reg(AFE_IRQ_MCU_CON, (mt_afe_rate_to_idx(sample_rate) << 16),
  267. 0x000f0000);
  268. break;
  269. case MT_AFE_IRQ_MCU_MODE_IRQ4:
  270. mt_afe_set_reg(AFE_IRQ_MCU_CON, (mt_afe_rate_to_idx(sample_rate) << 20),
  271. 0x00f00000);
  272. break;
  273. case MT_AFE_IRQ_MCU_MODE_IRQ7:
  274. mt_afe_set_reg(AFE_IRQ_MCU_CON, (mt_afe_rate_to_idx(sample_rate) << 24),
  275. 0x0f000000);
  276. break;
  277. default:
  278. break;
  279. }
  280. }
  281. void mt_afe_set_irq_state(uint32_t irq_mode, bool enable)
  282. {
  283. pr_debug("%s irq_mode = %d enable = %d\n", __func__, irq_mode, enable);
  284. switch (irq_mode) {
  285. case MT_AFE_IRQ_MCU_MODE_IRQ2:
  286. if (unlikely(!enable && mt_afe_is_ul_memif_enable())) {
  287. /* IRQ2 is in used */
  288. pr_debug("skip disable IRQ2, AFE_DAC_CON0 = 0x%x\n",
  289. mt_afe_get_reg(AFE_DAC_CON0));
  290. break;
  291. }
  292. /* fall through */
  293. case MT_AFE_IRQ_MCU_MODE_IRQ1:
  294. case MT_AFE_IRQ_MCU_MODE_IRQ3:
  295. case MT_AFE_IRQ_MCU_MODE_IRQ4:
  296. #ifdef DEBUG_IRQ_STATUS
  297. if (irq_mode == MT_AFE_IRQ_MCU_MODE_IRQ1 && enable) {
  298. gpt_get_cnt(GPT2, &pre_irq1_gpt_cnt);
  299. irq1_counter = 0;
  300. }
  301. #endif
  302. mt_afe_set_reg(AFE_IRQ_MCU_CON, (enable << irq_mode), (1 << irq_mode));
  303. audio_mcu_mode[irq_mode]->status = enable;
  304. break;
  305. case MT_AFE_IRQ_MCU_MODE_IRQ5:
  306. mt_afe_set_reg(AFE_IRQ_MCU_CON, (enable << 12), (1 << 12));
  307. audio_mcu_mode[irq_mode]->status = enable;
  308. break;
  309. case MT_AFE_IRQ_MCU_MODE_IRQ6:
  310. mt_afe_set_reg(AFE_IRQ_MCU_CON, (enable << 13), (1 << 13));
  311. audio_mcu_mode[irq_mode]->status = enable;
  312. break;
  313. case MT_AFE_IRQ_MCU_MODE_IRQ7:
  314. mt_afe_set_reg(AFE_IRQ_MCU_CON, (enable << 14), (1 << 14));
  315. audio_mcu_mode[irq_mode]->status = enable;
  316. break;
  317. case MT_AFE_IRQ_MCU_MODE_IRQ8:
  318. mt_afe_set_reg(AFE_IRQ_MCU_CON, (enable << 15), (1 << 15));
  319. audio_mcu_mode[irq_mode]->status = enable;
  320. break;
  321. default:
  322. pr_warn("%s unexpected irq_mode = %d\n", __func__, irq_mode);
  323. break;
  324. }
  325. if (!enable && irq_mode < MT_AFE_IRQ_MCU_MODE_NUM)
  326. mt_afe_set_reg(AFE_IRQ_MCU_CLR, 1 << irq_mode, 1 << irq_mode);
  327. }
  328. int mt_afe_get_irq_state(uint32_t irq_mode, struct mt_afe_irq_status *mcu_mode)
  329. {
  330. if (irq_mode < MT_AFE_IRQ_MCU_MODE_NUM && mcu_mode) {
  331. memcpy((void *)mcu_mode, (const void *)audio_mcu_mode[irq_mode],
  332. sizeof(struct mt_afe_irq_status));
  333. return 0;
  334. } else {
  335. return -EINVAL;
  336. }
  337. }
  338. int mt_afe_enable_memory_path(uint32_t block)
  339. {
  340. unsigned long flags;
  341. if (block >= MT_AFE_DIGITAL_BLOCK_NUM)
  342. return -EINVAL;
  343. spin_lock_irqsave(&afe_control_lock, flags);
  344. if (audio_mem_if[block]->user_count == 0)
  345. audio_mem_if[block]->state = true;
  346. audio_mem_if[block]->user_count++;
  347. if (block < MT_AFE_MEM_INTERFACE_NUM)
  348. mt_afe_set_reg(AFE_DAC_CON0, 1 << (block + 1), 1 << (block + 1));
  349. spin_unlock_irqrestore(&afe_control_lock, flags);
  350. return 0;
  351. }
  352. int mt_afe_disable_memory_path(uint32_t block)
  353. {
  354. unsigned long flags;
  355. if (block >= MT_AFE_DIGITAL_BLOCK_NUM)
  356. return -EINVAL;
  357. spin_lock_irqsave(&afe_control_lock, flags);
  358. audio_mem_if[block]->user_count--;
  359. if (audio_mem_if[block]->user_count == 0)
  360. audio_mem_if[block]->state = false;
  361. if (audio_mem_if[block]->user_count < 0) {
  362. pr_warn("%s block %u user count %d < 0\n",
  363. __func__, block, audio_mem_if[block]->user_count);
  364. audio_mem_if[block]->user_count = 0;
  365. }
  366. if (block < MT_AFE_MEM_INTERFACE_NUM)
  367. mt_afe_set_reg(AFE_DAC_CON0, 0, 1 << (block + 1));
  368. spin_unlock_irqrestore(&afe_control_lock, flags);
  369. return 0;
  370. }
  371. bool mt_afe_get_memory_path_state(uint32_t block)
  372. {
  373. unsigned long flags;
  374. bool state = false;
  375. spin_lock_irqsave(&afe_control_lock, flags);
  376. if (block < MT_AFE_DIGITAL_BLOCK_NUM)
  377. state = audio_mem_if[block]->state;
  378. spin_unlock_irqrestore(&afe_control_lock, flags);
  379. return state;
  380. }
  381. void mt_afe_set_i2s_dac_out(uint32_t sample_rate)
  382. {
  383. uint32_t audio_i2s_dac = 0;
  384. mt_afe_clean_predistortion();
  385. mt_afe_set_dl_src2(sample_rate);
  386. audio_i2s_dac |= (MT_AFE_LR_SWAP_NO_SWAP << 31);
  387. audio_i2s_dac |= (MT_AFE_NORMAL_CLOCK << 12);
  388. audio_i2s_dac |= (mt_afe_rate_to_idx(sample_rate) << 8);
  389. audio_i2s_dac |= (MT_AFE_INV_LRCK_NO_INVERSE << 5);
  390. audio_i2s_dac |= (MT_AFE_I2S_FORMAT_I2S << 3);
  391. audio_i2s_dac |= (MT_AFE_I2S_WLEN_16BITS << 1);
  392. mt_afe_set_reg(AFE_I2S_CON1, audio_i2s_dac, MASK_ALL);
  393. }
  394. int mt_afe_enable_i2s_dac(void)
  395. {
  396. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON0, 0x1, 0x1);
  397. mt_afe_set_reg(AFE_I2S_CON1, 0x1, 0x1);
  398. mt_afe_set_reg(AFE_ADDA_UL_DL_CON0, 0x1, 0x1);
  399. /* For FPGA Pin the same with DAC */
  400. /* mt_afe_set_reg(FPGA_CFG1, 0, 0x10); */
  401. return 0;
  402. }
  403. int mt_afe_disable_i2s_dac(void)
  404. {
  405. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON0, 0x0, 0x01);
  406. mt_afe_set_reg(AFE_I2S_CON1, 0x0, 0x1);
  407. if (!audio_mem_if[MT_AFE_DIGITAL_BLOCK_I2S_OUT_DAC]->state &&
  408. !audio_mem_if[MT_AFE_DIGITAL_BLOCK_I2S_IN_ADC]->state) {
  409. mt_afe_set_reg(AFE_ADDA_UL_DL_CON0, 0x0, 0x1);
  410. }
  411. /* For FPGA Pin the same with DAC */
  412. /* mt_afe_set_reg(FPGA_CFG1, 1 << 4, 0x10); */
  413. return 0;
  414. }
  415. void mt_afe_enable_afe(bool enable)
  416. {
  417. unsigned long flags;
  418. bool memif_enable;
  419. spin_lock_irqsave(&afe_control_lock, flags);
  420. memif_enable = mt_afe_is_memif_enable();
  421. if (!enable && !memif_enable)
  422. mt_afe_set_reg(AFE_DAC_CON0, 0x0, 0x1);
  423. else if (enable && memif_enable)
  424. mt_afe_set_reg(AFE_DAC_CON0, 0x1, 0x1);
  425. spin_unlock_irqrestore(&afe_control_lock, flags);
  426. }
  427. void mt_afe_set_i2s_adc_in(uint32_t sample_rate)
  428. {
  429. audio_adc_i2s->lr_swap = MT_AFE_LR_SWAP_NO_SWAP;
  430. audio_adc_i2s->buffer_update_word = 8;
  431. audio_adc_i2s->fpga_bit_test = 0;
  432. audio_adc_i2s->fpga_bit = 0;
  433. audio_adc_i2s->loopback = 0;
  434. audio_adc_i2s->inv_lrck = MT_AFE_INV_LRCK_NO_INVERSE;
  435. audio_adc_i2s->i2s_fmt = MT_AFE_I2S_FORMAT_I2S;
  436. audio_adc_i2s->i2s_wlen = MT_AFE_I2S_WLEN_16BITS;
  437. audio_adc_i2s->i2s_sample_rate = sample_rate;
  438. if (!audio_adc_i2s_status) {
  439. uint32_t sample_rate_index = mt_afe_rate_to_idx(audio_adc_i2s->i2s_sample_rate);
  440. uint32_t voice_mode_select = 0;
  441. /* I_03/I_04 source from internal ADC */
  442. mt_afe_set_reg(AFE_ADDA_TOP_CON0, 0, 0x1);
  443. if (sample_rate_index == MT_AFE_I2S_SAMPLERATE_8K)
  444. voice_mode_select = 0;
  445. else if (sample_rate_index == MT_AFE_I2S_SAMPLERATE_16K)
  446. voice_mode_select = 1;
  447. else if (sample_rate_index == MT_AFE_I2S_SAMPLERATE_32K)
  448. voice_mode_select = 2;
  449. else if (sample_rate_index == MT_AFE_I2S_SAMPLERATE_48K)
  450. voice_mode_select = 3;
  451. mt_afe_set_reg(AFE_ADDA_UL_SRC_CON0,
  452. ((voice_mode_select << 2) | voice_mode_select) << 17, 0x001E0000);
  453. /* up8x txif sat on */
  454. /* mt_afe_set_reg(AFE_ADDA_NEWIF_CFG0, 0x03F87201, 0xFFFFFFFF); */
  455. mt_afe_set_reg(AFE_ADDA_NEWIF_CFG1, ((voice_mode_select < 3) ? 1 : 3) << 10,
  456. 0x00000C00);
  457. } else {
  458. uint32_t audio_i2s_adc = 0;
  459. /* I_03/I_04 source from external ADC */
  460. mt_afe_set_reg(AFE_ADDA_TOP_CON0, 1, 0x1);
  461. audio_i2s_adc |= (audio_adc_i2s->lr_swap << 31);
  462. audio_i2s_adc |= (audio_adc_i2s->buffer_update_word << 24);
  463. audio_i2s_adc |= (audio_adc_i2s->inv_lrck << 23);
  464. audio_i2s_adc |= (audio_adc_i2s->fpga_bit_test << 22);
  465. audio_i2s_adc |= (audio_adc_i2s->fpga_bit << 21);
  466. audio_i2s_adc |= (audio_adc_i2s->loopback << 20);
  467. audio_i2s_adc |= (mt_afe_rate_to_idx(audio_adc_i2s->i2s_sample_rate) << 8);
  468. audio_i2s_adc |= (audio_adc_i2s->i2s_fmt << 3);
  469. audio_i2s_adc |= (audio_adc_i2s->i2s_wlen << 1);
  470. mt_afe_set_reg(AFE_I2S_CON2, audio_i2s_adc, MASK_ALL);
  471. }
  472. }
  473. int mt_afe_enable_i2s_adc(void)
  474. {
  475. if (!audio_adc_i2s_status) {
  476. mt_afe_set_reg(AFE_ADDA_UL_SRC_CON0, 0x1, 0x1);
  477. mt_afe_set_reg(AFE_ADDA_UL_DL_CON0, 0x1, 0x1);
  478. } else {
  479. mt_afe_set_reg(AFE_I2S_CON2, 0x1, 0x1);
  480. }
  481. return 0;
  482. }
  483. int mt_afe_disable_i2s_adc(void)
  484. {
  485. if (!audio_adc_i2s_status) {
  486. mt_afe_set_reg(AFE_ADDA_UL_SRC_CON0, 0x0, 0x1);
  487. if (audio_mem_if[MT_AFE_DIGITAL_BLOCK_I2S_OUT_DAC]->state == false &&
  488. audio_mem_if[MT_AFE_DIGITAL_BLOCK_I2S_IN_ADC]->state == false) {
  489. mt_afe_set_reg(AFE_ADDA_UL_DL_CON0, 0x0, 0x1);
  490. }
  491. } else {
  492. mt_afe_set_reg(AFE_I2S_CON2, 0x0, 0x1);
  493. }
  494. return 0;
  495. }
  496. void mt_afe_set_i2s_adc2_in(uint32_t sample_rate)
  497. {
  498. uint32_t reg_value = 0;
  499. reg_value |= (MT_AFE_LR_SWAP_NO_SWAP << 31);
  500. reg_value |= (8 << 24);
  501. reg_value |= (MT_AFE_BCK_INV_NO_INVERSE << 23);
  502. reg_value |= (MT_AFE_NORMAL_CLOCK << 12);
  503. reg_value |= (mt_afe_rate_to_idx(sample_rate) << 8);
  504. reg_value |= (MT_AFE_I2S_FORMAT_I2S << 3);
  505. reg_value |= (MT_AFE_I2S_WLEN_16BITS << 1);
  506. mt_afe_set_reg(AFE_I2S_CON2, reg_value, 0xFFFFFFFE);
  507. /* I_17/I_18 source from external ADC */
  508. mt_afe_set_reg(AFE_ADDA2_TOP_CON0, 0x1, 0x1);
  509. }
  510. int mt_afe_enable_i2s_adc2(void)
  511. {
  512. mt_afe_set_reg(AFE_I2S_CON2, 0x1, 0x1);
  513. return 0;
  514. }
  515. int mt_afe_disable_i2s_adc2(void)
  516. {
  517. mt_afe_set_reg(AFE_I2S_CON2, 0x0, 0x1);
  518. return 0;
  519. }
  520. void mt_afe_set_2nd_i2s_out(uint32_t sample_rate, uint32_t clock_mode)
  521. {
  522. uint32_t reg_value = 0;
  523. reg_value |= (MT_AFE_LR_SWAP_NO_SWAP << 31);
  524. reg_value |= (clock_mode << 12);
  525. reg_value |= (mt_afe_rate_to_idx(sample_rate) << 8);
  526. reg_value |= (MT_AFE_INV_LRCK_NO_INVERSE << 5);
  527. reg_value |= (MT_AFE_I2S_FORMAT_I2S << 3);
  528. reg_value |= (MT_AFE_I2S_WLEN_16BITS << 1);
  529. mt_afe_set_reg(AFE_I2S_CON3, reg_value, 0xFFFFFFFE);
  530. }
  531. int mt_afe_enable_2nd_i2s_out(void)
  532. {
  533. mt_afe_set_reg(AFE_I2S_CON3, 0x1, 0x1);
  534. return 0;
  535. }
  536. int mt_afe_disable_2nd_i2s_out(void)
  537. {
  538. mt_afe_set_reg(AFE_I2S_CON3, 0x0, 0x1);
  539. return 0;
  540. }
  541. void mt_afe_set_2nd_i2s_in(uint32_t wlen, uint32_t src_mode,
  542. uint32_t bck_inv, uint32_t clock_mode)
  543. {
  544. uint32_t reg_value = 0;
  545. reg_value |= (1 << 31); /* enable phase_shift_fix for better quality */
  546. reg_value |= (bck_inv << 29);
  547. reg_value |= (MT_AFE_I2S_IN_FROM_IO_MUX << 28);
  548. reg_value |= (clock_mode << 12);
  549. reg_value |= (MT_AFE_INV_LRCK_NO_INVERSE << 5);
  550. reg_value |= (MT_AFE_I2S_FORMAT_I2S << 3);
  551. reg_value |= (src_mode << 2);
  552. reg_value |= (wlen << 1);
  553. mt_afe_set_reg(AFE_I2S_CON, reg_value, 0xFFFFFFFE);
  554. }
  555. int mt_afe_enable_2nd_i2s_in(void)
  556. {
  557. mt_afe_set_reg(AFE_I2S_CON, 0x1, 0x1);
  558. return 0;
  559. }
  560. int mt_afe_disable_2nd_i2s_in(void)
  561. {
  562. mt_afe_set_reg(AFE_I2S_CON, 0x0, 0x1);
  563. return 0;
  564. }
  565. void mt_afe_set_i2s_asrc_config(unsigned int sample_rate)
  566. {
  567. switch (sample_rate) {
  568. case 44100:
  569. mt_afe_set_reg(AFE_ASRC_CON13, 0x0, 0xFFFFFFFF);
  570. mt_afe_set_reg(AFE_ASRC_CON14, 0x1B9000, 0xFFFFFFFF);
  571. mt_afe_set_reg(AFE_ASRC_CON15, 0x1B9000, 0xFFFFFFFF);
  572. mt_afe_set_reg(AFE_ASRC_CON16, 0x3F5987, 0xFFFFFFFF);
  573. mt_afe_set_reg(AFE_ASRC_CON17, 0x1FBD, 0xFFFFFFFF);
  574. mt_afe_set_reg(AFE_ASRC_CON20, 0x9C00, 0xFFFFFFFF);
  575. mt_afe_set_reg(AFE_ASRC_CON21, 0x8B00, 0xFFFFFFFF);
  576. mt_afe_set_reg(AFE_ASRC_CON0, 0x71, 0xFFFFFFFF);
  577. break;
  578. case 48000:
  579. mt_afe_set_reg(AFE_ASRC_CON13, 0x0, 0xFFFFFFFF);
  580. mt_afe_set_reg(AFE_ASRC_CON14, 0x1E0000, 0xFFFFFFFF);
  581. mt_afe_set_reg(AFE_ASRC_CON15, 0x1E0000, 0xFFFFFFFF);
  582. mt_afe_set_reg(AFE_ASRC_CON16, 0x3F5987, 0xFFFFFFFF);
  583. mt_afe_set_reg(AFE_ASRC_CON17, 0x1FBD, 0xFFFFFFFF);
  584. mt_afe_set_reg(AFE_ASRC_CON20, 0x8F00, 0xFFFFFFFF);
  585. mt_afe_set_reg(AFE_ASRC_CON21, 0x7F00, 0xFFFFFFFF);
  586. mt_afe_set_reg(AFE_ASRC_CON0, 0x71, 0xFFFFFFFF);
  587. break;
  588. case 32000:
  589. mt_afe_set_reg(AFE_ASRC_CON13, 0x0, 0xFFFFFFFF);
  590. mt_afe_set_reg(AFE_ASRC_CON14, 0x140000, 0xFFFFFFFF);
  591. mt_afe_set_reg(AFE_ASRC_CON15, 0x140000, 0xFFFFFFFF);
  592. mt_afe_set_reg(AFE_ASRC_CON16, 0x3F5987, 0xFFFFFFFF);
  593. mt_afe_set_reg(AFE_ASRC_CON17, 0x1FBD, 0xFFFFFFFF);
  594. mt_afe_set_reg(AFE_ASRC_CON20, 0xD800, 0xFFFFFFFF);
  595. mt_afe_set_reg(AFE_ASRC_CON21, 0xBD00, 0xFFFFFFFF);
  596. mt_afe_set_reg(AFE_ASRC_CON0, 0x71, 0xFFFFFFFF);
  597. break;
  598. default:
  599. pr_warn("%s sample rate %u not handled\n", __func__, sample_rate);
  600. break;
  601. }
  602. }
  603. void mt_afe_set_hw_digital_gain_mode(uint32_t gain_type, uint32_t sample_rate,
  604. uint32_t sample_per_step)
  605. {
  606. uint32_t value = sample_per_step << 8 | (mt_afe_rate_to_idx(sample_rate) << 4);
  607. switch (gain_type) {
  608. case MT_AFE_HW_DIGITAL_GAIN1:
  609. mt_afe_set_reg(AFE_GAIN1_CON0, value, 0xfff0);
  610. break;
  611. case MT_AFE_HW_DIGITAL_GAIN2:
  612. mt_afe_set_reg(AFE_GAIN2_CON0, value, 0xfff0);
  613. break;
  614. default:
  615. break;
  616. }
  617. }
  618. void mt_afe_set_hw_digital_gain_state(int gain_type, bool enable)
  619. {
  620. switch (gain_type) {
  621. case MT_AFE_HW_DIGITAL_GAIN1:
  622. if (enable) {
  623. /* Let current gain be 0 to ramp up */
  624. mt_afe_set_reg(AFE_GAIN1_CUR, 0, 0xFFFFFFFF);
  625. }
  626. mt_afe_set_reg(AFE_GAIN1_CON0, enable, 0x1);
  627. break;
  628. case MT_AFE_HW_DIGITAL_GAIN2:
  629. if (enable) {
  630. /* Let current gain be 0 to ramp up */
  631. mt_afe_set_reg(AFE_GAIN2_CUR, 0, 0xFFFFFFFF);
  632. }
  633. mt_afe_set_reg(AFE_GAIN2_CON0, enable, 0x1);
  634. break;
  635. default:
  636. pr_warn("%s with no match type\n", __func__);
  637. break;
  638. }
  639. }
  640. void mt_afe_set_hw_digital_gain(uint32_t gain, int gain_type)
  641. {
  642. switch (gain_type) {
  643. case MT_AFE_HW_DIGITAL_GAIN1:
  644. mt_afe_set_reg(AFE_GAIN1_CON1, gain, 0xffffffff);
  645. break;
  646. case MT_AFE_HW_DIGITAL_GAIN2:
  647. mt_afe_set_reg(AFE_GAIN2_CON1, gain, 0xffffffff);
  648. break;
  649. default:
  650. pr_warn("%s with no match type\n", __func__);
  651. break;
  652. }
  653. }
  654. int mt_afe_enable_sinegen_hw(uint32_t connection, uint32_t direction)
  655. {
  656. if (direction == MT_AFE_MEMIF_DIRECTION_INPUT) {
  657. switch (connection) {
  658. case INTER_CONN_I00:
  659. case INTER_CONN_I01:
  660. mt_afe_set_reg(AFE_SGEN_CON0, 0x048C2762, 0xffffffff);
  661. break;
  662. case INTER_CONN_I02:
  663. mt_afe_set_reg(AFE_SGEN_CON0, 0x146C2662, 0xffffffff);
  664. break;
  665. case INTER_CONN_I03:
  666. case INTER_CONN_I04:
  667. mt_afe_set_reg(AFE_SGEN_CON0, 0x24862862, 0xffffffff);
  668. break;
  669. case INTER_CONN_I05:
  670. case INTER_CONN_I06:
  671. mt_afe_set_reg(AFE_SGEN_CON0, 0x346C2662, 0xffffffff);
  672. break;
  673. case INTER_CONN_I07:
  674. case INTER_CONN_I08:
  675. mt_afe_set_reg(AFE_SGEN_CON0, 0x446C2662, 0xffffffff);
  676. break;
  677. case INTER_CONN_I09:
  678. mt_afe_set_reg(AFE_SGEN_CON0, 0x546C2662, 0xffffffff);
  679. break;
  680. case INTER_CONN_I10:
  681. case INTER_CONN_I11:
  682. mt_afe_set_reg(AFE_SGEN_CON0, 0x646C2662, 0xffffffff);
  683. break;
  684. case INTER_CONN_I12:
  685. case INTER_CONN_I13:
  686. mt_afe_set_reg(AFE_SGEN_CON0, 0x746C2662, 0xffffffff);
  687. break;
  688. case INTER_CONN_I15:
  689. case INTER_CONN_I16:
  690. mt_afe_set_reg(AFE_SGEN_CON0, 0x946C2662, 0xffffffff);
  691. break;
  692. case INTER_CONN_I17:
  693. case INTER_CONN_I18:
  694. mt_afe_set_reg(AFE_SGEN_CON0, 0xa46C2662, 0xffffffff);
  695. break;
  696. case INTER_CONN_I19:
  697. case INTER_CONN_I20:
  698. mt_afe_set_reg(AFE_SGEN_CON0, 0xb46C2662, 0xffffffff);
  699. break;
  700. default:
  701. break;
  702. }
  703. } else {
  704. switch (connection) {
  705. case INTER_CONN_O00:
  706. case INTER_CONN_O01:
  707. mt_afe_set_reg(AFE_SGEN_CON0, 0x0c7c27c2, 0xffffffff);
  708. break;
  709. case INTER_CONN_O02:
  710. mt_afe_set_reg(AFE_SGEN_CON0, 0x1c6c26c2, 0xffffffff);
  711. break;
  712. case INTER_CONN_O03:
  713. case INTER_CONN_O04:
  714. mt_afe_set_reg(AFE_SGEN_CON0, 0x2c8c28c2, 0xffffffff);
  715. break;
  716. case INTER_CONN_O05:
  717. case INTER_CONN_O06:
  718. mt_afe_set_reg(AFE_SGEN_CON0, 0x3c6c26c2, 0xffffffff);
  719. break;
  720. case INTER_CONN_O07:
  721. case INTER_CONN_O08:
  722. mt_afe_set_reg(AFE_SGEN_CON0, 0x4c6c26c2, 0xffffffff);
  723. break;
  724. case INTER_CONN_O09:
  725. case INTER_CONN_O10:
  726. mt_afe_set_reg(AFE_SGEN_CON0, 0x5c6c26c2, 0xffffffff);
  727. break;
  728. case INTER_CONN_O11:
  729. mt_afe_set_reg(AFE_SGEN_CON0, 0x6c6c26c2, 0xffffffff);
  730. break;
  731. case INTER_CONN_O12:
  732. /* MD connect BT Verify (8K SamplingRate) */
  733. if (MT_AFE_I2S_SAMPLERATE_8K ==
  734. audio_mem_if[MT_AFE_DIGITAL_BLOCK_MEM_MOD_DAI]->sample_rate)
  735. mt_afe_set_reg(AFE_SGEN_CON0, 0x7c0e80e8, 0xffffffff);
  736. else if (MT_AFE_I2S_SAMPLERATE_16K ==
  737. audio_mem_if[MT_AFE_DIGITAL_BLOCK_MEM_MOD_DAI]->sample_rate)
  738. mt_afe_set_reg(AFE_SGEN_CON0, 0x7c0f00f0, 0xffffffff);
  739. else
  740. mt_afe_set_reg(AFE_SGEN_CON0, 0x7c6c26c2, 0xffffffff);
  741. break;
  742. case INTER_CONN_O13:
  743. case INTER_CONN_O14:
  744. mt_afe_set_reg(AFE_SGEN_CON0, 0x8c6c26c2, 0xffffffff);
  745. break;
  746. case INTER_CONN_O15:
  747. case INTER_CONN_O16:
  748. mt_afe_set_reg(AFE_SGEN_CON0, 0x9c6c26c2, 0xffffffff);
  749. break;
  750. case INTER_CONN_O17:
  751. case INTER_CONN_O18:
  752. mt_afe_set_reg(AFE_SGEN_CON0, 0xac6c26c2, 0xffffffff);
  753. break;
  754. case INTER_CONN_O19:
  755. case INTER_CONN_O20:
  756. mt_afe_set_reg(AFE_SGEN_CON0, 0xbc6c26c2, 0xffffffff);
  757. break;
  758. case INTER_CONN_O21:
  759. case INTER_CONN_O22:
  760. mt_afe_set_reg(AFE_SGEN_CON0, 0xcc6c26c2, 0xffffffff);
  761. break;
  762. default:
  763. break;
  764. }
  765. }
  766. return 0;
  767. }
  768. int mt_afe_disable_sinegen_hw(void)
  769. {
  770. /* don't set [31:28] as 0 when disable sinetone HW */
  771. /* because it will repalce i00/i01 input with sine gen output. */
  772. /* Set 0xf is correct way to disconnect sinetone HW to any I/O. */
  773. mt_afe_set_reg(AFE_SGEN_CON0, 0xf0000000, 0xffffffff);
  774. return 0;
  775. }
  776. void mt_afe_set_memif_fetch_format(uint32_t interface_type, uint32_t fetch_format)
  777. {
  778. audio_mem_if[interface_type]->fetch_format_per_sample = fetch_format;
  779. switch (interface_type) {
  780. case MT_AFE_DIGITAL_BLOCK_MEM_DL1:
  781. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 16, 0x00030000);
  782. break;
  783. case MT_AFE_DIGITAL_BLOCK_MEM_DL1_DATA2:
  784. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 12, 0x00003000);
  785. break;
  786. case MT_AFE_DIGITAL_BLOCK_MEM_DL2:
  787. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 18, 0x000C0000);
  788. break;
  789. case MT_AFE_DIGITAL_BLOCK_MEM_AWB:
  790. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 20, 0x00300000);
  791. break;
  792. case MT_AFE_DIGITAL_BLOCK_MEM_VUL:
  793. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 22, 0x00C00000);
  794. break;
  795. case MT_AFE_DIGITAL_BLOCK_MEM_VUL_DATA2:
  796. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 14, 0x0000C000);
  797. break;
  798. case MT_AFE_DIGITAL_BLOCK_MEM_DAI:
  799. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 24, 0x03000000);
  800. break;
  801. case MT_AFE_DIGITAL_BLOCK_MEM_MOD_DAI:
  802. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 26, 0x0C000000);
  803. break;
  804. case MT_AFE_DIGITAL_BLOCK_HDMI:
  805. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, fetch_format << 28, 0x30000000);
  806. break;
  807. default:
  808. break;
  809. }
  810. }
  811. void mt_afe_set_out_conn_format(uint32_t connection_format, uint32_t output)
  812. {
  813. mt_afe_set_reg(AFE_CONN_24BIT, (connection_format << output), (1 << output));
  814. }
  815. void mt_afe_enable_apll(uint32_t sample_rate)
  816. {
  817. if (MT_AFE_APLL1 == (mt_afe_get_apll_by_rate(sample_rate)))
  818. mt_afe_apll22m_clk_on();
  819. else
  820. mt_afe_apll24m_clk_on();
  821. }
  822. void mt_afe_disable_apll(uint32_t sample_rate)
  823. {
  824. if (MT_AFE_APLL1 == (mt_afe_get_apll_by_rate(sample_rate)))
  825. mt_afe_apll22m_clk_off();
  826. else
  827. mt_afe_apll24m_clk_off();
  828. }
  829. void mt_afe_enable_apll_tuner(uint32_t sample_rate)
  830. {
  831. if (MT_AFE_APLL1 == (mt_afe_get_apll_by_rate(sample_rate)))
  832. mt_afe_apll1tuner_clk_on();
  833. else
  834. mt_afe_apll2tuner_clk_on();
  835. }
  836. void mt_afe_disable_apll_tuner(uint32_t sample_rate)
  837. {
  838. if (MT_AFE_APLL1 == (mt_afe_get_apll_by_rate(sample_rate)))
  839. mt_afe_apll1tuner_clk_off();
  840. else
  841. mt_afe_apll2tuner_clk_off();
  842. }
  843. void mt_afe_enable_apll_div_power(uint32_t clock_type, uint32_t sample_rate)
  844. {
  845. uint32_t apll_type = mt_afe_get_apll_by_rate(sample_rate);
  846. apll_clock_divider_power_refcount[clock_type]++;
  847. if (apll_clock_divider_power_refcount[clock_type] > 1)
  848. return;
  849. switch (clock_type) {
  850. case MT_AFE_ENGEN:
  851. if (apll_type == MT_AFE_APLL1)
  852. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV0);
  853. else
  854. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV0);
  855. break;
  856. case MT_AFE_I2S0:
  857. if (apll_type == MT_AFE_APLL1)
  858. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV1);
  859. else
  860. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV1);
  861. break;
  862. case MT_AFE_I2S1:
  863. if (apll_type == MT_AFE_APLL1)
  864. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV2);
  865. else
  866. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV2);
  867. break;
  868. case MT_AFE_I2S2:
  869. if (apll_type == MT_AFE_APLL1)
  870. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV3);
  871. else
  872. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV3);
  873. break;
  874. case MT_AFE_I2S3:
  875. if (apll_type == MT_AFE_APLL1)
  876. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV4);
  877. else
  878. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV4);
  879. break;
  880. case MT_AFE_I2S3_BCK:
  881. if (apll_type == MT_AFE_APLL1)
  882. mt_afe_enable_i2s_div_power(MT_AFE_APLL1_DIV5);
  883. else
  884. mt_afe_enable_i2s_div_power(MT_AFE_APLL2_DIV5);
  885. break;
  886. case MT_AFE_SPDIF:
  887. mt_afe_enable_i2s_div_power(MT_AFE_SPDIF_DIV);
  888. break;
  889. case MT_AFE_SPDIF2:
  890. mt_afe_enable_i2s_div_power(MT_AFE_SPDIF2_DIV);
  891. break;
  892. default:
  893. break;
  894. }
  895. }
  896. void mt_afe_disable_apll_div_power(uint32_t clock_type, uint32_t sample_rate)
  897. {
  898. uint32_t apll_type = mt_afe_get_apll_by_rate(sample_rate);
  899. apll_clock_divider_power_refcount[clock_type]--;
  900. if (apll_clock_divider_power_refcount[clock_type] > 0) {
  901. return;
  902. } else if (apll_clock_divider_power_refcount[clock_type] < 0) {
  903. pr_warn("%s unexpected refcount(%u,%d)\n", __func__, clock_type,
  904. apll_clock_divider_power_refcount[clock_type]);
  905. apll_clock_divider_power_refcount[clock_type] = 0;
  906. return;
  907. }
  908. switch (clock_type) {
  909. case MT_AFE_ENGEN:
  910. if (apll_type == MT_AFE_APLL1)
  911. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV0);
  912. else
  913. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV0);
  914. break;
  915. case MT_AFE_I2S0:
  916. if (apll_type == MT_AFE_APLL1)
  917. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV1);
  918. else
  919. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV1);
  920. break;
  921. case MT_AFE_I2S1:
  922. if (apll_type == MT_AFE_APLL1)
  923. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV2);
  924. else
  925. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV2);
  926. break;
  927. case MT_AFE_I2S2:
  928. if (apll_type == MT_AFE_APLL1)
  929. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV3);
  930. else
  931. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV3);
  932. break;
  933. case MT_AFE_I2S3:
  934. if (apll_type == MT_AFE_APLL1)
  935. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV4);
  936. else
  937. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV4);
  938. break;
  939. case MT_AFE_I2S3_BCK:
  940. if (apll_type == MT_AFE_APLL1)
  941. mt_afe_disable_i2s_div_power(MT_AFE_APLL1_DIV5);
  942. else
  943. mt_afe_disable_i2s_div_power(MT_AFE_APLL2_DIV5);
  944. break;
  945. case MT_AFE_SPDIF:
  946. mt_afe_disable_i2s_div_power(MT_AFE_SPDIF_DIV);
  947. break;
  948. case MT_AFE_SPDIF2:
  949. mt_afe_disable_i2s_div_power(MT_AFE_SPDIF2_DIV);
  950. break;
  951. default:
  952. break;
  953. }
  954. }
  955. uint32_t mt_afe_set_mclk(uint32_t clock_type, uint32_t sample_rate)
  956. {
  957. uint32_t apll_type = mt_afe_get_apll_by_rate(sample_rate);
  958. uint32_t apll_clock = 0;
  959. uint32_t mclk_div = 0;
  960. apll_clock =
  961. (apll_type == MT_AFE_APLL1) ? MT_AFE_APLL1_CLOCK_FREQ : MT_AFE_APLL2_CLOCK_FREQ;
  962. /* set up mclk mux select / ck div */
  963. switch (clock_type) {
  964. case MT_AFE_ENGEN:
  965. mclk_div = 7;
  966. if (apll_type == MT_AFE_APLL1)
  967. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, mclk_div << 24, 0x0f000000);
  968. else
  969. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, mclk_div << 28, 0xf0000000);
  970. break;
  971. case MT_AFE_I2S0:
  972. mclk_div = (apll_clock / 256 / sample_rate) - 1;
  973. if (apll_type == MT_AFE_APLL1) {
  974. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 4, 1 << 4);
  975. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_1, mclk_div, 0x000000ff);
  976. } else {
  977. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 4, 1 << 4);
  978. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_2, mclk_div, 0x000000ff);
  979. }
  980. break;
  981. case MT_AFE_I2S1:
  982. mclk_div = (apll_clock / 256 / sample_rate) - 1;
  983. if (apll_type == MT_AFE_APLL1) {
  984. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 5, 1 << 5);
  985. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_1, mclk_div << 8, 0x0000ff00);
  986. } else {
  987. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 5, 1 << 5);
  988. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_2, mclk_div << 8, 0x0000ff00);
  989. }
  990. break;
  991. case MT_AFE_I2S2:
  992. mclk_div = (apll_clock / 256 / sample_rate) - 1;
  993. if (apll_type == MT_AFE_APLL1) {
  994. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 6, 1 << 6);
  995. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_1, mclk_div << 16, 0x00ff0000);
  996. } else {
  997. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 6, 1 << 6);
  998. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_2, mclk_div << 16, 0x00ff0000);
  999. }
  1000. break;
  1001. case MT_AFE_I2S3:
  1002. mclk_div = (apll_clock / 128 / sample_rate) - 1;
  1003. if (apll_type == MT_AFE_APLL1) {
  1004. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 7, 1 << 7);
  1005. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_1, mclk_div << 24, 0xff000000);
  1006. } else {
  1007. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 7, 1 << 7);
  1008. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_2, mclk_div << 24, 0xff000000);
  1009. }
  1010. break;
  1011. case MT_AFE_SPDIF:
  1012. mclk_div = (apll_clock / 128 / sample_rate) - 1;
  1013. if (apll_type == MT_AFE_APLL1) {
  1014. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 9, 1 << 9);
  1015. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, mclk_div << 24, 0xff000000);
  1016. } else {
  1017. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 9, 1 << 9);
  1018. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, mclk_div << 24, 0xff000000);
  1019. }
  1020. break;
  1021. case MT_AFE_SPDIF2:
  1022. mclk_div = (apll_clock / 128 / sample_rate) - 1;
  1023. if (apll_type == MT_AFE_APLL1) {
  1024. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_4, 0 << 8, 1 << 8);
  1025. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_4, mclk_div, 0x000000ff);
  1026. } else {
  1027. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_4, 1 << 8, 1 << 8);
  1028. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_4, mclk_div, 0x000000ff);
  1029. }
  1030. break;
  1031. default:
  1032. break;
  1033. }
  1034. return mclk_div;
  1035. }
  1036. void mt_afe_set_i2s3_bclk(uint32_t mck_div, uint32_t sample_rate, uint32_t channels,
  1037. uint32_t sample_bits)
  1038. {
  1039. uint32_t apll_type = mt_afe_get_apll_by_rate(sample_rate);
  1040. uint32_t apll_clock = 0;
  1041. uint32_t bck = 0;
  1042. uint32_t bck_div = 0;
  1043. apll_clock =
  1044. (apll_type == MT_AFE_APLL1) ? MT_AFE_APLL1_CLOCK_FREQ : MT_AFE_APLL2_CLOCK_FREQ;
  1045. bck = sample_rate * channels * sample_bits;
  1046. bck_div = ((apll_clock / (mck_div + 1)) / bck) - 1;
  1047. if (apll_type == MT_AFE_APLL1) {
  1048. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 0 << 8, 1 << 8);
  1049. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, bck_div, 0x0000000f);
  1050. } else {
  1051. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_0, 1 << 8, 1 << 8);
  1052. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, bck_div << 4, 0x000000f0);
  1053. }
  1054. }
  1055. void mt_afe_set_dai_bt(struct mt_afe_digital_dai_bt *dai_bt)
  1056. {
  1057. audio_dai_bt->use_mrgif_input = dai_bt->use_mrgif_input;
  1058. audio_dai_bt->dai_bt_mode = dai_bt->dai_bt_mode;
  1059. audio_dai_bt->dai_del = dai_bt->dai_del;
  1060. audio_dai_bt->bt_len = dai_bt->bt_len;
  1061. audio_dai_bt->data_rdy = dai_bt->data_rdy;
  1062. audio_dai_bt->bt_sync = dai_bt->bt_sync;
  1063. }
  1064. int mt_afe_enable_dai_bt(void)
  1065. {
  1066. mt_afe_set_reg(AFE_DAIBT_CON0, (audio_dai_bt->dai_bt_mode ? 1 : 0) << 9, 0x1 << 9);
  1067. if (audio_mrg->mrgif_en == true) {
  1068. /* use merge */
  1069. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 12, 0x1 << 12);
  1070. /* data ready */
  1071. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 3, 0x1 << 3);
  1072. /* turn on DAIBT */
  1073. mt_afe_set_reg(AFE_DAIBT_CON0, 0x3, 0x3);
  1074. } else {
  1075. /* set Mrg_I2S Samping Rate */
  1076. mt_afe_set_reg(AFE_MRGIF_CON, audio_mrg->mrg_i2s_sample_rate << 20,
  1077. 0xF00000);
  1078. /* set Mrg_I2S enable */
  1079. mt_afe_set_reg(AFE_MRGIF_CON, 1 << 16, 1 << 16);
  1080. /* turn on Merge Interface */
  1081. mt_afe_set_reg(AFE_MRGIF_CON, 1, 0x1);
  1082. udelay(100);
  1083. /* use merge */
  1084. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 12, 0x1 << 12);
  1085. /* data ready */
  1086. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 3, 0x1 << 3);
  1087. /* turn on DAIBT */
  1088. mt_afe_set_reg(AFE_DAIBT_CON0, 0x3, 0x3);
  1089. }
  1090. audio_dai_bt->bt_on = true;
  1091. audio_dai_bt->dai_bt_on = true;
  1092. audio_mrg->mrgif_en = true;
  1093. return 0;
  1094. }
  1095. int mt_afe_disable_dai_bt(void)
  1096. {
  1097. if (audio_mrg->mergeif_i2s_enable == true) {
  1098. /* turn off DAIBT */
  1099. mt_afe_set_reg(AFE_DAIBT_CON0, 0, 0x3);
  1100. } else {
  1101. /* turn off DAIBT */
  1102. mt_afe_set_reg(AFE_DAIBT_CON0, 0, 0x3);
  1103. udelay(100);
  1104. /* set Mrg_I2S disable */
  1105. mt_afe_set_reg(AFE_MRGIF_CON, 0 << 16, 1 << 16);
  1106. /* turn off Merge Interface */
  1107. mt_afe_set_reg(AFE_MRGIF_CON, 0, 0x1);
  1108. audio_mrg->mrgif_en = false;
  1109. }
  1110. audio_dai_bt->bt_on = false;
  1111. audio_dai_bt->dai_bt_on = false;
  1112. return 0;
  1113. }
  1114. int mt_afe_enable_merge_i2s(uint32_t sample_rate)
  1115. {
  1116. /* To enable MrgI2S */
  1117. if (audio_mrg->mrgif_en == true) {
  1118. /* Merge Interface already turn on. */
  1119. /* if sample Rate change, then it need to restart with new setting */
  1120. if (audio_mrg->mrg_i2s_sample_rate != mt_afe_rate_to_idx(sample_rate)) {
  1121. /* Turn off Merge Interface first to switch I2S sampling rate */
  1122. mt_afe_set_reg(AFE_MRGIF_CON, 0, 1 << 16);
  1123. if (audio_dai_bt->dai_bt_on == true) {
  1124. /* Turn off DAIBT first */
  1125. mt_afe_set_reg(AFE_DAIBT_CON0, 0, 0x1);
  1126. }
  1127. udelay(100);
  1128. /* Turn off Merge Interface */
  1129. mt_afe_set_reg(AFE_MRGIF_CON, 0, 0x1);
  1130. udelay(100);
  1131. /* Turn on Merge Interface */
  1132. mt_afe_set_reg(AFE_MRGIF_CON, 1, 0x1);
  1133. if (audio_dai_bt->dai_bt_on == true) {
  1134. /* use merge */
  1135. mt_afe_set_reg(AFE_DAIBT_CON0,
  1136. audio_dai_bt->dai_bt_mode << 9,
  1137. 0x1 << 9);
  1138. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 12, 0x1 << 12);
  1139. /* data ready */
  1140. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 3, 0x1 << 3);
  1141. /* Turn on DAIBT */
  1142. mt_afe_set_reg(AFE_DAIBT_CON0, 0x3, 0x3);
  1143. }
  1144. audio_mrg->mrg_i2s_sample_rate = mt_afe_rate_to_idx(sample_rate);
  1145. /* set Mrg_I2S Samping Rate */
  1146. mt_afe_set_reg(AFE_MRGIF_CON, audio_mrg->mrg_i2s_sample_rate << 20,
  1147. 0xF00000);
  1148. /* set Mrg_I2S enable */
  1149. mt_afe_set_reg(AFE_MRGIF_CON, 1 << 16, 1 << 16);
  1150. }
  1151. } else {
  1152. /* turn on merge Interface from off state */
  1153. audio_mrg->mrg_i2s_sample_rate = mt_afe_rate_to_idx(sample_rate);
  1154. /* set Mrg_I2S Samping rates */
  1155. mt_afe_set_reg(AFE_MRGIF_CON, audio_mrg->mrg_i2s_sample_rate << 20,
  1156. 0xF00000);
  1157. /* set Mrg_I2S enable */
  1158. mt_afe_set_reg(AFE_MRGIF_CON, 1 << 16, 1 << 16);
  1159. udelay(100);
  1160. mt_afe_set_reg(AFE_MRGIF_CON, 1, 0x1); /* Turn on Merge Interface */
  1161. udelay(100);
  1162. if (audio_dai_bt->dai_bt_on == true) {
  1163. /* use merge */
  1164. mt_afe_set_reg(AFE_DAIBT_CON0, audio_dai_bt->dai_bt_mode << 9,
  1165. 0x1 << 9);
  1166. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 12, 0x1 << 12);
  1167. /* data ready */
  1168. mt_afe_set_reg(AFE_DAIBT_CON0, 0x1 << 3, 0x1 << 3);
  1169. /* Turn on DAIBT */
  1170. mt_afe_set_reg(AFE_DAIBT_CON0, 0x3, 0x3);
  1171. }
  1172. }
  1173. audio_mrg->mrgif_en = true;
  1174. audio_mrg->mergeif_i2s_enable = true;
  1175. return 0;
  1176. }
  1177. int mt_afe_disable_merge_i2s(void)
  1178. {
  1179. if (audio_mrg->mrgif_en == true) {
  1180. /* turn off I2S */
  1181. mt_afe_set_reg(AFE_MRGIF_CON, 0, 1 << 16);
  1182. if (audio_dai_bt->dai_bt_on == false) {
  1183. udelay(100);
  1184. /* turn off Merge Interface */
  1185. mt_afe_set_reg(AFE_MRGIF_CON, 0, 0x1);
  1186. audio_mrg->mrgif_en = false;
  1187. }
  1188. }
  1189. audio_mrg->mergeif_i2s_enable = false;
  1190. return 0;
  1191. }
  1192. void mt_afe_suspend(void)
  1193. {
  1194. if (aud_drv_suspend_status)
  1195. return;
  1196. pr_debug("+%s\n", __func__);
  1197. mt_afe_store_reg(&suspend_reg);
  1198. mt_afe_suspend_clk_off();
  1199. aud_drv_suspend_status = true;
  1200. pr_debug("-%s\n", __func__);
  1201. }
  1202. void mt_afe_resume(void)
  1203. {
  1204. if (!aud_drv_suspend_status)
  1205. return;
  1206. pr_debug("+%s\n", __func__);
  1207. mt_afe_suspend_clk_on();
  1208. mt_afe_recover_reg(&suspend_reg);
  1209. aud_drv_suspend_status = false;
  1210. pr_debug("-%s\n", __func__);
  1211. }
  1212. struct mt_afe_mem_control_t *mt_afe_get_mem_ctx(enum mt_afe_mem_context mem_context)
  1213. {
  1214. if (mem_context >= 0 && mem_context < MT_AFE_MEM_CTX_COUNT)
  1215. return afe_mem_control_context[mem_context];
  1216. pr_err("%s out of boundary\n", __func__);
  1217. return NULL;
  1218. }
  1219. void mt_afe_add_ctx_substream(enum mt_afe_mem_context mem_context,
  1220. struct snd_pcm_substream *substream)
  1221. {
  1222. if (likely(mem_context < MT_AFE_MEM_CTX_COUNT))
  1223. afe_mem_control_context[mem_context]->substream = substream;
  1224. else
  1225. pr_err("%s unexpected mem_context = %d\n", __func__, mem_context);
  1226. }
  1227. void mt_afe_remove_ctx_substream(enum mt_afe_mem_context mem_context)
  1228. {
  1229. if (likely(mem_context < MT_AFE_MEM_CTX_COUNT))
  1230. afe_mem_control_context[mem_context]->substream = NULL;
  1231. else
  1232. pr_err("%s unexpected mem_context = %d\n", __func__, mem_context);
  1233. }
  1234. void mt_afe_init_dma_buffer(enum mt_afe_mem_context mem_context,
  1235. struct snd_pcm_runtime *runtime)
  1236. {
  1237. struct mt_afe_block_t *block;
  1238. unsigned int memory_addr_bit33 = 0;
  1239. if (mem_context >= MT_AFE_MEM_CTX_COUNT)
  1240. return;
  1241. if (sizeof(dma_addr_t) > 4)
  1242. memory_addr_bit33 = (runtime->dma_addr & 0x100000000) ? 1 : 0;
  1243. block = &(mt_afe_get_mem_ctx(mem_context)->block);
  1244. block->phy_buf_addr = runtime->dma_addr & 0xFFFFFFFF;
  1245. block->virtual_buf_addr = runtime->dma_area;
  1246. block->buffer_size = runtime->dma_bytes;
  1247. block->data_remained = 0;
  1248. block->write_index = 0;
  1249. block->read_index = 0;
  1250. block->iec_nsadr = 0;
  1251. switch (mem_context) {
  1252. case MT_AFE_MEM_CTX_DL1:
  1253. mt_afe_set_reg(AFE_DL1_BASE, block->phy_buf_addr, 0xffffffff);
  1254. mt_afe_set_reg(AFE_DL1_END, block->phy_buf_addr + (block->buffer_size - 1),
  1255. 0xffffffff);
  1256. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33, 0x1);
  1257. break;
  1258. case MT_AFE_MEM_CTX_DL2:
  1259. mt_afe_set_reg(AFE_DL2_BASE, block->phy_buf_addr, 0xffffffff);
  1260. mt_afe_set_reg(AFE_DL2_END, block->phy_buf_addr + (block->buffer_size - 1),
  1261. 0xffffffff);
  1262. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 1, 1 << 1);
  1263. break;
  1264. case MT_AFE_MEM_CTX_VUL:
  1265. mt_afe_set_reg(AFE_VUL_BASE, block->phy_buf_addr, 0xffffffff);
  1266. mt_afe_set_reg(AFE_VUL_END, block->phy_buf_addr + (block->buffer_size - 1),
  1267. 0xffffffff);
  1268. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 6, 1 << 6);
  1269. break;
  1270. case MT_AFE_MEM_CTX_VUL2:
  1271. mt_afe_set_reg(AFE_VUL_D2_BASE, block->phy_buf_addr, 0xffffffff);
  1272. mt_afe_set_reg(AFE_VUL_D2_END, block->phy_buf_addr + (block->buffer_size - 1),
  1273. 0xffffffff);
  1274. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 7, 1 << 7);
  1275. break;
  1276. case MT_AFE_MEM_CTX_DAI:
  1277. mt_afe_set_reg(AFE_DAI_BASE, block->phy_buf_addr, 0xffffffff);
  1278. mt_afe_set_reg(AFE_DAI_END, block->phy_buf_addr + (block->buffer_size - 1),
  1279. 0xffffffff);
  1280. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 5, 1 << 5);
  1281. break;
  1282. case MT_AFE_MEM_CTX_AWB:
  1283. mt_afe_set_reg(AFE_AWB_BASE, block->phy_buf_addr, 0xffffffff);
  1284. mt_afe_set_reg(AFE_AWB_END, block->phy_buf_addr + (block->buffer_size - 1),
  1285. 0xffffffff);
  1286. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 3, 1 << 3);
  1287. break;
  1288. case MT_AFE_MEM_CTX_HDMI:
  1289. mt_afe_set_reg(AFE_HDMI_OUT_BASE, block->phy_buf_addr, 0xffffffff);
  1290. mt_afe_set_reg(AFE_HDMI_OUT_END, block->phy_buf_addr + (block->buffer_size - 1),
  1291. 0xffffffff);
  1292. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 8, 1 << 8);
  1293. break;
  1294. case MT_AFE_MEM_CTX_HDMI_RAW:
  1295. mt_afe_set_reg(AFE_SPDIF_BASE, block->phy_buf_addr, 0xffffffff);
  1296. mt_afe_set_reg(AFE_SPDIF_END, block->phy_buf_addr + block->buffer_size,
  1297. 0xffffffff);
  1298. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 9, 1 << 9);
  1299. break;
  1300. case MT_AFE_MEM_CTX_SPDIF:
  1301. mt_afe_set_reg(AFE_SPDIF2_BASE, block->phy_buf_addr, 0xffffffff);
  1302. mt_afe_set_reg(AFE_SPDIF2_END, block->phy_buf_addr + block->buffer_size,
  1303. 0xffffffff);
  1304. mt_afe_set_reg(AFE_MEMIF_MSB, memory_addr_bit33 << 10, 1 << 10);
  1305. break;
  1306. default:
  1307. break;
  1308. }
  1309. }
  1310. void mt_afe_reset_dma_buffer(enum mt_afe_mem_context mem_context)
  1311. {
  1312. if (likely(mem_context < MT_AFE_MEM_CTX_COUNT)) {
  1313. struct mt_afe_block_t *afe_block = &(afe_mem_control_context[mem_context]->block);
  1314. if (afe_block) {
  1315. memset_io(afe_block->virtual_buf_addr, 0, afe_block->buffer_size);
  1316. afe_block->read_index = 0;
  1317. afe_block->write_index = 0;
  1318. afe_block->data_remained = 0;
  1319. }
  1320. } else
  1321. pr_err("%s unexpected mem_context = %d\n", __func__, mem_context);
  1322. }
  1323. int mt_afe_update_hw_ptr(enum mt_afe_mem_context mem_context)
  1324. {
  1325. struct mt_afe_block_t *afe_block;
  1326. struct snd_pcm_runtime *runtime;
  1327. int rc = 0;
  1328. if (unlikely(mem_context > MT_AFE_MEM_CTX_COUNT || mem_context < 0))
  1329. return rc;
  1330. afe_block = &(afe_mem_control_context[mem_context]->block);
  1331. runtime = afe_mem_control_context[mem_context]->substream->runtime;
  1332. switch (mem_context) {
  1333. case MT_AFE_MEM_CTX_DL1:
  1334. case MT_AFE_MEM_CTX_DL2:
  1335. case MT_AFE_MEM_CTX_HDMI:
  1336. case MT_AFE_MEM_CTX_HDMI_RAW:
  1337. case MT_AFE_MEM_CTX_SPDIF:
  1338. rc = bytes_to_frames(runtime, afe_block->read_index);
  1339. break;
  1340. case MT_AFE_MEM_CTX_VUL:
  1341. case MT_AFE_MEM_CTX_VUL2:
  1342. case MT_AFE_MEM_CTX_DAI:
  1343. case MT_AFE_MEM_CTX_AWB:
  1344. rc = bytes_to_frames(runtime, afe_block->write_index);
  1345. break;
  1346. default:
  1347. break;
  1348. }
  1349. return rc;
  1350. }
  1351. unsigned int mt_afe_get_board_channel_type(void)
  1352. {
  1353. return board_channel_type;
  1354. }
  1355. void mt_afe_set_hdmi_out_channel(unsigned int channels)
  1356. {
  1357. unsigned int register_value = 0;
  1358. register_value |= (channels << 4);
  1359. mt_afe_set_reg(AFE_HDMI_OUT_CON0, register_value, 0x000000F0);
  1360. }
  1361. int mt_afe_enable_hdmi_out(void)
  1362. {
  1363. mt_afe_set_reg(AFE_HDMI_OUT_CON0, 0x1, 0x1);
  1364. return 0;
  1365. }
  1366. int mt_afe_disable_hdmi_out(void)
  1367. {
  1368. mt_afe_set_reg(AFE_HDMI_OUT_CON0, 0x0, 0x1);
  1369. return 0;
  1370. }
  1371. void mt_afe_set_hdmi_tdm1_config(unsigned int channels, unsigned int i2s_wlen)
  1372. {
  1373. unsigned int register_value = 0;
  1374. register_value |= (MT_AFE_TDM_BCK_INVERSE << 1);
  1375. register_value |= (MT_AFE_TDM_LRCK_INVERSE << 2);
  1376. register_value |= (MT_AFE_TDM_1_BCK_CYCLE_DELAY << 3);
  1377. /* aligned for I2S mode */
  1378. register_value |= (MT_AFE_TDM_ALIGNED_TO_MSB << 4);
  1379. register_value |= (MT_AFE_TDM_2CH_FOR_EACH_SDATA << 10);
  1380. if (i2s_wlen == MT_AFE_I2S_WLEN_32BITS) {
  1381. register_value |= (MT_AFE_TDM_WLLEN_32BIT << 8);
  1382. register_value |= (MT_AFE_TDM_32_BCK_CYCLES << 12);
  1383. /* LRCK TDM WIDTH */
  1384. register_value |= (((MT_AFE_TDM_WLLEN_32BIT << 4) - 1) << 24);
  1385. } else {
  1386. register_value |= (MT_AFE_TDM_WLLEN_16BIT << 8);
  1387. register_value |= (MT_AFE_TDM_16_BCK_CYCLES << 12);
  1388. /* LRCK TDM WIDTH */
  1389. register_value |= (((MT_AFE_TDM_WLLEN_16BIT << 4) - 1) << 24);
  1390. }
  1391. mt_afe_set_reg(AFE_TDM_CON1, register_value, 0xFFFFFFFE);
  1392. }
  1393. void mt_afe_set_hdmi_tdm2_config(unsigned int channels)
  1394. {
  1395. unsigned int register_value = 0;
  1396. switch (channels) {
  1397. case 7:
  1398. case 8:
  1399. register_value |= CHANNEL_START_FROM_030_O31;
  1400. register_value |= (CHANNEL_START_FROM_032_O33 << 4);
  1401. register_value |= (CHANNEL_START_FROM_034_O35 << 8);
  1402. register_value |= (CHANNEL_START_FROM_036_O37 << 12);
  1403. break;
  1404. case 5:
  1405. case 6:
  1406. register_value |= CHANNEL_START_FROM_030_O31;
  1407. register_value |= (CHANNEL_START_FROM_032_O33 << 4);
  1408. register_value |= (CHANNEL_START_FROM_034_O35 << 8);
  1409. register_value |= (CHANNEL_DATA_IS_ZERO << 12);
  1410. break;
  1411. case 3:
  1412. case 4:
  1413. register_value |= CHANNEL_START_FROM_030_O31;
  1414. register_value |= (CHANNEL_START_FROM_032_O33 << 4);
  1415. register_value |= (CHANNEL_DATA_IS_ZERO << 8);
  1416. register_value |= (CHANNEL_DATA_IS_ZERO << 12);
  1417. break;
  1418. case 1:
  1419. case 2:
  1420. register_value |= CHANNEL_START_FROM_030_O31;
  1421. register_value |= (CHANNEL_DATA_IS_ZERO << 4);
  1422. register_value |= (CHANNEL_DATA_IS_ZERO << 8);
  1423. register_value |= (CHANNEL_DATA_IS_ZERO << 12);
  1424. break;
  1425. default:
  1426. return;
  1427. }
  1428. mt_afe_set_reg(AFE_TDM_CON2, register_value, 0x0000FFFF);
  1429. }
  1430. int mt_afe_enable_hdmi_tdm(void)
  1431. {
  1432. mt_afe_set_reg(AFE_TDM_CON1, 0x1, 0x1);
  1433. return 0;
  1434. }
  1435. int mt_afe_disable_hdmi_tdm(void)
  1436. {
  1437. mt_afe_set_reg(AFE_TDM_CON1, 0x0, 0x1);
  1438. return 0;
  1439. }
  1440. int mt_afe_enable_hdmi_tdm_i2s_loopback(void)
  1441. {
  1442. mt_afe_set_reg(AFE_TDM_CON2, 1 << 20, 1 << 20);
  1443. return 0;
  1444. }
  1445. int mt_afe_disable_hdmi_tdm_i2s_loopback(void)
  1446. {
  1447. mt_afe_set_reg(AFE_TDM_CON2, 0 << 20, 1 << 20);
  1448. return 0;
  1449. }
  1450. void mt_afe_set_hdmi_tdm_i2s_loopback_data(unsigned int sdata_index)
  1451. {
  1452. if (sdata_index < 4)
  1453. mt_afe_set_reg(AFE_TDM_CON2, sdata_index << 21, 1 << 21);
  1454. }
  1455. /*
  1456. * static function implementation
  1457. */
  1458. static void mt_afe_init_control(void *dev)
  1459. {
  1460. int i = 0;
  1461. audio_mrg = devm_kzalloc(dev, sizeof(struct mt_afe_merge_interface), GFP_KERNEL);
  1462. audio_dai_bt = devm_kzalloc(dev, sizeof(struct mt_afe_digital_dai_bt), GFP_KERNEL);
  1463. audio_adc_i2s = devm_kzalloc(dev, sizeof(struct mt_afe_digital_i2s), GFP_KERNEL);
  1464. audio_2nd_i2s = devm_kzalloc(dev, sizeof(struct mt_afe_digital_i2s), GFP_KERNEL);
  1465. for (i = 0; i < MT_AFE_IRQ_MCU_MODE_NUM; i++)
  1466. audio_mcu_mode[i] = devm_kzalloc(dev, sizeof(struct mt_afe_irq_status),
  1467. GFP_KERNEL);
  1468. for (i = 0; i < MT_AFE_DIGITAL_BLOCK_NUM; i++)
  1469. audio_mem_if[i] =
  1470. devm_kzalloc(dev, sizeof(struct mt_afe_mem_if_attribute), GFP_KERNEL);
  1471. for (i = 0; i < MT_AFE_MEM_CTX_COUNT; i++)
  1472. afe_mem_control_context[i] =
  1473. devm_kzalloc(dev, sizeof(struct mt_afe_mem_control_t), GFP_KERNEL);
  1474. audio_mrg->mrg_i2s_sample_rate = mt_afe_rate_to_idx(44100);
  1475. mt_afe_main_clk_on();
  1476. /* power down all dividers */
  1477. for (i = MT_AFE_APLL1_DIV0; i < MT_AFE_APLL_DIV_COUNT; i++)
  1478. mt_afe_disable_i2s_div_power(i);
  1479. mt_afe_set_reg(AFE_IRQ_MCU_EN, 1 << 2, 1 << 2);
  1480. mt_afe_main_clk_off();
  1481. }
  1482. static int mt_afe_register_irq(void *dev)
  1483. {
  1484. const int ret = request_irq(audio_irq_id, mt_afe_irq_handler,
  1485. IRQF_TRIGGER_LOW, "Afe_ISR_Handle", dev);
  1486. if (unlikely(ret < 0))
  1487. pr_err("%s %d\n", __func__, ret);
  1488. return ret;
  1489. }
  1490. static irqreturn_t mt_afe_irq_handler(int irq, void *dev_id)
  1491. {
  1492. const uint32_t reg_value = (mt_afe_get_reg(AFE_IRQ_MCU_STATUS) & IRQ_STATUS_BIT);
  1493. if (unlikely(reg_value == 0)) {
  1494. pr_warn("%s reg_value = 0\n", __func__);
  1495. goto irq_handler_exit;
  1496. }
  1497. if (reg_value & MT_AFE_IRQ1_MCU)
  1498. mt_afe_dl_interrupt_handler();
  1499. if (reg_value & MT_AFE_IRQ2_MCU)
  1500. mt_afe_ul_interrupt_handler();
  1501. if (reg_value & MT_AFE_IRQ3_MCU)
  1502. mt_afe_dl2_interrupt_handler();
  1503. if (reg_value & MT_AFE_IRQ5_MCU)
  1504. mt_afe_hdmi_interrupt_handler();
  1505. if (reg_value & MT_AFE_IRQ6_MCU)
  1506. mt_afe_hdmi_raw_interrupt_handler();
  1507. if (reg_value & MT_AFE_IRQ8_MCU)
  1508. mt_afe_spdif_interrupt_handler();
  1509. /* clear irq */
  1510. mt_afe_set_reg(AFE_IRQ_MCU_CLR, reg_value, 0xff);
  1511. irq_handler_exit:
  1512. return IRQ_HANDLED;
  1513. }
  1514. static uint32_t mt_afe_rate_to_idx(uint32_t sample_rate)
  1515. {
  1516. switch (sample_rate) {
  1517. case 8000:
  1518. return MT_AFE_I2S_SAMPLERATE_8K;
  1519. case 11025:
  1520. return MT_AFE_I2S_SAMPLERATE_11K;
  1521. case 12000:
  1522. return MT_AFE_I2S_SAMPLERATE_12K;
  1523. case 16000:
  1524. return MT_AFE_I2S_SAMPLERATE_16K;
  1525. case 22050:
  1526. return MT_AFE_I2S_SAMPLERATE_22K;
  1527. case 24000:
  1528. return MT_AFE_I2S_SAMPLERATE_24K;
  1529. case 32000:
  1530. return MT_AFE_I2S_SAMPLERATE_32K;
  1531. case 44100:
  1532. return MT_AFE_I2S_SAMPLERATE_44K;
  1533. case 48000:
  1534. return MT_AFE_I2S_SAMPLERATE_48K;
  1535. case 88000:
  1536. return MT_AFE_I2S_SAMPLERATE_88K;
  1537. case 96000:
  1538. return MT_AFE_I2S_SAMPLERATE_96K;
  1539. case 174000:
  1540. return MT_AFE_I2S_SAMPLERATE_174K;
  1541. case 192000:
  1542. return MT_AFE_I2S_SAMPLERATE_192K;
  1543. default:
  1544. break;
  1545. }
  1546. return MT_AFE_I2S_SAMPLERATE_44K;
  1547. }
  1548. #ifdef DEBUG_IRQ_STATUS
  1549. static unsigned int gpt_cnt_to_ms(unsigned int cnt1, unsigned int cnt2)
  1550. {
  1551. unsigned int diff;
  1552. if (cnt1 > cnt2)
  1553. diff = cnt1 - cnt2;
  1554. else
  1555. diff = 4294967295 - cnt2 + cnt1;
  1556. return diff / 13000;
  1557. }
  1558. #endif
  1559. static void mt_afe_dl_interrupt_handler(void)
  1560. {
  1561. int afe_consumed_bytes;
  1562. int hw_memory_index;
  1563. int hw_cur_read_index = 0;
  1564. struct mt_afe_block_t *const afe_block =
  1565. &(afe_mem_control_context[MT_AFE_MEM_CTX_DL1]->block);
  1566. #ifdef DEBUG_IRQ_STATUS
  1567. {
  1568. unsigned int current_gpt_cnt;
  1569. irq1_counter++;
  1570. gpt_get_cnt(GPT2, &current_gpt_cnt);
  1571. if (gpt_cnt_to_ms(current_gpt_cnt, pre_irq1_gpt_cnt) > 50) {
  1572. pr_warn("%s[%llu] irq1 diff: %u ms\n", __func__, irq1_counter,
  1573. gpt_cnt_to_ms(current_gpt_cnt, pre_irq1_gpt_cnt));
  1574. }
  1575. }
  1576. #endif
  1577. hw_cur_read_index = mt_afe_get_reg(AFE_DL1_CUR);
  1578. if (hw_cur_read_index == 0) {
  1579. pr_warn("%s hw_cur_read_index == 0\n", __func__);
  1580. hw_cur_read_index = afe_block->phy_buf_addr;
  1581. }
  1582. hw_memory_index = (hw_cur_read_index - afe_block->phy_buf_addr);
  1583. /*
  1584. pr_debug("%s hw_cur_read_index = 0x%x hw_memory_index = 0x%x addr = 0x%x\n",
  1585. __func__, hw_cur_read_index, hw_memory_index, afe_block->physical_buffer_addr);
  1586. */
  1587. /* get hw consume bytes */
  1588. if (hw_memory_index > afe_block->read_index) {
  1589. afe_consumed_bytes = hw_memory_index - afe_block->read_index;
  1590. } else {
  1591. afe_consumed_bytes =
  1592. afe_block->buffer_size + hw_memory_index - afe_block->read_index;
  1593. }
  1594. if (unlikely((afe_consumed_bytes & 0x7) != 0))
  1595. pr_warn("%s DMA address is not aligned 8 bytes (%d)\n", __func__,
  1596. afe_consumed_bytes);
  1597. #ifdef AUDIO_MEMORY_SRAM
  1598. afe_consumed_bytes = afe_consumed_bytes & (~63);
  1599. #endif
  1600. afe_block->read_index += afe_consumed_bytes;
  1601. afe_block->read_index %= afe_block->buffer_size;
  1602. snd_pcm_period_elapsed(afe_mem_control_context[MT_AFE_MEM_CTX_DL1]->substream);
  1603. #ifdef DEBUG_IRQ_STATUS
  1604. gpt_get_cnt(GPT2, &pre_irq1_gpt_cnt);
  1605. #endif
  1606. }
  1607. static void mt_afe_dl2_interrupt_handler(void)
  1608. {
  1609. int afe_consumed_bytes;
  1610. int hw_memory_index;
  1611. int hw_cur_read_index = 0;
  1612. struct mt_afe_block_t *const afe_block =
  1613. &(afe_mem_control_context[MT_AFE_MEM_CTX_DL2]->block);
  1614. hw_cur_read_index = mt_afe_get_reg(AFE_DL2_CUR);
  1615. if (hw_cur_read_index == 0) {
  1616. pr_warn("%s hw_cur_read_index == 0\n", __func__);
  1617. hw_cur_read_index = afe_block->phy_buf_addr;
  1618. }
  1619. hw_memory_index = (hw_cur_read_index - afe_block->phy_buf_addr);
  1620. /*
  1621. pr_debug("%s hw_cur_read_index = 0x%x hw_memory_index = 0x%x addr = 0x%x\n",
  1622. __func__, hw_cur_read_index, hw_memory_index, afe_block->physical_buffer_addr);
  1623. */
  1624. /* get hw consume bytes */
  1625. if (hw_memory_index > afe_block->read_index) {
  1626. afe_consumed_bytes = hw_memory_index - afe_block->read_index;
  1627. } else {
  1628. afe_consumed_bytes =
  1629. afe_block->buffer_size + hw_memory_index - afe_block->read_index;
  1630. }
  1631. if (unlikely((afe_consumed_bytes & 0x7) != 0))
  1632. pr_warn("%s DMA address is not aligned 8 bytes (%d)\n", __func__,
  1633. afe_consumed_bytes);
  1634. afe_block->read_index += afe_consumed_bytes;
  1635. afe_block->read_index %= afe_block->buffer_size;
  1636. snd_pcm_period_elapsed(afe_mem_control_context[MT_AFE_MEM_CTX_DL2]->substream);
  1637. }
  1638. static void mt_afe_ul_interrupt_handler(void)
  1639. {
  1640. /* irq2 ISR handler */
  1641. const uint32_t afe_dac_con0 = mt_afe_get_reg(AFE_DAC_CON0);
  1642. if (afe_dac_con0 & 0x8) {
  1643. /* handle VUL Context */
  1644. mt_afe_handle_mem_context(MT_AFE_MEM_CTX_VUL);
  1645. }
  1646. if (afe_dac_con0 & 0x10) {
  1647. /* handle DAI Context */
  1648. mt_afe_handle_mem_context(MT_AFE_MEM_CTX_DAI);
  1649. }
  1650. if (afe_dac_con0 & 0x40) {
  1651. /* handle AWB Context */
  1652. mt_afe_handle_mem_context(MT_AFE_MEM_CTX_AWB);
  1653. }
  1654. if (afe_dac_con0 & 0x200) {
  1655. /* handle VUL2 Context */
  1656. mt_afe_handle_mem_context(MT_AFE_MEM_CTX_VUL2);
  1657. }
  1658. }
  1659. static void mt_afe_hdmi_interrupt_handler(void)
  1660. {
  1661. int afe_consumed_bytes = 0;
  1662. int hw_memory_index = 0;
  1663. int hw_cur_read_index = 0;
  1664. struct mt_afe_block_t *const afe_block =
  1665. &(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_HDMI)->block);
  1666. hw_cur_read_index = mt_afe_get_reg(AFE_HDMI_OUT_CUR);
  1667. if (hw_cur_read_index == 0) {
  1668. pr_warn("%s hw_cur_read_index = 0\n", __func__);
  1669. hw_cur_read_index = afe_block->phy_buf_addr;
  1670. }
  1671. hw_memory_index = (hw_cur_read_index - afe_block->phy_buf_addr);
  1672. /*
  1673. pr_debug("%s hw_cur_read_index = 0x%x hw_memory_index = 0x%x addr = 0x%x\n",
  1674. __func__, hw_cur_read_index, hw_memory_index, afe_block->physical_buffer_addr);
  1675. */
  1676. /* get hw consume bytes */
  1677. if (hw_memory_index > afe_block->read_index) {
  1678. afe_consumed_bytes = hw_memory_index - afe_block->read_index;
  1679. } else {
  1680. afe_consumed_bytes =
  1681. afe_block->buffer_size + hw_memory_index - afe_block->read_index;
  1682. }
  1683. if ((afe_consumed_bytes & 0xf) != 0)
  1684. pr_warn("%s DMA address is not aligned 16 bytes\n", __func__);
  1685. /*
  1686. pr_debug("%s read_index:%x afe_consumed_bytes:%x hw_memory_index:%x\n",
  1687. __func__, afe_block->read_index, afe_consumed_bytes, hw_memory_index);
  1688. */
  1689. afe_block->read_index += afe_consumed_bytes;
  1690. afe_block->read_index %= afe_block->buffer_size;
  1691. snd_pcm_period_elapsed(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_HDMI)->substream);
  1692. }
  1693. static void mt_afe_hdmi_raw_interrupt_handler(void)
  1694. {
  1695. int afe_consumed_bytes = 0;
  1696. int hw_memory_index = 0;
  1697. int hw_cur_read_index = 0;
  1698. unsigned int burst_len = 0;
  1699. struct mt_afe_block_t *const afe_block =
  1700. &(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_HDMI_RAW)->block);
  1701. if (mt_afe_get_reg(AFE_IEC_BURST_INFO) & 0x000010000) {
  1702. pr_debug("%s HW is Not ready to get next burst info\n", __func__);
  1703. return;
  1704. }
  1705. hw_cur_read_index = mt_afe_get_reg(AFE_SPDIF_CUR);
  1706. if (hw_cur_read_index == 0) {
  1707. pr_warn("%s hw_cur_read_index = 0\n", __func__);
  1708. hw_cur_read_index = afe_block->phy_buf_addr;
  1709. }
  1710. hw_memory_index = (hw_cur_read_index - afe_block->phy_buf_addr);
  1711. /*
  1712. pr_debug("%s hw_cur_read_index = 0x%x hw_memory_index = 0x%x addr = 0x%x\n",
  1713. __func__, hw_cur_read_index, hw_memory_index, afe_block->pucPhysBufAddr);
  1714. */
  1715. /* get hw consume bytes */
  1716. if (hw_memory_index > afe_block->read_index) {
  1717. afe_consumed_bytes = hw_memory_index - afe_block->read_index;
  1718. } else {
  1719. afe_consumed_bytes =
  1720. afe_block->buffer_size + hw_memory_index - afe_block->read_index;
  1721. }
  1722. /*
  1723. pr_debug("%s read_index:%x afe_consumed_bytes:%x hw_memory_index:%x\n",
  1724. __func__, afe_block->read_index, afe_consumed_bytes, hw_memory_index);
  1725. */
  1726. afe_block->read_index += afe_consumed_bytes;
  1727. afe_block->read_index %= afe_block->buffer_size;
  1728. burst_len = (mt_afe_get_reg(AFE_IEC_BURST_LEN) & 0x0007ffff) >> 3;
  1729. afe_block->iec_nsadr += burst_len;
  1730. if (afe_block->iec_nsadr >= mt_afe_get_reg(AFE_SPDIF_END))
  1731. afe_block->iec_nsadr = mt_afe_get_reg(AFE_SPDIF_BASE);
  1732. /* set NSADR for next period */
  1733. mt_afe_set_reg(AFE_IEC_NSADR, afe_block->iec_nsadr, 0xffffffff);
  1734. /* set IEC data ready bit */
  1735. mt_afe_set_reg(AFE_IEC_BURST_INFO, mt_afe_get_reg(AFE_IEC_BURST_INFO) | (0x1 << 16),
  1736. 0xffffffff);
  1737. /*
  1738. pr_debug("%s burst_len 0x%x iec_nsadr 0x%x read_index 0x%x afe_consumed_bytes 0x%x\n",
  1739. __func__, burst_len, afe_block->iec_nsadr, afe_block->read_index, afe_consumed_bytes);
  1740. */
  1741. snd_pcm_period_elapsed(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_HDMI_RAW)->substream);
  1742. }
  1743. static void mt_afe_spdif_interrupt_handler(void)
  1744. {
  1745. int afe_consumed_bytes = 0;
  1746. int hw_memory_index = 0;
  1747. int hw_cur_read_index = 0;
  1748. unsigned int burst_len = 0;
  1749. struct mt_afe_block_t *const afe_block =
  1750. &(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_SPDIF)->block);
  1751. if (mt_afe_get_reg(AFE_IEC2_BURST_INFO) & 0x000010000) {
  1752. pr_debug("%s HW is Not ready to get next burst info\n", __func__);
  1753. return;
  1754. }
  1755. hw_cur_read_index = mt_afe_get_reg(AFE_SPDIF2_CUR);
  1756. if (hw_cur_read_index == 0) {
  1757. pr_warn("%s hw_cur_read_index = 0\n", __func__);
  1758. hw_cur_read_index = afe_block->phy_buf_addr;
  1759. }
  1760. hw_memory_index = (hw_cur_read_index - afe_block->phy_buf_addr);
  1761. /*
  1762. pr_debug("%s hw_cur_read_index = 0x%x hw_memory_index = 0x%x addr = 0x%x\n",
  1763. __func__, hw_cur_read_index, hw_memory_index, afe_block->pucPhysBufAddr);
  1764. */
  1765. /* get hw consume bytes */
  1766. if (hw_memory_index > afe_block->read_index) {
  1767. afe_consumed_bytes = hw_memory_index - afe_block->read_index;
  1768. } else {
  1769. afe_consumed_bytes =
  1770. afe_block->buffer_size + hw_memory_index - afe_block->read_index;
  1771. }
  1772. /*
  1773. pr_debug("%s read_index:%x afe_consumed_bytes:%x hw_memory_index:%x\n",
  1774. __func__, afe_block->read_index, afe_consumed_bytes, hw_memory_index);
  1775. */
  1776. afe_block->read_index += afe_consumed_bytes;
  1777. afe_block->read_index %= afe_block->buffer_size;
  1778. burst_len = (mt_afe_get_reg(AFE_IEC2_BURST_LEN) & 0x0007ffff) >> 3;
  1779. afe_block->iec_nsadr += burst_len;
  1780. if (afe_block->iec_nsadr >= mt_afe_get_reg(AFE_SPDIF2_END))
  1781. afe_block->iec_nsadr = mt_afe_get_reg(AFE_SPDIF2_BASE);
  1782. /* set NSADR for next period */
  1783. mt_afe_set_reg(AFE_IEC2_NSADR, afe_block->iec_nsadr, 0xffffffff);
  1784. /* set IEC data ready bit */
  1785. mt_afe_set_reg(AFE_IEC2_BURST_INFO, mt_afe_get_reg(AFE_IEC2_BURST_INFO) | (0x1 << 16),
  1786. 0xffffffff);
  1787. /*
  1788. pr_debug("%s burst_len 0x%x iec_nsadr 0x%x read_index 0x%x afe_consumed_bytes 0x%x\n",
  1789. __func__, burst_len, afe_block->iec_nsadr, afe_block->read_index, afe_consumed_bytes);
  1790. */
  1791. snd_pcm_period_elapsed(mt_afe_get_mem_ctx(MT_AFE_MEM_CTX_SPDIF)->substream);
  1792. }
  1793. static void mt_afe_handle_mem_context(enum mt_afe_mem_context mem_context)
  1794. {
  1795. uint32_t hw_cur_read_index = 0;
  1796. int hw_get_bytes = 0;
  1797. struct mt_afe_block_t *block = NULL;
  1798. switch (mem_context) {
  1799. case MT_AFE_MEM_CTX_VUL:
  1800. hw_cur_read_index = mt_afe_get_reg(AFE_VUL_CUR);
  1801. break;
  1802. case MT_AFE_MEM_CTX_DAI:
  1803. hw_cur_read_index = mt_afe_get_reg(AFE_DAI_CUR);
  1804. break;
  1805. case MT_AFE_MEM_CTX_AWB:
  1806. hw_cur_read_index = mt_afe_get_reg(AFE_AWB_CUR);
  1807. break;
  1808. case MT_AFE_MEM_CTX_VUL2:
  1809. hw_cur_read_index = mt_afe_get_reg(AFE_VUL_D2_CUR);
  1810. break;
  1811. default:
  1812. return;
  1813. }
  1814. block = &(afe_mem_control_context[mem_context]->block);
  1815. if (unlikely(hw_cur_read_index == 0))
  1816. return;
  1817. if (unlikely(block->virtual_buf_addr == NULL))
  1818. return;
  1819. /* HW already fill in */
  1820. hw_get_bytes = (hw_cur_read_index - block->phy_buf_addr) - block->write_index;
  1821. if (hw_get_bytes < 0)
  1822. hw_get_bytes += block->buffer_size;
  1823. /*
  1824. pr_debug("%s hw_get_bytes:%x hw_cur_read_index:%x read_index:%x write_index:0x%x\n",
  1825. __func__, hw_get_bytes, hw_cur_read_index, block->read_index, block->write_index);
  1826. pr_debug("%s physical_buffer_addr:%x mem_context = %d\n",
  1827. __func__, block->physical_buffer_addr, mem_context); */
  1828. block->write_index += hw_get_bytes;
  1829. block->write_index %= block->buffer_size;
  1830. snd_pcm_period_elapsed(afe_mem_control_context[mem_context]->substream);
  1831. }
  1832. static void mt_afe_clean_predistortion(void)
  1833. {
  1834. mt_afe_set_reg(AFE_ADDA_PREDIS_CON0, 0, MASK_ALL);
  1835. mt_afe_set_reg(AFE_ADDA_PREDIS_CON1, 0, MASK_ALL);
  1836. }
  1837. static bool mt_afe_set_dl_src2(uint32_t sample_rate)
  1838. {
  1839. uint32_t afe_adda_dl_src2_con0, afe_adda_dl_src2_con1;
  1840. if (likely(sample_rate == 44100))
  1841. afe_adda_dl_src2_con0 = 7;
  1842. else if (sample_rate == 8000)
  1843. afe_adda_dl_src2_con0 = 0;
  1844. else if (sample_rate == 11025)
  1845. afe_adda_dl_src2_con0 = 1;
  1846. else if (sample_rate == 12000)
  1847. afe_adda_dl_src2_con0 = 2;
  1848. else if (sample_rate == 16000)
  1849. afe_adda_dl_src2_con0 = 3;
  1850. else if (sample_rate == 22050)
  1851. afe_adda_dl_src2_con0 = 4;
  1852. else if (sample_rate == 24000)
  1853. afe_adda_dl_src2_con0 = 5;
  1854. else if (sample_rate == 32000)
  1855. afe_adda_dl_src2_con0 = 6;
  1856. else if (sample_rate == 48000)
  1857. afe_adda_dl_src2_con0 = 8;
  1858. else
  1859. afe_adda_dl_src2_con0 = 7; /* Default 44100 */
  1860. /* ASSERT(0); */
  1861. if (afe_adda_dl_src2_con0 == 0 || afe_adda_dl_src2_con0 == 3) { /* 8k or 16k voice mode */
  1862. afe_adda_dl_src2_con0 =
  1863. (afe_adda_dl_src2_con0 << 28) | (0x03 << 24) | (0x03 << 11) | (0x01 << 5);
  1864. } else {
  1865. afe_adda_dl_src2_con0 = (afe_adda_dl_src2_con0 << 28) | (0x03 << 24) | (0x03 << 11);
  1866. }
  1867. /* SA suggest apply -0.3db to audio/speech path */
  1868. /* 2013.02.22 for voice mode degrade 0.3 db */
  1869. afe_adda_dl_src2_con0 = afe_adda_dl_src2_con0 | (0x01 << 1);
  1870. afe_adda_dl_src2_con1 = 0xf74f0000;
  1871. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON0, afe_adda_dl_src2_con0, MASK_ALL);
  1872. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON1, afe_adda_dl_src2_con1, MASK_ALL);
  1873. return true;
  1874. }
  1875. static bool mt_afe_is_memif_enable(void)
  1876. {
  1877. int i;
  1878. for (i = 0; i < MT_AFE_DIGITAL_BLOCK_NUM; i++) {
  1879. if ((audio_mem_if[i]->state) == true)
  1880. return true;
  1881. }
  1882. return false;
  1883. }
  1884. static bool mt_afe_is_ul_memif_enable(void)
  1885. {
  1886. int i;
  1887. for (i = MT_AFE_DIGITAL_BLOCK_MEM_VUL; i < MT_AFE_MEM_INTERFACE_NUM; i++) {
  1888. if ((audio_mem_if[i]->state) == true)
  1889. return true;
  1890. }
  1891. return false;
  1892. }
  1893. static uint32_t mt_afe_get_apll_by_rate(uint32_t sample_rate)
  1894. {
  1895. if (sample_rate == 176400 || sample_rate == 88200 || sample_rate == 44100 ||
  1896. sample_rate == 22050 || sample_rate == 11025)
  1897. return MT_AFE_APLL1;
  1898. else
  1899. return MT_AFE_APLL2;
  1900. }
  1901. static void mt_afe_recover_reg(struct mt_afe_suspend_reg *backup_reg)
  1902. {
  1903. pr_debug("+%s\n", __func__);
  1904. if (!backup_reg) {
  1905. pr_warn("%s backup_reg is null\n", __func__);
  1906. return;
  1907. }
  1908. mt_afe_main_clk_on();
  1909. /* Digital register setting */
  1910. mt_afe_set_reg(AUDIO_TOP_CON0, backup_reg->reg_AUDIO_TOP_CON0, MASK_ALL);
  1911. mt_afe_set_reg(AUDIO_TOP_CON1, backup_reg->reg_AUDIO_TOP_CON1, MASK_ALL);
  1912. mt_afe_set_reg(AUDIO_TOP_CON2, backup_reg->reg_AUDIO_TOP_CON2, MASK_ALL);
  1913. mt_afe_set_reg(AUDIO_TOP_CON3, backup_reg->reg_AUDIO_TOP_CON3, MASK_ALL);
  1914. mt_afe_set_reg(AFE_DAC_CON0, backup_reg->reg_AFE_DAC_CON0, MASK_ALL);
  1915. mt_afe_set_reg(AFE_DAC_CON1, backup_reg->reg_AFE_DAC_CON1, MASK_ALL);
  1916. mt_afe_set_reg(AFE_I2S_CON, backup_reg->reg_AFE_I2S_CON, MASK_ALL);
  1917. mt_afe_set_reg(AFE_DAIBT_CON0, backup_reg->reg_AFE_DAIBT_CON0, MASK_ALL);
  1918. mt_afe_set_reg(AFE_CONN0, backup_reg->reg_AFE_CONN0, MASK_ALL);
  1919. mt_afe_set_reg(AFE_CONN1, backup_reg->reg_AFE_CONN1, MASK_ALL);
  1920. mt_afe_set_reg(AFE_CONN2, backup_reg->reg_AFE_CONN2, MASK_ALL);
  1921. mt_afe_set_reg(AFE_CONN3, backup_reg->reg_AFE_CONN3, MASK_ALL);
  1922. mt_afe_set_reg(AFE_CONN4, backup_reg->reg_AFE_CONN4, MASK_ALL);
  1923. mt_afe_set_reg(AFE_CONN5, backup_reg->reg_AFE_CONN5, MASK_ALL);
  1924. mt_afe_set_reg(AFE_CONN6, backup_reg->reg_AFE_CONN6, MASK_ALL);
  1925. mt_afe_set_reg(AFE_CONN7, backup_reg->reg_AFE_CONN7, MASK_ALL);
  1926. mt_afe_set_reg(AFE_CONN8, backup_reg->reg_AFE_CONN8, MASK_ALL);
  1927. mt_afe_set_reg(AFE_CONN9, backup_reg->reg_AFE_CONN9, MASK_ALL);
  1928. mt_afe_set_reg(AFE_CONN_24BIT, backup_reg->reg_AFE_CONN_24BIT, MASK_ALL);
  1929. mt_afe_set_reg(AFE_I2S_CON1, backup_reg->reg_AFE_I2S_CON1, MASK_ALL);
  1930. mt_afe_set_reg(AFE_I2S_CON2, backup_reg->reg_AFE_I2S_CON2, MASK_ALL);
  1931. mt_afe_set_reg(AFE_I2S_CON3, backup_reg->reg_AFE_I2S_CON3, MASK_ALL);
  1932. mt_afe_set_reg(AFE_MRGIF_CON, backup_reg->reg_AFE_MRGIF_CON, MASK_ALL);
  1933. mt_afe_set_reg(AFE_DL1_BASE, backup_reg->reg_AFE_DL1_BASE, MASK_ALL);
  1934. mt_afe_set_reg(AFE_DL1_CUR, backup_reg->reg_AFE_DL1_CUR, MASK_ALL);
  1935. mt_afe_set_reg(AFE_DL1_END, backup_reg->reg_AFE_DL1_END, MASK_ALL);
  1936. mt_afe_set_reg(AFE_DL2_BASE, backup_reg->reg_AFE_DL2_BASE, MASK_ALL);
  1937. mt_afe_set_reg(AFE_DL2_CUR, backup_reg->reg_AFE_DL2_CUR, MASK_ALL);
  1938. mt_afe_set_reg(AFE_DL2_END, backup_reg->reg_AFE_DL2_END, MASK_ALL);
  1939. mt_afe_set_reg(AFE_AWB_BASE, backup_reg->reg_AFE_AWB_BASE, MASK_ALL);
  1940. mt_afe_set_reg(AFE_AWB_CUR, backup_reg->reg_AFE_AWB_CUR, MASK_ALL);
  1941. mt_afe_set_reg(AFE_AWB_END, backup_reg->reg_AFE_AWB_END, MASK_ALL);
  1942. mt_afe_set_reg(AFE_VUL_BASE, backup_reg->reg_AFE_VUL_BASE, MASK_ALL);
  1943. mt_afe_set_reg(AFE_VUL_CUR, backup_reg->reg_AFE_VUL_CUR, MASK_ALL);
  1944. mt_afe_set_reg(AFE_VUL_END, backup_reg->reg_AFE_VUL_END, MASK_ALL);
  1945. mt_afe_set_reg(AFE_VUL_D2_BASE, backup_reg->reg_AFE_VUL_D2_BASE, MASK_ALL);
  1946. mt_afe_set_reg(AFE_VUL_D2_CUR, backup_reg->reg_AFE_VUL_D2_CUR, MASK_ALL);
  1947. mt_afe_set_reg(AFE_VUL_D2_END, backup_reg->reg_AFE_VUL_D2_END, MASK_ALL);
  1948. mt_afe_set_reg(AFE_DAI_BASE, backup_reg->reg_AFE_DAI_BASE, MASK_ALL);
  1949. mt_afe_set_reg(AFE_DAI_CUR, backup_reg->reg_AFE_DAI_CUR, MASK_ALL);
  1950. mt_afe_set_reg(AFE_DAI_END, backup_reg->reg_AFE_DAI_END, MASK_ALL);
  1951. mt_afe_set_reg(AFE_MEMIF_MSB, backup_reg->reg_AFE_MEMIF_MSB, MASK_ALL);
  1952. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON0, backup_reg->reg_AFE_ADDA_DL_SRC2_CON0, MASK_ALL);
  1953. mt_afe_set_reg(AFE_ADDA_DL_SRC2_CON1, backup_reg->reg_AFE_ADDA_DL_SRC2_CON1, MASK_ALL);
  1954. mt_afe_set_reg(AFE_ADDA_UL_SRC_CON0, backup_reg->reg_AFE_ADDA_UL_SRC_CON0, MASK_ALL);
  1955. mt_afe_set_reg(AFE_ADDA_UL_SRC_CON1, backup_reg->reg_AFE_ADDA_UL_SRC_CON1, MASK_ALL);
  1956. mt_afe_set_reg(AFE_ADDA_TOP_CON0, backup_reg->reg_AFE_ADDA_TOP_CON0, MASK_ALL);
  1957. mt_afe_set_reg(AFE_ADDA_UL_DL_CON0, backup_reg->reg_AFE_ADDA_UL_DL_CON0, MASK_ALL);
  1958. mt_afe_set_reg(AFE_ADDA_NEWIF_CFG0, backup_reg->reg_AFE_ADDA_NEWIF_CFG0, MASK_ALL);
  1959. mt_afe_set_reg(AFE_ADDA_NEWIF_CFG1, backup_reg->reg_AFE_ADDA_NEWIF_CFG1, MASK_ALL);
  1960. mt_afe_set_reg(AFE_ADDA2_TOP_CON0, backup_reg->reg_AFE_ADDA2_TOP_CON0, MASK_ALL);
  1961. mt_afe_set_reg(AFE_SIDETONE_CON0, backup_reg->reg_AFE_SIDETONE_CON0, MASK_ALL);
  1962. mt_afe_set_reg(AFE_SIDETONE_COEFF, backup_reg->reg_AFE_SIDETONE_COEFF, MASK_ALL);
  1963. mt_afe_set_reg(AFE_SIDETONE_CON1, backup_reg->reg_AFE_SIDETONE_CON1, MASK_ALL);
  1964. mt_afe_set_reg(AFE_SIDETONE_GAIN, backup_reg->reg_AFE_SIDETONE_GAIN, MASK_ALL);
  1965. mt_afe_set_reg(AFE_SGEN_CON0, backup_reg->reg_AFE_SGEN_CON0, MASK_ALL);
  1966. mt_afe_set_reg(AFE_SGEN_CON1, backup_reg->reg_AFE_SGEN_CON1, MASK_ALL);
  1967. mt_afe_set_reg(AFE_TOP_CON0, backup_reg->reg_AFE_TOP_CON0, MASK_ALL);
  1968. mt_afe_set_reg(AFE_ADDA_PREDIS_CON0, backup_reg->reg_AFE_ADDA_PREDIS_CON0, MASK_ALL);
  1969. mt_afe_set_reg(AFE_ADDA_PREDIS_CON1, backup_reg->reg_AFE_ADDA_PREDIS_CON1, MASK_ALL);
  1970. mt_afe_set_reg(AFE_MOD_DAI_BASE, backup_reg->reg_AFE_MOD_DAI_BASE, MASK_ALL);
  1971. mt_afe_set_reg(AFE_MOD_DAI_END, backup_reg->reg_AFE_MOD_DAI_END, MASK_ALL);
  1972. mt_afe_set_reg(AFE_MOD_DAI_CUR, backup_reg->reg_AFE_MOD_DAI_CUR, MASK_ALL);
  1973. mt_afe_set_reg(AFE_HDMI_OUT_CON0, backup_reg->reg_AFE_HDMI_OUT_CON0, MASK_ALL);
  1974. mt_afe_set_reg(AFE_HDMI_OUT_BASE, backup_reg->reg_AFE_HDMI_OUT_BASE, MASK_ALL);
  1975. mt_afe_set_reg(AFE_HDMI_OUT_CUR, backup_reg->reg_AFE_HDMI_OUT_CUR, MASK_ALL);
  1976. mt_afe_set_reg(AFE_HDMI_OUT_END, backup_reg->reg_AFE_HDMI_OUT_END, MASK_ALL);
  1977. mt_afe_set_reg(AFE_SPDIF_OUT_CON0, backup_reg->reg_AFE_SPDIF_OUT_CON0, MASK_ALL);
  1978. mt_afe_set_reg(AFE_SPDIF_BASE, backup_reg->reg_AFE_SPDIF_BASE, MASK_ALL);
  1979. mt_afe_set_reg(AFE_SPDIF_CUR, backup_reg->reg_AFE_SPDIF_CUR, MASK_ALL);
  1980. mt_afe_set_reg(AFE_SPDIF_END, backup_reg->reg_AFE_SPDIF_END, MASK_ALL);
  1981. mt_afe_set_reg(AFE_SPDIF2_OUT_CON0, backup_reg->reg_AFE_SPDIF2_OUT_CON0, MASK_ALL);
  1982. mt_afe_set_reg(AFE_SPDIF2_BASE, backup_reg->reg_AFE_SPDIF2_BASE, MASK_ALL);
  1983. mt_afe_set_reg(AFE_SPDIF2_CUR, backup_reg->reg_AFE_SPDIF2_CUR, MASK_ALL);
  1984. mt_afe_set_reg(AFE_SPDIF2_END, backup_reg->reg_AFE_SPDIF2_END, MASK_ALL);
  1985. mt_afe_set_reg(AFE_HDMI_CONN0, backup_reg->reg_AFE_HDMI_CONN0, MASK_ALL);
  1986. mt_afe_set_reg(AFE_IRQ_MCU_CON, backup_reg->reg_AFE_IRQ_MCU_CON, MASK_ALL);
  1987. mt_afe_set_reg(AFE_IRQ_MCU_CNT1, backup_reg->reg_AFE_IRQ_MCU_CNT1, MASK_ALL);
  1988. mt_afe_set_reg(AFE_IRQ_MCU_CNT2, backup_reg->reg_AFE_IRQ_MCU_CNT2, MASK_ALL);
  1989. mt_afe_set_reg(AFE_IRQ_MCU_EN, backup_reg->reg_AFE_IRQ_MCU_EN, MASK_ALL);
  1990. mt_afe_set_reg(AFE_IRQ_MCU_CNT5, backup_reg->reg_AFE_IRQ_MCU_CNT5, MASK_ALL);
  1991. mt_afe_set_reg(AFE_MEMIF_MAXLEN, backup_reg->reg_AFE_MEMIF_MAXLEN, MASK_ALL);
  1992. mt_afe_set_reg(AFE_MEMIF_PBUF_SIZE, backup_reg->reg_AFE_MEMIF_PBUF_SIZE, MASK_ALL);
  1993. mt_afe_set_reg(AFE_MEMIF_PBUF2_SIZE, backup_reg->reg_AFE_MEMIF_PBUF2_SIZE, MASK_ALL);
  1994. mt_afe_set_reg(AFE_APLL1_TUNER_CFG, backup_reg->reg_AFE_APLL1_TUNER_CFG, MASK_ALL);
  1995. mt_afe_set_reg(AFE_APLL2_TUNER_CFG, backup_reg->reg_AFE_APLL2_TUNER_CFG, MASK_ALL);
  1996. mt_afe_set_reg(AFE_GAIN1_CON0, backup_reg->reg_AFE_GAIN1_CON0, MASK_ALL);
  1997. mt_afe_set_reg(AFE_GAIN1_CON1, backup_reg->reg_AFE_GAIN1_CON1, MASK_ALL);
  1998. mt_afe_set_reg(AFE_GAIN1_CON2, backup_reg->reg_AFE_GAIN1_CON2, MASK_ALL);
  1999. mt_afe_set_reg(AFE_GAIN1_CON3, backup_reg->reg_AFE_GAIN1_CON3, MASK_ALL);
  2000. mt_afe_set_reg(AFE_GAIN1_CONN, backup_reg->reg_AFE_GAIN1_CONN, MASK_ALL);
  2001. mt_afe_set_reg(AFE_GAIN1_CUR, backup_reg->reg_AFE_GAIN1_CUR, MASK_ALL);
  2002. mt_afe_set_reg(AFE_GAIN2_CON0, backup_reg->reg_AFE_GAIN2_CON0, MASK_ALL);
  2003. mt_afe_set_reg(AFE_GAIN2_CON1, backup_reg->reg_AFE_GAIN2_CON1, MASK_ALL);
  2004. mt_afe_set_reg(AFE_GAIN2_CON2, backup_reg->reg_AFE_GAIN2_CON2, MASK_ALL);
  2005. mt_afe_set_reg(AFE_GAIN2_CON3, backup_reg->reg_AFE_GAIN2_CON3, MASK_ALL);
  2006. mt_afe_set_reg(AFE_GAIN2_CONN, backup_reg->reg_AFE_GAIN2_CONN, MASK_ALL);
  2007. mt_afe_set_reg(AFE_GAIN2_CUR, backup_reg->reg_AFE_GAIN2_CUR, MASK_ALL);
  2008. mt_afe_set_reg(AFE_IEC_CFG, backup_reg->reg_AFE_IEC_CFG, MASK_ALL);
  2009. mt_afe_set_reg(AFE_IEC_NSNUM, backup_reg->reg_AFE_IEC_NSNUM, MASK_ALL);
  2010. mt_afe_set_reg(AFE_IEC_BURST_INFO, backup_reg->reg_AFE_IEC_BURST_INFO, MASK_ALL);
  2011. mt_afe_set_reg(AFE_IEC_BURST_LEN, backup_reg->reg_AFE_IEC_BURST_LEN, MASK_ALL);
  2012. mt_afe_set_reg(AFE_IEC_NSADR, backup_reg->reg_AFE_IEC_NSADR, MASK_ALL);
  2013. mt_afe_set_reg(AFE_IEC_CHL_STAT0, backup_reg->reg_AFE_IEC_CHL_STAT0, MASK_ALL);
  2014. mt_afe_set_reg(AFE_IEC_CHL_STAT1, backup_reg->reg_AFE_IEC_CHL_STAT1, MASK_ALL);
  2015. mt_afe_set_reg(AFE_IEC_CHR_STAT0, backup_reg->reg_AFE_IEC_CHR_STAT0, MASK_ALL);
  2016. mt_afe_set_reg(AFE_IEC_CHR_STAT1, backup_reg->reg_AFE_IEC_CHR_STAT1, MASK_ALL);
  2017. mt_afe_set_reg(AFE_IEC2_CFG, backup_reg->reg_AFE_IEC2_CFG, MASK_ALL);
  2018. mt_afe_set_reg(AFE_IEC2_NSNUM, backup_reg->reg_AFE_IEC2_NSNUM, MASK_ALL);
  2019. mt_afe_set_reg(AFE_IEC2_BURST_INFO, backup_reg->reg_AFE_IEC2_BURST_INFO, MASK_ALL);
  2020. mt_afe_set_reg(AFE_IEC2_BURST_LEN, backup_reg->reg_AFE_IEC2_BURST_LEN, MASK_ALL);
  2021. mt_afe_set_reg(AFE_IEC2_NSADR, backup_reg->reg_AFE_IEC2_NSADR, MASK_ALL);
  2022. mt_afe_set_reg(AFE_IEC2_CHL_STAT0, backup_reg->reg_AFE_IEC2_CHL_STAT0, MASK_ALL);
  2023. mt_afe_set_reg(AFE_IEC2_CHL_STAT1, backup_reg->reg_AFE_IEC2_CHL_STAT1, MASK_ALL);
  2024. mt_afe_set_reg(AFE_IEC2_CHR_STAT0, backup_reg->reg_AFE_IEC2_CHR_STAT0, MASK_ALL);
  2025. mt_afe_set_reg(AFE_IEC2_CHR_STAT1, backup_reg->reg_AFE_IEC2_CHR_STAT1, MASK_ALL);
  2026. mt_afe_set_reg(AFE_ASRC_CON0, backup_reg->reg_AFE_ASRC_CON0, MASK_ALL);
  2027. mt_afe_set_reg(AFE_ASRC_CON1, backup_reg->reg_AFE_ASRC_CON1, MASK_ALL);
  2028. mt_afe_set_reg(AFE_ASRC_CON2, backup_reg->reg_AFE_ASRC_CON2, MASK_ALL);
  2029. mt_afe_set_reg(AFE_ASRC_CON3, backup_reg->reg_AFE_ASRC_CON3, MASK_ALL);
  2030. mt_afe_set_reg(AFE_ASRC_CON4, backup_reg->reg_AFE_ASRC_CON4, MASK_ALL);
  2031. mt_afe_set_reg(AFE_ASRC_CON5, backup_reg->reg_AFE_ASRC_CON5, MASK_ALL);
  2032. mt_afe_set_reg(AFE_ASRC_CON6, backup_reg->reg_AFE_ASRC_CON6, MASK_ALL);
  2033. mt_afe_set_reg(AFE_ASRC_CON7, backup_reg->reg_AFE_ASRC_CON7, MASK_ALL);
  2034. mt_afe_set_reg(AFE_ASRC_CON8, backup_reg->reg_AFE_ASRC_CON8, MASK_ALL);
  2035. mt_afe_set_reg(AFE_ASRC_CON9, backup_reg->reg_AFE_ASRC_CON9, MASK_ALL);
  2036. mt_afe_set_reg(AFE_ASRC_CON10, backup_reg->reg_AFE_ASRC_CON10, MASK_ALL);
  2037. mt_afe_set_reg(AFE_ASRC_CON13, backup_reg->reg_AFE_ASRC_CON11, MASK_ALL);
  2038. mt_afe_set_reg(AFE_ASRC_CON14, backup_reg->reg_AFE_ASRC_CON13, MASK_ALL);
  2039. mt_afe_set_reg(AFE_ASRC_CON14, backup_reg->reg_AFE_ASRC_CON14, MASK_ALL);
  2040. mt_afe_set_reg(AFE_ASRC_CON15, backup_reg->reg_AFE_ASRC_CON15, MASK_ALL);
  2041. mt_afe_set_reg(AFE_ASRC_CON16, backup_reg->reg_AFE_ASRC_CON16, MASK_ALL);
  2042. mt_afe_set_reg(AFE_ASRC_CON17, backup_reg->reg_AFE_ASRC_CON17, MASK_ALL);
  2043. mt_afe_set_reg(AFE_ASRC_CON18, backup_reg->reg_AFE_ASRC_CON18, MASK_ALL);
  2044. mt_afe_set_reg(AFE_ASRC_CON19, backup_reg->reg_AFE_ASRC_CON19, MASK_ALL);
  2045. mt_afe_set_reg(AFE_ASRC_CON20, backup_reg->reg_AFE_ASRC_CON20, MASK_ALL);
  2046. mt_afe_set_reg(AFE_ASRC_CON21, backup_reg->reg_AFE_ASRC_CON21, MASK_ALL);
  2047. mt_afe_set_reg(PCM_INTF_CON1, backup_reg->reg_PCM_INTF_CON1, MASK_ALL);
  2048. mt_afe_set_reg(PCM_INTF_CON2, backup_reg->reg_PCM_INTF_CON2, MASK_ALL);
  2049. mt_afe_set_reg(PCM2_INTF_CON, backup_reg->reg_PCM2_INTF_CON, MASK_ALL);
  2050. mt_afe_set_reg(AFE_TDM_CON1, backup_reg->reg_AFE_TDM_CON1, MASK_ALL);
  2051. mt_afe_set_reg(AFE_TDM_CON2, backup_reg->reg_AFE_TDM_CON2, MASK_ALL);
  2052. mt_afe_main_clk_off();
  2053. pr_debug("-%s\n", __func__);
  2054. }
  2055. static void mt_afe_store_reg(struct mt_afe_suspend_reg *backup_reg)
  2056. {
  2057. pr_debug("+%s\n", __func__);
  2058. if (!backup_reg) {
  2059. pr_warn("%s backup_reg is null\n", __func__);
  2060. return;
  2061. }
  2062. mt_afe_main_clk_on();
  2063. backup_reg->reg_AUDIO_TOP_CON0 = mt_afe_get_reg(AUDIO_TOP_CON0);
  2064. backup_reg->reg_AUDIO_TOP_CON1 = mt_afe_get_reg(AUDIO_TOP_CON1);
  2065. backup_reg->reg_AUDIO_TOP_CON2 = mt_afe_get_reg(AUDIO_TOP_CON2);
  2066. backup_reg->reg_AUDIO_TOP_CON3 = mt_afe_get_reg(AUDIO_TOP_CON3);
  2067. backup_reg->reg_AFE_DAC_CON0 = mt_afe_get_reg(AFE_DAC_CON0);
  2068. backup_reg->reg_AFE_DAC_CON1 = mt_afe_get_reg(AFE_DAC_CON1);
  2069. backup_reg->reg_AFE_I2S_CON = mt_afe_get_reg(AFE_I2S_CON);
  2070. backup_reg->reg_AFE_DAIBT_CON0 = mt_afe_get_reg(AFE_DAIBT_CON0);
  2071. backup_reg->reg_AFE_CONN0 = mt_afe_get_reg(AFE_CONN0);
  2072. backup_reg->reg_AFE_CONN1 = mt_afe_get_reg(AFE_CONN1);
  2073. backup_reg->reg_AFE_CONN2 = mt_afe_get_reg(AFE_CONN2);
  2074. backup_reg->reg_AFE_CONN3 = mt_afe_get_reg(AFE_CONN3);
  2075. backup_reg->reg_AFE_CONN4 = mt_afe_get_reg(AFE_CONN4);
  2076. backup_reg->reg_AFE_CONN5 = mt_afe_get_reg(AFE_CONN5);
  2077. backup_reg->reg_AFE_CONN6 = mt_afe_get_reg(AFE_CONN6);
  2078. backup_reg->reg_AFE_CONN7 = mt_afe_get_reg(AFE_CONN7);
  2079. backup_reg->reg_AFE_CONN8 = mt_afe_get_reg(AFE_CONN8);
  2080. backup_reg->reg_AFE_CONN9 = mt_afe_get_reg(AFE_CONN9);
  2081. backup_reg->reg_AFE_CONN_24BIT = mt_afe_get_reg(AFE_CONN_24BIT);
  2082. backup_reg->reg_AFE_I2S_CON1 = mt_afe_get_reg(AFE_I2S_CON1);
  2083. backup_reg->reg_AFE_I2S_CON2 = mt_afe_get_reg(AFE_I2S_CON2);
  2084. backup_reg->reg_AFE_I2S_CON3 = mt_afe_get_reg(AFE_I2S_CON3);
  2085. backup_reg->reg_AFE_MRGIF_CON = mt_afe_get_reg(AFE_MRGIF_CON);
  2086. backup_reg->reg_AFE_DL1_BASE = mt_afe_get_reg(AFE_DL1_BASE);
  2087. backup_reg->reg_AFE_DL1_CUR = mt_afe_get_reg(AFE_DL1_CUR);
  2088. backup_reg->reg_AFE_DL1_END = mt_afe_get_reg(AFE_DL1_END);
  2089. backup_reg->reg_AFE_DL2_BASE = mt_afe_get_reg(AFE_DL2_BASE);
  2090. backup_reg->reg_AFE_DL2_CUR = mt_afe_get_reg(AFE_DL2_CUR);
  2091. backup_reg->reg_AFE_DL2_END = mt_afe_get_reg(AFE_DL2_END);
  2092. backup_reg->reg_AFE_AWB_BASE = mt_afe_get_reg(AFE_AWB_BASE);
  2093. backup_reg->reg_AFE_AWB_CUR = mt_afe_get_reg(AFE_AWB_CUR);
  2094. backup_reg->reg_AFE_AWB_END = mt_afe_get_reg(AFE_AWB_END);
  2095. backup_reg->reg_AFE_VUL_BASE = mt_afe_get_reg(AFE_VUL_BASE);
  2096. backup_reg->reg_AFE_VUL_CUR = mt_afe_get_reg(AFE_VUL_CUR);
  2097. backup_reg->reg_AFE_VUL_END = mt_afe_get_reg(AFE_VUL_END);
  2098. backup_reg->reg_AFE_VUL_D2_BASE = mt_afe_get_reg(AFE_VUL_D2_BASE);
  2099. backup_reg->reg_AFE_VUL_D2_CUR = mt_afe_get_reg(AFE_VUL_D2_CUR);
  2100. backup_reg->reg_AFE_VUL_D2_END = mt_afe_get_reg(AFE_VUL_D2_END);
  2101. backup_reg->reg_AFE_DAI_BASE = mt_afe_get_reg(AFE_DAI_BASE);
  2102. backup_reg->reg_AFE_DAI_CUR = mt_afe_get_reg(AFE_DAI_CUR);
  2103. backup_reg->reg_AFE_DAI_END = mt_afe_get_reg(AFE_DAI_END);
  2104. backup_reg->reg_AFE_MEMIF_MSB = mt_afe_get_reg(AFE_MEMIF_MSB);
  2105. backup_reg->reg_AFE_ADDA_DL_SRC2_CON0 = mt_afe_get_reg(AFE_ADDA_DL_SRC2_CON0);
  2106. backup_reg->reg_AFE_ADDA_DL_SRC2_CON1 = mt_afe_get_reg(AFE_ADDA_DL_SRC2_CON1);
  2107. backup_reg->reg_AFE_ADDA_UL_SRC_CON0 = mt_afe_get_reg(AFE_ADDA_UL_SRC_CON0);
  2108. backup_reg->reg_AFE_ADDA_UL_SRC_CON1 = mt_afe_get_reg(AFE_ADDA_UL_SRC_CON1);
  2109. backup_reg->reg_AFE_ADDA_TOP_CON0 = mt_afe_get_reg(AFE_ADDA_TOP_CON0);
  2110. backup_reg->reg_AFE_ADDA_UL_DL_CON0 = mt_afe_get_reg(AFE_ADDA_UL_DL_CON0);
  2111. backup_reg->reg_AFE_ADDA_NEWIF_CFG0 = mt_afe_get_reg(AFE_ADDA_NEWIF_CFG0);
  2112. backup_reg->reg_AFE_ADDA_NEWIF_CFG1 = mt_afe_get_reg(AFE_ADDA_NEWIF_CFG1);
  2113. backup_reg->reg_AFE_ADDA2_TOP_CON0 = mt_afe_get_reg(AFE_ADDA2_TOP_CON0);
  2114. backup_reg->reg_AFE_SIDETONE_CON0 = mt_afe_get_reg(AFE_SIDETONE_CON0);
  2115. backup_reg->reg_AFE_SIDETONE_COEFF = mt_afe_get_reg(AFE_SIDETONE_COEFF);
  2116. backup_reg->reg_AFE_SIDETONE_CON1 = mt_afe_get_reg(AFE_SIDETONE_CON1);
  2117. backup_reg->reg_AFE_SIDETONE_GAIN = mt_afe_get_reg(AFE_SIDETONE_GAIN);
  2118. backup_reg->reg_AFE_SGEN_CON0 = mt_afe_get_reg(AFE_SGEN_CON0);
  2119. backup_reg->reg_AFE_SGEN_CON1 = mt_afe_get_reg(AFE_SGEN_CON1);
  2120. backup_reg->reg_AFE_TOP_CON0 = mt_afe_get_reg(AFE_TOP_CON0);
  2121. backup_reg->reg_AFE_ADDA_PREDIS_CON0 = mt_afe_get_reg(AFE_ADDA_PREDIS_CON0);
  2122. backup_reg->reg_AFE_ADDA_PREDIS_CON1 = mt_afe_get_reg(AFE_ADDA_PREDIS_CON1);
  2123. backup_reg->reg_AFE_MOD_DAI_BASE = mt_afe_get_reg(AFE_MOD_DAI_BASE);
  2124. backup_reg->reg_AFE_MOD_DAI_END = mt_afe_get_reg(AFE_MOD_DAI_END);
  2125. backup_reg->reg_AFE_MOD_DAI_CUR = mt_afe_get_reg(AFE_MOD_DAI_CUR);
  2126. backup_reg->reg_AFE_HDMI_OUT_CON0 = mt_afe_get_reg(AFE_HDMI_OUT_CON0);
  2127. backup_reg->reg_AFE_HDMI_OUT_BASE = mt_afe_get_reg(AFE_HDMI_OUT_BASE);
  2128. backup_reg->reg_AFE_HDMI_OUT_CUR = mt_afe_get_reg(AFE_HDMI_OUT_CUR);
  2129. backup_reg->reg_AFE_HDMI_OUT_END = mt_afe_get_reg(AFE_HDMI_OUT_END);
  2130. backup_reg->reg_AFE_SPDIF_OUT_CON0 = mt_afe_get_reg(AFE_SPDIF_OUT_CON0);
  2131. backup_reg->reg_AFE_SPDIF_BASE = mt_afe_get_reg(AFE_SPDIF_BASE);
  2132. backup_reg->reg_AFE_SPDIF_CUR = mt_afe_get_reg(AFE_SPDIF_CUR);
  2133. backup_reg->reg_AFE_SPDIF_END = mt_afe_get_reg(AFE_SPDIF_END);
  2134. backup_reg->reg_AFE_SPDIF2_OUT_CON0 = mt_afe_get_reg(AFE_SPDIF2_OUT_CON0);
  2135. backup_reg->reg_AFE_SPDIF2_BASE = mt_afe_get_reg(AFE_SPDIF2_BASE);
  2136. backup_reg->reg_AFE_SPDIF2_CUR = mt_afe_get_reg(AFE_SPDIF2_CUR);
  2137. backup_reg->reg_AFE_SPDIF2_END = mt_afe_get_reg(AFE_SPDIF2_END);
  2138. backup_reg->reg_AFE_HDMI_CONN0 = mt_afe_get_reg(AFE_HDMI_CONN0);
  2139. backup_reg->reg_AFE_IRQ_MCU_CON = mt_afe_get_reg(AFE_IRQ_MCU_CON);
  2140. backup_reg->reg_AFE_IRQ_MCU_CNT1 = mt_afe_get_reg(AFE_IRQ_MCU_CNT1);
  2141. backup_reg->reg_AFE_IRQ_MCU_CNT2 = mt_afe_get_reg(AFE_IRQ_MCU_CNT2);
  2142. backup_reg->reg_AFE_IRQ_MCU_EN = mt_afe_get_reg(AFE_IRQ_MCU_EN);
  2143. backup_reg->reg_AFE_IRQ_MCU_CNT5 = mt_afe_get_reg(AFE_IRQ_MCU_CNT5);
  2144. backup_reg->reg_AFE_MEMIF_MAXLEN = mt_afe_get_reg(AFE_MEMIF_MAXLEN);
  2145. backup_reg->reg_AFE_MEMIF_PBUF_SIZE = mt_afe_get_reg(AFE_MEMIF_PBUF_SIZE);
  2146. backup_reg->reg_AFE_MEMIF_PBUF2_SIZE = mt_afe_get_reg(AFE_MEMIF_PBUF2_SIZE);
  2147. backup_reg->reg_AFE_APLL1_TUNER_CFG = mt_afe_get_reg(AFE_APLL1_TUNER_CFG);
  2148. backup_reg->reg_AFE_APLL2_TUNER_CFG = mt_afe_get_reg(AFE_APLL2_TUNER_CFG);
  2149. backup_reg->reg_AFE_GAIN1_CON0 = mt_afe_get_reg(AFE_GAIN1_CON0);
  2150. backup_reg->reg_AFE_GAIN1_CON1 = mt_afe_get_reg(AFE_GAIN1_CON1);
  2151. backup_reg->reg_AFE_GAIN1_CON2 = mt_afe_get_reg(AFE_GAIN1_CON2);
  2152. backup_reg->reg_AFE_GAIN1_CON3 = mt_afe_get_reg(AFE_GAIN1_CON3);
  2153. backup_reg->reg_AFE_GAIN1_CONN = mt_afe_get_reg(AFE_GAIN1_CONN);
  2154. backup_reg->reg_AFE_GAIN1_CUR = mt_afe_get_reg(AFE_GAIN1_CUR);
  2155. backup_reg->reg_AFE_GAIN2_CON0 = mt_afe_get_reg(AFE_GAIN2_CON0);
  2156. backup_reg->reg_AFE_GAIN2_CON1 = mt_afe_get_reg(AFE_GAIN2_CON1);
  2157. backup_reg->reg_AFE_GAIN2_CON2 = mt_afe_get_reg(AFE_GAIN2_CON2);
  2158. backup_reg->reg_AFE_GAIN2_CON3 = mt_afe_get_reg(AFE_GAIN2_CON3);
  2159. backup_reg->reg_AFE_GAIN2_CONN = mt_afe_get_reg(AFE_GAIN2_CONN);
  2160. backup_reg->reg_AFE_GAIN2_CUR = mt_afe_get_reg(AFE_GAIN2_CUR);
  2161. backup_reg->reg_AFE_IEC_CFG = mt_afe_get_reg(AFE_IEC_CFG);
  2162. backup_reg->reg_AFE_IEC_NSNUM = mt_afe_get_reg(AFE_IEC_NSNUM);
  2163. backup_reg->reg_AFE_IEC_BURST_INFO = mt_afe_get_reg(AFE_IEC_BURST_INFO);
  2164. backup_reg->reg_AFE_IEC_BURST_LEN = mt_afe_get_reg(AFE_IEC_BURST_LEN);
  2165. backup_reg->reg_AFE_IEC_NSADR = mt_afe_get_reg(AFE_IEC_NSADR);
  2166. backup_reg->reg_AFE_IEC_CHL_STAT0 = mt_afe_get_reg(AFE_IEC_CHL_STAT0);
  2167. backup_reg->reg_AFE_IEC_CHL_STAT1 = mt_afe_get_reg(AFE_IEC_CHL_STAT1);
  2168. backup_reg->reg_AFE_IEC_CHR_STAT0 = mt_afe_get_reg(AFE_IEC_CHR_STAT0);
  2169. backup_reg->reg_AFE_IEC_CHR_STAT1 = mt_afe_get_reg(AFE_IEC_CHR_STAT1);
  2170. backup_reg->reg_AFE_IEC2_CFG = mt_afe_get_reg(AFE_IEC2_CFG);
  2171. backup_reg->reg_AFE_IEC2_NSNUM = mt_afe_get_reg(AFE_IEC2_NSNUM);
  2172. backup_reg->reg_AFE_IEC2_BURST_INFO = mt_afe_get_reg(AFE_IEC2_BURST_INFO);
  2173. backup_reg->reg_AFE_IEC2_BURST_LEN = mt_afe_get_reg(AFE_IEC2_BURST_LEN);
  2174. backup_reg->reg_AFE_IEC2_NSADR = mt_afe_get_reg(AFE_IEC2_NSADR);
  2175. backup_reg->reg_AFE_IEC2_CHL_STAT0 = mt_afe_get_reg(AFE_IEC2_CHL_STAT0);
  2176. backup_reg->reg_AFE_IEC2_CHL_STAT1 = mt_afe_get_reg(AFE_IEC2_CHL_STAT1);
  2177. backup_reg->reg_AFE_IEC2_CHR_STAT0 = mt_afe_get_reg(AFE_IEC2_CHR_STAT0);
  2178. backup_reg->reg_AFE_IEC2_CHR_STAT1 = mt_afe_get_reg(AFE_IEC2_CHR_STAT1);
  2179. backup_reg->reg_AFE_ASRC_CON0 = mt_afe_get_reg(AFE_ASRC_CON0);
  2180. backup_reg->reg_AFE_ASRC_CON1 = mt_afe_get_reg(AFE_ASRC_CON1);
  2181. backup_reg->reg_AFE_ASRC_CON2 = mt_afe_get_reg(AFE_ASRC_CON2);
  2182. backup_reg->reg_AFE_ASRC_CON3 = mt_afe_get_reg(AFE_ASRC_CON3);
  2183. backup_reg->reg_AFE_ASRC_CON4 = mt_afe_get_reg(AFE_ASRC_CON4);
  2184. backup_reg->reg_AFE_ASRC_CON5 = mt_afe_get_reg(AFE_ASRC_CON5);
  2185. backup_reg->reg_AFE_ASRC_CON6 = mt_afe_get_reg(AFE_ASRC_CON6);
  2186. backup_reg->reg_AFE_ASRC_CON7 = mt_afe_get_reg(AFE_ASRC_CON7);
  2187. backup_reg->reg_AFE_ASRC_CON8 = mt_afe_get_reg(AFE_ASRC_CON8);
  2188. backup_reg->reg_AFE_ASRC_CON9 = mt_afe_get_reg(AFE_ASRC_CON9);
  2189. backup_reg->reg_AFE_ASRC_CON10 = mt_afe_get_reg(AFE_ASRC_CON10);
  2190. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON11);
  2191. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON13);
  2192. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON14);
  2193. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON15);
  2194. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON16);
  2195. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON17);
  2196. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON18);
  2197. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON19);
  2198. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON20);
  2199. backup_reg->reg_AFE_ASRC_CON11 = mt_afe_get_reg(AFE_ASRC_CON21);
  2200. backup_reg->reg_PCM_INTF_CON1 = mt_afe_get_reg(PCM_INTF_CON1);
  2201. backup_reg->reg_PCM_INTF_CON2 = mt_afe_get_reg(PCM_INTF_CON2);
  2202. backup_reg->reg_PCM2_INTF_CON = mt_afe_get_reg(PCM2_INTF_CON);
  2203. backup_reg->reg_AFE_TDM_CON1 = mt_afe_get_reg(AFE_TDM_CON1);
  2204. backup_reg->reg_AFE_TDM_CON2 = mt_afe_get_reg(AFE_TDM_CON2);
  2205. mt_afe_main_clk_off();
  2206. pr_debug("-%s\n", __func__);
  2207. }
  2208. static void mt_afe_enable_i2s_div_power(uint32_t divider)
  2209. {
  2210. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, 0 << divider, 1 << divider);
  2211. }
  2212. static void mt_afe_disable_i2s_div_power(uint32_t divider)
  2213. {
  2214. mt_afe_topck_set_reg(AUDIO_CLK_AUDDIV_3, 1 << divider, 1 << divider);
  2215. }