AudDrv_Clk.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
  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. * MT6797 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 "AudDrv_Common.h"
  54. #include "AudDrv_Clk.h"
  55. #include "AudDrv_Afe.h"
  56. #include <linux/spinlock.h>
  57. #include <linux/delay.h>
  58. #ifdef _MT_IDLE_HEADER
  59. #include "mt_idle.h"
  60. #include "mt_clk_id.h"
  61. #endif
  62. #include <linux/err.h>
  63. #include <linux/platform_device.h>
  64. /* do not BUG on during FPGA or CCF not ready*/
  65. #ifdef CONFIG_FPGA_EARLY_PORTING
  66. #ifdef BUG
  67. #undef BUG
  68. #define BUG()
  69. #endif
  70. #endif
  71. /*****************************************************************************
  72. * D A T A T Y P E S
  73. *****************************************************************************/
  74. int Aud_Core_Clk_cntr = 0;
  75. int Aud_AFE_Clk_cntr = 0;
  76. int Aud_I2S_Clk_cntr = 0;
  77. int Aud_TDM_Clk_cntr = 0;
  78. int Aud_ADC_Clk_cntr = 0;
  79. int Aud_ADC2_Clk_cntr = 0;
  80. int Aud_ADC3_Clk_cntr = 0;
  81. int Aud_ADC_HIRES_Clk_cntr = 0;
  82. int Aud_ANA_Clk_cntr = 0;
  83. int Aud_HDMI_Clk_cntr = 0;
  84. int Aud_APLL22M_Clk_cntr = 0;
  85. int Aud_APLL24M_Clk_cntr = 0;
  86. int Aud_APLL1_Tuner_cntr = 0;
  87. int Aud_APLL2_Tuner_cntr = 0;
  88. static int Aud_EMI_cntr;
  89. int Aud_ANC_Clk_cntr = 0;
  90. static DEFINE_SPINLOCK(auddrv_Clk_lock);
  91. /* amp mutex lock */
  92. static DEFINE_MUTEX(auddrv_pmic_mutex);
  93. static DEFINE_MUTEX(audEMI_Clk_mutex);
  94. enum audio_system_clock_type {
  95. CLOCK_AFE = 0,
  96. /* CLOCK_I2S,*/
  97. CLOCK_DAC,
  98. CLOCK_DAC_PREDIS,
  99. CLOCK_ADC,
  100. CLOCK_TML,
  101. CLOCK_APLL22M,
  102. CLOCK_APLL24M,
  103. CLOCK_APLL1_TUNER,
  104. CLOCK_APLL2_TUNER,
  105. /* CLOCK_TDM,*/
  106. CLOCK_ADC_HIRES,
  107. CLOCK_ADC_HIRES_TML,
  108. CLOCK_SCP_SYS_AUD,
  109. CLOCK_INFRA_SYS_AUDIO,
  110. CLOCK_INFRA_SYS_AUDIO_26M,
  111. CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP,
  112. CLOCK_INFRA_ANC_MD32,
  113. CLOCK_INFRA_ANC_MD32_32K,
  114. CLOCK_TOP_AUD_MUX1,
  115. CLOCK_TOP_AUD_MUX2,
  116. CLOCK_TOP_AD_APLL1_CK,
  117. CLOCK_TOP_AD_APLL2_CK,
  118. CLOCK_MUX_AUDIOINTBUS,
  119. CLOCK_TOP_SYSPLL1_D4,
  120. CLOCK_TOP_MUX_ANC_MD32,
  121. CLOCK_TOP_SYSPLL1_D2,
  122. CLOCK_APMIXED_APLL1_CK,
  123. CLOCK_APMIXED_APLL2_CK,
  124. CLOCK_CLK26M,
  125. CLOCK_NUM
  126. };
  127. struct audio_clock_attr {
  128. const char *name;
  129. bool clk_prepare;
  130. bool clk_status;
  131. struct clk *clock;
  132. };
  133. static struct audio_clock_attr aud_clks[CLOCK_NUM] = {
  134. [CLOCK_AFE] = {"aud_afe_clk", false, false, NULL},
  135. /* [CLOCK_I2S] = {"aud_i2s_clk", false, false, NULL},*/ /* AudDrv_I2S_Clk_On, suspend */
  136. [CLOCK_DAC] = {"aud_dac_clk", false, false, NULL}, /* AudDrv_Clk_On only */
  137. [CLOCK_DAC_PREDIS] = {"aud_dac_predis_clk", false, false, NULL}, /* AudDrv_Clk_On only */
  138. [CLOCK_ADC] = {"aud_adc_clk", false, false, NULL}, /* AudDrv_ADC_Clk_On only */
  139. [CLOCK_TML] = {"aud_tml_clk", false, false, NULL}, /* NOT USED */
  140. [CLOCK_APLL22M] = {"aud_apll22m_clk", false, false, NULL},
  141. [CLOCK_APLL24M] = {"aud_apll24m_clk", false, false, NULL},
  142. [CLOCK_APLL1_TUNER] = {"aud_apll1_tuner_clk", false, false, NULL},
  143. [CLOCK_APLL2_TUNER] = {"aud_apll2_tuner_clk", false, false, NULL},
  144. /* [CLOCK_TDM] = {"aud_tdm_clk", false, false, NULL},*/
  145. [CLOCK_ADC_HIRES] = {"aud_adc_hires_clk", false, false, NULL}, /* use this clock when HIRES */
  146. [CLOCK_ADC_HIRES_TML] = {"aud_adc_hires_tml_clk", false, false, NULL}, /* use this clock when HIRES */
  147. [CLOCK_SCP_SYS_AUD] = {"scp_sys_audio", false, false, NULL},
  148. [CLOCK_INFRA_SYS_AUDIO] = {"aud_infra_clk", false, false, NULL},
  149. [CLOCK_INFRA_SYS_AUDIO_26M] = {"aud_infra_26m", false, false, NULL},
  150. [CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP] = {"aud_infra_26m_pad_top", false, false, NULL},
  151. [CLOCK_INFRA_ANC_MD32] = {"aud_infra_anc_md32", false, false, NULL},
  152. [CLOCK_INFRA_ANC_MD32_32K] = {"aud_infra_anc_md32_32k", false, false, NULL},
  153. [CLOCK_TOP_AUD_MUX1] = {"aud_mux1_clk", false, false, NULL}, /* select from 26 or apll1 */
  154. [CLOCK_TOP_AUD_MUX2] = {"aud_mux2_clk", false, false, NULL}, /* select from 26 or apll2 */
  155. [CLOCK_TOP_AD_APLL1_CK] = {"top_ad_apll1_clk", false, false, NULL}, /* parent of TOP_AUD_MUX1 */
  156. [CLOCK_TOP_AD_APLL2_CK] = {"top_ad_apll2_clk", false, false, NULL},
  157. [CLOCK_MUX_AUDIOINTBUS] = {"top_mux_audio_int", false, false, NULL}, /* AudDrv_AUDINTBUS_Sel */
  158. [CLOCK_TOP_SYSPLL1_D4] = {"top_sys_pll1_d4", false, false, NULL}, /* AudDrv_AUDINTBUS_Sel */
  159. [CLOCK_TOP_MUX_ANC_MD32] = {"top_mux_anc_md32", false, false, NULL},
  160. [CLOCK_TOP_SYSPLL1_D2] = {"top_sys_pll1_d2", false, false, NULL},
  161. [CLOCK_APMIXED_APLL1_CK] = {"apmixed_apll1_clk", false, false, NULL}, /* APLL rate */
  162. [CLOCK_APMIXED_APLL2_CK] = {"apmixed_apll2_clk", false, false, NULL}, /* APLL rate */
  163. [CLOCK_CLK26M] = {"top_clk26m_clk", false, false, NULL}
  164. };
  165. int AudDrv_Clk_probe(void *dev)
  166. {
  167. size_t i;
  168. int ret = 0;
  169. Aud_EMI_cntr = 0;
  170. pr_debug("%s\n", __func__);
  171. for (i = 0; i < ARRAY_SIZE(aud_clks); i++) {
  172. aud_clks[i].clock = devm_clk_get(dev, aud_clks[i].name);
  173. if (IS_ERR(aud_clks[i].clock)) {
  174. ret = PTR_ERR(aud_clks[i].clock);
  175. pr_err("%s devm_clk_get %s fail %d\n", __func__, aud_clks[i].name, ret);
  176. break;
  177. }
  178. aud_clks[i].clk_status = true;
  179. }
  180. if (ret)
  181. return ret;
  182. for (i = 0; i < ARRAY_SIZE(aud_clks); i++) {
  183. if (i == CLOCK_SCP_SYS_AUD) /* CLOCK_SCP_SYS_AUD is MTCMOS */
  184. continue;
  185. if (aud_clks[i].clk_status) {
  186. ret = clk_prepare(aud_clks[i].clock);
  187. if (ret) {
  188. pr_err("%s clk_prepare %s fail %d\n",
  189. __func__, aud_clks[i].name, ret);
  190. break;
  191. }
  192. aud_clks[i].clk_prepare = true;
  193. }
  194. }
  195. return ret;
  196. }
  197. void AudDrv_Clk_Deinit(void *dev)
  198. {
  199. size_t i;
  200. pr_debug("%s\n", __func__);
  201. for (i = 0; i < ARRAY_SIZE(aud_clks); i++) {
  202. if (i == CLOCK_SCP_SYS_AUD) /* CLOCK_SCP_SYS_AUD is MTCMOS */
  203. continue;
  204. if (aud_clks[i].clock && !IS_ERR(aud_clks[i].clock) && aud_clks[i].clk_prepare) {
  205. clk_unprepare(aud_clks[i].clock);
  206. aud_clks[i].clk_prepare = false;
  207. }
  208. }
  209. }
  210. void Auddrv_Bus_Init(void)
  211. {
  212. unsigned long flags;
  213. pr_debug("%s\n", __func__);
  214. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  215. Afe_Set_Reg(AUDIO_TOP_CON0, 0x00004000,
  216. 0x00004000); /* must set, system will default set bit14 to 0 */
  217. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  218. }
  219. /*****************************************************************************
  220. * FUNCTION
  221. * AudDrv_Clk_Power_On / AudDrv_Clk_Power_Off
  222. *
  223. * DESCRIPTION
  224. * Power on this function , then all register can be access and set.
  225. *
  226. *****************************************************************************
  227. */
  228. void AudDrv_Clk_Power_On(void)
  229. {
  230. /*volatile uint32 *AFE_Register = (volatile uint32 *)Get_Afe_Powertop_Pointer();*/
  231. volatile uint32 val_tmp;
  232. pr_debug("%s", __func__);
  233. val_tmp = 0x3330000d;
  234. /*mt_reg_sync_writel(val_tmp, AFE_Register);*/
  235. }
  236. void AudDrv_Clk_Power_Off(void)
  237. {
  238. }
  239. /*****************************************************************************
  240. * FUNCTION
  241. * AudDrv_Clk_On / AudDrv_Clk_Off
  242. *
  243. * DESCRIPTION
  244. * Enable/Disable PLL(26M clock) \ AFE clock
  245. *
  246. *****************************************************************************
  247. */
  248. void AudDrv_AUDINTBUS_Sel(int parentidx)
  249. {
  250. int ret = 0;
  251. if (parentidx == 1) {
  252. if (aud_clks[CLOCK_MUX_AUDIOINTBUS].clk_prepare) {
  253. ret = clk_enable(aud_clks[CLOCK_MUX_AUDIOINTBUS].clock);
  254. if (ret) {
  255. pr_err
  256. ("%s [CCF]Aud enable_clock enable_clock CLOCK_MUX_AUDIOINTBUS fail",
  257. __func__);
  258. BUG();
  259. goto EXIT;
  260. }
  261. } else {
  262. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_MUX_AUDIOINTBUS fail",
  263. __func__);
  264. BUG();
  265. goto EXIT;
  266. }
  267. ret = clk_set_parent(aud_clks[CLOCK_MUX_AUDIOINTBUS].clock,
  268. aud_clks[CLOCK_TOP_SYSPLL1_D4].clock);
  269. if (ret) {
  270. pr_err("%s clk_set_parent %s-%s fail %d\n",
  271. __func__, aud_clks[CLOCK_MUX_AUDIOINTBUS].name,
  272. aud_clks[CLOCK_TOP_SYSPLL1_D4].name, ret);
  273. BUG();
  274. goto EXIT;
  275. }
  276. } else if (parentidx == 0) {
  277. if (aud_clks[CLOCK_MUX_AUDIOINTBUS].clk_prepare) {
  278. ret = clk_enable(aud_clks[CLOCK_MUX_AUDIOINTBUS].clock);
  279. if (ret) {
  280. pr_err
  281. ("%s [CCF]Aud enable_clock enable_clock CLOCK_MUX_AUDIOINTBUS fail",
  282. __func__);
  283. BUG();
  284. goto EXIT;
  285. }
  286. } else {
  287. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_MUX_AUDIOINTBUS fail",
  288. __func__);
  289. BUG();
  290. goto EXIT;
  291. }
  292. ret = clk_set_parent(aud_clks[CLOCK_MUX_AUDIOINTBUS].clock,
  293. aud_clks[CLOCK_CLK26M].clock);
  294. if (ret) {
  295. pr_err("%s clk_set_parent %s-%s fail %d\n",
  296. __func__, aud_clks[CLOCK_MUX_AUDIOINTBUS].name,
  297. aud_clks[CLOCK_CLK26M].name, ret);
  298. BUG();
  299. goto EXIT;
  300. }
  301. }
  302. EXIT:
  303. pr_debug("-%s()\n", __func__);
  304. }
  305. void AudDrv_Clk_On(void)
  306. {
  307. unsigned long flags;
  308. int ret = 0;
  309. PRINTK_AUD_CLK("+AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  310. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  311. Aud_AFE_Clk_cntr++;
  312. if (Aud_AFE_Clk_cntr == 1) {
  313. pr_err("-----------AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  314. #ifdef PM_MANAGER_API
  315. pr_debug("-----------[CCF]AudDrv_Clk_On, aud_infra_clk:%d\n",
  316. aud_clks[CLOCK_INFRA_SYS_AUDIO].clk_prepare);
  317. if (aud_clks[CLOCK_INFRA_SYS_AUDIO].clk_prepare) {
  318. ret = clk_enable(aud_clks[CLOCK_INFRA_SYS_AUDIO].clock);
  319. if (ret) {
  320. pr_err("%s [CCF]Aud enable_clock %s fail\n", __func__,
  321. aud_clks[CLOCK_INFRA_SYS_AUDIO].name);
  322. BUG();
  323. goto EXIT;
  324. }
  325. } else {
  326. pr_err("%s [CCF]clk_prepare error Aud enable_clock MT_CG_INFRA_AUDIO fail\n",
  327. __func__);
  328. BUG();
  329. goto EXIT;
  330. }
  331. if (aud_clks[CLOCK_INFRA_SYS_AUDIO_26M].clk_prepare) {
  332. ret = clk_enable(aud_clks[CLOCK_INFRA_SYS_AUDIO_26M].clock);
  333. if (ret) {
  334. pr_err("%s [CCF]Aud enable_clock %s fail\n", __func__,
  335. aud_clks[CLOCK_INFRA_SYS_AUDIO_26M].name);
  336. BUG();
  337. goto EXIT;
  338. }
  339. } else {
  340. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_INFRA_SYS_AUDIO_26M fail\n",
  341. __func__);
  342. BUG();
  343. goto EXIT;
  344. }
  345. if (aud_clks[CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP].clk_prepare) {
  346. ret = clk_enable(aud_clks[CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP].clock);
  347. if (ret) {
  348. pr_err("%s [CCF]Aud enable_clock %s fail\n", __func__,
  349. aud_clks[CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP].name);
  350. BUG();
  351. goto EXIT;
  352. }
  353. } else {
  354. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP fail\n",
  355. __func__);
  356. BUG();
  357. goto EXIT;
  358. }
  359. if (aud_clks[CLOCK_AFE].clk_prepare) {
  360. ret = clk_enable(aud_clks[CLOCK_AFE].clock);
  361. if (ret) {
  362. pr_err("%s [CCF]Aud enable_clock %s fail\n", __func__,
  363. aud_clks[CLOCK_AFE].name);
  364. BUG();
  365. goto EXIT;
  366. }
  367. } else {
  368. pr_err("%s [CCF]clk_prepare error Aud enable_clock MT_CG_AUDIO_AFE fail\n",
  369. __func__);
  370. BUG();
  371. goto EXIT;
  372. }
  373. if (aud_clks[CLOCK_DAC].clk_prepare) {
  374. ret = clk_enable(aud_clks[CLOCK_DAC].clock);
  375. if (ret) {
  376. pr_err("%s [CCF]Aud enable_clock MT_CG_AUDIO_DAC fail\n", __func__);
  377. BUG();
  378. goto EXIT;
  379. }
  380. } else {
  381. pr_err("%s [CCF]clk_status error Aud enable_clock MT_CG_AUDIO_DAC fail\n",
  382. __func__);
  383. BUG();
  384. goto EXIT;
  385. }
  386. if (aud_clks[CLOCK_DAC_PREDIS].clk_prepare) {
  387. ret = clk_enable(aud_clks[CLOCK_DAC_PREDIS].clock);
  388. if (ret) {
  389. pr_err("%s [CCF]Aud enable_clock MT_CG_AUDIO_DAC_PREDIS fail\n",
  390. __func__);
  391. BUG();
  392. goto EXIT;
  393. }
  394. } else {
  395. pr_err
  396. ("%s [CCF]clk_status error Aud enable_clock MT_CG_AUDIO_DAC_PREDIS fail\n",
  397. __func__);
  398. BUG();
  399. goto EXIT;
  400. }
  401. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  402. /* CLOCK_SCP_SYS_AUD is MTCMOS */
  403. if (aud_clks[CLOCK_SCP_SYS_AUD].clk_status) {
  404. ret = clk_prepare_enable(aud_clks[CLOCK_SCP_SYS_AUD].clock);
  405. if (ret) {
  406. pr_err("%s [CCF]Aud clk_prepare_enable %s fail\n", __func__,
  407. aud_clks[CLOCK_SCP_SYS_AUD].name);
  408. BUG();
  409. goto EXIT_SKIP_UNLOCK;
  410. }
  411. }
  412. goto EXIT_SKIP_UNLOCK;
  413. #else
  414. SetInfraCfg(AUDIO_CG_CLR, 0x2000000, 0x2000000);
  415. /* bit 25=0, without 133m master and 66m slave bus clock cg gating */
  416. Afe_Set_Reg(AUDIO_TOP_CON0, 0x4000, 0x06004044);
  417. #endif
  418. }
  419. EXIT:
  420. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  421. EXIT_SKIP_UNLOCK:
  422. PRINTK_AUD_CLK("-AudDrv_Clk_On, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  423. }
  424. EXPORT_SYMBOL(AudDrv_Clk_On);
  425. void AudDrv_Clk_Off(void)
  426. {
  427. unsigned long flags;
  428. PRINTK_AUD_CLK("+!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  429. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  430. Aud_AFE_Clk_cntr--;
  431. if (Aud_AFE_Clk_cntr == 0) {
  432. pr_err("------------AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  433. {
  434. /* Disable AFE clock */
  435. #ifdef PM_MANAGER_API
  436. pr_debug("-----------[CCF]AudDrv_Clk_Off, paudclk->aud_infra_clk_prepare:%d\n",
  437. aud_clks[CLOCK_INFRA_SYS_AUDIO].clk_prepare);
  438. if (aud_clks[CLOCK_AFE].clk_prepare)
  439. clk_disable(aud_clks[CLOCK_AFE].clock);
  440. if (aud_clks[CLOCK_DAC].clk_prepare)
  441. clk_disable(aud_clks[CLOCK_DAC].clock);
  442. if (aud_clks[CLOCK_DAC_PREDIS].clk_prepare)
  443. clk_disable(aud_clks[CLOCK_DAC_PREDIS].clock);
  444. if (aud_clks[CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP].clk_prepare)
  445. clk_disable(aud_clks[CLOCK_INFRA_SYS_AUDIO_26M_PAD_TOP].clock);
  446. if (aud_clks[CLOCK_INFRA_SYS_AUDIO_26M].clk_prepare)
  447. clk_disable(aud_clks[CLOCK_INFRA_SYS_AUDIO_26M].clock);
  448. if (aud_clks[CLOCK_INFRA_SYS_AUDIO].clk_prepare)
  449. clk_disable(aud_clks[CLOCK_INFRA_SYS_AUDIO].clock);
  450. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  451. /* CLOCK_SCP_SYS_AUD is MTCMOS */
  452. if (aud_clks[CLOCK_SCP_SYS_AUD].clk_status)
  453. clk_disable_unprepare(aud_clks[CLOCK_SCP_SYS_AUD].clock);
  454. goto EXIT_SKIP_UNLOCK;
  455. #else
  456. Afe_Set_Reg(AUDIO_TOP_CON0, 0x06000044, 0x06000044);
  457. SetInfraCfg(AUDIO_CG_SET, 0x2000000, 0x2000000);
  458. /* bit25=1, with 133m mastesr and 66m slave bus clock cg gating */
  459. #endif
  460. }
  461. } else if (Aud_AFE_Clk_cntr < 0) {
  462. PRINTK_AUD_ERROR("!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr<0 (%d)\n",
  463. Aud_AFE_Clk_cntr);
  464. AUDIO_ASSERT(true);
  465. Aud_AFE_Clk_cntr = 0;
  466. }
  467. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  468. EXIT_SKIP_UNLOCK:
  469. PRINTK_AUD_CLK("-!! AudDrv_Clk_Off, Aud_AFE_Clk_cntr:%d\n", Aud_AFE_Clk_cntr);
  470. }
  471. EXPORT_SYMBOL(AudDrv_Clk_Off);
  472. /*****************************************************************************
  473. * FUNCTION
  474. * AudDrv_ANA_Clk_On / AudDrv_ANA_Clk_Off
  475. *
  476. * DESCRIPTION
  477. * Enable/Disable analog part clock
  478. *
  479. *****************************************************************************/
  480. void AudDrv_ANA_Clk_On(void)
  481. {
  482. mutex_lock(&auddrv_pmic_mutex);
  483. if (Aud_ANA_Clk_cntr == 0)
  484. PRINTK_AUD_CLK("+AudDrv_ANA_Clk_On, Aud_ANA_Clk_cntr:%d\n", Aud_ANA_Clk_cntr);
  485. Aud_ANA_Clk_cntr++;
  486. mutex_unlock(&auddrv_pmic_mutex);
  487. /* PRINTK_AUD_CLK("-AudDrv_ANA_Clk_Off, Aud_ANA_Clk_cntr:%d\n",Aud_ANA_Clk_cntr); */
  488. }
  489. EXPORT_SYMBOL(AudDrv_ANA_Clk_On);
  490. void AudDrv_ANA_Clk_Off(void)
  491. {
  492. /* PRINTK_AUD_CLK("+AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ANA_Clk_cntr); */
  493. mutex_lock(&auddrv_pmic_mutex);
  494. Aud_ANA_Clk_cntr--;
  495. if (Aud_ANA_Clk_cntr == 0) {
  496. PRINTK_AUD_CLK("+AudDrv_ANA_Clk_Off disable_clock Ana clk(%x)\n",
  497. Aud_ANA_Clk_cntr);
  498. /* Disable ADC clock */
  499. #ifdef PM_MANAGER_API
  500. #else
  501. /* TODO:: open ADC clock.... */
  502. #endif
  503. } else if (Aud_ANA_Clk_cntr < 0) {
  504. PRINTK_AUD_ERROR("!! AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr<0 (%d)\n",
  505. Aud_ANA_Clk_cntr);
  506. AUDIO_ASSERT(true);
  507. Aud_ANA_Clk_cntr = 0;
  508. }
  509. mutex_unlock(&auddrv_pmic_mutex);
  510. /* PRINTK_AUD_CLK("-AudDrv_ANA_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ANA_Clk_cntr); */
  511. }
  512. EXPORT_SYMBOL(AudDrv_ANA_Clk_Off);
  513. /*****************************************************************************
  514. * FUNCTION
  515. * AudDrv_ADC_Clk_On / AudDrv_ADC_Clk_Off
  516. *
  517. * DESCRIPTION
  518. * Enable/Disable analog part clock
  519. *
  520. *****************************************************************************/
  521. void AudDrv_ADC_Clk_On(void)
  522. {
  523. /* PRINTK_AUDDRV("+AudDrv_ADC_Clk_On, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr); */
  524. int ret = 0;
  525. mutex_lock(&auddrv_pmic_mutex);
  526. if (Aud_ADC_Clk_cntr == 0) {
  527. PRINTK_AUDDRV("+AudDrv_ADC_Clk_On enable_clock ADC clk(%x)\n",
  528. Aud_ADC_Clk_cntr);
  529. /* Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 24 , 1 << 24); */
  530. #ifdef PM_MANAGER_API
  531. if (aud_clks[CLOCK_ADC].clk_prepare) {
  532. ret = clk_enable(aud_clks[CLOCK_ADC].clock);
  533. if (ret) {
  534. pr_err("%s [CCF]Aud enable_clock enable_clock ADC fail", __func__);
  535. BUG();
  536. goto EXIT;
  537. }
  538. } else {
  539. pr_err("%s [CCF]clk_prepare error Aud enable_clock ADC fail", __func__);
  540. BUG();
  541. goto EXIT;
  542. }
  543. #else
  544. Afe_Set_Reg(AUDIO_TOP_CON0, 0 << 24, 1 << 24);
  545. #endif
  546. }
  547. Aud_ADC_Clk_cntr++;
  548. EXIT:
  549. mutex_unlock(&auddrv_pmic_mutex);
  550. }
  551. void AudDrv_ADC_Clk_Off(void)
  552. {
  553. /* PRINTK_AUDDRV("+AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr); */
  554. mutex_lock(&auddrv_pmic_mutex);
  555. Aud_ADC_Clk_cntr--;
  556. if (Aud_ADC_Clk_cntr == 0) {
  557. PRINTK_AUDDRV("+AudDrv_ADC_Clk_On disable_clock ADC clk(%x)\n",
  558. Aud_ADC_Clk_cntr);
  559. #ifdef PM_MANAGER_API
  560. if (aud_clks[CLOCK_ADC].clk_prepare)
  561. clk_disable(aud_clks[CLOCK_ADC].clock);
  562. #else
  563. Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 24, 1 << 24);
  564. #endif
  565. }
  566. if (Aud_ADC_Clk_cntr < 0) {
  567. PRINTK_AUDDRV("!! AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr<0 (%d)\n",
  568. Aud_ADC_Clk_cntr);
  569. Aud_ADC_Clk_cntr = 0;
  570. }
  571. mutex_unlock(&auddrv_pmic_mutex);
  572. /* PRINTK_AUDDRV("-AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr); */
  573. }
  574. /*****************************************************************************
  575. * FUNCTION
  576. * AudDrv_ADC2_Clk_On / AudDrv_ADC2_Clk_Off
  577. *
  578. * DESCRIPTION
  579. * Enable/Disable clock
  580. *
  581. *****************************************************************************/
  582. void AudDrv_ADC2_Clk_On(void)
  583. {
  584. PRINTK_AUD_CLK("+%s %d\n", __func__, Aud_ADC2_Clk_cntr);
  585. mutex_lock(&auddrv_pmic_mutex);
  586. if (Aud_ADC2_Clk_cntr == 0)
  587. PRINTK_AUDDRV("+%s enable_clock ADC2 clk(%x)\n", __func__, Aud_ADC2_Clk_cntr);
  588. Aud_ADC2_Clk_cntr++;
  589. mutex_unlock(&auddrv_pmic_mutex);
  590. }
  591. void AudDrv_ADC2_Clk_Off(void)
  592. {
  593. /* PRINTK_AUDDRV("+%s %d\n", __func__,Aud_ADC2_Clk_cntr); */
  594. mutex_lock(&auddrv_pmic_mutex);
  595. Aud_ADC2_Clk_cntr--;
  596. if (Aud_ADC2_Clk_cntr == 0)
  597. PRINTK_AUDDRV("+%s disable_clock ADC clk(%x)\n", __func__, Aud_ADC2_Clk_cntr);
  598. if (Aud_ADC2_Clk_cntr < 0) {
  599. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_ADC2_Clk_cntr);
  600. Aud_ADC2_Clk_cntr = 0;
  601. }
  602. mutex_unlock(&auddrv_pmic_mutex);
  603. /* PRINTK_AUDDRV("-AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr); */
  604. }
  605. /*****************************************************************************
  606. * FUNCTION
  607. * AudDrv_ADC3_Clk_On / AudDrv_ADC3_Clk_Off
  608. *
  609. * DESCRIPTION
  610. * Enable/Disable clock
  611. *
  612. *****************************************************************************/
  613. void AudDrv_ADC3_Clk_On(void)
  614. {
  615. PRINTK_AUD_CLK("+%s %d\n", __func__, Aud_ADC3_Clk_cntr);
  616. mutex_lock(&auddrv_pmic_mutex);
  617. if (Aud_ADC3_Clk_cntr == 0)
  618. PRINTK_AUDDRV("+%s enable_clock ADC clk(%x)\n", __func__, Aud_ADC3_Clk_cntr);
  619. Aud_ADC3_Clk_cntr++;
  620. mutex_unlock(&auddrv_pmic_mutex);
  621. }
  622. void AudDrv_ADC3_Clk_Off(void)
  623. {
  624. /* PRINTK_AUDDRV("+%s %d\n", __func__,Aud_ADC2_Clk_cntr); */
  625. mutex_lock(&auddrv_pmic_mutex);
  626. Aud_ADC3_Clk_cntr--;
  627. if (Aud_ADC3_Clk_cntr == 0)
  628. PRINTK_AUDDRV("+%s disable_clock ADC clk(%x)\n", __func__, Aud_ADC3_Clk_cntr);
  629. if (Aud_ADC3_Clk_cntr < 0) {
  630. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_ADC3_Clk_cntr);
  631. Aud_ADC3_Clk_cntr = 0;
  632. }
  633. mutex_unlock(&auddrv_pmic_mutex);
  634. /* PRINTK_AUDDRV("-AudDrv_ADC_Clk_Off, Aud_ADC_Clk_cntr:%d\n", Aud_ADC_Clk_cntr); */
  635. }
  636. /*****************************************************************************
  637. * FUNCTION
  638. * AudDrv_ADC_Hires_Clk_On / AudDrv_ADC_Hires_Clk_Off
  639. *
  640. * DESCRIPTION
  641. * Enable/Disable analog part clock
  642. *
  643. *****************************************************************************/
  644. void AudDrv_ADC_Hires_Clk_On(void)
  645. {
  646. int ret = 0;
  647. mutex_lock(&auddrv_pmic_mutex);
  648. if (Aud_ADC_HIRES_Clk_cntr == 0) {
  649. PRINTK_AUDDRV("+AudDrv_ADC_Hires_Clk_On enable_clock ADC clk(%x)\n",
  650. Aud_ADC_HIRES_Clk_cntr);
  651. #ifdef PM_MANAGER_API
  652. if (aud_clks[CLOCK_ADC_HIRES].clk_prepare) {
  653. ret = clk_enable(aud_clks[CLOCK_ADC_HIRES].clock);
  654. if (ret) {
  655. pr_err("%s [CCF]Aud enable_clock ADC_HIRES fail", __func__);
  656. BUG();
  657. goto EXIT;
  658. }
  659. } else {
  660. pr_err("%s [CCF]clk_prepare error ADC_HIRES fail", __func__);
  661. BUG();
  662. goto EXIT;
  663. }
  664. if (aud_clks[CLOCK_ADC_HIRES_TML].clk_prepare) {
  665. ret = clk_enable(aud_clks[CLOCK_ADC_HIRES_TML].clock);
  666. if (ret) {
  667. pr_err("%s [CCF]Aud enable_clock ADC_HIRES_TML fail", __func__);
  668. BUG();
  669. goto EXIT;
  670. }
  671. } else {
  672. pr_err("%s [CCF]clk_prepare error ADC_HIRES_TML fail", __func__);
  673. BUG();
  674. goto EXIT;
  675. }
  676. #else
  677. Afe_Set_Reg(AUDIO_TOP_CON1, 0 << 16, 1 << 16);
  678. Afe_Set_Reg(AUDIO_TOP_CON1, 0 << 17, 1 << 17);
  679. #endif
  680. }
  681. Aud_ADC_HIRES_Clk_cntr++;
  682. EXIT:
  683. mutex_unlock(&auddrv_pmic_mutex);
  684. }
  685. void AudDrv_ADC_Hires_Clk_Off(void)
  686. {
  687. mutex_lock(&auddrv_pmic_mutex);
  688. Aud_ADC_HIRES_Clk_cntr--;
  689. if (Aud_ADC_HIRES_Clk_cntr == 0) {
  690. PRINTK_AUDDRV("+AudDrv_ADC_Hires_Clk_Off disable_clock ADC_HIRES clk(%x)\n",
  691. Aud_ADC_HIRES_Clk_cntr);
  692. /* Afe_Set_Reg(AUDIO_TOP_CON0, 1 << 24 , 1 << 24); */
  693. #ifdef PM_MANAGER_API
  694. if (aud_clks[CLOCK_ADC_HIRES_TML].clk_prepare)
  695. clk_disable(aud_clks[CLOCK_ADC_HIRES_TML].clock);
  696. if (aud_clks[CLOCK_ADC_HIRES].clk_prepare)
  697. clk_disable(aud_clks[CLOCK_ADC_HIRES].clock);
  698. #else
  699. Afe_Set_Reg(AUDIO_TOP_CON1, 1 << 17, 1 << 17);
  700. Afe_Set_Reg(AUDIO_TOP_CON1, 1 << 16, 1 << 16);
  701. #endif
  702. }
  703. if (Aud_ADC_HIRES_Clk_cntr < 0) {
  704. PRINTK_AUDDRV("!! AudDrv_ADC_Hires_Clk_Off, Aud_ADC_Clk_cntr<0 (%d)\n",
  705. Aud_ADC_HIRES_Clk_cntr);
  706. Aud_ADC_HIRES_Clk_cntr = 0;
  707. }
  708. mutex_unlock(&auddrv_pmic_mutex);
  709. }
  710. /*****************************************************************************
  711. * FUNCTION
  712. * AudDrv_APLL22M_Clk_On / AudDrv_APLL22M_Clk_Off
  713. *
  714. * DESCRIPTION
  715. * Enable/Disable clock
  716. *
  717. *****************************************************************************/
  718. void AudDrv_APLL22M_Clk_On(void)
  719. {
  720. int ret = 0;
  721. pr_debug("+%s %d\n", __func__, Aud_APLL22M_Clk_cntr);
  722. mutex_lock(&auddrv_pmic_mutex);
  723. if (Aud_APLL22M_Clk_cntr == 0) {
  724. PRINTK_AUDDRV("+%s enable_clock ADC clk(%x)\n", __func__,
  725. Aud_APLL22M_Clk_cntr);
  726. #ifdef PM_MANAGER_API
  727. pr_debug("+%s enable_mux ADC\n", __func__);
  728. /* pdn_aud_1 => power down hf_faud_1_ck, hf_faud_1_ck is mux of 26M and APLL1_CK */
  729. /* pdn_aud_2 => power down hf_faud_2_ck, hf_faud_2_ck is mux of 26M and APLL2_CK (D1 is WHPLL) */
  730. if (aud_clks[CLOCK_TOP_AD_APLL1_CK].clk_prepare) {
  731. ret = clk_enable(aud_clks[CLOCK_TOP_AD_APLL1_CK].clock);
  732. if (ret) {
  733. pr_err
  734. ("%s [CCF]Aud enable_clock CLOCK_TOP_AD_APLL1_CK fail",
  735. __func__);
  736. BUG();
  737. goto EXIT;
  738. }
  739. } else {
  740. pr_err("%s [CCF]clk_prepare error Aud CLOCK_TOP_AD_APLL1_CK fail",
  741. __func__);
  742. BUG();
  743. goto EXIT;
  744. }
  745. if (aud_clks[CLOCK_TOP_AUD_MUX1].clk_prepare) {
  746. ret = clk_enable(aud_clks[CLOCK_TOP_AUD_MUX1].clock);
  747. if (ret) {
  748. pr_err
  749. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_AUD_MUX1 fail",
  750. __func__);
  751. BUG();
  752. goto EXIT;
  753. }
  754. } else {
  755. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_AUD_MUX1 fail",
  756. __func__);
  757. BUG();
  758. goto EXIT;
  759. }
  760. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX1].clock,
  761. aud_clks[CLOCK_TOP_AD_APLL1_CK].clock);
  762. if (ret) {
  763. pr_err("%s clk_set_parent %s-%s fail %d\n",
  764. __func__, aud_clks[CLOCK_TOP_AUD_MUX1].name,
  765. aud_clks[CLOCK_TOP_AD_APLL1_CK].name, ret);
  766. BUG();
  767. goto EXIT;
  768. }
  769. if (aud_clks[CLOCK_APMIXED_APLL1_CK].clk_prepare) {
  770. ret = clk_set_rate(aud_clks[CLOCK_APMIXED_APLL1_CK].clock, 180633600);
  771. if (ret) {
  772. pr_err("%s clk_set_rate %s-180633600 fail %d\n",
  773. __func__, aud_clks[CLOCK_APMIXED_APLL1_CK].name, ret);
  774. BUG();
  775. goto EXIT;
  776. }
  777. }
  778. if (aud_clks[CLOCK_APLL22M].clk_prepare) {
  779. ret = clk_enable(aud_clks[CLOCK_APLL22M].clock);
  780. if (ret) {
  781. pr_err("%s [CCF]Aud enable_clock enable_clock aud_apll22m_clk fail",
  782. __func__);
  783. BUG();
  784. goto EXIT;
  785. }
  786. } else {
  787. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll22m_clk fail",
  788. __func__);
  789. BUG();
  790. goto EXIT;
  791. }
  792. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare) {
  793. ret = clk_enable(aud_clks[CLOCK_APLL1_TUNER].clock);
  794. if (ret) {
  795. pr_err
  796. ("%s [CCF]Aud enable_clock enable_clock aud_apll1_tuner_clk fail",
  797. __func__);
  798. BUG();
  799. goto EXIT;
  800. }
  801. } else {
  802. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll1_tuner_clk fail",
  803. __func__);
  804. BUG();
  805. goto EXIT;
  806. }
  807. #endif
  808. }
  809. Aud_APLL22M_Clk_cntr++;
  810. EXIT:
  811. mutex_unlock(&auddrv_pmic_mutex);
  812. }
  813. void AudDrv_APLL22M_Clk_Off(void)
  814. {
  815. int ret = 0;
  816. pr_debug("+%s %d\n", __func__, Aud_APLL22M_Clk_cntr);
  817. mutex_lock(&auddrv_pmic_mutex);
  818. Aud_APLL22M_Clk_cntr--;
  819. if (Aud_APLL22M_Clk_cntr == 0) {
  820. PRINTK_AUDDRV("+%s disable_clock ADC clk(%x)\n", __func__,
  821. Aud_APLL22M_Clk_cntr);
  822. #ifdef PM_MANAGER_API
  823. if (aud_clks[CLOCK_APLL22M].clk_prepare)
  824. clk_disable(aud_clks[CLOCK_APLL22M].clock);
  825. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare)
  826. clk_disable(aud_clks[CLOCK_APLL1_TUNER].clock);
  827. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX1].clock,
  828. aud_clks[CLOCK_CLK26M].clock);
  829. if (ret) {
  830. pr_err("%s clk_set_parent %s-%s fail %d\n",
  831. __func__, aud_clks[CLOCK_TOP_AUD_MUX1].name,
  832. aud_clks[CLOCK_CLK26M].name, ret);
  833. BUG();
  834. goto EXIT;
  835. }
  836. if (aud_clks[CLOCK_TOP_AUD_MUX1].clk_prepare) {
  837. clk_disable(aud_clks[CLOCK_TOP_AUD_MUX1].clock);
  838. pr_debug("%s [CCF]Aud clk_disable CLOCK_TOP_AUD_MUX1",
  839. __func__);
  840. } else {
  841. pr_err
  842. ("%s [CCF]clk_prepare error clk_disable CLOCK_TOP_AUD_MUX1 fail",
  843. __func__);
  844. BUG();
  845. goto EXIT;
  846. }
  847. if (aud_clks[CLOCK_TOP_AD_APLL1_CK].clk_prepare) {
  848. clk_disable(aud_clks[CLOCK_TOP_AD_APLL1_CK].clock);
  849. pr_debug("%s [CCF]Aud clk_disable CLOCK_TOP_AD_APLL1_CK",
  850. __func__);
  851. } else {
  852. pr_err
  853. ("%s [CCF]clk_prepare error CLOCK_TOP_AD_APLL1_CK fail",
  854. __func__);
  855. BUG();
  856. goto EXIT;
  857. }
  858. #endif
  859. }
  860. EXIT:
  861. if (Aud_APLL22M_Clk_cntr < 0) {
  862. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_APLL22M_Clk_cntr);
  863. Aud_APLL22M_Clk_cntr = 0;
  864. }
  865. mutex_unlock(&auddrv_pmic_mutex);
  866. }
  867. /*****************************************************************************
  868. * FUNCTION
  869. * AudDrv_APLL24M_Clk_On / AudDrv_APLL24M_Clk_Off
  870. *
  871. * DESCRIPTION
  872. * Enable/Disable clock
  873. *
  874. *****************************************************************************/
  875. void AudDrv_APLL24M_Clk_On(void)
  876. {
  877. int ret = 0;
  878. pr_debug("+%s %d\n", __func__, Aud_APLL24M_Clk_cntr);
  879. mutex_lock(&auddrv_pmic_mutex);
  880. if (Aud_APLL24M_Clk_cntr == 0) {
  881. PRINTK_AUDDRV("+%s enable_clock ADC clk(%x)\n", __func__,
  882. Aud_APLL24M_Clk_cntr);
  883. #ifdef PM_MANAGER_API
  884. if (aud_clks[CLOCK_TOP_AD_APLL2_CK].clk_prepare) {
  885. ret = clk_enable(aud_clks[CLOCK_TOP_AD_APLL2_CK].clock);
  886. if (ret) {
  887. pr_err
  888. ("%s [CCF]Aud enable_clock CLOCK_TOP_AD_APLL2_CK fail",
  889. __func__);
  890. BUG();
  891. goto EXIT;
  892. }
  893. } else {
  894. pr_err("%s [CCF]clk_prepare error Aud CLOCK_TOP_AD_APLL2_CK fail",
  895. __func__);
  896. BUG();
  897. goto EXIT;
  898. }
  899. if (aud_clks[CLOCK_TOP_AUD_MUX2].clk_prepare) {
  900. ret = clk_enable(aud_clks[CLOCK_TOP_AUD_MUX2].clock);
  901. if (ret) {
  902. pr_err
  903. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_AUD_MUX2 fail",
  904. __func__);
  905. BUG();
  906. goto EXIT;
  907. }
  908. } else {
  909. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_AUD_MUX2 fail",
  910. __func__);
  911. BUG();
  912. goto EXIT;
  913. }
  914. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX2].clock,
  915. aud_clks[CLOCK_TOP_AD_APLL2_CK].clock);
  916. if (ret) {
  917. pr_err("%s clk_set_parent %s-%s fail %d\n",
  918. __func__, aud_clks[CLOCK_TOP_AUD_MUX2].name,
  919. aud_clks[CLOCK_TOP_AD_APLL2_CK].name, ret);
  920. BUG();
  921. goto EXIT;
  922. }
  923. if (aud_clks[CLOCK_APMIXED_APLL2_CK].clk_prepare) {
  924. ret = clk_set_rate(aud_clks[CLOCK_APMIXED_APLL2_CK].clock, 196607998);
  925. if (ret) {
  926. pr_err("%s clk_set_rate %s-196607998 fail %d\n",
  927. __func__, aud_clks[CLOCK_APMIXED_APLL2_CK].name, ret);
  928. BUG();
  929. goto EXIT;
  930. }
  931. }
  932. if (aud_clks[CLOCK_APLL24M].clk_prepare) {
  933. ret = clk_enable(aud_clks[CLOCK_APLL24M].clock);
  934. if (ret) {
  935. pr_err("%s [CCF]Aud enable_clock enable_clock aud_apll24m_clk fail",
  936. __func__);
  937. BUG();
  938. goto EXIT;
  939. }
  940. } else {
  941. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll24m_clk fail",
  942. __func__);
  943. BUG();
  944. goto EXIT;
  945. }
  946. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare) {
  947. ret = clk_enable(aud_clks[CLOCK_APLL2_TUNER].clock);
  948. if (ret) {
  949. pr_err
  950. ("%s [CCF]Aud enable_clock enable_clock aud_apll2_tuner_clk fail",
  951. __func__);
  952. BUG();
  953. goto EXIT;
  954. }
  955. } else {
  956. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll2_tuner_clk fail",
  957. __func__);
  958. BUG();
  959. goto EXIT;
  960. }
  961. #endif
  962. }
  963. Aud_APLL24M_Clk_cntr++;
  964. EXIT:
  965. mutex_unlock(&auddrv_pmic_mutex);
  966. }
  967. void AudDrv_APLL24M_Clk_Off(void)
  968. {
  969. int ret = 0;
  970. pr_debug("+%s %d\n", __func__, Aud_APLL24M_Clk_cntr);
  971. mutex_lock(&auddrv_pmic_mutex);
  972. Aud_APLL24M_Clk_cntr--;
  973. if (Aud_APLL24M_Clk_cntr == 0) {
  974. PRINTK_AUDDRV("+%s disable_clock ADC clk(%x)\n", __func__,
  975. Aud_APLL24M_Clk_cntr);
  976. #ifdef PM_MANAGER_API
  977. if (aud_clks[CLOCK_APLL24M].clk_prepare)
  978. clk_disable(aud_clks[CLOCK_APLL24M].clock);
  979. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare)
  980. clk_disable(aud_clks[CLOCK_APLL2_TUNER].clock);
  981. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX2].clock,
  982. aud_clks[CLOCK_CLK26M].clock);
  983. if (ret) {
  984. pr_err("%s clk_set_parent %s-%s fail %d\n",
  985. __func__, aud_clks[CLOCK_TOP_AUD_MUX2].name,
  986. aud_clks[CLOCK_CLK26M].name, ret);
  987. BUG();
  988. goto EXIT;
  989. }
  990. if (aud_clks[CLOCK_TOP_AUD_MUX2].clk_prepare) {
  991. clk_disable(aud_clks[CLOCK_TOP_AUD_MUX2].clock);
  992. pr_err("%s [CCF]Aud clk_disable CLOCK_TOP_AUD_MUX2 fail",
  993. __func__);
  994. } else {
  995. pr_err
  996. ("%s [CCF]clk_prepare error clk_disable CLOCK_TOP_AUD_MUX2 fail",
  997. __func__);
  998. BUG();
  999. goto EXIT;
  1000. }
  1001. if (aud_clks[CLOCK_TOP_AD_APLL2_CK].clk_prepare) {
  1002. clk_disable(aud_clks[CLOCK_TOP_AD_APLL2_CK].clock);
  1003. pr_debug("%s [CCF]Aud clk_disable CLOCK_TOP_AD_APLL2_CK fail",
  1004. __func__);
  1005. } else {
  1006. pr_err
  1007. ("%s [CCF]clk_prepare error CLOCK_TOP_AD_APLL2_CK fail",
  1008. __func__);
  1009. BUG();
  1010. goto EXIT;
  1011. }
  1012. #endif
  1013. }
  1014. EXIT:
  1015. if (Aud_APLL24M_Clk_cntr < 0) {
  1016. PRINTK_AUDDRV("%s <0 (%d)\n", __func__, Aud_APLL24M_Clk_cntr);
  1017. Aud_APLL24M_Clk_cntr = 0;
  1018. }
  1019. mutex_unlock(&auddrv_pmic_mutex);
  1020. }
  1021. /*****************************************************************************
  1022. * FUNCTION
  1023. * AudDrv_I2S_Clk_On / AudDrv_I2S_Clk_Off
  1024. *
  1025. * DESCRIPTION
  1026. * Enable I2S In clock (bck)
  1027. * This should be enabled in slave i2s mode.
  1028. *
  1029. *****************************************************************************/
  1030. void aud_top_con_pdn_i2s(bool _pdn)
  1031. {
  1032. if (_pdn)
  1033. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 6, 0x1 << 6); /* power off I2S clock */
  1034. else
  1035. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 6, 0x1 << 6); /* power on I2S clock */
  1036. }
  1037. void AudDrv_I2S_Clk_On(void)
  1038. {
  1039. unsigned long flags;
  1040. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1041. if (Aud_I2S_Clk_cntr == 0)
  1042. aud_top_con_pdn_i2s(false);
  1043. Aud_I2S_Clk_cntr++;
  1044. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1045. }
  1046. EXPORT_SYMBOL(AudDrv_I2S_Clk_On);
  1047. void AudDrv_I2S_Clk_Off(void)
  1048. {
  1049. unsigned long flags;
  1050. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1051. Aud_I2S_Clk_cntr--;
  1052. if (Aud_I2S_Clk_cntr == 0) {
  1053. aud_top_con_pdn_i2s(true);
  1054. } else if (Aud_I2S_Clk_cntr < 0) {
  1055. PRINTK_AUD_ERROR("!! AudDrv_I2S_Clk_Off, Aud_I2S_Clk_cntr<0 (%d)\n",
  1056. Aud_I2S_Clk_cntr);
  1057. AUDIO_ASSERT(true);
  1058. Aud_I2S_Clk_cntr = 0;
  1059. }
  1060. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1061. }
  1062. EXPORT_SYMBOL(AudDrv_I2S_Clk_Off);
  1063. /*****************************************************************************
  1064. * FUNCTION
  1065. * AudDrv_TDM_Clk_On / AudDrv_TDM_Clk_Off
  1066. *
  1067. * DESCRIPTION
  1068. * Enable/Disable TDM clock
  1069. *
  1070. *****************************************************************************/
  1071. void aud_top_con_pdn_tdm_ck(bool _pdn)
  1072. {
  1073. if (_pdn)
  1074. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 20, 0x1 << 20); /* power off I2S clock */
  1075. else
  1076. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 20, 0x1 << 20); /* power on I2S clock */
  1077. }
  1078. void AudDrv_TDM_Clk_On(void)
  1079. {
  1080. unsigned long flags;
  1081. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1082. if (Aud_TDM_Clk_cntr == 0)
  1083. aud_top_con_pdn_tdm_ck(false); /* enable HDMI CK */
  1084. Aud_TDM_Clk_cntr++;
  1085. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1086. }
  1087. EXPORT_SYMBOL(AudDrv_TDM_Clk_On);
  1088. void AudDrv_TDM_Clk_Off(void)
  1089. {
  1090. unsigned long flags;
  1091. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1092. Aud_TDM_Clk_cntr--;
  1093. if (Aud_TDM_Clk_cntr == 0) {
  1094. aud_top_con_pdn_tdm_ck(true); /* disable HDMI CK */
  1095. } else if (Aud_TDM_Clk_cntr < 0) {
  1096. PRINTK_AUD_ERROR("!! %s(), Aud_TDM_Clk_cntr<0 (%d)\n",
  1097. __func__, Aud_TDM_Clk_cntr);
  1098. AUDIO_ASSERT(true);
  1099. Aud_TDM_Clk_cntr = 0;
  1100. }
  1101. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1102. }
  1103. EXPORT_SYMBOL(AudDrv_TDM_Clk_Off);
  1104. /*****************************************************************************
  1105. * FUNCTION
  1106. * AudDrv_Core_Clk_On / AudDrv_Core_Clk_Off
  1107. *
  1108. * DESCRIPTION
  1109. * Enable/Disable analog part clock
  1110. *
  1111. *****************************************************************************/
  1112. void AudDrv_Core_Clk_On(void)
  1113. {
  1114. /* PRINTK_AUD_CLK("+AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr); */
  1115. unsigned long flags;
  1116. int ret = 0;
  1117. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1118. if (Aud_Core_Clk_cntr == 0) {
  1119. #ifdef PM_MANAGER_API
  1120. if (aud_clks[CLOCK_AFE].clk_prepare) {
  1121. ret = clk_enable(aud_clks[CLOCK_AFE].clock);
  1122. if (ret) {
  1123. pr_err("%s [CCF]Aud enable_clock enable_clock aud_afe_clk fail",
  1124. __func__);
  1125. BUG();
  1126. goto EXIT;
  1127. }
  1128. } else {
  1129. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_afe_clk fail",
  1130. __func__);
  1131. BUG();
  1132. goto EXIT;
  1133. }
  1134. #endif
  1135. }
  1136. Aud_Core_Clk_cntr++;
  1137. EXIT:
  1138. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1139. /* PRINTK_AUD_CLK("-AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr); */
  1140. }
  1141. void AudDrv_Core_Clk_Off(void)
  1142. {
  1143. /* PRINTK_AUD_CLK("+AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr); */
  1144. unsigned long flags;
  1145. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1146. if (Aud_Core_Clk_cntr == 0) {
  1147. #ifdef PM_MANAGER_API
  1148. if (aud_clks[CLOCK_AFE].clk_prepare)
  1149. clk_disable(aud_clks[CLOCK_AFE].clock);
  1150. #endif
  1151. }
  1152. Aud_Core_Clk_cntr++;
  1153. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1154. /* PRINTK_AUD_CLK("-AudDrv_Core_Clk_On, Aud_Core_Clk_cntr:%d\n", Aud_Core_Clk_cntr); */
  1155. }
  1156. void AudDrv_APLL1Tuner_Clk_On(void)
  1157. {
  1158. unsigned long flags;
  1159. #ifndef CONFIG_MTK_CLKMGR
  1160. int ret = 0;
  1161. #endif
  1162. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1163. if (Aud_APLL1_Tuner_cntr == 0) {
  1164. PRINTK_AUD_CLK("+AudDrv_APLLTuner_Clk_On, Aud_APLL1_Tuner_cntr:%d\n",
  1165. Aud_APLL1_Tuner_cntr);
  1166. #ifdef CONFIG_MTK_CLKMGR
  1167. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 19, 0x1 << 19);
  1168. #else
  1169. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare) {
  1170. ret = clk_enable(aud_clks[CLOCK_APLL1_TUNER].clock);
  1171. if (ret) {
  1172. pr_err
  1173. ("%s [CCF]Aud enable_clock enable_clock aud_apll1_tuner_clk fail",
  1174. __func__);
  1175. BUG();
  1176. goto EXIT;
  1177. }
  1178. } else {
  1179. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll1_tuner_clk fail",
  1180. __func__);
  1181. BUG();
  1182. goto EXIT;
  1183. }
  1184. #endif
  1185. }
  1186. Aud_APLL1_Tuner_cntr++;
  1187. EXIT:
  1188. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1189. }
  1190. void AudDrv_APLL1Tuner_Clk_Off(void)
  1191. {
  1192. unsigned long flags;
  1193. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1194. Aud_APLL1_Tuner_cntr--;
  1195. if (Aud_APLL1_Tuner_cntr == 0) {
  1196. #ifdef CONFIG_MTK_CLKMGR
  1197. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 19, 0x1 << 19);
  1198. /*Afe_Set_Reg(AFE_APLL1_TUNER_CFG, 0x00000033, 0x1 << 19);*/
  1199. #else
  1200. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare)
  1201. clk_disable(aud_clks[CLOCK_APLL1_TUNER].clock);
  1202. #endif
  1203. }
  1204. /* handle for clock error */
  1205. else if (Aud_APLL1_Tuner_cntr < 0) {
  1206. PRINTK_AUD_ERROR("!! AudDrv_APLLTuner_Clk_Off, Aud_APLL1_Tuner_cntr<0 (%d)\n",
  1207. Aud_APLL1_Tuner_cntr);
  1208. Aud_APLL1_Tuner_cntr = 0;
  1209. }
  1210. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1211. }
  1212. void AudDrv_APLL2Tuner_Clk_On(void)
  1213. {
  1214. unsigned long flags;
  1215. #ifndef CONFIG_MTK_CLKMGR
  1216. int ret = 0;
  1217. #endif
  1218. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1219. if (Aud_APLL2_Tuner_cntr == 0) {
  1220. PRINTK_AUD_CLK("+Aud_APLL2_Tuner_cntr, Aud_APLL2_Tuner_cntr:%d\n",
  1221. Aud_APLL2_Tuner_cntr);
  1222. #ifdef CONFIG_MTK_CLKMGR
  1223. Afe_Set_Reg(AUDIO_TOP_CON0, 0x0 << 18, 0x1 << 18);
  1224. /*Afe_Set_Reg(AFE_APLL2_TUNER_CFG, 0x00000033, 0x1 << 19);*/
  1225. #else
  1226. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare) {
  1227. ret = clk_enable(aud_clks[CLOCK_APLL2_TUNER].clock);
  1228. if (ret) {
  1229. pr_err
  1230. ("%s [CCF]Aud enable_clock enable_clock aud_apll2_tuner_clk fail",
  1231. __func__);
  1232. BUG();
  1233. goto EXIT;
  1234. }
  1235. } else {
  1236. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_apll2_tuner_clk fail",
  1237. __func__);
  1238. BUG();
  1239. goto EXIT;
  1240. }
  1241. #endif
  1242. }
  1243. Aud_APLL2_Tuner_cntr++;
  1244. EXIT:
  1245. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1246. }
  1247. void AudDrv_APLL2Tuner_Clk_Off(void)
  1248. {
  1249. unsigned long flags;
  1250. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1251. Aud_APLL2_Tuner_cntr--;
  1252. if (Aud_APLL2_Tuner_cntr == 0) {
  1253. #ifdef CONFIG_MTK_CLKMGR
  1254. Afe_Set_Reg(AUDIO_TOP_CON0, 0x1 << 18, 0x1 << 18);
  1255. #else
  1256. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare)
  1257. clk_disable(aud_clks[CLOCK_APLL2_TUNER].clock);
  1258. #endif
  1259. pr_debug("AudDrv_APLL2Tuner_Clk_Off\n");
  1260. }
  1261. /* handle for clock error */
  1262. else if (Aud_APLL2_Tuner_cntr < 0) {
  1263. PRINTK_AUD_ERROR("!! AudDrv_APLL2Tuner_Clk_Off, Aud_APLL1_Tuner_cntr<0 (%d)\n",
  1264. Aud_APLL2_Tuner_cntr);
  1265. Aud_APLL2_Tuner_cntr = 0;
  1266. }
  1267. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1268. }
  1269. /*****************************************************************************
  1270. * FUNCTION
  1271. * AudDrv_HDMI_Clk_On / AudDrv_HDMI_Clk_Off
  1272. *
  1273. * DESCRIPTION
  1274. * Enable/Disable analog part clock
  1275. *
  1276. *****************************************************************************/
  1277. void AudDrv_HDMI_Clk_On(void)
  1278. {
  1279. PRINTK_AUD_CLK("+AudDrv_HDMI_Clk_On, Aud_I2S_Clk_cntr:%d\n", Aud_HDMI_Clk_cntr);
  1280. if (Aud_HDMI_Clk_cntr == 0) {
  1281. AudDrv_ANA_Clk_On();
  1282. AudDrv_Clk_On();
  1283. }
  1284. Aud_HDMI_Clk_cntr++;
  1285. }
  1286. void AudDrv_HDMI_Clk_Off(void)
  1287. {
  1288. PRINTK_AUD_CLK("+AudDrv_HDMI_Clk_Off, Aud_I2S_Clk_cntr:%d\n",
  1289. Aud_HDMI_Clk_cntr);
  1290. Aud_HDMI_Clk_cntr--;
  1291. if (Aud_HDMI_Clk_cntr == 0) {
  1292. AudDrv_ANA_Clk_Off();
  1293. AudDrv_Clk_Off();
  1294. } else if (Aud_HDMI_Clk_cntr < 0) {
  1295. PRINTK_AUD_ERROR("!! AudDrv_Linein_Clk_Off, Aud_I2S_Clk_cntr<0 (%d)\n",
  1296. Aud_HDMI_Clk_cntr);
  1297. AUDIO_ASSERT(true);
  1298. Aud_HDMI_Clk_cntr = 0;
  1299. }
  1300. PRINTK_AUD_CLK("-AudDrv_I2S_Clk_Off, Aud_I2S_Clk_cntr:%d\n", Aud_HDMI_Clk_cntr);
  1301. }
  1302. /*****************************************************************************
  1303. * FUNCTION
  1304. * AudDrv_Suspend_Clk_Off / AudDrv_Suspend_Clk_On
  1305. *
  1306. * DESCRIPTION
  1307. * Enable/Disable AFE clock for suspend
  1308. *
  1309. *****************************************************************************
  1310. */
  1311. void AudDrv_Suspend_Clk_Off(void)
  1312. {
  1313. unsigned long flags;
  1314. int ret = 0;
  1315. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1316. if (Aud_Core_Clk_cntr > 0) {
  1317. if (Aud_I2S_Clk_cntr > 0)
  1318. aud_top_con_pdn_i2s(true);
  1319. if (Aud_TDM_Clk_cntr > 0)
  1320. aud_top_con_pdn_tdm_ck(true);
  1321. if (Aud_ADC_Clk_cntr > 0) {
  1322. if (aud_clks[CLOCK_ADC].clk_prepare)
  1323. clk_disable(aud_clks[CLOCK_ADC].clock);
  1324. }
  1325. if (Aud_APLL22M_Clk_cntr > 0) {
  1326. if (aud_clks[CLOCK_APLL22M].clk_prepare)
  1327. clk_disable(aud_clks[CLOCK_APLL22M].clock);
  1328. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare)
  1329. clk_disable(aud_clks[CLOCK_APLL1_TUNER].clock);
  1330. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX1].clock,
  1331. aud_clks[CLOCK_CLK26M].clock);
  1332. if (ret) {
  1333. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1334. __func__, aud_clks[CLOCK_TOP_AUD_MUX1].name,
  1335. aud_clks[CLOCK_CLK26M].name, ret);
  1336. BUG();
  1337. goto EXIT;
  1338. }
  1339. if (aud_clks[CLOCK_TOP_AUD_MUX1].clk_prepare) {
  1340. clk_disable(aud_clks[CLOCK_TOP_AUD_MUX1].clock);
  1341. pr_debug("%s [CCF]Aud clk_disable CLOCK_TOP_AUD_MUX1 fail",
  1342. __func__);
  1343. } else {
  1344. pr_err
  1345. ("%s [CCF]clk_prepare error clk_disable CLOCK_TOP_AUD_MUX1 fail",
  1346. __func__);
  1347. BUG();
  1348. goto EXIT;
  1349. }
  1350. }
  1351. if (Aud_APLL24M_Clk_cntr > 0) {
  1352. if (aud_clks[CLOCK_APLL24M].clk_prepare)
  1353. clk_disable(aud_clks[CLOCK_APLL24M].clock);
  1354. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare)
  1355. clk_disable(aud_clks[CLOCK_APLL2_TUNER].clock);
  1356. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX2].clock,
  1357. aud_clks[CLOCK_CLK26M].clock);
  1358. if (ret) {
  1359. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1360. __func__, aud_clks[CLOCK_TOP_AUD_MUX2].name,
  1361. aud_clks[CLOCK_CLK26M].name, ret);
  1362. BUG();
  1363. goto EXIT;
  1364. }
  1365. if (aud_clks[CLOCK_TOP_AUD_MUX2].clk_prepare) {
  1366. clk_disable(aud_clks[CLOCK_TOP_AUD_MUX2].clock);
  1367. pr_debug("%s [CCF]Aud clk_disable CLOCK_TOP_AUD_MUX2 fail",
  1368. __func__);
  1369. } else {
  1370. pr_err
  1371. ("%s [CCF]clk_prepare error clk_disable CLOCK_TOP_AUD_MUX2 fail",
  1372. __func__);
  1373. BUG();
  1374. goto EXIT;
  1375. }
  1376. }
  1377. if (Aud_AFE_Clk_cntr > 0) {
  1378. if (aud_clks[CLOCK_AFE].clk_prepare)
  1379. clk_disable(aud_clks[CLOCK_AFE].clock);
  1380. }
  1381. }
  1382. EXIT:
  1383. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1384. }
  1385. void AudDrv_Suspend_Clk_On(void)
  1386. {
  1387. unsigned long flags;
  1388. int ret = 0;
  1389. spin_lock_irqsave(&auddrv_Clk_lock, flags);
  1390. if (Aud_Core_Clk_cntr > 0) {
  1391. if (aud_clks[CLOCK_AFE].clk_prepare) {
  1392. ret = clk_enable(aud_clks[CLOCK_AFE].clock);
  1393. if (ret) {
  1394. pr_err("%s [CCF]Aud enable_clock enable_clock aud_afe_clk fail",
  1395. __func__);
  1396. BUG();
  1397. goto EXIT;
  1398. }
  1399. } else {
  1400. pr_err("%s [CCF]clk_prepare error Aud enable_clock aud_afe_clk fail",
  1401. __func__);
  1402. BUG();
  1403. goto EXIT;
  1404. }
  1405. if (Aud_APLL22M_Clk_cntr > 0) {
  1406. if (aud_clks[CLOCK_TOP_AUD_MUX1].clk_prepare) {
  1407. ret = clk_enable(aud_clks[CLOCK_TOP_AUD_MUX1].clock);
  1408. if (ret) {
  1409. pr_err
  1410. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_AUD_MUX1 fail",
  1411. __func__);
  1412. BUG();
  1413. goto EXIT;
  1414. }
  1415. } else {
  1416. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_AUD_MUX1 fail",
  1417. __func__);
  1418. BUG();
  1419. goto EXIT;
  1420. }
  1421. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX1].clock,
  1422. aud_clks[CLOCK_TOP_AD_APLL1_CK].clock);
  1423. if (ret) {
  1424. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1425. __func__, aud_clks[CLOCK_TOP_AUD_MUX1].name,
  1426. aud_clks[CLOCK_TOP_AD_APLL1_CK].name, ret);
  1427. BUG();
  1428. goto EXIT;
  1429. }
  1430. /*
  1431. if (aud_clks[CLOCK_APMIXED_APLL1_CK].clk_prepare) {
  1432. ret = clk_set_rate(aud_clks[CLOCK_APMIXED_APLL1_CK].clock, 180633600);
  1433. if (ret) {
  1434. pr_err("%s clk_set_rate %s-180633600 fail %d\n",
  1435. __func__, aud_clks[CLOCK_APMIXED_APLL1_CK].name, ret);
  1436. BUG();
  1437. goto EXIT;
  1438. }
  1439. }
  1440. */
  1441. if (aud_clks[CLOCK_APLL22M].clk_prepare) {
  1442. ret = clk_enable(aud_clks[CLOCK_APLL22M].clock);
  1443. if (ret) {
  1444. pr_err
  1445. ("%s [CCF]Aud enable_clock enable_clock aud_apll22m_clk fail",
  1446. __func__);
  1447. BUG();
  1448. goto EXIT;
  1449. }
  1450. } else {
  1451. pr_err
  1452. ("%s [CCF]clk_prepare error Aud enable_clock aud_apll22m_clk fail",
  1453. __func__);
  1454. BUG();
  1455. goto EXIT;
  1456. }
  1457. if (aud_clks[CLOCK_APLL1_TUNER].clk_prepare) {
  1458. ret = clk_enable(aud_clks[CLOCK_APLL1_TUNER].clock);
  1459. if (ret) {
  1460. pr_err
  1461. ("%s [CCF]Aud enable_clock enable_clock aud_apll1_tuner_clk fail",
  1462. __func__);
  1463. BUG();
  1464. goto EXIT;
  1465. }
  1466. } else {
  1467. pr_err
  1468. ("%s [CCF]clk_prepare error Aud enable_clock aud_apll1_tuner_clk fail",
  1469. __func__);
  1470. BUG();
  1471. goto EXIT;
  1472. }
  1473. }
  1474. if (Aud_APLL24M_Clk_cntr > 0) {
  1475. if (aud_clks[CLOCK_TOP_AUD_MUX2].clk_prepare) {
  1476. ret = clk_enable(aud_clks[CLOCK_TOP_AUD_MUX2].clock);
  1477. if (ret) {
  1478. pr_err
  1479. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_AUD_MUX2 fail",
  1480. __func__);
  1481. BUG();
  1482. goto EXIT;
  1483. }
  1484. } else {
  1485. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_AUD_MUX2 fail",
  1486. __func__);
  1487. BUG();
  1488. goto EXIT;
  1489. }
  1490. ret = clk_set_parent(aud_clks[CLOCK_TOP_AUD_MUX2].clock,
  1491. aud_clks[CLOCK_TOP_AD_APLL2_CK].clock);
  1492. if (ret) {
  1493. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1494. __func__, aud_clks[CLOCK_TOP_AUD_MUX2].name,
  1495. aud_clks[CLOCK_TOP_AD_APLL2_CK].name, ret);
  1496. BUG();
  1497. goto EXIT;
  1498. }
  1499. /*
  1500. if (aud_clks[CLOCK_APMIXED_APLL2_CK].clk_prepare) {
  1501. ret = clk_set_rate(aud_clks[CLOCK_APMIXED_APLL2_CK].clock, 196607998);
  1502. if (ret) {
  1503. pr_err("%s clk_set_rate %s-196607998 fail %d\n",
  1504. __func__, aud_clks[CLOCK_APMIXED_APLL2_CK].name, ret);
  1505. BUG();
  1506. goto EXIT;
  1507. }
  1508. }
  1509. */
  1510. if (aud_clks[CLOCK_APLL24M].clk_prepare) {
  1511. ret = clk_enable(aud_clks[CLOCK_APLL24M].clock);
  1512. if (ret) {
  1513. pr_err
  1514. ("%s [CCF]Aud enable_clock enable_clock aud_apll24m_clk fail",
  1515. __func__);
  1516. BUG();
  1517. goto EXIT;
  1518. }
  1519. } else {
  1520. pr_err
  1521. ("%s [CCF]clk_prepare error Aud enable_clock aud_apll24m_clk fail",
  1522. __func__);
  1523. BUG();
  1524. goto EXIT;
  1525. }
  1526. if (aud_clks[CLOCK_APLL2_TUNER].clk_prepare) {
  1527. ret = clk_enable(aud_clks[CLOCK_APLL2_TUNER].clock);
  1528. if (ret) {
  1529. pr_err
  1530. ("%s [CCF]Aud enable_clock enable_clock aud_apll2_tuner_clk fail",
  1531. __func__);
  1532. BUG();
  1533. goto EXIT;
  1534. }
  1535. } else {
  1536. pr_err
  1537. ("%s [CCF]clk_prepare error Aud enable_clock aud_apll2_tuner_clk fail",
  1538. __func__);
  1539. BUG();
  1540. goto EXIT;
  1541. }
  1542. }
  1543. if (Aud_I2S_Clk_cntr > 0)
  1544. aud_top_con_pdn_i2s(false);
  1545. if (Aud_TDM_Clk_cntr > 0)
  1546. aud_top_con_pdn_tdm_ck(false);
  1547. if (Aud_ADC_Clk_cntr > 0) {
  1548. if (aud_clks[CLOCK_ADC].clk_prepare) {
  1549. ret = clk_enable(aud_clks[CLOCK_ADC].clock);
  1550. if (ret) {
  1551. pr_err("%s [CCF]Aud enable_clock enable_clock ADC fail", __func__);
  1552. BUG();
  1553. goto EXIT;
  1554. }
  1555. } else {
  1556. pr_err("%s [CCF]clk_prepare error Aud enable_clock ADC fail", __func__);
  1557. BUG();
  1558. goto EXIT;
  1559. }
  1560. }
  1561. }
  1562. EXIT:
  1563. spin_unlock_irqrestore(&auddrv_Clk_lock, flags);
  1564. }
  1565. void AudDrv_Emi_Clk_On(void)
  1566. {
  1567. mutex_lock(&auddrv_pmic_mutex);
  1568. if (Aud_EMI_cntr == 0) {
  1569. #ifndef CONFIG_FPGA_EARLY_PORTING
  1570. #ifdef _MT_IDLE_HEADER
  1571. disable_dpidle_by_bit(MT_CG_AUDIO_AFE);
  1572. disable_soidle_by_bit(MT_CG_AUDIO_AFE);
  1573. #endif
  1574. #endif
  1575. }
  1576. Aud_EMI_cntr++;
  1577. mutex_unlock(&auddrv_pmic_mutex);
  1578. }
  1579. void AudDrv_Emi_Clk_Off(void)
  1580. {
  1581. mutex_lock(&auddrv_pmic_mutex);
  1582. Aud_EMI_cntr--;
  1583. if (Aud_EMI_cntr == 0) {
  1584. #ifndef CONFIG_FPGA_EARLY_PORTING
  1585. #ifdef _MT_IDLE_HEADER
  1586. enable_dpidle_by_bit(MT_CG_AUDIO_AFE);
  1587. enable_soidle_by_bit(MT_CG_AUDIO_AFE);
  1588. #endif
  1589. #endif
  1590. }
  1591. if (Aud_EMI_cntr < 0) {
  1592. Aud_EMI_cntr = 0;
  1593. pr_debug("Aud_EMI_cntr = %d\n", Aud_EMI_cntr);
  1594. }
  1595. mutex_unlock(&auddrv_pmic_mutex);
  1596. }
  1597. /*****************************************************************************
  1598. * FUNCTION
  1599. * AudDrv_ANC_Clk_On / AudDrv_ANC_Clk_Off
  1600. *
  1601. * DESCRIPTION
  1602. * Enable/Disable ANC clock
  1603. *
  1604. *****************************************************************************/
  1605. void AudDrv_ANC_Clk_On(void)
  1606. {
  1607. int ret = 0;
  1608. mutex_lock(&auddrv_pmic_mutex);
  1609. if (Aud_ANC_Clk_cntr == 0) {
  1610. PRINTK_AUDDRV("+%s() Aud_ANC_Clk_cntr(%x)\n",
  1611. __func__,
  1612. Aud_ANC_Clk_cntr);
  1613. if (aud_clks[CLOCK_INFRA_ANC_MD32].clk_prepare) {
  1614. ret = clk_enable(aud_clks[CLOCK_INFRA_ANC_MD32].clock);
  1615. if (ret) {
  1616. pr_err("%s [CCF]Aud enable_clock enable_clock %s fail",
  1617. __func__,
  1618. aud_clks[CLOCK_INFRA_ANC_MD32].name);
  1619. BUG();
  1620. goto EXIT;
  1621. }
  1622. } else {
  1623. pr_err("%s [CCF]clk_prepare error enable_clock %s fail",
  1624. __func__,
  1625. aud_clks[CLOCK_INFRA_ANC_MD32].name);
  1626. BUG();
  1627. goto EXIT;
  1628. }
  1629. if (aud_clks[CLOCK_INFRA_ANC_MD32_32K].clk_prepare) {
  1630. ret = clk_enable(aud_clks[CLOCK_INFRA_ANC_MD32_32K].clock);
  1631. if (ret) {
  1632. pr_err("%s [CCF]Aud enable_clock enable_clock %s fail",
  1633. __func__,
  1634. aud_clks[CLOCK_INFRA_ANC_MD32_32K].name);
  1635. BUG();
  1636. goto EXIT;
  1637. }
  1638. } else {
  1639. pr_err("%s [CCF]clk_prepare error enable_clock %s fail",
  1640. __func__,
  1641. aud_clks[CLOCK_INFRA_ANC_MD32_32K].name);
  1642. BUG();
  1643. goto EXIT;
  1644. }
  1645. /* ANC_MD32 TOP CLOCK MUX SELECT SYSPLL1_D2*/
  1646. if (aud_clks[CLOCK_TOP_MUX_ANC_MD32].clk_prepare) {
  1647. ret = clk_enable(aud_clks[CLOCK_TOP_MUX_ANC_MD32].clock);
  1648. if (ret) {
  1649. pr_err
  1650. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_MUX_ANC_MD32 fail",
  1651. __func__);
  1652. BUG();
  1653. goto EXIT;
  1654. }
  1655. } else {
  1656. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_MUX_ANC_MD32 fail",
  1657. __func__);
  1658. BUG();
  1659. goto EXIT;
  1660. }
  1661. ret = clk_set_parent(aud_clks[CLOCK_TOP_MUX_ANC_MD32].clock,
  1662. aud_clks[CLOCK_TOP_SYSPLL1_D2].clock);
  1663. if (ret) {
  1664. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1665. __func__, aud_clks[CLOCK_TOP_MUX_ANC_MD32].name,
  1666. aud_clks[CLOCK_TOP_SYSPLL1_D2].name, ret);
  1667. BUG();
  1668. goto EXIT;
  1669. }
  1670. }
  1671. Aud_ANC_Clk_cntr++;
  1672. EXIT:
  1673. mutex_unlock(&auddrv_pmic_mutex);
  1674. }
  1675. void AudDrv_ANC_Clk_Off(void)
  1676. {
  1677. int ret = 0;
  1678. mutex_lock(&auddrv_pmic_mutex);
  1679. Aud_ANC_Clk_cntr--;
  1680. if (Aud_ANC_Clk_cntr == 0) {
  1681. PRINTK_AUDDRV("+%s(), Aud_ANC_Clk_cntr(%x)\n",
  1682. __func__,
  1683. Aud_ANC_Clk_cntr);
  1684. if (aud_clks[CLOCK_INFRA_ANC_MD32_32K].clk_prepare)
  1685. clk_disable(aud_clks[CLOCK_INFRA_ANC_MD32_32K].clock);
  1686. if (aud_clks[CLOCK_INFRA_ANC_MD32].clk_prepare)
  1687. clk_disable(aud_clks[CLOCK_INFRA_ANC_MD32].clock);
  1688. /* ANC_MD32 TOP CLOCK MUX SELECT 26M*/
  1689. if (aud_clks[CLOCK_TOP_MUX_ANC_MD32].clk_prepare) {
  1690. ret = clk_enable(aud_clks[CLOCK_TOP_MUX_ANC_MD32].clock);
  1691. if (ret) {
  1692. pr_err
  1693. ("%s [CCF]Aud enable_clock enable_clock CLOCK_TOP_MUX_ANC_MD32 fail",
  1694. __func__);
  1695. BUG();
  1696. goto EXIT;
  1697. }
  1698. } else {
  1699. pr_err("%s [CCF]clk_prepare error Aud enable_clock CLOCK_TOP_MUX_ANC_MD32 fail",
  1700. __func__);
  1701. BUG();
  1702. goto EXIT;
  1703. }
  1704. ret = clk_set_parent(aud_clks[CLOCK_TOP_MUX_ANC_MD32].clock,
  1705. aud_clks[CLOCK_CLK26M].clock);
  1706. if (ret) {
  1707. pr_err("%s clk_set_parent %s-%s fail %d\n",
  1708. __func__, aud_clks[CLOCK_TOP_MUX_ANC_MD32].name,
  1709. aud_clks[CLOCK_CLK26M].name, ret);
  1710. BUG();
  1711. goto EXIT;
  1712. }
  1713. }
  1714. if (Aud_ANC_Clk_cntr < 0) {
  1715. PRINTK_AUDDRV("!! %s(), Aud_ADC_Clk_cntr (%d) < 0\n",
  1716. __func__,
  1717. Aud_ANC_Clk_cntr);
  1718. Aud_ANC_Clk_cntr = 0;
  1719. }
  1720. EXIT:
  1721. mutex_unlock(&auddrv_pmic_mutex);
  1722. }