ncp1854.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947
  1. #include <platform/mt_typedefs.h>
  2. #include <platform/mt_reg_base.h>
  3. #include <platform/mt_i2c.h>
  4. #include <platform/mt_gpio.h>
  5. #include <platform/mt_pmic.h>
  6. #include <platform/ncp1854.h>
  7. #include <printf.h>
  8. #include <target/cust_charging.h>
  9. #if !defined(CONFIG_POWER_EXT)
  10. #include <platform/upmu_common.h>
  11. #endif
  12. int g_ncp1854_log_en=0;
  13. /**********************************************************
  14. *
  15. * [I2C Slave Setting]
  16. *
  17. *********************************************************/
  18. #define NCP1854_SLAVE_ADDR_WRITE 0x6C
  19. #define NCP1854_SLAVE_ADDR_READ 0x6D
  20. /**********************************************************
  21. *
  22. * [Global Variable]
  23. *
  24. *********************************************************/
  25. #define NCP1854_REG_NUM 18
  26. #ifndef NCP1854_BUSNUM
  27. #define NCP1854_BUSNUM 3
  28. #endif
  29. #define PRECC_BATVOL 2800 //preCC 2.8V
  30. /* #ifndef GPIO_SWCHARGER_EN_PIN
  31. #define GPIO_SWCHARGER_EN_PIN 65
  32. #endif */
  33. kal_uint8 ncp1854_reg[NCP1854_REG_NUM] = {0};
  34. /**********************************************************
  35. *
  36. * [I2C Function For Read/Write ncp1854]
  37. *
  38. *********************************************************/
  39. static struct mt_i2c_t ncp1854_i2c;
  40. kal_uint32 ncp1854_write_byte(kal_uint8 addr, kal_uint8 value)
  41. {
  42. kal_uint32 ret_code = I2C_OK;
  43. kal_uint8 write_data[2];
  44. kal_uint16 len;
  45. write_data[0]= addr;
  46. write_data[1] = value;
  47. ncp1854_i2c.id = NCP1854_BUSNUM;
  48. /* Since i2c will left shift 1 bit, we need to set NCP1854 I2C address to >>1 */
  49. ncp1854_i2c.addr = (NCP1854_SLAVE_ADDR_WRITE >> 1);
  50. ncp1854_i2c.mode = ST_MODE;
  51. ncp1854_i2c.speed = 100;
  52. len = 2;
  53. ret_code = i2c_write(&ncp1854_i2c, write_data, len);
  54. if(I2C_OK != ret_code)
  55. dprintf(INFO, "%s: i2c_write: ret_code: %d\n", __func__, ret_code);
  56. return ret_code;
  57. }
  58. kal_uint32 ncp1854_read_byte (kal_uint8 addr, kal_uint8 *dataBuffer)
  59. {
  60. kal_uint32 ret_code = I2C_OK;
  61. kal_uint16 len;
  62. *dataBuffer = addr;
  63. ncp1854_i2c.id = NCP1854_BUSNUM;
  64. /* Since i2c will left shift 1 bit, we need to set NCP1854 I2C address to >>1 */
  65. ncp1854_i2c.addr = (NCP1854_SLAVE_ADDR_READ >> 1);
  66. ncp1854_i2c.mode = ST_MODE;
  67. ncp1854_i2c.speed = 100;
  68. len = 1;
  69. ret_code = i2c_write_read(&ncp1854_i2c, dataBuffer, len, len);
  70. if(I2C_OK != ret_code)
  71. dprintf(INFO, "%s: i2c_read: ret_code: %d\n", __func__, ret_code);
  72. return ret_code;
  73. }
  74. /**********************************************************
  75. *
  76. * [Read / Write Function]
  77. *
  78. *********************************************************/
  79. kal_uint32 ncp1854_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT)
  80. {
  81. kal_uint8 ncp1854_reg = 0;
  82. int ret = 0;
  83. dprintf(INFO, "--------------------------------------------------\n");
  84. ret = ncp1854_read_byte(RegNum, &ncp1854_reg);
  85. dprintf(INFO, "[ncp1854_read_interface] Reg[%x]=0x%x\n", RegNum, ncp1854_reg);
  86. ncp1854_reg &= (MASK << SHIFT);
  87. *val = (ncp1854_reg >> SHIFT);
  88. dprintf(INFO, "[ncp1854_read_interface] Val=0x%x\n", *val);
  89. return ret;
  90. }
  91. kal_uint32 ncp1854_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT)
  92. {
  93. kal_uint8 ncp1854_reg = 0;
  94. int ret = 0;
  95. dprintf(INFO, "--------------------------------------------------\n");
  96. ret = ncp1854_read_byte(RegNum, &ncp1854_reg);
  97. //dprintf(INFO, "[ncp1854_config_interface] Reg[%x]=0x%x\n", RegNum, ncp1854_reg);
  98. ncp1854_reg &= ~(MASK << SHIFT);
  99. ncp1854_reg |= (val << SHIFT);
  100. if(RegNum == NCP1854_CON1 && val == 1 && MASK ==CON1_REG_RST_MASK && SHIFT == CON1_REG_RST_SHIFT)
  101. {
  102. // RESET bit
  103. }
  104. else if(RegNum == NCP1854_CON1)
  105. {
  106. ncp1854_reg &= ~0x80; //RESET bit read returs 1, so clear it
  107. }
  108. ret = ncp1854_write_byte(RegNum, ncp1854_reg);
  109. //dprintf(INFO, "[ncp18546_config_interface] Write Reg[%x]=0x%x\n", RegNum, ncp1854_reg);
  110. // Check
  111. //ncp1854_read_byte(RegNum, &ncp1854_reg);
  112. //dprintf(INFO, "[ncp1854_config_interface] Check Reg[%x]=0x%x\n", RegNum, ncp1854_reg);
  113. return ret;
  114. }
  115. /**********************************************************
  116. *
  117. * [ncp1854 Function]
  118. *
  119. *********************************************************/
  120. //CON0
  121. kal_uint32 ncp1854_get_chip_status(void)
  122. {
  123. kal_uint32 ret=0;
  124. kal_uint8 val=0;
  125. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON0),
  126. (&val),
  127. (kal_uint8)(CON0_STATE_MASK),
  128. (kal_uint8)(CON0_STATE_SHIFT)
  129. );
  130. return val;
  131. }
  132. kal_uint32 ncp1854_get_batfet(void)
  133. {
  134. kal_uint32 ret=0;
  135. kal_uint8 val=0;
  136. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON0),
  137. (&val),
  138. (kal_uint8)(CON0_BATFET_MASK),
  139. (kal_uint8)(CON0_BATFET_SHIFT)
  140. );
  141. return val;
  142. }
  143. kal_uint32 ncp1854_get_statint(void)
  144. {
  145. kal_uint32 ret=0;
  146. kal_uint8 val=0;
  147. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON0),
  148. (&val),
  149. (kal_uint8)(CON0_STATINT_MASK),
  150. (kal_uint8)(CON0_STATINT_SHIFT)
  151. );
  152. return val;
  153. }
  154. kal_uint32 ncp1854_get_faultint(void)
  155. {
  156. kal_uint32 ret=0;
  157. kal_uint8 val=0;
  158. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON0),
  159. (&val),
  160. (kal_uint8)(CON0_FAULTINT_MASK),
  161. (kal_uint8)(CON0_FAULTINT_SHIFT)
  162. );
  163. return val;
  164. }
  165. //CON1
  166. void ncp1854_set_reset(kal_uint32 val)
  167. {
  168. kal_uint32 ret=0;
  169. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  170. (kal_uint8)(val),
  171. (kal_uint8)(CON1_REG_RST_MASK),
  172. (kal_uint8)(CON1_REG_RST_SHIFT)
  173. );
  174. }
  175. void ncp1854_set_chg_en(kal_uint32 val)
  176. {
  177. kal_uint32 ret=0;
  178. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  179. (kal_uint8)(val),
  180. (kal_uint8)(CON1_CHG_EN_MASK),
  181. (kal_uint8)(CON1_CHG_EN_SHIFT)
  182. );
  183. }
  184. void ncp1854_set_otg_en(kal_uint32 val)
  185. {
  186. kal_uint32 ret=0;
  187. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  188. (kal_uint8)(val),
  189. (kal_uint8)(CON1_OTG_EN_MASK),
  190. (kal_uint8)(CON1_OTG_EN_SHIFT)
  191. );
  192. return val;
  193. }
  194. kal_uint32 ncp1854_get_otg_en(void)
  195. {
  196. kal_uint32 ret=0;
  197. kal_uint8 val=0;
  198. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON1),
  199. (&val),
  200. (kal_uint8)(CON1_OTG_EN_MASK),
  201. (kal_uint8)(CON1_OTG_EN_SHIFT)
  202. );
  203. return val;
  204. }
  205. void ncp1854_set_fctry_mode(kal_uint32 val)
  206. {
  207. kal_uint32 ret=0;
  208. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  209. (kal_uint8)(val),
  210. (kal_uint8)(CON1_FCTRY_MOD_MASK),
  211. (kal_uint8)(CON1_FCTRY_MOD_SHIFT)
  212. );
  213. }
  214. void ncp1854_set_tj_warn_opt(kal_uint32 val)
  215. {
  216. kal_uint32 ret=0;
  217. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  218. (kal_uint8)(val),
  219. (kal_uint8)(CON1_TJ_WARN_OPT_MASK),
  220. (kal_uint8)(CON1_TJ_WARN_OPT_SHIFT)
  221. );
  222. }
  223. kal_uint32 ncp1854_get_usb_cfg(void)
  224. {
  225. kal_uint32 ret=0;
  226. kal_uint8 val=0;
  227. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON1),
  228. (&val),
  229. (kal_uint8)(CON1_USB_CFG_MASK),
  230. (kal_uint8)(CON1_USB_CFG_SHIFT)
  231. );
  232. return val;
  233. }
  234. void ncp1854_set_tchg_rst(kal_uint32 val)
  235. {
  236. kal_uint32 ret=0;
  237. ret=ncp1854_config_interface( (kal_uint8)(NCP1854_CON1),
  238. (kal_uint8)(val),
  239. (kal_uint8)(CON1_TCHG_RST_MASK),
  240. (kal_uint8)(CON1_TCHG_RST_SHIFT)
  241. );
  242. }
  243. void ncp1854_set_int_mask(kal_uint32 val)
  244. {
  245. kal_uint32 ret=0;
  246. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON1),
  247. (kal_uint8)(val),
  248. (kal_uint8)(CON1_INT_MASK_MASK),
  249. (kal_uint8)(CON1_INT_MASK_SHIFT)
  250. );
  251. }
  252. //CON2
  253. void ncp1854_set_wdto_dis(kal_uint32 val)
  254. {
  255. kal_uint32 ret=0;
  256. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  257. (kal_uint8)(val),
  258. (kal_uint8)(CON2_WDTO_DIS_MASK),
  259. (kal_uint8)(CON2_WDTO_DIS_SHIFT)
  260. );
  261. }
  262. void ncp1854_set_chgto_dis(kal_uint32 val)
  263. {
  264. kal_uint32 ret=0;
  265. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  266. (kal_uint8)(val),
  267. (kal_uint8)(CON2_CHGTO_DIS_MASK),
  268. (kal_uint8)(CON2_CHGTO_DIS_SHIFT)
  269. );
  270. }
  271. void ncp1854_set_pwr_path(kal_uint32 val)
  272. {
  273. kal_uint32 ret=0;
  274. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  275. (kal_uint8)(val),
  276. (kal_uint8)(CON2_PWR_PATH_MASK),
  277. (kal_uint8)(CON2_PWR_PATH_SHIFT)
  278. );
  279. }
  280. void ncp1854_set_trans_en(kal_uint32 val)
  281. {
  282. kal_uint32 ret=0;
  283. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  284. (kal_uint8)(val),
  285. (kal_uint8)(CON2_TRANS_EN_MASK),
  286. (kal_uint8)(CON2_TRANS_EN_SHIFT)
  287. );
  288. }
  289. void ncp1854_set_iinset_pin_en(kal_uint32 val)
  290. {
  291. kal_uint32 ret=0;
  292. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  293. (kal_uint8)(val),
  294. (kal_uint8)(CON2_IINSET_PIN_EN_MASK),
  295. (kal_uint8)(CON2_IINSET_PIN_EN_SHIFT)
  296. );
  297. }
  298. void ncp1854_set_iinlim_en(kal_uint32 val)
  299. {
  300. kal_uint32 ret=0;
  301. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  302. (kal_uint8)(val),
  303. (kal_uint8)(CON2_IINLIM_EN_MASK),
  304. (kal_uint8)(CON2_IINLIM_EN_SHIFT)
  305. );
  306. }
  307. void ncp1854_set_aicl_en(kal_uint32 val)
  308. {
  309. kal_uint32 ret=0;
  310. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON2),
  311. (kal_uint8)(val),
  312. (kal_uint8)(CON2_AICL_EN_MASK),
  313. (kal_uint8)(CON2_AICL_EN_SHIFT)
  314. );
  315. }
  316. //CON8
  317. kal_uint32 ncp1854_get_vfet_ok(void)
  318. {
  319. kal_uint32 ret=0;
  320. kal_uint8 val=0;
  321. ret=ncp1854_read_interface((kal_uint8)(NCP1854_CON8),
  322. (&val),
  323. (kal_uint8)(CON8_VFET_OK_MASK),
  324. (kal_uint8)(CON8_VFET_OK_SHIFT)
  325. );
  326. return val;
  327. }
  328. //CON14
  329. void ncp1854_set_ctrl_vbat(kal_uint32 val)
  330. {
  331. kal_uint32 ret=0;
  332. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON14),
  333. (kal_uint8)(val),
  334. (kal_uint8)(CON14_CTRL_VBAT_MASK),
  335. (kal_uint8)(CON14_CTRL_VBAT_SHIFT)
  336. );
  337. }
  338. //CON15
  339. void ncp1854_set_ichg_high(kal_uint32 val)
  340. {
  341. kal_uint32 ret=0;
  342. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON15),
  343. (kal_uint8)(val),
  344. (kal_uint8)(CON15_ICHG_HIGH_MASK),
  345. (kal_uint8)(CON15_ICHG_HIGH_SHIFT)
  346. );
  347. }
  348. void ncp1854_set_ieoc(kal_uint32 val)
  349. {
  350. kal_uint32 ret=0;
  351. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON15),
  352. (kal_uint8)(val),
  353. (kal_uint8)(CON15_IEOC_MASK),
  354. (kal_uint8)(CON15_IEOC_SHIFT)
  355. );
  356. }
  357. void ncp1854_set_ichg(kal_uint32 val)
  358. {
  359. kal_uint32 ret=0;
  360. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON15),
  361. (kal_uint8)(val),
  362. (kal_uint8)(CON15_ICHG_MASK),
  363. (kal_uint8)(CON15_ICHG_SHIFT)
  364. );
  365. }
  366. kal_uint32 ncp1854_get_ichg(void)
  367. {
  368. kal_uint32 ret=0;
  369. kal_uint8 val=0;
  370. ret = ncp1854_read_interface((kal_uint8)NCP1854_CON15,
  371. (&val),
  372. (kal_uint8)CON15_ICHG_MASK,
  373. (kal_uint8)CON15_ICHG_SHIFT);
  374. return val;
  375. }
  376. //CON16
  377. void ncp1854_set_iweak(kal_uint32 val)
  378. {
  379. kal_uint32 ret=0;
  380. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON16),
  381. (kal_uint8)(val),
  382. (kal_uint8)(CON16_IWEAK_MASK),
  383. (kal_uint8)(CON16_IWEAK_SHIFT)
  384. );
  385. }
  386. void ncp1854_set_ctrl_vfet(kal_uint32 val)
  387. {
  388. kal_uint32 ret=0;
  389. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON16),
  390. (kal_uint8)(val),
  391. (kal_uint8)(CON16_CTRL_VFET_MASK),
  392. (kal_uint8)(CON16_CTRL_VFET_SHIFT)
  393. );
  394. }
  395. void ncp1854_set_iinlim(kal_uint32 val)
  396. {
  397. kal_uint32 ret=0;
  398. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON16),
  399. (kal_uint8)(val),
  400. (kal_uint8)(CON16_IINLIM_MASK),
  401. (kal_uint8)(CON16_IINLIM_SHIFT)
  402. );
  403. }
  404. //CON17
  405. void ncp1854_set_iinlim_ta(kal_uint32 val)
  406. {
  407. kal_uint32 ret=0;
  408. ret=ncp1854_config_interface((kal_uint8)(NCP1854_CON17),
  409. (kal_uint8)(val),
  410. (kal_uint8)(CON17_IINLIM_TA_MASK),
  411. (kal_uint8)(CON17_IINLIM_TA_SHIFT)
  412. );
  413. }
  414. /**********************************************************
  415. *
  416. * [Internal Function]
  417. *
  418. *********************************************************/
  419. void ncp1854_dump_register(void)
  420. {
  421. int i=0;
  422. for (i=0;i<NCP1854_REG_NUM;i++)
  423. {
  424. if((i == 3) || (i == 4) || (i == 5) || (i == 6)) //do not dump read clear status register
  425. continue;
  426. if((i == 10) || (i == 11) || (i == 12) || (i == 13)) //do not dump interrupt mask bit register
  427. continue;
  428. ncp1854_read_byte(i, &ncp1854_reg[i]);
  429. printf("[ncp1854_dump_register] Reg[0x%X]=0x%X\n", i, ncp1854_reg[i]);
  430. }
  431. }
  432. void ncp1854_hw_init()
  433. {
  434. printf("[ncp1854] ChargerHwInit_ncp1854\n" );
  435. kal_uint32 ncp1854_status;
  436. ncp1854_status = ncp1854_get_chip_status();
  437. ncp1854_set_fctry_mode(0x0);
  438. ncp1854_set_otg_en(0x0);
  439. ncp1854_set_trans_en(0);
  440. ncp1854_set_tj_warn_opt(0x0);
  441. // ncp1854_set_int_mask(0x0); //disable all interrupt
  442. ncp1854_set_int_mask(0x1); //enable all interrupt for boost mode status monitor
  443. // ncp1854_set_tchg_rst(0x1); //reset charge timer
  444. #ifdef NCP1854_PWR_PATH
  445. ncp1854_set_pwr_path(0x1);
  446. #else
  447. ncp1854_set_pwr_path(0x0);
  448. #endif
  449. if((ncp1854_status == 0x8) || (ncp1854_status == 0x9) || (ncp1854_status == 0xA)) //WEAK WAIT, WEAK SAFE, WEAK CHARGE
  450. ncp1854_set_ctrl_vbat(0x1C); //VCHG = 4.0V
  451. else
  452. {
  453. ncp1854_set_ctrl_vbat(0x24); //VCHG = 4.2V
  454. ncp1854_set_aicl_en(0x1); //enable AICL as PT team suggest
  455. ncp1854_set_iinset_pin_en(0x0); //Input current limit and AICL control by I2C
  456. ncp1854_set_chgto_dis(0x1); //disable charge timer
  457. }
  458. ncp1854_set_ieoc(0x4); // terminate current = 200mA for ICS optimized suspend power
  459. ncp1854_set_iweak(0x3); //weak charge current = 300mA
  460. ncp1854_set_ctrl_vfet(0x0); // VFET = 3.1V
  461. }
  462. static CHARGER_TYPE g_chr_type_num = CHARGER_UNKNOWN;
  463. int hw_charging_get_charger_type(void);
  464. extern int g_std_ac_large_current_en;
  465. void ncp1854_charging_enable(kal_uint32 bEnable)
  466. {
  467. int temp_CC_value = 0;
  468. kal_int32 bat_val = 0;
  469. if(CHARGER_UNKNOWN == g_chr_type_num && KAL_TRUE == upmu_is_chr_det())
  470. {
  471. hw_charging_get_charger_type();
  472. dprintf(CRITICAL, "[BATTERY:ncp1854] charger type: %d\n", g_chr_type_num);
  473. }
  474. bat_val = get_i_sense_volt(1);
  475. if (g_chr_type_num == STANDARD_CHARGER)
  476. {
  477. if(g_std_ac_large_current_en==1)
  478. {
  479. temp_CC_value = 2000;
  480. ncp1854_set_iinlim_ta(0xF); //IN current limit at 2A
  481. ncp1854_set_iinlim_en(0x1); //IN current limit enable
  482. if(bat_val < PRECC_BATVOL)
  483. {
  484. ncp1854_set_ichg_high(0x0); //ICHG
  485. ncp1854_set_ichg(0x1); //Pre-Charging Current Limit at 500mA
  486. }
  487. else
  488. {
  489. ncp1854_set_ichg_high(0); //ICHG
  490. ncp1854_set_ichg(0xF); //Fast Charging Current Limit at 1.9A
  491. }
  492. }
  493. else
  494. {
  495. temp_CC_value = 1500;
  496. ncp1854_set_iinlim_ta(0xA); //IN current limit at 1.5A
  497. ncp1854_set_iinlim_en(0x1); //IN current limit enable
  498. if(bat_val < PRECC_BATVOL)
  499. {
  500. ncp1854_set_ichg_high(0x0); //ICHG
  501. ncp1854_set_ichg(0x1); //Pre-Charging Current Limit at 500mA
  502. }
  503. else
  504. {
  505. ncp1854_set_ichg_high(0); //ICHG
  506. ncp1854_set_ichg(0xB); //Fast Charging Current Limit at 1.5A
  507. }
  508. }
  509. }
  510. else if (g_chr_type_num == STANDARD_HOST \
  511. || g_chr_type_num == CHARGING_HOST \
  512. || g_chr_type_num == NONSTANDARD_CHARGER)
  513. {
  514. temp_CC_value = 500;
  515. ncp1854_set_iinlim_ta(0); //IINLIM
  516. ncp1854_set_iinlim(0x1); //IN current limit at 500mA
  517. ncp1854_set_iinlim_en(0x1); //IN current limit enable
  518. ncp1854_set_ichg_high(0x0); //ICHG
  519. ncp1854_set_ichg(0x1); //Pre-Charging Current Limit at 500mA
  520. }
  521. else
  522. {
  523. temp_CC_value = 500;
  524. ncp1854_set_iinlim_ta(0); //IINLIM
  525. ncp1854_set_iinlim(0x1); //IN current limit at 500mA
  526. ncp1854_set_iinlim_en(0x1); //IN current limit enable
  527. ncp1854_set_ichg_high(0x0); //ICHG
  528. ncp1854_set_ichg(0x1); //Pre-Charging Current Limit at 500mA
  529. }
  530. if(KAL_TRUE == bEnable)
  531. ncp1854_set_chg_en(0x1); // charger enable
  532. else
  533. ncp1854_set_chg_en(0x0); // charger disable
  534. ncp1854_set_wdto_dis(0x0);
  535. dprintf(INFO, "[BATTERY:ncp1854] ncp1854_set_ac_current(), CC value(%dmA) \r\n", temp_CC_value);
  536. dprintf(INFO, "[BATTERY:ncp1854] charger enable/disable %d !\r\n", bEnable);
  537. }
  538. #if defined(CONFIG_POWER_EXT)
  539. int hw_charging_get_charger_type(void)
  540. {
  541. g_chr_type_num = STANDARD_HOST;
  542. return STANDARD_HOST;
  543. }
  544. #else
  545. extern void Charger_Detect_Init(void);
  546. extern void Charger_Detect_Release(void);
  547. extern void mdelay (unsigned long msec);
  548. extern kal_uint16 bc11_set_register_value(PMU_FLAGS_LIST_ENUM flagname,kal_uint32 val);
  549. static void hw_bc11_dump_register(void)
  550. {
  551. /*
  552. kal_uint32 reg_val = 0;
  553. kal_uint32 reg_num = CHR_CON18;
  554. kal_uint32 i = 0;
  555. for(i=reg_num ; i<=CHR_CON19 ; i+=2)
  556. {
  557. reg_val = upmu_get_reg_value(i);
  558. dprintf(INFO, "Chr Reg[0x%x]=0x%x \r\n", i, reg_val);
  559. }
  560. */
  561. }
  562. static void hw_bc11_init(void)
  563. {
  564. mdelay(200);
  565. Charger_Detect_Init();
  566. //RG_bc11_BIAS_EN=1
  567. bc11_set_register_value(PMIC_RG_BC11_BIAS_EN,1);
  568. //RG_bc11_VSRC_EN[1:0]=00
  569. bc11_set_register_value(PMIC_RG_BC11_VSRC_EN,0);
  570. //RG_bc11_VREF_VTH = [1:0]=00
  571. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0);
  572. //RG_bc11_CMP_EN[1.0] = 00
  573. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0);
  574. //RG_bc11_IPU_EN[1.0] = 00
  575. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0);
  576. //RG_bc11_IPD_EN[1.0] = 00
  577. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0);
  578. //bc11_RST=1
  579. bc11_set_register_value(PMIC_RG_BC11_RST,1);
  580. //bc11_BB_CTRL=1
  581. bc11_set_register_value(PMIC_RG_BC11_BB_CTRL,1);
  582. mdelay(50);
  583. if(g_ncp1854_log_en>1)
  584. {
  585. dprintf(INFO, "hw_bc11_init() \r\n");
  586. hw_bc11_dump_register();
  587. }
  588. }
  589. static U32 hw_bc11_DCD(void)
  590. {
  591. U32 wChargerAvail = 0;
  592. //RG_bc11_IPU_EN[1.0] = 10
  593. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0x2);
  594. //RG_bc11_IPD_EN[1.0] = 01
  595. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x1);
  596. //RG_bc11_VREF_VTH = [1:0]=01
  597. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x1);
  598. //RG_bc11_CMP_EN[1.0] = 10
  599. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x2);
  600. mdelay(80);
  601. wChargerAvail = bc11_get_register_value(PMIC_RGS_BC11_CMP_OUT);
  602. if(g_ncp1854_log_en>1)
  603. {
  604. dprintf(INFO, "hw_bc11_DCD() \r\n");
  605. hw_bc11_dump_register();
  606. }
  607. //RG_bc11_IPU_EN[1.0] = 00
  608. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0x0);
  609. //RG_bc11_IPD_EN[1.0] = 00
  610. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x0);
  611. //RG_bc11_CMP_EN[1.0] = 00
  612. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x0);
  613. //RG_bc11_VREF_VTH = [1:0]=00
  614. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x0);
  615. return wChargerAvail;
  616. }
  617. static U32 hw_bc11_stepA1(void)
  618. {
  619. U32 wChargerAvail = 0;
  620. //RG_bc11_IPD_EN[1.0] = 01
  621. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x1);
  622. //RG_bc11_VREF_VTH = [1:0]=00
  623. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x0);
  624. //RG_bc11_CMP_EN[1.0] = 01
  625. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x1);
  626. mdelay(80);
  627. wChargerAvail = bc11_get_register_value(PMIC_RGS_BC11_CMP_OUT);
  628. if(g_ncp1854_log_en>1)
  629. {
  630. dprintf(INFO, "hw_bc11_stepA1() \r\n");
  631. hw_bc11_dump_register();
  632. }
  633. //RG_bc11_IPD_EN[1.0] = 00
  634. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x0);
  635. //RG_bc11_CMP_EN[1.0] = 00
  636. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x0);
  637. return wChargerAvail;
  638. }
  639. static U32 hw_bc11_stepA2(void)
  640. {
  641. U32 wChargerAvail = 0;
  642. //RG_bc11_VSRC_EN[1.0] = 10
  643. bc11_set_register_value(PMIC_RG_BC11_VSRC_EN,0x2);
  644. //RG_bc11_IPD_EN[1:0] = 01
  645. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x1);
  646. //RG_bc11_VREF_VTH = [1:0]=00
  647. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x0);
  648. //RG_bc11_CMP_EN[1.0] = 01
  649. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x1);
  650. mdelay(80);
  651. wChargerAvail = bc11_get_register_value(PMIC_RGS_BC11_CMP_OUT);
  652. if(g_ncp1854_log_en)
  653. {
  654. dprintf(INFO, "hw_bc11_stepB1() \r\n");
  655. hw_bc11_dump_register();
  656. }
  657. //RG_bc11_VSRC_EN[1:0]=00
  658. bc11_set_register_value(PMIC_RG_BC11_VSRC_EN,0x0);
  659. //RG_bc11_IPD_EN[1.0] = 00
  660. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x0);
  661. //RG_bc11_CMP_EN[1.0] = 00
  662. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x0);
  663. return wChargerAvail;
  664. }
  665. static U32 hw_bc11_stepB2(void)
  666. {
  667. U32 wChargerAvail = 0;
  668. //RG_bc11_IPU_EN[1:0]=10
  669. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0x2);
  670. //RG_bc11_VREF_VTH = [1:0]=01
  671. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x1);
  672. //RG_bc11_CMP_EN[1.0] = 01
  673. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x1);
  674. mdelay(80);
  675. wChargerAvail = bc11_get_register_value(PMIC_RGS_BC11_CMP_OUT);
  676. if(g_ncp1854_log_en)
  677. {
  678. dprintf(INFO, "hw_bc11_stepB2() \r\n");
  679. hw_bc11_dump_register();
  680. }
  681. if (!wChargerAvail)
  682. {
  683. //RG_bc11_VSRC_EN[1.0] = 10
  684. //mt6325_upmu_set_rg_bc11_vsrc_en(0x2);
  685. bc11_set_register_value(PMIC_RG_BC11_VSRC_EN,0x2);
  686. }
  687. //RG_bc11_IPU_EN[1.0] = 00
  688. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0x0);
  689. //RG_bc11_CMP_EN[1.0] = 00
  690. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x0);
  691. //RG_bc11_VREF_VTH = [1:0]=00
  692. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x0);
  693. return wChargerAvail;
  694. }
  695. static void hw_bc11_done(void)
  696. {
  697. //RG_bc11_VSRC_EN[1:0]=00
  698. bc11_set_register_value(PMIC_RG_BC11_VSRC_EN,0x0);
  699. //RG_bc11_VREF_VTH = [1:0]=0
  700. bc11_set_register_value(PMIC_RG_BC11_VREF_VTH,0x0);
  701. //RG_bc11_CMP_EN[1.0] = 00
  702. bc11_set_register_value(PMIC_RG_BC11_CMP_EN,0x0);
  703. //RG_bc11_IPU_EN[1.0] = 00
  704. bc11_set_register_value(PMIC_RG_BC11_IPU_EN,0x0);
  705. //RG_bc11_IPD_EN[1.0] = 00
  706. bc11_set_register_value(PMIC_RG_BC11_IPD_EN,0x0);
  707. //RG_bc11_BIAS_EN=0
  708. bc11_set_register_value(PMIC_RG_BC11_BIAS_EN,0x0);
  709. Charger_Detect_Release();
  710. if(g_ncp1854_log_en>1)
  711. {
  712. dprintf(INFO, "hw_bc11_done() \r\n");
  713. hw_bc11_dump_register();
  714. }
  715. }
  716. int hw_charging_get_charger_type(void)
  717. {
  718. if(CHARGER_UNKNOWN != g_chr_type_num)
  719. return g_chr_type_num;
  720. #if 0
  721. return STANDARD_HOST;
  722. #else
  723. CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
  724. /********* Step initial ***************/
  725. hw_bc11_init();
  726. /********* Step DCD ***************/
  727. if(1 == hw_bc11_DCD())
  728. {
  729. /********* Step A1 ***************/
  730. if(1 == hw_bc11_stepA1())
  731. {
  732. CHR_Type_num = APPLE_2_1A_CHARGER;
  733. dprintf(INFO, "step A1 : Apple 2.1A CHARGER!\r\n");
  734. }
  735. else
  736. {
  737. CHR_Type_num = NONSTANDARD_CHARGER;
  738. dprintf(INFO, "step A1 : Non STANDARD CHARGER!\r\n");
  739. }
  740. }
  741. else
  742. {
  743. /********* Step A2 ***************/
  744. if(1 == hw_bc11_stepA2())
  745. {
  746. /********* Step B2 ***************/
  747. if(1 == hw_bc11_stepB2())
  748. {
  749. CHR_Type_num = STANDARD_CHARGER;
  750. dprintf(INFO, "step B2 : STANDARD CHARGER!\r\n");
  751. }
  752. else
  753. {
  754. CHR_Type_num = CHARGING_HOST;
  755. dprintf(INFO, "step B2 : Charging Host!\r\n");
  756. }
  757. }
  758. else
  759. {
  760. CHR_Type_num = STANDARD_HOST;
  761. dprintf(INFO, "step A2 : Standard USB Host!\r\n");
  762. }
  763. }
  764. /********* Finally setting *******************************/
  765. hw_bc11_done();
  766. g_chr_type_num = CHR_Type_num;
  767. return g_chr_type_num;
  768. #endif
  769. }
  770. #endif