pmic_wrap_init_v1.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  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. #include <platform/pmic_wrap_init.h>
  32. /*-----start--Internal API---------------------------------------------------*/
  33. static S32 _pwrap_init_dio(U32 dio_en);
  34. static S32 _pwrap_init_cipher(void);
  35. static S32 _pwrap_init_reg_clock(U32 regck_sel);
  36. static S32 _pwrap_wacs2_nochk(U32 write, U32 adr, U32 wdata, U32 *rdata);
  37. static S32 _pwrap_reset_spislv(void);
  38. /*-----end --Internal API---------------------------------------------------*/
  39. #ifdef PMIC_WRAP_NO_PMIC
  40. /*-pwrap debug--------------------------------------------------------------------------*/
  41. static inline void pwrap_dump_all_register(void)
  42. {
  43. return;
  44. }
  45. S32 pwrap_wacs2(U32 write, U32 adr, U32 wdata, U32 *rdata)
  46. {
  47. PWRAPERR("there is no PMIC real chip,PMIC_WRAP do Nothing\n");
  48. return 0;
  49. }
  50. /*********************************************************************************/
  51. /* extern API for PMIC driver, INT related control, this INT is for PMIC chip to AP */
  52. /*********************************************************************************/
  53. S32 pwrap_read(U32 adr, U32 *rdata)
  54. {
  55. return pwrap_wacs2(0, adr, 0, rdata);
  56. }
  57. S32 pwrap_write(U32 adr, U32 wdata)
  58. {
  59. return pwrap_wacs2(1, adr, wdata, 0);
  60. }
  61. /*
  62. *pmic_wrap init,init wrap interface
  63. *
  64. */
  65. S32 pwrap_init(void)
  66. {
  67. PWRAPERR("There is no PMIC real chip, PMIC_WRAP do Nothing.\n");
  68. return 0;
  69. }
  70. S32 pwrap_read_nochk(U32 adr, U32 *rdata)
  71. {
  72. return pwrap_wacs2_hal(0, adr, 0, rdata);
  73. }
  74. S32 pwrap_write_nochk(U32 adr, U32 wdata)
  75. {
  76. return pwrap_wacs2_hal(1, adr, wdata, 0);
  77. }
  78. /*---------------------------------------------------------------------------*/
  79. #else /* Else of #ifdef PMIC_WRAP_NO_PMIC */
  80. /*-pwrap debug--------------------------------------------------------------------------*/
  81. static inline void pwrap_dump_ap_register(void)
  82. {
  83. U32 i = 0;
  84. PWRAPREG("dump pwrap register, base=0x%x\n", PMIC_WRAP_BASE);
  85. PWRAPREG("address : 3 2 1 0 7 6 5 4 B A 9 8 F E D C\n");
  86. for (i = 0; i <= PMIC_WRAP_REG_RANGE; i += 4) {
  87. PWRAPREG("offset 0x%.3x:0x%.8x 0x%.8x 0x%.8x 0x%.8x\n", i * 4,
  88. WRAP_RD32(PMIC_WRAP_BASE + (i * 4) + 0),
  89. WRAP_RD32(PMIC_WRAP_BASE + (i * 4) + 0x4),
  90. WRAP_RD32(PMIC_WRAP_BASE + (i * 4) + 0x8),
  91. WRAP_RD32(PMIC_WRAP_BASE + (i * 4) + 0xC));
  92. }
  93. }
  94. static inline void pwrap_dump_pmic_register(void)
  95. {
  96. #if 0
  97. U32 i = 0;
  98. U32 reg_addr = 0;
  99. U32 reg_value = 0;
  100. PWRAPREG("dump dewrap register\n");
  101. for (i = 0; i <= 14; i++) {
  102. reg_addr = (DEW_BASE + i * 4);
  103. reg_value = pwrap_read_nochk(reg_addr, &reg_value);
  104. PWRAPREG("0x%x=0x%x\n", reg_addr, reg_value);
  105. }
  106. #endif
  107. return;
  108. }
  109. static inline void pwrap_dump_all_register(void)
  110. {
  111. pwrap_dump_ap_register();
  112. pwrap_dump_pmic_register();
  113. return;
  114. }
  115. /******************************************************************************
  116. pmic wrapper timeout
  117. ******************************************************************************/
  118. #define PWRAP_TIMEOUT
  119. /* use the same API name with kernel driver */
  120. /* however,the timeout API in preloader/lk use tick instead of ns */
  121. #ifdef PWRAP_TIMEOUT
  122. static U64 _pwrap_get_current_time(void)
  123. {
  124. return gpt4_get_current_tick();
  125. }
  126. static BOOL _pwrap_timeout_ns(U64 start_time_ns, U64 timeout_time_ns)
  127. {
  128. return gpt4_timeout_tick(start_time_ns, timeout_time_ns);
  129. }
  130. static U64 _pwrap_time2ns(U64 time_us)
  131. {
  132. return gpt4_time2tick_us(time_us);
  133. }
  134. #else
  135. static U64 _pwrap_get_current_time(void)
  136. {
  137. return 0;
  138. }
  139. static BOOL _pwrap_timeout_ns(U64 start_time_ns, U64 elapse_time)
  140. {
  141. return FALSE;
  142. }
  143. static U64 _pwrap_time2ns(U64 time_us)
  144. {
  145. return 0;
  146. }
  147. #endif /* End of #ifdef PWRAP_TIMEOUT */
  148. /* ##################################################################### */
  149. /* define macro and inline function (for do while loop) */
  150. /* ##################################################################### */
  151. typedef U32(*loop_condition_fp) (U32); /* define a function pointer */
  152. static inline U32 wait_for_fsm_idle(U32 x)
  153. {
  154. return GET_WACS0_FSM(x) != WACS_FSM_IDLE;
  155. }
  156. static inline U32 wait_for_fsm_vldclr(U32 x)
  157. {
  158. return GET_WACS0_FSM(x) != WACS_FSM_WFVLDCLR;
  159. }
  160. static inline U32 wait_for_sync(U32 x)
  161. {
  162. return GET_SYNC_IDLE0(x) != WACS_SYNC_IDLE;
  163. }
  164. static inline U32 wait_for_idle_and_sync(U32 x)
  165. {
  166. return (GET_WACS2_FSM(x) != WACS_FSM_IDLE) || (GET_SYNC_IDLE2(x) != WACS_SYNC_IDLE);
  167. }
  168. static inline U32 wait_for_wrap_idle(U32 x)
  169. {
  170. return (GET_WRAP_FSM(x) != 0x0) || (GET_WRAP_CH_DLE_RESTCNT(x) != 0x0);
  171. }
  172. static inline U32 wait_for_wrap_state_idle(U32 x)
  173. {
  174. return GET_WRAP_AG_DLE_RESTCNT(x) != 0;
  175. }
  176. static inline U32 wait_for_man_idle_and_noreq(U32 x)
  177. {
  178. return (GET_MAN_REQ(x) != MAN_FSM_NO_REQ) || (GET_MAN_FSM(x) != MAN_FSM_IDLE);
  179. }
  180. static inline U32 wait_for_man_vldclr(U32 x)
  181. {
  182. return GET_MAN_FSM(x) != MAN_FSM_WFVLDCLR;
  183. }
  184. static inline U32 wait_for_cipher_ready(U32 x)
  185. {
  186. return x != 3;
  187. }
  188. static inline U32 wait_for_stdupd_idle(U32 x)
  189. {
  190. return GET_STAUPD_FSM(x) != 0x0;
  191. }
  192. static inline U32 wait_for_state_ready_init(loop_condition_fp fp, U32 timeout_us, U32 wacs_register,
  193. U32 *read_reg)
  194. {
  195. U64 start_time_ns = 0, timeout_ns = 0;
  196. U32 reg_rdata = 0x0;
  197. start_time_ns = _pwrap_get_current_time();
  198. timeout_ns = _pwrap_time2ns(timeout_us);
  199. do {
  200. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  201. PWRAPLOG("wait_for_state_ready_init timeout when waiting for idle\n");
  202. return E_PWR_WAIT_IDLE_TIMEOUT;
  203. }
  204. reg_rdata = WRAP_RD32(wacs_register);
  205. } while (fp(reg_rdata)); /* IDLE State */
  206. if (read_reg)
  207. *read_reg = reg_rdata;
  208. return 0;
  209. }
  210. static inline U32 wait_for_state_idle_init(loop_condition_fp fp, U32 timeout_us, U32 wacs_register,
  211. U32 wacs_vldclr_register, U32 *read_reg)
  212. {
  213. U64 start_time_ns = 0, timeout_ns = 0;
  214. U32 reg_rdata;
  215. start_time_ns = _pwrap_get_current_time();
  216. timeout_ns = _pwrap_time2ns(timeout_us);
  217. do {
  218. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  219. PWRAPLOG("wait_for_state_idle_init timeout when waiting for idle\n");
  220. pwrap_dump_ap_register();
  221. /* pwrap_trace_wacs2(); */
  222. /* BUG_ON(1); */
  223. return E_PWR_WAIT_IDLE_TIMEOUT;
  224. }
  225. reg_rdata = WRAP_RD32(wacs_register);
  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. PWRAPLOG("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  232. break;
  233. case WACS_FSM_WFDLE:
  234. PWRAPLOG("WACS_FSM = WACS_FSM_WFDLE\n");
  235. break;
  236. case WACS_FSM_REQ:
  237. PWRAPLOG("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_idle(loop_condition_fp fp, U32 timeout_us, U32 wacs_register,
  248. U32 wacs_vldclr_register, U32 *read_reg)
  249. {
  250. U64 start_time_ns = 0, timeout_ns = 0;
  251. U64 loop_counter = 0;
  252. U32 reg_rdata;
  253. start_time_ns = _pwrap_get_current_time();
  254. timeout_ns = _pwrap_time2ns(timeout_us);
  255. do {
  256. loop_counter++;
  257. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  258. PWRAPLOG
  259. ("wait_for_state_idle timeout when waiting for idle, loop_counter = %lld\n",
  260. loop_counter);
  261. pwrap_dump_ap_register();
  262. /* pwrap_trace_wacs2(); */
  263. /* BUG_ON(1); */
  264. return E_PWR_WAIT_IDLE_TIMEOUT;
  265. }
  266. reg_rdata = WRAP_RD32(wacs_register);
  267. if (GET_INIT_DONE0(reg_rdata) != WACS_INIT_DONE) {
  268. PWRAPLOG("initialization isn't finished\n");
  269. return E_PWR_NOT_INIT_DONE;
  270. }
  271. /* if last read command timeout,clear vldclr bit */
  272. /* read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle */
  273. switch (GET_WACS0_FSM(reg_rdata)) {
  274. case WACS_FSM_WFVLDCLR:
  275. WRAP_WR32(wacs_vldclr_register, 1);
  276. PWRAPLOG("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n");
  277. break;
  278. case WACS_FSM_WFDLE:
  279. PWRAPLOG("WACS_FSM = WACS_FSM_WFDLE\n");
  280. break;
  281. case WACS_FSM_REQ:
  282. PWRAPLOG("WACS_FSM = WACS_FSM_REQ\n");
  283. break;
  284. default:
  285. break;
  286. }
  287. } while (fp(reg_rdata)); /* IDLE State */
  288. if (read_reg)
  289. *read_reg = reg_rdata;
  290. return 0;
  291. }
  292. static inline U32 wait_for_state_ready(loop_condition_fp fp, U32 timeout_us, U32 wacs_register,
  293. U32 *read_reg)
  294. {
  295. U64 start_time_ns = 0, timeout_ns = 0;
  296. U64 loop_count = 0;
  297. U32 reg_rdata;
  298. start_time_ns = _pwrap_get_current_time();
  299. timeout_ns = _pwrap_time2ns(timeout_us);
  300. do {
  301. loop_count++;
  302. if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) {
  303. PWRAPLOG("timeout when waiting for idle, loop_count = %lld\n", loop_count);
  304. pwrap_dump_ap_register();
  305. return E_PWR_WAIT_IDLE_TIMEOUT;
  306. }
  307. reg_rdata = WRAP_RD32(wacs_register);
  308. if (GET_INIT_DONE0(reg_rdata) != WACS_INIT_DONE) {
  309. PWRAPLOG("initialization isn't finished\n");
  310. return E_PWR_NOT_INIT_DONE;
  311. }
  312. } while (fp(reg_rdata)); /* IDLE State */
  313. if (read_reg)
  314. *read_reg = reg_rdata;
  315. return 0;
  316. }
  317. /* ****************************************************************************** */
  318. /* --external API for pmic_wrap user------------------------------------------------- */
  319. /* ****************************************************************************** */
  320. S32 pwrap_read(U32 adr, U32 *rdata)
  321. {
  322. return pwrap_wacs2(0, adr, 0, rdata);
  323. }
  324. S32 pwrap_write(U32 adr, U32 wdata)
  325. {
  326. return pwrap_wacs2(1, adr, wdata, 0);
  327. }
  328. /* -------------------------------------------------------- */
  329. /* Function : pwrap_wacs2() */
  330. /* Description : */
  331. /* Parameter : */
  332. /* Return : */
  333. /* -------------------------------------------------------- */
  334. S32 pwrap_wacs2(U32 write, U32 adr, U32 wdata, U32 *rdata)
  335. {
  336. U32 reg_rdata = 0;
  337. U32 wacs_write = 0;
  338. U32 wacs_adr = 0;
  339. U32 wacs_cmd = 0;
  340. U32 return_value = 0;
  341. /* Check argument validation */
  342. if ((write & ~(0x1)) != 0)
  343. return E_PWR_INVALID_RW;
  344. if ((adr & ~(0xffff)) != 0)
  345. return E_PWR_INVALID_ADDR;
  346. if ((wdata & ~(0xffff)) != 0)
  347. return E_PWR_INVALID_WDAT;
  348. /* Check IDLE & INIT_DONE in advance */
  349. return_value =
  350. wait_for_state_idle(wait_for_fsm_idle, TIMEOUT_WAIT_IDLE, PMIC_WRAP_WACS2_RDATA,
  351. PMIC_WRAP_WACS2_VLDCLR, 0);
  352. if (return_value != 0) {
  353. PWRAPLOG("wait_for_fsm_idle fail,return_value=%d\n", return_value);
  354. goto FAIL;
  355. }
  356. wacs_write = write << 31;
  357. wacs_adr = (adr >> 1) << 16;
  358. wacs_cmd = wacs_write | wacs_adr | wdata;
  359. WRAP_WR32(PMIC_WRAP_WACS2_CMD, wacs_cmd);
  360. if (write == 0) {
  361. if (NULL == rdata) {
  362. PWRAPLOG("rdata is a NULL pointer\n");
  363. return_value = E_PWR_INVALID_ARG;
  364. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR, 1);
  365. goto FAIL;
  366. }
  367. return_value =
  368. wait_for_state_ready(wait_for_fsm_vldclr, TIMEOUT_READ, PMIC_WRAP_WACS2_RDATA,
  369. &reg_rdata);
  370. if (return_value != 0) {
  371. PWRAPLOG("wait_for_fsm_vldclr fail,return_value=%d\n", return_value);
  372. return_value += 1; /* E_PWR_NOT_INIT_DONE_READ or E_PWR_WAIT_IDLE_TIMEOUT_READ */
  373. goto FAIL;
  374. }
  375. *rdata = GET_WACS0_RDATA(reg_rdata);
  376. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR, 1);
  377. }
  378. FAIL:
  379. if (return_value != 0) {
  380. PWRAPLOG("pwrap_wacs2 fail,return_value=%d\n", return_value);
  381. PWRAPLOG("timeout:BUG_ON here\n");
  382. }
  383. return return_value;
  384. }
  385. /* ****************************************************************************** */
  386. /* --internal API for pwrap_init------------------------------------------------- */
  387. /* ****************************************************************************** */
  388. /* -------------------------------------------------------- */
  389. /* Function : _pwrap_wacs2_nochk() */
  390. /* Description : */
  391. /* Parameter : */
  392. /* Return : */
  393. /* -------------------------------------------------------- */
  394. S32 pwrap_read_nochk(U32 adr, U32 *rdata)
  395. {
  396. return _pwrap_wacs2_nochk(0, adr, 0, rdata);
  397. }
  398. S32 pwrap_write_nochk(U32 adr, U32 wdata)
  399. {
  400. return _pwrap_wacs2_nochk(1, adr, wdata, 0);
  401. }
  402. static S32 _pwrap_wacs2_nochk(U32 write, U32 adr, U32 wdata, U32 *rdata)
  403. {
  404. U32 reg_rdata = 0x0;
  405. U32 wacs_write = 0x0;
  406. U32 wacs_adr = 0x0;
  407. U32 wacs_cmd = 0x0;
  408. U32 return_value = 0x0;
  409. /* PWRAPFUC(); */
  410. /* Check argument validation */
  411. if ((write & ~(0x1)) != 0)
  412. return E_PWR_INVALID_RW;
  413. if ((adr & ~(0xffff)) != 0)
  414. return E_PWR_INVALID_ADDR;
  415. if ((wdata & ~(0xffff)) != 0)
  416. return E_PWR_INVALID_WDAT;
  417. /* Check IDLE */
  418. return_value =
  419. wait_for_state_ready_init(wait_for_fsm_idle, TIMEOUT_WAIT_IDLE, PMIC_WRAP_WACS2_RDATA,
  420. 0);
  421. if (return_value != 0) {
  422. PWRAPLOG("_pwrap_wacs2_nochk write command fail,return_value=%x\n", return_value);
  423. return return_value;
  424. }
  425. wacs_write = write << 31;
  426. wacs_adr = (adr >> 1) << 16;
  427. wacs_cmd = wacs_write | wacs_adr | wdata;
  428. WRAP_WR32(PMIC_WRAP_WACS2_CMD, wacs_cmd);
  429. if (write == 0) {
  430. if (NULL == rdata) {
  431. PWRAPLOG("rdata is a NULL pointer\n");
  432. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR, 1);
  433. return E_PWR_INVALID_ARG;
  434. }
  435. /* wait for read data ready */
  436. return_value =
  437. wait_for_state_ready_init(wait_for_fsm_vldclr, TIMEOUT_READ,
  438. PMIC_WRAP_WACS2_RDATA, &reg_rdata);
  439. if (return_value != 0) {
  440. PWRAPLOG("wait_for_fsm_vldclr fail, return_value=%d\n", return_value);
  441. return_value += 1; /* E_PWR_NOT_INIT_DONE_READ or E_PWR_WAIT_IDLE_TIMEOUT_READ */
  442. return return_value;
  443. }
  444. *rdata = GET_WACS0_RDATA(reg_rdata);
  445. WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR, 1);
  446. }
  447. return 0;
  448. }
  449. static S32 _pwrap_check_init_done(void)
  450. {
  451. U32 rdata = 0x0;
  452. rdata = WRAP_RD32(PMIC_WRAP_WACS2_RDATA);
  453. if (GET_INIT_DONE0(rdata) == WACS_INIT_DONE_FINISHED)
  454. return 1;
  455. return 0;
  456. }
  457. static void _pwrap_set_rest(void)
  458. {
  459. WRAP_WR32(INFRA_GLOBALCON_RST2_SET, 0x1); /* Write 1 set */
  460. WRAP_WR32(INFRA_GLOBALCON_RST2_CLR, 0x1); /* Write 1 clr */
  461. }
  462. static void _pwrap_set_spi_clk(void)
  463. {
  464. #ifdef ULPOSC
  465. WRAP_WR32(ULPOSC_CON, 0x0001); /* Enable ulposc */
  466. udelay(1);
  467. WRAP_WR32(ULPOSC_CON, 0x0003); /* Reset ulposc */
  468. udelay(30);
  469. WRAP_WR32(ULPOSC_CON, 0x0001); /* Release reset ulposc */
  470. udelay(130);
  471. WRAP_WR32(ULPOSC_CON, 0x0005);
  472. WRAP_WR32(CLK_CFG_5_SET, 0x0002); /* 52MHz [1:0] */
  473. udelay(20);
  474. WRAP_WR32(PMICW_CLOCK_CTRL, 0x0000); /* pmicw_sw_en */
  475. WRAP_WR32(CLK_CFG_UPDATE, 0x00080000); /* Clock configure update */
  476. WRAP_WR32(MODULE_SW_CG_0_SET, 0x0000000F); /* sys_ck cg enable */
  477. WRAP_WR32(MODULE_SW_CG_0_CLR, 0x0000000F); /* sys_ck cg disable */
  478. #else
  479. WRAP_WR32(CLK_CFG_5_CLR, 0x0001); /* 26MHz [1:0] */
  480. WRAP_WR32(MODULE_SW_CG_0_SET, 0x0000000F); /* sys_ck cg enable */
  481. WRAP_WR32(MODULE_SW_CG_0_CLR, 0x0000000F); /* sys_ck cg disable */
  482. #endif
  483. }
  484. static void _pwrap_set_DCM(void)
  485. {
  486. //S32 sub_return = 0;
  487. WRAP_WR32(PMIC_WRAP_DCM_EN, 3); /* enable CRC DCM and PWRAP DCM */
  488. WRAP_WR32(PMIC_WRAP_DCM_DBC_PRD, DISABLE); /* No debounce */
  489. #if 0
  490. /* 0x10001074 bit[22] = 1?™b0 to disable pmic clock DCM */
  491. sub_return = WRAP_RD32(PMIC_CLOCK_DCM);
  492. WRAP_WR32(PMIC_CLOCK_DCM, (sub_return & 0xFFBFFFFF));
  493. //PWRAPERR("Enable DCM before = %x, after= %x\n", sub_return, WRAP_RD32(PMIC_CLOCK_DCM));
  494. /* 0x10001F0C bit[25] = 1?™b1 to disable apb clock gating mechanism. */
  495. sub_return = WRAP_RD32(APB_CLOCK_GATING);
  496. WRAP_WR32(APB_CLOCK_GATING, ((sub_return & 0xFDFFFFFF) | 0x02000000));
  497. //PWRAPERR("disable apb clock gating before =gg %x, after= %x\n", sub_return, WRAP_RD32(APB_CLOCK_GATING));
  498. #endif
  499. }
  500. /* -------------------------------------------------------- */
  501. /* Function : _pwrap_init_dio() */
  502. /* Description :call it in pwrap_init,mustn't check init done */
  503. /* Parameter : */
  504. /* Return : */
  505. /* -------------------------------------------------------- */
  506. static S32 _pwrap_init_dio(U32 dio_en)
  507. {
  508. U32 arb_en_backup = 0x0;
  509. U32 rdata = 0x0;
  510. U32 return_value = 0;
  511. /* PWRAPFUC(); */
  512. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  513. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, WACS2); /* only WACS2 */
  514. pwrap_write_nochk(PMIC_DEW_DIO_EN_ADDR, dio_en);
  515. /* Check IDLE & INIT_DONE in advance */
  516. return_value =
  517. wait_for_state_ready_init(wait_for_idle_and_sync, TIMEOUT_WAIT_IDLE,
  518. PMIC_WRAP_WACS2_RDATA, 0);
  519. if (return_value != 0) {
  520. PWRAPLOG("_pwrap_init_dio fail,return_value=%x\n", return_value);
  521. return return_value;
  522. }
  523. /* Enable AP DIO mode */
  524. WRAP_WR32(PMIC_WRAP_DIO_EN, dio_en);
  525. /* Read Test */
  526. pwrap_read_nochk(PMIC_DEW_READ_TEST_ADDR, &rdata);
  527. if (rdata != PMIC_DEFAULT_VALUE_READ_TEST) {
  528. PWRAPLOG("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=0x5aa5\n",
  529. dio_en, rdata);
  530. return E_PWR_READ_TEST_FAIL;
  531. }
  532. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, arb_en_backup);
  533. return 0;
  534. }
  535. /* -------------------------------------------------------- */
  536. /* Function : _pwrap_init_cipher() */
  537. /* Description : */
  538. /* Parameter : */
  539. /* Return : */
  540. /* -------------------------------------------------------- */
  541. static S32 _pwrap_init_cipher(void)
  542. {
  543. U32 arb_en_backup = 0;
  544. U32 rdata = 0;
  545. U32 return_value = 0;
  546. U32 start_time_ns = 0, timeout_ns = 0;
  547. /* PWRAPFUC(); */
  548. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  549. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, WACS2); /* only WACS0 */
  550. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST, 1);
  551. WRAP_WR32(PMIC_WRAP_CIPHER_SWRST, 0);
  552. WRAP_WR32(PMIC_WRAP_CIPHER_KEY_SEL, 1);
  553. WRAP_WR32(PMIC_WRAP_CIPHER_IV_SEL, 2);
  554. WRAP_WR32(PMIC_WRAP_CIPHER_EN, 1);
  555. /* Config CIPHER @ PMIC */
  556. pwrap_write_nochk(PMIC_DEW_CIPHER_SWRST_ADDR, 0x1);
  557. pwrap_write_nochk(PMIC_DEW_CIPHER_SWRST_ADDR, 0x0);
  558. pwrap_write_nochk(PMIC_DEW_CIPHER_KEY_SEL_ADDR, 0x1);
  559. pwrap_write_nochk(PMIC_DEW_CIPHER_IV_SEL_ADDR, 0x2);
  560. pwrap_write_nochk(PMIC_DEW_CIPHER_EN_ADDR, 0x1);
  561. /* wait for cipher data ready@AP */
  562. #ifndef CONFIG_MTK_FPGA
  563. return_value =
  564. wait_for_state_ready_init(wait_for_cipher_ready, TIMEOUT_WAIT_IDLE,
  565. PMIC_WRAP_CIPHER_RDY, 0);
  566. #else
  567. return_value =
  568. wait_for_state_ready_init(wait_for_cipher_ready, 0xFFFFFFFF, PMIC_WRAP_CIPHER_RDY, 0);
  569. #endif
  570. if (return_value != 0) {
  571. PWRAPLOG("wait for cipher data ready@AP fail,return_value=%x\n", return_value);
  572. return return_value;
  573. }
  574. /* wait for cipher data ready@PMIC */
  575. start_time_ns = _pwrap_get_current_time();
  576. timeout_ns = _pwrap_time2ns(0xFFFFFF);
  577. do {
  578. if (_pwrap_timeout_ns(start_time_ns, timeout_ns))
  579. PWRAPLOG("wait for cipher data ready@PMIC\n");
  580. pwrap_read_nochk(PMIC_DEW_CIPHER_RDY_ADDR, &rdata);
  581. } while (rdata != 0x1); /* cipher_ready */
  582. pwrap_write_nochk(PMIC_DEW_CIPHER_MODE_ADDR, 0x1);
  583. /* wait for cipher mode idle */
  584. return_value =
  585. wait_for_state_ready_init(wait_for_idle_and_sync, TIMEOUT_WAIT_IDLE,
  586. PMIC_WRAP_WACS2_RDATA, 0);
  587. if (return_value != 0) {
  588. PWRAPLOG("wait for cipher mode idle fail,return_value=%x\n", return_value);
  589. return return_value;
  590. }
  591. WRAP_WR32(PMIC_WRAP_CIPHER_MODE, 1);
  592. /* Read Test */
  593. pwrap_read_nochk(PMIC_DEW_READ_TEST_ADDR, &rdata);
  594. if (rdata != PMIC_DEFAULT_VALUE_READ_TEST) {
  595. PWRAPLOG("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata);
  596. return E_PWR_READ_TEST_FAIL;
  597. }
  598. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, arb_en_backup);
  599. return 0;
  600. }
  601. /* -------------------------------------------------------- */
  602. /* Function : _pwrap_init_sistrobe() */
  603. /* Description : Initialize SI_CK_CON and SIDLY */
  604. /* Parameter : */
  605. /* Return : */
  606. /* -------------------------------------------------------- */
  607. static S32 _pwrap_init_sistrobe(void)
  608. {
  609. U32 arb_en_backup = 0;
  610. U32 rdata = 0;
  611. S32 ind = 0;
  612. U32 result_faulty = 0;
  613. U64 result = 0, tmp1 = 0, tmp2 = 0;
  614. #ifdef ULPOSC
  615. U64 inds = 0, indf = 0;
  616. #endif
  617. S32 leading_one = 0;
  618. S32 tailing_one = 0;
  619. arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN);
  620. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, WACS2); /* only WACS2 */
  621. #ifdef ULPOSC
  622. /* --------------------------------------------------------------------- */
  623. /* Scan all possible input strobe by READ_TEST */
  624. /* --------------------------------------------------------------------- */
  625. result = 0;
  626. result_faulty = 0;
  627. inds = 0;
  628. indf = 0;
  629. for (ind = 0; ind < 44; ind++) { /* 44 sampling clock edge */
  630. WRAP_WR32(PMIC_WRAP_SI_CK_CON, (ind >> 2) & 0xf);
  631. WRAP_WR32(PMIC_WRAP_SIDLY, 0x3 - (ind & 0x3));
  632. _pwrap_wacs2_nochk(0, PMIC_DEW_READ_TEST_ADDR, 0, &rdata);
  633. if (rdata == PMIC_DEFAULT_VALUE_READ_TEST) {
  634. PWRAPERR
  635. ("_pwrap_init_sistrobe [Read Test of %s] pass,index=%d rdata=%x\n",
  636. PMIC_CHIP_STR,ind, rdata);
  637. result |= (0x1 << ind);
  638. } else {
  639. PWRAPERR
  640. ("_pwrap_init_sistrobe [Read Test of %s] tuning,index=%d rdata=%x\n",
  641. PMIC_CHIP_STR,ind, rdata);
  642. }
  643. }
  644. /* --------------------------------------------------------------------- */
  645. /* Locate the leading one and trailing one */
  646. /* --------------------------------------------------------------------- */
  647. for (ind = 43; ind >= 0; ind--) {
  648. if (ind > 20) {
  649. indf = (0x1 << 20);
  650. indf = (indf << ((ind - 20)%32));
  651. } else {
  652. indf = (0x1 << (ind % 32));
  653. }
  654. inds = result & indf;
  655. if (inds)
  656. break;
  657. }
  658. leading_one = ind;
  659. for (ind = 0; ind < 44; ind++) {
  660. if (ind > 20) {
  661. indf = (0x1 << 20);
  662. indf = (indf << ((ind - 20)%32));
  663. } else {
  664. indf = (0x1 << (ind % 32));
  665. }
  666. inds = result & indf;
  667. if (inds)
  668. break;
  669. }
  670. tailing_one = ind;
  671. /* --------------------------------------------------------------------- */
  672. /* Check the continuity of pass range */
  673. /* --------------------------------------------------------------------- */
  674. tmp1 = (0x1 << (leading_one + 1)) - 1;
  675. tmp2 = (0x1 << tailing_one) - 1;
  676. if ((tmp1 - tmp2) != result) {
  677. PWRAPERR("_pwrap_init_sistrobe Fail, result = %llx, leading_one:%d, tailing_one:%d\n",
  678. result, leading_one, tailing_one);
  679. result_faulty = 0x1;
  680. }
  681. /* --------------------------------------------------------------------- */
  682. /* Config SICK and SIDLY to the middle point of pass range */
  683. /* --------------------------------------------------------------------- */
  684. ind = (leading_one + tailing_one) / 2;
  685. WRAP_WR32(PMIC_WRAP_SI_CK_CON, (ind >> 2) & 0xf);
  686. WRAP_WR32(PMIC_WRAP_SIDLY, 0x3 - (ind & 0x3));
  687. #else /* Else of #ifdef ULPOSC */
  688. /* --------------------------------------------------------------------- */
  689. /* Scan all possible input strobe by READ_TEST */
  690. /* --------------------------------------------------------------------- */
  691. for (ind = 0; ind < 24; ind++) { /* 24 sampling clock edge */
  692. WRAP_WR32(PMIC_WRAP_SI_CK_CON, (ind >> 2) & 0x7);
  693. WRAP_WR32(PMIC_WRAP_SIDLY, 0x3 - (ind & 0x3));
  694. _pwrap_wacs2_nochk(0, PMIC_DEW_READ_TEST_ADDR, 0, &rdata);
  695. if (rdata == PMIC_DEFAULT_VALUE_READ_TEST) {
  696. PWRAPERR("_pwrap_init_sistrobe [Read Test of %s] pass,index=%d rdata=%x\n",
  697. PMIC_CHIP_STR,ind, rdata);
  698. result |= (0x1 << ind);
  699. } else {
  700. PWRAPERR
  701. ("_pwrap_init_sistrobe [Read Test of %s] tuning,index=%d rdata=%x\n",
  702. PMIC_CHIP_STR,ind, rdata);
  703. }
  704. }
  705. /* --------------------------------------------------------------------- */
  706. /* Locate the leading one and trailing one of PMIC 1/2 */
  707. /* --------------------------------------------------------------------- */
  708. for (ind = 23; ind >= 0; ind--) {
  709. if (result & (0x1 << ind))
  710. break;
  711. }
  712. leading_one = ind;
  713. for (ind = 0; ind < 24; ind++) {
  714. if (result & (0x1 << ind))
  715. break;
  716. }
  717. tailing_one = ind;
  718. /* --------------------------------------------------------------------- */
  719. /* Check the continuity of pass range */
  720. /* --------------------------------------------------------------------- */
  721. tmp1 = (0x1 << (leading_one + 1)) - 1;
  722. tmp2 = (0x1 << tailing_one) - 1;
  723. if ((tmp1 - tmp2) != result) {
  724. PWRAPERR("_pwrap_init_sistrobe Fail, result = %llx, leading_one:%d, tailing_one:%d\n",
  725. result, leading_one, tailing_one);
  726. result_faulty = 0x1;
  727. }
  728. /* --------------------------------------------------------------------- */
  729. /* Config SICK and SIDLY to the middle point of pass range */
  730. /* --------------------------------------------------------------------- */
  731. if (result_faulty == 0) {
  732. ind = (leading_one + tailing_one) / 2;
  733. WRAP_WR32(PMIC_WRAP_SI_CK_CON, (ind >> 2) & 0x7);
  734. WRAP_WR32(PMIC_WRAP_SIDLY, 0x3 - (ind & 0x3));
  735. /* --------------------------------------------------------------------- */
  736. /* Restore */
  737. /* --------------------------------------------------------------------- */
  738. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, arb_en_backup);
  739. return 0;
  740. } else {
  741. PWRAPERR("_pwrap_init_sistrobe Fail,result_faulty=%x\n", result_faulty);
  742. return result_faulty;
  743. }
  744. #endif /* End of #ifdef ULPOSC */
  745. }
  746. /* -------------------------------------------------------- */
  747. /* Function : _pwrap_reset_spislv() */
  748. /* Description : */
  749. /* Parameter : */
  750. /* Return : */
  751. /* -------------------------------------------------------- */
  752. static S32 _pwrap_reset_spislv(void)
  753. {
  754. U32 ret = 0;
  755. U32 return_value = 0;
  756. /* PWRAPFUC(); */
  757. /* This driver does not using _pwrap_switch_mux */
  758. /* because the remaining requests are expected to fail anyway */
  759. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, DISABLE_ALL);
  760. WRAP_WR32(PMIC_WRAP_WRAP_EN, DISABLE);
  761. WRAP_WR32(PMIC_WRAP_MUX_SEL, MANUAL_MODE);
  762. WRAP_WR32(PMIC_WRAP_MAN_EN, ENABLE);
  763. WRAP_WR32(PMIC_WRAP_DIO_EN, DISABLE);
  764. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_CSL << 8)); /* 0x2100 */
  765. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_OUTS << 8)); /* 0x2800//to reset counter */
  766. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_CSH << 8)); /* 0x2000 */
  767. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_OUTS << 8));
  768. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_OUTS << 8));
  769. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_OUTS << 8));
  770. WRAP_WR32(PMIC_WRAP_MAN_CMD, (OP_WR << 13) | (OP_OUTS << 8));
  771. return_value =
  772. wait_for_state_ready_init(wait_for_sync, TIMEOUT_WAIT_IDLE, PMIC_WRAP_WACS2_RDATA, 0);
  773. if (return_value != 0) {
  774. PWRAPLOG("_pwrap_reset_spislv fail,return_value=%x\n", return_value);
  775. ret = E_PWR_TIMEOUT;
  776. goto timeout;
  777. }
  778. WRAP_WR32(PMIC_WRAP_MAN_EN, DISABLE);
  779. WRAP_WR32(PMIC_WRAP_MUX_SEL, WRAPPER_MODE);
  780. timeout:
  781. WRAP_WR32(PMIC_WRAP_MAN_EN, DISABLE);
  782. WRAP_WR32(PMIC_WRAP_MUX_SEL, WRAPPER_MODE);
  783. return ret;
  784. }
  785. #if 0
  786. static void __pwrap_soft_reset(void)
  787. {
  788. PWRAPLOG("start reset wrapper\n");
  789. PWRAP_SOFT_RESET;
  790. PWRAPLOG("the reset register =%x\n", WRAP_RD32(INFRA_GLOBALCON_RST0));
  791. PWRAPLOG("PMIC_WRAP_STAUPD_GRPEN =0x%x,it should be equal to 0xc\n",
  792. WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN));
  793. /* clear reset bit */
  794. PWRAP_CLEAR_SOFT_RESET_BIT;
  795. return;
  796. }
  797. #endif
  798. static S32 _pwrap_init_reg_clock(U32 regck_sel)
  799. {
  800. PWRAPFUC();
  801. pwrap_write_nochk(PMIC_DEW_RDDMY_NO_ADDR, 0x8);
  802. WRAP_WR32(PMIC_WRAP_RDDMY, 0x08);
  803. /* Config SPI Waveform according to reg clk */
  804. if (regck_sel == 1) { /* 18MHz in 6328, 26Mhz in BBCHip */
  805. WRAP_WR32(PMIC_WRAP_CSHEXT_READ, 0x0);
  806. /* Wait data written into register =>
  807. 4T_PMIC: consists of CSHEXT_WRITE_START+EXT_CK+CSHEXT_WRITE_END+CSLEXT_START */
  808. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE, 0x33);
  809. WRAP_WR32(PMIC_WRAP_CSLEXT_START, 0x0);
  810. WRAP_WR32(PMIC_WRAP_CSLEXT_END, 0x0); /* for PMIC site synchronizer use */
  811. } else { /* Safe mode */
  812. WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE, 0xff);
  813. WRAP_WR32(PMIC_WRAP_CSHEXT_READ, 0xff);
  814. WRAP_WR32(PMIC_WRAP_CSLEXT_START, 0xf);
  815. WRAP_WR32(PMIC_WRAP_CSLEXT_END, 0xf);
  816. }
  817. return 0;
  818. }
  819. static void _pwrap_init_status_update(void)
  820. {
  821. #if 0
  822. sub_return = pwrap_write_nochk(PMIC_DEW_CRC_EN_ADDR, ENABLE);
  823. if (sub_return != 0) {
  824. PWRAPLOG("Enable CRC fail, return=%x\n", sub_return);
  825. return E_PWR_INIT_ENABLE_CRC;
  826. }
  827. WRAP_WR32(PMIC_WRAP_WACS2_EN, PMIC_DEW_CRC_VAL_ADDR);
  828. #endif
  829. WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN, 0x75);
  830. #if 0
  831. WRAP_WR32(PMIC_WRAP_CRC_EN, ENABLE);
  832. #endif
  833. WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR, PMIC_CPU_INT_STA_ADDR); //wilma check
  834. WRAP_WR32(PMIC_WRAP_ADC_CMD_ADDR, PMIC_LDO_LDO_RSV1_RO_ADDR);
  835. WRAP_WR32(PMIC_WRAP_PWRAP_ADC_CMD, 0x0100);
  836. WRAP_WR32(PMIC_WRAP_ADC_RDATA_ADDR, PMIC_AUXADC_ADC_OUT_MDRT_ADDR);
  837. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_LATEST, PMIC_AUXADC_ADC_OUT_MDRT_ADDR);
  838. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_WP, PMIC_AUXADC_MDBG_W_PTR_ADDR);
  839. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR0, PMIC_AUXADC_BUF_OUT_00_ADDR);
  840. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR1, PMIC_AUXADC_BUF_OUT_01_ADDR);
  841. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR2, PMIC_AUXADC_BUF_OUT_02_ADDR);
  842. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR3, PMIC_AUXADC_BUF_OUT_03_ADDR);
  843. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR4, PMIC_AUXADC_BUF_OUT_04_ADDR);
  844. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR5, PMIC_AUXADC_BUF_OUT_05_ADDR);
  845. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR6, PMIC_AUXADC_BUF_OUT_06_ADDR);
  846. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR7, PMIC_AUXADC_BUF_OUT_07_ADDR);
  847. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR8, PMIC_AUXADC_BUF_OUT_08_ADDR);
  848. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR9, PMIC_AUXADC_BUF_OUT_09_ADDR);
  849. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR10, PMIC_AUXADC_BUF_OUT_10_ADDR);
  850. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR11, PMIC_AUXADC_BUF_OUT_11_ADDR);
  851. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR12, PMIC_AUXADC_BUF_OUT_12_ADDR);
  852. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR13, PMIC_AUXADC_BUF_OUT_13_ADDR);
  853. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR14, PMIC_AUXADC_BUF_OUT_14_ADDR);
  854. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR15, PMIC_AUXADC_BUF_OUT_15_ADDR);
  855. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR16, PMIC_AUXADC_BUF_OUT_16_ADDR);
  856. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR17, PMIC_AUXADC_BUF_OUT_17_ADDR);
  857. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR18, PMIC_AUXADC_BUF_OUT_18_ADDR);
  858. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR19, PMIC_AUXADC_BUF_OUT_19_ADDR);
  859. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR20, PMIC_AUXADC_BUF_OUT_20_ADDR);
  860. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR21, PMIC_AUXADC_BUF_OUT_21_ADDR);
  861. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR22, PMIC_AUXADC_BUF_OUT_22_ADDR);
  862. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR23, PMIC_AUXADC_BUF_OUT_23_ADDR);
  863. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR24, PMIC_AUXADC_BUF_OUT_24_ADDR);
  864. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR25, PMIC_AUXADC_BUF_OUT_25_ADDR);
  865. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR26, PMIC_AUXADC_BUF_OUT_26_ADDR);
  866. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR27, PMIC_AUXADC_BUF_OUT_27_ADDR);
  867. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR28, PMIC_AUXADC_BUF_OUT_28_ADDR);
  868. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR29, PMIC_AUXADC_BUF_OUT_29_ADDR);
  869. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR30, PMIC_AUXADC_BUF_OUT_30_ADDR);
  870. WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR31, PMIC_AUXADC_BUF_OUT_31_ADDR);
  871. }
  872. static void _pwrap_adjust_priority(void)
  873. {
  874. WRAP_WR32(PMIC_WRAP_PRIORITY_USER_SEL_0, 0x6543C210);
  875. WRAP_WR32(PMIC_WRAP_PRIORITY_USER_SEL_1, 0xFEDBA987);
  876. WRAP_WR32(PMIC_WRAP_ARBITER_OUT_SEL_0, 0x87654210);
  877. WRAP_WR32(PMIC_WRAP_ARBITER_OUT_SEL_1, 0xFED3CBA9);
  878. }
  879. static void _pwrap_set_starvation(void)
  880. {
  881. /* latency is smaller than 10us, pop up to group"1" first */
  882. WRAP_WR32(PMIC_WRAP_HARB_HPRIO, 0x0007); /* [0]:MD_HW [1]:C2K_HW [2]:MD_DVFS _HW */
  883. /* starvation enable */
  884. /* [0]=MD_HW, latency= 2.6us, target= (2.6/1.2)=2 */
  885. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_0, 0x0402); /* [10]: enable starvation, [9:0]: target setting */
  886. /* [1]=C2K_HW, latency= 2.6us, target= (2.6/1.2)=2 */
  887. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_1, 0x0402); /* [10]: enable starvation, [9:0]: target setting */
  888. /* [2]=MD_DVFS_HW,latency= 5.2us, target= (5.2/1.2)-1=3 */
  889. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_2, 0x0403); /* [10]: enable starvation, [9:0]: target setting */
  890. /* [3]=WACS1(MD_SW1), latency=20us, target= (20/1.2)-1=25 */
  891. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_3, 0x0414); /* [10]: enable starvation, [9:0]: target setting */
  892. /* [4]=WACS0(MD_SW0), latency=40us, target= (40/1.2)-1=32 */
  893. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_4, 0x0420); /* [10]: enable starvation, [9:0]: target setting */
  894. /* [5]=SPM_HW, latency=40us, target= (40/1.2)-1=32 */
  895. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_5, 0x0420); /* [10]: enable starvation, [9:0]: target setting */
  896. /* [6]=WACS3(C2K_SW), latency=40us, target= (40/1.2)-1=32 */
  897. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_6, 0x0420); /* [10]: enable starvation, [9:0]: target setting */
  898. /* [7]=DCXO_CONNINF, latency=50us, target= (50/1.2)-1=40 */
  899. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_7, 0x0428); /* [10]: enable starvation, [9:0]: target setting */
  900. /* [8]=DCXO_NFCINF, latency=50us, target= (50/1.2)-1=40 */
  901. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_8, 0x0428); /* [10]: enable starvation, [9:0]: target setting */
  902. /* [9]=MD_ADCINF, latency=29us, target= (29/1.2)-1= 23 */
  903. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_9, 0x0417); /* [10]: enable starvation, [9:0]: target setting */
  904. /* [10]=STAUPD, latency=428us, target= (428/1.2)-1=355 */
  905. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_10, 0x0563); /* [10]: enable starvation, [9:0]: target setting */
  906. /* [11]=GPS_HW, latency=150us, target= (150/1.2)-1=124 */
  907. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_11, 0x047C); /* [10]: enable starvation, [9:0]: target setting */
  908. /* [12]=WACS2(AP_SW), latency=1000us, target= (1000/1.2)-1=832 */
  909. WRAP_WR32(PMIC_WRAP_STARV_COUNTER_12, 0x0740); /* [10]: enable starvation, [9:0]: target setting */
  910. }
  911. static void _pwrap_set_en(void)
  912. {
  913. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, 0x01fff);
  914. WRAP_WR32(PMIC_WRAP_WACS0_EN, ENABLE);
  915. WRAP_WR32(PMIC_WRAP_WACS1_EN, ENABLE);
  916. WRAP_WR32(PMIC_WRAP_WACS3_EN, ENABLE);
  917. WRAP_WR32(PMIC_WRAP_STAUPD_PRD, 0x5); /* 100us */
  918. WRAP_WR32(PMIC_WRAP_WDT_UNIT, 0xf);
  919. WRAP_WR32(PMIC_WRAP_WDT_SRC_EN, 0xffffffff);
  920. WRAP_WR32(PMIC_WRAP_TIMER_EN, 0x1);
  921. /* WRAP_WR32(PMIC_WRAP_INT0_EN, 0xffffffff); */
  922. WRAP_WR32(PMIC_WRAP_INT0_EN, 0xfffffffD); /* FIX ME */
  923. WRAP_WR32(PMIC_WRAP_INT1_EN, 0x0001ffff);
  924. }
  925. static void _pwrap_set_init_done(void)
  926. {
  927. WRAP_WR32(PMIC_WRAP_INIT_DONE0, ENABLE); /* MD SW0 */
  928. WRAP_WR32(PMIC_WRAP_INIT_DONE1, ENABLE); /* MD SW1 */
  929. WRAP_WR32(PMIC_WRAP_INIT_DONE2, ENABLE); /* AP SW */
  930. WRAP_WR32(PMIC_WRAP_INIT_DONE3, ENABLE); /* C2K SW */
  931. }
  932. /*
  933. * pmic_wrap init,init wrap interface
  934. */
  935. S32 pwrap_init(void)
  936. {
  937. S32 sub_return = 0;
  938. S32 sub_return1 = 0;
  939. U32 rdata = 0x0;
  940. PWRAPFUC();
  941. if (_pwrap_check_init_done())
  942. return 0;
  943. #ifndef CONFIG_MTK_FPGA
  944. /* ############################### */
  945. /* toggle PMIC_WRAP and pwrap_spictl reset */
  946. /* ############################### */
  947. _pwrap_set_rest();
  948. /* ############################### */
  949. /* Set SPI_CK_freq 52MHz or 26MHz */
  950. /* ############################### */
  951. _pwrap_set_spi_clk();
  952. #endif
  953. /* ############################### */
  954. /* Enable DCM */
  955. /* ############################### */
  956. _pwrap_set_DCM();
  957. /* ############################### */
  958. /* Reset all SPISLV */
  959. /* ############################### */
  960. sub_return = _pwrap_reset_spislv();
  961. if (sub_return != 0) {
  962. PWRAPLOG("error,_pwrap_reset_spislv fail,sub_return=%x\n", sub_return);
  963. return E_PWR_INIT_RESET_SPI;
  964. }
  965. /* ############################### */
  966. /* Enable WACS2 */
  967. /* ############################### */
  968. WRAP_WR32(PMIC_WRAP_WRAP_EN, ENABLE); /* enable wrap */
  969. WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN, WACS2); /* Only WACS2 */
  970. WRAP_WR32(PMIC_WRAP_WACS2_EN, ENABLE);
  971. /* ############################### */
  972. /* Input data calibration flow */
  973. /* ############################### */
  974. sub_return = _pwrap_init_sistrobe();
  975. if (sub_return != 0) {
  976. PWRAPLOG("error,DrvPWRAP_InitSiStrobe fail,sub_return=%x\n", sub_return);
  977. return E_PWR_INIT_SIDLY;
  978. }
  979. /* ############################### */
  980. /* SPI Waveform Configuration */
  981. /* ############################### */
  982. /* 0:safe mode, 1:18MHz */
  983. sub_return = _pwrap_init_reg_clock(1);
  984. if (sub_return != 0) {
  985. PWRAPLOG("error,_pwrap_init_reg_clock fail,sub_return=%x\n", sub_return);
  986. return E_PWR_INIT_REG_CLOCK;
  987. }
  988. /* ############################### */
  989. /* Enable DIO mode */
  990. /* ############################### */
  991. sub_return = _pwrap_init_dio(1);
  992. if (sub_return != 0) {
  993. PWRAPLOG("_pwrap_init_dio test error,error code=%x, sub_return=%x\n", 0x11,
  994. sub_return);
  995. return E_PWR_INIT_DIO;
  996. }
  997. /* ############################### */
  998. /* Enable Encryption */
  999. /* ############################### */
  1000. sub_return = _pwrap_init_cipher();
  1001. if (sub_return != 0) {
  1002. PWRAPLOG("Enable Encryption fail, return=%x\n", sub_return);
  1003. return E_PWR_INIT_CIPHER;
  1004. }
  1005. /* ############################### */
  1006. /* Write test using WACS2 */
  1007. /* ############################### */
  1008. sub_return = pwrap_write_nochk(PMIC_DEW_WRITE_TEST_ADDR, PMIC_WRITE_TEST_VALUE);
  1009. sub_return1 = pwrap_read_nochk(PMIC_DEW_WRITE_TEST_ADDR, &rdata);
  1010. if (rdata != PMIC_WRITE_TEST_VALUE) {
  1011. PWRAPLOG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n",
  1012. rdata, sub_return, sub_return1);
  1013. return E_PWR_INIT_WRITE_TEST;
  1014. }
  1015. /* ############################### */
  1016. /* Status update function initialization */
  1017. /* 1. Signature Checking using CRC (CRC 0 only) */
  1018. /* 2. EINT update */
  1019. /* 3. Read back Auxadc thermal data for GPD */
  1020. /* 4. Read back Auxadc thermal data for LTE */
  1021. /* ############################### */
  1022. _pwrap_init_status_update();
  1023. //###############################
  1024. // PMIC_WRAP priority adjusted
  1025. //###############################
  1026. _pwrap_adjust_priority();
  1027. /* ############################### */
  1028. /* PMIC_WRAP starvation setting */
  1029. /* ############################### */
  1030. _pwrap_set_starvation();
  1031. /* ############################### */
  1032. /* PMIC_WRAP enables */
  1033. /* ############################### */
  1034. _pwrap_set_en();
  1035. /* ############################### */
  1036. /* Initialization Done */
  1037. /* ############################### */
  1038. _pwrap_set_init_done();
  1039. return 0;
  1040. }
  1041. S32 pwrap_init_lk(void)
  1042. {
  1043. u32 pwrap_ret = 0, i = 0;
  1044. PWRAPFUC();
  1045. for (i = 0; i < 3; i++) {
  1046. pwrap_ret = pwrap_init();
  1047. if (pwrap_ret != 0) {
  1048. printf("[PMIC_WRAP]wrap_init fail,the return value=%x.\n", pwrap_ret);
  1049. } else {
  1050. printf("[PMIC_WRAP]wrap_init pass,the return value=%x.\n", pwrap_ret);
  1051. break; /* init pass */
  1052. }
  1053. }
  1054. return 0;
  1055. }
  1056. #endif /* End of #if PMIC_WRAP_NO_PMIC */