charging_hw_bq24296.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209
  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. #include "bq24296.h"
  11. /* ============================================================ // */
  12. /* Define */
  13. /* ============================================================ // */
  14. #define STATUS_OK 0
  15. #define STATUS_FAIL 1
  16. #define STATUS_UNSUPPORTED -1
  17. #define GETARRAYNUM(array) (sizeof(array)/sizeof(array[0]))
  18. /* ============================================================ // */
  19. /* Global variable */
  20. /* ============================================================ // */
  21. const unsigned int VBAT_CV_VTH[] = {
  22. 3504000, 3520000, 3536000, 3552000,
  23. 3568000, 3584000, 3600000, 3616000,
  24. 3632000, 3648000, 3664000, 3680000,
  25. 3696000, 3712000, 3728000, 3744000,
  26. 3760000, 3776000, 3792000, 3808000,
  27. 3824000, 3840000, 3856000, 3872000,
  28. 3888000, 3904000, 3920000, 3936000,
  29. 3952000, 3968000, 3984000, 4000000,
  30. 4016000, 4032000, 4048000, 4064000,
  31. 4080000, 4096000, 4112000, 4128000,
  32. 4144000, 4160000, 4176000, 4192000,
  33. 4208000, 4224000, 4240000, 4256000,
  34. 4272000, 4288000, 4304000, 4320000,
  35. 4336000, 4352000
  36. };
  37. /* Correct CS_VTH parameters to bq24296M data sheet */
  38. const unsigned int CS_VTH[] = {
  39. // 0, 6400, 12800, 19200,
  40. // 25600, 32000, 38400, 44800,
  41. 51200, 57600, 64000, 70400,
  42. 76800, 83200, 89600, 96000,
  43. 102400, 108800, 115200, 121600,
  44. 128000, 134400, 140800, 147200,
  45. 153600, 160000, 166400, 172800,
  46. 179200, 185600, 192000, 198400,
  47. 204800, 211200, 217600, 224000
  48. };
  49. const unsigned int INPUT_CS_VTH[] = {
  50. CHARGE_CURRENT_100_00_MA, CHARGE_CURRENT_150_00_MA, CHARGE_CURRENT_500_00_MA,
  51. CHARGE_CURRENT_900_00_MA,
  52. CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1500_00_MA, CHARGE_CURRENT_2000_00_MA,
  53. CHARGE_CURRENT_MAX
  54. };
  55. const unsigned int VCDT_HV_VTH[] = {
  56. BATTERY_VOLT_04_200000_V, BATTERY_VOLT_04_250000_V, BATTERY_VOLT_04_300000_V,
  57. BATTERY_VOLT_04_350000_V,
  58. BATTERY_VOLT_04_400000_V, BATTERY_VOLT_04_450000_V, BATTERY_VOLT_04_500000_V,
  59. BATTERY_VOLT_04_550000_V,
  60. BATTERY_VOLT_04_600000_V, BATTERY_VOLT_06_000000_V, BATTERY_VOLT_06_500000_V,
  61. BATTERY_VOLT_07_000000_V,
  62. BATTERY_VOLT_07_500000_V, BATTERY_VOLT_08_500000_V, BATTERY_VOLT_09_500000_V,
  63. BATTERY_VOLT_10_500000_V
  64. };
  65. #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
  66. #ifndef CUST_GPIO_VIN_SEL
  67. #define CUST_GPIO_VIN_SEL 18
  68. #endif
  69. #if !defined(MTK_AUXADC_IRQ_SUPPORT)
  70. #define SW_POLLING_PERIOD 100 /* 100 ms */
  71. #define MSEC_TO_NSEC(x) (x * 1000000UL)
  72. static DEFINE_MUTEX(diso_polling_mutex);
  73. static DECLARE_WAIT_QUEUE_HEAD(diso_polling_thread_wq);
  74. static struct hrtimer diso_kthread_timer;
  75. static kal_bool diso_thread_timeout = KAL_FALSE;
  76. static struct delayed_work diso_polling_work;
  77. static void diso_polling_handler(struct work_struct *work);
  78. static DISO_Polling_Data DISO_Polling;
  79. #endif
  80. int g_diso_state = 0;
  81. int vin_sel_gpio_number = (CUST_GPIO_VIN_SEL | 0x80000000);
  82. static char *DISO_state_s[8] = {
  83. "IDLE",
  84. "OTG_ONLY",
  85. "USB_ONLY",
  86. "USB_WITH_OTG",
  87. "DC_ONLY",
  88. "DC_WITH_OTG",
  89. "DC_WITH_USB",
  90. "DC_USB_OTG",
  91. };
  92. #endif
  93. /* ============================================================ // */
  94. /* function prototype */
  95. /* ============================================================ // */
  96. /* ============================================================ // */
  97. /* extern variable */
  98. /* ============================================================ // */
  99. /* ============================================================ // */
  100. /* extern function */
  101. /* ============================================================ // */
  102. static unsigned int charging_error;
  103. static unsigned int charging_get_error_state(void);
  104. static unsigned int charging_set_error_state(void *data);
  105. /* ============================================================ // */
  106. unsigned int charging_value_to_parameter(const unsigned int *parameter, const unsigned int array_size,
  107. const unsigned int val)
  108. {
  109. unsigned int temp_param;
  110. if (val < array_size) {
  111. temp_param = parameter[val];
  112. } else {
  113. battery_log(BAT_LOG_CRTI, "Can't find the parameter \r\n");
  114. temp_param = parameter[0];
  115. }
  116. return temp_param;
  117. }
  118. unsigned int charging_parameter_to_value(const unsigned int *parameter, const unsigned int array_size,
  119. const unsigned int val)
  120. {
  121. unsigned int i;
  122. battery_log(BAT_LOG_FULL, "array_size = %d \r\n", array_size);
  123. for (i = 0; i < array_size; i++) {
  124. if (val == *(parameter + i))
  125. return i;
  126. }
  127. battery_log(BAT_LOG_CRTI, "NO register value match. val=%d\r\n", val);
  128. return 0;
  129. }
  130. static unsigned int bmt_find_closest_level(const unsigned int *pList, unsigned int number,
  131. unsigned int level)
  132. {
  133. unsigned int i, temp_param;
  134. unsigned int max_value_in_last_element;
  135. if (pList[0] < pList[1])
  136. max_value_in_last_element = KAL_TRUE;
  137. else
  138. max_value_in_last_element = KAL_FALSE;
  139. if (max_value_in_last_element == KAL_TRUE) {
  140. /* max value in the last element */
  141. for (i = (number - 1); i != 0; i--) {
  142. if (pList[i] <= level)
  143. return pList[i];
  144. }
  145. battery_log(BAT_LOG_CRTI, "Can't find closest level, small value first \r\n");
  146. temp_param = pList[0];
  147. } else {
  148. /* max value in the first element */
  149. for (i = 0; i < number; i++) {
  150. if (pList[i] <= level)
  151. return pList[i];
  152. }
  153. battery_log(BAT_LOG_CRTI, "Can't find closest level, large value first \r\n");
  154. temp_param = pList[number - 1];
  155. }
  156. return temp_param;
  157. }
  158. static unsigned int charging_hw_init(void *data)
  159. {
  160. unsigned int status = STATUS_OK;
  161. #if defined(GPIO_SWCHARGER_EN_PIN)
  162. mt_set_gpio_mode(GPIO_SWCHARGER_EN_PIN, GPIO_MODE_GPIO);
  163. mt_set_gpio_dir(GPIO_SWCHARGER_EN_PIN, GPIO_DIR_OUT);
  164. mt_set_gpio_out(GPIO_SWCHARGER_EN_PIN, GPIO_OUT_ZERO);
  165. #endif
  166. bq24296_set_en_hiz(0x0);
  167. bq24296_set_vindpm(0x7); //VIN DPM check 4.44V
  168. bq24296_set_reg_rst(0x0);
  169. bq24296_set_wdt_rst(0x1); /* Kick watchdog */
  170. bq24296_set_sys_min(0x5); /* Minimum system voltage 3.5V */
  171. bq24296_set_iprechg(0x3); /* Precharge current 512mA */
  172. bq24296_set_iterm(0x0); /* Termination current 128mA */
  173. if (batt_cust_data.high_battery_voltage_support)
  174. bq24296_set_vreg(0x35); /* VREG 4.352V */
  175. else
  176. bq24296_set_vreg(0x2C); /* VREG 4.208V */
  177. bq24296_set_batlowv(0x1); /* BATLOWV 3.0V */
  178. bq24296_set_vrechg(0x0); /* VRECHG 0.1V (4.108V) */
  179. bq24296_set_en_term(0x1); /* Enable termination */
  180. bq24296_set_watchdog(0x1); /* WDT 40s */
  181. bq24296_set_en_timer(0x0); /* Disable charge timer */
  182. bq24296_set_int_mask(0x0); /* Disable fault interrupt */
  183. #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
  184. mt_set_gpio_mode(vin_sel_gpio_number, 0); /* 0:GPIO mode */
  185. mt_set_gpio_dir(vin_sel_gpio_number, 0); /* 0: input, 1: output */
  186. #endif
  187. return status;
  188. }
  189. static unsigned int charging_dump_register(void *data)
  190. {
  191. battery_log(BAT_LOG_CRTI, "charging_dump_register\r\n");
  192. bq24296_dump_register();
  193. return STATUS_OK;
  194. }
  195. static unsigned int charging_enable(void *data)
  196. {
  197. unsigned int status = STATUS_OK;
  198. unsigned int enable = *(unsigned int *) (data);
  199. unsigned int bootmode = 0;
  200. if (KAL_TRUE == enable) {
  201. bq24296_set_en_hiz(0x0);
  202. bq24296_set_chg_config(0x1); /* charger enable */
  203. } else {
  204. #if defined(CONFIG_USB_MTK_HDRC_HCD)
  205. if (mt_usb_is_device()) {
  206. #endif
  207. bq24296_set_chg_config(0x0);
  208. if (charging_get_error_state()) {
  209. battery_log(BAT_LOG_CRTI, "[charging_enable] bq24296_set_en_hiz(0x1)\n");
  210. bq24296_set_en_hiz(0x1); /* disable power path */
  211. }
  212. #if defined(CONFIG_USB_MTK_HDRC_HCD)
  213. }
  214. #endif
  215. bootmode = get_boot_mode();
  216. if ((bootmode == META_BOOT) || (bootmode == ADVMETA_BOOT))
  217. bq24296_set_en_hiz(0x1);
  218. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  219. bq24296_set_chg_config(0x0);
  220. bq24296_set_en_hiz(0x1); /* disable power path */
  221. #endif
  222. }
  223. return status;
  224. }
  225. static unsigned int charging_set_cv_voltage(void *data)
  226. {
  227. unsigned int status = STATUS_OK;
  228. unsigned int array_size;
  229. unsigned int set_cv_voltage;
  230. unsigned short register_value;
  231. unsigned int cv_value = *(unsigned int *) (data);
  232. static short pre_register_value = -1;
  233. if (batt_cust_data.high_battery_voltage_support) {
  234. if (cv_value >= BATTERY_VOLT_04_300000_V)
  235. // cv_value = 4304000;
  236. cv_value = 4360000;//rasie charging voltage,modify by xmtjx
  237. }
  238. /* use nearest value */
  239. if (BATTERY_VOLT_04_200000_V == cv_value)
  240. cv_value = 4208000;
  241. array_size = GETARRAYNUM(VBAT_CV_VTH);
  242. set_cv_voltage = bmt_find_closest_level(VBAT_CV_VTH, array_size, cv_value);
  243. register_value = charging_parameter_to_value(VBAT_CV_VTH, array_size, set_cv_voltage);
  244. bq24296_set_vreg(register_value);
  245. /* for jeita recharging issue */
  246. if (pre_register_value != register_value)
  247. bq24296_set_chg_config(1);
  248. pre_register_value = register_value;
  249. return status;
  250. }
  251. static unsigned int charging_get_current(void *data)
  252. {
  253. unsigned int status = STATUS_OK;
  254. /* unsigned int array_size; */
  255. /* unsigned char reg_value; */
  256. unsigned char ret_val = 0;
  257. unsigned char ret_force_20pct = 0;
  258. /* Get current level */
  259. bq24296_read_interface(bq24296_CON2, &ret_val, CON2_ICHG_MASK, CON2_ICHG_SHIFT);
  260. /* Get Force 20% option */
  261. bq24296_read_interface(bq24296_CON2, &ret_force_20pct, CON2_FORCE_20PCT_MASK,
  262. CON2_FORCE_20PCT_SHIFT);
  263. /* Parsing */
  264. ret_val = (ret_val * 64) + 512;
  265. if (ret_force_20pct == 0) {
  266. /* Get current level */
  267. /* array_size = GETARRAYNUM(CS_VTH); */
  268. /* *(unsigned int *)data = charging_value_to_parameter(CS_VTH,array_size,reg_value); */
  269. *(unsigned int *) data = ret_val;
  270. } else {
  271. /* Get current level */
  272. /* array_size = GETARRAYNUM(CS_VTH_20PCT); */
  273. /* *(unsigned int *)data = charging_value_to_parameter(CS_VTH,array_size,reg_value); */
  274. /* return (int)(ret_val<<1)/10; */
  275. *(unsigned int *) data = (int)(ret_val << 1) / 10;
  276. }
  277. return status;
  278. }
  279. static unsigned int charging_set_current(void *data)
  280. {
  281. unsigned int status = STATUS_OK;
  282. unsigned int set_chr_current;
  283. unsigned int array_size;
  284. unsigned int register_value;
  285. unsigned int current_value = *(unsigned int *) data;
  286. array_size = GETARRAYNUM(CS_VTH);
  287. set_chr_current = bmt_find_closest_level(CS_VTH, array_size, current_value);
  288. register_value = charging_parameter_to_value(CS_VTH, array_size, set_chr_current);
  289. bq24296_set_ichg(register_value);
  290. return status;
  291. }
  292. static unsigned int charging_set_input_current(void *data)
  293. {
  294. unsigned int status = STATUS_OK;
  295. unsigned int current_value = *(unsigned int *) data;
  296. unsigned int set_chr_current;
  297. unsigned int array_size;
  298. unsigned int register_value;
  299. array_size = GETARRAYNUM(INPUT_CS_VTH);
  300. set_chr_current = bmt_find_closest_level(INPUT_CS_VTH, array_size, current_value);
  301. register_value = charging_parameter_to_value(INPUT_CS_VTH, array_size, set_chr_current);
  302. bq24296_set_iinlim(register_value);
  303. return status;
  304. }
  305. static unsigned int charging_get_charging_status(void *data)
  306. {
  307. unsigned int status = STATUS_OK;
  308. unsigned int ret_val;
  309. ret_val = bq24296_get_chrg_stat();
  310. if (ret_val == 0x3)
  311. *(unsigned int *) data = KAL_TRUE;
  312. else
  313. *(unsigned int *) data = KAL_FALSE;
  314. return status;
  315. }
  316. static unsigned int charging_reset_watch_dog_timer(void *data)
  317. {
  318. unsigned int status = STATUS_OK;
  319. battery_log(BAT_LOG_FULL, "charging_reset_watch_dog_timer\r\n");
  320. bq24296_set_wdt_rst(0x1); /* Kick watchdog */
  321. return status;
  322. }
  323. static unsigned int charging_set_hv_threshold(void *data)
  324. {
  325. unsigned int status = STATUS_OK;
  326. unsigned int set_hv_voltage;
  327. unsigned int array_size;
  328. unsigned short register_value;
  329. unsigned int voltage = *(unsigned int *) (data);
  330. array_size = GETARRAYNUM(VCDT_HV_VTH);
  331. set_hv_voltage = bmt_find_closest_level(VCDT_HV_VTH, array_size, voltage);
  332. register_value = charging_parameter_to_value(VCDT_HV_VTH, array_size, set_hv_voltage);
  333. pmic_set_register_value(PMIC_RG_VCDT_HV_VTH, register_value);
  334. return status;
  335. }
  336. static unsigned int charging_get_hv_status(void *data)
  337. {
  338. unsigned int status = STATUS_OK;
  339. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  340. *(kal_bool *) (data) = 0;
  341. pr_notice("[charging_get_hv_status] charger ok for bring up.\n");
  342. #else
  343. *(kal_bool *) (data) = pmic_get_register_value(PMIC_RGS_VCDT_HV_DET);
  344. #endif
  345. return status;
  346. }
  347. static unsigned int charging_get_battery_status(void *data)
  348. {
  349. unsigned int status = STATUS_OK;
  350. unsigned int val = 0;
  351. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  352. *(kal_bool *) (data) = 0; /* battery exist */
  353. battery_log(BAT_LOG_CRTI, "[charging_get_battery_status] battery exist for bring up.\n");
  354. #else
  355. val = pmic_get_register_value(PMIC_BATON_TDET_EN);
  356. battery_log(BAT_LOG_CRTI, "[charging_get_battery_status] BATON_TDET_EN = %d\n", val);
  357. if (val) {
  358. pmic_set_register_value(PMIC_BATON_TDET_EN, 1);
  359. pmic_set_register_value(PMIC_RG_BATON_EN, 1);
  360. *(kal_bool *) (data) = pmic_get_register_value(PMIC_RGS_BATON_UNDET);
  361. } else {
  362. *(kal_bool *) (data) = KAL_FALSE;
  363. }
  364. #endif
  365. return status;
  366. }
  367. static unsigned int charging_get_charger_det_status(void *data)
  368. {
  369. unsigned int status = STATUS_OK;
  370. unsigned int val = 0;
  371. #if defined(CONFIG_MTK_FPGA)
  372. val = 1;
  373. battery_log(BAT_LOG_CRTI, "[charging_get_charger_det_status] chr exist for fpga.\n");
  374. #else
  375. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  376. val = pmic_get_register_value_nolock(PMIC_RGS_CHRDET);
  377. #else
  378. if (((g_diso_state >> 1) & 0x3) != 0x0 || pmic_get_register_value_nolock(PMIC_RGS_CHRDET))
  379. val = KAL_TRUE;
  380. else
  381. val = KAL_FALSE;
  382. #endif
  383. #endif
  384. *(kal_bool *) (data) = val;
  385. return status;
  386. }
  387. static unsigned int charging_get_charger_type(void *data)
  388. {
  389. unsigned int status = STATUS_OK;
  390. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  391. *(CHARGER_TYPE *) (data) = STANDARD_HOST;
  392. #else
  393. *(CHARGER_TYPE *) (data) = hw_charging_get_charger_type();
  394. #endif
  395. return status;
  396. }
  397. static unsigned int charging_get_is_pcm_timer_trigger(void *data)
  398. {
  399. unsigned int status = STATUS_OK;
  400. /*
  401. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  402. *(kal_bool *) (data) = KAL_FALSE;
  403. #else
  404. if (slp_get_wake_reason() == WR_PCM_TIMER)
  405. *(kal_bool *) (data) = KAL_TRUE;
  406. else
  407. *(kal_bool *) (data) = KAL_FALSE;
  408. battery_log(BAT_LOG_CRTI, "slp_get_wake_reason=%d\n", slp_get_wake_reason());
  409. #endif
  410. */
  411. return status;
  412. }
  413. static unsigned int charging_set_platform_reset(void *data)
  414. {
  415. unsigned int status = STATUS_OK;
  416. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  417. #else
  418. battery_log(BAT_LOG_CRTI, "charging_set_platform_reset\n");
  419. kernel_restart("battery service reboot system");
  420. /* arch_reset(0,NULL); */
  421. #endif
  422. return status;
  423. }
  424. static unsigned int charging_get_platform_boot_mode(void *data)
  425. {
  426. unsigned int status = STATUS_OK;
  427. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  428. #else
  429. *(unsigned int *) (data) = get_boot_mode();
  430. battery_log(BAT_LOG_CRTI, "get_boot_mode=%d\n", get_boot_mode());
  431. #endif
  432. return status;
  433. }
  434. static unsigned int charging_set_power_off(void *data)
  435. {
  436. unsigned int status = STATUS_OK;
  437. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  438. #else
  439. battery_log(BAT_LOG_CRTI, "charging_set_power_off\n");
  440. kernel_power_off();
  441. #endif
  442. return status;
  443. }
  444. static unsigned int charging_get_power_source(void *data)
  445. {
  446. unsigned int status = STATUS_OK;
  447. #if 0 /* #if defined(MTK_POWER_EXT_DETECT) */
  448. if (MT_BOARD_PHONE == mt_get_board_type())
  449. *(kal_bool *) data = KAL_FALSE;
  450. else
  451. *(kal_bool *) data = KAL_TRUE;
  452. #else
  453. *(kal_bool *) data = KAL_FALSE;
  454. #endif
  455. return status;
  456. }
  457. static unsigned int charging_get_csdac_full_flag(void *data)
  458. {
  459. return STATUS_UNSUPPORTED;
  460. }
  461. static unsigned int charging_set_ta_current_pattern(void *data)
  462. {
  463. unsigned int increase = *(unsigned int *) (data);
  464. unsigned int charging_status = KAL_FALSE;
  465. BATTERY_VOLTAGE_ENUM cv_voltage = BATTERY_VOLT_04_200000_V;
  466. if (batt_cust_data.high_battery_voltage_support)
  467. // cv_voltage = BATTERY_VOLT_04_340000_V;
  468. cv_voltage = BATTERY_VOLT_04_350000_V;//raise charging vol,modify by xmtjx
  469. charging_get_charging_status(&charging_status);
  470. if (KAL_FALSE == charging_status) {
  471. charging_set_cv_voltage(&cv_voltage); /* Set CV */
  472. bq24296_set_ichg(0x0); /* Set charging current 500ma */
  473. bq24296_set_chg_config(0x1); /* Enable Charging */
  474. }
  475. if (increase == KAL_TRUE) {
  476. bq24296_set_iinlim(0x0); /* 100mA */
  477. msleep(85);
  478. bq24296_set_iinlim(0x2); /* 500mA */
  479. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 1");
  480. msleep(85);
  481. bq24296_set_iinlim(0x0); /* 100mA */
  482. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 1");
  483. msleep(85);
  484. bq24296_set_iinlim(0x2); /* 500mA */
  485. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 2");
  486. msleep(85);
  487. bq24296_set_iinlim(0x0); /* 100mA */
  488. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 2");
  489. msleep(85);
  490. bq24296_set_iinlim(0x2); /* 500mA */
  491. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 3");
  492. msleep(281);
  493. bq24296_set_iinlim(0x0); /* 100mA */
  494. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 3");
  495. msleep(85);
  496. bq24296_set_iinlim(0x2); /* 500mA */
  497. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 4");
  498. msleep(281);
  499. bq24296_set_iinlim(0x0); /* 100mA */
  500. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 4");
  501. msleep(85);
  502. bq24296_set_iinlim(0x2); /* 500mA */
  503. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 5");
  504. msleep(281);
  505. bq24296_set_iinlim(0x0); /* 100mA */
  506. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 5");
  507. msleep(85);
  508. bq24296_set_iinlim(0x2); /* 500mA */
  509. battery_log(BAT_LOG_FULL, "mtk_ta_increase() on 6");
  510. msleep(485);
  511. bq24296_set_iinlim(0x0); /* 100mA */
  512. battery_log(BAT_LOG_FULL, "mtk_ta_increase() off 6");
  513. msleep(50);
  514. battery_log(BAT_LOG_CRTI, "mtk_ta_increase() end\n");
  515. bq24296_set_iinlim(0x2); /* 500mA */
  516. msleep(200);
  517. } else {
  518. bq24296_set_iinlim(0x0); /* 100mA */
  519. msleep(85);
  520. bq24296_set_iinlim(0x2); /* 500mA */
  521. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 1");
  522. msleep(281);
  523. bq24296_set_iinlim(0x0); /* 100mA */
  524. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 1");
  525. msleep(85);
  526. bq24296_set_iinlim(0x2); /* 500mA */
  527. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 2");
  528. msleep(281);
  529. bq24296_set_iinlim(0x0); /* 100mA */
  530. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 2");
  531. msleep(85);
  532. bq24296_set_iinlim(0x2); /* 500mA */
  533. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 3");
  534. msleep(281);
  535. bq24296_set_iinlim(0x0); /* 100mA */
  536. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 3");
  537. msleep(85);
  538. bq24296_set_iinlim(0x2); /* 500mA */
  539. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 4");
  540. msleep(85);
  541. bq24296_set_iinlim(0x0); /* 100mA */
  542. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 4");
  543. msleep(85);
  544. bq24296_set_iinlim(0x2); /* 500mA */
  545. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 5");
  546. msleep(85);
  547. bq24296_set_iinlim(0x0); /* 100mA */
  548. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 5");
  549. msleep(85);
  550. bq24296_set_iinlim(0x2); /* 500mA */
  551. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() on 6");
  552. msleep(485);
  553. bq24296_set_iinlim(0x0); /* 100mA */
  554. battery_log(BAT_LOG_FULL, "mtk_ta_decrease() off 6");
  555. msleep(50);
  556. battery_log(BAT_LOG_CRTI, "mtk_ta_decrease() end\n");
  557. bq24296_set_iinlim(0x2); /* 500mA */
  558. }
  559. return STATUS_OK;
  560. }
  561. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  562. void set_vusb_auxadc_irq(bool enable, bool flag)
  563. {
  564. hrtimer_cancel(&diso_kthread_timer);
  565. DISO_Polling.reset_polling = KAL_TRUE;
  566. DISO_Polling.vusb_polling_measure.notify_irq_en = enable;
  567. DISO_Polling.vusb_polling_measure.notify_irq = flag;
  568. hrtimer_start(&diso_kthread_timer, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)),
  569. HRTIMER_MODE_REL);
  570. battery_log(BAT_LOG_FULL, " [%s] enable: %d, flag: %d!\n", __func__, enable, flag);
  571. }
  572. void set_vdc_auxadc_irq(bool enable, bool flag)
  573. {
  574. hrtimer_cancel(&diso_kthread_timer);
  575. DISO_Polling.reset_polling = KAL_TRUE;
  576. DISO_Polling.vdc_polling_measure.notify_irq_en = enable;
  577. DISO_Polling.vdc_polling_measure.notify_irq = flag;
  578. hrtimer_start(&diso_kthread_timer, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)),
  579. HRTIMER_MODE_REL);
  580. battery_log(BAT_LOG_FULL, " [%s] enable: %d, flag: %d!\n", __func__, enable, flag);
  581. }
  582. static void diso_polling_handler(struct work_struct *work)
  583. {
  584. int trigger_channel = -1;
  585. int trigger_flag = -1;
  586. if (DISO_Polling.vdc_polling_measure.notify_irq_en)
  587. trigger_channel = AP_AUXADC_DISO_VDC_CHANNEL;
  588. else if (DISO_Polling.vusb_polling_measure.notify_irq_en)
  589. trigger_channel = AP_AUXADC_DISO_VUSB_CHANNEL;
  590. battery_log(BAT_LOG_CRTI, "[DISO]auxadc handler triggered\n");
  591. switch (trigger_channel) {
  592. case AP_AUXADC_DISO_VDC_CHANNEL:
  593. trigger_flag = DISO_Polling.vdc_polling_measure.notify_irq;
  594. battery_log(BAT_LOG_CRTI, "[DISO]VDC IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel,
  595. trigger_flag);
  596. #ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */
  597. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  598. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  599. set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_FALLING);
  600. if (trigger_flag == DISO_IRQ_RISING) {
  601. DISO_data.diso_state.pre_vusb_state = DISO_ONLINE;
  602. DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE;
  603. DISO_data.diso_state.pre_otg_state = DISO_OFFLINE;
  604. DISO_data.diso_state.cur_vusb_state = DISO_ONLINE;
  605. DISO_data.diso_state.cur_vdc_state = DISO_ONLINE;
  606. DISO_data.diso_state.cur_otg_state = DISO_OFFLINE;
  607. battery_log(BAT_LOG_CRTI, " cur diso_state is %s!\n", DISO_state_s[2]);
  608. }
  609. #else /* for load switch OTG leakage handle */
  610. set_vdc_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag) & 0x1);
  611. if (trigger_flag == DISO_IRQ_RISING) {
  612. DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE;
  613. DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE;
  614. DISO_data.diso_state.pre_otg_state = DISO_ONLINE;
  615. DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE;
  616. DISO_data.diso_state.cur_vdc_state = DISO_ONLINE;
  617. DISO_data.diso_state.cur_otg_state = DISO_ONLINE;
  618. battery_log(BAT_LOG_CRTI, " cur diso_state is %s!\n", DISO_state_s[5]);
  619. } else if (trigger_flag == DISO_IRQ_FALLING) {
  620. DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE;
  621. DISO_data.diso_state.pre_vdc_state = DISO_ONLINE;
  622. DISO_data.diso_state.pre_otg_state = DISO_ONLINE;
  623. DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE;
  624. DISO_data.diso_state.cur_vdc_state = DISO_OFFLINE;
  625. DISO_data.diso_state.cur_otg_state = DISO_ONLINE;
  626. battery_log(BAT_LOG_CRTI, " cur diso_state is %s!\n", DISO_state_s[1]);
  627. } else
  628. battery_log(BAT_LOG_CRTI, "[%s] wrong trigger flag!\n", __func__);
  629. #endif
  630. break;
  631. case AP_AUXADC_DISO_VUSB_CHANNEL:
  632. trigger_flag = DISO_Polling.vusb_polling_measure.notify_irq;
  633. battery_log(BAT_LOG_CRTI, "[DISO]VUSB IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel,
  634. trigger_flag);
  635. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  636. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  637. if (trigger_flag == DISO_IRQ_FALLING) {
  638. DISO_data.diso_state.pre_vusb_state = DISO_ONLINE;
  639. DISO_data.diso_state.pre_vdc_state = DISO_ONLINE;
  640. DISO_data.diso_state.pre_otg_state = DISO_OFFLINE;
  641. DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE;
  642. DISO_data.diso_state.cur_vdc_state = DISO_ONLINE;
  643. DISO_data.diso_state.cur_otg_state = DISO_OFFLINE;
  644. battery_log(BAT_LOG_CRTI, " cur diso_state is %s!\n", DISO_state_s[4]);
  645. } else if (trigger_flag == DISO_IRQ_RISING) {
  646. DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE;
  647. DISO_data.diso_state.pre_vdc_state = DISO_ONLINE;
  648. DISO_data.diso_state.pre_otg_state = DISO_OFFLINE;
  649. DISO_data.diso_state.cur_vusb_state = DISO_ONLINE;
  650. DISO_data.diso_state.cur_vdc_state = DISO_ONLINE;
  651. DISO_data.diso_state.cur_otg_state = DISO_OFFLINE;
  652. battery_log(BAT_LOG_CRTI, " cur diso_state is %s!\n", DISO_state_s[6]);
  653. } else
  654. battery_log(BAT_LOG_CRTI, "[%s] wrong trigger flag!\n", __func__);
  655. set_vusb_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag) & 0x1);
  656. break;
  657. default:
  658. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  659. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  660. battery_log(BAT_LOG_CRTI, "[DISO]VUSB auxadc IRQ triggered ERROR OR TEST\n");
  661. return; /* in error or unexecpt state just return */
  662. }
  663. g_diso_state = *(int *)&DISO_data.diso_state;
  664. battery_log(BAT_LOG_CRTI, "[DISO]g_diso_state: 0x%x\n", g_diso_state);
  665. DISO_data.irq_callback_func(0, NULL);
  666. }
  667. #if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT)
  668. void vdc_eint_handler(void)
  669. {
  670. battery_log(BAT_LOG_CRTI, "[diso_eint] vdc eint irq triger\n");
  671. DISO_data.diso_state.cur_vdc_state = DISO_ONLINE;
  672. mt_eint_mask(CUST_EINT_VDC_NUM);
  673. do_chrdet_int_task();
  674. }
  675. #endif
  676. static unsigned int diso_get_current_voltage(int Channel)
  677. {
  678. int ret = 0, data[4], i, ret_value = 0, ret_temp = 0, times = 5;
  679. if (IMM_IsAdcInitReady() == 0) {
  680. battery_log(BAT_LOG_CRTI, "[DISO] AUXADC is not ready");
  681. return 0;
  682. }
  683. i = times;
  684. while (i--) {
  685. ret_value = IMM_GetOneChannelValue(Channel, data, &ret_temp);
  686. if (ret_value == 0) {
  687. ret += ret_temp;
  688. } else {
  689. times = times > 1 ? times - 1 : 1;
  690. battery_log(BAT_LOG_CRTI, "[diso_get_current_voltage] ret_value=%d, times=%d\n",
  691. ret_value, times);
  692. }
  693. }
  694. ret = ret * 1500 / 4096;
  695. ret = ret / times;
  696. return ret;
  697. }
  698. static void _get_diso_interrupt_state(void)
  699. {
  700. int vol = 0;
  701. int diso_state = 0;
  702. int check_times = 30;
  703. kal_bool vin_state = KAL_FALSE;
  704. #ifndef VIN_SEL_FLAG
  705. mdelay(AUXADC_CHANNEL_DELAY_PERIOD);
  706. #endif
  707. vol = diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL);
  708. vol = (R_DISO_DC_PULL_UP + R_DISO_DC_PULL_DOWN) * 100 * vol / (R_DISO_DC_PULL_DOWN) / 100;
  709. battery_log(BAT_LOG_CRTI, "[DISO] Current DC voltage mV = %d\n", vol);
  710. #ifdef VIN_SEL_FLAG
  711. /* set gpio mode for kpoc issue as DWS has no default setting */
  712. mt_set_gpio_mode(vin_sel_gpio_number, 0); /* 0:GPIO mode */
  713. mt_set_gpio_dir(vin_sel_gpio_number, 0); /* 0: input, 1: output */
  714. if (vol > VDC_MIN_VOLTAGE / 1000 && vol < VDC_MAX_VOLTAGE / 1000) {
  715. /* make sure load switch already switch done */
  716. do {
  717. check_times--;
  718. #ifdef VIN_SEL_FLAG_DEFAULT_LOW
  719. vin_state = mt_get_gpio_in(vin_sel_gpio_number);
  720. #else
  721. vin_state = mt_get_gpio_in(vin_sel_gpio_number);
  722. vin_state = (~vin_state) & 0x1;
  723. #endif
  724. if (!vin_state)
  725. mdelay(5);
  726. } while ((!vin_state) && check_times);
  727. battery_log(BAT_LOG_CRTI, "[DISO] i==%d gpio_state= %d\n",
  728. check_times, mt_get_gpio_in(vin_sel_gpio_number));
  729. if (0 == check_times)
  730. diso_state &= ~0x4; /* SET DC bit as 0 */
  731. else
  732. diso_state |= 0x4; /* SET DC bit as 1 */
  733. } else {
  734. diso_state &= ~0x4; /* SET DC bit as 0 */
  735. }
  736. #else
  737. /* force delay for switching as no flag for check switching done */
  738. mdelay(SWITCH_RISING_TIMING + LOAD_SWITCH_TIMING_MARGIN);
  739. if (vol > VDC_MIN_VOLTAGE / 1000 && vol < VDC_MAX_VOLTAGE / 1000)
  740. diso_state |= 0x4; /* SET DC bit as 1 */
  741. else
  742. diso_state &= ~0x4; /* SET DC bit as 0 */
  743. #endif
  744. vol = diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL);
  745. vol =
  746. (R_DISO_VBUS_PULL_UP +
  747. R_DISO_VBUS_PULL_DOWN) * 100 * vol / (R_DISO_VBUS_PULL_DOWN) / 100;
  748. battery_log(BAT_LOG_CRTI, "[DISO] Current VBUS voltage mV = %d\n", vol);
  749. if (vol > VBUS_MIN_VOLTAGE / 1000 && vol < VBUS_MAX_VOLTAGE / 1000) {
  750. if (!mt_usb_is_device()) {
  751. diso_state |= 0x1; /* SET OTG bit as 1 */
  752. diso_state &= ~0x2; /* SET VBUS bit as 0 */
  753. } else {
  754. diso_state &= ~0x1; /* SET OTG bit as 0 */
  755. diso_state |= 0x2; /* SET VBUS bit as 1; */
  756. }
  757. } else {
  758. diso_state &= 0x4; /* SET OTG and VBUS bit as 0 */
  759. }
  760. battery_log(BAT_LOG_CRTI, "[DISO] DISO_STATE==0x%x\n", diso_state);
  761. g_diso_state = diso_state;
  762. }
  763. int _get_irq_direction(int pre_vol, int cur_vol)
  764. {
  765. int ret = -1;
  766. /* threshold 1000mv */
  767. if ((cur_vol - pre_vol) > 1000)
  768. ret = DISO_IRQ_RISING;
  769. x
  770. else if ((pre_vol - cur_vol) > 1000)
  771. ret = DISO_IRQ_FALLING;
  772. return ret;
  773. }
  774. static void _get_polling_state(void)
  775. {
  776. int vdc_vol = 0, vusb_vol = 0;
  777. int vdc_vol_dir = -1;
  778. int vusb_vol_dir = -1;
  779. DISO_polling_channel *VDC_Polling = &DISO_Polling.vdc_polling_measure;
  780. DISO_polling_channel *VUSB_Polling = &DISO_Polling.vusb_polling_measure;
  781. vdc_vol = diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL);
  782. vdc_vol =
  783. (R_DISO_DC_PULL_UP + R_DISO_DC_PULL_DOWN) * 100 * vdc_vol / (R_DISO_DC_PULL_DOWN) / 100;
  784. vusb_vol = diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL);
  785. vusb_vol =
  786. (R_DISO_VBUS_PULL_UP +
  787. R_DISO_VBUS_PULL_DOWN) * 100 * vusb_vol / (R_DISO_VBUS_PULL_DOWN) / 100;
  788. VDC_Polling->preVoltage = VDC_Polling->curVoltage;
  789. VUSB_Polling->preVoltage = VUSB_Polling->curVoltage;
  790. VDC_Polling->curVoltage = vdc_vol;
  791. VUSB_Polling->curVoltage = vusb_vol;
  792. if (DISO_Polling.reset_polling) {
  793. DISO_Polling.reset_polling = KAL_FALSE;
  794. VDC_Polling->preVoltage = vdc_vol;
  795. VUSB_Polling->preVoltage = vusb_vol;
  796. if (vdc_vol > 1000)
  797. vdc_vol_dir = DISO_IRQ_RISING;
  798. else
  799. vdc_vol_dir = DISO_IRQ_FALLING;
  800. if (vusb_vol > 1000)
  801. vusb_vol_dir = DISO_IRQ_RISING;
  802. else
  803. vusb_vol_dir = DISO_IRQ_FALLING;
  804. } else {
  805. /* get voltage direction */
  806. vdc_vol_dir = _get_irq_direction(VDC_Polling->preVoltage, VDC_Polling->curVoltage);
  807. vusb_vol_dir =
  808. _get_irq_direction(VUSB_Polling->preVoltage, VUSB_Polling->curVoltage);
  809. }
  810. if (VDC_Polling->notify_irq_en && (vdc_vol_dir == VDC_Polling->notify_irq)) {
  811. schedule_delayed_work(&diso_polling_work, 10 * HZ / 1000); /* 10ms */
  812. battery_log(BAT_LOG_CRTI, "[%s] ready to trig VDC irq, irq: %d\n",
  813. __func__, VDC_Polling->notify_irq);
  814. } else if (VUSB_Polling->notify_irq_en && (vusb_vol_dir == VUSB_Polling->notify_irq)) {
  815. schedule_delayed_work(&diso_polling_work, 10 * HZ / 1000);
  816. battery_log(BAT_LOG_CRTI, "[%s] ready to trig VUSB irq, irq: %d\n",
  817. __func__, VUSB_Polling->notify_irq);
  818. } else if ((vdc_vol == 0) && (vusb_vol == 0)) {
  819. VDC_Polling->notify_irq_en = 0;
  820. VUSB_Polling->notify_irq_en = 0;
  821. }
  822. }
  823. enum hrtimer_restart diso_kthread_hrtimer_func(struct hrtimer *timer)
  824. {
  825. diso_thread_timeout = KAL_TRUE;
  826. wake_up(&diso_polling_thread_wq);
  827. return HRTIMER_NORESTART;
  828. }
  829. int diso_thread_kthread(void *x)
  830. {
  831. /* Run on a process content */
  832. while (1) {
  833. wait_event(diso_polling_thread_wq, (diso_thread_timeout == KAL_TRUE));
  834. diso_thread_timeout = KAL_FALSE;
  835. mutex_lock(&diso_polling_mutex);
  836. _get_polling_state();
  837. if (DISO_Polling.vdc_polling_measure.notify_irq_en ||
  838. DISO_Polling.vusb_polling_measure.notify_irq_en)
  839. hrtimer_start(&diso_kthread_timer,
  840. ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)),
  841. HRTIMER_MODE_REL);
  842. else
  843. hrtimer_cancel(&diso_kthread_timer);
  844. mutex_unlock(&diso_polling_mutex);
  845. }
  846. return 0;
  847. }
  848. #endif
  849. static unsigned int charging_diso_init(void *data)
  850. {
  851. unsigned int status = STATUS_OK;
  852. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  853. DISO_ChargerStruct *pDISO_data = (DISO_ChargerStruct *) data;
  854. /* Initialization DISO Struct */
  855. pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE;
  856. pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE;
  857. pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE;
  858. pDISO_data->diso_state.pre_otg_state = DISO_OFFLINE;
  859. pDISO_data->diso_state.pre_vusb_state = DISO_OFFLINE;
  860. pDISO_data->diso_state.pre_vdc_state = DISO_OFFLINE;
  861. pDISO_data->chr_get_diso_state = KAL_FALSE;
  862. pDISO_data->hv_voltage = VBUS_MAX_VOLTAGE;
  863. hrtimer_init(&diso_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  864. diso_kthread_timer.function = diso_kthread_hrtimer_func;
  865. INIT_DELAYED_WORK(&diso_polling_work, diso_polling_handler);
  866. kthread_run(diso_thread_kthread, NULL, "diso_thread_kthread");
  867. battery_log(BAT_LOG_CRTI, "[%s] done\n", __func__);
  868. #if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT)
  869. battery_log(BAT_LOG_CRTI, "[diso_eint]vdc eint irq registitation\n");
  870. mt_eint_set_hw_debounce(CUST_EINT_VDC_NUM, CUST_EINT_VDC_DEBOUNCE_CN);
  871. mt_eint_registration(CUST_EINT_VDC_NUM, CUST_EINTF_TRIGGER_LOW, vdc_eint_handler, 0);
  872. mt_eint_mask(CUST_EINT_VDC_NUM);
  873. #endif
  874. #endif
  875. return status;
  876. }
  877. static unsigned int charging_get_diso_state(void *data)
  878. {
  879. unsigned int status = STATUS_OK;
  880. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  881. int diso_state = 0x0;
  882. DISO_ChargerStruct *pDISO_data = (DISO_ChargerStruct *) data;
  883. _get_diso_interrupt_state();
  884. diso_state = g_diso_state;
  885. battery_log(BAT_LOG_CRTI, "[do_chrdet_int_task] current diso state is %s!\n", DISO_state_s[diso_state]);
  886. if (((diso_state >> 1) & 0x3) != 0x0) {
  887. switch (diso_state) {
  888. case USB_ONLY:
  889. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  890. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  891. #ifdef MTK_DISCRETE_SWITCH
  892. #ifdef MTK_DSC_USE_EINT
  893. mt_eint_unmask(CUST_EINT_VDC_NUM);
  894. #else
  895. set_vdc_auxadc_irq(DISO_IRQ_ENABLE, 1);
  896. #endif
  897. #endif
  898. pDISO_data->diso_state.cur_vusb_state = DISO_ONLINE;
  899. pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE;
  900. pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE;
  901. break;
  902. case DC_ONLY:
  903. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  904. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  905. set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_RISING);
  906. pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE;
  907. pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE;
  908. pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE;
  909. break;
  910. case DC_WITH_USB:
  911. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  912. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  913. set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_FALLING);
  914. pDISO_data->diso_state.cur_vusb_state = DISO_ONLINE;
  915. pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE;
  916. pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE;
  917. break;
  918. case DC_WITH_OTG:
  919. set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0);
  920. set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0);
  921. pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE;
  922. pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE;
  923. pDISO_data->diso_state.cur_otg_state = DISO_ONLINE;
  924. break;
  925. default: /* OTG only also can trigger vcdt IRQ */
  926. pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE;
  927. pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE;
  928. pDISO_data->diso_state.cur_otg_state = DISO_ONLINE;
  929. battery_log(BAT_LOG_CRTI, " switch load vcdt irq triggerd by OTG Boost!\n");
  930. break; /* OTG plugin no need battery sync action */
  931. }
  932. }
  933. if (DISO_ONLINE == pDISO_data->diso_state.cur_vdc_state)
  934. pDISO_data->hv_voltage = VDC_MAX_VOLTAGE;
  935. else
  936. pDISO_data->hv_voltage = VBUS_MAX_VOLTAGE;
  937. #endif
  938. return status;
  939. }
  940. static unsigned int charging_get_error_state(void)
  941. {
  942. return charging_error;
  943. }
  944. static unsigned int charging_set_error_state(void *data)
  945. {
  946. unsigned int status = STATUS_OK;
  947. charging_error = *(unsigned int *) (data);
  948. return status;
  949. }
  950. static unsigned int (*const charging_func[CHARGING_CMD_NUMBER]) (void *data) = {
  951. charging_hw_init,
  952. charging_dump_register,
  953. charging_enable,
  954. charging_set_cv_voltage,
  955. charging_get_current,
  956. charging_set_current,
  957. charging_set_input_current,
  958. charging_get_charging_status,
  959. charging_reset_watch_dog_timer,
  960. charging_set_hv_threshold,
  961. charging_get_hv_status,
  962. charging_get_battery_status,
  963. charging_get_charger_det_status,
  964. charging_get_charger_type,
  965. charging_get_is_pcm_timer_trigger,
  966. charging_set_platform_reset,
  967. charging_get_platform_boot_mode,
  968. charging_set_power_off,
  969. charging_get_power_source,
  970. charging_get_csdac_full_flag,
  971. charging_set_ta_current_pattern,
  972. charging_set_error_state,
  973. charging_diso_init,
  974. charging_get_diso_state
  975. };
  976. /*
  977. * FUNCTION
  978. * Internal_chr_control_handler
  979. *
  980. * DESCRIPTION
  981. * This function is called to set the charger hw
  982. *
  983. * CALLS
  984. *
  985. * PARAMETERS
  986. * None
  987. *
  988. * RETURNS
  989. *
  990. *
  991. * GLOBALS AFFECTED
  992. * None
  993. */
  994. signed int chr_control_interface(CHARGING_CTRL_CMD cmd, void *data)
  995. {
  996. signed int status;
  997. if (cmd < CHARGING_CMD_NUMBER)
  998. status = charging_func[cmd] (data);
  999. else
  1000. return STATUS_UNSUPPORTED;
  1001. return status;
  1002. }