sec_battery.c 321 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704
  1. /*
  2. * sec_battery.c
  3. * Samsung Mobile Battery Driver
  4. *
  5. * Copyright (C) 2021 Samsung Electronics
  6. *
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/battery/sb_sysfs.h>
  13. #include <linux/battery/sb_notify.h>
  14. #include "sec_battery.h"
  15. #include "sec_battery_sysfs.h"
  16. #include "sec_battery_dt.h"
  17. #include "sec_battery_ttf.h"
  18. #if defined(CONFIG_SEC_COMMON)
  19. #include <linux/sec_common.h>
  20. #endif
  21. #if IS_ENABLED(CONFIG_SEC_ABC)
  22. #include <linux/sti/abc_common.h>
  23. #endif
  24. #if defined(CONFIG_ARCH_QCOM) && !(defined(CONFIG_ARCH_EXYNOS) || defined(CONFIG_ARCH_MEDIATEK))
  25. #include <linux/samsung/sec_param.h>
  26. #endif
  27. #include <linux/sec_debug.h>
  28. #if defined(CONFIG_SEC_KUNIT)
  29. #include <kunit/mock.h>
  30. #else
  31. #define __visible_for_testing static
  32. #endif
  33. #if defined(CONFIG_UML)
  34. #include "kunit_test/uml_dummy.h"
  35. #endif
  36. #include "battery_logger.h"
  37. #include "sb_tx.h"
  38. #include "sb_batt_dump.h"
  39. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER) && IS_ENABLED(CONFIG_LSI_IFPMIC)
  40. #include <linux/vbus_notifier.h>
  41. #endif
  42. static unsigned int __read_mostly lpcharge;
  43. module_param(lpcharge, uint, 0444);
  44. static int __read_mostly fg_reset;
  45. module_param(fg_reset, int, 0444);
  46. static int factory_mode;
  47. module_param(factory_mode, int, 0444);
  48. static unsigned int __read_mostly charging_mode;
  49. module_param(charging_mode, uint, 0444);
  50. static unsigned int __read_mostly pd_disable;
  51. module_param(pd_disable, uint, 0444);
  52. static char * __read_mostly sales_code;
  53. module_param(sales_code, charp, 0444);
  54. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  55. static char __read_mostly *f_mode;
  56. module_param(f_mode, charp, 0444);
  57. #endif
  58. static const char *sec_voter_name[] = {
  59. FOREACH_VOTER(GENERATE_STRING)
  60. };
  61. static enum power_supply_property sec_battery_props[] = {
  62. POWER_SUPPLY_PROP_STATUS,
  63. POWER_SUPPLY_PROP_CHARGE_TYPE,
  64. POWER_SUPPLY_PROP_HEALTH,
  65. POWER_SUPPLY_PROP_PRESENT,
  66. POWER_SUPPLY_PROP_ONLINE,
  67. POWER_SUPPLY_PROP_TECHNOLOGY,
  68. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  69. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  70. POWER_SUPPLY_PROP_CURRENT_NOW,
  71. POWER_SUPPLY_PROP_CURRENT_AVG,
  72. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  73. POWER_SUPPLY_PROP_CHARGE_FULL,
  74. POWER_SUPPLY_PROP_CHARGE_NOW,
  75. POWER_SUPPLY_PROP_CAPACITY,
  76. POWER_SUPPLY_PROP_TEMP,
  77. POWER_SUPPLY_PROP_TEMP_AMBIENT,
  78. #if IS_ENABLED(CONFIG_FUELGAUGE_MAX77705)
  79. POWER_SUPPLY_PROP_POWER_NOW,
  80. POWER_SUPPLY_PROP_POWER_AVG,
  81. #endif
  82. POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
  83. POWER_SUPPLY_PROP_CHARGE_COUNTER,
  84. };
  85. static enum power_supply_property sec_power_props[] = {
  86. POWER_SUPPLY_PROP_ONLINE,
  87. };
  88. static enum power_supply_property sec_wireless_props[] = {
  89. POWER_SUPPLY_PROP_ONLINE,
  90. POWER_SUPPLY_PROP_PRESENT,
  91. };
  92. static enum power_supply_property sec_ac_props[] = {
  93. POWER_SUPPLY_PROP_ONLINE,
  94. POWER_SUPPLY_PROP_TEMP,
  95. };
  96. static enum power_supply_property sec_otg_props[] = {
  97. POWER_SUPPLY_PROP_ONLINE,
  98. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  99. };
  100. static char *supply_list[] = {
  101. "battery",
  102. };
  103. const char *sb_get_ct_str(int ct)
  104. {
  105. switch (ct) {
  106. case SEC_BATTERY_CABLE_UNKNOWN:
  107. return "UNKNOWN";
  108. case SEC_BATTERY_CABLE_NONE:
  109. return "NONE";
  110. case SEC_BATTERY_CABLE_PREPARE_TA:
  111. return "PREPARE_TA";
  112. case SEC_BATTERY_CABLE_TA:
  113. return "TA";
  114. case SEC_BATTERY_CABLE_USB:
  115. return "USB";
  116. case SEC_BATTERY_CABLE_USB_CDP:
  117. return "USB_CDP";
  118. case SEC_BATTERY_CABLE_9V_TA:
  119. return "9V_TA";
  120. case SEC_BATTERY_CABLE_9V_ERR:
  121. return "9V_ERR";
  122. case SEC_BATTERY_CABLE_9V_UNKNOWN:
  123. return "9V_UNKNOWN";
  124. case SEC_BATTERY_CABLE_12V_TA:
  125. return "12V_TA";
  126. case SEC_BATTERY_CABLE_WIRELESS:
  127. return "WC";
  128. case SEC_BATTERY_CABLE_HV_WIRELESS:
  129. return "HV_WC";
  130. case SEC_BATTERY_CABLE_PMA_WIRELESS:
  131. return "PMA_WC";
  132. case SEC_BATTERY_CABLE_WIRELESS_PACK:
  133. return "WC_PACK";
  134. case SEC_BATTERY_CABLE_WIRELESS_HV_PACK:
  135. return "WC_HV_PACK";
  136. case SEC_BATTERY_CABLE_WIRELESS_STAND:
  137. return "WC_STAND";
  138. case SEC_BATTERY_CABLE_WIRELESS_HV_STAND:
  139. return "WC_HV_STAND";
  140. case SEC_BATTERY_CABLE_QC20:
  141. return "QC20";
  142. case SEC_BATTERY_CABLE_QC30:
  143. return "QC30";
  144. case SEC_BATTERY_CABLE_PDIC:
  145. return "PDIC";
  146. case SEC_BATTERY_CABLE_UARTOFF:
  147. return "UARTOFF";
  148. case SEC_BATTERY_CABLE_OTG:
  149. return "OTG";
  150. case SEC_BATTERY_CABLE_LAN_HUB:
  151. return "LAN_HUB";
  152. case SEC_BATTERY_CABLE_LO_TA:
  153. return "LO_TA";
  154. case SEC_BATTERY_CABLE_POWER_SHARING:
  155. return "POWER_SHARING";
  156. case SEC_BATTERY_CABLE_HMT_CONNECTED:
  157. return "HMT_CONNECTED";
  158. case SEC_BATTERY_CABLE_HMT_CHARGE:
  159. return "HMT_CHARGE";
  160. case SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT:
  161. return "HV_TA_CHG_LIMIT";
  162. case SEC_BATTERY_CABLE_WIRELESS_VEHICLE:
  163. return "WC_VEHICLE";
  164. case SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE:
  165. return "WC_HV_VEHICLE";
  166. case SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV:
  167. return "WC_HV_PREPARE";
  168. case SEC_BATTERY_CABLE_TIMEOUT:
  169. return "TIMEOUT";
  170. case SEC_BATTERY_CABLE_SMART_OTG:
  171. return "SMART_OTG";
  172. case SEC_BATTERY_CABLE_SMART_NOTG:
  173. return "SMART_NOTG";
  174. case SEC_BATTERY_CABLE_WIRELESS_TX:
  175. return "WC_TX";
  176. case SEC_BATTERY_CABLE_HV_WIRELESS_20:
  177. return "HV_WC_20";
  178. case SEC_BATTERY_CABLE_HV_WIRELESS_20_LIMIT:
  179. return "HV_WC_20_LIMIT";
  180. case SEC_BATTERY_CABLE_WIRELESS_FAKE:
  181. return "WC_FAKE";
  182. case SEC_BATTERY_CABLE_PREPARE_WIRELESS_20:
  183. return "HV_WC_20_PREPARE";
  184. case SEC_BATTERY_CABLE_PDIC_APDO:
  185. return "PDIC_APDO";
  186. case SEC_BATTERY_CABLE_POGO:
  187. return "POGO";
  188. case SEC_BATTERY_CABLE_POGO_9V:
  189. return "POGO_9V";
  190. case SEC_BATTERY_CABLE_FPDO_DC:
  191. return "FPDO_DC";
  192. case SEC_BATTERY_CABLE_WIRELESS_EPP:
  193. return "WC_EPP";
  194. case SEC_BATTERY_CABLE_WIRELESS_EPP_NV:
  195. return "WC_EPP_NV";
  196. case SEC_BATTERY_CABLE_WIRELESS_EPP_FAKE:
  197. return "WC_EPP_FAKE";
  198. default:
  199. return "UNDEFINED";
  200. }
  201. }
  202. EXPORT_SYMBOL(sb_get_ct_str);
  203. const char *sb_get_cm_str(int charging_mode)
  204. {
  205. switch (charging_mode) {
  206. case SEC_BATTERY_CHARGING_NONE:
  207. return "None";
  208. case SEC_BATTERY_CHARGING_1ST:
  209. return "Normal";
  210. case SEC_BATTERY_CHARGING_2ND:
  211. return "Additional";
  212. case SEC_BATTERY_CHARGING_RECHARGING:
  213. return "Re-Charging";
  214. default:
  215. return "UNDEFINED";
  216. }
  217. }
  218. EXPORT_SYMBOL(sb_get_cm_str);
  219. const char *sb_get_bst_str(int status)
  220. {
  221. switch (status) {
  222. case POWER_SUPPLY_STATUS_UNKNOWN:
  223. return "Unknown";
  224. case POWER_SUPPLY_STATUS_CHARGING:
  225. return "Charging";
  226. case POWER_SUPPLY_STATUS_DISCHARGING:
  227. return "Discharging";
  228. case POWER_SUPPLY_STATUS_NOT_CHARGING:
  229. return "Not-charging";
  230. case POWER_SUPPLY_STATUS_FULL:
  231. return "Full";
  232. default:
  233. return "UNDEFINED";
  234. }
  235. }
  236. EXPORT_SYMBOL(sb_get_bst_str);
  237. const char *sb_get_hl_str(int health)
  238. {
  239. switch (health) {
  240. case POWER_SUPPLY_HEALTH_GOOD:
  241. return "Good";
  242. case POWER_SUPPLY_HEALTH_OVERHEAT:
  243. return "Overheat";
  244. case POWER_SUPPLY_HEALTH_DEAD:
  245. return "Dead";
  246. case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
  247. return "Over voltage";
  248. case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE:
  249. return "Unspecified failure";
  250. case POWER_SUPPLY_HEALTH_COLD:
  251. return "Cold";
  252. case POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE:
  253. return "Watchdog timer expire";
  254. case POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE:
  255. return "Safety timer expire";
  256. case POWER_SUPPLY_HEALTH_OVERCURRENT:
  257. return "Over current";
  258. case POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED:
  259. return "Cal required";
  260. case POWER_SUPPLY_HEALTH_WARM:
  261. return "Warm";
  262. case POWER_SUPPLY_HEALTH_COOL:
  263. return "Cool";
  264. case POWER_SUPPLY_HEALTH_HOT:
  265. return "Hot";
  266. case POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE:
  267. return "UnderVoltage";
  268. case POWER_SUPPLY_EXT_HEALTH_OVERHEATLIMIT:
  269. return "OverheatLimit";
  270. case POWER_SUPPLY_EXT_HEALTH_VSYS_OVP:
  271. return "VsysOVP";
  272. case POWER_SUPPLY_EXT_HEALTH_VBAT_OVP:
  273. return "VbatOVP";
  274. case POWER_SUPPLY_EXT_HEALTH_DC_ERR:
  275. return "DCErr";
  276. default:
  277. return "UNDEFINED";
  278. }
  279. }
  280. EXPORT_SYMBOL(sb_get_hl_str);
  281. const char *sb_get_tz_str(int tz)
  282. {
  283. switch (tz) {
  284. case BAT_THERMAL_NORMAL:
  285. return "Normal";
  286. case BAT_THERMAL_COLD:
  287. return "COLD";
  288. case BAT_THERMAL_COOL3:
  289. return "COOL3";
  290. case BAT_THERMAL_COOL2:
  291. return "COOL2";
  292. case BAT_THERMAL_COOL1:
  293. return "COOL1";
  294. case BAT_THERMAL_WARM:
  295. return "WARM";
  296. case BAT_THERMAL_OVERHEAT:
  297. return "OVERHEAT";
  298. case BAT_THERMAL_OVERHEATLIMIT:
  299. return "OVERHEATLIM";
  300. default:
  301. return "UNDEFINED";
  302. }
  303. }
  304. EXPORT_SYMBOL(sb_get_tz_str);
  305. const char *sb_charge_mode_str(int charge_mode)
  306. {
  307. switch (charge_mode) {
  308. case SEC_BAT_CHG_MODE_BUCK_OFF:
  309. return "Buck-Off";
  310. case SEC_BAT_CHG_MODE_CHARGING_OFF:
  311. return "Charging-Off";
  312. case SEC_BAT_CHG_MODE_PASS_THROUGH:
  313. return "Pass-Through";
  314. case SEC_BAT_CHG_MODE_CHARGING:
  315. return "Charging-On";
  316. case SEC_BAT_CHG_MODE_OTG_ON:
  317. return "OTG-On";
  318. case SEC_BAT_CHG_MODE_OTG_OFF:
  319. return "OTG-Off";
  320. case SEC_BAT_CHG_MODE_UNO_ON:
  321. return "UNO-On";
  322. case SEC_BAT_CHG_MODE_UNO_OFF:
  323. return "UNO-Off";
  324. case SEC_BAT_CHG_MODE_UNO_ONLY:
  325. return "UNO-Only";
  326. case SEC_BAT_CHG_MODE_NOT_SET:
  327. return "Not-Set";
  328. case SEC_BAT_CHG_MODE_MAX:
  329. return "Max";
  330. default:
  331. return "UNDEFINED";
  332. }
  333. }
  334. EXPORT_SYMBOL(sb_charge_mode_str);
  335. const char *sb_rx_type_str(int type)
  336. {
  337. switch (type) {
  338. case NO_DEV:
  339. return "No Dev";
  340. case OTHER_DEV:
  341. return "Other Dev";
  342. case SS_GEAR:
  343. return "Gear";
  344. case SS_PHONE:
  345. return "Phone";
  346. case SS_BUDS:
  347. return "Buds";
  348. default:
  349. return "UNDEFINED";
  350. }
  351. }
  352. EXPORT_SYMBOL(sb_rx_type_str);
  353. const char *sb_vout_ctr_mode_str(int vout_mode)
  354. {
  355. switch (vout_mode) {
  356. case WIRELESS_VOUT_OFF:
  357. return "Set VOUT Off";
  358. case WIRELESS_VOUT_NORMAL_VOLTAGE:
  359. return "Set VOUT NV";
  360. case WIRELESS_VOUT_RESERVED:
  361. return "Set VOUT Rsv";
  362. case WIRELESS_VOUT_HIGH_VOLTAGE:
  363. return "Set VOUT HV";
  364. case WIRELESS_VOUT_CC_CV_VOUT:
  365. return "Set VOUT CV";
  366. case WIRELESS_VOUT_CALL:
  367. return "Set VOUT Call";
  368. case WIRELESS_VOUT_5V:
  369. return "Set VOUT 5V";
  370. case WIRELESS_VOUT_9V:
  371. return "Set VOUT 9V";
  372. case WIRELESS_VOUT_10V:
  373. return "Set VOUT 10V";
  374. case WIRELESS_VOUT_11V:
  375. return "Set VOUT 11V";
  376. case WIRELESS_VOUT_12V:
  377. return "Set VOUT 12V";
  378. case WIRELESS_VOUT_12_5V:
  379. return "Set VOUT 12.5V";
  380. case WIRELESS_VOUT_4_5V_STEP:
  381. return "Set VOUT 4.5V Step";
  382. case WIRELESS_VOUT_5V_STEP:
  383. return "Set VOUT 5V Step";
  384. case WIRELESS_VOUT_5_5V_STEP:
  385. return "Set VOUT 5.5V Step";
  386. case WIRELESS_VOUT_9V_STEP:
  387. return "Set VOUT 9V Step";
  388. case WIRELESS_VOUT_10V_STEP:
  389. return "Set VOUT 10V Step";
  390. case WIRELESS_VOUT_OTG:
  391. return "Set VOUT OTG";
  392. case WIRELESS_VOUT_5_5V:
  393. return "Set VOUT 5.5V";
  394. default:
  395. return "UNDEFINED";
  396. }
  397. }
  398. EXPORT_SYMBOL(sb_vout_ctr_mode_str);
  399. const char *sb_rx_vout_str(int vout)
  400. {
  401. switch (vout) {
  402. case MFC_VOUT_4_5V:
  403. return "VOUT 4.5V";
  404. case MFC_VOUT_4_7V:
  405. return "VOUT 4.7V";
  406. case MFC_VOUT_4_8V:
  407. return "VOUT 4.8V";
  408. case MFC_VOUT_4_9V:
  409. return "VOUT 4.9V";
  410. case MFC_VOUT_5V:
  411. return "VOUT 5V";
  412. case MFC_VOUT_5_5V:
  413. return "VOUT 5.5V";
  414. case MFC_VOUT_6V:
  415. return "VOUT 6V";
  416. case MFC_VOUT_7V:
  417. return "VOUT 7V";
  418. case MFC_VOUT_8V:
  419. return "VOUT 8V";
  420. case MFC_VOUT_9V:
  421. return "VOUT 9V";
  422. case MFC_VOUT_10V:
  423. return "VOUT 10V";
  424. case MFC_VOUT_11V:
  425. return "VOUT 11V";
  426. case MFC_VOUT_12V:
  427. return "VOUT 12V";
  428. case MFC_VOUT_12_5V:
  429. return "VOUT 12.5V";
  430. case MFC_VOUT_OTG:
  431. return "VOUT OTG";
  432. default:
  433. return "UNDEFINED";
  434. }
  435. }
  436. EXPORT_SYMBOL(sb_rx_vout_str);
  437. __visible_for_testing int sec_bat_check_afc_input_current(struct sec_battery_info *battery);
  438. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  439. __visible_for_testing void sec_bat_set_rp_current(struct sec_battery_info *battery, int cable_type);
  440. #endif
  441. unsigned int sec_bat_get_lpmode(void) { return lpcharge; }
  442. void sec_bat_set_lpmode(unsigned int value) { lpcharge = value; }
  443. EXPORT_SYMBOL_KUNIT(sec_bat_set_lpmode);
  444. int sec_bat_get_fgreset(void) { return fg_reset; }
  445. int sec_bat_get_facmode(void) { return factory_mode; }
  446. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  447. void sec_bat_set_facmode(int value) { factory_mode = value; }
  448. #endif
  449. unsigned int sec_bat_get_chgmode(void) { return charging_mode; }
  450. EXPORT_SYMBOL_KUNIT(sec_bat_get_chgmode);
  451. void sec_bat_set_chgmode(unsigned int value) { charging_mode = value; }
  452. EXPORT_SYMBOL_KUNIT(sec_bat_set_chgmode);
  453. unsigned int sec_bat_get_dispd(void) { return pd_disable; }
  454. EXPORT_SYMBOL_KUNIT(sec_bat_get_dispd);
  455. void sec_bat_set_dispd(unsigned int value) { pd_disable = value; }
  456. EXPORT_SYMBOL_KUNIT(sec_bat_set_dispd);
  457. char *sec_bat_get_sales_code(void) {return sales_code; }
  458. #if !defined(CONFIG_SEC_FACTORY)
  459. #define SALE_CODE_STR_LEN 3
  460. bool sales_code_is(char *str)
  461. {
  462. if (sec_bat_get_sales_code() == NULL)
  463. return false;
  464. pr_info("%s: %s\n", __func__, sec_bat_get_sales_code());
  465. return !strncmp(sec_bat_get_sales_code(), str, SALE_CODE_STR_LEN + 1);
  466. }
  467. #endif
  468. static bool check_silent_type(int ct)
  469. {
  470. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  471. if (ct == ATTACHED_DEV_RETRY_TIMEOUT_OPEN_MUIC ||
  472. ct == ATTACHED_DEV_RETRY_AFC_CHARGER_5V_MUIC ||
  473. ct == ATTACHED_DEV_RETRY_AFC_CHARGER_9V_MUIC)
  474. return true;
  475. #endif
  476. return false;
  477. }
  478. static bool check_afc_disabled_type(int ct)
  479. {
  480. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  481. if (ct == ATTACHED_DEV_AFC_CHARGER_DISABLED_MUIC)
  482. return true;
  483. #endif
  484. return false;
  485. }
  486. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  487. __visible_for_testing void sec_bat_divide_limiter_current(struct sec_battery_info *battery, int limiter_current)
  488. {
  489. unsigned int main_current = 0, sub_current = 0, main_current_rate = 0, sub_current_rate = 0;
  490. union power_supply_propval value = {0, };
  491. if (is_pd_apdo_wire_type(battery->cable_type) && battery->pd_list.now_isApdo) {
  492. if (limiter_current < battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC_APDO].fast_charging_current)
  493. limiter_current = battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC_APDO].fast_charging_current;
  494. }
  495. if (battery->pdata->sub_fto && limiter_current >= battery->pdata->sub_fto_current_thresh) {
  496. value.intval = 3;
  497. psy_do_property(battery->pdata->sub_limiter_name, set,
  498. POWER_SUPPLY_EXT_PROP_CHG_MODE, value);
  499. } else if (battery->pdata->sub_fto && limiter_current < battery->pdata->sub_fto_current_thresh) {
  500. value.intval = 0;
  501. psy_do_property(battery->pdata->sub_limiter_name, set,
  502. POWER_SUPPLY_EXT_PROP_CHG_MODE, value);
  503. }
  504. if (limiter_current >= battery->pdata->zone3_limiter_current) {
  505. main_current_rate = battery->pdata->main_zone3_current_rate;
  506. sub_current_rate = battery->pdata->sub_zone3_current_rate;
  507. } else if (limiter_current >= battery->pdata->zone2_limiter_current) {
  508. main_current_rate = battery->pdata->main_zone2_current_rate;
  509. sub_current_rate = battery->pdata->sub_zone2_current_rate;
  510. } else if (limiter_current > battery->pdata->zone1_limiter_current) {
  511. main_current_rate = battery->pdata->main_zone1_current_rate;
  512. sub_current_rate = battery->pdata->sub_zone1_current_rate;
  513. } else { /* like discharge current 100mA */
  514. main_current_rate = battery->pdata->min_main_limiter_current;
  515. sub_current_rate = battery->pdata->min_sub_limiter_current;
  516. }
  517. /* divide setting has ratio value(percent value, max 99%) and current value(ex 1500mA) */
  518. main_current = (main_current_rate > 100) ? main_current_rate : ((main_current_rate * limiter_current) / 100);
  519. sub_current = (sub_current_rate > 100) ? sub_current_rate : ((sub_current_rate * limiter_current) / 100);
  520. pr_info("%s: (%d) -> main_current(%d), sub_current(%d)\n", __func__,
  521. limiter_current, main_current, sub_current); // debug
  522. if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL3) {
  523. if (battery->pdata->limiter_main_cool3_current)
  524. main_current = battery->pdata->limiter_main_cool3_current;
  525. if (battery->pdata->limiter_sub_cool3_current)
  526. sub_current = battery->pdata->limiter_sub_cool3_current;
  527. } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL2) {
  528. if (battery->pdata->limiter_main_cool2_current)
  529. main_current = battery->pdata->limiter_main_cool2_current;
  530. if (battery->pdata->limiter_sub_cool2_current)
  531. sub_current = battery->pdata->limiter_sub_cool2_current;
  532. } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING) {
  533. if (battery->pdata->limiter_main_warm_current)
  534. main_current = battery->pdata->limiter_main_warm_current;
  535. if (battery->pdata->limiter_sub_warm_current)
  536. sub_current = battery->pdata->limiter_sub_warm_current;
  537. } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL1) {
  538. if (battery->pdata->limiter_main_cool1_current)
  539. main_current = battery->pdata->limiter_main_cool1_current;
  540. if (battery->pdata->limiter_sub_cool1_current)
  541. sub_current = battery->pdata->limiter_sub_cool1_current;
  542. }
  543. /* calculate main battery current */
  544. if (main_current > battery->pdata->max_main_limiter_current)
  545. main_current = battery->pdata->max_main_limiter_current;
  546. /* calculate sub battery current */
  547. if (sub_current > battery->pdata->max_sub_limiter_current)
  548. sub_current = battery->pdata->max_sub_limiter_current;
  549. pr_info("%s: main_current(%d), sub_current(%d)\n", __func__,
  550. main_current, sub_current);
  551. battery->main_current = main_current;
  552. battery->sub_current = sub_current;
  553. }
  554. EXPORT_SYMBOL_KUNIT(sec_bat_divide_limiter_current);
  555. __visible_for_testing void sec_bat_set_limiter_current(struct sec_battery_info *battery)
  556. {
  557. union power_supply_propval value = {0, };
  558. pr_info("%s: charge_m(%d), charge_s(%d)\n", __func__,
  559. battery->main_current, battery->sub_current);
  560. value.intval = battery->main_current;
  561. psy_do_property(battery->pdata->main_limiter_name, set,
  562. POWER_SUPPLY_EXT_PROP_FASTCHG_LIMIT_CURRENT, value);
  563. value.intval = battery->sub_current;
  564. psy_do_property(battery->pdata->sub_limiter_name, set,
  565. POWER_SUPPLY_EXT_PROP_FASTCHG_LIMIT_CURRENT, value);
  566. }
  567. EXPORT_SYMBOL_KUNIT(sec_bat_set_limiter_current);
  568. #endif
  569. __visible_for_testing int set_charging_current(void *data, int v)
  570. {
  571. union power_supply_propval value = {0, };
  572. struct sec_battery_info *battery = data;
  573. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  574. sec_bat_divide_limiter_current(battery, v);
  575. /* to set higher current, ex) 500mA -> 1000mA */
  576. if (battery->charging_current < v) {
  577. pr_info("%s: set limiter current right away\n", __func__);
  578. sec_bat_set_limiter_current(battery);
  579. }
  580. #endif
  581. value.intval = v;
  582. if (is_wireless_type(battery->cable_type)) {
  583. if (battery->charging_current < v) {
  584. psy_do_property(battery->pdata->charger_name, set,
  585. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, value);
  586. } else {
  587. psy_do_property(battery->pdata->charger_name, set,
  588. POWER_SUPPLY_EXT_PROP_CONSTANT_CHARGE_CURRENT_WRL, value);
  589. }
  590. } else {
  591. psy_do_property(battery->pdata->charger_name, set,
  592. POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, value);
  593. }
  594. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  595. /* to set lower current, ex) 1000mA -> 500mA */
  596. if (battery->charging_current > v) {
  597. if (!is_wireless_type(battery->cable_type)) {
  598. if (is_pd_apdo_wire_type(battery->cable_type) && battery->pd_list.now_isApdo) {
  599. battery->set_lower_curr = true;
  600. pr_info("%s: set limiter current in next polling\n", __func__);
  601. } else {
  602. pr_info("%s: set limiter current right away\n", __func__);
  603. sec_bat_set_limiter_current(battery);
  604. }
  605. }
  606. }
  607. #endif
  608. battery->charging_current = v;
  609. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  610. pr_info("%s: power(%d), input(%d), charge(%d), charge_m(%d), charge_s(%d)\n", __func__,
  611. battery->charge_power, battery->input_current, battery->charging_current, battery->main_current, battery->sub_current);
  612. #else
  613. pr_info("%s: power(%d), input(%d), charge(%d)\n", __func__,
  614. battery->charge_power, battery->input_current, battery->charging_current);
  615. #endif
  616. return v;
  617. }
  618. EXPORT_SYMBOL_KUNIT(set_charging_current);
  619. __visible_for_testing int set_input_current(void *data, int v)
  620. {
  621. union power_supply_propval value = {0, };
  622. struct sec_battery_info *battery = data;
  623. battery->input_current = v;
  624. battery->charge_power = mW_by_mVmA(battery->input_voltage, v);
  625. if (battery->charge_power > battery->max_charge_power)
  626. battery->max_charge_power = battery->charge_power;
  627. value.intval = v;
  628. psy_do_property(battery->pdata->charger_name, set,
  629. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, value);
  630. return v;
  631. }
  632. EXPORT_SYMBOL_KUNIT(set_input_current);
  633. __visible_for_testing int set_float_voltage(void *data, int voltage)
  634. {
  635. struct sec_battery_info *battery = data;
  636. union power_supply_propval value = {0, };
  637. value.intval = voltage;
  638. psy_do_property(battery->pdata->charger_name, set,
  639. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, value);
  640. return voltage;
  641. }
  642. EXPORT_SYMBOL_KUNIT(set_float_voltage);
  643. __visible_for_testing int set_dc_float_voltage(void *data, int voltage)
  644. {
  645. struct sec_battery_info *battery = data;
  646. union power_supply_propval value = {0, };
  647. value.intval = voltage;
  648. psy_do_property(battery->pdata->charger_name, set,
  649. POWER_SUPPLY_EXT_PROP_DIRECT_CONSTANT_CHARGE_VOLTAGE, value);
  650. return voltage;
  651. }
  652. EXPORT_SYMBOL_KUNIT(set_dc_float_voltage);
  653. __visible_for_testing int set_topoff_current(void *data, int v)
  654. {
  655. struct sec_battery_info *battery = data;
  656. union power_supply_propval value = {0, };
  657. bool do_chgen_vote = false;
  658. if (battery->charging_mode == SEC_BATTERY_CHARGING_2ND ||
  659. battery->pdata->full_check_type == SEC_BATTERY_FULLCHARGED_CHGPSY ||
  660. battery->pdata->full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT)
  661. do_chgen_vote = true;
  662. if (do_chgen_vote)
  663. sec_vote(battery->chgen_vote, VOTER_TOPOFF_CHANGE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  664. value.intval = v;
  665. psy_do_property(battery->pdata->charger_name, set,
  666. POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, value);
  667. if (do_chgen_vote)
  668. sec_vote(battery->chgen_vote, VOTER_TOPOFF_CHANGE, false, 0);
  669. battery->topoff_condition = v;
  670. return v;
  671. }
  672. EXPORT_SYMBOL_KUNIT(set_topoff_current);
  673. int get_chg_power_type(int ct, int ws, int pd_max_pw, int max_pw)
  674. {
  675. if (!is_wireless_type(ct)) {
  676. if (is_pd_wire_type(ct) &&
  677. pd_max_pw >= HV_CHARGER_STATUS_STANDARD4)
  678. return SFC_45W;
  679. else if (is_pd_wire_type(ct) &&
  680. pd_max_pw >= HV_CHARGER_STATUS_STANDARD3)
  681. return SFC_25W;
  682. else if (is_hv_wire_12v_type(ct) ||
  683. max_pw >= HV_CHARGER_STATUS_STANDARD2) /* 20000mW */
  684. return AFC_12V_OR_20W;
  685. else if (is_hv_wire_type(ct) ||
  686. (is_pd_wire_type(ct) &&
  687. pd_max_pw >= HV_CHARGER_STATUS_STANDARD1) ||
  688. #if !defined(CONFIG_BC12_DEVICE)
  689. ws == SEC_BATTERY_CABLE_PREPARE_TA ||
  690. #endif
  691. max_pw >= HV_CHARGER_STATUS_STANDARD1) /* 12000mW */
  692. return AFC_9V_OR_15W;
  693. }
  694. return NORMAL_TA;
  695. }
  696. EXPORT_SYMBOL_KUNIT(get_chg_power_type);
  697. static void sec_bat_run_input_check_work(struct sec_battery_info *battery, int work_delay)
  698. {
  699. unsigned int ws_duration = 0;
  700. unsigned int offset = 3; /* 3 seconds */
  701. pr_info("%s: for %s after %d msec\n", __func__, sb_get_ct_str(battery->cable_type), work_delay);
  702. cancel_delayed_work(&battery->input_check_work);
  703. ws_duration = offset + (work_delay / 1000);
  704. __pm_wakeup_event(battery->input_ws, jiffies_to_msecs(HZ * ws_duration));
  705. queue_delayed_work(battery->monitor_wqueue,
  706. &battery->input_check_work, msecs_to_jiffies(work_delay));
  707. }
  708. static void sec_bat_cancel_input_check_work(struct sec_battery_info *battery)
  709. {
  710. cancel_delayed_work(&battery->input_check_work);
  711. battery->input_check_cnt = 0;
  712. }
  713. static bool sec_bat_recheck_input_work(struct sec_battery_info *battery)
  714. {
  715. return !delayed_work_pending(&battery->input_check_work) &&
  716. (battery->current_event & SEC_BAT_CURRENT_EVENT_SELECT_PDO);
  717. }
  718. __visible_for_testing int sec_bat_change_iv(void *data, int voltage)
  719. {
  720. struct sec_battery_info *battery = data;
  721. if ((is_hv_wire_type(battery->cable_type) || is_hv_wire_type(battery->wire_status)) &&
  722. (battery->cable_type != SEC_BATTERY_CABLE_QC30)) {
  723. /* no need to set afc prepare current in already 9v cable status */
  724. if (!is_hv_wire_type(battery->wire_status) ||
  725. voltage != SEC_INPUT_VOLTAGE_9V)
  726. sec_bat_check_afc_input_current(battery);
  727. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  728. #if IS_ENABLED(CONFIG_MTK_CHARGER) && IS_ENABLED(CONFIG_AFC_CHARGER)
  729. afc_set_voltage(voltage);
  730. #else
  731. muic_afc_request_voltage(AFC_REQUEST_CHARGER, voltage/1000);
  732. #endif
  733. #if defined(CONFIG_BC12_DEVICE)
  734. battery->input_voltage = voltage;
  735. #endif
  736. #endif
  737. } else if (is_pd_wire_type(battery->cable_type) ||
  738. (is_pd_wire_type(battery->wire_status) && is_slate_mode(battery))) {
  739. int curr_pdo = 0, pdo = 0, iv = 0, icl = 0;
  740. if (voltage == SEC_INPUT_VOLTAGE_APDO) {
  741. pr_info("%s : Doesn't control input voltage during Direct Charging\n", __func__);
  742. return voltage;
  743. }
  744. iv = voltage;
  745. if (sec_pd_get_pdo_power(&pdo, &iv, &iv, &icl) <= 0) {
  746. pr_err("%s: failed to get pdo\n", __func__);
  747. return -1;
  748. }
  749. pr_info("%s: target pdo = %d, iv = %d, icl = %d\n", __func__, pdo, iv, icl);
  750. if (sec_pd_get_current_pdo(&curr_pdo) < 0) {
  751. pr_err("%s: failed to get current pdo\n", __func__);
  752. return -1;
  753. }
  754. if (curr_pdo != pdo) {
  755. /* change input current before request new pdo if new pdo's input current is less than now */
  756. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_SELECT_PDO,
  757. SEC_BAT_CURRENT_EVENT_SELECT_PDO);
  758. sec_vote(battery->input_vote, VOTER_SELECT_PDO, true,
  759. min(battery->sink_status.power_list[pdo].max_current,
  760. battery->sink_status.power_list[curr_pdo].max_current));
  761. sec_bat_run_input_check_work(battery, 1000);
  762. #if !defined(CONFIG_BC12_DEVICE)
  763. battery->pdic_ps_rdy = false;
  764. #endif
  765. }
  766. if (sec_pd_is_apdo(pdo))
  767. sec_pd_select_pps(pdo, voltage, icl);
  768. else
  769. sec_pd_select_pdo(pdo);
  770. }
  771. return voltage;
  772. }
  773. EXPORT_SYMBOL_KUNIT(sec_bat_change_iv);
  774. void sec_bat_set_misc_event(struct sec_battery_info *battery,
  775. unsigned int misc_event_val, unsigned int misc_event_mask)
  776. {
  777. unsigned int temp = battery->misc_event;
  778. mutex_lock(&battery->misclock);
  779. battery->misc_event &= ~misc_event_mask;
  780. battery->misc_event |= misc_event_val;
  781. pr_info("%s: misc event before(0x%x), after(0x%x)\n",
  782. __func__, temp, battery->misc_event);
  783. mutex_unlock(&battery->misclock);
  784. if (battery->prev_misc_event != battery->misc_event) {
  785. cancel_delayed_work(&battery->misc_event_work);
  786. __pm_stay_awake(battery->misc_event_ws);
  787. queue_delayed_work(battery->monitor_wqueue,
  788. &battery->misc_event_work, 0);
  789. }
  790. }
  791. EXPORT_SYMBOL(sec_bat_set_misc_event);
  792. void sec_bat_set_tx_event(struct sec_battery_info *battery,
  793. unsigned int tx_event_val, unsigned int tx_event_mask)
  794. {
  795. unsigned int temp = battery->tx_event;
  796. mutex_lock(&battery->txeventlock);
  797. battery->tx_event &= ~tx_event_mask;
  798. battery->tx_event |= tx_event_val;
  799. pr_info("@Tx_Mode %s: tx event before(0x%x), after(0x%x)\n",
  800. __func__, temp, battery->tx_event);
  801. if (temp != battery->tx_event) {
  802. /* Assure receiving tx_event to App for sleep case */
  803. __pm_wakeup_event(battery->tx_event_ws, jiffies_to_msecs(HZ * 2));
  804. power_supply_changed(battery->psy_bat);
  805. }
  806. mutex_unlock(&battery->txeventlock);
  807. }
  808. EXPORT_SYMBOL_KUNIT(sec_bat_set_tx_event);
  809. void sec_bat_set_current_event(struct sec_battery_info *battery,
  810. unsigned int current_event_val, unsigned int current_event_mask)
  811. {
  812. unsigned int temp = battery->current_event;
  813. mutex_lock(&battery->current_eventlock);
  814. battery->current_event &= ~current_event_mask;
  815. battery->current_event |= current_event_val;
  816. pr_info("%s: current event before(0x%x), after(0x%x)\n",
  817. __func__, temp, battery->current_event);
  818. mutex_unlock(&battery->current_eventlock);
  819. }
  820. EXPORT_SYMBOL(sec_bat_set_current_event);
  821. void sec_bat_set_temp_control_test(struct sec_battery_info *battery, bool temp_enable)
  822. {
  823. if (temp_enable) {
  824. if (battery->current_event & SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST) {
  825. pr_info("%s : BATT_TEMP_CONTROL_TEST already ENABLED\n", __func__);
  826. return;
  827. }
  828. pr_info("%s : BATT_TEMP_CONTROL_TEST ENABLE\n", __func__);
  829. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST,
  830. SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST);
  831. battery->pdata->usb_temp_check_type_backup = battery->pdata->usb_thm_info.check_type;
  832. battery->pdata->usb_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
  833. battery->overheatlimit_threshold_backup = battery->overheatlimit_threshold;
  834. battery->overheatlimit_threshold = 990;
  835. battery->overheatlimit_recovery_backup = battery->overheatlimit_recovery;
  836. battery->overheatlimit_recovery = 980;
  837. } else {
  838. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST)) {
  839. pr_info("%s : BATT_TEMP_CONTROL_TEST already END\n", __func__);
  840. return;
  841. }
  842. pr_info("%s : BATT_TEMP_CONTROL_TEST END\n", __func__);
  843. sec_bat_set_current_event(battery, 0,
  844. SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST);
  845. battery->pdata->usb_thm_info.check_type = battery->pdata->usb_temp_check_type_backup;
  846. battery->overheatlimit_threshold = battery->overheatlimit_threshold_backup;
  847. battery->overheatlimit_recovery = battery->overheatlimit_recovery_backup;
  848. }
  849. }
  850. EXPORT_SYMBOL(sec_bat_set_temp_control_test);
  851. void sec_bat_change_default_current(struct sec_battery_info *battery,
  852. int cable_type, int input, int output)
  853. {
  854. #if defined(CONFIG_ENG_BATTERY_CONCEPT)
  855. if (!battery->test_max_current)
  856. #endif
  857. battery->pdata->charging_current[cable_type].input_current_limit = input;
  858. #if defined(CONFIG_ENG_BATTERY_CONCEPT)
  859. if (!battery->test_charge_current)
  860. #endif
  861. battery->pdata->charging_current[cable_type].fast_charging_current = output;
  862. pr_info("%s: cable_type: %d(%d,%d), input: %d, output: %d\n",
  863. __func__, cable_type, battery->cable_type, battery->wire_status,
  864. battery->pdata->charging_current[cable_type].input_current_limit,
  865. battery->pdata->charging_current[cable_type].fast_charging_current);
  866. }
  867. EXPORT_SYMBOL_KUNIT(sec_bat_change_default_current);
  868. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  869. #if defined(CONFIG_SEC_FACTORY)
  870. static bool sec_bat_usb_factory_set_vote(struct sec_battery_info *battery, bool vote_en)
  871. {
  872. if (vote_en) {
  873. if ((battery->cable_type == SEC_BATTERY_CABLE_USB) &&
  874. !(battery->batt_f_mode == IB_MODE) &&
  875. !sec_bat_get_lpmode())
  876. if (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL_NONE) {
  877. sec_vote(battery->fcc_vote, VOTER_USB_FAC_100MA, true, 100);
  878. sec_vote(battery->input_vote, VOTER_USB_FAC_100MA, true, 100);
  879. dev_info(battery->dev, "%s: usb factory 100mA\n", __func__);
  880. return true;
  881. }
  882. } else {
  883. if ((battery->cable_type == SEC_BATTERY_CABLE_USB) &&
  884. !(battery->batt_f_mode == IB_MODE) && !sec_bat_get_lpmode())
  885. if (battery->sink_status.rp_currentlvl != RP_CURRENT_LEVEL_NONE) {
  886. sec_vote(battery->fcc_vote, VOTER_USB_FAC_100MA, false, 100);
  887. sec_vote(battery->input_vote, VOTER_USB_FAC_100MA, false, 100);
  888. dev_info(battery->dev, "%s: recover usb factory 100mA\n", __func__);
  889. }
  890. }
  891. return false;
  892. }
  893. #endif
  894. static void sec_bat_usb_factory_clear(struct sec_battery_info *battery)
  895. {
  896. union power_supply_propval val = {0, };
  897. #if defined(CONFIG_SEC_FACTORY)
  898. if (battery->usb_factory_slate_mode || (battery->batt_f_mode == IB_MODE)) {
  899. if (is_slate_mode(battery)) {
  900. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SLATE);
  901. sec_vote(battery->chgen_vote, VOTER_SLATE, false, 0);
  902. sec_vote(battery->chgen_vote, VOTER_SMART_SLATE, false, 0);
  903. sec_bat_set_mfc_on(battery, WPC_EN_SLATE);
  904. dev_info(battery->dev, "%s: disable slate mode\n", __func__);
  905. }
  906. battery->usb_factory_slate_mode = false;
  907. }
  908. #endif
  909. if (battery->batt_f_mode == IB_MODE) {
  910. val.intval = 0;
  911. psy_do_property(battery->pdata->charger_name, set,
  912. POWER_SUPPLY_EXT_PROP_IB_MODE, val);
  913. } else if (battery->batt_f_mode == OB_MODE) {
  914. val.intval = 0;
  915. psy_do_property(battery->pdata->charger_name, set,
  916. POWER_SUPPLY_EXT_PROP_OB_MODE_CABLE_REMOVED, val);
  917. }
  918. }
  919. #endif
  920. #if !defined(CONFIG_SEC_FACTORY)
  921. #if defined(CONFIG_SUPPORT_HV_CTRL)
  922. static int sec_bat_chk_siop_scenario_idx(struct sec_battery_info *battery,
  923. int siop_level);
  924. static bool sec_bat_chk_siop_skip_scenario(struct sec_battery_info *battery,
  925. int ct, int ws, int scenario_idx);
  926. __visible_for_testing bool sec_bat_change_vbus_condition(int ct, unsigned int evt)
  927. {
  928. if (!(is_hv_wire_type(ct) || is_pd_wire_type(ct)) ||
  929. (ct == SEC_BATTERY_CABLE_QC30))
  930. return false;
  931. if ((evt & SEC_BAT_CURRENT_EVENT_AFC) ||
  932. (evt & SEC_BAT_CURRENT_EVENT_SELECT_PDO))
  933. return false;
  934. return true;
  935. }
  936. EXPORT_SYMBOL_KUNIT(sec_bat_change_vbus_condition);
  937. __visible_for_testing bool sec_bat_change_vbus(struct sec_battery_info *battery,
  938. int ct, unsigned int evt, int siop_level)
  939. {
  940. int s_idx = -1;
  941. if (battery->pdata->chg_thm_info.check_type == SEC_BATTERY_TEMP_CHECK_NONE ||
  942. battery->store_mode ||
  943. ((battery->siop_level == 80) && is_wired_type(battery->cable_type)))
  944. return false;
  945. if (!sec_bat_change_vbus_condition(ct, evt))
  946. return false;
  947. s_idx = sec_bat_chk_siop_scenario_idx(battery, battery->siop_level);
  948. if ((siop_level >= 100) ||
  949. sec_bat_chk_siop_skip_scenario(battery,
  950. battery->cable_type, battery->wire_status, s_idx))
  951. sec_vote(battery->iv_vote, VOTER_SIOP, false, 0);
  952. else {
  953. sec_vote(battery->iv_vote, VOTER_SIOP, true, SEC_INPUT_VOLTAGE_5V);
  954. pr_info("%s: vbus set 5V by level(%d), Cable(%s, %s, %d, %d)\n",
  955. __func__, battery->siop_level,
  956. sb_get_ct_str(ct), sb_get_ct_str(battery->wire_status),
  957. battery->muic_cable_type, battery->pd_usb_attached);
  958. return true;
  959. }
  960. return false;
  961. }
  962. EXPORT_SYMBOL_KUNIT(sec_bat_change_vbus);
  963. #else
  964. __visible_for_testing bool sec_bat_change_vbus(struct sec_battery_info *battery,
  965. int ct, unsigned int evt, int siop_level)
  966. {
  967. return false;
  968. }
  969. EXPORT_SYMBOL_KUNIT(sec_bat_change_vbus);
  970. #endif
  971. #endif
  972. __visible_for_testing int sec_bat_check_afc_input_current(struct sec_battery_info *battery)
  973. {
  974. int work_delay = 0;
  975. int input_current;
  976. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_AFC,
  977. (SEC_BAT_CURRENT_EVENT_CHG_LIMIT | SEC_BAT_CURRENT_EVENT_AFC));
  978. if (!is_wireless_type(battery->cable_type)) {
  979. input_current = battery->pdata->pre_afc_input_current; // 1000mA
  980. work_delay = battery->pdata->pre_afc_work_delay;
  981. } else {
  982. input_current = battery->pdata->pre_wc_afc_input_current;
  983. /* do not reduce this time, this is for noble pad */
  984. work_delay = battery->pdata->pre_wc_afc_work_delay;
  985. }
  986. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, true, input_current);
  987. if (!delayed_work_pending(&battery->input_check_work))
  988. sec_bat_run_input_check_work(battery, work_delay);
  989. pr_info("%s: change input_current(%d), cable_type(%d)\n", __func__, input_current, battery->cable_type);
  990. return input_current;
  991. }
  992. EXPORT_SYMBOL_KUNIT(sec_bat_check_afc_input_current);
  993. __visible_for_testing void sec_bat_get_input_current_in_power_list(struct sec_battery_info *battery)
  994. {
  995. int pdo_num = battery->sink_status.current_pdo_num;
  996. int max_input_current = 0;
  997. if (is_pd_apdo_wire_type(battery->wire_status) && battery->pd_list.now_isApdo)
  998. pdo_num = 1;
  999. max_input_current = battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC].input_current_limit =
  1000. battery->sink_status.power_list[pdo_num].max_current;
  1001. battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC_APDO].input_current_limit =
  1002. battery->sink_status.power_list[pdo_num].max_current;
  1003. if (battery->is_fpdo_dc && !(battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE)) {
  1004. max_input_current =
  1005. battery->pdata->charging_current[SEC_BATTERY_CABLE_FPDO_DC].input_current_limit =
  1006. mA_by_mWmV(battery->pdata->pd_charging_charge_power,
  1007. battery->sink_status.power_list[pdo_num].max_voltage);
  1008. battery->pdata->charging_current[SEC_BATTERY_CABLE_FPDO_DC].fast_charging_current =
  1009. battery->sink_status.power_list[pdo_num].max_current * 2;
  1010. }
  1011. pr_info("%s:max_input_current : %dmA, pdo_num : %d\n", __func__, max_input_current, pdo_num);
  1012. sec_vote(battery->input_vote, VOTER_CABLE, true, max_input_current);
  1013. }
  1014. EXPORT_SYMBOL_KUNIT(sec_bat_get_input_current_in_power_list);
  1015. __visible_for_testing void sec_bat_get_charging_current_in_power_list(struct sec_battery_info *battery)
  1016. {
  1017. int max_charging_current = 0, pd_power = 0;
  1018. int pdo_num = battery->sink_status.current_pdo_num;
  1019. if (is_pd_apdo_wire_type(battery->wire_status) && battery->pd_list.now_isApdo)
  1020. pdo_num = 1;
  1021. pd_power = mW_by_mVmA(battery->sink_status.power_list[pdo_num].max_voltage,
  1022. battery->sink_status.power_list[pdo_num].max_current);
  1023. /* We assume that output voltage to float voltage */
  1024. max_charging_current = mA_by_mWmV(pd_power,
  1025. (battery->pdata->chg_float_voltage / battery->pdata->chg_float_voltage_conv));
  1026. max_charging_current = max_charging_current > battery->pdata->max_charging_current ?
  1027. battery->pdata->max_charging_current : max_charging_current;
  1028. battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC].fast_charging_current = max_charging_current;
  1029. #if defined(CONFIG_STEP_CHARGING)
  1030. if (battery->dchg_dc_in_swelling && (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING)) {
  1031. pr_info("%s: max cc(%d) warm_cc(%d)\n", __func__,
  1032. max_charging_current, battery->pdata->wire_warm_current);
  1033. max_charging_current = max(max_charging_current, battery->pdata->wire_warm_current);
  1034. }
  1035. if (is_pd_apdo_wire_type(battery->wire_status) && !battery->pd_list.now_isApdo &&
  1036. battery->step_chg_status < 0)
  1037. #else
  1038. if (is_pd_apdo_wire_type(battery->wire_status) && !battery->pd_list.now_isApdo)
  1039. #endif
  1040. battery->pdata->charging_current[SEC_BATTERY_CABLE_PDIC_APDO].fast_charging_current =
  1041. max_charging_current;
  1042. battery->charge_power = pd_power;
  1043. pr_info("%s:pd_charge_power : %dmW, max_charging_current : %dmA\n", __func__,
  1044. battery->charge_power, max_charging_current);
  1045. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  1046. battery->pdata->charging_current[battery->wire_status].fast_charging_current);
  1047. }
  1048. EXPORT_SYMBOL_KUNIT(sec_bat_get_charging_current_in_power_list);
  1049. #if !defined(CONFIG_SEC_FACTORY)
  1050. void sec_bat_check_temp_ctrl_by_cable(struct sec_battery_info *battery)
  1051. {
  1052. int ct = battery->cable_type;
  1053. int siop_lvl = battery->siop_level;
  1054. bool is_apdo = false;
  1055. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  1056. is_apdo = (is_pd_apdo_wire_type(ct) && battery->pd_list.now_isApdo) ? 1 : 0;
  1057. #endif
  1058. if (battery->pdata->enable_mix_v2)
  1059. sec_bat_check_mix_temp_v2(battery);
  1060. else
  1061. sec_bat_check_mix_temp(battery, ct, siop_lvl, is_apdo);
  1062. if (is_apdo) {
  1063. sec_bat_check_direct_chg_temp(battery, siop_lvl);
  1064. } else if (is_wireless_type(ct)) {
  1065. if (battery->pdata->enable_check_wpc_temp_v2)
  1066. sec_bat_check_wpc_temp_v2(battery);
  1067. else
  1068. sec_bat_check_wpc_temp(battery, ct, siop_lvl);
  1069. } else {
  1070. if (!sec_bat_change_vbus(battery, ct, battery->current_event, siop_lvl)) {
  1071. if (is_pd_wire_type(ct))
  1072. sec_bat_check_pdic_temp(battery, siop_lvl);
  1073. else {
  1074. sec_bat_check_afc_temp(battery, siop_lvl);
  1075. }
  1076. } else if (battery->chg_limit) {
  1077. sec_vote(battery->fcc_vote, VOTER_CHG_TEMP, false, 0);
  1078. sec_vote(battery->input_vote, VOTER_CHG_TEMP, false, 0);
  1079. battery->chg_limit = false;
  1080. }
  1081. }
  1082. if (!is_wireless_all_type(ct))
  1083. sec_bat_check_lrp_temp(battery,
  1084. ct, battery->wire_status, siop_lvl, battery->lcd_status);
  1085. pr_info("%s: ct : %s\n", __func__, sb_get_ct_str(ct));
  1086. }
  1087. #endif
  1088. int sec_bat_set_charging_current(struct sec_battery_info *battery)
  1089. {
  1090. mutex_lock(&battery->iolock);
  1091. if (!is_nocharge_type(battery->cable_type)) {
  1092. #if !defined(CONFIG_SEC_FACTORY)
  1093. sec_bat_check_temp_ctrl_by_cable(battery);
  1094. #endif
  1095. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  1096. /* Calculate wireless input current under the specific conditions (wpc_sleep_mode, chg_limit)*/
  1097. /* VOTER_WPC_CUR */
  1098. if (battery->wc_status != SEC_BATTERY_CABLE_NONE) {
  1099. sec_bat_get_wireless_current(battery);
  1100. }
  1101. #endif
  1102. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  1103. if (battery->dc_float_voltage_set) {
  1104. int age_step = battery->pdata->age_step;
  1105. int chg_step = battery->step_chg_status;
  1106. pr_info("%s : step float voltage = %d\n", __func__,
  1107. battery->pdata->dc_step_chg_val_vfloat[age_step][chg_step]);
  1108. sec_vote(battery->dc_fv_vote, VOTER_DC_STEP_CHARGE, true,
  1109. battery->pdata->dc_step_chg_val_vfloat[age_step][chg_step]);
  1110. battery->dc_float_voltage_set = false;
  1111. }
  1112. #endif
  1113. /* check topoff current */
  1114. if (battery->charging_mode == SEC_BATTERY_CHARGING_2ND &&
  1115. (battery->pdata->full_check_type_2nd == SEC_BATTERY_FULLCHARGED_CHGPSY ||
  1116. battery->pdata->full_check_type_2nd == SEC_BATTERY_FULLCHARGED_LIMITER)) {
  1117. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, true, battery->pdata->full_check_current_2nd);
  1118. }
  1119. }/* !is_nocharge_type(battery->cable_type) */
  1120. mutex_unlock(&battery->iolock);
  1121. return 0;
  1122. }
  1123. EXPORT_SYMBOL(sec_bat_set_charging_current);
  1124. int sec_bat_set_charge(void * data, int chg_mode)
  1125. {
  1126. struct sec_battery_info *battery = data;
  1127. union power_supply_propval val = {0, };
  1128. struct timespec64 ts = {0, };
  1129. if (chg_mode == SEC_BAT_CHG_MODE_NOT_SET) {
  1130. pr_info("%s: temp mode for decrease 5v\n", __func__);
  1131. return chg_mode;
  1132. }
  1133. if ((battery->current_event & SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE) &&
  1134. (chg_mode == SEC_BAT_CHG_MODE_CHARGING)) {
  1135. dev_info(battery->dev, "%s: charge disable by HMT\n", __func__);
  1136. chg_mode = SEC_BAT_CHG_MODE_CHARGING_OFF;
  1137. }
  1138. battery->charger_mode = chg_mode;
  1139. pr_info("%s set %s mode\n", __func__, sb_charge_mode_str(chg_mode));
  1140. val.intval = battery->status;
  1141. psy_do_property(battery->pdata->charger_name, set,
  1142. POWER_SUPPLY_PROP_STATUS, val);
  1143. ts = ktime_to_timespec64(ktime_get_boottime());
  1144. if (chg_mode == SEC_BAT_CHG_MODE_CHARGING) {
  1145. /*Reset charging start time only in initial charging start */
  1146. if (battery->charging_start_time == 0) {
  1147. if (ts.tv_sec < 1)
  1148. ts.tv_sec = 1;
  1149. battery->charging_start_time = ts.tv_sec;
  1150. battery->charging_next_time =
  1151. battery->pdata->charging_reset_time;
  1152. }
  1153. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  1154. if (is_pd_apdo_wire_type(battery->cable_type)) {
  1155. sec_bat_reset_step_charging(battery);
  1156. sec_bat_check_dc_step_charging(battery);
  1157. }
  1158. #endif
  1159. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  1160. if (is_wireless_type(battery->cable_type)) {
  1161. val.intval = EXIT_PHM;
  1162. psy_do_property(battery->pdata->wireless_charger_name, set,
  1163. POWER_SUPPLY_EXT_PROP_RX_PHM, val);
  1164. }
  1165. #endif
  1166. } else {
  1167. battery->charging_start_time = 0;
  1168. battery->charging_passed_time = 0;
  1169. battery->charging_next_time = 0;
  1170. battery->charging_fullcharged_time = 0;
  1171. battery->full_check_cnt = 0;
  1172. #if defined(CONFIG_STEP_CHARGING)
  1173. sec_bat_reset_step_charging(battery);
  1174. #endif
  1175. battery->usb_overheat_check = false;
  1176. battery->cisd.ab_vbat_check_count = 0;
  1177. }
  1178. val.intval = chg_mode;
  1179. psy_do_property(battery->pdata->charger_name, set,
  1180. POWER_SUPPLY_EXT_PROP_CHARGING_ENABLED, val);
  1181. val.intval = chg_mode;
  1182. psy_do_property(battery->pdata->fuelgauge_name, set,
  1183. POWER_SUPPLY_EXT_PROP_CHARGING_ENABLED, val);
  1184. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  1185. if ((battery->pdata->full_check_type_2nd == SEC_BATTERY_FULLCHARGED_FG_CURRENT) &&
  1186. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE && battery->status == POWER_SUPPLY_STATUS_FULL)) {
  1187. /*
  1188. * Enable supplement mode for 2nd charging done, should cut off charger then limiter sequence,
  1189. * this case only for full_check_type_2nd is
  1190. * SEC_BATTERY_FULLCHARGED_FG_CURRENT not SEC_BATTERY_FULLCHARGED_LIMITER
  1191. */
  1192. val.intval = 1;
  1193. psy_do_property(battery->pdata->dual_battery_name, set,
  1194. POWER_SUPPLY_EXT_PROP_CHARGING_ENABLED, val);
  1195. } else if (!(battery->charging_mode == SEC_BATTERY_CHARGING_NONE && battery->status == POWER_SUPPLY_STATUS_FULL) &&
  1196. !(battery->charging_mode == SEC_BATTERY_CHARGING_NONE && battery->thermal_zone == BAT_THERMAL_WARM)) {
  1197. /*
  1198. * Limiter should disable supplement mode to do battery balancing properly in case of
  1199. * charging, discharging and buck off. But needs to disable supplement mode except
  1200. * 2nd full charge done and swelling charging.
  1201. */
  1202. val.intval = 0;
  1203. psy_do_property(battery->pdata->dual_battery_name, set,
  1204. POWER_SUPPLY_EXT_PROP_CHARGING_ENABLED, val);
  1205. }
  1206. #endif
  1207. return chg_mode;
  1208. }
  1209. EXPORT_SYMBOL(sec_bat_set_charge);
  1210. __visible_for_testing bool sec_bat_check_by_psy(struct sec_battery_info *battery)
  1211. {
  1212. char *psy_name = NULL;
  1213. union power_supply_propval value = {0, };
  1214. bool ret = true;
  1215. switch (battery->pdata->battery_check_type) {
  1216. case SEC_BATTERY_CHECK_PMIC:
  1217. psy_name = battery->pdata->pmic_name;
  1218. break;
  1219. case SEC_BATTERY_CHECK_FUELGAUGE:
  1220. psy_name = battery->pdata->fuelgauge_name;
  1221. break;
  1222. case SEC_BATTERY_CHECK_CHARGER:
  1223. psy_name = battery->pdata->charger_name;
  1224. break;
  1225. default:
  1226. dev_err(battery->dev, "%s: Invalid Battery Check Type\n", __func__);
  1227. ret = false;
  1228. goto battery_check_error;
  1229. break;
  1230. }
  1231. psy_do_property(psy_name, get, POWER_SUPPLY_PROP_PRESENT, value);
  1232. ret = (bool)value.intval;
  1233. battery_check_error:
  1234. return ret;
  1235. }
  1236. EXPORT_SYMBOL_KUNIT(sec_bat_check_by_psy);
  1237. #if IS_ENABLED(CONFIG_DUAL_BATTERY) && IS_ENABLED(CONFIG_LIMITER_S2ASL01)
  1238. static bool sec_bat_check_by_gpio(struct sec_battery_info *battery)
  1239. {
  1240. union power_supply_propval value = {0, };
  1241. bool ret = true;
  1242. int main_det = -1, sub_det = -1;
  1243. value.intval = SEC_DUAL_BATTERY_MAIN;
  1244. psy_do_property(battery->pdata->dual_battery_name, get,
  1245. POWER_SUPPLY_EXT_PROP_DUAL_BAT_DET, value);
  1246. main_det = value.intval;
  1247. value.intval = SEC_DUAL_BATTERY_SUB;
  1248. psy_do_property(battery->pdata->dual_battery_name, get,
  1249. POWER_SUPPLY_EXT_PROP_DUAL_BAT_DET, value);
  1250. sub_det = value.intval;
  1251. ret = (bool)(main_det & sub_det);
  1252. if (!ret)
  1253. pr_info("%s : main det = %d, sub det = %d\n", __func__, main_det, sub_det);
  1254. return ret;
  1255. }
  1256. #if !defined(CONFIG_SEC_FACTORY)
  1257. static void sec_bat_powerpath_check(struct sec_battery_info *battery, int m_health, int s_health)
  1258. {
  1259. static int m_abnormal_cnt, s_abnormal_cnt;
  1260. bool m_supplement_status = false, s_supplement_status = false;
  1261. union power_supply_propval value = {0, };
  1262. /* do not check battery power path when limiter is not ok */
  1263. if (m_health != POWER_SUPPLY_HEALTH_GOOD ||
  1264. s_health != POWER_SUPPLY_HEALTH_GOOD) {
  1265. pr_info("%s : do not check current status\n", __func__);
  1266. return;
  1267. }
  1268. /* get main limiter's supplement status */
  1269. psy_do_property(battery->pdata->main_limiter_name, get,
  1270. POWER_SUPPLY_EXT_PROP_SUPLLEMENT_MODE, value);
  1271. m_supplement_status = value.intval;
  1272. /* get sub limiter's supplement status */
  1273. psy_do_property(battery->pdata->sub_limiter_name, get,
  1274. POWER_SUPPLY_EXT_PROP_SUPLLEMENT_MODE, value);
  1275. s_supplement_status = value.intval;
  1276. if ((battery->current_avg_main == 0) &&
  1277. !m_supplement_status &&
  1278. !(battery->misc_event & BATT_MISC_EVENT_MAIN_POWERPATH)) {
  1279. m_abnormal_cnt++;
  1280. } else if (battery->current_avg_main != 0) {
  1281. if (battery->misc_event & BATT_MISC_EVENT_MAIN_POWERPATH) {
  1282. pr_info("%s : main power path get back to normal\n", __func__);
  1283. sec_bat_set_misc_event(battery,
  1284. 0, BATT_MISC_EVENT_MAIN_POWERPATH);
  1285. }
  1286. m_abnormal_cnt = 0;
  1287. }
  1288. if ((battery->current_avg_sub == 0) &&
  1289. !s_supplement_status &&
  1290. !(battery->misc_event & BATT_MISC_EVENT_SUB_POWERPATH)) {
  1291. s_abnormal_cnt++;
  1292. } else if (battery->current_avg_sub != 0) {
  1293. if (battery->misc_event & BATT_MISC_EVENT_SUB_POWERPATH) {
  1294. pr_info("%s : sub power path get back to normal\n", __func__);
  1295. sec_bat_set_misc_event(battery,
  1296. 0, BATT_MISC_EVENT_SUB_POWERPATH);
  1297. }
  1298. s_abnormal_cnt = 0;
  1299. }
  1300. if (m_abnormal_cnt > 5) {
  1301. pr_info("%s : main power path seems to have problem\n", __func__);
  1302. sec_bat_set_misc_event(battery,
  1303. BATT_MISC_EVENT_MAIN_POWERPATH, BATT_MISC_EVENT_MAIN_POWERPATH);
  1304. m_abnormal_cnt = 0;
  1305. }
  1306. if (s_abnormal_cnt > 5) {
  1307. pr_info("%s : sub power path seems to have problem\n", __func__);
  1308. sec_bat_set_misc_event(battery,
  1309. BATT_MISC_EVENT_SUB_POWERPATH, BATT_MISC_EVENT_SUB_POWERPATH);
  1310. s_abnormal_cnt = 0;
  1311. }
  1312. }
  1313. static void sec_bat_limiter_check(struct sec_battery_info *battery)
  1314. {
  1315. union power_supply_propval m_value = {0, }, s_value = {0, };
  1316. int main_enb, main_enb2, sub_enb;
  1317. pr_info("%s: Start\n", __func__);
  1318. /* do not check limiter status when enb is not active status since it is certain test mode using enb pin */
  1319. main_enb = gpio_get_value(battery->pdata->main_bat_enb_gpio);
  1320. main_enb2 = gpio_get_value(battery->pdata->main_bat_enb2_gpio);
  1321. sub_enb = gpio_get_value(battery->pdata->sub_bat_enb_gpio);
  1322. if (main_enb2 || sub_enb) {
  1323. pr_info("%s : main_enb = %d, main_enb2 = %d, sub_enb = %d\n", __func__, main_enb, main_enb2, sub_enb);
  1324. return;
  1325. }
  1326. /* check powermeter and vchg, vbat value of main limiter */
  1327. psy_do_property(battery->pdata->main_limiter_name, get,
  1328. POWER_SUPPLY_PROP_HEALTH, m_value);
  1329. /* check powermeter and vchg, vbat value of sub limiter */
  1330. psy_do_property(battery->pdata->sub_limiter_name, get,
  1331. POWER_SUPPLY_PROP_HEALTH, s_value);
  1332. /* discharging case with non sleep current since it has low powermeter resolution */
  1333. if (is_nocharge_type(battery->cable_type) &&
  1334. is_nocharge_type(battery->wire_status) &&
  1335. battery->current_avg < (-500) &&
  1336. !is_slate_mode(battery))
  1337. sec_bat_powerpath_check(battery, m_value.intval, s_value.intval);
  1338. /* do not check limiter status input curruent is not set fully */
  1339. if (is_nocharge_type(battery->cable_type) ||
  1340. is_wireless_all_type(battery->cable_type) ||
  1341. battery->health != POWER_SUPPLY_HEALTH_GOOD ||
  1342. battery->status != POWER_SUPPLY_STATUS_CHARGING ||
  1343. battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE ||
  1344. battery->current_event & SEC_BAT_CURRENT_EVENT_AICL ||
  1345. battery->charge_power < 9000 ||
  1346. battery->siop_level < 100 ||
  1347. battery->lcd_status ||
  1348. battery->limiter_check) {
  1349. return;
  1350. }
  1351. if (m_value.intval != POWER_SUPPLY_HEALTH_GOOD) {
  1352. pr_info("%s : main limiter wa will work\n", __func__);
  1353. battery->cisd.event_data[EVENT_MAIN_BAT_ERR]++;
  1354. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  1355. m_value.intval = 1000;
  1356. psy_do_property(battery->pdata->main_limiter_name, set,
  1357. POWER_SUPPLY_EXT_PROP_DISCHG_LIMIT_CURRENT, m_value);
  1358. m_value.intval = 0;
  1359. psy_do_property(battery->pdata->main_limiter_name, set,
  1360. POWER_SUPPLY_EXT_PROP_DISCHG_MODE, m_value);
  1361. /* deactivate main limiter */
  1362. gpio_direction_output(battery->pdata->main_bat_enb2_gpio, 1);
  1363. usleep_range(1000, 2000);
  1364. /* activate main limiter */
  1365. gpio_direction_output(battery->pdata->main_bat_enb2_gpio, 0);
  1366. msleep(50);
  1367. /* needs to init limiter setting again */
  1368. m_value.intval = 1;
  1369. psy_do_property(battery->pdata->main_limiter_name, set,
  1370. POWER_SUPPLY_EXT_PROP_POWERMETER_ENABLE, m_value);
  1371. msleep(100);
  1372. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING);
  1373. battery->limiter_check = true;
  1374. pr_info("%s : main limiter wa done\n", __func__);
  1375. /* re-check powermeter and vchg, vbat value of main limiter */
  1376. psy_do_property(battery->pdata->main_limiter_name, get,
  1377. POWER_SUPPLY_PROP_HEALTH, m_value);
  1378. if (m_value.intval != POWER_SUPPLY_HEALTH_GOOD) {
  1379. pr_info("%s : main limiter wa did not work\n", __func__);
  1380. battery->cisd.event_data[EVENT_BAT_WA_ERR]++;
  1381. }
  1382. #if IS_ENABLED(CONFIG_SEC_ABC)
  1383. sec_abc_send_event("MODULE=battery@WARN=lim_stuck");
  1384. #endif
  1385. }
  1386. if (s_value.intval != POWER_SUPPLY_HEALTH_GOOD) {
  1387. pr_info("%s : sub limiter wa will work\n", __func__);
  1388. battery->cisd.event_data[EVENT_SUB_BAT_ERR]++;
  1389. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  1390. s_value.intval = 1000;
  1391. psy_do_property(battery->pdata->sub_limiter_name, set,
  1392. POWER_SUPPLY_EXT_PROP_DISCHG_LIMIT_CURRENT, s_value);
  1393. s_value.intval = 0;
  1394. psy_do_property(battery->pdata->sub_limiter_name, set,
  1395. POWER_SUPPLY_EXT_PROP_DISCHG_MODE, s_value);
  1396. /* deactivate sub limiter */
  1397. gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 1);
  1398. usleep_range(1000, 2000);
  1399. /* activate sub limiter */
  1400. gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 0);
  1401. msleep(50);
  1402. /* needs to init limiter setting again */
  1403. s_value.intval = 1;
  1404. psy_do_property(battery->pdata->sub_limiter_name, set,
  1405. POWER_SUPPLY_EXT_PROP_POWERMETER_ENABLE, s_value);
  1406. msleep(100);
  1407. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING);
  1408. battery->limiter_check = true;
  1409. pr_info("%s : sub limiter wa done\n", __func__);
  1410. /* re-check powermeter and vchg, vbat value of sub limiter */
  1411. psy_do_property(battery->pdata->sub_limiter_name, get,
  1412. POWER_SUPPLY_PROP_HEALTH, s_value);
  1413. if (s_value.intval != POWER_SUPPLY_HEALTH_GOOD) {
  1414. pr_info("%s : main limiter wa did not work\n", __func__);
  1415. battery->cisd.event_data[EVENT_BAT_WA_ERR]++;
  1416. }
  1417. #if IS_ENABLED(CONFIG_SEC_ABC)
  1418. sec_abc_send_event("MODULE=battery@WARN=lim_stuck");
  1419. #endif
  1420. }
  1421. }
  1422. #endif
  1423. #endif
  1424. static bool sec_bat_check(struct sec_battery_info *battery)
  1425. {
  1426. bool ret = true;
  1427. if (battery->factory_mode || battery->is_jig_on || sec_bat_get_facmode()) {
  1428. dev_dbg(battery->dev, "%s: No need to check in factory mode\n",
  1429. __func__);
  1430. return ret;
  1431. }
  1432. if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
  1433. battery->health != POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
  1434. dev_dbg(battery->dev, "%s: No need to check\n", __func__);
  1435. return ret;
  1436. }
  1437. switch (battery->pdata->battery_check_type) {
  1438. case SEC_BATTERY_CHECK_ADC:
  1439. if (is_nocharge_type(battery->cable_type))
  1440. ret = battery->present;
  1441. else
  1442. ret = sec_bat_check_vf_adc(battery);
  1443. break;
  1444. case SEC_BATTERY_CHECK_INT:
  1445. case SEC_BATTERY_CHECK_CALLBACK:
  1446. if (is_nocharge_type(battery->cable_type)) {
  1447. ret = battery->present;
  1448. } else {
  1449. if (battery->pdata->check_battery_callback)
  1450. ret = battery->pdata->check_battery_callback();
  1451. }
  1452. break;
  1453. case SEC_BATTERY_CHECK_PMIC:
  1454. case SEC_BATTERY_CHECK_FUELGAUGE:
  1455. case SEC_BATTERY_CHECK_CHARGER:
  1456. ret = sec_bat_check_by_psy(battery);
  1457. break;
  1458. #if IS_ENABLED(CONFIG_DUAL_BATTERY) && IS_ENABLED(CONFIG_LIMITER_S2ASL01)
  1459. case SEC_BATTERY_CHECK_DUAL_BAT_GPIO:
  1460. ret = sec_bat_check_by_gpio(battery);
  1461. break;
  1462. #endif
  1463. case SEC_BATTERY_CHECK_NONE:
  1464. dev_dbg(battery->dev, "%s: No Check\n", __func__);
  1465. break;
  1466. default:
  1467. break;
  1468. }
  1469. return ret;
  1470. }
  1471. static void sec_bat_send_cs100(struct sec_battery_info *battery)
  1472. {
  1473. union power_supply_propval value = {0, };
  1474. if (is_wireless_all_type(battery->cable_type)) {
  1475. value.intval = POWER_SUPPLY_STATUS_FULL;
  1476. psy_do_property(battery->pdata->wireless_charger_name, set,
  1477. POWER_SUPPLY_PROP_STATUS, value);
  1478. }
  1479. }
  1480. __visible_for_testing bool sec_bat_get_cable_type(struct sec_battery_info *battery, int cable_source_type)
  1481. {
  1482. bool ret = false;
  1483. int cable_type = battery->cable_type;
  1484. if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_CALLBACK) {
  1485. if (battery->pdata->check_cable_callback)
  1486. cable_type = battery->pdata->check_cable_callback();
  1487. }
  1488. if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_ADC) {
  1489. if (gpio_get_value_cansleep(
  1490. battery->pdata->bat_gpio_ta_nconnected) ^
  1491. battery->pdata->bat_polarity_ta_nconnected)
  1492. cable_type = SEC_BATTERY_CABLE_NONE;
  1493. else
  1494. cable_type = sec_bat_get_charger_type_adc(battery);
  1495. }
  1496. if (battery->cable_type == cable_type) {
  1497. dev_dbg(battery->dev, "%s: No need to change cable status\n", __func__);
  1498. } else {
  1499. if (cable_type < SEC_BATTERY_CABLE_NONE || cable_type >= SEC_BATTERY_CABLE_MAX) {
  1500. dev_err(battery->dev, "%s: Invalid cable type\n", __func__);
  1501. } else {
  1502. battery->cable_type = cable_type;
  1503. if (battery->pdata->check_cable_result_callback)
  1504. battery->pdata->check_cable_result_callback(battery->cable_type);
  1505. ret = true;
  1506. dev_dbg(battery->dev, "%s: Cable Changed (%d)\n", __func__, battery->cable_type);
  1507. }
  1508. }
  1509. return ret;
  1510. }
  1511. EXPORT_SYMBOL_KUNIT(sec_bat_get_cable_type);
  1512. void sec_bat_set_charging_status(struct sec_battery_info *battery, int status)
  1513. {
  1514. union power_supply_propval value = {0, };
  1515. #if defined(CONFIG_NO_BATTERY)
  1516. status = POWER_SUPPLY_STATUS_DISCHARGING;
  1517. #endif
  1518. switch (status) {
  1519. case POWER_SUPPLY_STATUS_CHARGING:
  1520. if (battery->siop_level < 100 || battery->lcd_status || battery->wc_tx_enable)
  1521. battery->stop_timer = true;
  1522. break;
  1523. case POWER_SUPPLY_STATUS_NOT_CHARGING:
  1524. case POWER_SUPPLY_STATUS_DISCHARGING:
  1525. if (battery->status == POWER_SUPPLY_STATUS_FULL &&
  1526. battery->capacity < 100 && is_eu_eco_rechg(battery->fs)) {
  1527. pr_info("%s : EU eco case do not Fg scale, capacity(%d)\n", __func__, battery->capacity);
  1528. } else if ((battery->status == POWER_SUPPLY_STATUS_FULL ||
  1529. (battery->capacity == 100 && !is_slate_mode(battery))) &&
  1530. !battery->store_mode) {
  1531. pr_info("%s : Update fg scale to 101%%\n", __func__);
  1532. value.intval = 100;
  1533. psy_do_property(battery->pdata->fuelgauge_name, set,
  1534. POWER_SUPPLY_PROP_CHARGE_FULL, value);
  1535. /* To get SOC value (NOT raw SOC), need to reset value */
  1536. value.intval = 0;
  1537. psy_do_property(battery->pdata->fuelgauge_name, get, POWER_SUPPLY_PROP_CAPACITY, value);
  1538. battery->capacity = value.intval;
  1539. }
  1540. battery->expired_time = battery->pdata->expired_time;
  1541. battery->prev_safety_time = 0;
  1542. break;
  1543. case POWER_SUPPLY_STATUS_FULL:
  1544. sec_bat_send_cs100(battery);
  1545. break;
  1546. default:
  1547. break;
  1548. }
  1549. battery->status = status;
  1550. }
  1551. EXPORT_SYMBOL_KUNIT(sec_bat_set_charging_status);
  1552. void sec_bat_set_health(struct sec_battery_info *battery, int health)
  1553. {
  1554. if (battery->health != health) {
  1555. if (health == POWER_SUPPLY_EXT_HEALTH_OVERHEATLIMIT)
  1556. sec_bat_set_misc_event(battery,
  1557. BATT_MISC_EVENT_HEALTH_OVERHEATLIMIT, BATT_MISC_EVENT_HEALTH_OVERHEATLIMIT);
  1558. else
  1559. sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_HEALTH_OVERHEATLIMIT);
  1560. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING) && !defined(CONFIG_SEC_FACTORY)
  1561. if (is_wireless_all_type(battery->cable_type)) {
  1562. union power_supply_propval val = {0, };
  1563. if (!battery->wc_ept_timeout) {
  1564. battery->wc_ept_timeout = true;
  1565. __pm_stay_awake(battery->wc_ept_timeout_ws);
  1566. /* 10 secs time out */
  1567. queue_delayed_work(battery->monitor_wqueue, &battery->wc_ept_timeout_work, msecs_to_jiffies(10000));
  1568. val.intval = health;
  1569. psy_do_property(battery->pdata->wireless_charger_name, set, POWER_SUPPLY_PROP_HEALTH, val);
  1570. }
  1571. }
  1572. #endif
  1573. }
  1574. battery->health = health;
  1575. if (health != POWER_SUPPLY_HEALTH_GOOD)
  1576. store_battery_log(
  1577. "Health:%d%%,%dmV,%s,ct(%s,%s,%d,%d),%s",
  1578. battery->capacity,
  1579. battery->voltage_now,
  1580. sb_get_bst_str(battery->status),
  1581. sb_get_ct_str(battery->cable_type),
  1582. sb_get_ct_str(battery->wire_status),
  1583. battery->muic_cable_type,
  1584. battery->pd_usb_attached,
  1585. sb_get_hl_str(battery->health)
  1586. );
  1587. }
  1588. EXPORT_SYMBOL_KUNIT(sec_bat_set_health);
  1589. static bool sec_bat_battery_cable_check(struct sec_battery_info *battery)
  1590. {
  1591. if (!sec_bat_check(battery)) {
  1592. if (battery->check_count < battery->pdata->check_count)
  1593. battery->check_count++;
  1594. else {
  1595. dev_err(battery->dev,
  1596. "%s: Battery Disconnected\n", __func__);
  1597. battery->present = false;
  1598. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_UNSPEC_FAILURE);
  1599. if (battery->status !=
  1600. POWER_SUPPLY_STATUS_DISCHARGING) {
  1601. sec_bat_set_charging_status(battery,
  1602. POWER_SUPPLY_STATUS_NOT_CHARGING);
  1603. sec_vote(battery->chgen_vote, VOTER_BATTERY, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  1604. }
  1605. if (battery->pdata->check_battery_result_callback)
  1606. battery->pdata->
  1607. check_battery_result_callback();
  1608. return false;
  1609. }
  1610. } else
  1611. battery->check_count = 0;
  1612. battery->present = true;
  1613. if (battery->health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
  1614. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  1615. if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
  1616. sec_bat_set_charging_status(battery,
  1617. POWER_SUPPLY_STATUS_CHARGING);
  1618. sec_vote(battery->chgen_vote, VOTER_BATTERY, false, 0);
  1619. }
  1620. }
  1621. dev_dbg(battery->dev, "%s: Battery Connected\n", __func__);
  1622. if (battery->pdata->cable_check_type &
  1623. SEC_BATTERY_CABLE_CHECK_POLLING) {
  1624. if (sec_bat_get_cable_type(battery,
  1625. battery->pdata->cable_source_type)) {
  1626. __pm_stay_awake(battery->cable_ws);
  1627. queue_delayed_work(battery->monitor_wqueue,
  1628. &battery->cable_work, 0);
  1629. }
  1630. }
  1631. return true;
  1632. }
  1633. static int sec_bat_ovp_uvlo_by_psy(struct sec_battery_info *battery)
  1634. {
  1635. char *psy_name = NULL;
  1636. union power_supply_propval value = {0, };
  1637. int ret = 0;
  1638. value.intval = POWER_SUPPLY_HEALTH_GOOD;
  1639. switch (battery->pdata->ovp_uvlo_check_type) {
  1640. case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
  1641. psy_name = battery->pdata->pmic_name;
  1642. break;
  1643. case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
  1644. psy_name = battery->pdata->charger_name;
  1645. break;
  1646. default:
  1647. dev_err(battery->dev,
  1648. "%s: Invalid OVP/UVLO Check Type\n", __func__);
  1649. goto ovp_uvlo_check_error;
  1650. break;
  1651. }
  1652. ret = psy_do_property(psy_name, get,
  1653. POWER_SUPPLY_PROP_HEALTH, value);
  1654. ovp_uvlo_check_error:
  1655. /* Need to not display HEALTH UNKNOWN if driver cannot be read */
  1656. return ((ret == 0) ? value.intval : POWER_SUPPLY_HEALTH_GOOD);
  1657. }
  1658. #if defined(CONFIG_SEC_KUNIT)
  1659. int __mockable chk_ap_wake_chg(void)
  1660. #else
  1661. static int chk_ap_wake_chg(void)
  1662. #endif
  1663. {
  1664. static int en = -1;
  1665. if (en == -1) {
  1666. struct device_node *np;
  1667. np = of_find_node_by_name(NULL, "battery");
  1668. if (!np) {
  1669. pr_info("%s: np NULL\n", __func__);
  1670. en = 0;
  1671. } else {
  1672. en = of_property_read_bool(np, "battery,ap_wake_chg");
  1673. }
  1674. pr_info("%s: en: %d\n", __func__, en);
  1675. }
  1676. return en;
  1677. }
  1678. __visible_for_testing void sb_set_vbus_wake(struct wakeup_source *vbus_ws, int health, int cable_type)
  1679. {
  1680. if (!chk_ap_wake_chg() || chg_can_sleep_type(cable_type) ||
  1681. (health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE) || (health == POWER_SUPPLY_HEALTH_OVERVOLTAGE))
  1682. __pm_wakeup_event(vbus_ws, jiffies_to_msecs(HZ * 10));
  1683. else
  1684. __pm_stay_awake(vbus_ws);
  1685. }
  1686. EXPORT_SYMBOL_KUNIT(sb_set_vbus_wake);
  1687. static bool sec_bat_ovp_uvlo_result(struct sec_battery_info *battery, int health)
  1688. {
  1689. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  1690. union power_supply_propval value = {0, };
  1691. #endif
  1692. if (health == POWER_SUPPLY_EXT_HEALTH_DC_ERR) {
  1693. dev_info(battery->dev,
  1694. "%s: DC err (%d)\n",
  1695. __func__, health);
  1696. battery->is_recharging = false;
  1697. battery->health_check_count = DEFAULT_HEALTH_CHECK_COUNT;
  1698. /* Enable charging anyway to check actual DC's health */
  1699. sec_vote(battery->chgen_vote, VOTER_DC_ERR, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  1700. sec_vote(battery->chgen_vote, VOTER_DC_ERR, false, 0);
  1701. }
  1702. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  1703. if (health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE) {
  1704. psy_do_property(battery->pdata->wireless_charger_name, get,
  1705. POWER_SUPPLY_PROP_CHARGE_EMPTY, value);
  1706. if (value.intval == 0) {
  1707. dev_info(battery->dev, "%s: skip undervoltage for WL %d %d\n",
  1708. __func__, health, battery->health);
  1709. health = battery->health;
  1710. }
  1711. }
  1712. #endif
  1713. if (battery->health != health) {
  1714. sec_bat_set_health(battery, health);
  1715. sb_set_vbus_wake(battery->vbus_ws, health, battery->cable_type);
  1716. switch (health) {
  1717. case POWER_SUPPLY_HEALTH_GOOD:
  1718. dev_info(battery->dev, "%s: Safe voltage\n", __func__);
  1719. dev_info(battery->dev, "%s: is_recharging : %d\n", __func__, battery->is_recharging);
  1720. sec_bat_set_charging_status(battery,
  1721. POWER_SUPPLY_STATUS_CHARGING);
  1722. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  1723. sec_vote(battery->chgen_vote, VOTER_VBUS_OVP, false, 0);
  1724. battery->health_check_count = 0;
  1725. break;
  1726. case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
  1727. case POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE:
  1728. dev_info(battery->dev,
  1729. "%s: Unsafe voltage (%d)\n",
  1730. __func__, health);
  1731. sec_bat_set_charging_status(battery,
  1732. POWER_SUPPLY_STATUS_NOT_CHARGING);
  1733. sec_vote(battery->chgen_vote, VOTER_VBUS_OVP, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  1734. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1735. battery->is_recharging = false;
  1736. battery->health_check_count = DEFAULT_HEALTH_CHECK_COUNT;
  1737. battery->cisd.data[CISD_DATA_UNSAFETY_VOLTAGE]++;
  1738. battery->cisd.data[CISD_DATA_UNSAFE_VOLTAGE_PER_DAY]++;
  1739. break;
  1740. case POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE:
  1741. dev_info(battery->dev,
  1742. "%s: watchdog timer expired (%d)\n",
  1743. __func__, health);
  1744. sec_bat_set_charging_status(battery,
  1745. POWER_SUPPLY_STATUS_NOT_CHARGING);
  1746. sec_vote(battery->chgen_vote, VOTER_WDT_EXPIRE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  1747. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1748. battery->is_recharging = false;
  1749. battery->health_check_count = DEFAULT_HEALTH_CHECK_COUNT;
  1750. break;
  1751. }
  1752. power_supply_changed(battery->psy_bat);
  1753. if (health != POWER_SUPPLY_HEALTH_GOOD)
  1754. return true;
  1755. }
  1756. return false;
  1757. }
  1758. static bool sec_bat_ovp_uvlo(struct sec_battery_info *battery)
  1759. {
  1760. int health = POWER_SUPPLY_HEALTH_GOOD;
  1761. if (battery->wdt_kick_disable) {
  1762. dev_dbg(battery->dev,
  1763. "%s: No need to check in wdt test\n",
  1764. __func__);
  1765. return false;
  1766. } else if ((battery->status == POWER_SUPPLY_STATUS_FULL) &&
  1767. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
  1768. dev_dbg(battery->dev, "%s: No need to check in Full status", __func__);
  1769. return false;
  1770. }
  1771. if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
  1772. battery->health != POWER_SUPPLY_HEALTH_OVERVOLTAGE &&
  1773. battery->health != POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE &&
  1774. battery->health != POWER_SUPPLY_EXT_HEALTH_DC_ERR &&
  1775. battery->health != POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE) {
  1776. dev_dbg(battery->dev, "%s: No need to check\n", __func__);
  1777. return false;
  1778. }
  1779. health = battery->health;
  1780. switch (battery->pdata->ovp_uvlo_check_type) {
  1781. case SEC_BATTERY_OVP_UVLO_CALLBACK:
  1782. if (battery->pdata->ovp_uvlo_callback)
  1783. health = battery->pdata->ovp_uvlo_callback();
  1784. break;
  1785. case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
  1786. case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
  1787. health = sec_bat_ovp_uvlo_by_psy(battery);
  1788. break;
  1789. case SEC_BATTERY_OVP_UVLO_PMICINT:
  1790. case SEC_BATTERY_OVP_UVLO_CHGINT:
  1791. /* nothing for interrupt check */
  1792. default:
  1793. break;
  1794. }
  1795. if (battery->factory_mode) {
  1796. dev_dbg(battery->dev,
  1797. "%s: No need to check in factory mode\n",
  1798. __func__);
  1799. return false;
  1800. }
  1801. return sec_bat_ovp_uvlo_result(battery, health);
  1802. }
  1803. __visible_for_testing bool sec_bat_check_recharge(struct sec_battery_info *battery)
  1804. {
  1805. if (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING)
  1806. return false;
  1807. if ((battery->status == POWER_SUPPLY_STATUS_CHARGING) &&
  1808. (battery->pdata->full_condition_type &
  1809. SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
  1810. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
  1811. dev_info(battery->dev, "%s: Re-charging by NOTIMEFULL (%d)\n",
  1812. __func__, battery->capacity);
  1813. goto check_recharge_check_count;
  1814. }
  1815. if (battery->status == POWER_SUPPLY_STATUS_FULL &&
  1816. battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
  1817. int recharging_voltage = battery->pdata->recharge_condition_vcell,
  1818. recharging_soc = battery->pdata->recharge_condition_soc;
  1819. if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_MODE) {
  1820. if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL3)
  1821. recharging_voltage = battery->pdata->swelling_low_cool3_rechg_voltage;
  1822. else
  1823. recharging_voltage = battery->pdata->swelling_low_rechg_voltage;
  1824. }
  1825. dev_info(battery->dev, "%s: recharging voltage(%d) soc(%d) %s\n",
  1826. __func__, recharging_voltage, recharging_soc,
  1827. (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_MODE ?
  1828. "changed by low temp" : "normal"));
  1829. if ((battery->pdata->recharge_condition_type &
  1830. SEC_BATTERY_RECHARGE_CONDITION_SOC) &&
  1831. (battery->capacity <= recharging_soc)) {
  1832. dev_info(battery->dev, "%s: Re-charging by SOC (%d)\n",
  1833. __func__, battery->capacity);
  1834. goto check_recharge_check_count;
  1835. }
  1836. if ((battery->pdata->recharge_condition_type &
  1837. SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL) &&
  1838. (battery->voltage_avg <= recharging_voltage)) {
  1839. dev_info(battery->dev, "%s: Re-charging by average VCELL (%d)\n",
  1840. __func__, battery->voltage_avg);
  1841. goto check_recharge_check_count;
  1842. }
  1843. if ((battery->pdata->recharge_condition_type &
  1844. SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
  1845. (battery->voltage_now <= recharging_voltage)) {
  1846. dev_info(battery->dev, "%s: Re-charging by VCELL (%d)\n",
  1847. __func__, battery->voltage_now);
  1848. goto check_recharge_check_count;
  1849. }
  1850. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  1851. if (battery->pdata->recharge_condition_type &
  1852. SEC_BATTERY_RECHARGE_CONDITION_LIMITER) {
  1853. int voltage = max(battery->voltage_avg_main, battery->voltage_avg_sub);
  1854. if (voltage <= recharging_voltage) {
  1855. dev_info(battery->dev, "%s: Re-charging by VPACK (%d)mV\n",
  1856. __func__, voltage);
  1857. goto check_recharge_check_count;
  1858. } else if (abs(battery->voltage_avg_main - battery->voltage_avg_sub) >
  1859. battery->pdata->force_recharge_margin) {
  1860. dev_info(battery->dev, "%s: Force Re-charging by VPACK diff(%d, %d)mV\n",
  1861. __func__, battery->voltage_avg_main, battery->voltage_avg_sub);
  1862. goto check_recharge_check_count;
  1863. }
  1864. }
  1865. #endif
  1866. }
  1867. battery->recharge_check_cnt = 0;
  1868. return false;
  1869. check_recharge_check_count:
  1870. battery->expired_time = battery->pdata->recharging_expired_time;
  1871. battery->prev_safety_time = 0;
  1872. if (battery->recharge_check_cnt <
  1873. battery->pdata->recharge_check_count)
  1874. battery->recharge_check_cnt++;
  1875. dev_dbg(battery->dev,
  1876. "%s: recharge count = %d\n",
  1877. __func__, battery->recharge_check_cnt);
  1878. if (battery->recharge_check_cnt >=
  1879. battery->pdata->recharge_check_count)
  1880. return true;
  1881. else
  1882. return false;
  1883. }
  1884. EXPORT_SYMBOL_KUNIT(sec_bat_check_recharge);
  1885. static bool sec_bat_voltage_check(struct sec_battery_info *battery)
  1886. {
  1887. union power_supply_propval value = {0, };
  1888. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING ||
  1889. is_nocharge_type(battery->cable_type) ||
  1890. is_wireless_fake_type(battery->cable_type)) {
  1891. dev_dbg(battery->dev,
  1892. "%s: Charging Disabled\n", __func__);
  1893. return true;
  1894. }
  1895. /* OVP/UVLO check */
  1896. if (sec_bat_ovp_uvlo(battery)) {
  1897. if (battery->pdata->ovp_uvlo_result_callback)
  1898. battery->pdata->
  1899. ovp_uvlo_result_callback(battery->health);
  1900. return false;
  1901. }
  1902. if ((battery->status == POWER_SUPPLY_STATUS_FULL) &&
  1903. ((battery->charging_mode != SEC_BATTERY_CHARGING_NONE &&
  1904. battery->charger_mode == SEC_BAT_CHG_MODE_CHARGING) ||
  1905. (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING))) {
  1906. int voltage_now = battery->voltage_now;
  1907. int voltage_ref = battery->pdata->recharge_condition_vcell - 50;
  1908. #if defined(CONFIG_ENABLE_FULL_BY_SOC)
  1909. int soc_ref = 98;
  1910. #else
  1911. int soc_ref = battery->pdata->full_condition_soc;
  1912. #endif
  1913. if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_MODE) {
  1914. if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL3)
  1915. voltage_ref = battery->pdata->swelling_low_cool3_rechg_voltage - 50;
  1916. else
  1917. voltage_ref = battery->pdata->swelling_low_rechg_voltage - 50;
  1918. }
  1919. if (is_eu_eco_rechg(battery->fs))
  1920. soc_ref = (soc_ref > battery->pdata->recharge_condition_soc) ?
  1921. battery->pdata->recharge_condition_soc : soc_ref;
  1922. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  1923. if (battery->pdata->recharge_condition_type &
  1924. SEC_BATTERY_RECHARGE_CONDITION_LIMITER) {
  1925. voltage_now = max(battery->voltage_avg_main, battery->voltage_avg_sub);
  1926. }
  1927. #endif
  1928. value.intval = 0;
  1929. psy_do_property(battery->pdata->fuelgauge_name, get,
  1930. POWER_SUPPLY_PROP_CAPACITY, value);
  1931. pr_info("%s: chg mode (%d), voltage_ref(%d), voltage_now(%d), soc_ref(%d), capacity(%d)\n",
  1932. __func__, battery->charging_mode, voltage_ref, voltage_now, soc_ref, value.intval);
  1933. if (value.intval < soc_ref && voltage_now < voltage_ref) {
  1934. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_CHARGING);
  1935. battery->is_recharging = false;
  1936. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  1937. if (battery->pdata->change_FV_after_full)
  1938. sec_vote(battery->fv_vote, VOTER_FULL_CHARGE, false, battery->pdata->chg_float_voltage);
  1939. sec_vote(battery->chgen_vote, VOTER_CABLE, true, SEC_BAT_CHG_MODE_CHARGING);
  1940. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, false, 0);
  1941. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, false, 0);
  1942. pr_info("%s: battery status full -> charging, RepSOC(%d)\n", __func__, value.intval);
  1943. value.intval = POWER_SUPPLY_STATUS_CHARGING;
  1944. psy_do_property(battery->pdata->wireless_charger_name, set,
  1945. POWER_SUPPLY_PROP_STATUS, value);
  1946. return false;
  1947. }
  1948. }
  1949. /* Re-Charging check */
  1950. if (sec_bat_check_recharge(battery)) {
  1951. if (battery->pdata->full_check_type !=
  1952. SEC_BATTERY_FULLCHARGED_NONE)
  1953. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  1954. else
  1955. battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
  1956. battery->is_recharging = true;
  1957. battery->cisd.data[CISD_DATA_RECHARGING_COUNT]++;
  1958. battery->cisd.data[CISD_DATA_RECHARGING_COUNT_PER_DAY]++;
  1959. if (is_wireless_type(battery->cable_type)) {
  1960. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  1961. value.intval = EXIT_PHM;
  1962. psy_do_property(battery->pdata->wireless_charger_name, set,
  1963. POWER_SUPPLY_EXT_PROP_RX_PHM, value);
  1964. #endif
  1965. psy_do_property(battery->pdata->wireless_charger_name, set,
  1966. POWER_SUPPLY_EXT_PROP_WIRELESS_1ST_DONE, value);
  1967. value.intval = WIRELESS_VRECT_ADJ_OFF;
  1968. psy_do_property(battery->pdata->wireless_charger_name, set,
  1969. POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONTROL, value);
  1970. }
  1971. if (battery->pdata->change_FV_after_full)
  1972. sec_vote(battery->fv_vote, VOTER_FULL_CHARGE, false, battery->pdata->chg_float_voltage);
  1973. sec_vote(battery->chgen_vote, VOTER_CABLE, true, SEC_BAT_CHG_MODE_CHARGING);
  1974. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, false, 0);
  1975. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, false, 0);
  1976. return false;
  1977. }
  1978. return true;
  1979. }
  1980. __visible_for_testing bool sec_bat_set_aging_step(struct sec_battery_info *battery, int step)
  1981. {
  1982. union power_supply_propval value = {0, };
  1983. if (battery->pdata->num_age_step <= 0 || step < 0 || step >= battery->pdata->num_age_step) {
  1984. pr_info("%s: [AGE] abnormal age step : %d/%d\n",
  1985. __func__, step, battery->pdata->num_age_step-1);
  1986. return false;
  1987. }
  1988. battery->pdata->age_step = step;
  1989. /* float voltage */
  1990. battery->pdata->chg_float_voltage =
  1991. battery->pdata->age_data[battery->pdata->age_step].float_voltage;
  1992. sec_vote(battery->fv_vote, VOTER_AGING_STEP, true, battery->pdata->chg_float_voltage);
  1993. /* full/recharge condition */
  1994. battery->pdata->recharge_condition_vcell =
  1995. battery->pdata->age_data[battery->pdata->age_step].recharge_condition_vcell;
  1996. battery->pdata->full_condition_soc =
  1997. battery->pdata->age_data[battery->pdata->age_step].full_condition_soc;
  1998. battery->pdata->full_condition_vcell =
  1999. battery->pdata->age_data[battery->pdata->age_step].full_condition_vcell;
  2000. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  2001. value.intval = battery->pdata->age_step;
  2002. psy_do_property(battery->pdata->dual_battery_name, set,
  2003. POWER_SUPPLY_EXT_PROP_FULL_CONDITION, value);
  2004. if (battery->pdata->limiter_aging_float_offset > 0) {
  2005. value.intval = battery->pdata->chg_float_voltage -
  2006. battery->pdata->limiter_aging_float_offset;
  2007. psy_do_property(battery->pdata->dual_battery_name, set,
  2008. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, value);
  2009. }
  2010. #endif
  2011. #if defined(CONFIG_LSI_IFPMIC)
  2012. value.intval = battery->pdata->age_step;
  2013. psy_do_property(battery->pdata->fuelgauge_name, set,
  2014. POWER_SUPPLY_EXT_PROP_UPDATE_BATTERY_DATA, value);
  2015. #else
  2016. value.intval = battery->pdata->full_condition_soc;
  2017. psy_do_property(battery->pdata->fuelgauge_name, set,
  2018. POWER_SUPPLY_PROP_CAPACITY_LEVEL, value);
  2019. #endif
  2020. #if defined(CONFIG_STEP_CHARGING)
  2021. sec_bat_set_aging_info_step_charging(battery);
  2022. #endif
  2023. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  2024. if (battery->pdata->dynamic_cv_factor) {
  2025. value.intval = (battery->pdata->chg_float_voltage) * 1000;
  2026. psy_do_property(battery->pdata->fuelgauge_name, set,
  2027. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, value);
  2028. }
  2029. #endif
  2030. dev_info(battery->dev,
  2031. "%s: Step(%d/%d), Cycle(%d), float_v(%d), r_v(%d), f_s(%d), f_vl(%d)\n",
  2032. __func__,
  2033. battery->pdata->age_step, battery->pdata->num_age_step-1, max(battery->batt_cycle, battery->batt_full_status_usage),
  2034. battery->pdata->chg_float_voltage,
  2035. battery->pdata->recharge_condition_vcell,
  2036. battery->pdata->full_condition_soc,
  2037. battery->pdata->full_condition_vcell);
  2038. #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
  2039. {
  2040. int i;
  2041. bool bChanged = false;
  2042. battery->pdata->max_charging_current =
  2043. battery->pdata->age_data[battery->pdata->age_step].max_charging_current;
  2044. for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) {
  2045. if (battery->pdata->charging_current[i].fast_charging_current >
  2046. battery->pdata->max_charging_current) {
  2047. dev_info(battery->dev, "%s: cable(%d) charging current(%d->%d)\n",
  2048. __func__, i,
  2049. battery->pdata->charging_current[i].fast_charging_current,
  2050. battery->pdata->max_charging_current);
  2051. battery->pdata->charging_current[i].fast_charging_current =
  2052. battery->pdata->max_charging_current;
  2053. if (battery->cable_type == i)
  2054. bChanged = true;
  2055. }
  2056. }
  2057. if (bChanged)
  2058. sec_bat_set_charging_current(battery);
  2059. }
  2060. #endif
  2061. return true;
  2062. }
  2063. EXPORT_SYMBOL_KUNIT(sec_bat_set_aging_step);
  2064. void sec_bat_aging_check(struct sec_battery_info *battery)
  2065. {
  2066. int prev_step = battery->pdata->age_step;
  2067. int calc_step;
  2068. bool ret = 0;
  2069. static bool init; /* false */
  2070. if ((battery->pdata->num_age_step <= 0) || (battery->batt_cycle < 0))
  2071. return;
  2072. if (battery->temperature < 50) {
  2073. pr_info("%s: [AGE] skip (temperature:%d)\n", __func__, battery->temperature);
  2074. return;
  2075. }
  2076. for (calc_step = battery->pdata->num_age_step - 1; calc_step >= 0; calc_step--) {
  2077. if (battery->pdata->age_data[calc_step].cycle <= max(battery->batt_cycle, battery->batt_full_status_usage))
  2078. break;
  2079. }
  2080. if ((calc_step == prev_step) && init)
  2081. return;
  2082. init = true;
  2083. ret = sec_bat_set_aging_step(battery, calc_step);
  2084. dev_info(battery->dev,
  2085. "%s: %s change step (%d->%d), Cycle(%d)\n",
  2086. __func__, ret ? "Succeed in" : "Fail to",
  2087. prev_step, battery->pdata->age_step, max(battery->batt_cycle, battery->batt_full_status_usage));
  2088. }
  2089. EXPORT_SYMBOL(sec_bat_aging_check);
  2090. void sec_bat_check_battery_health(struct sec_battery_info *battery)
  2091. {
  2092. static battery_health_condition default_table[3] =
  2093. {{.cycle = 900, .asoc = 75}, {.cycle = 1200, .asoc = 65}, {.cycle = 1500, .asoc = 55}};
  2094. battery_health_condition *ptable = default_table;
  2095. battery_health_condition state;
  2096. int i, battery_health, size = BATTERY_HEALTH_MAX;
  2097. if (battery->pdata->health_condition == NULL) {
  2098. /*
  2099. * If a new type is added to misc_battery_health, default table cannot verify the actual state except "bad".
  2100. * If you want to modify to return the correct values for all states,
  2101. * add a table that matches the state added to the dt file.
  2102. */
  2103. pr_info("%s: does not set health_condition_table, use default table\n", __func__);
  2104. size = 3;
  2105. } else {
  2106. ptable = battery->pdata->health_condition;
  2107. }
  2108. /* Checking Cycle and ASoC */
  2109. state.cycle = state.asoc = BATTERY_HEALTH_BAD;
  2110. for (i = size - 1; i >= 0; i--) {
  2111. if (ptable[i].cycle >= (battery->batt_cycle % 10000))
  2112. state.cycle = i + BATTERY_HEALTH_GOOD;
  2113. if (ptable[i].asoc <= battery->batt_asoc)
  2114. state.asoc = i + BATTERY_HEALTH_GOOD;
  2115. }
  2116. battery_health = max(state.cycle, state.asoc);
  2117. pr_info("%s: update battery_health(%d), (%d - %d)\n",
  2118. __func__, battery_health, state.cycle, state.asoc);
  2119. /* Update battery health */
  2120. sec_bat_set_misc_event(battery,
  2121. (battery_health << BATTERY_HEALTH_SHIFT), BATT_MISC_EVENT_BATTERY_HEALTH);
  2122. }
  2123. EXPORT_SYMBOL(sec_bat_check_battery_health);
  2124. __visible_for_testing bool sec_bat_check_fullcharged_condition(struct sec_battery_info *battery)
  2125. {
  2126. int full_check_type = SEC_BATTERY_FULLCHARGED_NONE;
  2127. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  2128. full_check_type = battery->pdata->full_check_type;
  2129. else
  2130. full_check_type = battery->pdata->full_check_type_2nd;
  2131. switch (full_check_type) {
  2132. /*
  2133. * If these is NOT full check type or NONE full check type,
  2134. * it is full-charged
  2135. */
  2136. case SEC_BATTERY_FULLCHARGED_CHGINT:
  2137. case SEC_BATTERY_FULLCHARGED_TIME:
  2138. case SEC_BATTERY_FULLCHARGED_NONE:
  2139. return true;
  2140. default:
  2141. break;
  2142. }
  2143. #if defined(CONFIG_ENABLE_FULL_BY_SOC)
  2144. if (battery->capacity >= 100 && !battery->is_recharging) {
  2145. dev_info(battery->dev, "%s: enough SOC (%d%%), skip!\n", __func__, battery->capacity);
  2146. return true;
  2147. }
  2148. #endif
  2149. if (battery->pdata->full_condition_type & SEC_BATTERY_FULL_CONDITION_SOC) {
  2150. if (battery->capacity < battery->pdata->full_condition_soc) {
  2151. dev_dbg(battery->dev, "%s: Not enough SOC (%d%%)\n", __func__, battery->capacity);
  2152. return false;
  2153. }
  2154. }
  2155. if (battery->pdata->full_condition_type & SEC_BATTERY_FULL_CONDITION_VCELL) {
  2156. int full_condition_vcell = battery->pdata->full_condition_vcell;
  2157. if (battery->thermal_zone == BAT_THERMAL_WARM) /* high temp swelling full */
  2158. full_condition_vcell = battery->pdata->high_temp_float - 100;
  2159. if (battery->voltage_now < full_condition_vcell) {
  2160. dev_dbg(battery->dev, "%s: Not enough VCELL (%dmV)\n", __func__, battery->voltage_now);
  2161. return false;
  2162. }
  2163. }
  2164. if (battery->pdata->full_condition_type & SEC_BATTERY_FULL_CONDITION_AVGVCELL) {
  2165. if (battery->voltage_avg < battery->pdata->full_condition_avgvcell) {
  2166. dev_dbg(battery->dev, "%s: Not enough AVGVCELL (%dmV)\n", __func__, battery->voltage_avg);
  2167. return false;
  2168. }
  2169. }
  2170. if (battery->pdata->full_condition_type & SEC_BATTERY_FULL_CONDITION_OCV) {
  2171. if (battery->voltage_ocv < battery->pdata->full_condition_ocv) {
  2172. dev_dbg(battery->dev, "%s: Not enough OCV (%dmV)\n", __func__, battery->voltage_ocv);
  2173. return false;
  2174. }
  2175. }
  2176. return true;
  2177. }
  2178. EXPORT_SYMBOL_KUNIT(sec_bat_check_fullcharged_condition);
  2179. __visible_for_testing int sec_bat_do_test_function(struct sec_battery_info *battery)
  2180. {
  2181. union power_supply_propval value = {0, };
  2182. if (battery->test_mode == 0)
  2183. return battery->test_mode;
  2184. pr_info("%s: Test Mode\n", __func__);
  2185. switch (battery->test_mode) {
  2186. case 1:
  2187. if (battery->status == POWER_SUPPLY_STATUS_CHARGING) {
  2188. sec_vote(battery->chgen_vote, VOTER_TEST_MODE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  2189. sec_bat_set_charging_status(battery,
  2190. POWER_SUPPLY_STATUS_DISCHARGING);
  2191. }
  2192. break;
  2193. case 2:
  2194. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  2195. sec_vote(battery->chgen_vote, VOTER_TEST_MODE, true, SEC_BAT_CHG_MODE_CHARGING);
  2196. psy_do_property(battery->pdata->charger_name, get,
  2197. POWER_SUPPLY_PROP_STATUS, value);
  2198. sec_bat_set_charging_status(battery, value.intval);
  2199. }
  2200. battery->test_mode = 0;
  2201. break;
  2202. case 3: // clear temp block
  2203. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  2204. sec_bat_set_charging_status(battery,
  2205. POWER_SUPPLY_STATUS_DISCHARGING);
  2206. break;
  2207. case 4:
  2208. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  2209. sec_vote(battery->chgen_vote, VOTER_TEST_MODE, true, SEC_BAT_CHG_MODE_CHARGING);
  2210. psy_do_property(battery->pdata->charger_name, get,
  2211. POWER_SUPPLY_PROP_STATUS, value);
  2212. sec_bat_set_charging_status(battery, value.intval);
  2213. }
  2214. break;
  2215. default:
  2216. pr_info("%s: error test: unknown state\n", __func__);
  2217. break;
  2218. }
  2219. return battery->test_mode;
  2220. }
  2221. EXPORT_SYMBOL_KUNIT(sec_bat_do_test_function);
  2222. static bool sec_bat_time_management(struct sec_battery_info *battery)
  2223. {
  2224. struct timespec64 ts = {0, };
  2225. unsigned long charging_time;
  2226. if (battery->charging_start_time == 0 || !battery->safety_timer_set) {
  2227. dev_dbg(battery->dev,
  2228. "%s: Charging Disabled\n", __func__);
  2229. return true;
  2230. }
  2231. ts = ktime_to_timespec64(ktime_get_boottime());
  2232. if (ts.tv_sec >= battery->charging_start_time) {
  2233. charging_time = ts.tv_sec - battery->charging_start_time;
  2234. } else {
  2235. charging_time = 0xFFFFFFFF - battery->charging_start_time
  2236. + ts.tv_sec;
  2237. }
  2238. battery->charging_passed_time = charging_time;
  2239. switch (battery->status) {
  2240. case POWER_SUPPLY_STATUS_FULL:
  2241. if (battery->expired_time == 0) {
  2242. dev_info(battery->dev,
  2243. "%s: Recharging Timer Expired\n", __func__);
  2244. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2245. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE);
  2246. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING);
  2247. battery->is_recharging = false;
  2248. sec_vote(battery->chgen_vote, VOTER_TIME_EXPIRED, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  2249. return false;
  2250. }
  2251. break;
  2252. case POWER_SUPPLY_STATUS_CHARGING:
  2253. if ((battery->pdata->full_condition_type &
  2254. SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
  2255. (battery->is_recharging && (battery->expired_time == 0))) {
  2256. dev_info(battery->dev,
  2257. "%s: Recharging Timer Expired\n", __func__);
  2258. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2259. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE);
  2260. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING);
  2261. battery->is_recharging = false;
  2262. sec_vote(battery->chgen_vote, VOTER_TIME_EXPIRED, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  2263. return false;
  2264. } else if (!battery->is_recharging &&
  2265. (battery->expired_time == 0)) {
  2266. dev_info(battery->dev,
  2267. "%s: Charging Timer Expired\n", __func__);
  2268. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2269. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE);
  2270. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING);
  2271. battery->cisd.data[CISD_DATA_SAFETY_TIMER]++;
  2272. battery->cisd.data[CISD_DATA_SAFETY_TIMER_PER_DAY]++;
  2273. #if IS_ENABLED(CONFIG_SEC_ABC)
  2274. sec_abc_send_event("MODULE=battery@WARN=safety_timer");
  2275. #endif
  2276. sec_vote(battery->chgen_vote, VOTER_TIME_EXPIRED, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  2277. return false;
  2278. }
  2279. break;
  2280. default:
  2281. dev_err(battery->dev,
  2282. "%s: Undefine Battery Status\n", __func__);
  2283. return true;
  2284. }
  2285. return true;
  2286. }
  2287. bool sec_bat_check_full(struct sec_battery_info *battery, int full_check_type)
  2288. {
  2289. union power_supply_propval value = {0, };
  2290. int current_adc = 0;
  2291. bool ret = false;
  2292. int err = 0;
  2293. switch (full_check_type) {
  2294. case SEC_BATTERY_FULLCHARGED_ADC:
  2295. current_adc =
  2296. sec_bat_get_adc_data(battery->dev,
  2297. SEC_BAT_ADC_CHANNEL_FULL_CHECK,
  2298. battery->pdata->adc_check_count,
  2299. battery->pdata->adc_read_type);
  2300. dev_dbg(battery->dev, "%s: Current ADC (%d)\n", __func__, current_adc);
  2301. #if !defined(CONFIG_SEC_KUNIT) /* In Kunit test, battery->current_adc is changed by KUNIT TC */
  2302. if (current_adc < 0)
  2303. break;
  2304. battery->current_adc = current_adc;
  2305. #endif
  2306. if (battery->current_adc < battery->topoff_condition) {
  2307. battery->full_check_cnt++;
  2308. dev_dbg(battery->dev, "%s: Full Check ADC (%d)\n",
  2309. __func__, battery->full_check_cnt);
  2310. } else {
  2311. battery->full_check_cnt = 0;
  2312. }
  2313. break;
  2314. case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
  2315. if ((battery->current_now > 0 && battery->current_now <
  2316. battery->topoff_condition) &&
  2317. (battery->current_avg > 0 && battery->current_avg < battery->topoff_condition)) {
  2318. battery->full_check_cnt++;
  2319. dev_dbg(battery->dev, "%s: Full Check Current (%d)\n",
  2320. __func__, battery->full_check_cnt);
  2321. } else {
  2322. battery->full_check_cnt = 0;
  2323. }
  2324. break;
  2325. case SEC_BATTERY_FULLCHARGED_TIME:
  2326. if ((battery->charging_mode ==
  2327. SEC_BATTERY_CHARGING_2ND ?
  2328. (battery->charging_passed_time -
  2329. battery->charging_fullcharged_time) :
  2330. battery->charging_passed_time) >
  2331. battery->topoff_condition) {
  2332. battery->full_check_cnt++;
  2333. dev_dbg(battery->dev, "%s: Full Check Time (%d)\n",
  2334. __func__, battery->full_check_cnt);
  2335. } else {
  2336. battery->full_check_cnt = 0;
  2337. }
  2338. break;
  2339. case SEC_BATTERY_FULLCHARGED_SOC:
  2340. if (battery->capacity <=
  2341. battery->topoff_condition) {
  2342. battery->full_check_cnt++;
  2343. dev_dbg(battery->dev, "%s: Full Check SOC (%d)\n",
  2344. __func__, battery->full_check_cnt);
  2345. } else {
  2346. battery->full_check_cnt = 0;
  2347. }
  2348. break;
  2349. case SEC_BATTERY_FULLCHARGED_CHGGPIO:
  2350. err = gpio_request(
  2351. battery->pdata->chg_gpio_full_check,
  2352. "GPIO_CHG_FULL");
  2353. if (err) {
  2354. dev_err(battery->dev,
  2355. "%s: Error in Request of GPIO\n", __func__);
  2356. break;
  2357. }
  2358. if (!(gpio_get_value_cansleep(
  2359. battery->pdata->chg_gpio_full_check) ^
  2360. !battery->pdata->chg_polarity_full_check)) {
  2361. battery->full_check_cnt++;
  2362. dev_dbg(battery->dev, "%s: Full Check GPIO (%d)\n",
  2363. __func__, battery->full_check_cnt);
  2364. } else {
  2365. battery->full_check_cnt = 0;
  2366. }
  2367. gpio_free(battery->pdata->chg_gpio_full_check);
  2368. break;
  2369. case SEC_BATTERY_FULLCHARGED_CHGINT:
  2370. case SEC_BATTERY_FULLCHARGED_CHGPSY:
  2371. psy_do_property(battery->pdata->charger_name, get,
  2372. POWER_SUPPLY_PROP_STATUS, value);
  2373. if (value.intval == POWER_SUPPLY_STATUS_FULL) {
  2374. battery->full_check_cnt++;
  2375. dev_info(battery->dev, "%s: Full Check Charger (%d)\n",
  2376. __func__, battery->full_check_cnt);
  2377. } else {
  2378. battery->full_check_cnt = 0;
  2379. }
  2380. break;
  2381. /*
  2382. * If these is NOT full check type or NONE full check type,
  2383. * it is full-charged
  2384. */
  2385. case SEC_BATTERY_FULLCHARGED_NONE:
  2386. battery->full_check_cnt = 0;
  2387. ret = true;
  2388. break;
  2389. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  2390. case SEC_BATTERY_FULLCHARGED_LIMITER:
  2391. value.intval = 1;
  2392. psy_do_property(battery->pdata->dual_battery_name, get,
  2393. POWER_SUPPLY_PROP_STATUS, value);
  2394. if (value.intval == POWER_SUPPLY_STATUS_FULL) {
  2395. battery->full_check_cnt++;
  2396. dev_info(battery->dev, "%s: Full Check Limiter (%d)\n",
  2397. __func__, battery->full_check_cnt);
  2398. } else {
  2399. battery->full_check_cnt = 0;
  2400. }
  2401. break;
  2402. #endif
  2403. default:
  2404. dev_err(battery->dev,
  2405. "%s: Invalid Full Check\n", __func__);
  2406. break;
  2407. }
  2408. #if defined(CONFIG_ENABLE_FULL_BY_SOC)
  2409. if (battery->capacity >= 100 &&
  2410. battery->charging_mode == SEC_BATTERY_CHARGING_1ST &&
  2411. !battery->is_recharging) {
  2412. battery->full_check_cnt = battery->pdata->full_check_count;
  2413. dev_info(battery->dev,
  2414. "%s: enough SOC to make FULL(%d%%)\n",
  2415. __func__, battery->capacity);
  2416. }
  2417. #endif
  2418. if (battery->full_check_cnt >=
  2419. battery->pdata->full_check_count) {
  2420. battery->full_check_cnt = 0;
  2421. ret = true;
  2422. }
  2423. if (ret && (battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE)) {
  2424. battery->cisd.data[CISD_DATA_SWELLING_FULL_CNT]++;
  2425. battery->cisd.data[CISD_DATA_SWELLING_FULL_CNT_PER_DAY]++;
  2426. }
  2427. return ret;
  2428. }
  2429. EXPORT_SYMBOL_KUNIT(sec_bat_check_full);
  2430. static void sec_bat_check_eoc_for_repcap(struct sec_battery_info *battery, int full_check_type)
  2431. {
  2432. union power_supply_propval value = {0, };
  2433. if (battery->pdata->soc_by_repcap_en && battery->eoc_d->eoc_check) {
  2434. pr_info("%s: check eoc for repcap\n", __func__);
  2435. switch (full_check_type) {
  2436. case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
  2437. if ((battery->current_now > 0 &&
  2438. battery->current_now < battery->pdata->full_check_current_1st) &&
  2439. (battery->current_avg > 0 &&
  2440. battery->current_avg < battery->pdata->full_check_current_1st)) {
  2441. battery->eoc_d->eoc_cnt++;
  2442. pr_info("%s : full cnt = %d FG current full check cnt = %d\n", __func__,
  2443. battery->pdata->full_check_count, battery->eoc_d->eoc_cnt);
  2444. if (battery->eoc_d->eoc_cnt >= battery->pdata->full_check_count) {
  2445. battery->eoc_d->eoc_check = false;
  2446. value.intval = battery->capacity;
  2447. /*update 1st EOC repcap value */
  2448. psy_do_property(battery->pdata->fuelgauge_name, set,
  2449. POWER_SUPPLY_EXT_PROP_STATUS_FULL_REPCAP, value);
  2450. pr_info("%s:first EOC\n", __func__);
  2451. }
  2452. } else {
  2453. pr_info("%s: not first EOC\n", __func__);
  2454. battery->eoc_d->eoc_cnt = 0; // check by default value
  2455. }
  2456. break;
  2457. default:
  2458. dev_err(battery->dev,
  2459. "%s: Invalid Full Check\n", __func__);
  2460. break;
  2461. }
  2462. }
  2463. }
  2464. static void sec_bat_enable_eoc_check(struct sec_battery_info *battery)
  2465. {
  2466. if (battery->pdata->soc_by_repcap_en && battery->capacity < 100 &&
  2467. battery->charging_mode == SEC_BATTERY_CHARGING_1ST) {
  2468. battery->eoc_d->eoc_check = true; // check for default value, check charging mode value
  2469. pr_info("%s : eoc_check(%d) charging mode int(%d) , battery_capacity: %d\n",
  2470. __func__, battery->eoc_d->eoc_check, battery->charging_mode, battery->capacity);
  2471. }
  2472. }
  2473. bool sec_bat_check_fullcharged(struct sec_battery_info *battery)
  2474. {
  2475. int full_check_type = SEC_BATTERY_FULLCHARGED_NONE;
  2476. sec_bat_enable_eoc_check(battery);
  2477. if (!sec_bat_check_fullcharged_condition(battery))
  2478. return false;
  2479. sec_bat_check_eoc_for_repcap(battery, battery->pdata->full_check_type);
  2480. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  2481. full_check_type = battery->pdata->full_check_type;
  2482. else
  2483. full_check_type = battery->pdata->full_check_type_2nd;
  2484. return sec_bat_check_full(battery, full_check_type);
  2485. }
  2486. __visible_for_testing void sec_bat_do_fullcharged(struct sec_battery_info *battery, bool force_fullcharged)
  2487. {
  2488. union power_supply_propval value = {0, };
  2489. /*
  2490. * To let charger/fuel gauge know the full status,
  2491. * set status before calling sec_bat_set_charge()
  2492. */
  2493. if (battery->status != POWER_SUPPLY_STATUS_FULL) {
  2494. battery->cisd.data[CISD_DATA_FULL_COUNT]++;
  2495. battery->cisd.data[CISD_DATA_FULL_COUNT_PER_DAY]++;
  2496. }
  2497. sec_bat_set_charging_status(battery,
  2498. POWER_SUPPLY_STATUS_FULL);
  2499. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST &&
  2500. battery->pdata->full_check_type_2nd != SEC_BATTERY_FULLCHARGED_NONE && !force_fullcharged) {
  2501. battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
  2502. battery->charging_fullcharged_time = battery->charging_passed_time;
  2503. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, true, battery->pdata->full_check_current_2nd);
  2504. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING);
  2505. pr_info("%s: 1st charging is done\n", __func__);
  2506. psy_do_property(battery->pdata->wireless_charger_name, set,
  2507. POWER_SUPPLY_EXT_PROP_WIRELESS_1ST_DONE, value);
  2508. } else {
  2509. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2510. battery->is_recharging = false;
  2511. if (!battery->wdt_kick_disable) {
  2512. pr_info("%s: wdt kick enable -> Charger Off, %d\n",
  2513. __func__, battery->wdt_kick_disable);
  2514. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  2515. if (battery->pdata->change_FV_after_full)
  2516. sec_vote(battery->fv_vote, VOTER_FULL_CHARGE, true, battery->pdata->change_FV_after_full);
  2517. pr_info("%s: 2nd charging is done\n", __func__);
  2518. if (is_wireless_type(battery->cable_type)) {
  2519. psy_do_property(battery->pdata->wireless_charger_name, set,
  2520. POWER_SUPPLY_EXT_PROP_WIRELESS_2ND_DONE, value);
  2521. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  2522. value.intval = ENTER_PHM;
  2523. psy_do_property(battery->pdata->wireless_charger_name, set,
  2524. POWER_SUPPLY_EXT_PROP_RX_PHM, value);
  2525. #endif
  2526. }
  2527. } else {
  2528. pr_info("%s: wdt kick disabled -> skip charger off, %d\n",
  2529. __func__, battery->wdt_kick_disable);
  2530. }
  2531. sec_bat_aging_check(battery);
  2532. /* this concept is only for power-off charging mode*/
  2533. if (!battery->store_mode && sec_bat_get_lpmode()) {
  2534. /* vbus level : 9V --> 5V */
  2535. sec_vote(battery->iv_vote, VOTER_FULL_CHARGE, true, SEC_INPUT_VOLTAGE_5V);
  2536. pr_info("%s: vbus is set 5V by 2nd full\n", __func__);
  2537. }
  2538. value.intval = POWER_SUPPLY_STATUS_FULL;
  2539. psy_do_property(battery->pdata->fuelgauge_name, set,
  2540. POWER_SUPPLY_PROP_STATUS, value);
  2541. }
  2542. /*
  2543. * platform can NOT get information of battery
  2544. * because wakeup time is too short to check uevent
  2545. * To make sure that target is wakeup if full-charged,
  2546. * activated wake lock in a few seconds
  2547. */
  2548. if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
  2549. sb_set_vbus_wake(battery->vbus_ws, battery->health, battery->cable_type);
  2550. }
  2551. EXPORT_SYMBOL_KUNIT(sec_bat_do_fullcharged);
  2552. static bool sec_bat_fullcharged_check(struct sec_battery_info *battery)
  2553. {
  2554. if ((battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ||
  2555. (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
  2556. dev_dbg(battery->dev,
  2557. "%s: No Need to Check Full-Charged\n", __func__);
  2558. return true;
  2559. }
  2560. if (sec_bat_check_fullcharged(battery)) {
  2561. union power_supply_propval value = {0, };
  2562. if (battery->capacity < 100) {
  2563. /* update capacity max */
  2564. value.intval = battery->capacity;
  2565. psy_do_property(battery->pdata->fuelgauge_name, set,
  2566. POWER_SUPPLY_PROP_CHARGE_FULL, value);
  2567. pr_info("%s : forced full-charged sequence for the capacity(%d)\n",
  2568. __func__, battery->capacity);
  2569. battery->full_check_cnt = battery->pdata->full_check_count;
  2570. } else {
  2571. sec_bat_do_fullcharged(battery, false);
  2572. }
  2573. }
  2574. dev_info(battery->dev,
  2575. "%s: Charging Mode : %s\n", __func__,
  2576. battery->is_recharging ?
  2577. sb_get_cm_str(SEC_BATTERY_CHARGING_RECHARGING) :
  2578. sb_get_cm_str(battery->charging_mode));
  2579. return true;
  2580. }
  2581. int sec_bat_get_inbat_vol_ocv(struct sec_battery_info *battery)
  2582. {
  2583. sec_battery_platform_data_t *pdata = battery->pdata;
  2584. union power_supply_propval value = {0, };
  2585. int j, k, ocv, jig_on = 0, ocv_data[10];
  2586. int ret = 0;
  2587. switch (pdata->inbat_ocv_type) {
  2588. case SEC_BATTERY_OCV_FG_SRC_CHANGE:
  2589. pr_info("%s: FGSRC_SWITCHING_VBAT\n", __func__);
  2590. value.intval = SEC_BAT_INBAT_FGSRC_SWITCHING_VBAT;
  2591. psy_do_property(pdata->fgsrc_switch_name, set,
  2592. POWER_SUPPLY_EXT_PROP_FGSRC_SWITCHING, value);
  2593. for (j = 0; j < 10; j++) {
  2594. msleep(175);
  2595. value.intval = SEC_BATTERY_VOLTAGE_MV;
  2596. psy_do_property(pdata->fuelgauge_name, get,
  2597. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  2598. ocv_data[j] = value.intval;
  2599. }
  2600. ret = psy_do_property(pdata->fuelgauge_name, get,
  2601. POWER_SUPPLY_EXT_PROP_JIG_GPIO, value);
  2602. if (value.intval < 0 || ret < 0)
  2603. jig_on = 0;
  2604. else if (value.intval == 0)
  2605. jig_on = 1;
  2606. if (battery->is_jig_on || sec_bat_get_facmode() || battery->factory_mode || jig_on) {
  2607. pr_info("%s: FGSRC_SWITCHING_VSYS\n", __func__);
  2608. value.intval = SEC_BAT_INBAT_FGSRC_SWITCHING_VSYS;
  2609. psy_do_property(pdata->fgsrc_switch_name, set,
  2610. POWER_SUPPLY_EXT_PROP_FGSRC_SWITCHING, value);
  2611. }
  2612. for (j = 1; j < 10; j++) {
  2613. ocv = ocv_data[j];
  2614. k = j;
  2615. while (k > 0 && ocv_data[k-1] > ocv) {
  2616. ocv_data[k] = ocv_data[k-1];
  2617. k--;
  2618. }
  2619. ocv_data[k] = ocv;
  2620. }
  2621. for (j = 0; j < 10; j++)
  2622. pr_info("%s: [%d] %d\n", __func__, j, ocv_data[j]);
  2623. ocv = 0;
  2624. for (j = 2; j < 8; j++)
  2625. ocv += ocv_data[j];
  2626. ret = ocv / 6;
  2627. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  2628. /* just for debug */
  2629. value.intval = SEC_DUAL_BATTERY_MAIN;
  2630. psy_do_property(pdata->dual_battery_name, get,
  2631. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  2632. value.intval = SEC_DUAL_BATTERY_SUB;
  2633. psy_do_property(pdata->dual_battery_name, get,
  2634. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  2635. #endif
  2636. break;
  2637. case SEC_BATTERY_OCV_FG_NOSRC_CHANGE:
  2638. value.intval = SEC_BATTERY_VOLTAGE_MV;
  2639. psy_do_property(pdata->fuelgauge_name, get,
  2640. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  2641. ret = value.intval;
  2642. break;
  2643. case SEC_BATTERY_OCV_ADC:
  2644. /* run twice */
  2645. ret = (sec_bat_get_inbat_vol_by_adc(battery) +
  2646. sec_bat_get_inbat_vol_by_adc(battery)) / 2;
  2647. break;
  2648. case SEC_BATTERY_OCV_VOLT_FROM_PMIC:
  2649. psy_do_property(battery->pdata->fuelgauge_name, get,
  2650. POWER_SUPPLY_EXT_PROP_PMIC_BAT_VOLTAGE,
  2651. value);
  2652. ret = value.intval;
  2653. break;
  2654. case SEC_BATTERY_OCV_NONE:
  2655. default:
  2656. break;
  2657. };
  2658. pr_info("%s: [%d] in-battery voltage ocv(%d)\n",
  2659. __func__, pdata->inbat_ocv_type, ret);
  2660. return ret;
  2661. }
  2662. #if !defined(CONFIG_SEC_FACTORY)
  2663. static bool sec_bat_is_unknown_wpc_temp(
  2664. int wpc_temp, int usb_temp, bool loosened_unknown_temp)
  2665. {
  2666. if (loosened_unknown_temp) {
  2667. if (usb_temp - wpc_temp >= 250)
  2668. return true;
  2669. } else {
  2670. if (wpc_temp <= (-200))
  2671. return true;
  2672. }
  2673. return false;
  2674. }
  2675. static void sec_bat_calc_unknown_wpc_temp(
  2676. struct sec_battery_info *battery, int *batt_temp, int wpc_temp, int usb_temp)
  2677. {
  2678. if ((battery->pdata->wpc_thm_info.source != SEC_BATTERY_THERMAL_SOURCE_NONE) &&
  2679. !is_wireless_all_type(battery->cable_type)) {
  2680. if (sec_bat_is_unknown_wpc_temp(wpc_temp, usb_temp,
  2681. battery->pdata->loosened_unknown_temp)) {
  2682. if (usb_temp >= 270)
  2683. *batt_temp = (usb_temp + 60) > 900 ? 900 : (usb_temp + 60);
  2684. else if (usb_temp <= 210)
  2685. *batt_temp = (usb_temp - 50) < (-200) ? (-200) : (usb_temp - 50);
  2686. else
  2687. *batt_temp = (170 * usb_temp - 26100) / 60;
  2688. pr_info("%s : Tbat(wpc_temp:%d) to (%d)\n", __func__, wpc_temp, *batt_temp);
  2689. }
  2690. }
  2691. }
  2692. int adjust_bat_temp(struct sec_battery_info *battery, int batt_temp, int sub_bat_temp)
  2693. {
  2694. int bat_t = 0, bat_t_1 = 0; /* bat_t = bat_v(t), bat_t_1 = bat_v(t_1) */
  2695. int lr_delta = battery->pdata->lr_delta;
  2696. struct timespec64 ts = {0, };
  2697. ts = ktime_to_timespec64(ktime_get_boottime());
  2698. /* this temperature prediction formula has high accuracy at room temperature */
  2699. if (batt_temp <= 250 || sub_bat_temp <= 0) {
  2700. battery->lrp_temp = 0x7FFF;
  2701. battery->lr_start_time = 0;
  2702. battery->lr_time_span = 0;
  2703. return batt_temp;
  2704. }
  2705. battery->lr_time_span = ts.tv_sec - battery->lr_start_time;
  2706. battery->lr_start_time = battery->lr_start_time + battery->lr_time_span;
  2707. if (battery->lr_time_span > 60)
  2708. battery->lr_time_span = 60;
  2709. if (battery->lr_time_span < 1)
  2710. battery->lr_time_span = 1;
  2711. if (battery->lrp_temp == 0x7FFF) {
  2712. /* init bat_t_1 as bat(0) */
  2713. bat_t_1 = (sub_bat_temp*battery->pdata->lr_param_init_sub_bat_thm + batt_temp*battery->pdata->lr_param_init_bat_thm)/100;
  2714. } else
  2715. bat_t_1 = battery->lr_bat_t_1; /* bat_v(t) as previous bat_v(t_1) */
  2716. /*
  2717. * calculate bat_v(t)
  2718. * bat_v(0) = bat_v
  2719. * bat_v(t) = bat_v(t_1) + ((raw - bat_v(t_1))*0.016*time_span+0.5)
  2720. * lrp_temp = A*bat_v(t) + B*bat
  2721. */
  2722. bat_t = ((bat_t_1*1000) + ((batt_temp - bat_t_1)*lr_delta*battery->lr_time_span+battery->pdata->lr_round_off))/1000;
  2723. battery->lrp_temp = (battery->pdata->lr_param_bat_thm*bat_t + battery->pdata->lr_param_sub_bat_thm*sub_bat_temp)/1000;
  2724. if ((is_wireless_all_type(battery->cable_type) ||
  2725. battery->misc_event & BATT_MISC_EVENT_WIRELESS_DET_LEVEL) &&
  2726. battery->lrp_temp >= 350)
  2727. battery->lrp_temp = battery->lrp_temp - 10;
  2728. pr_info("%s : LRP: %d, lrp_temp_raw: %d wpc_temp: %d lrp_bat_t_1: %d lrp_bat_v: %d time_span: %lds\n",
  2729. __func__, battery->lrp_temp, batt_temp, sub_bat_temp, bat_t_1, bat_t, battery->lr_time_span);
  2730. battery->lr_bat_t_1 = bat_t;
  2731. return battery->lrp_temp;
  2732. }
  2733. EXPORT_SYMBOL(adjust_bat_temp);
  2734. #endif
  2735. int sec_bat_get_temperature(struct device *dev, struct sec_bat_thm_info *info, int old_val,
  2736. char *chg_name, char *fg_name, int adc_read_type)
  2737. {
  2738. union power_supply_propval value = {0, };
  2739. int temp = old_val;
  2740. int adc;
  2741. if (info->check_type == SEC_BATTERY_TEMP_CHECK_FAKE)
  2742. return FAKE_TEMP;
  2743. if (info->test > -300 && info->test < 3000) {
  2744. pr_info("%s : temperature test %d\n", __func__, info->test);
  2745. return info->test;
  2746. }
  2747. /* get battery thm info */
  2748. switch (info->source) {
  2749. case SEC_BATTERY_THERMAL_SOURCE_FG:
  2750. psy_do_property(fg_name, get, POWER_SUPPLY_PROP_TEMP, value);
  2751. temp = value.intval;
  2752. break;
  2753. case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
  2754. pr_info("%s : need to implement\n", __func__);
  2755. break;
  2756. case SEC_BATTERY_THERMAL_SOURCE_ADC:
  2757. adc = sec_bat_get_adc_data(dev, info->channel, info->check_count, adc_read_type);
  2758. if (adc >= 0) {
  2759. info->adc = adc;
  2760. sec_bat_convert_adc_to_val(adc, info->offset,
  2761. info->adc_table, info->adc_table_size, &temp);
  2762. }
  2763. break;
  2764. case SEC_BATTERY_THERMAL_SOURCE_CHG_ADC:
  2765. if (!psy_do_property(chg_name, get, POWER_SUPPLY_PROP_TEMP, value)) {
  2766. info->adc = value.intval;
  2767. sec_bat_convert_adc_to_val(value.intval, info->offset,
  2768. info->adc_table, info->adc_table_size, &temp);
  2769. }
  2770. break;
  2771. case SEC_BATTERY_THERMAL_SOURCE_FG_ADC:
  2772. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  2773. value.intval = SEC_BATTERY_TEMP_ADC;
  2774. #endif
  2775. if (!psy_do_property(fg_name, get, POWER_SUPPLY_PROP_TEMP, value)) {
  2776. info->adc = value.intval;
  2777. sec_bat_convert_adc_to_val(value.intval, info->offset,
  2778. info->adc_table, info->adc_table_size, &temp);
  2779. }
  2780. break;
  2781. default:
  2782. break;
  2783. }
  2784. return temp;
  2785. }
  2786. EXPORT_SYMBOL(sec_bat_get_temperature);
  2787. int sec_bat_adjust_temperature(struct sec_battery_info *battery, int read_temp, int prev_temp)
  2788. {
  2789. int ret = read_temp;
  2790. static bool temp_init;
  2791. if (temp_init == false) {
  2792. temp_init = true;
  2793. return ret;
  2794. }
  2795. if ((read_temp - prev_temp) > battery->pdata->batt_temp_adj_gap_inc)
  2796. ret = prev_temp + battery->pdata->batt_temp_adj_gap_inc;
  2797. pr_info("%s: read: %d, prev: %d, now: %d\n",
  2798. __func__, read_temp, prev_temp, ret);
  2799. return ret;
  2800. }
  2801. __visible_for_testing void sec_bat_get_temperature_info(struct sec_battery_info *battery)
  2802. {
  2803. union power_supply_propval value = {0, };
  2804. static bool shipmode_en = false;
  2805. int batt_temp = battery->temperature;
  2806. int usb_temp = battery->usb_temp;
  2807. int chg_temp = battery->chg_temp;
  2808. int dchg_temp = battery->dchg_temp;
  2809. int wpc_temp = battery->wpc_temp;
  2810. int sub_bat_temp = battery->sub_bat_temp;
  2811. int blkt_temp = battery->blkt_temp;
  2812. char *fg_name = battery->pdata->fuelgauge_name;
  2813. char *chg_name = battery->pdata->charger_name;
  2814. /* get battery thm info */
  2815. batt_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->bat_thm_info, batt_temp,
  2816. chg_name, fg_name, battery->pdata->adc_read_type);
  2817. /* get usb thm info */
  2818. usb_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->usb_thm_info, usb_temp,
  2819. chg_name, fg_name, battery->pdata->adc_read_type);
  2820. /* get chg thm info */
  2821. chg_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->chg_thm_info, chg_temp,
  2822. chg_name, fg_name, battery->pdata->adc_read_type);
  2823. /* get wpc thm info */
  2824. wpc_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->wpc_thm_info, wpc_temp,
  2825. chg_name, fg_name, battery->pdata->adc_read_type);
  2826. /* get sub_bat thm info */
  2827. sub_bat_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->sub_bat_thm_info, sub_bat_temp,
  2828. chg_name, fg_name, battery->pdata->adc_read_type);
  2829. #if !defined(CONFIG_SEC_FACTORY)
  2830. if (battery->pdata->lr_enable)
  2831. batt_temp = adjust_bat_temp(battery, batt_temp, sub_bat_temp);
  2832. #endif
  2833. /* get blkt thm info */
  2834. blkt_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->blk_thm_info, blkt_temp,
  2835. chg_name, fg_name, battery->pdata->adc_read_type);
  2836. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  2837. if (battery->pdata->dctp_by_cgtp)
  2838. dchg_temp = chg_temp;
  2839. else if (is_pd_apdo_wire_type(battery->wire_status))
  2840. dchg_temp = sec_bat_get_temperature(battery->dev, &battery->pdata->dchg_thm_info,
  2841. dchg_temp, chg_name, fg_name, battery->pdata->adc_read_type);
  2842. #endif
  2843. #if !defined(CONFIG_SEC_FACTORY)
  2844. if (battery->pdata->sub_temp_control_source == TEMP_CONTROL_SOURCE_WPC_THM)
  2845. sec_bat_calc_unknown_wpc_temp(battery, &sub_bat_temp, wpc_temp, usb_temp);
  2846. else
  2847. sec_bat_calc_unknown_wpc_temp(battery, &batt_temp, wpc_temp, usb_temp);
  2848. #endif
  2849. if (battery->pdata->batt_temp_adj_gap_inc)
  2850. battery->temperature = sec_bat_adjust_temperature(battery,
  2851. batt_temp, battery->temperature);
  2852. else
  2853. battery->temperature = batt_temp;
  2854. if (battery->pdata->lrpts_by_batts)
  2855. battery->lrp = battery->temperature;
  2856. battery->temper_amb = batt_temp;
  2857. battery->usb_temp = usb_temp;
  2858. battery->chg_temp = chg_temp;
  2859. battery->dchg_temp = dchg_temp;
  2860. battery->wpc_temp = wpc_temp;
  2861. battery->sub_bat_temp = sub_bat_temp;
  2862. battery->blkt_temp = blkt_temp;
  2863. value.intval = battery->temperature;
  2864. #if defined(CONFIG_SEC_FACTORY)
  2865. if (battery->pdata->usb_thm_info.check_type &&
  2866. (battery->temperature <= (-200))) {
  2867. value.intval = (battery->usb_temp <= (-200) ? battery->chg_temp : battery->usb_temp);
  2868. }
  2869. #endif
  2870. psy_do_property(battery->pdata->fuelgauge_name, set,
  2871. POWER_SUPPLY_PROP_TEMP, value);
  2872. psy_do_property(battery->pdata->fuelgauge_name, set,
  2873. POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
  2874. if (battery->pdata->en_auto_shipmode_temp_ctrl) {
  2875. if (battery->temperature < 0 && !shipmode_en) {
  2876. value.intval = 0;
  2877. psy_do_property(battery->pdata->charger_name, set,
  2878. POWER_SUPPLY_EXT_PROP_AUTO_SHIPMODE_CONTROL, value);
  2879. shipmode_en = true;
  2880. } else if (battery->temperature >= 50 && shipmode_en) {
  2881. value.intval = 1;
  2882. psy_do_property(battery->pdata->charger_name, set,
  2883. POWER_SUPPLY_EXT_PROP_AUTO_SHIPMODE_CONTROL, value);
  2884. shipmode_en = false;
  2885. }
  2886. }
  2887. }
  2888. EXPORT_SYMBOL_KUNIT(sec_bat_get_temperature_info);
  2889. void sec_bat_get_battery_info(struct sec_battery_info *battery)
  2890. {
  2891. union power_supply_propval value = {0, };
  2892. char str[1024] = {0, };
  2893. value.intval = SEC_BATTERY_VOLTAGE_MV;
  2894. psy_do_property(battery->pdata->fuelgauge_name, get,
  2895. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  2896. battery->voltage_now = value.intval;
  2897. value.intval = SEC_BATTERY_VOLTAGE_MV;
  2898. psy_do_property(battery->pdata->fuelgauge_name, get,
  2899. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  2900. battery->voltage_avg = value.intval;
  2901. /* Do not call it to reduce time after cable_work, this function call FG full log */
  2902. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL)) {
  2903. value.intval = SEC_BATTERY_VOLTAGE_MV;
  2904. psy_do_property(battery->pdata->fuelgauge_name, get,
  2905. POWER_SUPPLY_PROP_VOLTAGE_OCV, value);
  2906. battery->voltage_ocv = value.intval;
  2907. }
  2908. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  2909. /* get main voltage */
  2910. value.intval = SEC_DUAL_BATTERY_MAIN;
  2911. psy_do_property(battery->pdata->dual_battery_name, get,
  2912. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  2913. battery->voltage_now_main = value.intval;
  2914. /* get sub voltage */
  2915. value.intval = SEC_DUAL_BATTERY_SUB;
  2916. psy_do_property(battery->pdata->dual_battery_name, get,
  2917. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  2918. battery->voltage_now_sub = value.intval;
  2919. /* get main voltage */
  2920. value.intval = SEC_DUAL_BATTERY_MAIN;
  2921. psy_do_property(battery->pdata->dual_battery_name, get,
  2922. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  2923. battery->voltage_avg_main = value.intval;
  2924. /* get sub voltage */
  2925. value.intval = SEC_DUAL_BATTERY_SUB;
  2926. psy_do_property(battery->pdata->dual_battery_name, get,
  2927. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  2928. battery->voltage_avg_sub = value.intval;
  2929. /* get main current */
  2930. value.intval = SEC_DUAL_BATTERY_MAIN;
  2931. psy_do_property(battery->pdata->dual_battery_name, get,
  2932. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  2933. battery->current_now_main = value.intval;
  2934. /* get sub current */
  2935. value.intval = SEC_DUAL_BATTERY_SUB;
  2936. psy_do_property(battery->pdata->dual_battery_name, get,
  2937. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  2938. battery->current_now_sub = value.intval;
  2939. /* get main current */
  2940. value.intval = SEC_DUAL_BATTERY_MAIN;
  2941. psy_do_property(battery->pdata->dual_battery_name, get,
  2942. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  2943. battery->current_avg_main = value.intval;
  2944. /* get sub current */
  2945. value.intval = SEC_DUAL_BATTERY_SUB;
  2946. psy_do_property(battery->pdata->dual_battery_name, get,
  2947. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  2948. battery->current_avg_sub = value.intval;
  2949. #endif
  2950. #if IS_ENABLED(CONFIG_DUAL_FUELGAUGE)
  2951. /* get main soc */
  2952. value.intval = SEC_DUAL_BATTERY_MAIN;
  2953. psy_do_property(battery->pdata->fuelgauge_name, get,
  2954. POWER_SUPPLY_EXT_PROP_REPSOC, value);
  2955. battery->main_capacity = value.intval;
  2956. /* get sub soc */
  2957. value.intval = SEC_DUAL_BATTERY_SUB;
  2958. psy_do_property(battery->pdata->fuelgauge_name, get,
  2959. POWER_SUPPLY_EXT_PROP_REPSOC, value);
  2960. battery->sub_capacity = value.intval;
  2961. #endif
  2962. value.intval = SEC_BATTERY_CURRENT_MA;
  2963. psy_do_property(battery->pdata->fuelgauge_name, get,
  2964. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  2965. battery->current_now = value.intval;
  2966. value.intval = SEC_BATTERY_CURRENT_MA;
  2967. psy_do_property(battery->pdata->fuelgauge_name, get,
  2968. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  2969. battery->current_avg = value.intval;
  2970. #if IS_ENABLED(CONFIG_FUELGAUGE_MAX77705)
  2971. value.intval = SEC_BATTERY_ISYS_AVG_MA;
  2972. psy_do_property(battery->pdata->fuelgauge_name, get,
  2973. POWER_SUPPLY_EXT_PROP_MEASURE_SYS, value);
  2974. battery->current_sys_avg = value.intval;
  2975. value.intval = SEC_BATTERY_ISYS_MA;
  2976. psy_do_property(battery->pdata->fuelgauge_name, get,
  2977. POWER_SUPPLY_EXT_PROP_MEASURE_SYS, value);
  2978. battery->current_sys = value.intval;
  2979. #endif
  2980. /* input current limit in charger */
  2981. psy_do_property(battery->pdata->charger_name, get,
  2982. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, value);
  2983. battery->current_max = value.intval;
  2984. psy_do_property(battery->pdata->fuelgauge_name, get,
  2985. POWER_SUPPLY_PROP_CHARGE_COUNTER, value);
  2986. battery->charge_counter = value.intval;
  2987. /* check abnormal status for wireless charging */
  2988. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL) &&
  2989. (is_wireless_type(battery->cable_type) || battery->wc_tx_enable)) {
  2990. value.intval = (battery->status == POWER_SUPPLY_STATUS_FULL) ?
  2991. 100 : battery->capacity;
  2992. psy_do_property(battery->pdata->wireless_charger_name, set,
  2993. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  2994. }
  2995. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  2996. value.intval = (battery->status == POWER_SUPPLY_STATUS_FULL) ?
  2997. 100 : battery->capacity;
  2998. psy_do_property(battery->pdata->wireless_charger_name, set,
  2999. POWER_SUPPLY_PROP_CAPACITY, value);
  3000. #endif
  3001. sec_bat_get_temperature_info(battery);
  3002. /* To get SOC value (NOT raw SOC), need to reset value */
  3003. value.intval = 0;
  3004. psy_do_property(battery->pdata->fuelgauge_name, get,
  3005. POWER_SUPPLY_PROP_CAPACITY, value);
  3006. /* if the battery status was full, and SOC wasn't 100% yet,
  3007. then ignore FG SOC, and report (previous SOC +1)% */
  3008. battery->capacity = value.intval;
  3009. /* voltage information */
  3010. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  3011. sprintf(str, "%s:Vm(%dmV),Vavgm(%dmV),Vs(%dmV),Vavgs(%dmV),", __func__,
  3012. battery->voltage_now_main, battery->voltage_avg_main,
  3013. battery->voltage_now_sub, battery->voltage_avg_sub
  3014. );
  3015. #else
  3016. sprintf(str, "%s:Vnow(%dmV),Vavg(%dmV),", __func__,
  3017. battery->voltage_now, battery->voltage_avg
  3018. );
  3019. #endif
  3020. /* current information */
  3021. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  3022. sprintf(str + strlen(str), "Inow(%dmA),Iavg(%dmA),Isysavg(%dmA),Inow_m(%dmA),Iavg_m(%dmA),Inow_s(%dmA),Iavg_s(%dmA),Imax(%dmA),Ichg(%dmA),Ichg_m(%dmA),Ichg_s(%dmA),SOC(%d%%),",
  3023. battery->current_now, battery->current_avg,
  3024. battery->current_sys_avg, battery->current_now_main,
  3025. battery->current_avg_main, battery->current_now_sub,
  3026. battery->current_avg_sub, battery->current_max,
  3027. battery->charging_current, battery->main_current,
  3028. battery->sub_current, battery->capacity
  3029. );
  3030. #else
  3031. sprintf(str + strlen(str), "Inow(%dmA),Iavg(%dmA),Isysavg(%dmA),Imax(%dmA),Ichg(%dmA),SOC(%d%%),",
  3032. battery->current_now, battery->current_avg,
  3033. battery->current_sys_avg, battery->current_max,
  3034. battery->charging_current, battery->capacity
  3035. );
  3036. #endif
  3037. /* soc information */
  3038. #if IS_ENABLED(CONFIG_DUAL_FUELGAUGE)
  3039. sprintf(str + strlen(str), "MSOC(%d.%d%%),SSOC(%d.%d%%),",
  3040. battery->main_capacity/10, battery->main_capacity%10,
  3041. battery->sub_capacity/10, battery->sub_capacity%10
  3042. );
  3043. #endif
  3044. /* temperature information */
  3045. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  3046. sprintf(str + strlen(str), "Tsub(%d),",
  3047. battery->sub_bat_temp
  3048. );
  3049. #endif
  3050. sprintf(str + strlen(str), "Tbat(%d),Tusb(%d),Tchg(%d),Twpc(%d),Tblkt(%d),Tlrp(%d),",
  3051. battery->temperature, battery->usb_temp,
  3052. battery->chg_temp, battery->wpc_temp,
  3053. battery->blkt_temp, battery->lrp
  3054. );
  3055. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3056. sprintf(str + strlen(str), "Tdchg(%d)\n",
  3057. battery->dchg_temp
  3058. );
  3059. #endif
  3060. pr_info("%s", str);
  3061. #if defined(CONFIG_ARCH_QCOM) && !(defined(CONFIG_ARCH_EXYNOS) || defined(CONFIG_ARCH_MEDIATEK))
  3062. if (!strcmp(battery->pdata->chip_vendor, "QCOM"))
  3063. battery_last_dcvs(battery->capacity, battery->voltage_avg,
  3064. battery->temperature, battery->current_avg);
  3065. #endif
  3066. #if IS_ENABLED(CONFIG_SEC_DEBUG_EXTRA_INFO) && !defined(CONFIG_ARCH_MTK_PROJECT)
  3067. if (!strcmp(battery->pdata->chip_vendor, "LSI"))
  3068. secdbg_exin_set_batt(battery->capacity, battery->voltage_avg,
  3069. battery->temperature, battery->current_avg);
  3070. #endif
  3071. }
  3072. EXPORT_SYMBOL(sec_bat_get_battery_info);
  3073. __visible_for_testing void sec_bat_polling_work(struct work_struct *work)
  3074. {
  3075. struct sec_battery_info *battery = container_of(
  3076. work, struct sec_battery_info, polling_work.work);
  3077. __pm_stay_awake(battery->monitor_ws);
  3078. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3079. dev_dbg(battery->dev, "%s: Activated\n", __func__);
  3080. }
  3081. EXPORT_SYMBOL_KUNIT(sec_bat_polling_work);
  3082. static void sec_bat_program_alarm(
  3083. struct sec_battery_info *battery, int seconds)
  3084. {
  3085. alarm_start(&battery->polling_alarm,
  3086. ktime_add(battery->last_poll_time, ktime_set(seconds, 0)));
  3087. }
  3088. static unsigned int sec_bat_get_polling_time(
  3089. struct sec_battery_info *battery)
  3090. {
  3091. if (battery->status == POWER_SUPPLY_STATUS_FULL)
  3092. battery->polling_time = battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_CHARGING];
  3093. else
  3094. battery->polling_time = battery->pdata->polling_time[battery->status];
  3095. battery->polling_short = true;
  3096. switch (battery->status) {
  3097. case POWER_SUPPLY_STATUS_CHARGING:
  3098. if (battery->polling_in_sleep)
  3099. battery->polling_short = false;
  3100. break;
  3101. case POWER_SUPPLY_STATUS_DISCHARGING:
  3102. if (battery->polling_in_sleep)
  3103. battery->polling_time = battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_SLEEP];
  3104. else
  3105. battery->polling_time = battery->pdata->polling_time[battery->status];
  3106. if (!battery->wc_enable ||
  3107. (battery->d2d_auth == D2D_AUTH_SRC)) {
  3108. battery->polling_time = battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_CHARGING];
  3109. pr_info("%s: wc_enable is false, or hp d2d, polling time is 30sec\n", __func__);
  3110. }
  3111. battery->polling_short = false;
  3112. break;
  3113. case POWER_SUPPLY_STATUS_FULL:
  3114. if (battery->polling_in_sleep) {
  3115. if (!(battery->pdata->full_condition_type & SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL) &&
  3116. battery->charging_mode == SEC_BATTERY_CHARGING_NONE)
  3117. battery->polling_time = battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_SLEEP];
  3118. battery->polling_short = false;
  3119. } else {
  3120. if (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)
  3121. battery->polling_short = false;
  3122. }
  3123. break;
  3124. case POWER_SUPPLY_STATUS_NOT_CHARGING:
  3125. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE ||
  3126. (battery->health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE)) &&
  3127. (battery->health_check_count > 0)) {
  3128. battery->health_check_count--;
  3129. battery->polling_time = 1;
  3130. battery->polling_short = false;
  3131. }
  3132. break;
  3133. }
  3134. #if defined(CONFIG_WIRELESS_TX_MODE)
  3135. if (battery->wc_tx_enable) {
  3136. battery->polling_time = 10;
  3137. battery->polling_short = false;
  3138. pr_info("%s: Tx mode enable polling time is 10sec\n", __func__);
  3139. }
  3140. #endif
  3141. if (is_pd_apdo_wire_type(battery->cable_type) &&
  3142. (battery->pd_list.now_isApdo || battery->ta_alert_mode != OCP_NONE)) {
  3143. battery->polling_time = 10;
  3144. battery->polling_short = false;
  3145. pr_info("%s: DC mode enable polling time is 10sec\n", __func__);
  3146. }
  3147. if (battery->polling_short)
  3148. return battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_BASIC];
  3149. return battery->polling_time;
  3150. }
  3151. __visible_for_testing bool sec_bat_is_short_polling(struct sec_battery_info *battery)
  3152. {
  3153. /*
  3154. * Change the full and short monitoring sequence
  3155. * Originally, full monitoring was the last time of polling_count
  3156. * But change full monitoring to first time
  3157. * because temperature check is too late
  3158. */
  3159. if (!battery->polling_short || battery->polling_count == 1)
  3160. return false;
  3161. else
  3162. return true;
  3163. }
  3164. EXPORT_SYMBOL_KUNIT(sec_bat_is_short_polling);
  3165. static void sec_bat_update_polling_count(struct sec_battery_info *battery)
  3166. {
  3167. /*
  3168. * do NOT change polling count in sleep
  3169. * even though it is short polling
  3170. * to keep polling count along sleep/wakeup
  3171. */
  3172. if (battery->polling_short && battery->polling_in_sleep)
  3173. return;
  3174. if (battery->polling_short &&
  3175. ((battery->polling_time / battery->pdata->polling_time[SEC_BATTERY_POLLING_TIME_BASIC]) >
  3176. battery->polling_count))
  3177. battery->polling_count++;
  3178. else
  3179. battery->polling_count = 1; /* initial value = 1 */
  3180. }
  3181. __visible_for_testing int sec_bat_set_polling(struct sec_battery_info *battery)
  3182. {
  3183. unsigned int polling_time_temp = 0;
  3184. dev_dbg(battery->dev, "%s: Start\n", __func__);
  3185. polling_time_temp = sec_bat_get_polling_time(battery);
  3186. dev_dbg(battery->dev, "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
  3187. __func__, sb_get_bst_str(battery->status),
  3188. battery->polling_in_sleep ? "Yes" : "No",
  3189. (battery->charging_mode ==
  3190. SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
  3191. battery->polling_short ? "Yes" : "No");
  3192. dev_info(battery->dev, "%s: Polling time %d/%d sec.\n", __func__,
  3193. battery->polling_short ?
  3194. (polling_time_temp * battery->polling_count) :
  3195. polling_time_temp, battery->polling_time);
  3196. /*
  3197. * To sync with log above,
  3198. * change polling count after log is displayed
  3199. * Do NOT update polling count in initial monitor
  3200. */
  3201. if (!battery->pdata->monitor_initial_count)
  3202. sec_bat_update_polling_count(battery);
  3203. else
  3204. dev_dbg(battery->dev,
  3205. "%s: Initial monitor %d times left.\n", __func__,
  3206. battery->pdata->monitor_initial_count);
  3207. switch (battery->pdata->polling_type) {
  3208. case SEC_BATTERY_MONITOR_WORKQUEUE:
  3209. if (battery->pdata->monitor_initial_count) {
  3210. battery->pdata->monitor_initial_count--;
  3211. schedule_delayed_work(&battery->polling_work, HZ);
  3212. } else
  3213. schedule_delayed_work(&battery->polling_work,
  3214. polling_time_temp * HZ);
  3215. break;
  3216. case SEC_BATTERY_MONITOR_ALARM:
  3217. battery->last_poll_time = ktime_get_boottime();
  3218. if (battery->pdata->monitor_initial_count) {
  3219. battery->pdata->monitor_initial_count--;
  3220. sec_bat_program_alarm(battery, 1);
  3221. } else
  3222. sec_bat_program_alarm(battery, polling_time_temp);
  3223. break;
  3224. case SEC_BATTERY_MONITOR_TIMER:
  3225. break;
  3226. default:
  3227. break;
  3228. }
  3229. dev_dbg(battery->dev, "%s: End\n", __func__);
  3230. return polling_time_temp;
  3231. }
  3232. EXPORT_SYMBOL_KUNIT(sec_bat_set_polling);
  3233. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  3234. extern bool get_usb_enumeration_state(void);
  3235. #else
  3236. static bool get_usb_enumeration_state(void)
  3237. {
  3238. return true;
  3239. }
  3240. #endif
  3241. /* To display slow charging when usb charging 100MA*/
  3242. __visible_for_testing void sec_bat_check_slowcharging_work(struct work_struct *work)
  3243. {
  3244. struct sec_battery_info *battery = container_of(work,
  3245. struct sec_battery_info, slowcharging_work.work);
  3246. if (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL_DEFAULT &&
  3247. battery->cable_type == SEC_BATTERY_CABLE_USB) {
  3248. if (!get_usb_enumeration_state() &&
  3249. (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_100MA)) {
  3250. battery->usb_slow_chg = true;
  3251. battery->max_charge_power = mW_by_mVmA(battery->input_voltage, battery->current_max);
  3252. __pm_stay_awake(battery->monitor_ws);
  3253. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3254. }
  3255. }
  3256. pr_info("%s:\n", __func__);
  3257. }
  3258. EXPORT_SYMBOL_KUNIT(sec_bat_check_slowcharging_work);
  3259. static int sec_bat_chk_siop_scenario_idx(struct sec_battery_info *battery,
  3260. int siop_level)
  3261. {
  3262. int scenario_idx = -1;
  3263. int i = 0;
  3264. if (battery->pdata->siop_scenarios_num > 0) {
  3265. for (i = 0; i < battery->pdata->siop_scenarios_num; ++i)
  3266. if (siop_level == battery->pdata->siop_table[i].level) {
  3267. scenario_idx = i;
  3268. pr_info("%s: siop level(%d), scenario_idx(%d)\n",
  3269. __func__, siop_level, scenario_idx);
  3270. break;
  3271. }
  3272. }
  3273. return scenario_idx;
  3274. }
  3275. static bool sec_bat_chk_siop_skip_scenario(struct sec_battery_info *battery,
  3276. int ct, int ws, int scenario_idx)
  3277. {
  3278. struct sec_siop_table *siop_table;
  3279. int type = SIOP_CURR_TYPE_NV;
  3280. if (scenario_idx < 0)
  3281. return false;
  3282. if (is_hv_wireless_type(ct))
  3283. type = SIOP_CURR_TYPE_WPC_HV;
  3284. else if (is_nv_wireless_type(ct))
  3285. type = SIOP_CURR_TYPE_WPC_NV;
  3286. else if (is_hv_wire_type(ct) && is_hv_wire_type(ws))
  3287. type = SIOP_CURR_TYPE_HV;
  3288. else if (is_pd_apdo_wire_type(ct) && battery->pd_list.now_isApdo)
  3289. type = SIOP_CURR_TYPE_APDO;
  3290. else if (is_pd_wire_type(ct))
  3291. type = SIOP_CURR_TYPE_FPDO;
  3292. if (type >= battery->pdata->siop_curr_type_num)
  3293. return false;
  3294. siop_table = &battery->pdata->siop_table[scenario_idx];
  3295. if ((siop_table->icl[type] == SIOP_SKIP) && (siop_table->fcc[type] == SIOP_SKIP)) {
  3296. pr_info("%s: scenario_idx(%d), type(%d), siop_icl(%d), siop_fcc(%d)\n",
  3297. __func__, scenario_idx, type, siop_table->icl[type], siop_table->fcc[type]);
  3298. return true;
  3299. }
  3300. return false;
  3301. }
  3302. static int sec_bat_get_siop_scenario_icl(struct sec_battery_info *battery, int icl, int scenario_idx, int type)
  3303. {
  3304. int siop_icl = icl;
  3305. if (scenario_idx < 0)
  3306. return icl;
  3307. if (type >= SIOP_CURR_TYPE_MAX || type >= battery->pdata->siop_curr_type_num)
  3308. return icl;
  3309. siop_icl = battery->pdata->siop_table[scenario_idx].icl[type];
  3310. if (siop_icl == SIOP_DEFAULT || siop_icl > icl || siop_icl <= 0 ||
  3311. siop_icl == SIOP_SKIP)
  3312. return icl;
  3313. pr_info("%s: scenario_idx(%d), type(%d), siop_icl(%d)\n",
  3314. __func__, scenario_idx, type, siop_icl);
  3315. return siop_icl;
  3316. }
  3317. static int sec_bat_get_siop_scenario_fcc(struct sec_battery_info *battery, int fcc, int scenario_idx, int type)
  3318. {
  3319. int siop_fcc = fcc;
  3320. if (scenario_idx < 0)
  3321. return fcc;
  3322. if (type >= SIOP_CURR_TYPE_MAX || type >= battery->pdata->siop_curr_type_num)
  3323. return fcc;
  3324. siop_fcc = battery->pdata->siop_table[scenario_idx].fcc[type];
  3325. if (siop_fcc == SIOP_DEFAULT || siop_fcc > fcc || siop_fcc <= 0 ||
  3326. siop_fcc == SIOP_SKIP)
  3327. return fcc;
  3328. pr_info("%s: scenario_idx(%d), type(%d), siop_fcc(%d)\n",
  3329. __func__, scenario_idx, type, siop_fcc);
  3330. return siop_fcc;
  3331. }
  3332. static void sec_bat_siop_level_work(struct work_struct *work)
  3333. {
  3334. struct sec_battery_info *battery = container_of(work,
  3335. struct sec_battery_info, siop_level_work.work);
  3336. sec_battery_platform_data_t *pdata = battery->pdata;
  3337. int icl = INT_MAX; /* Input Current Limit */
  3338. int fcc = INT_MAX; /* Fast Charging Current */
  3339. int scenario_idx = -1;
  3340. int skip_vote = 0;
  3341. enum {
  3342. SIOP_STEP1, /* siop level 70 */
  3343. SIOP_STEP2, /* siop level 10 */
  3344. SIOP_STEP3, /* siop level 0 */
  3345. };
  3346. int siop_step = (battery->siop_level == 0) ?
  3347. SIOP_STEP3 : ((battery->siop_level == 10) ? SIOP_STEP2 : SIOP_STEP1);
  3348. pr_info("%s : set current by siop level(%d), siop_step(%d)\n", __func__, battery->siop_level, siop_step + 1);
  3349. scenario_idx = sec_bat_chk_siop_scenario_idx(battery, battery->siop_level);
  3350. if (sec_bat_chk_siop_skip_scenario(battery,
  3351. battery->cable_type, battery->wire_status, scenario_idx) ||
  3352. (battery->siop_level >= 80)) {
  3353. #if defined(CONFIG_SUPPORT_HV_CTRL)
  3354. sec_vote(battery->iv_vote, VOTER_SIOP, false, 0);
  3355. #endif
  3356. sec_vote(battery->fcc_vote, VOTER_SIOP, false, 0);
  3357. sec_vote(battery->input_vote, VOTER_SIOP, false, 0);
  3358. __pm_relax(battery->siop_level_ws);
  3359. return;
  3360. }
  3361. if (is_hv_wireless_type(battery->cable_type)) {
  3362. icl = pdata->siop_hv_wpc_icl;
  3363. fcc = pdata->siop_hv_wpc_fcc[siop_step];
  3364. if (battery->pdata->siop_scenarios_num > 0) {
  3365. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_WPC_HV);
  3366. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_WPC_HV);
  3367. }
  3368. } else if (is_nv_wireless_type(battery->cable_type)) {
  3369. icl = pdata->siop_wpc_icl;
  3370. fcc = pdata->siop_wpc_fcc[siop_step];
  3371. if (battery->pdata->siop_scenarios_num > 0) {
  3372. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_WPC_NV);
  3373. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_WPC_NV);
  3374. }
  3375. } else if (is_hv_wire_12v_type(battery->cable_type) && is_hv_wire_type(battery->wire_status)) {
  3376. icl = pdata->siop_hv_12v_icl;
  3377. fcc = pdata->siop_hv_12v_fcc;
  3378. if (battery->pdata->siop_scenarios_num > 0) {
  3379. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_HV);
  3380. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_HV);
  3381. }
  3382. } else if (is_hv_wire_type(battery->cable_type) && is_hv_wire_type(battery->wire_status)) {
  3383. #if defined(CONFIG_SUPPORT_HV_CTRL) && !defined(CONFIG_SEC_FACTORY)
  3384. if (sec_bat_change_vbus(battery, battery->cable_type, battery->current_event, battery->siop_level)) {
  3385. if (battery->misc_event & BATT_MISC_EVENT_HV_BY_AICL) {
  3386. icl = pdata->siop_hv_icl;
  3387. fcc = pdata->siop_hv_fcc;
  3388. } else {
  3389. icl = pdata->siop_icl;
  3390. fcc = pdata->siop_fcc;
  3391. }
  3392. } else {
  3393. skip_vote = 1;
  3394. }
  3395. #else
  3396. icl = (siop_step == SIOP_STEP3) ? pdata->siop_hv_icl_2nd : pdata->siop_hv_icl;
  3397. fcc = pdata->siop_hv_fcc;
  3398. #endif
  3399. if (battery->pdata->siop_scenarios_num > 0) {
  3400. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_HV);
  3401. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_HV);
  3402. }
  3403. } else if (is_pd_apdo_wire_type(battery->cable_type) && battery->pd_list.now_isApdo) {
  3404. icl = pdata->siop_apdo_icl;
  3405. fcc = pdata->siop_apdo_fcc;
  3406. if (battery->pdata->siop_scenarios_num > 0) {
  3407. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_APDO);
  3408. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_APDO);
  3409. }
  3410. } else if (is_pd_wire_type(battery->cable_type)) {
  3411. #if defined(CONFIG_SUPPORT_HV_CTRL) && !defined(CONFIG_SEC_FACTORY)
  3412. if (sec_bat_change_vbus(battery, battery->cable_type, battery->current_event, battery->siop_level)) {
  3413. if (battery->misc_event & BATT_MISC_EVENT_HV_BY_AICL) {
  3414. icl = mA_by_mWmV(pdata->power_value, SEC_INPUT_VOLTAGE_9V);
  3415. fcc = pdata->siop_hv_fcc;
  3416. } else {
  3417. icl = mA_by_mWmV(pdata->power_value, SEC_INPUT_VOLTAGE_5V);
  3418. fcc = pdata->siop_fcc;
  3419. }
  3420. } else {
  3421. skip_vote = 1;
  3422. }
  3423. #else
  3424. icl = mA_by_mWmV(pdata->power_value, battery->input_voltage);
  3425. fcc = pdata->siop_fcc;
  3426. #endif
  3427. if (battery->pdata->siop_scenarios_num > 0) {
  3428. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_FPDO);
  3429. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_FPDO);
  3430. }
  3431. } else {
  3432. #if defined(CONFIG_SUPPORT_HV_CTRL)
  3433. if (battery->wire_status != SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT)
  3434. sec_vote(battery->iv_vote, VOTER_SIOP, false, 0);
  3435. #endif
  3436. icl = pdata->siop_icl;
  3437. fcc = pdata->siop_fcc;
  3438. if (battery->pdata->siop_scenarios_num > 0) {
  3439. icl = sec_bat_get_siop_scenario_icl(battery, icl, scenario_idx, SIOP_CURR_TYPE_NV);
  3440. fcc = sec_bat_get_siop_scenario_fcc(battery, fcc, scenario_idx, SIOP_CURR_TYPE_NV);
  3441. }
  3442. }
  3443. if (!skip_vote) {
  3444. pr_info("%s: icl(%d), fcc(%d)\n", __func__, icl, fcc);
  3445. sec_vote(battery->input_vote, VOTER_SIOP, true, icl);
  3446. sec_vote(battery->fcc_vote, VOTER_SIOP, true, fcc);
  3447. }
  3448. __pm_relax(battery->siop_level_ws);
  3449. }
  3450. #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
  3451. #define MFC_FW_UPDATE_MIN_CAP 20
  3452. __visible_for_testing void sec_bat_fw_init_work(struct work_struct *work)
  3453. {
  3454. struct sec_battery_info *battery = container_of(work,
  3455. struct sec_battery_info, fw_init_work.work);
  3456. #if defined(CONFIG_WIRELESS_IC_PARAM)
  3457. union power_supply_propval value = {0, };
  3458. psy_do_property(battery->pdata->wireless_charger_name, get,
  3459. POWER_SUPPLY_EXT_PROP_WIRELESS_CHECK_FW_VER, value);
  3460. if (value.intval) {
  3461. pr_info("%s: wireless firmware is already updated.\n", __func__);
  3462. return;
  3463. }
  3464. #endif
  3465. /* auto mfc firmware update when only no otg, mst, wpc, jig */
  3466. if (sec_bat_check_boost_mfc_condition(battery, SEC_WIRELESS_FW_UPDATE_AUTO_MODE) &&
  3467. (battery->capacity >= MFC_FW_UPDATE_MIN_CAP) && !sec_bat_get_lpmode() && !battery->is_jig_on) {
  3468. sec_bat_fw_update(battery, SEC_WIRELESS_FW_UPDATE_AUTO_MODE);
  3469. }
  3470. }
  3471. EXPORT_SYMBOL_KUNIT(sec_bat_fw_init_work);
  3472. #endif
  3473. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  3474. static void sec_bat_update_data_work(struct work_struct *work)
  3475. {
  3476. struct sec_battery_info *battery = container_of(work,
  3477. struct sec_battery_info, batt_data_work.work);
  3478. sec_battery_update_data(battery->data_path);
  3479. __pm_relax(battery->batt_data_ws);
  3480. }
  3481. #endif
  3482. static void sec_bat_misc_event_work(struct work_struct *work)
  3483. {
  3484. struct sec_battery_info *battery = container_of(work,
  3485. struct sec_battery_info, misc_event_work.work);
  3486. int xor_misc_event = battery->prev_misc_event ^ battery->misc_event;
  3487. if (xor_misc_event & BATT_MISC_EVENT_MUIC_ABNORMAL) {
  3488. if (battery->misc_event & BATT_MISC_EVENT_MUIC_ABNORMAL)
  3489. sec_vote(battery->chgen_vote, VOTER_MUIC_ABNORMAL, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  3490. else if (battery->prev_misc_event & BATT_MISC_EVENT_MUIC_ABNORMAL)
  3491. sec_vote(battery->chgen_vote, VOTER_MUIC_ABNORMAL, false, 0);
  3492. }
  3493. pr_info("%s: change misc event(0x%x --> 0x%x)\n",
  3494. __func__, battery->prev_misc_event, battery->misc_event);
  3495. battery->prev_misc_event = battery->misc_event;
  3496. __pm_relax(battery->misc_event_ws);
  3497. __pm_stay_awake(battery->monitor_ws);
  3498. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3499. }
  3500. static void sec_bat_calculate_safety_time(struct sec_battery_info *battery)
  3501. {
  3502. unsigned long long expired_time = battery->expired_time;
  3503. struct timespec64 ts = {0, };
  3504. int curr = 0;
  3505. int input_power = 0;
  3506. int charging_power = mW_by_mVmA(battery->charging_current,
  3507. (battery->pdata->chg_float_voltage / battery->pdata->chg_float_voltage_conv));
  3508. static int discharging_cnt = 0;
  3509. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3510. int direct_chg_done = 0;
  3511. union power_supply_propval value = {0,};
  3512. #endif
  3513. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3514. psy_do_property(battery->pdata->charger_name, get,
  3515. POWER_SUPPLY_EXT_PROP_DIRECT_DONE, value);
  3516. direct_chg_done = value.intval;
  3517. if (is_pd_apdo_wire_type(battery->cable_type) &&
  3518. !battery->chg_limit && !battery->lrp_limit &&
  3519. (battery->pd_list.now_isApdo || direct_chg_done))
  3520. input_power = battery->pd_max_charge_power;
  3521. else
  3522. input_power = mW_by_mVmA(battery->input_voltage, battery->current_max);
  3523. #else
  3524. input_power = mW_by_mVmA(battery->input_voltage, battery->current_max);
  3525. #endif
  3526. if (battery->current_avg < 0) {
  3527. discharging_cnt++;
  3528. } else {
  3529. discharging_cnt = 0;
  3530. }
  3531. if (discharging_cnt >= 5) {
  3532. battery->expired_time = battery->pdata->expired_time;
  3533. battery->prev_safety_time = 0;
  3534. pr_info("%s : SAFETY TIME RESET! DISCHARGING CNT(%d)\n",
  3535. __func__, discharging_cnt);
  3536. discharging_cnt = 0;
  3537. return;
  3538. } else if ((battery->lcd_status || battery->wc_tx_enable) && battery->stop_timer) {
  3539. battery->prev_safety_time = 0;
  3540. return;
  3541. }
  3542. ts = ktime_to_timespec64(ktime_get_boottime());
  3543. if (battery->prev_safety_time == 0) {
  3544. battery->prev_safety_time = ts.tv_sec;
  3545. }
  3546. if (input_power > charging_power) {
  3547. curr = battery->charging_current;
  3548. } else {
  3549. curr = mA_by_mWmV(input_power, (battery->pdata->chg_float_voltage / battery->pdata->chg_float_voltage_conv));
  3550. curr = (curr * 9) / 10;
  3551. }
  3552. if ((battery->lcd_status || battery->wc_tx_enable) && !battery->stop_timer) {
  3553. battery->stop_timer = true;
  3554. } else if (!(battery->lcd_status || battery->wc_tx_enable) && battery->stop_timer) {
  3555. battery->stop_timer = false;
  3556. }
  3557. pr_info("%s : EXPIRED_TIME(%llu), IP(%d), CP(%d), CURR(%d), STANDARD(%d)\n",
  3558. __func__, expired_time, input_power, charging_power, curr, battery->pdata->standard_curr);
  3559. if (curr == 0)
  3560. return;
  3561. else if (curr > battery->pdata->standard_curr)
  3562. curr = battery->pdata->standard_curr;
  3563. expired_time = (expired_time * battery->pdata->standard_curr) / curr;
  3564. pr_info("%s : CAL_EXPIRED_TIME(%llu) TIME NOW(%llu) TIME PREV(%ld)\n", __func__, expired_time, ts.tv_sec, battery->prev_safety_time);
  3565. if (expired_time <= ((ts.tv_sec - battery->prev_safety_time) * 1000))
  3566. expired_time = 0;
  3567. else
  3568. expired_time -= ((ts.tv_sec - battery->prev_safety_time) * 1000);
  3569. battery->cal_safety_time = expired_time;
  3570. expired_time = (expired_time * curr) / battery->pdata->standard_curr;
  3571. battery->expired_time = expired_time;
  3572. battery->prev_safety_time = ts.tv_sec;
  3573. pr_info("%s : REMAIN_TIME(%ld) CAL_REMAIN_TIME(%ld)\n", __func__, battery->expired_time, battery->cal_safety_time);
  3574. }
  3575. static bool sb_check_skip_monitor(struct sec_battery_info *battery)
  3576. {
  3577. static struct timespec64 old_ts = {0, };
  3578. struct timespec64 c_ts = {0, };
  3579. union power_supply_propval val = {0, };
  3580. c_ts = ktime_to_timespec64(ktime_get_boottime());
  3581. /* monitor once after wakeup */
  3582. if (battery->polling_in_sleep) {
  3583. battery->polling_in_sleep = false;
  3584. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING &&
  3585. !battery->wc_tx_enable &&
  3586. (battery->d2d_auth != D2D_AUTH_SRC) &&
  3587. ((unsigned long)(c_ts.tv_sec - old_ts.tv_sec) < 10 * 60)
  3588. ) {
  3589. val.intval = SEC_BATTERY_VOLTAGE_MV;
  3590. psy_do_property(battery->pdata->fuelgauge_name, get, POWER_SUPPLY_PROP_VOLTAGE_NOW, val);
  3591. battery->voltage_now = val.intval;
  3592. val.intval = 0;
  3593. psy_do_property(battery->pdata->fuelgauge_name, get, POWER_SUPPLY_PROP_CAPACITY, val);
  3594. battery->capacity = val.intval;
  3595. sec_bat_get_temperature_info(battery);
  3596. sec_bat_cisd_check(battery);
  3597. power_supply_changed(battery->psy_bat);
  3598. pr_info("Skip monitor work(%llu, Vnow:%d(mV), SoC:%d(%%), Tbat:%d(0.1'C))\n",
  3599. c_ts.tv_sec - old_ts.tv_sec, battery->voltage_now,
  3600. battery->capacity, battery->temperature);
  3601. return true;
  3602. }
  3603. }
  3604. /* update last monitor time */
  3605. old_ts = c_ts;
  3606. return false;
  3607. }
  3608. static void sec_bat_check_store_mode(struct sec_battery_info *battery)
  3609. {
  3610. if (sec_bat_get_facmode())
  3611. return;
  3612. #if defined(CONFIG_SEC_FACTORY)
  3613. if (!is_nocharge_type(battery->cable_type)) {
  3614. #else
  3615. if (!is_nocharge_type(battery->cable_type) && battery->store_mode) {
  3616. #endif
  3617. pr_info("%s: capacity(%d), status(%d), store_mode(%d)\n",
  3618. __func__, battery->capacity, battery->status, battery->store_mode);
  3619. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  3620. pr_info("%s: @battery->batt_f_mode: %s\n", __func__,
  3621. BOOT_MODE_STRING[battery->batt_f_mode]);
  3622. #endif
  3623. /*
  3624. * VOTER_STORE_MODE
  3625. * Set limited max power when store mode is set and LDU
  3626. * Limited max power should be set with over 5% capacity
  3627. * since target could be turned off during boot up
  3628. * display test requirement : do not decrease fcc in store mode condition
  3629. */
  3630. if (!battery->display_test && battery->store_mode && battery->capacity >= 5) {
  3631. sec_vote(battery->input_vote, VOTER_STORE_MODE, true,
  3632. mA_by_mWmV(battery->pdata->store_mode_max_input_power, battery->input_voltage));
  3633. }
  3634. if (battery->capacity >= battery->pdata->store_mode_charging_max) {
  3635. int chg_mode = SEC_BAT_CHG_MODE_CHARGING_OFF;
  3636. /* to discharge the battery, off buck */
  3637. if (battery->capacity > battery->pdata->store_mode_charging_max
  3638. || battery->pdata->store_mode_buckoff)
  3639. chg_mode = SEC_BAT_CHG_MODE_BUCK_OFF;
  3640. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  3641. if ((sec_bat_get_facmode() || battery->batt_f_mode != NO_MODE) &&
  3642. chg_mode == SEC_BAT_CHG_MODE_BUCK_OFF)
  3643. #else
  3644. if (sec_bat_get_facmode() &&
  3645. chg_mode == SEC_BAT_CHG_MODE_BUCK_OFF)
  3646. #endif
  3647. chg_mode = SEC_BAT_CHG_MODE_CHARGING_OFF;
  3648. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  3649. sec_vote(battery->chgen_vote, VOTER_STORE_MODE, true, chg_mode);
  3650. }
  3651. if (battery->capacity <= battery->pdata->store_mode_charging_min &&
  3652. battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  3653. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_CHARGING);
  3654. sec_vote(battery->chgen_vote, VOTER_STORE_MODE, false, 0);
  3655. }
  3656. }
  3657. }
  3658. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3659. static void sec_bat_check_boottime(void *data,
  3660. bool dctp_en)
  3661. {
  3662. struct sec_battery_info *battery = data;
  3663. if (!dctp_en)
  3664. return;
  3665. if (battery->capacity > 10) {
  3666. pr_info("%s: %d\n", __func__, battery->pdata->dctp_bootmode_en);
  3667. battery->pdata->dctp_bootmode_en = false;
  3668. }
  3669. }
  3670. static void sec_bat_d2d_check(struct sec_battery_info *battery,
  3671. unsigned int capacity, int batt_t, int lrp_t)
  3672. {
  3673. union power_supply_propval value = {0, };
  3674. int auth = AUTH_LOW_PWR;
  3675. if ((battery->pdata->d2d_check_type == SB_D2D_NONE) ||
  3676. (battery->d2d_auth != D2D_AUTH_SRC) ||
  3677. battery->vpdo_ocp) {
  3678. return;
  3679. }
  3680. if (battery->pdata->d2d_check_type == SB_D2D_SRCSNK) {
  3681. psy_do_property(battery->pdata->charger_name, get,
  3682. POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VOLTAGE, value);
  3683. battery->vpdo_src_boost = value.intval ? true : false;
  3684. }
  3685. if (battery->vpdo_src_boost) {
  3686. value.intval = SEC_BATTERY_VIN_MA;
  3687. psy_do_property(battery->pdata->charger_name, get,
  3688. POWER_SUPPLY_EXT_PROP_D2D_REVERSE_OCP, value);
  3689. battery->vpdo_ocp = value.intval ? true : false;
  3690. pr_info("%s : reverse ocp(%d)\n", __func__, value.intval);
  3691. if (battery->vpdo_ocp)
  3692. battery->hp_d2d = HP_D2D_OCP;
  3693. }
  3694. if ((batt_t >= 500) || (batt_t <= 0)) {
  3695. battery->hp_d2d = HP_D2D_BATT_TMP;
  3696. } else if (lrp_t > 370) {
  3697. battery->hp_d2d = HP_D2D_LRP_TMP;
  3698. } else if (battery->vpdo_ocp) {
  3699. battery->hp_d2d = HP_D2D_OCP;
  3700. } else if (capacity < 30) {
  3701. battery->hp_d2d = HP_D2D_SOC;
  3702. } else {
  3703. if (battery->hp_d2d == HP_D2D_BATT_TMP) {
  3704. if ((batt_t <= 480) && (batt_t >= 20)) {
  3705. auth = AUTH_HIGH_PWR;
  3706. battery->hp_d2d = HP_D2D_ON;
  3707. } else
  3708. battery->vpdo_auth_stat = auth;
  3709. } else {
  3710. if (battery->lcd_status) {
  3711. battery->hp_d2d = HP_D2D_LCD;
  3712. } else {
  3713. auth = AUTH_HIGH_PWR;
  3714. battery->hp_d2d = HP_D2D_ON;
  3715. }
  3716. }
  3717. }
  3718. pr_info("%s : auth %s, hp d2d (%d)\n", __func__,
  3719. (auth == AUTH_LOW_PWR) ? "LOW PWR" : "HIGH PWR", battery->hp_d2d);
  3720. if (battery->vpdo_auth_stat != auth) {
  3721. sec_pd_vpdo_auth(auth, battery->pdata->d2d_check_type);
  3722. pr_info("%s : vpdo auth changed\n", __func__);
  3723. battery->vpdo_auth_stat = auth;
  3724. }
  3725. }
  3726. static void sec_bat_check_direct_charger(struct sec_battery_info *battery)
  3727. {
  3728. union power_supply_propval val = {0, };
  3729. int ret = 0;
  3730. if (battery->status != POWER_SUPPLY_STATUS_CHARGING ||
  3731. battery->health != POWER_SUPPLY_HEALTH_GOOD) {
  3732. battery->dc_check_cnt = 0;
  3733. return;
  3734. }
  3735. psy_do_property(battery->pdata->charger_name, get,
  3736. POWER_SUPPLY_EXT_PROP_CHARGER_MODE_DIRECT, val);
  3737. if (val.intval != SEC_BAT_CHG_MODE_CHARGING) {
  3738. battery->dc_check_cnt = 0;
  3739. return;
  3740. }
  3741. val.strval = "GETCHARGING";
  3742. ret = psy_do_property(battery->pdata->charger_name, get,
  3743. POWER_SUPPLY_EXT_PROP_DIRECT_CHARGER_CHG_STATUS, val);
  3744. if (ret < 0)
  3745. return;
  3746. if (strncmp(val.strval, "NO_CHARGING", 12) == 0) {
  3747. pr_info("%s: cnt(%d)\n", __func__, battery->dc_check_cnt);
  3748. if (++battery->dc_check_cnt < 3)
  3749. return;
  3750. sec_bat_set_current_event(battery,
  3751. SEC_BAT_CURRENT_EVENT_DC_ERR, SEC_BAT_CURRENT_EVENT_DC_ERR);
  3752. sec_vote(battery->chgen_vote, VOTER_DC_ERR, true,
  3753. SEC_BAT_CHG_MODE_CHARGING_OFF);
  3754. msleep(100);
  3755. sec_bat_set_current_event(battery,
  3756. 0, SEC_BAT_CURRENT_EVENT_DC_ERR);
  3757. sec_vote(battery->chgen_vote, VOTER_DC_ERR, false, 0);
  3758. #if IS_ENABLED(CONFIG_SEC_ABC)
  3759. sec_abc_send_event("MODULE=battery@WARN=dc_error");
  3760. #endif
  3761. }
  3762. battery->dc_check_cnt = 0;
  3763. }
  3764. #endif
  3765. static void sb_monitor_preliminary_checks(struct sec_battery_info *battery)
  3766. {
  3767. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  3768. if (battery->set_lower_curr) {
  3769. pr_info("%s: set lower limiter current\n", __func__);
  3770. battery->set_lower_curr = false;
  3771. sec_bat_set_limiter_current(battery);
  3772. }
  3773. #endif
  3774. sec_bat_get_battery_info(battery);
  3775. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3776. sec_bat_d2d_check(battery, battery->capacity, battery->temperature, battery->lrp);
  3777. #endif
  3778. sec_bat_cisd_check(battery);
  3779. #if defined(CONFIG_STEP_CHARGING)
  3780. sec_bat_check_step_charging(battery);
  3781. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  3782. sec_bat_check_wpc_step_charging(battery);
  3783. #endif
  3784. #endif
  3785. /* time to full check */
  3786. sec_bat_calc_time_to_full(battery);
  3787. sec_bat_check_full_capacity(battery);
  3788. #if defined(CONFIG_WIRELESS_TX_MODE)
  3789. /* tx mode check */
  3790. sec_bat_check_tx_mode(battery);
  3791. #endif
  3792. }
  3793. static bool sb_monitor_critical_checks(struct sec_battery_info *battery)
  3794. {
  3795. bool checks_pass =
  3796. !sec_bat_do_test_function(battery) && /* 0. test mode */
  3797. sec_bat_battery_cable_check(battery) && /* 1. battery check */
  3798. sec_bat_voltage_check(battery); /* 2. voltage check */
  3799. return checks_pass;
  3800. }
  3801. static void sb_monitor_nonurgent_checks(struct sec_battery_info *battery)
  3802. {
  3803. /* 4. bat thm check */
  3804. sec_bat_thermal_check(battery);
  3805. /* 5. full charging check */
  3806. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING))
  3807. sec_bat_fullcharged_check(battery);
  3808. /* 5-1. eu eco check */
  3809. if (check_eu_eco_full_status(battery))
  3810. sec_bat_do_fullcharged(battery, true);
  3811. /* 6. additional check */
  3812. if (battery->pdata->monitor_additional_check)
  3813. battery->pdata->monitor_additional_check();
  3814. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  3815. if (is_wireless_type(battery->cable_type) && !battery->wc_cv_mode && battery->charging_passed_time > 10)
  3816. sec_bat_wc_cv_mode_check(battery);
  3817. #endif
  3818. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3819. sec_bat_check_boottime(battery, battery->pdata->dctp_bootmode_en);
  3820. #if defined(CONFIG_STEP_CHARGING)
  3821. if (is_pd_apdo_wire_type(battery->cable_type))
  3822. sec_bat_check_dc_step_charging(battery);
  3823. #endif
  3824. #endif
  3825. #if IS_ENABLED(CONFIG_DUAL_BATTERY) && IS_ENABLED(CONFIG_LIMITER_S2ASL01) && !defined(CONFIG_SEC_FACTORY)
  3826. sec_bat_limiter_check(battery);
  3827. #endif
  3828. }
  3829. static bool sb_monitor_checks(struct sec_battery_info *battery)
  3830. {
  3831. bool update_battery_info = true;
  3832. sb_monitor_preliminary_checks(battery); /* Preliminary Checks */
  3833. if (sb_monitor_critical_checks(battery)) { /* Do Critical Checks*/
  3834. /* CheckShort Polling & Monitor Count */
  3835. if (battery->pdata->monitor_initial_count || sec_bat_is_short_polling(battery))
  3836. update_battery_info = false; // Don't Update Battery Info
  3837. else if (sec_bat_time_management(battery)) /* 3. time management */
  3838. sb_monitor_nonurgent_checks(battery);
  3839. }
  3840. return update_battery_info;
  3841. }
  3842. static void sb_monitor_update(struct sec_battery_info *battery, bool update_battery_info)
  3843. {
  3844. union power_supply_propval val = {0, };
  3845. // Update Battery Info
  3846. if (update_battery_info) {
  3847. /* clear HEATING_CONTROL*/
  3848. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL);
  3849. /* calculate safety time */
  3850. if (battery->charger_mode == SEC_BAT_CHG_MODE_CHARGING)
  3851. sec_bat_calculate_safety_time(battery);
  3852. /* set charging current */
  3853. sec_bat_set_charging_current(battery);
  3854. if (sec_bat_recheck_input_work(battery))
  3855. sec_bat_run_input_check_work(battery, 0);
  3856. }
  3857. // Update Charger
  3858. psy_do_property(battery->pdata->charger_name, get, POWER_SUPPLY_EXT_PROP_MONITOR_WORK, val);
  3859. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  3860. if (is_pd_apdo_wire_type(battery->cable_type) && (val.intval == LOW_VBAT_SET))
  3861. sec_vote_refresh(battery->fcc_vote);
  3862. if (is_pd_apdo_wire_type(battery->cable_type))
  3863. sec_bat_check_direct_charger(battery);
  3864. #endif
  3865. // Update Fuelgauge
  3866. psy_do_property(battery->pdata->fuelgauge_name, get, POWER_SUPPLY_EXT_PROP_MONITOR_WORK, val);
  3867. if (battery->pdata->wireless_charger_name)
  3868. psy_do_property(battery->pdata->wireless_charger_name, get, POWER_SUPPLY_EXT_PROP_MONITOR_WORK, val);
  3869. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  3870. psy_do_property(battery->pdata->dual_battery_name, get, POWER_SUPPLY_EXT_PROP_MONITOR_WORK, val);
  3871. #endif
  3872. }
  3873. static void sb_monitor_internal(struct sec_battery_info *battery)
  3874. {
  3875. bool update_battery_info = true;
  3876. bool bypass_checks = false;
  3877. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  3878. sec_bat_check_wc_available(battery);
  3879. if (is_wireless_type(battery->cable_type) && !battery->wc_auth_retried && !sec_bat_get_lpmode())
  3880. sec_bat_check_wc_re_auth(battery);
  3881. #endif
  3882. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  3883. if ((battery->cable_type != SEC_BATTERY_CABLE_NONE) && (battery->batt_f_mode == OB_MODE)) {
  3884. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  3885. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  3886. battery->cable_type = SEC_BATTERY_CABLE_NONE;
  3887. bypass_checks = true; // Skip Checks
  3888. }
  3889. #endif
  3890. if (!bypass_checks)
  3891. update_battery_info = sb_monitor_checks(battery);
  3892. sb_monitor_update(battery, update_battery_info);
  3893. }
  3894. static void sb_monitor_print(struct sec_battery_info *battery, const char *funcname)
  3895. {
  3896. char str[512] = {0, };
  3897. sprintf(str, "%s: Status(%s), mode(%s), Health(%s), Cable(%s, %s, %d, %d), rp(%d), HV(%s), flash(%d), mst(%d)",
  3898. funcname,
  3899. sb_get_bst_str(battery->status),
  3900. sb_get_cm_str(battery->charging_mode),
  3901. sb_get_hl_str(battery->health),
  3902. sb_get_ct_str(battery->cable_type),
  3903. sb_get_ct_str(battery->wire_status),
  3904. battery->muic_cable_type,
  3905. battery->pd_usb_attached,
  3906. battery->sink_status.rp_currentlvl,
  3907. battery->hv_chg_name,
  3908. battery->flash_state,
  3909. battery->mst_en
  3910. );
  3911. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  3912. sprintf(str + strlen(str), ", phm(%d)",
  3913. battery->wc_rx_pdetb_mode
  3914. );
  3915. #endif
  3916. sprintf(str + strlen(str), ", lcd(%d), slate(%d), store(%d), siop_level(%d), sleep_mode(%d)",
  3917. battery->lcd_status,
  3918. is_slate_mode(battery),
  3919. battery->store_mode,
  3920. battery->siop_level,
  3921. battery->sleep_mode
  3922. );
  3923. #if defined(CONFIG_BATTERY_AGE_FORECAST_DETACHABLE)
  3924. sprintf(str + strlen(str), ", Cycle(%dw)",
  3925. battery->batt_cycle
  3926. );
  3927. #else
  3928. sprintf(str + strlen(str), ", Cycle(%d, %d)",
  3929. battery->batt_cycle, battery->batt_full_status_usage
  3930. );
  3931. #endif
  3932. #if defined(CONFIG_ENG_BATTERY_CONCEPT)
  3933. sprintf(str + strlen(str), ", battery->stability_test(%d), battery->eng_not_full_status(%d)",
  3934. battery->stability_test,
  3935. battery->eng_not_full_status);
  3936. #endif
  3937. sprintf(str + strlen(str), "\n");
  3938. pr_info("%s", str);
  3939. #if defined(CONFIG_WIRELESS_TX_MODE)
  3940. if (battery->wc_tx_enable) {
  3941. pr_info("@Tx_Mode %s: Rx(%s), WC_TX_VOUT(%dmV), UNO_IOUT(%d), MFC_IOUT(%d) AFC_DISABLE(%d)\n",
  3942. funcname, sb_rx_type_str(battery->wc_rx_type), battery->wc_tx_vout,
  3943. battery->tx_uno_iout, battery->tx_mfc_iout, battery->afc_disable);
  3944. }
  3945. #endif
  3946. }
  3947. static void sec_bat_monitor_work(struct work_struct *work)
  3948. {
  3949. struct sec_battery_info *battery = container_of(work, struct sec_battery_info, monitor_work.work);
  3950. dev_dbg(battery->dev, "%s: Start\n", __func__);
  3951. if (!sb_check_skip_monitor(battery)) {
  3952. sb_monitor_internal(battery); // Internal Function Which Performs the Checks
  3953. sb_monitor_print(battery, __func__); // Print Monitor
  3954. /* store mode & fac bin */
  3955. sec_bat_check_store_mode(battery);
  3956. power_supply_changed(battery->psy_bat);
  3957. }
  3958. sec_bat_set_polling(battery);
  3959. #if defined(CONFIG_WIRELESS_TX_MODE)
  3960. if (battery->tx_switch_mode_change)
  3961. sec_bat_run_wpc_tx_work(battery, 0);
  3962. #endif
  3963. if (battery->capacity <= 0 || battery->health_change)
  3964. __pm_wakeup_event(battery->monitor_ws, jiffies_to_msecs(HZ * 5));
  3965. else
  3966. __pm_relax(battery->monitor_ws);
  3967. dev_dbg(battery->dev, "%s: End\n", __func__);
  3968. }
  3969. static enum alarmtimer_restart sec_bat_alarm(struct alarm *alarm, ktime_t now)
  3970. {
  3971. struct sec_battery_info *battery = container_of(alarm,
  3972. struct sec_battery_info, polling_alarm);
  3973. dev_dbg(battery->dev, "%s\n", __func__);
  3974. /*
  3975. * In wake up, monitor work will be queued in complete function
  3976. * To avoid duplicated queuing of monitor work,
  3977. * do NOT queue monitor work in wake up by polling alarm
  3978. */
  3979. if (!battery->polling_in_sleep) {
  3980. __pm_stay_awake(battery->monitor_ws);
  3981. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3982. dev_dbg(battery->dev, "%s: Activated\n", __func__);
  3983. }
  3984. return ALARMTIMER_NORESTART;
  3985. }
  3986. __visible_for_testing void sec_bat_check_input_voltage(struct sec_battery_info *battery, int cable_type)
  3987. {
  3988. unsigned int voltage = 0;
  3989. int input_current = battery->pdata->charging_current[cable_type].input_current_limit;
  3990. #if !defined(CONFIG_NO_BATTERY)
  3991. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING)
  3992. return;
  3993. #endif
  3994. if (is_pd_wire_type(cable_type)) {
  3995. battery->max_charge_power = battery->pd_max_charge_power;
  3996. return;
  3997. } else if (is_hv_wire_12v_type(cable_type))
  3998. voltage = SEC_INPUT_VOLTAGE_12V;
  3999. else if (is_hv_wire_9v_type(cable_type))
  4000. voltage = SEC_INPUT_VOLTAGE_9V;
  4001. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  4002. else if (cable_type == SEC_BATTERY_CABLE_PREPARE_WIRELESS_20 || is_pwr_nego_wireless_type(cable_type))
  4003. voltage = battery->wc20_vout;
  4004. else if (is_hv_wireless_type(cable_type) || cable_type == SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV)
  4005. voltage = SEC_INPUT_VOLTAGE_10V;
  4006. else if (is_nv_wireless_type(cable_type))
  4007. voltage = SEC_INPUT_VOLTAGE_5_5V;
  4008. #endif
  4009. else
  4010. voltage = SEC_INPUT_VOLTAGE_5V;
  4011. battery->input_voltage = voltage;
  4012. battery->charge_power = mW_by_mVmA(voltage, input_current);
  4013. #if !defined(CONFIG_SEC_FACTORY)
  4014. if (battery->charge_power > battery->max_charge_power)
  4015. #endif
  4016. battery->max_charge_power = battery->charge_power;
  4017. pr_info("%s: input_voltage:%dmV, charge_power:%dmW, max_charge_power:%dmW)\n", __func__,
  4018. battery->input_voltage, battery->charge_power, battery->max_charge_power);
  4019. }
  4020. EXPORT_SYMBOL_KUNIT(sec_bat_check_input_voltage);
  4021. static void sec_bat_set_usb_configure(struct sec_battery_info *battery, int usb_status)
  4022. {
  4023. int cable_work_delay = 0;
  4024. pr_info("%s: usb configured %d -> %d\n", __func__, battery->prev_usb_conf, usb_status);
  4025. if (usb_status == USB_CURRENT_UNCONFIGURED) {
  4026. sec_bat_set_current_event(battery,
  4027. SEC_BAT_CURRENT_EVENT_USB_100MA, SEC_BAT_CURRENT_EVENT_USB_STATE);
  4028. if (battery->cable_type == SEC_BATTERY_CABLE_USB && !sec_bat_get_lpmode()) {
  4029. sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100);
  4030. sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100);
  4031. }
  4032. } else if (usb_status == USB_CURRENT_HIGH_SPEED || usb_status == USB_CURRENT_SUPER_SPEED) {
  4033. battery->usb_slow_chg = false;
  4034. sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0);
  4035. sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0);
  4036. if (usb_status == USB_CURRENT_HIGH_SPEED) {
  4037. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_USB_STATE);
  4038. if (battery->cable_type == SEC_BATTERY_CABLE_USB) {
  4039. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  4040. battery->pdata->default_usb_charging_current);
  4041. sec_vote(battery->input_vote, VOTER_CABLE, true,
  4042. battery->pdata->default_usb_input_current);
  4043. }
  4044. } else {
  4045. sec_bat_set_current_event(battery,
  4046. SEC_BAT_CURRENT_EVENT_USB_SUPER, SEC_BAT_CURRENT_EVENT_USB_STATE);
  4047. if (battery->cable_type == SEC_BATTERY_CABLE_USB) {
  4048. sec_vote(battery->fcc_vote, VOTER_CABLE, true, USB_CURRENT_SUPER_SPEED);
  4049. sec_vote(battery->input_vote, VOTER_CABLE, true, USB_CURRENT_SUPER_SPEED);
  4050. }
  4051. }
  4052. if (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL3) {
  4053. if (battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE) {
  4054. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  4055. battery->pdata->default_charging_current);
  4056. sec_vote(battery->input_vote, VOTER_CABLE, true,
  4057. battery->pdata->default_input_current);
  4058. } else {
  4059. if (battery->store_mode) {
  4060. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  4061. battery->pdata->max_charging_current);
  4062. sec_vote(battery->input_vote, VOTER_CABLE, true,
  4063. battery->pdata->rp_current_rdu_rp3);
  4064. } else {
  4065. if (!(is_pd_wire_type(battery->wire_status) ||
  4066. is_pd_wire_type(battery->cable_type))) {
  4067. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  4068. battery->pdata->max_charging_current);
  4069. sec_vote(battery->input_vote, VOTER_CABLE, true,
  4070. battery->pdata->rp_current_rp3);
  4071. }
  4072. }
  4073. }
  4074. } else if (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL2) {
  4075. if (!(is_pd_wire_type(battery->wire_status) ||
  4076. is_pd_wire_type(battery->cable_type))) {
  4077. sec_vote(battery->fcc_vote, VOTER_CABLE, true, battery->pdata->rp_current_rp2);
  4078. sec_vote(battery->input_vote, VOTER_CABLE, true, battery->pdata->rp_current_rp2);
  4079. }
  4080. }
  4081. } else if (usb_status == USB_CURRENT_SUSPENDED) {
  4082. battery->usb_slow_chg = false;
  4083. sec_bat_set_current_event(battery,
  4084. SEC_BAT_CURRENT_EVENT_USB_SUSPENDED, SEC_BAT_CURRENT_EVENT_USB_STATE);
  4085. sec_vote(battery->chgen_vote, VOTER_SUSPEND, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  4086. if (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL_DEFAULT) {
  4087. sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100);
  4088. sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100);
  4089. }
  4090. cable_work_delay = 500;
  4091. store_battery_log(
  4092. "USB suspend:%d%%,%dmV,%s,ct(%d,%d,%d),cev(0x%x),mev(0x%x)",
  4093. battery->capacity,
  4094. battery->voltage_now,
  4095. sb_get_bst_str(battery->status),
  4096. battery->cable_type,
  4097. battery->wire_status,
  4098. battery->muic_cable_type,
  4099. battery->current_event,
  4100. battery->misc_event
  4101. );
  4102. } else if (usb_status == USB_CURRENT_CLEAR) {
  4103. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_USB_STATE);
  4104. sec_vote(battery->chgen_vote, VOTER_SUSPEND, false, 0);
  4105. sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0);
  4106. sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0);
  4107. }
  4108. if (usb_status != USB_CURRENT_SUSPENDED)
  4109. sec_vote(battery->chgen_vote, VOTER_SUSPEND, false, 0);
  4110. battery->prev_usb_conf = usb_status;
  4111. cancel_delayed_work(&battery->cable_work);
  4112. __pm_stay_awake(battery->cable_ws);
  4113. queue_delayed_work(battery->monitor_wqueue, &battery->cable_work,
  4114. msecs_to_jiffies(cable_work_delay));
  4115. }
  4116. #define REDUCE_STEP 500
  4117. #define MIN_FCC_VALUE 3500
  4118. static void sec_bat_set_abnormal_ta_fcc(struct sec_battery_info *battery, bool enable)
  4119. {
  4120. union power_supply_propval value = {0, };
  4121. int fcc;
  4122. if (!enable) {
  4123. battery->abnormal_ta = false;
  4124. pr_info("%s: enable(%d)", __func__, enable);
  4125. sec_vote(battery->fcc_vote, VOTER_ABNORMAL_TA, false, 0);
  4126. return;
  4127. }
  4128. fcc = get_sec_vote_result(battery->fcc_vote) - REDUCE_STEP;
  4129. if (fcc > MIN_FCC_VALUE) {
  4130. pr_info("%s: reduce chg current(%d)", __func__, fcc);
  4131. sec_vote(battery->fcc_vote, VOTER_ABNORMAL_TA, true, fcc);
  4132. } else {
  4133. battery->abnormal_ta = true;
  4134. pr_info("%s: update charging source(%d)", __func__, enable);
  4135. sec_vote(battery->fcc_vote, VOTER_ABNORMAL_TA, true, MIN_FCC_VALUE);
  4136. if (is_pd_apdo_wire_type(battery->cable_type))
  4137. psy_do_property(battery->pdata->charger_name, set,
  4138. POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
  4139. }
  4140. }
  4141. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  4142. __visible_for_testing void sec_bat_ext_event_work(struct work_struct *work)
  4143. {
  4144. struct sec_battery_info *battery = container_of(work,
  4145. struct sec_battery_info, ext_event_work.work);
  4146. sec_bat_ext_event_work_content(battery);
  4147. }
  4148. EXPORT_SYMBOL_KUNIT(sec_bat_ext_event_work);
  4149. static void sec_bat_wpc_tx_work(struct work_struct *work)
  4150. {
  4151. struct sec_battery_info *battery = container_of(work,
  4152. struct sec_battery_info, wpc_tx_work.work);
  4153. sec_bat_wpc_tx_work_content(battery);
  4154. }
  4155. __visible_for_testing void sec_bat_wpc_tx_en_work(struct work_struct *work)
  4156. {
  4157. struct sec_battery_info *battery = container_of(work,
  4158. struct sec_battery_info, wpc_tx_en_work.work);
  4159. sec_bat_wpc_tx_en_work_content(battery);
  4160. }
  4161. EXPORT_SYMBOL_KUNIT(sec_bat_wpc_tx_en_work);
  4162. __visible_for_testing void sec_bat_txpower_calc_work(struct work_struct *work)
  4163. {
  4164. struct sec_battery_info *battery = container_of(work,
  4165. struct sec_battery_info, wpc_txpower_calc_work.work);
  4166. sec_bat_txpower_calc(battery);
  4167. }
  4168. EXPORT_SYMBOL_KUNIT(sec_bat_txpower_calc_work);
  4169. static void sec_bat_wc20_current_work(struct work_struct *work)
  4170. {
  4171. struct sec_battery_info *battery = container_of(work,
  4172. struct sec_battery_info, wc20_current_work.work);
  4173. sec_bat_set_wc20_current(battery);
  4174. __pm_relax(battery->wc20_current_ws);
  4175. }
  4176. static void sec_bat_wc_ept_timeout_work(struct work_struct *work)
  4177. {
  4178. struct sec_battery_info *battery = container_of(work,
  4179. struct sec_battery_info, wc_ept_timeout_work.work);
  4180. battery->wc_ept_timeout = false;
  4181. __pm_relax(battery->wc_ept_timeout_ws);
  4182. }
  4183. #endif
  4184. static void cw_check_pd_wire_type(struct sec_battery_info *battery)
  4185. {
  4186. if (is_pd_wire_type(battery->wire_status)) {
  4187. int pdo_num = battery->sink_status.current_pdo_num;
  4188. sec_bat_get_input_current_in_power_list(battery);
  4189. sec_bat_get_charging_current_in_power_list(battery);
  4190. #if defined(CONFIG_STEP_CHARGING)
  4191. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  4192. if (!is_pd_apdo_wire_type(battery->cable_type)) {
  4193. sec_bat_reset_step_charging(battery);
  4194. } else if (is_pd_apdo_wire_type(battery->cable_type) && (battery->ta_alert_mode != OCP_NONE)) {
  4195. battery->ta_alert_mode = OCP_WA_ACTIVE;
  4196. sec_bat_reset_step_charging(battery);
  4197. }
  4198. #else
  4199. sec_bat_reset_step_charging(battery);
  4200. #endif
  4201. #endif
  4202. if (!battery->sink_status.power_list[pdo_num].comm_capable
  4203. || !battery->sink_status.power_list[pdo_num].suspend) {
  4204. pr_info("%s : clear suspend event pdo_num:%d, comm:%d, suspend:%d\n", __func__,
  4205. pdo_num,
  4206. battery->sink_status.power_list[pdo_num].comm_capable,
  4207. battery->sink_status.power_list[pdo_num].suspend);
  4208. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_USB_SUSPENDED);
  4209. sec_vote(battery->chgen_vote, VOTER_SUSPEND, false, 0);
  4210. sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0);
  4211. sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0);
  4212. }
  4213. }
  4214. }
  4215. static bool cw_check_skip_condition(struct sec_battery_info *battery, int current_cable_type)
  4216. {
  4217. static bool first_run = true;
  4218. if (first_run) {
  4219. first_run = false;
  4220. if (current_cable_type == SEC_BATTERY_CABLE_NONE) {
  4221. dev_info(battery->dev, "%s: do not skip! first cable work\n", __func__);
  4222. return false;
  4223. }
  4224. }
  4225. if ((current_cable_type == battery->cable_type) && !is_slate_mode(battery)
  4226. && !(battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED)) {
  4227. if (is_pd_wire_type(current_cable_type) && is_pd_wire_type(battery->cable_type)) {
  4228. sec_bat_set_current_event(battery, 0,
  4229. SEC_BAT_CURRENT_EVENT_AFC | SEC_BAT_CURRENT_EVENT_AICL);
  4230. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  4231. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, false, 0);
  4232. power_supply_changed(battery->psy_bat);
  4233. } else if (battery->prev_usb_conf != USB_CURRENT_NONE) {
  4234. dev_info(battery->dev, "%s: set usb charging current to %d mA\n",
  4235. __func__, battery->prev_usb_conf);
  4236. sec_bat_set_charging_current(battery);
  4237. battery->prev_usb_conf = USB_CURRENT_NONE;
  4238. }
  4239. dev_info(battery->dev, "%s: Cable is NOT Changed(%d)\n", __func__, battery->cable_type);
  4240. /* Do NOT activate cable work for NOT changed */
  4241. return true;
  4242. }
  4243. return false;
  4244. }
  4245. __visible_for_testing int cw_check_cable_switch(struct sec_battery_info *battery, int prev_ct,
  4246. int cur_ct, bool afc_disabled)
  4247. {
  4248. if ((is_wired_type(prev_ct) && is_wireless_all_type(cur_ct))
  4249. || (is_wireless_all_type(prev_ct) && is_wired_type(cur_ct))
  4250. || afc_disabled) {
  4251. battery->max_charge_power = 0;
  4252. sec_bat_set_threshold(battery, cur_ct);
  4253. }
  4254. if (cur_ct == SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT)
  4255. cur_ct = SEC_BATTERY_CABLE_9V_TA;
  4256. if (!can_usb_suspend_type(cur_ct) &&
  4257. battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED) {
  4258. pr_info("%s: clear suspend event prev_cable_type:%s -> %s\n", __func__,
  4259. sb_get_ct_str(prev_ct), sb_get_ct_str(cur_ct));
  4260. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_USB_SUSPENDED);
  4261. sec_vote(battery->chgen_vote, VOTER_SUSPEND, false, 0);
  4262. sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0);
  4263. sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0);
  4264. }
  4265. return cur_ct;
  4266. }
  4267. #if defined(CONFIG_USE_POGO)
  4268. static int cw_check_pogo(struct sec_battery_info *battery)
  4269. {
  4270. int pogo_current, wire_current;
  4271. if (battery->pogo_status) {
  4272. if (battery->wire_status != SEC_BATTERY_CABLE_NONE) {
  4273. if (battery->pogo_9v) {
  4274. pogo_current = battery->pdata->charging_current[SEC_BATTERY_CABLE_POGO_9V].input_current_limit;
  4275. pogo_current = pogo_current * SEC_INPUT_VOLTAGE_9V;
  4276. } else {
  4277. pogo_current = battery->pdata->charging_current[SEC_BATTERY_CABLE_POGO].input_current_limit;
  4278. pogo_current = pogo_current * SEC_INPUT_VOLTAGE_5V;
  4279. }
  4280. if (battery->wire_status == SEC_BATTERY_CABLE_PDIC) {
  4281. if (pogo_current < battery->pd_max_charge_power)
  4282. return battery->wire_status;
  4283. } else {
  4284. wire_current = (battery->wire_status == SEC_BATTERY_CABLE_PREPARE_TA ?
  4285. battery->pdata->charging_current[SEC_BATTERY_CABLE_TA].input_current_limit :
  4286. battery->pdata->charging_current[battery->wire_status].input_current_limit);
  4287. wire_current = wire_current * (is_hv_wire_type(battery->wire_status) ?
  4288. (battery->wire_status == SEC_BATTERY_CABLE_12V_TA ? SEC_INPUT_VOLTAGE_12V : SEC_INPUT_VOLTAGE_9V)
  4289. : SEC_INPUT_VOLTAGE_5V);
  4290. pr_info("%s: pogo_cur(%d), wr_cur(%d), wire_cable_type(%d)\n",
  4291. __func__, pogo_current, wire_current, battery->wire_status);
  4292. if (pogo_current < wire_current)
  4293. return battery->wire_status;
  4294. else
  4295. return (battery->pogo_9v) ? SEC_BATTERY_CABLE_POGO_9V : SEC_BATTERY_CABLE_POGO;
  4296. }
  4297. }
  4298. return (battery->pogo_9v) ? SEC_BATTERY_CABLE_POGO_9V : SEC_BATTERY_CABLE_POGO;
  4299. }
  4300. return battery->wire_status;
  4301. }
  4302. #endif
  4303. static void cw_set_psp_online2drivers(struct sec_battery_info *battery)
  4304. {
  4305. union power_supply_propval val = {0, };
  4306. if (is_slate_mode(battery))
  4307. val.intval = SEC_BATTERY_CABLE_NONE;
  4308. else
  4309. val.intval = battery->cable_type;
  4310. psy_do_property(battery->pdata->charger_name, set, POWER_SUPPLY_PROP_ONLINE, val);
  4311. val.intval = battery->cable_type;
  4312. psy_do_property(battery->pdata->fuelgauge_name, set, POWER_SUPPLY_PROP_ONLINE, val);
  4313. if (battery->wc_tx_enable) {
  4314. val.intval = is_wired_type(battery->wire_status) ? 1 : 0;
  4315. psy_do_property(battery->pdata->wireless_charger_name, set,
  4316. POWER_SUPPLY_EXT_PROP_WIRELESS_WR_CONNECTED, val);
  4317. }
  4318. if (!is_wireless_fake_type(battery->cable_type))
  4319. sec_vote_refresh(battery->chgen_vote);
  4320. }
  4321. static void cw_check_wc_condition(struct sec_battery_info *battery, int prev_cable_type)
  4322. {
  4323. /* need to move to wireless set property */
  4324. if (is_wireless_all_type(battery->cable_type)) {
  4325. power_supply_changed(battery->psy_bat);
  4326. }
  4327. /* For wire + wireless case */
  4328. if (!is_wireless_type(prev_cable_type) && is_wireless_type(battery->cable_type)) {
  4329. pr_info("%s: non-wl -> wl: prev_cable(%s) , current_cable(%s)\n",
  4330. __func__, sb_get_ct_str(prev_cable_type), sb_get_ct_str(battery->cable_type));
  4331. battery->wc_cv_mode = false;
  4332. battery->charging_passed_time = 0;
  4333. }
  4334. }
  4335. static void chg_retention_time_check(struct sec_battery_info *battery)
  4336. {
  4337. struct timespec64 ts = {0, };
  4338. ts = ktime_to_timespec64(ktime_get_boottime());
  4339. pr_info("%s: end time = %lld\n", __func__, ts.tv_sec);
  4340. if (ts.tv_sec <= battery->charging_retention_time || !battery->charging_retention_time)
  4341. return;
  4342. battery->charging_retention_time = ts.tv_sec - battery->charging_retention_time;
  4343. /* get only minutes part */
  4344. battery->charging_retention_time /= 60;
  4345. pr_info("%s: retention time = %ld mins\n", __func__, battery->charging_retention_time);
  4346. battery->cisd.data[CISD_DATA_TOTAL_CHG_RETENTION_TIME_PER_DAY] += battery->charging_retention_time;
  4347. battery->cisd.data[CISD_DATA_CHG_RETENTION_TIME_PER_DAY] =
  4348. max(battery->cisd.data[CISD_DATA_CHG_RETENTION_TIME_PER_DAY], (int)battery->charging_retention_time);
  4349. battery->charging_retention_time = 0;
  4350. }
  4351. static void chg_start_time_check(struct sec_battery_info *battery)
  4352. {
  4353. struct timespec64 ts = {0, };
  4354. ts = ktime_to_timespec64(ktime_get_boottime());
  4355. battery->charging_retention_time = ts.tv_sec;
  4356. pr_info("%s: start time = %lu\n", __func__, battery->charging_retention_time);
  4357. }
  4358. void sec_bat_smart_sw_src(struct sec_battery_info *battery, bool enable, int curr)
  4359. {
  4360. if (enable)
  4361. battery->smart_sw_src = true;
  4362. else if (battery->smart_sw_src)
  4363. battery->smart_sw_src = false;
  4364. else
  4365. return;
  4366. sec_pd_change_src(curr);
  4367. dev_info(battery->dev,
  4368. "%s: smart switch src, %s src cap max current\n",
  4369. __func__, enable ? "reduce" : "recover");
  4370. }
  4371. static void cw_nocharge_type(struct sec_battery_info *battery)
  4372. {
  4373. int i;
  4374. /* initialize all status */
  4375. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  4376. battery->is_recharging = false;
  4377. battery->cisd.ab_vbat_check_count = 0;
  4378. battery->cisd.state &= ~CISD_STATE_OVER_VOLTAGE;
  4379. battery->d2d_check = false;
  4380. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  4381. battery->wc20_power_class = 0;
  4382. battery->wc20_rx_power = 0;
  4383. battery->wc20_vout = 0;
  4384. #endif
  4385. battery->input_voltage = 0;
  4386. battery->charge_power = 0;
  4387. battery->max_charge_power = 0;
  4388. battery->pd_max_charge_power = 0;
  4389. battery->pd_rated_power = 0;
  4390. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  4391. battery->thermal_zone = BAT_THERMAL_NORMAL;
  4392. battery->chg_limit = false;
  4393. battery->lrp_limit = false;
  4394. battery->lrp_step = LRP_NONE;
  4395. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  4396. battery->lrp_chg_src = SEC_CHARGING_SOURCE_DIRECT;
  4397. #endif
  4398. battery->mix_limit = false;
  4399. battery->chg_limit_recovery_cable = SEC_BATTERY_CABLE_NONE;
  4400. battery->wc_heating_start_time = 0;
  4401. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  4402. battery->prev_usb_conf = USB_CURRENT_NONE;
  4403. battery->ta_alert_mode = OCP_NONE;
  4404. battery->prev_tx_phm_mode = false;
  4405. battery->wpc_temp_v2_offset = 0;
  4406. battery->is_fpdo_dc = false;
  4407. sec_bat_cancel_input_check_work(battery);
  4408. sec_bat_change_default_current(battery, SEC_BATTERY_CABLE_USB,
  4409. battery->pdata->default_usb_input_current,
  4410. battery->pdata->default_usb_charging_current);
  4411. sec_bat_change_default_current(battery, SEC_BATTERY_CABLE_TA,
  4412. battery->pdata->default_input_current,
  4413. battery->pdata->default_charging_current);
  4414. sec_bat_change_default_current(battery, SEC_BATTERY_CABLE_HV_WIRELESS_20,
  4415. battery->pdata->default_wc20_input_current,
  4416. battery->pdata->default_wc20_charging_current);
  4417. sec_bat_change_default_current(battery, SEC_BATTERY_CABLE_WIRELESS_EPP,
  4418. battery->pdata->default_wc20_input_current,
  4419. battery->pdata->default_wc20_charging_current);
  4420. /* usb default current is 100mA before configured*/
  4421. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_USB_100MA,
  4422. (SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE |
  4423. SEC_BAT_CURRENT_EVENT_AFC |
  4424. SEC_BAT_CURRENT_EVENT_VBAT_OVP |
  4425. SEC_BAT_CURRENT_EVENT_VSYS_OVP |
  4426. SEC_BAT_CURRENT_EVENT_CHG_LIMIT |
  4427. SEC_BAT_CURRENT_EVENT_AICL |
  4428. SEC_BAT_CURRENT_EVENT_SELECT_PDO |
  4429. SEC_BAT_CURRENT_EVENT_WDT_EXPIRED |
  4430. SEC_BAT_CURRENT_EVENT_25W_OCP |
  4431. SEC_BAT_CURRENT_EVENT_DC_ERR |
  4432. SEC_BAT_CURRENT_EVENT_USB_STATE |
  4433. SEC_BAT_CURRENT_EVENT_SEND_UVDM));
  4434. sec_bat_set_misc_event(battery, 0,
  4435. (BATT_MISC_EVENT_WIRELESS_MISALIGN | BATT_MISC_EVENT_HV_BY_AICL));
  4436. sec_bat_recov_full_capacity(battery); /* should call this after setting discharging */
  4437. /* slate_mode needs to be clear manually since smart switch does not disable slate_mode sometimes */
  4438. if (is_slate_mode(battery)) {
  4439. int voter_status = SEC_BAT_CHG_MODE_CHARGING;
  4440. if (get_sec_voter_status(battery->chgen_vote, VOTER_SMART_SLATE, &voter_status) < 0)
  4441. pr_err("%s: INVALID VOTER ID\n", __func__);
  4442. pr_info("%s: voter_status: %d\n", __func__, voter_status); // debug
  4443. if (voter_status == SEC_BAT_CHG_MODE_BUCK_OFF) {
  4444. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SLATE);
  4445. sec_bat_set_mfc_on(battery, WPC_EN_SLATE);
  4446. dev_info(battery->dev,
  4447. "%s: disable slate mode(smart switch) manually\n", __func__);
  4448. }
  4449. }
  4450. sec_bat_smart_sw_src(battery, false, 500);
  4451. chg_retention_time_check(battery);
  4452. battery->wc_cv_mode = false;
  4453. battery->is_sysovlo = false;
  4454. battery->is_vbatovlo = false;
  4455. battery->is_abnormal_temp = false;
  4456. battery->auto_mode = false;
  4457. #if !defined(CONFIG_SEC_FACTORY)
  4458. if (sec_bat_get_lpmode())
  4459. battery->usb_conn_status = USB_CONN_NORMAL;
  4460. #endif
  4461. for (i = 0; i < VOTER_MAX; i++) {
  4462. if (i != VOTER_FLASH &&
  4463. i != VOTER_MST &&
  4464. i != VOTER_FW)
  4465. sec_vote(battery->iv_vote, i, false, 0);
  4466. if (i == VOTER_SIOP ||
  4467. i == VOTER_SLATE ||
  4468. i == VOTER_AGING_STEP ||
  4469. i == VOTER_WC_TX ||
  4470. i == VOTER_MUIC_ABNORMAL ||
  4471. i == VOTER_NO_BATTERY ||
  4472. i == VOTER_FULL_CAPACITY)
  4473. continue;
  4474. sec_vote(battery->topoff_vote, i, false, 0);
  4475. if (i != VOTER_FW)
  4476. sec_vote(battery->chgen_vote, i, false, 0);
  4477. sec_vote(battery->input_vote, i, false, 0);
  4478. sec_vote(battery->fcc_vote, i, false, 0);
  4479. sec_vote(battery->fv_vote, i, false, 0);
  4480. sec_vote(battery->dc_fv_vote, i, false, 0);
  4481. }
  4482. cancel_delayed_work(&battery->slowcharging_work);
  4483. #if !defined(CONFIG_NO_BATTERY)
  4484. /* Discharging has 100mA current unlike non LEGO model */
  4485. sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100);
  4486. sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100);
  4487. #endif
  4488. battery->usb_slow_chg = false;
  4489. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  4490. battery->limiter_check = false;
  4491. #endif
  4492. sec_bat_set_abnormal_ta_fcc(battery, false);
  4493. }
  4494. static void cw_slate_mode(struct sec_battery_info *battery)
  4495. {
  4496. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  4497. union power_supply_propval val = {0, };
  4498. #endif
  4499. int j = 0;
  4500. /* Some charger ic's buck is enabled after vbus off, So disable buck again*/
  4501. sec_vote_refresh(battery->chgen_vote);
  4502. battery->is_recharging = false;
  4503. battery->cable_type = SEC_BATTERY_CABLE_NONE;
  4504. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  4505. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  4506. battery->is_sysovlo = false;
  4507. battery->is_vbatovlo = false;
  4508. battery->is_abnormal_temp = false;
  4509. battery->lrp_limit = false;
  4510. battery->lrp_step = LRP_NONE;
  4511. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  4512. battery->lrp_chg_src = SEC_CHARGING_SOURCE_DIRECT;
  4513. #endif
  4514. for (j = 0; j < VOTER_MAX; j++) {
  4515. sec_vote(battery->iv_vote, j, false, 0);
  4516. if (j == VOTER_SIOP ||
  4517. j == VOTER_SLATE ||
  4518. j == VOTER_SMART_SLATE ||
  4519. j == VOTER_AGING_STEP ||
  4520. j == VOTER_WC_TX ||
  4521. j == VOTER_FULL_CAPACITY)
  4522. continue;
  4523. sec_vote(battery->topoff_vote, j, false, 0);
  4524. sec_vote(battery->chgen_vote, j, false, 0);
  4525. sec_vote(battery->input_vote, j, false, 0);
  4526. sec_vote(battery->fcc_vote, j, false, 0);
  4527. sec_vote(battery->fv_vote, j, false, 0);
  4528. }
  4529. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  4530. /* No need val data */
  4531. psy_do_property(battery->pdata->charger_name, set, POWER_SUPPLY_EXT_PROP_DC_INITIALIZE, val);
  4532. #endif
  4533. battery->thermal_zone = BAT_THERMAL_NORMAL;
  4534. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  4535. }
  4536. static void cw_usb_suspend(struct sec_battery_info *battery)
  4537. {
  4538. /* Some charger ic's buck is enabled after vbus off, So disable buck again*/
  4539. sec_vote_refresh(battery->chgen_vote);
  4540. battery->is_recharging = false;
  4541. battery->cable_type = SEC_BATTERY_CABLE_NONE;
  4542. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  4543. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  4544. battery->is_sysovlo = false;
  4545. battery->is_vbatovlo = false;
  4546. battery->is_abnormal_temp = false;
  4547. battery->thermal_zone = BAT_THERMAL_NORMAL;
  4548. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  4549. }
  4550. static bool is_afc_evt_clear(int cable_type, int wire_status, int wc_status, unsigned int rp_currentlvl)
  4551. {
  4552. if ((cable_type == SEC_BATTERY_CABLE_TA && (rp_currentlvl == RP_CURRENT_LEVEL_DEFAULT ||
  4553. rp_currentlvl == RP_CURRENT_LEVEL_NONE)) ||
  4554. cable_type == SEC_BATTERY_CABLE_WIRELESS ||
  4555. cable_type == SEC_BATTERY_CABLE_PMA_WIRELESS ||
  4556. (is_hv_wire_type(cable_type) &&
  4557. (wc_status == SEC_BATTERY_CABLE_PREPARE_WIRELESS_20 ||
  4558. is_pwr_nego_wireless_type(wc_status) ||
  4559. wire_status == SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT)))
  4560. return false;
  4561. else
  4562. return true;
  4563. }
  4564. static void cw_prev_cable_is_nocharge(struct sec_battery_info *battery)
  4565. {
  4566. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  4567. union power_supply_propval value = {0, };
  4568. #endif
  4569. chg_start_time_check(battery);
  4570. if ((battery->cable_type == SEC_BATTERY_CABLE_WIRELESS) &&
  4571. (battery->health > POWER_SUPPLY_HEALTH_GOOD)) {
  4572. pr_info("%s: prev cable type was fake and health is not good\n", __func__);
  4573. return;
  4574. }
  4575. #if defined(CONFIG_ARCH_MTK_PROJECT) || IS_ENABLED(CONFIG_SEC_MTK_CHARGER)
  4576. if (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_100MA) {
  4577. if ((battery->cable_type == SEC_BATTERY_CABLE_USB) && !lpcharge) {
  4578. pr_info("%s: usb unconfigured\n", __func__);
  4579. sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100);
  4580. sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100);
  4581. }
  4582. }
  4583. #endif
  4584. if (battery->pdata->full_check_type != SEC_BATTERY_FULLCHARGED_NONE)
  4585. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  4586. else
  4587. battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
  4588. #if defined(CONFIG_ENABLE_FULL_BY_SOC)
  4589. if (battery->capacity >= 100) {
  4590. sec_bat_do_fullcharged(battery, true);
  4591. pr_info("%s: charging start at full, do not turn on charging\n", __func__);
  4592. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  4593. /*
  4594. * MTK check the AFC when charging-on.
  4595. * Even though do not charging-on, need to check AFC still.
  4596. */
  4597. value.intval = battery->cable_type;
  4598. psy_do_property(battery->pdata->charger_name, set,
  4599. POWER_SUPPLY_EXT_PROP_AFC_INIT, value);
  4600. #endif
  4601. } else if (!(battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY)) {
  4602. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_CHARGING);
  4603. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, false, 0);
  4604. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, false, 0);
  4605. }
  4606. #else
  4607. if (!(battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY)) {
  4608. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_CHARGING);
  4609. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, false, 0);
  4610. sec_vote(battery->chgen_vote, VOTER_FULL_CHARGE, false, 0);
  4611. }
  4612. #endif
  4613. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  4614. /* bat thm check to prevent charging current spike */
  4615. sec_bat_thermal_check(battery);
  4616. sec_vote(battery->chgen_vote, VOTER_CABLE, true, SEC_BAT_CHG_MODE_CHARGING);
  4617. if (battery->cable_type == SEC_BATTERY_CABLE_USB && !sec_bat_get_lpmode())
  4618. queue_delayed_work(battery->monitor_wqueue, &battery->slowcharging_work, msecs_to_jiffies(3000));
  4619. if (is_hv_wireless_type(battery->cable_type) && battery->sleep_mode)
  4620. sec_vote(battery->input_vote, VOTER_SLEEP_MODE, true, battery->pdata->sleep_mode_limit_current);
  4621. ttf_work_start(battery);
  4622. }
  4623. static int sec_bat_check_pd_iv(SEC_PD_SINK_STATUS *sink_status)
  4624. {
  4625. int i;
  4626. int max_voltage = SEC_INPUT_VOLTAGE_5V;
  4627. for (i = 1; i <= sink_status->available_pdo_num; i++) {
  4628. if ((sink_status->power_list[i].pdo_type == APDO_TYPE)
  4629. || !sink_status->power_list[i].accept)
  4630. break;
  4631. if (sink_status->power_list[i].max_voltage == SEC_INPUT_VOLTAGE_9V) {
  4632. max_voltage = SEC_INPUT_VOLTAGE_9V;
  4633. break;
  4634. }
  4635. }
  4636. return max_voltage;
  4637. }
  4638. #if defined(CONFIG_SUPPORT_HV_CTRL) && !defined(CONFIG_SEC_FACTORY)
  4639. static bool sb_ct_has_9v(struct sec_battery_info *battery, int ct)
  4640. {
  4641. if (is_hv_wire_type(ct))
  4642. return true;
  4643. else if (is_pd_wire_type(ct)) {
  4644. if (sec_bat_check_pd_iv(&battery->sink_status) == SEC_INPUT_VOLTAGE_9V)
  4645. return true;
  4646. }
  4647. return false;
  4648. }
  4649. #endif
  4650. static void cw_set_iv(struct sec_battery_info *battery)
  4651. {
  4652. if (is_nocharge_type(battery->cable_type) || is_wireless_all_type(battery->cable_type))
  4653. return;
  4654. if (is_hv_wire_type(battery->cable_type))
  4655. sec_vote(battery->iv_vote, VOTER_CABLE, true, SEC_INPUT_VOLTAGE_9V);
  4656. else if (is_pd_wire_type(battery->cable_type))
  4657. sec_vote(battery->iv_vote, VOTER_CABLE, true, sec_bat_check_pd_iv(&battery->sink_status));
  4658. #if defined(CONFIG_USE_POGO)
  4659. else if (battery->cable_type == SEC_BATTERY_CABLE_POGO_9V)
  4660. sec_vote(battery->iv_vote, VOTER_CABLE, true, SEC_INPUT_VOLTAGE_9V);
  4661. #endif
  4662. else
  4663. sec_vote(battery->iv_vote, VOTER_CABLE, true, SEC_INPUT_VOLTAGE_5V);
  4664. }
  4665. __visible_for_testing void sec_bat_cable_work(struct work_struct *work)
  4666. {
  4667. struct sec_battery_info *battery = container_of(work,
  4668. struct sec_battery_info, cable_work.work);
  4669. int current_cable_type = SEC_BATTERY_CABLE_NONE;
  4670. unsigned int input_current;
  4671. unsigned int charging_current;
  4672. bool clear_afc_evt = false;
  4673. int prev_cable_type = battery->cable_type;
  4674. int monitor_work_delay = 0;
  4675. dev_info(battery->dev, "%s: Start\n", __func__);
  4676. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL,
  4677. SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL);
  4678. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  4679. #if !IS_ENABLED(CONFIG_MTK_CHARGER) || IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  4680. /*
  4681. * showing charging icon and noti(no sound, vi, haptic) only
  4682. * if slow insertion is detected by MUIC
  4683. */
  4684. if (!(battery->pogo_status && battery->pdata->pogo_chgin))
  4685. sec_bat_set_misc_event(battery,
  4686. (battery->muic_cable_type == ATTACHED_DEV_TIMEOUT_OPEN_MUIC ? BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE : 0),
  4687. BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE);
  4688. #endif
  4689. #endif
  4690. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  4691. current_cable_type = sec_bat_choose_cable_type(battery);
  4692. #elif defined(CONFIG_USE_POGO)
  4693. current_cable_type = cw_check_pogo(battery);
  4694. #else
  4695. current_cable_type = battery->wire_status;
  4696. #endif
  4697. /* check wire type PD charger case */
  4698. cw_check_pd_wire_type(battery);
  4699. /* check cable work skip condition */
  4700. if (cw_check_skip_condition(battery, current_cable_type))
  4701. goto end_of_cable_work;
  4702. /* to clear this value when cable type switched without detach */
  4703. prev_cable_type = battery->cable_type;
  4704. battery->cable_type = cw_check_cable_switch(battery, prev_cable_type,
  4705. current_cable_type, check_afc_disabled_type(battery->muic_cable_type));
  4706. /* set online(cable type) */
  4707. cw_set_psp_online2drivers(battery);
  4708. /* check wireless charging condition */
  4709. cw_check_wc_condition(battery, prev_cable_type);
  4710. if (battery->pdata->check_cable_result_callback)
  4711. battery->pdata->check_cable_result_callback(battery->cable_type);
  4712. if (is_nocharge_type(battery->cable_type) ||
  4713. ((battery->pdata->cable_check_type & SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE) &&
  4714. battery->cable_type == SEC_BATTERY_CABLE_UNKNOWN)) {
  4715. pr_info("%s: prev_cable_type(%d)\n", __func__, prev_cable_type);
  4716. cw_nocharge_type(battery);
  4717. } else if (is_slate_mode(battery)) {
  4718. pr_info("%s: slate mode on\n", __func__);
  4719. cw_slate_mode(battery);
  4720. } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED) {
  4721. pr_info("%s: usb suspend\n", __func__);
  4722. cw_usb_suspend(battery);
  4723. battery->prev_usb_conf = USB_CURRENT_NONE;
  4724. monitor_work_delay = 3000;
  4725. goto run_monitor_work;
  4726. } else if (!battery->is_recharging &&
  4727. (is_nocharge_type(prev_cable_type) || is_wireless_fake_type(prev_cable_type))) {
  4728. pr_info("%s: c: %d, ov: %d, at: %d, cm: %d, tz: %d\n", __func__,
  4729. battery->cable_type, battery->is_vbatovlo, battery->is_abnormal_temp,
  4730. battery->charger_mode, battery->thermal_zone);
  4731. clear_afc_evt =
  4732. is_afc_evt_clear(battery->cable_type, battery->wire_status, battery->wc_status, battery->sink_status.rp_currentlvl);
  4733. if (!clear_afc_evt)
  4734. sec_bat_check_afc_input_current(battery);
  4735. cw_prev_cable_is_nocharge(battery);
  4736. sec_vote_refresh(battery->iv_vote);
  4737. } else if (is_hv_wire_type(battery->cable_type) && (battery->current_event & SEC_BAT_CURRENT_EVENT_AFC)) {
  4738. clear_afc_evt =
  4739. is_afc_evt_clear(battery->cable_type, battery->wire_status, battery->wc_status, battery->sink_status.rp_currentlvl);
  4740. }
  4741. #if defined(CONFIG_STEP_CHARGING)
  4742. if (!is_hv_wire_type(battery->cable_type) && !is_pd_wire_type(battery->cable_type)
  4743. && (battery->sink_status.rp_currentlvl != RP_CURRENT_LEVEL3))
  4744. sec_bat_reset_step_charging(battery);
  4745. #endif
  4746. /* set input voltage by cable type */
  4747. cw_set_iv(battery);
  4748. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE) && defined(CONFIG_SEC_FACTORY)
  4749. sec_bat_usb_factory_set_vote(battery, true);
  4750. #endif
  4751. /* Check VOTER_SIOP to set up current based on cable_type */
  4752. __pm_stay_awake(battery->siop_level_ws);
  4753. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  4754. if (battery->cable_type != SEC_BATTERY_CABLE_WIRELESS_FAKE) {
  4755. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AICL);
  4756. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  4757. sec_bat_check_input_voltage(battery, battery->cable_type);
  4758. /* to init battery type current when wireless charging -> battery case */
  4759. sec_vote_refresh(battery->input_vote);
  4760. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  4761. sec_wireless_otg_icl_control(battery);
  4762. #endif
  4763. input_current = battery->pdata->charging_current[current_cable_type].input_current_limit;
  4764. charging_current = battery->pdata->charging_current[current_cable_type].fast_charging_current;
  4765. sec_vote(battery->fcc_vote, VOTER_CABLE, true, charging_current);
  4766. sec_vote(battery->input_vote, VOTER_CABLE, true, input_current);
  4767. }
  4768. if ((!is_nocharge_type(battery->cable_type) && battery->cable_type != SEC_BATTERY_CABLE_USB) || sec_bat_get_lpmode()) {
  4769. sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0);
  4770. sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0);
  4771. }
  4772. if (clear_afc_evt) {
  4773. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  4774. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, false, 0);
  4775. }
  4776. store_battery_log(
  4777. "CW:%d%%,%dmV,%s,ct(%s,%s,%d,%d),slate(%d),cev(0x%x),mev(0x%x)",
  4778. battery->capacity,
  4779. battery->voltage_now,
  4780. sb_get_bst_str(battery->status),
  4781. sb_get_ct_str(battery->cable_type),
  4782. sb_get_ct_str(battery->wire_status),
  4783. battery->muic_cable_type,
  4784. battery->pd_usb_attached,
  4785. is_slate_mode(battery),
  4786. battery->current_event,
  4787. battery->misc_event
  4788. );
  4789. /*
  4790. * polling time should be reset when cable is changed
  4791. * polling_in_sleep should be reset also
  4792. * before polling time is re-calculated
  4793. * to prevent from counting 1 for events
  4794. * right after cable is connected
  4795. */
  4796. battery->polling_in_sleep = false;
  4797. sec_bat_get_polling_time(battery);
  4798. pr_info("%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
  4799. __func__, sb_get_bst_str(battery->status),
  4800. battery->polling_in_sleep ? "Yes" : "No",
  4801. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
  4802. battery->polling_short ? "Yes" : "No");
  4803. pr_info("%s: Polling time is reset to %d sec.\n", __func__, battery->polling_time);
  4804. battery->polling_count = 1; /* initial value = 1 */
  4805. run_monitor_work:
  4806. __pm_stay_awake(battery->monitor_ws);
  4807. /* run monitor_work immediately if SEC_BAT_CURRENT_EVENT_USB_SUSPENDED is cleared for timing issue */
  4808. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED))
  4809. cancel_delayed_work(&battery->monitor_work);
  4810. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, msecs_to_jiffies(monitor_work_delay));
  4811. end_of_cable_work:
  4812. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  4813. if ((battery->bc12_cable != SEC_BATTERY_CABLE_TIMEOUT) &&
  4814. (battery->misc_event & BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE))
  4815. sec_bat_set_misc_event(battery, 0,
  4816. BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE);
  4817. #endif
  4818. sb_set_vbus_wake(battery->vbus_ws, battery->health, battery->cable_type);
  4819. __pm_relax(battery->cable_ws);
  4820. dev_info(battery->dev, "%s: End\n", __func__);
  4821. }
  4822. EXPORT_SYMBOL_KUNIT(sec_bat_cable_work);
  4823. #define MAX_INPUT_CHECK_COUNT 3
  4824. __visible_for_testing void sec_bat_input_check_work(struct work_struct *work)
  4825. {
  4826. struct sec_battery_info *battery = container_of(work,
  4827. struct sec_battery_info, input_check_work.work);
  4828. union power_supply_propval value = {0, };
  4829. dev_info(battery->dev, "%s for %s start\n", __func__, sb_get_ct_str(battery->cable_type));
  4830. psy_do_property(battery->pdata->charger_name, get,
  4831. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, value);
  4832. battery->current_max = value.intval;
  4833. if (battery->current_event & SEC_BAT_CURRENT_EVENT_AFC) {
  4834. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  4835. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, false, 0);
  4836. #if !defined(CONFIG_SEC_FACTORY)
  4837. sec_bat_change_vbus(battery, battery->cable_type, battery->current_event, battery->siop_level);
  4838. #endif
  4839. if (battery->cable_type == SEC_BATTERY_CABLE_TA)
  4840. battery->cisd.cable_data[CISD_CABLE_TA]++;
  4841. #if defined(CONFIG_WIRELESS_TX_MODE)
  4842. if (battery->wc_tx_enable)
  4843. sec_bat_run_wpc_tx_work(battery, 0);
  4844. #endif
  4845. } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_SELECT_PDO) {
  4846. int curr_pdo = 0, pdo = 0, iv = 0, icl = 0;
  4847. iv = get_sec_vote_result(battery->iv_vote);
  4848. if ((iv == SEC_INPUT_VOLTAGE_APDO) ||
  4849. (sec_pd_get_pdo_power(&pdo, &iv, &iv, &icl) <= 0) ||
  4850. (sec_pd_get_current_pdo(&curr_pdo) < 0) ||
  4851. (pdo == curr_pdo)) {
  4852. pr_info("%s: clear select_pdo event(%d, %d, %d)\n",
  4853. __func__, iv, pdo, curr_pdo);
  4854. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  4855. if (sec_pd_get_current_pdo(&curr_pdo) >= 0) {
  4856. pr_info("%s: sink_status.current_pdo_num(%d), curr_pdo(%d)\n",
  4857. __func__, battery->sink_status.current_pdo_num, curr_pdo);
  4858. battery->sink_status.current_pdo_num = curr_pdo;
  4859. sec_bat_get_input_current_in_power_list(battery);
  4860. sec_bat_get_charging_current_in_power_list(battery);
  4861. }
  4862. #endif
  4863. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SELECT_PDO);
  4864. sec_vote(battery->input_vote, VOTER_SELECT_PDO, false, 0);
  4865. battery->input_check_cnt = 0;
  4866. /* Check VOTER_SIOP to set up current after select pdo. */
  4867. __pm_stay_awake(battery->siop_level_ws);
  4868. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  4869. } else if ((++battery->input_check_cnt) % MAX_INPUT_CHECK_COUNT) {
  4870. pr_info("%s: refresh(%d)!! pdo: %d, curr_pdo: %d\n",
  4871. __func__, battery->input_check_cnt, pdo, curr_pdo);
  4872. sec_vote_refresh(battery->iv_vote);
  4873. return;
  4874. }
  4875. } else {
  4876. dev_info(battery->dev, "%s: Nothing to do\n", __func__);
  4877. }
  4878. dev_info(battery->dev, "%s: End\n", __func__);
  4879. }
  4880. EXPORT_SYMBOL_KUNIT(sec_bat_input_check_work);
  4881. static void sec_bat_transit_clear_work(struct work_struct *work)
  4882. {
  4883. struct sec_battery_info *battery = container_of(work,
  4884. struct sec_battery_info, transit_clear_work.work);
  4885. sec_vote(battery->chgen_vote, VOTER_SRCCAP_TRANSIT, false, 0);
  4886. battery->srccap_transit = false;
  4887. pr_info("%s: disable VOTER_SRCCAP_TRANSIT manually\n", __func__);
  4888. }
  4889. static void sec_bat_usb_conn_check_work(struct work_struct *work)
  4890. {
  4891. struct sec_battery_info *battery = container_of(work,
  4892. struct sec_battery_info, usb_conn_check_work.work);
  4893. pr_info("%s: usb_conn_check_cnt(%d)\n", __func__, ++battery->usb_conn_check_cnt);
  4894. if (battery->usb_conn_check_cnt > MAX_USB_CONN_CHECK_CNT ||
  4895. battery->usb_conn_status != USB_CONN_NORMAL ||
  4896. battery->current_event & SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST) {
  4897. battery->run_usb_conn_check = false;
  4898. battery->usb_conn_check_cnt = 0;
  4899. __pm_relax(battery->usb_conn_check_ws);
  4900. return;
  4901. }
  4902. if (sec_usb_conn_check(battery) != USB_CONN_NORMAL) {
  4903. pr_info("%s: Set BATT_MISC_EVENT_TEMP_HICCUP_TYPE in usb_conn_check_work\n", __func__);
  4904. battery->run_usb_conn_check = false;
  4905. battery->usb_conn_check_cnt = 0;
  4906. battery->polling_count = 1;
  4907. __pm_stay_awake(battery->monitor_ws);
  4908. __pm_relax(battery->usb_conn_check_ws);
  4909. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  4910. } else {
  4911. queue_delayed_work(battery->monitor_wqueue,
  4912. &battery->usb_conn_check_work, msecs_to_jiffies(1000));
  4913. }
  4914. }
  4915. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  4916. static void sec_bat_handle_bc12_connection(struct sec_battery_info *battery)
  4917. {
  4918. mutex_lock(&battery->bc12_notylock);
  4919. dev_info(battery->dev,
  4920. "%s: prev_cable_type(%d), bc12_cable(%d), wire_status(%d)\n",
  4921. __func__, battery->cable_type, battery->bc12_cable, battery->wire_status);
  4922. #if defined(CONFIG_SUPPORT_HV_CTRL)
  4923. if (battery->cable_type == SEC_BATTERY_CABLE_9V_TA &&
  4924. battery->bc12_cable == SEC_BATTERY_CABLE_9V_TA) {
  4925. sec_vote(battery->input_vote, VOTER_CABLE, true, battery->pdata->charging_current[battery->bc12_cable].input_current_limit);
  4926. sec_vote(battery->fcc_vote, VOTER_CABLE, true, battery->pdata->charging_current[battery->bc12_cable].fast_charging_current);
  4927. }
  4928. #endif
  4929. battery->wire_status = battery->bc12_cable;
  4930. if (is_hv_wire_type(battery->bc12_cable)) {
  4931. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AICL);
  4932. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  4933. }
  4934. if (battery->bc12_cable == SEC_BATTERY_CABLE_NONE) {
  4935. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  4936. sec_bat_usb_factory_clear(battery);
  4937. #endif
  4938. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  4939. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  4940. #endif
  4941. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  4942. battery->init_src_cap = false;
  4943. battery->sink_status.rp_currentlvl = RP_CURRENT_LEVEL_NONE;
  4944. #endif
  4945. }
  4946. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  4947. else if (battery->cable_type != battery->bc12_cable &&
  4948. battery->sink_status.rp_currentlvl >= RP_CURRENT_LEVEL_DEFAULT &&
  4949. (battery->bc12_cable == SEC_BATTERY_CABLE_USB ||
  4950. battery->bc12_cable == SEC_BATTERY_CABLE_TA)) {
  4951. sec_bat_set_rp_current(battery, battery->bc12_cable);
  4952. }
  4953. #endif
  4954. else if ((battery->bc12_cable == SEC_BATTERY_CABLE_TIMEOUT) &&
  4955. (!battery->init_src_cap))
  4956. /*
  4957. * showing charging icon and noti(no sound, vi, haptic) only
  4958. * if slow insertion is detected by BC1.2
  4959. */
  4960. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE,
  4961. BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE);
  4962. /* cable is attached or detached
  4963. * if battery->bc12_cable is minus value,
  4964. * check cable by sec_bat_get_cable_type()
  4965. * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
  4966. * (0 is SEC_BATTERY_CABLE_UNKNOWN)
  4967. */
  4968. if ((battery->bc12_cable >= 0) &&
  4969. (battery->bc12_cable < SEC_BATTERY_CABLE_MAX) &&
  4970. (battery->pdata->cable_source_type &
  4971. SEC_BATTERY_CABLE_SOURCE_EXTERNAL)) {
  4972. __pm_stay_awake(battery->cable_ws);
  4973. queue_delayed_work(battery->monitor_wqueue,
  4974. &battery->cable_work, 0);
  4975. } else {
  4976. if (sec_bat_get_cable_type(battery,
  4977. battery->pdata->cable_source_type)) {
  4978. __pm_stay_awake(battery->cable_ws);
  4979. queue_delayed_work(battery->monitor_wqueue,
  4980. &battery->cable_work, 0);
  4981. }
  4982. }
  4983. mutex_unlock(&battery->bc12_notylock);
  4984. } /* sec_bat_handle_bc12_connection */
  4985. #endif
  4986. #define TRANSIT_CNT 5
  4987. #define MAX_TRANSIT_CNT 100
  4988. static void sec_bat_check_srccap_transit(struct sec_battery_info *battery, int enable)
  4989. {
  4990. int voter_status;
  4991. pr_info("%s: set init_src_cap(%d->%d)",
  4992. __func__, battery->init_src_cap, enable);
  4993. if (enable) {
  4994. battery->init_src_cap = true;
  4995. return;
  4996. }
  4997. if (++battery->srccap_transit_cnt < TRANSIT_CNT) {
  4998. sec_vote(battery->chgen_vote, VOTER_SRCCAP_TRANSIT, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  4999. battery->srccap_transit = true;
  5000. queue_delayed_work(battery->monitor_wqueue,
  5001. &battery->transit_clear_work, msecs_to_jiffies(10000));
  5002. return;
  5003. }
  5004. if (battery->srccap_transit_cnt > MAX_TRANSIT_CNT)
  5005. battery->srccap_transit_cnt = TRANSIT_CNT;
  5006. voter_status = SEC_BAT_CHG_MODE_CHARGING;
  5007. if (get_sec_voter_status(battery->chgen_vote, VOTER_SRCCAP_TRANSIT, &voter_status) < 0) {
  5008. return;
  5009. }
  5010. pr_info("%s: voter_status: %d cnt: %d\n", __func__, voter_status, battery->srccap_transit_cnt);
  5011. if (voter_status == SEC_BAT_CHG_MODE_BUCK_OFF) {
  5012. sec_vote(battery->chgen_vote, VOTER_SRCCAP_TRANSIT, false, 0);
  5013. battery->srccap_transit = false;
  5014. pr_info("%s: disable VOTER_SRCCAP_TRANSIT manually\n", __func__);
  5015. }
  5016. #if IS_ENABLED(CONFIG_SEC_ABC)
  5017. sec_abc_send_event("MODULE=battery@WARN=dc_error");
  5018. #endif
  5019. }
  5020. static int sec_bat_set_property(struct power_supply *psy,
  5021. enum power_supply_property psp,
  5022. const union power_supply_propval *val)
  5023. {
  5024. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  5025. int current_cable_type = SEC_BATTERY_CABLE_NONE;
  5026. int full_check_type = SEC_BATTERY_FULLCHARGED_NONE;
  5027. union power_supply_propval value = {0, };
  5028. enum power_supply_ext_property ext_psp = (enum power_supply_ext_property) psp;
  5029. dev_dbg(battery->dev,
  5030. "%s: (%d,%d)\n", __func__, psp, val->intval);
  5031. switch ((int)psp) {
  5032. case POWER_SUPPLY_PROP_STATUS:
  5033. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  5034. full_check_type = battery->pdata->full_check_type;
  5035. else
  5036. full_check_type = battery->pdata->full_check_type_2nd;
  5037. if ((full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT) &&
  5038. (val->intval == POWER_SUPPLY_STATUS_FULL))
  5039. sec_bat_do_fullcharged(battery, false);
  5040. sec_bat_set_charging_status(battery, val->intval);
  5041. break;
  5042. case POWER_SUPPLY_PROP_HEALTH:
  5043. if (!is_wireless_fake_type(battery->cable_type)) {
  5044. __pm_stay_awake(battery->monitor_ws);
  5045. queue_delayed_work(battery->monitor_wqueue,
  5046. &battery->monitor_work, msecs_to_jiffies(100));
  5047. }
  5048. break;
  5049. case POWER_SUPPLY_PROP_ONLINE:
  5050. current_cable_type = val->intval;
  5051. if (current_cable_type < 0) {
  5052. dev_info(battery->dev,
  5053. "%s: ignore event(%d)\n",
  5054. __func__, current_cable_type);
  5055. } else {
  5056. if (current_cable_type == SEC_BATTERY_CABLE_OTG) {
  5057. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  5058. battery->is_recharging = false;
  5059. sec_bat_set_charging_status(battery,
  5060. POWER_SUPPLY_STATUS_DISCHARGING);
  5061. battery->cable_type = current_cable_type;
  5062. __pm_stay_awake(battery->monitor_ws);
  5063. queue_delayed_work(battery->monitor_wqueue,
  5064. &battery->monitor_work, 0);
  5065. break;
  5066. } else {
  5067. battery->wire_status = current_cable_type;
  5068. if (is_nocharge_type(battery->wire_status) &&
  5069. (battery->wc_status != SEC_BATTERY_CABLE_NONE))
  5070. current_cable_type = SEC_BATTERY_CABLE_WIRELESS;
  5071. }
  5072. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  5073. battery->bc12_cable = current_cable_type;
  5074. /* Skip notify from BC1.2 if PDIC is attached already */
  5075. if ((is_pd_wire_type(battery->wire_status) || battery->init_src_cap) &&
  5076. (battery->bc12_cable != SEC_BATTERY_CABLE_NONE)) {
  5077. if (lpcharge)
  5078. break;
  5079. else if (battery->usb_conn_status == USB_CONN_NORMAL &&
  5080. !(battery->misc_event & BATT_MISC_EVENT_TEMP_HICCUP_TYPE))
  5081. break;
  5082. }
  5083. sec_bat_handle_bc12_connection(battery);
  5084. #endif
  5085. }
  5086. #if !IS_ENABLED(CONFIG_MTK_CHARGER) || IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  5087. dev_info(battery->dev,
  5088. "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
  5089. __func__, current_cable_type, battery->wc_status,
  5090. battery->wire_status);
  5091. /*
  5092. * cable is attached or detached
  5093. * if current_cable_type is minus value,
  5094. * check cable by sec_bat_get_cable_type()
  5095. * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
  5096. * (0 is SEC_BATTERY_CABLE_UNKNOWN)
  5097. */
  5098. if ((current_cable_type >= 0) &&
  5099. (current_cable_type < SEC_BATTERY_CABLE_MAX) &&
  5100. (battery->pdata->cable_source_type &
  5101. SEC_BATTERY_CABLE_SOURCE_EXTERNAL)) {
  5102. __pm_stay_awake(battery->cable_ws);
  5103. queue_delayed_work(battery->monitor_wqueue,
  5104. &battery->cable_work,0);
  5105. } else {
  5106. if (sec_bat_get_cable_type(battery,
  5107. battery->pdata->cable_source_type)) {
  5108. __pm_stay_awake(battery->cable_ws);
  5109. queue_delayed_work(battery->monitor_wqueue,
  5110. &battery->cable_work,0);
  5111. }
  5112. }
  5113. #endif
  5114. break;
  5115. case POWER_SUPPLY_PROP_CAPACITY:
  5116. battery->capacity = val->intval;
  5117. power_supply_changed(battery->psy_bat);
  5118. break;
  5119. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  5120. break;
  5121. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  5122. __pm_stay_awake(battery->monitor_ws);
  5123. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  5124. break;
  5125. case POWER_SUPPLY_PROP_PRESENT:
  5126. battery->present = val->intval;
  5127. __pm_stay_awake(battery->monitor_ws);
  5128. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  5129. break;
  5130. case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
  5131. break;
  5132. case POWER_SUPPLY_PROP_VOLTAGE_MIN:
  5133. pr_info("%s: Valert was occurred! run monitor work for updating cisd data!\n", __func__);
  5134. battery->cisd.data[CISD_DATA_VALERT_COUNT]++;
  5135. battery->cisd.data[CISD_DATA_VALERT_COUNT_PER_DAY]++;
  5136. __pm_stay_awake(battery->monitor_ws);
  5137. queue_delayed_work_on(0, battery->monitor_wqueue,
  5138. &battery->monitor_work, 0);
  5139. break;
  5140. case POWER_SUPPLY_PROP_ENERGY_NOW:
  5141. if (!battery->factory_mode_boot_on)
  5142. factory_mode = 1;
  5143. break;
  5144. case POWER_SUPPLY_EXT_PROP_MIN ... POWER_SUPPLY_EXT_PROP_MAX:
  5145. switch (ext_psp) {
  5146. case POWER_SUPPLY_EXT_PROP_AICL_CURRENT:
  5147. battery->max_charge_power = battery->charge_power =
  5148. mW_by_mVmA(battery->input_voltage, val->intval);
  5149. /* Voter should be removed after all chagers is fixed */
  5150. sec_vote(battery->input_vote, VOTER_AICL, true, val->intval);
  5151. #if defined(CONFIG_SUPPORT_HV_CTRL) && !defined(CONFIG_SEC_FACTORY)
  5152. if (battery->pdata->boosting_voltage_aicl) {
  5153. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_HV_BY_AICL,
  5154. BATT_MISC_EVENT_HV_BY_AICL);
  5155. if (sb_ct_has_9v(battery, battery->cable_type)) {
  5156. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  5157. sec_vote(battery->iv_vote, VOTER_AICL, true, SEC_INPUT_VOLTAGE_9V);
  5158. /* Check siop level to set current */
  5159. __pm_stay_awake(battery->siop_level_ws);
  5160. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  5161. }
  5162. }
  5163. #endif
  5164. pr_info("%s: aicl : %dmA, %dmW)\n", __func__,
  5165. val->intval, battery->charge_power);
  5166. if (is_wired_type(battery->cable_type)) {
  5167. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_AICL,
  5168. SEC_BAT_CURRENT_EVENT_AICL);
  5169. store_battery_log(
  5170. "AICL:%d%%,curr(%dmA),%dmV,%s,ct(%d,%d,%d,%d),cev(0x%x)",
  5171. battery->capacity,
  5172. val->intval,
  5173. battery->voltage_now,
  5174. sb_get_bst_str(battery->status),
  5175. battery->cable_type,
  5176. battery->wire_status,
  5177. battery->muic_cable_type,
  5178. battery->pd_usb_attached,
  5179. battery->current_event
  5180. );
  5181. }
  5182. battery->cisd.data[CISD_DATA_AICL_COUNT]++;
  5183. battery->cisd.data[CISD_DATA_AICL_COUNT_PER_DAY]++;
  5184. break;
  5185. case POWER_SUPPLY_EXT_PROP_SYSOVLO:
  5186. if (battery->status != POWER_SUPPLY_STATUS_DISCHARGING) {
  5187. pr_info("%s: Vsys is ovlo !!\n", __func__);
  5188. battery->is_sysovlo = true;
  5189. battery->is_recharging = false;
  5190. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  5191. sec_bat_set_health(battery, POWER_SUPPLY_EXT_HEALTH_VSYS_OVP);
  5192. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_VSYS_OVP, SEC_BAT_CURRENT_EVENT_VSYS_OVP);
  5193. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING);
  5194. battery->cisd.data[CISD_DATA_VSYS_OVP]++;
  5195. battery->cisd.data[CISD_DATA_VSYS_OVP_PER_DAY]++;
  5196. #if IS_ENABLED(CONFIG_SEC_ABC)
  5197. sec_abc_send_event("MODULE=battery@WARN=vsys_ovp");
  5198. #endif
  5199. sec_vote(battery->chgen_vote, VOTER_SYSOVLO, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  5200. __pm_stay_awake(battery->monitor_ws);
  5201. queue_delayed_work(battery->monitor_wqueue,
  5202. &battery->monitor_work, 0);
  5203. }
  5204. break;
  5205. case POWER_SUPPLY_EXT_PROP_VBAT_OVP:
  5206. if (battery->status != POWER_SUPPLY_STATUS_DISCHARGING) {
  5207. pr_info("%s: Vbat is ovlo !!\n", __func__);
  5208. battery->is_vbatovlo = true;
  5209. battery->is_recharging = false;
  5210. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  5211. sec_bat_set_health(battery, POWER_SUPPLY_EXT_HEALTH_VBAT_OVP);
  5212. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_VBAT_OVP, SEC_BAT_CURRENT_EVENT_VBAT_OVP);
  5213. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING);
  5214. sec_vote(battery->chgen_vote, VOTER_VBAT_OVP, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  5215. __pm_stay_awake(battery->monitor_ws);
  5216. queue_delayed_work(battery->monitor_wqueue,
  5217. &battery->monitor_work, 0);
  5218. }
  5219. break;
  5220. case POWER_SUPPLY_EXT_PROP_USB_CONFIGURE:
  5221. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE) && defined(CONFIG_SEC_FACTORY)
  5222. pr_info("%s: usb configured %d\n", __func__, val->intval);
  5223. if (sec_bat_usb_factory_set_vote(battery, true))
  5224. break;
  5225. #endif
  5226. if (val->intval == USB_CURRENT_CLEAR || val->intval != battery->prev_usb_conf)
  5227. sec_bat_set_usb_configure(battery, val->intval);
  5228. break;
  5229. case POWER_SUPPLY_EXT_PROP_OVERHEAT_NOTIFY:
  5230. pr_info("%s: POWER_SUPPLY_EXT_PROP_OVERHEAT_NOTIFY!\n", __func__);
  5231. __pm_stay_awake(battery->monitor_ws);
  5232. queue_delayed_work(battery->monitor_wqueue,
  5233. &battery->monitor_work, 0);
  5234. break;
  5235. case POWER_SUPPLY_EXT_PROP_HV_DISABLE:
  5236. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  5237. #if defined(CONFIG_PD_CHARGER_HV_DISABLE)
  5238. pr_info("None PD wired charging mode is %s\n", (val->intval == CH_MODE_AFC_DISABLE_VAL ? "Disabled" : "Enabled"));
  5239. if (val->intval == CH_MODE_AFC_DISABLE_VAL) {
  5240. sec_bat_set_current_event(battery,
  5241. SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE, SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE);
  5242. } else {
  5243. sec_bat_set_current_event(battery,
  5244. 0, SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE);
  5245. }
  5246. #else
  5247. pr_info("HV wired charging mode is %s\n", (val->intval == CH_MODE_AFC_DISABLE_VAL ? "Disabled" : "Enabled"));
  5248. if (val->intval == CH_MODE_AFC_DISABLE_VAL) {
  5249. sec_bat_set_current_event(battery,
  5250. SEC_BAT_CURRENT_EVENT_HV_DISABLE, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
  5251. } else {
  5252. sec_bat_set_current_event(battery,
  5253. 0, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
  5254. }
  5255. if (is_pd_wire_type(battery->cable_type)) {
  5256. battery->update_pd_list = true;
  5257. pr_info("%s: update pd list\n", __func__);
  5258. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5259. if (is_pd_apdo_wire_type(battery->cable_type))
  5260. psy_do_property(battery->pdata->charger_name, set,
  5261. POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
  5262. #endif
  5263. sec_vote_refresh(battery->iv_vote);
  5264. }
  5265. #endif
  5266. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  5267. if ((battery->cable_type == SEC_BATTERY_CABLE_TA) &&
  5268. (battery->sink_status.rp_currentlvl == RP_CURRENT_LEVEL3)) {
  5269. sec_bat_set_rp_current(battery, battery->cable_type);
  5270. sec_vote(battery->fcc_vote, VOTER_CABLE, true,
  5271. battery->pdata->charging_current[battery->cable_type].fast_charging_current);
  5272. sec_vote(battery->input_vote, VOTER_CABLE, true,
  5273. battery->pdata->charging_current[battery->cable_type].input_current_limit);
  5274. }
  5275. #endif
  5276. #endif
  5277. break;
  5278. case POWER_SUPPLY_EXT_PROP_WC_CONTROL:
  5279. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  5280. pr_info("%s: Recover MFC IC (wc_enable: %d)\n",
  5281. __func__, battery->wc_enable);
  5282. mutex_lock(&battery->wclock);
  5283. if (battery->wc_enable) {
  5284. sec_bat_set_mfc_off(battery, WPC_EN_CHARGING, false);
  5285. msleep(500);
  5286. sec_bat_set_mfc_on(battery, WPC_EN_CHARGING);
  5287. }
  5288. mutex_unlock(&battery->wclock);
  5289. #endif
  5290. break;
  5291. case POWER_SUPPLY_EXT_PROP_WDT_STATUS:
  5292. if (val->intval)
  5293. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_WDT_EXPIRED,
  5294. SEC_BAT_CURRENT_EVENT_WDT_EXPIRED);
  5295. break;
  5296. case POWER_SUPPLY_EXT_PROP_CURRENT_EVENT:
  5297. if (!(battery->current_event & val->intval)) {
  5298. pr_info("%s: set new current_event %d\n", __func__, val->intval);
  5299. if (val->intval == SEC_BAT_CURRENT_EVENT_DC_ERR)
  5300. battery->cisd.event_data[EVENT_DC_ERR]++;
  5301. sec_bat_set_current_event(battery, val->intval, val->intval);
  5302. }
  5303. break;
  5304. case POWER_SUPPLY_EXT_PROP_CURRENT_EVENT_CLEAR:
  5305. pr_info("%s: new current_event clear %d\n", __func__, val->intval);
  5306. sec_bat_set_current_event(battery, 0, val->intval);
  5307. break;
  5308. #if defined(CONFIG_WIRELESS_TX_MODE)
  5309. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_AVG_CURR:
  5310. break;
  5311. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ENABLE:
  5312. sec_wireless_set_tx_enable(battery, val->intval);
  5313. break;
  5314. #endif
  5315. case POWER_SUPPLY_EXT_PROP_SRCCAP:
  5316. sec_bat_check_srccap_transit(battery, val->intval);
  5317. break;
  5318. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5319. case POWER_SUPPLY_EXT_PROP_DIRECT_TA_ALERT:
  5320. if (battery->ta_alert_wa) {
  5321. pr_info("@TA_ALERT: %s: TA OCP DETECT\n", __func__);
  5322. battery->cisd.event_data[EVENT_TA_OCP_DET]++;
  5323. if (battery->ta_alert_mode == OCP_NONE)
  5324. battery->cisd.event_data[EVENT_TA_OCP_ON]++;
  5325. battery->ta_alert_mode = OCP_DETECT;
  5326. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_25W_OCP,
  5327. SEC_BAT_CURRENT_EVENT_25W_OCP);
  5328. store_battery_log(
  5329. "TA OCP:%d%%,%dmV,%s,ct(%d,%d,%d,%d),cev(0x%x),mev(0x%x)",
  5330. battery->capacity,
  5331. battery->voltage_now,
  5332. sb_get_bst_str(battery->status),
  5333. battery->cable_type,
  5334. battery->wire_status,
  5335. battery->muic_cable_type,
  5336. battery->pd_usb_attached,
  5337. battery->current_event,
  5338. battery->misc_event
  5339. );
  5340. }
  5341. break;
  5342. case POWER_SUPPLY_EXT_PROP_DIRECT_SEND_UVDM:
  5343. if (is_pd_apdo_wire_type(battery->cable_type)) {
  5344. char direct_charging_source_status[2] = {0, };
  5345. pr_info("@SEND_UVDM: Request Change Charging Source : %s\n",
  5346. val->intval == 0 ? "Switch Charger" : "Direct Charger" );
  5347. direct_charging_source_status[0] = SEC_SEND_UVDM;
  5348. direct_charging_source_status[1] = val->intval;
  5349. sec_bat_set_current_event(battery, val->intval == 0 ?
  5350. SEC_BAT_CURRENT_EVENT_SEND_UVDM : 0, SEC_BAT_CURRENT_EVENT_SEND_UVDM);
  5351. value.strval = direct_charging_source_status;
  5352. psy_do_property(battery->pdata->charger_name, set,
  5353. POWER_SUPPLY_EXT_PROP_CHANGE_CHARGING_SOURCE, value);
  5354. }
  5355. break;
  5356. case POWER_SUPPLY_EXT_PROP_DIRECT_FIXED_PDO:
  5357. if (!is_slate_mode(battery) && !is_wireless_all_type(battery->cable_type)) {
  5358. sec_vote(battery->iv_vote, VOTER_DC_MODE, true, val->intval);
  5359. if (val->intval == SEC_INPUT_VOLTAGE_APDO) {
  5360. sec_vote(battery->iv_vote, VOTER_AICL, false, 0);
  5361. sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_HV_BY_AICL);
  5362. }
  5363. }
  5364. break;
  5365. #endif
  5366. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  5367. case POWER_SUPPLY_EXT_PROP_FASTCHG_LIMIT_CURRENT:
  5368. if (is_wireless_type(battery->cable_type))
  5369. sec_bat_set_limiter_current(battery);
  5370. break;
  5371. #endif
  5372. case POWER_SUPPLY_EXT_PROP_WPC_EN:
  5373. sec_bat_set_current_event(battery,
  5374. val->intval ? 0 : SEC_BAT_CURRENT_EVENT_WPC_EN, SEC_BAT_CURRENT_EVENT_WPC_EN);
  5375. break;
  5376. case POWER_SUPPLY_EXT_PROP_CHARGE_UNO_CONTROL:
  5377. value.intval = val->intval;
  5378. pr_info("%s: WCIN-UNO %s\n", __func__, value.intval > 0 ? "on" : "off");
  5379. psy_do_property("otg", set,
  5380. POWER_SUPPLY_EXT_PROP_CHARGE_UNO_CONTROL, value);
  5381. break;
  5382. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  5383. case POWER_SUPPLY_EXT_PROP_BATT_F_MODE:
  5384. battery->batt_f_mode = val->intval;
  5385. if (battery->batt_f_mode == OB_MODE) {
  5386. sec_bat_set_facmode(true);
  5387. battery->factory_mode = true;
  5388. } else if (((battery->cable_type == SEC_BATTERY_CABLE_NONE) &&
  5389. (battery->wire_status != SEC_BATTERY_CABLE_NONE)) &&
  5390. (battery->batt_f_mode == IB_MODE)) {
  5391. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  5392. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_CHARGING);
  5393. battery->cable_type = battery->wire_status;
  5394. sec_bat_set_facmode(false);
  5395. battery->factory_mode = false;
  5396. } else {
  5397. sec_bat_set_facmode(false);
  5398. battery->factory_mode = false;
  5399. }
  5400. value.intval = battery->batt_f_mode;
  5401. psy_do_property(battery->pdata->fuelgauge_name, set,
  5402. POWER_SUPPLY_EXT_PROP_BATT_F_MODE, value);
  5403. __pm_stay_awake(battery->monitor_ws);
  5404. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  5405. break;
  5406. #endif
  5407. case POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION:
  5408. case POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONTROL:
  5409. break;
  5410. case POWER_SUPPLY_EXT_PROP_CHARGE_COUNTER_SHADOW:
  5411. break;
  5412. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  5413. case POWER_SUPPLY_EXT_PROP_POWER_DESIGN:
  5414. sec_bat_parse_dt(battery->dev, battery);
  5415. break;
  5416. #endif
  5417. case POWER_SUPPLY_EXT_PROP_MFC_FW_UPDATE:
  5418. battery->mfc_fw_update = val->intval;
  5419. if (!battery->mfc_fw_update) {
  5420. pr_info("%s: fw update done: (5V -> 9V).\n", __func__);
  5421. sec_vote(battery->chgen_vote, VOTER_FW, false, 0);
  5422. sec_vote(battery->iv_vote, VOTER_FW, false, 0);
  5423. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  5424. #if !IS_ENABLED(CONFIG_MTK_CHARGER) || !IS_ENABLED(CONFIG_AFC_CHARGER)
  5425. muic_afc_request_voltage(AFC_REQUEST_MFC, SEC_INPUT_VOLTAGE_9V / 1000);
  5426. #endif
  5427. #endif
  5428. }
  5429. break;
  5430. case POWER_SUPPLY_EXT_PROP_THERMAL_ZONE:
  5431. pr_info("%s : bat_thm_info.check_type set to %s\n", __func__, val->intval ? "NONE" : "TEMP");
  5432. if (val->intval) {
  5433. battery->skip_swelling = true; /* restore thermal_zone to NORMAL */
  5434. battery->pdata->bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
  5435. battery->pdata->lrp_temp_check_type = SEC_BATTERY_TEMP_CHECK_NONE;
  5436. sec_vote(battery->iv_vote, VOTER_LRP_TEMP, false, 0);
  5437. sec_vote(battery->fcc_vote, VOTER_LRP_TEMP, false, 0);
  5438. sec_vote(battery->input_vote, VOTER_LRP_TEMP, false, 0);
  5439. battery->lrp_limit = false;
  5440. battery->lrp_step = LRP_NONE;
  5441. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5442. battery->lrp_chg_src = SEC_CHARGING_SOURCE_DIRECT;
  5443. #endif
  5444. } else {
  5445. battery->skip_swelling = false;
  5446. battery->pdata->bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
  5447. battery->pdata->lrp_temp_check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
  5448. /* Check VOTER_SIOP to set up current based on cable_type */
  5449. __pm_stay_awake(battery->siop_level_ws);
  5450. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  5451. #if !defined(CONFIG_SEC_FACTORY)
  5452. sec_bat_check_lrp_temp(battery,
  5453. battery->cable_type, battery->wire_status,
  5454. battery->siop_level, battery->lcd_status);
  5455. #endif
  5456. }
  5457. break;
  5458. case POWER_SUPPLY_EXT_PROP_TEMP_CHECK_TYPE:
  5459. break;
  5460. case POWER_SUPPLY_EXT_PROP_SUB_TEMP:
  5461. break;
  5462. case POWER_SUPPLY_EXT_PROP_WPC_FREQ_STRENGTH:
  5463. pr_info("%s : wpc vout strength(%d)\n", __func__, val->intval);
  5464. sec_bat_set_misc_event(battery,
  5465. ((val->intval <= 0) ? BATT_MISC_EVENT_WIRELESS_MISALIGN : 0),
  5466. BATT_MISC_EVENT_WIRELESS_MISALIGN);
  5467. break;
  5468. case POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL:
  5469. value.intval = val->intval;
  5470. pr_info("%s: d2d reverse boost : %d\n", __func__, val->intval);
  5471. if (val->intval) {
  5472. if (!battery->d2d_check) {
  5473. battery->cisd.event_data[EVENT_D2D]++;
  5474. battery->d2d_check = true;
  5475. }
  5476. sec_vote(battery->chgen_vote, VOTER_D2D_WIRE, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  5477. }
  5478. psy_do_property(battery->pdata->charger_name, set,
  5479. POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VOLTAGE, value);
  5480. if (!val->intval) {
  5481. battery->d2d_check = false;
  5482. sec_vote(battery->chgen_vote, VOTER_D2D_WIRE, false, 0);
  5483. battery->vpdo_auth_stat = AUTH_NONE;
  5484. }
  5485. break;
  5486. case POWER_SUPPLY_EXT_PROP_FLASH_STATE: /* check only for MTK */
  5487. battery->flash_state = val->intval;
  5488. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5489. if (is_pd_apdo_wire_type(battery->cable_type))
  5490. psy_do_property(battery->pdata->charger_name, set,
  5491. POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
  5492. #endif
  5493. if (val->intval) {
  5494. pr_info("%s: Flash on: (9V -> 5V).\n", __func__);
  5495. sec_vote(battery->iv_vote, VOTER_FLASH, true, SEC_INPUT_VOLTAGE_5V);
  5496. } else {
  5497. pr_info("%s: Flash off: (5V -> 9V).\n", __func__);
  5498. sec_vote(battery->iv_vote, VOTER_FLASH, false, 0);
  5499. }
  5500. break;
  5501. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  5502. case POWER_SUPPLY_EXT_PROP_MTK_FG_INIT: /* check only for MTK */
  5503. battery->mtk_fg_init = val->intval;
  5504. pr_info("%s: mtk_fg_init (%d)\n", __func__, battery->mtk_fg_init);
  5505. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5506. if (is_pd_apdo_wire_type(battery->cable_type))
  5507. psy_do_property(battery->pdata->charger_name, set,
  5508. POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
  5509. #endif
  5510. break;
  5511. #endif
  5512. case POWER_SUPPLY_EXT_PROP_USB_BOOTCOMPLETE:
  5513. battery->usb_bootcomplete = val->intval;
  5514. pr_info("%s: usb_bootcomplete (%d)\n", __func__, battery->usb_bootcomplete);
  5515. break;
  5516. case POWER_SUPPLY_EXT_PROP_MISC_EVENT:
  5517. if (!(battery->misc_event & val->intval)) {
  5518. pr_info("%s: set new misc_event %d\n", __func__, val->intval);
  5519. sec_bat_set_misc_event(battery, val->intval, val->intval);
  5520. }
  5521. break;
  5522. case POWER_SUPPLY_EXT_PROP_MISC_EVENT_CLEAR:
  5523. pr_info("%s: new misc_event clear %d\n", __func__, val->intval);
  5524. sec_bat_set_misc_event(battery, 0, val->intval);
  5525. break;
  5526. case POWER_SUPPLY_EXT_PROP_MST_EN:
  5527. pr_info("%s: POWER_SUPPLY_EXT_PROP_MST_EN(%d)\n", __func__, val->intval);
  5528. battery->mst_en = val->intval;
  5529. if (val->intval)
  5530. sec_vote(battery->iv_vote, VOTER_MST, true, SEC_INPUT_VOLTAGE_5V);
  5531. else
  5532. sec_vote(battery->iv_vote, VOTER_MST, false, 0);
  5533. break;
  5534. case POWER_SUPPLY_EXT_PROP_ABNORMAL_SRCCAP:
  5535. store_battery_log(
  5536. "ABNORMAL_SRCCAP:%d%%,%dmV,%s,PDO(0x%X)",
  5537. battery->capacity,
  5538. battery->voltage_now,
  5539. sb_get_bst_str(battery->status),
  5540. val->intval
  5541. );
  5542. break;
  5543. case POWER_SUPPLY_EXT_PROP_HARDRESET_OCCUR:
  5544. if (is_pd_wire_type(battery->cable_type)) {
  5545. battery->sink_status.selected_pdo_num = -1;
  5546. store_battery_log(
  5547. "HARDRESET_%s:%d%%,%dmV,%s,SELPDO(%d),CURPDO(%d)",
  5548. val->intval ? "SENT" : "RECEIVED",
  5549. battery->capacity,
  5550. battery->voltage_now,
  5551. sb_get_bst_str(battery->status),
  5552. battery->sink_status.selected_pdo_num,
  5553. battery->sink_status.current_pdo_num
  5554. );
  5555. }
  5556. break;
  5557. case POWER_SUPPLY_EXT_PROP_ABNORMAL_TA:
  5558. pr_info("%s: POWER_SUPPLY_EXT_PROP_ABNORMAL_TA(%d)\n", __func__, val->intval);
  5559. sec_bat_set_abnormal_ta_fcc(battery, true);
  5560. break;
  5561. case POWER_SUPPLY_EXT_PROP_RX_PHM:
  5562. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  5563. pr_info("%s : PHM set %d\n", __func__, val->intval);
  5564. if (val->intval)
  5565. sec_vote(battery->chgen_vote, VOTER_PHM, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  5566. else
  5567. sec_vote(battery->chgen_vote, VOTER_PHM, false, 0);
  5568. #endif
  5569. break;
  5570. default:
  5571. return -EINVAL;
  5572. }
  5573. break;
  5574. default:
  5575. return -EINVAL;
  5576. }
  5577. return 0;
  5578. }
  5579. static int sec_bat_check_status(struct sec_battery_info *battery)
  5580. {
  5581. /* need to update for DPM UI */
  5582. if (battery->misc_event & BATT_MISC_EVENT_DIRECT_POWER_MODE)
  5583. return POWER_SUPPLY_STATUS_NOT_CHARGING;
  5584. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  5585. (battery->health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE))
  5586. return POWER_SUPPLY_STATUS_DISCHARGING;
  5587. if ((battery->pdata->cable_check_type &
  5588. SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE) &&
  5589. !sec_bat_get_lpmode()) {
  5590. switch (battery->cable_type) {
  5591. case SEC_BATTERY_CABLE_USB:
  5592. case SEC_BATTERY_CABLE_USB_CDP:
  5593. return POWER_SUPPLY_STATUS_DISCHARGING;
  5594. }
  5595. }
  5596. #if defined(CONFIG_STORE_MODE)
  5597. if (battery->store_mode && !sec_bat_get_lpmode() &&
  5598. !is_nocharge_type(battery->cable_type) &&
  5599. battery->status == POWER_SUPPLY_STATUS_DISCHARGING)
  5600. return POWER_SUPPLY_STATUS_CHARGING;
  5601. #endif
  5602. if (is_eu_eco_rechg(battery->fs) &&
  5603. (battery->status == POWER_SUPPLY_STATUS_FULL)) {
  5604. if (battery->is_recharging) {
  5605. #if defined(CONFIG_ENABLE_FULL_BY_SOC)
  5606. if (battery->capacity < 100)
  5607. return POWER_SUPPLY_STATUS_CHARGING;
  5608. #else
  5609. return POWER_SUPPLY_STATUS_CHARGING;
  5610. #endif
  5611. }
  5612. if (check_eu_eco_rechg_ui_condition(battery))
  5613. return POWER_SUPPLY_STATUS_CHARGING;
  5614. }
  5615. return battery->status;
  5616. }
  5617. static int sec_bat_get_property(struct power_supply *psy,
  5618. enum power_supply_property psp,
  5619. union power_supply_propval *val)
  5620. {
  5621. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  5622. union power_supply_propval value = {0, };
  5623. enum power_supply_ext_property ext_psp = (enum power_supply_ext_property) psp;
  5624. switch ((int)psp) {
  5625. case POWER_SUPPLY_PROP_STATUS:
  5626. val->intval = sec_bat_check_status(battery);
  5627. break;
  5628. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  5629. {
  5630. unsigned int input_current = battery->pdata->charging_current[battery->cable_type].input_current_limit;
  5631. if (is_nocharge_type(battery->cable_type)) {
  5632. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  5633. } else if (is_hv_wire_type(battery->cable_type) || is_pd_wire_type(battery->cable_type) || is_wireless_all_type(battery->cable_type)) {
  5634. val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
  5635. } else if (!battery->usb_bootcomplete && !lpcharge && battery->pdata->slowcharging_usb_bootcomplete) {
  5636. val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
  5637. } else if (input_current <= SLOW_CHARGING_CURRENT_STANDARD || battery->usb_slow_chg) {
  5638. val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
  5639. } else {
  5640. psy_do_property(battery->pdata->charger_name, get,
  5641. POWER_SUPPLY_PROP_CHARGE_TYPE, value);
  5642. if (value.intval == SEC_BATTERY_CABLE_UNKNOWN)
  5643. /*
  5644. * if error in CHARGE_TYPE of charger
  5645. * set CHARGE_TYPE as NONE
  5646. */
  5647. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  5648. else
  5649. val->intval = value.intval;
  5650. }
  5651. }
  5652. break;
  5653. case POWER_SUPPLY_PROP_HEALTH:
  5654. if (sec_bat_get_lpmode() &&
  5655. (battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE ||
  5656. battery->health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE ||
  5657. battery->health == POWER_SUPPLY_EXT_HEALTH_DC_ERR)) {
  5658. val->intval = POWER_SUPPLY_HEALTH_GOOD;
  5659. } else if (battery->health >= POWER_SUPPLY_EXT_HEALTH_MIN) {
  5660. if (battery->health == POWER_SUPPLY_EXT_HEALTH_OVERHEATLIMIT)
  5661. val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
  5662. else
  5663. val->intval = POWER_SUPPLY_HEALTH_UNKNOWN;
  5664. } else {
  5665. val->intval = battery->health;
  5666. }
  5667. break;
  5668. case POWER_SUPPLY_PROP_PRESENT:
  5669. val->intval = battery->present;
  5670. /* BATT_MISC_EVENT_DIRECT_POWER_MODE event is activated only in the DPM application model. */
  5671. /* need to update for SSRM cooldown mode */
  5672. if (battery->misc_event & BATT_MISC_EVENT_DIRECT_POWER_MODE)
  5673. val->intval = 0;
  5674. break;
  5675. case POWER_SUPPLY_PROP_ONLINE:
  5676. /* SEC_BATTERY_CABLE_SILENT_TYPE, defines with PMS team for avoid charger connection sound */
  5677. if (check_silent_type(battery->muic_cable_type))
  5678. val->intval = SEC_BATTERY_CABLE_SILENT_TYPE;
  5679. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  5680. else if (is_hv_wireless_type(battery->cable_type) ||
  5681. (battery->cable_type == SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV)) {
  5682. if (sec_bat_hv_wc_normal_mode_check(battery))
  5683. val->intval = SEC_BATTERY_CABLE_WIRELESS;
  5684. else
  5685. val->intval = SEC_BATTERY_CABLE_HV_WIRELESS_ETX;
  5686. } else if ((battery->cable_type == SEC_BATTERY_CABLE_PREPARE_WIRELESS_20) ||
  5687. (battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_EPP_FAKE)) {
  5688. if (sec_bat_hv_wc_normal_mode_check(battery) ||
  5689. (battery->wc20_rx_power < WFC10_WIRELESS_POWER))
  5690. val->intval = SEC_BATTERY_CABLE_WIRELESS;
  5691. else
  5692. val->intval = SEC_BATTERY_CABLE_HV_WIRELESS_ETX;
  5693. } else if (battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_PACK ||
  5694. battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_STAND ||
  5695. battery->cable_type == SEC_BATTERY_CABLE_PMA_WIRELESS ||
  5696. battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_VEHICLE ||
  5697. battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_TX ||
  5698. battery->cable_type == SEC_BATTERY_CABLE_WIRELESS_FAKE) {
  5699. val->intval = SEC_BATTERY_CABLE_WIRELESS;
  5700. }
  5701. #endif
  5702. else
  5703. val->intval = battery->cable_type;
  5704. break;
  5705. case POWER_SUPPLY_PROP_TECHNOLOGY:
  5706. val->intval = battery->pdata->technology;
  5707. break;
  5708. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  5709. #ifdef CONFIG_SEC_FACTORY
  5710. value.intval = SEC_BATTERY_VOLTAGE_MV;
  5711. psy_do_property(battery->pdata->fuelgauge_name, get,
  5712. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  5713. battery->voltage_now = value.intval;
  5714. dev_err(battery->dev,
  5715. "%s: voltage now(%d)\n", __func__, battery->voltage_now);
  5716. #endif
  5717. /* voltage value should be in uV */
  5718. val->intval = battery->voltage_now * 1000;
  5719. break;
  5720. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  5721. #ifdef CONFIG_SEC_FACTORY
  5722. value.intval = SEC_BATTERY_VOLTAGE_MV;
  5723. psy_do_property(battery->pdata->fuelgauge_name, get,
  5724. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  5725. battery->voltage_avg = value.intval;
  5726. dev_err(battery->dev,
  5727. "%s: voltage avg(%d)\n", __func__, battery->voltage_avg);
  5728. #endif
  5729. /* voltage value should be in uV */
  5730. val->intval = battery->voltage_avg * 1000;
  5731. break;
  5732. case POWER_SUPPLY_PROP_CURRENT_NOW:
  5733. value.intval = SEC_BATTERY_CURRENT_MA;
  5734. psy_do_property(battery->pdata->fuelgauge_name, get,
  5735. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  5736. val->intval = value.intval;
  5737. break;
  5738. case POWER_SUPPLY_PROP_CURRENT_AVG:
  5739. value.intval = SEC_BATTERY_CURRENT_MA;
  5740. psy_do_property(battery->pdata->fuelgauge_name, get,
  5741. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  5742. val->intval = value.intval;
  5743. break;
  5744. case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  5745. case POWER_SUPPLY_PROP_CHARGE_FULL:
  5746. val->intval = battery->pdata->battery_full_capacity * 1000;
  5747. break;
  5748. /* charging mode (differ from power supply) */
  5749. case POWER_SUPPLY_PROP_CHARGE_NOW:
  5750. val->intval = battery->charging_mode;
  5751. break;
  5752. case POWER_SUPPLY_PROP_CAPACITY:
  5753. if (battery->pdata->fake_capacity) {
  5754. val->intval = 70;
  5755. pr_info("%s : capacity(%d)\n", __func__, val->intval);
  5756. } else {
  5757. val->intval = battery->capacity;
  5758. if ((battery->status == POWER_SUPPLY_STATUS_FULL) &&
  5759. #if defined(CONFIG_ENG_BATTERY_CONCEPT)
  5760. !battery->eng_not_full_status &&
  5761. #endif
  5762. !is_eu_eco_rechg(battery->fs))
  5763. val->intval = 100;
  5764. }
  5765. break;
  5766. case POWER_SUPPLY_PROP_TEMP:
  5767. val->intval = battery->temperature;
  5768. break;
  5769. case POWER_SUPPLY_PROP_TEMP_AMBIENT:
  5770. val->intval = battery->temper_amb;
  5771. break;
  5772. #if IS_ENABLED(CONFIG_FUELGAUGE_MAX77705)
  5773. case POWER_SUPPLY_PROP_POWER_NOW:
  5774. value.intval = SEC_BATTERY_ISYS_MA;
  5775. psy_do_property(battery->pdata->fuelgauge_name, get,
  5776. POWER_SUPPLY_EXT_PROP_MEASURE_SYS, value);
  5777. val->intval = value.intval;
  5778. break;
  5779. case POWER_SUPPLY_PROP_POWER_AVG:
  5780. value.intval = SEC_BATTERY_ISYS_AVG_MA;
  5781. psy_do_property(battery->pdata->fuelgauge_name, get,
  5782. POWER_SUPPLY_EXT_PROP_MEASURE_SYS, value);
  5783. val->intval = value.intval;
  5784. break;
  5785. #endif
  5786. case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
  5787. val->intval = ttf_display(battery->capacity, battery->status,
  5788. battery->thermal_zone, battery->ttf_d->timetofull);
  5789. break;
  5790. case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
  5791. if (battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE)
  5792. val->intval = 1;
  5793. else
  5794. val->intval = 0;
  5795. break;
  5796. case POWER_SUPPLY_PROP_CHARGE_COUNTER:
  5797. val->intval = battery->charge_counter;
  5798. break;
  5799. case POWER_SUPPLY_EXT_PROP_MIN ... POWER_SUPPLY_EXT_PROP_MAX:
  5800. switch (ext_psp) {
  5801. case POWER_SUPPLY_EXT_PROP_CHARGE_POWER:
  5802. val->intval = battery->charge_power;
  5803. break;
  5804. case POWER_SUPPLY_EXT_PROP_CURRENT_EVENT:
  5805. val->intval = battery->current_event;
  5806. break;
  5807. #if defined(CONFIG_WIRELESS_TX_MODE)
  5808. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_AVG_CURR:
  5809. val->intval = battery->tx_avg_curr;
  5810. break;
  5811. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ENABLE:
  5812. val->intval = battery->wc_tx_enable;
  5813. break;
  5814. #endif
  5815. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5816. case POWER_SUPPLY_EXT_PROP_DIRECT_CHARGER_MODE:
  5817. val->intval = battery->pd_list.now_isApdo;
  5818. break;
  5819. case POWER_SUPPLY_EXT_PROP_DIRECT_HAS_APDO:
  5820. val->intval = battery->sink_status.has_apdo;
  5821. break;
  5822. case POWER_SUPPLY_EXT_PROP_PAD_VOLT_CTRL:
  5823. if (battery->pdata->wpc_vout_ctrl_lcd_on)
  5824. val->intval = battery->lcd_status;
  5825. else
  5826. val->intval = false;
  5827. break;
  5828. case POWER_SUPPLY_EXT_PROP_DIRECT_TA_ALERT:
  5829. if (battery->ta_alert_wa) {
  5830. val->intval = battery->ta_alert_mode;
  5831. } else
  5832. val->intval = OCP_NONE;
  5833. break;
  5834. case POWER_SUPPLY_EXT_PROP_DIRECT_SEND_UVDM:
  5835. break;
  5836. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  5837. case POWER_SUPPLY_EXT_PROP_DIRECT_VBAT_CHECK:
  5838. pr_info("%s : step(%d/%d), vmp:%dmV, vsp:%dmV\n", __func__,
  5839. battery->step_chg_status, battery->dc_step_chg_step - 1,
  5840. battery->voltage_avg_main, battery->voltage_avg_sub);
  5841. if ((battery->step_chg_status == battery->dc_step_chg_step - 1) &&
  5842. ((battery->voltage_avg_main >= battery->pdata->sc_vbat_thresh_main) ||
  5843. (battery->voltage_avg_sub >= battery->pdata->sc_vbat_thresh_sub)))
  5844. val->intval = 1;
  5845. else
  5846. val->intval = 0;
  5847. break;
  5848. case POWER_SUPPLY_EXT_PROP_VOLTAGE_PACK_MAIN:
  5849. val->intval = battery->voltage_avg_main;
  5850. break;
  5851. case POWER_SUPPLY_EXT_PROP_VOLTAGE_PACK_SUB:
  5852. val->intval = battery->voltage_avg_sub;
  5853. break;
  5854. #endif
  5855. #endif
  5856. case POWER_SUPPLY_EXT_PROP_HV_PDO:
  5857. val->intval = battery->hv_pdo;
  5858. break;
  5859. case POWER_SUPPLY_EXT_PROP_CHARGE_UNO_CONTROL:
  5860. break;
  5861. case POWER_SUPPLY_EXT_PROP_CHARGE_COUNTER_SHADOW:
  5862. val->intval = battery->wire_status;
  5863. break;
  5864. case POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL:
  5865. break;
  5866. case POWER_SUPPLY_EXT_PROP_HEALTH:
  5867. val->intval = battery->health;
  5868. break;
  5869. case POWER_SUPPLY_EXT_PROP_MFC_FW_UPDATE:
  5870. val->intval = battery->mfc_fw_update;
  5871. break;
  5872. case POWER_SUPPLY_EXT_PROP_THERMAL_ZONE:
  5873. val->intval = battery->thermal_zone;
  5874. break;
  5875. case POWER_SUPPLY_EXT_PROP_TEMP_CHECK_TYPE:
  5876. switch (val->intval) {
  5877. case THM_INFO_BAT:
  5878. val->intval = battery->pdata->bat_thm_info.check_type;
  5879. break;
  5880. case THM_INFO_USB:
  5881. val->intval = battery->pdata->usb_thm_info.check_type;
  5882. break;
  5883. case THM_INFO_CHG:
  5884. val->intval = battery->pdata->chg_thm_info.check_type;
  5885. break;
  5886. case THM_INFO_WPC:
  5887. val->intval = battery->pdata->wpc_thm_info.check_type;
  5888. break;
  5889. case THM_INFO_SUB_BAT:
  5890. val->intval = battery->pdata->sub_bat_thm_info.check_type;
  5891. break;
  5892. case THM_INFO_BLK:
  5893. val->intval = battery->pdata->blk_thm_info.check_type;
  5894. break;
  5895. case THM_INFO_DCHG:
  5896. val->intval = battery->pdata->dchg_thm_info.check_type;
  5897. break;
  5898. default:
  5899. val->intval = SEC_BATTERY_TEMP_CHECK_NONE;
  5900. break;
  5901. }
  5902. break;
  5903. case POWER_SUPPLY_EXT_PROP_SUB_TEMP:
  5904. val->intval = battery->sub_bat_temp;
  5905. break;
  5906. case POWER_SUPPLY_EXT_PROP_MIX_LIMIT:
  5907. val->intval = battery->mix_limit;
  5908. break;
  5909. case POWER_SUPPLY_EXT_PROP_WPC_FREQ_STRENGTH:
  5910. break;
  5911. case POWER_SUPPLY_EXT_PROP_LCD_FLICKER:
  5912. val->intval = (battery->lcd_status && battery->wpc_vout_ctrl_mode) ? 1 : 0;
  5913. break;
  5914. case POWER_SUPPLY_EXT_PROP_FLASH_STATE: /* check only for MTK */
  5915. val->intval = battery->flash_state;
  5916. break;
  5917. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  5918. case POWER_SUPPLY_EXT_PROP_MTK_FG_INIT: /* check only for MTK */
  5919. val->intval = battery->mtk_fg_init;
  5920. break;
  5921. #endif
  5922. case POWER_SUPPLY_EXT_PROP_SRCCAP:
  5923. val->intval = battery->init_src_cap;
  5924. break;
  5925. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  5926. case POWER_SUPPLY_EXT_PROP_RP_LEVEL:
  5927. val->intval = battery->sink_status.rp_currentlvl;
  5928. break;
  5929. #endif
  5930. case POWER_SUPPLY_EXT_PROP_LRP_CHG_SRC:
  5931. val->intval = battery->lrp_chg_src;
  5932. break;
  5933. case POWER_SUPPLY_EXT_PROP_MISC_EVENT:
  5934. val->intval = battery->misc_event;
  5935. break;
  5936. case POWER_SUPPLY_EXT_PROP_MST_EN:
  5937. val->intval = battery->mst_en;
  5938. break;
  5939. case POWER_SUPPLY_EXT_PROP_DIRECT_DONE:
  5940. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  5941. psy_do_property(battery->pdata->charger_name, get,
  5942. POWER_SUPPLY_EXT_PROP_DIRECT_DONE, value);
  5943. val->intval = value.intval;
  5944. #else
  5945. val->intval = 0;
  5946. #endif
  5947. break;
  5948. case POWER_SUPPLY_EXT_PROP_FPDO_DC_THERMAL_CHECK:
  5949. pr_info("%s: FPDO_DC, Tbat(%d), chg_limit(%d), lrp_limit(%d), siop(%d), tz(%d), pdo(%d)\n",
  5950. __func__, battery->temperature, battery->chg_limit, battery->lrp_limit,
  5951. battery->siop_level, battery->thermal_zone, battery->sink_status.current_pdo_num);
  5952. if (battery->chg_limit || battery->lrp_limit || battery->siop_level < 80 ||
  5953. battery->thermal_zone != BAT_THERMAL_NORMAL ||
  5954. battery->sink_status.current_pdo_num < 2 ||
  5955. battery->temperature <= battery->pdata->wire_cool1_normal_thresh ||
  5956. battery->temperature >= battery->pdata->wire_normal_warm_thresh)
  5957. val->intval = 1;
  5958. else
  5959. val->intval = 0;
  5960. break;
  5961. case POWER_SUPPLY_EXT_PROP_ABNORMAL_TA:
  5962. if (battery->abnormal_ta && battery->charging_current <= MIN_FCC_VALUE)
  5963. val->intval = 1;
  5964. else
  5965. val->intval = 0;
  5966. break;
  5967. default:
  5968. return -EINVAL;
  5969. }
  5970. break;
  5971. default:
  5972. return -EINVAL;
  5973. }
  5974. return 0;
  5975. }
  5976. static int sec_usb_get_property(struct power_supply *psy,
  5977. enum power_supply_property psp,
  5978. union power_supply_propval *val)
  5979. {
  5980. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  5981. if (psp != POWER_SUPPLY_PROP_ONLINE)
  5982. return -EINVAL;
  5983. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  5984. (battery->health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE)) {
  5985. val->intval = 0;
  5986. return 0;
  5987. }
  5988. /* Set enable=1 only if the USB charger is connected */
  5989. switch (battery->wire_status) {
  5990. case SEC_BATTERY_CABLE_USB:
  5991. case SEC_BATTERY_CABLE_USB_CDP:
  5992. val->intval = 1;
  5993. break;
  5994. case SEC_BATTERY_CABLE_PDIC:
  5995. case SEC_BATTERY_CABLE_FPDO_DC:
  5996. val->intval = (battery->pd_usb_attached) ? 1:0;
  5997. break;
  5998. default:
  5999. val->intval = 0;
  6000. break;
  6001. }
  6002. if (is_slate_mode(battery))
  6003. val->intval = 0;
  6004. return 0;
  6005. }
  6006. static int sec_ac_get_property(struct power_supply *psy,
  6007. enum power_supply_property psp,
  6008. union power_supply_propval *val)
  6009. {
  6010. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6011. enum power_supply_ext_property ext_psp = (enum power_supply_ext_property) psp;
  6012. switch ((int)psp) {
  6013. case POWER_SUPPLY_PROP_ONLINE:
  6014. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  6015. (battery->health == POWER_SUPPLY_EXT_HEALTH_UNDERVOLTAGE)) {
  6016. val->intval = 0;
  6017. return 0;
  6018. }
  6019. /* Set enable=1 only if the AC charger is connected */
  6020. switch (battery->cable_type) {
  6021. case SEC_BATTERY_CABLE_TA:
  6022. case SEC_BATTERY_CABLE_UARTOFF:
  6023. case SEC_BATTERY_CABLE_LAN_HUB:
  6024. case SEC_BATTERY_CABLE_LO_TA:
  6025. case SEC_BATTERY_CABLE_UNKNOWN:
  6026. case SEC_BATTERY_CABLE_PREPARE_TA:
  6027. case SEC_BATTERY_CABLE_9V_ERR:
  6028. case SEC_BATTERY_CABLE_9V_UNKNOWN:
  6029. case SEC_BATTERY_CABLE_9V_TA:
  6030. case SEC_BATTERY_CABLE_12V_TA:
  6031. case SEC_BATTERY_CABLE_HMT_CONNECTED:
  6032. case SEC_BATTERY_CABLE_HMT_CHARGE:
  6033. case SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT:
  6034. case SEC_BATTERY_CABLE_QC20:
  6035. case SEC_BATTERY_CABLE_QC30:
  6036. case SEC_BATTERY_CABLE_TIMEOUT:
  6037. case SEC_BATTERY_CABLE_SMART_OTG:
  6038. case SEC_BATTERY_CABLE_SMART_NOTG:
  6039. case SEC_BATTERY_CABLE_POGO:
  6040. case SEC_BATTERY_CABLE_POGO_9V:
  6041. case SEC_BATTERY_CABLE_PDIC_APDO:
  6042. val->intval = 1;
  6043. break;
  6044. case SEC_BATTERY_CABLE_PDIC:
  6045. case SEC_BATTERY_CABLE_FPDO_DC:
  6046. val->intval = (battery->pd_usb_attached) ? 0:1;
  6047. break;
  6048. default:
  6049. val->intval = 0;
  6050. break;
  6051. }
  6052. if (sec_bat_get_lpmode() && (battery->misc_event & BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE))
  6053. val->intval = 1;
  6054. break;
  6055. case POWER_SUPPLY_PROP_TEMP:
  6056. val->intval = battery->chg_temp;
  6057. break;
  6058. case POWER_SUPPLY_EXT_PROP_MIN ... POWER_SUPPLY_EXT_PROP_MAX:
  6059. switch (ext_psp) {
  6060. case POWER_SUPPLY_EXT_PROP_WATER_DETECT:
  6061. if (battery->misc_event & (BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE |
  6062. BATT_MISC_EVENT_WATER_HICCUP_TYPE)) {
  6063. val->intval = 1;
  6064. pr_info("%s: Water Detect\n", __func__);
  6065. } else {
  6066. val->intval = 0;
  6067. }
  6068. break;
  6069. default:
  6070. return -EINVAL;
  6071. }
  6072. break;
  6073. default:
  6074. return -EINVAL;
  6075. }
  6076. return 0;
  6077. }
  6078. static int sec_wireless_get_property(struct power_supply *psy,
  6079. enum power_supply_property psp,
  6080. union power_supply_propval *val)
  6081. {
  6082. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6083. enum power_supply_ext_property ext_psp = (enum power_supply_ext_property) psp;
  6084. switch ((int)psp) {
  6085. case POWER_SUPPLY_PROP_ONLINE:
  6086. val->intval = is_wireless_all_type(battery->cable_type) ? 1 : 0;
  6087. break;
  6088. case POWER_SUPPLY_PROP_PRESENT:
  6089. val->intval = (battery->pdata->wireless_charger_name) ?
  6090. 1 : 0;
  6091. break;
  6092. case POWER_SUPPLY_EXT_PROP_MIN ... POWER_SUPPLY_EXT_PROP_MAX:
  6093. switch (ext_psp) {
  6094. case POWER_SUPPLY_EXT_PROP_POWER_DESIGN:
  6095. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  6096. if (battery->cable_type == SEC_BATTERY_CABLE_PREPARE_WIRELESS_20)
  6097. val->intval = battery->wc20_power_class;
  6098. else
  6099. #endif
  6100. val->intval = 0;
  6101. break;
  6102. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ERR:
  6103. val->intval = battery->tx_event;
  6104. break;
  6105. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_RETRY_CASE:
  6106. val->intval = battery->tx_retry_case;
  6107. break;
  6108. case POWER_SUPPLY_EXT_PROP_WIRELESS_WC_STATUS:
  6109. val->intval = battery->wc_status;
  6110. break;
  6111. default:
  6112. return -EINVAL;
  6113. }
  6114. break;
  6115. default:
  6116. return -EINVAL;
  6117. }
  6118. return 0;
  6119. }
  6120. static int sec_wireless_set_property(struct power_supply *psy,
  6121. enum power_supply_property psp,
  6122. const union power_supply_propval *val)
  6123. {
  6124. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6125. enum power_supply_ext_property ext_psp = (enum power_supply_ext_property) psp;
  6126. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  6127. union power_supply_propval value = {0, };
  6128. #endif
  6129. switch ((int)psp) {
  6130. case POWER_SUPPLY_PROP_ONLINE:
  6131. if (val->intval != SEC_BATTERY_CABLE_NONE && battery->wc_status == SEC_BATTERY_CABLE_NONE) {
  6132. battery->cisd.data[CISD_DATA_WIRELESS_COUNT]++;
  6133. battery->cisd.data[CISD_DATA_WIRELESS_COUNT_PER_DAY]++;
  6134. }
  6135. pr_info("%s : wireless_type(%s)\n", __func__, sb_get_ct_str(val->intval));
  6136. /* Clear the FOD , AUTH State */
  6137. sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_WIRELESS_FOD);
  6138. battery->wc_status = val->intval;
  6139. #if !defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  6140. if ((battery->ext_event & BATT_EXT_EVENT_CALL) &&
  6141. (battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_PACK ||
  6142. battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_HV_PACK ||
  6143. battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_TX)) {
  6144. battery->wc_rx_phm_mode = true;
  6145. }
  6146. #endif
  6147. if (battery->wc_status == SEC_BATTERY_CABLE_NONE) {
  6148. if (!battery->is_otg_on)
  6149. battery->wpc_vout_level = WIRELESS_VOUT_10V;
  6150. battery->wpc_max_vout_level = WIRELESS_VOUT_12_5V;
  6151. battery->auto_mode = false;
  6152. sec_bat_set_misc_event(battery, 0,
  6153. (BATT_MISC_EVENT_WIRELESS_DET_LEVEL | /* clear wpc_det level status */
  6154. BATT_MISC_EVENT_WIRELESS_AUTH_START |
  6155. BATT_MISC_EVENT_WIRELESS_AUTH_RECVED |
  6156. BATT_MISC_EVENT_WIRELESS_AUTH_FAIL |
  6157. BATT_MISC_EVENT_WIRELESS_AUTH_PASS |
  6158. BATT_MISC_EVENT_WC_JIG_PAD));
  6159. change_sec_voter_pri(battery->input_vote, VOTER_WPC_CUR, VOTE_PRI_0);
  6160. } else if (!is_wireless_fake_type(battery->wc_status)) {
  6161. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_WIRELESS_DET_LEVEL, /* set wpc_det level status */
  6162. BATT_MISC_EVENT_WIRELESS_DET_LEVEL);
  6163. if (battery->wc_status == SEC_BATTERY_CABLE_HV_WIRELESS_20) {
  6164. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_WIRELESS_AUTH_PASS,
  6165. BATT_MISC_EVENT_WIRELESS_AUTH_PASS);
  6166. if (battery->wc_status == SEC_BATTERY_CABLE_HV_WIRELESS_20)
  6167. battery->cisd.cable_data[CISD_CABLE_HV_WC_20]++;
  6168. }
  6169. }
  6170. __pm_stay_awake(battery->cable_ws);
  6171. queue_delayed_work(battery->monitor_wqueue,
  6172. &battery->cable_work, 0);
  6173. if (battery->wc_status == SEC_BATTERY_CABLE_NONE ||
  6174. battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_PACK ||
  6175. battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_HV_PACK ||
  6176. battery->wc_status == SEC_BATTERY_CABLE_WIRELESS_VEHICLE) {
  6177. sec_bat_set_misc_event(battery,
  6178. (battery->wc_status == SEC_BATTERY_CABLE_NONE ?
  6179. 0 : BATT_MISC_EVENT_WIRELESS_BACKPACK_TYPE),
  6180. BATT_MISC_EVENT_WIRELESS_BACKPACK_TYPE);
  6181. }
  6182. break;
  6183. case POWER_SUPPLY_PROP_AUTHENTIC:
  6184. pr_info("%s : tx_type(0x%x)\n", __func__, val->intval);
  6185. count_cisd_pad_data(&battery->cisd, val->intval);
  6186. break;
  6187. case POWER_SUPPLY_PROP_CURRENT_MAX:
  6188. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  6189. pr_info("%s: reset aicl\n", __func__);
  6190. break;
  6191. case POWER_SUPPLY_EXT_PROP_MIN ... POWER_SUPPLY_EXT_PROP_MAX:
  6192. switch (ext_psp) {
  6193. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  6194. case POWER_SUPPLY_EXT_PROP_WIRELESS_ERR:
  6195. if (is_wireless_type(battery->cable_type))
  6196. sec_bat_set_misc_event(battery, val->intval ? BATT_MISC_EVENT_WIRELESS_FOD : 0,
  6197. BATT_MISC_EVENT_WIRELESS_FOD);
  6198. break;
  6199. case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ERR:
  6200. if (val->intval & BATT_TX_EVENT_WIRELESS_TX_MISALIGN) {
  6201. if (battery->tx_event & BATT_TX_EVENT_WIRELESS_TX_RETRY)
  6202. sec_bat_handle_tx_misalign(battery, false);
  6203. else
  6204. sec_bat_handle_tx_misalign(battery, true);
  6205. } else if (val->intval & BATT_TX_EVENT_WIRELESS_TX_OCP) {
  6206. if (battery->tx_event & BATT_TX_EVENT_WIRELESS_TX_RETRY)
  6207. sec_bat_handle_tx_ocp(battery, false);
  6208. else
  6209. sec_bat_handle_tx_ocp(battery, true);
  6210. } else if (val->intval & BATT_TX_EVENT_WIRELESS_TX_AC_MISSING) {
  6211. if (battery->wc_tx_enable)
  6212. sec_wireless_set_tx_enable(battery, false);
  6213. battery->tx_retry_case |= SEC_BAT_TX_RETRY_AC_MISSING;
  6214. /* clear tx all event */
  6215. sec_bat_set_tx_event(battery, 0, BATT_TX_EVENT_WIRELESS_ALL_MASK);
  6216. sec_bat_set_tx_event(battery,
  6217. BATT_TX_EVENT_WIRELESS_TX_RETRY, BATT_TX_EVENT_WIRELESS_TX_RETRY);
  6218. } else if (val->intval & BATT_TX_EVENT_WIRELESS_TX_RETRY) {
  6219. sec_wireless_set_tx_enable(battery, false);
  6220. /* clear tx all event */
  6221. sec_bat_set_tx_event(battery, 0, BATT_TX_EVENT_WIRELESS_ALL_MASK);
  6222. sec_bat_set_tx_event(battery,
  6223. BATT_TX_EVENT_WIRELESS_TX_RETRY, BATT_TX_EVENT_WIRELESS_TX_RETRY);
  6224. } else {
  6225. sec_wireless_set_tx_enable(battery, false);
  6226. sec_bat_set_tx_event(battery, val->intval, val->intval);
  6227. }
  6228. break;
  6229. case POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONNECTED:
  6230. sec_bat_set_tx_event(battery, val->intval ? BATT_TX_EVENT_WIRELESS_RX_CONNECT : 0,
  6231. BATT_TX_EVENT_WIRELESS_RX_CONNECT);
  6232. battery->wc_rx_connected = val->intval;
  6233. battery->wc_tx_phm_mode = false;
  6234. battery->prev_tx_phm_mode = false;
  6235. if (!val->intval) {
  6236. battery->wc_rx_type = NO_DEV;
  6237. battery->tx_switch_mode = TX_SWITCH_MODE_OFF;
  6238. battery->tx_switch_mode_change = false;
  6239. battery->tx_switch_start_soc = 0;
  6240. sec_bat_run_wpc_tx_work(battery, 0);
  6241. }
  6242. break;
  6243. case POWER_SUPPLY_EXT_PROP_WIRELESS_RX_TYPE:
  6244. battery->wc_rx_type = val->intval;
  6245. if (battery->wc_rx_type) {
  6246. if (battery->wc_rx_type == SS_BUDS) {
  6247. battery->cisd.tx_data[SS_PHONE]--;
  6248. }
  6249. battery->cisd.tx_data[battery->wc_rx_type]++;
  6250. }
  6251. pr_info("@Tx_Mode %s : RX_TYPE=%d\n", __func__, battery->wc_rx_type);
  6252. sec_bat_run_wpc_tx_work(battery, 0);
  6253. break;
  6254. case POWER_SUPPLY_EXT_PROP_WIRELESS_AUTH_ADT_STATUS:
  6255. if (val->intval == WIRELESS_AUTH_START)
  6256. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_WIRELESS_AUTH_START, BATT_MISC_EVENT_WIRELESS_AUTH_START);
  6257. else if (val->intval == WIRELESS_AUTH_RECEIVED)
  6258. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_WIRELESS_AUTH_RECVED, BATT_MISC_EVENT_WIRELESS_AUTH_RECVED);
  6259. else if (val->intval == WIRELESS_AUTH_SENT) /* need to be clear this value when data is sent */
  6260. sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_WIRELESS_AUTH_START | BATT_MISC_EVENT_WIRELESS_AUTH_RECVED);
  6261. else if (val->intval == WIRELESS_AUTH_FAIL)
  6262. sec_bat_set_misc_event(battery, BATT_MISC_EVENT_WIRELESS_AUTH_FAIL, BATT_MISC_EVENT_WIRELESS_AUTH_FAIL);
  6263. break;
  6264. case POWER_SUPPLY_EXT_PROP_CALL_EVENT:
  6265. #if !defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  6266. if (val->intval == 1) {
  6267. pr_info("%s : PHM enabled\n", __func__);
  6268. battery->wc_rx_phm_mode = true;
  6269. }
  6270. #endif
  6271. break;
  6272. case POWER_SUPPLY_EXT_PROP_RX_PHM:
  6273. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  6274. pr_info("%s : PHM %d\n", __func__, val->intval);
  6275. battery->wc_rx_pdetb_mode = val->intval;
  6276. #endif
  6277. break;
  6278. case POWER_SUPPLY_EXT_PROP_GEAR_PHM_EVENT:
  6279. battery->wc_tx_phm_mode = val->intval;
  6280. pr_info("@Tx_Mode %s : tx phm status(%d)\n", __func__, val->intval);
  6281. sec_bat_run_wpc_tx_work(battery, 0);
  6282. break;
  6283. case POWER_SUPPLY_EXT_PROP_WIRELESS_RX_POWER:
  6284. pr_info("@MPP @EPP %s : rx power %d\n", __func__, val->intval);
  6285. battery->wc20_rx_power = val->intval;
  6286. __pm_stay_awake(battery->wc20_current_ws);
  6287. queue_delayed_work(battery->monitor_wqueue, &battery->wc20_current_work,
  6288. msecs_to_jiffies(0));
  6289. break;
  6290. case POWER_SUPPLY_EXT_PROP_WIRELESS_MAX_VOUT:
  6291. {
  6292. unsigned int vout;
  6293. pr_info("@MPP @EPP %s: max vout(%s)\n", __func__, sb_vout_ctr_mode_str(val->intval));
  6294. vout = get_wc20_vout(val->intval);
  6295. if (vout) {
  6296. battery->wpc_max_vout_level = val->intval;
  6297. battery->wc20_vout = vout;
  6298. }
  6299. }
  6300. break;
  6301. case POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL:
  6302. sec_wireless_otg_vout_control(battery, val->intval);
  6303. break;
  6304. case POWER_SUPPLY_EXT_PROP_CHARGE_OTG_ICL_CONTROL:
  6305. sec_wireless_otg_icl_control(battery);
  6306. break;
  6307. case POWER_SUPPLY_EXT_PROP_WIRELESS_JIG_PAD:
  6308. if (sec_bat_get_lpmode()) {
  6309. sec_bat_set_misc_event(battery,
  6310. BATT_MISC_EVENT_WC_JIG_PAD, BATT_MISC_EVENT_WC_JIG_PAD);
  6311. }
  6312. break;
  6313. case POWER_SUPPLY_EXT_PROP_MPP_CLOAK:
  6314. pr_info("@MPP %s: set MPP_CLOAK(%d)\n", __func__, val->intval);
  6315. value.intval = val->intval;
  6316. if (val->intval == 1) { // Cloak Enable.
  6317. int icl = get_sec_vote_result(battery->input_vote);
  6318. if (icl > 400) {
  6319. union power_supply_propval value = {0, };
  6320. value.intval = 1;
  6321. psy_do_property(battery->pdata->wireless_charger_name, set,
  6322. POWER_SUPPLY_EXT_PROP_MPP_ICL_CTRL, value);
  6323. break;
  6324. }
  6325. sec_bat_mfc_ldo_cntl(battery, MFC_LDO_OFF);
  6326. sec_vote(battery->chgen_vote, VOTER_WC_TX, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  6327. psy_do_property(battery->pdata->wireless_charger_name, set,
  6328. psp, value);
  6329. sec_vote(battery->input_vote, VOTER_WPC_CUR, true,
  6330. battery->pdata->default_mpp_input_current);
  6331. #if 0
  6332. } else if (val->intval == 0) { // Cloak Disable - send cmd
  6333. psy_do_property(battery->pdata->wireless_charger_name, set,
  6334. psp, value);
  6335. #endif
  6336. } else { // Cloak Disalbe - off
  6337. psy_do_property(battery->pdata->wireless_charger_name, set,
  6338. psp, value);
  6339. sec_vote(battery->chgen_vote, VOTER_WC_TX, false, 0);
  6340. sec_bat_mfc_ldo_cntl(battery, MFC_LDO_ON);
  6341. }
  6342. break;
  6343. case POWER_SUPPLY_EXT_PROP_MPP_ICL_CTRL:
  6344. {
  6345. int icl = get_sec_vote_result(battery->input_vote);
  6346. if (val->intval) {
  6347. int max_icl =
  6348. (battery->pdata->charging_current[battery->cable_type].input_current_limit - battery->wpc_temp_v2_offset);
  6349. icl = (icl + 100) > max_icl ? max_icl : (icl + 100);
  6350. if (icl == max_icl) {
  6351. union power_supply_propval value = {0, };
  6352. value.intval = 0;
  6353. psy_do_property(battery->pdata->wireless_charger_name, set,
  6354. POWER_SUPPLY_EXT_PROP_MPP_INC_INT_CTRL, value);
  6355. }
  6356. pr_info("@MPP %s: Increase ICL(%d)\n", __func__, icl);
  6357. } else {
  6358. int prev_icl = icl;
  6359. icl = (icl - 100) < 100 ? 100 : (icl - 100);
  6360. if ((prev_icl > 400) && (icl <= 400)) {
  6361. union power_supply_propval value = {0, };
  6362. //int cloak_status = 0;
  6363. icl = 400;
  6364. value.intval = 0;
  6365. psy_do_property(battery->pdata->wireless_charger_name, set,
  6366. POWER_SUPPLY_EXT_PROP_MPP_ICL_CTRL, value);
  6367. #if 0
  6368. psy_do_property(battery->pdata->wireless_charger_name, get,
  6369. POWER_SUPPLY_EXT_PROP_MPP_CLOAK, value);
  6370. cloak_status = value.intval;
  6371. if (cloak_status) {
  6372. value.intval = 1;
  6373. psy_do_property("wireless", set,
  6374. POWER_SUPPLY_EXT_PROP_MPP_CLOAK, value);
  6375. }
  6376. #endif
  6377. }
  6378. pr_info("@MPP %s: Decrase ICL(%d)\n", __func__, icl);
  6379. }
  6380. sec_vote(battery->input_vote, VOTER_WPC_CUR, true, icl);
  6381. }
  6382. break;
  6383. #endif
  6384. default:
  6385. return -EINVAL;
  6386. }
  6387. break;
  6388. default:
  6389. return -EINVAL;
  6390. }
  6391. return 0;
  6392. }
  6393. static void sec_wireless_test_print_sgf_data(const char *buf, int count)
  6394. {
  6395. char temp_buf[1024] = {0,};
  6396. int i, size = 0;
  6397. snprintf(temp_buf, sizeof(temp_buf), "0x%x", buf[0]);
  6398. size = sizeof(temp_buf) - strlen(temp_buf);
  6399. for (i = 1; i < count; i++) {
  6400. snprintf(temp_buf+strlen(temp_buf), size, " 0x%x", buf[i]);
  6401. size = sizeof(temp_buf) - strlen(temp_buf);
  6402. }
  6403. pr_info("%s: %s\n", __func__, temp_buf);
  6404. }
  6405. static ssize_t sec_wireless_sgf_show_attr(struct device *dev,
  6406. struct device_attribute *attr, char *buf)
  6407. {
  6408. /*
  6409. struct power_supply *psy = dev_get_drvdata(dev);
  6410. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6411. */
  6412. return -EINVAL;
  6413. }
  6414. static ssize_t sec_wireless_sgf_store_attr(struct device *dev,
  6415. struct device_attribute *attr, const char *buf, size_t count)
  6416. {
  6417. struct power_supply *psy = dev_get_drvdata(dev);
  6418. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6419. union power_supply_propval value = {0, };
  6420. if (count < 4) {
  6421. pr_err("%s: invalid data\n", __func__);
  6422. return -EINVAL;
  6423. }
  6424. psy_do_property(battery->pdata->wireless_charger_name, get,
  6425. POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID, value);
  6426. pr_info("%s!!!(cable_type = %d, tx_id = %d, count = %ld)\n",
  6427. __func__, battery->cable_type, value.intval, count);
  6428. sec_wireless_test_print_sgf_data(buf, (int)count);
  6429. if (is_wireless_type(battery->cable_type) && value.intval == 0xEF) {
  6430. value.strval = buf;
  6431. psy_do_property(battery->pdata->wireless_charger_name, set,
  6432. POWER_SUPPLY_EXT_PROP_WIRELESS_SGF, value);
  6433. }
  6434. return count;
  6435. }
  6436. static DEVICE_ATTR(sgf, 0664, sec_wireless_sgf_show_attr, sec_wireless_sgf_store_attr);
  6437. static int sec_pogo_get_property(struct power_supply *psy,
  6438. enum power_supply_property psp,
  6439. union power_supply_propval *val)
  6440. {
  6441. #if defined(CONFIG_USE_POGO)
  6442. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6443. #endif
  6444. if (psp != POWER_SUPPLY_PROP_ONLINE)
  6445. return -EINVAL;
  6446. val->intval = 0;
  6447. #if defined(CONFIG_USE_POGO)
  6448. val->intval = battery->pogo_status;
  6449. pr_info("%s: POGO online : %d\n", __func__, val->intval);
  6450. #endif
  6451. return 0;
  6452. }
  6453. static int sec_pogo_set_property(struct power_supply *psy,
  6454. enum power_supply_property psp,
  6455. const union power_supply_propval *val)
  6456. {
  6457. #if defined(CONFIG_USE_POGO)
  6458. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6459. #endif
  6460. switch ((int)psp) {
  6461. case POWER_SUPPLY_PROP_ONLINE:
  6462. #if defined(CONFIG_USE_POGO)
  6463. battery->pogo_status = (val->intval) ? 1 : 0;
  6464. battery->pogo_9v = (val->intval > 1) ? true : false;
  6465. if (battery->pogo_status && battery->pdata->pogo_chgin) {
  6466. battery->muic_cable_type = ATTACHED_DEV_POGO_DOCK_MUIC;
  6467. sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE);
  6468. }
  6469. __pm_stay_awake(battery->cable_ws);
  6470. queue_delayed_work(battery->monitor_wqueue,
  6471. &battery->cable_work, 0);
  6472. pr_info("%s: pogo_status : %d\n", __func__, battery->pogo_status);
  6473. #endif
  6474. break;
  6475. default:
  6476. return -EINVAL;
  6477. }
  6478. return 0;
  6479. }
  6480. static int sec_otg_get_property(struct power_supply *psy,
  6481. enum power_supply_property psp,
  6482. union power_supply_propval *val)
  6483. {
  6484. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6485. union power_supply_propval value = {0,};
  6486. int ret = 0;
  6487. value.intval = val->intval;
  6488. ret = psy_do_property(battery->pdata->otg_name, get, psp, value);
  6489. val->intval = value.intval;
  6490. return ret;
  6491. }
  6492. static int sec_otg_set_property(struct power_supply *psy,
  6493. enum power_supply_property psp,
  6494. const union power_supply_propval *val)
  6495. {
  6496. struct sec_battery_info *battery = power_supply_get_drvdata(psy);
  6497. union power_supply_propval value = {0,};
  6498. int ret = 0;
  6499. value.intval = val->intval;
  6500. if ((int)psp == POWER_SUPPLY_PROP_ONLINE) {
  6501. battery->is_otg_on = val->intval;
  6502. if (value.intval && !battery->otg_check) {
  6503. battery->cisd.event_data[EVENT_OTG]++;
  6504. battery->otg_check = true;
  6505. } else if (!value.intval)
  6506. battery->otg_check = false;
  6507. }
  6508. ret = psy_do_property(battery->pdata->otg_name, set, psp, value);
  6509. return ret;
  6510. }
  6511. static void sec_otg_external_power_changed(struct power_supply *psy)
  6512. {
  6513. power_supply_changed(psy);
  6514. }
  6515. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  6516. __visible_for_testing int sec_bat_cable_check(struct sec_battery_info *battery,
  6517. muic_attached_dev_t attached_dev)
  6518. {
  6519. int current_cable_type = -1;
  6520. union power_supply_propval val = {0, };
  6521. #if IS_ENABLED(CONFIG_SBP_FG)
  6522. int batt_present = 1;
  6523. int ret;
  6524. ret = psy_do_property(battery->pdata->charger_name, get, POWER_SUPPLY_PROP_PRESENT, val);
  6525. if (ret >= 0) {
  6526. batt_present = val.intval;
  6527. pr_info("%s: batt_present(%d)\n", __func__, batt_present);
  6528. }
  6529. #endif
  6530. pr_info("[%s]ATTACHED(%d)\n", __func__, attached_dev);
  6531. switch (attached_dev)
  6532. {
  6533. case ATTACHED_DEV_JIG_UART_OFF_MUIC:
  6534. case ATTACHED_DEV_JIG_UART_ON_MUIC:
  6535. battery->is_jig_on = true;
  6536. battery->skip_cisd = true;
  6537. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6538. break;
  6539. case ATTACHED_DEV_SMARTDOCK_MUIC:
  6540. case ATTACHED_DEV_DESKDOCK_MUIC:
  6541. case ATTACHED_DEV_JIG_USB_ON_MUIC:
  6542. case ATTACHED_DEV_JIG_USB_OFF_MUIC:
  6543. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6544. break;
  6545. case ATTACHED_DEV_UNDEFINED_CHARGING_MUIC:
  6546. case ATTACHED_DEV_UNDEFINED_RANGE_MUIC:
  6547. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6548. break;
  6549. case ATTACHED_DEV_HICCUP_MUIC:
  6550. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6551. break;
  6552. case ATTACHED_DEV_OTG_MUIC:
  6553. case ATTACHED_DEV_JIG_UART_OFF_VB_OTG_MUIC:
  6554. case ATTACHED_DEV_HMT_MUIC:
  6555. current_cable_type = SEC_BATTERY_CABLE_OTG;
  6556. break;
  6557. case ATTACHED_DEV_TIMEOUT_OPEN_MUIC:
  6558. case ATTACHED_DEV_RETRY_TIMEOUT_OPEN_MUIC:
  6559. current_cable_type = SEC_BATTERY_CABLE_TIMEOUT;
  6560. break;
  6561. case ATTACHED_DEV_USB_MUIC:
  6562. case ATTACHED_DEV_SMARTDOCK_USB_MUIC:
  6563. case ATTACHED_DEV_UNOFFICIAL_ID_USB_MUIC:
  6564. current_cable_type = SEC_BATTERY_CABLE_USB;
  6565. break;
  6566. case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
  6567. #if defined(CONFIG_LSI_IFPMIC)
  6568. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6569. break;
  6570. #endif
  6571. case ATTACHED_DEV_JIG_UART_ON_VB_MUIC:
  6572. case ATTACHED_DEV_JIG_UART_OFF_VB_FG_MUIC:
  6573. current_cable_type = SEC_BATTERY_CABLE_UARTOFF;
  6574. if (sec_bat_get_facmode())
  6575. current_cable_type = SEC_BATTERY_CABLE_NONE;
  6576. break;
  6577. case ATTACHED_DEV_RDU_TA_MUIC:
  6578. battery->store_mode = true;
  6579. __pm_stay_awake(battery->parse_mode_dt_ws);
  6580. queue_delayed_work(battery->monitor_wqueue, &battery->parse_mode_dt_work, 0);
  6581. current_cable_type = SEC_BATTERY_CABLE_TA;
  6582. break;
  6583. case ATTACHED_DEV_TA_MUIC:
  6584. #if defined(CONFIG_BC12_DEVICE)
  6585. if (battery->pdata->bc12_ifcon_wa && !battery->sink_status.rp_currentlvl) {
  6586. pr_err("%s: IFCON_WA, wait rp_currentlvl\n", __func__);
  6587. sec_vote(battery->input_vote, VOTER_IFCON_WA, true,
  6588. battery->pdata->default_usb_input_current);
  6589. }
  6590. #endif
  6591. case ATTACHED_DEV_CARDOCK_MUIC:
  6592. case ATTACHED_DEV_DESKDOCK_VB_MUIC:
  6593. case ATTACHED_DEV_SMARTDOCK_TA_MUIC:
  6594. case ATTACHED_DEV_UNOFFICIAL_TA_MUIC:
  6595. case ATTACHED_DEV_UNOFFICIAL_ID_TA_MUIC:
  6596. case ATTACHED_DEV_UNOFFICIAL_ID_ANY_MUIC:
  6597. case ATTACHED_DEV_UNSUPPORTED_ID_VB_MUIC:
  6598. case ATTACHED_DEV_AFC_CHARGER_DISABLED_MUIC:
  6599. current_cable_type = SEC_BATTERY_CABLE_TA;
  6600. break;
  6601. case ATTACHED_DEV_AFC_CHARGER_5V_MUIC:
  6602. case ATTACHED_DEV_RETRY_AFC_CHARGER_5V_MUIC:
  6603. case ATTACHED_DEV_QC_CHARGER_5V_MUIC:
  6604. case ATTACHED_DEV_AFC_CHARGER_5V_DUPLI_MUIC:
  6605. current_cable_type = SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT;
  6606. break;
  6607. case ATTACHED_DEV_CDP_MUIC:
  6608. case ATTACHED_DEV_UNOFFICIAL_ID_CDP_MUIC:
  6609. current_cable_type = SEC_BATTERY_CABLE_USB_CDP;
  6610. break;
  6611. case ATTACHED_DEV_USB_LANHUB_MUIC:
  6612. current_cable_type = SEC_BATTERY_CABLE_LAN_HUB;
  6613. break;
  6614. case ATTACHED_DEV_LO_TA_MUIC:
  6615. current_cable_type = SEC_BATTERY_CABLE_LO_TA;
  6616. break;
  6617. case ATTACHED_DEV_CHARGING_CABLE_MUIC:
  6618. current_cable_type = SEC_BATTERY_CABLE_POWER_SHARING;
  6619. break;
  6620. case ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC:
  6621. case ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC:
  6622. current_cable_type = SEC_BATTERY_CABLE_PREPARE_TA;
  6623. break;
  6624. case ATTACHED_DEV_QC_CHARGER_9V_MUIC:
  6625. current_cable_type = SEC_BATTERY_CABLE_9V_TA;
  6626. if ((battery->cable_type == SEC_BATTERY_CABLE_TA) ||
  6627. (battery->cable_type == SEC_BATTERY_CABLE_NONE))
  6628. battery->cisd.cable_data[CISD_CABLE_QC]++;
  6629. break;
  6630. case ATTACHED_DEV_AFC_CHARGER_9V_MUIC:
  6631. case ATTACHED_DEV_RETRY_AFC_CHARGER_9V_MUIC:
  6632. case ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC:
  6633. current_cable_type = SEC_BATTERY_CABLE_9V_TA;
  6634. if ((battery->cable_type == SEC_BATTERY_CABLE_TA) ||
  6635. (battery->cable_type == SEC_BATTERY_CABLE_NONE))
  6636. battery->cisd.cable_data[CISD_CABLE_AFC]++;
  6637. break;
  6638. #if defined(CONFIG_MUIC_HV_12V)
  6639. case ATTACHED_DEV_AFC_CHARGER_12V_MUIC:
  6640. case ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC:
  6641. current_cable_type = SEC_BATTERY_CABLE_12V_TA;
  6642. break;
  6643. #endif
  6644. case ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC:
  6645. case ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC:
  6646. battery->cisd.cable_data[CISD_CABLE_AFC_FAIL]++;
  6647. break;
  6648. case ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC:
  6649. battery->cisd.cable_data[CISD_CABLE_QC_FAIL]++;
  6650. break;
  6651. case ATTACHED_DEV_HV_ID_ERR_UNDEFINED_MUIC:
  6652. case ATTACHED_DEV_HV_ID_ERR_UNSUPPORTED_MUIC:
  6653. case ATTACHED_DEV_HV_ID_ERR_SUPPORTED_MUIC:
  6654. current_cable_type = SEC_BATTERY_CABLE_9V_UNKNOWN;
  6655. break;
  6656. case ATTACHED_DEV_VZW_INCOMPATIBLE_MUIC:
  6657. current_cable_type = SEC_BATTERY_CABLE_UNKNOWN;
  6658. break;
  6659. default:
  6660. pr_err("%s: invalid type for charger:%d\n",
  6661. __func__, attached_dev);
  6662. break;
  6663. }
  6664. #if IS_ENABLED(CONFIG_SBP_FG)
  6665. switch (attached_dev) {
  6666. case ATTACHED_DEV_JIG_UART_OFF_MUIC:
  6667. case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
  6668. case ATTACHED_DEV_JIG_UART_OFF_VB_FG_MUIC:
  6669. if (batt_present == 0)
  6670. psy_do_property(battery->pdata->fuelgauge_name, set, POWER_SUPPLY_EXT_PROP_FAKE_SOC, val);
  6671. break;
  6672. default:
  6673. break;
  6674. }
  6675. #endif
  6676. #if IS_ENABLED(CONFIG_DUAL_BATTERY) && IS_ENABLED(CONFIG_LIMITER_S2ASL01) && defined(CONFIG_SEC_FACTORY)
  6677. if (!sec_bat_check_by_gpio(battery)) {
  6678. if (attached_dev == ATTACHED_DEV_JIG_UART_OFF_MUIC ||
  6679. attached_dev == ATTACHED_DEV_JIG_USB_ON_MUIC) {
  6680. pr_info("%s No Main or Sub Battery, 301k or 523k with FACTORY\n", __func__);
  6681. gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 1);
  6682. }
  6683. } else {
  6684. if (attached_dev == ATTACHED_DEV_JIG_UART_OFF_MUIC ||
  6685. attached_dev == ATTACHED_DEV_JIG_UART_ON_MUIC ||
  6686. attached_dev == ATTACHED_DEV_JIG_USB_ON_MUIC) {
  6687. pr_info("%s 301k or 523k or 619k with FACTORY\n", __func__);
  6688. gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 0);
  6689. }
  6690. }
  6691. #endif
  6692. if (battery->is_jig_on && !battery->pdata->support_fgsrc_change)
  6693. psy_do_property(battery->pdata->fuelgauge_name, set,
  6694. POWER_SUPPLY_PROP_ENERGY_NOW, val);
  6695. #if defined(CONFIG_LSI_IFPMIC)
  6696. switch (attached_dev) {
  6697. case ATTACHED_DEV_JIG_USB_ON_MUIC:
  6698. case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
  6699. val.intval = attached_dev;
  6700. if (!battery->factory_mode_boot_on)
  6701. factory_mode = 1;
  6702. psy_do_property(battery->pdata->charger_name, set,
  6703. POWER_SUPPLY_PROP_ENERGY_NOW, val);
  6704. pr_err("%s : FACTORY MODE TEST! (%d, %d)\n", __func__, val.intval,
  6705. battery->factory_mode_boot_on);
  6706. break;
  6707. #if IS_ENABLED(CONFIG_CHARGER_S2MF301)
  6708. case ATTACHED_DEV_JIG_USB_OFF_MUIC:
  6709. val.intval = attached_dev;
  6710. if (!battery->factory_mode_boot_on)
  6711. factory_mode = 0;
  6712. psy_do_property(battery->pdata->charger_name, set,
  6713. POWER_SUPPLY_PROP_ENERGY_NOW, val);
  6714. pr_err("%s : FACTORY MODE TEST! (%d, %d)\n", __func__, val.intval,
  6715. battery->factory_mode_boot_on);
  6716. break;
  6717. #endif
  6718. #if defined(CONFIG_SIDO_OVP)
  6719. case ATTACHED_DEV_JIG_UART_ON_MUIC:
  6720. #endif
  6721. case ATTACHED_DEV_JIG_UART_ON_VB_MUIC:
  6722. val.intval = 0;
  6723. if (!battery->factory_mode_boot_on)
  6724. factory_mode = 0;
  6725. psy_do_property(battery->pdata->charger_name, set,
  6726. POWER_SUPPLY_PROP_ENERGY_NOW, val);
  6727. pr_err("%s : FACTORY MODE TEST! (%d, %d)\n", __func__, val.intval,
  6728. battery->factory_mode_boot_on);
  6729. break;
  6730. case ATTACHED_DEV_JIG_UART_OFF_MUIC:
  6731. psy_do_property(battery->pdata->charger_name, set,
  6732. POWER_SUPPLY_EXT_PROP_ENABLE_HW_FACTORY_MODE, val);
  6733. pr_err("%s : HW FACTORY MODE ENABLE TEST! (%d)\n", __func__, val.intval);
  6734. break;
  6735. default:
  6736. break;
  6737. }
  6738. #endif
  6739. return current_cable_type;
  6740. }
  6741. EXPORT_SYMBOL_KUNIT(sec_bat_cable_check);
  6742. #endif
  6743. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  6744. __visible_for_testing void sec_bat_set_rp_current(struct sec_battery_info *battery, int cable_type)
  6745. {
  6746. int icl = 0;
  6747. int fcc = 0;
  6748. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE) && defined(CONFIG_SEC_FACTORY)
  6749. sec_bat_usb_factory_set_vote(battery, false);
  6750. #endif
  6751. switch (battery->sink_status.rp_currentlvl) {
  6752. case RP_CURRENT_ABNORMAL:
  6753. icl = battery->pdata->rp_current_abnormal_rp3;
  6754. fcc = battery->pdata->rp_current_abnormal_rp3;
  6755. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  6756. break;
  6757. case RP_CURRENT_LEVEL3:
  6758. #if defined(CONFIG_PD_CHARGER_HV_DISABLE)
  6759. if (battery->current_event & SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE) {
  6760. #else
  6761. if (battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE) {
  6762. #endif
  6763. icl = battery->pdata->default_input_current;
  6764. fcc = battery->pdata->default_charging_current;
  6765. } else {
  6766. if (battery->store_mode) {
  6767. icl = battery->pdata->rp_current_rdu_rp3;
  6768. fcc = battery->pdata->max_charging_current;
  6769. } else {
  6770. icl = battery->pdata->rp_current_rp3;
  6771. fcc = battery->pdata->max_charging_current;
  6772. }
  6773. }
  6774. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  6775. break;
  6776. case RP_CURRENT_LEVEL2:
  6777. icl = battery->pdata->rp_current_rp2;
  6778. fcc = battery->pdata->rp_current_rp2;
  6779. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  6780. break;
  6781. case RP_CURRENT_LEVEL_DEFAULT:
  6782. if (cable_type == SEC_BATTERY_CABLE_USB) {
  6783. if (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUPER) {
  6784. icl = USB_CURRENT_SUPER_SPEED;
  6785. fcc = USB_CURRENT_SUPER_SPEED;
  6786. } else {
  6787. icl = battery->pdata->default_usb_input_current;
  6788. fcc = battery->pdata->default_usb_charging_current;
  6789. }
  6790. } else if (cable_type == SEC_BATTERY_CABLE_TA) {
  6791. icl = battery->pdata->default_input_current;
  6792. fcc = battery->pdata->default_charging_current;
  6793. } else {
  6794. icl = battery->pdata->default_usb_input_current;
  6795. fcc = battery->pdata->default_usb_charging_current;
  6796. pr_err("%s: wrong cable type(%d)\n", __func__, cable_type);
  6797. }
  6798. break;
  6799. default:
  6800. icl = battery->pdata->default_usb_input_current;
  6801. fcc = battery->pdata->default_usb_charging_current;
  6802. pr_err("%s: undefined rp_currentlvl(%d)\n", __func__, battery->sink_status.rp_currentlvl);
  6803. break;
  6804. }
  6805. sec_bat_change_default_current(battery, cable_type, icl, fcc);
  6806. pr_info("%s:(%d)\n", __func__, battery->sink_status.rp_currentlvl);
  6807. battery->max_charge_power = 0;
  6808. sec_bat_check_input_voltage(battery, cable_type);
  6809. #if defined(CONFIG_BC12_DEVICE)
  6810. if (battery->pdata->bc12_ifcon_wa) {
  6811. if (battery->sink_status.rp_currentlvl)
  6812. sec_vote(battery->input_vote, VOTER_IFCON_WA, false, 0);
  6813. else
  6814. pr_err("%s: IFCON_WA keeps 500mA ICL, rp_currentlvl none\n", __func__);
  6815. }
  6816. #endif
  6817. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  6818. }
  6819. EXPORT_SYMBOL_KUNIT(sec_bat_set_rp_current);
  6820. static int usb_typec_handle_id_attach(struct sec_battery_info *battery, PD_NOTI_ATTACH_TYPEDEF *pdata, int *cable_type, const char **cmd)
  6821. {
  6822. struct pdic_notifier_struct *pd_noti = pdata->pd;
  6823. SEC_PD_SINK_STATUS *psink_status = NULL;
  6824. if (pd_noti)
  6825. psink_status = &pd_noti->sink_status;
  6826. switch (pdata->attach) {
  6827. case MUIC_NOTIFY_CMD_DETACH:
  6828. case MUIC_NOTIFY_CMD_LOGICALLY_DETACH:
  6829. *cmd = "DETACH";
  6830. battery->is_jig_on = false;
  6831. battery->pd_usb_attached = false;
  6832. *cable_type = SEC_BATTERY_CABLE_NONE;
  6833. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  6834. battery->sink_status.rp_currentlvl = RP_CURRENT_LEVEL_NONE;
  6835. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  6836. sec_bat_usb_factory_clear(battery);
  6837. #endif
  6838. break;
  6839. case MUIC_NOTIFY_CMD_ATTACH:
  6840. case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH:
  6841. /* Skip notify from MUIC if PDIC is attached already */
  6842. if (is_pd_wire_type(battery->wire_status) || battery->init_src_cap) {
  6843. if (sec_bat_get_lpmode() ||
  6844. (battery->usb_conn_status == USB_CONN_NORMAL &&
  6845. !(battery->misc_event & BATT_MISC_EVENT_TEMP_HICCUP_TYPE))) {
  6846. return -1; /* skip usb_typec_handle_after_id() */
  6847. }
  6848. }
  6849. *cmd = "ATTACH";
  6850. battery->muic_cable_type = pdata->cable_type;
  6851. *cable_type = sec_bat_cable_check(battery, battery->muic_cable_type);
  6852. if (battery->cable_type != *cable_type &&
  6853. battery->sink_status.rp_currentlvl >= RP_CURRENT_LEVEL_DEFAULT &&
  6854. (*cable_type == SEC_BATTERY_CABLE_USB || *cable_type == SEC_BATTERY_CABLE_TA)) {
  6855. sec_bat_set_rp_current(battery, *cable_type);
  6856. } else if (psink_status &&
  6857. pd_noti->event == PDIC_NOTIFY_EVENT_PDIC_ATTACH &&
  6858. psink_status->rp_currentlvl >= RP_CURRENT_LEVEL_DEFAULT &&
  6859. (*cable_type == SEC_BATTERY_CABLE_USB || *cable_type == SEC_BATTERY_CABLE_TA)) {
  6860. battery->sink_status.rp_currentlvl = psink_status->rp_currentlvl;
  6861. sec_bat_set_rp_current(battery, *cable_type);
  6862. }
  6863. break;
  6864. default:
  6865. *cmd = "ERROR";
  6866. *cable_type = -1;
  6867. battery->muic_cable_type = pdata->cable_type;
  6868. break;
  6869. }
  6870. battery->pdic_attach = false;
  6871. battery->pdic_ps_rdy = false;
  6872. battery->init_src_cap = false;
  6873. if (battery->muic_cable_type == ATTACHED_DEV_QC_CHARGER_9V_MUIC ||
  6874. battery->muic_cable_type == ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC)
  6875. battery->hv_chg_name = "QC";
  6876. else if (battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_9V_MUIC ||
  6877. battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC ||
  6878. battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC ||
  6879. battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC)
  6880. battery->hv_chg_name = "AFC";
  6881. #if defined(CONFIG_MUIC_HV_12V)
  6882. else if (battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_12V_MUIC ||
  6883. battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC)
  6884. battery->hv_chg_name = "12V";
  6885. #endif
  6886. else
  6887. battery->hv_chg_name = "NONE";
  6888. dev_info(battery->dev, "%s: cable_type:%d, muic_cable_type:%d\n",
  6889. __func__, *cable_type, battery->muic_cable_type);
  6890. return 0;
  6891. }
  6892. static void sb_disable_reverse_boost(struct sec_battery_info *battery)
  6893. {
  6894. union power_supply_propval value = { 0, };
  6895. if (battery->pdata->d2d_check_type == SB_D2D_SNKONLY)
  6896. return;
  6897. psy_do_property(battery->pdata->charger_name, get,
  6898. POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VOLTAGE, value);
  6899. battery->vpdo_src_boost = value.intval ? true : false;
  6900. if (battery->vpdo_src_boost) {
  6901. /* turn off dc reverse boost */
  6902. value.intval = 0;
  6903. psy_do_property(battery->pdata->charger_name, set,
  6904. POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VOLTAGE, value);
  6905. }
  6906. }
  6907. static int usb_typec_handle_id_power_status(struct sec_battery_info *battery,
  6908. PD_NOTI_POWER_STATUS_TYPEDEF *pdata, int *cable_type, const char **cmd)
  6909. {
  6910. int pdata_fpdo_max_power = battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE ?
  6911. battery->pdata->nv_charge_power : battery->pdata->pd_charging_charge_power;
  6912. int pdata_apdo_max_power = battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE ?
  6913. battery->pdata->nv_charge_power : battery->pdata->max_charging_charge_power;
  6914. int max_power = 0, apdo_max_power = 0, fpdo_max_power = 0;
  6915. int i = 0, current_pdo = 0, num_pd_list = 0;
  6916. bool bPdIndexChanged = false, bPrintPDlog = true;
  6917. union power_supply_propval value = {0, };
  6918. struct pdic_notifier_struct *pd_noti = pdata->pd;
  6919. SEC_PD_SINK_STATUS *psink_status = NULL;
  6920. if (pd_noti)
  6921. psink_status = &pd_noti->sink_status;
  6922. if (!psink_status) {
  6923. dev_err(battery->dev, "%s: sink_status is NULL\n", __func__);
  6924. return -1; /* skip usb_typec_handle_after_id() */
  6925. }
  6926. dev_info(battery->dev, "%s: pd_event(%d)\n", __func__, pd_noti->event);
  6927. #if IS_ENABLED(CONFIG_HICCUP_CHARGER)
  6928. if (pd_noti->event != PDIC_NOTIFY_EVENT_DETACH &&
  6929. pd_noti->event != PDIC_NOTIFY_EVENT_PD_PRSWAP_SNKTOSRC) {
  6930. if (!sec_bat_get_lpmode() && (battery->usb_conn_status ||
  6931. (battery->misc_event & BATT_MISC_EVENT_TEMP_HICCUP_TYPE))) {
  6932. return 0;
  6933. }
  6934. }
  6935. #endif
  6936. switch (pd_noti->event) {
  6937. case PDIC_NOTIFY_EVENT_DETACH:
  6938. dev_info(battery->dev, "%s: skip pd operation - attach(%d)\n", __func__, pdata->attach);
  6939. battery->pdic_attach = false;
  6940. battery->pdic_ps_rdy = false;
  6941. battery->init_src_cap = false;
  6942. battery->hv_pdo = false;
  6943. battery->pd_list.now_isApdo = false;
  6944. return -1; /* usb_typec_handle_after_id() */
  6945. break;
  6946. case PDIC_NOTIFY_EVENT_PDIC_ATTACH:
  6947. battery->sink_status.rp_currentlvl = psink_status->rp_currentlvl;
  6948. dev_info(battery->dev, "%s: battery->rp_currentlvl(%d)\n",
  6949. __func__, battery->sink_status.rp_currentlvl);
  6950. if (battery->pdata->support_usb_conn_check &&
  6951. battery->wire_status == SEC_BATTERY_CABLE_NONE && !delayed_work_pending(&battery->usb_conn_check_work) &&
  6952. !battery->run_usb_conn_check) {
  6953. #if !defined(CONFIG_SEC_FACTORY)
  6954. battery->run_usb_conn_check = true;
  6955. battery->usb_conn_check_cnt = 0;
  6956. __pm_stay_awake(battery->usb_conn_check_ws);
  6957. queue_delayed_work(battery->monitor_wqueue, &battery->usb_conn_check_work, msecs_to_jiffies(1000));
  6958. #endif
  6959. } else if (battery->wire_status == SEC_BATTERY_CABLE_USB || battery->wire_status == SEC_BATTERY_CABLE_TA) {
  6960. *cable_type = battery->wire_status;
  6961. battery->chg_limit = false;
  6962. battery->lrp_limit = false;
  6963. battery->lrp_step = LRP_NONE;
  6964. sec_bat_set_rp_current(battery, *cable_type);
  6965. return 0;
  6966. }
  6967. return -1; /* skip usb_typec_handle_after_id() */
  6968. break;
  6969. case PDIC_NOTIFY_EVENT_PD_SOURCE:
  6970. case PDIC_NOTIFY_EVENT_PD_SINK:
  6971. break;
  6972. case PDIC_NOTIFY_EVENT_PD_SINK_CAP:
  6973. battery->update_pd_list = true;
  6974. break;
  6975. case PDIC_NOTIFY_EVENT_PD_PRSWAP_SNKTOSRC:
  6976. *cmd = "PD_PRWAP";
  6977. dev_info(battery->dev, "%s: PRSWAP_SNKTOSRC(%d)\n", __func__, pdata->attach);
  6978. *cable_type = SEC_BATTERY_CABLE_NONE;
  6979. battery->pdic_attach = false;
  6980. battery->pdic_ps_rdy = false;
  6981. battery->init_src_cap = false;
  6982. battery->hv_pdo = false;
  6983. if (battery->pdata->d2d_check_type == SB_D2D_NONE)
  6984. return 0;
  6985. /* for 15w d2d snk to src prswap */
  6986. if (battery->pdata->d2d_check_type == SB_D2D_SNKONLY) {
  6987. value.intval = 1;
  6988. psy_do_property(battery->pdata->otg_name, set,
  6989. POWER_SUPPLY_PROP_VOLTAGE_MAX, value);
  6990. }
  6991. if (battery->d2d_auth == D2D_AUTH_SNK)
  6992. battery->d2d_auth = D2D_AUTH_SRC;
  6993. return 0;
  6994. case PDIC_NOTIFY_EVENT_PD_PRSWAP_SRCTOSNK:
  6995. *cmd = "PD_PRWAP";
  6996. dev_info(battery->dev, "%s: PRSWAP_SRCTOSNK(%d)\n", __func__, pdata->attach);
  6997. if (battery->d2d_auth == D2D_AUTH_SRC) {
  6998. if (battery->pdata->d2d_check_type == SB_D2D_SRCSNK) {
  6999. sb_disable_reverse_boost(battery);
  7000. battery->vpdo_ocp = false;
  7001. }
  7002. battery->d2d_auth = D2D_AUTH_SNK;
  7003. value.intval = 0;
  7004. psy_do_property(battery->pdata->otg_name, set,
  7005. POWER_SUPPLY_PROP_VOLTAGE_MAX, value);
  7006. }
  7007. battery->vpdo_auth_stat = AUTH_NONE;
  7008. battery->hp_d2d = HP_D2D_NONE;
  7009. sec_vote(battery->chgen_vote, VOTER_D2D_WIRE, false, 0);
  7010. return 0;
  7011. default:
  7012. break;
  7013. }
  7014. *cmd = "PD_ATTACH";
  7015. battery->init_src_cap = false;
  7016. if (battery->update_pd_list) {
  7017. pr_info("%s : update_pd_list(%d)\n", __func__, battery->update_pd_list);
  7018. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  7019. #if defined(CONFIG_STEP_CHARGING)
  7020. sec_bat_reset_step_charging(battery);
  7021. if (is_pd_apdo_wire_type(battery->cable_type))
  7022. sec_bat_check_dc_step_charging(battery);
  7023. #endif
  7024. value.intval = 0;
  7025. psy_do_property(battery->pdata->charger_name, set,
  7026. POWER_SUPPLY_EXT_PROP_DIRECT_CLEAR_ERR, value);
  7027. #endif
  7028. battery->pdic_attach = false;
  7029. }
  7030. if (!battery->pdic_attach) {
  7031. battery->sink_status = *psink_status;
  7032. bPdIndexChanged = true;
  7033. } else {
  7034. dev_info(battery->dev, "%s: sel_pdo(%d -> %d), cur_pdo(%d -> %d)\n",
  7035. __func__, battery->sink_status.selected_pdo_num, psink_status->selected_pdo_num,
  7036. battery->sink_status.current_pdo_num, psink_status->current_pdo_num);
  7037. if (battery->sink_status.current_pdo_num != psink_status->current_pdo_num)
  7038. bPdIndexChanged = true;
  7039. battery->sink_status.selected_pdo_num = psink_status->selected_pdo_num;
  7040. battery->sink_status.current_pdo_num = psink_status->current_pdo_num;
  7041. battery->pdic_ps_rdy = true;
  7042. sec_bat_get_input_current_in_power_list(battery);
  7043. sec_bat_get_charging_current_in_power_list(battery);
  7044. sec_vote(battery->chgen_vote, VOTER_SRCCAP_TRANSIT, false, 0);
  7045. battery->srccap_transit = false;
  7046. battery->srccap_transit_cnt = 0;
  7047. }
  7048. current_pdo = battery->sink_status.current_pdo_num;
  7049. if (battery->sink_status.power_list[current_pdo].max_voltage > SEC_INPUT_VOLTAGE_5V)
  7050. battery->hv_pdo = true;
  7051. else
  7052. battery->hv_pdo = false;
  7053. dev_info(battery->dev, "%s: battery->pdic_ps_rdy(%d), hv_pdo(%d)\n",
  7054. __func__, battery->pdic_ps_rdy, battery->hv_pdo);
  7055. if (battery->sink_status.has_apdo) {
  7056. *cable_type = SEC_BATTERY_CABLE_PDIC_APDO;
  7057. if (battery->sink_status.power_list[current_pdo].pdo_type == APDO_TYPE) {
  7058. battery->hv_chg_name = "PDIC_APDO";
  7059. battery->pd_list.now_isApdo = true;
  7060. } else {
  7061. battery->hv_chg_name = "PDIC_FIXED";
  7062. battery->pd_list.now_isApdo = false;
  7063. }
  7064. if (battery->pdic_attach)
  7065. bPrintPDlog = false;
  7066. } else {
  7067. *cable_type = SEC_BATTERY_CABLE_PDIC;
  7068. if (battery->sink_status.power_list[current_pdo].pdo_type == VPDO_TYPE) {
  7069. battery->hv_chg_name = "PDIC_VPDO";
  7070. if ((battery->pdata->d2d_check_type == SB_D2D_SRCSNK) &&
  7071. (battery->d2d_auth == D2D_AUTH_SNK)) {
  7072. /* preset auth vpdo for pr swap case (snk to src) */
  7073. sec_pd_vpdo_auth(AUTH_HIGH_PWR, SB_D2D_SRCSNK);
  7074. }
  7075. } else
  7076. battery->hv_chg_name = "PDIC_FIXED";
  7077. battery->pd_list.now_isApdo = false;
  7078. }
  7079. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  7080. battery->input_voltage = battery->sink_status.power_list[current_pdo].max_voltage;
  7081. dev_info(battery->dev, "%s: available pdo : %d, current pdo : %d\n", __func__,
  7082. battery->sink_status.available_pdo_num, current_pdo);
  7083. for (i = 1; i <= battery->sink_status.available_pdo_num; i++) {
  7084. bool isUpdated = false;
  7085. int temp_power = 0;
  7086. int pdo_type = battery->sink_status.power_list[i].pdo_type;
  7087. int max_volt = battery->sink_status.power_list[i].max_voltage;
  7088. int min_volt = battery->sink_status.power_list[i].min_voltage;
  7089. int max_curr = battery->sink_status.power_list[i].max_current;
  7090. bool isAccept = battery->sink_status.power_list[i].accept;
  7091. if ((pdo_type == APDO_TYPE) &&
  7092. (sec_pd_get_apdo_prog_volt(pdo_type, max_volt) > battery->pdata->apdo_max_volt))
  7093. temp_power = battery->pdata->apdo_max_volt * max_curr; /* Protect to show sfc2.0 with 45w ta + 3a cable */
  7094. else
  7095. temp_power = sec_pd_get_max_power(pdo_type, min_volt, max_volt, max_curr);
  7096. if ((pdo_type != APDO_TYPE) && isAccept &&
  7097. (max_volt > battery->pdata->max_input_voltage)) {
  7098. battery->sink_status.power_list[i].accept = false;
  7099. isAccept = battery->sink_status.power_list[i].accept;
  7100. }
  7101. if (!(battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE) &&
  7102. !battery->sink_status.has_apdo &&
  7103. pdo_type == FPDO_TYPE &&
  7104. battery->pdata->support_fpdo_dc &&
  7105. max_volt == 9000 &&
  7106. (max_curr >= 3000 || battery->is_fpdo_dc)) {
  7107. dev_info(battery->dev, "%s: cable_type update to FPDO_DC\n", __func__);
  7108. if (!battery->is_fpdo_dc)
  7109. battery->cisd.cable_data[CISD_CABLE_FPDO_DC]++;
  7110. battery->is_fpdo_dc = true;
  7111. *cable_type = SEC_BATTERY_CABLE_FPDO_DC;
  7112. pdata_fpdo_max_power = battery->pdata->fpdo_dc_charge_power;
  7113. pr_info("%s: FPDO_DC, refresh charging source.\n", __func__);
  7114. psy_do_property(battery->pdata->charger_name, set,
  7115. POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
  7116. #if defined(CONFIG_STEP_CHARGING)
  7117. sec_bat_check_step_charging(battery);
  7118. #endif
  7119. }
  7120. if (bPrintPDlog)
  7121. pr_info("%s:%spower_list[%d,%s,%s], maxVol:%d, minVol:%d, maxCur:%d, power:%d\n",
  7122. __func__, i == current_pdo ? "**" : " ",
  7123. i, sec_pd_pdo_type_str(pdo_type), isAccept ? "O" : "X",
  7124. max_volt, min_volt, max_curr, temp_power);
  7125. if (!battery->pdic_attach && isAccept) {
  7126. if (pdo_type == APDO_TYPE) {
  7127. if (temp_power > apdo_max_power) {
  7128. max_power = temp_power;
  7129. apdo_max_power = max_power;
  7130. }
  7131. } else {
  7132. if (temp_power > fpdo_max_power) {
  7133. max_power = temp_power;
  7134. fpdo_max_power = max_power;
  7135. }
  7136. }
  7137. }
  7138. if (!isAccept)
  7139. continue;
  7140. /* no change apdo */
  7141. if (pdo_type == APDO_TYPE) {
  7142. num_pd_list++;
  7143. continue;
  7144. }
  7145. if (temp_power > (pdata_fpdo_max_power * 1000)) {
  7146. fpdo_max_power = pdata_fpdo_max_power * 1000;
  7147. max_curr = mA_by_mWmV(pdata_fpdo_max_power, max_volt);
  7148. isUpdated = true;
  7149. }
  7150. if (max_curr > battery->pdata->max_input_current) {
  7151. max_curr = battery->pdata->max_input_current;
  7152. isUpdated = true;
  7153. }
  7154. if (isUpdated) {
  7155. battery->sink_status.power_list[i].max_current = max_curr;
  7156. if (bPrintPDlog)
  7157. pr_info("%s:->updated [%d,%s,%s], maxVol:%d, minVol:%d, maxCur:%d, power:%d\n",
  7158. __func__, i, sec_pd_pdo_type_str(pdo_type),
  7159. isAccept ? "O" : "X", battery->sink_status.power_list[i].max_voltage,
  7160. battery->sink_status.power_list[i].min_voltage,
  7161. battery->sink_status.power_list[i].max_current,
  7162. sec_pd_get_max_power(pdo_type, min_volt, max_volt, max_curr));
  7163. }
  7164. num_pd_list++;
  7165. }
  7166. if (!battery->pdic_attach) {
  7167. if (battery->sink_status.has_apdo)
  7168. battery->max_charge_power = (apdo_max_power / 1000) > pdata_apdo_max_power ?
  7169. pdata_apdo_max_power : (apdo_max_power / 1000);
  7170. else
  7171. battery->max_charge_power = (fpdo_max_power / 1000) > pdata_fpdo_max_power ?
  7172. pdata_fpdo_max_power : (fpdo_max_power / 1000);
  7173. battery->pd_max_charge_power = battery->max_charge_power;
  7174. pr_info("%s: pd_max_charge_power(%d,%d,%d) = %d\n",
  7175. __func__, max_power, apdo_max_power, fpdo_max_power, battery->pd_max_charge_power * 1000);
  7176. battery->pd_rated_power = max_power / 1000 / 1000; /* save as W */
  7177. count_cisd_power_data(&battery->cisd, max_power / 1000);
  7178. if (battery->cable_type == SEC_BATTERY_CABLE_NONE) {
  7179. if (battery->pd_max_charge_power > HV_CHARGER_STATUS_STANDARD1)
  7180. battery->cisd.cable_data[CISD_CABLE_PD_HIGH]++;
  7181. else
  7182. battery->cisd.cable_data[CISD_CABLE_PD]++;
  7183. }
  7184. #if defined(CONFIG_SUPPORT_HV_CTRL) && !defined(CONFIG_SEC_FACTORY)
  7185. if (battery->pdata->boosting_voltage_aicl &&
  7186. (battery->misc_event & BATT_MISC_EVENT_HV_BY_AICL)) {
  7187. if (sb_ct_has_9v(battery, battery->cable_type)) {
  7188. sec_vote(battery->input_vote, VOTER_AICL, false, 0);
  7189. sec_vote(battery->iv_vote, VOTER_AICL, true, SEC_INPUT_VOLTAGE_9V);
  7190. } else {
  7191. sec_vote(battery->iv_vote, VOTER_AICL, false, 0);
  7192. }
  7193. }
  7194. #endif
  7195. battery->pd_list.max_pd_count = num_pd_list;
  7196. pr_info("%s: total num_pd_list: %d\n", __func__, battery->pd_list.max_pd_count);
  7197. if (battery->pd_list.max_pd_count <= 0
  7198. || battery->pd_list.max_pd_count > MAX_PDO_NUM)
  7199. return -1; /* skip usb_typec_handle_after_id() */
  7200. }
  7201. battery->pdic_attach = true;
  7202. #if defined(CONFIG_BC12_DEVICE)
  7203. battery->pdic_ps_rdy = true;
  7204. #endif
  7205. if (is_pd_wire_type(battery->cable_type) && bPdIndexChanged) {
  7206. if (battery->update_pd_list || ((battery->d2d_auth == D2D_AUTH_SNK) &&
  7207. (battery->sink_status.power_list[current_pdo].pdo_type == FPDO_TYPE)) ||
  7208. (battery->sink_status.has_apdo && (battery->current_event & SEC_BAT_CURRENT_EVENT_DC_ERR)) ||
  7209. (!battery->sink_status.has_apdo && (battery->sink_status.selected_pdo_num == -1))) {
  7210. int curr_volt = battery->sink_status.power_list[current_pdo].max_voltage;
  7211. int vote_volt = get_sec_vote_result(battery->iv_vote);
  7212. /* request vpdo for 15w d2d */
  7213. sec_vote(battery->iv_vote, VOTER_CABLE, true,
  7214. sec_bat_check_pd_iv(&battery->sink_status));
  7215. /* current pdo voltage and voter voltage are different, 9v should be select */
  7216. if (battery->update_pd_list || ((curr_volt != vote_volt) &&
  7217. (sec_bat_check_pd_iv(&battery->sink_status) == vote_volt))) {
  7218. pr_info("%s: update_pd_list: %d\n", __func__, battery->update_pd_list);
  7219. sec_vote_refresh(battery->iv_vote);
  7220. }
  7221. battery->update_pd_list = false;
  7222. }
  7223. /* Check VOTER_SIOP to set up current based on chagned index */
  7224. __pm_stay_awake(battery->siop_level_ws);
  7225. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  7226. #if !defined(CONFIG_SEC_FACTORY)
  7227. sec_bat_check_lrp_temp(battery,
  7228. battery->cable_type, battery->wire_status, battery->siop_level, battery->lcd_status);
  7229. #endif
  7230. }
  7231. if (is_pd_apdo_wire_type(battery->wire_status) && !bPdIndexChanged &&
  7232. (battery->sink_status.power_list[current_pdo].pdo_type == APDO_TYPE)) {
  7233. battery->wire_status = *cable_type;
  7234. return -1; /* skip usb_typec_handle_after_id() */
  7235. }
  7236. store_battery_log("CURR_PDO:PDO(%d/%d),Max_V(%d),Min_V(%d),Max_C(%d),PD_MCP(%d),PD_RP(%d),",
  7237. battery->sink_status.current_pdo_num,
  7238. battery->sink_status.available_pdo_num,
  7239. battery->sink_status.power_list[current_pdo].max_voltage,
  7240. battery->sink_status.power_list[current_pdo].min_voltage,
  7241. battery->sink_status.power_list[current_pdo].max_current,
  7242. battery->pd_max_charge_power,
  7243. battery->pd_rated_power);
  7244. return 0;
  7245. }
  7246. static int usb_typec_handle_id_usb(struct sec_battery_info *battery, PD_NOTI_ATTACH_TYPEDEF *pdata)
  7247. {
  7248. if (pdata->cable_type == PD_USB_TYPE)
  7249. battery->pd_usb_attached = true;
  7250. else if (pdata->cable_type == PD_NONE_TYPE)
  7251. battery->pd_usb_attached = false;
  7252. dev_info(battery->dev, "%s: PDIC_NOTIFY_ID_USB: %d\n", __func__, battery->pd_usb_attached);
  7253. __pm_stay_awake(battery->monitor_ws);
  7254. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7255. return -1; /* skip usb_typec_handle_after_id() */
  7256. }
  7257. static void sb_auth_detach(struct sec_battery_info *battery)
  7258. {
  7259. union power_supply_propval value = { 0, };
  7260. battery->d2d_auth = D2D_AUTH_NONE;
  7261. battery->vpdo_ocp = false;
  7262. battery->vpdo_auth_stat = AUTH_NONE;
  7263. battery->hp_d2d = HP_D2D_NONE;
  7264. /* clear vpdo auth for snk to src(pr swap) with detach case */
  7265. sec_pd_vpdo_auth(AUTH_NONE, battery->pdata->d2d_check_type);
  7266. sb_disable_reverse_boost(battery);
  7267. /* set otg ocp limit 0.9A */
  7268. value.intval = 0;
  7269. psy_do_property(battery->pdata->otg_name, set,
  7270. POWER_SUPPLY_PROP_VOLTAGE_MAX, value);
  7271. /* clear buck off vote */
  7272. sec_vote(battery->chgen_vote, VOTER_D2D_WIRE, false, 0);
  7273. }
  7274. static int usb_typec_handle_id_device_info(struct sec_battery_info *battery,
  7275. PD_NOTI_DEVICE_INFO_TYPEDEF *pdata)
  7276. {
  7277. union power_supply_propval value = { 0, };
  7278. if ((pdata->vendor_id != AUTH_VENDOR_ID) ||
  7279. (pdata->product_id != AUTH_PRODUCT_ID) ||
  7280. (pdata->version <= 0)) {
  7281. pr_info("%s : skip id_device_info\n", __func__);
  7282. return -1;
  7283. }
  7284. if (battery->pdata->d2d_check_type != SB_D2D_NONE) {
  7285. if (battery->pdata->d2d_check_type == SB_D2D_SNKONLY) {
  7286. /* set otg ocp limit 1.5A */
  7287. value.intval = 1;
  7288. psy_do_property(battery->pdata->otg_name, set,
  7289. POWER_SUPPLY_PROP_VOLTAGE_MAX, value);
  7290. }
  7291. battery->d2d_auth = D2D_AUTH_SRC;
  7292. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  7293. sec_bat_d2d_check(battery,
  7294. battery->capacity, battery->temperature, battery->lrp);
  7295. #endif
  7296. } else
  7297. battery->d2d_auth = D2D_AUTH_SNK;
  7298. pr_info("%s set d2d auth %s : (0x%04x, 0x%04x, %d)\n", __func__,
  7299. ((battery->d2d_auth == D2D_AUTH_SRC) ? "src" : "snk"),
  7300. pdata->vendor_id, pdata->product_id, pdata->version);
  7301. return -1;
  7302. }
  7303. static int usb_typec_handle_id_svid_info(struct sec_battery_info *battery,
  7304. PD_NOTI_SVID_INFO_TYPEDEF *pdata)
  7305. {
  7306. if (pdata->standard_vendor_id == AUTH_VENDOR_ID)
  7307. battery->d2d_auth = D2D_AUTH_SNK;
  7308. pr_info("%s set vpdo snk auth : %s (0x%04x)\n", __func__,
  7309. (battery->d2d_auth == D2D_AUTH_SNK) ? "enable" : "disable", pdata->standard_vendor_id);
  7310. return -1;
  7311. }
  7312. static int usb_typec_handle_id_clear_info(struct sec_battery_info *battery,
  7313. PD_NOTI_CLEAR_INFO_TYPEDEF *pdata)
  7314. {
  7315. if ((pdata->clear_id == PDIC_NOTIFY_ID_DEVICE_INFO) ||
  7316. (pdata->clear_id == PDIC_NOTIFY_ID_SVID_INFO)) {
  7317. sb_auth_detach(battery);
  7318. }
  7319. pr_info("%s clear vpdo auth : (%d)\n", __func__,
  7320. pdata->clear_id);
  7321. return -1;
  7322. }
  7323. static int usb_typec_handle_after_id(struct sec_battery_info *battery, int cable_type, const char *cmd)
  7324. {
  7325. #if defined(CONFIG_WIRELESS_TX_MODE)
  7326. if (!is_hv_wire_type(cable_type) &&
  7327. !is_hv_pdo_wire_type(cable_type, battery->hv_pdo)) {
  7328. sec_vote(battery->chgen_vote, VOTER_CHANGE_CHGMODE, false, 0);
  7329. sec_vote(battery->iv_vote, VOTER_CHANGE_CHGMODE, false, 0);
  7330. }
  7331. #endif
  7332. #if defined(CONFIG_PD_CHARGER_HV_DISABLE) && !defined(CONFIG_SEC_FACTORY)
  7333. if (check_afc_disabled_type(battery->muic_cable_type)) {
  7334. pr_info("%s set SEC_BAT_CURRENT_EVENT_AFC_DISABLE\n", __func__);
  7335. sec_bat_set_current_event(battery,
  7336. SEC_BAT_CURRENT_EVENT_AFC_DISABLE, SEC_BAT_CURRENT_EVENT_AFC_DISABLE);
  7337. __pm_stay_awake(battery->monitor_ws);
  7338. queue_delayed_work(battery->monitor_wqueue,
  7339. &battery->monitor_work, 0);
  7340. } else {
  7341. sec_bat_set_current_event(battery,
  7342. 0, SEC_BAT_CURRENT_EVENT_AFC_DISABLE);
  7343. }
  7344. #endif
  7345. sec_bat_set_misc_event(battery,
  7346. (battery->muic_cable_type == ATTACHED_DEV_UNDEFINED_CHARGING_MUIC ?
  7347. BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE : 0) |
  7348. (battery->muic_cable_type == ATTACHED_DEV_UNDEFINED_RANGE_MUIC ?
  7349. BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE : 0),
  7350. BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE);
  7351. if (battery->muic_cable_type == ATTACHED_DEV_HICCUP_MUIC) {
  7352. if (battery->usb_conn_status || (battery->misc_event & BATT_MISC_EVENT_TEMP_HICCUP_TYPE)) {
  7353. pr_info("%s: Hiccup Set because of USB Temp\n", __func__);
  7354. sec_bat_set_misc_event(battery,
  7355. BATT_MISC_EVENT_TEMP_HICCUP_TYPE, BATT_MISC_EVENT_TEMP_HICCUP_TYPE);
  7356. battery->usb_conn_status = USB_CONN_NORMAL;
  7357. } else {
  7358. pr_info("%s: Hiccup Set because of Water detect\n", __func__);
  7359. sec_bat_set_misc_event(battery,
  7360. BATT_MISC_EVENT_WATER_HICCUP_TYPE, BATT_MISC_EVENT_WATER_HICCUP_TYPE);
  7361. }
  7362. battery->hiccup_status = 1;
  7363. } else {
  7364. battery->hiccup_status = 0;
  7365. if (battery->hiccup_clear) {
  7366. sec_bat_set_misc_event(battery, 0,
  7367. (BATT_MISC_EVENT_WATER_HICCUP_TYPE | BATT_MISC_EVENT_TEMP_HICCUP_TYPE));
  7368. battery->hiccup_clear = false;
  7369. pr_info("%s : Hiccup event clear! hiccup clear bit set (%d)\n",
  7370. __func__, battery->hiccup_clear);
  7371. } else if (battery->misc_event &
  7372. (BATT_MISC_EVENT_WATER_HICCUP_TYPE | BATT_MISC_EVENT_TEMP_HICCUP_TYPE)) {
  7373. __pm_stay_awake(battery->monitor_ws);
  7374. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7375. }
  7376. }
  7377. if (cable_type < 0 || cable_type > SEC_BATTERY_CABLE_MAX) {
  7378. dev_info(battery->dev, "%s: ignore event(%d)\n",
  7379. __func__, battery->muic_cable_type);
  7380. return -1; /* skip usb_typec_handle_after_id() */
  7381. } else if ((cable_type == SEC_BATTERY_CABLE_UNKNOWN) &&
  7382. (battery->status != POWER_SUPPLY_STATUS_DISCHARGING)) {
  7383. battery->cable_type = cable_type;
  7384. __pm_stay_awake(battery->monitor_ws);
  7385. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7386. dev_info(battery->dev, "%s: UNKNOWN cable plugin\n", __func__);
  7387. return -1; /* skip usb_typec_handle_after_id() */
  7388. }
  7389. battery->wire_status = cable_type;
  7390. #if defined(CONFIG_WIRELESS_TX_MODE)
  7391. if (battery->wc_tx_enable && battery->uno_en) {
  7392. int work_delay = 0;
  7393. if (battery->wire_status == SEC_BATTERY_CABLE_NONE) {
  7394. battery->buck_cntl_by_tx = true;
  7395. sec_vote(battery->chgen_vote, VOTER_WC_TX, true, SEC_BAT_CHG_MODE_BUCK_OFF);
  7396. if (battery->tx_switch_mode != TX_SWITCH_GEAR_PPS) {
  7397. battery->tx_switch_mode = TX_SWITCH_MODE_OFF;
  7398. battery->tx_switch_mode_change = false;
  7399. }
  7400. battery->tx_switch_start_soc = 0;
  7401. }
  7402. if (battery->pdata->tx_5v_disable && battery->wire_status == SEC_BATTERY_CABLE_TA)
  7403. work_delay = battery->pdata->pre_afc_work_delay + 500; //add delay more afc check
  7404. if (battery->tx_switch_mode != TX_SWITCH_GEAR_PPS)
  7405. sec_bat_run_wpc_tx_work(battery, work_delay);
  7406. }
  7407. #endif
  7408. cancel_delayed_work(&battery->cable_work);
  7409. __pm_relax(battery->cable_ws);
  7410. if (cable_type == SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT) {
  7411. /* set current event */
  7412. sec_bat_cancel_input_check_work(battery);
  7413. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_CHG_LIMIT,
  7414. (SEC_BAT_CURRENT_EVENT_CHG_LIMIT | SEC_BAT_CURRENT_EVENT_AFC));
  7415. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, false, 0);
  7416. /* Check VOTER_SIOP to set up current based on cable_type */
  7417. __pm_stay_awake(battery->siop_level_ws);
  7418. queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
  7419. __pm_stay_awake(battery->monitor_ws);
  7420. battery->polling_count = 1; /* initial value = 1 */
  7421. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7422. } else if ((battery->wire_status == battery->cable_type) &&
  7423. (((battery->wire_status == SEC_BATTERY_CABLE_USB || battery->wire_status == SEC_BATTERY_CABLE_TA) &&
  7424. battery->sink_status.rp_currentlvl >= RP_CURRENT_LEVEL_DEFAULT &&
  7425. !(battery->current_event & SEC_BAT_CURRENT_EVENT_AFC)) ||
  7426. is_hv_wire_type(battery->wire_status))) {
  7427. sec_bat_cancel_input_check_work(battery);
  7428. sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_AFC);
  7429. sec_vote(battery->input_vote, VOTER_CABLE, true, battery->pdata->charging_current[cable_type].input_current_limit);
  7430. sec_vote(battery->fcc_vote, VOTER_CABLE, true, battery->pdata->charging_current[cable_type].fast_charging_current);
  7431. sec_vote(battery->input_vote, VOTER_VBUS_CHANGE, false, 0);
  7432. __pm_stay_awake(battery->monitor_ws);
  7433. battery->polling_count = 1; /* initial value = 1 */
  7434. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7435. } else if (cable_type == SEC_BATTERY_CABLE_PREPARE_TA) {
  7436. sec_bat_check_afc_input_current(battery);
  7437. } else {
  7438. __pm_stay_awake(battery->cable_ws);
  7439. if (battery->ta_alert_wa && battery->ta_alert_mode != OCP_NONE) {
  7440. if (!strcmp(cmd, "DETACH")) {
  7441. queue_delayed_work(battery->monitor_wqueue,
  7442. &battery->cable_work, msecs_to_jiffies(3000));
  7443. } else {
  7444. queue_delayed_work(battery->monitor_wqueue,
  7445. &battery->cable_work, 0);
  7446. }
  7447. } else {
  7448. queue_delayed_work(battery->monitor_wqueue,
  7449. &battery->cable_work, 0);
  7450. }
  7451. }
  7452. return 0;
  7453. }
  7454. static int usb_typec_handle_notification(struct notifier_block *nb,
  7455. unsigned long action, void *data)
  7456. {
  7457. const char *cmd = "NONE";
  7458. struct sec_battery_info *battery =
  7459. container_of(nb, struct sec_battery_info, usb_typec_nb);
  7460. int cable_type = SEC_BATTERY_CABLE_NONE;
  7461. PD_NOTI_TYPEDEF *pdata = (PD_NOTI_TYPEDEF *)data;
  7462. struct pdic_notifier_struct *pd_noti = pdata->pd;
  7463. SEC_PD_SINK_STATUS *psink_status = NULL;
  7464. int ret_handle = 0;
  7465. dev_info(battery->dev, "%s: action:%ld src:%d, dest:%d, id:%d, sub1:%d, sub2:%d, sub3:%d\n",
  7466. __func__, action, pdata->src, pdata->dest, pdata->id, pdata->sub1, pdata->sub2, pdata->sub3);
  7467. if ((pdata->dest != PDIC_NOTIFY_DEV_BATT) && (pdata->dest != PDIC_NOTIFY_DEV_ALL)) {
  7468. dev_info(battery->dev, "%s: skip handler dest(%d)\n",
  7469. __func__, pdata->dest);
  7470. return 0;
  7471. }
  7472. if (!pd_noti) {
  7473. dev_info(battery->dev, "%s: pd_noti(pdata->pd) is NULL\n", __func__);
  7474. } else {
  7475. psink_status = &pd_noti->sink_status;
  7476. if (!battery->psink_status) {
  7477. battery->psink_status = psink_status;
  7478. sec_pd_init_data(battery->psink_status);
  7479. sec_pd_register_chg_info_cb(count_cisd_pd_data);
  7480. }
  7481. }
  7482. mutex_lock(&battery->typec_notylock);
  7483. switch (pdata->id) {
  7484. case PDIC_NOTIFY_ID_WATER:
  7485. case PDIC_NOTIFY_ID_ATTACH:
  7486. ret_handle = usb_typec_handle_id_attach(battery, (PD_NOTI_ATTACH_TYPEDEF *)pdata, &cable_type, &cmd);
  7487. break;
  7488. case PDIC_NOTIFY_ID_POWER_STATUS:
  7489. ret_handle = usb_typec_handle_id_power_status(battery, (PD_NOTI_POWER_STATUS_TYPEDEF *)pdata, &cable_type, &cmd);
  7490. break;
  7491. case PDIC_NOTIFY_ID_USB:
  7492. ret_handle = usb_typec_handle_id_usb(battery, (PD_NOTI_ATTACH_TYPEDEF *)pdata);
  7493. break;
  7494. case PDIC_NOTIFY_ID_DEVICE_INFO:
  7495. ret_handle = usb_typec_handle_id_device_info(battery, (PD_NOTI_DEVICE_INFO_TYPEDEF *)pdata);
  7496. break;
  7497. case PDIC_NOTIFY_ID_SVID_INFO:
  7498. ret_handle = usb_typec_handle_id_svid_info(battery, (PD_NOTI_SVID_INFO_TYPEDEF *)pdata);
  7499. break;
  7500. case PDIC_NOTIFY_ID_CLEAR_INFO:
  7501. ret_handle = usb_typec_handle_id_clear_info(battery, (PD_NOTI_CLEAR_INFO_TYPEDEF *)pdata);
  7502. break;
  7503. default:
  7504. cmd = "ERROR";
  7505. cable_type = -1;
  7506. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  7507. battery->hv_chg_name = "NONE";
  7508. break;
  7509. }
  7510. if (ret_handle < 0)
  7511. goto skip_handle_after_id;
  7512. usb_typec_handle_after_id(battery, cable_type, cmd);
  7513. skip_handle_after_id:
  7514. dev_info(battery->dev, "%s: CMD[%s], CABLE_TYPE[%d]\n", __func__, cmd, cable_type);
  7515. mutex_unlock(&battery->typec_notylock);
  7516. return 0;
  7517. }
  7518. #else
  7519. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7520. static int batt_handle_notification(struct notifier_block *nb,
  7521. unsigned long action, void *data)
  7522. {
  7523. const char *cmd;
  7524. int cable_type = SEC_BATTERY_CABLE_NONE;
  7525. struct sec_battery_info *battery =
  7526. container_of(nb, struct sec_battery_info, batt_nb);
  7527. union power_supply_propval value = {0, };
  7528. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER) || IS_ENABLED(CONFIG_CCIC_NOTIFIER)
  7529. PD_NOTI_ATTACH_TYPEDEF *p_noti = (PD_NOTI_ATTACH_TYPEDEF *)data;
  7530. muic_attached_dev_t attached_dev = p_noti->cable_type;
  7531. #else
  7532. muic_attached_dev_t attached_dev = *(muic_attached_dev_t *)data;
  7533. #endif
  7534. mutex_lock(&battery->batt_handlelock);
  7535. switch (action) {
  7536. case MUIC_NOTIFY_CMD_DETACH:
  7537. case MUIC_NOTIFY_CMD_LOGICALLY_DETACH:
  7538. cmd = "DETACH";
  7539. battery->is_jig_on = false;
  7540. cable_type = SEC_BATTERY_CABLE_NONE;
  7541. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  7542. break;
  7543. case MUIC_NOTIFY_CMD_ATTACH:
  7544. case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH:
  7545. cmd = "ATTACH";
  7546. cable_type = sec_bat_cable_check(battery, attached_dev);
  7547. battery->muic_cable_type = attached_dev;
  7548. break;
  7549. default:
  7550. cmd = "ERROR";
  7551. cable_type = -1;
  7552. battery->muic_cable_type = ATTACHED_DEV_NONE_MUIC;
  7553. break;
  7554. }
  7555. sec_bat_set_misc_event(battery,
  7556. #if !defined(CONFIG_ENG_BATTERY_CONCEPT) && !defined(CONFIG_SEC_FACTORY)
  7557. (battery->muic_cable_type == ATTACHED_DEV_JIG_UART_ON_MUIC ? BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE : 0) |
  7558. (battery->muic_cable_type == ATTACHED_DEV_JIG_USB_ON_MUIC ? BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE : 0) |
  7559. #endif
  7560. (battery->muic_cable_type == ATTACHED_DEV_UNDEFINED_RANGE_MUIC ? BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE : 0),
  7561. BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE);
  7562. if (battery->muic_cable_type == ATTACHED_DEV_HICCUP_MUIC) {
  7563. if (battery->usb_conn_status || (battery->misc_event & BATT_MISC_EVENT_TEMP_HICCUP_TYPE)) {
  7564. pr_info("%s: Hiccup Set because of USB Temp\n", __func__);
  7565. sec_bat_set_misc_event(battery,
  7566. BATT_MISC_EVENT_TEMP_HICCUP_TYPE, BATT_MISC_EVENT_TEMP_HICCUP_TYPE);
  7567. battery->usb_conn_status = USB_CONN_NORMAL;
  7568. } else {
  7569. pr_info("%s: Hiccup Set because of Water detect\n", __func__);
  7570. sec_bat_set_misc_event(battery,
  7571. BATT_MISC_EVENT_WATER_HICCUP_TYPE, BATT_MISC_EVENT_WATER_HICCUP_TYPE);
  7572. }
  7573. battery->hiccup_status = 1;
  7574. } else {
  7575. battery->hiccup_status = 0;
  7576. if (battery->misc_event &
  7577. (BATT_MISC_EVENT_WATER_HICCUP_TYPE | BATT_MISC_EVENT_TEMP_HICCUP_TYPE)) {
  7578. __pm_stay_awake(battery->monitor_ws);
  7579. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7580. }
  7581. }
  7582. /* If PD cable is already attached, return this function */
  7583. if (battery->pdic_attach) {
  7584. dev_info(battery->dev, "%s: ignore event pdic attached(%d)\n",
  7585. __func__, battery->pdic_attach);
  7586. mutex_unlock(&battery->batt_handlelock);
  7587. return 0;
  7588. }
  7589. if (attached_dev == ATTACHED_DEV_MHL_MUIC) {
  7590. mutex_unlock(&battery->batt_handlelock);
  7591. return 0;
  7592. }
  7593. if (cable_type < 0) {
  7594. dev_info(battery->dev, "%s: ignore event(%d)\n",
  7595. __func__, cable_type);
  7596. } else if ((cable_type == SEC_BATTERY_CABLE_UNKNOWN) &&
  7597. (battery->status != POWER_SUPPLY_STATUS_DISCHARGING)) {
  7598. battery->cable_type = cable_type;
  7599. __pm_stay_awake(battery->monitor_ws);
  7600. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7601. dev_info(battery->dev,
  7602. "%s: UNKNOWN cable plugin\n", __func__);
  7603. mutex_unlock(&battery->batt_handlelock);
  7604. return 0;
  7605. } else {
  7606. battery->wire_status = cable_type;
  7607. if (is_nocharge_type(battery->wire_status) && (battery->wc_status != SEC_BATTERY_CABLE_NONE))
  7608. cable_type = SEC_BATTERY_CABLE_WIRELESS;
  7609. }
  7610. dev_info(battery->dev,
  7611. "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
  7612. __func__, cable_type, battery->wc_status,
  7613. battery->wire_status);
  7614. mutex_unlock(&battery->batt_handlelock);
  7615. if (attached_dev == ATTACHED_DEV_USB_LANHUB_MUIC) {
  7616. if (!strcmp(cmd, "ATTACH")) {
  7617. value.intval = true;
  7618. psy_do_property(battery->pdata->charger_name, set,
  7619. POWER_SUPPLY_EXT_PROP_CHARGE_POWERED_OTG_CONTROL,
  7620. value);
  7621. dev_info(battery->dev,
  7622. "%s: Powered OTG cable attached\n", __func__);
  7623. } else {
  7624. value.intval = false;
  7625. psy_do_property(battery->pdata->charger_name, set,
  7626. POWER_SUPPLY_EXT_PROP_CHARGE_POWERED_OTG_CONTROL,
  7627. value);
  7628. dev_info(battery->dev,
  7629. "%s: Powered OTG cable detached\n", __func__);
  7630. }
  7631. }
  7632. if (!strcmp(cmd, "ATTACH")) {
  7633. if ((battery->muic_cable_type >= ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC) &&
  7634. (battery->muic_cable_type <= ATTACHED_DEV_QC_CHARGER_9V_MUIC)) {
  7635. battery->hv_chg_name = "QC";
  7636. } else if ((battery->muic_cable_type >= ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC) &&
  7637. (battery->muic_cable_type <= ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC)) {
  7638. battery->hv_chg_name = "AFC";
  7639. #if defined(CONFIG_MUIC_HV_12V)
  7640. } else if (battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_12V_MUIC ||
  7641. battery->muic_cable_type == ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC) {
  7642. battery->hv_chg_name = "12V";
  7643. #endif
  7644. } else
  7645. battery->hv_chg_name = "NONE";
  7646. } else {
  7647. battery->hv_chg_name = "NONE";
  7648. }
  7649. pr_info("%s : HV_CHARGER_NAME(%s)\n",
  7650. __func__, battery->hv_chg_name);
  7651. if ((cable_type >= 0) &&
  7652. cable_type <= SEC_BATTERY_CABLE_MAX) {
  7653. if (cable_type == SEC_BATTERY_CABLE_NONE) {
  7654. __pm_stay_awake(battery->monitor_ws);
  7655. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7656. } else if (cable_type != battery->cable_type) {
  7657. __pm_stay_awake(battery->cable_ws);
  7658. queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
  7659. } else {
  7660. dev_info(battery->dev,
  7661. "%s: Cable is Not Changed(%d)\n",
  7662. __func__, battery->cable_type);
  7663. }
  7664. }
  7665. pr_info("%s: CMD=%s, attached_dev=%d\n", __func__, cmd, attached_dev);
  7666. return 0;
  7667. }
  7668. #endif /* CONFIG_MUIC_NOTIFIER */
  7669. #endif
  7670. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER)
  7671. static int vbus_handle_notification(struct notifier_block *nb,
  7672. unsigned long action, void *data)
  7673. {
  7674. vbus_status_t vbus_status = *(vbus_status_t *)data;
  7675. struct sec_battery_info *battery =
  7676. container_of(nb, struct sec_battery_info, vbus_nb);
  7677. mutex_lock(&battery->batt_handlelock);
  7678. pr_info("battery: %s: action=%d, vbus_status=%s, otg=%s\n",
  7679. __func__, (int)action, vbus_status == STATUS_VBUS_HIGH ? "HIGH" : "LOW",
  7680. battery->is_otg_on ? "ON" : "OFF");
  7681. #if IS_ENABLED(CONFIG_LSI_IFPMIC)
  7682. if (battery->pdata->support_vpdo && battery->cable_type == SEC_BATTERY_CABLE_PDIC) {
  7683. sec_vote_refresh(battery->input_vote);
  7684. sec_vote_refresh(battery->fcc_vote);
  7685. sec_vote_refresh(battery->chgen_vote);
  7686. }
  7687. #endif
  7688. if (battery->pdata->support_usb_conn_check &&
  7689. !battery->is_otg_on && vbus_status == STATUS_VBUS_HIGH && !delayed_work_pending(&battery->usb_conn_check_work) &&
  7690. !battery->run_usb_conn_check) {
  7691. #if !defined(CONFIG_SEC_FACTORY)
  7692. battery->run_usb_conn_check = true;
  7693. battery->usb_conn_check_cnt = 0;
  7694. __pm_stay_awake(battery->usb_conn_check_ws);
  7695. queue_delayed_work(battery->monitor_wqueue, &battery->usb_conn_check_work, msecs_to_jiffies(1000));
  7696. #endif
  7697. }
  7698. mutex_unlock(&battery->batt_handlelock);
  7699. return 0;
  7700. }
  7701. #endif
  7702. __visible_for_testing void sec_bat_parse_param_value(struct sec_battery_info *battery)
  7703. {
  7704. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  7705. union power_supply_propval value = {0, };
  7706. #endif
  7707. int chg_mode = 0;
  7708. int pd_hv_disable = 0;
  7709. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7710. int afc_mode = 0;
  7711. #endif
  7712. chg_mode = sec_bat_get_chgmode() & 0x000000FF;
  7713. pr_info("%s: charging_mode: 0x%x (charging_night_mode:0x%x)\n",
  7714. __func__, sec_bat_get_chgmode(), chg_mode);
  7715. pd_hv_disable = sec_bat_get_dispd() & 0x000000FF;
  7716. pr_info("%s: pd_disable: 0x%x (pd_hv_disable:0x%x)\n",
  7717. __func__, sec_bat_get_dispd(), pd_hv_disable);
  7718. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7719. afc_mode = get_afc_mode();
  7720. pr_info("%s: afc_mode: 0x%x\n", __func__, afc_mode);
  7721. #endif
  7722. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  7723. battery->charging_night_mode = chg_mode;
  7724. /* Check High Voltage charging option for wireless charging */
  7725. /* '1' means disabling High Voltage charging */
  7726. if (battery->charging_night_mode == '1') /* 0x31 */
  7727. battery->sleep_mode = true;
  7728. else
  7729. battery->sleep_mode = false;
  7730. value.intval = battery->sleep_mode;
  7731. psy_do_property(battery->pdata->wireless_charger_name, set,
  7732. POWER_SUPPLY_EXT_PROP_SLEEP_MODE, value);
  7733. #endif
  7734. #if defined(CONFIG_PD_CHARGER_HV_DISABLE)
  7735. if (pd_hv_disable == '1') { /* 0x31 */
  7736. battery->pd_disable = true;
  7737. pr_info("PD wired charging mode is disabled\n");
  7738. sec_bat_set_current_event(battery,
  7739. SEC_BAT_CURRENT_EVENT_HV_DISABLE, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
  7740. }
  7741. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7742. /* Check High Voltage charging option for wired charging */
  7743. if (afc_mode == CH_MODE_AFC_DISABLE_VAL) {
  7744. pr_info("None PD wired charging mode is disabled\n");
  7745. sec_bat_set_current_event(battery,
  7746. SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE, SEC_BAT_CURRENT_EVENT_NOPD_HV_DISABLE);
  7747. }
  7748. #endif
  7749. #else
  7750. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7751. /* Check High Voltage charging option for wired charging */
  7752. if (afc_mode == CH_MODE_AFC_DISABLE_VAL) {
  7753. pr_info("HV wired charging mode is disabled\n");
  7754. sec_bat_set_current_event(battery,
  7755. SEC_BAT_CURRENT_EVENT_HV_DISABLE, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
  7756. }
  7757. #endif
  7758. #endif
  7759. #if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
  7760. pr_info("%s: f_mode: %s\n", __func__, f_mode);
  7761. if (!f_mode) {
  7762. battery->batt_f_mode = NO_MODE;
  7763. } else if ((strncmp(f_mode, "OB", 2) == 0) || (strncmp(f_mode, "DL", 2) == 0)) {
  7764. /* Set factory mode variables in OB mode */
  7765. sec_bat_set_facmode(true);
  7766. battery->factory_mode = true;
  7767. battery->batt_f_mode = OB_MODE;
  7768. } else if (strncmp(f_mode, "IB", 2) == 0) {
  7769. battery->batt_f_mode = IB_MODE;
  7770. } else {
  7771. battery->batt_f_mode = NO_MODE;
  7772. }
  7773. pr_info("[BAT] %s: f_mode: %s\n", __func__, BOOT_MODE_STRING[battery->batt_f_mode]);
  7774. battery->usb_factory_init = false;
  7775. #if defined(CONFIG_SEC_FACTORY)
  7776. battery->usb_factory_slate_mode = false;
  7777. #endif
  7778. #endif
  7779. battery->factory_mode_boot_on = sec_bat_get_facmode();
  7780. }
  7781. EXPORT_SYMBOL_KUNIT(sec_bat_parse_param_value);
  7782. static void sec_bat_afc_init_work(struct work_struct *work)
  7783. {
  7784. int ret = 0;
  7785. #if defined(CONFIG_AFC_CHARGER_MODE)
  7786. ret = muic_hv_charger_init();
  7787. #endif
  7788. pr_info("%s, ret(%d)\n", __func__, ret);
  7789. }
  7790. static void sec_bat_check_spsn_open(struct sec_battery_info *battery)
  7791. {
  7792. #if !defined(CONFIG_SEC_FACTORY)
  7793. union power_supply_propval value = {0, };
  7794. if (sec_bat_get_facmode() || battery->factory_mode ||
  7795. !battery->pdata->support_spsn_ctrl) {
  7796. pr_info("%s: skip factory mode or not support spsn ctrl\n", __func__);
  7797. return;
  7798. }
  7799. if (battery->voltage_now < 3000) {
  7800. pr_info("%s: voltage = %d\n", __func__, battery->voltage_now);
  7801. return;
  7802. }
  7803. psy_do_property(battery->pdata->charger_name, get,
  7804. POWER_SUPPLY_EXT_PROP_SPSN_TEST, value);
  7805. if (!value.intval) {
  7806. value.intval = 100;
  7807. psy_do_property(battery->pdata->charger_name, set,
  7808. POWER_SUPPLY_EXT_PROP_SPSN_TEST, value);
  7809. }
  7810. #endif
  7811. }
  7812. static void sec_batt_dev_init_work(struct work_struct *work)
  7813. {
  7814. struct sec_battery_info *battery = container_of(work,
  7815. struct sec_battery_info, dev_init_work.work);
  7816. union power_supply_propval value = {0, };
  7817. #if defined(CONFIG_STORE_MODE) && !defined(CONFIG_SEC_FACTORY) && IS_ENABLED(CONFIG_DIRECT_CHARGING)
  7818. char direct_charging_source_status[2] = {0, };
  7819. #endif
  7820. pr_info("%s: Start\n", __func__);
  7821. sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
  7822. sec_bat_set_health(battery, POWER_SUPPLY_HEALTH_GOOD);
  7823. battery->capacity = 50;
  7824. sec_chg_check_modprobe();
  7825. /* updates temperatures on boot */
  7826. sec_bat_get_temperature_info(battery);
  7827. /* initialize battery voltage*/
  7828. value.intval = SEC_BATTERY_VOLTAGE_MV;
  7829. psy_do_property(battery->pdata->fuelgauge_name, get,
  7830. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  7831. battery->voltage_now = value.intval;
  7832. /* initialize battery level*/
  7833. value.intval = 0;
  7834. psy_do_property(battery->pdata->fuelgauge_name, get,
  7835. POWER_SUPPLY_PROP_CAPACITY, value);
  7836. battery->capacity = value.intval;
  7837. sec_bat_check_spsn_open(battery);
  7838. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  7839. sec_bat_check_boottime(battery, battery->pdata->dctp_bootmode_en);
  7840. #endif
  7841. sec_bat_parse_param_value(battery);
  7842. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  7843. #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
  7844. queue_delayed_work(battery->monitor_wqueue, &battery->fw_init_work, msecs_to_jiffies(2000));
  7845. #endif
  7846. psy_do_property(battery->pdata->wireless_charger_name, get,
  7847. POWER_SUPPLY_EXT_PROP_WPC_EN, value);
  7848. sec_bat_set_current_event(battery,
  7849. value.intval ? SEC_BAT_CURRENT_EVENT_WPC_EN : 0, SEC_BAT_CURRENT_EVENT_WPC_EN);
  7850. /*
  7851. * notify wireless charger driver when sec_battery probe is done,
  7852. * if wireless charging is possible, POWER_SUPPLY_PROP_ONLINE of wireless property will be called.
  7853. */
  7854. value.intval = 0;
  7855. psy_do_property(battery->pdata->wireless_charger_name, set,
  7856. POWER_SUPPLY_PROP_CHARGE_TYPE, value);
  7857. #endif
  7858. #if defined(CONFIG_USE_POGO)
  7859. /*
  7860. * notify pogo charger driver when sec_battery probe is done,
  7861. * if pogo charging is possible, POWER_SUPPLY_PROP_ONLINE of pogo property will be called.
  7862. */
  7863. value.intval = 0;
  7864. psy_do_property(battery->pdata->charger_name, set,
  7865. POWER_SUPPLY_PROP_CHARGE_TYPE, value);
  7866. #endif
  7867. #if defined(CONFIG_STORE_MODE) && !defined(CONFIG_SEC_FACTORY)
  7868. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  7869. direct_charging_source_status[0] = SEC_STORE_MODE;
  7870. direct_charging_source_status[1] = SEC_CHARGING_SOURCE_SWITCHING;
  7871. value.strval = direct_charging_source_status;
  7872. psy_do_property(battery->pdata->charger_name, set,
  7873. POWER_SUPPLY_EXT_PROP_CHANGE_CHARGING_SOURCE, value);
  7874. #endif
  7875. #endif
  7876. register_batterylog_proc();
  7877. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  7878. battery->sink_status.rp_currentlvl = RP_CURRENT_LEVEL_NONE;
  7879. manager_notifier_register(&battery->usb_typec_nb,
  7880. usb_typec_handle_notification, MANAGER_NOTIFY_PDIC_BATTERY);
  7881. #else
  7882. #if IS_ENABLED(CONFIG_MUIC_NOTIFIER)
  7883. muic_notifier_register(&battery->batt_nb,
  7884. batt_handle_notification, MUIC_NOTIFY_DEV_CHARGER);
  7885. #endif
  7886. #endif
  7887. value.intval = true;
  7888. psy_do_property(battery->pdata->charger_name, set,
  7889. POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, value);
  7890. #if defined(CONFIG_SEC_COMMON)
  7891. /* make fg_reset true again for actual normal booting after recovery kernel is done */
  7892. if (sec_bat_get_fgreset() && seccmn_recv_is_boot_recovery()) {
  7893. pr_info("%s: fg_reset(%d) boot_recov(%d)\n",
  7894. __func__, sec_bat_get_fgreset(), seccmn_recv_is_boot_recovery());
  7895. psy_do_property(battery->pdata->fuelgauge_name, set,
  7896. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  7897. pr_info("%s: make fg_reset true again for actual normal booting\n", __func__);
  7898. }
  7899. #endif
  7900. #if defined(CONFIG_NO_BATTERY)
  7901. sec_vote(battery->chgen_vote, VOTER_NO_BATTERY, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
  7902. #else
  7903. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_USB_100MA, SEC_BAT_CURRENT_EVENT_USB_100MA);
  7904. sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100);
  7905. sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100);
  7906. sec_vote(battery->topoff_vote, VOTER_FULL_CHARGE, true, battery->pdata->full_check_current_1st);
  7907. sec_vote(battery->fv_vote, VOTER_FULL_CHARGE, true, battery->pdata->chg_float_voltage);
  7908. #endif
  7909. #if defined(CONFIG_BC12_DEVICE)
  7910. #if defined(CONFIG_SEC_FACTORY)
  7911. value.intval = 0;
  7912. psy_do_property(battery->pdata->fuelgauge_name, get,
  7913. POWER_SUPPLY_EXT_PROP_CHECK_INIT, value);
  7914. battery->vbat_adc_open = (value.intval == 1) ? true : false;
  7915. #endif
  7916. value.intval = 0;
  7917. psy_do_property(battery->pdata->charger_name, get,
  7918. POWER_SUPPLY_EXT_PROP_CHECK_INIT, value);
  7919. #endif
  7920. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER)
  7921. vbus_notifier_register(&battery->vbus_nb,
  7922. vbus_handle_notification, VBUS_NOTIFY_DEV_BATTERY);
  7923. #endif
  7924. queue_delayed_work(battery->monitor_wqueue, &battery->afc_init_work, 0);
  7925. if ((battery->wire_status == SEC_BATTERY_CABLE_NONE) ||
  7926. (battery->wire_status == SEC_BATTERY_CABLE_PREPARE_TA)) {
  7927. __pm_stay_awake(battery->monitor_ws);
  7928. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  7929. }
  7930. pr_info("%s: End\n", __func__);
  7931. __pm_relax(battery->dev_init_ws);
  7932. }
  7933. static int sb_handle_notification(struct notifier_block *nb, unsigned long action, void *data)
  7934. {
  7935. struct sec_battery_info *battery = container_of(nb, struct sec_battery_info, sb_nb);
  7936. sb_data *sbd = data;
  7937. int ret = 0;
  7938. switch (action) {
  7939. case SB_NOTIFY_DEV_PROBE:
  7940. ret = sb_sysfs_create_attrs(&battery->psy_bat->dev);
  7941. pr_info("%s: create sysfs node (name = %s, count = %d)\n",
  7942. __func__, cast_sb_data_ptr(const char, sbd), ret);
  7943. break;
  7944. case SB_NOTIFY_DEV_LIST:
  7945. {
  7946. struct sbn_dev_list *tmp_list = cast_sb_data_ptr(struct sbn_dev_list, sbd);
  7947. ret = sb_sysfs_create_attrs(&battery->psy_bat->dev);
  7948. pr_info("%s: create sysfs node (dev_count = %d, sysfs_count = %d)\n",
  7949. __func__, tmp_list->count, ret);
  7950. }
  7951. break;
  7952. case SB_NOTIFY_EVENT_MISC:
  7953. {
  7954. struct sbn_bit_event *misc = cast_sb_data_ptr(struct sbn_bit_event, sbd);
  7955. sec_bat_set_misc_event(battery, misc->value, misc->mask);
  7956. }
  7957. break;
  7958. case SB_NOTIFY_DEV_SHUTDOWN:
  7959. break;
  7960. default:
  7961. return -EINVAL;
  7962. }
  7963. return 0;
  7964. }
  7965. static const struct power_supply_desc battery_power_supply_desc = {
  7966. .name = "battery",
  7967. .type = POWER_SUPPLY_TYPE_BATTERY,
  7968. .properties = sec_battery_props,
  7969. .num_properties = ARRAY_SIZE(sec_battery_props),
  7970. .get_property = sec_bat_get_property,
  7971. .set_property = sec_bat_set_property,
  7972. };
  7973. static const struct power_supply_desc usb_power_supply_desc = {
  7974. .name = "usb",
  7975. .type = POWER_SUPPLY_TYPE_USB,
  7976. .properties = sec_power_props,
  7977. .num_properties = ARRAY_SIZE(sec_power_props),
  7978. .get_property = sec_usb_get_property,
  7979. };
  7980. static const struct power_supply_desc ac_power_supply_desc = {
  7981. .name = "ac",
  7982. .type = POWER_SUPPLY_TYPE_MAINS,
  7983. .properties = sec_ac_props,
  7984. .num_properties = ARRAY_SIZE(sec_ac_props),
  7985. .get_property = sec_ac_get_property,
  7986. };
  7987. static const struct power_supply_desc wireless_power_supply_desc = {
  7988. .name = "wireless",
  7989. .type = POWER_SUPPLY_TYPE_WIRELESS,
  7990. .properties = sec_wireless_props,
  7991. .num_properties = ARRAY_SIZE(sec_wireless_props),
  7992. .get_property = sec_wireless_get_property,
  7993. .set_property = sec_wireless_set_property,
  7994. };
  7995. static const struct power_supply_desc pogo_power_supply_desc = {
  7996. .name = "pogo",
  7997. .type = POWER_SUPPLY_TYPE_UNKNOWN,
  7998. .properties = sec_power_props,
  7999. .num_properties = ARRAY_SIZE(sec_power_props),
  8000. .get_property = sec_pogo_get_property,
  8001. .set_property = sec_pogo_set_property,
  8002. };
  8003. static const struct power_supply_desc otg_power_supply_desc = {
  8004. .name = "otg",
  8005. .type = POWER_SUPPLY_TYPE_UNKNOWN,
  8006. .properties = sec_otg_props,
  8007. .num_properties = ARRAY_SIZE(sec_otg_props),
  8008. .get_property = sec_otg_get_property,
  8009. .set_property = sec_otg_set_property,
  8010. .external_power_changed = sec_otg_external_power_changed,
  8011. };
  8012. static int sec_battery_probe(struct platform_device *pdev)
  8013. {
  8014. sec_battery_platform_data_t *pdata = NULL;
  8015. struct sec_battery_info *battery;
  8016. struct power_supply_config battery_cfg = {};
  8017. int ret = 0;
  8018. dev_info(&pdev->dev,
  8019. "%s: SEC Battery Driver Loading\n", __func__);
  8020. battery = kzalloc(sizeof(*battery), GFP_KERNEL);
  8021. if (!battery)
  8022. return -ENOMEM;
  8023. if (pdev->dev.of_node) {
  8024. pdata = devm_kzalloc(&pdev->dev,
  8025. sizeof(sec_battery_platform_data_t),
  8026. GFP_KERNEL);
  8027. if (!pdata) {
  8028. dev_err(&pdev->dev, "Failed to allocate memory\n");
  8029. ret = -ENOMEM;
  8030. goto err_bat_free;
  8031. }
  8032. battery->pdata = pdata;
  8033. if (sec_bat_parse_dt(&pdev->dev, battery)) {
  8034. dev_err(&pdev->dev,
  8035. "%s: Failed to get battery dt\n", __func__);
  8036. ret = -EINVAL;
  8037. goto err_bat_free;
  8038. }
  8039. } else {
  8040. pdata = dev_get_platdata(&pdev->dev);
  8041. battery->pdata = pdata;
  8042. }
  8043. if (battery->pdata->soc_by_repcap_en) {
  8044. battery->eoc_d = kzalloc(sizeof(struct sec_eoc_info),
  8045. GFP_KERNEL);
  8046. if (!battery->eoc_d) {
  8047. ret = -EINVAL;
  8048. goto err_pdata_free;
  8049. }
  8050. }
  8051. platform_set_drvdata(pdev, battery);
  8052. battery->dev = &pdev->dev;
  8053. mutex_init(&battery->iolock);
  8054. mutex_init(&battery->misclock);
  8055. mutex_init(&battery->txeventlock);
  8056. mutex_init(&battery->batt_handlelock);
  8057. mutex_init(&battery->current_eventlock);
  8058. mutex_init(&battery->typec_notylock);
  8059. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  8060. mutex_init(&battery->bc12_notylock);
  8061. #endif
  8062. mutex_init(&battery->wclock);
  8063. mutex_init(&battery->voutlock);
  8064. dev_dbg(battery->dev, "%s: ADC init\n", __func__);
  8065. adc_init(pdev, battery);
  8066. battery->monitor_ws = wakeup_source_register(&pdev->dev, "sec-battery-monitor");
  8067. battery->cable_ws = wakeup_source_register(&pdev->dev, "sec-battery-cable");
  8068. battery->vbus_ws = wakeup_source_register(&pdev->dev, "sec-battery-vbus");
  8069. battery->input_ws = wakeup_source_register(&pdev->dev, "sec-battery-input");
  8070. battery->siop_level_ws = wakeup_source_register(&pdev->dev, "sec-battery-siop_level");
  8071. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8072. battery->ext_event_ws = wakeup_source_register(&pdev->dev, "sec-battery-ext_event");
  8073. battery->wpc_tx_ws = wakeup_source_register(&pdev->dev, "sec-battery-wcp-tx");
  8074. battery->wpc_tx_en_ws = wakeup_source_register(&pdev->dev, "sec-battery-wpc_tx_en");
  8075. battery->tx_event_ws = wakeup_source_register(&pdev->dev, "sec-battery-tx-event");
  8076. battery->wc20_current_ws = wakeup_source_register(&pdev->dev, "sec-battery-wc20-current");
  8077. battery->wc_ept_timeout_ws = wakeup_source_register(&pdev->dev, "sec-battery-ept-timeout");
  8078. #endif
  8079. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  8080. battery->batt_data_ws = wakeup_source_register(&pdev->dev, "sec-battery-update-data");
  8081. #endif
  8082. battery->misc_event_ws = wakeup_source_register(&pdev->dev, "sec-battery-misc-event");
  8083. battery->parse_mode_dt_ws = wakeup_source_register(&pdev->dev, "sec-battery-parse_mode_dt");
  8084. battery->dev_init_ws = wakeup_source_register(&pdev->dev, "sec-battery-dev-init");
  8085. battery->usb_conn_check_ws = wakeup_source_register(&pdev->dev, "sec-battery-usb-thm-check");
  8086. /* create work queue */
  8087. battery->monitor_wqueue =
  8088. create_singlethread_workqueue(dev_name(&pdev->dev));
  8089. if (!battery->monitor_wqueue) {
  8090. dev_err(battery->dev,
  8091. "%s: Fail to Create Workqueue\n", __func__);
  8092. goto err_irq;
  8093. }
  8094. INIT_DELAYED_WORK(&battery->monitor_work, sec_bat_monitor_work);
  8095. INIT_DELAYED_WORK(&battery->cable_work, sec_bat_cable_work);
  8096. INIT_DELAYED_WORK(&battery->slowcharging_work, sec_bat_check_slowcharging_work);
  8097. INIT_DELAYED_WORK(&battery->input_check_work, sec_bat_input_check_work);
  8098. INIT_DELAYED_WORK(&battery->siop_level_work, sec_bat_siop_level_work);
  8099. #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
  8100. INIT_DELAYED_WORK(&battery->fw_init_work, sec_bat_fw_init_work);
  8101. #endif
  8102. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8103. INIT_DELAYED_WORK(&battery->wpc_tx_work, sec_bat_wpc_tx_work);
  8104. INIT_DELAYED_WORK(&battery->wpc_tx_en_work, sec_bat_wpc_tx_en_work);
  8105. INIT_DELAYED_WORK(&battery->wpc_txpower_calc_work, sec_bat_txpower_calc_work);
  8106. INIT_DELAYED_WORK(&battery->ext_event_work, sec_bat_ext_event_work);
  8107. INIT_DELAYED_WORK(&battery->wc20_current_work, sec_bat_wc20_current_work);
  8108. INIT_DELAYED_WORK(&battery->wc_ept_timeout_work, sec_bat_wc_ept_timeout_work);
  8109. #endif
  8110. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  8111. INIT_DELAYED_WORK(&battery->batt_data_work, sec_bat_update_data_work);
  8112. #endif
  8113. INIT_DELAYED_WORK(&battery->misc_event_work, sec_bat_misc_event_work);
  8114. INIT_DELAYED_WORK(&battery->parse_mode_dt_work, sec_bat_parse_mode_dt_work);
  8115. INIT_DELAYED_WORK(&battery->dev_init_work, sec_batt_dev_init_work);
  8116. INIT_DELAYED_WORK(&battery->afc_init_work, sec_bat_afc_init_work);
  8117. INIT_DELAYED_WORK(&battery->usb_conn_check_work, sec_bat_usb_conn_check_work);
  8118. INIT_DELAYED_WORK(&battery->transit_clear_work, sec_bat_transit_clear_work);
  8119. battery->fcc_vote = sec_vote_init("FCC", SEC_VOTE_MIN, VOTER_MAX,
  8120. 500, sec_voter_name, set_charging_current, battery);
  8121. battery->input_vote = sec_vote_init("ICL", SEC_VOTE_MIN, VOTER_MAX,
  8122. 500, sec_voter_name, set_input_current, battery);
  8123. battery->fv_vote = sec_vote_init("FV", SEC_VOTE_MIN, VOTER_MAX,
  8124. battery->pdata->chg_float_voltage, sec_voter_name, set_float_voltage, battery);
  8125. battery->dc_fv_vote = sec_vote_init("DCFV", SEC_VOTE_MIN, VOTER_MAX,
  8126. battery->pdata->chg_float_voltage, sec_voter_name, set_dc_float_voltage, battery);
  8127. battery->chgen_vote = sec_vote_init("CHGEN", SEC_VOTE_MIN, VOTER_MAX,
  8128. SEC_BAT_CHG_MODE_CHARGING_OFF, sec_voter_name, sec_bat_set_charge, battery);
  8129. battery->topoff_vote = sec_vote_init("TOPOFF", SEC_VOTE_MIN, VOTER_MAX,
  8130. battery->pdata->full_check_current_1st, sec_voter_name, set_topoff_current, battery);
  8131. battery->iv_vote = sec_vote_init("IV", SEC_VOTE_MIN, VOTER_MAX,
  8132. SEC_INPUT_VOLTAGE_5V, sec_voter_name, sec_bat_change_iv, battery);
  8133. /* set vote priority */
  8134. change_sec_voter_pri(battery->iv_vote, VOTER_MUIC_ABNORMAL, VOTE_PRI_10);
  8135. change_sec_voter_pri(battery->iv_vote, VOTER_MST, VOTE_PRI_10);
  8136. change_sec_voter_pri(battery->iv_vote, VOTER_CHANGE_CHGMODE, VOTE_PRI_9);
  8137. change_sec_voter_pri(battery->iv_vote, VOTER_WC_TX, VOTE_PRI_8);
  8138. change_sec_voter_pri(battery->iv_vote, VOTER_AICL, VOTE_PRI_1);
  8139. change_sec_voter_pri(battery->iv_vote, VOTER_FLASH, VOTE_PRI_3);
  8140. change_sec_voter_pri(battery->chgen_vote, VOTER_NO_BATTERY, VOTE_PRI_10);
  8141. change_sec_voter_pri(battery->chgen_vote, VOTER_CHANGE_CHGMODE, VOTE_PRI_9);
  8142. change_sec_voter_pri(battery->fv_vote, VOTER_SWELLING, VOTE_PRI_10);
  8143. change_sec_voter_pri(battery->dc_fv_vote, VOTER_SWELLING, VOTE_PRI_10);
  8144. switch (pdata->polling_type) {
  8145. case SEC_BATTERY_MONITOR_WORKQUEUE:
  8146. INIT_DELAYED_WORK(&battery->polling_work,
  8147. sec_bat_polling_work);
  8148. break;
  8149. case SEC_BATTERY_MONITOR_ALARM:
  8150. battery->last_poll_time = ktime_get_boottime();
  8151. alarm_init(&battery->polling_alarm, ALARM_BOOTTIME,
  8152. sec_bat_alarm);
  8153. break;
  8154. default:
  8155. break;
  8156. }
  8157. battery->pogo_status = 0;
  8158. battery->pogo_9v = false;
  8159. battery->is_fpdo_dc = false;
  8160. battery->ta_alert_mode = OCP_NONE;
  8161. battery->present = true;
  8162. battery->is_jig_on = false;
  8163. battery->wdt_kick_disable = 0;
  8164. battery->polling_count = 1; /* initial value = 1 */
  8165. battery->polling_time = pdata->polling_time[
  8166. SEC_BATTERY_POLLING_TIME_DISCHARGING];
  8167. battery->polling_in_sleep = false;
  8168. battery->polling_short = false;
  8169. battery->check_count = 0;
  8170. battery->check_adc_count = 0;
  8171. battery->check_adc_value = 0;
  8172. battery->input_current = 0;
  8173. battery->charging_current = 0;
  8174. #if IS_ENABLED(CONFIG_DUAL_BATTERY)
  8175. battery->main_current = 0;
  8176. battery->sub_current = 0;
  8177. battery->limiter_check = false;
  8178. battery->set_lower_curr = false;
  8179. #endif
  8180. battery->topoff_condition = 0;
  8181. battery->wpc_vout_level = WIRELESS_VOUT_10V;
  8182. battery->wpc_max_vout_level = WIRELESS_VOUT_12_5V;
  8183. battery->charging_retention_time = 0;
  8184. battery->charging_start_time = 0;
  8185. battery->charging_passed_time = 0;
  8186. battery->wc_heating_start_time = 0;
  8187. battery->wc_heating_passed_time = 0;
  8188. battery->charging_next_time = 0;
  8189. battery->charging_fullcharged_time = 0;
  8190. battery->siop_level = 100;
  8191. battery->wc_enable = true;
  8192. battery->wc_enable_cnt = 0;
  8193. battery->wc_enable_cnt_value = 3;
  8194. battery->stability_test = 0;
  8195. battery->eng_not_full_status = 0;
  8196. #if defined(CONFIG_ENG_BATTERY_CONCEPT)
  8197. #if defined(CONFIG_STEP_CHARGING)
  8198. battery->test_step_condition = 0x7FFF;
  8199. #endif
  8200. battery->test_max_current = false;
  8201. battery->test_charge_current = false;
  8202. #endif
  8203. battery->wc_status = SEC_BATTERY_CABLE_NONE;
  8204. battery->wc_cv_mode = false;
  8205. battery->wire_status = SEC_BATTERY_CABLE_NONE;
  8206. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  8207. battery->bc12_cable = SEC_BATTERY_CABLE_NONE;
  8208. #endif
  8209. #if defined(CONFIG_WIRELESS_RX_PHM_CTRL)
  8210. battery->wc_rx_pdetb_mode = false;
  8211. #else
  8212. battery->wc_rx_phm_mode = false;
  8213. #endif
  8214. battery->wc_tx_phm_mode = false;
  8215. battery->wc_tx_enable = false;
  8216. battery->uno_en = false;
  8217. battery->afc_disable = false;
  8218. battery->pd_disable = false;
  8219. battery->buck_cntl_by_tx = false;
  8220. battery->wc_tx_vout = WC_TX_VOUT_5000MV;
  8221. battery->wc_rx_type = NO_DEV;
  8222. battery->tx_mfc_iout = 0;
  8223. battery->tx_uno_iout = 0;
  8224. battery->wc_need_ldo_on = false;
  8225. battery->tx_minduty = battery->pdata->tx_minduty_default;
  8226. battery->chg_limit = false;
  8227. battery->lrp_limit = false;
  8228. battery->lrp_step = LRP_NONE;
  8229. battery->mix_limit = false;
  8230. battery->usb_temp = 0;
  8231. battery->dchg_temp = 0;
  8232. battery->blkt_temp = 0;
  8233. battery->lrp = 0;
  8234. battery->lrp_test = 0;
  8235. #if IS_ENABLED(CONFIG_DIRECT_CHARGING)
  8236. battery->lrp_chg_src = SEC_CHARGING_SOURCE_DIRECT;
  8237. #endif
  8238. battery->skip_swelling = false;
  8239. battery->wpc_temp_v2_offset = 0;
  8240. battery->bat_thm_count = 0;
  8241. battery->adc_init_count = 0;
  8242. battery->led_cover = 0;
  8243. battery->mag_cover = 0;
  8244. battery->hiccup_status = 0;
  8245. battery->hiccup_clear = false;
  8246. battery->ext_event = BATT_EXT_EVENT_NONE;
  8247. battery->tx_retry_case = SEC_BAT_TX_RETRY_NONE;
  8248. battery->tx_misalign_cnt = 0;
  8249. battery->tx_ocp_cnt = 0;
  8250. battery->auto_mode = false;
  8251. battery->update_pd_list = false;
  8252. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  8253. battery->is_recharging = false;
  8254. battery->cable_type = SEC_BATTERY_CABLE_NONE;
  8255. battery->test_mode = 0;
  8256. battery->factory_mode = false;
  8257. battery->display_test = false;
  8258. battery->store_mode = false;
  8259. battery->prev_usb_conf = USB_CURRENT_NONE;
  8260. battery->is_hc_usb = false;
  8261. battery->is_sysovlo = false;
  8262. battery->is_vbatovlo = false;
  8263. battery->is_abnormal_temp = false;
  8264. battery->hv_pdo = false;
  8265. battery->safety_timer_set = true;
  8266. battery->stop_timer = false;
  8267. battery->prev_safety_time = 0;
  8268. battery->lcd_status = true;
  8269. battery->wc_auth_retried = false;
  8270. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8271. battery->wc_ept_timeout = false;
  8272. battery->wc20_power_class = 0;
  8273. battery->wc20_vout = 0;
  8274. battery->wc20_rx_power = 0;
  8275. #endif
  8276. battery->thermal_zone = BAT_THERMAL_NORMAL;
  8277. sec_bat_set_threshold(battery, battery->cable_type);
  8278. battery->usb_overheat_check = false;
  8279. battery->skip_cisd = false;
  8280. battery->batt_cycle = -1;
  8281. battery->batt_full_status_usage = -1;
  8282. battery->pdata->age_step = 0;
  8283. battery->batt_asoc = 100;
  8284. battery->health_change = false;
  8285. battery->usb_conn_status = USB_CONN_NORMAL;
  8286. battery->lrp_temp = 0x7FFF;
  8287. battery->lr_start_time = 0;
  8288. battery->lr_time_span = 0;
  8289. battery->usb_slow_chg = false;
  8290. battery->usb_bootcomplete = false;
  8291. #if IS_ENABLED(CONFIG_MTK_CHARGER)
  8292. battery->mtk_fg_init = false;
  8293. #endif
  8294. battery->d2d_auth = D2D_AUTH_NONE;
  8295. battery->vpdo_src_boost = false;
  8296. battery->vpdo_ocp = false;
  8297. battery->vpdo_auth_stat = AUTH_NONE;
  8298. battery->hp_d2d = HP_D2D_NONE;
  8299. if (battery->pdata->soc_by_repcap_en) {
  8300. battery->eoc_d->eoc_check = false;
  8301. battery->eoc_d->eoc_cnt = 0;
  8302. }
  8303. battery->dc_check_cnt = 0;
  8304. battery->srccap_transit_cnt = 0;
  8305. battery->abnormal_ta = false;
  8306. battery->smart_sw_src = false;
  8307. ttf_init(battery);
  8308. sec_battery_cisd_init(battery);
  8309. #if defined(CONFIG_STORE_MODE) && !defined(CONFIG_SEC_FACTORY)
  8310. battery->store_mode = true;
  8311. sec_bat_parse_mode_dt(battery);
  8312. #endif
  8313. #if defined(CONFIG_WIRELESS_AUTH)
  8314. sec_bat_misc_init(battery);
  8315. #endif
  8316. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8317. if ((battery->pdata->charging_current[SEC_BATTERY_CABLE_WIRELESS].input_current_limit <= battery->pdata->wpc_input_limit_current) ||
  8318. (battery->pdata->charging_current[SEC_BATTERY_CABLE_WIRELESS].input_current_limit <= battery->pdata->wpc_lcd_on_input_limit_current))
  8319. battery->nv_wc_temp_ctrl_skip = true;
  8320. else
  8321. battery->nv_wc_temp_ctrl_skip = false;
  8322. #endif
  8323. if (battery->pdata->charger_name == NULL)
  8324. battery->pdata->charger_name = "sec-charger";
  8325. if (battery->pdata->fuelgauge_name == NULL)
  8326. battery->pdata->fuelgauge_name = "sec-fuelgauge";
  8327. if (battery->pdata->check_battery_callback)
  8328. battery->present = battery->pdata->check_battery_callback();
  8329. if (sec_bat_get_fgreset())
  8330. sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_FG_RESET,
  8331. SEC_BAT_CURRENT_EVENT_FG_RESET);
  8332. battery_cfg.drv_data = battery;
  8333. /* init power supplier framework */
  8334. battery->psy_usb = power_supply_register(&pdev->dev, &usb_power_supply_desc, &battery_cfg);
  8335. if (IS_ERR(battery->psy_usb)) {
  8336. ret = PTR_ERR(battery->psy_usb);
  8337. dev_err(battery->dev,
  8338. "%s: Failed to Register psy_usb(%d)\n", __func__, ret);
  8339. goto err_workqueue;
  8340. }
  8341. battery->psy_usb->supplied_to = supply_list;
  8342. battery->psy_usb->num_supplicants = ARRAY_SIZE(supply_list);
  8343. battery->psy_ac = power_supply_register(&pdev->dev, &ac_power_supply_desc, &battery_cfg);
  8344. if (IS_ERR(battery->psy_ac)) {
  8345. ret = PTR_ERR(battery->psy_ac);
  8346. dev_err(battery->dev,
  8347. "%s: Failed to Register psy_ac(%d)\n", __func__, ret);
  8348. goto err_supply_unreg_usb;
  8349. }
  8350. battery->psy_ac->supplied_to = supply_list;
  8351. battery->psy_ac->num_supplicants = ARRAY_SIZE(supply_list);
  8352. battery->psy_bat = power_supply_register(&pdev->dev, &battery_power_supply_desc, &battery_cfg);
  8353. if (IS_ERR(battery->psy_bat)) {
  8354. ret = PTR_ERR(battery->psy_bat);
  8355. dev_err(battery->dev,
  8356. "%s: Failed to Register psy_bat(%d)\n", __func__, ret);
  8357. goto err_supply_unreg_ac;
  8358. }
  8359. battery->psy_pogo = power_supply_register(&pdev->dev, &pogo_power_supply_desc, &battery_cfg);
  8360. if (IS_ERR(battery->psy_pogo)) {
  8361. ret = PTR_ERR(battery->psy_pogo);
  8362. dev_err(battery->dev,
  8363. "%s: Failed to Register psy_pogo(%d)\n", __func__, ret);
  8364. goto err_supply_unreg_bat;
  8365. }
  8366. battery->psy_wireless = power_supply_register(&pdev->dev, &wireless_power_supply_desc, &battery_cfg);
  8367. if (IS_ERR(battery->psy_wireless)) {
  8368. ret = PTR_ERR(battery->psy_wireless);
  8369. dev_err(battery->dev,
  8370. "%s: Failed to Register psy_wireless(%d)\n", __func__, ret);
  8371. goto err_supply_unreg_pogo;
  8372. }
  8373. battery->psy_wireless->supplied_to = supply_list;
  8374. battery->psy_wireless->num_supplicants = ARRAY_SIZE(supply_list);
  8375. battery->psy_otg = power_supply_register(&pdev->dev, &otg_power_supply_desc, &battery_cfg);
  8376. if (IS_ERR(battery->psy_otg)) {
  8377. ret = PTR_ERR(battery->psy_otg);
  8378. dev_err(battery->dev,
  8379. "%s: Failed to Register psy_otg(%d)\n", __func__, ret);
  8380. goto err_supply_unreg_wireless;
  8381. }
  8382. if (device_create_file(&battery->psy_wireless->dev, &dev_attr_sgf))
  8383. dev_err(battery->dev,
  8384. "%s: failed to create sgf attr\n", __func__);
  8385. ret = sec_bat_create_attrs(&battery->psy_bat->dev);
  8386. if (ret) {
  8387. dev_err(battery->dev,
  8388. "%s : Failed to sec_bat_create_attrs\n", __func__);
  8389. goto err_req_irq;
  8390. }
  8391. ret = sec_pogo_create_attrs(&battery->psy_pogo->dev);
  8392. if (ret) {
  8393. dev_err(battery->dev,
  8394. "%s : Failed to sec_pogo_create_attrs\n", __func__);
  8395. goto err_req_irq;
  8396. }
  8397. ret = sec_otg_create_attrs(&battery->psy_otg->dev);
  8398. if (ret) {
  8399. dev_err(battery->dev,
  8400. "%s : Failed to sec_otg_create_attrs\n", __func__);
  8401. goto err_req_irq;
  8402. }
  8403. ret = sb_full_soc_init(battery);
  8404. dev_info(battery->dev, "%s: sb_full_soc (%s)\n", __func__, (ret) ? "fail" : "success");
  8405. ret = sb_notify_register(&battery->sb_nb, sb_handle_notification, "battery", SB_DEV_BATTERY);
  8406. dev_info(battery->dev, "%s: sb_notify_register (%s)\n", __func__, (ret) ? "fail" : "success");
  8407. sb_ca_init(battery->dev);
  8408. sb_bd_init();
  8409. __pm_stay_awake(battery->dev_init_ws);
  8410. queue_delayed_work(battery->monitor_wqueue, &battery->dev_init_work, 0);
  8411. pr_info("%s: SEC Battery Driver Loaded\n", __func__);
  8412. return 0;
  8413. err_req_irq:
  8414. power_supply_unregister(battery->psy_otg);
  8415. err_supply_unreg_wireless:
  8416. power_supply_unregister(battery->psy_wireless);
  8417. err_supply_unreg_pogo:
  8418. power_supply_unregister(battery->psy_pogo);
  8419. err_supply_unreg_bat:
  8420. power_supply_unregister(battery->psy_bat);
  8421. err_supply_unreg_ac:
  8422. power_supply_unregister(battery->psy_ac);
  8423. err_supply_unreg_usb:
  8424. power_supply_unregister(battery->psy_usb);
  8425. err_workqueue:
  8426. destroy_workqueue(battery->monitor_wqueue);
  8427. err_irq:
  8428. wakeup_source_unregister(battery->monitor_ws);
  8429. wakeup_source_unregister(battery->cable_ws);
  8430. wakeup_source_unregister(battery->vbus_ws);
  8431. wakeup_source_unregister(battery->input_ws);
  8432. wakeup_source_unregister(battery->siop_level_ws);
  8433. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8434. wakeup_source_unregister(battery->ext_event_ws);
  8435. wakeup_source_unregister(battery->wpc_tx_ws);
  8436. wakeup_source_unregister(battery->wpc_tx_en_ws);
  8437. wakeup_source_unregister(battery->tx_event_ws);
  8438. wakeup_source_unregister(battery->wc20_current_ws);
  8439. wakeup_source_unregister(battery->wc_ept_timeout_ws);
  8440. #endif
  8441. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  8442. wakeup_source_unregister(battery->batt_data_ws);
  8443. #endif
  8444. wakeup_source_unregister(battery->misc_event_ws);
  8445. wakeup_source_unregister(battery->parse_mode_dt_ws);
  8446. wakeup_source_unregister(battery->dev_init_ws);
  8447. wakeup_source_unregister(battery->usb_conn_check_ws);
  8448. mutex_destroy(&battery->iolock);
  8449. mutex_destroy(&battery->misclock);
  8450. mutex_destroy(&battery->txeventlock);
  8451. mutex_destroy(&battery->batt_handlelock);
  8452. mutex_destroy(&battery->current_eventlock);
  8453. mutex_destroy(&battery->typec_notylock);
  8454. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  8455. mutex_destroy(&battery->bc12_notylock);
  8456. #endif
  8457. mutex_destroy(&battery->wclock);
  8458. mutex_destroy(&battery->voutlock);
  8459. err_pdata_free:
  8460. if (battery->pdata->soc_by_repcap_en)
  8461. kfree(pdata);
  8462. err_bat_free:
  8463. kfree(battery);
  8464. return ret;
  8465. }
  8466. static int sec_battery_remove(struct platform_device *pdev)
  8467. {
  8468. struct sec_battery_info *battery = platform_get_drvdata(pdev);
  8469. pr_info("%s: ++\n", __func__);
  8470. switch (battery->pdata->polling_type) {
  8471. case SEC_BATTERY_MONITOR_WORKQUEUE:
  8472. cancel_delayed_work(&battery->polling_work);
  8473. break;
  8474. case SEC_BATTERY_MONITOR_ALARM:
  8475. alarm_cancel(&battery->polling_alarm);
  8476. break;
  8477. default:
  8478. break;
  8479. }
  8480. unregister_batterylog_proc();
  8481. flush_workqueue(battery->monitor_wqueue);
  8482. destroy_workqueue(battery->monitor_wqueue);
  8483. wakeup_source_unregister(battery->monitor_ws);
  8484. wakeup_source_unregister(battery->cable_ws);
  8485. wakeup_source_unregister(battery->vbus_ws);
  8486. wakeup_source_unregister(battery->input_ws);
  8487. wakeup_source_unregister(battery->siop_level_ws);
  8488. wakeup_source_unregister(battery->misc_event_ws);
  8489. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8490. wakeup_source_unregister(battery->ext_event_ws);
  8491. wakeup_source_unregister(battery->wpc_tx_ws);
  8492. wakeup_source_unregister(battery->wpc_tx_en_ws);
  8493. wakeup_source_unregister(battery->tx_event_ws);
  8494. wakeup_source_unregister(battery->wc20_current_ws);
  8495. wakeup_source_unregister(battery->wc_ept_timeout_ws);
  8496. #endif
  8497. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  8498. wakeup_source_unregister(battery->batt_data_ws);
  8499. #endif
  8500. wakeup_source_unregister(battery->parse_mode_dt_ws);
  8501. wakeup_source_unregister(battery->dev_init_ws);
  8502. wakeup_source_unregister(battery->usb_conn_check_ws);
  8503. mutex_destroy(&battery->iolock);
  8504. mutex_destroy(&battery->misclock);
  8505. mutex_destroy(&battery->txeventlock);
  8506. mutex_destroy(&battery->batt_handlelock);
  8507. mutex_destroy(&battery->current_eventlock);
  8508. mutex_destroy(&battery->typec_notylock);
  8509. #if IS_ENABLED(CONFIG_MTK_CHARGER) && !IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  8510. mutex_destroy(&battery->bc12_notylock);
  8511. #endif
  8512. mutex_destroy(&battery->wclock);
  8513. mutex_destroy(&battery->voutlock);
  8514. adc_exit(battery);
  8515. power_supply_unregister(battery->psy_otg);
  8516. power_supply_unregister(battery->psy_wireless);
  8517. power_supply_unregister(battery->psy_pogo);
  8518. power_supply_unregister(battery->psy_ac);
  8519. power_supply_unregister(battery->psy_usb);
  8520. power_supply_unregister(battery->psy_bat);
  8521. kfree(battery);
  8522. pr_info("%s: --\n", __func__);
  8523. return 0;
  8524. }
  8525. static int sec_battery_prepare(struct device *dev)
  8526. {
  8527. struct sec_battery_info *battery
  8528. = dev_get_drvdata(dev);
  8529. dev_info(battery->dev, "%s: Start\n", __func__);
  8530. switch (battery->pdata->polling_type) {
  8531. case SEC_BATTERY_MONITOR_WORKQUEUE:
  8532. cancel_delayed_work(&battery->polling_work);
  8533. break;
  8534. case SEC_BATTERY_MONITOR_ALARM:
  8535. alarm_cancel(&battery->polling_alarm);
  8536. break;
  8537. default:
  8538. break;
  8539. }
  8540. /* monitor_ws should be unlocked before cancel monitor_work */
  8541. __pm_relax(battery->monitor_ws);
  8542. cancel_delayed_work_sync(&battery->monitor_work);
  8543. battery->polling_in_sleep = true;
  8544. sec_bat_set_polling(battery);
  8545. /*
  8546. * cancel work for polling
  8547. * that is set in sec_bat_set_polling()
  8548. * no need for polling in sleep
  8549. */
  8550. if (battery->pdata->polling_type ==
  8551. SEC_BATTERY_MONITOR_WORKQUEUE)
  8552. cancel_delayed_work(&battery->polling_work);
  8553. dev_info(battery->dev, "%s: End\n", __func__);
  8554. return 0;
  8555. }
  8556. static int sec_battery_suspend(struct device *dev)
  8557. {
  8558. return 0;
  8559. }
  8560. static int sec_battery_resume(struct device *dev)
  8561. {
  8562. return 0;
  8563. }
  8564. static void sec_battery_complete(struct device *dev)
  8565. {
  8566. struct sec_battery_info *battery
  8567. = dev_get_drvdata(dev);
  8568. dev_info(battery->dev, "%s: Start\n", __func__);
  8569. /* cancel current alarm and reset after monitor work */
  8570. if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
  8571. alarm_cancel(&battery->polling_alarm);
  8572. __pm_stay_awake(battery->monitor_ws);
  8573. queue_delayed_work(battery->monitor_wqueue,
  8574. &battery->monitor_work, 0);
  8575. dev_info(battery->dev, "%s: End\n", __func__);
  8576. return;
  8577. }
  8578. static void sec_battery_shutdown(struct platform_device *pdev)
  8579. {
  8580. struct sec_battery_info *battery = platform_get_drvdata(pdev);
  8581. pr_info("%s: ++\n", __func__);
  8582. switch (battery->pdata->polling_type) {
  8583. case SEC_BATTERY_MONITOR_WORKQUEUE:
  8584. cancel_delayed_work(&battery->polling_work);
  8585. break;
  8586. case SEC_BATTERY_MONITOR_ALARM:
  8587. alarm_cancel(&battery->polling_alarm);
  8588. break;
  8589. default:
  8590. break;
  8591. }
  8592. cancel_delayed_work(&battery->monitor_work);
  8593. cancel_delayed_work(&battery->cable_work);
  8594. cancel_delayed_work(&battery->slowcharging_work);
  8595. cancel_delayed_work(&battery->input_check_work);
  8596. cancel_delayed_work(&battery->siop_level_work);
  8597. #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
  8598. cancel_delayed_work(&battery->fw_init_work);
  8599. #endif
  8600. #if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
  8601. cancel_delayed_work(&battery->wpc_tx_work);
  8602. cancel_delayed_work(&battery->wpc_tx_en_work);
  8603. cancel_delayed_work(&battery->wpc_txpower_calc_work);
  8604. cancel_delayed_work(&battery->ext_event_work);
  8605. cancel_delayed_work(&battery->wc20_current_work);
  8606. cancel_delayed_work(&battery->wc_ept_timeout_work);
  8607. #endif
  8608. #if defined(CONFIG_UPDATE_BATTERY_DATA)
  8609. cancel_delayed_work(&battery->batt_data_work);
  8610. #endif
  8611. cancel_delayed_work(&battery->misc_event_work);
  8612. cancel_delayed_work(&battery->parse_mode_dt_work);
  8613. cancel_delayed_work(&battery->dev_init_work);
  8614. cancel_delayed_work(&battery->afc_init_work);
  8615. cancel_delayed_work(&battery->usb_conn_check_work);
  8616. cancel_delayed_work(&battery->transit_clear_work);
  8617. pr_info("%s: --\n", __func__);
  8618. }
  8619. #ifdef CONFIG_OF
  8620. static struct of_device_id sec_battery_dt_ids[] = {
  8621. { .compatible = "samsung,sec-battery" },
  8622. { }
  8623. };
  8624. MODULE_DEVICE_TABLE(of, sec_battery_dt_ids);
  8625. #endif /* CONFIG_OF */
  8626. static const struct dev_pm_ops sec_battery_pm_ops = {
  8627. .prepare = sec_battery_prepare,
  8628. .suspend = sec_battery_suspend,
  8629. .resume = sec_battery_resume,
  8630. .complete = sec_battery_complete,
  8631. };
  8632. static struct platform_driver sec_battery_driver = {
  8633. .driver = {
  8634. .name = "sec-battery",
  8635. .owner = THIS_MODULE,
  8636. .pm = &sec_battery_pm_ops,
  8637. #ifdef CONFIG_OF
  8638. .of_match_table = sec_battery_dt_ids,
  8639. #endif
  8640. },
  8641. .probe = sec_battery_probe,
  8642. .remove = sec_battery_remove,
  8643. .shutdown = sec_battery_shutdown,
  8644. };
  8645. static int __init sec_battery_init(void)
  8646. {
  8647. sec_chg_init_gdev();
  8648. return platform_driver_register(&sec_battery_driver);
  8649. }
  8650. static void __exit sec_battery_exit(void)
  8651. {
  8652. platform_driver_unregister(&sec_battery_driver);
  8653. }
  8654. late_initcall(sec_battery_init);
  8655. module_exit(sec_battery_exit);
  8656. MODULE_DESCRIPTION("Samsung Battery Driver");
  8657. MODULE_AUTHOR("Samsung Electronics");
  8658. MODULE_LICENSE("GPL");