mt_pmic_wrap_init.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2010. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. *
  31. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver's
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. /******************************************************************************
  36. * mt_pmic_wrap_init.c - MTK PMIC Wrapper Driver
  37. *
  38. * Copyright 2008-2009 MediaTek Co.,Ltd.
  39. *
  40. * DESCRIPTION:
  41. * This file provides API for other drivers to access PMIC registers
  42. *
  43. ******************************************************************************/
  44. #include <platform/mt_pmic_wrap_init.h>
  45. //---start ---internal API--------------------------------------------------
  46. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata );
  47. static S32 _pwrap_reset_spislv(void);
  48. static S32 _pwrap_init_dio( U32 dio_en );
  49. static S32 _pwrap_init_cipher( void );
  50. static S32 _pwrap_init_reg_clock( U32 regck_sel );
  51. static BOOL _pwrap_timeout_ns (U64 start_time_ns, U64 timeout_time_ns);
  52. static U64 _pwrap_get_current_time(void);
  53. static U64 _pwrap_time2ns (U64 time_us);
  54. static S32 pwrap_read_nochk( U32 adr, U32 *rdata );
  55. static S32 pwrap_write_nochk( U32 adr, U32 wdata );
  56. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata );
  57. void pwrap_dump_ap_register(void);
  58. //---end--internal API--------------------------------------------------
  59. #ifdef PMIC_WRAP_NO_PMIC
  60. S32 pwrap_wacs2( U32 write, U32 adr, U32 wdata, U32 *rdata )
  61. {
  62. PWRAPERR("there is no PMIC real chip,PMIC_WRAP do Nothing\n");
  63. return 0;
  64. }
  65. //******************************************************************************
  66. //--external API for pmic_wrap user-------------------------------------------------
  67. //******************************************************************************
  68. S32 pwrap_read( U32 adr, U32 *rdata )
  69. {
  70. return pwrap_wacs2( 0, adr,0,rdata );
  71. }
  72. S32 pwrap_write( U32 adr, U32 wdata )
  73. {
  74. return pwrap_wacs2( 1, adr,wdata,0 );
  75. }
  76. /*
  77. *pmic_wrap init,init wrap interface
  78. *
  79. */
  80. S32 pwrap_init ( void )
  81. {
  82. dprintf(CRITICAL,"[PMIC_WRAP]There is no PMIC real chip, PMIC_WRAP do Nothing.\n");
  83. return 0;
  84. }
  85. #ifdef MACH_FPGA
  86. S32 pwrap_init_lk ( void )
  87. {
  88. return 0;
  89. }
  90. //--------------------------------------------------------
  91. // Function : _pwrap_status_update_test()
  92. // Description :only for early porting
  93. // Parameter :
  94. // Return :
  95. //--------------------------------------------------------
  96. static S32 _pwrap_status_update_test_porting( void )
  97. {
  98. return 0;
  99. }
  100. void pwrap_init_for_early_porting(void)
  101. {
  102. }
  103. #endif//endif MACH_FPGA
  104. #else
  105. /******************************************************************************
  106. wrapper timeout
  107. ******************************************************************************/
  108. #define PWRAP_TIMEOUT
  109. //use the same API name with kernel driver
  110. //however,the timeout API in uboot use tick instead of ns
  111. #ifdef PWRAP_TIMEOUT
  112. static U64 _pwrap_get_current_time(void)
  113. {
  114. return gpt4_get_current_tick();
  115. }
  116. //_pwrap_timeout_tick,use the same API name with kernel driver
  117. static BOOL _pwrap_timeout_ns (U64 start_time, U64 elapse_time)
  118. {
  119. return gpt4_timeout_tick(start_time, elapse_time);
  120. }
  121. //_pwrap_time2tick_us
  122. static U64 _pwrap_time2ns (U64 time_us)
  123. {
  124. return gpt4_time2tick_us(time_us);
  125. }
  126. #else
  127. static U64 _pwrap_get_current_time(void)
  128. {
  129. return 0;
  130. }
  131. static BOOL _pwrap_timeout_ns (U64 start_time, U64 elapse_time)//,U64 timeout_ns)
  132. {
  133. return FALSE;
  134. }
  135. static U64 _pwrap_time2ns (U64 time_us)
  136. {
  137. return 0;
  138. }
  139. #endif
  140. //#####################################################################
  141. //define macro and inline function (for do while loop)
  142. //#####################################################################
  143. typedef U32 (*loop_condition_fp)(U32);//define a function pointer
  144. static inline U32 wait_for_fsm_idle(U32 x)
  145. {
  146. return (GET_WACS0_FSM( x ) != WACS_FSM_IDLE );
  147. }
  148. static inline U32 wait_for_fsm_vldclr(U32 x)
  149. {
  150. return (GET_WACS0_FSM( x ) != WACS_FSM_WFVLDCLR);
  151. }
  152. static inline U32 wait_for_sync(U32 x)
  153. {
  154. return (GET_SYNC_IDLE0(x) != WACS_SYNC_IDLE);
  155. }
  156. static inline U32 wait_for_idle_and_sync(U32 x)
  157. {
  158. return ((GET_WACS2_FSM(x) != WACS_FSM_IDLE) || (GET_SYNC_IDLE2(x) != WACS_SYNC_IDLE)) ;
  159. }
  160. static inline U32 wait_for_wrap_idle(U32 x)
  161. {
  162. return ((GET_WRAP_FSM(x) != 0x0) || (GET_WRAP_CH_DLE_RESTCNT(x) != 0x0));
  163. }
  164. static inline U32 wait_for_wrap_state_idle(U32 x)
  165. {
  166. return ( GET_WRAP_AG_DLE_RESTCNT( x ) != 0 ) ;
  167. }
  168. static inline U32 wait_for_man_idle_and_noreq(U32 x)
  169. {
  170. return ( (GET_MAN_REQ(x) != MAN_FSM_NO_REQ ) || (GET_MAN_FSM(x) != MAN_FSM_IDLE) );
  171. }
  172. static inline U32 wait_for_man_vldclr(U32 x)
  173. {
  174. return (GET_MAN_FSM( x ) != MAN_FSM_WFVLDCLR) ;
  175. }
  176. static inline U32 wait_for_cipher_ready(U32 x)
  177. {
  178. return (x!=3) ;
  179. }
  180. static inline U32 wait_for_stdupd_idle(U32 x)
  181. {
  182. return ( GET_STAUPD_FSM(x) != 0x0) ;
  183. }
  184. static inline U32 wait_for_state_ready_init(loop_condition_fp fp,U32 timeout_us,volatile U32 *wacs_register,U32 *read_reg)
  185. {
  186. U64 start_time_ns=0, timeout_ns=0;
  187. U32 reg_rdata=0x0;
  188. start_time_ns = _pwrap_get_current_time();
  189. timeout_ns = _pwrap_time2ns(timeout_us);
  190. do
  191. {
  192. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  193. {
  194. PWRAPERR("wait_for_state_ready_init timeout when waiting for idle\n");
  195. return E_PWR_WAIT_IDLE_TIMEOUT;
  196. }
  197. reg_rdata = WRAP_RD32(wacs_register);
  198. } while( fp(reg_rdata)); //IDLE State
  199. if(read_reg)
  200. *read_reg=reg_rdata;
  201. return 0;
  202. }
  203. static inline U32 wait_for_state_idle_init(loop_condition_fp fp,U32 timeout_us,volatile U32 *wacs_register,volatile U32 *wacs_vldclr_register,U32 *read_reg)
  204. {
  205. U64 start_time_ns=0, timeout_ns=0;
  206. U32 reg_rdata;
  207. start_time_ns = _pwrap_get_current_time();
  208. timeout_ns = _pwrap_time2ns(timeout_us);
  209. do
  210. {
  211. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  212. {
  213. PWRAPERR("wait_for_state_idle_init timeout when waiting for idle\n");
  214. pwrap_dump_ap_register();
  215. //pwrap_trace_wacs2();
  216. //BUG_ON(1);
  217. return E_PWR_WAIT_IDLE_TIMEOUT;
  218. }
  219. reg_rdata = WRAP_RD32(wacs_register);
  220. //if last read command timeout,clear vldclr bit
  221. //read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle
  222. switch ( GET_WACS0_FSM( reg_rdata ) )
  223. {
  224. case WACS_FSM_WFVLDCLR:
  225. WRAP_WR32(wacs_vldclr_register , 1);
  226. PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  227. break;
  228. case WACS_FSM_WFDLE:
  229. PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n");
  230. break;
  231. case WACS_FSM_REQ:
  232. PWRAPERR("WACS_FSM = WACS_FSM_REQ\n");
  233. break;
  234. default:
  235. break;
  236. }
  237. }while( fp(reg_rdata)); //IDLE State
  238. if(read_reg)
  239. *read_reg=reg_rdata;
  240. return 0;
  241. }
  242. static inline U32 wait_for_state_idle(loop_condition_fp fp,U32 timeout_us,volatile U32 *wacs_register,volatile U32 *wacs_vldclr_register,U32 *read_reg)
  243. {
  244. U64 start_time_ns=0, timeout_ns=0;
  245. U32 reg_rdata;
  246. start_time_ns = _pwrap_get_current_time();
  247. timeout_ns = _pwrap_time2ns(timeout_us);
  248. do
  249. {
  250. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  251. {
  252. PWRAPERR("wait_for_state_idle timeout when waiting for idle\n");
  253. pwrap_dump_ap_register();
  254. // pwrap_trace_wacs2();
  255. // BUG_ON(1);
  256. return E_PWR_WAIT_IDLE_TIMEOUT;
  257. }
  258. reg_rdata = WRAP_RD32(wacs_register);
  259. if( GET_INIT_DONE0( reg_rdata ) != WACS_INIT_DONE)
  260. {
  261. PWRAPERR("initialization isn't finished \n");
  262. return E_PWR_NOT_INIT_DONE;
  263. }
  264. //if last read command timeout,clear vldclr bit
  265. //read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle
  266. switch ( GET_WACS0_FSM( reg_rdata ) )
  267. {
  268. case WACS_FSM_WFVLDCLR:
  269. WRAP_WR32(wacs_vldclr_register , 1);
  270. PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  271. break;
  272. case WACS_FSM_WFDLE:
  273. PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n");
  274. break;
  275. case WACS_FSM_REQ:
  276. PWRAPERR("WACS_FSM = WACS_FSM_REQ\n");
  277. break;
  278. default:
  279. break;
  280. }
  281. }while( fp(reg_rdata)); //IDLE State
  282. if(read_reg)
  283. *read_reg=reg_rdata;
  284. return 0;
  285. }
  286. static inline U32 wait_for_state_ready(loop_condition_fp fp,U32 timeout_us,volatile U32 *wacs_register,U32 *read_reg)
  287. {
  288. U64 start_time_ns=0, timeout_ns=0;
  289. U32 reg_rdata;
  290. start_time_ns = _pwrap_get_current_time();
  291. timeout_ns = _pwrap_time2ns(timeout_us);
  292. do
  293. {
  294. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  295. {
  296. PWRAPERR("timeout when waiting for idle\n");
  297. pwrap_dump_ap_register();
  298. return E_PWR_WAIT_IDLE_TIMEOUT;
  299. }
  300. reg_rdata = WRAP_RD32(wacs_register);
  301. if( GET_INIT_DONE0( reg_rdata ) != WACS_INIT_DONE)
  302. {
  303. PWRAPERR("initialization isn't finished \n");
  304. return E_PWR_NOT_INIT_DONE;
  305. }
  306. } while( fp(reg_rdata)); //IDLE State
  307. if(read_reg)
  308. *read_reg=reg_rdata;
  309. return 0;
  310. }
  311. //******************************************************************************
  312. //--external API for pmic_wrap user-------------------------------------------------
  313. //******************************************************************************
  314. S32 pwrap_read( U32 adr, U32 *rdata )
  315. {
  316. return pwrap_wacs2( 0, adr,0,rdata );
  317. }
  318. S32 pwrap_write( U32 adr, U32 wdata )
  319. {
  320. return pwrap_wacs2( 1, adr,wdata,0 );
  321. }
  322. //--------------------------------------------------------
  323. // Function : pwrap_wacs2()
  324. // Description :
  325. // Parameter :
  326. // Return :
  327. //--------------------------------------------------------
  328. S32 pwrap_wacs2( U32 write, U32 adr, U32 wdata, U32 *rdata )
  329. {
  330. U32 reg_rdata=0;
  331. U32 wacs_write=0;
  332. U32 wacs_adr=0;
  333. U32 wacs_cmd=0;
  334. U32 return_value=0;
  335. //struct pmic_wrap_obj *pwrap_obj = g_pmic_wrap_obj;
  336. //if (!pwrap_obj)
  337. // PWRAPERR("NULL pointer\n");
  338. //PWRAPFUC();
  339. //PWRAPLOG("wrapper access,write=%x,add=%x,wdata=%x,rdata=%x\n",write,adr,wdata,rdata);
  340. // Check argument validation
  341. if( (write & ~(0x1)) != 0) return E_PWR_INVALID_RW;
  342. if( (adr & ~(0xffff)) != 0) return E_PWR_INVALID_ADDR;
  343. if( (wdata & ~(0xffff)) != 0) return E_PWR_INVALID_WDAT;
  344. //spin_lock_irqsave(&pwrap_obj->spin_lock,flags);
  345. // Check IDLE & INIT_DONE in advance
  346. return_value=wait_for_state_idle(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,PMIC_WRAP_WACS2_VLDCLR,0);
  347. if(return_value!=0)
  348. {
  349. PWRAPERR("wait_for_fsm_idle fail,return_value=%d\n",return_value);
  350. goto FAIL;
  351. }
  352. wacs_write = write << 31;
  353. wacs_adr = (adr >> 1) << 16;
  354. wacs_cmd = wacs_write | wacs_adr | wdata;
  355. WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd);
  356. if( write == 0 )
  357. {
  358. if (NULL == rdata)
  359. {
  360. PWRAPERR("rdata is a NULL pointer\n");
  361. return_value= E_PWR_INVALID_ARG;
  362. goto FAIL;
  363. }
  364. return_value=wait_for_state_ready(wait_for_fsm_vldclr,TIMEOUT_READ,PMIC_WRAP_WACS2_RDATA,&reg_rdata);
  365. if(return_value!=0)
  366. {
  367. PWRAPERR("wait_for_fsm_vldclr fail,return_value=%d\n",return_value);
  368. return_value+=1;//E_PWR_NOT_INIT_DONE_READ or E_PWR_WAIT_IDLE_TIMEOUT_READ
  369. goto FAIL;
  370. }
  371. *rdata = GET_WACS0_RDATA( reg_rdata );
  372. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1);
  373. }
  374. FAIL:
  375. //spin_unlock_irqrestore(&pwrap_obj->spin_lock,flags);
  376. if(return_value!=0)
  377. {
  378. PWRAPERR("pwrap_wacs2 fail,return_value=%d\n",return_value);
  379. PWRAPERR("timeout:BUG_ON here\n");
  380. //BUG_ON(1);
  381. }
  382. //wrap_access_time=_pwrap_get_current_time();
  383. //pwrap_trace(wrap_access_time,return_value,write, adr, wdata,rdata);
  384. return return_value;
  385. }
  386. //******************************************************************************
  387. //--internal API for pwrap_init-------------------------------------------------
  388. //******************************************************************************
  389. //--------------------------------------------------------
  390. // Function : _pwrap_wacs2_nochk()
  391. // Description :
  392. // Parameter :
  393. // Return :
  394. //--------------------------------------------------------
  395. static S32 pwrap_read_nochk( U32 adr, U32 *rdata )
  396. {
  397. return _pwrap_wacs2_nochk( 0, adr, 0, rdata );
  398. }
  399. static S32 pwrap_write_nochk( U32 adr, U32 wdata )
  400. {
  401. return _pwrap_wacs2_nochk( 1, adr,wdata,0 );
  402. }
  403. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata )
  404. {
  405. U32 reg_rdata=0x0;
  406. U32 wacs_write=0x0;
  407. U32 wacs_adr=0x0;
  408. U32 wacs_cmd=0x0;
  409. U32 return_value=0x0;
  410. //PWRAPFUC();
  411. // Check argument validation
  412. if( (write & ~(0x1)) != 0) return E_PWR_INVALID_RW;
  413. if( (adr & ~(0xffff)) != 0) return E_PWR_INVALID_ADDR;
  414. if( (wdata & ~(0xffff)) != 0) return E_PWR_INVALID_WDAT;
  415. // Check IDLE
  416. return_value=wait_for_state_ready_init(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  417. if(return_value!=0)
  418. {
  419. PWRAPERR("_pwrap_wacs2_nochk write command fail,return_value=%x\n", return_value);
  420. return return_value;
  421. }
  422. wacs_write = write << 31;
  423. wacs_adr = (adr >> 1) << 16;
  424. wacs_cmd= wacs_write | wacs_adr | wdata;
  425. WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd);
  426. if( write == 0 )
  427. {
  428. if (NULL == rdata)
  429. {
  430. PWRAPERR("rdata is a NULL pointer\n");
  431. return_value= E_PWR_INVALID_ARG;
  432. return return_value;
  433. }
  434. return_value=wait_for_state_ready_init(wait_for_fsm_vldclr,TIMEOUT_READ,PMIC_WRAP_WACS2_RDATA,&reg_rdata);
  435. if(return_value!=0)
  436. {
  437. PWRAPERR("wait_for_fsm_vldclr fail,return_value=%d\n",return_value);
  438. return_value+=1;//E_PWR_NOT_INIT_DONE_READ or E_PWR_WAIT_IDLE_TIMEOUT_READ
  439. return return_value;
  440. }
  441. *rdata = GET_WACS0_RDATA( reg_rdata );
  442. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1);
  443. }
  444. return 0;
  445. }
  446. //--------------------------------------------------------
  447. // Function : _pwrap_init_dio()
  448. // Description :call it in pwrap_init,mustn't check init done
  449. // Parameter :
  450. // Return :
  451. //--------------------------------------------------------
  452. static S32 _pwrap_init_dio( U32 dio_en )
  453. {
  454. U32 arb_en_backup=0x0;
  455. U32 rdata=0x0;
  456. U32 return_value=0;
  457. //PWRAPFUC();
  458. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  459. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , WACS2); // only WACS2
  460. #ifdef SLV_6328
  461. pwrap_write_nochk(MT6328_DEW_DIO_EN, (dio_en));
  462. #endif
  463. #ifdef SLV_6332
  464. pwrap_write_nochk(MT6332_DEW_DIO_EN, (dio_en>>1));
  465. #endif
  466. // Check IDLE & INIT_DONE in advance
  467. return_value=wait_for_state_ready_init(wait_for_idle_and_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  468. if(return_value!=0)
  469. {
  470. PWRAPERR("_pwrap_init_dio fail,return_value=%x\n", return_value);
  471. return return_value;
  472. }
  473. //enable AP DIO mode
  474. WRAP_WR32(PMIC_WRAP_DIO_EN , dio_en);
  475. // Read Test
  476. #ifdef SLV_6328
  477. pwrap_read_nochk(MT6328_DEW_READ_TEST, &rdata);
  478. if( rdata != MT6328_DEFAULT_VALUE_READ_TEST )
  479. {
  480. PWRAPERR("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=0x5aa5\n", dio_en, rdata);
  481. return E_PWR_READ_TEST_FAIL;
  482. }
  483. #endif
  484. #ifdef SLV_6332
  485. pwrap_read_nochk(MT6332_DEW_READ_TEST, &rdata);
  486. if( rdata != MT6332_DEFAULT_VALUE_READ_TEST )
  487. {
  488. PWRAPERR("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=0xa55a\n", dio_en, rdata);
  489. return E_PWR_READ_TEST_FAIL;
  490. }
  491. #endif
  492. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  493. return 0;
  494. }
  495. //--------------------------------------------------------
  496. // Function : _pwrap_init_cipher()
  497. // Description :
  498. // Parameter :
  499. // Return :
  500. //--------------------------------------------------------
  501. static S32 _pwrap_init_cipher( void )
  502. {
  503. U32 arb_en_backup=0;
  504. U32 rdata=0;
  505. U32 return_value=0;
  506. U32 start_time_ns=0, timeout_ns=0;
  507. //PWRAPFUC();
  508. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  509. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN ,WACS2); // only WACS0
  510. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 1);
  511. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 0);
  512. WRAP_WR32(PMIC_WRAP_CIPHER_KEY_SEL , 1);
  513. WRAP_WR32(PMIC_WRAP_CIPHER_IV_SEL , 2);
  514. WRAP_WR32(PMIC_WRAP_CIPHER_EN , 1);
  515. //Config CIPHER @ PMIC
  516. #ifdef SLV_6328
  517. pwrap_write_nochk(MT6328_DEW_CIPHER_SWRST, 0x1);
  518. pwrap_write_nochk(MT6328_DEW_CIPHER_SWRST, 0x0);
  519. pwrap_write_nochk(MT6328_DEW_CIPHER_KEY_SEL, 0x1);
  520. pwrap_write_nochk(MT6328_DEW_CIPHER_IV_SEL, 0x2);
  521. pwrap_write_nochk(MT6328_DEW_CIPHER_EN, 0x1);
  522. #endif
  523. #ifdef SLV_6332
  524. pwrap_write_nochk(MT6332_DEW_CIPHER_SWRST, 0x1);
  525. pwrap_write_nochk(MT6332_DEW_CIPHER_SWRST, 0x0);
  526. pwrap_write_nochk(MT6332_DEW_CIPHER_KEY_SEL, 0x1);
  527. pwrap_write_nochk(MT6332_DEW_CIPHER_IV_SEL, 0x2);
  528. pwrap_write_nochk(MT6332_DEW_CIPHER_EN, 0x1);
  529. #endif
  530. PWRAPLOG("mt_pwrap_init---- debug7\n");
  531. //wait for cipher data ready@AP
  532. return_value=wait_for_state_ready_init(wait_for_cipher_ready,TIMEOUT_WAIT_IDLE,PMIC_WRAP_CIPHER_RDY,0);
  533. if(return_value!=0)
  534. {
  535. PWRAPERR("wait for cipher data ready@AP fail,return_value=%x\n", return_value);
  536. return return_value;
  537. }
  538. PWRAPLOG("mt_pwrap_init---- debug8\n");
  539. //wait for cipher data ready@PMIC
  540. #ifdef SLV_6328
  541. start_time_ns = _pwrap_get_current_time();
  542. timeout_ns = _pwrap_time2ns(0xFFFFFF);
  543. do
  544. {
  545. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  546. {
  547. PWRAPERR("wait for cipher data ready@PMIC\n");
  548. //pwrap_dump_all_register();
  549. //return E_PWR_WAIT_IDLE_TIMEOUT;
  550. }
  551. pwrap_read_nochk(MT6328_DEW_CIPHER_RDY,&rdata);
  552. } while( rdata != 0x1 ); //cipher_ready
  553. pwrap_write_nochk(MT6328_DEW_CIPHER_MODE, 0x1);
  554. PWRAPLOG("mt_pwrap_init---- debug9\n");
  555. #endif
  556. #ifdef SLV_6332
  557. start_time_ns = _pwrap_get_current_time();
  558. timeout_ns = _pwrap_time2ns(0xFFFFFF);
  559. do
  560. {
  561. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  562. {
  563. PWRAPERR("wait for cipher data ready@PMIC\n");
  564. //pwrap_dump_all_register();
  565. //return E_PWR_WAIT_IDLE_TIMEOUT;
  566. }
  567. pwrap_read_nochk(MT6332_DEW_CIPHER_RDY,&rdata);
  568. } while( rdata != 0x1 ); //cipher_ready
  569. pwrap_write_nochk(MT6332_DEW_CIPHER_MODE, 0x1);
  570. #endif
  571. //wait for cipher mode idle
  572. return_value=wait_for_state_ready_init(wait_for_idle_and_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  573. if(return_value!=0)
  574. {
  575. PWRAPERR("wait for cipher mode idle fail,return_value=%x\n", return_value);
  576. return return_value;
  577. }
  578. WRAP_WR32(PMIC_WRAP_CIPHER_MODE , 1);
  579. // Read Test
  580. #ifdef SLV_6328
  581. pwrap_read_nochk(MT6328_DEW_READ_TEST, &rdata);
  582. if( rdata != MT6328_DEFAULT_VALUE_READ_TEST )
  583. {
  584. PWRAPERR("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata);
  585. return E_PWR_READ_TEST_FAIL;
  586. }
  587. #endif
  588. #ifdef SLV_6332
  589. pwrap_read_nochk(MT6332_DEW_READ_TEST, &rdata);
  590. if( rdata != MT6332_DEFAULT_VALUE_READ_TEST )
  591. {
  592. PWRAPERR("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata);
  593. return E_PWR_READ_TEST_FAIL;
  594. }
  595. #endif
  596. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  597. return 0;
  598. }
  599. //--------------------------------------------------------
  600. // Function : _pwrap_init_sistrobe()
  601. // Description : Initialize SI_CK_CON and SIDLY
  602. // Parameter :
  603. // Return :
  604. //--------------------------------------------------------
  605. static S32 _pwrap_init_sistrobe( void )
  606. {
  607. U32 arb_en_backup=0;
  608. U32 rdata=0;
  609. U32 i=0;
  610. S32 ind=0;
  611. U32 tmp1=0;
  612. U32 tmp2=0;
  613. U32 result_faulty=0;
  614. U32 result[2]={0,0};
  615. S32 leading_one[2]={-1,-1};
  616. S32 tailing_one[2]={-1,-1};
  617. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  618. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN ,WACS2); // only WACS2
  619. //---------------------------------------------------------------------
  620. // Scan all possible input strobe by READ_TEST
  621. //---------------------------------------------------------------------
  622. for( ind=0; ind<24; ind++) // 24 sampling clock edge
  623. {
  624. WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7);
  625. WRAP_WR32(PMIC_WRAP_SIDLY ,0x3 - (ind & 0x3));
  626. #ifdef SLV_6328
  627. _pwrap_wacs2_nochk(0, MT6328_DEW_READ_TEST, 0, &rdata);
  628. if( rdata == MT6328_DEFAULT_VALUE_READ_TEST ) {
  629. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6328] pass,index=%d rdata=%x\n", ind,rdata);
  630. result[0] |= (0x1 << ind);
  631. }else {
  632. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6328] tuning,index=%d rdata=%x\n", ind,rdata);
  633. }
  634. #endif
  635. #ifdef SLV_6332
  636. _pwrap_wacs2_nochk(0, MT6332_DEW_READ_TEST, 0, &rdata);
  637. if( rdata == MT6332_DEFAULT_VALUE_READ_TEST ) {
  638. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6332] pass,index=%d rdata=%x\n", ind,rdata);
  639. result[1] |= (0x1 << ind);
  640. }else {
  641. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6332] tuning,index=%d rdata=%x\n", ind,rdata);
  642. }
  643. #endif
  644. }
  645. #ifndef SLV_6328
  646. result[0] = result[1];
  647. #endif
  648. #ifndef SLV_6332
  649. result[1] = result[0];
  650. #endif
  651. //---------------------------------------------------------------------
  652. // Locate the leading one and trailing one of PMIC 1/2
  653. //---------------------------------------------------------------------
  654. for( ind=23 ; ind>=0 ; ind-- )
  655. {
  656. if( (result[0] & (0x1 << ind)) && leading_one[0] == -1){
  657. leading_one[0] = ind;
  658. }
  659. if(leading_one[0] > 0) { break;}
  660. }
  661. for( ind=23 ; ind>=0 ; ind-- )
  662. {
  663. if( (result[1] & (0x1 << ind)) && leading_one[1] == -1){
  664. leading_one[1] = ind;
  665. }
  666. if(leading_one[1] > 0) { break;}
  667. }
  668. for( ind=0 ; ind<24 ; ind++ )
  669. {
  670. if( (result[0] & (0x1 << ind)) && tailing_one[0] == -1){
  671. tailing_one[0] = ind;
  672. }
  673. if(tailing_one[0] > 0) { break;}
  674. }
  675. for( ind=0 ; ind<24 ; ind++ )
  676. {
  677. if( (result[1] & (0x1 << ind)) && tailing_one[1] == -1){
  678. tailing_one[1] = ind;
  679. }
  680. if(tailing_one[1] > 0) { break;}
  681. }
  682. //---------------------------------------------------------------------
  683. // Check the continuity of pass range
  684. //---------------------------------------------------------------------
  685. for( i=0; i<2; i++)
  686. {
  687. tmp1 = (0x1 << (leading_one[i]+1)) - 1;
  688. tmp2 = (0x1 << tailing_one[i]) - 1;
  689. if( (tmp1 - tmp2) != result[i] )
  690. {
  691. /*TERR = "[DrvPWRAP_InitSiStrobe] Fail at PMIC %d, result = %x, leading_one:%d, tailing_one:%d"
  692. , i+1, result[i], leading_one[i], tailing_one[i]*/
  693. PWRAPERR("_pwrap_init_sistrobe Fail at PMIC %d, result = %x, leading_one:%d, tailing_one:%d\n", i+1, result[i], leading_one[i], tailing_one[i]);
  694. result_faulty = 0x1;
  695. }
  696. }
  697. //---------------------------------------------------------------------
  698. // Config SICK and SIDLY to the middle point of pass range
  699. //---------------------------------------------------------------------
  700. if( result_faulty == 0 )
  701. {
  702. // choose the best point in the interaction of PMIC1's pass range and PMIC2's pass range
  703. ind = ( (leading_one[0] + tailing_one[0])/2 + (leading_one[1] + tailing_one[1])/2 )/2;
  704. /*TINFO = "The best point in the interaction area is %d, ind"*/
  705. WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7);
  706. WRAP_WR32(PMIC_WRAP_SIDLY , 0x3 - (ind & 0x3));
  707. //---------------------------------------------------------------------
  708. // Restore
  709. //---------------------------------------------------------------------
  710. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  711. return 0;
  712. }
  713. else
  714. {
  715. PWRAPERR("_pwrap_init_sistrobe Fail,result_faulty=%x\n", result_faulty);
  716. return result_faulty;
  717. }
  718. }
  719. //--------------------------------------------------------
  720. // Function : _pwrap_reset_spislv()
  721. // Description :
  722. // Parameter :
  723. // Return :
  724. //--------------------------------------------------------
  725. static S32 _pwrap_reset_spislv( void )
  726. {
  727. U32 ret=0;
  728. U32 return_value=0;
  729. //PWRAPFUC();
  730. // This driver does not using _pwrap_switch_mux
  731. // because the remaining requests are expected to fail anyway
  732. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , DISABLE_ALL);
  733. WRAP_WR32(PMIC_WRAP_WRAP_EN , DISABLE);
  734. WRAP_WR32(PMIC_WRAP_MUX_SEL , MANUAL_MODE);
  735. WRAP_WR32(PMIC_WRAP_MAN_EN ,ENABLE);
  736. WRAP_WR32(PMIC_WRAP_DIO_EN ,DISABLE);
  737. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSL << 8));//0x2100
  738. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); //0x2800//to reset counter
  739. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSH << 8));//0x2000
  740. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  741. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  742. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  743. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  744. return_value=wait_for_state_ready_init(wait_for_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  745. if(return_value!=0)
  746. {
  747. PWRAPERR("_pwrap_reset_spislv fail,return_value=%x\n", return_value);
  748. ret=E_PWR_TIMEOUT;
  749. goto timeout;
  750. }
  751. WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE);
  752. WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE);
  753. timeout:
  754. WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE);
  755. WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE);
  756. return ret;
  757. }
  758. static void __pwrap_soft_reset(void)
  759. {
  760. PWRAPLOG("start reset wrapper\n");
  761. //PWRAP_SOFT_RESET;
  762. WRAP_WR32(INFRA_GLOBALCON_RST0,0x80);
  763. PWRAPLOG("the reset register =%x\n",WRAP_RD32(INFRA_GLOBALCON_RST0));
  764. PWRAPLOG("PMIC_WRAP_STAUPD_GRPEN =0x%x,it should be equal to 0xc\n",WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN));
  765. //clear reset bit
  766. //PWRAP_CLEAR_SOFT_RESET_BIT;
  767. WRAP_WR32(INFRA_GLOBALCON_RST1,0x80);
  768. return;
  769. }
  770. static S32 _pwrap_init_signature( U8 path )
  771. {
  772. int ret=0;
  773. U32 rdata=0x0;
  774. PWRAPFUC();
  775. if(path == 1){
  776. //###############################
  777. // Signature Checking - Using Write Test Register
  778. // should be the last to modify WRITE_TEST
  779. //###############################
  780. _pwrap_wacs2_nochk(1, MT6328_DEW_WRITE_TEST, 0x5678, &rdata);
  781. WRAP_WR32(PMIC_WRAP_SIG_ADR,MT6328_DEW_WRITE_TEST);
  782. WRAP_WR32(PMIC_WRAP_SIG_VALUE,0x5678);
  783. WRAP_WR32(PMIC_WRAP_SIG_MODE, 0x1);
  784. }else{
  785. //###############################
  786. // Signature Checking using CRC and EINT update
  787. // should be the last to modify WRITE_TEST
  788. //###############################
  789. #ifdef SLV_6328
  790. ret = pwrap_write_nochk(MT6328_DEW_CRC_EN, ENABLE);
  791. if( ret != 0 )
  792. {
  793. PWRAPERR("MT6328 enable CRC fail,ret=%x\n", ret);
  794. return E_PWR_INIT_ENABLE_CRC;
  795. }
  796. WRAP_WR32(PMIC_WRAP_SIG_ADR,WRAP_RD32(PMIC_WRAP_SIG_ADR)|MT6328_DEW_CRC_VAL);
  797. //WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR,MT6328_INT_STA);
  798. WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN,WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN)|0x35);
  799. #endif
  800. #ifdef SLV_6332
  801. ret = pwrap_write_nochk(MT6332_DEW_CRC_EN, ENABLE);
  802. if( ret != 0 )
  803. {
  804. PWRAPERR("MT6332 enable CRC fail,ret=%x\n", ret);
  805. return E_PWR_INIT_ENABLE_CRC;
  806. }
  807. WRAP_WR32(PMIC_WRAP_SIG_ADR,WRAP_RD32(PMIC_WRAP_SIG_ADR)|(MT6332_DEW_CRC_VAL<<16));
  808. WRAP_WR32(PMIC_WRAP_EINT_STA1_ADR,MT6332_INT_STA);
  809. WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN,WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN)|0xa);
  810. #endif
  811. }
  812. WRAP_WR32(PMIC_WRAP_CRC_EN, ENABLE);
  813. return 0;
  814. }
  815. static S32 _pwrap_init_reg_clock( U32 regck_sel )
  816. {
  817. //U32 wdata=0;
  818. //U32 rdata=0;
  819. PWRAPFUC();
  820. // Set Dummy cycle 6328 and 6332 (assume 12MHz)
  821. #ifdef SLV_6328
  822. pwrap_write_nochk(MT6328_DEW_RDDMY_NO, 0x8);
  823. #endif
  824. #ifdef SLV_6332
  825. pwrap_write_nochk(MT6332_DEW_RDDMY_NO, 0x8);
  826. #endif
  827. WRAP_WR32(PMIC_WRAP_RDDMY ,0x88);
  828. // Config SPI Waveform according to reg clk
  829. if( regck_sel == 1 ) { // 6MHz in 6323 => no support ; 18MHz in 6320
  830. WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0x0); // for 6320, slave need enough time (4T of PMIC reg_ck) to back idle state
  831. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0x33);// wait data written into register => 3T_PMIC: consists of CSLEXT_END(1T) + CSHEXT(6T)
  832. WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0x0);
  833. WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0x0);
  834. } else { //Safe mode
  835. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0xff);
  836. WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0xff);
  837. WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0xf);
  838. WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0xf);
  839. }
  840. return 0;
  841. }
  842. static U32 pwrap_read_test(void)
  843. {
  844. U32 rdata=0;
  845. U32 return_value=0;
  846. // Read Test
  847. #ifdef SLV_6328
  848. return_value=pwrap_read(MT6328_DEW_READ_TEST,&rdata);
  849. if( rdata != MT6328_DEFAULT_VALUE_READ_TEST )
  850. {
  851. PWRAPREG("Read Test fail,rdata=0x%x, exp=0x5aa5,return_value=0x%x\n", rdata,return_value);
  852. return E_PWR_READ_TEST_FAIL;
  853. }
  854. else
  855. {
  856. PWRAPREG("Read 6328 Test pass,return_value=%d\n",return_value);
  857. //return 0;
  858. }
  859. #endif
  860. #ifdef SLV_6332
  861. return_value=pwrap_read(MT6332_DEW_READ_TEST,&rdata);
  862. if( rdata != MT6332_DEFAULT_VALUE_READ_TEST )
  863. {
  864. PWRAPREG("Read Test fail,rdata=0x%x, exp=0x5aa5,return_value=0x%x\n", rdata,return_value);
  865. return E_PWR_READ_TEST_FAIL;
  866. }
  867. else
  868. {
  869. PWRAPREG("Read Test pass,return_value=%d\n",return_value);
  870. return 0;
  871. }
  872. #endif
  873. return 0;
  874. }
  875. static U32 pwrap_write_test(void)
  876. {
  877. U32 rdata=0;
  878. U32 sub_return=0;
  879. U32 sub_return1=0;
  880. //###############################
  881. // Write test using WACS2
  882. //###############################
  883. #ifdef SLV_6328
  884. sub_return = pwrap_write(MT6328_DEW_WRITE_TEST, MT6328_WRITE_TEST_VALUE);
  885. PWRAPREG("after MT6328 pwrap_write\n");
  886. sub_return1 = pwrap_read(MT6328_DEW_WRITE_TEST,&rdata);
  887. if(( rdata != MT6328_WRITE_TEST_VALUE )||( sub_return != 0 )||( sub_return1 != 0 ))
  888. {
  889. PWRAPREG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  890. return E_PWR_INIT_WRITE_TEST;
  891. }
  892. else
  893. {
  894. PWRAPREG("write MT6328 Test pass\n");
  895. //return 0;
  896. }
  897. #endif
  898. #ifdef SLV_6332
  899. sub_return = pwrap_write(MT6332_DEW_WRITE_TEST, MT6332_WRITE_TEST_VALUE);
  900. PWRAPREG("after MT6332 pwrap_write\n");
  901. sub_return1 = pwrap_read(MT6332_DEW_WRITE_TEST,&rdata);
  902. if(( rdata != MT6332_WRITE_TEST_VALUE )||( sub_return != 0 )||( sub_return1 != 0 ))
  903. {
  904. PWRAPREG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  905. return E_PWR_INIT_WRITE_TEST;
  906. }
  907. else
  908. {
  909. PWRAPREG("write MT6332 Test pass\n");
  910. return 0;
  911. }
  912. #endif
  913. return 0;
  914. }
  915. static void pwrap_ut(U32 ut_test)
  916. {
  917. switch(ut_test)
  918. {
  919. case 1:
  920. //pwrap_wacs2_para_test();
  921. pwrap_write_test();
  922. break;
  923. case 2:
  924. //pwrap_wacs2_para_test();
  925. pwrap_read_test();
  926. break;
  927. default:
  928. PWRAPREG ( "default test.\n" );
  929. break;
  930. }
  931. return;
  932. }
  933. S32 pwrap_init ( void )
  934. {
  935. S32 sub_return=0;
  936. S32 sub_return1=0;
  937. U32 rdata=0x0;
  938. PWRAPFUC();
  939. //###############################
  940. //toggle PMIC_WRAP and pwrap_spictl reset
  941. //###############################
  942. //WRAP_SET_BIT(0x80,INFRA_GLOBALCON_RST0);
  943. //WRAP_CLR_BIT(0x80,INFRA_GLOBALCON_RST0);
  944. __pwrap_soft_reset();
  945. PWRAPLOG("mt_pwrap_init---- debug3\n");
  946. //###############################
  947. // Set SPI_CK_freq = 26MHz for both 6320/6323
  948. //###############################
  949. //WRAP_WR32(PMIC_WRAP_RDDMY,0xf);
  950. WRAP_WR32(CLK_CFG_4_CLR,CLK_SPI_CK_26M);
  951. //###############################
  952. //toggle PERI_PWRAP_BRIDGE reset
  953. //###############################
  954. //WRAP_SET_BIT(0x04,PERI_GLOBALCON_RST1);
  955. //WRAP_CLR_BIT(0x04,PERI_GLOBALCON_RST1);
  956. //###############################
  957. //Enable DCM
  958. //###############################
  959. WRAP_WR32(PMIC_WRAP_DCM_EN , 3);//enable CRC DCM and Pwrap DCM
  960. WRAP_WR32(PMIC_WRAP_DCM_DBC_PRD ,DISABLE); //no debounce
  961. PWRAPLOG("mt_pwrap_init---- debug4\n");
  962. //###############################
  963. //Reset SPISLV
  964. //###############################
  965. sub_return=_pwrap_reset_spislv();
  966. if( sub_return != 0 )
  967. {
  968. PWRAPERR("error,_pwrap_reset_spislv fail,sub_return=%x\n",sub_return);
  969. return E_PWR_INIT_RESET_SPI;
  970. }
  971. //###############################
  972. // Enable WACS2
  973. //###############################
  974. WRAP_WR32(PMIC_WRAP_WRAP_EN,ENABLE);//enable wrap
  975. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,WACS2); //Only WACS2
  976. WRAP_WR32(PMIC_WRAP_WACS2_EN,ENABLE);
  977. PWRAPLOG("mt_pwrap_init---- debug5\n");
  978. //###############################
  979. // Input data calibration flow;
  980. //###############################
  981. sub_return = _pwrap_init_sistrobe();
  982. if( sub_return != 0 )
  983. {
  984. PWRAPERR("error,DrvPWRAP_InitSiStrobe fail,sub_return=%x\n",sub_return);
  985. return E_PWR_INIT_SIDLY;
  986. }
  987. PWRAPLOG("mt_pwrap_init---- debug6\n");
  988. //###############################
  989. // SPI Waveform Configuration
  990. //###############################
  991. //0:safe mode, 1:18MHz
  992. sub_return = _pwrap_init_reg_clock(1);
  993. if( sub_return != 0)
  994. {
  995. PWRAPERR("error,_pwrap_init_reg_clock fail,sub_return=%x\n",sub_return);
  996. return E_PWR_INIT_REG_CLOCK;
  997. }
  998. //###############################
  999. // Enable DIO mode
  1000. //###############################
  1001. //PMIC2 dual io not ready
  1002. ///TODO: Fix me //for early porting
  1003. #if 1
  1004. sub_return = _pwrap_init_dio(1);
  1005. if( sub_return != 0 )
  1006. {
  1007. PWRAPERR("_pwrap_init_dio test error,error code=%x, sub_return=%x\n", 0x11, sub_return);
  1008. return E_PWR_INIT_DIO;
  1009. }
  1010. #endif
  1011. //###############################
  1012. // Enable Encryption
  1013. //###############################
  1014. PWRAPLOG("have cipher\n");
  1015. sub_return = _pwrap_init_cipher();
  1016. if( sub_return != 0 )
  1017. {
  1018. PWRAPERR("Enable Encryption fail, return=%x\n", sub_return);
  1019. return E_PWR_INIT_CIPHER;
  1020. }
  1021. //###############################
  1022. // Write test using WACS2
  1023. //###############################
  1024. //check Wtiet test default value
  1025. #ifdef SLV_6328
  1026. sub_return = pwrap_write_nochk(MT6328_DEW_WRITE_TEST, MT6328_WRITE_TEST_VALUE);
  1027. sub_return1 = pwrap_read_nochk(MT6328_DEW_WRITE_TEST, &rdata);
  1028. if( rdata != MT6328_WRITE_TEST_VALUE ) {
  1029. PWRAPERR("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  1030. return E_PWR_INIT_WRITE_TEST;
  1031. }
  1032. #endif
  1033. #ifdef SLV_6332
  1034. sub_return = pwrap_write_nochk(MT6332_DEW_WRITE_TEST, MT6332_WRITE_TEST_VALUE);
  1035. sub_return1 = pwrap_read_nochk(MT6332_DEW_WRITE_TEST, &rdata);
  1036. if( rdata != MT6332_WRITE_TEST_VALUE ) {
  1037. PWRAPERR("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  1038. return E_PWR_INIT_WRITE_TEST;
  1039. }
  1040. #endif
  1041. //###############################
  1042. // Signature Checking - Using CRC
  1043. // should be the last to modify WRITE_TEST
  1044. //###############################
  1045. PWRAPLOG("mt_pwrap_init---- debug10\n");
  1046. ///TODO: Fix me //for early porting really no need?
  1047. #if 0
  1048. sub_return = _pwrap_init_signature(0);
  1049. if( sub_return != 0 )
  1050. {
  1051. PWRAPERR("Enable CRC fail, return=%x\n", sub_return);
  1052. return E_PWR_INIT_ENABLE_CRC;
  1053. }
  1054. #endif
  1055. #if 1
  1056. // ADC init
  1057. WRAP_WR32(PMIC_WRAP_ADC_CMD_ADDR,MT6328_AUXADC_RQST1_SET);
  1058. WRAP_WR32(PMIC_WRAP_PWRAP_ADC_CMD,0x0100);
  1059. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_LATEST , MT6328_AUXADC_ADC32);
  1060. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_WP , MT6328_AUXADC_MDBG_1);
  1061. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR0 , MT6328_AUXADC_BUF0);
  1062. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR1 , MT6328_AUXADC_BUF1);
  1063. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR2 , MT6328_AUXADC_BUF2);
  1064. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR3 , MT6328_AUXADC_BUF3);
  1065. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR4 , MT6328_AUXADC_BUF4);
  1066. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR5 , MT6328_AUXADC_BUF5);
  1067. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR6 , MT6328_AUXADC_BUF6);
  1068. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR7 , MT6328_AUXADC_BUF7);
  1069. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR8 , MT6328_AUXADC_BUF8);
  1070. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR9 , MT6328_AUXADC_BUF9);
  1071. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR10 , MT6328_AUXADC_BUF10);
  1072. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR11 , MT6328_AUXADC_BUF11);
  1073. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR12 , MT6328_AUXADC_BUF12);
  1074. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR13 , MT6328_AUXADC_BUF13);
  1075. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR14 , MT6328_AUXADC_BUF14);
  1076. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR15 , MT6328_AUXADC_BUF15);
  1077. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR16 , MT6328_AUXADC_BUF16);
  1078. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR17 , MT6328_AUXADC_BUF17);
  1079. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR18 , MT6328_AUXADC_BUF18);
  1080. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR19 , MT6328_AUXADC_BUF19);
  1081. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR20 , MT6328_AUXADC_BUF20);
  1082. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR21 , MT6328_AUXADC_BUF21);
  1083. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR22 , MT6328_AUXADC_BUF22);
  1084. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR23 , MT6328_AUXADC_BUF23);
  1085. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR24 , MT6328_AUXADC_BUF24);
  1086. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR25 , MT6328_AUXADC_BUF25);
  1087. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR26 , MT6328_AUXADC_BUF26);
  1088. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR27 , MT6328_AUXADC_BUF27);
  1089. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR28 , MT6328_AUXADC_BUF28);
  1090. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR29 , MT6328_AUXADC_BUF29);
  1091. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR30 , MT6328_AUXADC_BUF30);
  1092. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR31 , MT6328_AUXADC_BUF31);
  1093. #endif
  1094. // adc 6328 setting
  1095. pwrap_write_nochk(MT6328_AUXADC_MDBG_0, (0x40|(1<<15)));
  1096. pwrap_write_nochk(MT6328_AUXADC_MDRT_0, (0x40|(1<<15)));
  1097. pwrap_write_nochk(MT6328_AUXADC_MDRT_2, 0x04);
  1098. PWRAPLOG("mt_pwrap_init---- debug11 with adc &6328 adc\n");
  1099. //###############################
  1100. // PMIC_WRAP enables
  1101. //###############################
  1102. #if defined(MACH_TYPE_MT6735M)
  1103. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,0xff); //D2 change
  1104. PWRAPLOG("mt_pwrap_init---- use D2\n");
  1105. #else
  1106. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,0x3ff);
  1107. #endif
  1108. WRAP_WR32(PMIC_WRAP_WACS0_EN,ENABLE);
  1109. WRAP_WR32(PMIC_WRAP_WACS1_EN,ENABLE);
  1110. #if defined(MACH_TYPE_MT6735M)
  1111. // not enable wacs3 D2 change
  1112. #else
  1113. WRAP_WR32(PMIC_WRAP_WACS3_EN,ENABLE);
  1114. #endif
  1115. PWRAPLOG("mt_pwrap_init---- debug12 ok \n");
  1116. WRAP_WR32(PMIC_WRAP_STAUPD_PRD, 0x5); //0x1:20us,for concurrence test,MP:0x5; //100us
  1117. WRAP_WR32(PMIC_WRAP_WDT_UNIT,0xf);
  1118. WRAP_WR32(PMIC_WRAP_WDT_SRC_EN,0xfffffbff);
  1119. WRAP_WR32(PMIC_WRAP_TIMER_EN,0x1);
  1120. WRAP_WR32(PMIC_WRAP_INT_EN,0xfffffbff);
  1121. PWRAPLOG("mt_pwrap_init---- debug12++ \n");
  1122. //no ok
  1123. //###############################
  1124. // Initialization Done
  1125. //###############################
  1126. WRAP_WR32(PMIC_WRAP_INIT_DONE0 ,ENABLE);
  1127. WRAP_WR32(PMIC_WRAP_INIT_DONE2 , ENABLE);
  1128. PWRAPLOG("mt_pwrap_init---- debug13\n");
  1129. #if defined(MACH_TYPE_MT6735M)
  1130. // not enable wacs3 D2 change
  1131. #else
  1132. WRAP_WR32(PMIC_WRAP_INIT_DONE3 , ENABLE);
  1133. #endif
  1134. //WRAP_WR32(PMIC_WRAP_INIT_DONE1 , ENABLE);
  1135. PWRAPLOG("mt_pwrap_init---- debug14\n");
  1136. WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR,MT6328_INT_STA);
  1137. PWRAPLOG("mt_pwrap_init---- debug15,%x\n",WRAP_RD32(PMIC_WRAP_EINT_STA0_ADR));
  1138. pwrap_ut(1);
  1139. pwrap_ut(2);
  1140. return 0;
  1141. }
  1142. /*-pwrap debug--------------------------------------------------------------------------*/
  1143. void pwrap_dump_all_register(void)
  1144. {
  1145. U32 i=0;
  1146. U32 reg_addr=0;
  1147. U32 reg_value=0;
  1148. PWRAPREG("dump pwrap register\n");
  1149. for(i=0;i<PMIC_WRAP_REG_RANGE;i++)
  1150. {
  1151. reg_addr=(PMIC_WRAP_BASE+i*4);
  1152. reg_value=WRAP_RD32(reg_addr);
  1153. dprintf(CRITICAL,"0x%x=0x%x\n",reg_addr,reg_value);
  1154. }
  1155. }
  1156. void pwrap_dump_ap_register(void)
  1157. {
  1158. U32 i=0;
  1159. U32 reg_addr=0;
  1160. U32 reg_value=0;
  1161. PWRAPREG("dump pwrap register\n");
  1162. for(i=0;i<PMIC_WRAP_REG_RANGE;i++)
  1163. {
  1164. reg_addr=(PMIC_WRAP_BASE+i*4);
  1165. reg_value=WRAP_RD32(reg_addr);
  1166. PWRAPREG("0x%x=0x%x\n",reg_addr,reg_value);
  1167. }
  1168. //PWRAPREG("elapse_time=%llx(ns)\n",elapse_time);
  1169. }
  1170. //#ifdef MACH_FPGA
  1171. S32 pwrap_init_lk ( void )
  1172. {
  1173. u32 pwrap_ret=0,i=0;
  1174. PWRAPFUC();
  1175. for(i=0;i<3;i++)
  1176. {
  1177. pwrap_ret = pwrap_init();
  1178. if(pwrap_ret!=0)
  1179. {
  1180. dprintf(CRITICAL,"[PMIC_WRAP]wrap_init fail,the return value=%x.\n",pwrap_ret);
  1181. }
  1182. else
  1183. {
  1184. dprintf(CRITICAL,"[PMIC_WRAP]wrap_init pass,the return value=%x.\n",pwrap_ret);
  1185. break;//init pass
  1186. }
  1187. }
  1188. return 0;
  1189. }
  1190. //--------------------------------------------------------
  1191. // Function : _pwrap_status_update_test()
  1192. // Description :only for early porting
  1193. // Parameter :
  1194. // Return :
  1195. //--------------------------------------------------------
  1196. static S32 _pwrap_status_update_test_porting( void )
  1197. {
  1198. #if defined (SLV_6325) || defined (SLV_6332)
  1199. U32 rdata;
  1200. #endif
  1201. volatile U32 delay=1000*1000*1;
  1202. PWRAPFUC();
  1203. //disable signature interrupt
  1204. WRAP_WR32(PMIC_WRAP_INT_EN,0x0);
  1205. #ifdef SLV_6325
  1206. pwrap_write(MT6325_DEW_WRITE_TEST, MT6325_WRITE_TEST_VALUE);
  1207. WRAP_WR32(PMIC_WRAP_SIG_ADR,MT6325_DEW_WRITE_TEST);
  1208. WRAP_WR32(PMIC_WRAP_SIG_VALUE,0xAA55);
  1209. #endif
  1210. #ifdef SLV_6332
  1211. pwrap_write(MT6332_DEW_WRITE_TEST, MT6332_WRITE_TEST_VALUE);
  1212. WRAP_WR32(PMIC_WRAP_SIG_ADR,(MT6332_DEW_WRITE_TEST<<16)|WRAP_RD32(PMIC_WRAP_SIG_ADR));
  1213. WRAP_WR32(PMIC_WRAP_SIG_VALUE,(0xAA55<<16)|WRAP_RD32(PMIC_WRAP_SIG_VALUE));
  1214. #endif
  1215. WRAP_WR32(PMIC_WRAP_SIG_MODE, 0x1);
  1216. //pwrap_delay_us(5000);//delay 5 seconds
  1217. while(delay--);
  1218. #ifdef SLV_6325
  1219. rdata=WRAP_RD32(PMIC_WRAP_SIG_ERRVAL);
  1220. if( (rdata&0xFFFF) != MT6325_WRITE_TEST_VALUE )
  1221. {
  1222. PWRAPERR("MT6325 _pwrap_status_update_test error,error code=%x, rdata=%x\n", 1, (rdata&0xFFFF));
  1223. //return 1;
  1224. }
  1225. #endif
  1226. #ifdef SLV_6332
  1227. rdata=WRAP_RD32(PMIC_WRAP_SIG_ERRVAL);
  1228. if( (rdata>>16) != MT6332_WRITE_TEST_VALUE )
  1229. {
  1230. PWRAPERR("MT6332 _pwrap_status_update_test error,error code=%x, rdata=%x\n", 1, (rdata>>16));
  1231. //return 1;
  1232. }
  1233. #endif
  1234. #ifdef SLV_6325
  1235. WRAP_WR32(PMIC_WRAP_SIG_VALUE,MT6325_WRITE_TEST_VALUE);//tha same as write test
  1236. #endif
  1237. #ifdef SLV_6332
  1238. WRAP_WR32(PMIC_WRAP_SIG_VALUE,((MT6332_WRITE_TEST_VALUE<<16)|WRAP_RD32(PMIC_WRAP_SIG_VALUE)));//tha same as write test
  1239. #endif
  1240. //clear sig_error interrupt flag bit
  1241. WRAP_WR32(PMIC_WRAP_INT_CLR,1<<1);
  1242. //enable signature interrupt
  1243. WRAP_WR32(PMIC_WRAP_INT_EN,0x7ffffff9);
  1244. WRAP_WR32(PMIC_WRAP_SIG_MODE, 0x0);
  1245. #ifdef SLV_6325
  1246. WRAP_WR32(PMIC_WRAP_SIG_ADR, MT6325_DEW_CRC_VAL);
  1247. #endif
  1248. #ifdef SLV_6332
  1249. WRAP_WR32(PMIC_WRAP_SIG_ADR, (MT6332_DEW_CRC_VAL<<16)|WRAP_RD32(PMIC_WRAP_SIG_ADR));
  1250. #endif
  1251. return 0;
  1252. }
  1253. void pwrap_init_for_early_porting(void)
  1254. {
  1255. int ret = 0;
  1256. U32 res=0;
  1257. PWRAPFUC();
  1258. ret=_pwrap_status_update_test_porting();
  1259. if(ret==0)
  1260. {
  1261. PWRAPLOG("wrapper_StatusUpdateTest pass.\n");
  1262. }
  1263. else
  1264. {
  1265. PWRAPLOG("error:wrapper_StatusUpdateTest fail.\n");
  1266. res+=1;
  1267. }
  1268. }
  1269. //#endif
  1270. #endif //endif PMIC_WRAP_NO_PMIC