qpnp-smb5.c 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/debugfs.h>
  7. #include <linux/delay.h>
  8. #include <linux/device.h>
  9. #include <linux/module.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/regmap.h>
  12. #include <linux/power_supply.h>
  13. #include <linux/of.h>
  14. #include <linux/of_device.h>
  15. #include <linux/of_irq.h>
  16. #include <linux/log2.h>
  17. #include <linux/regulator/driver.h>
  18. #include <linux/regulator/of_regulator.h>
  19. #include <linux/regulator/machine.h>
  20. #include <linux/iio/consumer.h>
  21. #include <linux/pmic-voter.h>
  22. #include <linux/usb/typec.h>
  23. #include "smb5-reg.h"
  24. #include "smb5-lib.h"
  25. #include "smb5-iio.h"
  26. #include "schgm-flash.h"
  27. static struct smb_params smb5_pmi632_params = {
  28. .fcc = {
  29. .name = "fast charge current",
  30. .reg = CHGR_FAST_CHARGE_CURRENT_CFG_REG,
  31. .min_u = 0,
  32. .max_u = 3000000,
  33. .step_u = 50000,
  34. },
  35. .fv = {
  36. .name = "float voltage",
  37. .reg = CHGR_FLOAT_VOLTAGE_CFG_REG,
  38. .min_u = 3600000,
  39. .max_u = 4800000,
  40. .step_u = 10000,
  41. },
  42. .usb_icl = {
  43. .name = "usb input current limit",
  44. .reg = USBIN_CURRENT_LIMIT_CFG_REG,
  45. .min_u = 0,
  46. .max_u = 3000000,
  47. .step_u = 50000,
  48. },
  49. .icl_max_stat = {
  50. .name = "dcdc icl max status",
  51. .reg = ICL_MAX_STATUS_REG,
  52. .min_u = 0,
  53. .max_u = 3000000,
  54. .step_u = 50000,
  55. },
  56. .icl_stat = {
  57. .name = "input current limit status",
  58. .reg = ICL_STATUS_REG,
  59. .min_u = 0,
  60. .max_u = 3000000,
  61. .step_u = 50000,
  62. },
  63. .otg_cl = {
  64. .name = "usb otg current limit",
  65. .reg = DCDC_OTG_CURRENT_LIMIT_CFG_REG,
  66. .min_u = 500000,
  67. .max_u = 1000000,
  68. .step_u = 250000,
  69. },
  70. .jeita_cc_comp_hot = {
  71. .name = "jeita fcc reduction",
  72. .reg = JEITA_CCCOMP_CFG_HOT_REG,
  73. .min_u = 0,
  74. .max_u = 1575000,
  75. .step_u = 25000,
  76. },
  77. .jeita_cc_comp_cold = {
  78. .name = "jeita fcc reduction",
  79. .reg = JEITA_CCCOMP_CFG_COLD_REG,
  80. .min_u = 0,
  81. .max_u = 1575000,
  82. .step_u = 25000,
  83. },
  84. .freq_switcher = {
  85. .name = "switching frequency",
  86. .reg = DCDC_FSW_SEL_REG,
  87. .min_u = 600,
  88. .max_u = 1200,
  89. .step_u = 400,
  90. .set_proc = smblib_set_chg_freq,
  91. },
  92. .aicl_5v_threshold = {
  93. .name = "AICL 5V threshold",
  94. .reg = USBIN_5V_AICL_THRESHOLD_REG,
  95. .min_u = 4000,
  96. .max_u = 4700,
  97. .step_u = 100,
  98. },
  99. .aicl_cont_threshold = {
  100. .name = "AICL CONT threshold",
  101. .reg = USBIN_CONT_AICL_THRESHOLD_REG,
  102. .min_u = 4000,
  103. .max_u = 8800,
  104. .step_u = 100,
  105. .get_proc = smblib_get_aicl_cont_threshold,
  106. .set_proc = smblib_set_aicl_cont_threshold,
  107. },
  108. };
  109. static struct smb_params smb5_pm8150b_params = {
  110. .fcc = {
  111. .name = "fast charge current",
  112. .reg = CHGR_FAST_CHARGE_CURRENT_CFG_REG,
  113. .min_u = 0,
  114. .max_u = 8000000,
  115. .step_u = 50000,
  116. },
  117. .fv = {
  118. .name = "float voltage",
  119. .reg = CHGR_FLOAT_VOLTAGE_CFG_REG,
  120. .min_u = 3600000,
  121. .max_u = 4790000,
  122. .step_u = 10000,
  123. },
  124. .usb_icl = {
  125. .name = "usb input current limit",
  126. .reg = USBIN_CURRENT_LIMIT_CFG_REG,
  127. .min_u = 0,
  128. .max_u = 5000000,
  129. .step_u = 50000,
  130. },
  131. .icl_max_stat = {
  132. .name = "dcdc icl max status",
  133. .reg = ICL_MAX_STATUS_REG,
  134. .min_u = 0,
  135. .max_u = 5000000,
  136. .step_u = 50000,
  137. },
  138. .icl_stat = {
  139. .name = "aicl icl status",
  140. .reg = AICL_ICL_STATUS_REG,
  141. .min_u = 0,
  142. .max_u = 5000000,
  143. .step_u = 50000,
  144. },
  145. .otg_cl = {
  146. .name = "usb otg current limit",
  147. .reg = DCDC_OTG_CURRENT_LIMIT_CFG_REG,
  148. .min_u = 500000,
  149. .max_u = 3000000,
  150. .step_u = 500000,
  151. },
  152. .dc_icl = {
  153. .name = "DC input current limit",
  154. .reg = DCDC_CFG_REF_MAX_PSNS_REG,
  155. .min_u = 0,
  156. .max_u = DCIN_ICL_MAX_UA,
  157. .step_u = 50000,
  158. },
  159. .jeita_cc_comp_hot = {
  160. .name = "jeita fcc reduction",
  161. .reg = JEITA_CCCOMP_CFG_HOT_REG,
  162. .min_u = 0,
  163. .max_u = 8000000,
  164. .step_u = 25000,
  165. .set_proc = NULL,
  166. },
  167. .jeita_cc_comp_cold = {
  168. .name = "jeita fcc reduction",
  169. .reg = JEITA_CCCOMP_CFG_COLD_REG,
  170. .min_u = 0,
  171. .max_u = 8000000,
  172. .step_u = 25000,
  173. .set_proc = NULL,
  174. },
  175. .freq_switcher = {
  176. .name = "switching frequency",
  177. .reg = DCDC_FSW_SEL_REG,
  178. .min_u = 600,
  179. .max_u = 1200,
  180. .step_u = 400,
  181. .set_proc = smblib_set_chg_freq,
  182. },
  183. .aicl_5v_threshold = {
  184. .name = "AICL 5V threshold",
  185. .reg = USBIN_5V_AICL_THRESHOLD_REG,
  186. .min_u = 4000,
  187. .max_u = 4700,
  188. .step_u = 100,
  189. },
  190. .aicl_cont_threshold = {
  191. .name = "AICL CONT threshold",
  192. .reg = USBIN_CONT_AICL_THRESHOLD_REG,
  193. .min_u = 4000,
  194. .max_u = 11800,
  195. .step_u = 100,
  196. .get_proc = smblib_get_aicl_cont_threshold,
  197. .set_proc = smblib_set_aicl_cont_threshold,
  198. },
  199. };
  200. struct smb_dt_props {
  201. int usb_icl_ua;
  202. enum float_options float_option;
  203. int chg_inhibit_thr_mv;
  204. bool no_battery;
  205. bool hvdcp_disable;
  206. bool hvdcp_autonomous;
  207. bool adc_based_aicl;
  208. int sec_charger_config;
  209. int auto_recharge_soc;
  210. int auto_recharge_vbat_mv;
  211. int wd_bark_time;
  212. int wd_snarl_time_cfg;
  213. int batt_profile_fcc_ua;
  214. int batt_profile_fv_uv;
  215. int term_current_src;
  216. int term_current_thresh_hi_ma;
  217. int term_current_thresh_lo_ma;
  218. };
  219. struct smb5 {
  220. struct smb_charger chg;
  221. struct dentry *dfs_root;
  222. struct smb_dt_props dt;
  223. unsigned int nchannels;
  224. struct iio_channel *iio_chans;
  225. struct iio_chan_spec *iio_chan_ids;
  226. };
  227. static int __debug_mask;
  228. static ssize_t pd_disabled_show(struct device *dev, struct device_attribute
  229. *attr, char *buf)
  230. {
  231. struct smb5 *chip = dev_get_drvdata(dev);
  232. struct smb_charger *chg = &chip->chg;
  233. return scnprintf(buf, PAGE_SIZE, "%d\n", chg->pd_disabled);
  234. }
  235. static ssize_t pd_disabled_store(struct device *dev, struct device_attribute
  236. *attr, const char *buf, size_t count)
  237. {
  238. int val;
  239. struct smb5 *chip = dev_get_drvdata(dev);
  240. struct smb_charger *chg = &chip->chg;
  241. if (kstrtos32(buf, 0, &val))
  242. return -EINVAL;
  243. chg->pd_disabled = val;
  244. return count;
  245. }
  246. static DEVICE_ATTR_RW(pd_disabled);
  247. static ssize_t weak_chg_icl_ua_show(struct device *dev, struct device_attribute
  248. *attr, char *buf)
  249. {
  250. struct smb5 *chip = dev_get_drvdata(dev);
  251. struct smb_charger *chg = &chip->chg;
  252. return scnprintf(buf, PAGE_SIZE, "%d\n", chg->weak_chg_icl_ua);
  253. }
  254. static ssize_t weak_chg_icl_ua_store(struct device *dev, struct device_attribute
  255. *attr, const char *buf, size_t count)
  256. {
  257. int val;
  258. struct smb5 *chip = dev_get_drvdata(dev);
  259. struct smb_charger *chg = &chip->chg;
  260. if (kstrtos32(buf, 0, &val))
  261. return -EINVAL;
  262. chg->weak_chg_icl_ua = val;
  263. return count;
  264. }
  265. static DEVICE_ATTR_RW(weak_chg_icl_ua);
  266. static struct attribute *smb5_attrs[] = {
  267. &dev_attr_pd_disabled.attr,
  268. &dev_attr_weak_chg_icl_ua.attr,
  269. NULL,
  270. };
  271. ATTRIBUTE_GROUPS(smb5);
  272. enum {
  273. BAT_THERM = 0,
  274. MISC_THERM,
  275. CONN_THERM,
  276. SMB_THERM,
  277. };
  278. static const struct clamp_config clamp_levels[] = {
  279. { {0x11C6, 0x11F9, 0x13F1}, {0x60, 0x2E, 0x90} },
  280. { {0x11C6, 0x11F9, 0x13F1}, {0x60, 0x2B, 0x9C} },
  281. };
  282. #define PMI632_MAX_ICL_UA 3000000
  283. #define PM6150_MAX_FCC_UA 3000000
  284. static int smb5_chg_config_init(struct smb5 *chip)
  285. {
  286. struct smb_charger *chg = &chip->chg;
  287. struct device_node *node = chg->dev->of_node;
  288. int subtype = (u8)(unsigned long)of_device_get_match_data(chg->dev);
  289. switch (subtype) {
  290. case PM8150B:
  291. chip->chg.chg_param.smb_version = PM8150B;
  292. chg->param = smb5_pm8150b_params;
  293. chg->name = "pm8150b_charger";
  294. chg->wa_flags |= CHG_TERMINATION_WA;
  295. break;
  296. case PM7250B:
  297. chip->chg.chg_param.smb_version = PM7250B;
  298. chg->param = smb5_pm8150b_params;
  299. chg->name = "pm7250b_charger";
  300. chg->wa_flags |= CHG_TERMINATION_WA;
  301. chg->uusb_moisture_protection_capable = true;
  302. break;
  303. case PM6150:
  304. chip->chg.chg_param.smb_version = PM6150;
  305. chg->param = smb5_pm8150b_params;
  306. chg->name = "pm6150_charger";
  307. chg->wa_flags |= SW_THERM_REGULATION_WA | CHG_TERMINATION_WA;
  308. chg->uusb_moisture_protection_capable = true;
  309. chg->main_fcc_max = PM6150_MAX_FCC_UA;
  310. break;
  311. case PMI632:
  312. chip->chg.chg_param.smb_version = PMI632;
  313. chg->wa_flags |= WEAK_ADAPTER_WA | USBIN_OV_WA
  314. | CHG_TERMINATION_WA | USBIN_ADC_WA
  315. | SKIP_MISC_PBS_IRQ_WA;
  316. chg->param = smb5_pmi632_params;
  317. chg->use_extcon = true;
  318. chg->name = "pmi632_charger";
  319. /* PMI632 does not support PD */
  320. chg->pd_not_supported = true;
  321. chg->lpd_disabled = true;
  322. chg->uusb_moisture_protection_enabled = true;
  323. chg->hw_max_icl_ua =
  324. (chip->dt.usb_icl_ua > 0) ? chip->dt.usb_icl_ua
  325. : PMI632_MAX_ICL_UA;
  326. break;
  327. default:
  328. pr_err("PMIC subtype %d not supported\n", subtype);
  329. return -EINVAL;
  330. }
  331. chg->chg_freq.freq_5V = 600;
  332. chg->chg_freq.freq_6V_8V = 800;
  333. chg->chg_freq.freq_9V = 1050;
  334. chg->chg_freq.freq_12V = 1200;
  335. chg->chg_freq.freq_removal = 1050;
  336. chg->chg_freq.freq_below_otg_threshold = 800;
  337. chg->chg_freq.freq_above_otg_threshold = 800;
  338. if (of_property_read_bool(node, "qcom,disable-sw-thermal-regulation"))
  339. chg->wa_flags &= ~SW_THERM_REGULATION_WA;
  340. if (of_property_read_bool(node, "qcom,disable-fcc-restriction"))
  341. chg->main_fcc_max = -EINVAL;
  342. return 0;
  343. }
  344. #define PULL_NO_PULL 0
  345. #define PULL_30K 30
  346. #define PULL_100K 100
  347. #define PULL_400K 400
  348. static int get_valid_pullup(int pull_up)
  349. {
  350. /* pull up can only be 0/30K/100K/400K) */
  351. switch (pull_up) {
  352. case PULL_NO_PULL:
  353. return INTERNAL_PULL_NO_PULL;
  354. case PULL_30K:
  355. return INTERNAL_PULL_30K_PULL;
  356. case PULL_100K:
  357. return INTERNAL_PULL_100K_PULL;
  358. case PULL_400K:
  359. return INTERNAL_PULL_400K_PULL;
  360. default:
  361. return INTERNAL_PULL_100K_PULL;
  362. }
  363. }
  364. #define INTERNAL_PULL_UP_MASK 0x3
  365. static int smb5_configure_internal_pull(struct smb_charger *chg, int type,
  366. int pull)
  367. {
  368. int rc;
  369. int shift = type * 2;
  370. u8 mask = INTERNAL_PULL_UP_MASK << shift;
  371. u8 val = pull << shift;
  372. rc = smblib_masked_write(chg, BATIF_ADC_INTERNAL_PULL_UP_REG,
  373. mask, val);
  374. if (rc < 0)
  375. dev_err(chg->dev,
  376. "Couldn't configure ADC pull-up reg rc=%d\n", rc);
  377. return rc;
  378. }
  379. #define MICRO_1P5A 1500000
  380. #define MICRO_P1A 100000
  381. #define MICRO_1PA 1000000
  382. #define MICRO_3PA 3000000
  383. #define MICRO_4PA 4000000
  384. #define OTG_DEFAULT_DEGLITCH_TIME_MS 50
  385. #define DEFAULT_WD_BARK_TIME 64
  386. #define DEFAULT_WD_SNARL_TIME_8S 0x07
  387. #define DEFAULT_FCC_STEP_SIZE_UA 100000
  388. #define DEFAULT_FCC_STEP_UPDATE_DELAY_MS 1000
  389. static int smb5_parse_dt_misc(struct smb5 *chip, struct device_node *node)
  390. {
  391. int rc = 0, byte_len;
  392. struct smb_charger *chg = &chip->chg;
  393. of_property_read_u32(node, "qcom,sec-charger-config",
  394. &chip->dt.sec_charger_config);
  395. chg->sec_cp_present =
  396. chip->dt.sec_charger_config ==
  397. QTI_POWER_SUPPLY_CHARGER_SEC_CP ||
  398. chip->dt.sec_charger_config ==
  399. QTI_POWER_SUPPLY_CHARGER_SEC_CP_PL;
  400. chg->sec_pl_present =
  401. chip->dt.sec_charger_config ==
  402. QTI_POWER_SUPPLY_CHARGER_SEC_PL ||
  403. chip->dt.sec_charger_config ==
  404. QTI_POWER_SUPPLY_CHARGER_SEC_CP_PL;
  405. chg->step_chg_enabled = of_property_read_bool(node,
  406. "qcom,step-charging-enable");
  407. chg->typec_legacy_use_rp_icl = of_property_read_bool(node,
  408. "qcom,typec-legacy-rp-icl");
  409. chg->sw_jeita_enabled = of_property_read_bool(node,
  410. "qcom,sw-jeita-enable");
  411. chg->jeita_arb_enable = of_property_read_bool(node,
  412. "qcom,jeita-arb-enable");
  413. chg->pd_not_supported = chg->pd_not_supported ||
  414. of_property_read_bool(node, "qcom,usb-pd-disable");
  415. chg->lpd_disabled = chg->lpd_disabled ||
  416. of_property_read_bool(node, "qcom,lpd-disable");
  417. rc = of_property_read_u32(node, "qcom,wd-bark-time-secs",
  418. &chip->dt.wd_bark_time);
  419. if (rc < 0 || chip->dt.wd_bark_time < MIN_WD_BARK_TIME)
  420. chip->dt.wd_bark_time = DEFAULT_WD_BARK_TIME;
  421. rc = of_property_read_u32(node, "qcom,wd-snarl-time-config",
  422. &chip->dt.wd_snarl_time_cfg);
  423. if (rc < 0)
  424. chip->dt.wd_snarl_time_cfg = DEFAULT_WD_SNARL_TIME_8S;
  425. chip->dt.no_battery = of_property_read_bool(node,
  426. "qcom,batteryless-platform");
  427. if (of_find_property(node, "qcom,thermal-mitigation", &byte_len)) {
  428. chg->thermal_mitigation = devm_kzalloc(chg->dev, byte_len,
  429. GFP_KERNEL);
  430. if (chg->thermal_mitigation == NULL)
  431. return -ENOMEM;
  432. chg->thermal_levels = byte_len / sizeof(u32);
  433. rc = of_property_read_u32_array(node,
  434. "qcom,thermal-mitigation",
  435. chg->thermal_mitigation,
  436. chg->thermal_levels);
  437. if (rc < 0) {
  438. dev_err(chg->dev,
  439. "Couldn't read threm limits rc = %d\n", rc);
  440. return rc;
  441. }
  442. }
  443. rc = of_property_read_u32(node, "qcom,charger-temp-max",
  444. &chg->charger_temp_max);
  445. if (rc < 0)
  446. chg->charger_temp_max = -EINVAL;
  447. rc = of_property_read_u32(node, "qcom,smb-temp-max",
  448. &chg->smb_temp_max);
  449. if (rc < 0)
  450. chg->smb_temp_max = -EINVAL;
  451. rc = of_property_read_u32(node, "qcom,float-option",
  452. &chip->dt.float_option);
  453. if (!rc && (chip->dt.float_option < 0 || chip->dt.float_option > 4)) {
  454. pr_err("qcom,float-option is out of range [0, 4]\n");
  455. return -EINVAL;
  456. }
  457. chip->dt.hvdcp_disable = of_property_read_bool(node,
  458. "qcom,hvdcp-disable");
  459. chg->hvdcp_disable = chip->dt.hvdcp_disable;
  460. chip->dt.hvdcp_autonomous = of_property_read_bool(node,
  461. "qcom,hvdcp-autonomous-enable");
  462. chip->dt.auto_recharge_soc = -EINVAL;
  463. rc = of_property_read_u32(node, "qcom,auto-recharge-soc",
  464. &chip->dt.auto_recharge_soc);
  465. if (!rc && (chip->dt.auto_recharge_soc < 0 ||
  466. chip->dt.auto_recharge_soc > 100)) {
  467. pr_err("qcom,auto-recharge-soc is incorrect\n");
  468. return -EINVAL;
  469. }
  470. chg->auto_recharge_soc = chip->dt.auto_recharge_soc;
  471. chg->suspend_input_on_debug_batt = of_property_read_bool(node,
  472. "qcom,suspend-input-on-debug-batt");
  473. chg->fake_chg_status_on_debug_batt = of_property_read_bool(node,
  474. "qcom,fake-chg-status-on-debug-batt");
  475. rc = of_property_read_u32(node, "qcom,otg-deglitch-time-ms",
  476. &chg->otg_delay_ms);
  477. if (rc < 0)
  478. chg->otg_delay_ms = OTG_DEFAULT_DEGLITCH_TIME_MS;
  479. chg->fcc_stepper_enable = of_property_read_bool(node,
  480. "qcom,fcc-stepping-enable");
  481. if (chg->uusb_moisture_protection_capable)
  482. chg->uusb_moisture_protection_enabled =
  483. of_property_read_bool(node,
  484. "qcom,uusb-moisture-protection-enable");
  485. chg->hw_die_temp_mitigation = of_property_read_bool(node,
  486. "qcom,hw-die-temp-mitigation");
  487. chg->hw_connector_mitigation = of_property_read_bool(node,
  488. "qcom,hw-connector-mitigation");
  489. chg->hw_skin_temp_mitigation = of_property_read_bool(node,
  490. "qcom,hw-skin-temp-mitigation");
  491. chg->en_skin_therm_mitigation = of_property_read_bool(node,
  492. "qcom,en-skin-therm-mitigation");
  493. chg->connector_pull_up = -EINVAL;
  494. of_property_read_u32(node, "qcom,connector-internal-pull-kohm",
  495. &chg->connector_pull_up);
  496. chg->disable_suspend_on_collapse = of_property_read_bool(node,
  497. "qcom,disable-suspend-on-collapse");
  498. chg->smb_pull_up = -EINVAL;
  499. of_property_read_u32(node, "qcom,smb-internal-pull-kohm",
  500. &chg->smb_pull_up);
  501. chip->dt.adc_based_aicl = of_property_read_bool(node,
  502. "qcom,adc-based-aicl");
  503. of_property_read_u32(node, "qcom,fcc-step-delay-ms",
  504. &chg->chg_param.fcc_step_delay_ms);
  505. if (chg->chg_param.fcc_step_delay_ms <= 0)
  506. chg->chg_param.fcc_step_delay_ms =
  507. DEFAULT_FCC_STEP_UPDATE_DELAY_MS;
  508. of_property_read_u32(node, "qcom,fcc-step-size-ua",
  509. &chg->chg_param.fcc_step_size_ua);
  510. if (chg->chg_param.fcc_step_size_ua <= 0)
  511. chg->chg_param.fcc_step_size_ua = DEFAULT_FCC_STEP_SIZE_UA;
  512. /*
  513. * If property is present parallel charging with CP is disabled
  514. * with HVDCP3 adapter.
  515. */
  516. chg->hvdcp3_standalone_config = of_property_read_bool(node,
  517. "qcom,hvdcp3-standalone-config");
  518. of_property_read_u32(node, "qcom,hvdcp3-max-icl-ua",
  519. &chg->chg_param.hvdcp3_max_icl_ua);
  520. if (chg->chg_param.hvdcp3_max_icl_ua <= 0)
  521. chg->chg_param.hvdcp3_max_icl_ua = MICRO_3PA;
  522. of_property_read_u32(node, "qcom,hvdcp2-max-icl-ua",
  523. &chg->chg_param.hvdcp2_max_icl_ua);
  524. if (chg->chg_param.hvdcp2_max_icl_ua <= 0)
  525. chg->chg_param.hvdcp2_max_icl_ua = MICRO_3PA;
  526. /* Used only in Adapter CV mode of operation */
  527. of_property_read_u32(node, "qcom,qc4-max-icl-ua",
  528. &chg->chg_param.qc4_max_icl_ua);
  529. if (chg->chg_param.qc4_max_icl_ua <= 0)
  530. chg->chg_param.qc4_max_icl_ua = MICRO_4PA;
  531. return 0;
  532. }
  533. static int smb5_parse_dt_adc_channels(struct smb_charger *chg)
  534. {
  535. int rc = 0;
  536. rc = smblib_get_iio_channel(chg, "mid_voltage", &chg->iio.mid_chan);
  537. if (rc < 0)
  538. return rc;
  539. rc = smblib_get_iio_channel(chg, "usb_in_voltage",
  540. &chg->iio.usbin_v_chan);
  541. if (rc < 0)
  542. return rc;
  543. rc = smblib_get_iio_channel(chg, "chg_temp", &chg->iio.temp_chan);
  544. if (rc < 0)
  545. return rc;
  546. rc = smblib_get_iio_channel(chg, "usb_in_current",
  547. &chg->iio.usbin_i_chan);
  548. if (rc < 0)
  549. return rc;
  550. rc = smblib_get_iio_channel(chg, "sbux_res", &chg->iio.sbux_chan);
  551. if (rc < 0)
  552. return rc;
  553. rc = smblib_get_iio_channel(chg, "vph_voltage", &chg->iio.vph_v_chan);
  554. if (rc < 0)
  555. return rc;
  556. rc = smblib_get_iio_channel(chg, "die_temp", &chg->iio.die_temp_chan);
  557. if (rc < 0)
  558. return rc;
  559. rc = smblib_get_iio_channel(chg, "conn_temp",
  560. &chg->iio.connector_temp_chan);
  561. if (rc < 0)
  562. return rc;
  563. rc = smblib_get_iio_channel(chg, "skin_temp", &chg->iio.skin_temp_chan);
  564. if (rc < 0)
  565. return rc;
  566. rc = smblib_get_iio_channel(chg, "smb_temp", &chg->iio.smb_temp_chan);
  567. if (rc < 0)
  568. return rc;
  569. return 0;
  570. }
  571. static int smb5_parse_dt_currents(struct smb5 *chip, struct device_node *node)
  572. {
  573. int rc = 0, tmp;
  574. struct smb_charger *chg = &chip->chg;
  575. rc = of_property_read_u32(node,
  576. "qcom,fcc-max-ua", &chip->dt.batt_profile_fcc_ua);
  577. if (rc < 0)
  578. chip->dt.batt_profile_fcc_ua = -EINVAL;
  579. rc = of_property_read_u32(node,
  580. "qcom,usb-icl-ua", &chip->dt.usb_icl_ua);
  581. if (rc < 0)
  582. chip->dt.usb_icl_ua = -EINVAL;
  583. chg->dcp_icl_ua = chip->dt.usb_icl_ua;
  584. rc = of_property_read_u32(node,
  585. "qcom,otg-cl-ua", &chg->otg_cl_ua);
  586. if (rc < 0)
  587. chg->otg_cl_ua =
  588. (chip->chg.chg_param.smb_version == PMI632) ?
  589. MICRO_1PA : MICRO_3PA;
  590. rc = of_property_read_u32(node, "qcom,chg-term-src",
  591. &chip->dt.term_current_src);
  592. if (rc < 0)
  593. chip->dt.term_current_src = ITERM_SRC_UNSPECIFIED;
  594. if (chip->dt.term_current_src == ITERM_SRC_ADC)
  595. rc = of_property_read_u32(node, "qcom,chg-term-base-current-ma",
  596. &chip->dt.term_current_thresh_lo_ma);
  597. rc = of_property_read_u32(node, "qcom,chg-term-current-ma",
  598. &chip->dt.term_current_thresh_hi_ma);
  599. chg->wls_icl_ua = DCIN_ICL_MAX_UA;
  600. rc = of_property_read_u32(node, "qcom,wls-current-max-ua",
  601. &tmp);
  602. if (!rc && tmp < DCIN_ICL_MAX_UA)
  603. chg->wls_icl_ua = tmp;
  604. return 0;
  605. }
  606. static int smb5_parse_dt_voltages(struct smb5 *chip, struct device_node *node)
  607. {
  608. int rc = 0;
  609. rc = of_property_read_u32(node,
  610. "qcom,fv-max-uv", &chip->dt.batt_profile_fv_uv);
  611. if (rc < 0)
  612. chip->dt.batt_profile_fv_uv = -EINVAL;
  613. rc = of_property_read_u32(node, "qcom,chg-inhibit-threshold-mv",
  614. &chip->dt.chg_inhibit_thr_mv);
  615. if (!rc && (chip->dt.chg_inhibit_thr_mv < 0 ||
  616. chip->dt.chg_inhibit_thr_mv > 300)) {
  617. pr_err("qcom,chg-inhibit-threshold-mv is incorrect\n");
  618. return -EINVAL;
  619. }
  620. chip->dt.auto_recharge_vbat_mv = -EINVAL;
  621. rc = of_property_read_u32(node, "qcom,auto-recharge-vbat-mv",
  622. &chip->dt.auto_recharge_vbat_mv);
  623. if (!rc && (chip->dt.auto_recharge_vbat_mv < 0)) {
  624. pr_err("qcom,auto-recharge-vbat-mv is incorrect\n");
  625. return -EINVAL;
  626. }
  627. return 0;
  628. }
  629. static int smb5_parse_sdam(struct smb5 *chip, struct device_node *node)
  630. {
  631. struct device_node *child;
  632. struct smb_charger *chg = &chip->chg;
  633. struct property *prop;
  634. const char *name;
  635. int rc;
  636. u32 base;
  637. u8 type;
  638. for_each_available_child_of_node(node, child) {
  639. of_property_for_each_string(child, "reg", prop, name) {
  640. rc = of_property_read_u32(child, "reg", &base);
  641. if (rc < 0) {
  642. pr_err("Failed to read base rc=%d\n", rc);
  643. return rc;
  644. }
  645. rc = smblib_read(chg, base + PERPH_TYPE_OFFSET, &type);
  646. if (rc < 0) {
  647. pr_err("Failed to read type rc=%d\n", rc);
  648. return rc;
  649. }
  650. switch (type) {
  651. case SDAM_TYPE:
  652. chg->sdam_base = base;
  653. break;
  654. default:
  655. break;
  656. }
  657. }
  658. }
  659. if (!chg->sdam_base)
  660. pr_debug("SDAM node not defined\n");
  661. return 0;
  662. }
  663. static int smb5_parse_dt(struct smb5 *chip)
  664. {
  665. struct smb_charger *chg = &chip->chg;
  666. struct device_node *node = chg->dev->of_node;
  667. int rc = 0;
  668. if (!node) {
  669. pr_err("device tree node missing\n");
  670. return -EINVAL;
  671. }
  672. rc = smb5_parse_dt_voltages(chip, node);
  673. if (rc < 0)
  674. return rc;
  675. rc = smb5_parse_dt_currents(chip, node);
  676. if (rc < 0)
  677. return rc;
  678. rc = smb5_parse_dt_adc_channels(chg);
  679. if (rc < 0)
  680. return rc;
  681. rc = smb5_parse_dt_misc(chip, node);
  682. if (rc < 0)
  683. return rc;
  684. rc = smb5_parse_sdam(chip, node);
  685. if (rc < 0)
  686. return rc;
  687. return 0;
  688. }
  689. int smb5_set_prop_comp_clamp_level(struct smb_charger *chg,
  690. int val)
  691. {
  692. int rc = 0, i;
  693. struct clamp_config clamp_config;
  694. enum comp_clamp_levels level;
  695. level = val;
  696. if (level >= MAX_CLAMP_LEVEL) {
  697. pr_err("Invalid comp clamp level=%d\n", val);
  698. return -EINVAL;
  699. }
  700. for (i = 0; i < ARRAY_SIZE(clamp_config.reg); i++) {
  701. rc = smblib_write(chg, clamp_levels[level].reg[i],
  702. clamp_levels[level].val[i]);
  703. if (rc < 0)
  704. dev_err(chg->dev,
  705. "Failed to configure comp clamp settings for reg=0x%04x rc=%d\n",
  706. clamp_levels[level].reg[i], rc);
  707. }
  708. chg->comp_clamp_level = val;
  709. return rc;
  710. }
  711. /************************
  712. * USB PSY REGISTRATION *
  713. ************************/
  714. static enum power_supply_property smb5_usb_props[] = {
  715. POWER_SUPPLY_PROP_PRESENT,
  716. POWER_SUPPLY_PROP_ONLINE,
  717. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  718. POWER_SUPPLY_PROP_CURRENT_NOW,
  719. POWER_SUPPLY_PROP_CURRENT_MAX,
  720. POWER_SUPPLY_PROP_TYPE,
  721. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  722. POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
  723. POWER_SUPPLY_PROP_SCOPE,
  724. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  725. POWER_SUPPLY_PROP_POWER_NOW,
  726. };
  727. static int smb5_usb_get_prop(struct power_supply *psy,
  728. enum power_supply_property psp,
  729. union power_supply_propval *val)
  730. {
  731. struct smb5 *chip = power_supply_get_drvdata(psy);
  732. struct smb_charger *chg = &chip->chg;
  733. int rc = 0;
  734. val->intval = 0;
  735. switch (psp) {
  736. case POWER_SUPPLY_PROP_PRESENT:
  737. rc = smblib_get_prop_usb_present(chg, val);
  738. break;
  739. case POWER_SUPPLY_PROP_ONLINE:
  740. rc = smblib_get_usb_online(chg, val);
  741. break;
  742. case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
  743. rc = smblib_get_prop_usb_voltage_max_design(chg, val);
  744. break;
  745. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  746. rc = smblib_get_prop_usb_voltage_max(chg, val);
  747. break;
  748. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  749. rc = smblib_get_prop_usb_voltage_now(chg, val);
  750. break;
  751. case POWER_SUPPLY_PROP_CURRENT_NOW:
  752. rc = smblib_get_prop_usb_current_now(chg, val);
  753. break;
  754. case POWER_SUPPLY_PROP_CURRENT_MAX:
  755. rc = smblib_get_prop_input_current_max(chg, val);
  756. break;
  757. case POWER_SUPPLY_PROP_TYPE:
  758. val->intval = POWER_SUPPLY_TYPE_USB_PD;
  759. break;
  760. case POWER_SUPPLY_PROP_SCOPE:
  761. rc = smblib_get_prop_scope(chg, val);
  762. break;
  763. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  764. /* USB uses this to set SDP current */
  765. val->intval = get_client_vote(chg->usb_icl_votable,
  766. USB_PSY_VOTER);
  767. break;
  768. case POWER_SUPPLY_PROP_POWER_NOW:
  769. /* Show power rating for QC3+ adapter. */
  770. if (chg->real_charger_type == QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5)
  771. val->intval = chg->qc3p5_detected_mw;
  772. else
  773. rc = -ENODATA;
  774. break;
  775. default:
  776. pr_err("get prop %d is not supported in usb\n", psp);
  777. rc = -EINVAL;
  778. break;
  779. }
  780. if (rc < 0) {
  781. pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
  782. return -ENODATA;
  783. }
  784. return 0;
  785. }
  786. static int smb5_usb_set_prop(struct power_supply *psy,
  787. enum power_supply_property psp,
  788. const union power_supply_propval *val)
  789. {
  790. struct smb5 *chip = power_supply_get_drvdata(psy);
  791. struct smb_charger *chg = &chip->chg;
  792. int rc = 0;
  793. switch (psp) {
  794. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  795. rc = smblib_set_prop_sdp_current_max(chg, val->intval);
  796. break;
  797. case POWER_SUPPLY_PROP_POWER_NOW:
  798. chg->qc3p5_detected_mw = val->intval;
  799. break;
  800. default:
  801. pr_err("Set prop %d is not supported in usb psy\n",
  802. psp);
  803. rc = -EINVAL;
  804. break;
  805. }
  806. return rc;
  807. }
  808. static int smb5_usb_prop_is_writeable(struct power_supply *psy,
  809. enum power_supply_property psp)
  810. {
  811. switch (psp) {
  812. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  813. fallthrough;
  814. case POWER_SUPPLY_PROP_POWER_NOW:
  815. return 1;
  816. default:
  817. break;
  818. }
  819. return 0;
  820. }
  821. static const struct power_supply_desc usb_psy_desc = {
  822. .name = "usb",
  823. .type = POWER_SUPPLY_TYPE_USB_PD,
  824. .properties = smb5_usb_props,
  825. .num_properties = ARRAY_SIZE(smb5_usb_props),
  826. .get_property = smb5_usb_get_prop,
  827. .set_property = smb5_usb_set_prop,
  828. .property_is_writeable = smb5_usb_prop_is_writeable,
  829. };
  830. static int smb5_init_usb_psy(struct smb5 *chip)
  831. {
  832. struct power_supply_config usb_cfg = {};
  833. struct smb_charger *chg = &chip->chg;
  834. usb_cfg.drv_data = chip;
  835. usb_cfg.of_node = chg->dev->of_node;
  836. chg->usb_psy = devm_power_supply_register(chg->dev,
  837. &usb_psy_desc,
  838. &usb_cfg);
  839. if (IS_ERR(chg->usb_psy)) {
  840. pr_err("Couldn't register USB power supply\n");
  841. return PTR_ERR(chg->usb_psy);
  842. }
  843. return 0;
  844. }
  845. /********************************
  846. * USB PC_PORT PSY REGISTRATION *
  847. ********************************/
  848. static enum power_supply_property smb5_usb_port_props[] = {
  849. POWER_SUPPLY_PROP_TYPE,
  850. POWER_SUPPLY_PROP_ONLINE,
  851. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  852. POWER_SUPPLY_PROP_CURRENT_MAX,
  853. };
  854. static int smb5_usb_port_get_prop(struct power_supply *psy,
  855. enum power_supply_property psp,
  856. union power_supply_propval *val)
  857. {
  858. struct smb5 *chip = power_supply_get_drvdata(psy);
  859. struct smb_charger *chg = &chip->chg;
  860. int rc = 0;
  861. switch (psp) {
  862. case POWER_SUPPLY_PROP_TYPE:
  863. val->intval = POWER_SUPPLY_TYPE_USB;
  864. break;
  865. case POWER_SUPPLY_PROP_ONLINE:
  866. rc = smblib_get_prop_usb_online(chg, val);
  867. if (!val->intval)
  868. break;
  869. if (((chg->typec_mode ==
  870. QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) ||
  871. (chg->connector_type ==
  872. QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB))
  873. && (chg->real_charger_type == POWER_SUPPLY_TYPE_USB))
  874. val->intval = 1;
  875. else
  876. val->intval = 0;
  877. break;
  878. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  879. val->intval = 5000000;
  880. break;
  881. case POWER_SUPPLY_PROP_CURRENT_MAX:
  882. rc = smblib_get_prop_input_current_settled(chg, val);
  883. break;
  884. default:
  885. pr_err_ratelimited("Get prop %d is not supported in pc_port\n",
  886. psp);
  887. return -EINVAL;
  888. }
  889. if (rc < 0) {
  890. pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
  891. return -ENODATA;
  892. }
  893. return 0;
  894. }
  895. static int smb5_usb_port_set_prop(struct power_supply *psy,
  896. enum power_supply_property psp,
  897. const union power_supply_propval *val)
  898. {
  899. int rc = 0;
  900. switch (psp) {
  901. default:
  902. pr_err_ratelimited("Set prop %d is not supported in pc_port\n",
  903. psp);
  904. rc = -EINVAL;
  905. break;
  906. }
  907. return rc;
  908. }
  909. static const struct power_supply_desc usb_port_psy_desc = {
  910. .name = "pc_port",
  911. .type = POWER_SUPPLY_TYPE_USB,
  912. .properties = smb5_usb_port_props,
  913. .num_properties = ARRAY_SIZE(smb5_usb_port_props),
  914. .get_property = smb5_usb_port_get_prop,
  915. .set_property = smb5_usb_port_set_prop,
  916. };
  917. static int smb5_init_usb_port_psy(struct smb5 *chip)
  918. {
  919. struct power_supply_config usb_port_cfg = {};
  920. struct smb_charger *chg = &chip->chg;
  921. usb_port_cfg.drv_data = chip;
  922. usb_port_cfg.of_node = chg->dev->of_node;
  923. chg->usb_port_psy = devm_power_supply_register(chg->dev,
  924. &usb_port_psy_desc,
  925. &usb_port_cfg);
  926. if (IS_ERR(chg->usb_port_psy)) {
  927. pr_err("Couldn't register USB pc_port power supply\n");
  928. return PTR_ERR(chg->usb_port_psy);
  929. }
  930. return 0;
  931. }
  932. /*************************
  933. * DC PSY REGISTRATION *
  934. *************************/
  935. static enum power_supply_property smb5_dc_props[] = {
  936. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  937. POWER_SUPPLY_PROP_PRESENT,
  938. POWER_SUPPLY_PROP_ONLINE,
  939. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  940. POWER_SUPPLY_PROP_CURRENT_MAX,
  941. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  942. };
  943. static int smb5_dc_get_prop(struct power_supply *psy,
  944. enum power_supply_property psp,
  945. union power_supply_propval *val)
  946. {
  947. struct smb5 *chip = power_supply_get_drvdata(psy);
  948. struct smb_charger *chg = &chip->chg;
  949. int rc = 0;
  950. switch (psp) {
  951. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  952. /* For DC, INPUT_CURRENT_LIMIT equates to INPUT_SUSPEND */
  953. val->intval = get_effective_result(chg->dc_suspend_votable);
  954. break;
  955. case POWER_SUPPLY_PROP_PRESENT:
  956. rc = smblib_get_prop_dc_present(chg, val);
  957. break;
  958. case POWER_SUPPLY_PROP_ONLINE:
  959. rc = smblib_get_prop_dc_online(chg, val);
  960. break;
  961. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  962. rc = smblib_get_prop_dc_voltage_now(chg, val);
  963. break;
  964. case POWER_SUPPLY_PROP_CURRENT_MAX:
  965. rc = smblib_get_prop_dc_current_max(chg, val);
  966. break;
  967. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  968. rc = smblib_get_prop_dc_voltage_max(chg, val);
  969. break;
  970. default:
  971. return -EINVAL;
  972. }
  973. if (rc < 0) {
  974. pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
  975. return -ENODATA;
  976. }
  977. return 0;
  978. }
  979. static int smb5_dc_set_prop(struct power_supply *psy,
  980. enum power_supply_property psp,
  981. const union power_supply_propval *val)
  982. {
  983. struct smb5 *chip = power_supply_get_drvdata(psy);
  984. struct smb_charger *chg = &chip->chg;
  985. int rc = 0;
  986. switch (psp) {
  987. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  988. rc = vote(chg->dc_suspend_votable, WBC_VOTER,
  989. (bool)val->intval, 0);
  990. fallthrough;
  991. case POWER_SUPPLY_PROP_CURRENT_MAX:
  992. rc = smblib_set_prop_dc_current_max(chg, val);
  993. break;
  994. default:
  995. return -EINVAL;
  996. }
  997. return rc;
  998. }
  999. static int smb5_dc_prop_is_writeable(struct power_supply *psy,
  1000. enum power_supply_property psp)
  1001. {
  1002. switch (psp) {
  1003. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  1004. fallthrough;
  1005. case POWER_SUPPLY_PROP_CURRENT_MAX:
  1006. return 1;
  1007. default:
  1008. break;
  1009. }
  1010. return 0;
  1011. }
  1012. static const struct power_supply_desc dc_psy_desc = {
  1013. .name = "dc",
  1014. .type = POWER_SUPPLY_TYPE_MAINS,
  1015. .properties = smb5_dc_props,
  1016. .num_properties = ARRAY_SIZE(smb5_dc_props),
  1017. .get_property = smb5_dc_get_prop,
  1018. .set_property = smb5_dc_set_prop,
  1019. .property_is_writeable = smb5_dc_prop_is_writeable,
  1020. };
  1021. static int smb5_init_dc_psy(struct smb5 *chip)
  1022. {
  1023. struct power_supply_config dc_cfg = {};
  1024. struct smb_charger *chg = &chip->chg;
  1025. dc_cfg.drv_data = chip;
  1026. dc_cfg.of_node = chg->dev->of_node;
  1027. chg->dc_psy = devm_power_supply_register(chg->dev,
  1028. &dc_psy_desc,
  1029. &dc_cfg);
  1030. if (IS_ERR(chg->dc_psy)) {
  1031. pr_err("Couldn't register USB power supply\n");
  1032. return PTR_ERR(chg->dc_psy);
  1033. }
  1034. return 0;
  1035. }
  1036. /*************************
  1037. * BATT PSY REGISTRATION *
  1038. *************************/
  1039. static enum power_supply_property smb5_batt_props[] = {
  1040. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  1041. POWER_SUPPLY_PROP_STATUS,
  1042. POWER_SUPPLY_PROP_HEALTH,
  1043. POWER_SUPPLY_PROP_PRESENT,
  1044. POWER_SUPPLY_PROP_CHARGE_TYPE,
  1045. POWER_SUPPLY_PROP_CAPACITY,
  1046. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  1047. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  1048. POWER_SUPPLY_PROP_CURRENT_NOW,
  1049. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
  1050. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
  1051. POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
  1052. POWER_SUPPLY_PROP_TEMP,
  1053. POWER_SUPPLY_PROP_TECHNOLOGY,
  1054. POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
  1055. POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
  1056. POWER_SUPPLY_PROP_CHARGE_COUNTER,
  1057. POWER_SUPPLY_PROP_CYCLE_COUNT,
  1058. POWER_SUPPLY_PROP_CHARGE_FULL,
  1059. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  1060. POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
  1061. };
  1062. #define DEBUG_ACCESSORY_TEMP_DECIDEGC 250
  1063. static int smb5_batt_get_prop(struct power_supply *psy,
  1064. enum power_supply_property psp,
  1065. union power_supply_propval *pval)
  1066. {
  1067. struct smb_charger *chg = power_supply_get_drvdata(psy);
  1068. int rc = 0;
  1069. switch (psp) {
  1070. case POWER_SUPPLY_PROP_STATUS:
  1071. rc = smblib_get_prop_batt_status(chg, pval);
  1072. break;
  1073. case POWER_SUPPLY_PROP_HEALTH:
  1074. rc = smblib_get_prop_batt_health(chg, pval);
  1075. break;
  1076. case POWER_SUPPLY_PROP_PRESENT:
  1077. rc = smblib_get_prop_batt_present(chg, pval);
  1078. break;
  1079. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  1080. rc = smblib_get_prop_input_suspend(chg, pval);
  1081. break;
  1082. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  1083. rc = smblib_get_prop_batt_charge_type(chg, pval);
  1084. break;
  1085. case POWER_SUPPLY_PROP_CAPACITY:
  1086. rc = smblib_get_prop_batt_capacity(chg, pval);
  1087. break;
  1088. case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
  1089. rc = smblib_get_prop_system_temp_level(chg, pval);
  1090. break;
  1091. case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
  1092. rc = smblib_get_prop_system_temp_level_max(chg, pval);
  1093. break;
  1094. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  1095. rc = smblib_get_prop_from_bms(chg,
  1096. SMB5_QG_VOLTAGE_NOW, &pval->intval);
  1097. break;
  1098. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  1099. pval->intval = get_client_vote(chg->fv_votable,
  1100. QNOVO_VOTER);
  1101. if (pval->intval < 0)
  1102. pval->intval = get_client_vote(chg->fv_votable,
  1103. BATT_PROFILE_VOTER);
  1104. break;
  1105. case POWER_SUPPLY_PROP_CURRENT_NOW:
  1106. rc = smblib_get_batt_current_now(chg, pval);
  1107. break;
  1108. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
  1109. pval->intval = get_client_vote(chg->fcc_votable,
  1110. BATT_PROFILE_VOTER);
  1111. break;
  1112. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
  1113. pval->intval = get_effective_result(chg->fcc_votable);
  1114. break;
  1115. case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
  1116. rc = smblib_get_prop_batt_iterm(chg, pval);
  1117. break;
  1118. case POWER_SUPPLY_PROP_TEMP:
  1119. if (chg->typec_mode ==
  1120. QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY)
  1121. pval->intval = DEBUG_ACCESSORY_TEMP_DECIDEGC;
  1122. else
  1123. rc = smblib_get_prop_from_bms(chg,
  1124. SMB5_QG_TEMP, &pval->intval);
  1125. break;
  1126. case POWER_SUPPLY_PROP_TECHNOLOGY:
  1127. pval->intval = POWER_SUPPLY_TECHNOLOGY_LION;
  1128. break;
  1129. case POWER_SUPPLY_PROP_CHARGE_COUNTER:
  1130. rc = smblib_get_prop_from_bms(chg,
  1131. SMB5_QG_CHARGE_COUNTER, &pval->intval);
  1132. break;
  1133. case POWER_SUPPLY_PROP_CYCLE_COUNT:
  1134. rc = smblib_get_prop_from_bms(chg,
  1135. SMB5_QG_CYCLE_COUNT, &pval->intval);
  1136. break;
  1137. case POWER_SUPPLY_PROP_CHARGE_FULL:
  1138. rc = smblib_get_prop_from_bms(chg,
  1139. SMB5_QG_CHARGE_FULL, &pval->intval);
  1140. break;
  1141. case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  1142. rc = smblib_get_prop_from_bms(chg,
  1143. SMB5_QG_CHARGE_FULL_DESIGN, &pval->intval);
  1144. break;
  1145. case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
  1146. rc = smblib_get_prop_from_bms(chg,
  1147. SMB5_QG_TIME_TO_FULL_NOW, &pval->intval);
  1148. break;
  1149. default:
  1150. pr_err("batt power supply prop %d not supported\n", psp);
  1151. return -EINVAL;
  1152. }
  1153. if (rc < 0) {
  1154. pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
  1155. return -ENODATA;
  1156. }
  1157. return 0;
  1158. }
  1159. static int smb5_batt_set_prop(struct power_supply *psy,
  1160. enum power_supply_property prop,
  1161. const union power_supply_propval *val)
  1162. {
  1163. int rc = 0;
  1164. struct smb_charger *chg = power_supply_get_drvdata(psy);
  1165. switch (prop) {
  1166. case POWER_SUPPLY_PROP_STATUS:
  1167. rc = smblib_set_prop_batt_status(chg, val);
  1168. break;
  1169. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  1170. rc = smblib_set_prop_input_suspend(chg, val);
  1171. break;
  1172. case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
  1173. rc = smblib_set_prop_system_temp_level(chg, val);
  1174. break;
  1175. case POWER_SUPPLY_PROP_CAPACITY:
  1176. rc = smblib_set_prop_batt_capacity(chg, val);
  1177. break;
  1178. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  1179. chg->batt_profile_fv_uv = val->intval;
  1180. vote(chg->fv_votable, BATT_PROFILE_VOTER, true, val->intval);
  1181. break;
  1182. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
  1183. chg->batt_profile_fcc_ua = val->intval;
  1184. vote(chg->fcc_votable, BATT_PROFILE_VOTER, true, val->intval);
  1185. break;
  1186. default:
  1187. rc = -EINVAL;
  1188. }
  1189. return rc;
  1190. }
  1191. static int smb5_batt_prop_is_writeable(struct power_supply *psy,
  1192. enum power_supply_property psp)
  1193. {
  1194. switch (psp) {
  1195. case POWER_SUPPLY_PROP_STATUS:
  1196. fallthrough;
  1197. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  1198. fallthrough;
  1199. case POWER_SUPPLY_PROP_CAPACITY:
  1200. return 1;
  1201. default:
  1202. break;
  1203. }
  1204. return 0;
  1205. }
  1206. static const struct power_supply_desc batt_psy_desc = {
  1207. .name = "battery",
  1208. .type = POWER_SUPPLY_TYPE_BATTERY,
  1209. .properties = smb5_batt_props,
  1210. .num_properties = ARRAY_SIZE(smb5_batt_props),
  1211. .get_property = smb5_batt_get_prop,
  1212. .set_property = smb5_batt_set_prop,
  1213. .property_is_writeable = smb5_batt_prop_is_writeable,
  1214. };
  1215. static int smb5_init_batt_psy(struct smb5 *chip)
  1216. {
  1217. struct power_supply_config batt_cfg = {};
  1218. struct smb_charger *chg = &chip->chg;
  1219. int rc = 0;
  1220. batt_cfg.drv_data = chg;
  1221. batt_cfg.of_node = chg->dev->of_node;
  1222. chg->batt_psy = devm_power_supply_register(chg->dev,
  1223. &batt_psy_desc,
  1224. &batt_cfg);
  1225. if (IS_ERR(chg->batt_psy)) {
  1226. pr_err("Couldn't register battery power supply\n");
  1227. return PTR_ERR(chg->batt_psy);
  1228. }
  1229. return rc;
  1230. }
  1231. /******************************
  1232. * VBUS REGULATOR REGISTRATION *
  1233. ******************************/
  1234. static const struct regulator_ops smb5_vbus_reg_ops = {
  1235. .enable = smblib_vbus_regulator_enable,
  1236. .disable = smblib_vbus_regulator_disable,
  1237. .is_enabled = smblib_vbus_regulator_is_enabled,
  1238. };
  1239. static int smb5_init_vbus_regulator(struct smb5 *chip)
  1240. {
  1241. struct smb_charger *chg = &chip->chg;
  1242. struct regulator_config cfg = {};
  1243. int rc = 0;
  1244. chg->vbus_vreg = devm_kzalloc(chg->dev, sizeof(*chg->vbus_vreg),
  1245. GFP_KERNEL);
  1246. if (!chg->vbus_vreg)
  1247. return -ENOMEM;
  1248. cfg.dev = chg->dev;
  1249. cfg.driver_data = chip;
  1250. chg->vbus_vreg->rdesc.owner = THIS_MODULE;
  1251. chg->vbus_vreg->rdesc.type = REGULATOR_VOLTAGE;
  1252. chg->vbus_vreg->rdesc.ops = &smb5_vbus_reg_ops;
  1253. chg->vbus_vreg->rdesc.of_match = "qcom,smb5-vbus";
  1254. chg->vbus_vreg->rdesc.name = "qcom,smb5-vbus";
  1255. chg->vbus_vreg->rdev = devm_regulator_register(chg->dev,
  1256. &chg->vbus_vreg->rdesc, &cfg);
  1257. if (IS_ERR(chg->vbus_vreg->rdev)) {
  1258. rc = PTR_ERR(chg->vbus_vreg->rdev);
  1259. chg->vbus_vreg->rdev = NULL;
  1260. if (rc != -EPROBE_DEFER)
  1261. pr_err("Couldn't register VBUS regulator rc=%d\n", rc);
  1262. }
  1263. return rc;
  1264. }
  1265. /******************************
  1266. * VCONN REGULATOR REGISTRATION *
  1267. ******************************/
  1268. static const struct regulator_ops smb5_vconn_reg_ops = {
  1269. .enable = smblib_vconn_regulator_enable,
  1270. .disable = smblib_vconn_regulator_disable,
  1271. .is_enabled = smblib_vconn_regulator_is_enabled,
  1272. };
  1273. static int smb5_init_vconn_regulator(struct smb5 *chip)
  1274. {
  1275. struct smb_charger *chg = &chip->chg;
  1276. struct regulator_config cfg = {};
  1277. int rc = 0;
  1278. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  1279. return 0;
  1280. chg->vconn_vreg = devm_kzalloc(chg->dev, sizeof(*chg->vconn_vreg),
  1281. GFP_KERNEL);
  1282. if (!chg->vconn_vreg)
  1283. return -ENOMEM;
  1284. cfg.dev = chg->dev;
  1285. cfg.driver_data = chip;
  1286. chg->vconn_vreg->rdesc.owner = THIS_MODULE;
  1287. chg->vconn_vreg->rdesc.type = REGULATOR_VOLTAGE;
  1288. chg->vconn_vreg->rdesc.ops = &smb5_vconn_reg_ops;
  1289. chg->vconn_vreg->rdesc.of_match = "qcom,smb5-vconn";
  1290. chg->vconn_vreg->rdesc.name = "qcom,smb5-vconn";
  1291. chg->vconn_vreg->rdev = devm_regulator_register(chg->dev,
  1292. &chg->vconn_vreg->rdesc, &cfg);
  1293. if (IS_ERR(chg->vconn_vreg->rdev)) {
  1294. rc = PTR_ERR(chg->vconn_vreg->rdev);
  1295. chg->vconn_vreg->rdev = NULL;
  1296. if (rc != -EPROBE_DEFER)
  1297. pr_err("Couldn't register VCONN regulator rc=%d\n", rc);
  1298. }
  1299. return rc;
  1300. }
  1301. /***************************
  1302. * HARDWARE INITIALIZATION *
  1303. ***************************/
  1304. static int smb5_configure_typec(struct smb_charger *chg)
  1305. {
  1306. int rc, val;
  1307. u8 value = 0;
  1308. rc = smblib_read(chg, LEGACY_CABLE_STATUS_REG, &value);
  1309. if (rc < 0) {
  1310. dev_err(chg->dev, "Couldn't read Legacy status rc=%d\n", rc);
  1311. return rc;
  1312. }
  1313. /*
  1314. * Across reboot, standard typeC cables get detected as legacy
  1315. * cables due to VBUS attachment prior to CC attach/detach.
  1316. * Reset the legacy detection logic by enabling/disabling the typeC mode.
  1317. */
  1318. if (value & TYPEC_LEGACY_CABLE_STATUS_BIT) {
  1319. val = QTI_POWER_SUPPLY_TYPEC_PR_NONE;
  1320. rc = smblib_set_prop_typec_power_role(chg, val);
  1321. if (rc < 0) {
  1322. dev_err(chg->dev, "Couldn't disable TYPEC rc=%d\n", rc);
  1323. return rc;
  1324. }
  1325. /* delay before enabling typeC */
  1326. msleep(50);
  1327. val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  1328. rc = smblib_set_prop_typec_power_role(chg, val);
  1329. if (rc < 0) {
  1330. dev_err(chg->dev, "Couldn't enable TYPEC rc=%d\n", rc);
  1331. return rc;
  1332. }
  1333. /*delay after enabling typeC*/
  1334. msleep(100);
  1335. }
  1336. smblib_apsd_enable(chg, true);
  1337. rc = smblib_read(chg, TYPE_C_SNK_STATUS_REG, &value);
  1338. if (rc < 0) {
  1339. dev_err(chg->dev, "failed to read TYPE_C_SNK_STATUS_REG rc=%d\n",
  1340. rc);
  1341. return rc;
  1342. }
  1343. if (!(value & SNK_DAM_MASK)) {
  1344. rc = smblib_masked_write(chg, TYPE_C_CFG_REG,
  1345. BC1P2_START_ON_CC_BIT, 0);
  1346. if (rc < 0) {
  1347. dev_err(chg->dev, "failed to write TYPE_C_CFG_REG rc=%d\n",
  1348. rc);
  1349. return rc;
  1350. }
  1351. }
  1352. /* Use simple write to clear interrupts */
  1353. rc = smblib_write(chg, TYPE_C_INTERRUPT_EN_CFG_1_REG, 0);
  1354. if (rc < 0) {
  1355. dev_err(chg->dev,
  1356. "Couldn't configure Type-C interrupts rc=%d\n", rc);
  1357. return rc;
  1358. }
  1359. value = chg->lpd_disabled ? 0 : TYPEC_WATER_DETECTION_INT_EN_BIT;
  1360. /* Use simple write to enable only required interrupts */
  1361. rc = smblib_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  1362. TYPEC_SRC_BATT_HPWR_INT_EN_BIT | value);
  1363. if (rc < 0) {
  1364. dev_err(chg->dev,
  1365. "Couldn't configure Type-C interrupts rc=%d\n", rc);
  1366. return rc;
  1367. }
  1368. /* enable try.snk and clear force sink for DRP mode */
  1369. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  1370. EN_TRY_SNK_BIT | EN_SNK_ONLY_BIT,
  1371. EN_TRY_SNK_BIT);
  1372. if (rc < 0) {
  1373. dev_err(chg->dev,
  1374. "Couldn't configure TYPE_C_MODE_CFG_REG rc=%d\n", rc);
  1375. return rc;
  1376. }
  1377. chg->typec_try_mode |= EN_TRY_SNK_BIT;
  1378. /* For PD capable targets configure VCONN for software control */
  1379. if (!chg->pd_not_supported) {
  1380. rc = smblib_masked_write(chg, TYPE_C_VCONN_CONTROL_REG,
  1381. VCONN_EN_SRC_BIT | VCONN_EN_VALUE_BIT,
  1382. VCONN_EN_SRC_BIT);
  1383. if (rc < 0) {
  1384. dev_err(chg->dev,
  1385. "Couldn't configure VCONN for SW control rc=%d\n",
  1386. rc);
  1387. return rc;
  1388. }
  1389. }
  1390. if (chg->chg_param.smb_version != PMI632) {
  1391. /*
  1392. * Enable detection of unoriented debug
  1393. * accessory in source mode.
  1394. */
  1395. rc = smblib_masked_write(chg, DEBUG_ACCESS_SRC_CFG_REG,
  1396. EN_UNORIENTED_DEBUG_ACCESS_SRC_BIT,
  1397. EN_UNORIENTED_DEBUG_ACCESS_SRC_BIT);
  1398. if (rc < 0) {
  1399. dev_err(chg->dev,
  1400. "Couldn't configure TYPE_C_DEBUG_ACCESS_SRC_CFG_REG rc=%d\n",
  1401. rc);
  1402. return rc;
  1403. }
  1404. rc = smblib_masked_write(chg, USBIN_LOAD_CFG_REG,
  1405. USBIN_IN_COLLAPSE_GF_SEL_MASK |
  1406. USBIN_AICL_STEP_TIMING_SEL_MASK,
  1407. 0);
  1408. if (rc < 0) {
  1409. dev_err(chg->dev,
  1410. "Couldn't set USBIN_LOAD_CFG_REG rc=%d\n", rc);
  1411. return rc;
  1412. }
  1413. }
  1414. /* Set CC threshold to 1.6 V in source mode */
  1415. rc = smblib_masked_write(chg, TYPE_C_EXIT_STATE_CFG_REG,
  1416. SEL_SRC_UPPER_REF_BIT, SEL_SRC_UPPER_REF_BIT);
  1417. if (rc < 0)
  1418. dev_err(chg->dev,
  1419. "Couldn't configure CC threshold voltage rc=%d\n", rc);
  1420. return rc;
  1421. }
  1422. static int smb5_configure_micro_usb(struct smb_charger *chg)
  1423. {
  1424. int rc;
  1425. /* For micro USB connector, use extcon by default */
  1426. chg->use_extcon = true;
  1427. chg->pd_not_supported = true;
  1428. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  1429. MICRO_USB_STATE_CHANGE_INT_EN_BIT,
  1430. MICRO_USB_STATE_CHANGE_INT_EN_BIT);
  1431. if (rc < 0) {
  1432. dev_err(chg->dev,
  1433. "Couldn't configure Type-C interrupts rc=%d\n", rc);
  1434. return rc;
  1435. }
  1436. if (chg->uusb_moisture_protection_enabled) {
  1437. /* Enable moisture detection interrupt */
  1438. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  1439. TYPEC_WATER_DETECTION_INT_EN_BIT,
  1440. TYPEC_WATER_DETECTION_INT_EN_BIT);
  1441. if (rc < 0) {
  1442. dev_err(chg->dev, "Couldn't enable moisture detection interrupt rc=%d\n",
  1443. rc);
  1444. return rc;
  1445. }
  1446. /* Enable uUSB factory mode */
  1447. rc = smblib_masked_write(chg, TYPEC_U_USB_CFG_REG,
  1448. EN_MICRO_USB_FACTORY_MODE_BIT,
  1449. EN_MICRO_USB_FACTORY_MODE_BIT);
  1450. if (rc < 0) {
  1451. dev_err(chg->dev, "Couldn't enable uUSB factory mode c=%d\n",
  1452. rc);
  1453. return rc;
  1454. }
  1455. /* Disable periodic monitoring of CC_ID pin */
  1456. rc = smblib_write(chg,
  1457. ((chg->chg_param.smb_version == PMI632) ?
  1458. PMI632_TYPEC_U_USB_WATER_PROTECTION_CFG_REG :
  1459. TYPEC_U_USB_WATER_PROTECTION_CFG_REG), 0);
  1460. if (rc < 0) {
  1461. dev_err(chg->dev, "Couldn't disable periodic monitoring of CC_ID rc=%d\n",
  1462. rc);
  1463. return rc;
  1464. }
  1465. }
  1466. /* Enable HVDCP detection and authentication */
  1467. if (!chg->hvdcp_disable)
  1468. smblib_hvdcp_detect_enable(chg, true);
  1469. return rc;
  1470. }
  1471. #define RAW_ITERM(iterm_ma, max_range) \
  1472. div_s64((int64_t)iterm_ma * ADC_CHG_ITERM_MASK, max_range)
  1473. static int smb5_configure_iterm_thresholds_adc(struct smb5 *chip)
  1474. {
  1475. u8 *buf;
  1476. int rc = 0;
  1477. s16 raw_hi_thresh, raw_lo_thresh, max_limit_ma;
  1478. struct smb_charger *chg = &chip->chg;
  1479. if (chip->chg.chg_param.smb_version == PMI632)
  1480. max_limit_ma = ITERM_LIMITS_PMI632_MA;
  1481. else
  1482. max_limit_ma = ITERM_LIMITS_PM8150B_MA;
  1483. if (chip->dt.term_current_thresh_hi_ma < (-1 * max_limit_ma)
  1484. || chip->dt.term_current_thresh_hi_ma > max_limit_ma
  1485. || chip->dt.term_current_thresh_lo_ma < (-1 * max_limit_ma)
  1486. || chip->dt.term_current_thresh_lo_ma > max_limit_ma) {
  1487. dev_err(chg->dev, "ITERM threshold out of range rc=%d\n", rc);
  1488. return -EINVAL;
  1489. }
  1490. /*
  1491. * Conversion:
  1492. * raw (A) = (term_current * ADC_CHG_ITERM_MASK) / max_limit_ma
  1493. * Note: raw needs to be converted to big-endian format.
  1494. */
  1495. if (chip->dt.term_current_thresh_hi_ma) {
  1496. raw_hi_thresh = RAW_ITERM(chip->dt.term_current_thresh_hi_ma,
  1497. max_limit_ma);
  1498. raw_hi_thresh = sign_extend32(raw_hi_thresh, 15);
  1499. buf = (u8 *)&raw_hi_thresh;
  1500. raw_hi_thresh = buf[1] | (buf[0] << 8);
  1501. rc = smblib_batch_write(chg, CHGR_ADC_ITERM_UP_THD_MSB_REG,
  1502. (u8 *)&raw_hi_thresh, 2);
  1503. if (rc < 0) {
  1504. dev_err(chg->dev, "Couldn't configure ITERM threshold HIGH rc=%d\n",
  1505. rc);
  1506. return rc;
  1507. }
  1508. }
  1509. if (chip->dt.term_current_thresh_lo_ma) {
  1510. raw_lo_thresh = RAW_ITERM(chip->dt.term_current_thresh_lo_ma,
  1511. max_limit_ma);
  1512. raw_lo_thresh = sign_extend32(raw_lo_thresh, 15);
  1513. buf = (u8 *)&raw_lo_thresh;
  1514. raw_lo_thresh = buf[1] | (buf[0] << 8);
  1515. rc = smblib_batch_write(chg, CHGR_ADC_ITERM_LO_THD_MSB_REG,
  1516. (u8 *)&raw_lo_thresh, 2);
  1517. if (rc < 0) {
  1518. dev_err(chg->dev, "Couldn't configure ITERM threshold LOW rc=%d\n",
  1519. rc);
  1520. return rc;
  1521. }
  1522. }
  1523. return rc;
  1524. }
  1525. static int smb5_configure_iterm_thresholds(struct smb5 *chip)
  1526. {
  1527. int rc = 0;
  1528. struct smb_charger *chg = &chip->chg;
  1529. switch (chip->dt.term_current_src) {
  1530. case ITERM_SRC_ADC:
  1531. if (chip->chg.chg_param.smb_version == PM8150B) {
  1532. rc = smblib_masked_write(chg, CHGR_ADC_TERM_CFG_REG,
  1533. TERM_BASED_ON_SYNC_CONV_OR_SAMPLE_CNT,
  1534. TERM_BASED_ON_SAMPLE_CNT);
  1535. if (rc < 0) {
  1536. dev_err(chg->dev, "Couldn't configure ADC_ITERM_CFG rc=%d\n",
  1537. rc);
  1538. return rc;
  1539. }
  1540. }
  1541. rc = smb5_configure_iterm_thresholds_adc(chip);
  1542. break;
  1543. default:
  1544. break;
  1545. }
  1546. return rc;
  1547. }
  1548. static int smb5_configure_mitigation(struct smb_charger *chg)
  1549. {
  1550. int rc;
  1551. u8 chan = 0, src_cfg = 0;
  1552. if (!chg->hw_die_temp_mitigation && !chg->hw_connector_mitigation &&
  1553. !chg->hw_skin_temp_mitigation) {
  1554. src_cfg = THERMREG_SW_ICL_ADJUST_BIT;
  1555. } else {
  1556. if (chg->hw_die_temp_mitigation) {
  1557. chan = DIE_TEMP_CHANNEL_EN_BIT;
  1558. src_cfg = THERMREG_DIE_ADC_SRC_EN_BIT
  1559. | THERMREG_DIE_CMP_SRC_EN_BIT;
  1560. }
  1561. if (chg->hw_connector_mitigation) {
  1562. chan |= CONN_THM_CHANNEL_EN_BIT;
  1563. src_cfg |= THERMREG_CONNECTOR_ADC_SRC_EN_BIT;
  1564. }
  1565. if (chg->hw_skin_temp_mitigation) {
  1566. chan |= MISC_THM_CHANNEL_EN_BIT;
  1567. src_cfg |= THERMREG_SKIN_ADC_SRC_EN_BIT;
  1568. }
  1569. rc = smblib_masked_write(chg, BATIF_ADC_CHANNEL_EN_REG,
  1570. CONN_THM_CHANNEL_EN_BIT | DIE_TEMP_CHANNEL_EN_BIT |
  1571. MISC_THM_CHANNEL_EN_BIT, chan);
  1572. if (rc < 0) {
  1573. dev_err(chg->dev, "Couldn't enable ADC channel rc=%d\n",
  1574. rc);
  1575. return rc;
  1576. }
  1577. }
  1578. rc = smblib_masked_write(chg, MISC_THERMREG_SRC_CFG_REG,
  1579. THERMREG_SW_ICL_ADJUST_BIT | THERMREG_DIE_ADC_SRC_EN_BIT |
  1580. THERMREG_DIE_CMP_SRC_EN_BIT | THERMREG_SKIN_ADC_SRC_EN_BIT |
  1581. SKIN_ADC_CFG_BIT | THERMREG_CONNECTOR_ADC_SRC_EN_BIT, src_cfg);
  1582. if (rc < 0) {
  1583. dev_err(chg->dev,
  1584. "Couldn't configure THERM_SRC reg rc=%d\n", rc);
  1585. return rc;
  1586. }
  1587. return 0;
  1588. }
  1589. static int smb5_init_dc_peripheral(struct smb_charger *chg)
  1590. {
  1591. int rc = 0;
  1592. /* PMI632 does not have DC peripheral */
  1593. if (chg->chg_param.smb_version == PMI632)
  1594. return 0;
  1595. /* Set DCIN ICL to 100 mA */
  1596. rc = smblib_set_charge_param(chg, &chg->param.dc_icl, DCIN_ICL_MIN_UA);
  1597. if (rc < 0) {
  1598. dev_err(chg->dev, "Couldn't set dc_icl rc=%d\n", rc);
  1599. return rc;
  1600. }
  1601. /* Disable DC Input missing poller function */
  1602. rc = smblib_masked_write(chg, DCIN_LOAD_CFG_REG,
  1603. INPUT_MISS_POLL_EN_BIT, 0);
  1604. if (rc < 0) {
  1605. dev_err(chg->dev,
  1606. "Couldn't disable DC Input missing poller rc=%d\n", rc);
  1607. return rc;
  1608. }
  1609. return rc;
  1610. }
  1611. static int smb5_configure_recharging(struct smb5 *chip)
  1612. {
  1613. int rc = 0;
  1614. struct smb_charger *chg = &chip->chg;
  1615. int val;
  1616. /* Configure VBATT-based or automatic recharging */
  1617. rc = smblib_masked_write(chg, CHGR_CFG2_REG, RECHG_MASK,
  1618. (chip->dt.auto_recharge_vbat_mv != -EINVAL) ?
  1619. VBAT_BASED_RECHG_BIT : 0);
  1620. if (rc < 0) {
  1621. dev_err(chg->dev, "Couldn't configure VBAT-rechg CHG_CFG2_REG rc=%d\n",
  1622. rc);
  1623. return rc;
  1624. }
  1625. /* program the auto-recharge VBAT threshold */
  1626. if (chip->dt.auto_recharge_vbat_mv != -EINVAL) {
  1627. u32 temp = VBAT_TO_VRAW_ADC(chip->dt.auto_recharge_vbat_mv);
  1628. temp = ((temp & 0xFF00) >> 8) | ((temp & 0xFF) << 8);
  1629. rc = smblib_batch_write(chg,
  1630. CHGR_ADC_RECHARGE_THRESHOLD_MSB_REG, (u8 *)&temp, 2);
  1631. if (rc < 0) {
  1632. dev_err(chg->dev, "Couldn't configure ADC_RECHARGE_THRESHOLD REG rc=%d\n",
  1633. rc);
  1634. return rc;
  1635. }
  1636. /* Program the sample count for VBAT based recharge to 3 */
  1637. rc = smblib_masked_write(chg, CHGR_NO_SAMPLE_TERM_RCHG_CFG_REG,
  1638. NO_OF_SAMPLE_FOR_RCHG,
  1639. 2 << NO_OF_SAMPLE_FOR_RCHG_SHIFT);
  1640. if (rc < 0) {
  1641. dev_err(chg->dev, "Couldn't configure CHGR_NO_SAMPLE_FOR_TERM_RCHG_CFG rc=%d\n",
  1642. rc);
  1643. return rc;
  1644. }
  1645. }
  1646. rc = smblib_masked_write(chg, CHGR_CFG2_REG, RECHG_MASK,
  1647. (chip->dt.auto_recharge_soc != -EINVAL) ?
  1648. SOC_BASED_RECHG_BIT : VBAT_BASED_RECHG_BIT);
  1649. if (rc < 0) {
  1650. dev_err(chg->dev, "Couldn't configure SOC-rechg CHG_CFG2_REG rc=%d\n",
  1651. rc);
  1652. return rc;
  1653. }
  1654. /* program the auto-recharge threshold */
  1655. if (chip->dt.auto_recharge_soc != -EINVAL) {
  1656. val = chip->dt.auto_recharge_soc;
  1657. rc = smblib_set_prop_rechg_soc_thresh(chg, val);
  1658. if (rc < 0) {
  1659. dev_err(chg->dev, "Couldn't configure CHG_RCHG_SOC_REG rc=%d\n",
  1660. rc);
  1661. return rc;
  1662. }
  1663. /* Program the sample count for SOC based recharge to 1 */
  1664. rc = smblib_masked_write(chg, CHGR_NO_SAMPLE_TERM_RCHG_CFG_REG,
  1665. NO_OF_SAMPLE_FOR_RCHG, 0);
  1666. if (rc < 0) {
  1667. dev_err(chg->dev, "Couldn't configure CHGR_NO_SAMPLE_FOR_TERM_RCHG_CFG rc=%d\n",
  1668. rc);
  1669. return rc;
  1670. }
  1671. }
  1672. return 0;
  1673. }
  1674. static int smb5_configure_float_charger(struct smb5 *chip)
  1675. {
  1676. int rc = 0;
  1677. u8 val = 0;
  1678. struct smb_charger *chg = &chip->chg;
  1679. /* configure float charger options */
  1680. switch (chip->dt.float_option) {
  1681. case FLOAT_SDP:
  1682. val = FORCE_FLOAT_SDP_CFG_BIT;
  1683. break;
  1684. case DISABLE_CHARGING:
  1685. val = FLOAT_DIS_CHGING_CFG_BIT;
  1686. break;
  1687. case SUSPEND_INPUT:
  1688. val = SUSPEND_FLOAT_CFG_BIT;
  1689. break;
  1690. case FLOAT_DCP:
  1691. fallthrough;
  1692. default:
  1693. val = 0;
  1694. break;
  1695. }
  1696. chg->float_cfg = val;
  1697. /* Update float charger setting and set DCD timeout 300ms */
  1698. rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
  1699. FLOAT_OPTIONS_MASK | DCD_TIMEOUT_SEL_BIT, val);
  1700. if (rc < 0) {
  1701. dev_err(chg->dev, "Couldn't change float charger setting rc=%d\n",
  1702. rc);
  1703. return rc;
  1704. }
  1705. return 0;
  1706. }
  1707. static int smb5_init_connector_type(struct smb_charger *chg)
  1708. {
  1709. int rc, type = 0;
  1710. u8 val = 0;
  1711. /*
  1712. * PMI632 can have the connector type defined by a dedicated register
  1713. * PMI632_TYPEC_MICRO_USB_MODE_REG or by a common TYPEC_U_USB_CFG_REG.
  1714. */
  1715. if (chg->chg_param.smb_version == PMI632) {
  1716. rc = smblib_read(chg, PMI632_TYPEC_MICRO_USB_MODE_REG, &val);
  1717. if (rc < 0) {
  1718. dev_err(chg->dev, "Couldn't read USB mode rc=%d\n", rc);
  1719. return rc;
  1720. }
  1721. type = !!(val & MICRO_USB_MODE_ONLY_BIT);
  1722. }
  1723. /*
  1724. * If PMI632_TYPEC_MICRO_USB_MODE_REG is not set and for all non-PMI632
  1725. * check the connector type using TYPEC_U_USB_CFG_REG.
  1726. */
  1727. if (!type) {
  1728. rc = smblib_read(chg, TYPEC_U_USB_CFG_REG, &val);
  1729. if (rc < 0) {
  1730. dev_err(chg->dev, "Couldn't read U_USB config rc=%d\n",
  1731. rc);
  1732. return rc;
  1733. }
  1734. type = !!(val & EN_MICRO_USB_MODE_BIT);
  1735. }
  1736. pr_debug("Connector type=%s\n", type ? "Micro USB" : "TypeC");
  1737. if (type) {
  1738. chg->connector_type = QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB;
  1739. rc = smb5_configure_micro_usb(chg);
  1740. } else {
  1741. chg->connector_type = QTI_POWER_SUPPLY_CONNECTOR_TYPEC;
  1742. rc = smb5_configure_typec(chg);
  1743. }
  1744. if (rc < 0) {
  1745. dev_err(chg->dev,
  1746. "Couldn't configure TypeC/micro-USB mode rc=%d\n", rc);
  1747. return rc;
  1748. }
  1749. /*
  1750. * PMI632 based hw init:
  1751. * - Rerun APSD to ensure proper charger detection if device
  1752. * boots with charger connected.
  1753. * - Initialize flash module for PMI632
  1754. */
  1755. if (chg->chg_param.smb_version == PMI632) {
  1756. schgm_flash_init(chg);
  1757. smblib_rerun_apsd_if_required(chg);
  1758. }
  1759. return 0;
  1760. }
  1761. static int smb5_init_hw(struct smb5 *chip)
  1762. {
  1763. struct smb_charger *chg = &chip->chg;
  1764. int rc;
  1765. u8 val = 0, mask = 0, buf[2] = {0};
  1766. if (chip->dt.no_battery)
  1767. chg->fake_capacity = 50;
  1768. if (chg->sdam_base) {
  1769. rc = smblib_write(chg,
  1770. chg->sdam_base + SDAM_QC_DET_STATUS_REG, 0);
  1771. if (rc < 0)
  1772. pr_err("Couldn't clear SDAM QC status rc=%d\n", rc);
  1773. rc = smblib_batch_write(chg,
  1774. chg->sdam_base + SDAM_QC_ADC_LSB_REG, buf, 2);
  1775. if (rc < 0)
  1776. pr_err("Couldn't clear SDAM ADC status rc=%d\n", rc);
  1777. }
  1778. if (chip->dt.batt_profile_fcc_ua < 0)
  1779. smblib_get_charge_param(chg, &chg->param.fcc,
  1780. &chg->batt_profile_fcc_ua);
  1781. if (chip->dt.batt_profile_fv_uv < 0)
  1782. smblib_get_charge_param(chg, &chg->param.fv,
  1783. &chg->batt_profile_fv_uv);
  1784. smblib_get_charge_param(chg, &chg->param.usb_icl,
  1785. &chg->default_icl_ua);
  1786. smblib_get_charge_param(chg, &chg->param.aicl_5v_threshold,
  1787. &chg->default_aicl_5v_threshold_mv);
  1788. chg->aicl_5v_threshold_mv = chg->default_aicl_5v_threshold_mv;
  1789. smblib_get_charge_param(chg, &chg->param.aicl_cont_threshold,
  1790. &chg->default_aicl_cont_threshold_mv);
  1791. chg->aicl_cont_threshold_mv = chg->default_aicl_cont_threshold_mv;
  1792. if (chg->charger_temp_max == -EINVAL) {
  1793. rc = smblib_get_thermal_threshold(chg,
  1794. DIE_REG_H_THRESHOLD_MSB_REG,
  1795. &chg->charger_temp_max);
  1796. if (rc < 0) {
  1797. dev_err(chg->dev, "Couldn't get charger_temp_max rc=%d\n",
  1798. rc);
  1799. return rc;
  1800. }
  1801. }
  1802. /*
  1803. * If SW thermal regulation WA is active then all the HW temperature
  1804. * comparators need to be disabled to prevent HW thermal regulation,
  1805. * apart from DIE_TEMP analog comparator for SHDN regulation.
  1806. */
  1807. if (chg->wa_flags & SW_THERM_REGULATION_WA) {
  1808. rc = smblib_write(chg, MISC_THERMREG_SRC_CFG_REG,
  1809. THERMREG_SW_ICL_ADJUST_BIT
  1810. | THERMREG_DIE_CMP_SRC_EN_BIT);
  1811. if (rc < 0) {
  1812. dev_err(chg->dev, "Couldn't disable HW thermal regulation rc=%d\n",
  1813. rc);
  1814. return rc;
  1815. }
  1816. } else {
  1817. /* configure temperature mitigation */
  1818. rc = smb5_configure_mitigation(chg);
  1819. if (rc < 0) {
  1820. dev_err(chg->dev, "Couldn't configure mitigation rc=%d\n",
  1821. rc);
  1822. return rc;
  1823. }
  1824. }
  1825. /* Set HVDCP autonomous mode per DT option */
  1826. smblib_hvdcp_hw_inov_enable(chg, chip->dt.hvdcp_autonomous);
  1827. /* Enable HVDCP authentication algorithm for non-PD designs */
  1828. if (chg->pd_not_supported)
  1829. smblib_hvdcp_detect_enable(chg, true);
  1830. /* Disable HVDCP and authentication algorithm if specified in DT */
  1831. if (chg->hvdcp_disable)
  1832. smblib_hvdcp_detect_enable(chg, false);
  1833. rc = smb5_init_connector_type(chg);
  1834. if (rc < 0) {
  1835. dev_err(chg->dev, "Couldn't configure connector type rc=%d\n",
  1836. rc);
  1837. return rc;
  1838. }
  1839. /* Use ICL results from HW */
  1840. rc = smblib_icl_override(chg, HW_AUTO_MODE);
  1841. if (rc < 0) {
  1842. pr_err("Couldn't disable ICL override rc=%d\n", rc);
  1843. return rc;
  1844. }
  1845. /* set OTG current limit */
  1846. rc = smblib_set_charge_param(chg, &chg->param.otg_cl, chg->otg_cl_ua);
  1847. if (rc < 0) {
  1848. pr_err("Couldn't set otg current limit rc=%d\n", rc);
  1849. return rc;
  1850. }
  1851. /* vote 0mA on usb_icl for non battery platforms */
  1852. vote(chg->usb_icl_votable,
  1853. DEFAULT_VOTER, chip->dt.no_battery, 0);
  1854. vote(chg->dc_suspend_votable,
  1855. DEFAULT_VOTER, chip->dt.no_battery, 0);
  1856. vote(chg->fcc_votable, HW_LIMIT_VOTER,
  1857. chip->dt.batt_profile_fcc_ua > 0, chip->dt.batt_profile_fcc_ua);
  1858. vote(chg->fv_votable, HW_LIMIT_VOTER,
  1859. chip->dt.batt_profile_fv_uv > 0, chip->dt.batt_profile_fv_uv);
  1860. vote(chg->fcc_votable,
  1861. BATT_PROFILE_VOTER, chg->batt_profile_fcc_ua > 0,
  1862. chg->batt_profile_fcc_ua);
  1863. vote(chg->fv_votable,
  1864. BATT_PROFILE_VOTER, chg->batt_profile_fv_uv > 0,
  1865. chg->batt_profile_fv_uv);
  1866. /* Some h/w limit maximum supported ICL */
  1867. vote(chg->usb_icl_votable, HW_LIMIT_VOTER,
  1868. chg->hw_max_icl_ua > 0, chg->hw_max_icl_ua);
  1869. /* Initialize DC peripheral configurations */
  1870. rc = smb5_init_dc_peripheral(chg);
  1871. if (rc < 0)
  1872. return rc;
  1873. /*
  1874. * AICL configuration: enable aicl and aicl rerun and based on DT
  1875. * configuration enable/disable ADB based AICL and Suspend on collapse.
  1876. */
  1877. mask = USBIN_AICL_PERIODIC_RERUN_EN_BIT | USBIN_AICL_ADC_EN_BIT
  1878. | USBIN_AICL_EN_BIT | SUSPEND_ON_COLLAPSE_USBIN_BIT;
  1879. val = USBIN_AICL_PERIODIC_RERUN_EN_BIT | USBIN_AICL_EN_BIT;
  1880. if (!chg->disable_suspend_on_collapse)
  1881. val |= SUSPEND_ON_COLLAPSE_USBIN_BIT;
  1882. if (chip->dt.adc_based_aicl)
  1883. val |= USBIN_AICL_ADC_EN_BIT;
  1884. rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG,
  1885. mask, val);
  1886. if (rc < 0) {
  1887. dev_err(chg->dev, "Couldn't config AICL rc=%d\n", rc);
  1888. return rc;
  1889. }
  1890. rc = smblib_write(chg, AICL_RERUN_TIME_CFG_REG,
  1891. AICL_RERUN_TIME_12S_VAL);
  1892. if (rc < 0) {
  1893. dev_err(chg->dev,
  1894. "Couldn't configure AICL rerun interval rc=%d\n", rc);
  1895. return rc;
  1896. }
  1897. /* enable the charging path */
  1898. rc = vote(chg->chg_disable_votable, DEFAULT_VOTER, false, 0);
  1899. if (rc < 0) {
  1900. dev_err(chg->dev, "Couldn't enable charging rc=%d\n", rc);
  1901. return rc;
  1902. }
  1903. /* configure VBUS for software control */
  1904. rc = smblib_masked_write(chg, DCDC_OTG_CFG_REG, OTG_EN_SRC_CFG_BIT, 0);
  1905. if (rc < 0) {
  1906. dev_err(chg->dev,
  1907. "Couldn't configure VBUS for SW control rc=%d\n", rc);
  1908. return rc;
  1909. }
  1910. val = (ilog2(chip->dt.wd_bark_time / 16) << BARK_WDOG_TIMEOUT_SHIFT)
  1911. & BARK_WDOG_TIMEOUT_MASK;
  1912. val |= (BITE_WDOG_TIMEOUT_8S | BITE_WDOG_DISABLE_CHARGING_CFG_BIT);
  1913. val |= (chip->dt.wd_snarl_time_cfg << SNARL_WDOG_TIMEOUT_SHIFT)
  1914. & SNARL_WDOG_TIMEOUT_MASK;
  1915. rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG,
  1916. BITE_WDOG_DISABLE_CHARGING_CFG_BIT |
  1917. SNARL_WDOG_TIMEOUT_MASK | BARK_WDOG_TIMEOUT_MASK |
  1918. BITE_WDOG_TIMEOUT_MASK,
  1919. val);
  1920. if (rc < 0) {
  1921. pr_err("Couldn't configue WD config rc=%d\n", rc);
  1922. return rc;
  1923. }
  1924. /* enable WD BARK and enable it on plugin */
  1925. val = WDOG_TIMER_EN_ON_PLUGIN_BIT | BARK_WDOG_INT_EN_BIT;
  1926. rc = smblib_masked_write(chg, WD_CFG_REG,
  1927. WATCHDOG_TRIGGER_AFP_EN_BIT |
  1928. WDOG_TIMER_EN_ON_PLUGIN_BIT |
  1929. BARK_WDOG_INT_EN_BIT, val);
  1930. if (rc < 0) {
  1931. pr_err("Couldn't configue WD config rc=%d\n", rc);
  1932. return rc;
  1933. }
  1934. /* set termination current threshold values */
  1935. rc = smb5_configure_iterm_thresholds(chip);
  1936. if (rc < 0) {
  1937. pr_err("Couldn't configure ITERM thresholds rc=%d\n",
  1938. rc);
  1939. return rc;
  1940. }
  1941. rc = smb5_configure_float_charger(chip);
  1942. if (rc < 0)
  1943. return rc;
  1944. switch (chip->dt.chg_inhibit_thr_mv) {
  1945. case 50:
  1946. rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
  1947. CHARGE_INHIBIT_THRESHOLD_MASK,
  1948. INHIBIT_ANALOG_VFLT_MINUS_50MV);
  1949. break;
  1950. case 100:
  1951. rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
  1952. CHARGE_INHIBIT_THRESHOLD_MASK,
  1953. INHIBIT_ANALOG_VFLT_MINUS_100MV);
  1954. break;
  1955. case 200:
  1956. rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
  1957. CHARGE_INHIBIT_THRESHOLD_MASK,
  1958. INHIBIT_ANALOG_VFLT_MINUS_200MV);
  1959. break;
  1960. case 300:
  1961. rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
  1962. CHARGE_INHIBIT_THRESHOLD_MASK,
  1963. INHIBIT_ANALOG_VFLT_MINUS_300MV);
  1964. break;
  1965. case 0:
  1966. rc = smblib_masked_write(chg, CHGR_CFG2_REG,
  1967. CHARGER_INHIBIT_BIT, 0);
  1968. fallthrough;
  1969. default:
  1970. break;
  1971. }
  1972. if (rc < 0) {
  1973. dev_err(chg->dev, "Couldn't configure charge inhibit threshold rc=%d\n",
  1974. rc);
  1975. return rc;
  1976. }
  1977. rc = smblib_write(chg, CHGR_FAST_CHARGE_SAFETY_TIMER_CFG_REG,
  1978. FAST_CHARGE_SAFETY_TIMER_768_MIN);
  1979. if (rc < 0) {
  1980. dev_err(chg->dev, "Couldn't set CHGR_FAST_CHARGE_SAFETY_TIMER_CFG_REG rc=%d\n",
  1981. rc);
  1982. return rc;
  1983. }
  1984. rc = smb5_configure_recharging(chip);
  1985. if (rc < 0)
  1986. return rc;
  1987. rc = smblib_disable_hw_jeita(chg, true);
  1988. if (rc < 0) {
  1989. dev_err(chg->dev, "Couldn't set hw jeita rc=%d\n", rc);
  1990. return rc;
  1991. }
  1992. rc = smblib_masked_write(chg, DCDC_ENG_SDCDC_CFG5_REG,
  1993. ENG_SDCDC_BAT_HPWR_MASK, BOOST_MODE_THRESH_3P6_V);
  1994. if (rc < 0) {
  1995. dev_err(chg->dev, "Couldn't configure DCDC_ENG_SDCDC_CFG5 rc=%d\n",
  1996. rc);
  1997. return rc;
  1998. }
  1999. if (chg->connector_pull_up != -EINVAL) {
  2000. rc = smb5_configure_internal_pull(chg, CONN_THERM,
  2001. get_valid_pullup(chg->connector_pull_up));
  2002. if (rc < 0) {
  2003. dev_err(chg->dev,
  2004. "Couldn't configure CONN_THERM pull-up rc=%d\n",
  2005. rc);
  2006. return rc;
  2007. }
  2008. }
  2009. if (chg->smb_pull_up != -EINVAL) {
  2010. rc = smb5_configure_internal_pull(chg, SMB_THERM,
  2011. get_valid_pullup(chg->smb_pull_up));
  2012. if (rc < 0) {
  2013. dev_err(chg->dev,
  2014. "Couldn't configure SMB pull-up rc=%d\n",
  2015. rc);
  2016. return rc;
  2017. }
  2018. }
  2019. return rc;
  2020. }
  2021. static int smb5_post_init(struct smb5 *chip)
  2022. {
  2023. struct smb_charger *chg = &chip->chg;
  2024. int rc, val;
  2025. /*
  2026. * In case the usb path is suspended, we would have missed disabling
  2027. * the icl change interrupt because the interrupt could have been
  2028. * not requested
  2029. */
  2030. rerun_election(chg->usb_icl_votable);
  2031. /* configure power role for dual-role */
  2032. val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  2033. rc = smblib_set_prop_typec_power_role(chg, val);
  2034. if (rc < 0) {
  2035. dev_err(chg->dev, "Couldn't configure DRP role rc=%d\n",
  2036. rc);
  2037. return rc;
  2038. }
  2039. rerun_election(chg->temp_change_irq_disable_votable);
  2040. return 0;
  2041. }
  2042. /****************************
  2043. * DETERMINE INITIAL STATUS *
  2044. ****************************/
  2045. static int smb5_determine_initial_status(struct smb5 *chip)
  2046. {
  2047. struct smb_irq_data irq_data = {chip, "determine-initial-status"};
  2048. struct smb_charger *chg = &chip->chg;
  2049. union power_supply_propval val;
  2050. int rc;
  2051. rc = smblib_get_prop_usb_present(chg, &val);
  2052. if (rc < 0) {
  2053. pr_err("Couldn't get usb present rc=%d\n", rc);
  2054. return rc;
  2055. }
  2056. chg->early_usb_attach = val.intval;
  2057. if (chg->iio_chan_list_qg)
  2058. smblib_config_charger_on_debug_battery(chg);
  2059. smb5_usb_plugin_irq_handler(0, &irq_data);
  2060. smb5_dc_plugin_irq_handler(0, &irq_data);
  2061. smb5_typec_attach_detach_irq_handler(0, &irq_data);
  2062. smb5_typec_state_change_irq_handler(0, &irq_data);
  2063. smb5_usb_source_change_irq_handler(0, &irq_data);
  2064. smb5_chg_state_change_irq_handler(0, &irq_data);
  2065. smb5_icl_change_irq_handler(0, &irq_data);
  2066. smb5_batt_temp_changed_irq_handler(0, &irq_data);
  2067. smb5_wdog_bark_irq_handler(0, &irq_data);
  2068. smb5_typec_or_rid_detection_change_irq_handler(0, &irq_data);
  2069. smb5_wdog_snarl_irq_handler(0, &irq_data);
  2070. return 0;
  2071. }
  2072. /**************************
  2073. * INTERRUPT REGISTRATION *
  2074. **************************/
  2075. static struct smb_irq_info smb5_irqs[] = {
  2076. /* CHARGER IRQs */
  2077. [CHGR_ERROR_IRQ] = {
  2078. .name = "chgr-error",
  2079. .handler = smb5_default_irq_handler,
  2080. },
  2081. [CHG_STATE_CHANGE_IRQ] = {
  2082. .name = "chg-state-change",
  2083. .handler = smb5_chg_state_change_irq_handler,
  2084. .wake = true,
  2085. },
  2086. [STEP_CHG_STATE_CHANGE_IRQ] = {
  2087. .name = "step-chg-state-change",
  2088. },
  2089. [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = {
  2090. .name = "step-chg-soc-update-fail",
  2091. },
  2092. [STEP_CHG_SOC_UPDATE_REQ_IRQ] = {
  2093. .name = "step-chg-soc-update-req",
  2094. },
  2095. [FG_FVCAL_QUALIFIED_IRQ] = {
  2096. .name = "fg-fvcal-qualified",
  2097. },
  2098. [VPH_ALARM_IRQ] = {
  2099. .name = "vph-alarm",
  2100. },
  2101. [VPH_DROP_PRECHG_IRQ] = {
  2102. .name = "vph-drop-prechg",
  2103. },
  2104. /* DCDC IRQs */
  2105. [OTG_FAIL_IRQ] = {
  2106. .name = "otg-fail",
  2107. .handler = smb5_default_irq_handler,
  2108. },
  2109. [OTG_OC_DISABLE_SW_IRQ] = {
  2110. .name = "otg-oc-disable-sw",
  2111. },
  2112. [OTG_OC_HICCUP_IRQ] = {
  2113. .name = "otg-oc-hiccup",
  2114. },
  2115. [BSM_ACTIVE_IRQ] = {
  2116. .name = "bsm-active",
  2117. },
  2118. [HIGH_DUTY_CYCLE_IRQ] = {
  2119. .name = "high-duty-cycle",
  2120. .handler = smb5_high_duty_cycle_irq_handler,
  2121. .wake = true,
  2122. },
  2123. [INPUT_CURRENT_LIMITING_IRQ] = {
  2124. .name = "input-current-limiting",
  2125. .handler = smb5_default_irq_handler,
  2126. },
  2127. [CONCURRENT_MODE_DISABLE_IRQ] = {
  2128. .name = "concurrent-mode-disable",
  2129. },
  2130. [SWITCHER_POWER_OK_IRQ] = {
  2131. .name = "switcher-power-ok",
  2132. .handler = smb5_switcher_power_ok_irq_handler,
  2133. },
  2134. /* BATTERY IRQs */
  2135. [BAT_TEMP_IRQ] = {
  2136. .name = "bat-temp",
  2137. .handler = smb5_batt_temp_changed_irq_handler,
  2138. .wake = true,
  2139. },
  2140. [ALL_CHNL_CONV_DONE_IRQ] = {
  2141. .name = "all-chnl-conv-done",
  2142. },
  2143. [BAT_OV_IRQ] = {
  2144. .name = "bat-ov",
  2145. .handler = smb5_batt_psy_changed_irq_handler,
  2146. },
  2147. [BAT_LOW_IRQ] = {
  2148. .name = "bat-low",
  2149. .handler = smb5_batt_psy_changed_irq_handler,
  2150. },
  2151. [BAT_THERM_OR_ID_MISSING_IRQ] = {
  2152. .name = "bat-therm-or-id-missing",
  2153. .handler = smb5_batt_psy_changed_irq_handler,
  2154. },
  2155. [BAT_TERMINAL_MISSING_IRQ] = {
  2156. .name = "bat-terminal-missing",
  2157. .handler = smb5_batt_psy_changed_irq_handler,
  2158. },
  2159. [BUCK_OC_IRQ] = {
  2160. .name = "buck-oc",
  2161. },
  2162. [VPH_OV_IRQ] = {
  2163. .name = "vph-ov",
  2164. },
  2165. /* USB INPUT IRQs */
  2166. [USBIN_COLLAPSE_IRQ] = {
  2167. .name = "usbin-collapse",
  2168. .handler = smb5_default_irq_handler,
  2169. },
  2170. [USBIN_VASHDN_IRQ] = {
  2171. .name = "usbin-vashdn",
  2172. .handler = smb5_default_irq_handler,
  2173. },
  2174. [USBIN_UV_IRQ] = {
  2175. .name = "usbin-uv",
  2176. .handler = smb5_usbin_uv_irq_handler,
  2177. .wake = true,
  2178. .storm_data = {true, 3000, 5},
  2179. },
  2180. [USBIN_OV_IRQ] = {
  2181. .name = "usbin-ov",
  2182. .handler = smb5_usbin_ov_irq_handler,
  2183. },
  2184. [USBIN_PLUGIN_IRQ] = {
  2185. .name = "usbin-plugin",
  2186. .handler = smb5_usb_plugin_irq_handler,
  2187. .wake = true,
  2188. },
  2189. [USBIN_REVI_CHANGE_IRQ] = {
  2190. .name = "usbin-revi-change",
  2191. },
  2192. [USBIN_SRC_CHANGE_IRQ] = {
  2193. .name = "usbin-src-change",
  2194. .handler = smb5_usb_source_change_irq_handler,
  2195. .wake = true,
  2196. },
  2197. [USBIN_ICL_CHANGE_IRQ] = {
  2198. .name = "usbin-icl-change",
  2199. .handler = smb5_icl_change_irq_handler,
  2200. .wake = true,
  2201. },
  2202. /* DC INPUT IRQs */
  2203. [DCIN_VASHDN_IRQ] = {
  2204. .name = "dcin-vashdn",
  2205. },
  2206. [DCIN_UV_IRQ] = {
  2207. .name = "dcin-uv",
  2208. .handler = smb5_dcin_uv_irq_handler,
  2209. .wake = true,
  2210. },
  2211. [DCIN_OV_IRQ] = {
  2212. .name = "dcin-ov",
  2213. .handler = smb5_default_irq_handler,
  2214. },
  2215. [DCIN_PLUGIN_IRQ] = {
  2216. .name = "dcin-plugin",
  2217. .handler = smb5_dc_plugin_irq_handler,
  2218. .wake = true,
  2219. },
  2220. [DCIN_REVI_IRQ] = {
  2221. .name = "dcin-revi",
  2222. },
  2223. [DCIN_PON_IRQ] = {
  2224. .name = "dcin-pon",
  2225. .handler = smb5_default_irq_handler,
  2226. },
  2227. [DCIN_EN_IRQ] = {
  2228. .name = "dcin-en",
  2229. .handler = smb5_default_irq_handler,
  2230. },
  2231. /* TYPEC IRQs */
  2232. [TYPEC_OR_RID_DETECTION_CHANGE_IRQ] = {
  2233. .name = "typec-or-rid-detect-change",
  2234. .handler = smb5_typec_or_rid_detection_change_irq_handler,
  2235. .wake = true,
  2236. },
  2237. [TYPEC_VPD_DETECT_IRQ] = {
  2238. .name = "typec-vpd-detect",
  2239. },
  2240. [TYPEC_CC_STATE_CHANGE_IRQ] = {
  2241. .name = "typec-cc-state-change",
  2242. .handler = smb5_typec_state_change_irq_handler,
  2243. .wake = true,
  2244. },
  2245. [TYPEC_VCONN_OC_IRQ] = {
  2246. .name = "typec-vconn-oc",
  2247. .handler = smb5_default_irq_handler,
  2248. },
  2249. [TYPEC_VBUS_CHANGE_IRQ] = {
  2250. .name = "typec-vbus-change",
  2251. },
  2252. [TYPEC_ATTACH_DETACH_IRQ] = {
  2253. .name = "typec-attach-detach",
  2254. .handler = smb5_typec_attach_detach_irq_handler,
  2255. .wake = true,
  2256. },
  2257. [TYPEC_LEGACY_CABLE_DETECT_IRQ] = {
  2258. .name = "typec-legacy-cable-detect",
  2259. .handler = smb5_default_irq_handler,
  2260. },
  2261. [TYPEC_TRY_SNK_SRC_DETECT_IRQ] = {
  2262. .name = "typec-try-snk-src-detect",
  2263. },
  2264. /* MISCELLANEOUS IRQs */
  2265. [WDOG_SNARL_IRQ] = {
  2266. .name = "wdog-snarl",
  2267. .handler = smb5_wdog_snarl_irq_handler,
  2268. .wake = true,
  2269. },
  2270. [WDOG_BARK_IRQ] = {
  2271. .name = "wdog-bark",
  2272. .handler = smb5_wdog_bark_irq_handler,
  2273. .wake = true,
  2274. },
  2275. [AICL_FAIL_IRQ] = {
  2276. .name = "aicl-fail",
  2277. },
  2278. [AICL_DONE_IRQ] = {
  2279. .name = "aicl-done",
  2280. .handler = smb5_default_irq_handler,
  2281. },
  2282. [SMB_EN_IRQ] = {
  2283. .name = "smb-en",
  2284. .handler = smb5_smb_en_irq_handler,
  2285. },
  2286. [IMP_TRIGGER_IRQ] = {
  2287. .name = "imp-trigger",
  2288. },
  2289. /*
  2290. * triggered when DIE or SKIN or CONNECTOR temperature across
  2291. * either of the _REG_L, _REG_H, _RST, or _SHDN thresholds
  2292. */
  2293. [TEMP_CHANGE_IRQ] = {
  2294. .name = "temp-change",
  2295. .handler = smb5_temp_change_irq_handler,
  2296. .wake = true,
  2297. },
  2298. [TEMP_CHANGE_SMB_IRQ] = {
  2299. .name = "temp-change-smb",
  2300. },
  2301. /* FLASH */
  2302. [VREG_OK_IRQ] = {
  2303. .name = "vreg-ok",
  2304. },
  2305. [ILIM_S2_IRQ] = {
  2306. .name = "ilim2-s2",
  2307. .handler = smb5_schgm_flash_ilim2_irq_handler,
  2308. },
  2309. [ILIM_S1_IRQ] = {
  2310. .name = "ilim1-s1",
  2311. },
  2312. [VOUT_DOWN_IRQ] = {
  2313. .name = "vout-down",
  2314. },
  2315. [VOUT_UP_IRQ] = {
  2316. .name = "vout-up",
  2317. },
  2318. [FLASH_STATE_CHANGE_IRQ] = {
  2319. .name = "flash-state-change",
  2320. .handler = smb5_schgm_flash_state_change_irq_handler,
  2321. },
  2322. [TORCH_REQ_IRQ] = {
  2323. .name = "torch-req",
  2324. },
  2325. [FLASH_EN_IRQ] = {
  2326. .name = "flash-en",
  2327. },
  2328. /* SDAM */
  2329. [SDAM_STS_IRQ] = {
  2330. .name = "sdam-sts",
  2331. .handler = smb5_sdam_sts_change_irq_handler,
  2332. },
  2333. };
  2334. static int smb5_get_irq_index_byname(const char *irq_name)
  2335. {
  2336. int i;
  2337. for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
  2338. if (strcmp(smb5_irqs[i].name, irq_name) == 0)
  2339. return i;
  2340. }
  2341. return -ENOENT;
  2342. }
  2343. static int smb5_request_interrupt(struct smb5 *chip,
  2344. struct device_node *node, const char *irq_name)
  2345. {
  2346. struct smb_charger *chg = &chip->chg;
  2347. int rc, irq, irq_index;
  2348. struct smb_irq_data *irq_data;
  2349. irq = of_irq_get_byname(node, irq_name);
  2350. if (irq < 0) {
  2351. pr_err("Couldn't get irq %s byname\n", irq_name);
  2352. return irq;
  2353. }
  2354. irq_index = smb5_get_irq_index_byname(irq_name);
  2355. if (irq_index < 0) {
  2356. pr_err("%s is not a defined irq\n", irq_name);
  2357. return irq_index;
  2358. }
  2359. if (!smb5_irqs[irq_index].handler)
  2360. return 0;
  2361. irq_data = devm_kzalloc(chg->dev, sizeof(*irq_data), GFP_KERNEL);
  2362. if (!irq_data)
  2363. return -ENOMEM;
  2364. irq_data->parent_data = chip;
  2365. irq_data->name = irq_name;
  2366. irq_data->storm_data = smb5_irqs[irq_index].storm_data;
  2367. mutex_init(&irq_data->storm_data.storm_lock);
  2368. smb5_irqs[irq_index].enabled = true;
  2369. rc = devm_request_threaded_irq(chg->dev, irq, NULL,
  2370. smb5_irqs[irq_index].handler,
  2371. IRQF_ONESHOT, irq_name, irq_data);
  2372. if (rc < 0) {
  2373. pr_err("Couldn't request irq %d\n", irq);
  2374. return rc;
  2375. }
  2376. smb5_irqs[irq_index].irq = irq;
  2377. smb5_irqs[irq_index].irq_data = irq_data;
  2378. if (smb5_irqs[irq_index].wake)
  2379. enable_irq_wake(irq);
  2380. return rc;
  2381. }
  2382. static int smb5_request_interrupts(struct smb5 *chip)
  2383. {
  2384. struct smb_charger *chg = &chip->chg;
  2385. struct device_node *node = chg->dev->of_node;
  2386. struct device_node *child;
  2387. int rc = 0;
  2388. const char *name;
  2389. struct property *prop;
  2390. for_each_available_child_of_node(node, child) {
  2391. of_property_for_each_string(child, "interrupt-names",
  2392. prop, name) {
  2393. rc = smb5_request_interrupt(chip, child, name);
  2394. if (rc < 0)
  2395. return rc;
  2396. }
  2397. }
  2398. vote(chg->limited_irq_disable_votable, CHARGER_TYPE_VOTER, true, 0);
  2399. vote(chg->hdc_irq_disable_votable, CHARGER_TYPE_VOTER, true, 0);
  2400. return rc;
  2401. }
  2402. static void smb5_free_interrupts(struct smb_charger *chg)
  2403. {
  2404. int i;
  2405. for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
  2406. if (smb5_irqs[i].irq > 0)
  2407. if (smb5_irqs[i].wake)
  2408. disable_irq_wake(smb5_irqs[i].irq);
  2409. }
  2410. }
  2411. static void smb5_disable_interrupts(struct smb_charger *chg)
  2412. {
  2413. int i;
  2414. for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
  2415. if (smb5_irqs[i].irq > 0)
  2416. disable_irq(smb5_irqs[i].irq);
  2417. }
  2418. }
  2419. #if defined(CONFIG_DEBUG_FS)
  2420. static int force_batt_psy_update_write(void *data, u64 val)
  2421. {
  2422. struct smb_charger *chg = data;
  2423. power_supply_changed(chg->batt_psy);
  2424. return 0;
  2425. }
  2426. DEFINE_DEBUGFS_ATTRIBUTE(force_batt_psy_update_ops, NULL,
  2427. force_batt_psy_update_write, "0x%02llx\n");
  2428. static int force_usb_psy_update_write(void *data, u64 val)
  2429. {
  2430. struct smb_charger *chg = data;
  2431. power_supply_changed(chg->usb_psy);
  2432. return 0;
  2433. }
  2434. DEFINE_DEBUGFS_ATTRIBUTE(force_usb_psy_update_ops, NULL,
  2435. force_usb_psy_update_write, "0x%02llx\n");
  2436. static int force_dc_psy_update_write(void *data, u64 val)
  2437. {
  2438. struct smb_charger *chg = data;
  2439. power_supply_changed(chg->dc_psy);
  2440. return 0;
  2441. }
  2442. DEFINE_DEBUGFS_ATTRIBUTE(force_dc_psy_update_ops, NULL,
  2443. force_dc_psy_update_write, "0x%02llx\n");
  2444. static void smb5_create_debugfs(struct smb5 *chip)
  2445. {
  2446. struct dentry *file;
  2447. chip->dfs_root = debugfs_create_dir("charger", NULL);
  2448. if (IS_ERR_OR_NULL(chip->dfs_root)) {
  2449. pr_err("Couldn't create charger debugfs rc=%ld\n",
  2450. (long)chip->dfs_root);
  2451. return;
  2452. }
  2453. file = debugfs_create_file("force_batt_psy_update", 0600,
  2454. chip->dfs_root, chip, &force_batt_psy_update_ops);
  2455. if (IS_ERR_OR_NULL(file))
  2456. pr_err("Couldn't create force_batt_psy_update file rc=%ld\n",
  2457. (long)file);
  2458. file = debugfs_create_file("force_usb_psy_update", 0600,
  2459. chip->dfs_root, chip, &force_usb_psy_update_ops);
  2460. if (IS_ERR_OR_NULL(file))
  2461. pr_err("Couldn't create force_usb_psy_update file rc=%ld\n",
  2462. (long)file);
  2463. file = debugfs_create_file("force_dc_psy_update", 0600,
  2464. chip->dfs_root, chip, &force_dc_psy_update_ops);
  2465. if (IS_ERR_OR_NULL(file))
  2466. pr_err("Couldn't create force_dc_psy_update file rc=%ld\n",
  2467. (long)file);
  2468. debugfs_create_u32("debug_mask", 0600, chip->dfs_root,
  2469. &__debug_mask);
  2470. }
  2471. #else
  2472. static void smb5_create_debugfs(struct smb5 *chip)
  2473. {}
  2474. #endif
  2475. static int smb5_show_charger_status(struct smb5 *chip)
  2476. {
  2477. struct smb_charger *chg = &chip->chg;
  2478. union power_supply_propval val;
  2479. int usb_present, batt_present, batt_health, batt_charge_type;
  2480. int rc;
  2481. rc = smblib_get_prop_usb_present(chg, &val);
  2482. if (rc < 0) {
  2483. pr_err("Couldn't get usb present rc=%d\n", rc);
  2484. return rc;
  2485. }
  2486. usb_present = val.intval;
  2487. rc = smblib_get_prop_batt_present(chg, &val);
  2488. if (rc < 0) {
  2489. pr_err("Couldn't get batt present rc=%d\n", rc);
  2490. return rc;
  2491. }
  2492. batt_present = val.intval;
  2493. rc = smblib_get_prop_batt_health(chg, &val);
  2494. if (rc < 0) {
  2495. pr_err("Couldn't get batt health rc=%d\n", rc);
  2496. val.intval = POWER_SUPPLY_HEALTH_UNKNOWN;
  2497. }
  2498. batt_health = val.intval;
  2499. rc = smblib_get_prop_batt_charge_type(chg, &val);
  2500. if (rc < 0) {
  2501. pr_err("Couldn't get batt charge type rc=%d\n", rc);
  2502. return rc;
  2503. }
  2504. batt_charge_type = val.intval;
  2505. pr_info("SMB5 status - usb:present=%d type=%d batt:present = %d health = %d charge = %d\n",
  2506. usb_present, chg->real_charger_type,
  2507. batt_present, batt_health, batt_charge_type);
  2508. return rc;
  2509. }
  2510. /*********************************
  2511. * TYPEC CLASS REGISTRATION *
  2512. **********************************/
  2513. static int smb5_init_typec_class(struct smb5 *chip)
  2514. {
  2515. struct smb_charger *chg = &chip->chg;
  2516. int rc = 0;
  2517. mutex_init(&chg->typec_lock);
  2518. /* Register typec class for only non-PD TypeC and uUSB designs */
  2519. if (!chg->pd_not_supported)
  2520. return rc;
  2521. chg->typec_caps.type = TYPEC_PORT_DRP;
  2522. chg->typec_caps.data = TYPEC_PORT_DRD;
  2523. chg->typec_partner_desc.usb_pd = false;
  2524. chg->typec_partner_desc.accessory = TYPEC_ACCESSORY_NONE;
  2525. chg->typec_caps.revision = 0x0130;
  2526. chg->typec_port = typec_register_port(chg->dev, &chg->typec_caps);
  2527. if (IS_ERR(chg->typec_port)) {
  2528. rc = PTR_ERR(chg->typec_port);
  2529. pr_err("failed to register typec_port rc=%d\n", rc);
  2530. return rc;
  2531. }
  2532. return rc;
  2533. }
  2534. static int smb5_fwnode_xlate(struct iio_dev *indio_dev,
  2535. const struct fwnode_reference_args *iiospec)
  2536. {
  2537. struct smb5 *iio_chip = iio_priv(indio_dev);
  2538. struct iio_chan_spec *iio_chan = iio_chip->iio_chan_ids;
  2539. int i;
  2540. for (i = 0; i < iio_chip->nchannels; i++, iio_chan++)
  2541. if (iio_chan->channel == iiospec->args[0])
  2542. return i;
  2543. return -EINVAL;
  2544. }
  2545. static int smb5_read_raw(struct iio_dev *indio_dev,
  2546. struct iio_chan_spec const *chan, int *val, int *val2,
  2547. long mask)
  2548. {
  2549. struct smb5 *iio_chip = iio_priv(indio_dev);
  2550. struct smb_charger *chg = &iio_chip->chg;
  2551. return smb5_iio_get_prop(chg, chan->channel, val);
  2552. }
  2553. static int smb5_write_raw(struct iio_dev *indio_dev,
  2554. struct iio_chan_spec const *chan, int val, int val2,
  2555. long mask)
  2556. {
  2557. struct smb5 *iio_chip = iio_priv(indio_dev);
  2558. struct smb_charger *chg = &iio_chip->chg;
  2559. return smb5_iio_set_prop(chg, chan->channel, val);
  2560. }
  2561. static const struct iio_info smb5_iio_info = {
  2562. .read_raw = smb5_read_raw,
  2563. .write_raw = smb5_write_raw,
  2564. .fwnode_xlate = smb5_fwnode_xlate,
  2565. };
  2566. static int smb5_direct_iio_read(struct device *dev, int iio_chan_no, int *val)
  2567. {
  2568. struct smb5 *chip = dev_get_drvdata(dev);
  2569. struct smb_charger *chg = &chip->chg;
  2570. int rc;
  2571. rc = smb5_iio_get_prop(chg, iio_chan_no, val);
  2572. return (rc < 0) ? rc : 0;
  2573. }
  2574. static int smb5_direct_iio_write(struct device *dev, int iio_chan_no, int val)
  2575. {
  2576. struct smb5 *chip = dev_get_drvdata(dev);
  2577. struct smb_charger *chg = &chip->chg;
  2578. return smb5_iio_set_prop(chg, iio_chan_no, val);
  2579. }
  2580. static int smb5_iio_init(struct smb5 *chip, struct platform_device *pdev,
  2581. struct iio_dev *indio_dev)
  2582. {
  2583. struct iio_chan_spec *iio_chan;
  2584. int i, rc;
  2585. for (i = 0; i < chip->nchannels; i++) {
  2586. chip->iio_chans[i].indio_dev = indio_dev;
  2587. iio_chan = &chip->iio_chan_ids[i];
  2588. chip->iio_chans[i].channel = iio_chan;
  2589. iio_chan->channel = smb5_chans_pmic[i].channel_num;
  2590. iio_chan->datasheet_name = smb5_chans_pmic[i].datasheet_name;
  2591. iio_chan->extend_name = smb5_chans_pmic[i].datasheet_name;
  2592. iio_chan->info_mask_separate = smb5_chans_pmic[i].info_mask;
  2593. iio_chan->type = smb5_chans_pmic[i].type;
  2594. iio_chan->address = i;
  2595. }
  2596. indio_dev->dev.parent = &pdev->dev;
  2597. indio_dev->dev.of_node = pdev->dev.of_node;
  2598. indio_dev->name = "qpnp-smb5";
  2599. indio_dev->modes = INDIO_DIRECT_MODE;
  2600. indio_dev->channels = chip->iio_chan_ids;
  2601. indio_dev->num_channels = chip->nchannels;
  2602. rc = devm_iio_device_register(&pdev->dev, indio_dev);
  2603. if (rc)
  2604. pr_err("iio device register failed rc=%d\n", rc);
  2605. return rc;
  2606. }
  2607. int smb5_extcon_init(struct smb_charger *chg)
  2608. {
  2609. int rc;
  2610. /* extcon registration */
  2611. chg->extcon = devm_extcon_dev_allocate(chg->dev, smblib_extcon_cable);
  2612. if (IS_ERR(chg->extcon)) {
  2613. rc = PTR_ERR(chg->extcon);
  2614. dev_err(chg->dev, "failed to allocate extcon device rc=%d\n",
  2615. rc);
  2616. return rc;
  2617. }
  2618. rc = devm_extcon_dev_register(chg->dev, chg->extcon);
  2619. if (rc < 0) {
  2620. dev_err(chg->dev, "failed to register extcon device rc=%d\n",
  2621. rc);
  2622. return rc;
  2623. }
  2624. /* Support reporting polarity and speed via properties */
  2625. rc = extcon_set_property_capability(chg->extcon,
  2626. EXTCON_USB, EXTCON_PROP_USB_TYPEC_POLARITY);
  2627. rc |= extcon_set_property_capability(chg->extcon,
  2628. EXTCON_USB, EXTCON_PROP_USB_SS);
  2629. rc |= extcon_set_property_capability(chg->extcon,
  2630. EXTCON_USB_HOST, EXTCON_PROP_USB_TYPEC_POLARITY);
  2631. rc |= extcon_set_property_capability(chg->extcon,
  2632. EXTCON_USB_HOST, EXTCON_PROP_USB_SS);
  2633. if (rc < 0)
  2634. dev_err(chg->dev,
  2635. "failed to configure extcon capabilities\n");
  2636. return rc;
  2637. }
  2638. static int smb5_probe(struct platform_device *pdev)
  2639. {
  2640. struct smb5 *chip;
  2641. struct iio_dev *indio_dev;
  2642. struct smb_charger *chg;
  2643. int rc = 0;
  2644. indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*chip));
  2645. if (!indio_dev)
  2646. return -ENOMEM;
  2647. indio_dev->info = &smb5_iio_info;
  2648. chip = iio_priv(indio_dev);
  2649. chip->nchannels = ARRAY_SIZE(smb5_chans_pmic);
  2650. chip->iio_chans = devm_kcalloc(&pdev->dev, chip->nchannels,
  2651. sizeof(*chip->iio_chans), GFP_KERNEL);
  2652. if (!chip->iio_chans)
  2653. return -ENOMEM;
  2654. chip->iio_chan_ids = devm_kcalloc(&pdev->dev, chip->nchannels,
  2655. sizeof(*chip->iio_chan_ids), GFP_KERNEL);
  2656. if (!chip->iio_chan_ids)
  2657. return -ENOMEM;
  2658. chg = &chip->chg;
  2659. chg->iio_chans = chip->iio_chans;
  2660. chg->iio_chan_list_qg = NULL;
  2661. chg->dev = &pdev->dev;
  2662. chg->debug_mask = &__debug_mask;
  2663. chg->pd_disabled = 0;
  2664. chg->weak_chg_icl_ua = 500000;
  2665. chg->mode = PARALLEL_MASTER;
  2666. chg->irq_info = smb5_irqs;
  2667. chg->die_health = -EINVAL;
  2668. chg->connector_health = -EINVAL;
  2669. chg->otg_present = false;
  2670. chg->main_fcc_max = -EINVAL;
  2671. mutex_init(&chg->adc_lock);
  2672. chg->regmap = dev_get_regmap(chg->dev->parent, NULL);
  2673. if (!chg->regmap) {
  2674. pr_err("parent regmap is missing\n");
  2675. return -EINVAL;
  2676. }
  2677. rc = smb5_iio_init(chip, pdev, indio_dev);
  2678. if (rc < 0)
  2679. return rc;
  2680. rc = smb5_chg_config_init(chip);
  2681. if (rc < 0) {
  2682. if (rc != -EPROBE_DEFER)
  2683. pr_err("Couldn't setup chg_config rc=%d\n", rc);
  2684. return rc;
  2685. }
  2686. rc = smb5_parse_dt(chip);
  2687. if (rc < 0) {
  2688. pr_err("Couldn't parse device tree rc=%d\n", rc);
  2689. return rc;
  2690. }
  2691. if (alarmtimer_get_rtcdev())
  2692. alarm_init(&chg->lpd_recheck_timer, ALARM_REALTIME,
  2693. smblib_lpd_recheck_timer);
  2694. else
  2695. return -EPROBE_DEFER;
  2696. /* set driver data before resources request it */
  2697. platform_set_drvdata(pdev, chip);
  2698. chg->chg_param.iio_read = smb5_direct_iio_read;
  2699. chg->chg_param.iio_write = smb5_direct_iio_write;
  2700. rc = smblib_init(chg);
  2701. if (rc < 0) {
  2702. pr_err("Smblib_init failed rc=%d\n", rc);
  2703. return rc;
  2704. }
  2705. rc = smb5_extcon_init(chg);
  2706. if (rc < 0)
  2707. goto cleanup;
  2708. rc = smb5_init_hw(chip);
  2709. if (rc < 0) {
  2710. pr_err("Couldn't initialize hardware rc=%d\n", rc);
  2711. goto cleanup;
  2712. }
  2713. /*
  2714. * VBUS regulator enablement/disablement for host mode is handled
  2715. * by USB-PD driver only. For micro-USB and non-PD typeC designs,
  2716. * the VBUS regulator is enabled/disabled by the smb driver itself
  2717. * before sending extcon notifications.
  2718. * Hence, register vbus and vconn regulators for PD supported designs
  2719. * only.
  2720. */
  2721. if (!chg->pd_not_supported) {
  2722. rc = smb5_init_vbus_regulator(chip);
  2723. if (rc < 0) {
  2724. pr_err("Couldn't initialize vbus regulator rc=%d\n",
  2725. rc);
  2726. goto cleanup;
  2727. }
  2728. rc = smb5_init_vconn_regulator(chip);
  2729. if (rc < 0) {
  2730. pr_err("Couldn't initialize vconn regulator rc=%d\n",
  2731. rc);
  2732. goto cleanup;
  2733. }
  2734. }
  2735. switch (chg->chg_param.smb_version) {
  2736. case PM8150B:
  2737. fallthrough;
  2738. case PM6150:
  2739. fallthrough;
  2740. case PM7250B:
  2741. rc = smb5_init_dc_psy(chip);
  2742. if (rc < 0) {
  2743. pr_err("Couldn't initialize dc psy rc=%d\n", rc);
  2744. goto cleanup;
  2745. }
  2746. break;
  2747. default:
  2748. break;
  2749. }
  2750. rc = smb5_init_usb_psy(chip);
  2751. if (rc < 0) {
  2752. pr_err("Couldn't initialize usb psy rc=%d\n", rc);
  2753. goto cleanup;
  2754. }
  2755. rc = smb5_init_usb_port_psy(chip);
  2756. if (rc < 0) {
  2757. pr_err("Couldn't initialize usb pc_port psy rc=%d\n", rc);
  2758. goto cleanup;
  2759. }
  2760. rc = smb5_init_batt_psy(chip);
  2761. if (rc < 0) {
  2762. pr_err("Couldn't initialize batt psy rc=%d\n", rc);
  2763. goto cleanup;
  2764. }
  2765. rc = smb5_init_typec_class(chip);
  2766. if (rc < 0) {
  2767. pr_err("Couldn't initialize typec class rc=%d\n", rc);
  2768. goto cleanup;
  2769. }
  2770. rc = smb5_determine_initial_status(chip);
  2771. if (rc < 0) {
  2772. pr_err("Couldn't determine initial status rc=%d\n",
  2773. rc);
  2774. goto cleanup;
  2775. }
  2776. rc = smb5_request_interrupts(chip);
  2777. if (rc < 0) {
  2778. pr_err("Couldn't request interrupts rc=%d\n", rc);
  2779. goto cleanup;
  2780. }
  2781. rc = smb5_post_init(chip);
  2782. if (rc < 0) {
  2783. pr_err("Failed in post init rc=%d\n", rc);
  2784. goto free_irq;
  2785. }
  2786. smb5_create_debugfs(chip);
  2787. rc = sysfs_create_groups(&chg->dev->kobj, smb5_groups);
  2788. if (rc < 0) {
  2789. pr_err("Couldn't create sysfs files rc=%d\n", rc);
  2790. goto free_irq;
  2791. }
  2792. rc = smb5_show_charger_status(chip);
  2793. if (rc < 0) {
  2794. pr_err("Failed in getting charger status rc=%d\n", rc);
  2795. goto free_irq;
  2796. }
  2797. device_init_wakeup(chg->dev, true);
  2798. pr_info("QPNP SMB5 probed successfully\n");
  2799. return rc;
  2800. free_irq:
  2801. smb5_free_interrupts(chg);
  2802. cleanup:
  2803. smblib_deinit(chg);
  2804. platform_set_drvdata(pdev, NULL);
  2805. return rc;
  2806. }
  2807. static int smb5_remove(struct platform_device *pdev)
  2808. {
  2809. struct smb5 *chip = platform_get_drvdata(pdev);
  2810. struct smb_charger *chg = &chip->chg;
  2811. /* force enable APSD */
  2812. smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
  2813. BC1P2_SRC_DETECT_BIT, BC1P2_SRC_DETECT_BIT);
  2814. smb5_free_interrupts(chg);
  2815. smblib_deinit(chg);
  2816. sysfs_remove_groups(&chg->dev->kobj, smb5_groups);
  2817. platform_set_drvdata(pdev, NULL);
  2818. return 0;
  2819. }
  2820. static void smb5_shutdown(struct platform_device *pdev)
  2821. {
  2822. struct smb5 *chip = platform_get_drvdata(pdev);
  2823. struct smb_charger *chg = &chip->chg;
  2824. /* disable all interrupts */
  2825. smb5_disable_interrupts(chg);
  2826. /* disable the SMB_EN configuration */
  2827. smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, EN_CP_CMD_BIT, 0);
  2828. /* configure power role for UFP */
  2829. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_TYPEC)
  2830. smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  2831. TYPEC_POWER_ROLE_CMD_MASK, EN_SNK_ONLY_BIT);
  2832. /* force enable and rerun APSD */
  2833. smblib_apsd_enable(chg, true);
  2834. smblib_hvdcp_exit_config(chg);
  2835. }
  2836. static const struct of_device_id match_table[] = {
  2837. {
  2838. .compatible = "qcom,pm8150-smb5",
  2839. .data = (void *)PM8150B,
  2840. },
  2841. {
  2842. .compatible = "qcom,pm7250b-smb5",
  2843. .data = (void *)PM7250B,
  2844. },
  2845. {
  2846. .compatible = "qcom,pm6150-smb5",
  2847. .data = (void *)PM6150,
  2848. },
  2849. {
  2850. .compatible = "qcom,pmi632-smb5",
  2851. .data = (void *)PMI632,
  2852. },
  2853. { },
  2854. };
  2855. static struct platform_driver smb5_driver = {
  2856. .driver = {
  2857. .name = "qcom,qpnp-smb5",
  2858. .of_match_table = match_table,
  2859. },
  2860. .probe = smb5_probe,
  2861. .remove = smb5_remove,
  2862. .shutdown = smb5_shutdown,
  2863. };
  2864. module_platform_driver(smb5_driver);
  2865. MODULE_DESCRIPTION("QPNP SMB5 Charger Driver");
  2866. MODULE_LICENSE("GPL");