mt_pmic_wrap_init.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046
  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) 2015. 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. /******************************************************************************
  32. * mt_pmic_wrap_init.c - MTK PMIC Wrapper Driver
  33. *
  34. * Copyright 2008-2009 MediaTek Co.,Ltd.
  35. *
  36. * DESCRIPTION:
  37. * This file provides API for other drivers to access PMIC registers
  38. *
  39. ******************************************************************************/
  40. #include <platform/mt_pmic_wrap_init.h>
  41. /*********************start ---internal API**************************************/
  42. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata );
  43. static S32 _pwrap_reset_spislv(void);
  44. static S32 _pwrap_init_dio( U32 dio_en );
  45. static S32 _pwrap_init_cipher( void );
  46. static S32 _pwrap_init_reg_clock( U32 regck_sel );
  47. static BOOL _pwrap_timeout_ns (U64 start_time_ns, U64 timeout_time_ns);
  48. static U64 _pwrap_get_current_time(void);
  49. static U64 _pwrap_time2ns (U64 time_us);
  50. static S32 pwrap_read_nochk( U32 adr, U32 *rdata );
  51. static S32 pwrap_write_nochk( U32 adr, U32 wdata );
  52. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata );
  53. void pwrap_dump_ap_register(void);
  54. /************* end--internal API************************************************/
  55. #ifdef PMIC_WRAP_NO_PMIC
  56. S32 pwrap_wacs2( U32 write, U32 adr, U32 wdata, U32 *rdata )
  57. {
  58. PWRAPERR("there is no PMIC real chip,PMIC_WRAP do Nothing\n");
  59. return 0;
  60. }
  61. /**************external API for pmic_wrap user***************************/
  62. S32 pwrap_read( U32 adr, U32 *rdata )
  63. {
  64. return pwrap_wacs2( 0, adr,0,rdata );
  65. }
  66. S32 pwrap_write( U32 adr, U32 wdata )
  67. {
  68. return pwrap_wacs2( 1, adr,wdata,0 );
  69. }
  70. /*
  71. *pmic_wrap init,init wrap interface
  72. *
  73. */
  74. S32 pwrap_init ( void )
  75. {
  76. dprintf(CRITICAL,"[PMIC_WRAP]There is no PMIC real chip, PMIC_WRAP do Nothing.\n");
  77. return 0;
  78. }
  79. S32 pwrap_init_lk ( void )
  80. {
  81. return 0;
  82. }
  83. #else
  84. /******************************************************************************
  85. wrapper timeout
  86. ******************************************************************************/
  87. #define PWRAP_TIMEOUT
  88. /*use the same API name with kernel driver
  89. *however,the timeout API in uboot use tick instead of ns */
  90. #ifdef PWRAP_TIMEOUT
  91. static U64 _pwrap_get_current_time(void)
  92. {
  93. return gpt4_get_current_tick();
  94. }
  95. static BOOL _pwrap_timeout_ns (U64 start_time, U64 elapse_time)
  96. {
  97. return gpt4_timeout_tick(start_time, elapse_time);
  98. }
  99. static U64 _pwrap_time2ns (U64 time_us)
  100. {
  101. return gpt4_time2tick_us(time_us);
  102. }
  103. #else
  104. static U64 _pwrap_get_current_time(void)
  105. {
  106. return 0;
  107. }
  108. static BOOL _pwrap_timeout_ns (U64 start_time, U64 elapse_time)//,U64 timeout_ns)
  109. {
  110. return FALSE;
  111. }
  112. static U64 _pwrap_time2ns (U64 time_us)
  113. {
  114. return 0;
  115. }
  116. #endif
  117. typedef U32 (*loop_condition_fp)(U32);
  118. static inline U32 wait_for_fsm_idle(U32 x)
  119. {
  120. return (GET_WACS0_FSM( x ) != WACS_FSM_IDLE );
  121. }
  122. static inline U32 wait_for_fsm_vldclr(U32 x)
  123. {
  124. return (GET_WACS0_FSM( x ) != WACS_FSM_WFVLDCLR);
  125. }
  126. static inline U32 wait_for_sync(U32 x)
  127. {
  128. return (GET_SYNC_IDLE0(x) != WACS_SYNC_IDLE);
  129. }
  130. static inline U32 wait_for_idle_and_sync(U32 x)
  131. {
  132. return ((GET_WACS2_FSM(x) != WACS_FSM_IDLE) || (GET_SYNC_IDLE2(x) != WACS_SYNC_IDLE)) ;
  133. }
  134. static inline U32 wait_for_wrap_idle(U32 x)
  135. {
  136. return ((GET_WRAP_FSM(x) != 0x0) || (GET_WRAP_CH_DLE_RESTCNT(x) != 0x0));
  137. }
  138. static inline U32 wait_for_wrap_state_idle(U32 x)
  139. {
  140. return ( GET_WRAP_AG_DLE_RESTCNT( x ) != 0 ) ;
  141. }
  142. static inline U32 wait_for_man_idle_and_noreq(U32 x)
  143. {
  144. return ( (GET_MAN_REQ(x) != MAN_FSM_NO_REQ ) || (GET_MAN_FSM(x) != MAN_FSM_IDLE) );
  145. }
  146. static inline U32 wait_for_man_vldclr(U32 x)
  147. {
  148. return (GET_MAN_FSM( x ) != MAN_FSM_WFVLDCLR) ;
  149. }
  150. static inline U32 wait_for_cipher_ready(U32 x)
  151. {
  152. return (x!=3) ;
  153. }
  154. static inline U32 wait_for_stdupd_idle(U32 x)
  155. {
  156. return ( GET_STAUPD_FSM(x) != 0x0) ;
  157. }
  158. static inline U32 wait_for_state_ready_init(loop_condition_fp fp,U32 timeout_us,U32 wacs_register,U32 *read_reg)
  159. {
  160. U64 start_time_ns=0, timeout_ns=0;
  161. U32 reg_rdata=0x0;
  162. start_time_ns = _pwrap_get_current_time();
  163. timeout_ns = _pwrap_time2ns(timeout_us);
  164. do {
  165. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  166. PWRAPERR("wait_for_state_ready_init timeout when waiting for idle\n");
  167. return E_PWR_WAIT_IDLE_TIMEOUT;
  168. }
  169. reg_rdata = WRAP_RD32(wacs_register);
  170. } while ( fp(reg_rdata));
  171. if (read_reg)
  172. *read_reg = reg_rdata;
  173. return 0;
  174. }
  175. static inline U32 wait_for_state_idle_init(loop_condition_fp fp,U32 timeout_us,U32 wacs_register,U32 wacs_vldclr_register,U32 *read_reg)
  176. {
  177. U64 start_time_ns=0, timeout_ns=0;
  178. U32 reg_rdata;
  179. start_time_ns = _pwrap_get_current_time();
  180. timeout_ns = _pwrap_time2ns(timeout_us);
  181. do {
  182. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  183. PWRAPERR("wait_for_state_idle_init timeout when waiting for idle\n");
  184. pwrap_dump_ap_register();
  185. return E_PWR_WAIT_IDLE_TIMEOUT;
  186. }
  187. reg_rdata = WRAP_RD32(wacs_register);
  188. /*if last read command timeout,clear vldclr bit
  189. *read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle */
  190. switch ( GET_WACS0_FSM( reg_rdata ) ) {
  191. case WACS_FSM_WFVLDCLR:
  192. WRAP_WR32(wacs_vldclr_register , 1);
  193. PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  194. break;
  195. case WACS_FSM_WFDLE:
  196. PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n");
  197. break;
  198. case WACS_FSM_REQ:
  199. PWRAPERR("WACS_FSM = WACS_FSM_REQ\n");
  200. break;
  201. default:
  202. break;
  203. }
  204. } while ( fp(reg_rdata)); /* IDLE State */
  205. if (read_reg)
  206. *read_reg = reg_rdata;
  207. return 0;
  208. }
  209. static inline U32 wait_for_state_idle(loop_condition_fp fp,U32 timeout_us,U32 wacs_register,U32 wacs_vldclr_register,U32 *read_reg)
  210. {
  211. U64 start_time_ns=0, timeout_ns=0;
  212. U32 reg_rdata;
  213. start_time_ns = _pwrap_get_current_time();
  214. timeout_ns = _pwrap_time2ns(timeout_us);
  215. do {
  216. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  217. PWRAPERR("wait_for_state_idle timeout when waiting for idle\n");
  218. pwrap_dump_ap_register();
  219. return E_PWR_WAIT_IDLE_TIMEOUT;
  220. }
  221. reg_rdata = WRAP_RD32(wacs_register);
  222. if ( GET_INIT_DONE0( reg_rdata ) != WACS_INIT_DONE) {
  223. PWRAPERR("initialization isn't finished \n");
  224. return E_PWR_NOT_INIT_DONE;
  225. }
  226. /* if last read command timeout,clear vldclr bit
  227. *read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle */
  228. switch ( GET_WACS0_FSM( reg_rdata ) ) {
  229. case WACS_FSM_WFVLDCLR:
  230. WRAP_WR32(wacs_vldclr_register , 1);
  231. PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  232. break;
  233. case WACS_FSM_WFDLE:
  234. PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n");
  235. break;
  236. case WACS_FSM_REQ:
  237. PWRAPERR("WACS_FSM = WACS_FSM_REQ\n");
  238. break;
  239. default:
  240. break;
  241. }
  242. } while ( fp(reg_rdata)); /*IDLE State*/
  243. if (read_reg)
  244. *read_reg = reg_rdata;
  245. return 0;
  246. }
  247. static inline U32 wait_for_state_ready(loop_condition_fp fp,U32 timeout_us,U32 wacs_register,U32 *read_reg)
  248. {
  249. U64 start_time_ns=0, timeout_ns=0;
  250. U32 reg_rdata;
  251. start_time_ns = _pwrap_get_current_time();
  252. timeout_ns = _pwrap_time2ns(timeout_us);
  253. do {
  254. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  255. PWRAPERR("timeout when waiting for idle\n");
  256. pwrap_dump_ap_register();
  257. return E_PWR_WAIT_IDLE_TIMEOUT;
  258. }
  259. reg_rdata = WRAP_RD32(wacs_register);
  260. if ( GET_INIT_DONE0( reg_rdata ) != WACS_INIT_DONE) {
  261. PWRAPERR("initialization isn't finished \n");
  262. return E_PWR_NOT_INIT_DONE;
  263. }
  264. } while ( fp(reg_rdata)); /*IDLE State */
  265. if (read_reg)
  266. *read_reg = reg_rdata;
  267. return 0;
  268. }
  269. /*********************** external API for pmic_wrap user ************************/
  270. S32 pwrap_read( U32 adr, U32 *rdata )
  271. {
  272. return pwrap_wacs2(0,adr,0,rdata);
  273. }
  274. S32 pwrap_write( U32 adr, U32 wdata )
  275. {
  276. return pwrap_wacs2(1,adr,wdata,0);
  277. }
  278. /******************************************************
  279. * Function : pwrap_wacs2()
  280. * Description :
  281. * Parameter :
  282. * Return :
  283. ******************************************************/
  284. S32 pwrap_wacs2( U32 write, U32 adr, U32 wdata, U32 *rdata )
  285. {
  286. U32 reg_rdata=0;
  287. U32 wacs_write=0;
  288. U32 wacs_adr=0;
  289. U32 wacs_cmd=0;
  290. U32 return_value=0;
  291. /* Check argument validation */
  292. if ( (write & ~(0x1)) != 0) return E_PWR_INVALID_RW;
  293. if ( (adr & ~(0xffff)) != 0) return E_PWR_INVALID_ADDR;
  294. if ( (wdata & ~(0xffff)) != 0) return E_PWR_INVALID_WDAT;
  295. /* Check IDLE & INIT_DONE in advance */
  296. return_value = wait_for_state_idle(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,PMIC_WRAP_WACS2_VLDCLR,0);
  297. if ( return_value != 0 ) {
  298. PWRAPERR("wait_for_fsm_idle fail,return_value=%d\n",return_value);
  299. goto FAIL;
  300. }
  301. wacs_write = write << 31;
  302. wacs_adr = (adr >> 1) << 16;
  303. wacs_cmd = wacs_write | wacs_adr | wdata;
  304. WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd);
  305. if ( write == 0 ) {
  306. if (NULL == rdata) {
  307. PWRAPERR("rdata is a NULL pointer\n");
  308. return_value= E_PWR_INVALID_ARG;
  309. goto FAIL;
  310. }
  311. return_value = wait_for_state_ready(wait_for_fsm_vldclr,TIMEOUT_READ,PMIC_WRAP_WACS2_RDATA,&reg_rdata);
  312. if ( return_value != 0 ) {
  313. PWRAPERR("wait_for_fsm_vldclr fail,return_value=%d\n",return_value);
  314. return_value+=1;
  315. goto FAIL;
  316. }
  317. *rdata = GET_WACS0_RDATA( reg_rdata );
  318. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1);
  319. }
  320. FAIL:
  321. if ( return_value != 0 ) {
  322. PWRAPERR("pwrap_wacs2 fail,return_value=%d\n",return_value);
  323. PWRAPERR("timeout:BUG_ON here\n");
  324. }
  325. return return_value;
  326. }
  327. /*********************internal API for pwrap_init***************************/
  328. /**********************************
  329. * Function : _pwrap_wacs2_nochk()
  330. * Description :
  331. * Parameter :
  332. * Return :
  333. ***********************************/
  334. static S32 pwrap_read_nochk( U32 adr, U32 *rdata )
  335. {
  336. return _pwrap_wacs2_nochk( 0, adr, 0, rdata );
  337. }
  338. static S32 pwrap_write_nochk( U32 adr, U32 wdata )
  339. {
  340. return _pwrap_wacs2_nochk( 1, adr,wdata,0 );
  341. }
  342. static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata )
  343. {
  344. U32 reg_rdata=0x0;
  345. U32 wacs_write=0x0;
  346. U32 wacs_adr=0x0;
  347. U32 wacs_cmd=0x0;
  348. U32 return_value=0x0;
  349. /* Check argument validation */
  350. if ( (write & ~(0x1)) != 0) return E_PWR_INVALID_RW;
  351. if ( (adr & ~(0xffff)) != 0) return E_PWR_INVALID_ADDR;
  352. if ( (wdata & ~(0xffff)) != 0) return E_PWR_INVALID_WDAT;
  353. /* Check IDLE */
  354. return_value=wait_for_state_ready_init(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  355. if ( return_value != 0) {
  356. PWRAPERR("_pwrap_wacs2_nochk write command fail,return_value=%x\n", return_value);
  357. return return_value;
  358. }
  359. wacs_write = write << 31;
  360. wacs_adr = (adr >> 1) << 16;
  361. wacs_cmd= wacs_write | wacs_adr | wdata;
  362. WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd);
  363. if ( write == 0 ) {
  364. if (NULL == rdata) {
  365. PWRAPERR("rdata is a NULL pointer\n");
  366. return_value= E_PWR_INVALID_ARG;
  367. return return_value;
  368. }
  369. return_value=wait_for_state_ready_init(wait_for_fsm_vldclr,TIMEOUT_READ,PMIC_WRAP_WACS2_RDATA,&reg_rdata);
  370. if ( return_value != 0 ) {
  371. PWRAPERR("wait_for_fsm_vldclr fail,return_value=%d\n",return_value);
  372. return_value+=1;
  373. return return_value;
  374. }
  375. *rdata = GET_WACS0_RDATA(reg_rdata);
  376. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1);
  377. }
  378. return 0;
  379. }
  380. /************************************************
  381. * Function : _pwrap_init_dio()
  382. * Description :call it in pwrap_init,mustn't check init done
  383. * Parameter :
  384. * Return :
  385. ************************************************/
  386. static S32 _pwrap_init_dio( U32 dio_en )
  387. {
  388. U32 arb_en_backup=0x0;
  389. /* U32 rdata=0x0; */
  390. U32 return_value=0;
  391. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  392. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , WACS2);
  393. #ifdef SLV_6351
  394. pwrap_write_nochk(MT6351_DEW_DIO_EN, (dio_en));
  395. #endif
  396. /* Check IDLE & INIT_DONE in advance */
  397. return_value=wait_for_state_ready_init(wait_for_idle_and_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  398. if ( return_value != 0 ) {
  399. PWRAPERR("_pwrap_init_dio fail,return_value=%x\n", return_value);
  400. return return_value;
  401. }
  402. /* enable AP DIO mode */
  403. WRAP_WR32(PMIC_WRAP_DIO_EN , dio_en);
  404. /* Read Test */
  405. /* #ifdef SLV_6351
  406. pwrap_read_nochk(MT6351_DEW_READ_TEST, &rdata);
  407. if ( rdata != MT6351_DEFAULT_VALUE_READ_TEST ) {
  408. PWRAPERR("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=%x\n", dio_en, rdata,MT6351_DEFAULT_VALUE_READ_TEST);
  409. return E_PWR_READ_TEST_FAIL;
  410. }
  411. #endif*/
  412. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  413. return 0;
  414. }
  415. /***************************************************
  416. * Function : _pwrap_init_cipher()
  417. * Description :
  418. * Parameter :
  419. * Return :
  420. ****************************************************/
  421. static S32 _pwrap_init_cipher( void )
  422. {
  423. U32 arb_en_backup=0;
  424. U32 rdata=0;
  425. U32 return_value=0;
  426. U32 start_time_ns=0, timeout_ns=0;
  427. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  428. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN ,WACS2);
  429. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 1);
  430. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 0);
  431. WRAP_WR32(PMIC_WRAP_CIPHER_KEY_SEL , 1);
  432. WRAP_WR32(PMIC_WRAP_CIPHER_IV_SEL , 2);
  433. WRAP_WR32(PMIC_WRAP_CIPHER_EN , 1);
  434. /* Config CIPHER @ PMIC */
  435. #ifdef SLV_6351
  436. pwrap_write_nochk(MT6351_DEW_CIPHER_SWRST, 0x1);
  437. pwrap_write_nochk(MT6351_DEW_CIPHER_SWRST, 0x0);
  438. pwrap_write_nochk(MT6351_DEW_CIPHER_KEY_SEL, 0x1);
  439. pwrap_write_nochk(MT6351_DEW_CIPHER_IV_SEL, 0x2);
  440. pwrap_write_nochk(MT6351_DEW_CIPHER_EN, 0x1);
  441. #endif
  442. /*wait for cipher data ready@AP */
  443. return_value=wait_for_state_ready_init(wait_for_cipher_ready,TIMEOUT_WAIT_IDLE,PMIC_WRAP_CIPHER_RDY,0);
  444. if ( return_value != 0 ) {
  445. PWRAPERR("wait for cipher data ready@AP fail,return_value=%x\n", return_value);
  446. return return_value;
  447. }
  448. PWRAPLOG("cipher data ready@AP\n");
  449. /* wait for cipher data ready@PMIC */
  450. #ifdef SLV_6351
  451. start_time_ns = _pwrap_get_current_time();
  452. timeout_ns = _pwrap_time2ns(0xFFFFFF);
  453. do {
  454. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  455. PWRAPERR("wait for cipher data ready@PMIC\n");
  456. }
  457. pwrap_read_nochk(MT6351_DEW_CIPHER_RDY,&rdata);
  458. } while ( rdata != 0x1 ); /* cipher_ready */
  459. return_value = pwrap_write_nochk(MT6351_DEW_CIPHER_MODE, 0x1);
  460. if ( return_value != 0 ) {
  461. PWRAPERR("write MT6351_DEW_CIPHER_MODE fail,return_value=%x\n", return_value);
  462. return return_value;
  463. }
  464. #endif
  465. PWRAPLOG("cipher data ready@PMIC\n");
  466. /* wait for cipher mode idle */
  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. PWRAPERR("wait for cipher mode idle fail,return_value=%x\n", return_value);
  470. return return_value;
  471. }
  472. WRAP_WR32(PMIC_WRAP_CIPHER_MODE , 1);
  473. /* Read Test */
  474. #ifdef SLV_6351
  475. pwrap_read_nochk(MT6351_DEW_READ_TEST, &rdata);
  476. if ( rdata != MT6351_DEFAULT_VALUE_READ_TEST ) {
  477. PWRAPERR("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata);
  478. return E_PWR_READ_TEST_FAIL;
  479. }
  480. #endif
  481. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  482. return 0;
  483. }
  484. static void _pwrap_adc_set()
  485. {
  486. /*pwrap_write_nochk(MT6351_DEW_CRC_EN, 0x1);*/
  487. WRAP_WR32(PMIC_WRAP_SIG_ADR, MT6351_DEW_CRC_VAL);
  488. WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN, 0x75);
  489. /*WRAP_WR32(PMIC_WRAP_CRC_EN, 0x1);*/
  490. WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR, MT6351_INT_STA);
  491. WRAP_WR32(PMIC_WRAP_ADC_CMD_ADDR, MT6351_AUXADC_RQST1_SET);
  492. WRAP_WR32(PMIC_WRAP_PWRAP_ADC_CMD, 0x0100);
  493. WRAP_WR32(PMIC_WRAP_ADC_RDATA_ADDR, MT6351_AUXADC_ADC16);
  494. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_LATEST, MT6351_AUXADC_ADC32);
  495. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_WP, MT6351_AUXADC_MDBG_1);
  496. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR0, MT6351_AUXADC_BUF0);
  497. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR1, MT6351_AUXADC_BUF1);
  498. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR2, MT6351_AUXADC_BUF2);
  499. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR3, MT6351_AUXADC_BUF3);
  500. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR4, MT6351_AUXADC_BUF4);
  501. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR5, MT6351_AUXADC_BUF5);
  502. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR6, MT6351_AUXADC_BUF6);
  503. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR7, MT6351_AUXADC_BUF7);
  504. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR8, MT6351_AUXADC_BUF8);
  505. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR9, MT6351_AUXADC_BUF9);
  506. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR10, MT6351_AUXADC_BUF10);
  507. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR11, MT6351_AUXADC_BUF11);
  508. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR12, MT6351_AUXADC_BUF12);
  509. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR13, MT6351_AUXADC_BUF13);
  510. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR14, MT6351_AUXADC_BUF14);
  511. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR15, MT6351_AUXADC_BUF15);
  512. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR16, MT6351_AUXADC_BUF16);
  513. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR17, MT6351_AUXADC_BUF17);
  514. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR18, MT6351_AUXADC_BUF18);
  515. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR19, MT6351_AUXADC_BUF19);
  516. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR20, MT6351_AUXADC_BUF20);
  517. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR21, MT6351_AUXADC_BUF21);
  518. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR22, MT6351_AUXADC_BUF22);
  519. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR23, MT6351_AUXADC_BUF23);
  520. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR24, MT6351_AUXADC_BUF24);
  521. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR25, MT6351_AUXADC_BUF25);
  522. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR26, MT6351_AUXADC_BUF26);
  523. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR27, MT6351_AUXADC_BUF27);
  524. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR28, MT6351_AUXADC_BUF28);
  525. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR29, MT6351_AUXADC_BUF29);
  526. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR30, MT6351_AUXADC_BUF30);
  527. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR31, MT6351_AUXADC_BUF31);
  528. return;
  529. }
  530. static void _pwrap_starve_set()
  531. {
  532. WRAP_WR32(PMIC_WRAP_HARB_HPRIO, 0x0007);
  533. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_0, 0x0402);
  534. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_1, 0x0402);
  535. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_2, 0x0403);
  536. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_3, 0x0414);
  537. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_4, 0x0420);
  538. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_5, 0x0420);
  539. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_6, 0x0420);
  540. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_7, 0x0428);
  541. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_8, 0x0428);
  542. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_9, 0x0417);
  543. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_10, 0x0563);
  544. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_11, 0x047C);
  545. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_12, 0x0740);
  546. return;
  547. }
  548. static void _pwrap_enable()
  549. {
  550. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, 0x01fff);
  551. WRAP_WR32(PMIC_WRAP_WACS0_EN, 0x1);
  552. WRAP_WR32(PMIC_WRAP_WACS1_EN, 0x1);
  553. WRAP_WR32(PMIC_WRAP_WACS3_EN, 0x1);
  554. WRAP_WR32(PMIC_WRAP_STAUPD_PRD, 0x5);
  555. WRAP_WR32(PMIC_WRAP_WDT_UNIT, 0xf);
  556. WRAP_WR32(PMIC_WRAP_WDT_SRC_EN, 0xffffffff);
  557. WRAP_WR32(PMIC_WRAP_TIMER_EN, 0x1);
  558. WRAP_WR32(PMIC_WRAP_INT0_EN, 0xfffffffd);
  559. WRAP_WR32(PMIC_WRAP_INT1_EN, 0x0001ffff);
  560. return;
  561. }
  562. /************************************************
  563. * Function : _pwrap_init_sistrobe()
  564. * scription : Initialize SI_CK_CON and SIDLY
  565. * Parameter :
  566. * Return :
  567. ************************************************/
  568. static S32 _pwrap_init_sistrobe( void )
  569. {
  570. U32 arb_en_backup=0;
  571. U32 rdata=0;
  572. S32 ind=0,sidly=0;
  573. U32 result_faulty=0;
  574. U64 result = 0, inds = 0, indf = 0, tmp1 = 0, tmp2 = 0;
  575. S32 leading_one = 0;
  576. S32 tailing_one = 0;
  577. S32 i = 0, fail_cnt = 0;
  578. U32 test_data[30] = {0x6996,0x9669,0x6996,0x9669,0x6996,0x9669,0x6996,0x9669,0x6996,0x9669,
  579. 0x5AA5,0xA55A,0x5AA5,0xA55A,0x5AA5,0xA55A,0x5AA5,0xA55A,0x5AA5,0xA55A,
  580. 0x1B27,0x1B27,0x1B27,0x1B27,0x1B27,0x1B27,0x1B27,0x1B27,0x1B27,0x1B27
  581. };
  582. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  583. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, WACS2); /* only WACS2 */
  584. /* --------------------------------------------------------------------- */
  585. /* Scan all possible input strobe by READ_TEST */
  586. /* --------------------------------------------------------------------- */
  587. for (ind = 0; ind < 24; ind++) { /* 24 sampling clock edge */
  588. WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7);
  589. WRAP_WR32(PMIC_WRAP_SIDLY ,0x3 - (ind & 0x3));
  590. #ifdef SLV_6351
  591. /* _pwrap_wacs2_nochk(0, MT6351_DEW_READ_TEST, 0, &rdata);
  592. if ( rdata == MT6351_DEFAULT_VALUE_READ_TEST ) {
  593. PWRAPERR("_pwrap_init_sistrobe [Read Test of MT6351] pass,index=%d rdata=%x\n",ind, rdata);
  594. result |= (0x1 << ind);
  595. } else {
  596. PWRAPERR("_pwrap_init_sistrobe [Read Test of MT6351] tuning,index=%d rdata=%x\n",ind, rdata);
  597. } */
  598. fail_cnt = 0;
  599. for (i = 0; i < 30; i++) {
  600. _pwrap_wacs2_nochk(1, MT6351_DEW_WRITE_TEST, test_data[i], &rdata);
  601. _pwrap_wacs2_nochk(0, MT6351_DEW_WRITE_TEST, 0, &rdata);
  602. if (rdata != test_data[i]) {
  603. fail_cnt++;
  604. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6351] tuning,index=%d rdata=%x\n",ind, rdata);
  605. break;
  606. } else
  607. PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6351] pass,index=%d rdata=%x\n",ind, rdata);
  608. }
  609. if (fail_cnt == 0)
  610. result |= (0x1 << ind);
  611. #endif
  612. }
  613. /* --------------------------------------------------------------------- */
  614. /* Locate the leading one and trailing one of PMIC 1/2 */
  615. /* --------------------------------------------------------------------- */
  616. for ( ind=23 ; ind>=0 ; ind-- ) {
  617. if (result & (0x1 << ind))
  618. break;
  619. }
  620. leading_one = ind;
  621. for ( ind=0 ; ind<24 ; ind++ ) {
  622. if (result & (0x1 << ind))
  623. break;
  624. }
  625. tailing_one = ind;
  626. /* --------------------------------------------------------------------- */
  627. /* Check the continuity of pass range */
  628. /* --------------------------------------------------------------------- */
  629. tmp1 = (0x1 << (leading_one + 1)) - 1;
  630. tmp2 = (0x1 << tailing_one) - 1;
  631. if ((tmp1 - tmp2) != result) {
  632. PWRAPERR("_pwrap_init_sistrobe Fail, result = %llx, leading_one:%d, tailing_one:%d\n",result, leading_one, tailing_one);
  633. result_faulty = 0x1;
  634. }
  635. /* --------------------------------------------------------------------- */
  636. /* Config SICK and SIDLY to the middle point of pass range */
  637. /* --------------------------------------------------------------------- */
  638. if ( result_faulty == 0 ) {
  639. ind = (leading_one + tailing_one) / 2;
  640. WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7);
  641. sidly = 0x3 - (ind & 0x3);
  642. if (sidly != 0)
  643. sidly--;
  644. WRAP_WR32(PMIC_WRAP_SIDLY , sidly);
  645. /* --------------------------------------------------------------------- */
  646. /* Restore */
  647. /* --------------------------------------------------------------------- */
  648. #ifdef SLV_6351
  649. pwrap_read_nochk(MT6351_DEW_READ_TEST, &rdata);
  650. if ( rdata != MT6351_DEFAULT_VALUE_READ_TEST ) {
  651. PWRAPERR("[init_sistrobe][Read Test] fail,READ_TEST rdata=%x, exp=%x\n",rdata,MT6351_DEFAULT_VALUE_READ_TEST);
  652. return E_PWR_READ_TEST_FAIL;
  653. }
  654. #endif
  655. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup);
  656. return 0;
  657. } else {
  658. PWRAPERR("_pwrap_init_sistrobe Fail,result_faulty=%x\n", result_faulty);
  659. return result_faulty;
  660. }
  661. }
  662. /******************************************************
  663. * Function : _pwrap_reset_spislv()
  664. * Description :
  665. * Parameter :
  666. * Return :
  667. ******************************************************/
  668. static S32 _pwrap_reset_spislv( void )
  669. {
  670. U32 ret=0;
  671. U32 return_value=0;
  672. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , DISABLE_ALL);
  673. WRAP_WR32(PMIC_WRAP_WRAP_EN , DISABLE);
  674. WRAP_WR32(PMIC_WRAP_MUX_SEL , MANUAL_MODE);
  675. WRAP_WR32(PMIC_WRAP_MAN_EN ,ENABLE);
  676. WRAP_WR32(PMIC_WRAP_DIO_EN ,DISABLE);
  677. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSL << 8));
  678. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  679. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSH << 8));
  680. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  681. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  682. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  683. WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8));
  684. return_value=wait_for_state_ready_init(wait_for_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0);
  685. if ( return_value!=0 ) {
  686. PWRAPERR("_pwrap_reset_spislv fail,return_value=%x\n", return_value);
  687. ret = E_PWR_TIMEOUT;
  688. goto timeout;
  689. }
  690. WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE);
  691. WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE);
  692. timeout:
  693. WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE);
  694. WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE);
  695. return ret;
  696. }
  697. static void __pwrap_soft_reset(void)
  698. {
  699. PWRAPLOG("start reset wrapper\n");
  700. WRAP_WR32(INFRA_GLOBALCON_RST0,0x1);
  701. WRAP_WR32(INFRA_GLOBALCON_RST1,0x1);
  702. return;
  703. }
  704. static void __pwrap_spi_clk_set(void)
  705. {
  706. WRAP_WR32(CLK_CFG_5_CLR,CLK_SPI_CK_26M);
  707. /*sys_ck cg enable*/
  708. WRAP_WR32(MODULE_SW_CG_0_SET,0x0000000F);
  709. WRAP_WR32(MODULE_SW_CG_0_CLR,0x0000000F);
  710. return;
  711. }
  712. static S32 _pwrap_init_reg_clock( U32 regck_sel )
  713. {
  714. /* Set Dummy cycle 6351 (assume 18MHz) */
  715. #ifdef SLV_6351
  716. pwrap_write_nochk(MT6351_DEW_RDDMY_NO, 0x8);
  717. #endif
  718. WRAP_WR32(PMIC_WRAP_RDDMY ,0x8);
  719. /* Config SPI Waveform according to reg clk */
  720. if ( regck_sel == 1 ) {
  721. WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0x0);
  722. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0x33);
  723. WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0x0);
  724. WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0x0);
  725. } else { /* Safe mode */
  726. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0xff);
  727. WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0xff);
  728. WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0xf);
  729. WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0xf);
  730. }
  731. return 0;
  732. }
  733. static U32 pwrap_read_test(void)
  734. {
  735. U32 rdata=0;
  736. U32 return_value=0;
  737. /* Read Test */
  738. #ifdef SLV_6351
  739. return_value=pwrap_read(MT6351_DEW_READ_TEST,&rdata);
  740. if ( rdata != MT6351_DEFAULT_VALUE_READ_TEST ) {
  741. PWRAPREG("Read Test fail,rdata=0x%x, exp=0x5aa5,return_value=0x%x\n", rdata,return_value);
  742. return E_PWR_READ_TEST_FAIL;
  743. } else {
  744. PWRAPREG("Read MT6351 Test pass,return_value=%d\n",return_value);
  745. }
  746. #endif
  747. return 0;
  748. }
  749. static U32 pwrap_write_test(void)
  750. {
  751. U32 rdata=0;
  752. U32 sub_return=0;
  753. U32 sub_return1=0;
  754. /* Write test using WACS2 */
  755. #ifdef SLV_6351
  756. sub_return = pwrap_write(MT6351_DEW_WRITE_TEST, MT6351_WRITE_TEST_VALUE);
  757. PWRAPREG("after MT6351 pwrap_write\n");
  758. sub_return1 = pwrap_read(MT6351_DEW_WRITE_TEST,&rdata);
  759. if (( rdata != MT6351_WRITE_TEST_VALUE )||( sub_return != 0 )||( sub_return1 != 0 )) {
  760. PWRAPREG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  761. return E_PWR_INIT_WRITE_TEST;
  762. } else {
  763. PWRAPREG("write MT6351 Test pass\n");
  764. }
  765. #endif
  766. return 0;
  767. }
  768. static void pwrap_ut(U32 ut_test)
  769. {
  770. switch (ut_test) {
  771. case 1:
  772. pwrap_write_test();
  773. break;
  774. case 2:
  775. pwrap_read_test();
  776. break;
  777. default:
  778. PWRAPREG ( "default test.\n" );
  779. break;
  780. }
  781. return;
  782. }
  783. S32 pwrap_init ( void )
  784. {
  785. S32 sub_return=0;
  786. S32 sub_return1=0;
  787. U32 rdata=0x0;
  788. u32 cg_mask = 0;
  789. u32 backup = 0;
  790. PWRAPLOG("LK pwrap_init start!!!!!!!!!!!!! \n");
  791. /* toggle PMIC_WRAP and pwrap_spictl reset */
  792. __pwrap_soft_reset();
  793. PWRAPLOG("pwrap_init---- pwrap_soft_reset ok \n");
  794. /* Set SPI_CK_freq = 26MHz. It can marked when use fpga verify, because it has no address on Everest fpga */
  795. #ifdef MACH_FPGA
  796. #else
  797. __pwrap_spi_clk_set();
  798. #endif
  799. PWRAPLOG("pwrap_init---- pwrap_spi_clk_set ok \n");
  800. /* Enable DCM */
  801. WRAP_WR32(PMIC_WRAP_DCM_EN , 3);
  802. /* no debounce */
  803. WRAP_WR32(PMIC_WRAP_DCM_DBC_PRD ,DISABLE);
  804. PWRAPLOG("pwrap_init---- Enable DCM ok \n");
  805. /* Reset SPISLV */
  806. sub_return=_pwrap_reset_spislv();
  807. if ( sub_return != 0 ) {
  808. PWRAPERR("error,_pwrap_reset_spislv fail,sub_return=%x\n",sub_return);
  809. return E_PWR_INIT_RESET_SPI;
  810. }
  811. PWRAPLOG("pwrap_init---- pwrap_reset_spislv ok \n");
  812. /* Enable WACS2 */
  813. WRAP_WR32(PMIC_WRAP_WRAP_EN,ENABLE);
  814. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,WACS2);
  815. WRAP_WR32(PMIC_WRAP_WACS2_EN,ENABLE);
  816. PWRAPLOG("pwrap_init---- Enable WACS2 ok \n");
  817. /* SPI Waveform Configuration. 0:safe mode, 1:18MHz */
  818. sub_return = _pwrap_init_reg_clock(1);
  819. if ( sub_return != 0) {
  820. PWRAPERR("error,_pwrap_init_reg_clock fail,sub_return=%x\n",sub_return);
  821. return E_PWR_INIT_REG_CLOCK;
  822. }
  823. PWRAPLOG("pwrap_init---- pwrap_init_reg_clock ok \n");
  824. /* Enable DIO mode */
  825. sub_return = _pwrap_init_dio(1);
  826. if ( sub_return != 0 ) {
  827. PWRAPERR("_pwrap_init_dio test error,error code=%x, sub_return=%x\n", 0x11, sub_return);
  828. return E_PWR_INIT_DIO;
  829. }
  830. PWRAPLOG("pwrap_init---- pwrap_init_dio ok \n");
  831. /* Input data calibration flow; */
  832. sub_return = _pwrap_init_sistrobe();
  833. if ( sub_return != 0 ) {
  834. PWRAPERR("error,DrvPWRAP_InitSiStrobe fail,sub_return=%x\n",sub_return);
  835. return E_PWR_INIT_SIDLY;
  836. }
  837. PWRAPLOG("pwrap_init---- pwrap_init_sistrobe ok \n");
  838. /* Enable Encryption */
  839. sub_return = _pwrap_init_cipher();
  840. if ( sub_return != 0 ) {
  841. PWRAPERR("Enable Encryption fail, return=%x\n", sub_return);
  842. return E_PWR_INIT_CIPHER;
  843. }
  844. PWRAPLOG("pwrap_init---- pwrap_init_cipher ok \n");
  845. /* Write test using WACS2. check Wtiet test default value */
  846. #ifdef SLV_6351
  847. sub_return = pwrap_write_nochk(MT6351_DEW_WRITE_TEST, MT6351_WRITE_TEST_VALUE);
  848. sub_return1 = pwrap_read_nochk(MT6351_DEW_WRITE_TEST, &rdata);
  849. if ( rdata != MT6351_WRITE_TEST_VALUE ) {
  850. PWRAPERR("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1);
  851. return E_PWR_INIT_WRITE_TEST;
  852. }
  853. #endif
  854. PWRAPLOG("pwrap_init---- Write test using WACS2 ok \n");
  855. /* Status update function initialization
  856. * 1. Signature Checking using CRC (CRC 0 only)
  857. * 2. EINT update
  858. * 3. Read back Auxadc thermal data for GPD
  859. * 4. Read back Auxadc thermal data for LTE
  860. */
  861. _pwrap_adc_set();
  862. PWRAPLOG("pwrap_init---- pwrap_adc_se ok \n");
  863. /* PMIC WRAP priority adjust */
  864. WRAP_WR32(PMIC_WRAP_PRIORITY_USER_SEL_0, 0x6543C210);
  865. WRAP_WR32(PMIC_WRAP_PRIORITY_USER_SEL_1, 0xFEDBA987);
  866. WRAP_WR32(PMIC_WRAP_ARBITER_OUT_SEL_0, 0x87654210);
  867. WRAP_WR32(PMIC_WRAP_ARBITER_OUT_SEL_1, 0xFED3CBA9);
  868. /* PMIC_WRAP starvation setting */
  869. _pwrap_starve_set();
  870. PWRAPLOG("pwrap_init---- pwrap_starve_set ok \n");
  871. /* PMIC_WRAP enables */
  872. _pwrap_enable();
  873. PWRAPLOG("pwrap_init---- pwrap_enable ok \n");
  874. /* Initialization Done */
  875. WRAP_WR32(PMIC_WRAP_INIT_DONE0, 0x1);
  876. WRAP_WR32(PMIC_WRAP_INIT_DONE1, 0x1);
  877. WRAP_WR32(PMIC_WRAP_INIT_DONE2, 0x1);
  878. WRAP_WR32(PMIC_WRAP_INIT_DONE3, 0x1);
  879. PWRAPLOG("LK pwrap_init Done!!!!!!!!! \n");
  880. return 0;
  881. }
  882. /*-pwrap debug--------------------------------------------------------------------------*/
  883. void pwrap_dump_ap_register(void)
  884. {
  885. U32 i=0;
  886. U32 reg_addr=0;
  887. U32 reg_value=0;
  888. PWRAPREG("dump pwrap register\n");
  889. for (i=0; i<=PMIC_WRAP_REG_RANGE; i++) {
  890. reg_addr=(PMIC_WRAP_BASE+i*4);
  891. reg_value=WRAP_RD32(reg_addr);
  892. PWRAPREG("0x%x=0x%x\n",reg_addr,reg_value);
  893. }
  894. return;
  895. }
  896. S32 pwrap_init_lk ( void )
  897. {
  898. u32 pwrap_ret=0,i=0;
  899. PWRAPFUC();
  900. for (i=0; i<3; i++) {
  901. pwrap_ret = WRAP_RD32(PMIC_WRAP_INIT_DONE2);
  902. PWRAPLOG("is_pwrap_init_done %d \n", pwrap_ret);
  903. if (pwrap_ret != 0)
  904. return 0;
  905. pwrap_ret = pwrap_init();
  906. if (pwrap_ret!=0) {
  907. dprintf(CRITICAL,"[PMIC_WRAP]wrap_init fail,the return value=%x.\n",pwrap_ret);
  908. } else {
  909. dprintf(CRITICAL,"[PMIC_WRAP]wrap_init pass,the return value=%x.\n",pwrap_ret);
  910. break;
  911. }
  912. }
  913. return 0;
  914. }
  915. #endif /*endif PMIC_WRAP_NO_PMIC */