mt_pmic.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. #include <platform/mt_typedefs.h>
  2. #include <platform/mt_reg_base.h>
  3. #include <platform/mt_pmic.h>
  4. #include <platform/mt_gpt.h>
  5. #include <platform/mt_pmic_wrap_init.h>
  6. #include <printf.h>
  7. #include <platform/upmu_hw.h>
  8. #include <platform/upmu_common.h>
  9. #include <platform/mt6311.h>
  10. //==============================================================================
  11. // Global variable
  12. //==============================================================================
  13. int Enable_PMIC_LOG = 1;
  14. CHARGER_TYPE g_ret = CHARGER_UNKNOWN;
  15. int g_charger_in_flag = 0;
  16. int g_first_check=0;
  17. extern int g_R_BAT_SENSE;
  18. extern int g_R_I_SENSE;
  19. extern int g_R_CHARGER_1;
  20. extern int g_R_CHARGER_2;
  21. //==============================================================================
  22. // PMIC-AUXADC related define
  23. //==============================================================================
  24. #define VOLTAGE_FULL_RANGE 1800
  25. #define ADC_PRECISE 32768 // 15 bits
  26. //==============================================================================
  27. // PMIC-AUXADC global variable
  28. //==============================================================================
  29. kal_int32 count_time_out=10000;
  30. //==============================================================================
  31. // PMIC access API
  32. //==============================================================================
  33. U32 pmic_read_interface (U32 RegNum, U32 *val, U32 MASK, U32 SHIFT)
  34. {
  35. U32 return_value = 0;
  36. U32 pmic_reg = 0;
  37. U32 rdata = 0;
  38. //mt_read_byte(RegNum, &pmic_reg);
  39. return_value= pwrap_wacs2(0, (RegNum), 0, &rdata);
  40. pmic_reg=rdata;
  41. if(return_value!=0)
  42. {
  43. dprintf(INFO, "[pmic_read_interface] Reg[%x]= pmic_wrap read data fail\n", RegNum);
  44. return return_value;
  45. }
  46. //dprintf(INFO, "[pmic_read_interface] Reg[%x]=0x%x\n", RegNum, pmic_reg);
  47. pmic_reg &= (MASK << SHIFT);
  48. *val = (pmic_reg >> SHIFT);
  49. //dprintf(INFO, "[pmic_read_interface] val=0x%x\n", *val);
  50. return return_value;
  51. }
  52. U32 pmic_config_interface (U32 RegNum, U32 val, U32 MASK, U32 SHIFT)
  53. {
  54. U32 return_value = 0;
  55. U32 pmic_reg = 0;
  56. U32 rdata = 0;
  57. //1. mt_read_byte(RegNum, &pmic_reg);
  58. return_value= pwrap_wacs2(0, (RegNum), 0, &rdata);
  59. pmic_reg=rdata;
  60. if(return_value!=0)
  61. {
  62. dprintf(INFO, "[pmic_config_interface] Reg[%x]= pmic_wrap read data fail\n", RegNum);
  63. return return_value;
  64. }
  65. //dprintf(INFO, "[pmic_config_interface] Reg[%x]=0x%x\n", RegNum, pmic_reg);
  66. pmic_reg &= ~(MASK << SHIFT);
  67. pmic_reg |= (val << SHIFT);
  68. //2. mt_write_byte(RegNum, pmic_reg);
  69. return_value= pwrap_wacs2(1, (RegNum), pmic_reg, &rdata);
  70. if(return_value!=0)
  71. {
  72. dprintf(INFO, "[pmic_config_interface] Reg[%x]= pmic_wrap read data fail\n", RegNum);
  73. return return_value;
  74. }
  75. //dprintf(INFO, "[pmic_config_interface] write Reg[%x]=0x%x\n", RegNum, pmic_reg);
  76. #if 0
  77. //3. Double Check
  78. //mt_read_byte(RegNum, &pmic_reg);
  79. return_value= pwrap_wacs2(0, (RegNum), 0, &rdata);
  80. pmic_reg=rdata;
  81. if(return_value!=0)
  82. {
  83. dprintf(INFO, "[pmic_config_interface] Reg[%x]= pmic_wrap write data fail\n", RegNum);
  84. return return_value;
  85. }
  86. dprintf(INFO, "[pmic_config_interface] Reg[%x]=0x%x\n", RegNum, pmic_reg);
  87. #endif
  88. return return_value;
  89. }
  90. void upmu_set_reg_value(kal_uint32 reg, kal_uint32 reg_val)
  91. {
  92. pmic_config_interface(reg, reg_val, 0xFFFF, 0x0);
  93. }
  94. //==============================================================================
  95. // PMIC Usage APIs
  96. //==============================================================================
  97. U32 get_mt6325_pmic_chip_version (void)
  98. {
  99. U32 ret=0;
  100. U32 val=0;
  101. ret=pmic_read_interface( (U32)(MT6328_SWCID),
  102. (&val),
  103. (U32)(MT6328_PMIC_SWCID_MASK),
  104. (U32)(MT6328_PMIC_SWCID_SHIFT)
  105. );
  106. if(ret!=0) dprintf(INFO, "%d", ret);
  107. return val;
  108. }
  109. kal_uint32 mt6328_upmu_get_rgs_chrdet(void)
  110. {
  111. kal_uint32 ret = 0;
  112. kal_uint32 val = 0;
  113. ret = pmic_read_interface( (kal_uint32)(MT6328_CHR_CON0),(&val),
  114. (kal_uint32)(MT6328_PMIC_RGS_CHRDET_MASK),
  115. (kal_uint32)(MT6328_PMIC_RGS_CHRDET_SHIFT));
  116. if (ret != 0)
  117. dprintf(CRITICAL, "[%s] error return value: %d\n", __func__, ret);
  118. return val;
  119. }
  120. kal_bool upmu_is_chr_det(void)
  121. {
  122. U32 tmp32=0;
  123. #if 0
  124. tmp32 = 1; // for bring up
  125. #else
  126. tmp32 = mt6328_upmu_get_rgs_chrdet();
  127. #endif
  128. dprintf(CRITICAL, "[upmu_is_chr_det] %d\n", tmp32);
  129. if(tmp32 == 0)
  130. {
  131. return KAL_FALSE;
  132. }
  133. else
  134. {
  135. return KAL_TRUE;
  136. }
  137. }
  138. kal_bool pmic_chrdet_status(void)
  139. {
  140. if( upmu_is_chr_det() == KAL_TRUE )
  141. {
  142. #ifndef USER_BUILD
  143. dprintf(INFO, "[pmic_chrdet_status] Charger exist\r\n");
  144. #endif
  145. return KAL_TRUE;
  146. }
  147. else
  148. {
  149. #ifndef USER_BUILD
  150. dprintf(INFO, "[pmic_chrdet_status] No charger\r\n");
  151. #endif
  152. return KAL_FALSE;
  153. }
  154. }
  155. int pmic_detect_powerkey(void)
  156. {
  157. U32 ret=0;
  158. U32 val=0;
  159. ret=pmic_read_interface( (U32)(MT6328_TOPSTATUS),
  160. (&val),
  161. (U32)(MT6328_PMIC_PWRKEY_DEB_MASK),
  162. (U32)(MT6328_PMIC_PWRKEY_DEB_SHIFT)
  163. );
  164. if(Enable_PMIC_LOG>1)
  165. dprintf(INFO, "%d", ret);
  166. if (val==1){
  167. #ifndef USER_BUILD
  168. dprintf(INFO, "LK pmic powerkey Release\n");
  169. #endif
  170. return 0;
  171. }else{
  172. #ifndef USER_BUILD
  173. dprintf(INFO, "LK pmic powerkey Press\n");
  174. #endif
  175. return 1;
  176. }
  177. }
  178. int pmic_detect_homekey(void)
  179. {
  180. U32 ret=0;
  181. U32 val=0;
  182. ret=pmic_read_interface( (U32)(MT6328_TOPSTATUS),
  183. (&val),
  184. (U32)(MT6328_PMIC_HOMEKEY_DEB_MASK),
  185. (U32)(MT6328_PMIC_HOMEKEY_DEB_SHIFT)
  186. );
  187. if(Enable_PMIC_LOG>1)
  188. dprintf(INFO, "%d", ret);
  189. if (val==1){
  190. #ifndef USER_BUILD
  191. dprintf(INFO, "LK pmic HOMEKEY Release\n");
  192. #endif
  193. return 0;
  194. }else{
  195. #ifndef USER_BUILD
  196. dprintf(INFO, "LK pmic HOMEKEY Press\n");
  197. #endif
  198. return 1;
  199. }
  200. }
  201. kal_uint32 upmu_get_reg_value(kal_uint32 reg)
  202. {
  203. U32 ret=0;
  204. U32 temp_val=0;
  205. ret=pmic_read_interface(reg, &temp_val, 0xFFFF, 0x0);
  206. if(Enable_PMIC_LOG>1)
  207. dprintf(INFO, "%d", ret);
  208. return temp_val;
  209. }
  210. //==============================================================================
  211. // PMIC Init Code
  212. //==============================================================================
  213. void PMIC_INIT_SETTING_V1(void)
  214. {
  215. //dprintf(INFO, "[LK_PMIC_INIT_SETTING_V1] Done\n");
  216. }
  217. void PMIC_CUSTOM_SETTING_V1(void)
  218. {
  219. //dprintf(INFO, "[LK_PMIC_CUSTOM_SETTING_V1] Done\n");
  220. }
  221. U32 pmic_init (void)
  222. {
  223. U32 ret_code = PMIC_TEST_PASS;
  224. dprintf(CRITICAL, "[pmic_init] LK Start..................\n");
  225. dprintf(CRITICAL, "[pmic_init] MT6325 CHIP Code = 0x%x\n", get_mt6325_pmic_chip_version());
  226. PMIC_INIT_SETTING_V1();
  227. PMIC_CUSTOM_SETTING_V1();
  228. #if 1
  229. //mt6311_driver_probe();
  230. #endif
  231. dprintf(CRITICAL, "[pmic_init] Done\n");
  232. return ret_code;
  233. }
  234. //==============================================================================
  235. // PMIC API for LK : AUXADC
  236. //==============================================================================
  237. void pmic_auxadc_init(void)
  238. {
  239. }
  240. kal_uint32 PMIC_IMM_GetOneChannelValue(kal_uint8 dwChannel, int deCount, int trimd)
  241. {
  242. kal_int32 ret_data;
  243. kal_int32 r_val_temp=0;
  244. kal_int32 adc_result=0;
  245. int count=0;
  246. /*
  247. CH0: BATSNS
  248. CH1: ISENSE
  249. CH2: VCDT
  250. CH3: BAT ON
  251. CH4: PMIC TEMP
  252. CH5: ACCDET
  253. CH6:
  254. CH7: TSX
  255. CH8:
  256. CH9:
  257. CH10:
  258. CH11:
  259. CH12:
  260. CH13:
  261. CH14:
  262. CH15:
  263. BATSNS 3v-4.5v
  264. ISENSE 1.5-4.5v
  265. BATON 0-1.8v
  266. VCDT 4v-14v
  267. ACCDET 1.8v
  268. GPS 1.8v
  269. */
  270. if(dwChannel>15)
  271. return -1;
  272. upmu_set_reg_value(0x0a44,0x010a);
  273. upmu_set_reg_value(0x0cec,0x0000);
  274. upmu_set_reg_value(0x0d00,0x0010);
  275. upmu_set_reg_value(0x0f14,0x1290);
  276. pmic_config_interface(MT6328_AUXADC_RQST0_SET,(1<<dwChannel),0xffff,0);
  277. upmu_get_reg_value(0E84);
  278. udelay(50);
  279. switch(dwChannel){
  280. case 0:
  281. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH0_BY_AP) != 1 )
  282. {
  283. mdelay(1);
  284. if( (count++) > count_time_out)
  285. {
  286. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  287. break;
  288. }
  289. }
  290. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH0_BY_AP);
  291. break;
  292. case 1:
  293. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH1_BY_AP) != 1 )
  294. {
  295. mdelay(1);
  296. if( (count++) > count_time_out)
  297. {
  298. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  299. break;
  300. }
  301. }
  302. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH1_BY_AP);
  303. break;
  304. case 2:
  305. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH2) != 1 )
  306. {
  307. mdelay(1);
  308. if( (count++) > count_time_out)
  309. {
  310. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  311. break;
  312. }
  313. }
  314. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH2);
  315. break;
  316. case 3:
  317. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH3) != 1 )
  318. {
  319. mdelay(1);
  320. if( (count++) > count_time_out)
  321. {
  322. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  323. break;
  324. }
  325. }
  326. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH3);
  327. break;
  328. case 4:
  329. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH4) != 1 )
  330. {
  331. mdelay(1);
  332. if( (count++) > count_time_out)
  333. {
  334. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  335. break;
  336. }
  337. }
  338. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH4);
  339. break;
  340. case 5:
  341. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH5) != 1 )
  342. {
  343. mdelay(1);
  344. if( (count++) > count_time_out)
  345. {
  346. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  347. break;
  348. }
  349. }
  350. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH5);
  351. break;
  352. case 6:
  353. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH6) != 1 )
  354. {
  355. mdelay(1);
  356. if( (count++) > count_time_out)
  357. {
  358. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  359. break;
  360. }
  361. }
  362. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH6);
  363. break;
  364. case 7:
  365. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH7_BY_AP) != 1 )
  366. {
  367. mdelay(1);
  368. if( (count++) > count_time_out)
  369. {
  370. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  371. break;
  372. }
  373. }
  374. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH7_BY_AP);
  375. break;
  376. case 8:
  377. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH8) != 1 )
  378. {
  379. mdelay(1);
  380. if( (count++) > count_time_out)
  381. {
  382. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  383. break;
  384. }
  385. }
  386. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH8);
  387. break;
  388. case 9:
  389. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH9) != 1 )
  390. {
  391. mdelay(1);
  392. if( (count++) > count_time_out)
  393. {
  394. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  395. break;
  396. }
  397. }
  398. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH9);
  399. break;
  400. case 10:
  401. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH10) != 1 )
  402. {
  403. mdelay(1);
  404. if( (count++) > count_time_out)
  405. {
  406. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  407. break;
  408. }
  409. }
  410. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH10);
  411. break;
  412. case 11:
  413. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH11) != 1 )
  414. {
  415. mdelay(1);
  416. if( (count++) > count_time_out)
  417. {
  418. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  419. break;
  420. }
  421. }
  422. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH11);
  423. break;
  424. case 12:
  425. case 13:
  426. case 14:
  427. case 15:
  428. while(mt6328_get_register_value(PMIC_AUXADC_ADC_RDY_CH12_15) != 1 )
  429. {
  430. mdelay(1);
  431. if( (count++) > count_time_out)
  432. {
  433. dprintf(CRITICAL, "[IMM_GetOneChannelValue_PMIC] (%d) Time out!\n", dwChannel);
  434. break;
  435. }
  436. }
  437. ret_data = mt6328_get_register_value(PMIC_AUXADC_ADC_OUT_CH12_15);
  438. break;
  439. default:
  440. dprintf(CRITICAL, "[AUXADC] Invalid channel value(%d,%d)\n", dwChannel, trimd);
  441. return -1;
  442. break;
  443. }
  444. switch(dwChannel){
  445. case 0:
  446. r_val_temp = 3;
  447. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/32768;
  448. break;
  449. case 1:
  450. r_val_temp = 3;
  451. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/32768;
  452. break;
  453. case 2:
  454. r_val_temp = 1;
  455. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  456. break;
  457. case 3:
  458. r_val_temp = 1;
  459. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  460. break;
  461. case 4:
  462. r_val_temp = 1;
  463. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  464. break;
  465. case 5:
  466. r_val_temp = 1;
  467. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  468. break;
  469. case 6:
  470. r_val_temp = 1;
  471. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  472. break;
  473. case 7:
  474. r_val_temp = 1;
  475. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/32768;
  476. break;
  477. case 8:
  478. r_val_temp = 1;
  479. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  480. break;
  481. case 9:
  482. case 10:
  483. case 11:
  484. case 12:
  485. case 13:
  486. case 14:
  487. case 15:
  488. case 16:
  489. r_val_temp = 1;
  490. adc_result = (ret_data*r_val_temp*VOLTAGE_FULL_RANGE)/4096;
  491. break;
  492. default:
  493. dprintf(CRITICAL, "[AUXADC] Invalid channel value(%d,%d)\n", dwChannel, trimd);
  494. return -1;
  495. break;
  496. }
  497. dprintf(CRITICAL, "[AUXADC] ch=%d raw=%d data=%d \n", dwChannel, ret_data,adc_result);
  498. //return ret_data;
  499. return adc_result;
  500. }
  501. //==============================================================================
  502. // PMIC-AUXADC
  503. //==============================================================================
  504. int get_bat_sense_volt(int times)
  505. {
  506. return PMIC_IMM_GetOneChannelValue(0,times,1);
  507. }
  508. int get_i_sense_volt(int times)
  509. {
  510. return PMIC_IMM_GetOneChannelValue(1,times,1);
  511. }
  512. #define R_CHARGER_1 330
  513. #define R_CHARGER_2 39
  514. int get_charger_volt(int times)
  515. {
  516. kal_int32 val;
  517. val=PMIC_IMM_GetOneChannelValue(2,times,1);
  518. val = (((R_CHARGER_1+R_CHARGER_2)*100*val)/R_CHARGER_2)/100;
  519. return val;
  520. }
  521. int get_tbat_volt(int times)
  522. {
  523. return PMIC_IMM_GetOneChannelValue(3,times,1);
  524. }
  525. #define CUST_R_SENSE 68
  526. int get_charging_current(int times)
  527. {
  528. kal_int32 ADC_I_SENSE=1; // 1 measure time
  529. kal_int32 ADC_BAT_SENSE=1; // 1 measure time
  530. int ICharging=0;
  531. ADC_I_SENSE=get_i_sense_volt(1);
  532. ADC_BAT_SENSE=get_bat_sense_volt(1);
  533. ICharging = (ADC_I_SENSE - ADC_BAT_SENSE )*1000/CUST_R_SENSE;
  534. return ICharging;
  535. }
  536. void vibr_Enable_HW(void)
  537. {
  538. pmic_set_register_value(PMIC_RG_VIBR_VOSEL,5);
  539. //mt6325_upmu_set_rg_vibr_vosel(0x5); // 0x5: 2.8V, 0x6: 3V, 0x7: 3.3V
  540. //mt6325_upmu_set_rg_vibr_sw_mode(0);
  541. //mt6325_upmu_set_rg_vibr_fr_ori(1);
  542. pmic_set_register_value(PMIC_RG_VIBR_EN,1);
  543. //mt6325_upmu_set_rg_vibr_en(1);
  544. }
  545. void vibr_Disable_HW(void)
  546. {
  547. pmic_set_register_value(PMIC_RG_VIBR_EN,0);
  548. //mt6325_upmu_set_rg_vibr_en(0);
  549. }
  550. void lcm_Enable_HW(int powerVolt)
  551. {
  552. dprintf(CRITICAL, "[lcm_Enable_HW] powerVolt=%d \n", powerVolt);
  553. if(powerVolt == 1500) {pmic_set_register_value(PMIC_RG_VCAMA_VOSEL, 0);}
  554. else if(powerVolt == 1800) {pmic_set_register_value(PMIC_RG_VCAMA_VOSEL, 1);}
  555. else if(powerVolt == 2500) {pmic_set_register_value(PMIC_RG_VCAMA_VOSEL, 2);}
  556. else if(powerVolt == 2800) {pmic_set_register_value(PMIC_RG_VCAMA_VOSEL, 3);}
  557. else{
  558. dprintf(CRITICAL, "[lcm_Enable_HW] Error Setting %d. DO nothing.\r\n", powerVolt);
  559. return;
  560. }
  561. pmic_set_register_value(PMIC_RG_VCAMA_EN, 1);
  562. }
  563. void lcm_Disable_HW(void)
  564. {
  565. dprintf(CRITICAL, "[lcm_Disable_HW]\n");
  566. pmic_set_register_value(PMIC_RG_VCAMA_EN, 0);
  567. }