ncp1854.c 24 KB

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