sec_battery_dt.c 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656
  1. /*
  2. * sec_battery_dt.c
  3. * Samsung Mobile Battery Driver
  4. *
  5. * Copyright (C) 2018 Samsung Electronics
  6. *
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include "sec_battery.h"
  13. #include "sec_battery_dt.h"
  14. #if defined(CONFIG_SEC_KUNIT)
  15. #include <kunit/mock.h>
  16. #else
  17. #define __visible_for_testing static
  18. #endif
  19. #ifdef CONFIG_OF
  20. #define PROPERTY_NAME_SIZE 128
  21. int sec_bat_parse_dt_siop(
  22. struct sec_battery_info *battery, struct device_node *np)
  23. {
  24. sec_battery_platform_data_t *pdata = battery->pdata;
  25. int ret = 0, len = 0;
  26. const u32 *p;
  27. ret = of_property_read_u32(np, "battery,siop_icl",
  28. &pdata->siop_icl);
  29. if (ret)
  30. pdata->siop_icl = SIOP_INPUT_LIMIT_CURRENT;
  31. ret = of_property_read_u32(np, "battery,siop_fcc",
  32. &pdata->siop_fcc);
  33. if (ret)
  34. pdata->siop_fcc = SIOP_CHARGING_LIMIT_CURRENT;
  35. ret = of_property_read_u32(np, "battery,siop_hv_12v_icl",
  36. &pdata->siop_hv_12v_icl);
  37. if (ret)
  38. pdata->siop_hv_12v_icl = SIOP_HV_12V_INPUT_LIMIT_CURRENT;
  39. ret = of_property_read_u32(np, "battery,siop_hv_12v_fcc",
  40. &pdata->siop_hv_12v_fcc);
  41. if (ret)
  42. pdata->siop_hv_12v_fcc = SIOP_HV_12V_CHARGING_LIMIT_CURRENT;
  43. ret = of_property_read_u32(np, "battery,siop_hv_icl",
  44. &pdata->siop_hv_icl);
  45. if (ret)
  46. pdata->siop_hv_icl = SIOP_HV_INPUT_LIMIT_CURRENT;
  47. ret = of_property_read_u32(np, "battery,siop_hv_icl_2nd",
  48. &pdata->siop_hv_icl_2nd);
  49. if (ret)
  50. pdata->siop_hv_icl_2nd = SIOP_HV_INPUT_LIMIT_CURRENT;
  51. ret = of_property_read_u32(np, "battery,siop_hv_fcc",
  52. &pdata->siop_hv_fcc);
  53. if (ret)
  54. pdata->siop_hv_fcc = SIOP_HV_CHARGING_LIMIT_CURRENT;
  55. ret = of_property_read_u32(np, "battery,siop_apdo_icl",
  56. &pdata->siop_apdo_icl);
  57. if (ret)
  58. pdata->siop_apdo_icl = SIOP_APDO_INPUT_LIMIT_CURRENT;
  59. ret = of_property_read_u32(np, "battery,siop_apdo_fcc",
  60. &pdata->siop_apdo_fcc);
  61. if (ret)
  62. pdata->siop_apdo_fcc = SIOP_APDO_CHARGING_LIMIT_CURRENT;
  63. ret = of_property_read_u32(np, "battery,siop_wpc_icl",
  64. &pdata->siop_wpc_icl);
  65. if (ret)
  66. pdata->siop_wpc_icl = SIOP_WIRELESS_INPUT_LIMIT_CURRENT;
  67. p = of_get_property(np, "battery,siop_wpc_fcc", &len);
  68. if (!p) {
  69. pr_info("%s : battery,siop_wpc_fcc is Empty\n", __func__);
  70. } else {
  71. len = len / sizeof(u32);
  72. pdata->siop_wpc_fcc =
  73. kzalloc(sizeof(*pdata->siop_wpc_fcc) * len, GFP_KERNEL);
  74. ret = of_property_read_u32_array(np, "battery,siop_wpc_fcc",
  75. pdata->siop_wpc_fcc, len);
  76. pr_info("%s: parse siop_wpc_fcc, ret = %d, len = %d\n", __func__, ret, len);
  77. }
  78. ret = of_property_read_u32(np, "battery,siop_hv_wpc_icl",
  79. &pdata->siop_hv_wpc_icl);
  80. if (ret)
  81. pdata->siop_hv_wpc_icl = SIOP_HV_WIRELESS_INPUT_LIMIT_CURRENT;
  82. ret = of_property_read_u32(np, "battery,rechg_hv_wpc_icl",
  83. &pdata->rechg_hv_wpc_icl);
  84. if (ret)
  85. pdata->rechg_hv_wpc_icl = pdata->siop_hv_wpc_icl;
  86. p = of_get_property(np, "battery,siop_hv_wpc_fcc", &len);
  87. if (!p) {
  88. pr_info("%s : battery,siop_hv_wpc_fcc is Empty\n", __func__);
  89. } else {
  90. len = len / sizeof(u32);
  91. pdata->siop_hv_wpc_fcc =
  92. kzalloc(sizeof(*pdata->siop_hv_wpc_fcc) * len, GFP_KERNEL);
  93. ret = of_property_read_u32_array(np, "battery,siop_hv_wpc_fcc",
  94. pdata->siop_hv_wpc_fcc, len);
  95. pr_info("%s: parse siop_hv_wpc_fcc, ret = %d, len = %d\n", __func__, ret, len);
  96. }
  97. len = of_property_count_u32_elems(np, "battery,siop_scenarios");
  98. if (len > 0) {
  99. int siop_scenarios[SIOP_SCENARIO_NUM_MAX];
  100. pdata->siop_scenarios_num = (len > SIOP_SCENARIO_NUM_MAX) ? SIOP_SCENARIO_NUM_MAX : len;
  101. ret = of_property_read_u32_array(np, "battery,siop_scenarios",
  102. (u32 *)siop_scenarios, pdata->siop_scenarios_num);
  103. ret = of_property_read_u32(np, "battery,siop_curr_type_num",
  104. &pdata->siop_curr_type_num);
  105. if (ret) {
  106. pdata->siop_scenarios_num = 0;
  107. pdata->siop_curr_type_num = 0;
  108. goto parse_siop_next;
  109. }
  110. pdata->siop_curr_type_num =
  111. (pdata->siop_curr_type_num > SIOP_CURR_TYPE_MAX) ? SIOP_CURR_TYPE_MAX : pdata->siop_curr_type_num;
  112. if (pdata->siop_curr_type_num > 0) {
  113. int i, j, siop_level;
  114. char prop_name[PROPERTY_NAME_SIZE];
  115. for (i = 0; i < pdata->siop_scenarios_num; ++i) {
  116. siop_level = siop_scenarios[i];
  117. pdata->siop_table[i].level = siop_level;
  118. snprintf(prop_name, PROPERTY_NAME_SIZE, "battery,siop_icl_%d", siop_level);
  119. ret = of_property_read_u32_array(np, prop_name,
  120. (u32 *)pdata->siop_table[i].icl, pdata->siop_curr_type_num);
  121. snprintf(prop_name, PROPERTY_NAME_SIZE, "battery,siop_fcc_%d", siop_level);
  122. ret = of_property_read_u32_array(np, prop_name,
  123. (u32 *)pdata->siop_table[i].fcc, pdata->siop_curr_type_num);
  124. for (j = 0; j < pdata->siop_curr_type_num; ++j)
  125. pr_info("%s: level=%d, [%d].siop_icl[%d]=%d, [%d].siop_fcc[%d]=%d\n",
  126. __func__, pdata->siop_table[i].level,
  127. i, j, pdata->siop_table[i].icl[j],
  128. i, j, pdata->siop_table[i].fcc[j]);
  129. }
  130. }
  131. }
  132. parse_siop_next:
  133. return ret;
  134. }
  135. int sec_bat_parse_dt_lrp(
  136. struct sec_battery_info *battery, struct device_node *np, int type)
  137. {
  138. sec_battery_platform_data_t *pdata = battery->pdata;
  139. int ret = 0, len = 0;
  140. char prop_name[PROPERTY_NAME_SIZE];
  141. int lrp_table[LRP_PROPS];
  142. snprintf(prop_name, PROPERTY_NAME_SIZE,
  143. "battery,temp_table_%s", LRP_TYPE_STRING[type]);
  144. len = of_property_count_u32_elems(np, prop_name);
  145. if (len != LRP_PROPS)
  146. return -1;
  147. ret = of_property_read_u32_array(np, prop_name,
  148. (u32 *)lrp_table, LRP_PROPS);
  149. if (ret) {
  150. pr_info("%s: failed to parse %s!!, ret = %d\n",
  151. __func__, LRP_TYPE_STRING[type], ret);
  152. return ret;
  153. }
  154. pdata->lrp_temp[type].trig[ST2][LCD_OFF] = lrp_table[0];
  155. pdata->lrp_temp[type].recov[ST2][LCD_OFF] = lrp_table[1];
  156. pdata->lrp_temp[type].trig[ST1][LCD_OFF] = lrp_table[2];
  157. pdata->lrp_temp[type].recov[ST1][LCD_OFF] = lrp_table[3];
  158. pdata->lrp_temp[type].trig[ST2][LCD_ON] = lrp_table[4];
  159. pdata->lrp_temp[type].recov[ST2][LCD_ON] = lrp_table[5];
  160. pdata->lrp_temp[type].trig[ST1][LCD_ON] = lrp_table[6];
  161. pdata->lrp_temp[type].recov[ST1][LCD_ON] = lrp_table[7];
  162. pdata->lrp_curr[type].st_icl[ST1] = lrp_table[8];
  163. pdata->lrp_curr[type].st_fcc[ST1] = lrp_table[9];
  164. pdata->lrp_curr[type].st_icl[ST2] = lrp_table[10];
  165. pdata->lrp_curr[type].st_fcc[ST2] = lrp_table[11];
  166. pr_info("%s: lrp_temp[%s].trig_st1=%d\n",
  167. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST1][LCD_OFF]);
  168. pr_info("%s: lrp_temp[%s].trig_st2=%d\n",
  169. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST2][LCD_OFF]);
  170. pr_info("%s: lrp_temp[%s].recov_st1=%d\n",
  171. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST1][LCD_OFF]);
  172. pr_info("%s: lrp_temp[%s].recov_st2=%d\n",
  173. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST2][LCD_OFF]);
  174. pr_info("%s: lrp_temp[%s].trig_st1_lcdon=%d\n",
  175. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST1][LCD_ON]);
  176. pr_info("%s: lrp_temp[%s].trig_st2_lcdon=%d\n",
  177. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST2][LCD_ON]);
  178. pr_info("%s: lrp_temp[%s].recov_st1_lcdon=%d\n",
  179. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST1][LCD_ON]);
  180. pr_info("%s: lrp_temp[%s].recov_st2_lcdon=%d\n",
  181. __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST2][LCD_ON]);
  182. pr_info("%s: lrp_temp[%s].st1_icl=%d\n",
  183. __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_icl[ST1]);
  184. pr_info("%s: lrp_temp[%s].st1_fcc=%d\n",
  185. __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_fcc[ST1]);
  186. pr_info("%s: lrp_temp[%s].st2_icl=%d\n",
  187. __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_icl[ST2]);
  188. pr_info("%s: lrp_temp[%s].st2_fcc=%d\n",
  189. __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_fcc[ST2]);
  190. return 0;
  191. }
  192. /* ret: table size */
  193. static int sec_bat_parse_adc_table(struct device_node *np, char *name, sec_bat_adc_table_data_t **adc_table, int offset)
  194. {
  195. char adc_str[64], data_str[64];
  196. sec_bat_adc_table_data_t *table;
  197. const u32 *p;
  198. int i, ret, len = 0;
  199. int n_len = strlen(name);
  200. strcpy(adc_str, name);
  201. strcpy(adc_str+n_len, "temp_table_adc");
  202. p = of_get_property(np, adc_str, &len);
  203. if (!p)
  204. return 0;
  205. len = len / sizeof(u32);
  206. table = kcalloc(len, sizeof(sec_bat_adc_table_data_t), GFP_KERNEL);
  207. strcpy(data_str, name);
  208. strcpy(data_str+n_len, "temp_table_data");
  209. for (i = 0; i < len; i++) {
  210. u32 temp;
  211. ret = of_property_read_u32_index(np, adc_str, i, &temp);
  212. table[i].adc = (offset) ? (offset - (int)temp) : ((int)temp);
  213. if (ret)
  214. pr_info("%s : %s is Empty\n", __func__, adc_str);
  215. ret = of_property_read_u32_index(np, data_str, i, &temp);
  216. table[i].data = (int)temp;
  217. if (ret)
  218. pr_info("%s : %s is Empty\n", __func__, data_str);
  219. }
  220. *adc_table = table;
  221. return len;
  222. }
  223. __visible_for_testing void sec_bat_parse_thm_info(struct device_node *np, char *name, struct sec_bat_thm_info *info)
  224. {
  225. char buf[64];
  226. int ret;
  227. int n_len = strlen(name);
  228. strcpy(buf, name);
  229. strcpy(buf+n_len, "thermal_source");
  230. ret = of_property_read_u32(np, buf, &info->source);
  231. if (ret) {
  232. info->source = SEC_BATTERY_THERMAL_SOURCE_NONE;
  233. pr_info("%s : %s is Empty, %d\n", __func__, buf, ret);
  234. }
  235. strcpy(buf+n_len, "temp_offset");
  236. ret = of_property_read_u32(np, buf, &info->offset);
  237. if (ret)
  238. pr_info("%s : %s is Empty\n", __func__, buf);
  239. info->adc_table_size = sec_bat_parse_adc_table(np, name,
  240. &info->adc_table, info->offset);
  241. strcpy(buf+n_len, "temp_check_type");
  242. ret = of_property_read_u32(np, buf, &info->check_type);
  243. if (ret)
  244. pr_info("%s : %s is Empty %d\n", __func__, buf, ret);
  245. if (info->source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
  246. ret = of_property_read_u32(np, "battery,adc_check_count",
  247. &info->check_count);
  248. if (ret)
  249. pr_info("%s : Adc check count is Empty, %d\n", __func__, ret);
  250. }
  251. info->test = 0x7FFF;
  252. }
  253. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  254. static void sec_bat_parse_dc_thm(struct device_node *np, sec_battery_platform_data_t *pdata)
  255. {
  256. int ret = 0, len = 0, i = 0;
  257. const u32 *p;
  258. int len_step = 4;
  259. char str[256] = {0, };
  260. sec_bat_parse_thm_info(np, "battery,dchg_", &pdata->dchg_thm_info);
  261. pdata->dctp_by_cgtp = of_property_read_bool(np, "battery,dctp_by_cgtp");
  262. pdata->dctp_bootmode_en = of_property_read_bool(np, "battery,dctp_bootmode_en");
  263. pdata->lrpts_by_batts = of_property_read_bool(np, "battery,lrpts_by_batts");
  264. /* dchg_high_temp */
  265. p = of_get_property(np, "battery,dchg_high_temp", &len);
  266. if (!p) {
  267. pr_info("%s: failed to parse dchg_high_temp!\n", __func__);
  268. for (i = 0; i < len_step; i++)
  269. pdata->dchg_high_temp[i] = 690;
  270. return;
  271. }
  272. len = len / sizeof(u32);
  273. ret = of_property_read_u32_array(np, "battery,dchg_high_temp",
  274. pdata->dchg_high_temp, len);
  275. if (len != len_step) {
  276. pr_err("%s not match size of dchg_high_temp: %d\n", __func__, len);
  277. for (i = 1; i < len_step; i++)
  278. pdata->dchg_high_temp[i] = pdata->dchg_high_temp[0];
  279. }
  280. /* dchg_high_temp_recovery */
  281. p = of_get_property(np, "battery,dchg_high_temp_recovery", &len);
  282. if (!p) {
  283. pr_info("%s: failed to parse dchg_high_temp_recovery!\n", __func__);
  284. for (i = 0; i < len_step; i++)
  285. pdata->dchg_high_temp_recovery[i] = 630;
  286. }
  287. len = len / sizeof(u32);
  288. ret = of_property_read_u32_array(np, "battery,dchg_high_temp_recovery",
  289. pdata->dchg_high_temp_recovery, len);
  290. if (len != len_step) {
  291. pr_err("%s not match size of dchg_high_temp_recovery: %d\n", __func__, len);
  292. for (i = 1; i < len_step; i++)
  293. pdata->dchg_high_temp_recovery[i] = pdata->dchg_high_temp_recovery[0];
  294. }
  295. /* dchg_high_batt_temp */
  296. p = of_get_property(np, "battery,dchg_high_batt_temp", &len);
  297. if (!p) {
  298. pr_info("%s: failed to parse dchg_high_batt_temp!\n", __func__);
  299. for (i = 0; i < len_step; i++)
  300. pdata->dchg_high_batt_temp[i] = 400;
  301. }
  302. len = len / sizeof(u32);
  303. ret = of_property_read_u32_array(np, "battery,dchg_high_batt_temp",
  304. pdata->dchg_high_batt_temp, len);
  305. if (len != len_step) {
  306. pr_err("%s not match size of dchg_high_batt_temp: %d\n", __func__, len);
  307. for (i = 1; i < len_step; i++)
  308. pdata->dchg_high_batt_temp[i] = pdata->dchg_high_batt_temp[0];
  309. }
  310. /* dchg_high_batt_temp_recovery */
  311. p = of_get_property(np, "battery,dchg_high_batt_temp_recovery", &len);
  312. if (!p) {
  313. pr_info("%s: failed to parse dchg_high_batt_temp_recovery!\n", __func__);
  314. for (i = 0; i < len_step; i++)
  315. pdata->dchg_high_batt_temp_recovery[i] = 380;
  316. }
  317. len = len / sizeof(u32);
  318. ret = of_property_read_u32_array(np, "battery,dchg_high_batt_temp_recovery",
  319. pdata->dchg_high_batt_temp_recovery, len);
  320. if (len != len_step) {
  321. pr_err("%s not match size of dchg_high_batt_temp_recovery: %d\n", __func__, len);
  322. for (i = 1; i < len_step; i++)
  323. pdata->dchg_high_batt_temp_recovery[i] = pdata->dchg_high_batt_temp_recovery[0];
  324. }
  325. sprintf(str, "%s: dchg_htemp: ", __func__);
  326. for (i = 0; i < len_step; i++)
  327. sprintf(str + strlen(str), "%d ", pdata->dchg_high_temp[i]);
  328. sprintf(str + strlen(str), ",dchg_htemp_rec: ");
  329. for (i = 0; i < len_step; i++)
  330. sprintf(str + strlen(str), "%d ", pdata->dchg_high_temp_recovery[i]);
  331. sprintf(str + strlen(str), ",dchg_batt_htemp: ");
  332. for (i = 0; i < len_step; i++)
  333. sprintf(str + strlen(str), "%d ", pdata->dchg_high_batt_temp[i]);
  334. sprintf(str + strlen(str), ",dchg_batt_htemp_rec: ");
  335. for (i = 0; i < len_step; i++)
  336. sprintf(str + strlen(str), "%d ", pdata->dchg_high_batt_temp_recovery[i]);
  337. sprintf(str + strlen(str), "\n");
  338. pr_info("%s", str);
  339. return;
  340. }
  341. #else
  342. static void sec_bat_parse_dc_thm(struct device_node *np, sec_battery_platform_data_t *pdata)
  343. {
  344. pr_info("%s: direct charging is not set\n", __func__);
  345. }
  346. #endif
  347. static void sec_bat_parse_health_condition(struct device_node *np, sec_battery_platform_data_t *pdata)
  348. {
  349. int ret = 0, len = 0;
  350. unsigned int i = 0;
  351. const u32 *p = of_get_property(np, "battery,health_condition_cycle", &len);
  352. len /= sizeof(u32);
  353. if (!p || len != BATTERY_HEALTH_MAX) {
  354. pdata->health_condition = NULL;
  355. pr_err("%s there is not health_condition, len(%d)\n", __func__, len);
  356. return;
  357. }
  358. pdata->health_condition = kzalloc(len*sizeof(battery_health_condition), GFP_KERNEL);
  359. for (i = 0; i < len; i++) {
  360. ret = of_property_read_u32_index(np, "battery,health_condition_cycle",
  361. i, &(pdata->health_condition[i].cycle));
  362. if (ret)
  363. break;
  364. ret = of_property_read_u32_index(np, "battery,health_condition_asoc",
  365. i, &(pdata->health_condition[i].asoc));
  366. if (ret)
  367. break;
  368. pr_err("%s: [BATTERY_HEALTH] %d: Cycle(~ %d), ASoC(~ %d)\n",
  369. __func__, i, pdata->health_condition[i].cycle, pdata->health_condition[i].asoc);
  370. }
  371. if (ret) {
  372. pr_err("%s failed to read battery->pdata->health_condition: %d\n", __func__, ret);
  373. kfree(pdata->health_condition);
  374. pdata->health_condition = NULL;
  375. }
  376. }
  377. static int sec_bat_parse_age_data_by_offset(struct device_node *np, sec_battery_platform_data_t *pdata)
  378. {
  379. int ret = 0, len = 0;
  380. u32 temp = 0, i = 0, n_len = 0;
  381. char *age_data_prefix = "battery,age_data_";
  382. char cycle_str[64];
  383. char full_condition_soc_str[64];
  384. char chg_float_voltage_offset_str[64];
  385. char full_condition_vcell_offset_str[64];
  386. char recharge_condition_vcell_offset_str[64];
  387. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  388. char max_charging_current_offset_str[64];
  389. #endif
  390. n_len = strlen(age_data_prefix);
  391. strcpy(cycle_str, age_data_prefix);
  392. strcpy(cycle_str + n_len, "cycle");
  393. strcpy(full_condition_soc_str, age_data_prefix);
  394. strcpy(full_condition_soc_str + n_len, "full_condition_soc");
  395. strcpy(chg_float_voltage_offset_str, age_data_prefix);
  396. strcpy(chg_float_voltage_offset_str + n_len, "chg_float_voltage_offset");
  397. strcpy(full_condition_vcell_offset_str, age_data_prefix);
  398. strcpy(full_condition_vcell_offset_str + n_len, "full_condition_vcell_offset");
  399. strcpy(recharge_condition_vcell_offset_str, age_data_prefix);
  400. strcpy(recharge_condition_vcell_offset_str + n_len, "recharge_condition_vcell_offset");
  401. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  402. strcpy(max_charging_current_offset_str, age_data_prefix);
  403. strcpy(max_charging_current_offset_str + n_len, "max_charging_current_offset");
  404. #endif
  405. len = of_property_count_u32_elems(np, cycle_str);
  406. if (len > 0) {
  407. pdata->num_age_step = len;
  408. len = of_property_count_u32_elems(np, full_condition_soc_str);
  409. if (len != pdata->num_age_step) {
  410. pr_info("%s : %s has %d elements - expected %d\n",
  411. __func__, full_condition_soc_str, len, pdata->num_age_step);
  412. return -EINVAL;
  413. }
  414. len = of_property_count_u32_elems(np, chg_float_voltage_offset_str);
  415. if (len != pdata->num_age_step) {
  416. pr_info("%s : %s has %d elements - expected %d\n",
  417. __func__, chg_float_voltage_offset_str, len, pdata->num_age_step);
  418. return -EINVAL;
  419. }
  420. len = of_property_count_u32_elems(np, full_condition_vcell_offset_str);
  421. if (len != pdata->num_age_step) {
  422. pr_info("%s : %s has %d elements - expected %d\n",
  423. __func__, full_condition_vcell_offset_str, len, pdata->num_age_step);
  424. return -EINVAL;
  425. }
  426. len = of_property_count_u32_elems(np, recharge_condition_vcell_offset_str);
  427. if (len != pdata->num_age_step) {
  428. pr_info("%s : %s has %d elements - expected %d\n",
  429. __func__, recharge_condition_vcell_offset_str, len, pdata->num_age_step);
  430. return -EINVAL;
  431. }
  432. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  433. len = of_property_count_u32_elems(np, max_charging_current_offset_str);
  434. if (len != pdata->num_age_step) {
  435. pr_info("%s : %s has %d elements - expected %d\n",
  436. __func__, max_charging_current_offset_str, len, pdata->num_age_step);
  437. return -EINVAL;
  438. }
  439. #endif
  440. } else {
  441. pr_info("%s : Error in Calculating Age Data Table Size - %d\n", __func__, len);
  442. return -EINVAL;
  443. }
  444. pdata->age_data = kzalloc(len * sizeof(sec_age_data_t), GFP_KERNEL);
  445. pr_info("%s : Read Age Data Using Offsets - Table Size %d\n", __func__, len);
  446. for (i = 0; i < len; i++) {
  447. ret = of_property_read_u32_index(np, cycle_str, i, &temp);
  448. if (ret) {
  449. pr_info("%s : %s is Empty\n", __func__, cycle_str);
  450. break;
  451. }
  452. pdata->age_data[i].cycle = temp;
  453. ret = of_property_read_u32_index(np, full_condition_soc_str, i, &temp);
  454. if (ret) {
  455. pr_info("%s : %s is Empty\n", __func__, full_condition_soc_str);
  456. break;
  457. }
  458. pdata->age_data[i].full_condition_soc = temp;
  459. ret = of_property_read_u32_index(np, chg_float_voltage_offset_str, i, &temp);
  460. if (ret) {
  461. pr_info("%s : %s is Empty\n", __func__, chg_float_voltage_offset_str);
  462. break;
  463. }
  464. pdata->age_data[i].float_voltage = pdata->chg_float_voltage - temp;
  465. ret = of_property_read_u32_index(np, full_condition_vcell_offset_str, i, &temp);
  466. if (ret) {
  467. pr_info("%s : %s is Empty\n", __func__, full_condition_vcell_offset_str);
  468. break;
  469. }
  470. pdata->age_data[i].full_condition_vcell = pdata->full_condition_vcell - temp;
  471. ret = of_property_read_u32_index(np, recharge_condition_vcell_offset_str, i, &temp);
  472. if (ret) {
  473. pr_info("%s : %s is Empty\n", __func__, recharge_condition_vcell_offset_str);
  474. break;
  475. }
  476. pdata->age_data[i].recharge_condition_vcell = pdata->recharge_condition_vcell - temp;
  477. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  478. ret = of_property_read_u32_index(np, max_charging_current_offset_str, i, &temp);
  479. if (ret) {
  480. pr_info("%s : %s is Empty\n", __func__, max_charging_current_offset_str);
  481. break;
  482. }
  483. pdata->age_data[i].max_charging_current = pdata->max_charging_current - temp;
  484. #endif
  485. }
  486. return ret;
  487. }
  488. static void sec_bat_parse_age_data(struct device_node *np, sec_battery_platform_data_t *pdata)
  489. {
  490. int ret = 0, len = 0;
  491. unsigned int i = 0;
  492. const u32 *p;
  493. char str[256] = {0, };
  494. bool age_data_by_offset = of_property_read_bool(np, "battery,age_data_by_offset");
  495. pr_info("%s: age_data_by_offset is %s", __func__, (age_data_by_offset ? "true" : "false"));
  496. if (age_data_by_offset) {
  497. ret = sec_bat_parse_age_data_by_offset(np, pdata);
  498. } else {
  499. p = of_get_property(np, "battery,age_data", &len);
  500. if (p) {
  501. pdata->num_age_step = len / sizeof(sec_age_data_t);
  502. pdata->age_data = kzalloc(len, GFP_KERNEL);
  503. ret = of_property_read_u32_array(np, "battery,age_data",
  504. (u32 *)pdata->age_data, len/sizeof(u32));
  505. }
  506. }
  507. if (ret) {
  508. pr_err("%s failed to read battery->pdata->age_data: %d\n", __func__, ret);
  509. kfree(pdata->age_data);
  510. pdata->age_data = NULL;
  511. pdata->num_age_step = 0;
  512. } else {
  513. pr_err("%s num_age_step : %d\n", __func__, pdata->num_age_step);
  514. for (i = 0; i < pdata->num_age_step; ++i) {
  515. memset(str, 0x0, sizeof(str));
  516. sprintf(str + strlen(str), "[%d/%d]cycle:%d, float:%d, full_v:%d, recharge_v:%d, soc:%d",
  517. i, pdata->num_age_step-1,
  518. pdata->age_data[i].cycle,
  519. pdata->age_data[i].float_voltage,
  520. pdata->age_data[i].full_condition_vcell,
  521. pdata->age_data[i].recharge_condition_vcell,
  522. pdata->age_data[i].full_condition_soc);
  523. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  524. sprintf(str + strlen(str), ", max_c:%d",
  525. pdata->age_data[i].max_charging_current);
  526. #endif
  527. pr_err("%s: %s", __func__, str);
  528. }
  529. }
  530. }
  531. int sec_bat_parse_dt(struct device *dev,
  532. struct sec_battery_info *battery)
  533. {
  534. struct device_node *np;
  535. sec_battery_platform_data_t *pdata = battery->pdata;
  536. int ret = 0, len = 0;
  537. unsigned int i = 0;
  538. const u32 *p;
  539. u32 temp = 0;
  540. np = of_find_node_by_name(NULL, "cable-info");
  541. if (!np) {
  542. pr_err ("%s : np NULL\n", __func__);
  543. } else {
  544. struct device_node *child;
  545. u32 input_current = 0, charging_current = 0;
  546. ret = of_property_read_u32(np, "default_input_current", &input_current);
  547. ret = of_property_read_u32(np, "default_charging_current", &charging_current);
  548. ret = of_property_read_u32(np, "full_check_current_1st", &pdata->full_check_current_1st);
  549. ret = of_property_read_u32(np, "full_check_current_2nd", &pdata->full_check_current_2nd);
  550. if (!pdata->full_check_current_2nd)
  551. pdata->full_check_current_2nd = pdata->full_check_current_1st;
  552. pdata->default_input_current = input_current;
  553. pdata->default_charging_current = charging_current;
  554. for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) {
  555. pdata->charging_current[i].input_current_limit = (unsigned int)input_current;
  556. pdata->charging_current[i].fast_charging_current = (unsigned int)charging_current;
  557. }
  558. for_each_child_of_node(np, child) {
  559. ret = of_property_read_u32(child, "input_current", &input_current);
  560. ret = of_property_read_u32(child, "charging_current", &charging_current);
  561. p = of_get_property(child, "cable_number", &len);
  562. if (!p)
  563. return 1;
  564. len = len / sizeof(u32);
  565. for (i = 0; i <= len; i++) {
  566. ret = of_property_read_u32_index(child, "cable_number", i, &temp);
  567. pdata->charging_current[temp].input_current_limit = (unsigned int)input_current;
  568. pdata->charging_current[temp].fast_charging_current = (unsigned int)charging_current;
  569. }
  570. }
  571. }
  572. for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) {
  573. pr_info("%s : CABLE_NUM(%d) INPUT(%d) CHARGING(%d)\n",
  574. __func__, i,
  575. pdata->charging_current[i].input_current_limit,
  576. pdata->charging_current[i].fast_charging_current);
  577. }
  578. pr_info("%s : TOPOFF_1ST(%d), TOPOFF_2ND(%d)\n",
  579. __func__, pdata->full_check_current_1st, pdata->full_check_current_2nd);
  580. pdata->default_usb_input_current = pdata->charging_current[SEC_BATTERY_CABLE_USB].input_current_limit;
  581. pdata->default_usb_charging_current = pdata->charging_current[SEC_BATTERY_CABLE_USB].fast_charging_current;
  582. pdata->default_wc20_input_current = pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS_20].input_current_limit;
  583. pdata->default_wc20_charging_current = pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS_20].fast_charging_current;
  584. #ifdef CONFIG_SEC_FACTORY
  585. pdata->default_charging_current = 1500;
  586. pdata->charging_current[SEC_BATTERY_CABLE_TA].fast_charging_current = 1500;
  587. #endif
  588. np = of_find_node_by_name(NULL, "battery");
  589. if (!np) {
  590. pr_info("%s: np NULL\n", __func__);
  591. return 1;
  592. }
  593. ret = of_property_read_u32(np, "battery,battery_full_capacity",
  594. &pdata->battery_full_capacity);
  595. if (ret)
  596. pr_info("%s : battery_full_capacity is Empty\n", __func__);
  597. pdata->soc_by_repcap_en = of_property_read_bool(np, "battery,soc_by_repcap_en");
  598. #ifdef CONFIG_SEC_FACTORY
  599. ret = of_property_read_u32(np, "battery,factory_chg_limit_max",
  600. &pdata->store_mode_charging_max);
  601. if (ret) {
  602. pr_info("%s :factory_chg_limit_max is Empty\n", __func__);
  603. pdata->store_mode_charging_max = 80;
  604. }
  605. ret = of_property_read_u32(np, "battery,factory_chg_limit_min",
  606. &pdata->store_mode_charging_min);
  607. if (ret) {
  608. pr_info("%s :factory_chg_limit_min is Empty\n", __func__);
  609. pdata->store_mode_charging_min = 70;
  610. }
  611. #else
  612. ret = of_property_read_u32(np, "battery,store_mode_charging_max",
  613. &pdata->store_mode_charging_max);
  614. if (ret) {
  615. pr_info("%s :factory_chg_limit_max is Empty\n", __func__);
  616. pdata->store_mode_charging_max = 70;
  617. }
  618. ret = of_property_read_u32(np, "battery,store_mode_charging_min",
  619. &pdata->store_mode_charging_min);
  620. if (ret) {
  621. pr_info("%s :factory_chg_limit_min is Empty\n", __func__);
  622. pdata->store_mode_charging_min = 60;
  623. }
  624. /* VZW's prepaid devices has "VPP" as sales_code, not "VZW" */
  625. if (sales_code_is("VZW") || sales_code_is("VPP")) {
  626. pr_info("%s: Sales is VZW or VPP\n", __func__);
  627. pdata->store_mode_charging_max = 35;
  628. pdata->store_mode_charging_min = 30;
  629. }
  630. #endif /*CONFIG_SEC_FACTORY */
  631. else {
  632. pr_info("%s : battery_full_capacity : %d\n", __func__, pdata->battery_full_capacity);
  633. pdata->cisd_cap_high_thr = pdata->battery_full_capacity + 1000; /* battery_full_capacity + 1000 */
  634. pdata->cisd_cap_low_thr = pdata->battery_full_capacity + 500; /* battery_full_capacity + 500 */
  635. pdata->cisd_cap_limit = (pdata->battery_full_capacity * 11) / 10; /* battery_full_capacity + 10% */
  636. }
  637. ret = of_property_read_u32(np, "battery,cisd_max_voltage_thr",
  638. &pdata->max_voltage_thr);
  639. if (ret) {
  640. pr_info("%s : cisd_max_voltage_thr is Empty\n", __func__);
  641. pdata->max_voltage_thr = 4400;
  642. }
  643. ret = of_property_read_u32(np, "battery,cisd_alg_index",
  644. &pdata->cisd_alg_index);
  645. if (ret) {
  646. pr_info("%s : cisd_alg_index is Empty. Defalut set to six\n", __func__);
  647. pdata->cisd_alg_index = 6;
  648. } else {
  649. pr_info("%s : set cisd_alg_index : %d\n", __func__, pdata->cisd_alg_index);
  650. }
  651. ret = of_property_read_u32(np,
  652. "battery,expired_time", &temp);
  653. if (ret) {
  654. pr_info("expired time is empty\n");
  655. pdata->expired_time = 3 * 60 * 60;
  656. } else {
  657. pdata->expired_time = (unsigned int) temp;
  658. }
  659. pdata->expired_time *= 1000;
  660. battery->expired_time = pdata->expired_time;
  661. ret = of_property_read_u32(np,
  662. "battery,recharging_expired_time", &temp);
  663. if (ret) {
  664. pr_info("expired time is empty\n");
  665. pdata->recharging_expired_time = 90 * 60;
  666. } else {
  667. pdata->recharging_expired_time = (unsigned int) temp;
  668. }
  669. pdata->recharging_expired_time *= 1000;
  670. ret = of_property_read_u32(np,
  671. "battery,standard_curr", &pdata->standard_curr);
  672. if (ret) {
  673. pr_info("standard_curr is empty\n");
  674. pdata->standard_curr = 2150;
  675. }
  676. ret = of_property_read_string(np,
  677. "battery,vendor", (char const **)&pdata->vendor);
  678. if (ret)
  679. pr_info("%s: Vendor is Empty\n", __func__);
  680. ret = of_property_read_string(np,
  681. "battery,charger_name", (char const **)&pdata->charger_name);
  682. if (ret)
  683. pr_info("%s: Charger name is Empty\n", __func__);
  684. ret = of_property_read_string(np,
  685. "battery,otg_name", (char const **)&pdata->otg_name);
  686. if (ret)
  687. pr_info("%s: otg_name is Empty\n", __func__);
  688. ret = of_property_read_string(np,
  689. "battery,fuelgauge_name", (char const **)&pdata->fuelgauge_name);
  690. if (ret)
  691. pr_info("%s: Fuelgauge name is Empty\n", __func__);
  692. ret = of_property_read_string(np,
  693. "battery,wireless_charger_name", (char const **)&pdata->wireless_charger_name);
  694. if (ret)
  695. pr_info("%s: Wireless charger name is Empty\n", __func__);
  696. ret = of_property_read_u32(np, "battery,inbat_ocv_type",
  697. &pdata->inbat_ocv_type);
  698. if (ret) {
  699. pr_info("%s : inbat_ocv_type is Empty\n", __func__);
  700. pdata->inbat_ocv_type = SEC_BATTERY_OCV_NONE;
  701. }
  702. ret = of_property_read_string(np,
  703. "battery,fgsrc_switch_name", (char const **)&pdata->fgsrc_switch_name);
  704. if (ret) {
  705. pdata->support_fgsrc_change = false;
  706. pr_info("%s: fgsrc_switch_name is Empty\n", __func__);
  707. } else {
  708. pdata->support_fgsrc_change = true;
  709. pdata->inbat_ocv_type = SEC_BATTERY_OCV_FG_SRC_CHANGE;
  710. }
  711. pdata->dynamic_cv_factor = of_property_read_bool(np,
  712. "battery,dynamic_cv_factor");
  713. pdata->slowcharging_usb_bootcomplete = of_property_read_bool(np,
  714. "battery,slowcharging_usb_bootcomplete");
  715. ret = of_property_read_string(np,
  716. "battery,chip_vendor", (char const **)&pdata->chip_vendor);
  717. if (ret)
  718. pr_info("%s: Chip vendor is Empty\n", __func__);
  719. ret = of_property_read_u32(np, "battery,technology",
  720. &pdata->technology);
  721. if (ret)
  722. pr_info("%s : technology is Empty\n", __func__);
  723. ret = of_property_read_u32(np,
  724. "battery,wireless_cc_cv", &pdata->wireless_cc_cv);
  725. pdata->p2p_cv_headroom = of_property_read_bool(np,
  726. "battery,p2p_cv_headroom");
  727. pdata->fake_capacity = of_property_read_bool(np,
  728. "battery,fake_capacity");
  729. pdata->bc12_ifcon_wa = of_property_read_bool(np,
  730. "battery,bc12_ifcon_wa");
  731. ret = of_property_read_u32(np, "battery,power_value",
  732. &pdata->power_value);
  733. if (ret) {
  734. pdata->power_value = 6000;
  735. pr_info("%s : power_value is Empty\n", __func__);
  736. }
  737. pdata->en_auto_shipmode_temp_ctrl = of_property_read_bool(np,
  738. "battery,en_auto_shipmode_temp_ctrl");
  739. pdata->boosting_voltage_aicl = of_property_read_bool(np,
  740. "battery,boosting_voltage_aicl");
  741. battery->ta_alert_wa = of_property_read_bool(np, "battery,ta_alert_wa");
  742. #if !defined(CONFIG_SEC_FACTORY)
  743. pdata->mass_with_usb_thm = of_property_read_bool(np,
  744. "battery,mass_with_usb_thm");
  745. pdata->usb_protection = of_property_read_bool(np,
  746. "battery,usb_protection");
  747. #endif
  748. p = of_get_property(np, "battery,polling_time", &len);
  749. if (!p)
  750. return 1;
  751. len = len / sizeof(u32);
  752. pdata->polling_time = kzalloc(sizeof(*pdata->polling_time) * len, GFP_KERNEL);
  753. ret = of_property_read_u32_array(np, "battery,polling_time",
  754. pdata->polling_time, len);
  755. if (ret)
  756. pr_info("%s : battery,polling_time is Empty\n", __func__);
  757. ret = of_property_read_u32(np, "battery,temp_check_count",
  758. &pdata->temp_check_count);
  759. if (ret)
  760. pr_info("%s : Temp check count is Empty\n", __func__);
  761. sec_bat_parse_thm_info(np, "battery,", &pdata->bat_thm_info);
  762. pdata->bat_thm_info.channel = SEC_BAT_ADC_CHANNEL_TEMP;
  763. sec_bat_parse_thm_info(np, "battery,usb_", &pdata->usb_thm_info);
  764. pdata->usb_thm_info.channel = SEC_BAT_ADC_CHANNEL_USB_TEMP;
  765. sec_bat_parse_thm_info(np, "battery,chg_", &pdata->chg_thm_info);
  766. pdata->chg_thm_info.channel = SEC_BAT_ADC_CHANNEL_CHG_TEMP;
  767. sec_bat_parse_thm_info(np, "battery,wpc_", &pdata->wpc_thm_info);
  768. pdata->wpc_thm_info.channel = SEC_BAT_ADC_CHANNEL_WPC_TEMP;
  769. sec_bat_parse_thm_info(np, "battery,sub_bat_", &pdata->sub_bat_thm_info);
  770. pdata->sub_bat_thm_info.channel = SEC_BAT_ADC_CHANNEL_SUB_BAT_TEMP;
  771. sec_bat_parse_thm_info(np, "battery,blkt_", &pdata->blk_thm_info);
  772. pdata->blk_thm_info.channel = SEC_BAT_ADC_CHANNEL_BLKT_TEMP;
  773. ret = of_property_read_u32(np, "battery,adc_read_type",
  774. &pdata->adc_read_type);
  775. if (ret ||
  776. (pdata->adc_read_type != SEC_BATTERY_ADC_PROCESSED &&
  777. pdata->adc_read_type != SEC_BATTERY_ADC_RAW)) {
  778. pdata->adc_read_type = SEC_BATTERY_ADC_PROCESSED;
  779. pr_info("%s : adc_read_type is default (processed)\n", __func__);
  780. } else {
  781. pr_info("%s : adc_read_type is %s\n",
  782. __func__, (pdata->adc_read_type ? "raw" : "proc."));
  783. }
  784. /* parse dc thm info */
  785. sec_bat_parse_dc_thm(np, pdata);
  786. ret = of_property_read_u32(np, "battery,d2d_check_type",
  787. &pdata->d2d_check_type);
  788. if (ret) {
  789. pdata->d2d_check_type = SB_D2D_NONE;
  790. pr_info("%s : d2d_check_type is Empty\n", __func__);
  791. }
  792. pdata->support_vpdo = of_property_read_bool(np,
  793. "battery,support_vpdo");
  794. ret = of_property_read_u32(np, "battery,lrp_temp_check_type",
  795. &pdata->lrp_temp_check_type);
  796. if (ret)
  797. pr_info("%s : lrp_temp_check_type is Empty\n", __func__);
  798. if (pdata->lrp_temp_check_type) {
  799. for (i = 0; i < LRP_MAX; i++) {
  800. if (sec_bat_parse_dt_lrp(battery, np, i) < 0) {
  801. pdata->lrp_temp[i].trig[ST1][LCD_OFF] = 375;
  802. pdata->lrp_temp[i].trig[ST2][LCD_OFF] = 375;
  803. pdata->lrp_temp[i].recov[ST1][LCD_OFF] = 365;
  804. pdata->lrp_temp[i].recov[ST2][LCD_OFF] = 365;
  805. pdata->lrp_temp[i].trig[ST1][LCD_ON] = 375;
  806. pdata->lrp_temp[i].trig[ST2][LCD_ON] = 375;
  807. pdata->lrp_temp[i].recov[ST1][LCD_ON] = 365;
  808. pdata->lrp_temp[i].recov[ST2][LCD_ON] = 365;
  809. pdata->lrp_curr[i].st_icl[0] = pdata->default_input_current;
  810. pdata->lrp_curr[i].st_fcc[0] = pdata->default_charging_current;
  811. pdata->lrp_curr[i].st_icl[1] = pdata->default_input_current;
  812. pdata->lrp_curr[i].st_fcc[1] = pdata->default_charging_current;
  813. }
  814. }
  815. pdata->sc_LRP_25W = of_property_read_bool(np,
  816. "battery,sc_LRP_25W");
  817. }
  818. /* mix temp v2 */
  819. pdata->enable_mix_v2 = of_property_read_bool(np, "battery,enable_mix_v2");
  820. ret = of_property_read_u32(np, "battery,mix_v2_lrp_recov", &pdata->mix_v2_lrp_recov);
  821. if (ret) {
  822. pr_info("%s : mix_v2_lrp_recov is Empty\n", __func__);
  823. pdata->mix_v2_lrp_recov = 0;
  824. }
  825. ret = of_property_read_u32(np, "battery,mix_v2_lrp_cond", &pdata->mix_v2_lrp_cond);
  826. if (ret) {
  827. pr_info("%s : mix_v2_lrp_cond is Empty\n", __func__);
  828. pdata->mix_v2_lrp_cond = 0;
  829. }
  830. ret = of_property_read_u32(np, "battery,mix_v2_bat_cond", &pdata->mix_v2_bat_cond);
  831. if (ret) {
  832. pr_info("%s : mix_v2_bat_cond is Empty\n", __func__);
  833. pdata->mix_v2_bat_cond = 0;
  834. }
  835. ret = of_property_read_u32(np, "battery,mix_v2_chg_cond", &pdata->mix_v2_chg_cond);
  836. if (ret) {
  837. pr_info("%s : mix_v2_chg_cond is Empty\n", __func__);
  838. pdata->mix_v2_chg_cond = 0;
  839. }
  840. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  841. ret = of_property_read_u32(np, "battery,mix_v2_dchg_cond", &pdata->mix_v2_dchg_cond);
  842. if (ret) {
  843. pr_info("%s : mix_v2_dchg_cond is Empty\n", __func__);
  844. pdata->mix_v2_dchg_cond = 0;
  845. }
  846. #else
  847. pr_info("%s : mix_v2_dchg_cond is not supported\n", __func__);
  848. pdata->mix_v2_dchg_cond = 0;
  849. #endif
  850. /* mix temp v2 */
  851. if (pdata->chg_thm_info.check_type) {
  852. ret = of_property_read_u32(np, "battery,chg_12v_high_temp",
  853. &temp);
  854. pdata->chg_12v_high_temp = (int)temp;
  855. if (ret)
  856. pr_info("%s : chg_12v_high_temp is Empty\n", __func__);
  857. ret = of_property_read_u32(np, "battery,chg_high_temp",
  858. &temp);
  859. pdata->chg_high_temp = (int)temp;
  860. if (ret)
  861. pr_info("%s : chg_high_temp is Empty\n", __func__);
  862. ret = of_property_read_u32(np, "battery,chg_high_temp_recovery",
  863. &temp);
  864. pdata->chg_high_temp_recovery = (int)temp;
  865. if (ret)
  866. pr_info("%s : chg_temp_recovery is Empty\n", __func__);
  867. ret = of_property_read_u32(np, "battery,chg_charging_limit_current",
  868. &pdata->chg_charging_limit_current);
  869. if (ret)
  870. pr_info("%s : chg_charging_limit_current is Empty\n", __func__);
  871. ret = of_property_read_u32(np, "battery,chg_input_limit_current",
  872. &pdata->chg_input_limit_current);
  873. if (ret)
  874. pr_info("%s : chg_input_limit_current is Empty\n", __func__);
  875. ret = of_property_read_u32(np, "battery,dchg_charging_limit_current",
  876. &pdata->dchg_charging_limit_current);
  877. if (ret) {
  878. pr_info("%s : dchg_charging_limit_current is Empty\n", __func__);
  879. pdata->dchg_charging_limit_current = pdata->chg_charging_limit_current;
  880. }
  881. ret = of_property_read_u32(np, "battery,dchg_input_limit_current",
  882. &pdata->dchg_input_limit_current);
  883. if (ret) {
  884. pr_info("%s : dchg_input_limit_current is Empty\n", __func__);
  885. pdata->dchg_input_limit_current = pdata->chg_input_limit_current;
  886. }
  887. ret = of_property_read_u32(np, "battery,mix_high_temp",
  888. &temp);
  889. pdata->mix_high_temp = (int)temp;
  890. if (ret)
  891. pr_info("%s : mix_high_temp is Empty\n", __func__);
  892. ret = of_property_read_u32(np, "battery,mix_high_chg_temp",
  893. &temp);
  894. pdata->mix_high_chg_temp = (int)temp;
  895. if (ret)
  896. pr_info("%s : mix_high_chg_temp is Empty\n", __func__);
  897. ret = of_property_read_u32(np, "battery,mix_high_temp_recovery",
  898. &temp);
  899. pdata->mix_high_temp_recovery = (int)temp;
  900. if (ret)
  901. pr_info("%s : mix_high_temp_recovery is Empty\n", __func__);
  902. }
  903. if (pdata->wpc_thm_info.check_type) {
  904. ret = of_property_read_u32(np, "battery,sub_temp_control_source",
  905. &pdata->sub_temp_control_source);
  906. if (ret) {
  907. pr_info("%s : sub_temp_control_source is Empty\n", __func__);
  908. pdata->sub_temp_control_source = TEMP_CONTROL_SOURCE_BAT_THM;
  909. }
  910. ret = of_property_read_u32(np, "battery,wpc_temp_control_source",
  911. &pdata->wpc_temp_control_source);
  912. if (ret) {
  913. pr_info("%s : wpc_temp_control_source is Empty\n", __func__);
  914. pdata->wpc_temp_control_source = TEMP_CONTROL_SOURCE_CHG_THM;
  915. }
  916. ret = of_property_read_u32(np, "battery,wpc_temp_lcd_on_control_source",
  917. &pdata->wpc_temp_lcd_on_control_source);
  918. if (ret) {
  919. pr_info("%s : wpc_temp_lcd_on_control_source is Empty\n", __func__);
  920. pdata->wpc_temp_lcd_on_control_source = TEMP_CONTROL_SOURCE_CHG_THM;
  921. }
  922. ret = of_property_read_u32(np, "battery,wpc_high_temp",
  923. &pdata->wpc_high_temp);
  924. if (ret)
  925. pr_info("%s : wpc_high_temp is Empty\n", __func__);
  926. ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery",
  927. &pdata->wpc_high_temp_recovery);
  928. if (ret)
  929. pr_info("%s : wpc_high_temp_recovery is Empty\n", __func__);
  930. ret = of_property_read_u32(np, "battery,wpc_high_temp_12w",
  931. &pdata->wpc_high_temp_12w);
  932. if (ret) {
  933. pr_info("%s : wpc_high_temp_12w is Empty\n", __func__);
  934. pdata->wpc_high_temp_12w = pdata->wpc_high_temp;
  935. }
  936. ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery_12w",
  937. &pdata->wpc_high_temp_recovery_12w);
  938. if (ret) {
  939. pr_info("%s : wpc_high_temp_recovery_12w is Empty\n", __func__);
  940. pdata->wpc_high_temp_recovery_12w = pdata->wpc_high_temp_recovery;
  941. }
  942. ret = of_property_read_u32(np, "battery,wpc_high_temp_15w",
  943. &pdata->wpc_high_temp_15w);
  944. if (ret) {
  945. pr_info("%s : wpc_high_temp_15w is Empty\n", __func__);
  946. pdata->wpc_high_temp_15w = pdata->wpc_high_temp;
  947. }
  948. ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery_15w",
  949. &pdata->wpc_high_temp_recovery_15w);
  950. if (ret) {
  951. pr_info("%s : wpc_high_temp_recovery_15w is Empty\n", __func__);
  952. pdata->wpc_high_temp_recovery_15w = pdata->wpc_high_temp_recovery;
  953. }
  954. pdata->wpc_high_check_using_lrp = of_property_read_bool(np, "battery,wpc_high_check_using_lrp");
  955. if (pdata->wpc_high_check_using_lrp) {
  956. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp",
  957. &pdata->wpc_lrp_high_temp);
  958. if (ret)
  959. pr_info("%s : wpc_lrp_high_temp is Empty\n", __func__);
  960. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery",
  961. &pdata->wpc_lrp_high_temp_recovery);
  962. if (ret)
  963. pr_info("%s : wpc_lrp_high_temp_recovery is Empty\n", __func__);
  964. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_12w",
  965. &pdata->wpc_lrp_high_temp_12w);
  966. if (ret) {
  967. pr_info("%s : wpc_lrp_high_temp_12w is Empty\n", __func__);
  968. pdata->wpc_lrp_high_temp_12w = pdata->wpc_lrp_high_temp;
  969. }
  970. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery_12w",
  971. &pdata->wpc_lrp_high_temp_recovery_12w);
  972. if (ret) {
  973. pr_info("%s : wpc_lrp_high_temp_recovery_12w is Empty\n", __func__);
  974. pdata->wpc_lrp_high_temp_recovery_12w = pdata->wpc_lrp_high_temp_recovery;
  975. }
  976. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_15w",
  977. &pdata->wpc_lrp_high_temp_15w);
  978. if (ret) {
  979. pr_info("%s : wpc_lrp_high_temp_15w is Empty\n", __func__);
  980. pdata->wpc_lrp_high_temp_15w = pdata->wpc_lrp_high_temp;
  981. }
  982. ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery_15w",
  983. &pdata->wpc_lrp_high_temp_recovery_15w);
  984. if (ret) {
  985. pr_info("%s : wpc_lrp_high_temp_recovery_15w is Empty\n", __func__);
  986. pdata->wpc_lrp_high_temp_recovery_15w = pdata->wpc_lrp_high_temp_recovery;
  987. }
  988. }
  989. pdata->enable_check_wpc_temp_v2 =
  990. of_property_read_bool(np, "battery,enable_check_wpc_temp_v2");
  991. if (pdata->enable_check_wpc_temp_v2) {
  992. ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond", &pdata->wpc_temp_v2_cond);
  993. if (ret) {
  994. pr_info("%s : wpc_temp_v2_cond is Empty\n", __func__);
  995. pdata->wpc_temp_v2_cond = 0;
  996. }
  997. ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond_12w", &pdata->wpc_temp_v2_cond_12w);
  998. if (ret) {
  999. pr_info("%s : wpc_temp_v2_cond_12w is Empty\n", __func__);
  1000. pdata->wpc_temp_v2_cond_12w = pdata->wpc_temp_v2_cond;
  1001. }
  1002. ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond_15w", &pdata->wpc_temp_v2_cond_15w);
  1003. if (ret) {
  1004. pr_info("%s : wpc_temp_v2_cond_15w is Empty\n", __func__);
  1005. pdata->wpc_temp_v2_cond_15w = pdata->wpc_temp_v2_cond;
  1006. }
  1007. if (pdata->wpc_high_check_using_lrp) {
  1008. ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond",
  1009. &pdata->wpc_lrp_temp_v2_cond);
  1010. if (ret) {
  1011. pr_info("%s : wpc_lrp_temp_v2_cond is Empty\n", __func__);
  1012. pdata->wpc_lrp_temp_v2_cond = 0;
  1013. }
  1014. ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond_12w",
  1015. &pdata->wpc_lrp_temp_v2_cond_12w);
  1016. if (ret) {
  1017. pr_info("%s : wpc_lrp_temp_v2_cond_12w is Empty\n", __func__);
  1018. pdata->wpc_lrp_temp_v2_cond_12w = pdata->wpc_lrp_temp_v2_cond;
  1019. }
  1020. ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond_15w",
  1021. &pdata->wpc_lrp_temp_v2_cond_15w);
  1022. if (ret) {
  1023. pr_info("%s : wpc_lrp_temp_v2_cond_15w is Empty\n", __func__);
  1024. pdata->wpc_lrp_temp_v2_cond_15w = pdata->wpc_lrp_temp_v2_cond;
  1025. }
  1026. }
  1027. }
  1028. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp",
  1029. &pdata->wpc_lcd_on_high_temp);
  1030. if (ret) {
  1031. pr_info("%s : wpc_lcd_on_high_temp is Empty\n", __func__);
  1032. pdata->wpc_lcd_on_high_temp = pdata->wpc_high_temp;
  1033. }
  1034. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec",
  1035. &pdata->wpc_lcd_on_high_temp_rec);
  1036. if (ret) {
  1037. pr_info("%s : wpc_lcd_on_high_temp_rec is Empty\n", __func__);
  1038. pdata->wpc_lcd_on_high_temp_rec = pdata->wpc_high_temp_recovery;
  1039. }
  1040. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_12w",
  1041. &pdata->wpc_lcd_on_high_temp_12w);
  1042. if (ret) {
  1043. pr_info("%s : wpc_lcd_on_high_temp_12w is Empty\n", __func__);
  1044. pdata->wpc_lcd_on_high_temp_12w = pdata->wpc_high_temp_12w;
  1045. }
  1046. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec_12w",
  1047. &pdata->wpc_lcd_on_high_temp_rec_12w);
  1048. if (ret) {
  1049. pr_info("%s : wpc_lcd_on_high_temp_rec_12w is Empty\n", __func__);
  1050. pdata->wpc_lcd_on_high_temp_rec_12w = pdata->wpc_high_temp_recovery_12w;
  1051. }
  1052. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_15w",
  1053. &pdata->wpc_lcd_on_high_temp_15w);
  1054. if (ret) {
  1055. pr_info("%s : wpc_lcd_on_high_temp_15w is Empty\n", __func__);
  1056. pdata->wpc_lcd_on_high_temp_15w = pdata->wpc_high_temp_15w;
  1057. }
  1058. ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec_15w",
  1059. &pdata->wpc_lcd_on_high_temp_rec_15w);
  1060. if (ret) {
  1061. pr_info("%s : wpc_lcd_on_high_temp_rec_15w is Empty\n", __func__);
  1062. pdata->wpc_lcd_on_high_temp_rec_15w = pdata->wpc_high_temp_recovery_15w;
  1063. }
  1064. ret = of_property_read_u32(np, "battery,wpc_input_limit_current",
  1065. &pdata->wpc_input_limit_current);
  1066. if (ret)
  1067. pr_info("%s : wpc_input_limit_current is Empty\n", __func__);
  1068. ret = of_property_read_u32(np, "battery,wpc_charging_limit_current",
  1069. &pdata->wpc_charging_limit_current);
  1070. if (ret)
  1071. pr_info("%s : wpc_charging_limit_current is Empty\n", __func__);
  1072. ret = of_property_read_u32(np, "battery,wpc_lcd_on_input_limit_current",
  1073. &pdata->wpc_lcd_on_input_limit_current);
  1074. if (ret) {
  1075. pr_info("%s : wpc_lcd_on_input_limit_current is Empty\n", __func__);
  1076. pdata->wpc_lcd_on_input_limit_current =
  1077. pdata->wpc_input_limit_current;
  1078. }
  1079. pdata->wpc_vout_ctrl_lcd_on = of_property_read_bool(np,
  1080. "battery,wpc_vout_ctrl_lcd_on");
  1081. if (pdata->wpc_vout_ctrl_lcd_on) {
  1082. ret = of_property_read_u32(np, "battery,wpc_flicker_wa_input_limit_current",
  1083. &pdata->wpc_flicker_wa_input_limit_current);
  1084. if (ret)
  1085. pr_info("%s : wpc_flicker_wa_input_limit_current is Empty\n", __func__);
  1086. }
  1087. len = of_property_count_u32_elems(np, "battery,wpc_step_limit_temp");
  1088. if (len > 0) {
  1089. pdata->wpc_step_limit_size = len;
  1090. len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc");
  1091. if (pdata->wpc_step_limit_size != len) {
  1092. pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc is %d\n",
  1093. __func__, pdata->wpc_step_limit_size, len);
  1094. pdata->wpc_step_limit_size = 0;
  1095. } else {
  1096. pdata->wpc_step_limit_temp =
  1097. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1098. ret = of_property_read_u32_array(np, "battery,wpc_step_limit_temp",
  1099. (u32 *)pdata->wpc_step_limit_temp, pdata->wpc_step_limit_size);
  1100. if (ret < 0) {
  1101. pr_err("%s failed to read battery,wpc_step_limit_temp: %d\n",
  1102. __func__, ret);
  1103. kfree(pdata->wpc_step_limit_temp);
  1104. pdata->wpc_step_limit_temp = NULL;
  1105. }
  1106. pdata->wpc_step_limit_fcc =
  1107. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1108. ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc",
  1109. (u32 *)pdata->wpc_step_limit_fcc, pdata->wpc_step_limit_size);
  1110. if (ret < 0) {
  1111. pr_err("%s failed to read battery,wpc_step_limit_fcc: %d\n",
  1112. __func__, ret);
  1113. kfree(pdata->wpc_step_limit_fcc);
  1114. pdata->wpc_step_limit_fcc = NULL;
  1115. }
  1116. if (!pdata->wpc_step_limit_temp || !pdata->wpc_step_limit_fcc) {
  1117. pdata->wpc_step_limit_size = 0;
  1118. } else {
  1119. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1120. pr_info("%s: wpc_step temp:%d, fcc:%d\n", __func__,
  1121. pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc[i]);
  1122. }
  1123. }
  1124. }
  1125. len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc_12w");
  1126. if (pdata->wpc_step_limit_size != len) {
  1127. pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc_12w is %d\n",
  1128. __func__, pdata->wpc_step_limit_size, len);
  1129. pdata->wpc_step_limit_fcc_12w =
  1130. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1131. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1132. pdata->wpc_step_limit_fcc_12w[i] = pdata->wpc_step_limit_fcc[i];
  1133. pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__,
  1134. pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_12w[i]);
  1135. }
  1136. } else {
  1137. pdata->wpc_step_limit_fcc_12w =
  1138. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1139. ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc_12w",
  1140. (u32 *)pdata->wpc_step_limit_fcc_12w,
  1141. pdata->wpc_step_limit_size);
  1142. if (ret < 0) {
  1143. pr_err("%s failed to read battery,wpc_step_limit_fcc_12w: %d\n",
  1144. __func__, ret);
  1145. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1146. pdata->wpc_step_limit_fcc_12w[i] = pdata->wpc_step_limit_fcc[i];
  1147. pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__,
  1148. pdata->wpc_step_limit_temp[i],
  1149. pdata->wpc_step_limit_fcc_12w[i]);
  1150. }
  1151. } else {
  1152. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1153. pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__,
  1154. pdata->wpc_step_limit_temp[i],
  1155. pdata->wpc_step_limit_fcc_12w[i]);
  1156. }
  1157. }
  1158. }
  1159. len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc_15w");
  1160. if (pdata->wpc_step_limit_size != len) {
  1161. pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc_15w is %d\n",
  1162. __func__, pdata->wpc_step_limit_size, len);
  1163. pdata->wpc_step_limit_fcc_15w =
  1164. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1165. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1166. pdata->wpc_step_limit_fcc_15w[i] = pdata->wpc_step_limit_fcc[i];
  1167. pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__,
  1168. pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_15w[i]);
  1169. }
  1170. } else {
  1171. pdata->wpc_step_limit_fcc_15w =
  1172. kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL);
  1173. ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc_15w",
  1174. (u32 *)pdata->wpc_step_limit_fcc_15w,
  1175. pdata->wpc_step_limit_size);
  1176. if (ret < 0) {
  1177. pr_err("%s failed to read battery,wpc_step_limit_fcc_15w: %d\n",
  1178. __func__, ret);
  1179. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1180. pdata->wpc_step_limit_fcc_15w[i] = pdata->wpc_step_limit_fcc[i];
  1181. pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__,
  1182. pdata->wpc_step_limit_temp[i],
  1183. pdata->wpc_step_limit_fcc_15w[i]);
  1184. }
  1185. } else {
  1186. for (i = 0; i < pdata->wpc_step_limit_size; ++i) {
  1187. pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__,
  1188. pdata->wpc_step_limit_temp[i],
  1189. pdata->wpc_step_limit_fcc_15w[i]);
  1190. }
  1191. }
  1192. }
  1193. } else {
  1194. pdata->wpc_step_limit_size = 0;
  1195. pr_info("%s : wpc_step_limit_temp is Empty. len(%d), wpc_step_limit_size(%d)\n",
  1196. __func__, len, pdata->wpc_step_limit_size);
  1197. }
  1198. }
  1199. ret = of_property_read_u32(np, "battery,wc_full_input_limit_current",
  1200. &pdata->wc_full_input_limit_current);
  1201. if (ret)
  1202. pr_info("%s : wc_full_input_limit_current is Empty\n", __func__);
  1203. ret = of_property_read_u32(np, "battery,wc_hero_stand_cc_cv",
  1204. &pdata->wc_hero_stand_cc_cv);
  1205. if (ret) {
  1206. pr_info("%s : wc_hero_stand_cc_cv is Empty\n", __func__);
  1207. pdata->wc_hero_stand_cc_cv = 70;
  1208. }
  1209. ret = of_property_read_u32(np, "battery,wc_hero_stand_cv_current",
  1210. &pdata->wc_hero_stand_cv_current);
  1211. if (ret) {
  1212. pr_info("%s : wc_hero_stand_cv_current is Empty\n", __func__);
  1213. pdata->wc_hero_stand_cv_current = 600;
  1214. }
  1215. ret = of_property_read_u32(np, "battery,wc_hero_stand_hv_cv_current",
  1216. &pdata->wc_hero_stand_hv_cv_current);
  1217. if (ret) {
  1218. pr_info("%s : wc_hero_stand_hv_cv_current is Empty\n", __func__);
  1219. pdata->wc_hero_stand_hv_cv_current = 450;
  1220. }
  1221. ret = of_property_read_u32(np, "battery,sleep_mode_limit_current",
  1222. &pdata->sleep_mode_limit_current);
  1223. if (ret)
  1224. pr_info("%s : sleep_mode_limit_current is Empty\n", __func__);
  1225. ret = of_property_read_u32(np, "battery,inbat_voltage",
  1226. &pdata->inbat_voltage);
  1227. if (ret)
  1228. pr_info("%s : inbat_voltage is Empty\n", __func__);
  1229. if (pdata->inbat_voltage) {
  1230. p = of_get_property(np, "battery,inbat_voltage_table_adc", &len);
  1231. if (!p)
  1232. return 1;
  1233. len = len / sizeof(u32);
  1234. pdata->inbat_adc_table_size = len;
  1235. pdata->inbat_adc_table =
  1236. kzalloc(sizeof(sec_bat_adc_table_data_t) *
  1237. pdata->inbat_adc_table_size, GFP_KERNEL);
  1238. for (i = 0; i < pdata->inbat_adc_table_size; i++) {
  1239. ret = of_property_read_u32_index(np,
  1240. "battery,inbat_voltage_table_adc", i, &temp);
  1241. pdata->inbat_adc_table[i].adc = (int)temp;
  1242. if (ret)
  1243. pr_info("%s : inbat_adc_table(adc) is Empty\n",
  1244. __func__);
  1245. ret = of_property_read_u32_index(np,
  1246. "battery,inbat_voltage_table_data", i, &temp);
  1247. pdata->inbat_adc_table[i].data = (int)temp;
  1248. if (ret)
  1249. pr_info("%s : inbat_adc_table(data) is Empty\n",
  1250. __func__);
  1251. }
  1252. }
  1253. ret = of_property_read_u32(np, "battery,pre_afc_input_current",
  1254. &pdata->pre_afc_input_current);
  1255. if (ret) {
  1256. pr_info("%s : pre_afc_input_current is Empty\n", __func__);
  1257. pdata->pre_afc_input_current = 1000;
  1258. }
  1259. ret = of_property_read_u32(np, "battery,select_pd_input_current",
  1260. &pdata->select_pd_input_current);
  1261. if (ret) {
  1262. pr_info("%s : select_pd_input_current is Empty\n", __func__);
  1263. pdata->select_pd_input_current = 1000;
  1264. }
  1265. ret = of_property_read_u32(np, "battery,pre_afc_work_delay",
  1266. &pdata->pre_afc_work_delay);
  1267. if (ret) {
  1268. pr_info("%s : pre_afc_work_delay is Empty\n", __func__);
  1269. pdata->pre_afc_work_delay = 2000;
  1270. }
  1271. ret = of_property_read_u32(np, "battery,pre_wc_afc_input_current",
  1272. &pdata->pre_wc_afc_input_current);
  1273. if (ret) {
  1274. pr_info("%s : pre_wc_afc_input_current is Empty\n", __func__);
  1275. pdata->pre_wc_afc_input_current = 500; /* wc input default */
  1276. }
  1277. ret = of_property_read_u32(np, "battery,pre_wc_afc_work_delay",
  1278. &pdata->pre_wc_afc_work_delay);
  1279. if (ret) {
  1280. pr_info("%s : pre_wc_afc_work_delay is Empty\n", __func__);
  1281. pdata->pre_wc_afc_work_delay = 4000;
  1282. }
  1283. ret = of_property_read_u32(np, "battery,select_pd_input_current",
  1284. &pdata->select_pd_input_current);
  1285. if (ret) {
  1286. pr_info("%s : select_pd_input_current is Empty\n", __func__);
  1287. pdata->select_pd_input_current = 1000;
  1288. }
  1289. ret = of_property_read_u32(np, "battery,tx_stop_capacity",
  1290. &pdata->tx_stop_capacity);
  1291. if (ret) {
  1292. pr_info("%s : tx_stop_capacity is Empty\n", __func__);
  1293. pdata->tx_stop_capacity = 30;
  1294. }
  1295. ret = of_property_read_u32(np, "battery,adc_check_count",
  1296. &pdata->adc_check_count);
  1297. if (ret)
  1298. pr_info("%s : Adc check count is Empty\n", __func__);
  1299. ret = of_property_read_u32(np, "battery,cable_check_type",
  1300. &pdata->cable_check_type);
  1301. if (ret)
  1302. pr_info("%s : Cable check type is Empty\n", __func__);
  1303. ret = of_property_read_u32(np, "battery,cable_source_type",
  1304. &pdata->cable_source_type);
  1305. if (ret)
  1306. pr_info("%s: Cable_source_type is Empty\n", __func__);
  1307. #if defined(CONFIG_CHARGING_VZWCONCEPT)
  1308. pdata->cable_check_type &= ~SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE;
  1309. pdata->cable_check_type |= SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE;
  1310. #endif
  1311. ret = of_property_read_u32(np, "battery,polling_type",
  1312. &pdata->polling_type);
  1313. if (ret)
  1314. pr_info("%s : Polling type is Empty\n", __func__);
  1315. ret = of_property_read_u32(np, "battery,monitor_initial_count",
  1316. &pdata->monitor_initial_count);
  1317. if (ret)
  1318. pr_info("%s : Monitor initial count is Empty\n", __func__);
  1319. ret = of_property_read_u32(np, "battery,battery_check_type",
  1320. &pdata->battery_check_type);
  1321. if (ret)
  1322. pr_info("%s : Battery check type is Empty\n", __func__);
  1323. ret = of_property_read_u32(np, "battery,check_count",
  1324. &pdata->check_count);
  1325. if (ret)
  1326. pr_info("%s : Check count is Empty\n", __func__);
  1327. ret = of_property_read_u32(np, "battery,check_adc_max",
  1328. &pdata->check_adc_max);
  1329. if (ret)
  1330. pr_info("%s : Check adc max is Empty\n", __func__);
  1331. ret = of_property_read_u32(np, "battery,check_adc_min",
  1332. &pdata->check_adc_min);
  1333. if (ret)
  1334. pr_info("%s : Check adc min is Empty\n", __func__);
  1335. ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
  1336. &pdata->ovp_uvlo_check_type);
  1337. if (ret)
  1338. pr_info("%s : Ovp Uvlo check type is Empty\n", __func__);
  1339. ret = of_property_read_u32(np, "battery,overheatlimit_threshold", &temp);
  1340. battery->overheatlimit_threshold = (int)temp;
  1341. if (ret) {
  1342. pr_info("%s : overheatlimit_threshold is Empty\n", __func__);
  1343. battery->overheatlimit_threshold = 700;
  1344. }
  1345. ret = of_property_read_u32(np, "battery,overheatlimit_recovery", &temp);
  1346. battery->overheatlimit_recovery = (int)temp;
  1347. if (ret) {
  1348. pr_info("%s : overheatlimit_recovery is Empty\n", __func__);
  1349. battery->overheatlimit_recovery = 680;
  1350. }
  1351. ret = of_property_read_u32(np, "battery,usb_protection_temp", &temp);
  1352. battery->usb_protection_temp = (int)temp;
  1353. if (ret) {
  1354. pr_info("%s : usb protection temp value is Empty\n", __func__);
  1355. battery->usb_protection_temp = 610;
  1356. }
  1357. ret = of_property_read_u32(np, "battery,temp_gap_bat_usb", &temp);
  1358. battery->temp_gap_bat_usb = (int)temp;
  1359. if (ret) {
  1360. pr_info("%s : temp gap value is Empty\n", __func__);
  1361. battery->temp_gap_bat_usb = 200;
  1362. }
  1363. ret = of_property_read_u32(np, "battery,wire_warm_overheat_thresh", &temp);
  1364. pdata->wire_warm_overheat_thresh = (int)temp;
  1365. if (ret) {
  1366. pr_info("%s : wire_warm_overheat_thresh is Empty\n", __func__);
  1367. pdata->wire_warm_overheat_thresh = 500;
  1368. }
  1369. ret = of_property_read_u32(np, "battery,wire_normal_warm_thresh", &temp);
  1370. pdata->wire_normal_warm_thresh = (int)temp;
  1371. if (ret) {
  1372. pr_info("%s : wire_normal_warm_thresh is Empty\n", __func__);
  1373. pdata->wire_normal_warm_thresh = 420;
  1374. }
  1375. ret = of_property_read_u32(np, "battery,wire_cool1_normal_thresh", &temp);
  1376. pdata->wire_cool1_normal_thresh = (int)temp;
  1377. if (ret) {
  1378. pr_info("%s : wire_cool1_normal_thresh is Empty\n", __func__);
  1379. pdata->wire_cool1_normal_thresh = 180;
  1380. }
  1381. ret = of_property_read_u32(np, "battery,wire_cool2_cool1_thresh", &temp);
  1382. pdata->wire_cool2_cool1_thresh = (int)temp;
  1383. if (ret) {
  1384. pr_info("%s : wire_cool2_cool1_thresh is Empty\n", __func__);
  1385. pdata->wire_cool2_cool1_thresh = 150;
  1386. }
  1387. ret = of_property_read_u32(np, "battery,wire_cool3_cool2_thresh", &temp);
  1388. pdata->wire_cool3_cool2_thresh = (int)temp;
  1389. if (ret) {
  1390. pr_info("%s : wire_cool3_cool2_thresh is Empty\n", __func__);
  1391. pdata->wire_cool3_cool2_thresh = 50;
  1392. }
  1393. ret = of_property_read_u32(np, "battery,wire_cold_cool3_thresh", &temp);
  1394. pdata->wire_cold_cool3_thresh = (int)temp;
  1395. if (ret) {
  1396. pr_info("%s : wire_cold_cool3_thresh is Empty\n", __func__);
  1397. pdata->wire_cold_cool3_thresh = 0;
  1398. }
  1399. ret = of_property_read_u32(np, "battery,wireless_warm_overheat_thresh", &temp);
  1400. pdata->wireless_warm_overheat_thresh = (int)temp;
  1401. if (ret) {
  1402. pr_info("%s : wireless_warm_overheat_thresh is Empty\n", __func__);
  1403. pdata->wireless_warm_overheat_thresh = 450;
  1404. }
  1405. ret = of_property_read_u32(np, "battery,wireless_normal_warm_thresh", &temp);
  1406. pdata->wireless_normal_warm_thresh = (int)temp;
  1407. if (ret) {
  1408. pr_info("%s : wireless_normal_warm_thresh is Empty\n", __func__);
  1409. pdata->wireless_normal_warm_thresh = 410;
  1410. }
  1411. ret = of_property_read_u32(np, "battery,wireless_cool1_normal_thresh", &temp);
  1412. pdata->wireless_cool1_normal_thresh = (int)temp;
  1413. if (ret) {
  1414. pr_info("%s : wireless_cool1_normal_thresh is Empty\n", __func__);
  1415. pdata->wireless_cool1_normal_thresh = 180;
  1416. }
  1417. ret = of_property_read_u32(np, "battery,wireless_cool2_cool1_thresh", &temp);
  1418. pdata->wireless_cool2_cool1_thresh = (int)temp;
  1419. if (ret) {
  1420. pr_info("%s : wireless_cool2_cool1_thresh is Empty\n", __func__);
  1421. pdata->wireless_cool2_cool1_thresh = 150;
  1422. }
  1423. ret = of_property_read_u32(np, "battery,wireless_cool3_cool2_thresh", &temp);
  1424. pdata->wireless_cool3_cool2_thresh = (int)temp;
  1425. if (ret) {
  1426. pr_info("%s : wireless_cool3_cool2_thresh is Empty\n", __func__);
  1427. pdata->wireless_cool3_cool2_thresh = 50;
  1428. }
  1429. ret = of_property_read_u32(np, "battery,wireless_cold_cool3_thresh", &temp);
  1430. pdata->wireless_cold_cool3_thresh = (int)temp;
  1431. if (ret) {
  1432. pr_info("%s : wireless_cold_cool3_thresh is Empty\n", __func__);
  1433. pdata->wireless_cold_cool3_thresh = 0;
  1434. }
  1435. ret = of_property_read_u32(np, "battery,wire_warm_current", &temp);
  1436. pdata->wire_warm_current = (int)temp;
  1437. if (ret) {
  1438. pr_info("%s : wire_warm_current is Empty\n", __func__);
  1439. pdata->wire_warm_current = 500;
  1440. }
  1441. ret = of_property_read_u32(np, "battery,wire_cool1_current", &temp);
  1442. pdata->wire_cool1_current = (int)temp;
  1443. if (ret) {
  1444. pr_info("%s : wire_cool1_current is Empty\n", __func__);
  1445. pdata->wire_cool1_current = 500;
  1446. }
  1447. ret = of_property_read_u32(np, "battery,wire_cool2_current", &temp);
  1448. pdata->wire_cool2_current = (int)temp;
  1449. if (ret) {
  1450. pr_info("%s : wire_cool2_current is Empty\n", __func__);
  1451. pdata->wire_cool2_current = 500;
  1452. }
  1453. ret = of_property_read_u32(np, "battery,wire_cool3_current", &temp);
  1454. pdata->wire_cool3_current = (int)temp;
  1455. if (ret) {
  1456. pr_info("%s : wire_cool3_current is Empty\n", __func__);
  1457. pdata->wire_cool3_current = 500;
  1458. }
  1459. ret = of_property_read_u32(np, "battery,wireless_warm_current", &temp);
  1460. pdata->wireless_warm_current = (int)temp;
  1461. if (ret) {
  1462. pr_info("%s : wireless_warm_current is Empty\n", __func__);
  1463. pdata->wireless_warm_current = 500;
  1464. }
  1465. ret = of_property_read_u32(np, "battery,wireless_cool1_current", &temp);
  1466. pdata->wireless_cool1_current = (int)temp;
  1467. if (ret) {
  1468. pr_info("%s : wireless_cool1_current is Empty\n", __func__);
  1469. pdata->wireless_cool1_current = 500;
  1470. }
  1471. ret = of_property_read_u32(np, "battery,wireless_cool2_current", &temp);
  1472. pdata->wireless_cool2_current = (int)temp;
  1473. if (ret) {
  1474. pr_info("%s : wireless_cool2_current is Empty\n", __func__);
  1475. pdata->wireless_cool2_current = 500;
  1476. }
  1477. ret = of_property_read_u32(np, "battery,wireless_cool3_current", &temp);
  1478. pdata->wireless_cool3_current = (int)temp;
  1479. if (ret) {
  1480. pr_info("%s : wireless_cool3_current is Empty\n", __func__);
  1481. pdata->wireless_cool3_current = 500;
  1482. }
  1483. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  1484. ret = of_property_read_u32(np, "battery,limiter_main_warm_current",
  1485. &pdata->limiter_main_warm_current);
  1486. if (ret)
  1487. pr_info("%s: limiter_main_warm_current is Empty\n", __func__);
  1488. ret = of_property_read_u32(np, "battery,limiter_sub_warm_current",
  1489. &pdata->limiter_sub_warm_current);
  1490. if (ret)
  1491. pr_info("%s: limiter_sub_warm_current is Empty\n", __func__);
  1492. ret = of_property_read_u32(np, "battery,limiter_main_cool1_current",
  1493. &pdata->limiter_main_cool1_current);
  1494. if (ret)
  1495. pr_info("%s: limiter_main_cool1_current is Empty\n", __func__);
  1496. ret = of_property_read_u32(np, "battery,limiter_sub_cool1_current",
  1497. &pdata->limiter_sub_cool1_current);
  1498. if (ret)
  1499. pr_info("%s: limiter_sub_cool1_current is Empty\n", __func__);
  1500. ret = of_property_read_u32(np, "battery,limiter_main_cool2_current",
  1501. &pdata->limiter_main_cool2_current);
  1502. if (ret)
  1503. pr_info("%s: limiter_main_cool2_current is Empty\n", __func__);
  1504. ret = of_property_read_u32(np, "battery,limiter_sub_cool2_current",
  1505. &pdata->limiter_sub_cool2_current);
  1506. if (ret)
  1507. pr_info("%s: limiter_sub_cool2_current is Empty\n", __func__);
  1508. ret = of_property_read_u32(np, "battery,limiter_main_cool3_current",
  1509. &pdata->limiter_main_cool3_current);
  1510. if (ret)
  1511. pr_info("%s: limiter_main_cool3_current is Empty\n", __func__);
  1512. ret = of_property_read_u32(np, "battery,limiter_sub_cool3_current",
  1513. &pdata->limiter_sub_cool3_current);
  1514. if (ret)
  1515. pr_info("%s: limiter_sub_cool3_current is Empty\n", __func__);
  1516. ret = of_property_read_u32(np, "battery,limiter_aging_float_offset",
  1517. &pdata->limiter_aging_float_offset);
  1518. if (ret)
  1519. pr_info("%s: limiter_aging_float_offset is Empty\n", __func__);
  1520. #endif
  1521. ret = of_property_read_u32(np, "battery,high_temp_float", &temp);
  1522. pdata->high_temp_float = (int)temp;
  1523. if (ret) {
  1524. pr_info("%s : high_temp_float is Empty\n", __func__);
  1525. pdata->high_temp_float = 4150;
  1526. }
  1527. ret = of_property_read_u32(np, "battery,low_temp_float", &temp);
  1528. pdata->low_temp_float = (int)temp;
  1529. if (ret) {
  1530. pr_info("%s : low_temp_float is Empty\n", __func__);
  1531. pdata->low_temp_float = 4350;
  1532. }
  1533. ret = of_property_read_u32(np, "battery,low_temp_cool3_float", &temp);
  1534. pdata->low_temp_cool3_float = (int)temp;
  1535. if (ret) {
  1536. pr_info("%s : low_temp_cool3_float is Empty\n", __func__);
  1537. pdata->low_temp_cool3_float = pdata->low_temp_float;
  1538. }
  1539. ret = of_property_read_u32(np, "battery,buck_recovery_margin", &temp);
  1540. pdata->buck_recovery_margin = (int)temp;
  1541. if (ret) {
  1542. pr_info("%s : buck_recovery_margin is Empty\n", __func__);
  1543. pdata->buck_recovery_margin = 50;
  1544. }
  1545. ret = of_property_read_u32(np, "battery,recharge_condition_vcell", &pdata->recharge_condition_vcell);
  1546. if (ret) {
  1547. pr_info("%s : recharge_condition_vcell is Empty\n", __func__);
  1548. pdata->recharge_condition_vcell = 4270;
  1549. }
  1550. ret = of_property_read_u32(np, "battery,swelling_high_rechg_voltage", &temp);
  1551. pdata->swelling_high_rechg_voltage = (int)temp;
  1552. if (ret) {
  1553. pr_info("%s : swelling_high_rechg_voltage is Empty\n", __func__);
  1554. pdata->swelling_high_rechg_voltage = 4000;
  1555. }
  1556. ret = of_property_read_u32(np, "battery,swelling_low_rechg_voltage", &temp);
  1557. pdata->swelling_low_rechg_voltage = (int)temp;
  1558. if (ret) {
  1559. pr_info("%s : swelling_low_rechg_voltage is Empty\n", __func__);
  1560. pdata->swelling_low_rechg_voltage = 4200;
  1561. }
  1562. ret = of_property_read_u32(np, "battery,swelling_low_cool3_rechg_voltage", &temp);
  1563. pdata->swelling_low_cool3_rechg_voltage = (int)temp;
  1564. if (ret) {
  1565. pr_info("%s : swelling_low_cool3_rechg_voltage is Empty\n", __func__);
  1566. pdata->swelling_low_cool3_rechg_voltage = pdata->swelling_low_rechg_voltage;
  1567. }
  1568. pdata->chgen_over_swell_rechg_vol = of_property_read_bool(np, "battery,chgen_over_swell_rechg_vol");
  1569. pr_info("%s: chgen_over_swell_rechg_vol %s.\n", __func__,
  1570. pdata->chgen_over_swell_rechg_vol ? "Enabled" : "Disabled");
  1571. ret = of_property_read_u32(np, "battery,tx_high_threshold",
  1572. &temp);
  1573. pdata->tx_high_threshold = (int)temp;
  1574. if (ret) {
  1575. pr_info("%s : tx_high_threshold is Empty\n", __func__);
  1576. pdata->tx_high_threshold = 450;
  1577. }
  1578. ret = of_property_read_u32(np, "battery,tx_high_recovery",
  1579. &temp);
  1580. pdata->tx_high_recovery = (int)temp;
  1581. if (ret) {
  1582. pr_info("%s : tx_high_recovery is Empty\n", __func__);
  1583. pdata->tx_high_recovery = 400;
  1584. }
  1585. ret = of_property_read_u32(np, "battery,tx_low_threshold",
  1586. &temp);
  1587. pdata->tx_low_threshold = (int)temp;
  1588. if (ret) {
  1589. pr_info("%s : tx_low_threshold is Empty\n", __func__);
  1590. pdata->tx_low_recovery = 0;
  1591. }
  1592. ret = of_property_read_u32(np, "battery,tx_low_recovery",
  1593. &temp);
  1594. pdata->tx_low_recovery = (int)temp;
  1595. if (ret) {
  1596. pr_info("%s : tx_low_recovery is Empty\n", __func__);
  1597. pdata->tx_low_recovery = 50;
  1598. }
  1599. ret = of_property_read_u32(np, "battery,icl_by_tx_gear",
  1600. &pdata->icl_by_tx_gear);
  1601. if (ret)
  1602. pr_info("%s : icl_by_tx_gear is Empty\n", __func__);
  1603. ret = of_property_read_u32(np, "battery,fcc_by_tx",
  1604. &pdata->fcc_by_tx);
  1605. if (ret)
  1606. pr_info("%s : fcc_by_tx is Empty\n", __func__);
  1607. ret = of_property_read_u32(np, "battery,fcc_by_tx_gear",
  1608. &pdata->fcc_by_tx_gear);
  1609. if (ret)
  1610. pr_info("%s : fcc_by_tx_gear is Empty\n", __func__);
  1611. ret = of_property_read_u32(np, "battery,wpc_input_limit_by_tx_check",
  1612. &pdata->wpc_input_limit_by_tx_check);
  1613. if (ret)
  1614. pr_info("%s : wpc_input_limit_by_tx_check is Empty\n", __func__);
  1615. if (pdata->wpc_input_limit_by_tx_check) {
  1616. ret = of_property_read_u32(np, "battery,wpc_input_limit_current_by_tx",
  1617. &pdata->wpc_input_limit_current_by_tx);
  1618. if (ret) {
  1619. pr_info("%s : wpc_input_limit_current_by_tx is Empty\n", __func__);
  1620. pdata->wpc_input_limit_current_by_tx =
  1621. pdata->wpc_input_limit_current;
  1622. }
  1623. }
  1624. ret = of_property_read_u32(np, "battery,full_check_type",
  1625. &pdata->full_check_type);
  1626. if (ret)
  1627. pr_info("%s : Full check type is Empty\n", __func__);
  1628. ret = of_property_read_u32(np, "battery,full_check_type_2nd",
  1629. &pdata->full_check_type_2nd);
  1630. if (ret)
  1631. pr_info("%s : Full check type 2nd is Empty\n", __func__);
  1632. ret = of_property_read_u32(np, "battery,full_check_count",
  1633. &pdata->full_check_count);
  1634. if (ret)
  1635. pr_info("%s : Full check count is Empty\n", __func__);
  1636. ret = of_property_read_u32(np, "battery,chg_gpio_full_check",
  1637. &pdata->chg_gpio_full_check);
  1638. if (ret)
  1639. pr_info("%s : Chg gpio full check is Empty\n", __func__);
  1640. ret = of_property_read_u32(np, "battery,chg_polarity_full_check",
  1641. &pdata->chg_polarity_full_check);
  1642. if (ret)
  1643. pr_info("%s : Chg polarity full check is Empty\n", __func__);
  1644. ret = of_property_read_u32(np, "battery,full_condition_type",
  1645. &pdata->full_condition_type);
  1646. if (ret)
  1647. pr_info("%s : Full condition type is Empty\n", __func__);
  1648. ret = of_property_read_u32(np, "battery,full_condition_soc",
  1649. &pdata->full_condition_soc);
  1650. if (ret)
  1651. pr_info("%s : Full condition soc is Empty\n", __func__);
  1652. ret = of_property_read_u32(np, "battery,full_condition_vcell",
  1653. &pdata->full_condition_vcell);
  1654. if (ret)
  1655. pr_info("%s : Full condition vcell is Empty\n", __func__);
  1656. ret = of_property_read_u32(np, "battery,recharge_check_count",
  1657. &pdata->recharge_check_count);
  1658. if (ret)
  1659. pr_info("%s : Recharge check count is Empty\n", __func__);
  1660. ret = of_property_read_u32(np, "battery,recharge_condition_type",
  1661. &pdata->recharge_condition_type);
  1662. if (ret)
  1663. pr_info("%s : Recharge condition type is Empty\n", __func__);
  1664. ret = of_property_read_u32(np, "battery,recharge_condition_soc",
  1665. &pdata->recharge_condition_soc);
  1666. if (ret)
  1667. pr_info("%s : Recharge condition soc is Empty\n", __func__);
  1668. ret = of_property_read_u32(np, "battery,charging_reset_time",
  1669. (unsigned int *)&pdata->charging_reset_time);
  1670. if (ret)
  1671. pr_info("%s : Charging reset time is Empty\n", __func__);
  1672. ret = of_property_read_u32(np, "battery,chg_float_voltage",
  1673. (unsigned int *)&pdata->chg_float_voltage);
  1674. if (ret) {
  1675. pr_info("%s: chg_float_voltage is Empty\n", __func__);
  1676. pdata->chg_float_voltage = 43500;
  1677. }
  1678. ret = of_property_read_u32(np, "battery,chg_float_voltage_conv",
  1679. &pdata->chg_float_voltage_conv);
  1680. if (ret) {
  1681. pr_info("%s: chg_float_voltage_conv is Empty\n", __func__);
  1682. pdata->chg_float_voltage_conv = 1;
  1683. }
  1684. ret = of_property_read_u32(np, "battery,max_charging_current",
  1685. &pdata->max_charging_current);
  1686. if (ret) {
  1687. pr_err("%s: max_charging_current is Empty\n", __func__);
  1688. pdata->max_charging_current = 3000;
  1689. }
  1690. sec_bat_parse_age_data(np, battery->pdata);
  1691. sec_bat_parse_health_condition(np, battery->pdata);
  1692. sec_bat_parse_dt_siop(battery, np);
  1693. ret = of_property_read_u32(np, "battery,wireless_otg_input_current",
  1694. &pdata->wireless_otg_input_current);
  1695. if (ret)
  1696. pdata->wireless_otg_input_current = WIRELESS_OTG_INPUT_CURRENT;
  1697. ret = of_property_read_u32(np, "battery,max_input_voltage",
  1698. &pdata->max_input_voltage);
  1699. if (ret)
  1700. pdata->max_input_voltage = 20000;
  1701. ret = of_property_read_u32(np, "battery,max_input_current",
  1702. &pdata->max_input_current);
  1703. if (ret)
  1704. pdata->max_input_current = 3000;
  1705. ret = of_property_read_u32(np, "battery,pd_charging_charge_power",
  1706. &pdata->pd_charging_charge_power);
  1707. if (ret) {
  1708. pr_err("%s: pd_charging_charge_power is Empty\n", __func__);
  1709. pdata->pd_charging_charge_power = 15000;
  1710. }
  1711. pdata->support_fpdo_dc = of_property_read_bool(np, "battery,support_fpdo_dc");
  1712. if (pdata->support_fpdo_dc) {
  1713. ret = of_property_read_u32(np, "battery,fpdo_dc_charge_power",
  1714. &pdata->fpdo_dc_charge_power);
  1715. if (ret) {
  1716. pr_err("%s: fpdo_dc_charge_power is Empty\n", __func__);
  1717. pdata->fpdo_dc_charge_power = 15000;
  1718. }
  1719. }
  1720. ret = of_property_read_u32(np, "battery,rp_current_rp1",
  1721. &pdata->rp_current_rp1);
  1722. if (ret) {
  1723. pr_err("%s: rp_current_rp1 is Empty\n", __func__);
  1724. pdata->rp_current_rp1 = 500;
  1725. }
  1726. ret = of_property_read_u32(np, "battery,rp_current_rp2",
  1727. &pdata->rp_current_rp2);
  1728. if (ret) {
  1729. pr_err("%s: rp_current_rp2 is Empty\n", __func__);
  1730. pdata->rp_current_rp2 = 1500;
  1731. }
  1732. ret = of_property_read_u32(np, "battery,rp_current_rp3",
  1733. &pdata->rp_current_rp3);
  1734. if (ret) {
  1735. pr_err("%s: rp_current_rp3 is Empty\n", __func__);
  1736. pdata->rp_current_rp3 = 3000;
  1737. }
  1738. ret = of_property_read_u32(np, "battery,rp_current_rdu_rp3",
  1739. &pdata->rp_current_rdu_rp3);
  1740. if (ret) {
  1741. pr_err("%s: rp_current_rdu_rp3 is Empty\n", __func__);
  1742. pdata->rp_current_rdu_rp3 = 2100;
  1743. }
  1744. ret = of_property_read_u32(np, "battery,rp_current_abnormal_rp3",
  1745. &pdata->rp_current_abnormal_rp3);
  1746. if (ret) {
  1747. pr_err("%s: rp_current_abnormal_rp3 is Empty\n", __func__);
  1748. pdata->rp_current_abnormal_rp3 = 1800;
  1749. }
  1750. ret = of_property_read_u32(np, "battery,nv_charge_power",
  1751. &pdata->nv_charge_power);
  1752. if (ret) {
  1753. pr_err("%s: nv_charge_power is Empty\n", __func__);
  1754. pdata->nv_charge_power = mW_by_mVmA(SEC_INPUT_VOLTAGE_5V, pdata->default_input_current);
  1755. }
  1756. ret = of_property_read_u32(np, "battery,tx_minduty_default",
  1757. &pdata->tx_minduty_default);
  1758. if (ret) {
  1759. pdata->tx_minduty_default = 20;
  1760. pr_err("%s: tx minduty is Empty. set %d\n", __func__, pdata->tx_minduty_default);
  1761. }
  1762. ret = of_property_read_u32(np, "battery,tx_minduty_5V",
  1763. &pdata->tx_minduty_5V);
  1764. if (ret) {
  1765. pdata->tx_minduty_5V = 50;
  1766. pr_err("%s: tx minduty 5V is Empty. set %d\n", __func__, pdata->tx_minduty_5V);
  1767. }
  1768. ret = of_property_read_u32(np, "battery,tx_ping_duty_default",
  1769. &pdata->tx_ping_duty_default);
  1770. if (ret) {
  1771. pdata->tx_ping_duty_default = 0;
  1772. pr_err("%s: tx ping duty default is not changed (disabled) %d\n",
  1773. __func__, pdata->tx_ping_duty_default);
  1774. }
  1775. ret = of_property_read_u32(np, "battery,tx_ping_duty_no_ta",
  1776. &pdata->tx_ping_duty_no_ta);
  1777. if (ret) {
  1778. pdata->tx_ping_duty_no_ta = pdata->tx_ping_duty_default;
  1779. pr_err("%s: tx ping duty no TA is default %d\n", __func__, pdata->tx_ping_duty_no_ta);
  1780. }
  1781. if (pdata->tx_ping_duty_default)
  1782. pr_info("%s : tx_ping_duty_default: %d, tx_ping_duty_no_ta: %d\n",
  1783. __func__, pdata->tx_ping_duty_default, pdata->tx_ping_duty_no_ta);
  1784. ret = of_property_read_u32(np, "battery,tx_uno_vout",
  1785. &pdata->tx_uno_vout);
  1786. if (ret) {
  1787. pdata->tx_uno_vout = WC_TX_VOUT_7500MV;
  1788. pr_err("%s: tx uno vout is Empty. set %d\n", __func__, pdata->tx_uno_vout);
  1789. }
  1790. ret = of_property_read_u32(np, "battery,tx_ping_vout",
  1791. &pdata->tx_ping_vout);
  1792. if (ret) {
  1793. pdata->tx_ping_vout = WC_TX_VOUT_5000MV;
  1794. pr_err("%s: tx ping vout is Empty. set %d\n", __func__, pdata->tx_ping_vout);
  1795. }
  1796. ret = of_property_read_u32(np, "battery,tx_gear_vout",
  1797. &pdata->tx_gear_vout);
  1798. if (ret) {
  1799. pdata->tx_gear_vout = WC_TX_VOUT_5000MV;
  1800. pr_info("%s : tx gear vout is Empty. set %d\n", __func__, pdata->tx_gear_vout);
  1801. }
  1802. ret = of_property_read_u32(np, "battery,tx_buds_vout",
  1803. &pdata->tx_buds_vout);
  1804. if (ret) {
  1805. pdata->tx_buds_vout = pdata->tx_uno_vout; // battery,tx_buds_vout in dt is not mandatory
  1806. pr_info("%s : tx buds vout is Empty. set %d\n", __func__, pdata->tx_buds_vout);
  1807. }
  1808. ret = of_property_read_u32(np, "battery,tx_uno_iout",
  1809. &pdata->tx_uno_iout);
  1810. if (ret) {
  1811. pdata->tx_uno_iout = 1500;
  1812. pr_err("%s: tx uno iout is Empty. set %d\n", __func__, pdata->tx_uno_iout);
  1813. }
  1814. ret = of_property_read_u32(np, "battery,tx_uno_iout_gear",
  1815. &pdata->tx_uno_iout_gear);
  1816. if (ret) {
  1817. pdata->tx_uno_iout_gear = pdata->tx_uno_iout;
  1818. pr_err("%s: tx_uno_iout_gear is Empty. set %d\n", __func__, pdata->tx_uno_iout);
  1819. }
  1820. ret = of_property_read_u32(np, "battery,tx_uno_iout_aov_gear",
  1821. &pdata->tx_uno_iout_aov_gear);
  1822. if (ret) {
  1823. pdata->tx_uno_iout_aov_gear = pdata->tx_uno_iout_gear;
  1824. pr_err("%s: tx_uno_iout_aov_gear is Empty. set %d\n",
  1825. __func__, pdata->tx_uno_iout_gear);
  1826. }
  1827. ret = of_property_read_u32(np, "battery,tx_mfc_iout_gear",
  1828. &pdata->tx_mfc_iout_gear);
  1829. if (ret) {
  1830. pdata->tx_mfc_iout_gear = 1500;
  1831. pr_err("%s: tx mfc iout gear is Empty. set %d\n", __func__, pdata->tx_mfc_iout_gear);
  1832. }
  1833. ret = of_property_read_u32(np, "battery,tx_mfc_iout_aov_gear",
  1834. &pdata->tx_mfc_iout_aov_gear);
  1835. if (ret) {
  1836. pdata->tx_mfc_iout_aov_gear = pdata->tx_mfc_iout_gear;
  1837. pr_err("%s: tx_mfc_iout_aov_gear is Empty. set %d\n",
  1838. __func__, pdata->tx_mfc_iout_gear);
  1839. }
  1840. ret = of_property_read_u32(np, "battery,tx_mfc_iout_phone",
  1841. &pdata->tx_mfc_iout_phone);
  1842. if (ret) {
  1843. pdata->tx_mfc_iout_phone = 1100;
  1844. pr_err("%s: tx mfc iout phone is Empty. set %d\n", __func__, pdata->tx_mfc_iout_phone);
  1845. }
  1846. ret = of_property_read_u32(np, "battery,tx_mfc_iout_phone_5v",
  1847. &pdata->tx_mfc_iout_phone_5v);
  1848. if (ret) {
  1849. pdata->tx_mfc_iout_phone_5v = 300;
  1850. pr_err("%s: tx mfc iout phone 5v is Empty. set %d\n", __func__, pdata->tx_mfc_iout_phone_5v);
  1851. }
  1852. ret = of_property_read_u32(np, "battery,tx_mfc_iout_lcd_on",
  1853. &pdata->tx_mfc_iout_lcd_on);
  1854. if (ret) {
  1855. pdata->tx_mfc_iout_lcd_on = 900;
  1856. pr_err("%s: tx mfc iout lcd on is Empty. set %d\n", __func__, pdata->tx_mfc_iout_lcd_on);
  1857. }
  1858. pdata->tx_5v_disable = of_property_read_bool(np, "battery,tx_5v_disable");
  1859. pr_info("%s: 5V TA power sharing is %s.\n", __func__,
  1860. pdata->tx_5v_disable ? "Disabled" : "Enabled");
  1861. ret = of_property_read_u32(np, "battery,phm_vout_ctrl_dev",
  1862. &pdata->phm_vout_ctrl_dev);
  1863. if (ret < 0) {
  1864. pr_info("%s: fail to read phm_vout_ctrl_dev\n", __func__);
  1865. pdata->phm_vout_ctrl_dev = 0;
  1866. }
  1867. pr_info("%s: phm_vout_ctrl_dev = %d\n", __func__, pdata->phm_vout_ctrl_dev);
  1868. ret = of_property_read_u32(np, "battery,tx_aov_start_vout",
  1869. &pdata->tx_aov_start_vout);
  1870. if (ret) {
  1871. pdata->tx_aov_start_vout = WC_TX_VOUT_6000MV;
  1872. pr_err("%s: tx aov start vout is Empty. set %d\n", __func__, pdata->tx_aov_start_vout);
  1873. }
  1874. ret = of_property_read_u32(np, "battery,tx_aov_freq_low",
  1875. &pdata->tx_aov_freq_low);
  1876. if (ret) {
  1877. pdata->tx_aov_freq_low = 125;
  1878. pr_err("%s: tx aov freq low is Empty. set %d\n", __func__, pdata->tx_aov_freq_low);
  1879. }
  1880. ret = of_property_read_u32(np, "battery,tx_aov_freq_high",
  1881. &pdata->tx_aov_freq_high);
  1882. if (ret) {
  1883. pdata->tx_aov_freq_high = 147;
  1884. pr_err("%s: tx aov freq high is Empty. set %d\n", __func__, pdata->tx_aov_freq_high);
  1885. }
  1886. ret = of_property_read_u32(np, "battery,tx_aov_delay",
  1887. &pdata->tx_aov_delay);
  1888. if (ret) {
  1889. pdata->tx_aov_delay = 3000;
  1890. pr_err("%s: tx aov dealy is Empty. set %d\n", __func__, pdata->tx_aov_delay);
  1891. }
  1892. ret = of_property_read_u32(np, "battery,tx_aov_delay_phm_escape",
  1893. &pdata->tx_aov_delay_phm_escape);
  1894. if (ret) {
  1895. pdata->tx_aov_delay_phm_escape = 4000;
  1896. pr_err("%s: tx aov dealy phm escape is Empty. set %d\n", __func__, pdata->tx_aov_delay_phm_escape);
  1897. }
  1898. pdata->wpc_warm_fod = of_property_read_bool(np, "battery,wpc_warm_fod");
  1899. pr_info("%s: WPC Warm FOD %s.\n", __func__,
  1900. pdata->wpc_warm_fod ? "Enabled" : "Disabled");
  1901. /* Default setting 100mA */
  1902. if (pdata->wpc_warm_fod) {
  1903. ret = of_property_read_u32(np, "battery,wpc_warm_fod_icc",
  1904. &pdata->wpc_warm_fod_icc);
  1905. if (ret)
  1906. pdata->wpc_warm_fod_icc = 100;
  1907. }
  1908. ret = of_property_read_u32(np, "battery,wc21_icl", &pdata->wc21_icl);
  1909. if (ret)
  1910. pr_err("%s: wc21_icl is Empty\n", __func__);
  1911. pdata->lr_enable = of_property_read_bool(np, "battery,lr_enable");
  1912. if (pdata->lr_enable) {
  1913. ret = of_property_read_u32(np, "battery,lr_param_bat_thm",
  1914. &pdata->lr_param_bat_thm);
  1915. if (ret)
  1916. pdata->lr_param_bat_thm = 420;
  1917. ret = of_property_read_u32(np, "battery,lr_param_sub_bat_thm",
  1918. &pdata->lr_param_sub_bat_thm);
  1919. if (ret)
  1920. pdata->lr_param_sub_bat_thm = 580;
  1921. ret = of_property_read_u32(np, "battery,lr_delta",
  1922. &pdata->lr_delta);
  1923. if (ret)
  1924. pdata->lr_delta = 16;
  1925. ret = of_property_read_u32(np, "battery,lr_param_init_bat_thm",
  1926. &pdata->lr_param_init_bat_thm);
  1927. if (ret)
  1928. pdata->lr_param_init_bat_thm = 70;
  1929. ret = of_property_read_u32(np, "battery,lr_param_init_sub_bat_thm",
  1930. &pdata->lr_param_init_sub_bat_thm);
  1931. if (ret)
  1932. pdata->lr_param_init_sub_bat_thm = 30;
  1933. ret = of_property_read_u32(np, "battery,lr_round_off",
  1934. &pdata->lr_round_off);
  1935. if (ret)
  1936. pdata->lr_round_off = 500;
  1937. }
  1938. pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
  1939. "cable_source_type : %d, polling_type: %d\n"
  1940. "initial_count : %d, check_count : %d\n"
  1941. "battery_check_type : %d, check_adc_max : %d, check_adc_min : %d\n"
  1942. "ovp_uvlo_check_type : %d, thermal_source : %d\n"
  1943. "temp_check_type : %d, temp_check_count : %d, nv_charge_power : %d\n"
  1944. "full_condition_type : %d, recharge_condition_type : %d, full_check_type : %d\n",
  1945. __func__,
  1946. pdata->vendor, pdata->technology,pdata->cable_check_type,
  1947. pdata->cable_source_type, pdata->polling_type,
  1948. pdata->monitor_initial_count, pdata->check_count,
  1949. pdata->battery_check_type, pdata->check_adc_max, pdata->check_adc_min,
  1950. pdata->ovp_uvlo_check_type, pdata->bat_thm_info.source,
  1951. pdata->bat_thm_info.check_type, pdata->temp_check_count, pdata->nv_charge_power,
  1952. pdata->full_condition_type, pdata->recharge_condition_type, pdata->full_check_type
  1953. );
  1954. ret = of_property_read_u32(np, "battery,batt_temp_adj_gap_inc",
  1955. &pdata->batt_temp_adj_gap_inc);
  1956. if (ret) {
  1957. pr_err("%s: batt_temp_adj_gap_inc is Empty\n", __func__);
  1958. pdata->batt_temp_adj_gap_inc = 0;
  1959. }
  1960. ret = of_property_read_u32(np, "battery,change_FV_after_full",
  1961. &pdata->change_FV_after_full);
  1962. if (ret) {
  1963. pr_err("%s: change_FV_after_full is Empty\n", __func__);
  1964. pdata->change_FV_after_full = 0;
  1965. }
  1966. pdata->loosened_unknown_temp = of_property_read_bool(np, "battery,loosened_unknown_temp");
  1967. pdata->pogo_chgin = of_property_read_bool(np, "battery,pogo_chgin");
  1968. #if defined(CONFIG_STEP_CHARGING)
  1969. sec_step_charging_init(battery, dev);
  1970. #endif
  1971. ret = of_property_read_u32(np, "battery,max_charging_charge_power",
  1972. &pdata->max_charging_charge_power);
  1973. if (ret) {
  1974. pr_err("%s: max_charging_charge_power is Empty\n", __func__);
  1975. pdata->max_charging_charge_power = 25000;
  1976. }
  1977. ret = of_property_read_u32(np, "battery,apdo_max_volt",
  1978. &pdata->apdo_max_volt);
  1979. if (ret) {
  1980. pr_err("%s: apdo_max_volt is Empty\n", __func__);
  1981. pdata->apdo_max_volt = 11000; /* 11v */
  1982. }
  1983. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  1984. ret = of_property_read_string(np,
  1985. "battery,dual_battery_name", (char const **)&pdata->dual_battery_name);
  1986. if (ret)
  1987. pr_info("%s: Dual battery name is Empty\n", __func__);
  1988. np = of_find_node_by_name(NULL, "sec-dual-battery");
  1989. if (!np) {
  1990. pr_info("%s: np NULL\n", __func__);
  1991. } else {
  1992. /* zone1 current ratio, 0C ~ 0.4C */
  1993. ret = of_property_read_u32(np, "battery,zone1_limiter_current",
  1994. &pdata->zone1_limiter_current);
  1995. if (ret) {
  1996. pr_err("%s: zone1_limiter_current is Empty\n", __func__);
  1997. pdata->zone1_limiter_current = 100;
  1998. }
  1999. ret = of_property_read_u32(np, "battery,main_zone1_current_rate",
  2000. &pdata->main_zone1_current_rate);
  2001. if (ret) {
  2002. pr_err("%s: main_zone1_current_rate is Empty\n", __func__);
  2003. pdata->main_zone1_current_rate = 50;
  2004. }
  2005. ret = of_property_read_u32(np, "battery,sub_zone1_current_rate",
  2006. &pdata->sub_zone1_current_rate);
  2007. if (ret) {
  2008. pr_err("%s: sub_zone1_current_rate is Empty\n", __func__);
  2009. pdata->sub_zone1_current_rate = 60;
  2010. }
  2011. /* zone2 current ratio, 0.4C ~ 1.1C */
  2012. ret = of_property_read_u32(np, "battery,zone2_limiter_current",
  2013. &pdata->zone2_limiter_current);
  2014. if (ret) {
  2015. pr_err("%s: zone2_limiter_current is Empty\n", __func__);
  2016. pdata->zone2_limiter_current = 1200;
  2017. }
  2018. ret = of_property_read_u32(np, "battery,main_zone2_current_rate",
  2019. &pdata->main_zone2_current_rate);
  2020. if (ret) {
  2021. pr_err("%s: main_zone2_current_rate is Empty\n", __func__);
  2022. pdata->main_zone2_current_rate = 50;
  2023. }
  2024. ret = of_property_read_u32(np, "battery,sub_zone2_current_rate",
  2025. &pdata->sub_zone2_current_rate);
  2026. if (ret) {
  2027. pr_err("%s: sub_zone2_current_rate is Empty\n", __func__);
  2028. pdata->sub_zone2_current_rate = 60;
  2029. }
  2030. /* zone3 current ratio, 1.1C ~ MAX */
  2031. ret = of_property_read_u32(np, "battery,zone3_limiter_current",
  2032. &pdata->zone3_limiter_current);
  2033. if (ret) {
  2034. pr_err("%s: zone3_limiter_current is Empty\n", __func__);
  2035. pdata->zone3_limiter_current = 3000;
  2036. }
  2037. ret = of_property_read_u32(np, "battery,main_zone3_current_rate",
  2038. &pdata->main_zone3_current_rate);
  2039. if (ret) {
  2040. pr_err("%s: main_zone3_current_rate is Empty\n", __func__);
  2041. pdata->main_zone3_current_rate = pdata->main_zone2_current_rate;
  2042. }
  2043. ret = of_property_read_u32(np, "battery,sub_zone3_current_rate",
  2044. &pdata->sub_zone3_current_rate);
  2045. if (ret) {
  2046. pr_err("%s: sub_zone3_current_rate is Empty\n", __func__);
  2047. pdata->sub_zone3_current_rate = pdata->sub_zone2_current_rate;
  2048. }
  2049. ret = of_property_read_u32(np, "battery,force_recharge_margin",
  2050. &pdata->force_recharge_margin);
  2051. if (ret) {
  2052. pr_err("%s: force_recharge_margin is Empty\n", __func__);
  2053. pdata->force_recharge_margin = 150;
  2054. }
  2055. ret = of_property_read_u32(np, "battery,max_main_limiter_current",
  2056. &pdata->max_main_limiter_current);
  2057. if (ret) {
  2058. pr_err("%s: max_main_limiter_current is Empty\n", __func__);
  2059. pdata->max_main_limiter_current = 1550;
  2060. }
  2061. ret = of_property_read_u32(np, "battery,min_main_limiter_current",
  2062. &pdata->min_main_limiter_current);
  2063. if (ret) {
  2064. pr_err("%s: min_main_limiter_current is Empty\n", __func__);
  2065. pdata->min_main_limiter_current = 450;
  2066. }
  2067. ret = of_property_read_u32(np, "battery,max_sub_limiter_current",
  2068. &pdata->max_sub_limiter_current);
  2069. if (ret) {
  2070. pr_err("%s: max_sub_limiter_current is Empty\n", __func__);
  2071. pdata->max_sub_limiter_current = 1300;
  2072. }
  2073. ret = of_property_read_u32(np, "battery,min_sub_limiter_current",
  2074. &pdata->min_sub_limiter_current);
  2075. if (ret) {
  2076. pr_err("%s: min_sub_limiter_current is Empty\n", __func__);
  2077. pdata->min_sub_limiter_current = 450;
  2078. }
  2079. pdata->main_fto = of_property_read_bool(np, "battery,main_fto");
  2080. pdata->sub_fto = of_property_read_bool(np, "battery,sub_fto");
  2081. if (pdata->main_fto) {
  2082. ret = of_property_read_u32(np, "battery,main_fto_current_thresh",
  2083. &pdata->main_fto_current_thresh);
  2084. if (ret) {
  2085. pr_err("%s: main_fto_current_thresh is Empty\n", __func__);
  2086. pdata->main_fto_current_thresh = pdata->zone3_limiter_current;
  2087. }
  2088. }
  2089. if (pdata->sub_fto) {
  2090. ret = of_property_read_u32(np, "battery,sub_fto_current_thresh",
  2091. &pdata->sub_fto_current_thresh);
  2092. if (ret) {
  2093. pr_err("%s: sub_fto_current_thresh is Empty\n", __func__);
  2094. pdata->sub_fto_current_thresh = pdata->zone3_limiter_current;
  2095. }
  2096. }
  2097. pr_info("%s : main ratio:%d(zn1) %d(zn2) %d(zn3), sub ratio:%d(zn1) %d(zn2) %d(zn3), recharge marging:%d, "
  2098. "max main curr:%d, min main curr:%d, max sub curr:%d, min sub curr:%d, main_fto:%d, sub_fto:%d, "
  2099. "main_fto_curr:%d, sub_fto_curr:%d\n",
  2100. __func__, pdata->main_zone1_current_rate, pdata->main_zone2_current_rate, pdata->main_zone3_current_rate,
  2101. pdata->sub_zone1_current_rate, pdata->sub_zone2_current_rate, pdata->sub_zone3_current_rate,
  2102. pdata->force_recharge_margin, pdata->max_main_limiter_current, pdata->min_main_limiter_current,
  2103. pdata->max_sub_limiter_current, pdata->min_sub_limiter_current, pdata->main_fto, pdata->sub_fto,
  2104. pdata->main_fto_current_thresh, pdata->sub_fto_current_thresh);
  2105. ret = of_property_read_string(np, "battery,main_current_limiter",
  2106. (char const **)&battery->pdata->main_limiter_name);
  2107. if (ret)
  2108. pr_err("%s: main_current_limiter is Empty\n", __func__);
  2109. else {
  2110. np = of_find_node_by_name(NULL, battery->pdata->main_limiter_name);
  2111. if (!np) {
  2112. pr_info("%s: main_limiter_name is Empty\n", __func__);
  2113. } else {
  2114. /* MAIN_BATTERY_SW_EN */
  2115. ret = pdata->main_bat_enb_gpio = of_get_named_gpio(np, "limiter,main_bat_enb_gpio", 0);
  2116. if (ret < 0)
  2117. pr_info("%s : can't get main_bat_enb_gpio\n", __func__);
  2118. /* MAIN_BATTERY_SW_EN2 */
  2119. ret = pdata->main_bat_enb2_gpio = of_get_named_gpio(np, "limiter,main_bat_enb2_gpio", 0);
  2120. if (ret < 0)
  2121. pr_info("%s : can't get main_bat_enb2_gpio\n", __func__);
  2122. }
  2123. }
  2124. np = of_find_node_by_name(NULL, "sec-dual-battery");
  2125. ret = of_property_read_string(np, "battery,sub_current_limiter",
  2126. (char const **)&battery->pdata->sub_limiter_name);
  2127. if (ret)
  2128. pr_err("%s: sub_current_limiter is Empty\n", __func__);
  2129. else {
  2130. np = of_find_node_by_name(NULL, battery->pdata->sub_limiter_name);
  2131. if (!np) {
  2132. pr_info("%s: sub_limiter_name is Empty\n", __func__);
  2133. } else {
  2134. /* SUB_BATTERY_SW_EN */
  2135. ret = pdata->sub_bat_enb_gpio = of_get_named_gpio(np, "limiter,sub_bat_enb_gpio", 0);
  2136. if (ret < 0)
  2137. pr_info("%s : can't get sub_bat_enb_gpio\n", __func__);
  2138. }
  2139. }
  2140. }
  2141. np = of_find_node_by_name(NULL, "battery");
  2142. #if IS_ENABLED(CONFIG_DUAL_FUELGAUGE)
  2143. ret = of_property_read_string(np,
  2144. "battery,dual_fuelgauge_name", (char const **)&pdata->dual_fuelgauge_name);
  2145. if (ret)
  2146. pr_info("%s: Dual fuelgauge name is Empty\n", __func__);
  2147. np = of_find_node_by_name(NULL, "sec-dual-fuelgauge");
  2148. if (!np) {
  2149. pr_info("%s: np NULL\n", __func__);
  2150. } else {
  2151. ret = of_property_read_u32(np, "battery,main_design_capacity",
  2152. &pdata->main_design_capacity);
  2153. if (ret)
  2154. pr_err("%s: main_design_capacity is Empty\n", __func__);
  2155. ret = of_property_read_u32(np, "battery,sub_design_capacity",
  2156. &pdata->sub_design_capacity);
  2157. if (ret)
  2158. pr_err("%s: sub_design_capacity is Empty\n", __func__);
  2159. }
  2160. ret = of_property_read_string(np, "battery,main_fuelgauge_name",
  2161. (char const **)&battery->pdata->main_fuelgauge_name);
  2162. if (ret)
  2163. pr_err("%s: main_fuelgauge_name is Empty\n", __func__);
  2164. ret = of_property_read_string(np, "battery,sub_fuelgauge_name",
  2165. (char const **)&battery->pdata->sub_fuelgauge_name);
  2166. if (ret)
  2167. pr_err("%s: sub_fuelgauge_name is Empty\n", __func__);
  2168. np = of_find_node_by_name(NULL, "battery");
  2169. #endif
  2170. #endif
  2171. p = of_get_property(np, "battery,ignore_cisd_index", &len);
  2172. pdata->ignore_cisd_index = kzalloc(sizeof(*pdata->ignore_cisd_index) * 2, GFP_KERNEL);
  2173. if (p) {
  2174. len = len / sizeof(u32);
  2175. ret = of_property_read_u32_array(np, "battery,ignore_cisd_index",
  2176. pdata->ignore_cisd_index, len);
  2177. if (ret)
  2178. pr_err("%s failed to read ignore_cisd_index: %d\n",
  2179. __func__, ret);
  2180. } else {
  2181. pr_info("%s : battery,ignore_cisd_index is Empty\n", __func__);
  2182. }
  2183. p = of_get_property(np, "battery,ignore_cisd_index_d", &len);
  2184. pdata->ignore_cisd_index_d = kzalloc(sizeof(*pdata->ignore_cisd_index_d) * 2, GFP_KERNEL);
  2185. if (p) {
  2186. len = len / sizeof(u32);
  2187. ret = of_property_read_u32_array(np, "battery,ignore_cisd_index_d",
  2188. pdata->ignore_cisd_index_d, len);
  2189. if (ret)
  2190. pr_err("%s failed to read ignore_cisd_index_d: %d\n",
  2191. __func__, ret);
  2192. } else {
  2193. pr_info("%s : battery,ignore_cisd_index_d is Empty\n", __func__);
  2194. }
  2195. pdata->support_usb_conn_check = of_property_read_bool(np,
  2196. "battery,support_usb_conn_check");
  2197. pr_info("%s: support_usb_conn_check(%d)\n", __func__, pdata->support_usb_conn_check);
  2198. ret = of_property_read_u32(np, "battery,usb_conn_slope_avg",
  2199. &pdata->usb_conn_slope_avg);
  2200. if (ret) {
  2201. pdata->usb_conn_slope_avg = 9; /* 0.9 degrees */
  2202. pr_err("%s: usb_conn_slope_avg is default: %d\n", __func__, pdata->usb_conn_slope_avg);
  2203. }
  2204. pdata->support_spsn_ctrl = of_property_read_bool(np,
  2205. "battery,support_spsn_ctrl");
  2206. pr_info("%s: support_spsn_ctrl(%d)\n", __func__, pdata->support_spsn_ctrl);
  2207. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  2208. battery->disable_mfc = of_property_read_bool(np,
  2209. "battery,disable_mfc");
  2210. pr_info("%s: disable_mfc(%d)\n", __func__, battery->disable_mfc);
  2211. #endif
  2212. return 0;
  2213. }
  2214. EXPORT_SYMBOL(sec_bat_parse_dt);
  2215. void sec_bat_parse_mode_dt(struct sec_battery_info *battery)
  2216. {
  2217. struct device_node *np;
  2218. sec_battery_platform_data_t *pdata = battery->pdata;
  2219. int ret = 0;
  2220. u32 temp = 0;
  2221. np = of_find_node_by_name(NULL, "battery");
  2222. if (!np) {
  2223. pr_err("%s np NULL\n", __func__);
  2224. return;
  2225. }
  2226. if (battery->store_mode) {
  2227. ret = of_property_read_u32(np, "battery,store_mode_max_input_power",
  2228. &pdata->store_mode_max_input_power);
  2229. if (ret) {
  2230. pr_info("%s : store_mode_max_input_power is Empty\n", __func__);
  2231. pdata->store_mode_max_input_power = 4000;
  2232. }
  2233. if (pdata->wpc_thm_info.check_type) {
  2234. ret = of_property_read_u32(np, "battery,wpc_store_high_temp",
  2235. &temp);
  2236. if (!ret) {
  2237. pdata->wpc_high_temp = temp;
  2238. pdata->wpc_high_temp_12w = temp;
  2239. pdata->wpc_high_temp_15w = temp;
  2240. }
  2241. ret = of_property_read_u32(np, "battery,wpc_store_high_temp_recovery",
  2242. &temp);
  2243. if (!ret) {
  2244. pdata->wpc_high_temp_recovery = temp;
  2245. pdata->wpc_high_temp_recovery_12w = temp;
  2246. pdata->wpc_high_temp_recovery_15w = temp;
  2247. }
  2248. ret = of_property_read_u32(np, "battery,wpc_store_charging_limit_current",
  2249. &temp);
  2250. if (!ret)
  2251. pdata->wpc_input_limit_current = temp;
  2252. ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_high_temp",
  2253. &temp);
  2254. if (!ret) {
  2255. pdata->wpc_lcd_on_high_temp = (int)temp;
  2256. pdata->wpc_lcd_on_high_temp_12w = (int)temp;
  2257. pdata->wpc_lcd_on_high_temp_15w = (int)temp;
  2258. }
  2259. ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_high_temp_rec",
  2260. &temp);
  2261. if (!ret) {
  2262. pdata->wpc_lcd_on_high_temp_rec = (int)temp;
  2263. pdata->wpc_lcd_on_high_temp_rec_12w = (int)temp;
  2264. pdata->wpc_lcd_on_high_temp_rec_15w = (int)temp;
  2265. }
  2266. ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_charging_limit_current",
  2267. &temp);
  2268. if (!ret)
  2269. pdata->wpc_lcd_on_input_limit_current = (int)temp;
  2270. pr_info("%s: update store_mode - wpc high_temp(t:%d/%d/%d, r:%d/%d/%d), "
  2271. "lcd_on_high_temp(t:%d/%d%d, r:%d/%d/%d), curr(%d, %d)\n", __func__,
  2272. pdata->wpc_high_temp, pdata->wpc_high_temp_12w, pdata->wpc_high_temp_15w,
  2273. pdata->wpc_high_temp_recovery, pdata->wpc_high_temp_recovery_12w, pdata->wpc_high_temp_recovery_15w,
  2274. pdata->wpc_lcd_on_high_temp, pdata->wpc_lcd_on_high_temp_12w, pdata->wpc_lcd_on_high_temp_12w,
  2275. pdata->wpc_lcd_on_high_temp_rec, pdata->wpc_lcd_on_high_temp_rec_12w, pdata->wpc_lcd_on_high_temp_rec_12w,
  2276. pdata->wpc_input_limit_current, pdata->wpc_lcd_on_input_limit_current);
  2277. }
  2278. ret = of_property_read_u32(np, "battery,siop_store_hv_wpc_icl",
  2279. &temp);
  2280. if (!ret)
  2281. pdata->siop_hv_wpc_icl = temp;
  2282. else
  2283. pdata->siop_hv_wpc_icl = SIOP_STORE_HV_WIRELESS_CHARGING_LIMIT_CURRENT;
  2284. pr_info("%s: update siop_hv_wpc_icl(%d)\n",
  2285. __func__, pdata->siop_hv_wpc_icl);
  2286. pdata->store_mode_buckoff = of_property_read_bool(np, "battery,store_mode_buckoff");
  2287. pr_info("%s : battery,store_mode_buckoff: %d\n", __func__, pdata->store_mode_buckoff);
  2288. }
  2289. }
  2290. EXPORT_SYMBOL_KUNIT(sec_bat_parse_mode_dt);
  2291. void sec_bat_parse_mode_dt_work(struct work_struct *work)
  2292. {
  2293. struct sec_battery_info *battery = container_of(work,
  2294. struct sec_battery_info, parse_mode_dt_work.work);
  2295. sec_bat_parse_mode_dt(battery);
  2296. if (is_hv_wire_type(battery->cable_type) ||
  2297. is_hv_wireless_type(battery->cable_type))
  2298. sec_bat_set_charging_current(battery);
  2299. __pm_relax(battery->parse_mode_dt_ws);
  2300. }
  2301. EXPORT_SYMBOL(sec_bat_parse_mode_dt_work);
  2302. #endif