mt_soc_machine.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  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. /*****************************************************************************
  39. * C O M P I L E R F L A G S
  40. *****************************************************************************/
  41. /*****************************************************************************
  42. * E X T E R N A L R E F E R E N C E S
  43. *****************************************************************************/
  44. #define CONFIG_MTK_DEEP_IDLE
  45. #ifdef CONFIG_MTK_DEEP_IDLE
  46. #ifdef _MT_IDLE_HEADER
  47. #include "mt_idle.h"
  48. #endif
  49. #endif
  50. #include "AudDrv_Common.h"
  51. #include "AudDrv_Def.h"
  52. #include "AudDrv_Afe.h"
  53. #include "AudDrv_Ana.h"
  54. #include "AudDrv_Clk.h"
  55. #include "AudDrv_Kernel.h"
  56. #include "mt_soc_afe_control.h"
  57. /* #include <mach/mt_clkbuf_ctl.h> */
  58. #include <sound/mt_soc_audio.h>
  59. #include <linux/kernel.h>
  60. #include <linux/module.h>
  61. #include <linux/init.h>
  62. #include <linux/device.h>
  63. #include <linux/slab.h>
  64. #include <linux/fs.h>
  65. #include <linux/completion.h>
  66. #include <linux/mm.h>
  67. #include <linux/delay.h>
  68. #include <linux/interrupt.h>
  69. #include <linux/dma-mapping.h>
  70. #include <linux/vmalloc.h>
  71. #include <linux/platform_device.h>
  72. #include <linux/miscdevice.h>
  73. #include <linux/wait.h>
  74. #include <linux/spinlock.h>
  75. #include <linux/sched.h>
  76. #include <linux/wakelock.h>
  77. #include <linux/semaphore.h>
  78. #include <linux/jiffies.h>
  79. #include <linux/proc_fs.h>
  80. #include <linux/string.h>
  81. #include <linux/mutex.h>
  82. /* #include <linux/xlog.h> */
  83. /* #include <mach/irqs.h> */
  84. #include <asm/uaccess.h>
  85. #include <asm/irq.h>
  86. #include <asm/io.h>
  87. /* #include <mach/mt_reg_base.h> */
  88. #include <asm/div64.h>
  89. /* #include <linux/aee.h> */
  90. /* #include <mach/pmic_mt6325_sw.h> */
  91. /* #include <mach/upmu_common.h> */
  92. #include <mach/upmu_hw.h>
  93. /* #include <mach/mt_gpio.h> */
  94. /* #include <mach/mt_typedefs.h> */
  95. /* #include <mt-plat/upmu_common.h> */
  96. #include <mt-plat/mt_gpio.h>
  97. #include <stdarg.h>
  98. #include <linux/module.h>
  99. #include <linux/clk.h>
  100. #include <linux/delay.h>
  101. #include <linux/gpio.h>
  102. #if 0
  103. #include <linux/mfd/pm8xxx/pm8921.h>
  104. #endif
  105. #include <linux/platform_device.h>
  106. #include <linux/slab.h>
  107. #include <sound/core.h>
  108. #include <sound/soc.h>
  109. #include <sound/soc-dapm.h>
  110. #include <sound/pcm.h>
  111. #include <sound/jack.h>
  112. /* #include <asm/mach-types.h> */
  113. #include <linux/debugfs.h>
  114. #include "mt_soc_codec_63xx.h"
  115. static int mt_soc_lowjitter_control;
  116. static struct dentry *mt_sco_audio_debugfs;
  117. #define DEBUG_FS_NAME "mtksocaudio"
  118. #define DEBUG_ANA_FS_NAME "mtksocanaaudio"
  119. static int mtmachine_startup(struct snd_pcm_substream *substream)
  120. {
  121. return 0;
  122. }
  123. static int mtmachine_prepare(struct snd_pcm_substream *substream)
  124. {
  125. return 0;
  126. }
  127. static struct snd_soc_ops mt_machine_audio_ops = {
  128. .startup = mtmachine_startup,
  129. .prepare = mtmachine_prepare,
  130. };
  131. #if 0 /* not used */
  132. static int mtmachine_compr_startup(struct snd_compr_stream *stream)
  133. {
  134. return 0;
  135. }
  136. static struct snd_soc_compr_ops mt_machine_audio_compr_ops = {
  137. .startup = mtmachine_compr_startup,
  138. };
  139. #endif
  140. static int mtmachine_startupmedia2(struct snd_pcm_substream *substream)
  141. {
  142. return 0;
  143. }
  144. static int mtmachine_preparemedia2(struct snd_pcm_substream *substream)
  145. {
  146. return 0;
  147. }
  148. static struct snd_soc_ops mtmachine_audio_ops2 = {
  149. .startup = mtmachine_startupmedia2,
  150. .prepare = mtmachine_preparemedia2,
  151. };
  152. static int mt_soc_audio_init(struct snd_soc_pcm_runtime *rtd)
  153. {
  154. pr_debug("mt_soc_audio_init\n");
  155. return 0;
  156. }
  157. static int mt_soc_audio_init2(struct snd_soc_pcm_runtime *rtd)
  158. {
  159. pr_debug("mt_soc_audio_init2\n");
  160. return 0;
  161. }
  162. static int mt_soc_ana_debug_open(struct inode *inode, struct file *file)
  163. {
  164. pr_debug("mt_soc_ana_debug_open\n");
  165. return 0;
  166. }
  167. static ssize_t mt_soc_ana_debug_read(struct file *file, char __user *buf,
  168. size_t count, loff_t *pos)
  169. {
  170. const int size = 4096;
  171. char buffer[size];
  172. int n = 0;
  173. pr_debug("mt_soc_ana_debug_read count = %zu\n", count);
  174. AudDrv_ANA_Clk_On();
  175. AudDrv_Clk_On();
  176. audckbufEnable(true);
  177. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON0));
  178. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON1 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON1));
  179. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON2 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON2));
  180. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON3 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON3));
  181. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON4 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON4));
  182. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON5 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON5));
  183. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON6 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON6));
  184. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON7 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON7));
  185. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON8 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON8));
  186. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON9 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON9));
  187. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON10 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON10));
  188. n += scnprintf(buffer + n, size - n, "ABB_AFE_CON11 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON11));
  189. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA0));
  190. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA1 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA1));
  191. n += scnprintf(buffer + n, size - n, "ABB_AFE_STA2 = 0x%x\n", Ana_Get_Reg(ABB_AFE_STA2));
  192. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_CFG0 = 0x%x\n",
  193. Ana_Get_Reg(AFE_UP8X_FIFO_CFG0));
  194. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_LOG_MON0 = 0x%x\n",
  195. Ana_Get_Reg(AFE_UP8X_FIFO_LOG_MON0));
  196. n += scnprintf(buffer + n, size - n, "AFE_UP8X_FIFO_LOG_MON1 = 0x%x\n",
  197. Ana_Get_Reg(AFE_UP8X_FIFO_LOG_MON1));
  198. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG0 = 0x%x\n",
  199. Ana_Get_Reg(AFE_PMIC_NEWIF_CFG0));
  200. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG1 = 0x%x\n",
  201. Ana_Get_Reg(AFE_PMIC_NEWIF_CFG1));
  202. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG2 = 0x%x\n",
  203. Ana_Get_Reg(AFE_PMIC_NEWIF_CFG2));
  204. n += scnprintf(buffer + n, size - n, "AFE_PMIC_NEWIF_CFG3 = 0x%x\n",
  205. Ana_Get_Reg(AFE_PMIC_NEWIF_CFG3));
  206. n += scnprintf(buffer + n, size - n, "ABB_AFE_TOP_CON0 = 0x%x\n",
  207. Ana_Get_Reg(ABB_AFE_TOP_CON0));
  208. n += scnprintf(buffer + n, size - n, "ABB_MON_DEBUG0 = 0x%x\n",
  209. Ana_Get_Reg(ABB_MON_DEBUG0));
  210. n += scnprintf(buffer + n, size - n, "TOP_CKPDN0 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0));
  211. n += scnprintf(buffer + n, size - n, "TOP_CKPDN1 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1));
  212. n += scnprintf(buffer + n, size - n, "TOP_CKPDN2 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN2));
  213. n += scnprintf(buffer + n, size - n, "TOP_CKCON1 = 0x%x\n", Ana_Get_Reg(TOP_CKCON1));
  214. n += scnprintf(buffer + n, size - n, "SPK_CON0 = 0x%x\n", Ana_Get_Reg(SPK_CON0));
  215. n += scnprintf(buffer + n, size - n, "SPK_CON1 = 0x%x\n", Ana_Get_Reg(SPK_CON1));
  216. n += scnprintf(buffer + n, size - n, "SPK_CON2 = 0x%x\n", Ana_Get_Reg(SPK_CON2));
  217. n += scnprintf(buffer + n, size - n, "SPK_CON6 = 0x%x\n", Ana_Get_Reg(SPK_CON6));
  218. n += scnprintf(buffer + n, size - n, "SPK_CON7 = 0x%x\n", Ana_Get_Reg(SPK_CON7));
  219. n += scnprintf(buffer + n, size - n, "SPK_CON8 = 0x%x\n", Ana_Get_Reg(SPK_CON8));
  220. n += scnprintf(buffer + n, size - n, "SPK_CON9 = 0x%x\n", Ana_Get_Reg(SPK_CON9));
  221. n += scnprintf(buffer + n, size - n, "SPK_CON10 = 0x%x\n", Ana_Get_Reg(SPK_CON10));
  222. n += scnprintf(buffer + n, size - n, "SPK_CON11 = 0x%x\n", Ana_Get_Reg(SPK_CON11));
  223. n += scnprintf(buffer + n, size - n, "SPK_CON12 = 0x%x\n", Ana_Get_Reg(SPK_CON12));
  224. n += scnprintf(buffer + n, size - n, "AUDTOP_CON0 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON0));
  225. n += scnprintf(buffer + n, size - n, "AUDTOP_CON1 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON1));
  226. n += scnprintf(buffer + n, size - n, "AUDTOP_CON2 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON2));
  227. n += scnprintf(buffer + n, size - n, "AUDTOP_CON3 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON3));
  228. n += scnprintf(buffer + n, size - n, "AUDTOP_CON4 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON4));
  229. n += scnprintf(buffer + n, size - n, "AUDTOP_CON5 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON5));
  230. n += scnprintf(buffer + n, size - n, "AUDTOP_CON6 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON6));
  231. n += scnprintf(buffer + n, size - n, "AUDTOP_CON7 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON7));
  232. n += scnprintf(buffer + n, size - n, "AUDTOP_CON8 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON8));
  233. n += scnprintf(buffer + n, size - n, "AUDTOP_CON9 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON9));
  234. pr_debug("mt_soc_ana_debug_read len = %d\n", n);
  235. audckbufEnable(false);
  236. AudDrv_Clk_Off();
  237. AudDrv_ANA_Clk_Off();
  238. return simple_read_from_buffer(buf, count, pos, buffer, n);
  239. }
  240. static int mt_soc_debug_open(struct inode *inode, struct file *file)
  241. {
  242. pr_debug("mt_soc_debug_open\n");
  243. return 0;
  244. }
  245. static ssize_t mt_soc_debug_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
  246. {
  247. const int size = 4096;
  248. char buffer[size];
  249. int n = 0;
  250. AudDrv_ANA_Clk_On();
  251. AudDrv_Clk_On();
  252. pr_debug("mt_soc_debug_read\n");
  253. n = scnprintf(buffer + n, size - n, "AUDIO_TOP_CON0 = 0x%x\n",
  254. Afe_Get_Reg(AUDIO_TOP_CON0));
  255. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON1 = 0x%x\n",
  256. Afe_Get_Reg(AUDIO_TOP_CON1));
  257. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON2 = 0x%x\n",
  258. Afe_Get_Reg(AUDIO_TOP_CON2));
  259. n += scnprintf(buffer + n, size - n, "AUDIO_TOP_CON3 = 0x%x\n",
  260. Afe_Get_Reg(AUDIO_TOP_CON3));
  261. n += scnprintf(buffer + n, size - n, "AFE_DAC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON0));
  262. n += scnprintf(buffer + n, size - n, "AFE_DAC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON1));
  263. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON));
  264. n += scnprintf(buffer + n, size - n, "AFE_DAIBT_CON0 = 0x%x\n",
  265. Afe_Get_Reg(AFE_DAIBT_CON0));
  266. n += scnprintf(buffer + n, size - n, "AFE_CONN0 = 0x%x\n", Afe_Get_Reg(AFE_CONN0));
  267. n += scnprintf(buffer + n, size - n, "AFE_CONN1 = 0x%x\n", Afe_Get_Reg(AFE_CONN1));
  268. n += scnprintf(buffer + n, size - n, "AFE_CONN2 = 0x%x\n", Afe_Get_Reg(AFE_CONN2));
  269. n += scnprintf(buffer + n, size - n, "AFE_CONN3 = 0x%x\n", Afe_Get_Reg(AFE_CONN3));
  270. n += scnprintf(buffer + n, size - n, "AFE_CONN4 = 0x%x\n", Afe_Get_Reg(AFE_CONN4));
  271. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON1 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON1));
  272. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON2 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON2));
  273. n += scnprintf(buffer + n, size - n, "AFE_MRGIF_CON = 0x%x\n", Afe_Get_Reg(AFE_MRGIF_CON));
  274. n += scnprintf(buffer + n, size - n, "AFE_DL1_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL1_BASE));
  275. n += scnprintf(buffer + n, size - n, "AFE_DL1_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL1_CUR));
  276. n += scnprintf(buffer + n, size - n, "AFE_DL1_END = 0x%x\n", Afe_Get_Reg(AFE_DL1_END));
  277. n += scnprintf(buffer + n, size - n, "AFE_I2S_CON3 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON3));
  278. n += scnprintf(buffer + n, size - n, "AFE_DL2_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL2_BASE));
  279. n += scnprintf(buffer + n, size - n, "AFE_DL2_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL2_CUR));
  280. n += scnprintf(buffer + n, size - n, "AFE_DL2_END = 0x%x\n", Afe_Get_Reg(AFE_DL2_END));
  281. n += scnprintf(buffer + n, size - n, "AFE_CONN5 = 0x%x\n", Afe_Get_Reg(AFE_CONN5));
  282. n += scnprintf(buffer + n, size - n, "AFE_CONN_24BIT = 0x%x\n",
  283. Afe_Get_Reg(AFE_CONN_24BIT));
  284. n += scnprintf(buffer + n, size - n, "AFE_AWB_BASE = 0x%x\n", Afe_Get_Reg(AFE_AWB_BASE));
  285. n += scnprintf(buffer + n, size - n, "AFE_AWB_END = 0x%x\n", Afe_Get_Reg(AFE_AWB_END));
  286. n += scnprintf(buffer + n, size - n, "AFE_AWB_CUR = 0x%x\n", Afe_Get_Reg(AFE_AWB_CUR));
  287. n += scnprintf(buffer + n, size - n, "AFE_VUL_BASE = 0x%x\n", Afe_Get_Reg(AFE_VUL_BASE));
  288. n += scnprintf(buffer + n, size - n, "AFE_VUL_END = 0x%x\n", Afe_Get_Reg(AFE_VUL_END));
  289. n += scnprintf(buffer + n, size - n, "AFE_VUL_CUR = 0x%x\n", Afe_Get_Reg(AFE_VUL_CUR));
  290. n += scnprintf(buffer + n, size - n, "AFE_CONN6 = 0x%x\n", Afe_Get_Reg(AFE_CONN6));
  291. n += scnprintf(buffer + n, size - n, "AFE_DAI_BASE = 0x%x\n", Afe_Get_Reg(AFE_DAI_BASE));
  292. n += scnprintf(buffer + n, size - n, "AFE_DAI_END = 0x%x\n", Afe_Get_Reg(AFE_DAI_END));
  293. n += scnprintf(buffer + n, size - n, "AFE_DAI_CUR = 0x%x\n", Afe_Get_Reg(AFE_DAI_CUR));
  294. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MSB = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MSB));
  295. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON0 = 0x%x\n",
  296. Afe_Get_Reg(AFE_MEMIF_MON0));
  297. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON1 = 0x%x\n",
  298. Afe_Get_Reg(AFE_MEMIF_MON1));
  299. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON2 = 0x%x\n",
  300. Afe_Get_Reg(AFE_MEMIF_MON2));
  301. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MON4 = 0x%x\n",
  302. Afe_Get_Reg(AFE_MEMIF_MON4));
  303. n += scnprintf(buffer + n, size - n, "AFE_ADDA_DL_SRC2_CON0 = 0x%x\n",
  304. Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON0));
  305. n += scnprintf(buffer + n, size - n, "AFE_ADDA_DL_SRC2_CON1 = 0x%x\n",
  306. Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON1));
  307. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_SRC_CON0 = 0x%x\n",
  308. Afe_Get_Reg(AFE_ADDA_UL_SRC_CON0));
  309. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_SRC_CON1 = 0x%x\n",
  310. Afe_Get_Reg(AFE_ADDA_UL_SRC_CON1));
  311. n += scnprintf(buffer + n, size - n, "AFE_ADDA_TOP_CON0 = 0x%x\n",
  312. Afe_Get_Reg(AFE_ADDA_TOP_CON0));
  313. n += scnprintf(buffer + n, size - n, "AFE_ADDA_UL_DL_CON0 = 0x%x\n",
  314. Afe_Get_Reg(AFE_ADDA_UL_DL_CON0));
  315. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG = 0x%x\n",
  316. Afe_Get_Reg(AFE_ADDA_SRC_DEBUG));
  317. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG_MON0 = 0x%x\n",
  318. Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON0));
  319. n += scnprintf(buffer + n, size - n, "AFE_ADDA_SRC_DEBUG_MON1 = 0x%x\n",
  320. Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON1));
  321. n += scnprintf(buffer + n, size - n, "AFE_ADDA_NEWIF_CFG0 = 0x%x\n",
  322. Afe_Get_Reg(AFE_ADDA_NEWIF_CFG0));
  323. n += scnprintf(buffer + n, size - n, "AFE_ADDA_NEWIF_CFG1 = 0x%x\n",
  324. Afe_Get_Reg(AFE_ADDA_NEWIF_CFG1));
  325. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_DEBUG = 0x%x\n",
  326. Afe_Get_Reg(AFE_SIDETONE_DEBUG));
  327. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_MON = 0x%x\n",
  328. Afe_Get_Reg(AFE_SIDETONE_MON));
  329. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_CON0 = 0x%x\n",
  330. Afe_Get_Reg(AFE_SIDETONE_CON0));
  331. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_COEFF = 0x%x\n",
  332. Afe_Get_Reg(AFE_SIDETONE_COEFF));
  333. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_CON1 = 0x%x\n",
  334. Afe_Get_Reg(AFE_SIDETONE_CON1));
  335. n += scnprintf(buffer + n, size - n, "AFE_SIDETONE_GAIN = 0x%x\n",
  336. Afe_Get_Reg(AFE_SIDETONE_GAIN));
  337. n += scnprintf(buffer + n, size - n, "AFE_SGEN_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SGEN_CON0));
  338. n += scnprintf(buffer + n, size - n, "AFE_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AFE_TOP_CON0));
  339. n += scnprintf(buffer + n, size - n, "AFE_ADDA_PREDIS_CON0 = 0x%x\n",
  340. Afe_Get_Reg(AFE_ADDA_PREDIS_CON0));
  341. n += scnprintf(buffer + n, size - n, "AFE_ADDA_PREDIS_CON1 = 0x%x\n",
  342. Afe_Get_Reg(AFE_ADDA_PREDIS_CON1));
  343. n += scnprintf(buffer + n, size - n, "AFE_MRG_MON0 = 0x%x\n", Afe_Get_Reg(AFE_MRGIF_MON0));
  344. n += scnprintf(buffer + n, size - n, "AFE_MRG_MON1 = 0x%x\n", Afe_Get_Reg(AFE_MRGIF_MON1));
  345. n += scnprintf(buffer + n, size - n, "AFE_MRG_MON2 = 0x%x\n", Afe_Get_Reg(AFE_MRGIF_MON2));
  346. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_BASE = 0x%x\n",
  347. Afe_Get_Reg(AFE_MOD_DAI_BASE));
  348. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_END = 0x%x\n",
  349. Afe_Get_Reg(AFE_MOD_DAI_END));
  350. n += scnprintf(buffer + n, size - n, "AFE_MOD_DAI_CUR = 0x%x\n",
  351. Afe_Get_Reg(AFE_MOD_DAI_CUR));
  352. n += scnprintf(buffer + n, size - n, "AFE_DL1_D2_BASE = 0x%x\n",
  353. Afe_Get_Reg(AFE_DL1_D2_BASE));
  354. n += scnprintf(buffer + n, size - n, "AFE_DL1_D2_END = 0x%x\n",
  355. Afe_Get_Reg(AFE_DL1_D2_END));
  356. n += scnprintf(buffer + n, size - n, "AFE_DL1_D2_CUR = 0x%x\n",
  357. Afe_Get_Reg(AFE_DL1_D2_CUR));
  358. n += scnprintf(buffer + n, size - n, "AFE_VUL_D2_BASE = 0x%x\n",
  359. Afe_Get_Reg(AFE_VUL_D2_BASE));
  360. n += scnprintf(buffer + n, size - n, "AFE_VUL_D2_END = 0x%x\n",
  361. Afe_Get_Reg(AFE_VUL_D2_END));
  362. n += scnprintf(buffer + n, size - n, "AFE_VUL_D2_CUR = 0x%x\n",
  363. Afe_Get_Reg(AFE_VUL_D2_CUR));
  364. n += scnprintf(buffer + n, size - n, "AFE_IRQ_CON = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CON));
  365. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CON = 0x%x\n",
  366. Afe_Get_Reg(AFE_IRQ_MCU_CON));
  367. n += scnprintf(buffer + n, size - n, "AFE_IRQ_STATUS = 0x%x\n",
  368. Afe_Get_Reg(AFE_IRQ_MCU_STATUS));
  369. n += scnprintf(buffer + n, size - n, "AFE_IRQ_CLR = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CLR));
  370. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CNT1 = 0x%x\n",
  371. Afe_Get_Reg(AFE_IRQ_MCU_CNT1));
  372. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CNT2 = 0x%x\n",
  373. Afe_Get_Reg(AFE_IRQ_MCU_CNT2));
  374. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_EN = 0x%x\n",
  375. Afe_Get_Reg(AFE_IRQ_MCU_EN));
  376. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MON2 = 0x%x\n",
  377. Afe_Get_Reg(AFE_IRQ_MCU_MON2));
  378. n += scnprintf(buffer + n, size - n, "AFE_IRQ1_CNT_MON = 0x%x\n",
  379. Afe_Get_Reg(AFE_IRQ1_MCU_CNT_MON));
  380. n += scnprintf(buffer + n, size - n, "AFE_IRQ2_CNT_MON = 0x%x\n",
  381. Afe_Get_Reg(AFE_IRQ2_MCU_CNT_MON));
  382. n += scnprintf(buffer + n, size - n, "AFE_IRQ1_EN_CNT_MON = 0x%x\n",
  383. Afe_Get_Reg(AFE_IRQ1_MCU_EN_CNT_MON));
  384. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_MAXLEN = 0x%x\n",
  385. Afe_Get_Reg(AFE_MEMIF_MAXLEN));
  386. n += scnprintf(buffer + n, size - n, "AFE_MEMIF_PBUF_SIZE = 0x%x\n",
  387. Afe_Get_Reg(AFE_MEMIF_PBUF_SIZE));
  388. n += scnprintf(buffer + n, size - n, "AFE_IRQ_MCU_CNT7 = 0x%x\n",
  389. Afe_Get_Reg(AFE_IRQ_MCU_CNT7));
  390. n += scnprintf(buffer + n, size - n, "AFE_APLL1_TUNER_CFG = 0x%x\n",
  391. Afe_Get_Reg(AFE_APLL1_TUNER_CFG));
  392. n += scnprintf(buffer + n, size - n, "AFE_APLL2_TUNER_CFG = 0x%x\n",
  393. Afe_Get_Reg(AFE_APLL2_TUNER_CFG));
  394. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON0 = 0x%x\n",
  395. Afe_Get_Reg(AFE_GAIN1_CON0));
  396. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON1 = 0x%x\n",
  397. Afe_Get_Reg(AFE_GAIN1_CON1));
  398. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON2 = 0x%x\n",
  399. Afe_Get_Reg(AFE_GAIN1_CON2));
  400. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CON3 = 0x%x\n",
  401. Afe_Get_Reg(AFE_GAIN1_CON3));
  402. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CONN = 0x%x\n",
  403. Afe_Get_Reg(AFE_GAIN1_CONN));
  404. n += scnprintf(buffer + n, size - n, "AFE_GAIN1_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CUR));
  405. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON0 = 0x%x\n",
  406. Afe_Get_Reg(AFE_GAIN2_CON0));
  407. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON1 = 0x%x\n",
  408. Afe_Get_Reg(AFE_GAIN2_CON1));
  409. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON2 = 0x%x\n",
  410. Afe_Get_Reg(AFE_GAIN2_CON2));
  411. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CON3 = 0x%x\n",
  412. Afe_Get_Reg(AFE_GAIN2_CON3));
  413. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CONN = 0x%x\n",
  414. Afe_Get_Reg(AFE_GAIN2_CONN));
  415. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CUR));
  416. n += scnprintf(buffer + n, size - n, "AFE_GAIN2_CONN2 = 0x%x\n",
  417. Afe_Get_Reg(AFE_GAIN2_CONN2));
  418. n += scnprintf(buffer + n, size - n, "FPGA_CFG2 = 0x%x\n", Afe_Get_Reg(FPGA_CFG2));
  419. n += scnprintf(buffer + n, size - n, "FPGA_CFG3 = 0x%x\n", Afe_Get_Reg(FPGA_CFG3));
  420. n += scnprintf(buffer + n, size - n, "FPGA_CFG0 = 0x%x\n", Afe_Get_Reg(FPGA_CFG0));
  421. n += scnprintf(buffer + n, size - n, "FPGA_CFG1 = 0x%x\n", Afe_Get_Reg(FPGA_CFG1));
  422. n += scnprintf(buffer + n, size - n, "FPGA_STC = 0x%x\n", Afe_Get_Reg(FPGA_STC));
  423. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON0));
  424. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON1));
  425. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON2 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON2));
  426. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON3 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON3));
  427. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON4 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON4));
  428. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON5 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON5));
  429. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON6 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON6));
  430. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON7 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON7));
  431. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON8 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON8));
  432. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON9 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON9));
  433. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON10 = 0x%x\n",
  434. Afe_Get_Reg(AFE_ASRC_CON10));
  435. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON11 = 0x%x\n",
  436. Afe_Get_Reg(AFE_ASRC_CON11));
  437. n += scnprintf(buffer + n, size - n, "PCM_INTF_CON1 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON));
  438. n += scnprintf(buffer + n, size - n, "PCM_INTF_CON2 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON2));
  439. n += scnprintf(buffer + n, size - n, "PCM2_INTF_CON = 0x%x\n", Afe_Get_Reg(PCM2_INTF_CON));
  440. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON13 = 0x%x\n",
  441. Afe_Get_Reg(AFE_ASRC_CON13));
  442. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON14 = 0x%x\n",
  443. Afe_Get_Reg(AFE_ASRC_CON14));
  444. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON15 = 0x%x\n",
  445. Afe_Get_Reg(AFE_ASRC_CON15));
  446. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON16 = 0x%x\n",
  447. Afe_Get_Reg(AFE_ASRC_CON16));
  448. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON17 = 0x%x\n",
  449. Afe_Get_Reg(AFE_ASRC_CON17));
  450. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON18 = 0x%x\n",
  451. Afe_Get_Reg(AFE_ASRC_CON18));
  452. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON19 = 0x%x\n",
  453. Afe_Get_Reg(AFE_ASRC_CON19));
  454. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON20 = 0x%x\n",
  455. Afe_Get_Reg(AFE_ASRC_CON20));
  456. n += scnprintf(buffer + n, size - n, "AFE_ASRC_CON21 = 0x%x\n",
  457. Afe_Get_Reg(AFE_ASRC_CON21));
  458. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON0 = 0x%x\n",
  459. Afe_Get_Reg(AFE_ASRC4_CON0));
  460. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON1 = 0x%x\n",
  461. Afe_Get_Reg(AFE_ASRC4_CON1));
  462. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON2 = 0x%x\n",
  463. Afe_Get_Reg(AFE_ASRC4_CON2));
  464. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON3 = 0x%x\n",
  465. Afe_Get_Reg(AFE_ASRC4_CON3));
  466. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON4 = 0x%x\n",
  467. Afe_Get_Reg(AFE_ASRC4_CON4));
  468. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON5 = 0x%x\n",
  469. Afe_Get_Reg(AFE_ASRC4_CON5));
  470. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON6 = 0x%x\n",
  471. Afe_Get_Reg(AFE_ASRC4_CON6));
  472. n += scnprintf(buffer + n, size - n, "AFE_ASRC4_CON7 = 0x%x\n",
  473. Afe_Get_Reg(AFE_ASRC4_CON7));
  474. n += scnprintf(buffer + n, size - n, "AFE_ASRC2_CON0 = 0x%x\n",
  475. Afe_Get_Reg(AFE_ASRC2_CON0));
  476. n += scnprintf(buffer + n, size - n, "AFE_ASRC2_CON5 = 0x%x\n",
  477. Afe_Get_Reg(AFE_ASRC2_CON5));
  478. n += scnprintf(buffer + n, size - n, "AFE_ASRC2_CON6 = 0x%x\n",
  479. Afe_Get_Reg(AFE_ASRC2_CON6));
  480. n += scnprintf(buffer + n, size - n, "AFE_ASRC3_CON0 = 0x%x\n",
  481. Afe_Get_Reg(AFE_ASRC3_CON0));
  482. n += scnprintf(buffer + n, size - n, "AFE_ASRC3_CON5 = 0x%x\n",
  483. Afe_Get_Reg(AFE_ASRC3_CON5));
  484. n += scnprintf(buffer + n, size - n, "AFE_ASRC3_CON6 = 0x%x\n",
  485. Afe_Get_Reg(AFE_ASRC3_CON6));
  486. /* add */
  487. n += scnprintf(buffer + n, size - n, "AFE_ADDA4_TOP_CON0 = 0x%x\n",
  488. Afe_Get_Reg(AFE_ADDA4_TOP_CON0));
  489. n += scnprintf(buffer + n, size - n, "AFE_ADDA4_UL_SRC_CON0 = 0x%x\n",
  490. Afe_Get_Reg(AFE_ADDA4_UL_SRC_CON0));
  491. n += scnprintf(buffer + n, size - n, "AFE_ADDA4_UL_SRC_CON1 = 0x%x\n",
  492. Afe_Get_Reg(AFE_ADDA4_UL_SRC_CON1));
  493. n += scnprintf(buffer + n, size - n, "AFE_ADDA4_NEWIF_CFG0 = 0x%x\n",
  494. Afe_Get_Reg(AFE_ADDA4_NEWIF_CFG0));
  495. n += scnprintf(buffer + n, size - n, "AFE_ADDA4_NEWIF_CFG1 = 0x%x\n",
  496. Afe_Get_Reg(AFE_ADDA4_NEWIF_CFG1));
  497. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_AUDDIV_0 = 0x%x\n",
  498. GetClkCfg(AUDIO_CLK_AUDDIV_0));
  499. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_AUDDIV_1 = 0x%x\n",
  500. GetClkCfg(AUDIO_CLK_AUDDIV_1));
  501. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_CFG_6 = 0x%x\n",
  502. GetClkCfg(AUDIO_CLK_CFG_6));
  503. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_CFG_6_SET = 0x%x\n",
  504. GetClkCfg(AUDIO_CLK_CFG_6_SET));
  505. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_CFG_6_CLR = 0x%x\n",
  506. GetClkCfg(AUDIO_CLK_CFG_6_CLR));
  507. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_AUD_DIV0 = 0x%x\n",
  508. GetClkCfg(AUDIO_CLK_AUD_DIV0));
  509. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_AUD_DIV1 = 0x%x\n",
  510. GetClkCfg(AUDIO_CLK_AUD_DIV1));
  511. n += scnprintf(buffer + n, size - n, "AUDIO_CLK_AUD_DIV2 = 0x%x\n",
  512. GetClkCfg(AUDIO_CLK_AUD_DIV2));
  513. n += scnprintf(buffer + n, size - n, "AP_PLL_CON5 = 0x%x\n", GetpllCfg(AP_PLL_CON5));
  514. n += scnprintf(buffer + n, size - n, "AFE_HDMI_BASE = 0x%x\n", Afe_Get_Reg(AFE_HDMI_BASE));
  515. n += scnprintf(buffer + n, size - n, "AFE_HDMI_CUR = 0x%x\n", Afe_Get_Reg(AFE_HDMI_CUR));
  516. n += scnprintf(buffer + n, size - n, "AFE_HDMI_END = 0x%x\n", Afe_Get_Reg(AFE_HDMI_END));
  517. n += scnprintf(buffer + n, size - n, "AFE_HDMI_CONN0 = 0x%x\n",
  518. Afe_Get_Reg(AFE_HDMI_CONN0));
  519. n += scnprintf(buffer + n, size - n, "AFE_HDMI_CONN1 = 0x%x\n",
  520. Afe_Get_Reg(AFE_HDMI_CONN1));
  521. n += scnprintf(buffer + n, size - n, "AFE_HDMI_OUT_CON0 = 0x%x\n",
  522. Afe_Get_Reg(AFE_HDMI_OUT_CON0));
  523. n += scnprintf(buffer + n, size - n, "AFE_TDM_CON1 = 0x%x\n",
  524. Afe_Get_Reg(AFE_TDM_CON1));
  525. n += scnprintf(buffer + n, size - n, "AFE_TDM_CON2 = 0x%x\n",
  526. Afe_Get_Reg(AFE_TDM_CON2));
  527. pr_debug("mt_soc_debug_read len = %d\n", n);
  528. AudDrv_Clk_Off();
  529. AudDrv_ANA_Clk_Off();
  530. return simple_read_from_buffer(buf, count, pos, buffer, n);
  531. }
  532. static const char ParSetkeyAfe[] = "Setafereg";
  533. static const char ParSetkeyAna[] = "Setanareg";
  534. static const char ParSetkeyCfg[] = "Setcfgreg";
  535. static const char PareGetkeyAfe[] = "Getafereg";
  536. static const char PareGetkeyAna[] = "Getanareg";
  537. /* static const char ParGetkeyCfg[] = "Getcfgreg"; */
  538. /* static const char ParSetAddr[] = "regaddr"; */
  539. /* static const char ParSetValue[] = "regvalue"; */
  540. static ssize_t mt_soc_debug_write(struct file *f, const char __user *buf,
  541. size_t count, loff_t *offset)
  542. {
  543. int ret = 0;
  544. char InputString[256];
  545. char *token1 = NULL;
  546. char *token2 = NULL;
  547. char *token3 = NULL;
  548. char *token4 = NULL;
  549. char *token5 = NULL;
  550. char *temp = NULL;
  551. unsigned long int regaddr = 0;
  552. unsigned long int regvalue = 0;
  553. char delim[] = " ,";
  554. memset((void *)InputString, 0, 256);
  555. if (copy_from_user((InputString), buf, count)) {
  556. pr_debug("copy_from_user mt_soc_debug_write count = %zu temp = %s\n",
  557. count, InputString);
  558. }
  559. temp = kstrdup(InputString, GFP_KERNEL);
  560. pr_debug("copy_from_user mt_soc_debug_write count = %zu temp = %s pointer = %p\n",
  561. count, InputString, InputString);
  562. token1 = strsep(&temp, delim);
  563. pr_debug("token1\n");
  564. pr_debug("token1 = %s\n", token1);
  565. token2 = strsep(&temp, delim);
  566. pr_debug("token2 = %s\n", token2);
  567. token3 = strsep(&temp, delim);
  568. pr_debug("token3 = %s\n", token3);
  569. token4 = strsep(&temp, delim);
  570. pr_debug("token4 = %s\n", token4);
  571. token5 = strsep(&temp, delim);
  572. pr_debug("token5 = %s\n", token5);
  573. if (strcmp(token1, ParSetkeyAfe) == 0) {
  574. pr_debug("strcmp (token1,ParSetkeyAfe)\n");
  575. ret = kstrtol(token3, 16, &regaddr);
  576. ret = kstrtol(token5, 16, &regvalue);
  577. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  578. Afe_Set_Reg(regaddr, regvalue, 0xffffffff);
  579. regvalue = Afe_Get_Reg(regaddr);
  580. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAfe, regaddr, regvalue);
  581. }
  582. if (strcmp(token1, ParSetkeyAna) == 0) {
  583. pr_debug("strcmp (token1,ParSetkeyAna)\n");
  584. ret = kstrtol(token3, 16, &regaddr);
  585. ret = kstrtol(token5, 16, &regvalue);
  586. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  587. /* clk_buf_ctrl(CLK_BUF_AUDIO, true); */
  588. AudDrv_ANA_Clk_On();
  589. AudDrv_Clk_On();
  590. audckbufEnable(true);
  591. Ana_Set_Reg(regaddr, regvalue, 0xffffffff);
  592. regvalue = Ana_Get_Reg(regaddr);
  593. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyAna, regaddr, regvalue);
  594. }
  595. if (strcmp(token1, ParSetkeyCfg) == 0) {
  596. pr_debug("strcmp (token1,ParSetkeyCfg)\n");
  597. ret = kstrtol(token3, 16, &regaddr);
  598. ret = kstrtol(token5, 16, &regvalue);
  599. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  600. SetClkCfg(regaddr, regvalue, 0xffffffff);
  601. regvalue = GetClkCfg(regaddr);
  602. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", ParSetkeyCfg, regaddr, regvalue);
  603. }
  604. if (strcmp(token1, PareGetkeyAfe) == 0) {
  605. pr_debug("strcmp (token1,PareGetkeyAfe)\n");
  606. ret = kstrtol(token3, 16, &regaddr);
  607. regvalue = Afe_Get_Reg(regaddr);
  608. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAfe, regaddr, regvalue);
  609. }
  610. if (strcmp(token1, PareGetkeyAna) == 0) {
  611. pr_debug("strcmp (token1,PareGetkeyAna)\n");
  612. ret = kstrtol(token3, 16, &regaddr);
  613. regvalue = Ana_Get_Reg(regaddr);
  614. pr_debug("%s regaddr = 0x%lu regvalue = 0x%lu\n", PareGetkeyAna, regaddr, regvalue);
  615. }
  616. return count;
  617. }
  618. static const struct file_operations mtaudio_debug_ops = {
  619. .open = mt_soc_debug_open,
  620. .read = mt_soc_debug_read,
  621. .write = mt_soc_debug_write,
  622. };
  623. static const struct file_operations mtaudio_ana_debug_ops = {
  624. .open = mt_soc_ana_debug_open,
  625. .read = mt_soc_ana_debug_read,
  626. };
  627. /* Digital audio interface glue - connects codec <---> CPU */
  628. static struct snd_soc_dai_link mt_soc_dai_common[] = {
  629. /* FrontEnd DAI Links */
  630. {
  631. .name = "MultiMedia1",
  632. .stream_name = MT_SOC_DL1_STREAM_NAME,
  633. .cpu_dai_name = MT_SOC_DL1DAI_NAME,
  634. .platform_name = MT_SOC_DL1_PCM,
  635. .codec_dai_name = MT_SOC_CODEC_TXDAI_NAME,
  636. .codec_name = MT_SOC_CODEC_NAME,
  637. .init = mt_soc_audio_init,
  638. .ops = &mt_machine_audio_ops,
  639. },
  640. {
  641. .name = "MultiMedia2",
  642. .stream_name = MT_SOC_UL1_STREAM_NAME,
  643. .cpu_dai_name = MT_SOC_UL1DAI_NAME,
  644. .platform_name = MT_SOC_UL1_PCM,
  645. .codec_dai_name = MT_SOC_CODEC_RXDAI_NAME,
  646. .codec_name = MT_SOC_CODEC_NAME,
  647. .init = mt_soc_audio_init,
  648. .ops = &mt_machine_audio_ops,
  649. },
  650. {
  651. .name = "Voice_MD1",
  652. .stream_name = MT_SOC_VOICE_MD1_STREAM_NAME,
  653. .cpu_dai_name = MT_SOC_VOICE_MD1_NAME,
  654. .platform_name = MT_SOC_VOICE_MD1,
  655. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1DAI_NAME,
  656. .codec_name = MT_SOC_CODEC_NAME,
  657. .init = mt_soc_audio_init,
  658. .ops = &mt_machine_audio_ops,
  659. },
  660. {
  661. .name = "HDMI_OUT",
  662. .stream_name = MT_SOC_HDMI_STREAM_NAME,
  663. .cpu_dai_name = MT_SOC_HDMI_NAME,
  664. .platform_name = MT_SOC_HDMI_PCM,
  665. .codec_dai_name = MT_SOC_CODEC_HDMI_DUMMY_DAI_NAME,
  666. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  667. .init = mt_soc_audio_init,
  668. .ops = &mt_machine_audio_ops,
  669. },
  670. {
  671. .name = "ULDLOOPBACK",
  672. .stream_name = MT_SOC_ULDLLOOPBACK_STREAM_NAME,
  673. .cpu_dai_name = MT_SOC_ULDLLOOPBACK_NAME,
  674. .platform_name = MT_SOC_ULDLLOOPBACK_PCM,
  675. .codec_dai_name = MT_SOC_CODEC_ULDLLOOPBACK_NAME,
  676. .codec_name = MT_SOC_CODEC_NAME,
  677. .init = mt_soc_audio_init,
  678. .ops = &mt_machine_audio_ops,
  679. },
  680. {
  681. .name = "I2S0OUTPUT",
  682. .stream_name = MT_SOC_I2S0_STREAM_NAME,
  683. .cpu_dai_name = MT_SOC_I2S0_NAME,
  684. .platform_name = MT_SOC_I2S0_PCM,
  685. .codec_dai_name = MT_SOC_CODEC_I2S0_DUMMY_DAI_NAME,
  686. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  687. .init = mt_soc_audio_init,
  688. .ops = &mt_machine_audio_ops,
  689. },
  690. {
  691. .name = "MRGRX",
  692. .stream_name = MT_SOC_MRGRX_STREAM_NAME,
  693. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  694. .platform_name = MT_SOC_MRGRX_PCM,
  695. .codec_dai_name = MT_SOC_CODEC_MRGRX_DAI_NAME,
  696. .codec_name = MT_SOC_CODEC_NAME,
  697. .init = mt_soc_audio_init,
  698. .ops = &mt_machine_audio_ops,
  699. },
  700. {
  701. .name = "MRGRXCAPTURE",
  702. .stream_name = MT_SOC_MRGRX_CAPTURE_STREAM_NAME,
  703. .cpu_dai_name = MT_SOC_MRGRX_NAME,
  704. .platform_name = MT_SOC_MRGRX_AWB_PCM,
  705. .codec_dai_name = MT_SOC_CODEC_MRGRX_DUMMY_DAI_NAME,
  706. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  707. .init = mt_soc_audio_init,
  708. .ops = &mt_machine_audio_ops,
  709. },
  710. {
  711. .name = "I2S0DL1OUTPUT",
  712. .stream_name = MT_SOC_I2SDL1_STREAM_NAME,
  713. .cpu_dai_name = MT_SOC_I2S0DL1_NAME,
  714. .platform_name = MT_SOC_I2S0DL1_PCM,
  715. .codec_dai_name = MT_SOC_CODEC_I2S0TXDAI_NAME,
  716. .codec_name = MT_SOC_CODEC_NAME,
  717. .init = mt_soc_audio_init,
  718. .ops = &mt_machine_audio_ops,
  719. },
  720. {
  721. .name = "DL1AWBCAPTURE",
  722. .stream_name = MT_SOC_DL1_AWB_RECORD_STREAM_NAME,
  723. .cpu_dai_name = MT_SOC_DL1AWB_NAME,
  724. .platform_name = MT_SOC_DL1_AWB_PCM,
  725. .codec_dai_name = MT_SOC_CODEC_DL1AWBDAI_NAME,
  726. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  727. .init = mt_soc_audio_init,
  728. .ops = &mt_machine_audio_ops,
  729. },
  730. {
  731. .name = "Voice_MD1_BT",
  732. .stream_name = MT_SOC_VOICE_MD1_BT_STREAM_NAME,
  733. .cpu_dai_name = MT_SOC_VOICE_MD1_BT_NAME,
  734. .platform_name = MT_SOC_VOICE_MD1_BT,
  735. .codec_dai_name = MT_SOC_CODEC_VOICE_MD1_BTDAI_NAME,
  736. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  737. .init = mt_soc_audio_init,
  738. .ops = &mt_machine_audio_ops,
  739. },
  740. {
  741. .name = "VOIP_CALL_BT_PLAYBACK",
  742. .stream_name = MT_SOC_VOIP_BT_OUT_STREAM_NAME,
  743. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_OUT_NAME,
  744. .platform_name = MT_SOC_VOIP_BT_OUT,
  745. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTOUTDAI_NAME,
  746. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  747. .init = mt_soc_audio_init,
  748. .ops = &mt_machine_audio_ops,
  749. },
  750. {
  751. .name = "VOIP_CALL_BT_CAPTURE",
  752. .stream_name = MT_SOC_VOIP_BT_IN_STREAM_NAME,
  753. .cpu_dai_name = MT_SOC_VOIP_CALL_BT_IN_NAME,
  754. .platform_name = MT_SOC_VOIP_BT_IN,
  755. .codec_dai_name = MT_SOC_CODEC_VOIPCALLBTINDAI_NAME,
  756. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  757. .init = mt_soc_audio_init,
  758. .ops = &mt_machine_audio_ops,
  759. },
  760. {
  761. .name = "TDM_Debug_CAPTURE",
  762. .stream_name = MT_SOC_TDM_CAPTURE_STREAM_NAME,
  763. .cpu_dai_name = MT_SOC_TDMRX_NAME,
  764. .platform_name = MT_SOC_TDMRX_PCM,
  765. .codec_dai_name = MT_SOC_CODEC_TDMRX_DAI_NAME,
  766. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  767. .init = mt_soc_audio_init,
  768. .ops = &mt_machine_audio_ops,
  769. },
  770. {
  771. .name = "FM_MRG_TX",
  772. .stream_name = MT_SOC_FM_MRGTX_STREAM_NAME,
  773. .cpu_dai_name = MT_SOC_FM_MRGTX_NAME,
  774. .platform_name = MT_SOC_FM_MRGTX_PCM,
  775. .codec_dai_name = MT_SOC_CODEC_FMMRGTXDAI_DUMMY_DAI_NAME,
  776. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  777. .init = mt_soc_audio_init,
  778. .ops = &mt_machine_audio_ops,
  779. },
  780. {
  781. .name = "MultiMedia3",
  782. .stream_name = MT_SOC_UL1DATA2_STREAM_NAME,
  783. .cpu_dai_name = MT_SOC_UL2DAI_NAME,
  784. .platform_name = MT_SOC_UL2_PCM,
  785. .codec_dai_name = MT_SOC_CODEC_RXDAI2_NAME,
  786. .codec_name = MT_SOC_CODEC_NAME,
  787. .init = mt_soc_audio_init,
  788. .ops = &mt_machine_audio_ops,
  789. },
  790. {
  791. .name = "I2S0_AWB_CAPTURE",
  792. .stream_name = MT_SOC_I2S0AWB_STREAM_NAME,
  793. .cpu_dai_name = MT_SOC_I2S0AWBDAI_NAME,
  794. .platform_name = MT_SOC_I2S0_AWB_PCM,
  795. .codec_dai_name = MT_SOC_CODEC_I2S0AWB_NAME,
  796. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  797. .init = mt_soc_audio_init,
  798. .ops = &mt_machine_audio_ops,
  799. },
  800. {
  801. .name = "Voice_MD2",
  802. .stream_name = MT_SOC_VOICE_MD2_STREAM_NAME,
  803. .cpu_dai_name = MT_SOC_VOICE_MD2_NAME,
  804. .platform_name = MT_SOC_VOICE_MD2,
  805. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2DAI_NAME,
  806. .codec_name = MT_SOC_CODEC_NAME,
  807. .init = mt_soc_audio_init,
  808. .ops = &mt_machine_audio_ops,
  809. },
  810. {
  811. .name = "PLATOFRM_CONTROL",
  812. .stream_name = MT_SOC_ROUTING_STREAM_NAME,
  813. .cpu_dai_name = MT_SOC_ROUTING_DAI_NAME,
  814. .platform_name = MT_SOC_ROUTING_PCM,
  815. .codec_dai_name = MT_SOC_CODEC_DUMMY_DAI_NAME,
  816. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  817. .init = mt_soc_audio_init2,
  818. .ops = &mtmachine_audio_ops2,
  819. },
  820. {
  821. .name = "Voice_MD2_BT",
  822. .stream_name = MT_SOC_VOICE_MD2_BT_STREAM_NAME,
  823. .cpu_dai_name = MT_SOC_VOICE_MD2_BT_NAME,
  824. .platform_name = MT_SOC_VOICE_MD2_BT,
  825. .codec_dai_name = MT_SOC_CODEC_VOICE_MD2_BTDAI_NAME,
  826. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  827. .init = mt_soc_audio_init,
  828. .ops = &mt_machine_audio_ops,
  829. },
  830. {
  831. .name = "HP_IMPEDANCE",
  832. .stream_name = MT_SOC_HP_IMPEDANCE_STREAM_NAME,
  833. .cpu_dai_name = MT_SOC_HP_IMPEDANCE_NAME,
  834. .platform_name = MT_SOC_HP_IMPEDANCE_PCM,
  835. .codec_dai_name = MT_SOC_CODEC_HP_IMPEDANCE_NAME,
  836. .codec_name = MT_SOC_CODEC_NAME,
  837. .init = mt_soc_audio_init,
  838. .ops = &mt_machine_audio_ops,
  839. },
  840. {
  841. .name = "FM_I2S_RX_Playback",
  842. .stream_name = MT_SOC_FM_I2S_PLAYBACK_STREAM_NAME,
  843. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  844. .platform_name = MT_SOC_FM_I2S_PCM,
  845. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DAI_NAME,
  846. .codec_name = MT_SOC_CODEC_NAME,
  847. .init = mt_soc_audio_init,
  848. .ops = &mt_machine_audio_ops,
  849. },
  850. {
  851. .name = "FM_I2S_RX_Capture",
  852. .stream_name = MT_SOC_FM_I2S_CAPTURE_STREAM_NAME,
  853. .cpu_dai_name = MT_SOC_FM_I2S_NAME,
  854. .platform_name = MT_SOC_FM_I2S_AWB_PCM,
  855. .codec_dai_name = MT_SOC_CODEC_FM_I2S_DUMMY_DAI_NAME,
  856. .codec_name = MT_SOC_CODEC_DUMMY_NAME,
  857. .init = mt_soc_audio_init,
  858. .ops = &mt_machine_audio_ops,
  859. },
  860. };
  861. static const char * const I2S_low_jittermode[] = { "Off", "On" };
  862. static const struct soc_enum mt_soc_machine_enum[] = {
  863. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(I2S_low_jittermode), I2S_low_jittermode),
  864. };
  865. static int mt8163_get_lowjitter(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  866. {
  867. pr_debug("%s: mt_soc_lowjitter_control = %d\n", __func__, mt_soc_lowjitter_control);
  868. ucontrol->value.integer.value[0] = mt_soc_lowjitter_control;
  869. return 0;
  870. }
  871. static int mt8163_set_lowjitter(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  872. {
  873. pr_debug("%s()\n", __func__);
  874. mt_soc_lowjitter_control = ucontrol->value.integer.value[0];
  875. return 0;
  876. }
  877. static const struct snd_kcontrol_new mt_soc_controls[] = {
  878. SOC_ENUM_EXT("I2S low Jitter function", mt_soc_machine_enum[0], mt8163_get_lowjitter,
  879. mt8163_set_lowjitter),
  880. };
  881. static struct snd_soc_card snd_soc_card_mt = {
  882. .name = "mt-snd-card",
  883. .dai_link = mt_soc_dai_common,
  884. .num_links = ARRAY_SIZE(mt_soc_dai_common),
  885. .controls = mt_soc_controls,
  886. .num_controls = ARRAY_SIZE(mt_soc_controls),
  887. };
  888. static struct platform_device *mt_snd_device;
  889. static int __init mt_soc_snd_init(void)
  890. {
  891. int ret;
  892. struct snd_soc_card *card = &snd_soc_card_mt;
  893. pr_debug("mt_soc_snd_init card addr = %p\n", card);
  894. mt_snd_device = platform_device_alloc("soc-audio", -1);
  895. if (!mt_snd_device) {
  896. pr_err("mt6589_probe platform_device_alloc fail\n");
  897. return -ENOMEM;
  898. }
  899. platform_set_drvdata(mt_snd_device, &snd_soc_card_mt);
  900. ret = platform_device_add(mt_snd_device);
  901. if (ret != 0) {
  902. pr_err("mt_soc_snd_init goto put_device fail\n");
  903. goto put_device;
  904. }
  905. pr_debug("mt_soc_snd_init dai_link = %p\n", snd_soc_card_mt.dai_link);
  906. pr_debug("mt_soc_snd_init dai_link -----\n");
  907. /* create debug file */
  908. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_FS_NAME,
  909. S_IFREG | S_IRUGO, NULL, (void *)DEBUG_FS_NAME,
  910. &mtaudio_debug_ops);
  911. /* create analog debug file */
  912. mt_sco_audio_debugfs = debugfs_create_file(DEBUG_ANA_FS_NAME,
  913. S_IFREG | S_IRUGO, NULL,
  914. (void *)DEBUG_ANA_FS_NAME,
  915. &mtaudio_ana_debug_ops);
  916. return 0;
  917. put_device:
  918. platform_device_put(mt_snd_device);
  919. return ret;
  920. }
  921. static void __exit mt_soc_snd_exit(void)
  922. {
  923. platform_device_unregister(mt_snd_device);
  924. }
  925. module_init(mt_soc_snd_init);
  926. module_exit(mt_soc_snd_exit);
  927. /* Module information */
  928. MODULE_AUTHOR("ChiPeng <chipeng.chang@mediatek.com>");
  929. MODULE_DESCRIPTION("ALSA SoC driver ");
  930. MODULE_LICENSE("GPL");
  931. MODULE_ALIAS("platform:mt-snd-card");