smb5-lib.c 213 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513
  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/device.h>
  7. #include <linux/regmap.h>
  8. #include <linux/delay.h>
  9. #include <linux/power_supply.h>
  10. #include <linux/regulator/driver.h>
  11. #include <linux/irq.h>
  12. #include <linux/iio/consumer.h>
  13. #include <dt-bindings/iio/qti_power_supply_iio.h>
  14. #include <linux/pmic-voter.h>
  15. #include <linux/ktime.h>
  16. #include <linux/usb/typec.h>
  17. #include <linux/alarmtimer.h>
  18. #include "smb5-lib.h"
  19. #include "smb5-reg.h"
  20. #include "schgm-flash.h"
  21. #include "step-chg-jeita.h"
  22. #include "storm-watch.h"
  23. #include "smb5-iio.h"
  24. #include "battery-profile-loader.h"
  25. #define smblib_err(chg, fmt, ...) \
  26. pr_err("%s: %s: " fmt, chg->name, \
  27. __func__, ##__VA_ARGS__) \
  28. #define smblib_dbg(chg, reason, fmt, ...) \
  29. do { \
  30. if (*chg->debug_mask & (reason)) \
  31. pr_info("%s: %s: " fmt, chg->name, \
  32. __func__, ##__VA_ARGS__); \
  33. else \
  34. pr_debug("%s: %s: " fmt, chg->name, \
  35. __func__, ##__VA_ARGS__); \
  36. } while (0)
  37. #define typec_rp_med_high(chg, typec_mode) \
  38. ((typec_mode == QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM \
  39. || typec_mode == QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH) \
  40. && (!chg->typec_legacy || chg->typec_legacy_use_rp_icl))
  41. static void update_sw_icl_max(struct smb_charger *chg, int val);
  42. static int smblib_get_prop_typec_mode(struct smb_charger *chg);
  43. int smblib_read(struct smb_charger *chg, u16 addr, u8 *val)
  44. {
  45. unsigned int value;
  46. int rc = 0;
  47. rc = regmap_read(chg->regmap, addr, &value);
  48. if (rc >= 0)
  49. *val = (u8)value;
  50. return rc;
  51. }
  52. int smblib_batch_read(struct smb_charger *chg, u16 addr, u8 *val,
  53. int count)
  54. {
  55. return regmap_bulk_read(chg->regmap, addr, val, count);
  56. }
  57. int smblib_write(struct smb_charger *chg, u16 addr, u8 val)
  58. {
  59. return regmap_write(chg->regmap, addr, val);
  60. }
  61. int smblib_batch_write(struct smb_charger *chg, u16 addr, u8 *val,
  62. int count)
  63. {
  64. return regmap_bulk_write(chg->regmap, addr, val, count);
  65. }
  66. int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val)
  67. {
  68. return regmap_update_bits(chg->regmap, addr, mask, val);
  69. }
  70. int smblib_get_iio_channel(struct smb_charger *chg, const char *propname,
  71. struct iio_channel **chan)
  72. {
  73. int rc = 0;
  74. rc = of_property_match_string(chg->dev->of_node,
  75. "io-channel-names", propname);
  76. if (rc < 0)
  77. return 0;
  78. *chan = devm_iio_channel_get(chg->dev, propname);
  79. if (IS_ERR(*chan)) {
  80. rc = PTR_ERR(*chan);
  81. if (rc != -EPROBE_DEFER)
  82. smblib_err(chg, "%s channel unavailable, %d\n",
  83. propname, rc);
  84. *chan = NULL;
  85. }
  86. return rc;
  87. }
  88. #define DIV_FACTOR_MICRO_V_I 1
  89. #define DIV_FACTOR_MILI_V_I 1000
  90. #define DIV_FACTOR_DECIDEGC 100
  91. static int smblib_read_iio_channel(struct smb_charger *chg,
  92. struct iio_channel *chan, int div, int *data)
  93. {
  94. int rc = 0;
  95. *data = -ENODATA;
  96. if (chan) {
  97. rc = iio_read_channel_processed(chan, data);
  98. if (rc < 0) {
  99. smblib_err(chg, "Error in reading IIO channel data, rc=%d\n",
  100. rc);
  101. return rc;
  102. }
  103. if (div != 0)
  104. *data /= div;
  105. }
  106. return rc;
  107. }
  108. static int smblib_get_jeita_cc_delta(struct smb_charger *chg, int *cc_delta_ua)
  109. {
  110. int rc, cc_minus_ua;
  111. u8 stat;
  112. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_7_REG, &stat);
  113. if (rc < 0) {
  114. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
  115. rc);
  116. return rc;
  117. }
  118. if (stat & BAT_TEMP_STATUS_HOT_SOFT_BIT) {
  119. rc = smblib_get_charge_param(chg, &chg->param.jeita_cc_comp_hot,
  120. &cc_minus_ua);
  121. if (rc < 0) {
  122. smblib_err(chg, "Couldn't get jeita cc minus rc=%d\n",
  123. rc);
  124. return rc;
  125. }
  126. } else if (stat & BAT_TEMP_STATUS_COLD_SOFT_BIT) {
  127. rc = smblib_get_charge_param(chg,
  128. &chg->param.jeita_cc_comp_cold,
  129. &cc_minus_ua);
  130. if (rc < 0) {
  131. smblib_err(chg, "Couldn't get jeita cc minus rc=%d\n",
  132. rc);
  133. return rc;
  134. }
  135. } else {
  136. cc_minus_ua = 0;
  137. }
  138. *cc_delta_ua = -cc_minus_ua;
  139. return 0;
  140. }
  141. int smblib_icl_override(struct smb_charger *chg, enum icl_override_mode mode)
  142. {
  143. int rc;
  144. u8 usb51_mode, icl_override, apsd_override;
  145. switch (mode) {
  146. case SW_OVERRIDE_USB51_MODE:
  147. usb51_mode = 0;
  148. icl_override = ICL_OVERRIDE_BIT;
  149. apsd_override = 0;
  150. break;
  151. case SW_OVERRIDE_HC_MODE:
  152. usb51_mode = USBIN_MODE_CHG_BIT;
  153. icl_override = 0;
  154. apsd_override = ICL_OVERRIDE_AFTER_APSD_BIT;
  155. break;
  156. case HW_AUTO_MODE:
  157. default:
  158. usb51_mode = USBIN_MODE_CHG_BIT;
  159. icl_override = 0;
  160. apsd_override = 0;
  161. break;
  162. }
  163. rc = smblib_masked_write(chg, USBIN_ICL_OPTIONS_REG,
  164. USBIN_MODE_CHG_BIT, usb51_mode);
  165. if (rc < 0) {
  166. smblib_err(chg, "Couldn't set USBIN_ICL_OPTIONS rc=%d\n", rc);
  167. return rc;
  168. }
  169. rc = smblib_masked_write(chg, CMD_ICL_OVERRIDE_REG,
  170. ICL_OVERRIDE_BIT, icl_override);
  171. if (rc < 0) {
  172. smblib_err(chg, "Couldn't override ICL rc=%d\n", rc);
  173. return rc;
  174. }
  175. rc = smblib_masked_write(chg, USBIN_LOAD_CFG_REG,
  176. ICL_OVERRIDE_AFTER_APSD_BIT, apsd_override);
  177. if (rc < 0) {
  178. smblib_err(chg, "Couldn't override ICL_AFTER_APSD rc=%d\n", rc);
  179. return rc;
  180. }
  181. return rc;
  182. }
  183. /*
  184. * This function does smb_en pin access, which is lock protected.
  185. * It should be called with smb_lock held.
  186. */
  187. static int smblib_select_sec_charger_locked(struct smb_charger *chg,
  188. int sec_chg)
  189. {
  190. int rc = 0;
  191. switch (sec_chg) {
  192. case QTI_POWER_SUPPLY_CHARGER_SEC_CP:
  193. vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, true, 0);
  194. /* select Charge Pump instead of slave charger */
  195. rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
  196. SMB_EN_SEL_BIT, SMB_EN_SEL_BIT);
  197. if (rc < 0) {
  198. dev_err(chg->dev, "Couldn't select SMB charger rc=%d\n",
  199. rc);
  200. return rc;
  201. }
  202. /* Enable Charge Pump, under HW control */
  203. rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
  204. EN_CP_CMD_BIT, EN_CP_CMD_BIT);
  205. if (rc < 0) {
  206. dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n",
  207. rc);
  208. return rc;
  209. }
  210. vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0);
  211. break;
  212. case QTI_POWER_SUPPLY_CHARGER_SEC_PL:
  213. /* select slave charger instead of Charge Pump */
  214. rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
  215. SMB_EN_SEL_BIT, 0);
  216. if (rc < 0) {
  217. dev_err(chg->dev, "Couldn't select SMB charger rc=%d\n",
  218. rc);
  219. return rc;
  220. }
  221. /* Enable slave charger, under HW control */
  222. rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
  223. EN_STAT_CMD_BIT, EN_STAT_CMD_BIT);
  224. if (rc < 0) {
  225. dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n",
  226. rc);
  227. return rc;
  228. }
  229. vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0);
  230. vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, false, 0);
  231. break;
  232. case QTI_POWER_SUPPLY_CHARGER_SEC_NONE:
  233. default:
  234. vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, true, 0);
  235. /* SW override, disabling secondary charger(s) */
  236. vote(chg->smb_override_votable, PL_SMB_EN_VOTER, true, 0);
  237. break;
  238. }
  239. return rc;
  240. }
  241. static int smblib_select_sec_charger(struct smb_charger *chg, int sec_chg,
  242. int reason, bool toggle)
  243. {
  244. int rc;
  245. mutex_lock(&chg->smb_lock);
  246. if (toggle && sec_chg == QTI_POWER_SUPPLY_CHARGER_SEC_CP) {
  247. rc = smblib_select_sec_charger_locked(chg,
  248. QTI_POWER_SUPPLY_CHARGER_SEC_NONE);
  249. if (rc < 0) {
  250. dev_err(chg->dev, "Couldn't disable secondary charger rc=%d\n",
  251. rc);
  252. goto unlock_out;
  253. }
  254. /*
  255. * A minimum of 20us delay is expected before switching on STAT
  256. * pin.
  257. */
  258. usleep_range(20, 30);
  259. }
  260. rc = smblib_select_sec_charger_locked(chg, sec_chg);
  261. if (rc < 0) {
  262. dev_err(chg->dev, "Couldn't switch secondary charger rc=%d\n",
  263. rc);
  264. goto unlock_out;
  265. }
  266. chg->sec_chg_selected = sec_chg;
  267. chg->cp_reason = reason;
  268. unlock_out:
  269. mutex_unlock(&chg->smb_lock);
  270. return rc;
  271. }
  272. static void smblib_notify_extcon_props(struct smb_charger *chg, int id)
  273. {
  274. union extcon_property_value val;
  275. int prop_val;
  276. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_TYPEC) {
  277. smblib_get_prop_typec_cc_orientation(chg, &prop_val);
  278. val.intval = ((prop_val == 2) ? 1 : 0);
  279. extcon_set_property(chg->extcon, id,
  280. EXTCON_PROP_USB_TYPEC_POLARITY, val);
  281. val.intval = true;
  282. extcon_set_property(chg->extcon, id,
  283. EXTCON_PROP_USB_SS, val);
  284. } else if (chg->connector_type ==
  285. QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) {
  286. val.intval = false;
  287. extcon_set_property(chg->extcon, id,
  288. EXTCON_PROP_USB_SS, val);
  289. }
  290. }
  291. static void smblib_notify_device_mode(struct smb_charger *chg, bool enable)
  292. {
  293. if (enable)
  294. smblib_notify_extcon_props(chg, EXTCON_USB);
  295. extcon_set_state_sync(chg->extcon, EXTCON_USB, enable);
  296. }
  297. static void smblib_notify_usb_host(struct smb_charger *chg, bool enable)
  298. {
  299. int rc = 0;
  300. if (enable) {
  301. smblib_dbg(chg, PR_OTG, "enabling VBUS in OTG mode\n");
  302. rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG,
  303. OTG_EN_BIT, OTG_EN_BIT);
  304. if (rc < 0) {
  305. smblib_err(chg,
  306. "Couldn't enable VBUS in OTG mode rc=%d\n", rc);
  307. return;
  308. }
  309. smblib_notify_extcon_props(chg, EXTCON_USB_HOST);
  310. } else {
  311. smblib_dbg(chg, PR_OTG, "disabling VBUS in OTG mode\n");
  312. rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG,
  313. OTG_EN_BIT, 0);
  314. if (rc < 0) {
  315. smblib_err(chg,
  316. "Couldn't disable VBUS in OTG mode rc=%d\n",
  317. rc);
  318. return;
  319. }
  320. }
  321. extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable);
  322. }
  323. /********************
  324. * REGISTER GETTERS *
  325. ********************/
  326. int smblib_get_charge_param(struct smb_charger *chg,
  327. struct smb_chg_param *param, int *val_u)
  328. {
  329. int rc = 0;
  330. u8 val_raw;
  331. rc = smblib_read(chg, param->reg, &val_raw);
  332. if (rc < 0) {
  333. smblib_err(chg, "%s: Couldn't read from 0x%04x rc=%d\n",
  334. param->name, param->reg, rc);
  335. return rc;
  336. }
  337. if (param->get_proc)
  338. *val_u = param->get_proc(param, val_raw);
  339. else
  340. *val_u = val_raw * param->step_u + param->min_u;
  341. smblib_dbg(chg, PR_REGISTER, "%s = %d (0x%02x)\n",
  342. param->name, *val_u, val_raw);
  343. return rc;
  344. }
  345. static int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend)
  346. {
  347. int rc = 0;
  348. u8 temp;
  349. rc = smblib_read(chg, USBIN_CMD_IL_REG, &temp);
  350. if (rc < 0) {
  351. smblib_err(chg, "Couldn't read USBIN_CMD_IL rc=%d\n", rc);
  352. return rc;
  353. }
  354. *suspend = temp & USBIN_SUSPEND_BIT;
  355. return rc;
  356. }
  357. static const s16 therm_lookup_table[] = {
  358. /* Index -30C~85C, ADC raw code */
  359. 0x6C92, 0x6C43, 0x6BF0, 0x6B98, 0x6B3A, 0x6AD8, 0x6A70, 0x6A03,
  360. 0x6990, 0x6916, 0x6897, 0x6811, 0x6785, 0x66F2, 0x6658, 0x65B7,
  361. 0x650F, 0x6460, 0x63AA, 0x62EC, 0x6226, 0x6159, 0x6084, 0x5FA8,
  362. 0x5EC3, 0x5DD8, 0x5CE4, 0x5BE9, 0x5AE7, 0x59DD, 0x58CD, 0x57B5,
  363. 0x5696, 0x5571, 0x5446, 0x5314, 0x51DD, 0x50A0, 0x4F5E, 0x4E17,
  364. 0x4CCC, 0x4B7D, 0x4A2A, 0x48D4, 0x477C, 0x4621, 0x44C4, 0x4365,
  365. 0x4206, 0x40A6, 0x3F45, 0x3DE6, 0x3C86, 0x3B28, 0x39CC, 0x3872,
  366. 0x3719, 0x35C4, 0x3471, 0x3322, 0x31D7, 0x308F, 0x2F4C, 0x2E0D,
  367. 0x2CD3, 0x2B9E, 0x2A6E, 0x2943, 0x281D, 0x26FE, 0x25E3, 0x24CF,
  368. 0x23C0, 0x22B8, 0x21B5, 0x20B8, 0x1FC2, 0x1ED1, 0x1DE6, 0x1D01,
  369. 0x1C22, 0x1B49, 0x1A75, 0x19A8, 0x18E0, 0x181D, 0x1761, 0x16A9,
  370. 0x15F7, 0x154A, 0x14A2, 0x13FF, 0x1361, 0x12C8, 0x1234, 0x11A4,
  371. 0x1119, 0x1091, 0x100F, 0x0F90, 0x0F15, 0x0E9E, 0x0E2B, 0x0DBC,
  372. 0x0D50, 0x0CE8, 0x0C83, 0x0C21, 0x0BC3, 0x0B67, 0x0B0F, 0x0AB9,
  373. 0x0A66, 0x0A16, 0x09C9, 0x097E,
  374. };
  375. int smblib_get_thermal_threshold(struct smb_charger *chg, u16 addr, int *val)
  376. {
  377. u8 buff[2];
  378. s16 temp;
  379. int rc = 0;
  380. int i, lower, upper;
  381. rc = smblib_batch_read(chg, addr, buff, 2);
  382. if (rc < 0) {
  383. pr_err("failed to write to 0x%04X, rc=%d\n", addr, rc);
  384. return rc;
  385. }
  386. temp = buff[1] | buff[0] << 8;
  387. lower = 0;
  388. upper = ARRAY_SIZE(therm_lookup_table) - 1;
  389. while (lower <= upper) {
  390. i = (upper + lower) / 2;
  391. if (therm_lookup_table[i] < temp)
  392. upper = i - 1;
  393. else if (therm_lookup_table[i] > temp)
  394. lower = i + 1;
  395. else
  396. break;
  397. }
  398. /* index 0 corresonds to -30C */
  399. *val = (i - 30) * 10;
  400. return rc;
  401. }
  402. struct apsd_result {
  403. const char * const name;
  404. const u8 bit;
  405. const int val;
  406. };
  407. enum {
  408. UNKNOWN,
  409. SDP,
  410. CDP,
  411. DCP,
  412. OCP,
  413. FLOAT,
  414. HVDCP2,
  415. HVDCP3,
  416. MAX_TYPES
  417. };
  418. static const struct apsd_result smblib_apsd_results[] = {
  419. [UNKNOWN] = {
  420. .name = "UNKNOWN",
  421. .bit = 0,
  422. .val = POWER_SUPPLY_TYPE_UNKNOWN
  423. },
  424. [SDP] = {
  425. .name = "SDP",
  426. .bit = SDP_CHARGER_BIT,
  427. .val = POWER_SUPPLY_TYPE_USB
  428. },
  429. [CDP] = {
  430. .name = "CDP",
  431. .bit = CDP_CHARGER_BIT,
  432. .val = POWER_SUPPLY_TYPE_USB_CDP
  433. },
  434. [DCP] = {
  435. .name = "DCP",
  436. .bit = DCP_CHARGER_BIT,
  437. .val = POWER_SUPPLY_TYPE_USB_DCP
  438. },
  439. [OCP] = {
  440. .name = "OCP",
  441. .bit = OCP_CHARGER_BIT,
  442. .val = POWER_SUPPLY_TYPE_USB_DCP
  443. },
  444. [FLOAT] = {
  445. .name = "FLOAT",
  446. .bit = FLOAT_CHARGER_BIT,
  447. .val = QTI_POWER_SUPPLY_TYPE_USB_FLOAT
  448. },
  449. [HVDCP2] = {
  450. .name = "HVDCP2",
  451. .bit = DCP_CHARGER_BIT | QC_2P0_BIT,
  452. .val = QTI_POWER_SUPPLY_TYPE_USB_HVDCP
  453. },
  454. [HVDCP3] = {
  455. .name = "HVDCP3",
  456. .bit = DCP_CHARGER_BIT | QC_3P0_BIT,
  457. .val = QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3,
  458. },
  459. };
  460. static const struct apsd_result *smblib_get_apsd_result(struct smb_charger *chg)
  461. {
  462. int rc, i;
  463. u8 apsd_stat, stat;
  464. const struct apsd_result *result = &smblib_apsd_results[UNKNOWN];
  465. rc = smblib_read(chg, APSD_STATUS_REG, &apsd_stat);
  466. if (rc < 0) {
  467. smblib_err(chg, "Couldn't read APSD_STATUS rc=%d\n", rc);
  468. return result;
  469. }
  470. smblib_dbg(chg, PR_REGISTER, "APSD_STATUS = 0x%02x\n", apsd_stat);
  471. if (!(apsd_stat & APSD_DTC_STATUS_DONE_BIT))
  472. return result;
  473. rc = smblib_read(chg, APSD_RESULT_STATUS_REG, &stat);
  474. if (rc < 0) {
  475. smblib_err(chg, "Couldn't read APSD_RESULT_STATUS rc=%d\n",
  476. rc);
  477. return result;
  478. }
  479. stat &= APSD_RESULT_STATUS_MASK;
  480. for (i = 0; i < ARRAY_SIZE(smblib_apsd_results); i++) {
  481. if (smblib_apsd_results[i].bit == stat)
  482. result = &smblib_apsd_results[i];
  483. }
  484. if (apsd_stat & QC_CHARGER_BIT) {
  485. /* since its a qc_charger, either return HVDCP3 or HVDCP2 */
  486. if (result != &smblib_apsd_results[HVDCP3])
  487. result = &smblib_apsd_results[HVDCP2];
  488. }
  489. return result;
  490. }
  491. #define INPUT_NOT_PRESENT 0
  492. #define INPUT_PRESENT_USB BIT(1)
  493. #define INPUT_PRESENT_DC BIT(2)
  494. static int smblib_is_input_present(struct smb_charger *chg,
  495. int *present)
  496. {
  497. int rc;
  498. union power_supply_propval pval = {0, };
  499. *present = INPUT_NOT_PRESENT;
  500. rc = smblib_get_prop_usb_present(chg, &pval);
  501. if (rc < 0) {
  502. pr_err("Couldn't get usb presence status rc=%d\n", rc);
  503. return rc;
  504. }
  505. *present |= pval.intval ? INPUT_PRESENT_USB : INPUT_NOT_PRESENT;
  506. rc = smblib_get_prop_dc_present(chg, &pval);
  507. if (rc < 0) {
  508. pr_err("Couldn't get dc presence status rc=%d\n", rc);
  509. return rc;
  510. }
  511. *present |= pval.intval ? INPUT_PRESENT_DC : INPUT_NOT_PRESENT;
  512. return 0;
  513. }
  514. #define AICL_RANGE2_MIN_MV 5600
  515. #define AICL_RANGE2_STEP_DELTA_MV 200
  516. #define AICL_RANGE2_OFFSET 16
  517. int smblib_get_aicl_cont_threshold(struct smb_chg_param *param, u8 val_raw)
  518. {
  519. int base = param->min_u;
  520. u8 reg = val_raw;
  521. int step = param->step_u;
  522. if (val_raw >= AICL_RANGE2_OFFSET) {
  523. reg = val_raw - AICL_RANGE2_OFFSET;
  524. base = AICL_RANGE2_MIN_MV;
  525. step = AICL_RANGE2_STEP_DELTA_MV;
  526. }
  527. return base + (reg * step);
  528. }
  529. /********************
  530. * REGISTER SETTERS *
  531. ********************/
  532. static const struct buck_boost_freq chg_freq_list[] = {
  533. [0] = {
  534. .freq_khz = 2400,
  535. .val = 7,
  536. },
  537. [1] = {
  538. .freq_khz = 2100,
  539. .val = 8,
  540. },
  541. [2] = {
  542. .freq_khz = 1600,
  543. .val = 11,
  544. },
  545. [3] = {
  546. .freq_khz = 1200,
  547. .val = 15,
  548. },
  549. };
  550. int smblib_set_chg_freq(struct smb_chg_param *param,
  551. int val_u, u8 *val_raw)
  552. {
  553. u8 i;
  554. if (val_u > param->max_u || val_u < param->min_u)
  555. return -EINVAL;
  556. /* Charger FSW is the configured freqency / 2 */
  557. val_u *= 2;
  558. for (i = 0; i < ARRAY_SIZE(chg_freq_list); i++) {
  559. if (chg_freq_list[i].freq_khz == val_u)
  560. break;
  561. }
  562. if (i == ARRAY_SIZE(chg_freq_list)) {
  563. pr_err("Invalid frequency %d Hz\n", val_u / 2);
  564. return -EINVAL;
  565. }
  566. *val_raw = chg_freq_list[i].val;
  567. return 0;
  568. }
  569. static int smblib_set_opt_switcher_freq(struct smb_charger *chg, int fsw_khz)
  570. {
  571. int rc = 0;
  572. rc = smblib_set_charge_param(chg, &chg->param.freq_switcher, fsw_khz);
  573. if (rc < 0)
  574. dev_err(chg->dev, "Error in setting freq_buck rc=%d\n", rc);
  575. return rc;
  576. }
  577. int smblib_set_charge_param(struct smb_charger *chg,
  578. struct smb_chg_param *param, int val_u)
  579. {
  580. int rc = 0;
  581. u8 val_raw;
  582. if (param->set_proc) {
  583. rc = param->set_proc(param, val_u, &val_raw);
  584. if (rc < 0)
  585. return -EINVAL;
  586. } else {
  587. if (val_u > param->max_u || val_u < param->min_u)
  588. smblib_dbg(chg, PR_MISC,
  589. "%s: %d is out of range [%d, %d]\n",
  590. param->name, val_u, param->min_u, param->max_u);
  591. if (val_u > param->max_u)
  592. val_u = param->max_u;
  593. if (val_u < param->min_u)
  594. val_u = param->min_u;
  595. val_raw = (val_u - param->min_u) / param->step_u;
  596. }
  597. rc = smblib_write(chg, param->reg, val_raw);
  598. if (rc < 0) {
  599. smblib_err(chg, "%s: Couldn't write 0x%02x to 0x%04x rc=%d\n",
  600. param->name, val_raw, param->reg, rc);
  601. return rc;
  602. }
  603. smblib_dbg(chg, PR_REGISTER, "%s = %d (0x%02x)\n",
  604. param->name, val_u, val_raw);
  605. return rc;
  606. }
  607. static int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend)
  608. {
  609. int rc = 0;
  610. if (suspend)
  611. vote(chg->icl_irq_disable_votable, USB_SUSPEND_VOTER,
  612. true, 0);
  613. rc = smblib_masked_write(chg, USBIN_CMD_IL_REG, USBIN_SUSPEND_BIT,
  614. suspend ? USBIN_SUSPEND_BIT : 0);
  615. if (rc < 0)
  616. smblib_err(chg, "Couldn't write %s to USBIN_SUSPEND_BIT rc=%d\n",
  617. suspend ? "suspend" : "resume", rc);
  618. if (!suspend)
  619. vote(chg->icl_irq_disable_votable, USB_SUSPEND_VOTER,
  620. false, 0);
  621. return rc;
  622. }
  623. static int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend)
  624. {
  625. int rc = 0;
  626. rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_SUSPEND_BIT,
  627. suspend ? DCIN_SUSPEND_BIT : 0);
  628. if (rc < 0)
  629. smblib_err(chg, "Couldn't write %s to DCIN_SUSPEND_BIT rc=%d\n",
  630. suspend ? "suspend" : "resume", rc);
  631. return rc;
  632. }
  633. static int smblib_usb_pd_adapter_allowance_override(struct smb_charger *chg,
  634. u8 allowed_voltage)
  635. {
  636. int rc = 0;
  637. if (chg->chg_param.smb_version == PMI632)
  638. return 0;
  639. rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_OVERRIDE_REG,
  640. allowed_voltage);
  641. if (rc < 0)
  642. smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_OVERRIDE_REG rc=%d\n",
  643. allowed_voltage, rc);
  644. smblib_dbg(chg, PR_MISC, "set USBIN_ALLOW_OVERRIDE: %d\n",
  645. allowed_voltage);
  646. return rc;
  647. }
  648. #define MICRO_5V 5000000
  649. #define MICRO_9V 9000000
  650. #define MICRO_12V 12000000
  651. static int smblib_set_usb_pd_fsw(struct smb_charger *chg, int voltage)
  652. {
  653. int rc = 0;
  654. if (voltage == MICRO_5V)
  655. rc = smblib_set_opt_switcher_freq(chg, chg->chg_freq.freq_5V);
  656. else if (voltage > MICRO_5V && voltage < MICRO_9V)
  657. rc = smblib_set_opt_switcher_freq(chg,
  658. chg->chg_freq.freq_6V_8V);
  659. else if (voltage >= MICRO_9V && voltage < MICRO_12V)
  660. rc = smblib_set_opt_switcher_freq(chg, chg->chg_freq.freq_9V);
  661. else if (voltage == MICRO_12V)
  662. rc = smblib_set_opt_switcher_freq(chg, chg->chg_freq.freq_12V);
  663. else {
  664. smblib_err(chg, "Couldn't set Fsw: invalid voltage %d\n",
  665. voltage);
  666. return -EINVAL;
  667. }
  668. return rc;
  669. }
  670. #define CONT_AICL_HEADROOM_MV 1000
  671. #define AICL_THRESHOLD_MV_IN_CC 5000
  672. static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg,
  673. int min_allowed_uv, int max_allowed_uv)
  674. {
  675. int rc, aicl_threshold;
  676. u8 vbus_allowance;
  677. if (chg->chg_param.smb_version == PMI632)
  678. return 0;
  679. if (chg->pd_active == QTI_POWER_SUPPLY_PD_PPS_ACTIVE) {
  680. vbus_allowance = CONTINUOUS;
  681. } else if (min_allowed_uv == MICRO_5V && max_allowed_uv == MICRO_5V) {
  682. vbus_allowance = FORCE_5V;
  683. } else if (min_allowed_uv == MICRO_9V && max_allowed_uv == MICRO_9V) {
  684. vbus_allowance = FORCE_9V;
  685. } else if (min_allowed_uv == MICRO_12V && max_allowed_uv == MICRO_12V) {
  686. vbus_allowance = FORCE_12V;
  687. } else if (min_allowed_uv < MICRO_12V && max_allowed_uv <= MICRO_12V) {
  688. vbus_allowance = CONTINUOUS;
  689. } else {
  690. smblib_err(chg, "invalid allowed voltage [%d, %d]\n",
  691. min_allowed_uv, max_allowed_uv);
  692. return -EINVAL;
  693. }
  694. rc = smblib_usb_pd_adapter_allowance_override(chg, vbus_allowance);
  695. if (rc < 0) {
  696. smblib_err(chg, "set CONTINUOUS allowance failed, rc=%d\n",
  697. rc);
  698. return rc;
  699. }
  700. if (vbus_allowance != CONTINUOUS)
  701. return 0;
  702. aicl_threshold = min_allowed_uv / 1000 - CONT_AICL_HEADROOM_MV;
  703. if (chg->adapter_cc_mode)
  704. aicl_threshold = min(aicl_threshold, AICL_THRESHOLD_MV_IN_CC);
  705. rc = smblib_set_charge_param(chg, &chg->param.aicl_cont_threshold,
  706. aicl_threshold);
  707. if (rc < 0) {
  708. smblib_err(chg, "set CONT_AICL_THRESHOLD failed, rc=%d\n",
  709. rc);
  710. return rc;
  711. }
  712. return rc;
  713. }
  714. int smblib_set_aicl_cont_threshold(struct smb_chg_param *param,
  715. int val_u, u8 *val_raw)
  716. {
  717. int base = param->min_u;
  718. int offset = 0;
  719. int step = param->step_u;
  720. if (val_u > param->max_u)
  721. val_u = param->max_u;
  722. if (val_u < param->min_u)
  723. val_u = param->min_u;
  724. if (val_u >= AICL_RANGE2_MIN_MV) {
  725. base = AICL_RANGE2_MIN_MV;
  726. step = AICL_RANGE2_STEP_DELTA_MV;
  727. offset = AICL_RANGE2_OFFSET;
  728. }
  729. *val_raw = ((val_u - base) / step) + offset;
  730. return 0;
  731. }
  732. /********************
  733. * HELPER FUNCTIONS *
  734. ********************/
  735. /* CP channels */
  736. static const char * const smblib_cp_ext_iio_chan[] = {
  737. [CP_PARALLEL_OUTPUT_MODE] = "cp_parallel_output_mode",
  738. [CP_MASTER_ENABLE] = "cp_enable",
  739. [CP_ILIM] = "cp_ilim",
  740. [CP_DIE_TEMP] = "cp_die_temp",
  741. };
  742. /* SMB1355 channels */
  743. static const char * const smblib_parallel_ext_iio_chan[] = {
  744. [SMB_CHARGER_TEMP] = "pl_charger_temp",
  745. [SMB_CHARGER_TEMP_MAX] = "pl_charger_temp_max",
  746. [SMB_SET_SHIP_MODE] = "pl_set_ship_mode",
  747. };
  748. /* QG/FG channels */
  749. static const char * const smblib_qg_ext_iio_chan[] = {
  750. [SMB5_QG_DEBUG_BATTERY] = "debug_battery",
  751. [SMB5_QG_CAPACITY] = "capacity",
  752. [SMB5_QG_REAL_CAPACITY] = "real_capacity",
  753. [SMB5_QG_CC_SOC] = "cc_soc",
  754. [SMB5_QG_CURRENT_NOW] = "current_now",
  755. [SMB5_QG_VOLTAGE_NOW] = "voltage_now",
  756. [SMB5_QG_VOLTAGE_MAX] = "voltage_max",
  757. [SMB5_QG_CHARGE_FULL] = "charge_full",
  758. [SMB5_QG_RESISTANCE_ID] = "resistance_id",
  759. [SMB5_QG_TEMP] = "temp",
  760. [SMB5_QG_CHARGE_COUNTER] = "charge_counter",
  761. [SMB5_QG_CYCLE_COUNT] = "cycle_count",
  762. [SMB5_QG_CHARGE_FULL_DESIGN] = "charge_full_design",
  763. [SMB5_QG_TIME_TO_FULL_NOW] = "time_to_full_now",
  764. };
  765. static int smblib_read_iio_prop(struct smb_charger *chg,
  766. enum iio_type type, int iio_chan, int *val)
  767. {
  768. struct iio_channel *iio_chan_list;
  769. int rc;
  770. switch (type) {
  771. case QG:
  772. if (IS_ERR_OR_NULL(chg->iio_chan_list_qg))
  773. return -ENODEV;
  774. iio_chan_list = chg->iio_chan_list_qg[iio_chan];
  775. break;
  776. case CP:
  777. if (IS_ERR_OR_NULL(chg->iio_chan_list_cp))
  778. return -ENODEV;
  779. iio_chan_list = chg->iio_chan_list_cp[iio_chan];
  780. break;
  781. case SMB_PARALLEL:
  782. if (IS_ERR_OR_NULL(chg->iio_chan_list_smb_parallel))
  783. return -ENODEV;
  784. iio_chan_list = chg->iio_chan_list_smb_parallel[iio_chan];
  785. break;
  786. default:
  787. pr_err_ratelimited("iio_type %d is not supported\n", type);
  788. return -EINVAL;
  789. }
  790. rc = iio_read_channel_processed(iio_chan_list, val);
  791. return rc < 0 ? rc : 0;
  792. }
  793. static int smblib_write_iio_prop(struct smb_charger *chg,
  794. enum iio_type type, int iio_chan, int val)
  795. {
  796. struct iio_channel *iio_chan_list;
  797. switch (type) {
  798. case QG:
  799. if (IS_ERR_OR_NULL(chg->iio_chan_list_qg))
  800. return -ENODEV;
  801. iio_chan_list = chg->iio_chan_list_qg[iio_chan];
  802. break;
  803. case CP:
  804. if (IS_ERR_OR_NULL(chg->iio_chan_list_cp))
  805. return -ENODEV;
  806. iio_chan_list = chg->iio_chan_list_cp[iio_chan];
  807. break;
  808. case SMB_PARALLEL:
  809. if (IS_ERR_OR_NULL(chg->iio_chan_list_smb_parallel))
  810. return -ENODEV;
  811. iio_chan_list = chg->iio_chan_list_smb_parallel[iio_chan];
  812. break;
  813. default:
  814. pr_err_ratelimited("iio_type %d is not supported\n", type);
  815. return -EINVAL;
  816. }
  817. return iio_write_channel_raw(iio_chan_list, val);
  818. }
  819. static bool is_cp_available(struct smb_charger *chg)
  820. {
  821. int rc;
  822. struct iio_channel **iio_list;
  823. if (IS_ERR(chg->iio_chan_list_cp))
  824. return false;
  825. if (!chg->iio_chan_list_cp) {
  826. iio_list = get_ext_channels(chg->dev,
  827. smblib_cp_ext_iio_chan,
  828. ARRAY_SIZE(smblib_cp_ext_iio_chan));
  829. if (IS_ERR(iio_list)) {
  830. rc = PTR_ERR(iio_list);
  831. if (rc != -EPROBE_DEFER) {
  832. dev_err(chg->dev, "Failed to get channels, rc=%d\n",
  833. rc);
  834. chg->iio_chan_list_cp = ERR_PTR(-EINVAL);
  835. }
  836. return false;
  837. }
  838. chg->iio_chan_list_cp = iio_list;
  839. }
  840. return true;
  841. }
  842. static bool is_cp_topo_vbatt(struct smb_charger *chg)
  843. {
  844. int rc = 0, val;
  845. bool is_vbatt;
  846. if (!is_cp_available(chg))
  847. return false;
  848. rc = smblib_read_iio_prop(chg, CP, CP_PARALLEL_OUTPUT_MODE, &val);
  849. if (rc < 0) {
  850. smblib_err(chg, "Couldn't get CP PARALLEL_OUTPUT_MODE rc=%d\n",
  851. rc);
  852. return false;
  853. }
  854. is_vbatt = (val == QTI_POWER_SUPPLY_PL_OUTPUT_VBAT);
  855. smblib_dbg(chg, PR_WLS, "%s\n", is_vbatt ? "true" : "false");
  856. return is_vbatt;
  857. }
  858. #define CP_TO_MAIN_ICL_OFFSET_PC 10
  859. int smblib_get_qc3_main_icl_offset(struct smb_charger *chg, int *offset_ua)
  860. {
  861. int rc = 0, val;
  862. /*
  863. * Apply ILIM offset to main charger's FCC if all of the following
  864. * conditions are met:
  865. * - HVDCP3 adapter with CP as parallel charger
  866. * - Output connection topology is VBAT
  867. */
  868. if (!is_cp_topo_vbatt(chg) || chg->hvdcp3_standalone_config ||
  869. ((chg->real_charger_type !=
  870. QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3) &&
  871. chg->real_charger_type !=
  872. QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5))
  873. return -EINVAL;
  874. rc = smblib_read_iio_prop(chg, CP, CP_MASTER_ENABLE, &val);
  875. if (rc < 0) {
  876. smblib_err(chg, "Couldn't get CP ENABLE rc=%d\n", rc);
  877. return rc;
  878. }
  879. if (!val)
  880. return -EINVAL;
  881. rc = smblib_read_iio_prop(chg, CP, CP_ILIM, &val);
  882. if (rc < 0) {
  883. smblib_err(chg, "Couldn't get CP ILIM rc=%d\n", rc);
  884. return rc;
  885. }
  886. *offset_ua = (val * CP_TO_MAIN_ICL_OFFSET_PC * 2) / 100;
  887. return 0;
  888. }
  889. int smblib_get_prop_from_bms(struct smb_charger *chg,
  890. int channel, int *val)
  891. {
  892. int rc;
  893. if (IS_ERR_OR_NULL(chg->iio_chan_list_qg))
  894. return -ENODEV;
  895. rc = iio_read_channel_processed(chg->iio_chan_list_qg[channel],
  896. val);
  897. return rc < 0 ? rc : 0;
  898. }
  899. void smblib_apsd_enable(struct smb_charger *chg, bool enable)
  900. {
  901. int rc;
  902. rc = smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
  903. BC1P2_SRC_DETECT_BIT,
  904. enable ? BC1P2_SRC_DETECT_BIT : 0);
  905. if (rc < 0)
  906. smblib_err(chg, "failed to write USBIN_OPTIONS_1_CFG rc=%d\n",
  907. rc);
  908. }
  909. void smblib_hvdcp_detect_enable(struct smb_charger *chg, bool enable)
  910. {
  911. int rc;
  912. u8 mask;
  913. mask = HVDCP_AUTH_ALG_EN_CFG_BIT | HVDCP_EN_BIT;
  914. rc = smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG, mask,
  915. enable ? mask : 0);
  916. if (rc < 0)
  917. smblib_err(chg, "failed to write USBIN_OPTIONS_1_CFG rc=%d\n",
  918. rc);
  919. }
  920. static void smblib_hvdcp_detect_try_enable(struct smb_charger *chg, bool enable)
  921. {
  922. if (chg->hvdcp_disable || chg->pd_not_supported)
  923. return;
  924. smblib_hvdcp_detect_enable(chg, enable);
  925. }
  926. void smblib_hvdcp_hw_inov_enable(struct smb_charger *chg, bool enable)
  927. {
  928. int rc;
  929. rc = smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
  930. HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT,
  931. enable ? HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT : 0);
  932. if (rc < 0)
  933. smblib_err(chg, "failed to write USBIN_OPTIONS_1_CFG rc=%d\n",
  934. rc);
  935. }
  936. void smblib_hvdcp_exit_config(struct smb_charger *chg)
  937. {
  938. u8 stat;
  939. int rc;
  940. rc = smblib_read(chg, APSD_RESULT_STATUS_REG, &stat);
  941. if (rc < 0)
  942. return;
  943. if (stat & (QC_3P0_BIT | QC_2P0_BIT)) {
  944. /* force HVDCP to 5V */
  945. smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
  946. HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT, 0);
  947. smblib_write(chg, CMD_HVDCP_2_REG, FORCE_5V_BIT);
  948. /* rerun APSD */
  949. smblib_masked_write(chg, CMD_APSD_REG, APSD_RERUN_BIT,
  950. APSD_RERUN_BIT);
  951. }
  952. }
  953. static int smblib_request_dpdm(struct smb_charger *chg, bool enable)
  954. {
  955. int rc = 0;
  956. if (chg->pr_swap_in_progress)
  957. return 0;
  958. /* fetch the DPDM regulator */
  959. if (!chg->dpdm_reg && of_get_property(chg->dev->of_node,
  960. "dpdm-supply", NULL)) {
  961. chg->dpdm_reg = devm_regulator_get(chg->dev, "dpdm");
  962. if (IS_ERR(chg->dpdm_reg)) {
  963. rc = PTR_ERR(chg->dpdm_reg);
  964. smblib_err(chg, "Couldn't get dpdm regulator rc=%d\n",
  965. rc);
  966. chg->dpdm_reg = NULL;
  967. return rc;
  968. }
  969. }
  970. mutex_lock(&chg->dpdm_lock);
  971. if (enable) {
  972. if (chg->dpdm_reg && !chg->dpdm_enabled) {
  973. smblib_dbg(chg, PR_MISC, "enabling DPDM regulator\n");
  974. rc = regulator_enable(chg->dpdm_reg);
  975. if (rc < 0)
  976. smblib_err(chg,
  977. "Couldn't enable dpdm regulator rc=%d\n",
  978. rc);
  979. else
  980. chg->dpdm_enabled = true;
  981. }
  982. } else {
  983. if (chg->dpdm_reg && chg->dpdm_enabled) {
  984. smblib_dbg(chg, PR_MISC, "disabling DPDM regulator\n");
  985. rc = regulator_disable(chg->dpdm_reg);
  986. if (rc < 0)
  987. smblib_err(chg,
  988. "Couldn't disable dpdm regulator rc=%d\n",
  989. rc);
  990. else
  991. chg->dpdm_enabled = false;
  992. }
  993. }
  994. mutex_unlock(&chg->dpdm_lock);
  995. return rc;
  996. }
  997. void smblib_rerun_apsd(struct smb_charger *chg)
  998. {
  999. int rc;
  1000. smblib_dbg(chg, PR_MISC, "re-running APSD\n");
  1001. rc = smblib_masked_write(chg, CMD_APSD_REG,
  1002. APSD_RERUN_BIT, APSD_RERUN_BIT);
  1003. if (rc < 0)
  1004. smblib_err(chg, "Couldn't re-run APSD rc=%d\n", rc);
  1005. }
  1006. static const struct apsd_result *smblib_update_usb_type(struct smb_charger *chg)
  1007. {
  1008. const struct apsd_result *apsd_result = smblib_get_apsd_result(chg);
  1009. /* if PD is active, APSD is disabled so won't have a valid result */
  1010. if (chg->pd_active) {
  1011. chg->real_charger_type = POWER_SUPPLY_TYPE_USB_PD;
  1012. } else if (chg->qc3p5_detected) {
  1013. chg->real_charger_type = QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5;
  1014. } else {
  1015. /*
  1016. * Update real charger type only if its not FLOAT
  1017. * detected as SDP
  1018. */
  1019. if (!(apsd_result->val == QTI_POWER_SUPPLY_TYPE_USB_FLOAT &&
  1020. chg->real_charger_type == POWER_SUPPLY_TYPE_USB))
  1021. chg->real_charger_type = apsd_result->val;
  1022. }
  1023. smblib_dbg(chg, PR_MISC, "APSD=%s PD=%d QC3P5=%d\n",
  1024. apsd_result->name, chg->pd_active, chg->qc3p5_detected);
  1025. return apsd_result;
  1026. }
  1027. static int smblib_notifier_call(struct notifier_block *nb,
  1028. unsigned long ev, void *v)
  1029. {
  1030. struct power_supply *psy = v;
  1031. struct smb_charger *chg = container_of(nb, struct smb_charger, nb);
  1032. if (!strcmp(psy->desc->name, "bms")) {
  1033. if (ev == PSY_EVENT_PROP_CHANGED)
  1034. schedule_work(&chg->bms_update_work);
  1035. }
  1036. if (chg->jeita_configured == JEITA_CFG_NONE)
  1037. schedule_work(&chg->jeita_update_work);
  1038. if (chg->sec_pl_present && !chg->iio_chan_list_smb_parallel
  1039. && !strcmp(psy->desc->name, "parallel"))
  1040. schedule_work(&chg->pl_update_work);
  1041. if (!strcmp(psy->desc->name, "charge_pump_master")) {
  1042. pm_stay_awake(chg->dev);
  1043. schedule_work(&chg->cp_status_change_work);
  1044. }
  1045. return NOTIFY_OK;
  1046. }
  1047. static int smblib_register_notifier(struct smb_charger *chg)
  1048. {
  1049. int rc;
  1050. chg->nb.notifier_call = smblib_notifier_call;
  1051. rc = power_supply_reg_notifier(&chg->nb);
  1052. if (rc < 0) {
  1053. smblib_err(chg, "Couldn't register psy notifier rc = %d\n", rc);
  1054. return rc;
  1055. }
  1056. return 0;
  1057. }
  1058. static void smblib_uusb_removal(struct smb_charger *chg)
  1059. {
  1060. int rc;
  1061. struct smb_irq_data *data;
  1062. struct storm_watch *wdata;
  1063. int sec_charger;
  1064. sec_charger = chg->sec_pl_present ? QTI_POWER_SUPPLY_CHARGER_SEC_PL :
  1065. QTI_POWER_SUPPLY_CHARGER_SEC_NONE;
  1066. smblib_select_sec_charger(chg, sec_charger, QTI_POWER_SUPPLY_CP_NONE,
  1067. false);
  1068. cancel_delayed_work_sync(&chg->pl_enable_work);
  1069. if (chg->wa_flags & BOOST_BACK_WA) {
  1070. data = chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data;
  1071. if (data) {
  1072. wdata = &data->storm_data;
  1073. update_storm_count(wdata, WEAK_CHG_STORM_COUNT);
  1074. vote(chg->usb_icl_votable, BOOST_BACK_VOTER, false, 0);
  1075. vote(chg->usb_icl_votable, WEAK_CHARGER_VOTER,
  1076. false, 0);
  1077. }
  1078. }
  1079. vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0);
  1080. vote(chg->awake_votable, PL_DELAY_VOTER, false, 0);
  1081. /* reset both usbin current and voltage votes */
  1082. vote(chg->pl_enable_votable_indirect, USBIN_I_VOTER, false, 0);
  1083. vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0);
  1084. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  1085. is_flash_active(chg) ? SDP_CURRENT_UA : SDP_100_MA);
  1086. vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
  1087. vote(chg->usb_icl_votable, HVDCP2_ICL_VOTER, false, 0);
  1088. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
  1089. vote(chg->usb_icl_votable, THERMAL_THROTTLE_VOTER, false, 0);
  1090. vote(chg->limited_irq_disable_votable, CHARGER_TYPE_VOTER,
  1091. true, 0);
  1092. vote(chg->hdc_irq_disable_votable, CHARGER_TYPE_VOTER, true, 0);
  1093. vote(chg->hdc_irq_disable_votable, HDC_IRQ_VOTER, false, 0);
  1094. /* Remove SW thermal regulation WA votes */
  1095. vote(chg->usb_icl_votable, SW_THERM_REGULATION_VOTER, false, 0);
  1096. vote(chg->pl_disable_votable, SW_THERM_REGULATION_VOTER, false, 0);
  1097. vote(chg->dc_suspend_votable, SW_THERM_REGULATION_VOTER, false, 0);
  1098. if (chg->cp_disable_votable)
  1099. vote(chg->cp_disable_votable, SW_THERM_REGULATION_VOTER,
  1100. false, 0);
  1101. /* reset USBOV votes and cancel work */
  1102. cancel_delayed_work_sync(&chg->usbov_dbc_work);
  1103. vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0);
  1104. chg->dbc_usbov = false;
  1105. chg->voltage_min_uv = MICRO_5V;
  1106. chg->voltage_max_uv = MICRO_5V;
  1107. chg->usbin_forced_max_uv = 0;
  1108. chg->usb_icl_delta_ua = 0;
  1109. chg->pulse_cnt = 0;
  1110. chg->uusb_apsd_rerun_done = false;
  1111. chg->chg_param.forced_main_fcc = 0;
  1112. del_timer_sync(&chg->apsd_timer);
  1113. chg->apsd_ext_timeout = false;
  1114. /* write back the default FLOAT charger configuration */
  1115. rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
  1116. (u8)FLOAT_OPTIONS_MASK, chg->float_cfg);
  1117. if (rc < 0)
  1118. smblib_err(chg, "Couldn't write float charger options rc=%d\n",
  1119. rc);
  1120. /* clear USB ICL vote for USB_PSY_VOTER */
  1121. rc = vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
  1122. if (rc < 0)
  1123. smblib_err(chg, "Couldn't un-vote for USB ICL rc=%d\n", rc);
  1124. /* clear USB ICL vote for DCP_VOTER */
  1125. rc = vote(chg->usb_icl_votable, DCP_VOTER, false, 0);
  1126. if (rc < 0)
  1127. smblib_err(chg,
  1128. "Couldn't un-vote DCP from USB ICL rc=%d\n", rc);
  1129. /*
  1130. * if non-compliant charger caused UV, restore original max pulses
  1131. * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on.
  1132. */
  1133. if (chg->qc2_unsupported_voltage) {
  1134. rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG,
  1135. HVDCP_PULSE_COUNT_MAX_QC2_MASK,
  1136. chg->qc2_max_pulses);
  1137. if (rc < 0)
  1138. smblib_err(chg, "Couldn't restore max pulses rc=%d\n",
  1139. rc);
  1140. if (!chg->disable_suspend_on_collapse) {
  1141. rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG,
  1142. SUSPEND_ON_COLLAPSE_USBIN_BIT,
  1143. SUSPEND_ON_COLLAPSE_USBIN_BIT);
  1144. if (rc < 0)
  1145. smblib_err(chg,
  1146. "Couldn't turn on SUSPEND_ON_COLLAPSE_USBIN_BIT rc=%d\n",
  1147. rc);
  1148. }
  1149. chg->qc2_unsupported_voltage = QC2_COMPLIANT;
  1150. }
  1151. chg->qc3p5_detected = false;
  1152. chg->qc3p5_detected_mw = 0;
  1153. smblib_update_usb_type(chg);
  1154. }
  1155. void smblib_config_charger_on_debug_battery(struct smb_charger *chg)
  1156. {
  1157. int rc = 0, val;
  1158. rc = smblib_get_prop_from_bms(chg, SMB5_QG_DEBUG_BATTERY, &val);
  1159. if (rc < 0) {
  1160. smblib_err(chg, "Couldn't get debug battery prop rc=%d\n", rc);
  1161. return;
  1162. }
  1163. vote(chg->bat_temp_irq_disable_votable, DEBUG_BOARD_VOTER, val, 0);
  1164. if (chg->suspend_input_on_debug_batt) {
  1165. vote(chg->usb_icl_votable, DEBUG_BOARD_VOTER, val, 0);
  1166. vote(chg->dc_suspend_votable, DEBUG_BOARD_VOTER, val, 0);
  1167. if (val)
  1168. pr_info("Input suspended: Fake battery\n");
  1169. } else {
  1170. vote(chg->chg_disable_votable, DEBUG_BOARD_VOTER,
  1171. val, 0);
  1172. }
  1173. }
  1174. int smblib_rerun_apsd_if_required(struct smb_charger *chg)
  1175. {
  1176. union power_supply_propval val;
  1177. int rc;
  1178. rc = smblib_get_prop_usb_present(chg, &val);
  1179. if (rc < 0) {
  1180. smblib_err(chg, "Couldn't get usb present rc = %d\n", rc);
  1181. return rc;
  1182. }
  1183. if (!val.intval)
  1184. return 0;
  1185. rc = smblib_request_dpdm(chg, true);
  1186. if (rc < 0)
  1187. smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc);
  1188. chg->uusb_apsd_rerun_done = true;
  1189. smblib_rerun_apsd(chg);
  1190. return 0;
  1191. }
  1192. static int smblib_get_pulse_cnt(struct smb_charger *chg, int *count)
  1193. {
  1194. *count = chg->pulse_cnt;
  1195. return 0;
  1196. }
  1197. #define USBIN_25MA 25000
  1198. #define USBIN_100MA 100000
  1199. #define USBIN_150MA 150000
  1200. #define USBIN_500MA 500000
  1201. #define USBIN_900MA 900000
  1202. #define USBIN_1000MA 1000000
  1203. static int set_sdp_current(struct smb_charger *chg, int icl_ua)
  1204. {
  1205. int rc;
  1206. u8 icl_options;
  1207. const struct apsd_result *apsd_result = smblib_get_apsd_result(chg);
  1208. /* power source is SDP */
  1209. switch (icl_ua) {
  1210. case USBIN_100MA:
  1211. /* USB 2.0 100mA */
  1212. icl_options = 0;
  1213. break;
  1214. case USBIN_150MA:
  1215. /* USB 3.0 150mA */
  1216. icl_options = CFG_USB3P0_SEL_BIT;
  1217. break;
  1218. case USBIN_500MA:
  1219. /* USB 2.0 500mA */
  1220. icl_options = USB51_MODE_BIT;
  1221. break;
  1222. case USBIN_900MA:
  1223. /* USB 3.0 900mA */
  1224. icl_options = CFG_USB3P0_SEL_BIT | USB51_MODE_BIT;
  1225. break;
  1226. default:
  1227. return -EINVAL;
  1228. }
  1229. if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB &&
  1230. apsd_result->val == QTI_POWER_SUPPLY_TYPE_USB_FLOAT) {
  1231. /*
  1232. * change the float charger configuration to SDP, if this
  1233. * is the case of SDP being detected as FLOAT
  1234. */
  1235. rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
  1236. FORCE_FLOAT_SDP_CFG_BIT, FORCE_FLOAT_SDP_CFG_BIT);
  1237. if (rc < 0) {
  1238. smblib_err(chg, "Couldn't set float ICL options rc=%d\n",
  1239. rc);
  1240. return rc;
  1241. }
  1242. }
  1243. rc = smblib_masked_write(chg, USBIN_ICL_OPTIONS_REG,
  1244. CFG_USB3P0_SEL_BIT | USB51_MODE_BIT, icl_options);
  1245. if (rc < 0) {
  1246. smblib_err(chg, "Couldn't set ICL options rc=%d\n", rc);
  1247. return rc;
  1248. }
  1249. rc = smblib_icl_override(chg, SW_OVERRIDE_USB51_MODE);
  1250. if (rc < 0) {
  1251. smblib_err(chg, "Couldn't set ICL override rc=%d\n", rc);
  1252. return rc;
  1253. }
  1254. return rc;
  1255. }
  1256. int smblib_set_icl_current(struct smb_charger *chg, int icl_ua)
  1257. {
  1258. int rc = 0;
  1259. enum icl_override_mode icl_override = HW_AUTO_MODE;
  1260. /* suspend if 25mA or less is requested */
  1261. bool suspend = (icl_ua <= USBIN_25MA);
  1262. if (chg->chg_param.smb_version == PMI632)
  1263. schgm_flash_torch_priority(chg, suspend ? TORCH_BOOST_MODE :
  1264. TORCH_BUCK_MODE);
  1265. /* Do not configure ICL from SW for DAM cables */
  1266. if (smblib_get_prop_typec_mode(chg) ==
  1267. QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY)
  1268. return 0;
  1269. if (suspend)
  1270. return smblib_set_usb_suspend(chg, true);
  1271. if (icl_ua == INT_MAX)
  1272. goto set_mode;
  1273. /* configure current */
  1274. if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB
  1275. && (chg->typec_legacy
  1276. || chg->typec_mode == QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT
  1277. || chg->connector_type ==
  1278. QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)) {
  1279. rc = set_sdp_current(chg, icl_ua);
  1280. if (rc < 0) {
  1281. smblib_err(chg, "Couldn't set SDP ICL rc=%d\n", rc);
  1282. goto out;
  1283. }
  1284. } else {
  1285. /*
  1286. * Try USB 2.0/3,0 option first on USB path when maximum input
  1287. * current limit is 500mA or below for better accuracy; in case
  1288. * of error, proceed to use USB high-current mode.
  1289. */
  1290. if (icl_ua <= USBIN_500MA) {
  1291. rc = set_sdp_current(chg, icl_ua);
  1292. if (rc >= 0)
  1293. goto unsuspend;
  1294. }
  1295. rc = smblib_set_charge_param(chg, &chg->param.usb_icl, icl_ua);
  1296. if (rc < 0) {
  1297. smblib_err(chg, "Couldn't set HC ICL rc=%d\n", rc);
  1298. goto out;
  1299. }
  1300. icl_override = SW_OVERRIDE_HC_MODE;
  1301. }
  1302. set_mode:
  1303. rc = smblib_icl_override(chg, icl_override);
  1304. if (rc < 0) {
  1305. smblib_err(chg, "Couldn't set ICL override rc=%d\n", rc);
  1306. goto out;
  1307. }
  1308. unsuspend:
  1309. /* unsuspend after configuring current and override */
  1310. rc = smblib_set_usb_suspend(chg, false);
  1311. if (rc < 0) {
  1312. smblib_err(chg, "Couldn't resume input rc=%d\n", rc);
  1313. goto out;
  1314. }
  1315. /* Re-run AICL */
  1316. if (icl_override != SW_OVERRIDE_HC_MODE)
  1317. rc = smblib_run_aicl(chg, RERUN_AICL);
  1318. out:
  1319. return rc;
  1320. }
  1321. int smblib_get_icl_current(struct smb_charger *chg, int *icl_ua)
  1322. {
  1323. int rc;
  1324. rc = smblib_get_charge_param(chg, &chg->param.icl_max_stat, icl_ua);
  1325. if (rc < 0)
  1326. smblib_err(chg, "Couldn't get HC ICL rc=%d\n", rc);
  1327. return rc;
  1328. }
  1329. int smblib_toggle_smb_en(struct smb_charger *chg, int toggle)
  1330. {
  1331. int rc = 0;
  1332. if (!toggle)
  1333. return rc;
  1334. rc = smblib_select_sec_charger(chg, chg->sec_chg_selected,
  1335. chg->cp_reason, true);
  1336. return rc;
  1337. }
  1338. int smblib_get_irq_status(struct smb_charger *chg, int *val)
  1339. {
  1340. int rc;
  1341. u8 reg;
  1342. if (chg->wa_flags & SKIP_MISC_PBS_IRQ_WA) {
  1343. *val = 0;
  1344. return 0;
  1345. }
  1346. mutex_lock(&chg->irq_status_lock);
  1347. /* Report and clear cached status */
  1348. *val = chg->irq_status;
  1349. chg->irq_status = 0;
  1350. /* get real time status of pulse skip irq */
  1351. rc = smblib_read(chg, MISC_PBS_RT_STS_REG, &reg);
  1352. if (rc < 0)
  1353. smblib_err(chg, "Couldn't read MISC_PBS_RT_STS_REG rc=%d\n",
  1354. rc);
  1355. else
  1356. *val |= (reg & PULSE_SKIP_IRQ_BIT);
  1357. mutex_unlock(&chg->irq_status_lock);
  1358. return rc;
  1359. }
  1360. /****************************
  1361. * uUSB Moisture Protection *
  1362. ****************************/
  1363. #define MICRO_USB_DETECTION_ON_TIME_20_MS 0x08
  1364. #define MICRO_USB_DETECTION_PERIOD_X_100 0x03
  1365. #define U_USB_STATUS_WATER_PRESENT 0x00
  1366. static int smblib_set_moisture_protection(struct smb_charger *chg,
  1367. bool enable)
  1368. {
  1369. int rc = 0;
  1370. if (chg->moisture_present == enable) {
  1371. smblib_dbg(chg, PR_MISC, "No change in moisture protection status\n");
  1372. return rc;
  1373. }
  1374. if (enable) {
  1375. chg->moisture_present = true;
  1376. /* Disable uUSB factory mode detection */
  1377. rc = smblib_masked_write(chg, TYPEC_U_USB_CFG_REG,
  1378. EN_MICRO_USB_FACTORY_MODE_BIT, 0);
  1379. if (rc < 0) {
  1380. smblib_err(chg, "Couldn't disable uUSB factory mode detection rc=%d\n",
  1381. rc);
  1382. return rc;
  1383. }
  1384. /* Disable moisture detection and uUSB state change interrupt */
  1385. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  1386. TYPEC_WATER_DETECTION_INT_EN_BIT |
  1387. MICRO_USB_STATE_CHANGE_INT_EN_BIT, 0);
  1388. if (rc < 0) {
  1389. smblib_err(chg, "Couldn't disable moisture detection interrupt rc=%d\n",
  1390. rc);
  1391. return rc;
  1392. }
  1393. /* Set 1% duty cycle on ID detection */
  1394. rc = smblib_masked_write(chg,
  1395. ((chg->chg_param.smb_version == PMI632)
  1396. ? PMI632_TYPEC_U_USB_WATER_PROTECTION_CFG_REG :
  1397. TYPEC_U_USB_WATER_PROTECTION_CFG_REG),
  1398. EN_MICRO_USB_WATER_PROTECTION_BIT |
  1399. MICRO_USB_DETECTION_ON_TIME_CFG_MASK |
  1400. MICRO_USB_DETECTION_PERIOD_CFG_MASK,
  1401. EN_MICRO_USB_WATER_PROTECTION_BIT |
  1402. MICRO_USB_DETECTION_ON_TIME_20_MS |
  1403. MICRO_USB_DETECTION_PERIOD_X_100);
  1404. if (rc < 0) {
  1405. smblib_err(chg, "Couldn't set 1 percent CC_ID duty cycle rc=%d\n",
  1406. rc);
  1407. return rc;
  1408. }
  1409. vote(chg->usb_icl_votable, MOISTURE_VOTER, true, 0);
  1410. } else {
  1411. chg->moisture_present = false;
  1412. vote(chg->usb_icl_votable, MOISTURE_VOTER, false, 0);
  1413. /* Enable moisture detection and uUSB state change interrupt */
  1414. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  1415. TYPEC_WATER_DETECTION_INT_EN_BIT |
  1416. MICRO_USB_STATE_CHANGE_INT_EN_BIT,
  1417. TYPEC_WATER_DETECTION_INT_EN_BIT |
  1418. MICRO_USB_STATE_CHANGE_INT_EN_BIT);
  1419. if (rc < 0) {
  1420. smblib_err(chg, "Couldn't enable moisture detection and uUSB state change interrupt rc=%d\n",
  1421. rc);
  1422. return rc;
  1423. }
  1424. /* Disable periodic monitoring of CC_ID pin */
  1425. rc = smblib_write(chg,
  1426. ((chg->chg_param.smb_version == PMI632)
  1427. ? PMI632_TYPEC_U_USB_WATER_PROTECTION_CFG_REG :
  1428. TYPEC_U_USB_WATER_PROTECTION_CFG_REG), 0);
  1429. if (rc < 0) {
  1430. smblib_err(chg, "Couldn't disable 1 percent CC_ID duty cycle rc=%d\n",
  1431. rc);
  1432. return rc;
  1433. }
  1434. /* Enable uUSB factory mode detection */
  1435. rc = smblib_masked_write(chg, TYPEC_U_USB_CFG_REG,
  1436. EN_MICRO_USB_FACTORY_MODE_BIT,
  1437. EN_MICRO_USB_FACTORY_MODE_BIT);
  1438. if (rc < 0) {
  1439. smblib_err(chg, "Couldn't disable uUSB factory mode detection rc=%d\n",
  1440. rc);
  1441. return rc;
  1442. }
  1443. }
  1444. smblib_dbg(chg, PR_MISC, "Moisture protection %s\n",
  1445. chg->moisture_present ? "enabled" : "disabled");
  1446. return rc;
  1447. }
  1448. /*********************
  1449. * VOTABLE CALLBACKS *
  1450. *********************/
  1451. static int smblib_smb_disable_override_vote_callback(struct votable *votable,
  1452. void *data, int disable_smb, const char *client)
  1453. {
  1454. struct smb_charger *chg = data;
  1455. int rc = 0;
  1456. /* Enable/disable SMB_EN pin */
  1457. rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
  1458. SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT,
  1459. disable_smb ? SMB_EN_OVERRIDE_BIT : 0);
  1460. if (rc < 0)
  1461. smblib_err(chg, "Couldn't configure SMB_EN, rc=%d\n", rc);
  1462. return rc;
  1463. }
  1464. static int smblib_dc_suspend_vote_callback(struct votable *votable, void *data,
  1465. int suspend, const char *client)
  1466. {
  1467. struct smb_charger *chg = data;
  1468. if (chg->chg_param.smb_version == PMI632)
  1469. return 0;
  1470. /* resume input if suspend is invalid */
  1471. if (suspend < 0)
  1472. suspend = 0;
  1473. return smblib_set_dc_suspend(chg, (bool)suspend);
  1474. }
  1475. static int smblib_awake_vote_callback(struct votable *votable, void *data,
  1476. int awake, const char *client)
  1477. {
  1478. struct smb_charger *chg = data;
  1479. if (awake)
  1480. pm_stay_awake(chg->dev);
  1481. else
  1482. pm_relax(chg->dev);
  1483. return 0;
  1484. }
  1485. static int smblib_chg_disable_vote_callback(struct votable *votable, void *data,
  1486. int chg_disable, const char *client)
  1487. {
  1488. struct smb_charger *chg = data;
  1489. int rc;
  1490. rc = smblib_masked_write(chg, CHARGING_ENABLE_CMD_REG,
  1491. CHARGING_ENABLE_CMD_BIT,
  1492. chg_disable ? 0 : CHARGING_ENABLE_CMD_BIT);
  1493. if (rc < 0) {
  1494. smblib_err(chg, "Couldn't %s charging rc=%d\n",
  1495. chg_disable ? "disable" : "enable", rc);
  1496. return rc;
  1497. }
  1498. return 0;
  1499. }
  1500. static int smblib_hdc_irq_disable_vote_callback(struct votable *votable,
  1501. void *data, int disable, const char *client)
  1502. {
  1503. struct smb_charger *chg = data;
  1504. if (!chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq)
  1505. return 0;
  1506. if (chg->irq_info[HIGH_DUTY_CYCLE_IRQ].enabled) {
  1507. if (disable)
  1508. disable_irq_nosync(
  1509. chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq);
  1510. } else {
  1511. if (!disable)
  1512. enable_irq(chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq);
  1513. }
  1514. chg->irq_info[HIGH_DUTY_CYCLE_IRQ].enabled = !disable;
  1515. return 0;
  1516. }
  1517. static int smblib_limited_irq_disable_vote_callback(struct votable *votable,
  1518. void *data, int disable, const char *client)
  1519. {
  1520. struct smb_charger *chg = data;
  1521. if (!chg->irq_info[INPUT_CURRENT_LIMITING_IRQ].irq)
  1522. return 0;
  1523. if (chg->irq_info[INPUT_CURRENT_LIMITING_IRQ].enabled) {
  1524. if (disable)
  1525. disable_irq_nosync(
  1526. chg->irq_info[INPUT_CURRENT_LIMITING_IRQ].irq);
  1527. } else {
  1528. if (!disable)
  1529. enable_irq(
  1530. chg->irq_info[INPUT_CURRENT_LIMITING_IRQ].irq);
  1531. }
  1532. chg->irq_info[INPUT_CURRENT_LIMITING_IRQ].enabled = !disable;
  1533. return 0;
  1534. }
  1535. static int smblib_icl_irq_disable_vote_callback(struct votable *votable,
  1536. void *data, int disable, const char *client)
  1537. {
  1538. struct smb_charger *chg = data;
  1539. if (!chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq)
  1540. return 0;
  1541. if (chg->irq_info[USBIN_ICL_CHANGE_IRQ].enabled) {
  1542. if (disable)
  1543. disable_irq_nosync(
  1544. chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq);
  1545. } else {
  1546. if (!disable)
  1547. enable_irq(chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq);
  1548. }
  1549. chg->irq_info[USBIN_ICL_CHANGE_IRQ].enabled = !disable;
  1550. return 0;
  1551. }
  1552. static int smblib_temp_change_irq_disable_vote_callback(struct votable *votable,
  1553. void *data, int disable, const char *client)
  1554. {
  1555. struct smb_charger *chg = data;
  1556. if (!chg->irq_info[TEMP_CHANGE_IRQ].irq)
  1557. return 0;
  1558. if (chg->irq_info[TEMP_CHANGE_IRQ].enabled && disable) {
  1559. if (chg->irq_info[TEMP_CHANGE_IRQ].wake)
  1560. disable_irq_wake(chg->irq_info[TEMP_CHANGE_IRQ].irq);
  1561. disable_irq_nosync(chg->irq_info[TEMP_CHANGE_IRQ].irq);
  1562. } else if (!chg->irq_info[TEMP_CHANGE_IRQ].enabled && !disable) {
  1563. enable_irq(chg->irq_info[TEMP_CHANGE_IRQ].irq);
  1564. if (chg->irq_info[TEMP_CHANGE_IRQ].wake)
  1565. enable_irq_wake(chg->irq_info[TEMP_CHANGE_IRQ].irq);
  1566. }
  1567. chg->irq_info[TEMP_CHANGE_IRQ].enabled = !disable;
  1568. return 0;
  1569. }
  1570. static int smblib_bat_temp_irq_disable_vote_callback(struct votable *votable,
  1571. void *data, int disable, const char *client)
  1572. {
  1573. struct smb_charger *chg = data;
  1574. if (!chg->irq_info[BAT_TEMP_IRQ].irq)
  1575. return 0;
  1576. if (chg->irq_info[BAT_TEMP_IRQ].enabled && disable) {
  1577. disable_irq_wake(chg->irq_info[BAT_TEMP_IRQ].irq);
  1578. disable_irq_nosync(chg->irq_info[BAT_TEMP_IRQ].irq);
  1579. } else if (!chg->irq_info[BAT_TEMP_IRQ].enabled && !disable) {
  1580. enable_irq(chg->irq_info[BAT_TEMP_IRQ].irq);
  1581. enable_irq_wake(chg->irq_info[BAT_TEMP_IRQ].irq);
  1582. }
  1583. chg->irq_info[BAT_TEMP_IRQ].enabled = !disable;
  1584. return 0;
  1585. }
  1586. /*******************
  1587. * VCONN REGULATOR *
  1588. * *****************/
  1589. int smblib_vconn_regulator_enable(struct regulator_dev *rdev)
  1590. {
  1591. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1592. int rc = 0;
  1593. u8 stat, orientation;
  1594. smblib_dbg(chg, PR_OTG, "enabling VCONN\n");
  1595. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  1596. if (rc < 0) {
  1597. smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
  1598. return rc;
  1599. }
  1600. /* VCONN orientation is opposite to that of CC */
  1601. orientation =
  1602. stat & TYPEC_CCOUT_VALUE_BIT ? 0 : VCONN_EN_ORIENTATION_BIT;
  1603. rc = smblib_masked_write(chg, TYPE_C_VCONN_CONTROL_REG,
  1604. VCONN_EN_VALUE_BIT | VCONN_EN_ORIENTATION_BIT,
  1605. VCONN_EN_VALUE_BIT | orientation);
  1606. if (rc < 0) {
  1607. smblib_err(chg, "Couldn't read TYPE_C_CCOUT_CONTROL_REG rc=%d\n",
  1608. rc);
  1609. return rc;
  1610. }
  1611. return 0;
  1612. }
  1613. int smblib_vconn_regulator_disable(struct regulator_dev *rdev)
  1614. {
  1615. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1616. int rc = 0;
  1617. smblib_dbg(chg, PR_OTG, "disabling VCONN\n");
  1618. rc = smblib_masked_write(chg, TYPE_C_VCONN_CONTROL_REG,
  1619. VCONN_EN_VALUE_BIT, 0);
  1620. if (rc < 0)
  1621. smblib_err(chg, "Couldn't disable vconn regulator rc=%d\n", rc);
  1622. return 0;
  1623. }
  1624. int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev)
  1625. {
  1626. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1627. int rc;
  1628. u8 cmd;
  1629. rc = smblib_read(chg, TYPE_C_VCONN_CONTROL_REG, &cmd);
  1630. if (rc < 0) {
  1631. smblib_err(chg, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
  1632. rc);
  1633. return rc;
  1634. }
  1635. return (cmd & VCONN_EN_VALUE_BIT) ? 1 : 0;
  1636. }
  1637. /*****************
  1638. * OTG REGULATOR *
  1639. *****************/
  1640. int smblib_vbus_regulator_enable(struct regulator_dev *rdev)
  1641. {
  1642. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1643. int rc;
  1644. smblib_dbg(chg, PR_OTG, "enabling OTG\n");
  1645. rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, OTG_EN_BIT);
  1646. if (rc < 0) {
  1647. smblib_err(chg, "Couldn't enable OTG rc=%d\n", rc);
  1648. return rc;
  1649. }
  1650. return 0;
  1651. }
  1652. int smblib_vbus_regulator_disable(struct regulator_dev *rdev)
  1653. {
  1654. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1655. int rc;
  1656. smblib_dbg(chg, PR_OTG, "disabling OTG\n");
  1657. rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, 0);
  1658. if (rc < 0) {
  1659. smblib_err(chg, "Couldn't disable OTG regulator rc=%d\n", rc);
  1660. return rc;
  1661. }
  1662. return 0;
  1663. }
  1664. int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev)
  1665. {
  1666. struct smb_charger *chg = rdev_get_drvdata(rdev);
  1667. int rc = 0;
  1668. u8 cmd;
  1669. rc = smblib_read(chg, DCDC_CMD_OTG_REG, &cmd);
  1670. if (rc < 0) {
  1671. smblib_err(chg, "Couldn't read CMD_OTG rc=%d", rc);
  1672. return rc;
  1673. }
  1674. return (cmd & OTG_EN_BIT) ? 1 : 0;
  1675. }
  1676. /********************
  1677. * BATT PSY GETTERS *
  1678. ********************/
  1679. int smblib_get_prop_input_suspend(struct smb_charger *chg,
  1680. union power_supply_propval *val)
  1681. {
  1682. val->intval = (get_client_vote(chg->usb_icl_votable, USER_VOTER) == 0)
  1683. && get_client_vote(chg->dc_suspend_votable, USER_VOTER);
  1684. return 0;
  1685. }
  1686. int smblib_get_prop_batt_present(struct smb_charger *chg,
  1687. union power_supply_propval *val)
  1688. {
  1689. int rc;
  1690. u8 stat;
  1691. rc = smblib_read(chg, BATIF_BASE + INT_RT_STS_OFFSET, &stat);
  1692. if (rc < 0) {
  1693. smblib_err(chg, "Couldn't read BATIF_INT_RT_STS rc=%d\n", rc);
  1694. return rc;
  1695. }
  1696. val->intval = !(stat & (BAT_THERM_OR_ID_MISSING_RT_STS_BIT
  1697. | BAT_TERMINAL_MISSING_RT_STS_BIT));
  1698. return rc;
  1699. }
  1700. int smblib_get_prop_batt_capacity(struct smb_charger *chg,
  1701. union power_supply_propval *val)
  1702. {
  1703. int rc = -EINVAL;
  1704. if (chg->fake_capacity >= 0) {
  1705. val->intval = chg->fake_capacity;
  1706. return 0;
  1707. }
  1708. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CAPACITY, &val->intval);
  1709. if (rc < 0)
  1710. smblib_err(chg, "Couldn't get capacity prop rc=%d\n", rc);
  1711. return rc;
  1712. }
  1713. static bool is_charging_paused(struct smb_charger *chg)
  1714. {
  1715. int rc;
  1716. u8 val;
  1717. rc = smblib_read(chg, CHARGING_PAUSE_CMD_REG, &val);
  1718. if (rc < 0) {
  1719. smblib_err(chg, "Couldn't read CHARGING_PAUSE_CMD rc=%d\n", rc);
  1720. return false;
  1721. }
  1722. return val & CHARGING_PAUSE_CMD_BIT;
  1723. }
  1724. #define CUTOFF_COUNT 3
  1725. int smblib_get_prop_batt_status(struct smb_charger *chg,
  1726. union power_supply_propval *val)
  1727. {
  1728. union power_supply_propval pval = {0, };
  1729. bool usb_online, dc_online;
  1730. u8 stat;
  1731. int rc, suspend = 0, input_present = 0;
  1732. if (chg->fake_chg_status_on_debug_batt) {
  1733. rc = smblib_get_prop_from_bms(chg, SMB5_QG_DEBUG_BATTERY,
  1734. &pval.intval);
  1735. if (rc < 0) {
  1736. pr_err_ratelimited("Couldn't get debug battery prop rc=%d\n",
  1737. rc);
  1738. } else if (pval.intval == 1) {
  1739. val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
  1740. return 0;
  1741. }
  1742. }
  1743. rc = smblib_get_prop_batt_health(chg, &pval);
  1744. if (rc < 0) {
  1745. smblib_err(chg, "Couldn't get batt health rc=%d\n", rc);
  1746. return rc;
  1747. }
  1748. /*
  1749. * The charger status register shows charging even though the battery
  1750. * is discharging when the over voltage condition is hit. Report power
  1751. * supply state as NOT_CHARGING when the battery health reports
  1752. * over voltage.
  1753. */
  1754. if (pval.intval == POWER_SUPPLY_HEALTH_OVERVOLTAGE) {
  1755. val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  1756. return 0;
  1757. }
  1758. /*
  1759. * If SOC = 0 and we are discharging with input connected, report
  1760. * the battery status as DISCHARGING.
  1761. */
  1762. smblib_is_input_present(chg, &input_present);
  1763. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CAPACITY, &pval.intval);
  1764. if (!rc && pval.intval == 0 && input_present) {
  1765. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CURRENT_NOW,
  1766. &pval.intval);
  1767. if (!rc && pval.intval > 0) {
  1768. if (chg->cutoff_count > CUTOFF_COUNT) {
  1769. val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
  1770. return 0;
  1771. }
  1772. chg->cutoff_count++;
  1773. } else {
  1774. chg->cutoff_count = 0;
  1775. }
  1776. } else {
  1777. chg->cutoff_count = 0;
  1778. }
  1779. if (chg->dbc_usbov) {
  1780. rc = smblib_get_prop_usb_present(chg, &pval);
  1781. if (rc < 0) {
  1782. smblib_err(chg,
  1783. "Couldn't get usb present prop rc=%d\n", rc);
  1784. return rc;
  1785. }
  1786. rc = smblib_get_usb_suspend(chg, &suspend);
  1787. if (rc < 0) {
  1788. smblib_err(chg,
  1789. "Couldn't get usb suspend rc=%d\n", rc);
  1790. return rc;
  1791. }
  1792. /*
  1793. * Report charging as long as USBOV is not debounced and
  1794. * charging path is un-suspended.
  1795. */
  1796. if (pval.intval && !suspend) {
  1797. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  1798. return 0;
  1799. }
  1800. }
  1801. rc = smblib_get_prop_usb_online(chg, &pval);
  1802. if (rc < 0) {
  1803. smblib_err(chg, "Couldn't get usb online property rc=%d\n",
  1804. rc);
  1805. return rc;
  1806. }
  1807. usb_online = (bool)pval.intval;
  1808. rc = smblib_get_prop_dc_online(chg, &pval);
  1809. if (rc < 0) {
  1810. smblib_err(chg, "Couldn't get dc online property rc=%d\n",
  1811. rc);
  1812. return rc;
  1813. }
  1814. dc_online = (bool)pval.intval;
  1815. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
  1816. if (rc < 0) {
  1817. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
  1818. rc);
  1819. return rc;
  1820. }
  1821. stat = stat & BATTERY_CHARGER_STATUS_MASK;
  1822. if (!usb_online && !dc_online) {
  1823. switch (stat) {
  1824. case TERMINATE_CHARGE:
  1825. fallthrough;
  1826. case INHIBIT_CHARGE:
  1827. val->intval = POWER_SUPPLY_STATUS_FULL;
  1828. break;
  1829. default:
  1830. val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
  1831. break;
  1832. }
  1833. return rc;
  1834. }
  1835. switch (stat) {
  1836. case TRICKLE_CHARGE:
  1837. fallthrough;
  1838. case PRE_CHARGE:
  1839. fallthrough;
  1840. case FULLON_CHARGE:
  1841. fallthrough;
  1842. case TAPER_CHARGE:
  1843. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  1844. break;
  1845. case TERMINATE_CHARGE:
  1846. fallthrough;
  1847. case INHIBIT_CHARGE:
  1848. val->intval = POWER_SUPPLY_STATUS_FULL;
  1849. break;
  1850. case DISABLE_CHARGE:
  1851. fallthrough;
  1852. case PAUSE_CHARGE:
  1853. val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  1854. break;
  1855. default:
  1856. val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
  1857. break;
  1858. }
  1859. if (is_charging_paused(chg)) {
  1860. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  1861. return 0;
  1862. }
  1863. /*
  1864. * If charge termination WA is active and has suspended charging, then
  1865. * continue reporting charging status as FULL.
  1866. */
  1867. if (is_client_vote_enabled_locked(chg->usb_icl_votable,
  1868. CHG_TERMINATION_VOTER)) {
  1869. val->intval = POWER_SUPPLY_STATUS_FULL;
  1870. return 0;
  1871. }
  1872. if (val->intval != POWER_SUPPLY_STATUS_CHARGING)
  1873. return 0;
  1874. if (!usb_online && dc_online
  1875. && chg->fake_batt_status == POWER_SUPPLY_STATUS_FULL) {
  1876. val->intval = POWER_SUPPLY_STATUS_FULL;
  1877. return 0;
  1878. }
  1879. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_5_REG, &stat);
  1880. if (rc < 0) {
  1881. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
  1882. rc);
  1883. return rc;
  1884. }
  1885. stat &= ENABLE_TRICKLE_BIT | ENABLE_PRE_CHARGING_BIT |
  1886. ENABLE_FULLON_MODE_BIT;
  1887. if (!stat)
  1888. val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  1889. return 0;
  1890. }
  1891. int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
  1892. union power_supply_propval *val)
  1893. {
  1894. int rc;
  1895. u8 stat;
  1896. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
  1897. if (rc < 0) {
  1898. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
  1899. rc);
  1900. return rc;
  1901. }
  1902. switch (stat & BATTERY_CHARGER_STATUS_MASK) {
  1903. case TRICKLE_CHARGE:
  1904. fallthrough;
  1905. case PRE_CHARGE:
  1906. val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
  1907. break;
  1908. case FULLON_CHARGE:
  1909. val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
  1910. break;
  1911. case TAPER_CHARGE:
  1912. val->intval = POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE;
  1913. break;
  1914. default:
  1915. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  1916. }
  1917. return rc;
  1918. }
  1919. int smblib_get_prop_batt_health(struct smb_charger *chg,
  1920. union power_supply_propval *val)
  1921. {
  1922. union power_supply_propval pval;
  1923. int rc;
  1924. int effective_fv_uv;
  1925. u8 stat;
  1926. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_2_REG, &stat);
  1927. if (rc < 0) {
  1928. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
  1929. rc);
  1930. return rc;
  1931. }
  1932. smblib_dbg(chg, PR_REGISTER, "BATTERY_CHARGER_STATUS_2 = 0x%02x\n",
  1933. stat);
  1934. if (stat & CHARGER_ERROR_STATUS_BAT_OV_BIT) {
  1935. rc = smblib_get_prop_from_bms(chg, SMB5_QG_VOLTAGE_NOW,
  1936. &pval.intval);
  1937. if (rc < 0) {
  1938. smblib_err(chg, "Couldn't get voltage_now prop rc=%d\n",
  1939. rc);
  1940. } else {
  1941. /*
  1942. * If Vbatt is within 40mV above Vfloat, then don't
  1943. * treat it as overvoltage.
  1944. */
  1945. effective_fv_uv = get_effective_result_locked(
  1946. chg->fv_votable);
  1947. if (pval.intval >= effective_fv_uv + 40000) {
  1948. val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  1949. smblib_err(chg, "battery over-voltage vbat_fg = %duV, fv = %duV\n",
  1950. pval.intval, effective_fv_uv);
  1951. goto done;
  1952. }
  1953. }
  1954. }
  1955. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_7_REG, &stat);
  1956. if (rc < 0) {
  1957. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
  1958. rc);
  1959. return rc;
  1960. }
  1961. if (stat & BAT_TEMP_STATUS_TOO_COLD_BIT)
  1962. val->intval = POWER_SUPPLY_HEALTH_COLD;
  1963. else if (stat & BAT_TEMP_STATUS_TOO_HOT_BIT)
  1964. val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
  1965. else if (stat & BAT_TEMP_STATUS_COLD_SOFT_BIT)
  1966. val->intval = POWER_SUPPLY_HEALTH_COOL;
  1967. else if (stat & BAT_TEMP_STATUS_HOT_SOFT_BIT)
  1968. val->intval = POWER_SUPPLY_HEALTH_WARM;
  1969. else
  1970. val->intval = POWER_SUPPLY_HEALTH_GOOD;
  1971. done:
  1972. return rc;
  1973. }
  1974. int smblib_get_prop_system_temp_level(struct smb_charger *chg,
  1975. union power_supply_propval *val)
  1976. {
  1977. val->intval = chg->system_temp_level;
  1978. return 0;
  1979. }
  1980. int smblib_get_prop_system_temp_level_max(struct smb_charger *chg,
  1981. union power_supply_propval *val)
  1982. {
  1983. val->intval = chg->thermal_levels;
  1984. return 0;
  1985. }
  1986. int smblib_get_prop_input_current_limited(struct smb_charger *chg,
  1987. int *val)
  1988. {
  1989. u8 stat;
  1990. int rc;
  1991. if (chg->fake_input_current_limited >= 0) {
  1992. *val = chg->fake_input_current_limited;
  1993. return 0;
  1994. }
  1995. rc = smblib_read(chg, AICL_STATUS_REG, &stat);
  1996. if (rc < 0) {
  1997. smblib_err(chg, "Couldn't read AICL_STATUS rc=%d\n", rc);
  1998. return rc;
  1999. }
  2000. *val = (stat & SOFT_ILIMIT_BIT) || chg->is_hdc;
  2001. return 0;
  2002. }
  2003. int smblib_get_prop_batt_iterm(struct smb_charger *chg,
  2004. union power_supply_propval *val)
  2005. {
  2006. int rc, temp;
  2007. u8 stat, buf[2];
  2008. /*
  2009. * Currently, only ADC comparator-based termination is supported,
  2010. * hence read only the threshold corresponding to ADC source.
  2011. * Proceed only if CHGR_ITERM_USE_ANALOG_BIT is 0.
  2012. */
  2013. rc = smblib_read(chg, CHGR_ENG_CHARGING_CFG_REG, &stat);
  2014. if (rc < 0) {
  2015. smblib_err(chg, "Couldn't read CHGR_ENG_CHARGING_CFG_REG rc=%d\n",
  2016. rc);
  2017. return rc;
  2018. }
  2019. if (stat & CHGR_ITERM_USE_ANALOG_BIT) {
  2020. val->intval = -EINVAL;
  2021. return 0;
  2022. }
  2023. rc = smblib_batch_read(chg, CHGR_ADC_ITERM_UP_THD_MSB_REG, buf, 2);
  2024. if (rc < 0) {
  2025. smblib_err(chg, "Couldn't read CHGR_ADC_ITERM_UP_THD_MSB_REG rc=%d\n",
  2026. rc);
  2027. return rc;
  2028. }
  2029. temp = buf[1] | (buf[0] << 8);
  2030. temp = sign_extend32(temp, 15);
  2031. if (chg->chg_param.smb_version == PMI632)
  2032. temp = DIV_ROUND_CLOSEST(temp * ITERM_LIMITS_PMI632_MA,
  2033. ADC_CHG_ITERM_MASK);
  2034. else
  2035. temp = DIV_ROUND_CLOSEST(temp * ITERM_LIMITS_PM8150B_MA,
  2036. ADC_CHG_ITERM_MASK);
  2037. val->intval = temp;
  2038. return rc;
  2039. }
  2040. int smblib_get_prop_batt_charge_done(struct smb_charger *chg,
  2041. int *val)
  2042. {
  2043. int rc;
  2044. u8 stat;
  2045. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
  2046. if (rc < 0) {
  2047. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
  2048. rc);
  2049. return rc;
  2050. }
  2051. stat = stat & BATTERY_CHARGER_STATUS_MASK;
  2052. *val = (stat == TERMINATE_CHARGE);
  2053. return 0;
  2054. }
  2055. int smblib_get_batt_current_now(struct smb_charger *chg,
  2056. union power_supply_propval *val)
  2057. {
  2058. int rc;
  2059. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CURRENT_NOW, &val->intval);
  2060. if (!rc)
  2061. val->intval *= (-1);
  2062. else
  2063. smblib_err(chg, "Couldn't get current_now prop rc=%d\n", rc);
  2064. return rc;
  2065. }
  2066. /***********************
  2067. * BATTERY PSY SETTERS *
  2068. ***********************/
  2069. int smblib_set_prop_input_suspend(struct smb_charger *chg,
  2070. const union power_supply_propval *val)
  2071. {
  2072. int rc;
  2073. /* vote 0mA when suspended */
  2074. rc = vote(chg->usb_icl_votable, USER_VOTER, (bool)val->intval, 0);
  2075. if (rc < 0) {
  2076. smblib_err(chg, "Couldn't vote to %s USB rc=%d\n",
  2077. (bool)val->intval ? "suspend" : "resume", rc);
  2078. return rc;
  2079. }
  2080. rc = vote(chg->dc_suspend_votable, USER_VOTER, (bool)val->intval, 0);
  2081. if (rc < 0) {
  2082. smblib_err(chg, "Couldn't vote to %s DC rc=%d\n",
  2083. (bool)val->intval ? "suspend" : "resume", rc);
  2084. return rc;
  2085. }
  2086. power_supply_changed(chg->batt_psy);
  2087. return rc;
  2088. }
  2089. int smblib_set_prop_batt_capacity(struct smb_charger *chg,
  2090. const union power_supply_propval *val)
  2091. {
  2092. chg->fake_capacity = val->intval;
  2093. power_supply_changed(chg->batt_psy);
  2094. return 0;
  2095. }
  2096. int smblib_set_prop_batt_status(struct smb_charger *chg,
  2097. const union power_supply_propval *val)
  2098. {
  2099. /* Faking battery full */
  2100. if (val->intval == POWER_SUPPLY_STATUS_FULL)
  2101. chg->fake_batt_status = val->intval;
  2102. else
  2103. chg->fake_batt_status = -EINVAL;
  2104. power_supply_changed(chg->batt_psy);
  2105. return 0;
  2106. }
  2107. int smblib_set_prop_system_temp_level(struct smb_charger *chg,
  2108. const union power_supply_propval *val)
  2109. {
  2110. if (val->intval < 0)
  2111. return -EINVAL;
  2112. if (chg->thermal_levels <= 0)
  2113. return -EINVAL;
  2114. if (val->intval > chg->thermal_levels)
  2115. return -EINVAL;
  2116. chg->system_temp_level = val->intval;
  2117. if (chg->system_temp_level == chg->thermal_levels)
  2118. return vote(chg->chg_disable_votable,
  2119. THERMAL_DAEMON_VOTER, true, 0);
  2120. vote(chg->chg_disable_votable, THERMAL_DAEMON_VOTER, false, 0);
  2121. if (chg->system_temp_level == 0)
  2122. return vote(chg->fcc_votable, THERMAL_DAEMON_VOTER, false, 0);
  2123. vote(chg->fcc_votable, THERMAL_DAEMON_VOTER, true,
  2124. chg->thermal_mitigation[chg->system_temp_level]);
  2125. return 0;
  2126. }
  2127. int smblib_set_prop_input_current_limited(struct smb_charger *chg,
  2128. int val)
  2129. {
  2130. chg->fake_input_current_limited = val;
  2131. return 0;
  2132. }
  2133. int smblib_set_prop_rechg_soc_thresh(struct smb_charger *chg,
  2134. int val)
  2135. {
  2136. int rc;
  2137. u8 new_thr = DIV_ROUND_CLOSEST(val * 255, 100);
  2138. rc = smblib_write(chg, CHARGE_RCHG_SOC_THRESHOLD_CFG_REG,
  2139. new_thr);
  2140. if (rc < 0) {
  2141. smblib_err(chg, "Couldn't write to RCHG_SOC_THRESHOLD_CFG_REG rc=%d\n",
  2142. rc);
  2143. return rc;
  2144. }
  2145. chg->auto_recharge_soc = val;
  2146. return rc;
  2147. }
  2148. int smblib_run_aicl(struct smb_charger *chg, int type)
  2149. {
  2150. int rc;
  2151. u8 stat;
  2152. rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
  2153. if (rc < 0) {
  2154. smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
  2155. rc);
  2156. return rc;
  2157. }
  2158. /* USB is suspended so skip re-running AICL */
  2159. if (stat & USBIN_SUSPEND_STS_BIT)
  2160. return rc;
  2161. smblib_dbg(chg, PR_MISC, "re-running AICL\n");
  2162. stat = (type == RERUN_AICL) ? RERUN_AICL_BIT : RESTART_AICL_BIT;
  2163. rc = smblib_masked_write(chg, AICL_CMD_REG, stat, stat);
  2164. if (rc < 0)
  2165. smblib_err(chg, "Couldn't write to AICL_CMD_REG rc=%d\n",
  2166. rc);
  2167. return 0;
  2168. }
  2169. static int smblib_dp_pulse(struct smb_charger *chg)
  2170. {
  2171. int rc;
  2172. /* QC 3.0 increment */
  2173. rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, SINGLE_INCREMENT_BIT,
  2174. SINGLE_INCREMENT_BIT);
  2175. if (rc < 0)
  2176. smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n",
  2177. rc);
  2178. return rc;
  2179. }
  2180. static int smblib_dm_pulse(struct smb_charger *chg)
  2181. {
  2182. int rc;
  2183. /* QC 3.0 decrement */
  2184. rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, SINGLE_DECREMENT_BIT,
  2185. SINGLE_DECREMENT_BIT);
  2186. if (rc < 0)
  2187. smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n",
  2188. rc);
  2189. return rc;
  2190. }
  2191. int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val)
  2192. {
  2193. int rc;
  2194. rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, val, val);
  2195. if (rc < 0)
  2196. smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n",
  2197. rc);
  2198. return rc;
  2199. }
  2200. static void smblib_hvdcp_set_fsw(struct smb_charger *chg, int bit)
  2201. {
  2202. switch (bit) {
  2203. case QC_5V_BIT:
  2204. smblib_set_opt_switcher_freq(chg,
  2205. chg->chg_freq.freq_5V);
  2206. break;
  2207. case QC_9V_BIT:
  2208. smblib_set_opt_switcher_freq(chg,
  2209. chg->chg_freq.freq_9V);
  2210. break;
  2211. case QC_12V_BIT:
  2212. smblib_set_opt_switcher_freq(chg,
  2213. chg->chg_freq.freq_12V);
  2214. break;
  2215. default:
  2216. smblib_set_opt_switcher_freq(chg,
  2217. chg->chg_freq.freq_removal);
  2218. break;
  2219. }
  2220. }
  2221. #define QC3_PULSES_FOR_6V 5
  2222. #define QC3_PULSES_FOR_9V 20
  2223. #define QC3_PULSES_FOR_12V 35
  2224. static int smblib_hvdcp3_set_fsw(struct smb_charger *chg)
  2225. {
  2226. int pulse_count, rc;
  2227. rc = smblib_get_pulse_cnt(chg, &pulse_count);
  2228. if (rc < 0) {
  2229. smblib_err(chg, "Couldn't read QC_PULSE_COUNT rc=%d\n", rc);
  2230. return rc;
  2231. }
  2232. if (pulse_count < QC3_PULSES_FOR_6V)
  2233. smblib_set_opt_switcher_freq(chg,
  2234. chg->chg_freq.freq_5V);
  2235. else if (pulse_count < QC3_PULSES_FOR_9V)
  2236. smblib_set_opt_switcher_freq(chg,
  2237. chg->chg_freq.freq_6V_8V);
  2238. else if (pulse_count < QC3_PULSES_FOR_12V)
  2239. smblib_set_opt_switcher_freq(chg,
  2240. chg->chg_freq.freq_9V);
  2241. else
  2242. smblib_set_opt_switcher_freq(chg,
  2243. chg->chg_freq.freq_12V);
  2244. return 0;
  2245. }
  2246. static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg)
  2247. {
  2248. int rc;
  2249. u8 stat;
  2250. if (chg->real_charger_type == QTI_POWER_SUPPLY_TYPE_USB_HVDCP) {
  2251. rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
  2252. if (rc < 0) {
  2253. smblib_err(chg,
  2254. "Couldn't read QC_CHANGE_STATUS rc=%d\n", rc);
  2255. return;
  2256. }
  2257. smblib_hvdcp_set_fsw(chg, stat & QC_2P0_STATUS_MASK);
  2258. vote(chg->usb_icl_votable, HVDCP2_ICL_VOTER, false, 0);
  2259. }
  2260. if (chg->real_charger_type == QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3
  2261. || chg->real_charger_type ==
  2262. QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5) {
  2263. rc = smblib_hvdcp3_set_fsw(chg);
  2264. if (rc < 0)
  2265. smblib_err(chg, "Couldn't set QC3.0 Fsw rc=%d\n", rc);
  2266. }
  2267. power_supply_changed(chg->batt_psy);
  2268. }
  2269. int smblib_dp_dm(struct smb_charger *chg, int val)
  2270. {
  2271. int target_icl_ua, data, rc = 0;
  2272. u8 stat;
  2273. switch (val) {
  2274. case QTI_POWER_SUPPLY_DP_DM_DP_PULSE:
  2275. /*
  2276. * Pre-emptively increment pulse count to enable the setting
  2277. * of FSW prior to increasing voltage.
  2278. */
  2279. chg->pulse_cnt++;
  2280. rc = smblib_hvdcp3_set_fsw(chg);
  2281. if (rc < 0)
  2282. smblib_err(chg, "Couldn't set QC3.0 Fsw rc=%d\n", rc);
  2283. rc = smblib_dp_pulse(chg);
  2284. if (rc < 0) {
  2285. smblib_err(chg, "Couldn't increase pulse count rc=%d\n",
  2286. rc);
  2287. /*
  2288. * Increment pulse count failed;
  2289. * reset to former value.
  2290. */
  2291. chg->pulse_cnt--;
  2292. }
  2293. smblib_dbg(chg, PR_PARALLEL, "DP_DM_DP_PULSE rc=%d cnt=%d\n",
  2294. rc, chg->pulse_cnt);
  2295. break;
  2296. case QTI_POWER_SUPPLY_DP_DM_DM_PULSE:
  2297. rc = smblib_dm_pulse(chg);
  2298. if (!rc && chg->pulse_cnt)
  2299. chg->pulse_cnt--;
  2300. smblib_dbg(chg, PR_PARALLEL, "DP_DM_DM_PULSE rc=%d cnt=%d\n",
  2301. rc, chg->pulse_cnt);
  2302. break;
  2303. case QTI_POWER_SUPPLY_DP_DM_ICL_DOWN:
  2304. target_icl_ua = get_effective_result(chg->usb_icl_votable);
  2305. if (target_icl_ua < 0) {
  2306. /* no client vote, get the ICL from charger */
  2307. rc = smblib_get_charge_current(chg, &data);
  2308. if (rc < 0) {
  2309. smblib_err(chg, "Couldn't get max curr rc=%d\n",
  2310. rc);
  2311. return rc;
  2312. }
  2313. target_icl_ua = data;
  2314. }
  2315. /*
  2316. * Check if any other voter voted on USB_ICL in case of
  2317. * voter other than SW_QC3_VOTER reset and restart reduction
  2318. * again.
  2319. */
  2320. if (target_icl_ua != get_client_vote(chg->usb_icl_votable,
  2321. SW_QC3_VOTER))
  2322. chg->usb_icl_delta_ua = 0;
  2323. chg->usb_icl_delta_ua += 100000;
  2324. vote(chg->usb_icl_votable, SW_QC3_VOTER, true,
  2325. target_icl_ua - 100000);
  2326. smblib_dbg(chg, PR_PARALLEL, "ICL DOWN ICL=%d reduction=%d\n",
  2327. target_icl_ua, chg->usb_icl_delta_ua);
  2328. break;
  2329. case QTI_POWER_SUPPLY_DP_DM_FORCE_5V:
  2330. rc = smblib_force_vbus_voltage(chg, FORCE_5V_BIT);
  2331. if (rc < 0)
  2332. pr_err("Failed to force 5V\n");
  2333. break;
  2334. case QTI_POWER_SUPPLY_DP_DM_FORCE_9V:
  2335. if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) {
  2336. smblib_err(chg, "Couldn't set 9V: unsupported\n");
  2337. return -EINVAL;
  2338. }
  2339. /* If we are increasing voltage to get to 9V, set FSW first */
  2340. rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
  2341. if (rc < 0) {
  2342. smblib_err(chg, "Couldn't read QC_CHANGE_STATUS_REG rc=%d\n",
  2343. rc);
  2344. break;
  2345. }
  2346. if (stat & QC_5V_BIT) {
  2347. /* Force 1A ICL before requesting higher voltage */
  2348. vote(chg->usb_icl_votable, HVDCP2_ICL_VOTER,
  2349. true, 1000000);
  2350. smblib_hvdcp_set_fsw(chg, QC_9V_BIT);
  2351. }
  2352. rc = smblib_force_vbus_voltage(chg, FORCE_9V_BIT);
  2353. if (rc < 0)
  2354. pr_err("Failed to force 9V\n");
  2355. break;
  2356. case QTI_POWER_SUPPLY_DP_DM_FORCE_12V:
  2357. if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_12V) {
  2358. smblib_err(chg, "Couldn't set 12V: unsupported\n");
  2359. return -EINVAL;
  2360. }
  2361. /* If we are increasing voltage to get to 12V, set FSW first */
  2362. rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
  2363. if (rc < 0) {
  2364. smblib_err(chg, "Couldn't read QC_CHANGE_STATUS_REG rc=%d\n",
  2365. rc);
  2366. break;
  2367. }
  2368. if ((stat & QC_9V_BIT) || (stat & QC_5V_BIT)) {
  2369. /* Force 1A ICL before requesting higher voltage */
  2370. vote(chg->usb_icl_votable, HVDCP2_ICL_VOTER,
  2371. true, 1000000);
  2372. smblib_hvdcp_set_fsw(chg, QC_12V_BIT);
  2373. }
  2374. rc = smblib_force_vbus_voltage(chg, FORCE_12V_BIT);
  2375. if (rc < 0)
  2376. pr_err("Failed to force 12V\n");
  2377. break;
  2378. case QTI_POWER_SUPPLY_DP_DM_CONFIRMED_HVDCP3P5:
  2379. chg->qc3p5_detected = true;
  2380. smblib_update_usb_type(chg);
  2381. break;
  2382. case QTI_POWER_SUPPLY_DP_DM_ICL_UP:
  2383. default:
  2384. break;
  2385. }
  2386. return rc;
  2387. }
  2388. int smblib_disable_hw_jeita(struct smb_charger *chg, bool disable)
  2389. {
  2390. int rc;
  2391. u8 mask;
  2392. /*
  2393. * Disable h/w base JEITA compensation if s/w JEITA is enabled
  2394. */
  2395. mask = JEITA_EN_COLD_SL_FCV_BIT
  2396. | JEITA_EN_HOT_SL_FCV_BIT
  2397. | JEITA_EN_HOT_SL_CCC_BIT
  2398. | JEITA_EN_COLD_SL_CCC_BIT,
  2399. rc = smblib_masked_write(chg, JEITA_EN_CFG_REG, mask,
  2400. disable ? 0 : mask);
  2401. if (rc < 0) {
  2402. dev_err(chg->dev, "Couldn't configure s/w jeita rc=%d\n",
  2403. rc);
  2404. return rc;
  2405. }
  2406. return 0;
  2407. }
  2408. static int smblib_set_sw_thermal_regulation(struct smb_charger *chg,
  2409. bool enable)
  2410. {
  2411. int rc = 0;
  2412. if (!(chg->wa_flags & SW_THERM_REGULATION_WA))
  2413. return rc;
  2414. if (enable) {
  2415. /*
  2416. * Configure min time to quickly address thermal
  2417. * condition.
  2418. */
  2419. rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG,
  2420. SNARL_WDOG_TIMEOUT_MASK, SNARL_WDOG_TMOUT_62P5MS);
  2421. if (rc < 0) {
  2422. smblib_err(chg, "Couldn't configure snarl wdog tmout, rc=%d\n",
  2423. rc);
  2424. return rc;
  2425. }
  2426. /*
  2427. * Schedule SW_THERM_REGULATION_WORK directly if USB input
  2428. * is suspended due to SW thermal regulation WA since WDOG
  2429. * IRQ won't trigger with input suspended.
  2430. */
  2431. if (is_client_vote_enabled(chg->usb_icl_votable,
  2432. SW_THERM_REGULATION_VOTER)) {
  2433. vote(chg->awake_votable, SW_THERM_REGULATION_VOTER,
  2434. true, 0);
  2435. schedule_delayed_work(&chg->thermal_regulation_work, 0);
  2436. }
  2437. } else {
  2438. cancel_delayed_work_sync(&chg->thermal_regulation_work);
  2439. vote(chg->awake_votable, SW_THERM_REGULATION_VOTER, false, 0);
  2440. }
  2441. smblib_dbg(chg, PR_MISC, "WDOG SNARL INT %s\n",
  2442. enable ? "Enabled" : "Disabled");
  2443. return rc;
  2444. }
  2445. static int smblib_update_thermal_readings(struct smb_charger *chg)
  2446. {
  2447. int rc = 0, data = 0;
  2448. struct iio_channel **iio_list;
  2449. if (!chg->iio_chan_list_smb_parallel) {
  2450. iio_list = get_ext_channels(chg->dev,
  2451. smblib_parallel_ext_iio_chan,
  2452. ARRAY_SIZE(smblib_parallel_ext_iio_chan));
  2453. if (IS_ERR(iio_list)) {
  2454. rc = PTR_ERR(iio_list);
  2455. if (rc != -EPROBE_DEFER) {
  2456. dev_err(chg->dev, "Failed to get channels, %d\n",
  2457. rc);
  2458. chg->iio_chan_list_smb_parallel =
  2459. ERR_PTR(-EINVAL);
  2460. }
  2461. } else {
  2462. chg->iio_chan_list_smb_parallel = iio_list;
  2463. }
  2464. }
  2465. rc = smblib_read_iio_channel(chg, chg->iio.die_temp_chan,
  2466. DIV_FACTOR_DECIDEGC, &chg->die_temp);
  2467. if (rc < 0) {
  2468. smblib_err(chg, "Couldn't read DIE TEMP channel, rc=%d\n", rc);
  2469. return rc;
  2470. }
  2471. rc = smblib_read_iio_channel(chg, chg->iio.connector_temp_chan,
  2472. DIV_FACTOR_DECIDEGC, &chg->connector_temp);
  2473. if (rc < 0) {
  2474. smblib_err(chg, "Couldn't read CONN TEMP channel, rc=%d\n", rc);
  2475. return rc;
  2476. }
  2477. rc = smblib_read_iio_channel(chg, chg->iio.skin_temp_chan,
  2478. DIV_FACTOR_DECIDEGC, &chg->skin_temp);
  2479. if (rc < 0) {
  2480. smblib_err(chg, "Couldn't read SKIN TEMP channel, rc=%d\n", rc);
  2481. return rc;
  2482. }
  2483. if (chg->sec_chg_selected == QTI_POWER_SUPPLY_CHARGER_SEC_CP) {
  2484. if (is_cp_available(chg)) {
  2485. rc = smblib_read_iio_prop(chg, CP, CP_DIE_TEMP, &data);
  2486. if (rc < 0) {
  2487. smblib_err(chg, "Couldn't get smb1390 charger temp, rc=%d\n",
  2488. rc);
  2489. return rc;
  2490. }
  2491. chg->smb_temp = data;
  2492. } else {
  2493. smblib_dbg(chg, PR_MISC, "Coudln't find cp_psy\n");
  2494. chg->smb_temp = -ENODATA;
  2495. }
  2496. } else if (!IS_ERR_OR_NULL(chg->iio_chan_list_smb_parallel) &&
  2497. chg->sec_chg_selected == QTI_POWER_SUPPLY_CHARGER_SEC_PL) {
  2498. rc = smblib_read_iio_prop(chg, SMB_PARALLEL, SMB_CHARGER_TEMP,
  2499. &data);
  2500. if (rc < 0) {
  2501. smblib_err(chg, "Couldn't get smb1355 charger temp, rc=%d\n",
  2502. rc);
  2503. return rc;
  2504. }
  2505. chg->smb_temp = data;
  2506. } else {
  2507. chg->smb_temp = -ENODATA;
  2508. }
  2509. return rc;
  2510. }
  2511. /* SW thermal regulation thresholds in deciDegC */
  2512. #define DIE_TEMP_RST_THRESH 1000
  2513. #define DIE_TEMP_REG_H_THRESH 800
  2514. #define DIE_TEMP_REG_L_THRESH 600
  2515. #define CONNECTOR_TEMP_SHDN_THRESH 700
  2516. #define CONNECTOR_TEMP_RST_THRESH 600
  2517. #define CONNECTOR_TEMP_REG_H_THRESH 550
  2518. #define CONNECTOR_TEMP_REG_L_THRESH 500
  2519. #define SMB_TEMP_SHDN_THRESH 1400
  2520. #define SMB_TEMP_RST_THRESH 900
  2521. #define SMB_TEMP_REG_H_THRESH 800
  2522. #define SMB_TEMP_REG_L_THRESH 600
  2523. #define SKIN_TEMP_SHDN_THRESH 700
  2524. #define SKIN_TEMP_RST_THRESH 600
  2525. #define SKIN_TEMP_REG_H_THRESH 550
  2526. #define SKIN_TEMP_REG_L_THRESH 500
  2527. #define THERM_REG_RECHECK_DELAY_1S 1000 /* 1 sec */
  2528. #define THERM_REG_RECHECK_DELAY_8S 8000 /* 8 sec */
  2529. static int smblib_process_thermal_readings(struct smb_charger *chg)
  2530. {
  2531. int rc = 0, wdog_timeout = SNARL_WDOG_TMOUT_8S;
  2532. u32 thermal_status = TEMP_BELOW_RANGE;
  2533. bool suspend_input = false, disable_smb = false;
  2534. /*
  2535. * Following is the SW thermal regulation flow:
  2536. *
  2537. * TEMP_SHUT_DOWN_LEVEL: If either connector temp or skin temp
  2538. * exceeds their respective SHDN threshold. Need to suspend input
  2539. * and secondary charger.
  2540. *
  2541. * TEMP_SHUT_DOWN_SMB_LEVEL: If smb temp exceed its SHDN threshold
  2542. * but connector and skin temp are below it. Need to suspend SMB.
  2543. *
  2544. * TEMP_ALERT_LEVEL: If die, connector, smb or skin temp exceeds it's
  2545. * respective RST threshold. Stay put and monitor temperature closely.
  2546. *
  2547. * TEMP_ABOVE_RANGE or TEMP_WITHIN_RANGE or TEMP_BELOW_RANGE: If die,
  2548. * connector, smb or skin temp exceeds it's respective REG_H or REG_L
  2549. * threshold. Unsuspend input and SMB.
  2550. */
  2551. if (chg->connector_temp > CONNECTOR_TEMP_SHDN_THRESH ||
  2552. chg->skin_temp > SKIN_TEMP_SHDN_THRESH) {
  2553. thermal_status = TEMP_SHUT_DOWN;
  2554. wdog_timeout = SNARL_WDOG_TMOUT_1S;
  2555. suspend_input = true;
  2556. disable_smb = true;
  2557. goto out;
  2558. }
  2559. if (chg->smb_temp > SMB_TEMP_SHDN_THRESH) {
  2560. thermal_status = TEMP_SHUT_DOWN_SMB;
  2561. wdog_timeout = SNARL_WDOG_TMOUT_1S;
  2562. disable_smb = true;
  2563. goto out;
  2564. }
  2565. if (chg->connector_temp > CONNECTOR_TEMP_RST_THRESH ||
  2566. chg->skin_temp > SKIN_TEMP_RST_THRESH ||
  2567. chg->smb_temp > SMB_TEMP_RST_THRESH ||
  2568. chg->die_temp > DIE_TEMP_RST_THRESH) {
  2569. thermal_status = TEMP_ALERT_LEVEL;
  2570. wdog_timeout = SNARL_WDOG_TMOUT_1S;
  2571. goto out;
  2572. }
  2573. if (chg->connector_temp > CONNECTOR_TEMP_REG_H_THRESH ||
  2574. chg->skin_temp > SKIN_TEMP_REG_H_THRESH ||
  2575. chg->smb_temp > SMB_TEMP_REG_H_THRESH ||
  2576. chg->die_temp > DIE_TEMP_REG_H_THRESH) {
  2577. thermal_status = TEMP_ABOVE_RANGE;
  2578. wdog_timeout = SNARL_WDOG_TMOUT_1S;
  2579. goto out;
  2580. }
  2581. if (chg->connector_temp > CONNECTOR_TEMP_REG_L_THRESH ||
  2582. chg->skin_temp > SKIN_TEMP_REG_L_THRESH ||
  2583. chg->smb_temp > SMB_TEMP_REG_L_THRESH ||
  2584. chg->die_temp > DIE_TEMP_REG_L_THRESH) {
  2585. thermal_status = TEMP_WITHIN_RANGE;
  2586. wdog_timeout = SNARL_WDOG_TMOUT_8S;
  2587. }
  2588. out:
  2589. smblib_dbg(chg, PR_MISC, "Current temperatures: \tDIE_TEMP: %d,\tCONN_TEMP: %d,\tSMB_TEMP: %d,\tSKIN_TEMP: %d\nTHERMAL_STATUS: %d\n",
  2590. chg->die_temp, chg->connector_temp, chg->smb_temp,
  2591. chg->skin_temp, thermal_status);
  2592. if (thermal_status != chg->thermal_status) {
  2593. chg->thermal_status = thermal_status;
  2594. /*
  2595. * If thermal level changes to TEMP ALERT LEVEL, don't
  2596. * enable/disable main/parallel charging.
  2597. */
  2598. if (chg->thermal_status == TEMP_ALERT_LEVEL)
  2599. goto exit;
  2600. vote(chg->smb_override_votable, SW_THERM_REGULATION_VOTER,
  2601. disable_smb, 0);
  2602. /*
  2603. * Enable/disable secondary charger through votables to ensure
  2604. * that if SMB_EN pin get's toggled somehow, secondary charger
  2605. * remains enabled/disabled according to SW thermal regulation.
  2606. */
  2607. if (!chg->cp_disable_votable)
  2608. chg->cp_disable_votable = find_votable("CP_DISABLE");
  2609. if (chg->cp_disable_votable)
  2610. vote(chg->cp_disable_votable, SW_THERM_REGULATION_VOTER,
  2611. disable_smb, 0);
  2612. vote(chg->pl_disable_votable, SW_THERM_REGULATION_VOTER,
  2613. disable_smb, 0);
  2614. smblib_dbg(chg, PR_MISC, "Parallel %s as per SW thermal regulation\n",
  2615. disable_smb ? "disabled" : "enabled");
  2616. /*
  2617. * If thermal level changes to TEMP_SHUT_DOWN_SMB, don't
  2618. * enable/disable main charger.
  2619. */
  2620. if (chg->thermal_status == TEMP_SHUT_DOWN_SMB)
  2621. goto exit;
  2622. /* Suspend input if SHDN threshold reached */
  2623. vote(chg->dc_suspend_votable, SW_THERM_REGULATION_VOTER,
  2624. suspend_input, 0);
  2625. vote(chg->usb_icl_votable, SW_THERM_REGULATION_VOTER,
  2626. suspend_input, 0);
  2627. smblib_dbg(chg, PR_MISC, "USB/DC %s as per SW thermal regulation\n",
  2628. suspend_input ? "suspended" : "unsuspended");
  2629. }
  2630. exit:
  2631. /*
  2632. * On USB suspend, WDOG IRQ stops triggering. To continue thermal
  2633. * monitoring and regulation until USB is plugged out, reschedule
  2634. * the SW thermal regulation work without releasing the wake lock.
  2635. */
  2636. if (is_client_vote_enabled(chg->usb_icl_votable,
  2637. SW_THERM_REGULATION_VOTER)) {
  2638. schedule_delayed_work(&chg->thermal_regulation_work,
  2639. msecs_to_jiffies(THERM_REG_RECHECK_DELAY_1S));
  2640. return 0;
  2641. }
  2642. rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG,
  2643. SNARL_WDOG_TIMEOUT_MASK, wdog_timeout);
  2644. if (rc < 0)
  2645. smblib_err(chg, "Couldn't set WD SNARL timer, rc=%d\n", rc);
  2646. vote(chg->awake_votable, SW_THERM_REGULATION_VOTER, false, 0);
  2647. return rc;
  2648. }
  2649. /*******************
  2650. * DC PSY GETTERS *
  2651. *******************/
  2652. int smblib_get_prop_voltage_wls_output(struct smb_charger *chg,
  2653. union power_supply_propval *val)
  2654. {
  2655. int rc = 0;
  2656. if (!chg->wls_psy) {
  2657. chg->wls_psy = power_supply_get_by_name("wireless");
  2658. if (!chg->wls_psy) {
  2659. val->intval = -EINVAL;
  2660. return 0;
  2661. }
  2662. }
  2663. rc = power_supply_get_property(chg->wls_psy,
  2664. POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
  2665. val);
  2666. return rc;
  2667. }
  2668. int smblib_get_prop_dc_present(struct smb_charger *chg,
  2669. union power_supply_propval *val)
  2670. {
  2671. int rc;
  2672. u8 stat;
  2673. if (chg->chg_param.smb_version == PMI632) {
  2674. val->intval = 0;
  2675. return 0;
  2676. }
  2677. rc = smblib_read(chg, DCIN_BASE + INT_RT_STS_OFFSET, &stat);
  2678. if (rc < 0) {
  2679. smblib_err(chg, "Couldn't read DCIN_RT_STS rc=%d\n", rc);
  2680. return rc;
  2681. }
  2682. val->intval = (bool)(stat & DCIN_PLUGIN_RT_STS_BIT);
  2683. return 0;
  2684. }
  2685. int smblib_get_prop_dc_online(struct smb_charger *chg,
  2686. union power_supply_propval *val)
  2687. {
  2688. int rc = 0;
  2689. u8 stat;
  2690. if (chg->chg_param.smb_version == PMI632) {
  2691. val->intval = 0;
  2692. return 0;
  2693. }
  2694. if (get_client_vote(chg->dc_suspend_votable, USER_VOTER)) {
  2695. val->intval = false;
  2696. return rc;
  2697. }
  2698. if (is_client_vote_enabled(chg->dc_suspend_votable,
  2699. CHG_TERMINATION_VOTER)) {
  2700. rc = smblib_get_prop_dc_present(chg, val);
  2701. return rc;
  2702. }
  2703. rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
  2704. if (rc < 0) {
  2705. smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
  2706. rc);
  2707. return rc;
  2708. }
  2709. smblib_dbg(chg, PR_REGISTER, "POWER_PATH_STATUS = 0x%02x\n",
  2710. stat);
  2711. val->intval = (stat & USE_DCIN_BIT) &&
  2712. (stat & VALID_INPUT_POWER_SOURCE_STS_BIT);
  2713. return rc;
  2714. }
  2715. int smblib_get_prop_dc_current_max(struct smb_charger *chg,
  2716. union power_supply_propval *val)
  2717. {
  2718. return smblib_get_charge_param(chg, &chg->param.dc_icl, &val->intval);
  2719. }
  2720. int smblib_get_prop_dc_voltage_max(struct smb_charger *chg,
  2721. union power_supply_propval *val)
  2722. {
  2723. int rc;
  2724. val->intval = MICRO_12V;
  2725. if (!chg->wls_psy)
  2726. chg->wls_psy = power_supply_get_by_name("wireless");
  2727. if (chg->wls_psy) {
  2728. rc = power_supply_get_property(chg->wls_psy,
  2729. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  2730. val);
  2731. if (rc < 0) {
  2732. dev_err(chg->dev, "Couldn't get VOLTAGE_MAX, rc=%d\n",
  2733. rc);
  2734. return rc;
  2735. }
  2736. }
  2737. return 0;
  2738. }
  2739. int smblib_get_prop_dc_voltage_now(struct smb_charger *chg,
  2740. union power_supply_propval *val)
  2741. {
  2742. int rc = 0;
  2743. if (!chg->wls_psy) {
  2744. chg->wls_psy = power_supply_get_by_name("wireless");
  2745. if (!chg->wls_psy) {
  2746. val->intval = -EINVAL;
  2747. return 0;
  2748. }
  2749. }
  2750. rc = power_supply_get_property(chg->wls_psy,
  2751. POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
  2752. val);
  2753. if (rc < 0) {
  2754. dev_err(chg->dev, "Couldn't get POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, rc=%d\n",
  2755. rc);
  2756. return rc;
  2757. }
  2758. return rc;
  2759. }
  2760. /*******************
  2761. * DC PSY SETTERS *
  2762. *******************/
  2763. int smblib_set_prop_dc_current_max(struct smb_charger *chg,
  2764. const union power_supply_propval *val)
  2765. {
  2766. chg->dcin_icl_user_set = true;
  2767. return smblib_set_charge_param(chg, &chg->param.dc_icl, val->intval);
  2768. }
  2769. #define DCIN_AICL_RERUN_DELAY_MS 5000
  2770. int smblib_set_prop_voltage_wls_output(struct smb_charger *chg,
  2771. union power_supply_propval *val)
  2772. {
  2773. int rc = 0;
  2774. if (!chg->wls_psy) {
  2775. chg->wls_psy = power_supply_get_by_name("wireless");
  2776. if (!chg->wls_psy)
  2777. return -ENODEV;
  2778. }
  2779. rc = power_supply_set_property(chg->wls_psy,
  2780. POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
  2781. val);
  2782. if (rc < 0)
  2783. dev_err(chg->dev, "Couldn't set POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, rc=%d\n",
  2784. rc);
  2785. smblib_dbg(chg, PR_WLS, "%d\n", val->intval);
  2786. /*
  2787. * When WLS VOUT goes down, the power-constrained adaptor may be able
  2788. * to supply more current, so allow it to do so - unless userspace has
  2789. * changed DCIN ICL value already due to thermal considerations.
  2790. */
  2791. if (!chg->dcin_icl_user_set && (val->intval > 0) &&
  2792. (val->intval < chg->last_wls_vout)) {
  2793. alarm_start_relative(&chg->dcin_aicl_alarm,
  2794. ms_to_ktime(DCIN_AICL_RERUN_DELAY_MS));
  2795. }
  2796. chg->last_wls_vout = val->intval;
  2797. return rc;
  2798. }
  2799. int smblib_set_prop_dc_reset(struct smb_charger *chg)
  2800. {
  2801. int rc;
  2802. rc = vote(chg->dc_suspend_votable, VOUT_VOTER, true, 0);
  2803. if (rc < 0) {
  2804. smblib_err(chg, "Couldn't suspend DC rc=%d\n", rc);
  2805. return rc;
  2806. }
  2807. rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK,
  2808. DCIN_EN_OVERRIDE_BIT);
  2809. if (rc < 0) {
  2810. smblib_err(chg, "Couldn't set DCIN_EN_OVERRIDE_BIT rc=%d\n",
  2811. rc);
  2812. return rc;
  2813. }
  2814. rc = smblib_write(chg, DCIN_CMD_PON_REG, DCIN_PON_BIT | MID_CHG_BIT);
  2815. if (rc < 0) {
  2816. smblib_err(chg, "Couldn't write %d to DCIN_CMD_PON_REG rc=%d\n",
  2817. DCIN_PON_BIT | MID_CHG_BIT, rc);
  2818. return rc;
  2819. }
  2820. /* Wait for 10ms to allow the charge to get drained */
  2821. usleep_range(10000, 10010);
  2822. rc = smblib_write(chg, DCIN_CMD_PON_REG, 0);
  2823. if (rc < 0) {
  2824. smblib_err(chg, "Couldn't clear DCIN_CMD_PON_REG rc=%d\n", rc);
  2825. return rc;
  2826. }
  2827. rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK, 0);
  2828. if (rc < 0) {
  2829. smblib_err(chg, "Couldn't clear DCIN_EN_OVERRIDE_BIT rc=%d\n",
  2830. rc);
  2831. return rc;
  2832. }
  2833. rc = vote(chg->dc_suspend_votable, VOUT_VOTER, false, 0);
  2834. if (rc < 0) {
  2835. smblib_err(chg, "Couldn't unsuspend DC rc=%d\n", rc);
  2836. return rc;
  2837. }
  2838. smblib_dbg(chg, PR_MISC, "Wireless charger removal detection successful\n");
  2839. return rc;
  2840. }
  2841. /*******************
  2842. * USB PSY GETTERS *
  2843. *******************/
  2844. int smblib_get_prop_usb_present(struct smb_charger *chg,
  2845. union power_supply_propval *val)
  2846. {
  2847. int rc;
  2848. u8 stat;
  2849. rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
  2850. if (rc < 0) {
  2851. smblib_err(chg, "Couldn't read USBIN_RT_STS rc=%d\n", rc);
  2852. return rc;
  2853. }
  2854. val->intval = (bool)(stat & USBIN_PLUGIN_RT_STS_BIT);
  2855. return 0;
  2856. }
  2857. int smblib_get_prop_usb_online(struct smb_charger *chg,
  2858. union power_supply_propval *val)
  2859. {
  2860. int rc = 0;
  2861. u8 stat;
  2862. if (get_client_vote_locked(chg->usb_icl_votable, USER_VOTER) == 0) {
  2863. val->intval = false;
  2864. return rc;
  2865. }
  2866. if (is_client_vote_enabled_locked(chg->usb_icl_votable,
  2867. CHG_TERMINATION_VOTER)) {
  2868. rc = smblib_get_prop_usb_present(chg, val);
  2869. return rc;
  2870. }
  2871. rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
  2872. if (rc < 0) {
  2873. smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
  2874. rc);
  2875. return rc;
  2876. }
  2877. smblib_dbg(chg, PR_REGISTER, "POWER_PATH_STATUS = 0x%02x\n",
  2878. stat);
  2879. val->intval = (stat & USE_USBIN_BIT) &&
  2880. (stat & VALID_INPUT_POWER_SOURCE_STS_BIT);
  2881. return rc;
  2882. }
  2883. int smblib_get_usb_online(struct smb_charger *chg,
  2884. union power_supply_propval *val)
  2885. {
  2886. int rc;
  2887. rc = smblib_get_prop_usb_online(chg, val);
  2888. if (!val->intval)
  2889. goto exit;
  2890. if (((chg->typec_mode == QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) ||
  2891. (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB))
  2892. && (chg->real_charger_type == POWER_SUPPLY_TYPE_USB))
  2893. val->intval = 0;
  2894. else
  2895. val->intval = 1;
  2896. if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
  2897. val->intval = 0;
  2898. exit:
  2899. return rc;
  2900. }
  2901. int smblib_get_prop_usb_voltage_max_design(struct smb_charger *chg,
  2902. union power_supply_propval *val)
  2903. {
  2904. switch (chg->real_charger_type) {
  2905. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP:
  2906. if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) {
  2907. val->intval = MICRO_5V;
  2908. break;
  2909. } else if (chg->qc2_unsupported_voltage ==
  2910. QC2_NON_COMPLIANT_12V) {
  2911. val->intval = MICRO_9V;
  2912. break;
  2913. }
  2914. fallthrough;
  2915. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5:
  2916. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3:
  2917. case POWER_SUPPLY_TYPE_USB_PD:
  2918. if (chg->chg_param.smb_version == PMI632)
  2919. val->intval = MICRO_9V;
  2920. else
  2921. val->intval = MICRO_12V;
  2922. break;
  2923. default:
  2924. val->intval = MICRO_5V;
  2925. break;
  2926. }
  2927. return 0;
  2928. }
  2929. int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
  2930. union power_supply_propval *val)
  2931. {
  2932. switch (chg->real_charger_type) {
  2933. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP:
  2934. if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) {
  2935. val->intval = MICRO_5V;
  2936. break;
  2937. } else if (chg->qc2_unsupported_voltage ==
  2938. QC2_NON_COMPLIANT_12V) {
  2939. val->intval = MICRO_9V;
  2940. break;
  2941. }
  2942. fallthrough;
  2943. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5:
  2944. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3:
  2945. if (chg->chg_param.smb_version == PMI632)
  2946. val->intval = MICRO_9V;
  2947. else
  2948. val->intval = MICRO_12V;
  2949. break;
  2950. case POWER_SUPPLY_TYPE_USB_PD:
  2951. val->intval = chg->voltage_max_uv;
  2952. break;
  2953. default:
  2954. val->intval = MICRO_5V;
  2955. break;
  2956. }
  2957. return 0;
  2958. }
  2959. #define HVDCP3_STEP_UV 200000
  2960. #define HVDCP3P5_STEP_UV 20000
  2961. static int smblib_estimate_adaptor_voltage(struct smb_charger *chg,
  2962. union power_supply_propval *val)
  2963. {
  2964. int step_uv = HVDCP3_STEP_UV;
  2965. switch (chg->real_charger_type) {
  2966. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP:
  2967. val->intval = MICRO_12V;
  2968. break;
  2969. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5:
  2970. step_uv = HVDCP3P5_STEP_UV;
  2971. fallthrough;
  2972. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3:
  2973. val->intval = MICRO_5V + (step_uv * chg->pulse_cnt);
  2974. break;
  2975. case POWER_SUPPLY_TYPE_USB_PD:
  2976. /* Take the average of min and max values */
  2977. val->intval = chg->voltage_min_uv +
  2978. ((chg->voltage_max_uv - chg->voltage_min_uv) / 2);
  2979. break;
  2980. default:
  2981. val->intval = MICRO_5V;
  2982. break;
  2983. }
  2984. return 0;
  2985. }
  2986. static int smblib_read_mid_voltage_chan(struct smb_charger *chg,
  2987. union power_supply_propval *val)
  2988. {
  2989. int rc;
  2990. if (!chg->iio.mid_chan)
  2991. return -ENODATA;
  2992. rc = iio_read_channel_processed(chg->iio.mid_chan, &val->intval);
  2993. if (rc < 0) {
  2994. smblib_err(chg, "Couldn't read MID channel rc=%d\n", rc);
  2995. return rc;
  2996. }
  2997. /*
  2998. * If MID voltage < 1V, it is unreliable.
  2999. * Figure out voltage from registers and calculations.
  3000. */
  3001. if (val->intval < 1000000)
  3002. return smblib_estimate_adaptor_voltage(chg, val);
  3003. return 0;
  3004. }
  3005. static int smblib_read_usbin_voltage_chan(struct smb_charger *chg,
  3006. union power_supply_propval *val)
  3007. {
  3008. int rc;
  3009. if (!chg->iio.usbin_v_chan)
  3010. return -ENODATA;
  3011. rc = iio_read_channel_processed(chg->iio.usbin_v_chan, &val->intval);
  3012. if (rc < 0) {
  3013. smblib_err(chg, "Couldn't read USBIN channel rc=%d\n", rc);
  3014. return rc;
  3015. }
  3016. return 0;
  3017. }
  3018. int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
  3019. union power_supply_propval *val)
  3020. {
  3021. union power_supply_propval pval = {0, };
  3022. int rc, ret = 0;
  3023. u8 reg, adc_ch_reg;
  3024. mutex_lock(&chg->adc_lock);
  3025. if (chg->wa_flags & USBIN_ADC_WA) {
  3026. /* Store ADC channel config in order to restore later */
  3027. rc = smblib_read(chg, BATIF_ADC_CHANNEL_EN_REG, &adc_ch_reg);
  3028. if (rc < 0) {
  3029. smblib_err(chg, "Couldn't read ADC config rc=%d\n", rc);
  3030. ret = rc;
  3031. goto unlock;
  3032. }
  3033. /* Disable all ADC channels except IBAT channel */
  3034. rc = smblib_write(chg, BATIF_ADC_CHANNEL_EN_REG,
  3035. IBATT_CHANNEL_EN_BIT);
  3036. if (rc < 0) {
  3037. smblib_err(chg, "Couldn't disable ADC channels rc=%d\n",
  3038. rc);
  3039. ret = rc;
  3040. goto unlock;
  3041. }
  3042. }
  3043. rc = smblib_get_prop_usb_present(chg, &pval);
  3044. if (rc < 0) {
  3045. smblib_err(chg, "Couldn't get usb presence status rc=%d\n", rc);
  3046. ret = -ENODATA;
  3047. goto restore_adc_config;
  3048. }
  3049. /*
  3050. * Skip reading voltage only if USB is not present and we are not in
  3051. * OTG mode.
  3052. */
  3053. if (!pval.intval) {
  3054. rc = smblib_read(chg, DCDC_CMD_OTG_REG, &reg);
  3055. if (rc < 0) {
  3056. smblib_err(chg, "Couldn't read CMD_OTG rc=%d", rc);
  3057. goto restore_adc_config;
  3058. }
  3059. if (!(reg & OTG_EN_BIT))
  3060. goto restore_adc_config;
  3061. }
  3062. /*
  3063. * For PM8150B, use MID_CHG ADC channel because overvoltage is observed
  3064. * to occur randomly in the USBIN channel, particularly at high
  3065. * voltages.
  3066. */
  3067. if (chg->chg_param.smb_version == PM8150B)
  3068. rc = smblib_read_mid_voltage_chan(chg, val);
  3069. else
  3070. rc = smblib_read_usbin_voltage_chan(chg, val);
  3071. if (rc < 0) {
  3072. smblib_err(chg, "Failed to read USBIN over vadc, rc=%d\n", rc);
  3073. ret = rc;
  3074. }
  3075. restore_adc_config:
  3076. /* Restore ADC channel config */
  3077. if (chg->wa_flags & USBIN_ADC_WA) {
  3078. rc = smblib_write(chg, BATIF_ADC_CHANNEL_EN_REG, adc_ch_reg);
  3079. if (rc < 0)
  3080. smblib_err(chg, "Couldn't write ADC config rc=%d\n",
  3081. rc);
  3082. }
  3083. unlock:
  3084. mutex_unlock(&chg->adc_lock);
  3085. return ret;
  3086. }
  3087. int smblib_get_prop_vph_voltage_now(struct smb_charger *chg,
  3088. int *val)
  3089. {
  3090. int rc;
  3091. if (!chg->iio.vph_v_chan)
  3092. return -ENODATA;
  3093. rc = iio_read_channel_processed(chg->iio.vph_v_chan, val);
  3094. if (rc < 0) {
  3095. smblib_err(chg, "Couldn't read vph channel rc=%d\n", rc);
  3096. return rc;
  3097. }
  3098. return 0;
  3099. }
  3100. static bool smblib_rsbux_low(struct smb_charger *chg, int r_thr)
  3101. {
  3102. int r_sbu1, r_sbu2;
  3103. bool ret = false;
  3104. int rc;
  3105. if (!chg->iio.sbux_chan)
  3106. return false;
  3107. /* disable crude sensors */
  3108. rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG,
  3109. EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT,
  3110. 0);
  3111. if (rc < 0) {
  3112. smblib_err(chg, "Couldn't disable crude sensor rc=%d\n", rc);
  3113. return false;
  3114. }
  3115. /* select SBU1 as current source */
  3116. rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU1_ISRC_VAL);
  3117. if (rc < 0) {
  3118. smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc);
  3119. goto cleanup;
  3120. }
  3121. rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu1);
  3122. if (rc < 0) {
  3123. smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc);
  3124. goto cleanup;
  3125. }
  3126. if (r_sbu1 < r_thr) {
  3127. ret = true;
  3128. goto cleanup;
  3129. }
  3130. /* select SBU2 as current source */
  3131. rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU2_ISRC_VAL);
  3132. if (rc < 0) {
  3133. smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc);
  3134. goto cleanup;
  3135. }
  3136. rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu2);
  3137. if (rc < 0) {
  3138. smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc);
  3139. goto cleanup;
  3140. }
  3141. if (r_sbu2 < r_thr)
  3142. ret = true;
  3143. cleanup:
  3144. /* enable crude sensors */
  3145. rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG,
  3146. EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT,
  3147. EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT);
  3148. if (rc < 0)
  3149. smblib_err(chg, "Couldn't enable crude sensor rc=%d\n", rc);
  3150. /* disable current source */
  3151. rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, 0);
  3152. if (rc < 0)
  3153. smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc);
  3154. return ret;
  3155. }
  3156. int smblib_get_prop_charger_temp(struct smb_charger *chg,
  3157. int *val)
  3158. {
  3159. int temp, rc;
  3160. int input_present;
  3161. rc = smblib_is_input_present(chg, &input_present);
  3162. if (rc < 0)
  3163. return rc;
  3164. if (input_present == INPUT_NOT_PRESENT)
  3165. return -ENODATA;
  3166. if (chg->iio.temp_chan) {
  3167. rc = iio_read_channel_processed(chg->iio.temp_chan,
  3168. &temp);
  3169. if (rc < 0) {
  3170. pr_err("Error in reading temp channel, rc=%d\n", rc);
  3171. return rc;
  3172. }
  3173. *val = temp / 100;
  3174. } else {
  3175. return -ENODATA;
  3176. }
  3177. return rc;
  3178. }
  3179. int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
  3180. int *val)
  3181. {
  3182. int rc = 0;
  3183. u8 stat;
  3184. *val = 0;
  3185. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  3186. return 0;
  3187. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  3188. if (rc < 0) {
  3189. smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
  3190. return rc;
  3191. }
  3192. smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_4 = 0x%02x\n", stat);
  3193. if (stat & CC_ATTACHED_BIT)
  3194. *val = (bool)(stat & CC_ORIENTATION_BIT) + 1;
  3195. return rc;
  3196. }
  3197. static const char * const smblib_typec_mode_name[] = {
  3198. [QTI_POWER_SUPPLY_TYPEC_NONE] = "NONE",
  3199. [QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT] = "SOURCE_DEFAULT",
  3200. [QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM] = "SOURCE_MEDIUM",
  3201. [QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH] = "SOURCE_HIGH",
  3202. [QTI_POWER_SUPPLY_TYPEC_NON_COMPLIANT] = "NON_COMPLIANT",
  3203. [QTI_POWER_SUPPLY_TYPEC_SINK] = "SINK",
  3204. [QTI_POWER_SUPPLY_TYPEC_SINK_POWERED_CABLE] = "SINK_POWERED_CABLE",
  3205. [QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY] = "SINK_DEBUG_ACCESSORY",
  3206. [QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER] = "SINK_AUDIO_ADAPTER",
  3207. [QTI_POWER_SUPPLY_TYPEC_POWERED_CABLE_ONLY] = "POWERED_CABLE_ONLY",
  3208. };
  3209. static int smblib_get_prop_ufp_mode(struct smb_charger *chg)
  3210. {
  3211. int rc;
  3212. u8 stat;
  3213. rc = smblib_read(chg, TYPE_C_SNK_STATUS_REG, &stat);
  3214. if (rc < 0) {
  3215. smblib_err(chg, "Couldn't read TYPE_C_STATUS_1 rc=%d\n", rc);
  3216. return QTI_POWER_SUPPLY_TYPEC_NONE;
  3217. }
  3218. smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_1 = 0x%02x\n", stat);
  3219. switch (stat & DETECTED_SRC_TYPE_MASK) {
  3220. case SNK_RP_STD_BIT:
  3221. return QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT;
  3222. case SNK_RP_1P5_BIT:
  3223. return QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM;
  3224. case SNK_RP_3P0_BIT:
  3225. return QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH;
  3226. case SNK_RP_SHORT_BIT:
  3227. return QTI_POWER_SUPPLY_TYPEC_NON_COMPLIANT;
  3228. case SNK_DAM_500MA_BIT:
  3229. case SNK_DAM_1500MA_BIT:
  3230. case SNK_DAM_3000MA_BIT:
  3231. return QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY;
  3232. default:
  3233. break;
  3234. }
  3235. return QTI_POWER_SUPPLY_TYPEC_NONE;
  3236. }
  3237. static int smblib_get_prop_dfp_mode(struct smb_charger *chg)
  3238. {
  3239. int rc;
  3240. u8 stat;
  3241. if (chg->lpd_stage == LPD_STAGE_COMMIT)
  3242. return QTI_POWER_SUPPLY_TYPEC_NONE;
  3243. rc = smblib_read(chg, TYPE_C_SRC_STATUS_REG, &stat);
  3244. if (rc < 0) {
  3245. smblib_err(chg, "Couldn't read TYPE_C_SRC_STATUS_REG rc=%d\n",
  3246. rc);
  3247. return QTI_POWER_SUPPLY_TYPEC_NONE;
  3248. }
  3249. smblib_dbg(chg, PR_REGISTER, "TYPE_C_SRC_STATUS_REG = 0x%02x\n", stat);
  3250. switch (stat & DETECTED_SNK_TYPE_MASK) {
  3251. case AUDIO_ACCESS_RA_RA_BIT:
  3252. return QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER;
  3253. case SRC_DEBUG_ACCESS_BIT:
  3254. return QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY;
  3255. case SRC_RD_RA_VCONN_BIT:
  3256. return QTI_POWER_SUPPLY_TYPEC_SINK_POWERED_CABLE;
  3257. case SRC_RD_OPEN_BIT:
  3258. return QTI_POWER_SUPPLY_TYPEC_SINK;
  3259. default:
  3260. break;
  3261. }
  3262. return QTI_POWER_SUPPLY_TYPEC_NONE;
  3263. }
  3264. static int smblib_get_prop_typec_mode(struct smb_charger *chg)
  3265. {
  3266. int rc;
  3267. u8 stat;
  3268. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  3269. if (rc < 0) {
  3270. smblib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
  3271. rc);
  3272. return 0;
  3273. }
  3274. smblib_dbg(chg, PR_REGISTER, "TYPE_C_MISC_STATUS_REG = 0x%02x\n", stat);
  3275. if (stat & SNK_SRC_MODE_BIT)
  3276. return smblib_get_prop_dfp_mode(chg);
  3277. else
  3278. return smblib_get_prop_ufp_mode(chg);
  3279. }
  3280. inline int smblib_get_usb_prop_typec_mode(struct smb_charger *chg,
  3281. int *val)
  3282. {
  3283. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  3284. *val = QTI_POWER_SUPPLY_TYPEC_NONE;
  3285. else {
  3286. chg->typec_mode = smblib_get_prop_typec_mode(chg);
  3287. *val = chg->typec_mode;
  3288. }
  3289. return 0;
  3290. }
  3291. inline int smblib_get_usb_prop_typec_accessory_mode(struct smb_charger *chg,
  3292. int *val)
  3293. {
  3294. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) {
  3295. *val = TYPEC_ACCESSORY_NONE;
  3296. return 0;
  3297. }
  3298. switch (chg->typec_mode) {
  3299. case QTI_POWER_SUPPLY_TYPEC_NONE:
  3300. *val = TYPEC_ACCESSORY_NONE;
  3301. break;
  3302. case QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER:
  3303. *val = TYPEC_ACCESSORY_AUDIO;
  3304. break;
  3305. case QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY:
  3306. *val = TYPEC_ACCESSORY_DEBUG;
  3307. break;
  3308. default:
  3309. *val = -EINVAL;
  3310. }
  3311. return 0;
  3312. }
  3313. int smblib_get_prop_typec_power_role(struct smb_charger *chg, int *val)
  3314. {
  3315. int rc = 0;
  3316. u8 ctrl;
  3317. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) {
  3318. *val = QTI_POWER_SUPPLY_TYPEC_PR_NONE;
  3319. return 0;
  3320. }
  3321. spin_lock(&chg->typec_pr_lock);
  3322. rc = smblib_read(chg, TYPE_C_MODE_CFG_REG, &ctrl);
  3323. if (rc < 0) {
  3324. smblib_err(chg, "Couldn't read TYPE_C_MODE_CFG_REG rc=%d\n",
  3325. rc);
  3326. goto unlock;
  3327. }
  3328. smblib_dbg(chg, PR_REGISTER, "TYPE_C_MODE_CFG_REG = 0x%02x\n",
  3329. ctrl);
  3330. if (ctrl & TYPEC_DISABLE_CMD_BIT) {
  3331. *val = QTI_POWER_SUPPLY_TYPEC_PR_NONE;
  3332. goto unlock;
  3333. }
  3334. switch (ctrl & (EN_SRC_ONLY_BIT | EN_SNK_ONLY_BIT)) {
  3335. case 0:
  3336. *val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  3337. break;
  3338. case EN_SRC_ONLY_BIT:
  3339. *val = QTI_POWER_SUPPLY_TYPEC_PR_SOURCE;
  3340. break;
  3341. case EN_SNK_ONLY_BIT:
  3342. *val = QTI_POWER_SUPPLY_TYPEC_PR_SINK;
  3343. break;
  3344. default:
  3345. *val = QTI_POWER_SUPPLY_TYPEC_PR_NONE;
  3346. smblib_err(chg, "unsupported power role 0x%02lx\n",
  3347. ctrl & (EN_SRC_ONLY_BIT | EN_SNK_ONLY_BIT));
  3348. rc = -EINVAL;
  3349. goto unlock;
  3350. }
  3351. chg->power_role = *val;
  3352. unlock:
  3353. spin_unlock(&chg->typec_pr_lock);
  3354. return rc;
  3355. }
  3356. static inline bool typec_in_src_mode(struct smb_charger *chg)
  3357. {
  3358. return (chg->typec_mode > QTI_POWER_SUPPLY_TYPEC_NONE &&
  3359. chg->typec_mode < QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT);
  3360. }
  3361. int smblib_get_prop_typec_select_rp(struct smb_charger *chg,
  3362. int *val)
  3363. {
  3364. int rc, rp;
  3365. u8 stat;
  3366. if (!typec_in_src_mode(chg)) {
  3367. *val = -EINVAL;
  3368. return 0;
  3369. }
  3370. rc = smblib_read(chg, TYPE_C_CURRSRC_CFG_REG, &stat);
  3371. if (rc < 0) {
  3372. smblib_err(chg, "Couldn't read TYPE_C_CURRSRC_CFG_REG rc=%d\n",
  3373. rc);
  3374. return rc;
  3375. }
  3376. switch (stat & TYPEC_SRC_RP_SEL_MASK) {
  3377. case TYPEC_SRC_RP_STD:
  3378. rp = QTI_POWER_SUPPLY_TYPEC_SRC_RP_STD;
  3379. break;
  3380. case TYPEC_SRC_RP_1P5A:
  3381. rp = QTI_POWER_SUPPLY_TYPEC_SRC_RP_1P5A;
  3382. break;
  3383. case TYPEC_SRC_RP_3A:
  3384. case TYPEC_SRC_RP_3A_DUPLICATE:
  3385. rp = QTI_POWER_SUPPLY_TYPEC_SRC_RP_3A;
  3386. break;
  3387. default:
  3388. return -EINVAL;
  3389. }
  3390. *val = rp;
  3391. return 0;
  3392. }
  3393. int smblib_get_prop_usb_current_now(struct smb_charger *chg,
  3394. union power_supply_propval *val)
  3395. {
  3396. union power_supply_propval pval = {0, };
  3397. int rc = 0, buck_scale = 1, boost_scale = 1;
  3398. if (chg->iio.usbin_i_chan) {
  3399. rc = iio_read_channel_processed(chg->iio.usbin_i_chan,
  3400. &val->intval);
  3401. if (rc < 0) {
  3402. pr_err("Error in reading USBIN_I channel, rc=%d\n", rc);
  3403. return rc;
  3404. }
  3405. /*
  3406. * For PM8150B, scaling factor = reciprocal of
  3407. * 0.2V/A in Buck mode, 0.4V/A in Boost mode.
  3408. * For PMI632, scaling factor = reciprocal of
  3409. * 0.4V/A in Buck mode, 0.8V/A in Boost mode.
  3410. */
  3411. switch (chg->chg_param.smb_version) {
  3412. case PMI632:
  3413. buck_scale = 40;
  3414. boost_scale = 80;
  3415. break;
  3416. default:
  3417. buck_scale = 20;
  3418. boost_scale = 40;
  3419. break;
  3420. }
  3421. if (chg->otg_present || smblib_get_prop_dfp_mode(chg) !=
  3422. QTI_POWER_SUPPLY_TYPEC_NONE) {
  3423. val->intval = DIV_ROUND_CLOSEST(val->intval * 100,
  3424. boost_scale);
  3425. return rc;
  3426. }
  3427. rc = smblib_get_prop_usb_present(chg, &pval);
  3428. if (rc < 0) {
  3429. smblib_err(chg, "Couldn't get usb present status,rc=%d\n",
  3430. rc);
  3431. return -ENODATA;
  3432. }
  3433. /* If USB is not present, return 0 */
  3434. if (!pval.intval)
  3435. val->intval = 0;
  3436. else
  3437. val->intval = DIV_ROUND_CLOSEST(val->intval * 100,
  3438. buck_scale);
  3439. } else {
  3440. val->intval = 0;
  3441. rc = -ENODATA;
  3442. }
  3443. return rc;
  3444. }
  3445. int smblib_get_prop_low_power(struct smb_charger *chg,
  3446. union power_supply_propval *val)
  3447. {
  3448. int rc;
  3449. u8 stat;
  3450. if (chg->sink_src_mode != SRC_MODE)
  3451. return -ENODATA;
  3452. rc = smblib_read(chg, TYPE_C_SRC_STATUS_REG, &stat);
  3453. if (rc < 0) {
  3454. smblib_err(chg, "Couldn't read TYPE_C_SRC_STATUS_REG rc=%d\n",
  3455. rc);
  3456. return rc;
  3457. }
  3458. val->intval = !(stat & SRC_HIGH_BATT_BIT);
  3459. return 0;
  3460. }
  3461. int smblib_get_prop_input_current_settled(struct smb_charger *chg,
  3462. union power_supply_propval *val)
  3463. {
  3464. return smblib_get_charge_param(chg, &chg->param.icl_stat, &val->intval);
  3465. }
  3466. int smblib_get_prop_input_current_max(struct smb_charger *chg,
  3467. union power_supply_propval *val)
  3468. {
  3469. int icl_ua = 0, rc;
  3470. rc = smblib_get_charge_param(chg, &chg->param.usb_icl, &icl_ua);
  3471. if (rc < 0)
  3472. return rc;
  3473. if (is_override_vote_enabled_locked(chg->usb_icl_votable) &&
  3474. icl_ua < USBIN_1000MA) {
  3475. val->intval = USBIN_1000MA;
  3476. return 0;
  3477. }
  3478. return smblib_get_charge_param(chg, &chg->param.icl_stat, &val->intval);
  3479. }
  3480. int smblib_get_prop_input_voltage_settled(struct smb_charger *chg,
  3481. int *val)
  3482. {
  3483. int rc, pulses;
  3484. int step_uv = HVDCP3_STEP_UV;
  3485. switch (chg->real_charger_type) {
  3486. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5:
  3487. step_uv = HVDCP3P5_STEP_UV;
  3488. fallthrough;
  3489. case QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3:
  3490. rc = smblib_get_pulse_cnt(chg, &pulses);
  3491. if (rc < 0) {
  3492. smblib_err(chg,
  3493. "Couldn't read QC_PULSE_COUNT rc=%d\n", rc);
  3494. return 0;
  3495. }
  3496. *val = MICRO_5V + step_uv * pulses;
  3497. break;
  3498. case POWER_SUPPLY_TYPE_USB_PD:
  3499. *val = chg->voltage_min_uv;
  3500. break;
  3501. default:
  3502. *val = MICRO_5V;
  3503. break;
  3504. }
  3505. return 0;
  3506. }
  3507. int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
  3508. int *val)
  3509. {
  3510. *val = chg->pd_hard_reset;
  3511. return 0;
  3512. }
  3513. int smblib_get_pe_start(struct smb_charger *chg,
  3514. int *val)
  3515. {
  3516. *val = chg->ok_to_pd;
  3517. return 0;
  3518. }
  3519. int smblib_get_prop_smb_health(struct smb_charger *chg)
  3520. {
  3521. int rc, val;
  3522. int input_present;
  3523. rc = smblib_is_input_present(chg, &input_present);
  3524. if (rc < 0)
  3525. return rc;
  3526. if ((input_present == INPUT_NOT_PRESENT) || (!is_cp_available(chg)))
  3527. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3528. rc = smblib_read_iio_prop(chg, CP, CP_DIE_TEMP, &val);
  3529. if (rc < 0) {
  3530. smblib_err(chg, "Couldn't get CP DIE_TEMP rc=%d\n", rc);
  3531. return rc;
  3532. }
  3533. if (val > SMB_TEMP_RST_THRESH)
  3534. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3535. if (val > SMB_TEMP_REG_H_THRESH)
  3536. return POWER_SUPPLY_HEALTH_HOT;
  3537. if (val > SMB_TEMP_REG_L_THRESH)
  3538. return POWER_SUPPLY_HEALTH_WARM;
  3539. return POWER_SUPPLY_HEALTH_COOL;
  3540. }
  3541. static int smblib_get_prop_die_health(struct smb_charger *chg)
  3542. {
  3543. int rc;
  3544. u8 stat;
  3545. int input_present;
  3546. rc = smblib_is_input_present(chg, &input_present);
  3547. if (rc < 0)
  3548. return rc;
  3549. if (input_present == INPUT_NOT_PRESENT)
  3550. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3551. if (chg->wa_flags & SW_THERM_REGULATION_WA) {
  3552. if (chg->die_temp == -ENODATA)
  3553. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3554. if (chg->die_temp > DIE_TEMP_RST_THRESH)
  3555. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3556. if (chg->die_temp > DIE_TEMP_REG_H_THRESH)
  3557. return POWER_SUPPLY_HEALTH_HOT;
  3558. if (chg->die_temp > DIE_TEMP_REG_L_THRESH)
  3559. return POWER_SUPPLY_HEALTH_WARM;
  3560. return POWER_SUPPLY_HEALTH_COOL;
  3561. }
  3562. rc = smblib_read(chg, DIE_TEMP_STATUS_REG, &stat);
  3563. if (rc < 0) {
  3564. smblib_err(chg, "Couldn't read DIE_TEMP_STATUS_REG, rc=%d\n",
  3565. rc);
  3566. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3567. }
  3568. if (stat & DIE_TEMP_RST_BIT)
  3569. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3570. if (stat & DIE_TEMP_UB_BIT)
  3571. return POWER_SUPPLY_HEALTH_HOT;
  3572. if (stat & DIE_TEMP_LB_BIT)
  3573. return POWER_SUPPLY_HEALTH_WARM;
  3574. return POWER_SUPPLY_HEALTH_COOL;
  3575. }
  3576. int smblib_get_die_health(struct smb_charger *chg,
  3577. int *val)
  3578. {
  3579. if (chg->die_health == -EINVAL)
  3580. *val = smblib_get_prop_die_health(chg);
  3581. else
  3582. *val = chg->die_health;
  3583. return 0;
  3584. }
  3585. int smblib_get_prop_scope(struct smb_charger *chg,
  3586. union power_supply_propval *val)
  3587. {
  3588. int rc;
  3589. union power_supply_propval pval;
  3590. val->intval = POWER_SUPPLY_SCOPE_UNKNOWN;
  3591. rc = smblib_get_prop_usb_present(chg, &pval);
  3592. if (rc < 0)
  3593. return rc;
  3594. val->intval = pval.intval ? POWER_SUPPLY_SCOPE_DEVICE
  3595. : chg->otg_present ? POWER_SUPPLY_SCOPE_SYSTEM
  3596. : POWER_SUPPLY_SCOPE_UNKNOWN;
  3597. return 0;
  3598. }
  3599. static int smblib_get_typec_connector_temp_status(struct smb_charger *chg)
  3600. {
  3601. int rc;
  3602. u8 stat;
  3603. if (chg->connector_health != -EINVAL)
  3604. return chg->connector_health;
  3605. if (chg->wa_flags & SW_THERM_REGULATION_WA) {
  3606. if (chg->connector_temp == -ENODATA)
  3607. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3608. if (chg->connector_temp > CONNECTOR_TEMP_RST_THRESH)
  3609. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3610. if (chg->connector_temp > CONNECTOR_TEMP_REG_H_THRESH)
  3611. return POWER_SUPPLY_HEALTH_HOT;
  3612. if (chg->connector_temp > CONNECTOR_TEMP_REG_L_THRESH)
  3613. return POWER_SUPPLY_HEALTH_WARM;
  3614. return POWER_SUPPLY_HEALTH_COOL;
  3615. }
  3616. rc = smblib_read(chg, CONNECTOR_TEMP_STATUS_REG, &stat);
  3617. if (rc < 0) {
  3618. smblib_err(chg, "Couldn't read CONNECTOR_TEMP_STATUS_REG, rc=%d\n",
  3619. rc);
  3620. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3621. }
  3622. if (stat & CONNECTOR_TEMP_RST_BIT)
  3623. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3624. if (stat & CONNECTOR_TEMP_UB_BIT)
  3625. return POWER_SUPPLY_HEALTH_HOT;
  3626. if (stat & CONNECTOR_TEMP_LB_BIT)
  3627. return POWER_SUPPLY_HEALTH_WARM;
  3628. return POWER_SUPPLY_HEALTH_COOL;
  3629. }
  3630. int smblib_get_skin_temp_status(struct smb_charger *chg)
  3631. {
  3632. int rc;
  3633. u8 stat;
  3634. if (!chg->en_skin_therm_mitigation)
  3635. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3636. rc = smblib_read(chg, SKIN_TEMP_STATUS_REG, &stat);
  3637. if (rc < 0) {
  3638. smblib_err(chg, "Couldn't read SKIN_TEMP_STATUS_REG, rc=%d\n",
  3639. rc);
  3640. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3641. }
  3642. if (stat & SKIN_TEMP_RST_BIT)
  3643. return POWER_SUPPLY_HEALTH_OVERHEAT;
  3644. if (stat & SKIN_TEMP_UB_BIT)
  3645. return POWER_SUPPLY_HEALTH_HOT;
  3646. if (stat & SKIN_TEMP_LB_BIT)
  3647. return POWER_SUPPLY_HEALTH_WARM;
  3648. return POWER_SUPPLY_HEALTH_COOL;
  3649. }
  3650. int smblib_get_prop_connector_health(struct smb_charger *chg)
  3651. {
  3652. bool dc_present, usb_present;
  3653. int input_present;
  3654. int rc;
  3655. rc = smblib_is_input_present(chg, &input_present);
  3656. if (rc < 0)
  3657. return POWER_SUPPLY_HEALTH_UNKNOWN;
  3658. dc_present = input_present & INPUT_PRESENT_DC;
  3659. usb_present = input_present & INPUT_PRESENT_USB;
  3660. if (usb_present)
  3661. return smblib_get_typec_connector_temp_status(chg);
  3662. /*
  3663. * In PM8150B, SKIN channel measures Wireless charger receiver
  3664. * temp, used to regulate DC ICL.
  3665. */
  3666. if (chg->chg_param.smb_version == PM8150B && dc_present)
  3667. return smblib_get_skin_temp_status(chg);
  3668. return POWER_SUPPLY_HEALTH_COOL;
  3669. }
  3670. static int get_rp_based_dcp_current(struct smb_charger *chg, int typec_mode)
  3671. {
  3672. int rp_ua;
  3673. switch (typec_mode) {
  3674. case QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH:
  3675. rp_ua = TYPEC_HIGH_CURRENT_UA;
  3676. break;
  3677. case QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
  3678. fallthrough;
  3679. case QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT:
  3680. fallthrough;
  3681. default:
  3682. rp_ua = DCP_CURRENT_UA;
  3683. }
  3684. return rp_ua;
  3685. }
  3686. /*******************
  3687. * USB PSY SETTERS *
  3688. * *****************/
  3689. int smblib_set_prop_pd_current_max(struct smb_charger *chg,
  3690. int val)
  3691. {
  3692. int rc, icl;
  3693. if (chg->pd_active) {
  3694. icl = get_client_vote(chg->usb_icl_votable, PD_VOTER);
  3695. rc = vote(chg->usb_icl_votable, PD_VOTER, true, val);
  3696. if (val != icl)
  3697. power_supply_changed(chg->usb_psy);
  3698. } else {
  3699. rc = -EPERM;
  3700. }
  3701. return rc;
  3702. }
  3703. static int smblib_handle_usb_current(struct smb_charger *chg,
  3704. int usb_current)
  3705. {
  3706. int rc = 0, rp_ua, typec_mode;
  3707. union power_supply_propval val = {0, };
  3708. if (chg->real_charger_type == QTI_POWER_SUPPLY_TYPE_USB_FLOAT) {
  3709. if (usb_current == -ETIMEDOUT) {
  3710. if ((chg->float_cfg & FLOAT_OPTIONS_MASK)
  3711. == FORCE_FLOAT_SDP_CFG_BIT) {
  3712. /*
  3713. * Confiugure USB500 mode if Float charger is
  3714. * configured for SDP mode.
  3715. */
  3716. rc = vote(chg->usb_icl_votable,
  3717. SW_ICL_MAX_VOTER, true, USBIN_500MA);
  3718. if (rc < 0)
  3719. smblib_err(chg,
  3720. "Couldn't set SDP ICL rc=%d\n",
  3721. rc);
  3722. return rc;
  3723. }
  3724. if (chg->connector_type ==
  3725. QTI_POWER_SUPPLY_CONNECTOR_TYPEC) {
  3726. /*
  3727. * Valid FLOAT charger, report the current
  3728. * based of Rp.
  3729. */
  3730. typec_mode = smblib_get_prop_typec_mode(chg);
  3731. rp_ua = get_rp_based_dcp_current(chg,
  3732. typec_mode);
  3733. rc = vote(chg->usb_icl_votable,
  3734. SW_ICL_MAX_VOTER, true, rp_ua);
  3735. if (rc < 0)
  3736. return rc;
  3737. } else {
  3738. rc = vote(chg->usb_icl_votable,
  3739. SW_ICL_MAX_VOTER, true, DCP_CURRENT_UA);
  3740. if (rc < 0)
  3741. return rc;
  3742. }
  3743. } else {
  3744. /*
  3745. * FLOAT charger detected as SDP by USB driver,
  3746. * charge with the requested current and update the
  3747. * real_charger_type
  3748. */
  3749. chg->real_charger_type = POWER_SUPPLY_TYPE_USB;
  3750. rc = vote(chg->usb_icl_votable, USB_PSY_VOTER,
  3751. true, usb_current);
  3752. if (rc < 0)
  3753. return rc;
  3754. rc = vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER,
  3755. false, 0);
  3756. if (rc < 0)
  3757. return rc;
  3758. }
  3759. } else {
  3760. rc = smblib_get_prop_usb_present(chg, &val);
  3761. if (!rc && !val.intval)
  3762. return 0;
  3763. /* if flash is active force 500mA */
  3764. if ((usb_current < SDP_CURRENT_UA) && is_flash_active(chg))
  3765. usb_current = SDP_CURRENT_UA;
  3766. rc = vote(chg->usb_icl_votable, USB_PSY_VOTER, true,
  3767. usb_current);
  3768. if (rc < 0) {
  3769. pr_err("Couldn't vote ICL USB_PSY_VOTER rc=%d\n", rc);
  3770. return rc;
  3771. }
  3772. rc = vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, false, 0);
  3773. if (rc < 0) {
  3774. pr_err("Couldn't remove SW_ICL_MAX vote rc=%d\n", rc);
  3775. return rc;
  3776. }
  3777. }
  3778. return 0;
  3779. }
  3780. int smblib_set_prop_sdp_current_max(struct smb_charger *chg,
  3781. int val)
  3782. {
  3783. union power_supply_propval pval;
  3784. int rc = 0;
  3785. if (!chg->pd_active) {
  3786. rc = smblib_get_prop_usb_present(chg, &pval);
  3787. if (rc < 0) {
  3788. smblib_err(chg, "Couldn't get usb present rc = %d\n",
  3789. rc);
  3790. return rc;
  3791. }
  3792. /* handle the request only when USB is present */
  3793. if (pval.intval)
  3794. rc = smblib_handle_usb_current(chg, val);
  3795. } else if (chg->system_suspend_supported) {
  3796. if (val <= USBIN_25MA)
  3797. rc = vote(chg->usb_icl_votable,
  3798. PD_SUSPEND_SUPPORTED_VOTER, true, val);
  3799. else
  3800. rc = vote(chg->usb_icl_votable,
  3801. PD_SUSPEND_SUPPORTED_VOTER, false, 0);
  3802. }
  3803. return rc;
  3804. }
  3805. int smblib_set_prop_usb_voltage_max_limit(struct smb_charger *chg,
  3806. int val)
  3807. {
  3808. union power_supply_propval pval = {0, };
  3809. /* Exit if same value is re-configured */
  3810. if (val == chg->usbin_forced_max_uv)
  3811. return 0;
  3812. smblib_get_prop_usb_voltage_max_design(chg, &pval);
  3813. if (val >= MICRO_5V && val <= pval.intval) {
  3814. chg->usbin_forced_max_uv = val;
  3815. smblib_dbg(chg, PR_MISC, "Max VBUS limit changed to: %d\n",
  3816. val);
  3817. } else if (chg->usbin_forced_max_uv) {
  3818. chg->usbin_forced_max_uv = 0;
  3819. } else {
  3820. return 0;
  3821. }
  3822. power_supply_changed(chg->usb_psy);
  3823. return 0;
  3824. }
  3825. static void smblib_typec_irq_config(struct smb_charger *chg, bool en)
  3826. {
  3827. if (en == chg->typec_irq_en)
  3828. return;
  3829. if (en) {
  3830. enable_irq(
  3831. chg->irq_info[TYPEC_ATTACH_DETACH_IRQ].irq);
  3832. enable_irq(
  3833. chg->irq_info[TYPEC_CC_STATE_CHANGE_IRQ].irq);
  3834. enable_irq(
  3835. chg->irq_info[TYPEC_OR_RID_DETECTION_CHANGE_IRQ].irq);
  3836. } else {
  3837. disable_irq_nosync(
  3838. chg->irq_info[TYPEC_ATTACH_DETACH_IRQ].irq);
  3839. disable_irq_nosync(
  3840. chg->irq_info[TYPEC_CC_STATE_CHANGE_IRQ].irq);
  3841. disable_irq_nosync(
  3842. chg->irq_info[TYPEC_OR_RID_DETECTION_CHANGE_IRQ].irq);
  3843. }
  3844. chg->typec_irq_en = en;
  3845. }
  3846. #define PR_LOCK_TIMEOUT_MS 1000
  3847. int smblib_set_prop_typec_power_role(struct smb_charger *chg, int val)
  3848. {
  3849. int rc = 0;
  3850. u8 power_role;
  3851. enum power_supply_typec_mode typec_mode;
  3852. bool snk_attached = false, src_attached = false, is_pr_lock = false;
  3853. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  3854. return 0;
  3855. spin_lock(&chg->typec_pr_lock);
  3856. smblib_dbg(chg, PR_MISC, "power role change: %d --> %d!",
  3857. chg->power_role, val);
  3858. /* Force the power-role if the initial value is NONE, for the legacy cable detection WA. */
  3859. if (chg->power_role == val && chg->power_role != QTI_POWER_SUPPLY_TYPEC_PR_NONE) {
  3860. smblib_dbg(chg, PR_MISC, "power role already in %d, ignore!",
  3861. chg->power_role);
  3862. goto unlock;
  3863. }
  3864. typec_mode = smblib_get_prop_typec_mode(chg);
  3865. if (typec_mode >= QTI_POWER_SUPPLY_TYPEC_SINK &&
  3866. typec_mode <= QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER)
  3867. snk_attached = true;
  3868. else if (typec_mode >= QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT &&
  3869. typec_mode <= QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH)
  3870. src_attached = true;
  3871. /*
  3872. * If current power role is in DRP, and type-c is already in the
  3873. * mode (source or sink) that's being requested, it means this is
  3874. * a power role locking request from USBPD driver. Disable type-c
  3875. * related interrupts for locking power role to avoid the redundant
  3876. * notifications.
  3877. */
  3878. if ((chg->power_role == QTI_POWER_SUPPLY_TYPEC_PR_DUAL) &&
  3879. ((src_attached && val == QTI_POWER_SUPPLY_TYPEC_PR_SINK) ||
  3880. (snk_attached && val == QTI_POWER_SUPPLY_TYPEC_PR_SOURCE)))
  3881. is_pr_lock = true;
  3882. smblib_dbg(chg, PR_MISC, "snk_attached = %d, src_attached = %d, is_pr_lock = %d\n",
  3883. snk_attached, src_attached, is_pr_lock);
  3884. cancel_delayed_work(&chg->pr_lock_clear_work);
  3885. if (!chg->pr_lock_in_progress && is_pr_lock) {
  3886. smblib_dbg(chg, PR_MISC, "disable type-c interrupts for power role locking\n");
  3887. smblib_typec_irq_config(chg, false);
  3888. schedule_delayed_work(&chg->pr_lock_clear_work,
  3889. msecs_to_jiffies(PR_LOCK_TIMEOUT_MS));
  3890. } else if (chg->pr_lock_in_progress && !is_pr_lock) {
  3891. smblib_dbg(chg, PR_MISC, "restore type-c interrupts after exit power role locking\n");
  3892. smblib_typec_irq_config(chg, true);
  3893. }
  3894. chg->pr_lock_in_progress = is_pr_lock;
  3895. switch (val) {
  3896. case QTI_POWER_SUPPLY_TYPEC_PR_NONE:
  3897. power_role = TYPEC_DISABLE_CMD_BIT;
  3898. break;
  3899. case QTI_POWER_SUPPLY_TYPEC_PR_DUAL:
  3900. power_role = chg->typec_try_mode;
  3901. break;
  3902. case QTI_POWER_SUPPLY_TYPEC_PR_SINK:
  3903. power_role = EN_SNK_ONLY_BIT;
  3904. break;
  3905. case QTI_POWER_SUPPLY_TYPEC_PR_SOURCE:
  3906. power_role = EN_SRC_ONLY_BIT;
  3907. break;
  3908. default:
  3909. smblib_err(chg, "power role %d not supported\n", val);
  3910. rc = -EINVAL;
  3911. goto unlock;
  3912. }
  3913. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  3914. TYPEC_POWER_ROLE_CMD_MASK | TYPEC_TRY_MODE_MASK,
  3915. power_role);
  3916. if (rc < 0) {
  3917. smblib_err(chg, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
  3918. power_role, rc);
  3919. goto unlock;
  3920. }
  3921. chg->power_role = val;
  3922. unlock:
  3923. spin_unlock(&chg->typec_pr_lock);
  3924. return rc;
  3925. }
  3926. int smblib_set_prop_typec_select_rp(struct smb_charger *chg,
  3927. int val)
  3928. {
  3929. int rc;
  3930. if (!typec_in_src_mode(chg)) {
  3931. smblib_err(chg, "Couldn't set curr src: not in SRC mode\n");
  3932. return -EINVAL;
  3933. }
  3934. if (val < TYPEC_SRC_RP_MAX_ELEMENTS) {
  3935. rc = smblib_masked_write(chg, TYPE_C_CURRSRC_CFG_REG,
  3936. TYPEC_SRC_RP_SEL_MASK,
  3937. val);
  3938. if (rc < 0)
  3939. smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n",
  3940. rc);
  3941. return rc;
  3942. }
  3943. return -EINVAL;
  3944. }
  3945. int smblib_set_prop_pd_voltage_min(struct smb_charger *chg,
  3946. int val)
  3947. {
  3948. int rc, min_uv;
  3949. min_uv = min(val, chg->voltage_max_uv);
  3950. if (chg->voltage_min_uv == min_uv)
  3951. return 0;
  3952. rc = smblib_set_usb_pd_allowed_voltage(chg, min_uv,
  3953. chg->voltage_max_uv);
  3954. if (rc < 0) {
  3955. smblib_err(chg, "invalid min voltage %duV rc=%d\n",
  3956. val, rc);
  3957. return rc;
  3958. }
  3959. chg->voltage_min_uv = min_uv;
  3960. power_supply_changed(chg->batt_psy);
  3961. return rc;
  3962. }
  3963. int smblib_set_prop_pd_voltage_max(struct smb_charger *chg,
  3964. int val)
  3965. {
  3966. int rc, max_uv;
  3967. max_uv = max(val, chg->voltage_min_uv);
  3968. if (chg->voltage_max_uv == max_uv)
  3969. return 0;
  3970. rc = smblib_set_usb_pd_fsw(chg, max_uv);
  3971. if (rc < 0) {
  3972. smblib_err(chg, "Couldn't set FSW for voltage %duV rc=%d\n",
  3973. val, rc);
  3974. return rc;
  3975. }
  3976. rc = smblib_set_usb_pd_allowed_voltage(chg, chg->voltage_min_uv,
  3977. max_uv);
  3978. if (rc < 0) {
  3979. smblib_err(chg, "invalid max voltage %duV rc=%d\n",
  3980. val, rc);
  3981. return rc;
  3982. }
  3983. chg->voltage_max_uv = max_uv;
  3984. power_supply_changed(chg->batt_psy);
  3985. return rc;
  3986. }
  3987. int smblib_set_prop_pd_active(struct smb_charger *chg,
  3988. int val)
  3989. {
  3990. const struct apsd_result *apsd = smblib_get_apsd_result(chg);
  3991. int rc = 0;
  3992. int sec_charger, typec_mode;
  3993. /*
  3994. * Ignore repetitive notification while PD is active, which
  3995. * is caused by hard reset.
  3996. */
  3997. if (chg->pd_active && chg->pd_active == val)
  3998. return 0;
  3999. chg->pd_active = val;
  4000. smblib_apsd_enable(chg, !chg->pd_active);
  4001. update_sw_icl_max(chg, apsd->val);
  4002. if (chg->pd_active) {
  4003. vote(chg->limited_irq_disable_votable, CHARGER_TYPE_VOTER,
  4004. false, 0);
  4005. vote(chg->hdc_irq_disable_votable, CHARGER_TYPE_VOTER,
  4006. false, 0);
  4007. /*
  4008. * Enforce 100mA for PD until the real vote comes in later.
  4009. * It is guaranteed that pd_active is set prior to
  4010. * pd_current_max
  4011. */
  4012. vote(chg->usb_icl_votable, PD_VOTER, true, USBIN_100MA);
  4013. vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
  4014. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, false, 0);
  4015. /*
  4016. * For PPS, Charge Pump is preferred over parallel charger if
  4017. * present.
  4018. */
  4019. if (chg->pd_active == QTI_POWER_SUPPLY_PD_PPS_ACTIVE
  4020. && chg->sec_cp_present) {
  4021. rc = smblib_select_sec_charger(chg,
  4022. QTI_POWER_SUPPLY_CHARGER_SEC_CP,
  4023. QTI_POWER_SUPPLY_CP_PPS, false);
  4024. if (rc < 0)
  4025. dev_err(chg->dev, "Couldn't enable secondary charger rc=%d\n",
  4026. rc);
  4027. }
  4028. } else {
  4029. vote(chg->usb_icl_votable, PD_VOTER, false, 0);
  4030. vote(chg->limited_irq_disable_votable, CHARGER_TYPE_VOTER,
  4031. true, 0);
  4032. vote(chg->hdc_irq_disable_votable, CHARGER_TYPE_VOTER,
  4033. true, 0);
  4034. sec_charger = chg->sec_pl_present ?
  4035. QTI_POWER_SUPPLY_CHARGER_SEC_PL :
  4036. QTI_POWER_SUPPLY_CHARGER_SEC_NONE;
  4037. rc = smblib_select_sec_charger(chg, sec_charger,
  4038. QTI_POWER_SUPPLY_CP_NONE, false);
  4039. if (rc < 0)
  4040. dev_err(chg->dev,
  4041. "Couldn't enable secondary charger rc=%d\n",
  4042. rc);
  4043. /* PD hard resets failed, proceed to detect QC2/3 */
  4044. if (chg->ok_to_pd) {
  4045. chg->ok_to_pd = false;
  4046. smblib_hvdcp_detect_try_enable(chg, true);
  4047. }
  4048. }
  4049. smblib_usb_pd_adapter_allowance_override(chg,
  4050. !!chg->pd_active ? FORCE_5V : FORCE_NULL);
  4051. smblib_update_usb_type(chg);
  4052. if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB &&
  4053. !chg->ok_to_pd) {
  4054. typec_mode = smblib_get_prop_typec_mode(chg);
  4055. if (typec_rp_med_high(chg, typec_mode))
  4056. vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
  4057. }
  4058. power_supply_changed(chg->usb_psy);
  4059. return rc;
  4060. }
  4061. int smblib_set_prop_ship_mode(struct smb_charger *chg,
  4062. int val)
  4063. {
  4064. int rc;
  4065. smblib_dbg(chg, PR_MISC, "Set ship mode: %d!!\n", !!val);
  4066. rc = smblib_masked_write(chg, SHIP_MODE_REG, SHIP_MODE_EN_BIT,
  4067. !!val ? SHIP_MODE_EN_BIT : 0);
  4068. if (rc < 0)
  4069. dev_err(chg->dev, "Couldn't %s ship mode, rc=%d\n",
  4070. !!val ? "enable" : "disable", rc);
  4071. return rc;
  4072. }
  4073. int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
  4074. int val)
  4075. {
  4076. int rc = 0;
  4077. if (chg->pd_hard_reset == val)
  4078. return rc;
  4079. chg->pd_hard_reset = val;
  4080. rc = smblib_masked_write(chg, TYPE_C_EXIT_STATE_CFG_REG,
  4081. EXIT_SNK_BASED_ON_CC_BIT,
  4082. (chg->pd_hard_reset) ? EXIT_SNK_BASED_ON_CC_BIT : 0);
  4083. if (rc < 0)
  4084. smblib_err(chg, "Couldn't set EXIT_SNK_BASED_ON_CC rc=%d\n",
  4085. rc);
  4086. return rc;
  4087. }
  4088. #define JEITA_SOFT 0
  4089. #define JEITA_HARD 1
  4090. static int smblib_update_jeita(struct smb_charger *chg, u32 *thresholds,
  4091. int type)
  4092. {
  4093. int rc;
  4094. u16 temp, base;
  4095. base = CHGR_JEITA_THRESHOLD_BASE_REG(type);
  4096. temp = thresholds[1] & 0xFFFF;
  4097. temp = ((temp & 0xFF00) >> 8) | ((temp & 0xFF) << 8);
  4098. rc = smblib_batch_write(chg, base, (u8 *)&temp, 2);
  4099. if (rc < 0) {
  4100. smblib_err(chg,
  4101. "Couldn't configure Jeita %s hot threshold rc=%d\n",
  4102. (type == JEITA_SOFT) ? "Soft" : "Hard", rc);
  4103. return rc;
  4104. }
  4105. temp = thresholds[0] & 0xFFFF;
  4106. temp = ((temp & 0xFF00) >> 8) | ((temp & 0xFF) << 8);
  4107. rc = smblib_batch_write(chg, base + 2, (u8 *)&temp, 2);
  4108. if (rc < 0) {
  4109. smblib_err(chg,
  4110. "Couldn't configure Jeita %s cold threshold rc=%d\n",
  4111. (type == JEITA_SOFT) ? "Soft" : "Hard", rc);
  4112. return rc;
  4113. }
  4114. smblib_dbg(chg, PR_MISC, "%s Jeita threshold configured\n",
  4115. (type == JEITA_SOFT) ? "Soft" : "Hard");
  4116. return 0;
  4117. }
  4118. static int smblib_charge_inhibit_en(struct smb_charger *chg, bool enable)
  4119. {
  4120. int rc;
  4121. rc = smblib_masked_write(chg, CHGR_CFG2_REG,
  4122. CHARGER_INHIBIT_BIT,
  4123. enable ? CHARGER_INHIBIT_BIT : 0);
  4124. return rc;
  4125. }
  4126. static int smblib_soft_jeita_arb_wa(struct smb_charger *chg)
  4127. {
  4128. union power_supply_propval pval;
  4129. int rc = 0;
  4130. bool soft_jeita;
  4131. rc = smblib_get_prop_batt_health(chg, &pval);
  4132. if (rc < 0) {
  4133. smblib_err(chg, "Couldn't get battery health rc=%d\n", rc);
  4134. return rc;
  4135. }
  4136. /* Do nothing on entering hard JEITA condition */
  4137. if (pval.intval == POWER_SUPPLY_HEALTH_COLD ||
  4138. pval.intval == POWER_SUPPLY_HEALTH_HOT)
  4139. return 0;
  4140. if (chg->jeita_soft_fcc[0] < 0 || chg->jeita_soft_fcc[1] < 0 ||
  4141. chg->jeita_soft_fv[0] < 0 || chg->jeita_soft_fv[1] < 0)
  4142. return 0;
  4143. soft_jeita = (pval.intval == POWER_SUPPLY_HEALTH_COOL) ||
  4144. (pval.intval == POWER_SUPPLY_HEALTH_WARM);
  4145. /* Do nothing on entering soft JEITA from hard JEITA */
  4146. if (chg->jeita_arb_flag && soft_jeita)
  4147. return 0;
  4148. /* Do nothing, initial to health condition */
  4149. if (!chg->jeita_arb_flag && !soft_jeita)
  4150. return 0;
  4151. /* Entering soft JEITA from normal state */
  4152. if (!chg->jeita_arb_flag && soft_jeita) {
  4153. vote(chg->chg_disable_votable, JEITA_ARB_VOTER, true, 0);
  4154. rc = smblib_charge_inhibit_en(chg, true);
  4155. if (rc < 0)
  4156. smblib_err(chg, "Couldn't enable charge inhibit rc=%d\n",
  4157. rc);
  4158. rc = smblib_update_jeita(chg, chg->jeita_soft_hys_thlds,
  4159. JEITA_SOFT);
  4160. if (rc < 0)
  4161. smblib_err(chg,
  4162. "Couldn't configure Jeita soft threshold rc=%d\n",
  4163. rc);
  4164. if (pval.intval == POWER_SUPPLY_HEALTH_COOL) {
  4165. vote(chg->fcc_votable, JEITA_ARB_VOTER, true,
  4166. chg->jeita_soft_fcc[0]);
  4167. vote(chg->fv_votable, JEITA_ARB_VOTER, true,
  4168. chg->jeita_soft_fv[0]);
  4169. } else {
  4170. vote(chg->fcc_votable, JEITA_ARB_VOTER, true,
  4171. chg->jeita_soft_fcc[1]);
  4172. vote(chg->fv_votable, JEITA_ARB_VOTER, true,
  4173. chg->jeita_soft_fv[1]);
  4174. }
  4175. vote(chg->chg_disable_votable, JEITA_ARB_VOTER, false, 0);
  4176. chg->jeita_arb_flag = true;
  4177. } else if (chg->jeita_arb_flag && !soft_jeita) {
  4178. /* Exit to health state from soft JEITA */
  4179. vote(chg->chg_disable_votable, JEITA_ARB_VOTER, true, 0);
  4180. rc = smblib_charge_inhibit_en(chg, false);
  4181. if (rc < 0)
  4182. smblib_err(chg, "Couldn't disable charge inhibit rc=%d\n",
  4183. rc);
  4184. rc = smblib_update_jeita(chg, chg->jeita_soft_thlds,
  4185. JEITA_SOFT);
  4186. if (rc < 0)
  4187. smblib_err(chg, "Couldn't configure Jeita soft threshold rc=%d\n",
  4188. rc);
  4189. vote(chg->fcc_votable, JEITA_ARB_VOTER, false, 0);
  4190. vote(chg->fv_votable, JEITA_ARB_VOTER, false, 0);
  4191. vote(chg->chg_disable_votable, JEITA_ARB_VOTER, false, 0);
  4192. chg->jeita_arb_flag = false;
  4193. }
  4194. smblib_dbg(chg, PR_MISC, "JEITA ARB status %d, soft JEITA status %d\n",
  4195. chg->jeita_arb_flag, soft_jeita);
  4196. return rc;
  4197. }
  4198. /************************
  4199. * USB MAIN PSY GETTERS *
  4200. ************************/
  4201. int smblib_get_prop_fcc_delta(struct smb_charger *chg,
  4202. int *val)
  4203. {
  4204. int rc, jeita_cc_delta_ua = 0;
  4205. if (chg->sw_jeita_enabled) {
  4206. *val = 0;
  4207. return 0;
  4208. }
  4209. rc = smblib_get_jeita_cc_delta(chg, &jeita_cc_delta_ua);
  4210. if (rc < 0) {
  4211. smblib_err(chg, "Couldn't get jeita cc delta rc=%d\n", rc);
  4212. jeita_cc_delta_ua = 0;
  4213. }
  4214. *val = jeita_cc_delta_ua;
  4215. return 0;
  4216. }
  4217. /************************
  4218. * USB MAIN PSY SETTERS *
  4219. ************************/
  4220. int smblib_get_charge_current(struct smb_charger *chg,
  4221. int *total_current_ua)
  4222. {
  4223. const struct apsd_result *apsd_result = smblib_get_apsd_result(chg);
  4224. union power_supply_propval val = {0, };
  4225. int rc = 0, typec_source_rd, current_ua;
  4226. bool non_compliant;
  4227. u8 stat;
  4228. if (chg->pd_active) {
  4229. *total_current_ua =
  4230. get_client_vote_locked(chg->usb_icl_votable, PD_VOTER);
  4231. return rc;
  4232. }
  4233. rc = smblib_read(chg, LEGACY_CABLE_STATUS_REG, &stat);
  4234. if (rc < 0) {
  4235. smblib_err(chg, "Couldn't read TYPE_C_STATUS_5 rc=%d\n", rc);
  4236. return rc;
  4237. }
  4238. non_compliant = stat & TYPEC_NONCOMP_LEGACY_CABLE_STATUS_BIT;
  4239. /* get settled ICL */
  4240. rc = smblib_get_prop_input_current_settled(chg, &val);
  4241. if (rc < 0) {
  4242. smblib_err(chg, "Couldn't get settled ICL rc=%d\n", rc);
  4243. return rc;
  4244. }
  4245. typec_source_rd = smblib_get_prop_ufp_mode(chg);
  4246. /* QC 2.0/3.0 adapter */
  4247. if (apsd_result->bit & (QC_3P0_BIT | QC_2P0_BIT)) {
  4248. *total_current_ua = HVDCP_CURRENT_UA;
  4249. return 0;
  4250. }
  4251. if (non_compliant && !chg->typec_legacy_use_rp_icl) {
  4252. switch (apsd_result->bit) {
  4253. case CDP_CHARGER_BIT:
  4254. current_ua = CDP_CURRENT_UA;
  4255. break;
  4256. case DCP_CHARGER_BIT:
  4257. case OCP_CHARGER_BIT:
  4258. case FLOAT_CHARGER_BIT:
  4259. current_ua = DCP_CURRENT_UA;
  4260. break;
  4261. default:
  4262. current_ua = 0;
  4263. break;
  4264. }
  4265. *total_current_ua = max(current_ua, val.intval);
  4266. return 0;
  4267. }
  4268. switch (typec_source_rd) {
  4269. case QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT:
  4270. switch (apsd_result->bit) {
  4271. case CDP_CHARGER_BIT:
  4272. current_ua = CDP_CURRENT_UA;
  4273. break;
  4274. case DCP_CHARGER_BIT:
  4275. case OCP_CHARGER_BIT:
  4276. case FLOAT_CHARGER_BIT:
  4277. current_ua = chg->default_icl_ua;
  4278. break;
  4279. default:
  4280. current_ua = 0;
  4281. break;
  4282. }
  4283. break;
  4284. case QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
  4285. current_ua = TYPEC_MEDIUM_CURRENT_UA;
  4286. break;
  4287. case QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH:
  4288. current_ua = TYPEC_HIGH_CURRENT_UA;
  4289. break;
  4290. case QTI_POWER_SUPPLY_TYPEC_NON_COMPLIANT:
  4291. case QTI_POWER_SUPPLY_TYPEC_NONE:
  4292. default:
  4293. current_ua = 0;
  4294. break;
  4295. }
  4296. *total_current_ua = max(current_ua, val.intval);
  4297. return 0;
  4298. }
  4299. #define IADP_OVERHEAT_UA 500000
  4300. int smblib_set_prop_thermal_overheat(struct smb_charger *chg,
  4301. int therm_overheat)
  4302. {
  4303. int icl_ua = 0;
  4304. if (chg->thermal_overheat == !!therm_overheat)
  4305. return 0;
  4306. /* Configure ICL to 500mA in case system health is Overheat */
  4307. if (therm_overheat)
  4308. icl_ua = IADP_OVERHEAT_UA;
  4309. if (!chg->cp_disable_votable)
  4310. chg->cp_disable_votable = find_votable("CP_DISABLE");
  4311. if (chg->cp_disable_votable) {
  4312. vote(chg->cp_disable_votable, OVERHEAT_LIMIT_VOTER,
  4313. therm_overheat, 0);
  4314. vote(chg->usb_icl_votable, OVERHEAT_LIMIT_VOTER,
  4315. therm_overheat, icl_ua);
  4316. }
  4317. chg->thermal_overheat = !!therm_overheat;
  4318. return 0;
  4319. }
  4320. /**********************
  4321. * INTERRUPT HANDLERS *
  4322. **********************/
  4323. irqreturn_t smb5_default_irq_handler(int irq, void *data)
  4324. {
  4325. struct smb_irq_data *irq_data = data;
  4326. struct smb_charger *chg = irq_data->parent_data;
  4327. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4328. return IRQ_HANDLED;
  4329. }
  4330. irqreturn_t smb5_smb_en_irq_handler(int irq, void *data)
  4331. {
  4332. struct smb_irq_data *irq_data = data;
  4333. struct smb_charger *chg = irq_data->parent_data;
  4334. int rc, input_present;
  4335. if (!chg->cp_disable_votable) {
  4336. chg->cp_disable_votable = find_votable("CP_DISABLE");
  4337. if (!chg->cp_disable_votable)
  4338. return IRQ_HANDLED;
  4339. }
  4340. if (chg->pd_hard_reset) {
  4341. vote(chg->cp_disable_votable, BOOST_BACK_VOTER, true, 0);
  4342. return IRQ_HANDLED;
  4343. }
  4344. rc = smblib_is_input_present(chg, &input_present);
  4345. if (rc < 0) {
  4346. pr_err("Couldn't get usb presence status rc=%d\n", rc);
  4347. return IRQ_HANDLED;
  4348. }
  4349. if (input_present) {
  4350. /*
  4351. * Add some delay to enable SMB1390 switcher after SMB_EN
  4352. * pin goes high
  4353. */
  4354. usleep_range(1000, 1100);
  4355. vote(chg->cp_disable_votable, BOOST_BACK_VOTER, false, 0);
  4356. }
  4357. return IRQ_HANDLED;
  4358. }
  4359. irqreturn_t smb5_sdam_sts_change_irq_handler(int irq, void *data)
  4360. {
  4361. struct smb_irq_data *irq_data = data;
  4362. struct smb_charger *chg = irq_data->parent_data;
  4363. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4364. mutex_lock(&chg->irq_status_lock);
  4365. chg->irq_status |= PULSE_SKIP_IRQ_BIT;
  4366. mutex_unlock(&chg->irq_status_lock);
  4367. power_supply_changed(chg->batt_psy);
  4368. return IRQ_HANDLED;
  4369. }
  4370. #define CHG_TERM_WA_ENTRY_DELAY_MS 300000 /* 5 min */
  4371. #define CHG_TERM_WA_EXIT_DELAY_MS 60000 /* 1 min */
  4372. static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status)
  4373. {
  4374. union power_supply_propval pval = {0, };
  4375. int rc = 0;
  4376. rc = smblib_get_prop_from_bms(chg, SMB5_QG_REAL_CAPACITY, &pval.intval);
  4377. if (rc < 0) {
  4378. smblib_err(chg, "Couldn't read SOC value, rc=%d\n", rc);
  4379. return;
  4380. }
  4381. /*
  4382. * Post charge termination, switch to BSM mode triggers the risk of
  4383. * over charging as BATFET opening may take some time post the necessity
  4384. * of staying in supplemental mode, leading to unintended charging of
  4385. * battery. Trigger the charge termination WA once charging is completed
  4386. * to prevent overcharing.
  4387. */
  4388. if ((batt_status == TERMINATE_CHARGE) && (pval.intval == 100) &&
  4389. (ktime_to_ms(alarm_expires_remaining(/* alarm not pending */
  4390. &chg->chg_termination_alarm)) <= 0)) {
  4391. chg->cc_soc_ref = 0;
  4392. chg->last_cc_soc = 0;
  4393. chg->term_vbat_uv = 0;
  4394. alarm_start_relative(&chg->chg_termination_alarm,
  4395. ms_to_ktime(CHG_TERM_WA_ENTRY_DELAY_MS));
  4396. } else if (pval.intval < 100) {
  4397. /*
  4398. * Reset CC_SOC reference value for charge termination WA once
  4399. * we exit the TERMINATE_CHARGE state and soc drops below 100%
  4400. */
  4401. chg->cc_soc_ref = 0;
  4402. chg->last_cc_soc = 0;
  4403. chg->term_vbat_uv = 0;
  4404. }
  4405. }
  4406. irqreturn_t smb5_chg_state_change_irq_handler(int irq, void *data)
  4407. {
  4408. struct smb_irq_data *irq_data = data;
  4409. struct smb_charger *chg = irq_data->parent_data;
  4410. u8 stat;
  4411. int rc;
  4412. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4413. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
  4414. if (rc < 0) {
  4415. smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
  4416. rc);
  4417. return IRQ_HANDLED;
  4418. }
  4419. stat = stat & BATTERY_CHARGER_STATUS_MASK;
  4420. if (chg->wa_flags & CHG_TERMINATION_WA)
  4421. smblib_eval_chg_termination(chg, stat);
  4422. power_supply_changed(chg->batt_psy);
  4423. return IRQ_HANDLED;
  4424. }
  4425. irqreturn_t smb5_batt_temp_changed_irq_handler(int irq, void *data)
  4426. {
  4427. struct smb_irq_data *irq_data = data;
  4428. struct smb_charger *chg = irq_data->parent_data;
  4429. int rc;
  4430. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4431. if (chg->jeita_configured != JEITA_CFG_COMPLETE)
  4432. return IRQ_HANDLED;
  4433. rc = smblib_soft_jeita_arb_wa(chg);
  4434. if (rc < 0) {
  4435. smblib_err(chg, "Couldn't fix soft jeita arb rc=%d\n",
  4436. rc);
  4437. return IRQ_HANDLED;
  4438. }
  4439. return IRQ_HANDLED;
  4440. }
  4441. irqreturn_t smb5_batt_psy_changed_irq_handler(int irq, void *data)
  4442. {
  4443. struct smb_irq_data *irq_data = data;
  4444. struct smb_charger *chg = irq_data->parent_data;
  4445. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4446. power_supply_changed(chg->batt_psy);
  4447. return IRQ_HANDLED;
  4448. }
  4449. #define AICL_STEP_MV 200
  4450. #define MAX_AICL_THRESHOLD_MV 4800
  4451. irqreturn_t smb5_usbin_uv_irq_handler(int irq, void *data)
  4452. {
  4453. struct smb_irq_data *irq_data = data;
  4454. struct smb_charger *chg = irq_data->parent_data;
  4455. struct storm_watch *wdata;
  4456. const struct apsd_result *apsd = smblib_get_apsd_result(chg);
  4457. int rc;
  4458. u8 stat = 0, max_pulses = 0;
  4459. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  4460. if ((chg->wa_flags & WEAK_ADAPTER_WA)
  4461. && is_storming(&irq_data->storm_data)) {
  4462. if (chg->aicl_max_reached) {
  4463. smblib_dbg(chg, PR_MISC,
  4464. "USBIN_UV storm at max AICL threshold\n");
  4465. return IRQ_HANDLED;
  4466. }
  4467. smblib_dbg(chg, PR_MISC, "USBIN_UV storm at threshold %d\n",
  4468. chg->aicl_5v_threshold_mv);
  4469. /* suspend USBIN before updating AICL threshold */
  4470. vote(chg->usb_icl_votable, AICL_THRESHOLD_VOTER, true, 0);
  4471. /* delay for VASHDN deglitch */
  4472. msleep(20);
  4473. if (chg->aicl_5v_threshold_mv > MAX_AICL_THRESHOLD_MV) {
  4474. /* reached max AICL threshold */
  4475. chg->aicl_max_reached = true;
  4476. goto unsuspend_input;
  4477. }
  4478. /* Increase AICL threshold by 200mV */
  4479. rc = smblib_set_charge_param(chg, &chg->param.aicl_5v_threshold,
  4480. chg->aicl_5v_threshold_mv + AICL_STEP_MV);
  4481. if (rc < 0)
  4482. dev_err(chg->dev,
  4483. "Error in setting AICL threshold rc=%d\n", rc);
  4484. else
  4485. chg->aicl_5v_threshold_mv += AICL_STEP_MV;
  4486. rc = smblib_set_charge_param(chg,
  4487. &chg->param.aicl_cont_threshold,
  4488. chg->aicl_cont_threshold_mv + AICL_STEP_MV);
  4489. if (rc < 0)
  4490. dev_err(chg->dev,
  4491. "Error in setting AICL threshold rc=%d\n", rc);
  4492. else
  4493. chg->aicl_cont_threshold_mv += AICL_STEP_MV;
  4494. unsuspend_input:
  4495. /* Force torch in boost mode to ensure it works with low ICL */
  4496. if (chg->chg_param.smb_version == PMI632)
  4497. schgm_flash_torch_priority(chg, TORCH_BOOST_MODE);
  4498. if (chg->aicl_max_reached) {
  4499. smblib_dbg(chg, PR_MISC,
  4500. "Reached max AICL threshold resctricting ICL to 100mA\n");
  4501. vote(chg->usb_icl_votable, AICL_THRESHOLD_VOTER,
  4502. true, USBIN_100MA);
  4503. smblib_run_aicl(chg, RESTART_AICL);
  4504. } else {
  4505. smblib_run_aicl(chg, RESTART_AICL);
  4506. vote(chg->usb_icl_votable, AICL_THRESHOLD_VOTER,
  4507. false, 0);
  4508. }
  4509. wdata = &chg->irq_info[USBIN_UV_IRQ].irq_data->storm_data;
  4510. reset_storm_count(wdata);
  4511. }
  4512. if (!chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data)
  4513. return IRQ_HANDLED;
  4514. wdata = &chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data->storm_data;
  4515. reset_storm_count(wdata);
  4516. /* Workaround for non-QC2.0-compliant chargers follows */
  4517. if (!chg->qc2_unsupported_voltage &&
  4518. apsd->val == QTI_POWER_SUPPLY_TYPE_USB_HVDCP) {
  4519. rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
  4520. if (rc < 0)
  4521. smblib_err(chg,
  4522. "Couldn't read CHANGE_STATUS_REG rc=%d\n", rc);
  4523. if (stat & QC_5V_BIT)
  4524. return IRQ_HANDLED;
  4525. rc = smblib_read(chg, HVDCP_PULSE_COUNT_MAX_REG, &max_pulses);
  4526. if (rc < 0)
  4527. smblib_err(chg,
  4528. "Couldn't read QC2 max pulses rc=%d\n", rc);
  4529. chg->qc2_max_pulses = (max_pulses &
  4530. HVDCP_PULSE_COUNT_MAX_QC2_MASK);
  4531. if (stat & QC_12V_BIT) {
  4532. chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_12V;
  4533. rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG,
  4534. HVDCP_PULSE_COUNT_MAX_QC2_MASK,
  4535. HVDCP_PULSE_COUNT_MAX_QC2_9V);
  4536. if (rc < 0)
  4537. smblib_err(chg, "Couldn't force max pulses to 9V rc=%d\n",
  4538. rc);
  4539. } else if (stat & QC_9V_BIT) {
  4540. chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_9V;
  4541. rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG,
  4542. HVDCP_PULSE_COUNT_MAX_QC2_MASK,
  4543. HVDCP_PULSE_COUNT_MAX_QC2_5V);
  4544. if (rc < 0)
  4545. smblib_err(chg, "Couldn't force max pulses to 5V rc=%d\n",
  4546. rc);
  4547. }
  4548. rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG,
  4549. SUSPEND_ON_COLLAPSE_USBIN_BIT,
  4550. 0);
  4551. if (rc < 0)
  4552. smblib_err(chg, "Couldn't turn off SUSPEND_ON_COLLAPSE_USBIN_BIT rc=%d\n",
  4553. rc);
  4554. smblib_rerun_apsd(chg);
  4555. }
  4556. return IRQ_HANDLED;
  4557. }
  4558. #define USB_WEAK_INPUT_UA 1400000
  4559. #define ICL_CHANGE_DELAY_MS 1000
  4560. irqreturn_t smb5_icl_change_irq_handler(int irq, void *data)
  4561. {
  4562. u8 stat;
  4563. int rc, settled_ua, delay = ICL_CHANGE_DELAY_MS;
  4564. struct smb_irq_data *irq_data = data;
  4565. struct smb_charger *chg = irq_data->parent_data;
  4566. if (chg->mode == PARALLEL_MASTER) {
  4567. /*
  4568. * Ignore if change in ICL is due to DIE temp mitigation.
  4569. * This is to prevent any further ICL split.
  4570. */
  4571. if (chg->hw_die_temp_mitigation) {
  4572. rc = smblib_read(chg, DIE_TEMP_STATUS_REG, &stat);
  4573. if (rc < 0) {
  4574. smblib_err(chg,
  4575. "Couldn't read DIE_TEMP rc=%d\n", rc);
  4576. return IRQ_HANDLED;
  4577. }
  4578. if (stat & (DIE_TEMP_UB_BIT | DIE_TEMP_LB_BIT)) {
  4579. smblib_dbg(chg, PR_PARALLEL,
  4580. "skip ICL change DIE_TEMP %x\n", stat);
  4581. return IRQ_HANDLED;
  4582. }
  4583. }
  4584. rc = smblib_read(chg, AICL_STATUS_REG, &stat);
  4585. if (rc < 0) {
  4586. smblib_err(chg, "Couldn't read AICL_STATUS rc=%d\n",
  4587. rc);
  4588. return IRQ_HANDLED;
  4589. }
  4590. rc = smblib_get_charge_param(chg, &chg->param.icl_stat,
  4591. &settled_ua);
  4592. if (rc < 0) {
  4593. smblib_err(chg, "Couldn't get ICL status rc=%d\n", rc);
  4594. return IRQ_HANDLED;
  4595. }
  4596. /* If AICL settled then schedule work now */
  4597. if (settled_ua == get_effective_result(chg->usb_icl_votable))
  4598. delay = 0;
  4599. cancel_delayed_work_sync(&chg->icl_change_work);
  4600. schedule_delayed_work(&chg->icl_change_work,
  4601. msecs_to_jiffies(delay));
  4602. }
  4603. return IRQ_HANDLED;
  4604. }
  4605. static int smblib_role_switch_failure(struct smb_charger *chg)
  4606. {
  4607. int rc = 0;
  4608. union power_supply_propval pval = {0, };
  4609. if (!chg->use_extcon)
  4610. return 0;
  4611. rc = smblib_get_prop_usb_present(chg, &pval);
  4612. if (rc < 0) {
  4613. smblib_err(chg, "Couldn't get usb presence status rc=%d\n",
  4614. rc);
  4615. return rc;
  4616. }
  4617. /*
  4618. * When role switch fails notify the
  4619. * current charger state to usb driver.
  4620. */
  4621. if (pval.intval) {
  4622. smblib_dbg(chg, PR_MISC, " Role reversal failed, notifying device mode to usb driver.\n");
  4623. smblib_notify_device_mode(chg, true);
  4624. }
  4625. return rc;
  4626. }
  4627. static int typec_partner_register(struct smb_charger *chg)
  4628. {
  4629. int typec_mode, rc = 0;
  4630. mutex_lock(&chg->typec_lock);
  4631. if (!chg->typec_port || chg->pr_swap_in_progress)
  4632. goto unlock;
  4633. if (!chg->typec_partner) {
  4634. if (chg->sink_src_mode == AUDIO_ACCESS_MODE)
  4635. chg->typec_partner_desc.accessory =
  4636. TYPEC_ACCESSORY_AUDIO;
  4637. else
  4638. chg->typec_partner_desc.accessory =
  4639. TYPEC_ACCESSORY_NONE;
  4640. chg->typec_partner = typec_register_partner(chg->typec_port,
  4641. &chg->typec_partner_desc);
  4642. if (IS_ERR(chg->typec_partner)) {
  4643. rc = PTR_ERR(chg->typec_partner);
  4644. pr_err("failed to register typec_partner rc=%d\n", rc);
  4645. goto unlock;
  4646. }
  4647. }
  4648. typec_mode = smblib_get_prop_typec_mode(chg);
  4649. if (typec_mode >= QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT
  4650. || typec_mode == QTI_POWER_SUPPLY_TYPEC_NONE) {
  4651. if (chg->typec_role_swap_failed) {
  4652. rc = smblib_role_switch_failure(chg);
  4653. if (rc < 0)
  4654. smblib_err(chg, "Failed to role switch rc=%d\n",
  4655. rc);
  4656. chg->typec_role_swap_failed = false;
  4657. }
  4658. typec_set_data_role(chg->typec_port, TYPEC_DEVICE);
  4659. typec_set_pwr_role(chg->typec_port, TYPEC_SINK);
  4660. } else {
  4661. typec_set_data_role(chg->typec_port, TYPEC_HOST);
  4662. typec_set_pwr_role(chg->typec_port, TYPEC_SOURCE);
  4663. }
  4664. unlock:
  4665. mutex_unlock(&chg->typec_lock);
  4666. return rc;
  4667. }
  4668. static void typec_partner_unregister(struct smb_charger *chg)
  4669. {
  4670. mutex_lock(&chg->typec_lock);
  4671. if (!chg->typec_port)
  4672. goto unlock;
  4673. if (chg->typec_partner && !chg->pr_swap_in_progress) {
  4674. smblib_dbg(chg, PR_MISC, "Un-registering typeC partner\n");
  4675. typec_unregister_partner(chg->typec_partner);
  4676. chg->typec_partner = NULL;
  4677. }
  4678. unlock:
  4679. mutex_unlock(&chg->typec_lock);
  4680. }
  4681. static void smblib_micro_usb_plugin(struct smb_charger *chg, bool vbus_rising)
  4682. {
  4683. int rc = 0;
  4684. if (!vbus_rising) {
  4685. smblib_update_usb_type(chg);
  4686. smblib_notify_device_mode(chg, false);
  4687. smblib_uusb_removal(chg);
  4688. typec_partner_unregister(chg);
  4689. } else {
  4690. rc = typec_partner_register(chg);
  4691. if (rc < 0)
  4692. smblib_err(chg, "Couldn't register partner rc =%d\n",
  4693. rc);
  4694. }
  4695. }
  4696. static void smblib_usb_plugin_hard_reset_locked(struct smb_charger *chg)
  4697. {
  4698. int rc;
  4699. u8 stat;
  4700. bool vbus_rising;
  4701. struct smb_irq_data *data;
  4702. struct storm_watch *wdata;
  4703. rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
  4704. if (rc < 0) {
  4705. smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
  4706. return;
  4707. }
  4708. vbus_rising = (bool)(stat & USBIN_PLUGIN_RT_STS_BIT);
  4709. if (vbus_rising) {
  4710. /* Remove FCC_STEPPER 1.5A init vote to allow FCC ramp up */
  4711. if (chg->fcc_stepper_enable)
  4712. vote(chg->fcc_votable, FCC_STEPPER_VOTER, false, 0);
  4713. } else {
  4714. if (chg->wa_flags & BOOST_BACK_WA) {
  4715. data = chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data;
  4716. if (data) {
  4717. wdata = &data->storm_data;
  4718. update_storm_count(wdata,
  4719. WEAK_CHG_STORM_COUNT);
  4720. vote(chg->usb_icl_votable, BOOST_BACK_VOTER,
  4721. false, 0);
  4722. vote(chg->usb_icl_votable, WEAK_CHARGER_VOTER,
  4723. false, 0);
  4724. }
  4725. }
  4726. /* Force 1500mA FCC on USB removal if fcc stepper is enabled */
  4727. if (chg->fcc_stepper_enable)
  4728. vote(chg->fcc_votable, FCC_STEPPER_VOTER,
  4729. true, 1500000);
  4730. }
  4731. power_supply_changed(chg->usb_psy);
  4732. smblib_dbg(chg, PR_INTERRUPT, "IRQ: usbin-plugin %s\n",
  4733. vbus_rising ? "attached" : "detached");
  4734. }
  4735. #define PL_DELAY_MS 30000
  4736. static void smblib_usb_plugin_locked(struct smb_charger *chg)
  4737. {
  4738. int rc;
  4739. u8 stat;
  4740. bool vbus_rising;
  4741. struct smb_irq_data *data;
  4742. struct storm_watch *wdata;
  4743. rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
  4744. if (rc < 0) {
  4745. smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
  4746. return;
  4747. }
  4748. vbus_rising = (bool)(stat & USBIN_PLUGIN_RT_STS_BIT);
  4749. smblib_set_opt_switcher_freq(chg, vbus_rising ? chg->chg_freq.freq_5V :
  4750. chg->chg_freq.freq_removal);
  4751. if (vbus_rising) {
  4752. cancel_delayed_work_sync(&chg->pr_swap_detach_work);
  4753. vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0);
  4754. rc = smblib_request_dpdm(chg, true);
  4755. if (rc < 0)
  4756. smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc);
  4757. /* Enable SW Thermal regulation */
  4758. rc = smblib_set_sw_thermal_regulation(chg, true);
  4759. if (rc < 0)
  4760. smblib_err(chg, "Couldn't start SW thermal regulation WA, rc=%d\n",
  4761. rc);
  4762. /* Remove FCC_STEPPER 1.5A init vote to allow FCC ramp up */
  4763. if (chg->fcc_stepper_enable)
  4764. vote(chg->fcc_votable, FCC_STEPPER_VOTER, false, 0);
  4765. /* Schedule work to enable parallel charger */
  4766. vote(chg->awake_votable, PL_DELAY_VOTER, true, 0);
  4767. schedule_delayed_work(&chg->pl_enable_work,
  4768. msecs_to_jiffies(PL_DELAY_MS));
  4769. } else {
  4770. /* Disable SW Thermal Regulation */
  4771. rc = smblib_set_sw_thermal_regulation(chg, false);
  4772. if (rc < 0)
  4773. smblib_err(chg, "Couldn't stop SW thermal regulation WA, rc=%d\n",
  4774. rc);
  4775. if (chg->wa_flags & BOOST_BACK_WA) {
  4776. data = chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data;
  4777. if (data) {
  4778. wdata = &data->storm_data;
  4779. update_storm_count(wdata,
  4780. WEAK_CHG_STORM_COUNT);
  4781. vote(chg->usb_icl_votable, BOOST_BACK_VOTER,
  4782. false, 0);
  4783. vote(chg->usb_icl_votable, WEAK_CHARGER_VOTER,
  4784. false, 0);
  4785. }
  4786. }
  4787. /* Force 1500mA FCC on removal if fcc stepper is enabled */
  4788. if (chg->fcc_stepper_enable)
  4789. vote(chg->fcc_votable, FCC_STEPPER_VOTER,
  4790. true, 1500000);
  4791. if (chg->wa_flags & WEAK_ADAPTER_WA) {
  4792. chg->aicl_5v_threshold_mv =
  4793. chg->default_aicl_5v_threshold_mv;
  4794. chg->aicl_cont_threshold_mv =
  4795. chg->default_aicl_cont_threshold_mv;
  4796. smblib_set_charge_param(chg,
  4797. &chg->param.aicl_5v_threshold,
  4798. chg->aicl_5v_threshold_mv);
  4799. smblib_set_charge_param(chg,
  4800. &chg->param.aicl_cont_threshold,
  4801. chg->aicl_cont_threshold_mv);
  4802. chg->aicl_max_reached = false;
  4803. if (chg->chg_param.smb_version == PMI632)
  4804. schgm_flash_torch_priority(chg,
  4805. TORCH_BUCK_MODE);
  4806. data = chg->irq_info[USBIN_UV_IRQ].irq_data;
  4807. if (data) {
  4808. wdata = &data->storm_data;
  4809. reset_storm_count(wdata);
  4810. }
  4811. vote(chg->usb_icl_votable, AICL_THRESHOLD_VOTER,
  4812. false, 0);
  4813. }
  4814. rc = smblib_request_dpdm(chg, false);
  4815. if (rc < 0)
  4816. smblib_err(chg, "Couldn't disable DPDM rc=%d\n", rc);
  4817. smblib_update_usb_type(chg);
  4818. }
  4819. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  4820. smblib_micro_usb_plugin(chg, vbus_rising);
  4821. vote(chg->temp_change_irq_disable_votable, DEFAULT_VOTER,
  4822. !vbus_rising, 0);
  4823. power_supply_changed(chg->usb_psy);
  4824. smblib_dbg(chg, PR_INTERRUPT, "IRQ: usbin-plugin %s\n",
  4825. vbus_rising ? "attached" : "detached");
  4826. }
  4827. irqreturn_t smb5_usb_plugin_irq_handler(int irq, void *data)
  4828. {
  4829. struct smb_irq_data *irq_data = data;
  4830. struct smb_charger *chg = irq_data->parent_data;
  4831. if (chg->pd_hard_reset)
  4832. smblib_usb_plugin_hard_reset_locked(chg);
  4833. else
  4834. smblib_usb_plugin_locked(chg);
  4835. return IRQ_HANDLED;
  4836. }
  4837. static void smblib_handle_slow_plugin_timeout(struct smb_charger *chg,
  4838. bool rising)
  4839. {
  4840. smblib_dbg(chg, PR_INTERRUPT, "IRQ: slow-plugin-timeout %s\n",
  4841. rising ? "rising" : "falling");
  4842. }
  4843. static void smblib_handle_sdp_enumeration_done(struct smb_charger *chg,
  4844. bool rising)
  4845. {
  4846. smblib_dbg(chg, PR_INTERRUPT, "IRQ: sdp-enumeration-done %s\n",
  4847. rising ? "rising" : "falling");
  4848. }
  4849. #define APSD_EXTENDED_TIMEOUT_MS 400
  4850. /* triggers when HVDCP 3.0 authentication has finished */
  4851. static void smblib_handle_hvdcp_3p0_auth_done(struct smb_charger *chg,
  4852. bool rising)
  4853. {
  4854. const struct apsd_result *apsd_result;
  4855. int rc;
  4856. if (!rising)
  4857. return;
  4858. if (chg->mode == PARALLEL_MASTER)
  4859. vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, true, 0);
  4860. /* the APSD done handler will set the USB supply type */
  4861. apsd_result = smblib_get_apsd_result(chg);
  4862. if (apsd_result->bit & QC_3P0_BIT) {
  4863. /* for QC3, switch to CP if present */
  4864. if (chg->sec_cp_present) {
  4865. rc = smblib_select_sec_charger(chg,
  4866. QTI_POWER_SUPPLY_CHARGER_SEC_CP,
  4867. QTI_POWER_SUPPLY_CP_HVDCP3, false);
  4868. if (rc < 0)
  4869. dev_err(chg->dev,
  4870. "Couldn't enable secondary chargers rc=%d\n",
  4871. rc);
  4872. }
  4873. /* QC3.5 detection timeout */
  4874. if (!chg->apsd_ext_timeout &&
  4875. !timer_pending(&chg->apsd_timer)) {
  4876. smblib_dbg(chg, PR_MISC,
  4877. "APSD Extented timer started at %lld\n",
  4878. jiffies_to_msecs(jiffies));
  4879. mod_timer(&chg->apsd_timer,
  4880. msecs_to_jiffies(APSD_EXTENDED_TIMEOUT_MS)
  4881. + jiffies);
  4882. }
  4883. }
  4884. smblib_dbg(chg, PR_INTERRUPT, "IRQ: hvdcp-3p0-auth-done rising; %s detected\n",
  4885. apsd_result->name);
  4886. }
  4887. static void smblib_handle_hvdcp_check_timeout(struct smb_charger *chg,
  4888. bool rising, bool qc_charger)
  4889. {
  4890. u32 hvdcp_ua = 0;
  4891. if (rising) {
  4892. if (qc_charger) {
  4893. hvdcp_ua = (chg->real_charger_type ==
  4894. QTI_POWER_SUPPLY_TYPE_USB_HVDCP) ?
  4895. chg->chg_param.hvdcp2_max_icl_ua :
  4896. HVDCP_CURRENT_UA;
  4897. /* enable HDC and ICL irq for QC2/3 charger */
  4898. vote(chg->limited_irq_disable_votable,
  4899. CHARGER_TYPE_VOTER, false, 0);
  4900. vote(chg->hdc_irq_disable_votable,
  4901. CHARGER_TYPE_VOTER, false, 0);
  4902. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  4903. hvdcp_ua);
  4904. } else {
  4905. /* A plain DCP, enforce DCP ICL if specified */
  4906. vote(chg->usb_icl_votable, DCP_VOTER,
  4907. chg->dcp_icl_ua != -EINVAL, chg->dcp_icl_ua);
  4908. }
  4909. }
  4910. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s %s\n", __func__,
  4911. rising ? "rising" : "falling");
  4912. }
  4913. /* triggers when HVDCP is detected */
  4914. static void smblib_handle_hvdcp_detect_done(struct smb_charger *chg,
  4915. bool rising)
  4916. {
  4917. smblib_dbg(chg, PR_INTERRUPT, "IRQ: hvdcp-detect-done %s\n",
  4918. rising ? "rising" : "falling");
  4919. }
  4920. static void update_sw_icl_max(struct smb_charger *chg, int val)
  4921. {
  4922. int typec_mode;
  4923. int rp_ua;
  4924. /* while PD is active it should have complete ICL control */
  4925. if (chg->pd_active)
  4926. return;
  4927. if (chg->typec_mode == QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER) {
  4928. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, 500000);
  4929. return;
  4930. }
  4931. /*
  4932. * HVDCP 2/3, handled separately
  4933. */
  4934. if (val == QTI_POWER_SUPPLY_TYPE_USB_HVDCP
  4935. || val == QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3)
  4936. return;
  4937. /* TypeC rp med or high, use rp value */
  4938. typec_mode = smblib_get_prop_typec_mode(chg);
  4939. if (typec_rp_med_high(chg, typec_mode)) {
  4940. rp_ua = get_rp_based_dcp_current(chg, typec_mode);
  4941. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, rp_ua);
  4942. return;
  4943. }
  4944. /* rp-std or legacy, USB BC 1.2 */
  4945. switch (val) {
  4946. case POWER_SUPPLY_TYPE_USB:
  4947. /*
  4948. * USB_PSY will vote to increase the current to 500/900mA once
  4949. * enumeration is done.
  4950. */
  4951. if (!is_client_vote_enabled(chg->usb_icl_votable,
  4952. USB_PSY_VOTER)) {
  4953. /* if flash is active force 500mA */
  4954. vote(chg->usb_icl_votable, USB_PSY_VOTER, true,
  4955. is_flash_active(chg) ?
  4956. SDP_CURRENT_UA : SDP_100_MA);
  4957. }
  4958. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, false, 0);
  4959. break;
  4960. case POWER_SUPPLY_TYPE_USB_CDP:
  4961. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  4962. CDP_CURRENT_UA);
  4963. break;
  4964. case POWER_SUPPLY_TYPE_USB_DCP:
  4965. rp_ua = get_rp_based_dcp_current(chg, typec_mode);
  4966. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, rp_ua);
  4967. break;
  4968. case QTI_POWER_SUPPLY_TYPE_USB_FLOAT:
  4969. /*
  4970. * limit ICL to 100mA, the USB driver will enumerate to check
  4971. * if this is a SDP and appropriately set the current
  4972. */
  4973. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  4974. SDP_100_MA);
  4975. break;
  4976. case POWER_SUPPLY_TYPE_UNKNOWN:
  4977. default:
  4978. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  4979. SDP_100_MA);
  4980. break;
  4981. }
  4982. }
  4983. static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
  4984. {
  4985. const struct apsd_result *apsd_result;
  4986. if (!rising)
  4987. return;
  4988. apsd_result = smblib_update_usb_type(chg);
  4989. update_sw_icl_max(chg, apsd_result->val);
  4990. switch (apsd_result->bit) {
  4991. case SDP_CHARGER_BIT:
  4992. case CDP_CHARGER_BIT:
  4993. case FLOAT_CHARGER_BIT:
  4994. if (chg->use_extcon)
  4995. smblib_notify_device_mode(chg, true);
  4996. break;
  4997. case OCP_CHARGER_BIT:
  4998. case DCP_CHARGER_BIT:
  4999. break;
  5000. default:
  5001. break;
  5002. }
  5003. smblib_dbg(chg, PR_INTERRUPT, "IRQ: apsd-done rising; %s detected\n",
  5004. apsd_result->name);
  5005. }
  5006. irqreturn_t smb5_usb_source_change_irq_handler(int irq, void *data)
  5007. {
  5008. struct smb_irq_data *irq_data = data;
  5009. struct smb_charger *chg = irq_data->parent_data;
  5010. int rc = 0;
  5011. u8 stat;
  5012. /* PD session is ongoing, ignore BC1.2 and QC detection */
  5013. if (chg->pd_active)
  5014. return IRQ_HANDLED;
  5015. rc = smblib_read(chg, APSD_STATUS_REG, &stat);
  5016. if (rc < 0) {
  5017. smblib_err(chg, "Couldn't read APSD_STATUS rc=%d\n", rc);
  5018. return IRQ_HANDLED;
  5019. }
  5020. smblib_dbg(chg, PR_INTERRUPT, "APSD_STATUS = 0x%02x\n", stat);
  5021. if ((chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  5022. && (stat & APSD_DTC_STATUS_DONE_BIT)
  5023. && !chg->uusb_apsd_rerun_done) {
  5024. /*
  5025. * Force re-run APSD to handle slow insertion related
  5026. * charger-mis-detection.
  5027. */
  5028. chg->uusb_apsd_rerun_done = true;
  5029. smblib_rerun_apsd_if_required(chg);
  5030. return IRQ_HANDLED;
  5031. }
  5032. smblib_handle_apsd_done(chg,
  5033. (bool)(stat & APSD_DTC_STATUS_DONE_BIT));
  5034. smblib_handle_hvdcp_detect_done(chg,
  5035. (bool)(stat & QC_CHARGER_BIT));
  5036. smblib_handle_hvdcp_check_timeout(chg,
  5037. (bool)(stat & HVDCP_CHECK_TIMEOUT_BIT),
  5038. (bool)(stat & QC_CHARGER_BIT));
  5039. smblib_handle_hvdcp_3p0_auth_done(chg,
  5040. (bool)(stat & QC_AUTH_DONE_STATUS_BIT));
  5041. smblib_handle_sdp_enumeration_done(chg,
  5042. (bool)(stat & ENUMERATION_DONE_BIT));
  5043. smblib_handle_slow_plugin_timeout(chg,
  5044. (bool)(stat & SLOW_PLUGIN_TIMEOUT_BIT));
  5045. smblib_hvdcp_adaptive_voltage_change(chg);
  5046. power_supply_changed(chg->usb_psy);
  5047. rc = smblib_read(chg, APSD_STATUS_REG, &stat);
  5048. if (rc < 0) {
  5049. smblib_err(chg, "Couldn't read APSD_STATUS rc=%d\n", rc);
  5050. return IRQ_HANDLED;
  5051. }
  5052. smblib_dbg(chg, PR_INTERRUPT, "APSD_STATUS = 0x%02x\n", stat);
  5053. return IRQ_HANDLED;
  5054. }
  5055. enum alarmtimer_restart smblib_lpd_recheck_timer(struct alarm *alarm,
  5056. ktime_t time)
  5057. {
  5058. int val;
  5059. struct smb_charger *chg = container_of(alarm, struct smb_charger,
  5060. lpd_recheck_timer);
  5061. int rc;
  5062. if (chg->lpd_reason == LPD_MOISTURE_DETECTED) {
  5063. val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  5064. rc = smblib_set_prop_typec_power_role(chg, val);
  5065. if (rc < 0) {
  5066. smblib_err(chg, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
  5067. val, rc);
  5068. return ALARMTIMER_NORESTART;
  5069. }
  5070. chg->moisture_present = false;
  5071. power_supply_changed(chg->usb_psy);
  5072. } else {
  5073. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  5074. TYPEC_WATER_DETECTION_INT_EN_BIT,
  5075. TYPEC_WATER_DETECTION_INT_EN_BIT);
  5076. if (rc < 0) {
  5077. smblib_err(chg, "Couldn't set TYPE_C_INTERRUPT_EN_CFG_2_REG rc=%d\n",
  5078. rc);
  5079. return ALARMTIMER_NORESTART;
  5080. }
  5081. }
  5082. chg->lpd_stage = LPD_STAGE_NONE;
  5083. chg->lpd_reason = LPD_NONE;
  5084. return ALARMTIMER_NORESTART;
  5085. }
  5086. #define RSBU_K_300K_UV 3000000
  5087. static bool smblib_src_lpd(struct smb_charger *chg)
  5088. {
  5089. bool lpd_flag = false;
  5090. u8 stat;
  5091. int rc, val;
  5092. if (chg->lpd_disabled)
  5093. return false;
  5094. rc = smblib_read(chg, TYPE_C_SRC_STATUS_REG, &stat);
  5095. if (rc < 0) {
  5096. smblib_err(chg, "Couldn't read TYPE_C_SRC_STATUS_REG rc=%d\n",
  5097. rc);
  5098. return false;
  5099. }
  5100. switch (stat & DETECTED_SNK_TYPE_MASK) {
  5101. case SRC_DEBUG_ACCESS_BIT:
  5102. if (smblib_rsbux_low(chg, RSBU_K_300K_UV))
  5103. lpd_flag = true;
  5104. break;
  5105. case SRC_RD_RA_VCONN_BIT:
  5106. case SRC_RD_OPEN_BIT:
  5107. case AUDIO_ACCESS_RA_RA_BIT:
  5108. default:
  5109. break;
  5110. }
  5111. if (lpd_flag) {
  5112. chg->lpd_stage = LPD_STAGE_COMMIT;
  5113. val = QTI_POWER_SUPPLY_TYPEC_PR_SINK;
  5114. rc = smblib_set_prop_typec_power_role(chg, val);
  5115. if (rc < 0)
  5116. smblib_err(chg, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
  5117. val, rc);
  5118. chg->lpd_reason = LPD_MOISTURE_DETECTED;
  5119. chg->moisture_present = true;
  5120. vote(chg->usb_icl_votable, LPD_VOTER, true, 0);
  5121. alarm_start_relative(&chg->lpd_recheck_timer,
  5122. ms_to_ktime(60000));
  5123. power_supply_changed(chg->usb_psy);
  5124. } else {
  5125. chg->lpd_reason = LPD_NONE;
  5126. chg->typec_mode = smblib_get_prop_typec_mode(chg);
  5127. }
  5128. return lpd_flag;
  5129. }
  5130. static void typec_src_fault_condition_cfg(struct smb_charger *chg, bool src)
  5131. {
  5132. int rc;
  5133. u8 mask = USBIN_MID_COMP_FAULT_EN_BIT | USBIN_COLLAPSE_FAULT_EN_BIT;
  5134. rc = smblib_masked_write(chg, OTG_FAULT_CONDITION_CFG_REG, mask,
  5135. src ? 0 : mask);
  5136. if (rc < 0)
  5137. smblib_err(chg, "Couldn't write OTG_FAULT_CONDITION_CFG_REG rc=%d\n",
  5138. rc);
  5139. }
  5140. static void typec_sink_insertion(struct smb_charger *chg)
  5141. {
  5142. int rc;
  5143. typec_src_fault_condition_cfg(chg, true);
  5144. rc = smblib_set_charge_param(chg, &chg->param.freq_switcher,
  5145. chg->chg_freq.freq_above_otg_threshold);
  5146. if (rc < 0)
  5147. dev_err(chg->dev, "Error in setting freq_boost rc=%d\n", rc);
  5148. if (chg->use_extcon) {
  5149. smblib_notify_usb_host(chg, true);
  5150. chg->otg_present = true;
  5151. }
  5152. if (!chg->pr_swap_in_progress)
  5153. chg->ok_to_pd = (!(chg->pd_disabled) || chg->early_usb_attach)
  5154. && !chg->pd_not_supported;
  5155. }
  5156. static void typec_src_insertion(struct smb_charger *chg)
  5157. {
  5158. int rc = 0;
  5159. u8 stat;
  5160. if (chg->pr_swap_in_progress) {
  5161. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, false, 0);
  5162. return;
  5163. }
  5164. rc = smblib_read(chg, LEGACY_CABLE_STATUS_REG, &stat);
  5165. if (rc < 0) {
  5166. smblib_err(chg, "Couldn't read TYPE_C_STATE_MACHINE_STATUS_REG rc=%d\n",
  5167. rc);
  5168. return;
  5169. }
  5170. chg->typec_legacy = stat & TYPEC_LEGACY_CABLE_STATUS_BIT;
  5171. chg->ok_to_pd = (!(chg->typec_legacy || chg->pd_disabled)
  5172. || chg->early_usb_attach) && !chg->pd_not_supported;
  5173. /* allow apsd proceed to detect QC2/3 */
  5174. if (!chg->ok_to_pd)
  5175. smblib_hvdcp_detect_try_enable(chg, true);
  5176. }
  5177. static void typec_ra_ra_insertion(struct smb_charger *chg)
  5178. {
  5179. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, 500000);
  5180. vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
  5181. chg->ok_to_pd = false;
  5182. smblib_hvdcp_detect_enable(chg, true);
  5183. }
  5184. static const char * const dr_mode_text[] = {
  5185. "ufp", "dfp", "none"
  5186. };
  5187. static int smblib_force_dr_mode(struct smb_charger *chg, int mode)
  5188. {
  5189. int rc = 0;
  5190. switch (mode) {
  5191. case TYPEC_PORT_SNK:
  5192. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  5193. TYPEC_POWER_ROLE_CMD_MASK, EN_SNK_ONLY_BIT);
  5194. if (rc < 0) {
  5195. smblib_err(chg, "Couldn't enable snk, rc=%d\n", rc);
  5196. return rc;
  5197. }
  5198. break;
  5199. case TYPEC_PORT_SRC:
  5200. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  5201. TYPEC_POWER_ROLE_CMD_MASK, EN_SRC_ONLY_BIT);
  5202. if (rc < 0) {
  5203. smblib_err(chg, "Couldn't enable src, rc=%d\n", rc);
  5204. return rc;
  5205. }
  5206. break;
  5207. case TYPEC_PORT_DRP:
  5208. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  5209. TYPEC_POWER_ROLE_CMD_MASK, 0);
  5210. if (rc < 0) {
  5211. smblib_err(chg, "Couldn't enable DRP, rc=%d\n", rc);
  5212. return rc;
  5213. }
  5214. break;
  5215. default:
  5216. smblib_err(chg, "Power role %d not supported\n", mode);
  5217. return -EINVAL;
  5218. }
  5219. chg->dr_mode = mode;
  5220. return rc;
  5221. }
  5222. int smblib_typec_port_type_set(const struct typec_capability *cap,
  5223. enum typec_port_type type)
  5224. {
  5225. struct smb_charger *chg = container_of(cap,
  5226. struct smb_charger, typec_caps);
  5227. int rc = 0;
  5228. mutex_lock(&chg->typec_lock);
  5229. if ((chg->pr_swap_in_progress) || (type == TYPEC_PORT_DRP)) {
  5230. smblib_dbg(chg, PR_MISC, "Ignoring port type request type = %d swap_in_progress = %d\n",
  5231. type, chg->pr_swap_in_progress);
  5232. goto unlock;
  5233. }
  5234. chg->pr_swap_in_progress = true;
  5235. rc = smblib_force_dr_mode(chg, type);
  5236. if (rc < 0) {
  5237. chg->pr_swap_in_progress = false;
  5238. smblib_err(chg, "Failed to force mode, rc=%d\n", rc);
  5239. goto unlock;
  5240. }
  5241. smblib_dbg(chg, PR_MISC, "Requested role %s\n",
  5242. type ? "SINK" : "SOURCE");
  5243. /*
  5244. * As per the hardware requirements,
  5245. * schedule the work with required delay.
  5246. */
  5247. if (!(delayed_work_pending(&chg->role_reversal_check))) {
  5248. cancel_delayed_work_sync(&chg->role_reversal_check);
  5249. schedule_delayed_work(&chg->role_reversal_check,
  5250. msecs_to_jiffies(ROLE_REVERSAL_DELAY_MS));
  5251. vote(chg->awake_votable, TYPEC_SWAP_VOTER, true, 0);
  5252. }
  5253. unlock:
  5254. mutex_unlock(&chg->typec_lock);
  5255. return rc;
  5256. }
  5257. static void smblib_typec_role_check_work(struct work_struct *work)
  5258. {
  5259. struct smb_charger *chg = container_of(work, struct smb_charger,
  5260. role_reversal_check.work);
  5261. int rc = 0;
  5262. mutex_lock(&chg->typec_lock);
  5263. switch (chg->dr_mode) {
  5264. case TYPEC_PORT_SNK:
  5265. if (chg->typec_mode < QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) {
  5266. smblib_dbg(chg, PR_MISC, "Role reversal not latched to UFP in %d msecs. Resetting to DRP mode\n",
  5267. ROLE_REVERSAL_DELAY_MS);
  5268. rc = smblib_force_dr_mode(chg, TYPEC_PORT_DRP);
  5269. if (rc < 0)
  5270. smblib_err(chg, "Failed to set DRP mode, rc=%d\n",
  5271. rc);
  5272. } else {
  5273. chg->power_role = QTI_POWER_SUPPLY_TYPEC_PR_SINK;
  5274. typec_set_pwr_role(chg->typec_port, TYPEC_SINK);
  5275. typec_set_data_role(chg->typec_port, TYPEC_DEVICE);
  5276. smblib_dbg(chg, PR_MISC, "Role changed successfully to SINK");
  5277. }
  5278. break;
  5279. case TYPEC_PORT_SRC:
  5280. if (chg->typec_mode >= QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT
  5281. || chg->typec_mode == QTI_POWER_SUPPLY_TYPEC_NONE) {
  5282. smblib_dbg(chg, PR_MISC, "Role reversal not latched to DFP in %d msecs. Resetting to DRP mode\n",
  5283. ROLE_REVERSAL_DELAY_MS);
  5284. chg->pr_swap_in_progress = false;
  5285. chg->typec_role_swap_failed = true;
  5286. rc = smblib_force_dr_mode(chg, TYPEC_PORT_DRP);
  5287. if (rc < 0)
  5288. smblib_err(chg, "Failed to set DRP mode, rc=%d\n",
  5289. rc);
  5290. } else {
  5291. chg->power_role = QTI_POWER_SUPPLY_TYPEC_PR_SOURCE;
  5292. typec_set_pwr_role(chg->typec_port, TYPEC_SOURCE);
  5293. typec_set_data_role(chg->typec_port, TYPEC_HOST);
  5294. smblib_dbg(chg, PR_MISC, "Role changed successfully to SOURCE");
  5295. }
  5296. break;
  5297. default:
  5298. pr_debug("Already in DRP mode\n");
  5299. break;
  5300. }
  5301. chg->pr_swap_in_progress = false;
  5302. vote(chg->awake_votable, TYPEC_SWAP_VOTER, false, 0);
  5303. mutex_unlock(&chg->typec_lock);
  5304. }
  5305. static void typec_sink_removal(struct smb_charger *chg)
  5306. {
  5307. int rc;
  5308. typec_src_fault_condition_cfg(chg, false);
  5309. rc = smblib_set_charge_param(chg, &chg->param.freq_switcher,
  5310. chg->chg_freq.freq_removal);
  5311. if (rc < 0)
  5312. dev_err(chg->dev, "Error in setting freq_removal rc=%d\n", rc);
  5313. if (chg->use_extcon) {
  5314. if (chg->otg_present)
  5315. smblib_notify_usb_host(chg, false);
  5316. chg->otg_present = false;
  5317. }
  5318. }
  5319. static void typec_src_removal(struct smb_charger *chg)
  5320. {
  5321. int rc;
  5322. struct smb_irq_data *data;
  5323. struct storm_watch *wdata;
  5324. int sec_charger;
  5325. u8 val[2] = {0};
  5326. sec_charger = chg->sec_pl_present ? QTI_POWER_SUPPLY_CHARGER_SEC_PL :
  5327. QTI_POWER_SUPPLY_CHARGER_SEC_NONE;
  5328. rc = smblib_select_sec_charger(chg, sec_charger,
  5329. QTI_POWER_SUPPLY_CP_NONE, false);
  5330. if (rc < 0)
  5331. dev_err(chg->dev,
  5332. "Couldn't disable secondary charger rc=%d\n", rc);
  5333. chg->qc3p5_detected = false;
  5334. chg->qc3p5_detected_mw = 0;
  5335. typec_src_fault_condition_cfg(chg, false);
  5336. smblib_hvdcp_detect_try_enable(chg, false);
  5337. smblib_update_usb_type(chg);
  5338. if (chg->wa_flags & BOOST_BACK_WA) {
  5339. data = chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data;
  5340. if (data) {
  5341. wdata = &data->storm_data;
  5342. update_storm_count(wdata, WEAK_CHG_STORM_COUNT);
  5343. vote(chg->usb_icl_votable, BOOST_BACK_VOTER, false, 0);
  5344. vote(chg->usb_icl_votable, WEAK_CHARGER_VOTER,
  5345. false, 0);
  5346. }
  5347. }
  5348. cancel_delayed_work_sync(&chg->pl_enable_work);
  5349. /* reset input current limit voters */
  5350. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true,
  5351. is_flash_active(chg) ? SDP_CURRENT_UA : SDP_100_MA);
  5352. vote(chg->usb_icl_votable, PD_VOTER, false, 0);
  5353. vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
  5354. vote(chg->usb_icl_votable, DCP_VOTER, false, 0);
  5355. vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
  5356. vote(chg->usb_icl_votable, CTM_VOTER, false, 0);
  5357. vote(chg->usb_icl_votable, HVDCP2_ICL_VOTER, false, 0);
  5358. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
  5359. vote(chg->usb_icl_votable, THERMAL_THROTTLE_VOTER, false, 0);
  5360. vote(chg->usb_icl_votable, LPD_VOTER, false, 0);
  5361. /* reset usb irq voters */
  5362. vote(chg->limited_irq_disable_votable, CHARGER_TYPE_VOTER,
  5363. true, 0);
  5364. vote(chg->hdc_irq_disable_votable, CHARGER_TYPE_VOTER, true, 0);
  5365. vote(chg->hdc_irq_disable_votable, HDC_IRQ_VOTER, false, 0);
  5366. /* reset parallel voters */
  5367. vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0);
  5368. vote(chg->pl_disable_votable, PL_FCC_LOW_VOTER, false, 0);
  5369. vote(chg->pl_enable_votable_indirect, USBIN_I_VOTER, false, 0);
  5370. vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0);
  5371. vote(chg->awake_votable, PL_DELAY_VOTER, false, 0);
  5372. /* Remove SW thermal regulation WA votes */
  5373. vote(chg->usb_icl_votable, SW_THERM_REGULATION_VOTER, false, 0);
  5374. vote(chg->pl_disable_votable, SW_THERM_REGULATION_VOTER, false, 0);
  5375. vote(chg->dc_suspend_votable, SW_THERM_REGULATION_VOTER, false, 0);
  5376. if (chg->cp_disable_votable)
  5377. vote(chg->cp_disable_votable, SW_THERM_REGULATION_VOTER,
  5378. false, 0);
  5379. /* reset USBOV votes and cancel work */
  5380. cancel_delayed_work_sync(&chg->usbov_dbc_work);
  5381. vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0);
  5382. chg->dbc_usbov = false;
  5383. chg->pulse_cnt = 0;
  5384. chg->usb_icl_delta_ua = 0;
  5385. chg->voltage_min_uv = MICRO_5V;
  5386. chg->voltage_max_uv = MICRO_5V;
  5387. chg->usbin_forced_max_uv = 0;
  5388. chg->chg_param.forced_main_fcc = 0;
  5389. /* Reset all CC mode votes */
  5390. vote(chg->fcc_main_votable, MAIN_FCC_VOTER, false, 0);
  5391. chg->adapter_cc_mode = 0;
  5392. chg->thermal_overheat = 0;
  5393. vote_override(chg->fcc_votable, CC_MODE_VOTER, false, 0);
  5394. vote_override(chg->usb_icl_votable, CC_MODE_VOTER, false, 0);
  5395. vote(chg->cp_disable_votable, OVERHEAT_LIMIT_VOTER, false, 0);
  5396. vote(chg->usb_icl_votable, OVERHEAT_LIMIT_VOTER, false, 0);
  5397. /* write back the default FLOAT charger configuration */
  5398. rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
  5399. (u8)FLOAT_OPTIONS_MASK, chg->float_cfg);
  5400. if (rc < 0)
  5401. smblib_err(chg, "Couldn't write float charger options rc=%d\n",
  5402. rc);
  5403. if (chg->sdam_base) {
  5404. rc = smblib_write(chg,
  5405. chg->sdam_base + SDAM_QC_DET_STATUS_REG, 0);
  5406. if (rc < 0)
  5407. pr_err("Couldn't clear SDAM QC status rc=%d\n", rc);
  5408. rc = smblib_batch_write(chg,
  5409. chg->sdam_base + SDAM_QC_ADC_LSB_REG, val, 2);
  5410. if (rc < 0)
  5411. pr_err("Couldn't clear SDAM ADC status rc=%d\n", rc);
  5412. }
  5413. if (!chg->pr_swap_in_progress) {
  5414. rc = smblib_usb_pd_adapter_allowance_override(chg, FORCE_NULL);
  5415. if (rc < 0)
  5416. smblib_err(chg, "Couldn't set FORCE_NULL rc=%d\n", rc);
  5417. rc = smblib_set_charge_param(chg,
  5418. &chg->param.aicl_cont_threshold,
  5419. chg->default_aicl_cont_threshold_mv);
  5420. if (rc < 0)
  5421. smblib_err(chg, "Couldn't restore aicl_cont_threshold, rc=%d",
  5422. rc);
  5423. }
  5424. /*
  5425. * if non-compliant charger caused UV, restore original max pulses
  5426. * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on.
  5427. */
  5428. if (chg->qc2_unsupported_voltage) {
  5429. rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG,
  5430. HVDCP_PULSE_COUNT_MAX_QC2_MASK,
  5431. chg->qc2_max_pulses);
  5432. if (rc < 0)
  5433. smblib_err(chg, "Couldn't restore max pulses rc=%d\n",
  5434. rc);
  5435. if (!chg->disable_suspend_on_collapse) {
  5436. rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG,
  5437. SUSPEND_ON_COLLAPSE_USBIN_BIT,
  5438. SUSPEND_ON_COLLAPSE_USBIN_BIT);
  5439. if (rc < 0)
  5440. smblib_err(chg,
  5441. "Couldn't turn on SUSPEND_ON_COLLAPSE_USBIN_BIT rc=%d\n",
  5442. rc);
  5443. }
  5444. chg->qc2_unsupported_voltage = QC2_COMPLIANT;
  5445. }
  5446. if (chg->use_extcon)
  5447. smblib_notify_device_mode(chg, false);
  5448. chg->typec_legacy = false;
  5449. del_timer_sync(&chg->apsd_timer);
  5450. chg->apsd_ext_timeout = false;
  5451. }
  5452. static void typec_mode_unattached(struct smb_charger *chg)
  5453. {
  5454. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, USBIN_100MA);
  5455. }
  5456. static void smblib_handle_rp_change(struct smb_charger *chg, int typec_mode)
  5457. {
  5458. const struct apsd_result *apsd = smblib_get_apsd_result(chg);
  5459. /*
  5460. * We want the ICL vote @ 100mA for a FLOAT charger
  5461. * until the detection by the USB stack is complete.
  5462. * Ignore the Rp changes unless there is a
  5463. * pre-existing valid vote or FLOAT is configured for
  5464. * SDP current.
  5465. */
  5466. if (apsd->val == QTI_POWER_SUPPLY_TYPE_USB_FLOAT) {
  5467. if (get_client_vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER)
  5468. <= USBIN_100MA
  5469. || (chg->float_cfg & FLOAT_OPTIONS_MASK)
  5470. == FORCE_FLOAT_SDP_CFG_BIT)
  5471. return;
  5472. }
  5473. update_sw_icl_max(chg, apsd->val);
  5474. smblib_dbg(chg, PR_MISC, "CC change old_mode=%d new_mode=%d\n",
  5475. chg->typec_mode, typec_mode);
  5476. }
  5477. static void smblib_lpd_launch_ra_open_work(struct smb_charger *chg)
  5478. {
  5479. u8 stat;
  5480. int rc;
  5481. if (chg->lpd_disabled)
  5482. return;
  5483. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  5484. if (rc < 0) {
  5485. smblib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
  5486. rc);
  5487. return;
  5488. }
  5489. if (!(stat & TYPEC_TCCDEBOUNCE_DONE_STATUS_BIT)
  5490. && chg->lpd_stage == LPD_STAGE_NONE) {
  5491. chg->lpd_stage = LPD_STAGE_FLOAT;
  5492. cancel_delayed_work_sync(&chg->lpd_ra_open_work);
  5493. vote(chg->awake_votable, LPD_VOTER, true, 0);
  5494. schedule_delayed_work(&chg->lpd_ra_open_work,
  5495. msecs_to_jiffies(300));
  5496. }
  5497. }
  5498. irqreturn_t smb5_typec_or_rid_detection_change_irq_handler(int irq, void *data)
  5499. {
  5500. struct smb_irq_data *irq_data = data;
  5501. struct smb_charger *chg = irq_data->parent_data;
  5502. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  5503. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) {
  5504. if (chg->uusb_moisture_protection_enabled) {
  5505. /*
  5506. * Adding pm_stay_awake as because pm_relax is called
  5507. * on exit path from the work routine.
  5508. */
  5509. pm_stay_awake(chg->dev);
  5510. schedule_work(&chg->moisture_protection_work);
  5511. }
  5512. cancel_delayed_work_sync(&chg->uusb_otg_work);
  5513. /*
  5514. * Skip OTG enablement if RID interrupt triggers with moisture
  5515. * protection still enabled.
  5516. */
  5517. if (!chg->moisture_present) {
  5518. vote(chg->awake_votable, OTG_DELAY_VOTER, true, 0);
  5519. smblib_dbg(chg, PR_INTERRUPT, "Scheduling OTG work\n");
  5520. schedule_delayed_work(&chg->uusb_otg_work,
  5521. msecs_to_jiffies(chg->otg_delay_ms));
  5522. }
  5523. goto out;
  5524. }
  5525. if (chg->pr_swap_in_progress || chg->pd_hard_reset)
  5526. goto out;
  5527. smblib_lpd_launch_ra_open_work(chg);
  5528. if (chg->usb_psy)
  5529. power_supply_changed(chg->usb_psy);
  5530. out:
  5531. return IRQ_HANDLED;
  5532. }
  5533. irqreturn_t smb5_typec_state_change_irq_handler(int irq, void *data)
  5534. {
  5535. struct smb_irq_data *irq_data = data;
  5536. struct smb_charger *chg = irq_data->parent_data;
  5537. int typec_mode;
  5538. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) {
  5539. smblib_dbg(chg, PR_INTERRUPT,
  5540. "Ignoring for micro USB\n");
  5541. return IRQ_HANDLED;
  5542. }
  5543. typec_mode = smblib_get_prop_typec_mode(chg);
  5544. if (chg->sink_src_mode != UNATTACHED_MODE
  5545. && (typec_mode != chg->typec_mode))
  5546. smblib_handle_rp_change(chg, typec_mode);
  5547. chg->typec_mode = typec_mode;
  5548. smblib_dbg(chg, PR_INTERRUPT, "IRQ: cc-state-change; Type-C %s detected\n",
  5549. smblib_typec_mode_name[chg->typec_mode]);
  5550. power_supply_changed(chg->usb_psy);
  5551. return IRQ_HANDLED;
  5552. }
  5553. static void smblib_lpd_clear_ra_open_work(struct smb_charger *chg)
  5554. {
  5555. if (chg->lpd_disabled)
  5556. return;
  5557. cancel_delayed_work_sync(&chg->lpd_detach_work);
  5558. chg->lpd_stage = LPD_STAGE_FLOAT_CANCEL;
  5559. cancel_delayed_work_sync(&chg->lpd_ra_open_work);
  5560. vote(chg->awake_votable, LPD_VOTER, false, 0);
  5561. }
  5562. #define TYPEC_DETACH_DETECT_DELAY_MS 2000
  5563. irqreturn_t smb5_typec_attach_detach_irq_handler(int irq, void *data)
  5564. {
  5565. struct smb_irq_data *irq_data = data;
  5566. struct smb_charger *chg = irq_data->parent_data;
  5567. u8 stat;
  5568. bool attached = false;
  5569. int rc;
  5570. /* IRQ not expected to be executed for uUSB, return */
  5571. if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB)
  5572. return IRQ_HANDLED;
  5573. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  5574. rc = smblib_read(chg, TYPE_C_STATE_MACHINE_STATUS_REG, &stat);
  5575. if (rc < 0) {
  5576. smblib_err(chg, "Couldn't read TYPE_C_STATE_MACHINE_STATUS_REG rc=%d\n",
  5577. rc);
  5578. return IRQ_HANDLED;
  5579. }
  5580. attached = !!(stat & TYPEC_ATTACH_DETACH_STATE_BIT);
  5581. if (attached) {
  5582. smblib_lpd_clear_ra_open_work(chg);
  5583. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  5584. if (rc < 0) {
  5585. smblib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
  5586. rc);
  5587. return IRQ_HANDLED;
  5588. }
  5589. if (smblib_get_prop_dfp_mode(chg) ==
  5590. QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER) {
  5591. chg->sink_src_mode = AUDIO_ACCESS_MODE;
  5592. typec_ra_ra_insertion(chg);
  5593. } else if (stat & SNK_SRC_MODE_BIT) {
  5594. if (smblib_src_lpd(chg))
  5595. return IRQ_HANDLED;
  5596. chg->sink_src_mode = SRC_MODE;
  5597. typec_sink_insertion(chg);
  5598. } else {
  5599. chg->sink_src_mode = SINK_MODE;
  5600. typec_src_insertion(chg);
  5601. }
  5602. rc = typec_partner_register(chg);
  5603. if (rc < 0)
  5604. smblib_err(chg, "failed to register partner rc =%d\n",
  5605. rc);
  5606. } else {
  5607. switch (chg->sink_src_mode) {
  5608. case SRC_MODE:
  5609. typec_sink_removal(chg);
  5610. break;
  5611. case SINK_MODE:
  5612. case AUDIO_ACCESS_MODE:
  5613. typec_src_removal(chg);
  5614. break;
  5615. case UNATTACHED_MODE:
  5616. default:
  5617. typec_mode_unattached(chg);
  5618. break;
  5619. }
  5620. if (!chg->pr_swap_in_progress) {
  5621. chg->ok_to_pd = false;
  5622. chg->sink_src_mode = UNATTACHED_MODE;
  5623. chg->early_usb_attach = false;
  5624. smblib_apsd_enable(chg, true);
  5625. }
  5626. /*
  5627. * Restore DRP mode on type-C cable disconnect if role
  5628. * swap is not in progress, to ensure forced sink or src
  5629. * mode configuration is reset properly.
  5630. */
  5631. mutex_lock(&chg->typec_lock);
  5632. if (chg->typec_port && !chg->pr_swap_in_progress) {
  5633. /*
  5634. * Schedule the work to differentiate actual removal
  5635. * of cable and detach interrupt during role swap,
  5636. * unregister the partner only during actual cable
  5637. * removal.
  5638. */
  5639. cancel_delayed_work(&chg->pr_swap_detach_work);
  5640. vote(chg->awake_votable, DETACH_DETECT_VOTER, true, 0);
  5641. schedule_delayed_work(&chg->pr_swap_detach_work,
  5642. msecs_to_jiffies(TYPEC_DETACH_DETECT_DELAY_MS));
  5643. smblib_force_dr_mode(chg, TYPEC_PORT_DRP);
  5644. /*
  5645. * To handle cable removal during role
  5646. * swap failure.
  5647. */
  5648. chg->typec_role_swap_failed = false;
  5649. }
  5650. mutex_unlock(&chg->typec_lock);
  5651. if (chg->lpd_stage == LPD_STAGE_FLOAT_CANCEL)
  5652. schedule_delayed_work(&chg->lpd_detach_work,
  5653. msecs_to_jiffies(1000));
  5654. }
  5655. rc = smblib_masked_write(chg, USB_CMD_PULLDOWN_REG,
  5656. EN_PULLDOWN_USB_IN_BIT,
  5657. attached ? 0 : EN_PULLDOWN_USB_IN_BIT);
  5658. if (rc < 0)
  5659. smblib_err(chg, "Couldn't configure pulldown on USB_IN rc=%d\n",
  5660. rc);
  5661. power_supply_changed(chg->usb_psy);
  5662. return IRQ_HANDLED;
  5663. }
  5664. static void dcin_aicl(struct smb_charger *chg)
  5665. {
  5666. int rc, icl, icl_save;
  5667. int input_present;
  5668. bool aicl_done = true;
  5669. /*
  5670. * Hold awake votable to prevent pm_relax being called prior to
  5671. * completion of this work.
  5672. */
  5673. vote(chg->awake_votable, DCIN_AICL_VOTER, true, 0);
  5674. increment:
  5675. mutex_lock(&chg->dcin_aicl_lock);
  5676. rc = smblib_get_charge_param(chg, &chg->param.dc_icl, &icl);
  5677. if (rc < 0)
  5678. goto err;
  5679. if (icl == chg->wls_icl_ua) {
  5680. /* Upper limit reached; do nothing */
  5681. smblib_dbg(chg, PR_WLS, "hit max ICL: stop\n");
  5682. rc = smblib_is_input_present(chg, &input_present);
  5683. if (rc < 0 || !(input_present & INPUT_PRESENT_DC))
  5684. aicl_done = false;
  5685. goto unlock;
  5686. }
  5687. icl = min(chg->wls_icl_ua, icl + DCIN_ICL_STEP_UA);
  5688. icl_save = icl;
  5689. rc = smblib_set_charge_param(chg, &chg->param.dc_icl, icl);
  5690. if (rc < 0)
  5691. goto err;
  5692. mutex_unlock(&chg->dcin_aicl_lock);
  5693. smblib_dbg(chg, PR_WLS, "icl: %d mA\n", (icl / 1000));
  5694. /* Check to see if DC is still present before and after sleep */
  5695. rc = smblib_is_input_present(chg, &input_present);
  5696. if (rc < 0 || !(input_present & INPUT_PRESENT_DC)) {
  5697. aicl_done = false;
  5698. goto unvote;
  5699. }
  5700. /*
  5701. * Wait awhile to check for any DCIN_UVs (the UV handler reduces the
  5702. * ICL). If the adaptor collapses, the ICL read after waking up will be
  5703. * lesser, indicating that the AICL process is complete.
  5704. */
  5705. msleep(500);
  5706. rc = smblib_is_input_present(chg, &input_present);
  5707. if (rc < 0 || !(input_present & INPUT_PRESENT_DC)) {
  5708. aicl_done = false;
  5709. goto unvote;
  5710. }
  5711. mutex_lock(&chg->dcin_aicl_lock);
  5712. rc = smblib_get_charge_param(chg, &chg->param.dc_icl, &icl);
  5713. if (rc < 0)
  5714. goto err;
  5715. if (icl < icl_save) {
  5716. smblib_dbg(chg, PR_WLS, "done: icl: %d mA\n", (icl / 1000));
  5717. goto unlock;
  5718. }
  5719. mutex_unlock(&chg->dcin_aicl_lock);
  5720. goto increment;
  5721. err:
  5722. aicl_done = false;
  5723. unlock:
  5724. mutex_unlock(&chg->dcin_aicl_lock);
  5725. unvote:
  5726. vote(chg->awake_votable, DCIN_AICL_VOTER, false, 0);
  5727. chg->dcin_aicl_done = aicl_done;
  5728. }
  5729. static void dcin_aicl_work(struct work_struct *work)
  5730. {
  5731. struct smb_charger *chg = container_of(work, struct smb_charger,
  5732. dcin_aicl_work);
  5733. dcin_aicl(chg);
  5734. }
  5735. static enum alarmtimer_restart dcin_aicl_alarm_cb(struct alarm *alarm,
  5736. ktime_t now)
  5737. {
  5738. struct smb_charger *chg = container_of(alarm, struct smb_charger,
  5739. dcin_aicl_alarm);
  5740. smblib_dbg(chg, PR_WLS, "rerunning DCIN AICL\n");
  5741. pm_stay_awake(chg->dev);
  5742. schedule_work(&chg->dcin_aicl_work);
  5743. return ALARMTIMER_NORESTART;
  5744. }
  5745. static void dcin_icl_decrement(struct smb_charger *chg)
  5746. {
  5747. int rc, icl;
  5748. ktime_t now = ktime_get();
  5749. rc = smblib_get_charge_param(chg, &chg->param.dc_icl, &icl);
  5750. if (rc < 0) {
  5751. smblib_err(chg, "reading DCIN ICL failed: %d\n", rc);
  5752. return;
  5753. }
  5754. if (icl == DCIN_ICL_MIN_UA) {
  5755. /* Cannot possibly decrease ICL any further - do nothing */
  5756. smblib_dbg(chg, PR_WLS, "hit min ICL: stop\n");
  5757. return;
  5758. }
  5759. /* Reduce ICL by 100 mA if 3 UVs happen in a row */
  5760. if (ktime_us_delta(now, chg->dcin_uv_last_time) > (200 * 1000)) {
  5761. chg->dcin_uv_count = 0;
  5762. } else if (chg->dcin_uv_count >= 3) {
  5763. icl -= DCIN_ICL_STEP_UA;
  5764. smblib_dbg(chg, PR_WLS, "icl: %d mA\n", (icl / 1000));
  5765. rc = smblib_set_charge_param(chg, &chg->param.dc_icl, icl);
  5766. if (rc < 0) {
  5767. smblib_err(chg, "setting DCIN ICL failed: %d\n", rc);
  5768. return;
  5769. }
  5770. chg->dcin_uv_count = 0;
  5771. }
  5772. chg->dcin_uv_last_time = now;
  5773. }
  5774. irqreturn_t smb5_dcin_uv_irq_handler(int irq, void *data)
  5775. {
  5776. struct smb_irq_data *irq_data = data;
  5777. struct smb_charger *chg = irq_data->parent_data;
  5778. mutex_lock(&chg->dcin_aicl_lock);
  5779. chg->dcin_uv_count++;
  5780. smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "DCIN UV count: %d\n",
  5781. chg->dcin_uv_count);
  5782. dcin_icl_decrement(chg);
  5783. mutex_unlock(&chg->dcin_aicl_lock);
  5784. return IRQ_HANDLED;
  5785. }
  5786. irqreturn_t smb5_dc_plugin_irq_handler(int irq, void *data)
  5787. {
  5788. struct smb_irq_data *irq_data = data;
  5789. struct smb_charger *chg = irq_data->parent_data;
  5790. union power_supply_propval pval;
  5791. int input_present;
  5792. bool dcin_present, vbus_present;
  5793. int rc, wireless_vout = 0, wls_set = 0;
  5794. int sec_charger, val;
  5795. rc = smblib_get_prop_vph_voltage_now(chg, &val);
  5796. if (rc < 0)
  5797. return IRQ_HANDLED;
  5798. /* 2*VPH, with a granularity of 100mV */
  5799. wireless_vout = ((val * 2) / 100000) * 100000;
  5800. rc = smblib_is_input_present(chg, &input_present);
  5801. if (rc < 0)
  5802. return IRQ_HANDLED;
  5803. dcin_present = input_present & INPUT_PRESENT_DC;
  5804. vbus_present = input_present & INPUT_PRESENT_USB;
  5805. if (!chg->cp_ilim_votable)
  5806. chg->cp_ilim_votable = find_votable("CP_ILIM");
  5807. if (dcin_present && !vbus_present) {
  5808. cancel_work_sync(&chg->dcin_aicl_work);
  5809. /* Reset DCIN ICL to 100 mA */
  5810. mutex_lock(&chg->dcin_aicl_lock);
  5811. rc = smblib_set_charge_param(chg, &chg->param.dc_icl,
  5812. DCIN_ICL_MIN_UA);
  5813. mutex_unlock(&chg->dcin_aicl_lock);
  5814. if (rc < 0)
  5815. return IRQ_HANDLED;
  5816. smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "reset: icl: 100 mA\n");
  5817. /*
  5818. * Remove USB's CP ILIM vote - inapplicable for wireless
  5819. * parallel charging.
  5820. */
  5821. if (chg->cp_ilim_votable)
  5822. vote(chg->cp_ilim_votable, ICL_CHANGE_VOTER, false, 0);
  5823. if (chg->sec_cp_present) {
  5824. /*
  5825. * If CP output topology is VBATT, limit main charger's
  5826. * FCC share and let the CPs handle the rest.
  5827. */
  5828. if (is_cp_topo_vbatt(chg))
  5829. vote(chg->fcc_main_votable,
  5830. WLS_PL_CHARGING_VOTER, true, 800000);
  5831. rc = smblib_get_prop_batt_status(chg, &pval);
  5832. if (rc < 0)
  5833. smblib_err(chg, "Couldn't read batt status rc=%d\n",
  5834. rc);
  5835. wls_set = (pval.intval == POWER_SUPPLY_STATUS_FULL) ?
  5836. MICRO_5V : wireless_vout;
  5837. pval.intval = wls_set;
  5838. rc = smblib_set_prop_voltage_wls_output(chg, &pval);
  5839. if (rc < 0)
  5840. dev_err(chg->dev, "Couldn't set dc voltage to 2*vph rc=%d\n",
  5841. rc);
  5842. rc = smblib_select_sec_charger(chg,
  5843. QTI_POWER_SUPPLY_CHARGER_SEC_CP,
  5844. QTI_POWER_SUPPLY_CP_WIRELESS, false);
  5845. if (rc < 0)
  5846. dev_err(chg->dev, "Couldn't enable secondary chargers rc=%d\n",
  5847. rc);
  5848. } else {
  5849. /*
  5850. * If no secondary charger is present, commence
  5851. * wireless charging at 5 V by default.
  5852. */
  5853. pval.intval = 5000000;
  5854. rc = smblib_set_prop_voltage_wls_output(chg, &pval);
  5855. if (rc < 0)
  5856. dev_err(chg->dev, "Couldn't set dc voltage to 5 V rc=%d\n",
  5857. rc);
  5858. }
  5859. schedule_work(&chg->dcin_aicl_work);
  5860. } else {
  5861. if (chg->cp_reason == QTI_POWER_SUPPLY_CP_WIRELESS) {
  5862. sec_charger = chg->sec_pl_present ?
  5863. QTI_POWER_SUPPLY_CHARGER_SEC_PL :
  5864. QTI_POWER_SUPPLY_CHARGER_SEC_NONE;
  5865. rc = smblib_select_sec_charger(chg, sec_charger,
  5866. QTI_POWER_SUPPLY_CP_NONE, false);
  5867. if (rc < 0)
  5868. dev_err(chg->dev, "Couldn't disable secondary charger rc=%d\n",
  5869. rc);
  5870. }
  5871. vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0);
  5872. vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, false, 0);
  5873. chg->last_wls_vout = 0;
  5874. chg->dcin_aicl_done = false;
  5875. chg->dcin_icl_user_set = false;
  5876. }
  5877. /*
  5878. * Vote for 1500mA FCC upon WLS detach and remove vote upon attach if
  5879. * FCC stepper is enabled.
  5880. */
  5881. if (chg->fcc_stepper_enable && !vbus_present)
  5882. vote(chg->fcc_votable, FCC_STEPPER_VOTER, !dcin_present,
  5883. dcin_present ? 0 : 1500000);
  5884. if (chg->dc_psy)
  5885. power_supply_changed(chg->dc_psy);
  5886. smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "dcin_present= %d, usbin_present= %d, cp_reason = %d\n",
  5887. dcin_present, vbus_present, chg->cp_reason);
  5888. return IRQ_HANDLED;
  5889. }
  5890. irqreturn_t smb5_high_duty_cycle_irq_handler(int irq, void *data)
  5891. {
  5892. struct smb_irq_data *irq_data = data;
  5893. struct smb_charger *chg = irq_data->parent_data;
  5894. chg->is_hdc = true;
  5895. /*
  5896. * Disable usb IRQs after the flag set and re-enable IRQs after
  5897. * the flag cleared in the delayed work queue, to avoid any IRQ
  5898. * storming during the delays
  5899. */
  5900. vote(chg->hdc_irq_disable_votable, HDC_IRQ_VOTER, true, 0);
  5901. schedule_delayed_work(&chg->clear_hdc_work, msecs_to_jiffies(60));
  5902. return IRQ_HANDLED;
  5903. }
  5904. static void smblib_bb_removal_work(struct work_struct *work)
  5905. {
  5906. struct smb_charger *chg = container_of(work, struct smb_charger,
  5907. bb_removal_work.work);
  5908. vote(chg->usb_icl_votable, BOOST_BACK_VOTER, false, 0);
  5909. vote(chg->awake_votable, BOOST_BACK_VOTER, false, 0);
  5910. }
  5911. #define BOOST_BACK_UNVOTE_DELAY_MS 750
  5912. #define BOOST_BACK_STORM_COUNT 3
  5913. #define WEAK_CHG_STORM_COUNT 8
  5914. irqreturn_t smb5_switcher_power_ok_irq_handler(int irq, void *data)
  5915. {
  5916. struct smb_irq_data *irq_data = data;
  5917. struct smb_charger *chg = irq_data->parent_data;
  5918. struct storm_watch *wdata = &irq_data->storm_data;
  5919. int rc, usb_icl;
  5920. u8 stat;
  5921. if (!(chg->wa_flags & BOOST_BACK_WA))
  5922. return IRQ_HANDLED;
  5923. rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
  5924. if (rc < 0) {
  5925. smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n", rc);
  5926. return IRQ_HANDLED;
  5927. }
  5928. /* skip suspending input if its already suspended by some other voter */
  5929. usb_icl = get_effective_result(chg->usb_icl_votable);
  5930. if ((stat & USE_USBIN_BIT) && usb_icl >= 0 && usb_icl <= USBIN_25MA)
  5931. return IRQ_HANDLED;
  5932. if (stat & USE_DCIN_BIT)
  5933. return IRQ_HANDLED;
  5934. if (is_storming(&irq_data->storm_data)) {
  5935. /* This could be a weak charger reduce ICL */
  5936. if (!is_client_vote_enabled(chg->usb_icl_votable,
  5937. WEAK_CHARGER_VOTER)) {
  5938. smblib_err(chg,
  5939. "Weak charger detected: voting %dmA ICL\n",
  5940. chg->weak_chg_icl_ua / 1000);
  5941. vote(chg->usb_icl_votable, WEAK_CHARGER_VOTER,
  5942. true, chg->weak_chg_icl_ua);
  5943. /*
  5944. * reset storm data and set the storm threshold
  5945. * to 3 for reverse boost detection.
  5946. */
  5947. update_storm_count(wdata, BOOST_BACK_STORM_COUNT);
  5948. } else {
  5949. smblib_err(chg,
  5950. "Reverse boost detected: voting 0mA to suspend input\n");
  5951. vote(chg->usb_icl_votable, BOOST_BACK_VOTER, true, 0);
  5952. vote(chg->awake_votable, BOOST_BACK_VOTER, true, 0);
  5953. /*
  5954. * Remove the boost-back vote after a delay, to avoid
  5955. * permanently suspending the input if the boost-back
  5956. * condition is unintentionally hit.
  5957. */
  5958. schedule_delayed_work(&chg->bb_removal_work,
  5959. msecs_to_jiffies(BOOST_BACK_UNVOTE_DELAY_MS));
  5960. }
  5961. }
  5962. return IRQ_HANDLED;
  5963. }
  5964. irqreturn_t smb5_wdog_snarl_irq_handler(int irq, void *data)
  5965. {
  5966. struct smb_irq_data *irq_data = data;
  5967. struct smb_charger *chg = irq_data->parent_data;
  5968. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  5969. if (chg->wa_flags & SW_THERM_REGULATION_WA) {
  5970. cancel_delayed_work_sync(&chg->thermal_regulation_work);
  5971. vote(chg->awake_votable, SW_THERM_REGULATION_VOTER, true, 0);
  5972. schedule_delayed_work(&chg->thermal_regulation_work, 0);
  5973. }
  5974. power_supply_changed(chg->batt_psy);
  5975. return IRQ_HANDLED;
  5976. }
  5977. irqreturn_t smb5_wdog_bark_irq_handler(int irq, void *data)
  5978. {
  5979. struct smb_irq_data *irq_data = data;
  5980. struct smb_charger *chg = irq_data->parent_data;
  5981. int rc;
  5982. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  5983. rc = smblib_write(chg, BARK_BITE_WDOG_PET_REG, BARK_BITE_WDOG_PET_BIT);
  5984. if (rc < 0)
  5985. smblib_err(chg, "Couldn't pet the dog rc=%d\n", rc);
  5986. return IRQ_HANDLED;
  5987. }
  5988. static void smblib_die_rst_icl_regulate(struct smb_charger *chg)
  5989. {
  5990. int rc;
  5991. u8 temp;
  5992. rc = smblib_read(chg, DIE_TEMP_STATUS_REG, &temp);
  5993. if (rc < 0) {
  5994. smblib_err(chg, "Couldn't read DIE_TEMP_STATUS_REG rc=%d\n",
  5995. rc);
  5996. return;
  5997. }
  5998. /* Regulate ICL on die temp crossing DIE_RST threshold */
  5999. vote(chg->usb_icl_votable, DIE_TEMP_VOTER,
  6000. temp & DIE_TEMP_RST_BIT, 500000);
  6001. }
  6002. /*
  6003. * triggered when DIE or SKIN or CONNECTOR temperature across
  6004. * either of the _REG_L, _REG_H, _RST, or _SHDN thresholds
  6005. */
  6006. irqreturn_t smb5_temp_change_irq_handler(int irq, void *data)
  6007. {
  6008. struct smb_irq_data *irq_data = data;
  6009. struct smb_charger *chg = irq_data->parent_data;
  6010. smblib_die_rst_icl_regulate(chg);
  6011. return IRQ_HANDLED;
  6012. }
  6013. static void smblib_usbov_dbc_work(struct work_struct *work)
  6014. {
  6015. struct smb_charger *chg = container_of(work, struct smb_charger,
  6016. usbov_dbc_work.work);
  6017. smblib_dbg(chg, PR_MISC, "Resetting USBOV debounce\n");
  6018. chg->dbc_usbov = false;
  6019. vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0);
  6020. }
  6021. #define USB_OV_DBC_PERIOD_MS 1000
  6022. irqreturn_t smb5_usbin_ov_irq_handler(int irq, void *data)
  6023. {
  6024. struct smb_irq_data *irq_data = data;
  6025. struct smb_charger *chg = irq_data->parent_data;
  6026. u8 stat;
  6027. int rc;
  6028. smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
  6029. if (!(chg->wa_flags & USBIN_OV_WA))
  6030. return IRQ_HANDLED;
  6031. rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
  6032. if (rc < 0) {
  6033. smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
  6034. return IRQ_HANDLED;
  6035. }
  6036. /*
  6037. * On specific PMICs, OV IRQ triggers for very small duration in
  6038. * interim periods affecting charging status reflection. In order to
  6039. * differentiate between OV IRQ glitch and real OV_IRQ, add a debounce
  6040. * period for evaluation.
  6041. */
  6042. if (stat & USBIN_OV_RT_STS_BIT) {
  6043. chg->dbc_usbov = true;
  6044. vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0);
  6045. schedule_delayed_work(&chg->usbov_dbc_work,
  6046. msecs_to_jiffies(USB_OV_DBC_PERIOD_MS));
  6047. } else {
  6048. cancel_delayed_work_sync(&chg->usbov_dbc_work);
  6049. chg->dbc_usbov = false;
  6050. vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0);
  6051. }
  6052. smblib_dbg(chg, PR_MISC, "USBOV debounce status %d\n",
  6053. chg->dbc_usbov);
  6054. return IRQ_HANDLED;
  6055. }
  6056. /**************
  6057. * Additional USB PSY getters/setters
  6058. * that call interrupt functions
  6059. ***************/
  6060. int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg,
  6061. int *val)
  6062. {
  6063. *val = chg->pr_swap_in_progress;
  6064. return 0;
  6065. }
  6066. #define DETACH_DETECT_DELAY_MS 20
  6067. int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg,
  6068. int val)
  6069. {
  6070. int rc;
  6071. u8 stat = 0, orientation;
  6072. smblib_dbg(chg, PR_MISC, "Requested PR_SWAP %d\n", val);
  6073. chg->pr_swap_in_progress = val;
  6074. /* check for cable removal during pr_swap */
  6075. if (!chg->pr_swap_in_progress) {
  6076. cancel_delayed_work_sync(&chg->pr_swap_detach_work);
  6077. vote(chg->awake_votable, DETACH_DETECT_VOTER, true, 0);
  6078. schedule_delayed_work(&chg->pr_swap_detach_work,
  6079. msecs_to_jiffies(DETACH_DETECT_DELAY_MS));
  6080. }
  6081. rc = smblib_masked_write(chg, TYPE_C_DEBOUNCE_OPTION_REG,
  6082. REDUCE_TCCDEBOUNCE_TO_2MS_BIT,
  6083. val ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0);
  6084. if (rc < 0)
  6085. smblib_err(chg, "Couldn't set tCC debounce rc=%d\n", rc);
  6086. rc = smblib_masked_write(chg, TYPE_C_EXIT_STATE_CFG_REG,
  6087. BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT,
  6088. val ? BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT : 0);
  6089. if (rc < 0)
  6090. smblib_err(chg, "Couldn't set exit state cfg rc=%d\n", rc);
  6091. if (chg->pr_swap_in_progress) {
  6092. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  6093. if (rc < 0) {
  6094. smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n",
  6095. rc);
  6096. }
  6097. orientation =
  6098. stat & CC_ORIENTATION_BIT ? TYPEC_CCOUT_VALUE_BIT : 0;
  6099. rc = smblib_masked_write(chg, TYPE_C_CCOUT_CONTROL_REG,
  6100. TYPEC_CCOUT_SRC_BIT | TYPEC_CCOUT_BUFFER_EN_BIT
  6101. | TYPEC_CCOUT_VALUE_BIT,
  6102. TYPEC_CCOUT_SRC_BIT | TYPEC_CCOUT_BUFFER_EN_BIT
  6103. | orientation);
  6104. if (rc < 0) {
  6105. smblib_err(chg, "Couldn't read TYPE_C_CCOUT_CONTROL_REG rc=%d\n",
  6106. rc);
  6107. }
  6108. } else {
  6109. rc = smblib_masked_write(chg, TYPE_C_CCOUT_CONTROL_REG,
  6110. TYPEC_CCOUT_SRC_BIT, 0);
  6111. if (rc < 0) {
  6112. smblib_err(chg, "Couldn't read TYPE_C_CCOUT_CONTROL_REG rc=%d\n",
  6113. rc);
  6114. return rc;
  6115. }
  6116. /* enable DRP */
  6117. rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
  6118. TYPEC_POWER_ROLE_CMD_MASK, 0);
  6119. if (rc < 0) {
  6120. smblib_err(chg, "Couldn't enable DRP rc=%d\n", rc);
  6121. return rc;
  6122. }
  6123. chg->power_role = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  6124. smblib_dbg(chg, PR_MISC, "restore power role: %d\n",
  6125. chg->power_role);
  6126. }
  6127. return 0;
  6128. }
  6129. /***************
  6130. * Work Queues *
  6131. ***************/
  6132. static void smblib_pr_lock_clear_work(struct work_struct *work)
  6133. {
  6134. struct smb_charger *chg = container_of(work, struct smb_charger,
  6135. pr_lock_clear_work.work);
  6136. spin_lock(&chg->typec_pr_lock);
  6137. if (chg->pr_lock_in_progress) {
  6138. smblib_dbg(chg, PR_MISC, "restore type-c interrupts\n");
  6139. smblib_typec_irq_config(chg, true);
  6140. chg->pr_lock_in_progress = false;
  6141. }
  6142. spin_unlock(&chg->typec_pr_lock);
  6143. }
  6144. static void smblib_pr_swap_detach_work(struct work_struct *work)
  6145. {
  6146. struct smb_charger *chg = container_of(work, struct smb_charger,
  6147. pr_swap_detach_work.work);
  6148. int rc;
  6149. u8 stat;
  6150. rc = smblib_read(chg, TYPE_C_STATE_MACHINE_STATUS_REG, &stat);
  6151. if (rc < 0) {
  6152. smblib_err(chg, "Couldn't read STATE_MACHINE_STS rc=%d\n", rc);
  6153. goto out;
  6154. }
  6155. smblib_dbg(chg, PR_REGISTER, "STATE_MACHINE_STS %x\n", stat);
  6156. if (!(stat & TYPEC_ATTACH_DETACH_STATE_BIT)) {
  6157. rc = smblib_request_dpdm(chg, false);
  6158. if (rc < 0)
  6159. smblib_err(chg, "Couldn't disable DPDM rc=%d\n", rc);
  6160. if (chg->typec_port)
  6161. typec_partner_unregister(chg);
  6162. }
  6163. out:
  6164. vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0);
  6165. }
  6166. static void smblib_uusb_otg_work(struct work_struct *work)
  6167. {
  6168. struct smb_charger *chg = container_of(work, struct smb_charger,
  6169. uusb_otg_work.work);
  6170. int rc;
  6171. u8 stat;
  6172. bool otg;
  6173. rc = smblib_read(chg, TYPEC_U_USB_STATUS_REG, &stat);
  6174. if (rc < 0) {
  6175. smblib_err(chg, "Couldn't read TYPE_C_STATUS_3 rc=%d\n", rc);
  6176. goto out;
  6177. }
  6178. otg = !!(stat & U_USB_GROUND_NOVBUS_BIT);
  6179. if (chg->otg_present != otg) {
  6180. if (otg) {
  6181. /* otg cable inserted */
  6182. if (chg->typec_port) {
  6183. typec_partner_register(chg);
  6184. typec_set_data_role(chg->typec_port,
  6185. TYPEC_HOST);
  6186. typec_set_pwr_role(chg->typec_port,
  6187. TYPEC_SOURCE);
  6188. }
  6189. } else if (chg->typec_port) {
  6190. /* otg cable removed */
  6191. typec_set_data_role(chg->typec_port, TYPEC_DEVICE);
  6192. typec_set_pwr_role(chg->typec_port, TYPEC_SINK);
  6193. typec_partner_unregister(chg);
  6194. }
  6195. smblib_notify_usb_host(chg, otg);
  6196. } else {
  6197. goto out;
  6198. }
  6199. chg->otg_present = otg;
  6200. if (!otg)
  6201. chg->boost_current_ua = 0;
  6202. rc = smblib_set_charge_param(chg, &chg->param.freq_switcher,
  6203. otg ? chg->chg_freq.freq_below_otg_threshold
  6204. : chg->chg_freq.freq_removal);
  6205. if (rc < 0)
  6206. dev_err(chg->dev, "Error in setting freq_boost rc=%d\n", rc);
  6207. smblib_dbg(chg, PR_REGISTER, "TYPE_C_U_USB_STATUS = 0x%02x OTG=%d\n",
  6208. stat, otg);
  6209. power_supply_changed(chg->usb_psy);
  6210. out:
  6211. vote(chg->awake_votable, OTG_DELAY_VOTER, false, 0);
  6212. }
  6213. static void bms_update_work(struct work_struct *work)
  6214. {
  6215. struct smb_charger *chg = container_of(work, struct smb_charger,
  6216. bms_update_work);
  6217. struct iio_channel **qg_list;
  6218. int rc;
  6219. if (IS_ERR(chg->iio_chan_list_qg))
  6220. return;
  6221. if (!chg->iio_chan_list_qg) {
  6222. qg_list = get_ext_channels(chg->dev,
  6223. smblib_qg_ext_iio_chan,
  6224. ARRAY_SIZE(smblib_qg_ext_iio_chan));
  6225. if (IS_ERR(qg_list)) {
  6226. rc = PTR_ERR(qg_list);
  6227. if (rc != -EPROBE_DEFER) {
  6228. dev_err(chg->dev, "Failed to get channels, %d\n",
  6229. rc);
  6230. chg->iio_chan_list_qg = ERR_PTR(-EINVAL);
  6231. }
  6232. return;
  6233. }
  6234. chg->iio_chan_list_qg = qg_list;
  6235. }
  6236. smblib_config_charger_on_debug_battery(chg);
  6237. if (chg->batt_psy)
  6238. power_supply_changed(chg->batt_psy);
  6239. }
  6240. static void pl_update_work(struct work_struct *work)
  6241. {
  6242. int val, rc;
  6243. struct smb_charger *chg = container_of(work, struct smb_charger,
  6244. pl_update_work);
  6245. struct iio_channel **iio_list;
  6246. iio_list = get_ext_channels(chg->dev,
  6247. smblib_parallel_ext_iio_chan,
  6248. ARRAY_SIZE(smblib_parallel_ext_iio_chan));
  6249. if (IS_ERR(iio_list)) {
  6250. rc = PTR_ERR(iio_list);
  6251. if (rc != -EPROBE_DEFER) {
  6252. dev_err(chg->dev, "Failed to get channels, %d\n",
  6253. rc);
  6254. chg->iio_chan_list_smb_parallel = ERR_PTR(-EINVAL);
  6255. }
  6256. return;
  6257. }
  6258. chg->iio_chan_list_smb_parallel = iio_list;
  6259. if (chg->smb_temp_max == -EINVAL) {
  6260. rc = smblib_get_thermal_threshold(chg,
  6261. SMB_REG_H_THRESHOLD_MSB_REG,
  6262. &chg->smb_temp_max);
  6263. if (rc < 0) {
  6264. dev_err(chg->dev, "Couldn't get charger_temp_max rc=%d\n",
  6265. rc);
  6266. return;
  6267. }
  6268. }
  6269. val = chg->smb_temp_max;
  6270. rc = smblib_write_iio_prop(chg, SMB_PARALLEL,
  6271. SMB_CHARGER_TEMP_MAX, val);
  6272. if (rc < 0) {
  6273. dev_err(chg->dev, "Couldn't set POWER_SUPPLY_PROP_CHARGER_TEMP_MAX rc=%d\n",
  6274. rc);
  6275. return;
  6276. }
  6277. if (chg->sec_chg_selected == QTI_POWER_SUPPLY_CHARGER_SEC_CP)
  6278. return;
  6279. smblib_select_sec_charger(chg, QTI_POWER_SUPPLY_CHARGER_SEC_PL,
  6280. QTI_POWER_SUPPLY_CP_NONE, false);
  6281. }
  6282. static void clear_hdc_work(struct work_struct *work)
  6283. {
  6284. struct smb_charger *chg = container_of(work, struct smb_charger,
  6285. clear_hdc_work.work);
  6286. chg->is_hdc = false;
  6287. vote(chg->hdc_irq_disable_votable, HDC_IRQ_VOTER, false, 0);
  6288. }
  6289. static void smblib_icl_change_work(struct work_struct *work)
  6290. {
  6291. struct smb_charger *chg = container_of(work, struct smb_charger,
  6292. icl_change_work.work);
  6293. int rc, settled_ua;
  6294. rc = smblib_get_charge_param(chg, &chg->param.icl_stat, &settled_ua);
  6295. if (rc < 0) {
  6296. smblib_err(chg, "Couldn't get ICL status rc=%d\n", rc);
  6297. return;
  6298. }
  6299. power_supply_changed(chg->batt_psy);
  6300. smblib_dbg(chg, PR_INTERRUPT, "icl_settled=%d\n", settled_ua);
  6301. }
  6302. static void smblib_pl_enable_work(struct work_struct *work)
  6303. {
  6304. struct smb_charger *chg = container_of(work, struct smb_charger,
  6305. pl_enable_work.work);
  6306. smblib_dbg(chg, PR_PARALLEL, "timer expired, enabling parallel\n");
  6307. vote(chg->pl_disable_votable, PL_DELAY_VOTER, false, 0);
  6308. vote(chg->awake_votable, PL_DELAY_VOTER, false, 0);
  6309. }
  6310. static void smblib_thermal_regulation_work(struct work_struct *work)
  6311. {
  6312. struct smb_charger *chg = container_of(work, struct smb_charger,
  6313. thermal_regulation_work.work);
  6314. int rc;
  6315. rc = smblib_update_thermal_readings(chg);
  6316. if (rc < 0)
  6317. smblib_err(chg, "Couldn't read current thermal values %d\n",
  6318. rc);
  6319. rc = smblib_process_thermal_readings(chg);
  6320. if (rc < 0)
  6321. smblib_err(chg, "Couldn't run sw thermal regulation %d\n",
  6322. rc);
  6323. }
  6324. #define MOISTURE_PROTECTION_CHECK_DELAY_MS 300000 /* 5 mins */
  6325. static void smblib_moisture_protection_work(struct work_struct *work)
  6326. {
  6327. struct smb_charger *chg = container_of(work, struct smb_charger,
  6328. moisture_protection_work);
  6329. int rc;
  6330. bool usb_plugged_in;
  6331. u8 stat;
  6332. /*
  6333. * Hold awake votable to prevent pm_relax being called prior to
  6334. * completion of this work.
  6335. */
  6336. vote(chg->awake_votable, MOISTURE_VOTER, true, 0);
  6337. /*
  6338. * Disable 1% duty cycle on CC_ID pin and enable uUSB factory mode
  6339. * detection to track any change on RID, as interrupts are disable.
  6340. */
  6341. rc = smblib_write(chg, ((chg->chg_param.smb_version == PMI632) ?
  6342. PMI632_TYPEC_U_USB_WATER_PROTECTION_CFG_REG :
  6343. TYPEC_U_USB_WATER_PROTECTION_CFG_REG), 0);
  6344. if (rc < 0) {
  6345. smblib_err(chg, "Couldn't disable periodic monitoring of CC_ID rc=%d\n",
  6346. rc);
  6347. goto out;
  6348. }
  6349. rc = smblib_masked_write(chg, TYPEC_U_USB_CFG_REG,
  6350. EN_MICRO_USB_FACTORY_MODE_BIT,
  6351. EN_MICRO_USB_FACTORY_MODE_BIT);
  6352. if (rc < 0) {
  6353. smblib_err(chg, "Couldn't enable uUSB factory mode detection rc=%d\n",
  6354. rc);
  6355. goto out;
  6356. }
  6357. /*
  6358. * Add a delay of 100ms to allow change in rid to reflect on
  6359. * status registers.
  6360. */
  6361. msleep(100);
  6362. rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
  6363. if (rc < 0) {
  6364. smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
  6365. goto out;
  6366. }
  6367. usb_plugged_in = (bool)(stat & USBIN_PLUGIN_RT_STS_BIT);
  6368. /* Check uUSB status for moisture presence */
  6369. rc = smblib_read(chg, TYPEC_U_USB_STATUS_REG, &stat);
  6370. if (rc < 0) {
  6371. smblib_err(chg, "Couldn't read TYPE_C_U_USB_STATUS_REG rc=%d\n",
  6372. rc);
  6373. goto out;
  6374. }
  6375. /*
  6376. * Factory mode detection happens in case of USB plugged-in by using
  6377. * a different current source of 2uA which can hamper moisture
  6378. * detection. Since factory mode is not supported in kernel, factory
  6379. * mode detection can be considered as equivalent to presence of
  6380. * moisture.
  6381. */
  6382. if (stat == U_USB_STATUS_WATER_PRESENT || stat == U_USB_FMB1_BIT ||
  6383. stat == U_USB_FMB2_BIT || (usb_plugged_in &&
  6384. stat == U_USB_FLOAT1_BIT)) {
  6385. smblib_set_moisture_protection(chg, true);
  6386. alarm_start_relative(&chg->moisture_protection_alarm,
  6387. ms_to_ktime(MOISTURE_PROTECTION_CHECK_DELAY_MS));
  6388. } else {
  6389. smblib_set_moisture_protection(chg, false);
  6390. rc = alarm_cancel(&chg->moisture_protection_alarm);
  6391. if (rc < 0)
  6392. smblib_err(chg, "Couldn't cancel moisture protection alarm\n");
  6393. }
  6394. out:
  6395. vote(chg->awake_votable, MOISTURE_VOTER, false, 0);
  6396. }
  6397. static enum alarmtimer_restart moisture_protection_alarm_cb(struct alarm *alarm,
  6398. ktime_t now)
  6399. {
  6400. struct smb_charger *chg = container_of(alarm, struct smb_charger,
  6401. moisture_protection_alarm);
  6402. smblib_dbg(chg, PR_MISC, "moisture Protection Alarm Triggered %lld\n",
  6403. ktime_to_ms(now));
  6404. /* Atomic context, cannot use voter */
  6405. pm_stay_awake(chg->dev);
  6406. schedule_work(&chg->moisture_protection_work);
  6407. return ALARMTIMER_NORESTART;
  6408. }
  6409. static void smblib_chg_termination_work(struct work_struct *work)
  6410. {
  6411. int val;
  6412. struct smb_charger *chg = container_of(work, struct smb_charger,
  6413. chg_termination_work);
  6414. union power_supply_propval pval = {0, };
  6415. int rc, input_present, delay = CHG_TERM_WA_ENTRY_DELAY_MS;
  6416. int vbat_now_uv, max_fv_uv;
  6417. u8 stat = 0;
  6418. /*
  6419. * Hold awake votable to prevent pm_relax being called prior to
  6420. * completion of this work.
  6421. */
  6422. vote(chg->awake_votable, CHG_TERMINATION_VOTER, true, 0);
  6423. rc = smblib_is_input_present(chg, &input_present);
  6424. if ((rc < 0) || !input_present)
  6425. goto out;
  6426. rc = smblib_get_prop_from_bms(chg, SMB5_QG_REAL_CAPACITY, &val);
  6427. if ((rc < 0) || (val < 100)) {
  6428. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
  6429. vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0);
  6430. smblib_err(chg, "Couldn't read SOC value, rc=%d\n", rc);
  6431. goto out;
  6432. }
  6433. if ((rc < 0) || (pval.intval < 100)) {
  6434. rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
  6435. if (rc < 0)
  6436. goto out;
  6437. /* check we are not in termination to exit the WA */
  6438. if ((stat & BATTERY_CHARGER_STATUS_MASK) != TERMINATE_CHARGE) {
  6439. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER,
  6440. false, 0);
  6441. vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER,
  6442. false, 0);
  6443. goto out;
  6444. }
  6445. }
  6446. /* Get the battery float voltage */
  6447. rc = smblib_get_prop_from_bms(chg, SMB5_QG_VOLTAGE_MAX, &val);
  6448. if (rc < 0) {
  6449. smblib_err(chg, "Couldn't read voltage_max prop, rc=%d\n", rc);
  6450. goto out;
  6451. }
  6452. max_fv_uv = val;
  6453. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CHARGE_FULL, &val);
  6454. if (rc < 0) {
  6455. smblib_err(chg, "Couldn't read charge_full prop, rc=%d\n", rc);
  6456. goto out;
  6457. }
  6458. /*
  6459. * On change in the value of learned capacity, re-initialize the
  6460. * reference cc_soc value due to change in cc_soc characteristic value
  6461. * at full capacity. Also, in case cc_soc_ref value is reset,
  6462. * re-initialize it.
  6463. */
  6464. if (val != chg->charge_full_cc || !chg->cc_soc_ref) {
  6465. chg->charge_full_cc = val;
  6466. rc = smblib_get_prop_from_bms(chg, SMB5_QG_VOLTAGE_NOW, &val);
  6467. if (rc < 0) {
  6468. smblib_err(chg, "Couldn't read voltage_now prop, rc=%d\n",
  6469. rc);
  6470. goto out;
  6471. }
  6472. /*
  6473. * Store the Vbat at the charge termination to compare with
  6474. * the current voltage to see if the Vbat is increasing after
  6475. * charge termination in BSM.
  6476. */
  6477. chg->term_vbat_uv = val;
  6478. vbat_now_uv = val;
  6479. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CC_SOC, &val);
  6480. if (rc < 0) {
  6481. smblib_err(chg, "Couldn't read cc_soc prop, rc=%d\n",
  6482. rc);
  6483. goto out;
  6484. }
  6485. chg->cc_soc_ref = val;
  6486. } else {
  6487. rc = smblib_get_prop_from_bms(chg, SMB5_QG_VOLTAGE_NOW, &val);
  6488. if (rc < 0) {
  6489. smblib_err(chg, "Couldn't read voltage_now prop, rc=%d\n",
  6490. rc);
  6491. goto out;
  6492. }
  6493. vbat_now_uv = val;
  6494. rc = smblib_get_prop_from_bms(chg, SMB5_QG_CC_SOC, &val);
  6495. if (rc < 0) {
  6496. smblib_err(chg, "Couldn't read cc_soc prop, rc=%d\n",
  6497. rc);
  6498. goto out;
  6499. }
  6500. }
  6501. /*
  6502. * In BSM a sudden jump in CC_SOC is not expected. If seen, its a
  6503. * good_ocv or updated capacity, reject it.
  6504. */
  6505. if (chg->last_cc_soc && val > (chg->last_cc_soc + 100)) {
  6506. /* CC_SOC has increased by 1% from last time */
  6507. chg->cc_soc_ref = val;
  6508. smblib_dbg(chg, PR_MISC, "cc_soc jumped(%d->%d), reset cc_soc_ref\n",
  6509. chg->last_cc_soc, val);
  6510. }
  6511. chg->last_cc_soc = val;
  6512. /*
  6513. * Suspend/Unsuspend USB input to keep cc_soc within the 0.5% to 0.75%
  6514. * overshoot range of the cc_soc value at termination and make sure that
  6515. * vbat is indeed rising above vfloat.
  6516. */
  6517. if (val < DIV_ROUND_CLOSEST(chg->cc_soc_ref * 10050, 10000)) {
  6518. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
  6519. vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0);
  6520. delay = CHG_TERM_WA_ENTRY_DELAY_MS;
  6521. } else if ((val > DIV_ROUND_CLOSEST(chg->cc_soc_ref * 10075,
  6522. 10000))
  6523. && ((vbat_now_uv > chg->term_vbat_uv) &&
  6524. (vbat_now_uv > max_fv_uv))) {
  6525. if (input_present & INPUT_PRESENT_USB)
  6526. vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER,
  6527. true, 0);
  6528. if (input_present & INPUT_PRESENT_DC)
  6529. vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER,
  6530. true, 0);
  6531. delay = CHG_TERM_WA_EXIT_DELAY_MS;
  6532. }
  6533. smblib_dbg(chg, PR_MISC, "Chg Term WA readings: cc_soc: %d, cc_soc_ref: %d, delay: %d vbat_now %d term_vbat %d\n",
  6534. val, chg->cc_soc_ref, delay, vbat_now_uv,
  6535. chg->term_vbat_uv);
  6536. alarm_start_relative(&chg->chg_termination_alarm, ms_to_ktime(delay));
  6537. out:
  6538. vote(chg->awake_votable, CHG_TERMINATION_VOTER, false, 0);
  6539. }
  6540. static enum alarmtimer_restart chg_termination_alarm_cb(struct alarm *alarm,
  6541. ktime_t now)
  6542. {
  6543. struct smb_charger *chg = container_of(alarm, struct smb_charger,
  6544. chg_termination_alarm);
  6545. smblib_dbg(chg, PR_MISC, "Charge termination WA alarm triggered %lld\n",
  6546. ktime_to_ms(now));
  6547. /* Atomic context, cannot use voter */
  6548. pm_stay_awake(chg->dev);
  6549. schedule_work(&chg->chg_termination_work);
  6550. return ALARMTIMER_NORESTART;
  6551. }
  6552. static void apsd_timer_cb(struct timer_list *tm)
  6553. {
  6554. struct smb_charger *chg = container_of(tm, struct smb_charger,
  6555. apsd_timer);
  6556. smblib_dbg(chg, PR_MISC, "APSD Extented timer timeout at %lld\n",
  6557. jiffies_to_msecs(jiffies));
  6558. chg->apsd_ext_timeout = true;
  6559. }
  6560. #define SOFT_JEITA_HYSTERESIS_OFFSET 0x200
  6561. static void jeita_update_work(struct work_struct *work)
  6562. {
  6563. struct smb_charger *chg = container_of(work, struct smb_charger,
  6564. jeita_update_work);
  6565. struct device_node *node = chg->dev->of_node;
  6566. struct device_node *batt_node, *pnode;
  6567. union power_supply_propval val;
  6568. int rc, tmp[2], max_fcc_ma, max_fv_uv;
  6569. u32 jeita_hard_thresholds[2];
  6570. u16 addr;
  6571. u8 buff[2];
  6572. batt_node = of_find_node_by_name(node, "qcom,battery-data");
  6573. if (!batt_node) {
  6574. smblib_err(chg, "Batterydata not available\n");
  6575. goto out;
  6576. }
  6577. /* if BMS is not ready, defer the work */
  6578. if (IS_ERR_OR_NULL(chg->iio_chan_list_qg))
  6579. return;
  6580. rc = smblib_get_prop_from_bms(chg, SMB5_QG_RESISTANCE_ID, &val.intval);
  6581. if (rc < 0) {
  6582. smblib_err(chg, "Failed to get batt-id rc=%d\n", rc);
  6583. goto out;
  6584. }
  6585. /* if BMS hasn't read out the batt_id yet, defer the work */
  6586. if (val.intval <= 0)
  6587. return;
  6588. pnode = of_batterydata_get_best_profile(batt_node,
  6589. val.intval / 1000, NULL);
  6590. if (IS_ERR(pnode)) {
  6591. rc = PTR_ERR(pnode);
  6592. smblib_err(chg, "Failed to detect valid battery profile %d\n",
  6593. rc);
  6594. goto out;
  6595. }
  6596. rc = of_property_read_u32_array(pnode, "qcom,jeita-hard-thresholds",
  6597. jeita_hard_thresholds, 2);
  6598. if (!rc) {
  6599. rc = smblib_update_jeita(chg, jeita_hard_thresholds,
  6600. JEITA_HARD);
  6601. if (rc < 0) {
  6602. smblib_err(chg, "Couldn't configure Hard Jeita rc=%d\n",
  6603. rc);
  6604. goto out;
  6605. }
  6606. }
  6607. rc = of_property_read_u32_array(pnode, "qcom,jeita-soft-thresholds",
  6608. chg->jeita_soft_thlds, 2);
  6609. if (!rc) {
  6610. rc = smblib_update_jeita(chg, chg->jeita_soft_thlds,
  6611. JEITA_SOFT);
  6612. if (rc < 0) {
  6613. smblib_err(chg, "Couldn't configure Soft Jeita rc=%d\n",
  6614. rc);
  6615. goto out;
  6616. }
  6617. rc = of_property_read_u32_array(pnode,
  6618. "qcom,jeita-soft-hys-thresholds",
  6619. chg->jeita_soft_hys_thlds, 2);
  6620. if (rc < 0) {
  6621. smblib_err(chg, "Couldn't get Soft Jeita hysteresis thresholds rc=%d\n",
  6622. rc);
  6623. goto out;
  6624. }
  6625. } else {
  6626. /* Populate the jeita-soft-thresholds */
  6627. addr = CHGR_JEITA_THRESHOLD_BASE_REG(JEITA_SOFT);
  6628. rc = smblib_batch_read(chg, addr, buff, 2);
  6629. if (rc < 0) {
  6630. pr_err("failed to read 0x%4X, rc=%d\n", addr, rc);
  6631. goto out;
  6632. }
  6633. chg->jeita_soft_thlds[1] = buff[1] | buff[0] << 8;
  6634. rc = smblib_batch_read(chg, addr + 2, buff, 2);
  6635. if (rc < 0) {
  6636. pr_err("failed to read 0x%4X, rc=%d\n", addr + 2, rc);
  6637. goto out;
  6638. }
  6639. chg->jeita_soft_thlds[0] = buff[1] | buff[0] << 8;
  6640. /*
  6641. * Update the soft jeita hysteresis 2 DegC less for warm and
  6642. * 2 DegC more for cool than the soft jeita thresholds to avoid
  6643. * overwriting the registers with invalid values.
  6644. */
  6645. chg->jeita_soft_hys_thlds[0] =
  6646. chg->jeita_soft_thlds[0] - SOFT_JEITA_HYSTERESIS_OFFSET;
  6647. chg->jeita_soft_hys_thlds[1] =
  6648. chg->jeita_soft_thlds[1] + SOFT_JEITA_HYSTERESIS_OFFSET;
  6649. }
  6650. chg->jeita_soft_fcc[0] = chg->jeita_soft_fcc[1] = -EINVAL;
  6651. chg->jeita_soft_fv[0] = chg->jeita_soft_fv[1] = -EINVAL;
  6652. max_fcc_ma = max_fv_uv = -EINVAL;
  6653. of_property_read_u32(pnode, "qcom,fastchg-current-ma", &max_fcc_ma);
  6654. of_property_read_u32(pnode, "qcom,max-voltage-uv", &max_fv_uv);
  6655. if (max_fcc_ma <= 0 || max_fv_uv <= 0) {
  6656. smblib_err(chg, "Incorrect fastchg-current-ma or max-voltage-uv\n");
  6657. goto out;
  6658. }
  6659. rc = of_property_read_u32_array(pnode, "qcom,jeita-soft-fcc-ua",
  6660. tmp, 2);
  6661. if (rc < 0) {
  6662. smblib_err(chg, "Couldn't get fcc values for soft JEITA rc=%d\n",
  6663. rc);
  6664. goto out;
  6665. }
  6666. max_fcc_ma *= 1000;
  6667. if (tmp[0] > max_fcc_ma || tmp[1] > max_fcc_ma) {
  6668. smblib_err(chg, "Incorrect FCC value [%d %d] max: %d\n", tmp[0],
  6669. tmp[1], max_fcc_ma);
  6670. goto out;
  6671. }
  6672. chg->jeita_soft_fcc[0] = tmp[0];
  6673. chg->jeita_soft_fcc[1] = tmp[1];
  6674. rc = of_property_read_u32_array(pnode, "qcom,jeita-soft-fv-uv", tmp,
  6675. 2);
  6676. if (rc < 0) {
  6677. smblib_err(chg, "Couldn't get fv values for soft JEITA rc=%d\n",
  6678. rc);
  6679. goto out;
  6680. }
  6681. if (tmp[0] > max_fv_uv || tmp[1] > max_fv_uv) {
  6682. smblib_err(chg, "Incorrect FV value [%d %d] max: %d\n", tmp[0],
  6683. tmp[1], max_fv_uv);
  6684. goto out;
  6685. }
  6686. chg->jeita_soft_fv[0] = tmp[0];
  6687. chg->jeita_soft_fv[1] = tmp[1];
  6688. rc = smblib_soft_jeita_arb_wa(chg);
  6689. if (rc < 0) {
  6690. smblib_err(chg, "Couldn't fix soft jeita arb rc=%d\n",
  6691. rc);
  6692. goto out;
  6693. }
  6694. chg->jeita_configured = JEITA_CFG_COMPLETE;
  6695. return;
  6696. out:
  6697. chg->jeita_configured = JEITA_CFG_FAILURE;
  6698. }
  6699. void smblib_moisture_detection_enable(struct smb_charger *chg, int pval)
  6700. {
  6701. int rc, input_present, val;
  6702. if (chg->pd_disabled)
  6703. return;
  6704. smblib_is_input_present(chg, &input_present);
  6705. if (pval) {
  6706. chg->lpd_disabled = false;
  6707. pr_debug("Moisture detection enabled\n");
  6708. if (input_present)
  6709. schedule_delayed_work(&chg->lpd_ra_open_work,
  6710. msecs_to_jiffies(300));
  6711. return;
  6712. }
  6713. chg->lpd_disabled = true;
  6714. if (!is_client_vote_enabled(chg->usb_icl_votable, LPD_VOTER))
  6715. goto done;
  6716. cancel_delayed_work_sync(&chg->lpd_ra_open_work);
  6717. alarm_cancel(&chg->lpd_recheck_timer);
  6718. vote(chg->usb_icl_votable, LPD_VOTER, false, 0);
  6719. /* restore DRP mode */
  6720. val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  6721. rc = smblib_set_prop_typec_power_role(chg, val);
  6722. if (rc < 0) {
  6723. smblib_err(chg, "Failed to set power-role to DRP rc=%d\n",
  6724. rc);
  6725. return;
  6726. }
  6727. chg->lpd_reason = LPD_NONE;
  6728. chg->lpd_stage = LPD_STAGE_NONE;
  6729. done:
  6730. pr_debug("Moisture detection disabled\n");
  6731. }
  6732. static void smblib_lpd_ra_open_work(struct work_struct *work)
  6733. {
  6734. struct smb_charger *chg = container_of(work, struct smb_charger,
  6735. lpd_ra_open_work.work);
  6736. u8 stat;
  6737. int rc, val;
  6738. if (chg->pr_swap_in_progress || chg->pd_hard_reset || chg->lpd_disabled) {
  6739. chg->lpd_stage = LPD_STAGE_NONE;
  6740. goto out;
  6741. }
  6742. if (chg->lpd_stage != LPD_STAGE_FLOAT)
  6743. goto out;
  6744. rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
  6745. if (rc < 0) {
  6746. smblib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
  6747. rc);
  6748. goto out;
  6749. }
  6750. /* quit if moisture status is gone or in attached state */
  6751. if (!(stat & TYPEC_WATER_DETECTION_STATUS_BIT)
  6752. || (stat & TYPEC_TCCDEBOUNCE_DONE_STATUS_BIT)) {
  6753. chg->lpd_stage = LPD_STAGE_NONE;
  6754. goto out;
  6755. }
  6756. chg->lpd_stage = LPD_STAGE_COMMIT;
  6757. /* Enable source only mode */
  6758. val = QTI_POWER_SUPPLY_TYPEC_PR_SOURCE;
  6759. rc = smblib_set_prop_typec_power_role(chg, val);
  6760. if (rc < 0) {
  6761. smblib_err(chg, "Couldn't set typec source only mode rc=%d\n",
  6762. rc);
  6763. goto out;
  6764. }
  6765. /* Wait 1.5ms to get SBUx ready */
  6766. usleep_range(1500, 1510);
  6767. if (smblib_rsbux_low(chg, RSBU_K_300K_UV)) {
  6768. /* Moisture detected, enable sink only mode */
  6769. val = QTI_POWER_SUPPLY_TYPEC_PR_SINK;
  6770. rc = smblib_set_prop_typec_power_role(chg, val);
  6771. if (rc < 0) {
  6772. smblib_err(chg, "Couldn't set typec sink only rc=%d\n",
  6773. rc);
  6774. goto out;
  6775. }
  6776. chg->lpd_reason = LPD_MOISTURE_DETECTED;
  6777. chg->moisture_present = true;
  6778. vote(chg->usb_icl_votable, LPD_VOTER, true, 0);
  6779. } else {
  6780. /* Floating cable, disable water detection irq temporarily */
  6781. rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
  6782. TYPEC_WATER_DETECTION_INT_EN_BIT, 0);
  6783. if (rc < 0) {
  6784. smblib_err(chg, "Couldn't set TYPE_C_INTERRUPT_EN_CFG_2_REG rc=%d\n",
  6785. rc);
  6786. goto out;
  6787. }
  6788. /* restore DRP mode */
  6789. val = QTI_POWER_SUPPLY_TYPEC_PR_DUAL;
  6790. rc = smblib_set_prop_typec_power_role(chg, val);
  6791. if (rc < 0) {
  6792. smblib_err(chg, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
  6793. val, rc);
  6794. goto out;
  6795. }
  6796. chg->lpd_reason = LPD_FLOATING_CABLE;
  6797. }
  6798. /* recheck in 60 seconds */
  6799. alarm_start_relative(&chg->lpd_recheck_timer, ms_to_ktime(60000));
  6800. out:
  6801. vote(chg->awake_votable, LPD_VOTER, false, 0);
  6802. }
  6803. static void smblib_lpd_detach_work(struct work_struct *work)
  6804. {
  6805. struct smb_charger *chg = container_of(work, struct smb_charger,
  6806. lpd_detach_work.work);
  6807. if (chg->lpd_stage == LPD_STAGE_FLOAT_CANCEL)
  6808. chg->lpd_stage = LPD_STAGE_NONE;
  6809. }
  6810. static void smblib_cp_status_change_work(struct work_struct *work)
  6811. {
  6812. int rc = 0, val;
  6813. struct smb_charger *chg = container_of(work, struct smb_charger,
  6814. cp_status_change_work);
  6815. if (!is_cp_available(chg))
  6816. goto relax;
  6817. if (chg->cp_topo == -EINVAL) {
  6818. rc = smblib_read_iio_prop(chg, CP, CP_PARALLEL_OUTPUT_MODE,
  6819. &val);
  6820. if (rc < 0) {
  6821. smblib_err(chg, "Couldn't read cp topo rc=%d\n", rc);
  6822. goto relax;
  6823. }
  6824. chg->cp_topo = val;
  6825. if (chg->cp_topo == QTI_POWER_SUPPLY_PL_OUTPUT_VBAT &&
  6826. chg->cp_reason == QTI_POWER_SUPPLY_CP_WIRELESS)
  6827. vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, true,
  6828. 800000);
  6829. }
  6830. relax:
  6831. pm_relax(chg->dev);
  6832. }
  6833. static int smblib_create_votables(struct smb_charger *chg)
  6834. {
  6835. int rc = 0;
  6836. chg->fcc_votable = find_votable("FCC");
  6837. if (chg->fcc_votable == NULL) {
  6838. rc = -EINVAL;
  6839. smblib_err(chg, "Couldn't find FCC votable rc=%d\n", rc);
  6840. return rc;
  6841. }
  6842. chg->fcc_main_votable = find_votable("FCC_MAIN");
  6843. if (chg->fcc_main_votable == NULL) {
  6844. rc = -EINVAL;
  6845. smblib_err(chg, "Couldn't find FCC Main votable rc=%d\n", rc);
  6846. return rc;
  6847. }
  6848. chg->fv_votable = find_votable("FV");
  6849. if (chg->fv_votable == NULL) {
  6850. rc = -EINVAL;
  6851. smblib_err(chg, "Couldn't find FV votable rc=%d\n", rc);
  6852. return rc;
  6853. }
  6854. chg->usb_icl_votable = find_votable("USB_ICL");
  6855. if (chg->usb_icl_votable == NULL) {
  6856. rc = -EINVAL;
  6857. smblib_err(chg, "Couldn't find USB_ICL votable rc=%d\n", rc);
  6858. return rc;
  6859. }
  6860. chg->pl_disable_votable = find_votable("PL_DISABLE");
  6861. if (chg->pl_disable_votable == NULL) {
  6862. rc = -EINVAL;
  6863. smblib_err(chg, "Couldn't find votable PL_DISABLE rc=%d\n", rc);
  6864. return rc;
  6865. }
  6866. chg->pl_enable_votable_indirect = find_votable("PL_ENABLE_INDIRECT");
  6867. if (chg->pl_enable_votable_indirect == NULL) {
  6868. rc = -EINVAL;
  6869. smblib_err(chg,
  6870. "Couldn't find votable PL_ENABLE_INDIRECT rc=%d\n",
  6871. rc);
  6872. return rc;
  6873. }
  6874. vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0);
  6875. chg->smb_override_votable = create_votable("SMB_EN_OVERRIDE",
  6876. VOTE_SET_ANY,
  6877. smblib_smb_disable_override_vote_callback, chg);
  6878. if (IS_ERR(chg->smb_override_votable)) {
  6879. rc = PTR_ERR(chg->smb_override_votable);
  6880. chg->smb_override_votable = NULL;
  6881. return rc;
  6882. }
  6883. chg->dc_suspend_votable = create_votable("DC_SUSPEND", VOTE_SET_ANY,
  6884. smblib_dc_suspend_vote_callback,
  6885. chg);
  6886. if (IS_ERR(chg->dc_suspend_votable)) {
  6887. rc = PTR_ERR(chg->dc_suspend_votable);
  6888. chg->dc_suspend_votable = NULL;
  6889. return rc;
  6890. }
  6891. chg->awake_votable = create_votable("AWAKE", VOTE_SET_ANY,
  6892. smblib_awake_vote_callback,
  6893. chg);
  6894. if (IS_ERR(chg->awake_votable)) {
  6895. rc = PTR_ERR(chg->awake_votable);
  6896. chg->awake_votable = NULL;
  6897. return rc;
  6898. }
  6899. chg->chg_disable_votable = create_votable("CHG_DISABLE", VOTE_SET_ANY,
  6900. smblib_chg_disable_vote_callback,
  6901. chg);
  6902. if (IS_ERR(chg->chg_disable_votable)) {
  6903. rc = PTR_ERR(chg->chg_disable_votable);
  6904. chg->chg_disable_votable = NULL;
  6905. return rc;
  6906. }
  6907. chg->limited_irq_disable_votable = create_votable(
  6908. "USB_LIMITED_IRQ_DISABLE",
  6909. VOTE_SET_ANY,
  6910. smblib_limited_irq_disable_vote_callback,
  6911. chg);
  6912. if (IS_ERR(chg->limited_irq_disable_votable)) {
  6913. rc = PTR_ERR(chg->limited_irq_disable_votable);
  6914. chg->limited_irq_disable_votable = NULL;
  6915. return rc;
  6916. }
  6917. chg->hdc_irq_disable_votable = create_votable("USB_HDC_IRQ_DISABLE",
  6918. VOTE_SET_ANY,
  6919. smblib_hdc_irq_disable_vote_callback,
  6920. chg);
  6921. if (IS_ERR(chg->hdc_irq_disable_votable)) {
  6922. rc = PTR_ERR(chg->hdc_irq_disable_votable);
  6923. chg->hdc_irq_disable_votable = NULL;
  6924. return rc;
  6925. }
  6926. chg->icl_irq_disable_votable = create_votable("USB_ICL_IRQ_DISABLE",
  6927. VOTE_SET_ANY,
  6928. smblib_icl_irq_disable_vote_callback,
  6929. chg);
  6930. if (IS_ERR(chg->icl_irq_disable_votable)) {
  6931. rc = PTR_ERR(chg->icl_irq_disable_votable);
  6932. chg->icl_irq_disable_votable = NULL;
  6933. return rc;
  6934. }
  6935. chg->temp_change_irq_disable_votable = create_votable(
  6936. "TEMP_CHANGE_IRQ_DISABLE", VOTE_SET_ANY,
  6937. smblib_temp_change_irq_disable_vote_callback, chg);
  6938. if (IS_ERR(chg->temp_change_irq_disable_votable)) {
  6939. rc = PTR_ERR(chg->temp_change_irq_disable_votable);
  6940. chg->temp_change_irq_disable_votable = NULL;
  6941. return rc;
  6942. }
  6943. chg->bat_temp_irq_disable_votable = create_votable(
  6944. "BAT_TEMP_IRQ_DISABLE", VOTE_SET_ANY,
  6945. smblib_bat_temp_irq_disable_vote_callback, chg);
  6946. if (IS_ERR(chg->bat_temp_irq_disable_votable)) {
  6947. rc = PTR_ERR(chg->bat_temp_irq_disable_votable);
  6948. chg->bat_temp_irq_disable_votable = NULL;
  6949. return rc;
  6950. }
  6951. return rc;
  6952. }
  6953. static void smblib_destroy_votables(struct smb_charger *chg)
  6954. {
  6955. if (chg->dc_suspend_votable)
  6956. destroy_votable(chg->dc_suspend_votable);
  6957. if (chg->usb_icl_votable)
  6958. destroy_votable(chg->usb_icl_votable);
  6959. if (chg->awake_votable)
  6960. destroy_votable(chg->awake_votable);
  6961. if (chg->chg_disable_votable)
  6962. destroy_votable(chg->chg_disable_votable);
  6963. if (chg->bat_temp_irq_disable_votable)
  6964. destroy_votable(chg->bat_temp_irq_disable_votable);
  6965. }
  6966. int smblib_init(struct smb_charger *chg)
  6967. {
  6968. int rc = 0, val;
  6969. struct iio_channel **iio_list;
  6970. mutex_init(&chg->smb_lock);
  6971. mutex_init(&chg->irq_status_lock);
  6972. mutex_init(&chg->dcin_aicl_lock);
  6973. mutex_init(&chg->dpdm_lock);
  6974. spin_lock_init(&chg->typec_pr_lock);
  6975. INIT_WORK(&chg->bms_update_work, bms_update_work);
  6976. INIT_WORK(&chg->pl_update_work, pl_update_work);
  6977. INIT_WORK(&chg->jeita_update_work, jeita_update_work);
  6978. INIT_WORK(&chg->dcin_aicl_work, dcin_aicl_work);
  6979. INIT_WORK(&chg->cp_status_change_work, smblib_cp_status_change_work);
  6980. INIT_DELAYED_WORK(&chg->clear_hdc_work, clear_hdc_work);
  6981. INIT_DELAYED_WORK(&chg->icl_change_work, smblib_icl_change_work);
  6982. INIT_DELAYED_WORK(&chg->pl_enable_work, smblib_pl_enable_work);
  6983. INIT_DELAYED_WORK(&chg->uusb_otg_work, smblib_uusb_otg_work);
  6984. INIT_DELAYED_WORK(&chg->bb_removal_work, smblib_bb_removal_work);
  6985. INIT_DELAYED_WORK(&chg->lpd_ra_open_work, smblib_lpd_ra_open_work);
  6986. INIT_DELAYED_WORK(&chg->lpd_detach_work, smblib_lpd_detach_work);
  6987. INIT_DELAYED_WORK(&chg->thermal_regulation_work,
  6988. smblib_thermal_regulation_work);
  6989. INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work);
  6990. INIT_DELAYED_WORK(&chg->pr_swap_detach_work,
  6991. smblib_pr_swap_detach_work);
  6992. INIT_DELAYED_WORK(&chg->pr_lock_clear_work,
  6993. smblib_pr_lock_clear_work);
  6994. timer_setup(&chg->apsd_timer, apsd_timer_cb, 0);
  6995. INIT_DELAYED_WORK(&chg->role_reversal_check,
  6996. smblib_typec_role_check_work);
  6997. if (chg->wa_flags & CHG_TERMINATION_WA) {
  6998. INIT_WORK(&chg->chg_termination_work,
  6999. smblib_chg_termination_work);
  7000. if (alarmtimer_get_rtcdev()) {
  7001. alarm_init(&chg->chg_termination_alarm, ALARM_BOOTTIME,
  7002. chg_termination_alarm_cb);
  7003. } else {
  7004. smblib_err(chg, "Couldn't get rtc device\n");
  7005. return -ENODEV;
  7006. }
  7007. }
  7008. if (chg->uusb_moisture_protection_enabled) {
  7009. INIT_WORK(&chg->moisture_protection_work,
  7010. smblib_moisture_protection_work);
  7011. if (alarmtimer_get_rtcdev()) {
  7012. alarm_init(&chg->moisture_protection_alarm,
  7013. ALARM_BOOTTIME, moisture_protection_alarm_cb);
  7014. } else {
  7015. smblib_err(chg, "Failed to initialize moisture protection alarm\n");
  7016. return -ENODEV;
  7017. }
  7018. }
  7019. if (alarmtimer_get_rtcdev()) {
  7020. alarm_init(&chg->dcin_aicl_alarm, ALARM_REALTIME,
  7021. dcin_aicl_alarm_cb);
  7022. } else {
  7023. smblib_err(chg, "Failed to initialize dcin aicl alarm\n");
  7024. return -ENODEV;
  7025. }
  7026. chg->fake_capacity = -EINVAL;
  7027. chg->fake_input_current_limited = -EINVAL;
  7028. chg->fake_batt_status = -EINVAL;
  7029. chg->sink_src_mode = UNATTACHED_MODE;
  7030. chg->jeita_configured = false;
  7031. chg->sec_chg_selected = QTI_POWER_SUPPLY_CHARGER_SEC_NONE;
  7032. chg->cp_reason = QTI_POWER_SUPPLY_CP_NONE;
  7033. chg->thermal_status = TEMP_BELOW_RANGE;
  7034. chg->typec_irq_en = true;
  7035. chg->cp_topo = -EINVAL;
  7036. chg->dr_mode = TYPEC_PORT_DRP;
  7037. switch (chg->mode) {
  7038. case PARALLEL_MASTER:
  7039. rc = qcom_batt_init(chg->dev, &chg->chg_param);
  7040. if (rc < 0) {
  7041. smblib_err(chg, "Couldn't init qcom_batt_init rc=%d\n",
  7042. rc);
  7043. return rc;
  7044. }
  7045. rc = qcom_step_chg_init(chg->dev, chg->step_chg_enabled,
  7046. chg->sw_jeita_enabled, chg->jeita_arb_enable,
  7047. chg->iio_chans);
  7048. if (rc < 0) {
  7049. smblib_err(chg, "Couldn't init qcom_step_chg_init rc=%d\n",
  7050. rc);
  7051. return rc;
  7052. }
  7053. rc = smblib_create_votables(chg);
  7054. if (rc < 0) {
  7055. smblib_err(chg, "Couldn't create votables rc=%d\n",
  7056. rc);
  7057. return rc;
  7058. }
  7059. iio_list = get_ext_channels(chg->dev, smblib_qg_ext_iio_chan,
  7060. ARRAY_SIZE(smblib_qg_ext_iio_chan));
  7061. if (!IS_ERR(iio_list))
  7062. chg->iio_chan_list_qg = iio_list;
  7063. if (chg->sec_pl_present) {
  7064. iio_list = get_ext_channels(
  7065. chg->dev, smblib_parallel_ext_iio_chan,
  7066. ARRAY_SIZE(smblib_parallel_ext_iio_chan));
  7067. if (!IS_ERR(iio_list))
  7068. chg->iio_chan_list_smb_parallel = iio_list;
  7069. if (chg->iio_chan_list_smb_parallel) {
  7070. if (chg->sec_chg_selected
  7071. != QTI_POWER_SUPPLY_CHARGER_SEC_CP) {
  7072. rc = smblib_select_sec_charger(chg,
  7073. QTI_POWER_SUPPLY_CHARGER_SEC_PL,
  7074. QTI_POWER_SUPPLY_CP_NONE,
  7075. false);
  7076. if (rc < 0)
  7077. smblib_err(chg, "Couldn't config pl charger rc=%d\n",
  7078. rc);
  7079. }
  7080. if (chg->smb_temp_max == -EINVAL) {
  7081. rc = smblib_get_thermal_threshold(chg,
  7082. SMB_REG_H_THRESHOLD_MSB_REG,
  7083. &chg->smb_temp_max);
  7084. if (rc < 0) {
  7085. dev_err(chg->dev, "Couldn't get charger_temp_max rc=%d\n",
  7086. rc);
  7087. return rc;
  7088. }
  7089. }
  7090. val = chg->smb_temp_max;
  7091. rc = smblib_write_iio_prop(chg, SMB_PARALLEL,
  7092. SMB_CHARGER_TEMP_MAX, val);
  7093. if (rc < 0) {
  7094. dev_err(chg->dev, "Couldn't set POWER_SUPPLY_PROP_CHARGER_TEMP_MAX rc=%d\n",
  7095. rc);
  7096. return rc;
  7097. }
  7098. }
  7099. }
  7100. rc = smblib_register_notifier(chg);
  7101. if (rc < 0) {
  7102. smblib_err(chg,
  7103. "Couldn't register notifier rc=%d\n", rc);
  7104. return rc;
  7105. }
  7106. break;
  7107. case PARALLEL_SLAVE:
  7108. break;
  7109. default:
  7110. smblib_err(chg, "Unsupported mode %d\n", chg->mode);
  7111. return -EINVAL;
  7112. }
  7113. return rc;
  7114. }
  7115. int smblib_deinit(struct smb_charger *chg)
  7116. {
  7117. switch (chg->mode) {
  7118. case PARALLEL_MASTER:
  7119. if (chg->uusb_moisture_protection_enabled) {
  7120. alarm_cancel(&chg->moisture_protection_alarm);
  7121. cancel_work_sync(&chg->moisture_protection_work);
  7122. }
  7123. if (chg->wa_flags & CHG_TERMINATION_WA) {
  7124. alarm_cancel(&chg->chg_termination_alarm);
  7125. cancel_work_sync(&chg->chg_termination_work);
  7126. }
  7127. del_timer_sync(&chg->apsd_timer);
  7128. cancel_work_sync(&chg->bms_update_work);
  7129. cancel_work_sync(&chg->jeita_update_work);
  7130. cancel_work_sync(&chg->pl_update_work);
  7131. cancel_work_sync(&chg->dcin_aicl_work);
  7132. cancel_work_sync(&chg->cp_status_change_work);
  7133. cancel_delayed_work_sync(&chg->clear_hdc_work);
  7134. cancel_delayed_work_sync(&chg->icl_change_work);
  7135. cancel_delayed_work_sync(&chg->pl_enable_work);
  7136. cancel_delayed_work_sync(&chg->uusb_otg_work);
  7137. cancel_delayed_work_sync(&chg->bb_removal_work);
  7138. cancel_delayed_work_sync(&chg->lpd_ra_open_work);
  7139. cancel_delayed_work_sync(&chg->lpd_detach_work);
  7140. cancel_delayed_work_sync(&chg->thermal_regulation_work);
  7141. cancel_delayed_work_sync(&chg->usbov_dbc_work);
  7142. cancel_delayed_work_sync(&chg->role_reversal_check);
  7143. cancel_delayed_work_sync(&chg->pr_swap_detach_work);
  7144. power_supply_unreg_notifier(&chg->nb);
  7145. smblib_destroy_votables(chg);
  7146. qcom_step_chg_deinit();
  7147. qcom_batt_deinit();
  7148. break;
  7149. case PARALLEL_SLAVE:
  7150. break;
  7151. default:
  7152. smblib_err(chg, "Unsupported mode %d\n", chg->mode);
  7153. return -EINVAL;
  7154. }
  7155. return 0;
  7156. }