AudDrv_Clk.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  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. * AudDrv_Clk.c
  21. *
  22. * Project:
  23. * --------
  24. * MT6583 Audio Driver clock control implement
  25. *
  26. * Description:
  27. * ------------
  28. * Audio register
  29. *
  30. * Author:
  31. * -------
  32. * Chipeng Chang (MTK02308)
  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. #ifndef CONFIG_MTK_CLKMGR
  45. #include <linux/clk.h>
  46. #else
  47. #include <mach/mt_clkmgr.h>
  48. #endif
  49. /* #include <mach/mt_pm_ldo.h> */
  50. /* #include <mach/pmic_mt6325_sw.h> */
  51. /* #include <mach/upmu_common.h> */
  52. /* #include <mach/upmu_hw.h> */
  53. /* #include <mt-plat/upmu_common.h> */
  54. #include "AudDrv_Common.h"
  55. #include "AudDrv_Clk.h"
  56. #include "AudDrv_Afe.h"
  57. #include <linux/spinlock.h>
  58. #include <linux/delay.h>
  59. /* #include <mach/mt_idle.h> */
  60. #ifdef _MT_IDLE_HEADER
  61. #include "mt_idle.h"
  62. #include "mt_clk_id.h"
  63. #endif
  64. /*****************************************************************************
  65. * D A T A T Y P E S
  66. *****************************************************************************/
  67. int Aud_Core_Clk_cntr = 0;
  68. int Aud_AFE_Clk_cntr = 0;
  69. int Aud_I2S_Clk_cntr = 0;
  70. int Aud_ADC_Clk_cntr = 0;
  71. int Aud_ADC2_Clk_cntr = 0;
  72. int Aud_ADC3_Clk_cntr = 0;
  73. int Aud_ANA_Clk_cntr = 0;
  74. int Aud_HDMI_Clk_cntr = 0;
  75. int Aud_APLL22M_Clk_cntr = 0;
  76. int Aud_APLL24M_Clk_cntr = 0;
  77. int Aud_APLL1_Tuner_cntr = 0;
  78. int Aud_APLL2_Tuner_cntr = 0;
  79. static int Aud_EMI_cntr;
  80. static DEFINE_SPINLOCK(auddrv_Clk_lock);
  81. /* amp mutex lock */
  82. static DEFINE_MUTEX(auddrv_pmic_mutex);
  83. static DEFINE_MUTEX(audEMI_Clk_mutex);
  84. /* extern void disable_dpidle_by_bit(int id); */
  85. /* extern void disable_soidle_by_bit(int id); */
  86. /* extern void enable_dpidle_by_bit(int id); */
  87. /* extern void enable_soidle_by_bit(int id); */
  88. void AudDrv_Clk_AllOn(void)
  89. {
  90. unsigned long flags;
  91. pr_debug("AudDrv_Clk_AllOn\n");
  92. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  93. Afe_Set_Reg(AUDIO_TOP_CON0, 0x00004000, 0xffffffff);
  94. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  95. }
  96. void Auddrv_Bus_Init(void)
  97. {
  98. unsigned long flags;
  99. pr_debug("%s\n", __func__);
  100. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  101. /* must set, system will default set bit14 to 0 */
  102. Afe_Set_Reg(AUDIO_TOP_CON0, 0x00004000, 0x00004000);
  103. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  104. }
  105. /*****************************************************************************
  106. * FUNCTION
  107. * AudDrv_Clk_Power_On / AudDrv_Clk_Power_Off
  108. *
  109. * DESCRIPTION
  110. * Power on this function , then all register can be access and set.
  111. *
  112. *****************************************************************************
  113. */
  114. void AudDrv_Clk_Power_On(void)
  115. {
  116. volatile uint32 *AFE_Register = (volatile uint32 *)Get_Afe_Powertop_Pointer();
  117. volatile uint32 val_tmp;
  118. pr_debug("%s\n", __func__);
  119. val_tmp = 0xd;
  120. mt_reg_sync_writel(val_tmp, AFE_Register);
  121. }
  122. void AudDrv_Clk_Power_Off(void)
  123. {
  124. }
  125. /*****************************************************************************
  126. * FUNCTION
  127. * AudDrv_Clk_On / AudDrv_Clk_Off
  128. *
  129. * DESCRIPTION
  130. * Enable/Disable PLL(26M clock) \ AFE clock
  131. *
  132. *****************************************************************************
  133. */
  134. void AudDrv_Clk_On(void)
  135. {
  136. unsigned long flags;
  137. PRINTK_AUD_CLK("+AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  138. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  139. if (Aud_AFE_Clk_cntr == 0) {
  140. pr_debug("-----------AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  141. #ifdef PM_MANAGER_API
  142. if (enable_clock(MT_CG_INFRA_AUDIO, "AUDIO"))
  143. PRINTK_AUD_CLK("%s Aud enable_clock MT_CG_INFRA_AUDIO fail\n", __func__);
  144. if (enable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  145. PRINTK_AUD_CLK("%s Aud enable_clock MT_CG_AUDIO_AFE fail\n", __func__);
  146. #if 0 /* Todo now clock mgr not ready, we directly set register */
  147. if (enable_clock(MT_CG_AUDIO_DAC, "AUDIO"))
  148. PRINTK_AUD_CLK("%s MT_CG_AUDIO_DAC fail", __func__);
  149. if (enable_clock(MT_CG_AUDIO_DAC_PREDIS, "AUDIO"))
  150. PRINTK_AUD_CLK("%s MT_CG_AUDIO_DAC_PREDIS fail", __func__);
  151. #else
  152. Afe_Set_Reg(AUDIO_TOP_CON0, 0, 0x06000000);
  153. #endif
  154. #else
  155. /* bit 25=0, without 133m master and 66m slave bus clock cg gating */
  156. SetInfraCfg(AUDIO_CG_CLR, 0x2000000, 0x2000000);
  157. Afe_Set_Reg(AUDIO_TOP_CON0, 0x4000, 0x06004044);
  158. #endif
  159. }
  160. Aud_AFE_Clk_cntr++;
  161. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  162. PRINTK_AUD_CLK("-AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  163. }
  164. EXPORT_SYMBOL(AudDrv_Clk_On);
  165. void AudDrv_Clk_Off(void)
  166. {
  167. unsigned long flags;
  168. PRINTK_AUD_CLK("+!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  169. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  170. Aud_AFE_Clk_cntr--;
  171. if (Aud_AFE_Clk_cntr == 0) {
  172. pr_debug("------------AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  173. {
  174. /* Disable AFE clock */
  175. #ifdef PM_MANAGER_API
  176. if (disable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  177. PRINTK_AUD_CLK("%s disable_clock MT_CG_AUDIO_AFE fail\n", __func__);
  178. #if 0 /* Todo now clock mgr not ready, we directly set register */
  179. if (disable_clock(MT_CG_AUDIO_DAC, "AUDIO"))
  180. PRINTK_AUD_CLK("%s MT_CG_AUDIO_DAC fail\n", __func__);
  181. if (disable_clock(MT_CG_AUDIO_DAC_PREDIS, "AUDIO"))
  182. PRINTK_AUD_CLK("%s MT_CG_AUDIO_DAC_PREDIS fail\n", __func__);
  183. #else
  184. Afe_Set_Reg(AUDIO_TOP_CON0, 0x06000000, 0x06000000);
  185. #endif
  186. if (disable_clock(MT_CG_INFRA_AUDIO, "AUDIO"))
  187. PRINTK_AUD_CLK("%s disable_clock MT_CG_INFRA_AUDIO fail\n",
  188. __func__);
  189. #else
  190. Afe_Set_Reg(AUDIO_TOP_CON0, 0x06000044, 0x06000044);
  191. /* bit25=1, with 133m mastesr and 66m slave bus clock cg gating */
  192. SetInfraCfg(AUDIO_CG_SET, 0x2000000, 0x2000000);
  193. #endif
  194. }
  195. } else if (Aud_AFE_Clk_cntr < 0) {
  196. PRINTK_AUD_ERROR("!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr<0 (%d)\n", Aud_AFE_Clk_cntr);
  197. AUDIO_ASSERT(true);
  198. Aud_AFE_Clk_cntr = 0;
  199. }
  200. PRINTK_AUD_CLK("-!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  201. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  202. }
  203. EXPORT_SYMBOL(AudDrv_Clk_Off);
  204. /*****************************************************************************
  205. * FUNCTION
  206. * AudDrv_ANA_Clk_On / AudDrv_ANA_Clk_Off
  207. *
  208. * DESCRIPTION
  209. * Enable/Disable analog part clock
  210. *
  211. *****************************************************************************/
  212. void AudDrv_ANA_Clk_On(void)
  213. {
  214. mutex_lock(&auddrv_pmic_mutex);
  215. if (Aud_ANA_Clk_cntr == 0) {
  216. PRINTK_AUD_CLK("+AudDrv_ANA_Clk_On, Aud_ANA_Clk_cntr:%d\n", Aud_ANA_Clk_cntr);
  217. /* upmu_set_rg_clksq_en_aud(1); */
  218. }
  219. Aud_ANA_Clk_cntr++;
  220. mutex_unlock(&auddrv_pmic_mutex);
  221. PRINTK_AUD_CLK("-AudDrv_ANA_Clk_Off, Aud_ANA_Clk_cntr:%d\n", Aud_ANA_Clk_cntr);
  222. }
  223. EXPORT_SYMBOL(AudDrv_ANA_Clk_On);
  224. void AudDrv_ANA_Clk_Off(void)
  225. {
  226. PRINTK_AUD_CLK("+AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ANA_Clk_cntr);
  227. mutex_lock(&auddrv_pmic_mutex);
  228. Aud_ANA_Clk_cntr--;
  229. if (Aud_ANA_Clk_cntr == 0) {
  230. PRINTK_AUD_CLK("+AudDrv_ANA_Clk_Off disable_clock Ana clk(%x)\n", Aud_ANA_Clk_cntr);
  231. /* upmu_set_rg_clksq_en_aud(0); */
  232. /* Disable ADC clock */
  233. #ifdef PM_MANAGER_API
  234. #else
  235. /* TODO:: open ADC clock.... */
  236. #endif
  237. } else if (Aud_ANA_Clk_cntr < 0) {
  238. PRINTK_AUD_ERROR("!! AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr<0 (%d)\n",
  239. Aud_ANA_Clk_cntr);
  240. AUDIO_ASSERT(true);
  241. Aud_ANA_Clk_cntr = 0;
  242. }
  243. mutex_unlock(&auddrv_pmic_mutex);
  244. PRINTK_AUD_CLK("-AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ANA_Clk_cntr);
  245. }
  246. EXPORT_SYMBOL(AudDrv_ANA_Clk_Off);
  247. /*****************************************************************************
  248. * FUNCTION
  249. * AudDrv_ADC_Clk_On / AudDrv_ADC_Clk_Off
  250. *
  251. * DESCRIPTION
  252. * Enable/Disable analog part clock
  253. *
  254. *****************************************************************************/
  255. void AudDrv_ADC_Clk_On(void)
  256. {
  257. PRINTK_AUDDRV("+AudDrv_ADC_Clk_On, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr);
  258. mutex_lock(&auddrv_pmic_mutex);
  259. if (Aud_ADC_Clk_cntr == 0) {
  260. PRINTK_AUDDRV("+AudDrv_ADC_Clk_On enable_clock ADC clk(%x)\n", Aud_ADC_Clk_cntr);
  261. #ifdef PM_MANAGER_API
  262. #if 0 /* Todo now clock mgr is not ready, directly set register */
  263. if (enable_clock(MT_CG_AUDIO_ADC, "AUDIO"))
  264. PRINTK_AUD_CLK("%s fail", __func__);
  265. #else
  266. Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 24, 1 << 24);
  267. #endif
  268. #else
  269. Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 24, 1 << 24);
  270. #endif
  271. }
  272. Aud_ADC_Clk_cntr++;
  273. mutex_unlock(&auddrv_pmic_mutex);
  274. }
  275. void AudDrv_ADC_Clk_Off(void)
  276. {
  277. PRINTK_AUDDRV("+AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr);
  278. mutex_lock(&auddrv_pmic_mutex);
  279. Aud_ADC_Clk_cntr--;
  280. if (Aud_ADC_Clk_cntr == 0) {
  281. PRINTK_AUDDRV("+AudDrv_ADC_Clk_On disable_clock ADC clk(%x)\n", Aud_ADC_Clk_cntr);
  282. #ifdef PM_MANAGER_API
  283. #if 0 /* Todo now clock mgr is not ready, directly set register */
  284. if (disable_clock(MT_CG_AUDIO_ADC, "AUDIO"))
  285. PRINTK_AUD_CLK("%s fail", __func__);
  286. #else
  287. Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 24, 1 << 24);
  288. #endif
  289. #else
  290. Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 24, 1 << 24);
  291. #endif
  292. }
  293. if (Aud_ADC_Clk_cntr < 0) {
  294. PRINTK_AUDDRV("!! AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr<0 (%d)\n", Aud_ADC_Clk_cntr);
  295. Aud_ADC_Clk_cntr = 0;
  296. }
  297. mutex_unlock(&auddrv_pmic_mutex);
  298. PRINTK_AUDDRV("-AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr);
  299. }
  300. /*****************************************************************************
  301. * FUNCTION
  302. * AudDrv_ADC2_Clk_On / AudDrv_ADC2_Clk_Off
  303. *
  304. * DESCRIPTION
  305. * Enable/Disable clock
  306. *
  307. *****************************************************************************/
  308. void AudDrv_ADC2_Clk_On(void)
  309. {
  310. PRINTK_AUD_CLK("+%s %d\n", __func__, Aud_ADC2_Clk_cntr);
  311. mutex_lock(&auddrv_pmic_mutex);
  312. if (Aud_ADC2_Clk_cntr == 0) {
  313. PRINTK_AUDDRV("+%s enable_clock ADC2 clk(%x)\n", __func__, Aud_ADC2_Clk_cntr);
  314. #if 0 /* removed */
  315. #ifdef PM_MANAGER_API
  316. if (enable_clock(MT_CG_AUDIO_ADDA2, "AUDIO"))
  317. PRINTK_AUD_CLK("%s fail\n", __func__);
  318. #else
  319. /* temp hard code setting, after confirm with enable clock usage, this could be removed. */
  320. Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 23, 1 << 23);
  321. #endif
  322. #endif
  323. }
  324. Aud_ADC2_Clk_cntr++;
  325. mutex_unlock(&auddrv_pmic_mutex);
  326. }
  327. void AudDrv_ADC2_Clk_Off(void)
  328. {
  329. PRINTK_AUDDRV("+%s %d\n", __func__, Aud_ADC2_Clk_cntr);
  330. mutex_lock(&auddrv_pmic_mutex);
  331. Aud_ADC2_Clk_cntr--;
  332. if (Aud_ADC2_Clk_cntr == 0) {
  333. PRINTK_AUDDRV("+%s disable_clock ADC2 clk(%x)\n", __func__, Aud_ADC2_Clk_cntr);
  334. #if 0 /* removed */
  335. #ifdef PM_MANAGER_API
  336. if (disable_clock(MT_CG_AUDIO_ADDA2, "AUDIO"))
  337. PRINTK_AUD_CLK("%s fail\n", __func__);
  338. #else
  339. /* temp hard code setting, after confirm with enable clock usage, this could be removed. */
  340. Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 23, 1 << 23);
  341. #endif
  342. #endif
  343. }
  344. if (Aud_ADC2_Clk_cntr < 0) {
  345. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_ADC2_Clk_cntr);
  346. Aud_ADC2_Clk_cntr = 0;
  347. }
  348. mutex_unlock(&auddrv_pmic_mutex);
  349. PRINTK_AUDDRV("-AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr);
  350. }
  351. /*****************************************************************************
  352. * FUNCTION
  353. * AudDrv_ADC3_Clk_On / AudDrv_ADC3_Clk_Off
  354. *
  355. * DESCRIPTION
  356. * Enable/Disable clock
  357. *
  358. *****************************************************************************/
  359. void AudDrv_ADC3_Clk_On(void)
  360. {
  361. PRINTK_AUD_CLK("+%s %d\n", __func__, Aud_ADC3_Clk_cntr);
  362. mutex_lock(&auddrv_pmic_mutex);
  363. if (Aud_ADC3_Clk_cntr == 0) {
  364. PRINTK_AUDDRV("+%s enable_clock ADC3 clk(%x)\n", __func__, Aud_ADC3_Clk_cntr);
  365. #if 0 /* removed */
  366. #ifdef PM_MANAGER_API
  367. if (enable_clock(MT_CG_AUDIO_ADDA3, "AUDIO"))
  368. PRINTK_AUD_CLK("%s fail\n", __func__);
  369. #endif
  370. #endif
  371. }
  372. Aud_ADC2_Clk_cntr++;
  373. mutex_unlock(&auddrv_pmic_mutex);
  374. }
  375. void AudDrv_ADC3_Clk_Off(void)
  376. {
  377. PRINTK_AUDDRV("+%s %d\n", __func__, Aud_ADC3_Clk_cntr);
  378. mutex_lock(&auddrv_pmic_mutex);
  379. Aud_ADC3_Clk_cntr--;
  380. if (Aud_ADC3_Clk_cntr == 0) {
  381. PRINTK_AUDDRV("+%s disable_clock ADC3 clk(%x)\n", __func__, Aud_ADC3_Clk_cntr);
  382. #if 0 /* removed */
  383. #ifdef PM_MANAGER_API
  384. if (disable_clock(MT_CG_AUDIO_ADDA3, "AUDIO"))
  385. PRINTK_AUD_CLK("%s fail\n", __func__);
  386. #endif
  387. #endif
  388. }
  389. if (Aud_ADC3_Clk_cntr < 0) {
  390. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_ADC3_Clk_cntr);
  391. Aud_ADC3_Clk_cntr = 0;
  392. }
  393. mutex_unlock(&auddrv_pmic_mutex);
  394. PRINTK_AUDDRV("-AudDrv_ADC3_Clk_Off, Aud_ADC3_Clk_cntr:%d\n", Aud_ADC3_Clk_cntr);
  395. }
  396. /*****************************************************************************
  397. * FUNCTION
  398. * AudDrv_APLL22M_Clk_On / AudDrv_APLL22M_Clk_Off
  399. *
  400. * DESCRIPTION
  401. * Enable/Disable clock
  402. *
  403. *****************************************************************************/
  404. void AudDrv_APLL22M_Clk_On(void)
  405. {
  406. unsigned long flags;
  407. pr_debug("+%s %d\n", __func__, Aud_APLL22M_Clk_cntr);
  408. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  409. if (Aud_APLL22M_Clk_cntr == 0) {
  410. PRINTK_AUDDRV("+%s enable_clock APLL22M clk(%x)\n", __func__, Aud_APLL22M_Clk_cntr);
  411. #ifdef PM_MANAGER_API
  412. pr_debug("+%s enable_mux ADC\n", __func__);
  413. #if 0 /* Todo now direct set registe in EnableApll */
  414. /* MT_MUX_AUD1 CLK_CFG_6 => [7]: pdn_aud_1 [15]: ,MT_MUX_AUD2: pdn_aud_2 */
  415. enable_mux(MT_MUX_AUD1, "AUDIO");
  416. /* select APLL1 ,hf_faud_1_ck is mux of 26M and APLL1_CK */
  417. clkmux_sel(MT_MUX_AUD1, 1, "AUDIO");
  418. #endif
  419. pll_fsel(APLL1, 0xb7945ea6); /* APLL1 90.3168M */
  420. /* pdn_aud_1 => power down hf_faud_1_ck, hf_faud_1_ck is mux of 26M and APLL1_CK */
  421. /* pdn_aud_2 => power down hf_faud_2_ck, hf_faud_2_ck is mux of 26M and APLL2_CK (D1 is WHPLL) */
  422. if (enable_clock(MT_CG_AUDIO_22M, "AUDIO"))
  423. PRINTK_AUD_CLK("%s fail\n", __func__);
  424. #endif
  425. }
  426. Aud_APLL22M_Clk_cntr++;
  427. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  428. }
  429. void AudDrv_APLL22M_Clk_Off(void)
  430. {
  431. unsigned long flags;
  432. pr_debug("+%s %d\n", __func__, Aud_APLL22M_Clk_cntr);
  433. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  434. Aud_APLL22M_Clk_cntr--;
  435. if (Aud_APLL22M_Clk_cntr == 0) {
  436. PRINTK_AUDDRV("+%s disable_clock APLL22M clk(%x)\n", __func__, Aud_APLL22M_Clk_cntr);
  437. #ifdef PM_MANAGER_API
  438. if (disable_clock(MT_CG_AUDIO_22M, "AUDIO"))
  439. PRINTK_AUD_CLK("%s fail\n", __func__);
  440. #if 0 /* Todo now direct set registe in EnableApll */
  441. clkmux_sel(MT_MUX_AUD1, 0, "AUDIO"); /* select 26M */
  442. disable_mux(MT_MUX_AUD1, "AUDIO");
  443. #endif
  444. #endif
  445. }
  446. if (Aud_APLL22M_Clk_cntr < 0) {
  447. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_APLL22M_Clk_cntr);
  448. Aud_APLL22M_Clk_cntr = 0;
  449. }
  450. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  451. }
  452. /*****************************************************************************
  453. * FUNCTION
  454. * AudDrv_APLL24M_Clk_On / AudDrv_APLL24M_Clk_Off
  455. *
  456. * DESCRIPTION
  457. * Enable/Disable clock
  458. *
  459. *****************************************************************************/
  460. void AudDrv_APLL24M_Clk_On(void)
  461. {
  462. unsigned long flags;
  463. pr_debug("+%s %d\n", __func__, Aud_APLL24M_Clk_cntr);
  464. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  465. if (Aud_APLL24M_Clk_cntr == 0) {
  466. PRINTK_AUDDRV("+%s enable_clock APLL24M clk(%x)\n", __func__, Aud_APLL24M_Clk_cntr);
  467. #ifdef PM_MANAGER_API
  468. #if 0 /* Todo, now directly set register */
  469. enable_mux(MT_MUX_AUD1, "AUDIO");
  470. clkmux_sel(MT_MUX_AUD1, 1, "AUDIO"); /* hf_faud_1_ck apll1_ck */
  471. #endif
  472. pll_fsel(APLL1, 0xbc7ea932); /* ALPP1 98.304M */
  473. if (enable_clock(MT_CG_AUDIO_24M, "AUDIO"))
  474. PRINTK_AUD_CLK("%s fail\n", __func__);
  475. #endif
  476. }
  477. Aud_APLL24M_Clk_cntr++;
  478. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  479. }
  480. void AudDrv_APLL24M_Clk_Off(void)
  481. {
  482. unsigned long flags;
  483. pr_debug("+%s %d\n", __func__, Aud_APLL24M_Clk_cntr);
  484. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  485. Aud_APLL24M_Clk_cntr--;
  486. if (Aud_APLL24M_Clk_cntr == 0) {
  487. PRINTK_AUDDRV("+%s disable_clock APLL24M clk(%x)\n", __func__, Aud_APLL24M_Clk_cntr);
  488. #ifdef PM_MANAGER_API
  489. if (disable_clock(MT_CG_AUDIO_24M, "AUDIO"))
  490. PRINTK_AUD_CLK("%s fail\n", __func__);
  491. #if 0 /* Todo, now directly set register */
  492. clkmux_sel(MT_MUX_AUD1, 0, "AUDIO"); /* select 26M */
  493. disable_mux(MT_MUX_AUD1, "AUDIO");
  494. #endif
  495. #endif
  496. }
  497. if (Aud_APLL24M_Clk_cntr < 0) {
  498. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_APLL24M_Clk_cntr);
  499. Aud_APLL24M_Clk_cntr = 0;
  500. }
  501. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  502. }
  503. /*****************************************************************************
  504. * FUNCTION
  505. * AudDrv_I2S_Clk_On / AudDrv_I2S_Clk_Off
  506. *
  507. * DESCRIPTION
  508. * Enable/Disable analog part clock
  509. *
  510. *****************************************************************************/
  511. void AudDrv_I2S_Clk_On(void)
  512. {
  513. unsigned long flags;
  514. PRINTK_AUD_CLK("+AudDrv_I2S_Clk_On, Aud_I2S_Clk_cntr:%d\n", Aud_I2S_Clk_cntr);
  515. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  516. if (Aud_I2S_Clk_cntr == 0) {
  517. #ifdef PM_MANAGER_API
  518. if (enable_clock(MT_CG_AUDIO_I2S, "AUDIO"))
  519. PRINTK_AUD_ERROR("Aud enable_clock MT65XX_PDN_AUDIO_I2S fail !!!\n");
  520. #else
  521. Afe_Set_Reg(AUDIO_TOP_CON0, 0x00000000, 0x00000040); /* power on I2S clock */
  522. #endif
  523. }
  524. Aud_I2S_Clk_cntr++;
  525. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  526. }
  527. EXPORT_SYMBOL(AudDrv_I2S_Clk_On);
  528. void AudDrv_I2S_Clk_Off(void)
  529. {
  530. unsigned long flags;
  531. PRINTK_AUD_CLK("+AudDrv_I2S_Clk_Off, Aud_I2S_Clk_cntr:%d\n", Aud_I2S_Clk_cntr);
  532. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  533. Aud_I2S_Clk_cntr--;
  534. if (Aud_I2S_Clk_cntr == 0) {
  535. #ifdef PM_MANAGER_API
  536. if (disable_clock(MT_CG_AUDIO_I2S, "AUDIO"))
  537. PRINTK_AUD_ERROR("disable_clock MT_CG_AUDIO_I2S fail\n");
  538. #else
  539. Afe_Set_Reg(AUDIO_TOP_CON0, 0x00000040, 0x00000040); /* power off I2S clock */
  540. #endif
  541. } else if (Aud_I2S_Clk_cntr < 0) {
  542. PRINTK_AUD_ERROR("!! AudDrv_I2S_Clk_Off, Aud_I2S_Clk_cntr<0 (%d)\n",
  543. Aud_I2S_Clk_cntr);
  544. AUDIO_ASSERT(true);
  545. Aud_I2S_Clk_cntr = 0;
  546. }
  547. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  548. PRINTK_AUD_CLK("-AudDrv_I2S_Clk_Off, Aud_I2S_Clk_cntr:%d\n", Aud_I2S_Clk_cntr);
  549. }
  550. EXPORT_SYMBOL(AudDrv_I2S_Clk_Off);
  551. /*****************************************************************************
  552. * FUNCTION
  553. * AudDrv_Core_Clk_On / AudDrv_Core_Clk_Off
  554. *
  555. * DESCRIPTION
  556. * Enable/Disable analog part clock
  557. *
  558. *****************************************************************************/
  559. void AudDrv_Core_Clk_On(void)
  560. {
  561. unsigned long flags;
  562. PRINTK_AUD_CLK("+AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr);
  563. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  564. if (Aud_Core_Clk_cntr == 0) {
  565. #ifdef PM_MANAGER_API
  566. if (enable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  567. PRINTK_AUD_ERROR
  568. ("AudDrv_Core_Clk_On Aud enable_clock MT_CG_AUDIO_AFE fail !!!\n");
  569. #endif
  570. }
  571. Aud_Core_Clk_cntr++;
  572. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  573. PRINTK_AUD_CLK("-AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr);
  574. }
  575. void AudDrv_Core_Clk_Off(void)
  576. {
  577. unsigned long flags;
  578. PRINTK_AUD_CLK("+AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr);
  579. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  580. if (Aud_Core_Clk_cntr == 0) {
  581. #ifdef PM_MANAGER_API
  582. if (disable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  583. PRINTK_AUD_ERROR
  584. ("AudDrv_Core_Clk_On Aud disable_clock MT_CG_AUDIO_AFE fail !!!\n");
  585. #endif
  586. }
  587. Aud_Core_Clk_cntr++;
  588. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  589. PRINTK_AUD_CLK("-AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr);
  590. }
  591. void AudDrv_APLL1Tuner_Clk_On(void)
  592. {
  593. unsigned long flags;
  594. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  595. if (Aud_APLL1_Tuner_cntr == 0) {
  596. PRINTK_AUD_CLK("+AudDrv_APLLTuner_Clk_On, Aud_APLL1_Tuner_cntr:%d\n",
  597. Aud_APLL1_Tuner_cntr);
  598. #ifdef PM_MANAGER_API
  599. if (enable_clock(MT_CG_AUDIO_APLL_TUNER, "AUDIO"))
  600. PRINTK_AUD_CLK("%s fail", __func__);
  601. #else
  602. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 19, 0x1 << 19);
  603. #endif
  604. Afe_Set_Reg(AFE_APLL1_TUNER_CFG, 0x00008033, 0x0000FFF7);
  605. SetpllCfg(AP_PLL_CON5, 1 << 0, 1 << 0);
  606. }
  607. Aud_APLL1_Tuner_cntr++;
  608. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  609. }
  610. void AudDrv_APLL1Tuner_Clk_Off(void)
  611. {
  612. unsigned long flags;
  613. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  614. Aud_APLL1_Tuner_cntr--;
  615. if (Aud_APLL1_Tuner_cntr == 0) {
  616. #ifdef PM_MANAGER_API
  617. if (disable_clock(MT_CG_AUDIO_APLL_TUNER, "AUDIO"))
  618. PRINTK_AUD_CLK("%s fail\n", __func__);
  619. #else
  620. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 19, 0x1 << 19);
  621. #endif
  622. SetpllCfg(AP_PLL_CON5, 0 << 0, 1 << 0);
  623. /* Afe_Set_Reg(AFE_APLL1_TUNER_CFG, 0x00000033, 0x1 << 19); */
  624. }
  625. /* handle for clock error */
  626. else if (Aud_APLL1_Tuner_cntr < 0) {
  627. PRINTK_AUD_ERROR("!! AudDrv_APLLTuner_Clk_Off, Aud_APLL1_Tuner_cntr<0 (%d)\n",
  628. Aud_APLL1_Tuner_cntr);
  629. Aud_APLL1_Tuner_cntr = 0;
  630. }
  631. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  632. }
  633. void AudDrv_APLL2Tuner_Clk_On(void)
  634. {
  635. unsigned long flags;
  636. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  637. if (Aud_APLL2_Tuner_cntr == 0) {
  638. PRINTK_AUD_CLK("+Aud_APLL2_Tuner_cntr, Aud_APLL2_Tuner_cntr:%d\n",
  639. Aud_APLL2_Tuner_cntr);
  640. #ifdef PM_MANAGER_API
  641. if (enable_clock(MT_CG_AUDIO_APLL2_TUNER, "AUDIO"))
  642. PRINTK_AUD_CLK("%s fail\n", __func__);
  643. #else
  644. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 18, 0x1 << 18);
  645. #endif
  646. Afe_Set_Reg(AFE_APLL2_TUNER_CFG, 0x00000035, 0x0000FFF7);
  647. SetpllCfg(AP_PLL_CON5, 1 << 1, 1 << 1);
  648. }
  649. Aud_APLL2_Tuner_cntr++;
  650. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  651. }
  652. void AudDrv_APLL2Tuner_Clk_Off(void)
  653. {
  654. unsigned long flags;
  655. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  656. Aud_APLL2_Tuner_cntr--;
  657. if (Aud_APLL2_Tuner_cntr == 0) {
  658. #ifdef PM_MANAGER_API
  659. if (disable_clock(MT_CG_AUDIO_APLL2_TUNER, "AUDIO"))
  660. PRINTK_AUD_CLK("%s fail\n", __func__);
  661. #else
  662. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 18, 0x1 << 18);
  663. #endif
  664. SetpllCfg(AP_PLL_CON5, 0 << 0, 0 << 0);
  665. }
  666. /* handle for clock error */
  667. else if (Aud_APLL2_Tuner_cntr < 0) {
  668. PRINTK_AUD_ERROR("!! AudDrv_APLL2Tuner_Clk_Off, Aud_APLL1_Tuner_cntr<0 (%d)\n",
  669. Aud_APLL2_Tuner_cntr);
  670. Aud_APLL2_Tuner_cntr = 0;
  671. }
  672. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  673. }
  674. /*****************************************************************************
  675. * FUNCTION
  676. * AudDrv_HDMI_Clk_On / AudDrv_HDMI_Clk_Off
  677. *
  678. * DESCRIPTION
  679. * Enable/Disable analog part clock
  680. *
  681. *****************************************************************************/
  682. void AudDrv_HDMI_Clk_On(void)
  683. {
  684. PRINTK_AUD_CLK("+AudDrv_HDMI_Clk_On, Aud_HDMI_Clk_cntr:%d\n", Aud_HDMI_Clk_cntr);
  685. if (Aud_HDMI_Clk_cntr == 0) {
  686. AudDrv_ANA_Clk_On();
  687. AudDrv_Clk_On();
  688. }
  689. Aud_HDMI_Clk_cntr++;
  690. }
  691. void AudDrv_HDMI_Clk_Off(void)
  692. {
  693. PRINTK_AUD_CLK("+AudDrv_HDMI_Clk_Off, Aud_HDMI_Clk_cntr:%d\n", Aud_HDMI_Clk_cntr);
  694. Aud_HDMI_Clk_cntr--;
  695. if (Aud_HDMI_Clk_cntr == 0) {
  696. AudDrv_ANA_Clk_Off();
  697. AudDrv_Clk_Off();
  698. } else if (Aud_HDMI_Clk_cntr < 0) {
  699. PRINTK_AUD_ERROR("!! AudDrv_HDMI_Clk_Off, Aud_HDMI_Clk_cntr<0 (%d)\n",
  700. Aud_HDMI_Clk_cntr);
  701. AUDIO_ASSERT(true);
  702. Aud_HDMI_Clk_cntr = 0;
  703. }
  704. PRINTK_AUD_CLK("-AudDrv_HDMI_Clk_Off, Aud_HDMI_Clk_cntr:%d\n", Aud_HDMI_Clk_cntr);
  705. }
  706. /*****************************************************************************
  707. * FUNCTION
  708. * AudDrv_Suspend_Clk_Off / AudDrv_Suspend_Clk_On
  709. *
  710. * DESCRIPTION
  711. * Enable/Disable AFE clock for suspend
  712. *
  713. *****************************************************************************
  714. */
  715. void AudDrv_Suspend_Clk_Off(void)
  716. {
  717. unsigned long flags;
  718. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  719. if (Aud_Core_Clk_cntr > 0) {
  720. #ifdef PM_MANAGER_API
  721. if (Aud_AFE_Clk_cntr > 0) {
  722. if (disable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  723. PRINTK_AUD_ERROR("Aud enable_clock MT_CG_AUDIO_AFE fail !!!\n");
  724. }
  725. if (Aud_I2S_Clk_cntr > 0) {
  726. if (disable_clock(MT_CG_AUDIO_I2S, "AUDIO"))
  727. PRINTK_AUD_ERROR("disable_clock MT_CG_AUDIO_I2S fail\n");
  728. }
  729. if (Aud_ADC_Clk_cntr > 0)
  730. Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 24, 1 << 24);
  731. if (Aud_ADC2_Clk_cntr > 0) {
  732. #if 0 /* 6752 removed */
  733. if (disable_clock(MT_CG_AUDIO_ADDA2, "AUDIO"))
  734. PRINTK_AUD_CLK("%s fail", __func__);
  735. #endif
  736. }
  737. if (Aud_ADC3_Clk_cntr > 0) {
  738. #if 0 /* 6752 removed */
  739. if (disable_clock(MT_CG_AUDIO_ADDA3, "AUDIO"))
  740. PRINTK_AUD_CLK("%s fail", __func__);
  741. #endif
  742. }
  743. if (Aud_APLL22M_Clk_cntr > 0) {
  744. if (disable_clock(MT_CG_AUDIO_22M, "AUDIO"))
  745. PRINTK_AUD_CLK("%s fail\n", __func__);
  746. if (disable_clock(MT_CG_AUDIO_APLL_TUNER, "AUDIO"))
  747. PRINTK_AUD_CLK("%s fail\n", __func__);
  748. clkmux_sel(MT_MUX_AUD1, 0, "AUDIO"); /* select 26M */
  749. disable_mux(MT_MUX_AUD1, "AUDIO");
  750. }
  751. if (Aud_APLL24M_Clk_cntr > 0) {
  752. if (disable_clock(MT_CG_AUDIO_24M, "AUDIO"))
  753. PRINTK_AUD_CLK("%s fail\n", __func__);
  754. if (disable_clock(MT_CG_AUDIO_APLL2_TUNER, "AUDIO"))
  755. PRINTK_AUD_CLK("%s fail\n", __func__);
  756. clkmux_sel(MT_MUX_AUD2, 0, "AUDIO"); /* select 26M */
  757. disable_mux(MT_MUX_AUD2, "AUDIO");
  758. }
  759. #endif
  760. }
  761. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  762. }
  763. void AudDrv_Suspend_Clk_On(void)
  764. {
  765. unsigned long flags;
  766. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  767. if (Aud_Core_Clk_cntr > 0) {
  768. #ifdef PM_MANAGER_API
  769. if (Aud_AFE_Clk_cntr > 0) {
  770. if (enable_clock(MT_CG_AUDIO_AFE, "AUDIO"))
  771. PRINTK_AUD_ERROR("Aud enable_clock MT_CG_AUDIO_AFE fail !!!\n");
  772. }
  773. if (Aud_I2S_Clk_cntr > 0) {
  774. if (enable_clock(MT_CG_AUDIO_I2S, "AUDIO"))
  775. PRINTK_AUD_ERROR("enable_clock MT_CG_AUDIO_I2S fail\n");
  776. }
  777. if (Aud_ADC_Clk_cntr > 0)
  778. Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 24, 1 << 24);
  779. if (Aud_ADC2_Clk_cntr > 0) {
  780. #if 0 /* 6752 removed */
  781. if (enable_clock(MT_CG_AUDIO_ADDA2, "AUDIO"))
  782. PRINTK_AUD_CLK("%s fail", __func__);
  783. #endif
  784. }
  785. if (Aud_ADC3_Clk_cntr > 0) {
  786. #if 0 /* 6752 removed */
  787. if (enable_clock(MT_CG_AUDIO_ADDA3, "AUDIO"))
  788. PRINTK_AUD_CLK("%s fail", __func__);
  789. #endif
  790. }
  791. if (Aud_APLL22M_Clk_cntr > 0) {
  792. enable_mux(MT_MUX_AUD1, "AUDIO");
  793. clkmux_sel(MT_MUX_AUD1, 1, "AUDIO"); /* select APLL1 */
  794. if (enable_clock(MT_CG_AUDIO_22M, "AUDIO"))
  795. PRINTK_AUD_CLK("%s fail\n", __func__);
  796. if (enable_clock(MT_CG_AUDIO_APLL_TUNER, "AUDIO"))
  797. PRINTK_AUD_CLK("%s fail\n", __func__);
  798. }
  799. if (Aud_APLL24M_Clk_cntr > 0) {
  800. enable_mux(MT_MUX_AUD2, "AUDIO");
  801. clkmux_sel(MT_MUX_AUD2, 1, "AUDIO"); /* APLL2 */
  802. if (enable_clock(MT_CG_AUDIO_24M, "AUDIO"))
  803. PRINTK_AUD_CLK("%s fail\n", __func__);
  804. if (enable_clock(MT_CG_AUDIO_APLL2_TUNER, "AUDIO"))
  805. PRINTK_AUD_CLK("%s fail\n", __func__);
  806. }
  807. #endif
  808. }
  809. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  810. }
  811. void AudDrv_Emi_Clk_On(void)
  812. {
  813. pr_debug("+AudDrv_Emi_Clk_On, Aud_EMI_cntr:%d\n", Aud_EMI_cntr);
  814. mutex_lock(&auddrv_pmic_mutex);
  815. if (Aud_EMI_cntr == 0) {
  816. #ifndef CONFIG_FPGA_EARLY_PORTING /* george early porting disable */
  817. #ifdef _MT_IDLE_HEADER
  818. disable_dpidle_by_bit(MT_CG_AUDIO_AFE);
  819. disable_soidle_by_bit(MT_CG_AUDIO_AFE);
  820. #endif
  821. #endif
  822. }
  823. Aud_EMI_cntr++;
  824. mutex_unlock(&auddrv_pmic_mutex);
  825. }
  826. void AudDrv_Emi_Clk_Off(void)
  827. {
  828. pr_debug("+AudDrv_Emi_Clk_Off, Aud_EMI_cntr:%d\n", Aud_EMI_cntr);
  829. mutex_lock(&auddrv_pmic_mutex);
  830. Aud_EMI_cntr--;
  831. if (Aud_EMI_cntr == 0) {
  832. #ifndef CONFIG_FPGA_EARLY_PORTING /* george early porting disable */
  833. #ifdef _MT_IDLE_HEADER
  834. enable_dpidle_by_bit(MT_CG_AUDIO_AFE);
  835. enable_soidle_by_bit(MT_CG_AUDIO_AFE);
  836. #endif
  837. #endif
  838. }
  839. if (Aud_EMI_cntr < 0) {
  840. Aud_EMI_cntr = 0;
  841. pr_debug("Aud_EMI_cntr = %d\n", Aud_EMI_cntr);
  842. }
  843. mutex_unlock(&auddrv_pmic_mutex);
  844. }