charging_hw_pmic.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. #include <linux/types.h>
  2. #include <mt-plat/charging.h>
  3. #include <mt-plat/upmu_common.h>
  4. #include <linux/delay.h>
  5. #include <linux/reboot.h>
  6. #include <mt-plat/mt_boot.h>
  7. #include <mt-plat/battery_common.h>
  8. #include <mach/mt_charging.h>
  9. #include <mach/mt_pmic.h>
  10. /* ============================================================ // */
  11. /* define */
  12. /* ============================================================ // */
  13. #define STATUS_OK 0
  14. #define STATUS_FAIL 1
  15. #define STATUS_UNSUPPORTED -1
  16. #define GETARRAYNUM(array) (sizeof(array)/sizeof(array[0]))
  17. /* ============================================================ // */
  18. /* global variable */
  19. /* ============================================================ // */
  20. kal_bool chargin_hw_init_done = KAL_TRUE;
  21. kal_bool charging_type_det_done = KAL_TRUE;
  22. const unsigned int VBAT_CV_VTH[] = {
  23. BATTERY_VOLT_03_775000_V, BATTERY_VOLT_03_800000_V, BATTERY_VOLT_03_850000_V,
  24. BATTERY_VOLT_03_900000_V,
  25. BATTERY_VOLT_04_000000_V, BATTERY_VOLT_04_050000_V, BATTERY_VOLT_04_100000_V,
  26. BATTERY_VOLT_04_125000_V,
  27. BATTERY_VOLT_04_137500_V, BATTERY_VOLT_04_150000_V, BATTERY_VOLT_04_162500_V,
  28. BATTERY_VOLT_04_175000_V,
  29. BATTERY_VOLT_04_187500_V, BATTERY_VOLT_04_200000_V, BATTERY_VOLT_04_212500_V,
  30. BATTERY_VOLT_04_225000_V,
  31. BATTERY_VOLT_04_237500_V, BATTERY_VOLT_04_250000_V, BATTERY_VOLT_04_262500_V,
  32. BATTERY_VOLT_04_275000_V,
  33. BATTERY_VOLT_04_300000_V, BATTERY_VOLT_04_325000_V, BATTERY_VOLT_04_350000_V,
  34. BATTERY_VOLT_04_375000_V,
  35. BATTERY_VOLT_04_440000_V, BATTERY_VOLT_04_425000_V, BATTERY_VOLT_02_200000_V,
  36. BATTERY_VOLT_02_200000_V,
  37. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  38. BATTERY_VOLT_02_200000_V,
  39. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  40. BATTERY_VOLT_02_200000_V,
  41. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  42. BATTERY_VOLT_02_200000_V,
  43. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  44. BATTERY_VOLT_02_200000_V,
  45. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  46. BATTERY_VOLT_02_200000_V,
  47. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  48. BATTERY_VOLT_02_200000_V,
  49. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  50. BATTERY_VOLT_02_200000_V,
  51. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  52. BATTERY_VOLT_02_200000_V,
  53. BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V, BATTERY_VOLT_02_200000_V,
  54. BATTERY_VOLT_02_200000_V
  55. };
  56. const unsigned int CS_VTH[] = {
  57. CHARGE_CURRENT_2000_00_MA, CHARGE_CURRENT_1600_00_MA, CHARGE_CURRENT_1500_00_MA,
  58. CHARGE_CURRENT_1350_00_MA,
  59. CHARGE_CURRENT_1200_00_MA, CHARGE_CURRENT_1100_00_MA, CHARGE_CURRENT_1000_00_MA,
  60. CHARGE_CURRENT_900_00_MA,
  61. CHARGE_CURRENT_800_00_MA, CHARGE_CURRENT_700_00_MA, CHARGE_CURRENT_650_00_MA,
  62. CHARGE_CURRENT_550_00_MA,
  63. CHARGE_CURRENT_450_00_MA, CHARGE_CURRENT_300_00_MA, CHARGE_CURRENT_200_00_MA,
  64. CHARGE_CURRENT_70_00_MA
  65. };
  66. const unsigned int VCDT_HV_VTH[] = {
  67. BATTERY_VOLT_04_200000_V, BATTERY_VOLT_04_250000_V, BATTERY_VOLT_04_300000_V,
  68. BATTERY_VOLT_04_350000_V,
  69. BATTERY_VOLT_04_400000_V, BATTERY_VOLT_04_450000_V, BATTERY_VOLT_04_500000_V,
  70. BATTERY_VOLT_04_550000_V,
  71. BATTERY_VOLT_04_600000_V, BATTERY_VOLT_06_000000_V, BATTERY_VOLT_06_500000_V,
  72. BATTERY_VOLT_07_000000_V,
  73. BATTERY_VOLT_07_500000_V, BATTERY_VOLT_08_500000_V, BATTERY_VOLT_09_500000_V,
  74. BATTERY_VOLT_10_500000_V
  75. };
  76. /* ============================================================ // */
  77. /* function prototype */
  78. /* ============================================================ // */
  79. /* ============================================================ // */
  80. /* extern variable */
  81. /* ============================================================ // */
  82. /* ============================================================ // */
  83. /* extern function */
  84. /* ============================================================ // */
  85. /*extern unsigned int upmu_get_reg_value(unsigned int reg);
  86. extern void Charger_Detect_Init(void);
  87. extern void Charger_Detect_Release(void);
  88. extern int hw_charging_get_charger_type(void);
  89. extern unsigned int mt6311_get_chip_id(void);
  90. extern int is_mt6311_exist(void);
  91. extern int is_mt6311_sw_ready(void);
  92. */
  93. /* ============================================================ // */
  94. unsigned int charging_value_to_parameter(const unsigned int *parameter, const unsigned int array_size,
  95. const unsigned int val)
  96. {
  97. if (val < array_size)
  98. return parameter[val];
  99. battery_log(BAT_LOG_CRTI, "Can't find the parameter \r\n");
  100. return parameter[0];
  101. }
  102. unsigned int charging_parameter_to_value(const unsigned int *parameter, const unsigned int array_size,
  103. const unsigned int val)
  104. {
  105. unsigned int i;
  106. for (i = 0; i < array_size; i++) {
  107. if (val == *(parameter + i))
  108. return i;
  109. }
  110. battery_log(BAT_LOG_CRTI, "NO register value match \r\n");
  111. /* TODO: ASSERT(0); // not find the value */
  112. return 0;
  113. }
  114. static unsigned int bmt_find_closest_level(const unsigned int *pList, unsigned int number,
  115. unsigned int level)
  116. {
  117. unsigned int i;
  118. unsigned int max_value_in_last_element;
  119. if (pList[0] < pList[1])
  120. max_value_in_last_element = KAL_TRUE;
  121. else
  122. max_value_in_last_element = KAL_FALSE;
  123. if (max_value_in_last_element == KAL_TRUE) {
  124. for (i = (number - 1); i != 0; i--) { /* max value in the last element */
  125. if (pList[i] <= level)
  126. return pList[i];
  127. }
  128. battery_log(BAT_LOG_CRTI, "Can't find closest level \r\n");
  129. return pList[0];
  130. /* return CHARGE_CURRENT_0_00_MA; */
  131. } else {
  132. for (i = 0; i < number; i++) { /* max value in the first element */
  133. if (pList[i] <= level)
  134. return pList[i];
  135. }
  136. battery_log(BAT_LOG_CRTI, "Can't find closest level \r\n");
  137. return pList[number - 1];
  138. /* return CHARGE_CURRENT_0_00_MA; */
  139. }
  140. }
  141. static unsigned int charging_hw_init(void *data)
  142. {
  143. unsigned int status = STATUS_OK;
  144. pmic_set_register_value(PMIC_RG_CHRWDT_TD, 0); /* CHRWDT_TD, 4s */
  145. pmic_set_register_value(PMIC_RG_CHRWDT_INT_EN, 1); /* CHRWDT_INT_EN */
  146. pmic_set_register_value(PMIC_RG_CHRWDT_EN, 1); /* CHRWDT_EN */
  147. pmic_set_register_value(PMIC_RG_CHRWDT_WR, 1); /* CHRWDT_WR */
  148. pmic_set_register_value(PMIC_RG_VCDT_MODE, 0); /* VCDT_MODE */
  149. pmic_set_register_value(PMIC_RG_VCDT_HV_EN, 1); /* VCDT_HV_EN */
  150. pmic_set_register_value(PMIC_RG_USBDL_SET, 0); /* force leave USBDL mode */
  151. pmic_set_register_value(PMIC_RG_USBDL_RST, 1); /* force leave USBDL mode */
  152. pmic_set_register_value(PMIC_RG_BC11_BB_CTRL, 1); /* BC11_BB_CTRL */
  153. pmic_set_register_value(PMIC_RG_BC11_RST, 1); /* BC11_RST */
  154. pmic_set_register_value(PMIC_RG_CSDAC_MODE, 1); /* CSDAC_MODE */
  155. pmic_set_register_value(PMIC_RG_VBAT_OV_EN, 1); /* VBAT_OV_EN */
  156. if (batt_cust_data.high_battery_voltage_support)
  157. pmic_set_register_value(PMIC_RG_VBAT_OV_VTH, 3); /* VBAT_OV_VTH, 4.4V, */
  158. else
  159. pmic_set_register_value(PMIC_RG_VBAT_OV_VTH, 2); /* VBAT_OV_VTH, 4.3V, */
  160. pmic_set_register_value(PMIC_RG_BATON_EN, 1); /* BATON_EN */
  161. /* Tim, for TBAT */
  162. pmic_set_register_value(PMIC_RG_BATON_HT_EN, 0); /* BATON_HT_EN */
  163. pmic_set_register_value(PMIC_RG_ULC_DET_EN, 1); /* RG_ULC_DET_EN=1 */
  164. pmic_set_register_value(PMIC_RG_LOW_ICH_DB, 1); /* RG_LOW_ICH_DB=000001'b */
  165. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  166. pmic_set_register_value(PMIC_RG_CSDAC_DLY, 0); /* CSDAC_DLY */
  167. pmic_set_register_value(PMIC_RG_CSDAC_STP, 1); /* CSDAC_STP */
  168. pmic_set_register_value(PMIC_RG_CSDAC_STP_INC, 1); /* CSDAC_STP_INC */
  169. pmic_set_register_value(PMIC_RG_CSDAC_STP_DEC, 7); /* CSDAC_STP_DEC */
  170. pmic_set_register_value(PMIC_RG_CS_EN, 1); /* CS_EN */
  171. pmic_set_register_value(PMIC_RG_HWCV_EN, 1);
  172. pmic_set_register_value(PMIC_RG_VBAT_CV_EN, 1); /* CV_EN */
  173. pmic_set_register_value(PMIC_RG_CHR_EN, 1); /* CHR_EN */
  174. pmic_set_register_value(PMIC_RG_CSDAC_EN, 1); /* CSDAC_EN */
  175. #endif
  176. return status;
  177. }
  178. static unsigned int charging_dump_register(void *data)
  179. {
  180. unsigned int status = STATUS_OK;
  181. unsigned int reg_val = 0;
  182. unsigned int i = 0;
  183. for (i = MT6328_CHR_CON0; i <= MT6328_CHR_CON40; i += 2) {
  184. reg_val = upmu_get_reg_value(i);
  185. battery_log(BAT_LOG_CRTI, "[0x%x]=0x%x,", i, reg_val);
  186. }
  187. battery_log(BAT_LOG_CRTI, "\n");
  188. return status;
  189. }
  190. static unsigned int charging_enable(void *data)
  191. {
  192. unsigned int status = STATUS_OK;
  193. unsigned int enable = *(unsigned int *) (data);
  194. if (KAL_TRUE == enable) {
  195. pmic_set_register_value(PMIC_RG_CSDAC_DLY, 4); /* CSDAC_DLY */
  196. pmic_set_register_value(PMIC_RG_CSDAC_STP, 1); /* CSDAC_STP */
  197. pmic_set_register_value(PMIC_RG_CSDAC_STP_INC, 1); /* CSDAC_STP_INC */
  198. pmic_set_register_value(PMIC_RG_CSDAC_STP_DEC, 2); /* CSDAC_STP_DEC */
  199. pmic_set_register_value(PMIC_RG_CS_EN, 1); /* CS_EN, check me */
  200. pmic_set_register_value(PMIC_RG_HWCV_EN, 1);
  201. pmic_set_register_value(PMIC_RG_VBAT_CV_EN, 1); /* CV_EN */
  202. pmic_set_register_value(PMIC_RG_CSDAC_EN, 1); /* CSDAC_EN */
  203. pmic_set_register_value(PMIC_RG_PCHR_FLAG_EN, 1); /* enable debug falg output */
  204. pmic_set_register_value(PMIC_RG_CHR_EN, 1); /* CHR_EN */
  205. pmic_set_register_value(PMIC_RG_CSDAC_MODE, 1); /* CSDAC_MODE */
  206. pmic_set_register_value(PMIC_RG_CSDAC_EN, 1); /* CSDAC_EN */
  207. if (Enable_BATDRV_LOG == BAT_LOG_FULL)
  208. charging_dump_register(NULL);
  209. } else {
  210. pmic_set_register_value(PMIC_RG_CHRWDT_INT_EN, 0); /* CHRWDT_INT_EN */
  211. pmic_set_register_value(PMIC_RG_CHRWDT_EN, 0); /* CHRWDT_EN */
  212. pmic_set_register_value(PMIC_RG_CHRWDT_FLAG_WR, 0); /* CHRWDT_FLAG */
  213. pmic_set_register_value(PMIC_RG_CSDAC_EN, 0); /* CSDAC_EN */
  214. pmic_set_register_value(PMIC_RG_CHR_EN, 0); /* CHR_EN */
  215. pmic_set_register_value(PMIC_RG_HWCV_EN, 0); /* RG_HWCV_EN */
  216. }
  217. return status;
  218. }
  219. static unsigned int charging_set_cv_voltage(void *data)
  220. {
  221. unsigned int status = STATUS_OK;
  222. unsigned short register_value;
  223. register_value =
  224. charging_parameter_to_value(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH),
  225. *(unsigned int *) (data));
  226. pmic_set_register_value(PMIC_RG_VBAT_CV_VTH, register_value);
  227. battery_log(BAT_LOG_CRTI, "[charging_set_cv_voltage] [0x%x]=0x%x, [0x%x]=0x%x\n",
  228. 0xf54, upmu_get_reg_value(0xf54), 0xf4e, upmu_get_reg_value(0xf4e)
  229. );
  230. return status;
  231. }
  232. static unsigned int charging_get_current(void *data)
  233. {
  234. unsigned int status = STATUS_OK;
  235. unsigned int array_size;
  236. unsigned int reg_value;
  237. array_size = GETARRAYNUM(CS_VTH);
  238. reg_value = pmic_get_register_value(PMIC_RG_CS_VTH); /* RG_CS_VTH */
  239. *(unsigned int *) data = charging_value_to_parameter(CS_VTH, array_size, reg_value);
  240. return status;
  241. }
  242. static unsigned int charging_set_current(void *data)
  243. {
  244. unsigned int status = STATUS_OK;
  245. unsigned int set_chr_current;
  246. unsigned int array_size;
  247. unsigned int register_value;
  248. array_size = GETARRAYNUM(CS_VTH);
  249. set_chr_current = bmt_find_closest_level(CS_VTH, array_size, *(unsigned int *) data);
  250. register_value = charging_parameter_to_value(CS_VTH, array_size, set_chr_current);
  251. pmic_set_register_value(PMIC_RG_CS_VTH, register_value);
  252. return status;
  253. }
  254. static unsigned int charging_set_input_current(void *data)
  255. {
  256. unsigned int status = STATUS_OK;
  257. return status;
  258. }
  259. static unsigned int charging_get_charging_status(void *data)
  260. {
  261. unsigned int status = STATUS_OK;
  262. return status;
  263. }
  264. static unsigned int charging_reset_watch_dog_timer(void *data)
  265. {
  266. unsigned int status = STATUS_OK;
  267. pmic_set_register_value(PMIC_RG_CHRWDT_TD, 0); /* CHRWDT_TD, 4s */
  268. pmic_set_register_value(PMIC_RG_CHRWDT_WR, 1); /* CHRWDT_WR */
  269. pmic_set_register_value(PMIC_RG_CHRWDT_INT_EN, 1); /* CHRWDT_INT_EN */
  270. pmic_set_register_value(PMIC_RG_CHRWDT_EN, 1); /* CHRWDT_EN */
  271. pmic_set_register_value(PMIC_RG_CHRWDT_FLAG_WR, 1); /* CHRWDT_WR */
  272. return status;
  273. }
  274. static unsigned int charging_set_hv_threshold(void *data)
  275. {
  276. unsigned int status = STATUS_OK;
  277. unsigned int set_hv_voltage;
  278. unsigned int array_size;
  279. unsigned short register_value;
  280. unsigned int voltage = *(unsigned int *) (data);
  281. array_size = GETARRAYNUM(VCDT_HV_VTH);
  282. set_hv_voltage = bmt_find_closest_level(VCDT_HV_VTH, array_size, voltage);
  283. register_value = charging_parameter_to_value(VCDT_HV_VTH, array_size, set_hv_voltage);
  284. pmic_set_register_value(PMIC_RG_VCDT_HV_VTH, register_value);
  285. return status;
  286. }
  287. static unsigned int charging_get_hv_status(void *data)
  288. {
  289. unsigned int status = STATUS_OK;
  290. *(kal_bool *) (data) = pmic_get_register_value(PMIC_RGS_VCDT_HV_DET);
  291. return status;
  292. }
  293. static unsigned int charging_get_battery_status(void *data)
  294. {
  295. unsigned int status = STATUS_OK;
  296. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  297. #else
  298. unsigned int val = 0;
  299. #endif
  300. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  301. *(kal_bool *) (data) = 0; /* battery exist */
  302. battery_log(BAT_LOG_CRTI, "bat exist for evb\n");
  303. #else
  304. val = pmic_get_register_value(PMIC_BATON_TDET_EN);
  305. battery_log(BAT_LOG_FULL, "[charging_get_battery_status] BATON_TDET_EN = %d\n", val);
  306. if (val) {
  307. pmic_set_register_value(PMIC_BATON_TDET_EN, 1);
  308. pmic_set_register_value(PMIC_RG_BATON_EN, 1);
  309. *(kal_bool *) (data) = pmic_get_register_value(PMIC_RGS_BATON_UNDET);
  310. } else {
  311. *(kal_bool *) (data) = KAL_FALSE;
  312. }
  313. #endif
  314. return status;
  315. }
  316. static unsigned int charging_get_charger_det_status(void *data)
  317. {
  318. unsigned int status = STATUS_OK;
  319. #if defined(CONFIG_MTK_FPGA)
  320. *(kal_bool *) (data) = 1;
  321. battery_log(BAT_LOG_CRTI, "chr exist for fpga\n");
  322. #else
  323. *(kal_bool *) (data) = pmic_get_register_value_nolock(PMIC_RGS_CHRDET);
  324. #endif
  325. return status;
  326. }
  327. kal_bool charging_type_detection_done(void)
  328. {
  329. return charging_type_det_done;
  330. }
  331. static unsigned int charging_get_charger_type(void *data)
  332. {
  333. unsigned int status = STATUS_OK;
  334. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  335. *(CHARGER_TYPE *) (data) = STANDARD_HOST;
  336. #else
  337. *(CHARGER_TYPE *) (data) = hw_charging_get_charger_type();
  338. #endif
  339. return status;
  340. }
  341. static unsigned int charging_get_is_pcm_timer_trigger(void *data)
  342. {
  343. unsigned int status = STATUS_OK;
  344. /*
  345. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  346. *(kal_bool *) (data) = KAL_FALSE;
  347. #else
  348. if (slp_get_wake_reason() == WR_PCM_TIMER)
  349. *(kal_bool *) (data) = KAL_TRUE;
  350. else
  351. *(kal_bool *) (data) = KAL_FALSE;
  352. battery_log(BAT_LOG_CRTI, "slp_get_wake_reason=%d\n", slp_get_wake_reason());
  353. #endif
  354. */
  355. return status;
  356. }
  357. static unsigned int charging_set_platform_reset(void *data)
  358. {
  359. unsigned int status = STATUS_OK;
  360. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  361. #else
  362. battery_log(BAT_LOG_CRTI, "charging_set_platform_reset\n");
  363. kernel_restart("battery service reboot system");
  364. /* arch_reset(0,NULL); */
  365. #endif
  366. return status;
  367. }
  368. static unsigned int charging_get_platform_boot_mode(void *data)
  369. {
  370. unsigned int status = STATUS_OK;
  371. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  372. #else
  373. *(unsigned int *) (data) = get_boot_mode();
  374. battery_log(BAT_LOG_CRTI, "get_boot_mode=%d\n", get_boot_mode());
  375. #endif
  376. return status;
  377. }
  378. static unsigned int charging_set_power_off(void *data)
  379. {
  380. unsigned int status = STATUS_OK;
  381. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  382. #else
  383. battery_log(BAT_LOG_CRTI, "charging_set_power_off\n");
  384. kernel_power_off();
  385. #endif
  386. return status;
  387. }
  388. static unsigned int charging_get_power_source(void *data)
  389. {
  390. unsigned int status = STATUS_OK;
  391. #if 0 /* #if defined(MTK_POWER_EXT_DETECT) */
  392. if (MT_BOARD_PHONE == mt_get_board_type())
  393. *(kal_bool *) data = KAL_FALSE;
  394. else
  395. *(kal_bool *) data = KAL_TRUE;
  396. #else
  397. *(kal_bool *) data = KAL_FALSE;
  398. #endif
  399. return status;
  400. }
  401. static unsigned int charging_get_csdac_full_flag(void *data)
  402. {
  403. unsigned int status = STATUS_OK;
  404. *(kal_bool *) data = KAL_FALSE;
  405. return status;
  406. }
  407. static unsigned int charging_set_ta_current_pattern(void *data)
  408. {
  409. unsigned int status = STATUS_OK;
  410. unsigned int increase = *(unsigned int *) (data);
  411. unsigned int debug_val = 0;
  412. unsigned char count = 0;
  413. pmic_set_register_value(PMIC_RG_CS_VTH, 0xc);
  414. if (increase == KAL_TRUE) {
  415. /* Set communication mode high/low current */
  416. pmic_set_register_value(PMIC_RG_CM_CS_VTHH, 0xa); /* 650mA */
  417. pmic_set_register_value(PMIC_RG_CM_CS_VTHL, 0xf); /* 70mA */
  418. /* Set CM_VINC high period time (HPRD1, HPRD2) */
  419. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD1, 9); /* 100ms */
  420. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD2, 9); /* 100ms */
  421. /* Set CM_VINC high period time (HPRD3, HPRD4) */
  422. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD3, 29); /* 300ms */
  423. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD4, 29); /* 300ms */
  424. /* Set CM_VINC high period time (HPRD5, HPRD6) */
  425. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD5, 29); /* 300ms */
  426. pmic_set_register_value(PMIC_RG_CM_VINC_HPRD6, 49); /* 500ms */
  427. /* Enable CM_VINC interrupt */
  428. /* mt6325_upmu_set_rg_int_en_pchr_cm_vinc(0x1); */
  429. pmic_set_register_value(PMIC_RG_INT_EN_PCHR_CM_VINC, 1);
  430. /* Select PCHR debug flag to monitor abnormal abort */
  431. pmic_set_register_value(PMIC_RG_PCHR_FLAG_SEL, 0x2e);
  432. /* Enable PCHR debug flag */
  433. pmic_set_register_value(PMIC_RG_PCHR_FLAG_EN, 0x1);
  434. /* Trigger CM VINC mode */
  435. pmic_set_register_value(PMIC_RG_CM_VINC_TRIG, 0x1);
  436. /* wait for interrupt */
  437. while (pmic_get_register_value(PMIC_PCHR_CM_VINC_STATUS) != 1) {
  438. msleep(50);
  439. count++;
  440. if (count > 42)
  441. break;
  442. }
  443. } else {
  444. /* Set communication mode high/low current */
  445. pmic_set_register_value(PMIC_RG_CM_CS_VTHH, 0xa); /* 650mA */
  446. pmic_set_register_value(PMIC_RG_CM_CS_VTHL, 0xf); /* 70mA */
  447. /* Set CM_VINC high period time (HPRD1, HPRD2) */
  448. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD1, 29); /* 100ms */
  449. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD2, 29); /* 100ms */
  450. /* Set CM_VINC high period time (HPRD3, HPRD4) */
  451. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD3, 29); /* 300ms */
  452. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD4, 9); /* 300ms */
  453. /* Set CM_VINC high period time (HPRD5, HPRD6) */
  454. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD5, 9); /* 300ms */
  455. pmic_set_register_value(PMIC_RG_CM_VDEC_HPRD6, 49); /* 500ms */
  456. /* Enable CM_VINC interrupt */
  457. /* mt6325_upmu_set_rg_int_en_pchr_cm_vinc(0x1); */
  458. pmic_set_register_value(PMIC_RG_INT_EN_PCHR_CM_VDEC, 1);
  459. /* Select PCHR debug flag to monitor abnormal abort */
  460. pmic_set_register_value(PMIC_RG_PCHR_FLAG_SEL, 0x2e);
  461. /* Enable PCHR debug flag */
  462. pmic_set_register_value(PMIC_RG_PCHR_FLAG_EN, 0x1);
  463. /* Trigger CM VINC mode */
  464. pmic_set_register_value(PMIC_RG_CM_VDEC_TRIG, 0x1);
  465. /* wait for interrupt */
  466. while (pmic_get_register_value(PMIC_PCHR_CM_VDEC_STATUS) != 1) {
  467. msleep(50);
  468. count++;
  469. if (count > 42)
  470. break;
  471. }
  472. }
  473. debug_val = pmic_get_register_value(PMIC_RGS_PCHR_FLAG_OUT);
  474. battery_log(BAT_LOG_CRTI, "[charging_set_ta_current_pattern] debug_val=0x%x cnt=%d\n",
  475. debug_val, count);
  476. if (count > 10 || debug_val != 0)
  477. status = STATUS_FAIL;
  478. return status;
  479. }
  480. /*static unsigned int charging_get_error_state(void *data)
  481. {
  482. return STATUS_UNSUPPORTED;
  483. }*/
  484. static unsigned int charging_set_error_state(void *data)
  485. {
  486. return STATUS_UNSUPPORTED;
  487. }
  488. static unsigned int(*charging_func[CHARGING_CMD_NUMBER]) (void *data);
  489. /*
  490. * FUNCTION
  491. * Internal_chr_control_handler
  492. *
  493. * DESCRIPTION
  494. * This function is called to set the charger hw
  495. *
  496. * CALLS
  497. *
  498. * PARAMETERS
  499. * None
  500. *
  501. * RETURNS
  502. *
  503. *
  504. * GLOBALS AFFECTED
  505. * None
  506. */
  507. signed int chr_control_interface(CHARGING_CTRL_CMD cmd, void *data)
  508. {
  509. signed int status;
  510. static signed int init = -1;
  511. if (init == -1) {
  512. init = 0;
  513. charging_func[CHARGING_CMD_INIT] = charging_hw_init;
  514. charging_func[CHARGING_CMD_DUMP_REGISTER] = charging_dump_register;
  515. charging_func[CHARGING_CMD_ENABLE] = charging_enable;
  516. charging_func[CHARGING_CMD_SET_CV_VOLTAGE] = charging_set_cv_voltage;
  517. charging_func[CHARGING_CMD_GET_CURRENT] = charging_get_current;
  518. charging_func[CHARGING_CMD_SET_CURRENT] = charging_set_current;
  519. charging_func[CHARGING_CMD_SET_INPUT_CURRENT] = charging_set_input_current;
  520. charging_func[CHARGING_CMD_GET_CHARGING_STATUS] = charging_get_charging_status;
  521. charging_func[CHARGING_CMD_RESET_WATCH_DOG_TIMER] = charging_reset_watch_dog_timer;
  522. charging_func[CHARGING_CMD_SET_HV_THRESHOLD] = charging_set_hv_threshold;
  523. charging_func[CHARGING_CMD_GET_HV_STATUS] = charging_get_hv_status;
  524. charging_func[CHARGING_CMD_GET_BATTERY_STATUS] = charging_get_battery_status;
  525. charging_func[CHARGING_CMD_GET_CHARGER_DET_STATUS] = charging_get_charger_det_status;
  526. charging_func[CHARGING_CMD_GET_CHARGER_TYPE] = charging_get_charger_type;
  527. charging_func[CHARGING_CMD_GET_IS_PCM_TIMER_TRIGGER] = charging_get_is_pcm_timer_trigger;
  528. charging_func[CHARGING_CMD_SET_PLATFORM_RESET] = charging_set_platform_reset;
  529. charging_func[CHARGING_CMD_GET_PLATFORM_BOOT_MODE] = charging_get_platform_boot_mode;
  530. charging_func[CHARGING_CMD_SET_POWER_OFF] = charging_set_power_off;
  531. charging_func[CHARGING_CMD_GET_POWER_SOURCE] = charging_get_power_source;
  532. charging_func[CHARGING_CMD_GET_CSDAC_FALL_FLAG] = charging_get_csdac_full_flag;
  533. charging_func[CHARGING_CMD_SET_TA_CURRENT_PATTERN] = charging_set_ta_current_pattern;
  534. charging_func[CHARGING_CMD_SET_ERROR_STATE] = charging_set_error_state;
  535. }
  536. if (cmd < CHARGING_CMD_NUMBER)
  537. status = charging_func[cmd] (data);
  538. else
  539. return STATUS_UNSUPPORTED;
  540. return status;
  541. }