mt_soc_machine.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. /*
  2. * Copyright (C) 2007 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /*******************************************************************************
  17. *
  18. * Filename:
  19. * ---------
  20. * mt_soc_machine.c
  21. *
  22. * Project:
  23. * --------
  24. * Audio soc machine driver
  25. *
  26. * Description:
  27. * ------------
  28. * Audio machine driver
  29. *
  30. * Author:
  31. * -------
  32. * Chipeng Chang
  33. *
  34. *------------------------------------------------------------------------------
  35. *
  36. *******************************************************************************/
  37. /*****************************************************************************
  38. * C O M P I L E R F L A G S
  39. *****************************************************************************/
  40. /*****************************************************************************
  41. * E X T E R N A L R E F E R E N C E S
  42. *****************************************************************************/
  43. #include <mt_idle.h>
  44. #include "AudDrv_Common.h"
  45. #include "AudDrv_Def.h"
  46. #include "AudDrv_Afe.h"
  47. #include "AudDrv_Ana.h"
  48. #include "AudDrv_Clk.h"
  49. #include "AudDrv_Kernel.h"
  50. #include "mt_soc_afe_control.h"
  51. #include <mach/mt_clkbuf_ctl.h>
  52. #include <sound/mt_soc_audio.h>
  53. #include <linux/kernel.h>
  54. #include <linux/module.h>
  55. #include <linux/init.h>
  56. #include <linux/device.h>
  57. #include <linux/slab.h>
  58. #include <linux/fs.h>
  59. #include <linux/completion.h>
  60. #include <linux/mm.h>
  61. #include <linux/delay.h>
  62. #include <linux/interrupt.h>
  63. #include <linux/dma-mapping.h>
  64. #include <linux/vmalloc.h>
  65. #include <linux/platform_device.h>
  66. #include <linux/miscdevice.h>
  67. #include <linux/wait.h>
  68. #include <linux/spinlock.h>
  69. #include <linux/sched.h>
  70. #include <linux/wakelock.h>
  71. #include <linux/semaphore.h>
  72. #include <linux/jiffies.h>
  73. #include <linux/proc_fs.h>
  74. #include <linux/string.h>
  75. #include <linux/mutex.h>
  76. /*#include <linux/xlog.h>*/
  77. /*#include <mach/irqs.h>*/
  78. #include <asm/uaccess.h>
  79. #include <asm/irq.h>
  80. #include <asm/io.h>
  81. #include <asm/div64.h>
  82. /*
  83. #include <mach/mt_reg_base.h>
  84. #include <linux/aee.h>
  85. #include <mach/upmu_common.h>
  86. #include <mach/upmu_hw.h>
  87. #include <mach/mt_gpio.h>
  88. #include <mach/mt_typedefs.h>*/
  89. #include <linux/types.h>
  90. #include <stdarg.h>
  91. #include <linux/module.h>
  92. #include <linux/clk.h>
  93. #include <linux/delay.h>
  94. #include <linux/gpio.h>
  95. /* #include <linux/mfd/pm8xxx/pm8921.h> */
  96. #include <linux/platform_device.h>
  97. #include <linux/slab.h>
  98. #include <sound/core.h>
  99. #include <sound/soc.h>
  100. #include <sound/soc-dapm.h>
  101. #include <sound/pcm.h>
  102. #include <sound/jack.h>
  103. /* #include <asm/mach-types.h> */
  104. #include <linux/debugfs.h>
  105. #include "mt_soc_codec_63xx.h"
  106. static int mt_soc_lowjitter_control;
  107. static struct dentry *mt_sco_audio_debugfs;
  108. #define DEBUG_FS_NAME "mtksocaudio"
  109. #define DEBUG_ANA_FS_NAME "mtksocanaaudio"
  110. static int mtmachine_startup(struct snd_pcm_substream *substream)
  111. {
  112. /* printk("mtmachine_startup\n"); */
  113. return 0;
  114. }
  115. static int mtmachine_prepare(struct snd_pcm_substream *substream)
  116. {
  117. /* printk("mtmachine_prepare\n"); */
  118. return 0;
  119. }
  120. static struct snd_soc_ops mt_machine_audio_ops = {
  121. .startup = mtmachine_startup,
  122. .prepare = mtmachine_prepare,
  123. };
  124. static int mtmachine_startupmedia2(struct snd_pcm_substream *substream)
  125. {
  126. /* printk("mtmachine_startupmedia2\n"); */
  127. return 0;
  128. }
  129. static int mtmachine_preparemedia2(struct snd_pcm_substream *substream)
  130. {
  131. /* printk("mtmachine_preparemedia2\n"); */
  132. return 0;
  133. }
  134. static struct snd_soc_ops mtmachine_audio_ops2 = {
  135. .startup = mtmachine_startupmedia2,
  136. .prepare = mtmachine_preparemedia2,
  137. };
  138. static int mt_soc_audio_init(struct snd_soc_pcm_runtime *rtd)
  139. {
  140. pr_warn("mt_soc_audio_init\n");
  141. return 0;
  142. }
  143. static int mt_soc_audio_init2(struct snd_soc_pcm_runtime *rtd)
  144. {
  145. pr_warn("mt_soc_audio_init2\n");
  146. return 0;
  147. }
  148. static int mt_soc_ana_debug_open(struct inode *inode, struct file *file)
  149. {
  150. pr_warn("mt_soc_ana_debug_open\n");
  151. return 0;
  152. }
  153. static ssize_t mt_soc_ana_debug_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
  154. {
  155. const int size = 4096;
  156. char buffer[size];
  157. int n = 0;
  158. pr_warn("mt_soc_ana_debug_read count = %zu\n", count);
  159. AudDrv_Clk_On();
  160. audckbufEnable(true);
  161. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON0));
  162. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON1 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON1));
  163. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON2 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON2));
  164. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON3 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON3));
  165. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON4 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON4));
  166. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON5 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON5));
  167. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON6 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON6));
  168. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON7 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON7));
  169. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON8 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON8));
  170. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON9 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON9));
  171. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON10 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON10));
  172. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON11 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON11));
  173. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA0));
  174. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA1 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA1));
  175. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA2 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA2));
  176. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_CFG0 = 0x%x\n", Ana_Get_Reg(AFE_UP8X_FIFO_CFG0));
  177. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_LOG_MON0 = 0x%x\n", Ana_Get_Reg(AFE_UP8X_FIFO_LOG_MON0));
  178. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_LOG_MON1 = 0x%x\n", Ana_Get_Reg(AFE_UP8X_FIFO_LOG_MON1));
  179. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG0 = 0x%x\n", Ana_Get_Reg(AFE_PMIC_NEWIF_CFG0));
  180. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG1 = 0x%x\n", Ana_Get_Reg(AFE_PMIC_NEWIF_CFG1));
  181. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG2 = 0x%x\n", Ana_Get_Reg(AFE_PMIC_NEWIF_CFG2));
  182. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG3 = 0x%x\n", Ana_Get_Reg(AFE_PMIC_NEWIF_CFG3));
  183. n += scnprintf(buffer + n, size - n, "ABB_AFE_TOP_CON0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_TOP_CON0));
  184. n += scnprintf(buffer + n, size - n, "ABB_MON_DEBUG0 = 0x%x\n", Ana_Get_Reg(ABB_MON_DEBUG0));
  185. n += scnprintf(buffer + n, size - n, "SPK_CON0 = 0x%x\n", Ana_Get_Reg(SPK_CON0));
  186. n += scnprintf(buffer + n, size - n, "SPK_CON1 = 0x%x\n", Ana_Get_Reg(SPK_CON1));
  187. n += scnprintf(buffer + n, size - n, "SPK_CON2 = 0x%x\n", Ana_Get_Reg(SPK_CON2));
  188. n += scnprintf(buffer + n, size - n, "SPK_CON6 = 0x%x\n", Ana_Get_Reg(SPK_CON6));
  189. n += scnprintf(buffer + n, size - n, "SPK_CON7 = 0x%x\n", Ana_Get_Reg(SPK_CON7));
  190. n += scnprintf(buffer + n, size - n, "SPK_CON8 = 0x%x\n", Ana_Get_Reg(SPK_CON8));
  191. n += scnprintf(buffer + n, size - n, "SPK_CON9 = 0x%x\n", Ana_Get_Reg(SPK_CON9));
  192. n += scnprintf(buffer + n, size - n, "SPK_CON10 = 0x%x\n", Ana_Get_Reg(SPK_CON10));
  193. n += scnprintf(buffer + n, size - n, "SPK_CON11 = 0x%x\n", Ana_Get_Reg(SPK_CON11));
  194. n += scnprintf(buffer + n, size - n, "SPK_CON12 = 0x%x\n", Ana_Get_Reg(SPK_CON12));
  195. n += scnprintf(buffer + n, size - n, "CID = 0x%x\n", Ana_Get_Reg(CID));
  196. n += scnprintf(buffer + n, size - n, "TOP_CKPDN0 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0));
  197. n += scnprintf(buffer + n, size - n, "TOP_CKPDN0_SET = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0_SET));
  198. n += scnprintf(buffer + n, size - n, "TOP_CKPDN0_CLR = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0_CLR));
  199. n += scnprintf(buffer + n, size - n, "TOP_CKPDN1 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1));
  200. n += scnprintf(buffer + n, size - n, "TOP_CKPDN1_SET = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1_SET));
  201. n += scnprintf(buffer + n, size - n, "TOP_CKPDN1_CLR = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1_CLR));
  202. n += scnprintf(buffer + n, size - n, "TOP_CKPDN2 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN2));
  203. n += scnprintf(buffer + n, size - n, "TOP_CKPDN2_SET = 0x%x\n", Ana_Get_Reg(TOP_CKPDN2_SET));
  204. n += scnprintf(buffer + n, size - n, "TOP_CKPDN2_CLR = 0x%x\n", Ana_Get_Reg(TOP_CKPDN2_CLR));
  205. n += scnprintf(buffer + n, size - n, "TOP_CKCON1 = 0x%x\n", Ana_Get_Reg(TOP_CKCON1));
  206. n += scnprintf(buffer + n, size - n, "AUDTOP_CON0 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON0));
  207. n += scnprintf(buffer + n, size - n, "AUDTOP_CON1 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON1));
  208. n += scnprintf(buffer + n, size - n, "AUDTOP_CON2 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON2));
  209. n += scnprintf(buffer + n, size - n, "AUDTOP_CON3 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON3));
  210. n += scnprintf(buffer + n, size - n, "AUDTOP_CON4 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON4));
  211. n += scnprintf(buffer + n, size - n, "AUDTOP_CON5 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON5));
  212. n += scnprintf(buffer + n, size - n, "AUDTOP_CON6 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON6));
  213. n += scnprintf(buffer + n, size - n, "AUDTOP_CON7 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON7));
  214. n += scnprintf(buffer + n, size - n, "AUDTOP_CON8 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON8));
  215. n += scnprintf(buffer + n, size - n, "AUDTOP_CON9 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON9));
  216. pr_warn("mt_soc_ana_debug_read len = %d\n", n);
  217. audckbufEnable(false);
  218. AudDrv_Clk_Off();
  219. return simple_read_from_buffer(buf, count, pos, buffer, n);
  220. }
  221. static int mt_soc_debug_open(struct inode *inode, struct file *file)
  222. {
  223. pr_warn("mt_soc_debug_open\n");
  224. return 0;
  225. }
  226. static ssize_t mt_soc_debug_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
  227. {
  228. const int size = 4096;
  229. char buffer[size];
  230. int n = 0;
  231. AudDrv_Clk_On();
  232. pr_warn("mt_soc_debug_read\n");
  233. n = scnprintf(buffer + n, size - n, "AUDIO_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON0));
  234. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON1 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON1));
  235. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON2 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON2));
  236. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON3 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON3));
  237. n += scnprintf(buffer + n, size - n, "AFE_DAC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON0));
  238. n += scnprintf(buffer + n, size - n, "AFE_DAC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON1));
  239. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON));
  240. n += scnprintf(buffer + n, size - n, "AFE_CONN0 = 0x%x\n", Afe_Get_Reg(AFE_CONN0));
  241. n += scnprintf(buffer + n, size - n, "AFE_CONN1 = 0x%x\n", Afe_Get_Reg(AFE_CONN1));
  242. n += scnprintf(buffer + n, size - n, "AFE_CONN2 = 0x%x\n", Afe_Get_Reg(AFE_CONN2));
  243. n += scnprintf(buffer + n, size - n, "AFE_CONN3 = 0x%x\n", Afe_Get_Reg(AFE_CONN3));
  244. n += scnprintf(buffer + n, size - n, "AFE_CONN4 = 0x%x\n", Afe_Get_Reg(AFE_CONN4));
  245. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON1 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON1));
  246. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON2 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON2));
  247. n += scnprintf(buffer + n, size - n, "AFE_DL1_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL1_BASE));
  248. n += scnprintf(buffer + n, size - n, "AFE_DL1_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL1_CUR));
  249. n += scnprintf(buffer + n, size - n, "AFE_DL1_END = 0x%x\n", Afe_Get_Reg(AFE_DL1_END));
  250. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON3 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON3));
  251. n += scnprintf(buffer + n, size - n, "AFE_DL2_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL2_BASE));
  252. n += scnprintf(buffer + n, size - n, "AFE_DL2_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL2_CUR));
  253. n += scnprintf(buffer + n, size - n, "AFE_DL2_END = 0x%x\n", Afe_Get_Reg(AFE_DL2_END));
  254. n += scnprintf(buffer + n, size - n, "AFE_AWB_BASE = 0x%x\n", Afe_Get_Reg(AFE_AWB_BASE));
  255. n += scnprintf(buffer + n, size - n, "AFE_AWB_END = 0x%x\n", Afe_Get_Reg(AFE_AWB_END));
  256. n += scnprintf(buffer + n, size - n, "AFE_AWB_CUR = 0x%x\n", Afe_Get_Reg(AFE_AWB_CUR));
  257. n += scnprintf(buffer + n, size - n, "AFE_VUL_BASE = 0x%x\n", Afe_Get_Reg(AFE_VUL_BASE));
  258. n += scnprintf(buffer + n, size - n, "AFE_VUL_END = 0x%x\n", Afe_Get_Reg(AFE_VUL_END));
  259. n += scnprintf(buffer + n, size - n, "AFE_VUL_CUR = 0x%x\n", Afe_Get_Reg(AFE_VUL_CUR));
  260. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON0 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON0));
  261. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON1 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON1));
  262. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON2 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON2));
  263. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON4 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON4));
  264. n += scnprintf(buffer + n, size - n, "AFE_ADDA_DL_SRC2_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON0));
  265. n += scnprintf(buffer + n, size - n, "AFE_ADDA_DL_SRC2_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON1));
  266. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_SRC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_SRC_CON0));
  267. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_SRC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_SRC_CON1));
  268. n += scnprintf(buffer + n, size - n, "AFE_ADDA_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_TOP_CON0));
  269. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_DL_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_DL_CON0));
  270. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG));
  271. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG_MON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON0));
  272. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG_MON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON1));
  273. n += scnprintf(buffer + n, size - n, "AFE_ADDA_NEWIF_CFG0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_NEWIF_CFG0));
  274. n += scnprintf(buffer + n, size - n, "AFE_ADDA_NEWIF_CFG1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_NEWIF_CFG1));
  275. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_DEBUG = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_DEBUG));
  276. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_MON = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_MON));
  277. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_CON0));
  278. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_COEFF = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_COEFF));
  279. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_CON1 = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_CON1));
  280. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_GAIN = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_GAIN));
  281. n += scnprintf(buffer + n, size - n, "AFE_SGEN_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SGEN_CON0));
  282. n += scnprintf(buffer + n, size - n, "AFE_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AFE_TOP_CON0));
  283. n += scnprintf(buffer + n, size - n, "AFE_ADDA_PREDIS_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_PREDIS_CON0));
  284. n += scnprintf(buffer + n, size - n, "AFE_ADDA_PREDIS_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_PREDIS_CON1));
  285. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_BASE = 0x%x\n", Afe_Get_Reg(AFE_MOD_DAI_BASE));
  286. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_END = 0x%x\n", Afe_Get_Reg(AFE_MOD_DAI_END));
  287. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_CUR = 0x%x\n", Afe_Get_Reg(AFE_MOD_DAI_CUR));
  288. n += scnprintf(buffer + n, size - n, "AFE_IRQ_CON = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CON));
  289. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CON = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CON));
  290. n += scnprintf(buffer + n, size - n, "AFE_IRQ_STATUS = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_STATUS));
  291. n += scnprintf(buffer + n, size - n, "AFE_IRQ_CLR = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CLR));
  292. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CNT1 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CNT1));
  293. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CNT2 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CNT2));
  294. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MON2 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_MON2));
  295. n += scnprintf(buffer + n, size - n, "AFE_IRQ1_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ1_MCU_CNT_MON));
  296. n += scnprintf(buffer + n, size - n, "AFE_IRQ2_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ2_MCU_CNT_MON));
  297. n += scnprintf(buffer + n, size - n, "AFE_IRQ1_EN_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ1_MCU_EN_CNT_MON));
  298. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MAXLEN = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MAXLEN));
  299. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_PBUF_SIZE = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_PBUF_SIZE));
  300. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON0 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON0));
  301. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON1 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON1));
  302. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON2));
  303. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON3 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON3));
  304. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CONN = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CONN));
  305. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CUR));
  306. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON0 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON0));
  307. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON1 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON1));
  308. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON2));
  309. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON3 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON3));
  310. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CONN = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CONN));
  311. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CUR));
  312. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CONN2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CONN2));
  313. n += scnprintf(buffer + n, size - n, "FPGA_CFG2 = 0x%x\n", Afe_Get_Reg(FPGA_CFG2));
  314. n += scnprintf(buffer + n, size - n, "FPGA_CFG3 = 0x%x\n", Afe_Get_Reg(FPGA_CFG3));
  315. n += scnprintf(buffer + n, size - n, "FPGA_CFG0 = 0x%x\n", Afe_Get_Reg(FPGA_CFG0));
  316. n += scnprintf(buffer + n, size - n, "FPGA_CFG1 = 0x%x\n", Afe_Get_Reg(FPGA_CFG1));
  317. n += scnprintf(buffer + n, size - n, "FPGA_STC = 0x%x\n", Afe_Get_Reg(FPGA_STC));
  318. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON0));
  319. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON1));
  320. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON2 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON2));
  321. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON3 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON3));
  322. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON4 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON4));
  323. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON5 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON5));
  324. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON6 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON6));
  325. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON7 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON7));
  326. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON8 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON8));
  327. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON9 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON9));
  328. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON10 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON10));
  329. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON11 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON11));
  330. n += scnprintf(buffer + n, size - n, "PCM_INTF_CON1 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON));
  331. n += scnprintf(buffer + n, size - n, "PCM_INTF_CON2 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON2));
  332. n += scnprintf(buffer + n, size - n, "PCM2_INTF_CON = 0x%x\n", Afe_Get_Reg(PCM2_INTF_CON));
  333. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON13 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON13));
  334. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON14 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON14));
  335. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON15 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON15));
  336. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON16 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON16));
  337. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON17 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON17));
  338. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON18 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON18));
  339. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON19 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON19));
  340. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON20 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON20));
  341. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON21 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON21));
  342. pr_warn("mt_soc_debug_read len = %d\n", n);
  343. AudDrv_Clk_Off();
  344. return simple_read_from_buffer(buf, count, pos, buffer, n);
  345. }
  346. static char const ParSetkeyAfe[] = "Setafereg";
  347. static char const ParSetkeyAna[] = "Setanareg";
  348. static char const ParSetkeyCfg[] = "Setcfgreg";
  349. static char const PareGetkeyAfe[] = "Getafereg";
  350. static char const PareGetkeyAna[] = "Getanareg";
  351. /* static char ParGetkeyCfg[] = "Getcfgreg"; */
  352. /* static char ParSetAddr[] = "regaddr"; */
  353. /* static char ParSetValue[] = "regvalue"; */
  354. static ssize_t mt_soc_debug_write(struct file *f, const char __user *buf,
  355. size_t count, loff_t *offset)
  356. {
  357. int ret = 0;
  358. char InputString[256];
  359. char *token1 = NULL;
  360. char *token2 = NULL;
  361. char *token3 = NULL;
  362. char *token4 = NULL;
  363. char *token5 = NULL;
  364. char *temp = NULL;
  365. unsigned int long regaddr = 0;
  366. unsigned int long regvalue = 0;
  367. char delim[] = " ,";
  368. memset((void *)InputString, 0, 256);
  369. if (count > 256)
  370. count = 256;
  371. if (copy_from_user((InputString), buf, count))
  372. pr_warn("copy_from_user mt_soc_debug_write count = %zu temp = %s\n", count, InputString);
  373. temp = kstrdup(InputString, GFP_KERNEL);
  374. pr_warn("copy_from_user mt_soc_debug_write count = %zu temp = %s pointer = %p\n",
  375. count, InputString, InputString);
  376. token1 = strsep(&temp, delim);
  377. pr_warn("token1\n");
  378. pr_warn("token1 = %s\n", token1);
  379. token2 = strsep(&temp, delim);
  380. pr_warn("token2 = %s\n", token2);
  381. token3 = strsep(&temp, delim);
  382. pr_warn("token3 = %s\n", token3);
  383. token4 = strsep(&temp, delim);
  384. pr_warn("token4 = %s\n", token4);
  385. token5 = strsep(&temp, delim);
  386. pr_warn("token5 = %s\n", token5);
  387. AudDrv_Clk_On();
  388. audckbufEnable(true);
  389. if (strcmp(token1, ParSetkeyAfe) == 0) {
  390. pr_warn("strcmp (token1,ParSetkeyAfe)\n");
  391. ret = kstrtoul(token3, 16, &regaddr);
  392. ret = kstrtoul(token5, 16, &regvalue);
  393. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  394. Afe_Set_Reg(regaddr, regvalue, 0xffffffff);
  395. regvalue = Afe_Get_Reg(regaddr);
  396. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  397. }
  398. if (strcmp(token1, ParSetkeyAna) == 0) {
  399. pr_warn("strcmp (token1,ParSetkeyAna)\n");
  400. ret = kstrtoul(token3, 16, &regaddr);
  401. ret = kstrtoul(token5, 16, &regvalue);
  402. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  403. Ana_Set_Reg(regaddr, regvalue, 0xffffffff);
  404. regvalue = Ana_Get_Reg(regaddr);
  405. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  406. }
  407. if (strcmp(token1, ParSetkeyCfg) == 0) {
  408. pr_warn("strcmp (token1,ParSetkeyCfg)\n");
  409. ret = kstrtoul(token3, 16, &regaddr);
  410. ret = kstrtoul(token5, 16, &regvalue);
  411. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  412. #if 0
  413. SetClkCfg(regaddr, regvalue, 0xffffffff);
  414. regvalue = GetClkCfg(regaddr);
  415. #endif
  416. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  417. }
  418. if (strcmp(token1, PareGetkeyAfe) == 0) {
  419. pr_warn("strcmp (token1,PareGetkeyAfe)\n");
  420. ret = kstrtoul(token3, 16, &regaddr);
  421. regvalue = Afe_Get_Reg(regaddr);
  422. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAfe, regaddr, regvalue);
  423. }
  424. if (strcmp(token1, PareGetkeyAna) == 0) {
  425. pr_warn("strcmp (token1,PareGetkeyAna)\n");
  426. ret = kstrtoul(token3, 16, &regaddr);
  427. regvalue = Ana_Get_Reg(regaddr);
  428. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAna, regaddr, regvalue);
  429. }
  430. audckbufEnable(false);
  431. AudDrv_Clk_Off();
  432. return count;
  433. }
  434. static const struct file_operations mtaudio_debug_ops = {
  435. .open = mt_soc_debug_open,
  436. .read = mt_soc_debug_read,
  437. .write = mt_soc_debug_write,
  438. };
  439. static const struct file_operations mtaudio_ana_debug_ops = {
  440. .open = mt_soc_ana_debug_open,
  441. .read = mt_soc_ana_debug_read,
  442. };
  443. /* Digital audio interface glue - connects codec <---> CPU */
  444. static struct snd_soc_dai_link mt_soc_dai_common[] = {
  445. /* FrontEnd DAI Links */
  446. {
  447. .name = "MultiMedia1",
  448. .stream_name = MT_SOC_DL1_STREAM_NAME,
  449. .cpu_dai_name = MT_SOC_DL1DAI_NAME,
  450. .platform_name = MT_SOC_DL1_PCM,
  451. .codec_dai_name = MT_SOC_CODEC_TXDAI_NAME,
  452. .codec_name = MT_SOC_CODEC_NAME,
  453. .init = mt_soc_audio_init,
  454. .ops = &mt_machine_audio_ops,
  455. },
  456. {
  457. .name = "MultiMedia2",
  458. .stream_name = MT_SOC_UL1_STREAM_NAME,
  459. .cpu_dai_name = MT_SOC_UL1DAI_NAME,
  460. .platform_name = MT_SOC_UL1_PCM,
  461. .codec_dai_name = MT_SOC_CODEC_RXDAI_NAME,
  462. .codec_name = MT_SOC_CODEC_NAME,
  463. .init = mt_soc_audio_init,
  464. .ops = &mt_machine_audio_ops,
  465. },
  466. {
  467. .name = "Voice_MD1",
  468. .stream_name = MT_SOC_VOICE_MD1_STREAM_NAME,
  469. .cpu_dai_name = MT_SOC_VOICE_MD1_NAME,
  470. .platform_name = MT_SOC_VOICE_MD1,
  471. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1DAI_NAME,
  472. .codec_name = MT_SOC_CODEC_NAME,
  473. .init = mt_soc_audio_init,
  474. .ops = &mt_machine_audio_ops,
  475. },
  476. {
  477. .name = "HDMI_OUT",
  478. .stream_name = MT_SOC_HDMI_STREAM_NAME,
  479. .cpu_dai_name = MT_SOC_HDMI_NAME,
  480. .platform_name = MT_SOC_HDMI_PCM,
  481. .codec_dai_name = MT_SOC_CODEC_HDMI_DUMMY_DAI_NAME,
  482. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  483. .init = mt_soc_audio_init,
  484. .ops = &mt_machine_audio_ops,
  485. },
  486. {
  487. .name = "ULDLOOPBACK",
  488. .stream_name = MT_SOC_ULDLLOOPBACK_STREAM_NAME,
  489. .cpu_dai_name = MT_SOC_ULDLLOOPBACK_NAME,
  490. .platform_name = MT_SOC_ULDLLOOPBACK_PCM,
  491. .codec_dai_name = MT_SOC_CODEC_ULDLLOOPBACK_NAME,
  492. .codec_name = MT_SOC_CODEC_NAME,
  493. .init = mt_soc_audio_init,
  494. .ops = &mt_machine_audio_ops,
  495. },
  496. {
  497. .name = "I2S0OUTPUT",
  498. .stream_name = MT_SOC_I2S0_STREAM_NAME,
  499. .cpu_dai_name = MT_SOC_I2S0_NAME,
  500. .platform_name = MT_SOC_I2S0_PCM,
  501. .codec_dai_name = MT_SOC_CODEC_I2S0_DUMMY_DAI_NAME,
  502. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  503. .init = mt_soc_audio_init,
  504. .ops = &mt_machine_audio_ops,
  505. },
  506. {
  507. .name = "MRGRX",
  508. .stream_name = MT_SOC_MRGRX_STREAM_NAME,
  509. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  510. .platform_name = MT_SOC_MRGRX_PCM,
  511. .codec_dai_name = MT_SOC_CODEC_MRGRX_DAI_NAME,
  512. .codec_name = MT_SOC_CODEC_NAME,
  513. .init = mt_soc_audio_init,
  514. .ops = &mt_machine_audio_ops,
  515. },
  516. {
  517. .name = "MRGRXCAPTURE",
  518. .stream_name = MT_SOC_MRGRX_CAPTURE_STREAM_NAME,
  519. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  520. .platform_name = MT_SOC_MRGRX_AWB_PCM,
  521. .codec_dai_name = MT_SOC_CODEC_MRGRX_DUMMY_DAI_NAME,
  522. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  523. .init = mt_soc_audio_init,
  524. .ops = &mt_machine_audio_ops,
  525. },
  526. {
  527. .name = "I2S0DL1OUTPUT",
  528. .stream_name = MT_SOC_I2SDL1_STREAM_NAME,
  529. .cpu_dai_name = MT_SOC_I2S0DL1_NAME,
  530. .platform_name = MT_SOC_I2S0DL1_PCM,
  531. .codec_dai_name = MT_SOC_CODEC_I2S0TXDAI_NAME,
  532. .codec_name = MT_SOC_CODEC_NAME,
  533. .init = mt_soc_audio_init,
  534. .ops = &mt_machine_audio_ops,
  535. },
  536. {
  537. .name = "DL1AWBCAPTURE",
  538. .stream_name = MT_SOC_DL1_AWB_RECORD_STREAM_NAME,
  539. .cpu_dai_name = MT_SOC_DL1AWB_NAME,
  540. .platform_name = MT_SOC_DL1_AWB_PCM,
  541. .codec_dai_name = MT_SOC_CODEC_DL1AWBDAI_NAME,
  542. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  543. .init = mt_soc_audio_init,
  544. .ops = &mt_machine_audio_ops,
  545. },
  546. {
  547. .name = "Voice_MD1_BT",
  548. .stream_name = MT_SOC_VOICE_MD1_BT_STREAM_NAME,
  549. .cpu_dai_name = MT_SOC_VOICE_MD1_BT_NAME,
  550. .platform_name = MT_SOC_VOICE_MD1_BT,
  551. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1_BTDAI_NAME,
  552. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  553. .init = mt_soc_audio_init,
  554. .ops = &mt_machine_audio_ops,
  555. },
  556. {
  557. .name = "VOIP_CALL_BT_PLAYBACK",
  558. .stream_name = MT_SOC_VOIP_BT_OUT_STREAM_NAME,
  559. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_OUT_NAME,
  560. .platform_name = MT_SOC_VOIP_BT_OUT,
  561. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTOUTDAI_NAME,
  562. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  563. .init = mt_soc_audio_init,
  564. .ops = &mt_machine_audio_ops,
  565. },
  566. {
  567. .name = "VOIP_CALL_BT_CAPTURE",
  568. .stream_name = MT_SOC_VOIP_BT_IN_STREAM_NAME,
  569. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_IN_NAME,
  570. .platform_name = MT_SOC_VOIP_BT_IN,
  571. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTINDAI_NAME,
  572. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  573. .init = mt_soc_audio_init,
  574. .ops = &mt_machine_audio_ops,
  575. },
  576. {
  577. .name = "TDM_Debug_CAPTURE",
  578. .stream_name = MT_SOC_TDM_CAPTURE_STREAM_NAME,
  579. .cpu_dai_name = MT_SOC_TDMRX_NAME,
  580. .platform_name = MT_SOC_TDMRX_PCM,
  581. .codec_dai_name = MT_SOC_CODEC_TDMRX_DAI_NAME,
  582. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  583. .init = mt_soc_audio_init,
  584. .ops = &mt_machine_audio_ops,
  585. },
  586. {
  587. .name = "FM_MRG_TX",
  588. .stream_name = MT_SOC_FM_MRGTX_STREAM_NAME,
  589. .cpu_dai_name = MT_SOC_FM_MRGTX_NAME,
  590. .platform_name = MT_SOC_FM_MRGTX_PCM,
  591. .codec_dai_name = MT_SOC_CODEC_FMMRGTXDAI_DUMMY_DAI_NAME,
  592. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  593. .init = mt_soc_audio_init,
  594. .ops = &mt_machine_audio_ops,
  595. },
  596. {
  597. .name = "MultiMedia3",
  598. .stream_name = MT_SOC_UL1DATA2_STREAM_NAME,
  599. .cpu_dai_name = MT_SOC_UL2DAI_NAME,
  600. .platform_name = MT_SOC_UL2_PCM,
  601. .codec_dai_name = MT_SOC_CODEC_RXDAI2_NAME,
  602. .codec_name = MT_SOC_CODEC_NAME,
  603. .init = mt_soc_audio_init,
  604. .ops = &mt_machine_audio_ops,
  605. },
  606. {
  607. .name = "I2S0_AWB_CAPTURE",
  608. .stream_name = MT_SOC_I2S0AWB_STREAM_NAME,
  609. .cpu_dai_name = MT_SOC_I2S0AWBDAI_NAME,
  610. .platform_name = MT_SOC_I2S0_AWB_PCM,
  611. .codec_dai_name = MT_SOC_CODEC_I2S0AWB_NAME,
  612. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  613. .init = mt_soc_audio_init,
  614. .ops = &mt_machine_audio_ops,
  615. },
  616. {
  617. .name = "Voice_MD2",
  618. .stream_name = MT_SOC_VOICE_MD2_STREAM_NAME,
  619. .cpu_dai_name = MT_SOC_VOICE_MD2_NAME,
  620. .platform_name = MT_SOC_VOICE_MD2,
  621. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2DAI_NAME,
  622. .codec_name = MT_SOC_CODEC_NAME,
  623. .init = mt_soc_audio_init,
  624. .ops = &mt_machine_audio_ops,
  625. },
  626. {
  627. .name = "PLATOFRM_CONTROL",
  628. .stream_name = MT_SOC_ROUTING_STREAM_NAME,
  629. .cpu_dai_name = MT_SOC_ROUTING_DAI_NAME,
  630. .platform_name = MT_SOC_ROUTING_PCM,
  631. .codec_dai_name = MT_SOC_CODEC_DUMMY_DAI_NAME,
  632. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  633. .init = mt_soc_audio_init2,
  634. .ops = &mtmachine_audio_ops2,
  635. },
  636. {
  637. .name = "Voice_MD2_BT",
  638. .stream_name = MT_SOC_VOICE_MD2_BT_STREAM_NAME,
  639. .cpu_dai_name = MT_SOC_VOICE_MD2_BT_NAME,
  640. .platform_name = MT_SOC_VOICE_MD2_BT,
  641. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2_BTDAI_NAME,
  642. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  643. .init = mt_soc_audio_init,
  644. .ops = &mt_machine_audio_ops,
  645. },
  646. {
  647. .name = "HP_IMPEDANCE",
  648. .stream_name = MT_SOC_HP_IMPEDANCE_STREAM_NAME,
  649. .cpu_dai_name = MT_SOC_HP_IMPEDANCE_NAME,
  650. .platform_name = MT_SOC_HP_IMPEDANCE_PCM,
  651. .codec_dai_name = MT_SOC_CODEC_HP_IMPEDANCE_NAME,
  652. .codec_name = MT_SOC_CODEC_NAME,
  653. .init = mt_soc_audio_init,
  654. .ops = &mt_machine_audio_ops,
  655. },
  656. {
  657. .name = "FM_I2S_RX_Playback",
  658. .stream_name = MT_SOC_FM_I2S_PLAYBACK_STREAM_NAME,
  659. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  660. .platform_name = MT_SOC_FM_I2S_PCM,
  661. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DAI_NAME,
  662. .codec_name = MT_SOC_CODEC_NAME,
  663. .init = mt_soc_audio_init,
  664. .ops = &mt_machine_audio_ops,
  665. },
  666. {
  667. .name = "FM_I2S_RX_Capture",
  668. .stream_name = MT_SOC_FM_I2S_CAPTURE_STREAM_NAME,
  669. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  670. .platform_name = MT_SOC_FM_I2S_AWB_PCM,
  671. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DUMMY_DAI_NAME,
  672. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  673. .init = mt_soc_audio_init,
  674. .ops = &mt_machine_audio_ops,
  675. },
  676. {
  677. .name = "MultiMedia_DL2",
  678. .stream_name = MT_SOC_DL2_STREAM_NAME,
  679. .cpu_dai_name = MT_SOC_DL2DAI_NAME,
  680. .platform_name = MT_SOC_DL2_PCM,
  681. .codec_dai_name = MT_SOC_CODEC_TXDAI2_NAME,
  682. .codec_name = MT_SOC_CODEC_NAME,
  683. .init = mt_soc_audio_init,
  684. .ops = &mt_machine_audio_ops,
  685. },
  686. };
  687. static const char const *I2S_low_jittermode[] = {"Off", "On"};
  688. static const struct soc_enum mt_soc_machine_enum[] = {
  689. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(I2S_low_jittermode), I2S_low_jittermode),
  690. };
  691. static int mt6595_get_lowjitter(struct snd_kcontrol *kcontrol,
  692. struct snd_ctl_elem_value *ucontrol)
  693. {
  694. pr_warn("%s: mt_soc_lowjitter_control = %d\n", __func__, mt_soc_lowjitter_control);
  695. ucontrol->value.integer.value[0] = mt_soc_lowjitter_control;
  696. return 0;
  697. }
  698. static int mt6595_set_lowjitter(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  699. {
  700. pr_warn("%s()\n", __func__);
  701. mt_soc_lowjitter_control = ucontrol->value.integer.value[0];
  702. return 0;
  703. }
  704. static const struct snd_kcontrol_new mt_soc_controls[] = {
  705. SOC_ENUM_EXT("I2S low Jitter function", mt_soc_machine_enum[0], mt6595_get_lowjitter, mt6595_set_lowjitter),
  706. };
  707. static struct snd_soc_card snd_soc_card_mt = {
  708. .name = "mt-snd-card",
  709. .dai_link = mt_soc_dai_common,
  710. .num_links = ARRAY_SIZE(mt_soc_dai_common),
  711. .controls = mt_soc_controls,
  712. .num_controls = ARRAY_SIZE(mt_soc_controls),
  713. };
  714. static struct platform_device *mt_snd_device;
  715. static int __init mt_soc_snd_init(void)
  716. {
  717. int ret;
  718. struct snd_soc_card *card = &snd_soc_card_mt;
  719. pr_warn("mt_soc_snd_init card addr = %p\n", card);
  720. mt_snd_device = platform_device_alloc("soc-audio", -1);
  721. if (!mt_snd_device) {
  722. pr_err("mt6589_probe platform_device_alloc fail\n");
  723. return -ENOMEM;
  724. }
  725. platform_set_drvdata(mt_snd_device, &snd_soc_card_mt);
  726. ret = platform_device_add(mt_snd_device);
  727. if (ret != 0) {
  728. pr_err("mt_soc_snd_init goto put_device fail\n");
  729. goto put_device;
  730. }
  731. pr_warn("mt_soc_snd_init dai_link = %p\n", snd_soc_card_mt.dai_link);
  732. /* create debug file */
  733. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_FS_NAME,
  734. S_IFREG | S_IRUGO, NULL, (void *) DEBUG_FS_NAME, &mtaudio_debug_ops);
  735. /* create analog debug file */
  736. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_ANA_FS_NAME,
  737. S_IFREG | S_IRUGO, NULL, (void *) DEBUG_ANA_FS_NAME, &mtaudio_ana_debug_ops);
  738. return 0;
  739. put_device:
  740. platform_device_put(mt_snd_device);
  741. return ret;
  742. }
  743. static void __exit mt_soc_snd_exit(void)
  744. {
  745. platform_device_unregister(mt_snd_device);
  746. }
  747. module_init(mt_soc_snd_init);
  748. module_exit(mt_soc_snd_exit);
  749. /* Module information */
  750. MODULE_AUTHOR("ChiPeng <chipeng.chang@mediatek.com>");
  751. MODULE_DESCRIPTION("ALSA SoC driver ");
  752. MODULE_LICENSE("GPL");
  753. MODULE_ALIAS("platform:mt-snd-card");