mt_soc_machine.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  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 (copy_from_user((InputString), buf, count))
  370. pr_warn("copy_from_user mt_soc_debug_write count = %zu temp = %s\n", count, InputString);
  371. temp = kstrdup(InputString, GFP_KERNEL);
  372. pr_warn("copy_from_user mt_soc_debug_write count = %zu temp = %s pointer = %p\n",
  373. count, InputString, InputString);
  374. token1 = strsep(&temp, delim);
  375. pr_warn("token1\n");
  376. pr_warn("token1 = %s\n", token1);
  377. token2 = strsep(&temp, delim);
  378. pr_warn("token2 = %s\n", token2);
  379. token3 = strsep(&temp, delim);
  380. pr_warn("token3 = %s\n", token3);
  381. token4 = strsep(&temp, delim);
  382. pr_warn("token4 = %s\n", token4);
  383. token5 = strsep(&temp, delim);
  384. pr_warn("token5 = %s\n", token5);
  385. AudDrv_Clk_On();
  386. audckbufEnable(true);
  387. if (strcmp(token1, ParSetkeyAfe) == 0) {
  388. pr_warn("strcmp (token1,ParSetkeyAfe)\n");
  389. ret = kstrtoul(token3, 16, &regaddr);
  390. ret = kstrtoul(token5, 16, &regvalue);
  391. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  392. Afe_Set_Reg(regaddr, regvalue, 0xffffffff);
  393. regvalue = Afe_Get_Reg(regaddr);
  394. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  395. }
  396. if (strcmp(token1, ParSetkeyAna) == 0) {
  397. pr_warn("strcmp (token1,ParSetkeyAna)\n");
  398. ret = kstrtoul(token3, 16, &regaddr);
  399. ret = kstrtoul(token5, 16, &regvalue);
  400. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  401. Ana_Set_Reg(regaddr, regvalue, 0xffffffff);
  402. regvalue = Ana_Get_Reg(regaddr);
  403. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  404. }
  405. if (strcmp(token1, ParSetkeyCfg) == 0) {
  406. pr_warn("strcmp (token1,ParSetkeyCfg)\n");
  407. ret = kstrtoul(token3, 16, &regaddr);
  408. ret = kstrtoul(token5, 16, &regvalue);
  409. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  410. #if 0
  411. SetClkCfg(regaddr, regvalue, 0xffffffff);
  412. regvalue = GetClkCfg(regaddr);
  413. #endif
  414. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  415. }
  416. if (strcmp(token1, PareGetkeyAfe) == 0) {
  417. pr_warn("strcmp (token1,PareGetkeyAfe)\n");
  418. ret = kstrtoul(token3, 16, &regaddr);
  419. regvalue = Afe_Get_Reg(regaddr);
  420. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAfe, regaddr, regvalue);
  421. }
  422. if (strcmp(token1, PareGetkeyAna) == 0) {
  423. pr_warn("strcmp (token1,PareGetkeyAna)\n");
  424. ret = kstrtoul(token3, 16, &regaddr);
  425. regvalue = Ana_Get_Reg(regaddr);
  426. pr_warn("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAna, regaddr, regvalue);
  427. }
  428. audckbufEnable(false);
  429. AudDrv_Clk_Off();
  430. return count;
  431. }
  432. static const struct file_operations mtaudio_debug_ops = {
  433. .open = mt_soc_debug_open,
  434. .read = mt_soc_debug_read,
  435. .write = mt_soc_debug_write,
  436. };
  437. static const struct file_operations mtaudio_ana_debug_ops = {
  438. .open = mt_soc_ana_debug_open,
  439. .read = mt_soc_ana_debug_read,
  440. };
  441. /* Digital audio interface glue - connects codec <---> CPU */
  442. static struct snd_soc_dai_link mt_soc_dai_common[] = {
  443. /* FrontEnd DAI Links */
  444. {
  445. .name = "MultiMedia1",
  446. .stream_name = MT_SOC_DL1_STREAM_NAME,
  447. .cpu_dai_name = MT_SOC_DL1DAI_NAME,
  448. .platform_name = MT_SOC_DL1_PCM,
  449. .codec_dai_name = MT_SOC_CODEC_TXDAI_NAME,
  450. .codec_name = MT_SOC_CODEC_NAME,
  451. .init = mt_soc_audio_init,
  452. .ops = &mt_machine_audio_ops,
  453. },
  454. {
  455. .name = "MultiMedia2",
  456. .stream_name = MT_SOC_UL1_STREAM_NAME,
  457. .cpu_dai_name = MT_SOC_UL1DAI_NAME,
  458. .platform_name = MT_SOC_UL1_PCM,
  459. .codec_dai_name = MT_SOC_CODEC_RXDAI_NAME,
  460. .codec_name = MT_SOC_CODEC_NAME,
  461. .init = mt_soc_audio_init,
  462. .ops = &mt_machine_audio_ops,
  463. },
  464. {
  465. .name = "Voice_MD1",
  466. .stream_name = MT_SOC_VOICE_MD1_STREAM_NAME,
  467. .cpu_dai_name = MT_SOC_VOICE_MD1_NAME,
  468. .platform_name = MT_SOC_VOICE_MD1,
  469. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1DAI_NAME,
  470. .codec_name = MT_SOC_CODEC_NAME,
  471. .init = mt_soc_audio_init,
  472. .ops = &mt_machine_audio_ops,
  473. },
  474. {
  475. .name = "HDMI_OUT",
  476. .stream_name = MT_SOC_HDMI_STREAM_NAME,
  477. .cpu_dai_name = MT_SOC_HDMI_NAME,
  478. .platform_name = MT_SOC_HDMI_PCM,
  479. .codec_dai_name = MT_SOC_CODEC_HDMI_DUMMY_DAI_NAME,
  480. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  481. .init = mt_soc_audio_init,
  482. .ops = &mt_machine_audio_ops,
  483. },
  484. {
  485. .name = "ULDLOOPBACK",
  486. .stream_name = MT_SOC_ULDLLOOPBACK_STREAM_NAME,
  487. .cpu_dai_name = MT_SOC_ULDLLOOPBACK_NAME,
  488. .platform_name = MT_SOC_ULDLLOOPBACK_PCM,
  489. .codec_dai_name = MT_SOC_CODEC_ULDLLOOPBACK_NAME,
  490. .codec_name = MT_SOC_CODEC_NAME,
  491. .init = mt_soc_audio_init,
  492. .ops = &mt_machine_audio_ops,
  493. },
  494. {
  495. .name = "I2S0OUTPUT",
  496. .stream_name = MT_SOC_I2S0_STREAM_NAME,
  497. .cpu_dai_name = MT_SOC_I2S0_NAME,
  498. .platform_name = MT_SOC_I2S0_PCM,
  499. .codec_dai_name = MT_SOC_CODEC_I2S0_DUMMY_DAI_NAME,
  500. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  501. .init = mt_soc_audio_init,
  502. .ops = &mt_machine_audio_ops,
  503. },
  504. {
  505. .name = "MRGRX",
  506. .stream_name = MT_SOC_MRGRX_STREAM_NAME,
  507. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  508. .platform_name = MT_SOC_MRGRX_PCM,
  509. .codec_dai_name = MT_SOC_CODEC_MRGRX_DAI_NAME,
  510. .codec_name = MT_SOC_CODEC_NAME,
  511. .init = mt_soc_audio_init,
  512. .ops = &mt_machine_audio_ops,
  513. },
  514. {
  515. .name = "MRGRXCAPTURE",
  516. .stream_name = MT_SOC_MRGRX_CAPTURE_STREAM_NAME,
  517. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  518. .platform_name = MT_SOC_MRGRX_AWB_PCM,
  519. .codec_dai_name = MT_SOC_CODEC_MRGRX_DUMMY_DAI_NAME,
  520. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  521. .init = mt_soc_audio_init,
  522. .ops = &mt_machine_audio_ops,
  523. },
  524. {
  525. .name = "I2S0DL1OUTPUT",
  526. .stream_name = MT_SOC_I2SDL1_STREAM_NAME,
  527. .cpu_dai_name = MT_SOC_I2S0DL1_NAME,
  528. .platform_name = MT_SOC_I2S0DL1_PCM,
  529. .codec_dai_name = MT_SOC_CODEC_I2S0TXDAI_NAME,
  530. .codec_name = MT_SOC_CODEC_NAME,
  531. .init = mt_soc_audio_init,
  532. .ops = &mt_machine_audio_ops,
  533. },
  534. {
  535. .name = "DL1AWBCAPTURE",
  536. .stream_name = MT_SOC_DL1_AWB_RECORD_STREAM_NAME,
  537. .cpu_dai_name = MT_SOC_DL1AWB_NAME,
  538. .platform_name = MT_SOC_DL1_AWB_PCM,
  539. .codec_dai_name = MT_SOC_CODEC_DL1AWBDAI_NAME,
  540. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  541. .init = mt_soc_audio_init,
  542. .ops = &mt_machine_audio_ops,
  543. },
  544. {
  545. .name = "Voice_MD1_BT",
  546. .stream_name = MT_SOC_VOICE_MD1_BT_STREAM_NAME,
  547. .cpu_dai_name = MT_SOC_VOICE_MD1_BT_NAME,
  548. .platform_name = MT_SOC_VOICE_MD1_BT,
  549. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1_BTDAI_NAME,
  550. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  551. .init = mt_soc_audio_init,
  552. .ops = &mt_machine_audio_ops,
  553. },
  554. {
  555. .name = "VOIP_CALL_BT_PLAYBACK",
  556. .stream_name = MT_SOC_VOIP_BT_OUT_STREAM_NAME,
  557. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_OUT_NAME,
  558. .platform_name = MT_SOC_VOIP_BT_OUT,
  559. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTOUTDAI_NAME,
  560. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  561. .init = mt_soc_audio_init,
  562. .ops = &mt_machine_audio_ops,
  563. },
  564. {
  565. .name = "VOIP_CALL_BT_CAPTURE",
  566. .stream_name = MT_SOC_VOIP_BT_IN_STREAM_NAME,
  567. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_IN_NAME,
  568. .platform_name = MT_SOC_VOIP_BT_IN,
  569. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTINDAI_NAME,
  570. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  571. .init = mt_soc_audio_init,
  572. .ops = &mt_machine_audio_ops,
  573. },
  574. {
  575. .name = "TDM_Debug_CAPTURE",
  576. .stream_name = MT_SOC_TDM_CAPTURE_STREAM_NAME,
  577. .cpu_dai_name = MT_SOC_TDMRX_NAME,
  578. .platform_name = MT_SOC_TDMRX_PCM,
  579. .codec_dai_name = MT_SOC_CODEC_TDMRX_DAI_NAME,
  580. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  581. .init = mt_soc_audio_init,
  582. .ops = &mt_machine_audio_ops,
  583. },
  584. {
  585. .name = "FM_MRG_TX",
  586. .stream_name = MT_SOC_FM_MRGTX_STREAM_NAME,
  587. .cpu_dai_name = MT_SOC_FM_MRGTX_NAME,
  588. .platform_name = MT_SOC_FM_MRGTX_PCM,
  589. .codec_dai_name = MT_SOC_CODEC_FMMRGTXDAI_DUMMY_DAI_NAME,
  590. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  591. .init = mt_soc_audio_init,
  592. .ops = &mt_machine_audio_ops,
  593. },
  594. {
  595. .name = "MultiMedia3",
  596. .stream_name = MT_SOC_UL1DATA2_STREAM_NAME,
  597. .cpu_dai_name = MT_SOC_UL2DAI_NAME,
  598. .platform_name = MT_SOC_UL2_PCM,
  599. .codec_dai_name = MT_SOC_CODEC_RXDAI2_NAME,
  600. .codec_name = MT_SOC_CODEC_NAME,
  601. .init = mt_soc_audio_init,
  602. .ops = &mt_machine_audio_ops,
  603. },
  604. {
  605. .name = "I2S0_AWB_CAPTURE",
  606. .stream_name = MT_SOC_I2S0AWB_STREAM_NAME,
  607. .cpu_dai_name = MT_SOC_I2S0AWBDAI_NAME,
  608. .platform_name = MT_SOC_I2S0_AWB_PCM,
  609. .codec_dai_name = MT_SOC_CODEC_I2S0AWB_NAME,
  610. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  611. .init = mt_soc_audio_init,
  612. .ops = &mt_machine_audio_ops,
  613. },
  614. {
  615. .name = "Voice_MD2",
  616. .stream_name = MT_SOC_VOICE_MD2_STREAM_NAME,
  617. .cpu_dai_name = MT_SOC_VOICE_MD2_NAME,
  618. .platform_name = MT_SOC_VOICE_MD2,
  619. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2DAI_NAME,
  620. .codec_name = MT_SOC_CODEC_NAME,
  621. .init = mt_soc_audio_init,
  622. .ops = &mt_machine_audio_ops,
  623. },
  624. {
  625. .name = "PLATOFRM_CONTROL",
  626. .stream_name = MT_SOC_ROUTING_STREAM_NAME,
  627. .cpu_dai_name = MT_SOC_ROUTING_DAI_NAME,
  628. .platform_name = MT_SOC_ROUTING_PCM,
  629. .codec_dai_name = MT_SOC_CODEC_DUMMY_DAI_NAME,
  630. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  631. .init = mt_soc_audio_init2,
  632. .ops = &mtmachine_audio_ops2,
  633. },
  634. {
  635. .name = "Voice_MD2_BT",
  636. .stream_name = MT_SOC_VOICE_MD2_BT_STREAM_NAME,
  637. .cpu_dai_name = MT_SOC_VOICE_MD2_BT_NAME,
  638. .platform_name = MT_SOC_VOICE_MD2_BT,
  639. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2_BTDAI_NAME,
  640. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  641. .init = mt_soc_audio_init,
  642. .ops = &mt_machine_audio_ops,
  643. },
  644. {
  645. .name = "HP_IMPEDANCE",
  646. .stream_name = MT_SOC_HP_IMPEDANCE_STREAM_NAME,
  647. .cpu_dai_name = MT_SOC_HP_IMPEDANCE_NAME,
  648. .platform_name = MT_SOC_HP_IMPEDANCE_PCM,
  649. .codec_dai_name = MT_SOC_CODEC_HP_IMPEDANCE_NAME,
  650. .codec_name = MT_SOC_CODEC_NAME,
  651. .init = mt_soc_audio_init,
  652. .ops = &mt_machine_audio_ops,
  653. },
  654. {
  655. .name = "FM_I2S_RX_Playback",
  656. .stream_name = MT_SOC_FM_I2S_PLAYBACK_STREAM_NAME,
  657. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  658. .platform_name = MT_SOC_FM_I2S_PCM,
  659. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DAI_NAME,
  660. .codec_name = MT_SOC_CODEC_NAME,
  661. .init = mt_soc_audio_init,
  662. .ops = &mt_machine_audio_ops,
  663. },
  664. {
  665. .name = "FM_I2S_RX_Capture",
  666. .stream_name = MT_SOC_FM_I2S_CAPTURE_STREAM_NAME,
  667. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  668. .platform_name = MT_SOC_FM_I2S_AWB_PCM,
  669. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DUMMY_DAI_NAME,
  670. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  671. .init = mt_soc_audio_init,
  672. .ops = &mt_machine_audio_ops,
  673. },
  674. {
  675. .name = "MultiMedia_DL2",
  676. .stream_name = MT_SOC_DL2_STREAM_NAME,
  677. .cpu_dai_name = MT_SOC_DL2DAI_NAME,
  678. .platform_name = MT_SOC_DL2_PCM,
  679. .codec_dai_name = MT_SOC_CODEC_TXDAI2_NAME,
  680. .codec_name = MT_SOC_CODEC_NAME,
  681. .init = mt_soc_audio_init,
  682. .ops = &mt_machine_audio_ops,
  683. },
  684. };
  685. static const char const *I2S_low_jittermode[] = {"Off", "On"};
  686. static const struct soc_enum mt_soc_machine_enum[] = {
  687. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(I2S_low_jittermode), I2S_low_jittermode),
  688. };
  689. static int mt6595_get_lowjitter(struct snd_kcontrol *kcontrol,
  690. struct snd_ctl_elem_value *ucontrol)
  691. {
  692. pr_warn("%s: mt_soc_lowjitter_control = %d\n", __func__, mt_soc_lowjitter_control);
  693. ucontrol->value.integer.value[0] = mt_soc_lowjitter_control;
  694. return 0;
  695. }
  696. static int mt6595_set_lowjitter(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  697. {
  698. pr_warn("%s()\n", __func__);
  699. mt_soc_lowjitter_control = ucontrol->value.integer.value[0];
  700. return 0;
  701. }
  702. static const struct snd_kcontrol_new mt_soc_controls[] = {
  703. SOC_ENUM_EXT("I2S low Jitter function", mt_soc_machine_enum[0], mt6595_get_lowjitter, mt6595_set_lowjitter),
  704. };
  705. static struct snd_soc_card snd_soc_card_mt = {
  706. .name = "mt-snd-card",
  707. .dai_link = mt_soc_dai_common,
  708. .num_links = ARRAY_SIZE(mt_soc_dai_common),
  709. .controls = mt_soc_controls,
  710. .num_controls = ARRAY_SIZE(mt_soc_controls),
  711. };
  712. static struct platform_device *mt_snd_device;
  713. static int __init mt_soc_snd_init(void)
  714. {
  715. int ret;
  716. struct snd_soc_card *card = &snd_soc_card_mt;
  717. pr_warn("mt_soc_snd_init card addr = %p\n", card);
  718. mt_snd_device = platform_device_alloc("soc-audio", -1);
  719. if (!mt_snd_device) {
  720. pr_err("mt6589_probe platform_device_alloc fail\n");
  721. return -ENOMEM;
  722. }
  723. platform_set_drvdata(mt_snd_device, &snd_soc_card_mt);
  724. ret = platform_device_add(mt_snd_device);
  725. if (ret != 0) {
  726. pr_err("mt_soc_snd_init goto put_device fail\n");
  727. goto put_device;
  728. }
  729. pr_warn("mt_soc_snd_init dai_link = %p\n", snd_soc_card_mt.dai_link);
  730. /* create debug file */
  731. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_FS_NAME,
  732. S_IFREG | S_IRUGO, NULL, (void *) DEBUG_FS_NAME, &mtaudio_debug_ops);
  733. /* create analog debug file */
  734. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_ANA_FS_NAME,
  735. S_IFREG | S_IRUGO, NULL, (void *) DEBUG_ANA_FS_NAME, &mtaudio_ana_debug_ops);
  736. return 0;
  737. put_device:
  738. platform_device_put(mt_snd_device);
  739. return ret;
  740. }
  741. static void __exit mt_soc_snd_exit(void)
  742. {
  743. platform_device_unregister(mt_snd_device);
  744. }
  745. module_init(mt_soc_snd_init);
  746. module_exit(mt_soc_snd_exit);
  747. /* Module information */
  748. MODULE_AUTHOR("ChiPeng <chipeng.chang@mediatek.com>");
  749. MODULE_DESCRIPTION("ALSA SoC driver ");
  750. MODULE_LICENSE("GPL");
  751. MODULE_ALIAS("platform:mt-snd-card");