sec_battery.c 144 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084
  1. /*
  2. * sec_battery.c
  3. * Samsung Mobile Battery Driver
  4. *
  5. * Copyright (C) 2012 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/sec_battery.h>
  13. #if defined(CONFIG_SENSORS_QPNP_ADC_VOLTAGE)
  14. #include <linux/qpnp/qpnp-adc.h>
  15. #endif
  16. #ifdef CONFIG_SAMSUNG_BATTERY_DISALLOW_DEEP_SLEEP
  17. #include <linux/clk.h>
  18. #endif
  19. #if defined(CONFIG_TMM_CHG_CTRL)
  20. #define TUNER_SWITCHED_ON_SIGNAL -1
  21. #define TUNER_SWITCHED_OFF_SIGNAL -2
  22. #define TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE 800
  23. #define TUNER_IS_ON 1
  24. #define TUNER_IS_OFF 0
  25. #endif
  26. #ifdef CONFIG_SAMSUNG_BATTERY_DISALLOW_DEEP_SLEEP
  27. struct clk * xo_chr = NULL;
  28. #endif
  29. static struct device_attribute sec_battery_attrs[] = {
  30. SEC_BATTERY_ATTR(batt_reset_soc),
  31. SEC_BATTERY_ATTR(batt_read_raw_soc),
  32. SEC_BATTERY_ATTR(batt_read_adj_soc),
  33. SEC_BATTERY_ATTR(batt_type),
  34. SEC_BATTERY_ATTR(batt_vfocv),
  35. SEC_BATTERY_ATTR(batt_vol_adc),
  36. SEC_BATTERY_ATTR(batt_vol_adc_cal),
  37. SEC_BATTERY_ATTR(batt_vol_aver),
  38. SEC_BATTERY_ATTR(batt_vol_adc_aver),
  39. SEC_BATTERY_ATTR(batt_current_ua_now),
  40. SEC_BATTERY_ATTR(batt_current_ua_avg),
  41. SEC_BATTERY_ATTR(batt_temp),
  42. SEC_BATTERY_ATTR(batt_temp_adc),
  43. SEC_BATTERY_ATTR(batt_temp_aver),
  44. SEC_BATTERY_ATTR(batt_temp_adc_aver),
  45. SEC_BATTERY_ATTR(chg_temp),
  46. SEC_BATTERY_ATTR(chg_temp_adc),
  47. SEC_BATTERY_ATTR(batt_vf_adc),
  48. SEC_BATTERY_ATTR(batt_slate_mode),
  49. SEC_BATTERY_ATTR(batt_lp_charging),
  50. SEC_BATTERY_ATTR(siop_activated),
  51. SEC_BATTERY_ATTR(siop_level),
  52. SEC_BATTERY_ATTR(batt_charging_source),
  53. SEC_BATTERY_ATTR(fg_reg_dump),
  54. SEC_BATTERY_ATTR(fg_reset_cap),
  55. SEC_BATTERY_ATTR(fg_capacity),
  56. SEC_BATTERY_ATTR(fg_asoc),
  57. SEC_BATTERY_ATTR(auth),
  58. SEC_BATTERY_ATTR(chg_current_adc),
  59. SEC_BATTERY_ATTR(wc_adc),
  60. SEC_BATTERY_ATTR(wc_status),
  61. SEC_BATTERY_ATTR(wc_enable),
  62. SEC_BATTERY_ATTR(hv_charger_status),
  63. SEC_BATTERY_ATTR(hv_charger_set),
  64. SEC_BATTERY_ATTR(factory_mode),
  65. SEC_BATTERY_ATTR(store_mode),
  66. SEC_BATTERY_ATTR(update),
  67. SEC_BATTERY_ATTR(test_mode),
  68. SEC_BATTERY_ATTR(call),
  69. SEC_BATTERY_ATTR(2g_call),
  70. SEC_BATTERY_ATTR(talk_gsm),
  71. SEC_BATTERY_ATTR(3g_call),
  72. SEC_BATTERY_ATTR(talk_wcdma),
  73. SEC_BATTERY_ATTR(music),
  74. SEC_BATTERY_ATTR(video),
  75. SEC_BATTERY_ATTR(browser),
  76. SEC_BATTERY_ATTR(hotspot),
  77. SEC_BATTERY_ATTR(camera),
  78. SEC_BATTERY_ATTR(camcorder),
  79. SEC_BATTERY_ATTR(data_call),
  80. SEC_BATTERY_ATTR(wifi),
  81. SEC_BATTERY_ATTR(wibro),
  82. SEC_BATTERY_ATTR(lte),
  83. SEC_BATTERY_ATTR(lcd),
  84. SEC_BATTERY_ATTR(gps),
  85. SEC_BATTERY_ATTR(event),
  86. SEC_BATTERY_ATTR(batt_temp_table),
  87. SEC_BATTERY_ATTR(batt_high_current_usb),
  88. #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
  89. SEC_BATTERY_ATTR(test_charge_current),
  90. #endif
  91. SEC_BATTERY_ATTR(set_stability_test),
  92. SEC_BATTERY_ATTR(batt_inbat_voltage),
  93. SEC_BATTERY_ATTR(batt_capacity_max),
  94. };
  95. #if defined(CONFIG_QPNP_BMS)
  96. static char *pm_batt_supplied_to[] = {
  97. "bms",
  98. };
  99. #endif
  100. static enum power_supply_property sec_battery_props[] = {
  101. POWER_SUPPLY_PROP_STATUS,
  102. POWER_SUPPLY_PROP_CHARGE_TYPE,
  103. POWER_SUPPLY_PROP_HEALTH,
  104. POWER_SUPPLY_PROP_PRESENT,
  105. POWER_SUPPLY_PROP_ONLINE,
  106. POWER_SUPPLY_PROP_TECHNOLOGY,
  107. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  108. POWER_SUPPLY_PROP_VOLTAGE_AVG,
  109. POWER_SUPPLY_PROP_CURRENT_NOW,
  110. POWER_SUPPLY_PROP_CURRENT_AVG,
  111. POWER_SUPPLY_PROP_CHARGE_NOW,
  112. POWER_SUPPLY_PROP_CAPACITY,
  113. POWER_SUPPLY_PROP_TEMP,
  114. POWER_SUPPLY_PROP_TEMP_AMBIENT,
  115. #if defined(CONFIG_QPNP_CHARGER)
  116. POWER_SUPPLY_PROP_BATFET,
  117. #endif
  118. };
  119. static enum power_supply_property sec_power_props[] = {
  120. POWER_SUPPLY_PROP_ONLINE,
  121. #if defined(CONFIG_QPNP_CHARGER)
  122. POWER_SUPPLY_PROP_PRESENT,
  123. POWER_SUPPLY_PROP_CURRENT_MAX,
  124. #endif
  125. };
  126. static enum power_supply_property sec_ps_props[] = {
  127. POWER_SUPPLY_PROP_STATUS,
  128. POWER_SUPPLY_PROP_ONLINE,
  129. };
  130. static char *supply_list[] = {
  131. "battery",
  132. };
  133. char *sec_bat_charging_mode_str[] = {
  134. "None",
  135. "Normal",
  136. "Additional",
  137. "Re-Charging",
  138. "ABS"
  139. };
  140. char *sec_bat_status_str[] = {
  141. "Unknown",
  142. "Charging",
  143. "Discharging",
  144. "Not-charging",
  145. "Full"
  146. };
  147. char *sec_bat_health_str[] = {
  148. "Unknown",
  149. "Good",
  150. "Overheat",
  151. "Warm",
  152. "Dead",
  153. "OverVoltage",
  154. "UnspecFailure",
  155. "Cold",
  156. "Cool",
  157. "UnderVoltage",
  158. "OverheatLimit"
  159. };
  160. #if defined(CONFIG_TMM_CHG_CTRL)
  161. static int tuner_running_status;
  162. #endif
  163. static int fg_reset = 1;
  164. static int sec_bat_get_fg_reset(char *val)
  165. {
  166. fg_reset = strncmp(val, "1", 1) ? 0 : 1;
  167. pr_info("%s, fg_reset:%d\n", __func__, fg_reset);
  168. return 1;
  169. }
  170. __setup("fg_reset=", sec_bat_get_fg_reset);
  171. int poweroff_charging;
  172. static int sec_bat_is_lpm_check(char *str)
  173. {
  174. if (strncmp(str, "charger", 7) == 0)
  175. poweroff_charging = 1;
  176. pr_info("%s: Low power charging mode: %d\n", __func__, poweroff_charging);
  177. return poweroff_charging;
  178. }
  179. __setup("androidboot.mode=", sec_bat_is_lpm_check);
  180. static bool sec_bat_is_lpm(struct sec_battery_info *battery)
  181. {
  182. if (battery->pdata->is_lpm) {
  183. return battery->pdata->is_lpm();
  184. } else {
  185. return (bool)poweroff_charging;
  186. }
  187. }
  188. static int sec_bat_set_charge(
  189. struct sec_battery_info *battery,
  190. bool enable)
  191. {
  192. union power_supply_propval val;
  193. struct timespec ts;
  194. #ifdef CONFIG_CONTROL_OTG_POPUP
  195. if(battery->cable_type == POWER_SUPPLY_TYPE_OTG)
  196. return 0;
  197. #endif
  198. val.intval = battery->status;
  199. psy_do_property(battery->pdata->charger_name, set,
  200. POWER_SUPPLY_PROP_STATUS, val);
  201. get_monotonic_boottime(&ts);
  202. if (enable) {
  203. val.intval = battery->cable_type;
  204. /*Reset charging start time only in initial charging start */
  205. if (battery->charging_start_time == 0) {
  206. if (ts.tv_sec < 1)
  207. ts.tv_sec = 1;
  208. battery->charging_start_time = ts.tv_sec;
  209. battery->charging_next_time =
  210. battery->pdata->charging_reset_time;
  211. }
  212. } else {
  213. val.intval = POWER_SUPPLY_TYPE_BATTERY;
  214. battery->charging_start_time = 0;
  215. battery->charging_passed_time = 0;
  216. battery->charging_next_time = 0;
  217. battery->charging_fullcharged_time = 0;
  218. battery->full_check_cnt = 0;
  219. }
  220. #if defined(CONFIG_BATTERY_SWELLING)
  221. battery->charging_block = !enable;
  222. #endif
  223. battery->temp_highlimit_cnt = 0;
  224. battery->temp_high_cnt = 0;
  225. battery->temp_low_cnt = 0;
  226. battery->temp_recover_cnt = 0;
  227. #if defined(CONFIG_TMM_CHG_CTRL)
  228. if((tuner_running_status==TUNER_IS_ON) &&
  229. (battery->pdata->charging_current[val.intval].input_current_limit
  230. > TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE)) {
  231. union power_supply_propval value;
  232. dev_dbg(battery->dev,
  233. "%s: tmm chg current set!\n", __func__);
  234. value.intval = TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE;
  235. psy_do_property(battery->pdata->charger_name, set,
  236. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  237. } else {
  238. psy_do_property(battery->pdata->charger_name, set,
  239. POWER_SUPPLY_PROP_ONLINE, val);
  240. }
  241. #else
  242. psy_do_property(battery->pdata->charger_name, set,
  243. POWER_SUPPLY_PROP_ONLINE, val);
  244. #endif
  245. psy_do_property(battery->pdata->fuelgauge_name, set,
  246. POWER_SUPPLY_PROP_ONLINE, val);
  247. return 0;
  248. }
  249. static int sec_bat_get_adc_data(struct sec_battery_info *battery,
  250. int adc_ch, int count)
  251. {
  252. int adc_data;
  253. int adc_max;
  254. int adc_min;
  255. int adc_total;
  256. int i;
  257. adc_data = 0;
  258. adc_max = 0;
  259. adc_min = 0;
  260. adc_total = 0;
  261. for (i = 0; i < count; i++) {
  262. mutex_lock(&battery->adclock);
  263. #ifdef CONFIG_OF
  264. adc_data = adc_read(battery, adc_ch);
  265. #else
  266. adc_data = adc_read(battery->pdata, adc_ch);
  267. #endif
  268. mutex_unlock(&battery->adclock);
  269. if (adc_data < 0)
  270. goto err;
  271. if (i != 0) {
  272. if (adc_data > adc_max)
  273. adc_max = adc_data;
  274. else if (adc_data < adc_min)
  275. adc_min = adc_data;
  276. } else {
  277. adc_max = adc_data;
  278. adc_min = adc_data;
  279. }
  280. adc_total += adc_data;
  281. }
  282. return (adc_total - adc_max - adc_min) / (count - 2);
  283. err:
  284. return adc_data;
  285. }
  286. /*
  287. static unsigned long calculate_average_adc(
  288. struct sec_battery_info *battery,
  289. int channel, int adc)
  290. {
  291. unsigned int cnt = 0;
  292. int total_adc = 0;
  293. int average_adc = 0;
  294. int index = 0;
  295. cnt = battery->adc_sample[channel].cnt;
  296. total_adc = battery->adc_sample[channel].total_adc;
  297. if (adc < 0) {
  298. dev_err(battery->dev,
  299. "%s : Invalid ADC : %d\n", __func__, adc);
  300. adc = battery->adc_sample[channel].average_adc;
  301. }
  302. if (cnt < ADC_SAMPLE_COUNT) {
  303. battery->adc_sample[channel].adc_arr[cnt] = adc;
  304. battery->adc_sample[channel].index = cnt;
  305. battery->adc_sample[channel].cnt = ++cnt;
  306. total_adc += adc;
  307. average_adc = total_adc / cnt;
  308. } else {
  309. index = battery->adc_sample[channel].index;
  310. if (++index >= ADC_SAMPLE_COUNT)
  311. index = 0;
  312. total_adc = total_adc -
  313. battery->adc_sample[channel].adc_arr[index] + adc;
  314. average_adc = total_adc / ADC_SAMPLE_COUNT;
  315. battery->adc_sample[channel].adc_arr[index] = adc;
  316. battery->adc_sample[channel].index = index;
  317. }
  318. battery->adc_sample[channel].total_adc = total_adc;
  319. battery->adc_sample[channel].average_adc = average_adc;
  320. return average_adc;
  321. }
  322. */
  323. static int sec_bat_get_adc_value(
  324. struct sec_battery_info *battery, int channel)
  325. {
  326. int adc;
  327. adc = sec_bat_get_adc_data(battery, channel,
  328. battery->pdata->adc_check_count);
  329. if (adc < 0) {
  330. dev_err(battery->dev,
  331. "%s: Error in ADC\n", __func__);
  332. return adc;
  333. }
  334. return adc;
  335. }
  336. static int sec_bat_get_charger_type_adc
  337. (struct sec_battery_info *battery)
  338. {
  339. /* It is true something valid is
  340. connected to the device for charging.
  341. By default this something is considered to be USB.*/
  342. int result = POWER_SUPPLY_TYPE_USB;
  343. int adc = 0;
  344. int i;
  345. /* Do NOT check cable type when cable_switch_check() returns false
  346. * and keep current cable type
  347. */
  348. if (battery->pdata->cable_switch_check &&
  349. !battery->pdata->cable_switch_check())
  350. return battery->cable_type;
  351. adc = sec_bat_get_adc_value(battery,
  352. SEC_BAT_ADC_CHANNEL_CABLE_CHECK);
  353. /* Do NOT check cable type when cable_switch_normal() returns false
  354. * and keep current cable type
  355. */
  356. if (battery->pdata->cable_switch_normal &&
  357. !battery->pdata->cable_switch_normal())
  358. return battery->cable_type;
  359. for (i = 0; i < SEC_SIZEOF_POWER_SUPPLY_TYPE; i++)
  360. if ((adc > battery->pdata->cable_adc_value[i].min) &&
  361. (adc < battery->pdata->cable_adc_value[i].max))
  362. break;
  363. if (i >= SEC_SIZEOF_POWER_SUPPLY_TYPE)
  364. dev_err(battery->dev,
  365. "%s : default USB\n", __func__);
  366. else
  367. result = i;
  368. dev_dbg(battery->dev, "%s : result(%d), adc(%d)\n",
  369. __func__, result, adc);
  370. return result;
  371. }
  372. static bool sec_bat_check_vf_adc(struct sec_battery_info *battery)
  373. {
  374. int adc;
  375. adc = sec_bat_get_adc_data(battery,
  376. SEC_BAT_ADC_CHANNEL_BAT_CHECK,
  377. battery->pdata->adc_check_count);
  378. if (adc < 0) {
  379. dev_err(battery->dev, "%s: VF ADC error\n", __func__);
  380. adc = battery->check_adc_value;
  381. } else
  382. battery->check_adc_value = adc;
  383. if ((battery->check_adc_value <= battery->pdata->check_adc_max) &&
  384. (battery->check_adc_value >= battery->pdata->check_adc_min)) {
  385. return true;
  386. } else {
  387. dev_info(battery->dev, "%s: adc (%d)\n", __func__, battery->check_adc_value);
  388. return false;
  389. }
  390. }
  391. static bool sec_bat_check_by_psy(struct sec_battery_info *battery)
  392. {
  393. char *psy_name;
  394. union power_supply_propval value;
  395. bool ret;
  396. ret = true;
  397. switch (battery->pdata->battery_check_type) {
  398. case SEC_BATTERY_CHECK_PMIC:
  399. psy_name = battery->pdata->pmic_name;
  400. break;
  401. case SEC_BATTERY_CHECK_FUELGAUGE:
  402. psy_name = battery->pdata->fuelgauge_name;
  403. break;
  404. case SEC_BATTERY_CHECK_CHARGER:
  405. psy_name = battery->pdata->charger_name;
  406. break;
  407. default:
  408. dev_err(battery->dev,
  409. "%s: Invalid Battery Check Type\n", __func__);
  410. ret = false;
  411. goto battery_check_error;
  412. break;
  413. }
  414. psy_do_property(psy_name, get,
  415. POWER_SUPPLY_PROP_PRESENT, value);
  416. ret = (bool)value.intval;
  417. battery_check_error:
  418. return ret;
  419. }
  420. static bool sec_bat_check(struct sec_battery_info *battery)
  421. {
  422. bool ret;
  423. ret = true;
  424. if (battery->factory_mode || sec_bat_check_jig_status()) {
  425. dev_dbg(battery->dev, "%s: No need to check in factory mode\n",
  426. __func__);
  427. return ret;
  428. }
  429. if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
  430. battery->health != POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
  431. dev_dbg(battery->dev, "%s: No need to check\n", __func__);
  432. return ret;
  433. }
  434. switch (battery->pdata->battery_check_type) {
  435. case SEC_BATTERY_CHECK_ADC:
  436. if(battery->cable_type == POWER_SUPPLY_TYPE_BATTERY)
  437. ret = battery->present;
  438. else
  439. ret = sec_bat_check_vf_adc(battery);
  440. break;
  441. case SEC_BATTERY_CHECK_INT:
  442. case SEC_BATTERY_CHECK_CALLBACK:
  443. if(battery->cable_type == POWER_SUPPLY_TYPE_BATTERY)
  444. ret = battery->present;
  445. else
  446. ret = sec_bat_check_callback(battery);
  447. break;
  448. case SEC_BATTERY_CHECK_PMIC:
  449. case SEC_BATTERY_CHECK_FUELGAUGE:
  450. case SEC_BATTERY_CHECK_CHARGER:
  451. ret = sec_bat_check_by_psy(battery);
  452. break;
  453. case SEC_BATTERY_CHECK_NONE:
  454. dev_dbg(battery->dev, "%s: No Check\n", __func__);
  455. default:
  456. break;
  457. }
  458. return ret;
  459. }
  460. static bool sec_bat_get_cable_type(
  461. struct sec_battery_info *battery,
  462. int cable_source_type)
  463. {
  464. bool ret;
  465. int cable_type;
  466. ret = false;
  467. cable_type = battery->cable_type;
  468. if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_CALLBACK) {
  469. cable_type = sec_bat_check_cable_callback(battery);
  470. }
  471. if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_ADC) {
  472. if (gpio_get_value_cansleep(
  473. battery->pdata->bat_gpio_ta_nconnected) ^
  474. battery->pdata->bat_polarity_ta_nconnected)
  475. cable_type = POWER_SUPPLY_TYPE_BATTERY;
  476. else
  477. cable_type =
  478. sec_bat_get_charger_type_adc(battery);
  479. }
  480. if (battery->cable_type == cable_type) {
  481. dev_dbg(battery->dev,
  482. "%s: No need to change cable status\n", __func__);
  483. } else {
  484. if (cable_type < POWER_SUPPLY_TYPE_BATTERY ||
  485. cable_type >= SEC_SIZEOF_POWER_SUPPLY_TYPE) {
  486. dev_err(battery->dev,
  487. "%s: Invalid cable type\n", __func__);
  488. } else {
  489. battery->cable_type = cable_type;
  490. sec_bat_check_cable_result_callback(battery->dev, battery->cable_type);
  491. ret = true;
  492. dev_dbg(battery->dev, "%s: Cable Changed (%d)\n",
  493. __func__, battery->cable_type);
  494. }
  495. }
  496. return ret;
  497. }
  498. static bool sec_bat_battery_cable_check(struct sec_battery_info *battery)
  499. {
  500. if (!sec_bat_check(battery)) {
  501. if (battery->check_count < battery->pdata->check_count)
  502. battery->check_count++;
  503. else {
  504. dev_err(battery->dev,
  505. "%s: Battery Disconnected\n", __func__);
  506. battery->present = false;
  507. battery->health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
  508. if (battery->status !=
  509. POWER_SUPPLY_STATUS_DISCHARGING) {
  510. #if defined(CONFIG_MACH_JACTIVESKT)
  511. msleep(100);
  512. #endif
  513. battery->status =
  514. POWER_SUPPLY_STATUS_NOT_CHARGING;
  515. sec_bat_set_charge(battery, false);
  516. }
  517. if (battery->pdata->check_battery_result_callback)
  518. battery->pdata->
  519. check_battery_result_callback();
  520. return false;
  521. }
  522. } else
  523. battery->check_count = 0;
  524. battery->present = true;
  525. if (battery->health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
  526. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  527. if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
  528. battery->status = POWER_SUPPLY_STATUS_CHARGING;
  529. #if defined(CONFIG_BATTERY_SWELLING)
  530. if (!battery->swelling_mode)
  531. sec_bat_set_charge(battery, true);
  532. #else
  533. sec_bat_set_charge(battery, true);
  534. #endif
  535. }
  536. }
  537. dev_info(battery->dev, "%s: Battery Connected\n", __func__);
  538. if (battery->pdata->cable_check_type &
  539. SEC_BATTERY_CABLE_CHECK_POLLING) {
  540. if (sec_bat_get_cable_type(battery,
  541. battery->pdata->cable_source_type)) {
  542. __pm_stay_awake(&battery->cable_ws);
  543. queue_delayed_work(battery->monitor_wqueue,
  544. &battery->cable_work, 0);
  545. }
  546. }
  547. return true;
  548. }
  549. static int sec_bat_ovp_uvlo_by_psy(struct sec_battery_info *battery)
  550. {
  551. char *psy_name;
  552. union power_supply_propval value;
  553. value.intval = POWER_SUPPLY_HEALTH_GOOD;
  554. switch (battery->pdata->ovp_uvlo_check_type) {
  555. case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
  556. psy_name = battery->pdata->pmic_name;
  557. break;
  558. case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
  559. psy_name = battery->pdata->charger_name;
  560. break;
  561. default:
  562. dev_err(battery->dev,
  563. "%s: Invalid OVP/UVLO Check Type\n", __func__);
  564. goto ovp_uvlo_check_error;
  565. break;
  566. }
  567. psy_do_property(psy_name, get,
  568. POWER_SUPPLY_PROP_HEALTH, value);
  569. ovp_uvlo_check_error:
  570. return value.intval;
  571. }
  572. static bool sec_bat_ovp_uvlo_result(
  573. struct sec_battery_info *battery, int health)
  574. {
  575. if (battery->health != health) {
  576. battery->health = health;
  577. switch (health) {
  578. case POWER_SUPPLY_HEALTH_GOOD:
  579. dev_info(battery->dev, "%s: Safe voltage\n", __func__);
  580. dev_info(battery->dev, "%s: is_recharging : %d\n", __func__, battery->is_recharging);
  581. battery->status =
  582. POWER_SUPPLY_STATUS_CHARGING;
  583. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  584. #if defined(CONFIG_BATTERY_SWELLING)
  585. if (!battery->swelling_mode)
  586. sec_bat_set_charge(battery, true);
  587. #else
  588. sec_bat_set_charge(battery, true);
  589. #endif
  590. break;
  591. case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
  592. case POWER_SUPPLY_HEALTH_UNDERVOLTAGE:
  593. dev_info(battery->dev,
  594. "%s: Unsafe voltage (%d)\n",
  595. __func__, health);
  596. battery->status =
  597. POWER_SUPPLY_STATUS_NOT_CHARGING;
  598. sec_bat_set_charge(battery, false);
  599. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  600. battery->is_recharging = false;
  601. /* Take the wakelock during 10 seconds
  602. when over-voltage status is detected */
  603. __pm_wakeup_event(&battery->vbus_ws, HZ * 10);
  604. break;
  605. }
  606. power_supply_changed(&battery->psy_bat);
  607. return true;
  608. }
  609. return false;
  610. }
  611. static bool sec_bat_ovp_uvlo(struct sec_battery_info *battery)
  612. {
  613. int health;
  614. if (battery->factory_mode || sec_bat_check_jig_status()) {
  615. dev_dbg(battery->dev, "%s: No need to check in factory mode\n", __func__);
  616. return false;
  617. } else if ((battery->status == POWER_SUPPLY_STATUS_FULL) &&
  618. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
  619. dev_dbg(battery->dev, "%s: No need to check in Full status", __func__);
  620. return false;
  621. }
  622. if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
  623. battery->health != POWER_SUPPLY_HEALTH_OVERVOLTAGE &&
  624. battery->health != POWER_SUPPLY_HEALTH_UNDERVOLTAGE) {
  625. dev_dbg(battery->dev, "%s: No need to check\n", __func__);
  626. return false;
  627. }
  628. health = battery->health;
  629. switch (battery->pdata->ovp_uvlo_check_type) {
  630. case SEC_BATTERY_OVP_UVLO_CALLBACK:
  631. if (battery->pdata->ovp_uvlo_callback)
  632. health = battery->pdata->ovp_uvlo_callback();
  633. break;
  634. case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
  635. case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
  636. health = sec_bat_ovp_uvlo_by_psy(battery);
  637. break;
  638. case SEC_BATTERY_OVP_UVLO_PMICINT:
  639. case SEC_BATTERY_OVP_UVLO_CHGINT:
  640. /* nothing for interrupt check */
  641. default:
  642. break;
  643. }
  644. return sec_bat_ovp_uvlo_result(battery, health);
  645. }
  646. static bool sec_bat_check_recharge(struct sec_battery_info *battery)
  647. {
  648. #if defined(CONFIG_BATTERY_SWELLING)
  649. if (battery->swelling_mode) {
  650. pr_info("%s: Skip normal recharge check routine for swelling mode\n",
  651. __func__);
  652. return false;
  653. }
  654. #endif
  655. if ((battery->status == POWER_SUPPLY_STATUS_CHARGING) &&
  656. (battery->pdata->full_condition_type &
  657. SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
  658. (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
  659. dev_info(battery->dev,
  660. "%s: Re-charging by NOTIMEFULL (%d)\n",
  661. __func__, battery->capacity);
  662. goto check_recharge_check_count;
  663. }
  664. if (battery->status == POWER_SUPPLY_STATUS_FULL &&
  665. battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
  666. if ((battery->pdata->recharge_condition_type &
  667. SEC_BATTERY_RECHARGE_CONDITION_SOC) &&
  668. (battery->capacity <=
  669. battery->pdata->recharge_condition_soc)) {
  670. dev_info(battery->dev,
  671. "%s: Re-charging by SOC (%d)\n",
  672. __func__, battery->capacity);
  673. goto check_recharge_check_count;
  674. }
  675. if ((battery->pdata->recharge_condition_type &
  676. SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL) &&
  677. (battery->voltage_avg <=
  678. battery->pdata->recharge_condition_avgvcell)) {
  679. dev_info(battery->dev,
  680. "%s: Re-charging by average VCELL (%d)\n",
  681. __func__, battery->voltage_avg);
  682. goto check_recharge_check_count;
  683. }
  684. if ((battery->pdata->recharge_condition_type &
  685. SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
  686. (battery->voltage_now <=
  687. battery->pdata->recharge_condition_vcell)) {
  688. dev_info(battery->dev,
  689. "%s: Re-charging by VCELL (%d)\n",
  690. __func__, battery->voltage_now);
  691. goto check_recharge_check_count;
  692. }
  693. }
  694. battery->recharge_check_cnt = 0;
  695. return false;
  696. check_recharge_check_count:
  697. if (battery->recharge_check_cnt <
  698. battery->pdata->recharge_check_count)
  699. battery->recharge_check_cnt++;
  700. dev_dbg(battery->dev,
  701. "%s: recharge count = %d\n",
  702. __func__, battery->recharge_check_cnt);
  703. if (battery->recharge_check_cnt >=
  704. battery->pdata->recharge_check_count)
  705. return true;
  706. else
  707. return false;
  708. }
  709. static bool sec_bat_voltage_check(struct sec_battery_info *battery)
  710. {
  711. union power_supply_propval value;
  712. int recharge_condition_vcell = battery->pdata->recharge_condition_vcell;
  713. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  714. dev_dbg(battery->dev,
  715. "%s: Charging Disabled\n", __func__);
  716. return true;
  717. }
  718. /* OVP/UVLO check */
  719. if (sec_bat_ovp_uvlo(battery)) {
  720. if (battery->pdata->ovp_uvlo_result_callback)
  721. battery->pdata->
  722. ovp_uvlo_result_callback(battery->health);
  723. return false;
  724. }
  725. #if defined(CONFIG_BATTERY_SWELLING)
  726. if(battery->swelling_mode) {
  727. if (battery->temperature <= battery->pdata->swelling_low_temp_recov)
  728. recharge_condition_vcell = battery->pdata->swelling_low_rechg_voltage;
  729. else
  730. recharge_condition_vcell = battery->pdata->swelling_high_rechg_voltage;
  731. }
  732. #endif
  733. if ((battery->status == POWER_SUPPLY_STATUS_FULL) &&
  734. (battery->charging_mode == SEC_BATTERY_CHARGING_2ND ||
  735. battery->is_recharging)) {
  736. value.intval = 0;
  737. psy_do_property(battery->pdata->fuelgauge_name, get,
  738. POWER_SUPPLY_PROP_CAPACITY, value);
  739. if (value.intval <
  740. battery->pdata->full_condition_soc &&
  741. battery->voltage_now <
  742. (recharge_condition_vcell - 50)) {
  743. battery->status = POWER_SUPPLY_STATUS_CHARGING;
  744. battery->voltage_now = 1080;
  745. battery->voltage_avg = 1080;
  746. power_supply_changed(&battery->psy_bat);
  747. dev_info(battery->dev,
  748. "%s: battery status full -> charging, RepSOC(%d)\n", __func__, value.intval);
  749. }
  750. }
  751. /* Re-Charging check */
  752. if (sec_bat_check_recharge(battery)) {
  753. if (battery->pdata->full_check_type !=
  754. SEC_BATTERY_FULLCHARGED_NONE)
  755. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  756. else
  757. battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
  758. battery->is_recharging = true;
  759. #if defined(CONFIG_BATTERY_SWELLING)
  760. if (!battery->swelling_mode)
  761. sec_bat_set_charge(battery, true);
  762. #else
  763. sec_bat_set_charge(battery, true);
  764. #endif
  765. return false;
  766. }
  767. return true;
  768. }
  769. static bool sec_bat_get_temperature_by_adc(
  770. struct sec_battery_info *battery,
  771. enum sec_battery_adc_channel channel,
  772. union power_supply_propval *value)
  773. {
  774. int temp = 0;
  775. int temp_adc;
  776. int low = 0;
  777. int high = 0;
  778. int mid = 0;
  779. const sec_bat_adc_table_data_t *temp_adc_table;
  780. unsigned int temp_adc_table_size;
  781. temp_adc = sec_bat_get_adc_value(battery, channel);
  782. if (temp_adc < 0)
  783. return true;
  784. switch (channel) {
  785. case SEC_BAT_ADC_CHANNEL_TEMP:
  786. temp_adc_table = battery->pdata->temp_adc_table;
  787. temp_adc_table_size =
  788. battery->pdata->temp_adc_table_size;
  789. battery->temp_adc = temp_adc;
  790. break;
  791. case SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT:
  792. temp_adc_table = battery->pdata->temp_amb_adc_table;
  793. temp_adc_table_size =
  794. battery->pdata->temp_amb_adc_table_size;
  795. battery->temp_ambient_adc = temp_adc;
  796. break;
  797. case SEC_BAT_ADC_CHANNEL_CHG_TEMP:
  798. temp_adc_table = battery->pdata->chg_temp_adc_table;
  799. temp_adc_table_size =
  800. battery->pdata->chg_temp_adc_table_size;
  801. battery->chg_temp_adc = temp_adc;
  802. break;
  803. default:
  804. dev_err(battery->dev,
  805. "%s: Invalid Property\n", __func__);
  806. return false;
  807. }
  808. if (temp_adc_table[0].adc >= temp_adc) {
  809. temp = temp_adc_table[0].data;
  810. goto temp_by_adc_goto;
  811. } else if (temp_adc_table[temp_adc_table_size-1].adc <= temp_adc) {
  812. temp = temp_adc_table[temp_adc_table_size-1].data;
  813. goto temp_by_adc_goto;
  814. }
  815. high = temp_adc_table_size - 1;
  816. while (low <= high) {
  817. mid = (low + high) / 2;
  818. if (temp_adc_table[mid].adc > temp_adc)
  819. high = mid - 1;
  820. else if (temp_adc_table[mid].adc < temp_adc)
  821. low = mid + 1;
  822. else {
  823. temp = temp_adc_table[mid].data;
  824. goto temp_by_adc_goto;
  825. }
  826. }
  827. temp = temp_adc_table[high].data;
  828. temp += (((int)temp_adc_table[low].data - (int)temp_adc_table[high].data) *
  829. ((int)temp_adc - (int)temp_adc_table[high].adc)) /
  830. ((int)temp_adc_table[low].adc - (int)temp_adc_table[high].adc);
  831. temp_by_adc_goto:
  832. value->intval = temp;
  833. dev_info(battery->dev,
  834. "%s: Temp(%d), Temp-ADC(%d)\n",
  835. __func__, temp, temp_adc);
  836. return true;
  837. }
  838. static bool sec_bat_temperature(
  839. struct sec_battery_info *battery)
  840. {
  841. bool ret;
  842. ret = true;
  843. if (battery->pdata->event_check && battery->event) {
  844. battery->temp_highlimit_threshold =
  845. battery->pdata->temp_highlimit_threshold_event;
  846. battery->temp_highlimit_recovery =
  847. battery->pdata->temp_highlimit_recovery_event;
  848. battery->temp_high_threshold =
  849. battery->pdata->temp_high_threshold_event;
  850. battery->temp_high_recovery =
  851. battery->pdata->temp_high_recovery_event;
  852. battery->temp_low_recovery =
  853. battery->pdata->temp_low_recovery_event;
  854. battery->temp_low_threshold =
  855. battery->pdata->temp_low_threshold_event;
  856. } else if (sec_bat_is_lpm(battery)) {
  857. battery->temp_highlimit_threshold =
  858. battery->pdata->temp_highlimit_threshold_lpm;
  859. battery->temp_highlimit_recovery =
  860. battery->pdata->temp_highlimit_recovery_lpm;
  861. battery->temp_high_threshold =
  862. battery->pdata->temp_high_threshold_lpm;
  863. battery->temp_high_recovery =
  864. battery->pdata->temp_high_recovery_lpm;
  865. battery->temp_low_recovery =
  866. battery->pdata->temp_low_recovery_lpm;
  867. battery->temp_low_threshold =
  868. battery->pdata->temp_low_threshold_lpm;
  869. } else {
  870. battery->temp_highlimit_threshold =
  871. battery->pdata->temp_highlimit_threshold_normal;
  872. battery->temp_highlimit_recovery =
  873. battery->pdata->temp_highlimit_recovery_normal;
  874. battery->temp_high_threshold =
  875. battery->pdata->temp_high_threshold_normal;
  876. battery->temp_high_recovery =
  877. battery->pdata->temp_high_recovery_normal;
  878. battery->temp_low_recovery =
  879. battery->pdata->temp_low_recovery_normal;
  880. battery->temp_low_threshold =
  881. battery->pdata->temp_low_threshold_normal;
  882. }
  883. dev_info(battery->dev,
  884. "%s: HLT(%d) HLR(%d) HT(%d), HR(%d), LT(%d), LR(%d)\n",
  885. __func__, battery->temp_highlimit_threshold,
  886. battery->temp_highlimit_recovery,
  887. battery->temp_high_threshold,
  888. battery->temp_high_recovery,
  889. battery->temp_low_threshold,
  890. battery->temp_low_recovery);
  891. return ret;
  892. }
  893. #if defined(CONFIG_BATTERY_SWELLING)
  894. static void sec_bat_swelling_check(struct sec_battery_info *battery, int temperature)
  895. {
  896. union power_supply_propval val;
  897. int swelling_rechg_voltage;
  898. psy_do_property(battery->pdata->charger_name, get,
  899. POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
  900. pr_info("%s: status(%d), swell_mode(%d:%d), cv(0x%02x), temp(%d)\n",
  901. __func__, battery->status, battery->swelling_mode,
  902. battery->charging_block, val.intval, temperature);
  903. /* swelling_mode
  904. under voltage over voltage, battery missing */
  905. if ((battery->status == POWER_SUPPLY_STATUS_DISCHARGING) ||\
  906. (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
  907. pr_info("%s: DISCHARGING or NOT-CHARGING. stop swelling mode\n", __func__);
  908. battery->swelling_mode = false;
  909. goto skip_swelling_chek;
  910. }
  911. if (!battery->swelling_mode) {
  912. if (((temperature >= battery->pdata->swelling_high_temp_block) ||
  913. (temperature <= battery->pdata->swelling_low_temp_block)) &&
  914. battery->pdata->temp_check_type) {
  915. pr_info("%s: swelling mode start. stop charging\n", __func__);
  916. battery->swelling_mode = true;
  917. battery->swelling_full_check_cnt = 0;
  918. sec_bat_set_charge(battery, false);
  919. }
  920. }
  921. if (!battery->voltage_now)
  922. return;
  923. if (battery->swelling_mode) {
  924. if (temperature <= battery->pdata->swelling_low_temp_recov)
  925. swelling_rechg_voltage = battery->pdata->swelling_low_rechg_voltage;
  926. else
  927. swelling_rechg_voltage = battery->pdata->swelling_high_rechg_voltage;
  928. if ((temperature <= battery->pdata->swelling_high_temp_recov) &&
  929. (temperature >= battery->pdata->swelling_low_temp_recov)) {
  930. pr_info("%s: swelling mode end. restart charging\n", __func__);
  931. battery->swelling_mode = false;
  932. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  933. sec_bat_set_charge(battery, true);
  934. /* restore 4.4V float voltage */
  935. val.intval = battery->pdata->swelling_normal_float_voltage;
  936. psy_do_property(battery->pdata->charger_name, set,
  937. POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
  938. } else if (battery->voltage_now < swelling_rechg_voltage &&
  939. battery->charging_block) {
  940. pr_info("%s: swelling mode recharging start. Vbatt(%d)\n",
  941. __func__, battery->voltage_now);
  942. battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
  943. sec_bat_set_charge(battery, true);
  944. /* change 4.20V float voltage */
  945. val.intval = battery->pdata->swelling_drop_float_voltage;
  946. psy_do_property(battery->pdata->charger_name, set,
  947. POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
  948. /* reduce charging current */
  949. if ((temperature <= battery->pdata->swelling_low_temp_block) &&
  950. (battery->pdata->swelling_low_chg_current > 0)) {
  951. pr_info("%s : swelling mode reduce charging current(temp : %d)\n",
  952. __func__, temperature);
  953. val.intval = battery->pdata->swelling_low_chg_current;
  954. psy_do_property(battery->pdata->charger_name, set,
  955. POWER_SUPPLY_PROP_CURRENT_AVG, val);
  956. } else if ((temperature >= battery->pdata->swelling_high_temp_block) &&
  957. (battery->pdata->swelling_high_chg_current > 0)) {
  958. pr_info("%s : swelling mode reduce charging current(temp : %d)\n",
  959. __func__, temperature);
  960. val.intval = battery->pdata->swelling_high_chg_current;
  961. psy_do_property(battery->pdata->charger_name, set,
  962. POWER_SUPPLY_PROP_CURRENT_AVG, val);
  963. }
  964. }
  965. }
  966. skip_swelling_chek:
  967. dev_dbg(battery->dev, "%s end\n", __func__);
  968. }
  969. #endif
  970. static bool sec_bat_temperature_check(
  971. struct sec_battery_info *battery)
  972. {
  973. int temp_value;
  974. int pre_health;
  975. if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  976. dev_dbg(battery->dev,
  977. "%s: Charging Disabled\n", __func__);
  978. return true;
  979. }
  980. if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
  981. battery->health != POWER_SUPPLY_HEALTH_OVERHEAT &&
  982. battery->health != POWER_SUPPLY_HEALTH_COLD &&
  983. battery->health != POWER_SUPPLY_HEALTH_OVERHEATLIMIT) {
  984. dev_dbg(battery->dev, "%s: No need to check\n", __func__);
  985. return false;
  986. }
  987. sec_bat_temperature(battery);
  988. switch (battery->pdata->temp_check_type) {
  989. case SEC_BATTERY_TEMP_CHECK_ADC:
  990. temp_value = battery->temp_adc;
  991. break;
  992. case SEC_BATTERY_TEMP_CHECK_TEMP:
  993. temp_value = battery->temperature;
  994. break;
  995. default:
  996. dev_err(battery->dev,
  997. "%s: Invalid Temp Check Type\n", __func__);
  998. return true;
  999. }
  1000. pre_health = battery->health;
  1001. if (temp_value >= battery->temp_highlimit_threshold) {
  1002. if (battery->health != POWER_SUPPLY_HEALTH_OVERHEATLIMIT) {
  1003. if (battery->temp_highlimit_cnt <
  1004. battery->pdata->temp_check_count)
  1005. battery->temp_highlimit_cnt++;
  1006. dev_dbg(battery->dev,
  1007. "%s: highlimit count = %d\n",
  1008. __func__, battery->temp_highlimit_cnt);
  1009. }
  1010. } else if (temp_value >= battery->temp_high_threshold) {
  1011. if (battery->health == POWER_SUPPLY_HEALTH_OVERHEATLIMIT) {
  1012. if (temp_value <= battery->temp_highlimit_recovery) {
  1013. if (battery->temp_recover_cnt <
  1014. battery->pdata->temp_check_count)
  1015. battery->temp_recover_cnt++;
  1016. dev_dbg(battery->dev,
  1017. "%s: recovery count = %d\n",
  1018. __func__, battery->temp_recover_cnt);
  1019. }
  1020. } else if (battery->health != POWER_SUPPLY_HEALTH_OVERHEAT) {
  1021. if (battery->temp_high_cnt <
  1022. battery->pdata->temp_check_count)
  1023. battery->temp_high_cnt++;
  1024. dev_dbg(battery->dev,
  1025. "%s: high count = %d\n",
  1026. __func__, battery->temp_high_cnt);
  1027. }
  1028. } else if ((temp_value <= battery->temp_high_recovery) &&
  1029. (temp_value >= battery->temp_low_recovery)) {
  1030. if (battery->health == POWER_SUPPLY_HEALTH_OVERHEAT ||
  1031. battery->health == POWER_SUPPLY_HEALTH_OVERHEATLIMIT ||
  1032. battery->health == POWER_SUPPLY_HEALTH_COLD) {
  1033. if (battery->temp_recover_cnt <
  1034. battery->pdata->temp_check_count)
  1035. battery->temp_recover_cnt++;
  1036. dev_dbg(battery->dev,
  1037. "%s: recovery count = %d\n",
  1038. __func__, battery->temp_recover_cnt);
  1039. }
  1040. } else if (temp_value <= battery->temp_low_threshold) {
  1041. if (battery->health != POWER_SUPPLY_HEALTH_COLD) {
  1042. if (battery->temp_low_cnt <
  1043. battery->pdata->temp_check_count)
  1044. battery->temp_low_cnt++;
  1045. dev_dbg(battery->dev,
  1046. "%s: low count = %d\n",
  1047. __func__, battery->temp_low_cnt);
  1048. }
  1049. } else {
  1050. battery->temp_highlimit_cnt = 0;
  1051. battery->temp_high_cnt = 0;
  1052. battery->temp_low_cnt = 0;
  1053. battery->temp_recover_cnt = 0;
  1054. }
  1055. if (battery->temp_highlimit_cnt >=
  1056. battery->pdata->temp_check_count)
  1057. battery->health = POWER_SUPPLY_HEALTH_OVERHEATLIMIT;
  1058. else if (battery->temp_high_cnt >=
  1059. battery->pdata->temp_check_count)
  1060. battery->health = POWER_SUPPLY_HEALTH_OVERHEAT;
  1061. else if (battery->temp_low_cnt >=
  1062. battery->pdata->temp_check_count)
  1063. battery->health = POWER_SUPPLY_HEALTH_COLD;
  1064. else if (battery->temp_recover_cnt >=
  1065. battery->pdata->temp_check_count) {
  1066. if (battery->health == POWER_SUPPLY_HEALTH_OVERHEATLIMIT)
  1067. battery->health = POWER_SUPPLY_HEALTH_OVERHEAT;
  1068. else
  1069. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  1070. }
  1071. if(pre_health != battery->health){
  1072. battery->health_change = true;
  1073. dev_info(battery->dev,"%s: health_change true\n", __func__);
  1074. }
  1075. else
  1076. battery->health_change = false;
  1077. if ((battery->health == POWER_SUPPLY_HEALTH_OVERHEAT) ||
  1078. (battery->health == POWER_SUPPLY_HEALTH_COLD) ||
  1079. (battery->health == POWER_SUPPLY_HEALTH_OVERHEATLIMIT)) {
  1080. if (battery->status != POWER_SUPPLY_STATUS_NOT_CHARGING) {
  1081. dev_info(battery->dev,
  1082. "%s: Unsafe Temperature\n", __func__);
  1083. battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
  1084. /* change charging current to battery (default 0mA) */
  1085. sec_bat_set_charge(battery, false);
  1086. return false;
  1087. }
  1088. } else {
  1089. /* if recovered from not charging */
  1090. if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) &&
  1091. (battery->status ==
  1092. POWER_SUPPLY_STATUS_NOT_CHARGING)) {
  1093. dev_info(battery->dev,
  1094. "%s: Safe Temperature\n", __func__);
  1095. if (battery->capacity >= 100) {
  1096. battery->status =
  1097. POWER_SUPPLY_STATUS_FULL;
  1098. battery->is_recharging = true;
  1099. } else {/* Normal Charging */
  1100. battery->status =
  1101. POWER_SUPPLY_STATUS_CHARGING;
  1102. }
  1103. #if defined(CONFIG_BATTERY_SWELLING)
  1104. if ((temp_value >= battery->pdata->swelling_high_temp_block) ||
  1105. (temp_value <= battery->pdata->swelling_low_temp_block)) {
  1106. pr_info("%s: swelling mode start. stop charging\n", __func__);
  1107. battery->swelling_mode = true;
  1108. battery->swelling_full_check_cnt = 0;
  1109. sec_bat_set_charge(battery, false);
  1110. } else {
  1111. /* turn on charger by cable type */
  1112. sec_bat_set_charge(battery, true);
  1113. }
  1114. #else
  1115. /* turn on charger by cable type */
  1116. sec_bat_set_charge(battery, true);
  1117. #endif
  1118. return false;
  1119. }
  1120. }
  1121. return true;
  1122. };
  1123. #if !defined(CONFIG_SEC_FACTORY)
  1124. static void sec_bat_chg_temperature_check(
  1125. struct sec_battery_info *battery)
  1126. {
  1127. if (battery->siop_level >= 100 &&
  1128. ((battery->cable_type == POWER_SUPPLY_TYPE_HV_MAINS) ||
  1129. (battery->cable_type == POWER_SUPPLY_TYPE_HV_ERR))) {
  1130. union power_supply_propval value;
  1131. if ((!battery->chg_limit) &&
  1132. (battery->chg_temp > battery->pdata->chg_high_temp)) {
  1133. battery->chg_limit = true;
  1134. value.intval = battery->pdata->chg_charging_limit_current;
  1135. psy_do_property(battery->pdata->charger_name, set,
  1136. POWER_SUPPLY_PROP_CURRENT_MAX, value);
  1137. dev_info(battery->dev,"%s: Chg current is reduced by Temp: %d\n",
  1138. __func__, battery->chg_temp);
  1139. } else if ((battery->chg_limit) &&
  1140. (battery->chg_temp < battery->pdata->chg_high_temp_recovery)) {
  1141. battery->chg_limit = false;
  1142. value.intval = battery->pdata->charging_current
  1143. [battery->cable_type].input_current_limit;
  1144. psy_do_property(battery->pdata->charger_name, set,
  1145. POWER_SUPPLY_PROP_CURRENT_MAX, value);
  1146. dev_info(battery->dev,"%s: Chg current is recovered by Temp: %d\n",
  1147. __func__, battery->chg_temp);
  1148. }
  1149. } else if (battery->chg_limit) {
  1150. battery->chg_limit = false;
  1151. }
  1152. }
  1153. #endif
  1154. static void sec_bat_event_program_alarm(
  1155. struct sec_battery_info *battery, int seconds)
  1156. {
  1157. ktime_t low_interval = ktime_set(seconds - 10, 0);
  1158. ktime_t next;
  1159. next = ktime_add(battery->last_event_time, low_interval);
  1160. /* The original slack time called for, 20 seconds, exceeds
  1161. * the length allowed for an unsigned long in nanoseconds. Use
  1162. * ULONG_MAX instead
  1163. */
  1164. hrtimer_start_range_ns(&battery->event_termination_hrtimer,
  1165. next, ULONG_MAX, HRTIMER_MODE_ABS);
  1166. }
  1167. enum hrtimer_restart sec_bat_event_expired_timer_func(struct hrtimer *timer)
  1168. {
  1169. struct sec_battery_info *battery =
  1170. container_of(timer, struct sec_battery_info,
  1171. event_termination_hrtimer);
  1172. battery->event &= (~battery->event_wait);
  1173. dev_info(battery->dev,
  1174. "%s: event expired (0x%x)\n", __func__, battery->event);
  1175. return HRTIMER_NORESTART;
  1176. }
  1177. static void sec_bat_event_set(
  1178. struct sec_battery_info *battery, int event, int enable)
  1179. {
  1180. if (!battery->pdata->event_check)
  1181. return;
  1182. /* ignore duplicated deactivation of same event
  1183. * only if the event is one last event
  1184. */
  1185. if (!enable && (battery->event == battery->event_wait)) {
  1186. dev_info(battery->dev,
  1187. "%s: ignore duplicated deactivation of same event\n",
  1188. __func__);
  1189. return;
  1190. }
  1191. hrtimer_cancel(&battery->event_termination_hrtimer);
  1192. battery->event &= (~battery->event_wait);
  1193. if (enable) {
  1194. battery->event_wait = 0;
  1195. battery->event |= event;
  1196. dev_info(battery->dev,
  1197. "%s: event set (0x%x)\n", __func__, battery->event);
  1198. } else {
  1199. if (battery->event == 0) {
  1200. dev_dbg(battery->dev,
  1201. "%s: nothing to clear\n", __func__);
  1202. return; /* nothing to clear */
  1203. }
  1204. battery->event_wait = event;
  1205. battery->last_event_time = ktime_get_boottime();
  1206. sec_bat_event_program_alarm(battery,
  1207. battery->pdata->event_waiting_time);
  1208. dev_info(battery->dev,
  1209. "%s: start timer (curr 0x%x, wait 0x%x)\n",
  1210. __func__, battery->event, battery->event_wait);
  1211. }
  1212. }
  1213. static bool sec_bat_check_fullcharged_condition(
  1214. struct sec_battery_info *battery)
  1215. {
  1216. int full_check_type;
  1217. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  1218. full_check_type = battery->pdata->full_check_type;
  1219. else
  1220. full_check_type = battery->pdata->full_check_type_2nd;
  1221. switch (full_check_type) {
  1222. case SEC_BATTERY_FULLCHARGED_ADC:
  1223. case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
  1224. case SEC_BATTERY_FULLCHARGED_SOC:
  1225. case SEC_BATTERY_FULLCHARGED_CHGGPIO:
  1226. case SEC_BATTERY_FULLCHARGED_CHGPSY:
  1227. break;
  1228. /* If these is NOT full check type or NONE full check type,
  1229. * it is full-charged
  1230. */
  1231. case SEC_BATTERY_FULLCHARGED_CHGINT:
  1232. case SEC_BATTERY_FULLCHARGED_TIME:
  1233. case SEC_BATTERY_FULLCHARGED_NONE:
  1234. default:
  1235. return true;
  1236. break;
  1237. }
  1238. if (battery->pdata->full_condition_type &
  1239. SEC_BATTERY_FULL_CONDITION_SOC) {
  1240. if (battery->capacity <
  1241. battery->pdata->full_condition_soc) {
  1242. dev_dbg(battery->dev,
  1243. "%s: Not enough SOC (%d%%)\n",
  1244. __func__, battery->capacity);
  1245. return false;
  1246. }
  1247. }
  1248. if (battery->pdata->full_condition_type &
  1249. SEC_BATTERY_FULL_CONDITION_VCELL) {
  1250. if (battery->voltage_now <
  1251. battery->pdata->full_condition_vcell) {
  1252. dev_dbg(battery->dev,
  1253. "%s: Not enough VCELL (%dmV)\n",
  1254. __func__, battery->voltage_now);
  1255. return false;
  1256. }
  1257. }
  1258. if (battery->pdata->full_condition_type &
  1259. SEC_BATTERY_FULL_CONDITION_AVGVCELL) {
  1260. if (battery->voltage_avg <
  1261. battery->pdata->full_condition_avgvcell) {
  1262. dev_dbg(battery->dev,
  1263. "%s: Not enough AVGVCELL (%dmV)\n",
  1264. __func__, battery->voltage_avg);
  1265. return false;
  1266. }
  1267. }
  1268. if (battery->pdata->full_condition_type &
  1269. SEC_BATTERY_FULL_CONDITION_OCV) {
  1270. if (battery->voltage_ocv <
  1271. battery->pdata->full_condition_ocv) {
  1272. dev_dbg(battery->dev,
  1273. "%s: Not enough OCV (%dmV)\n",
  1274. __func__, battery->voltage_ocv);
  1275. return false;
  1276. }
  1277. }
  1278. return true;
  1279. }
  1280. static void sec_bat_do_test_function(
  1281. struct sec_battery_info *battery)
  1282. {
  1283. union power_supply_propval value;
  1284. switch (battery->test_mode) {
  1285. case 1:
  1286. if (battery->status == POWER_SUPPLY_STATUS_CHARGING) {
  1287. sec_bat_set_charge(battery, false);
  1288. battery->status =
  1289. POWER_SUPPLY_STATUS_DISCHARGING;
  1290. }
  1291. break;
  1292. case 2:
  1293. if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  1294. sec_bat_set_charge(battery, true);
  1295. psy_do_property(battery->pdata->charger_name, get,
  1296. POWER_SUPPLY_PROP_STATUS, value);
  1297. battery->status = value.intval;
  1298. }
  1299. battery->test_mode = 0;
  1300. break;
  1301. case 3: // clear temp block
  1302. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  1303. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  1304. break;
  1305. case 4:
  1306. if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
  1307. sec_bat_set_charge(battery, true);
  1308. psy_do_property(battery->pdata->charger_name, get,
  1309. POWER_SUPPLY_PROP_STATUS, value);
  1310. battery->status = value.intval;
  1311. }
  1312. break;
  1313. default:
  1314. pr_info("%s: error test: unknown state\n", __func__);
  1315. break;
  1316. }
  1317. }
  1318. static bool sec_bat_time_management(
  1319. struct sec_battery_info *battery)
  1320. {
  1321. unsigned long charging_time;
  1322. struct timespec ts;
  1323. get_monotonic_boottime(&ts);
  1324. if (battery->charging_start_time == 0) {
  1325. dev_dbg(battery->dev,
  1326. "%s: Charging Disabled\n", __func__);
  1327. return true;
  1328. }
  1329. if (ts.tv_sec >= battery->charging_start_time)
  1330. charging_time = ts.tv_sec - battery->charging_start_time;
  1331. else
  1332. charging_time = 0xFFFFFFFF - battery->charging_start_time
  1333. + ts.tv_sec;
  1334. battery->charging_passed_time = charging_time;
  1335. dev_info(battery->dev,
  1336. "%s: Charging Time : %ld secs\n", __func__,
  1337. battery->charging_passed_time);
  1338. switch (battery->status) {
  1339. case POWER_SUPPLY_STATUS_FULL:
  1340. if (battery->is_recharging && (charging_time >
  1341. battery->pdata->recharging_total_time)) {
  1342. dev_info(battery->dev,
  1343. "%s: Recharging Timer Expired\n", __func__);
  1344. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1345. battery->is_recharging = false;
  1346. if (sec_bat_set_charge(battery, false)) {
  1347. dev_err(battery->dev,
  1348. "%s: Fail to Set Charger\n", __func__);
  1349. return true;
  1350. }
  1351. return false;
  1352. }
  1353. break;
  1354. case POWER_SUPPLY_STATUS_CHARGING:
  1355. if ((battery->pdata->full_condition_type &
  1356. SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
  1357. (battery->is_recharging && (charging_time >
  1358. battery->pdata->recharging_total_time))) {
  1359. dev_info(battery->dev,
  1360. "%s: Recharging Timer Expired\n", __func__);
  1361. if (battery->capacity >= 100)
  1362. battery->status = POWER_SUPPLY_STATUS_FULL;
  1363. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1364. battery->is_recharging = false;
  1365. if (sec_bat_set_charge(battery, false)) {
  1366. dev_err(battery->dev,
  1367. "%s: Fail to Set Charger\n", __func__);
  1368. return true;
  1369. }
  1370. return false;
  1371. } else if (!battery->is_recharging &&
  1372. (charging_time > battery->pdata->charging_total_time)) {
  1373. dev_info(battery->dev,
  1374. "%s: Charging Timer Expired\n", __func__);
  1375. if (battery->pdata->full_condition_type &
  1376. SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) {
  1377. if (battery->capacity >= 100)
  1378. battery->status =
  1379. POWER_SUPPLY_STATUS_FULL;
  1380. } else
  1381. battery->status = POWER_SUPPLY_STATUS_FULL;
  1382. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1383. if (sec_bat_set_charge(battery, false)) {
  1384. dev_err(battery->dev,
  1385. "%s: Fail to Set Charger\n", __func__);
  1386. return true;
  1387. }
  1388. return false;
  1389. }
  1390. if (battery->pdata->charging_reset_time) {
  1391. if (charging_time > battery->charging_next_time) {
  1392. /*reset current in charging status */
  1393. battery->charging_next_time =
  1394. battery->charging_passed_time +
  1395. (battery->pdata->charging_reset_time);
  1396. dev_dbg(battery->dev,
  1397. "%s: Reset charging current\n",
  1398. __func__);
  1399. #if defined(CONFIG_BATTERY_SWELLING)
  1400. if (!battery->swelling_mode) {
  1401. if (sec_bat_set_charge(battery, true)) {
  1402. dev_err(battery->dev,
  1403. "%s: Fail to Set Charger\n",
  1404. __func__);
  1405. return true;
  1406. }
  1407. }
  1408. #else
  1409. if (sec_bat_set_charge(battery, true)) {
  1410. dev_err(battery->dev,
  1411. "%s: Fail to Set Charger\n",
  1412. __func__);
  1413. return true;
  1414. }
  1415. #endif
  1416. }
  1417. }
  1418. break;
  1419. default:
  1420. dev_err(battery->dev,
  1421. "%s: Undefine Battery Status\n", __func__);
  1422. return true;
  1423. }
  1424. return true;
  1425. }
  1426. static bool sec_bat_check_fullcharged(
  1427. struct sec_battery_info *battery)
  1428. {
  1429. union power_supply_propval value;
  1430. int current_adc;
  1431. int full_check_type;
  1432. bool ret;
  1433. int err;
  1434. ret = false;
  1435. if (!sec_bat_check_fullcharged_condition(battery))
  1436. goto not_full_charged;
  1437. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  1438. full_check_type = battery->pdata->full_check_type;
  1439. else
  1440. full_check_type = battery->pdata->full_check_type_2nd;
  1441. switch (full_check_type) {
  1442. case SEC_BATTERY_FULLCHARGED_ADC:
  1443. current_adc =
  1444. sec_bat_get_adc_value(battery,
  1445. SEC_BAT_ADC_CHANNEL_FULL_CHECK);
  1446. dev_dbg(battery->dev,
  1447. "%s: Current ADC (%d)\n",
  1448. __func__, current_adc);
  1449. if (current_adc < 0)
  1450. break;
  1451. battery->current_adc = current_adc;
  1452. if (battery->current_adc <
  1453. (battery->charging_mode ==
  1454. SEC_BATTERY_CHARGING_1ST ?
  1455. battery->pdata->charging_current[
  1456. battery->cable_type].full_check_current_1st :
  1457. battery->pdata->charging_current[
  1458. battery->cable_type].full_check_current_2nd)) {
  1459. battery->full_check_cnt++;
  1460. dev_dbg(battery->dev,
  1461. "%s: Full Check ADC (%d)\n",
  1462. __func__,
  1463. battery->full_check_cnt);
  1464. } else
  1465. battery->full_check_cnt = 0;
  1466. break;
  1467. case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
  1468. #if defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAKOR) || defined(CONFIG_MACH_V2)
  1469. if ((battery->current_now > 0 && battery->current_now <
  1470. battery->pdata->charging_current[
  1471. battery->cable_type].full_check_current_1st) &&
  1472. (battery->current_avg > 0 && battery->current_avg <
  1473. (battery->charging_mode ==
  1474. SEC_BATTERY_CHARGING_1ST ?
  1475. battery->pdata->charging_current[
  1476. battery->cable_type].full_check_current_1st + 50 :
  1477. battery->pdata->charging_current[
  1478. battery->cable_type].full_check_current_2nd))) {
  1479. battery->full_check_cnt++;
  1480. dev_dbg(battery->dev,
  1481. "%s: Full Check Current (%d)\n",
  1482. __func__,
  1483. battery->full_check_cnt);
  1484. } else
  1485. battery->full_check_cnt = 0;
  1486. break;
  1487. #elif defined(CONFIG_QPNP_CHARGER)
  1488. if ((battery->current_now >= 0 && battery->current_now <
  1489. battery->pdata->charging_current[
  1490. battery->cable_type].full_check_current_1st) &&
  1491. (battery->current_avg >= 0 && battery->current_avg <
  1492. (battery->charging_mode ==
  1493. SEC_BATTERY_CHARGING_1ST ?
  1494. battery->pdata->charging_current[
  1495. battery->cable_type].full_check_current_1st :
  1496. battery->pdata->charging_current[
  1497. battery->cable_type].full_check_current_2nd))) {
  1498. battery->full_check_cnt++;
  1499. dev_dbg(battery->dev,
  1500. "%s: Full Check Current (%d)\n",
  1501. __func__,
  1502. battery->full_check_cnt);
  1503. } else
  1504. battery->full_check_cnt = 0;
  1505. break;
  1506. #else
  1507. if ((battery->current_now > 0 && battery->current_now <
  1508. battery->pdata->charging_current[
  1509. battery->cable_type].full_check_current_1st) &&
  1510. (battery->current_avg > 0 && battery->current_avg <
  1511. (battery->charging_mode ==
  1512. SEC_BATTERY_CHARGING_1ST ?
  1513. battery->pdata->charging_current[
  1514. battery->cable_type].full_check_current_1st :
  1515. battery->pdata->charging_current[
  1516. battery->cable_type].full_check_current_2nd))) {
  1517. battery->full_check_cnt++;
  1518. dev_dbg(battery->dev,
  1519. "%s: Full Check Current (%d)\n",
  1520. __func__,
  1521. battery->full_check_cnt);
  1522. } else
  1523. battery->full_check_cnt = 0;
  1524. break;
  1525. #endif
  1526. case SEC_BATTERY_FULLCHARGED_TIME:
  1527. if ((battery->charging_mode ==
  1528. SEC_BATTERY_CHARGING_2ND ?
  1529. (battery->charging_passed_time -
  1530. battery->charging_fullcharged_time) :
  1531. battery->charging_passed_time) >
  1532. (battery->charging_mode ==
  1533. SEC_BATTERY_CHARGING_1ST ?
  1534. battery->pdata->charging_current[
  1535. battery->cable_type].full_check_current_1st :
  1536. battery->pdata->charging_current[
  1537. battery->cable_type].full_check_current_2nd)) {
  1538. battery->full_check_cnt++;
  1539. dev_dbg(battery->dev,
  1540. "%s: Full Check Time (%d)\n",
  1541. __func__,
  1542. battery->full_check_cnt);
  1543. } else
  1544. battery->full_check_cnt = 0;
  1545. break;
  1546. case SEC_BATTERY_FULLCHARGED_SOC:
  1547. if (battery->capacity <=
  1548. (battery->charging_mode ==
  1549. SEC_BATTERY_CHARGING_1ST ?
  1550. battery->pdata->charging_current[
  1551. battery->cable_type].full_check_current_1st :
  1552. battery->pdata->charging_current[
  1553. battery->cable_type].full_check_current_2nd)) {
  1554. battery->full_check_cnt++;
  1555. dev_dbg(battery->dev,
  1556. "%s: Full Check SOC (%d)\n",
  1557. __func__,
  1558. battery->full_check_cnt);
  1559. } else
  1560. battery->full_check_cnt = 0;
  1561. break;
  1562. case SEC_BATTERY_FULLCHARGED_CHGGPIO:
  1563. err = gpio_request(
  1564. battery->pdata->chg_gpio_full_check,
  1565. "GPIO_CHG_FULL");
  1566. if (err) {
  1567. dev_err(battery->dev,
  1568. "%s: Error in Request of GPIO\n", __func__);
  1569. break;
  1570. }
  1571. if (!(gpio_get_value_cansleep(
  1572. battery->pdata->chg_gpio_full_check) ^
  1573. !battery->pdata->chg_polarity_full_check)) {
  1574. battery->full_check_cnt++;
  1575. dev_dbg(battery->dev,
  1576. "%s: Full Check GPIO (%d)\n",
  1577. __func__, battery->full_check_cnt);
  1578. } else
  1579. battery->full_check_cnt = 0;
  1580. gpio_free(battery->pdata->chg_gpio_full_check);
  1581. break;
  1582. case SEC_BATTERY_FULLCHARGED_CHGINT:
  1583. case SEC_BATTERY_FULLCHARGED_CHGPSY:
  1584. psy_do_property(battery->pdata->charger_name, get,
  1585. POWER_SUPPLY_PROP_STATUS, value);
  1586. if (value.intval == POWER_SUPPLY_STATUS_FULL) {
  1587. battery->full_check_cnt++;
  1588. dev_info(battery->dev,
  1589. "%s: Full Check Charger (%d)\n",
  1590. __func__, battery->full_check_cnt);
  1591. } else
  1592. battery->full_check_cnt = 0;
  1593. break;
  1594. /* If these is NOT full check type or NONE full check type,
  1595. * it is full-charged
  1596. */
  1597. case SEC_BATTERY_FULLCHARGED_NONE:
  1598. battery->full_check_cnt = 0;
  1599. ret = true;
  1600. break;
  1601. default:
  1602. dev_err(battery->dev,
  1603. "%s: Invalid Full Check\n", __func__);
  1604. break;
  1605. }
  1606. if (battery->full_check_cnt >=
  1607. battery->pdata->full_check_count) {
  1608. battery->full_check_cnt = 0;
  1609. ret = true;
  1610. }
  1611. not_full_charged:
  1612. return ret;
  1613. }
  1614. static void sec_bat_do_fullcharged(
  1615. struct sec_battery_info *battery)
  1616. {
  1617. union power_supply_propval value;
  1618. /* To let charger/fuel gauge know the full status,
  1619. * set status before calling sec_bat_set_charge()
  1620. */
  1621. battery->status = POWER_SUPPLY_STATUS_FULL;
  1622. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST) {
  1623. battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
  1624. battery->charging_fullcharged_time =
  1625. battery->charging_passed_time;
  1626. sec_bat_set_charge(battery, true);
  1627. } else {
  1628. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  1629. battery->is_recharging = false;
  1630. sec_bat_set_charge(battery, false);
  1631. value.intval = POWER_SUPPLY_STATUS_FULL;
  1632. psy_do_property(battery->pdata->fuelgauge_name, set,
  1633. POWER_SUPPLY_PROP_STATUS, value);
  1634. }
  1635. #if !defined(CONFIG_DISABLE_SAVE_CAPACITY_MAX)
  1636. value.intval = POWER_SUPPLY_TYPE_BATTERY;
  1637. psy_do_property(battery->pdata->fuelgauge_name, set,
  1638. POWER_SUPPLY_PROP_CHARGE_FULL, value);
  1639. #endif
  1640. /* platform can NOT get information of battery
  1641. * because wakeup time is too short to check uevent
  1642. * To make sure that target is wakeup if full-charged,
  1643. * activated wake lock in a few seconds
  1644. */
  1645. if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
  1646. __pm_wakeup_event(&battery->vbus_ws, HZ * 10);
  1647. }
  1648. static bool sec_bat_fullcharged_check(
  1649. struct sec_battery_info *battery)
  1650. {
  1651. if ((battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ||
  1652. (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
  1653. dev_dbg(battery->dev,
  1654. "%s: No Need to Check Full-Charged\n", __func__);
  1655. return true;
  1656. }
  1657. if (sec_bat_check_fullcharged(battery))
  1658. sec_bat_do_fullcharged(battery);
  1659. dev_info(battery->dev,
  1660. "%s: Charging Mode : %s\n", __func__,
  1661. battery->is_recharging ?
  1662. sec_bat_charging_mode_str[SEC_BATTERY_CHARGING_RECHARGING] :
  1663. sec_bat_charging_mode_str[battery->charging_mode]);
  1664. return true;
  1665. }
  1666. static void sec_bat_check_changed_soc(
  1667. struct sec_battery_info *battery,
  1668. union power_supply_propval *value)
  1669. {
  1670. struct power_supply *psy;
  1671. if (battery->prev_reported_soc == -EINVAL) {
  1672. psy = power_supply_get_by_name(battery->pdata->fuelgauge_name);
  1673. if (!psy) {
  1674. dev_err(battery->dev,
  1675. "%s: Fail to get psy(%s)\n", __func__, battery->pdata->fuelgauge_name);
  1676. return;
  1677. }
  1678. } else {
  1679. if (battery->prev_reported_soc == value->intval) {
  1680. goto report;
  1681. } else {
  1682. dev_info(battery->dev, "%s: prev_reported_soc = %d, soc = %d\n",
  1683. __func__, battery->prev_reported_soc, value->intval);
  1684. }
  1685. /* if soc have been chaged, only change soc by 1
  1686. * soc in increased ? (previous + 1) : (previous - 1) */
  1687. value->intval = (value->intval > battery->prev_reported_soc) ?
  1688. (battery->prev_reported_soc + 1) :
  1689. (battery->prev_reported_soc - 1);
  1690. if (value->intval > 100)
  1691. value->intval = 100;
  1692. else if (value->intval < 0)
  1693. value->intval = 0;
  1694. }
  1695. report:
  1696. battery->prev_reported_soc = value->intval;
  1697. }
  1698. #if defined(CONFIG_MACH_MILLETLTE_ATT) || defined(CONFIG_MACH_MILLETLTE_CAN)
  1699. extern unsigned int system_rev;
  1700. #endif
  1701. static void sec_bat_get_battery_info(
  1702. struct sec_battery_info *battery)
  1703. {
  1704. union power_supply_propval value;
  1705. #if defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAKOR) || defined(CONFIG_MACH_V2) || \
  1706. defined(CONFIG_SEC_MILLET_PROJECT) || defined(CONFIG_SEC_MATISSE_PROJECT) || defined(CONFIG_SEC_DEGAS_PROJECT) || \
  1707. defined(CONFIG_AFC_CHARGER_MODE) || defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLIMT_VZW) || defined(CONFIG_SEC_KLIMT_PROJECT)
  1708. static struct timespec old_ts;
  1709. struct timespec c_ts;
  1710. c_ts = ktime_to_timespec(ktime_get_boottime());
  1711. #endif
  1712. psy_do_property(battery->pdata->fuelgauge_name, get,
  1713. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  1714. battery->voltage_now = value.intval;
  1715. value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
  1716. psy_do_property(battery->pdata->fuelgauge_name, get,
  1717. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  1718. battery->voltage_avg = value.intval;
  1719. value.intval = SEC_BATTEY_VOLTAGE_OCV;
  1720. psy_do_property(battery->pdata->fuelgauge_name, get,
  1721. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  1722. battery->voltage_ocv = value.intval;
  1723. value.intval = SEC_BATTEY_CURRENT_MA;
  1724. psy_do_property(battery->pdata->fuelgauge_name, get,
  1725. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  1726. #if defined(CONFIG_QPNP_BMS)
  1727. battery->current_now = value.intval / 1000;
  1728. battery->current_avg = value.intval / 1000;
  1729. #else
  1730. battery->current_now = value.intval;
  1731. value.intval = SEC_BATTEY_CURRENT_MA;
  1732. psy_do_property(battery->pdata->fuelgauge_name, get,
  1733. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  1734. battery->current_avg = value.intval;
  1735. #endif
  1736. /* input current limit in charger */
  1737. #if defined(CONFIG_QPNP_CHARGER)
  1738. psy_do_property(battery->pdata->charger_name, get,
  1739. POWER_SUPPLY_PROP_INPUT_CURRENT_MAX, value);
  1740. battery->current_max = value.intval / 1000;
  1741. #else
  1742. psy_do_property(battery->pdata->charger_name, get,
  1743. POWER_SUPPLY_PROP_CURRENT_MAX, value);
  1744. battery->current_max = value.intval;
  1745. #endif
  1746. switch (battery->pdata->thermal_source) {
  1747. case SEC_BATTERY_THERMAL_SOURCE_FG:
  1748. psy_do_property(battery->pdata->fuelgauge_name, get,
  1749. POWER_SUPPLY_PROP_TEMP, value);
  1750. battery->temperature = value.intval;
  1751. psy_do_property(battery->pdata->fuelgauge_name, get,
  1752. POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
  1753. battery->temper_amb = value.intval;
  1754. break;
  1755. case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
  1756. if (battery->pdata->get_temperature_callback) {
  1757. battery->pdata->get_temperature_callback(
  1758. POWER_SUPPLY_PROP_TEMP, &value);
  1759. battery->temperature = value.intval;
  1760. psy_do_property(battery->pdata->fuelgauge_name, set,
  1761. POWER_SUPPLY_PROP_TEMP, value);
  1762. battery->pdata->get_temperature_callback(
  1763. POWER_SUPPLY_PROP_TEMP_AMBIENT, &value);
  1764. battery->temper_amb = value.intval;
  1765. psy_do_property(battery->pdata->fuelgauge_name, set,
  1766. POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
  1767. }
  1768. break;
  1769. case SEC_BATTERY_THERMAL_SOURCE_ADC:
  1770. sec_bat_get_temperature_by_adc(battery,
  1771. SEC_BAT_ADC_CHANNEL_TEMP, &value);
  1772. battery->temperature = value.intval;
  1773. #if !defined(CONFIG_QPNP_BMS)
  1774. psy_do_property(battery->pdata->fuelgauge_name, set,
  1775. POWER_SUPPLY_PROP_TEMP, value);
  1776. #endif
  1777. sec_bat_get_temperature_by_adc(battery,
  1778. SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT, &value);
  1779. battery->temper_amb = value.intval;
  1780. #if !defined(CONFIG_QPNP_BMS)
  1781. psy_do_property(battery->pdata->fuelgauge_name, set,
  1782. POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
  1783. #endif
  1784. break;
  1785. default:
  1786. break;
  1787. }
  1788. if (battery->pdata->chg_temp_check) {
  1789. sec_bat_get_temperature_by_adc(battery,
  1790. SEC_BAT_ADC_CHANNEL_CHG_TEMP, &value);
  1791. battery->chg_temp = value.intval;
  1792. }
  1793. /* To get SOC value (NOT raw SOC), need to reset value */
  1794. value.intval = 0;
  1795. psy_do_property(battery->pdata->fuelgauge_name, get,
  1796. POWER_SUPPLY_PROP_CAPACITY, value);
  1797. sec_bat_check_changed_soc(battery, &value);
  1798. #if defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAKOR) || defined(CONFIG_MACH_V2) || \
  1799. defined(CONFIG_SEC_MILLET_PROJECT) || defined(CONFIG_SEC_MATISSE_PROJECT) || defined(CONFIG_SEC_DEGAS_PROJECT) || \
  1800. defined(CONFIG_AFC_CHARGER_MODE) || defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLIMT_VZW) || defined(CONFIG_SEC_KLIMT_PROJECT)
  1801. /* if the battery status was full, and SOC wasn't 100% yet,
  1802. then ignore FG SOC, and report (previous SOC +1)% */
  1803. if (battery->status != POWER_SUPPLY_STATUS_FULL) {
  1804. battery->capacity = value.intval;
  1805. } else if ((battery->capacity != 100) &&
  1806. ((c_ts.tv_sec - old_ts.tv_sec) >= 30)) {
  1807. battery->capacity++;
  1808. pr_info("%s : forced full-charged sequence for the capacity(%d)\n",
  1809. __func__, battery->capacity);
  1810. old_ts = c_ts;
  1811. }
  1812. #else
  1813. battery->capacity = value.intval;
  1814. #endif
  1815. #if defined(CONFIG_MACH_MILLETLTE_ATT) || defined(CONFIG_MACH_MILLETLTE_CAN)
  1816. if(system_rev<1){
  1817. battery->capacity = 70;
  1818. }
  1819. #endif
  1820. dev_info(battery->dev,
  1821. "%s:Vnow(%dmV),Inow(%dmA),Imax(%dmA),SOC(%d%%),Tbat(%d),is_hc_usb(%d)\n",
  1822. __func__,
  1823. battery->voltage_now, battery->current_now,
  1824. battery->current_max, battery->capacity,
  1825. battery->temperature, battery->is_hc_usb);
  1826. dev_dbg(battery->dev,
  1827. "%s,Vavg(%dmV),Vocv(%dmV),Tamb(%d),"
  1828. "Iavg(%dmA),Iadc(%d)\n",
  1829. battery->present ? "Connected" : "Disconnected",
  1830. battery->voltage_avg, battery->voltage_ocv,
  1831. battery->temper_amb,
  1832. battery->current_avg, battery->current_adc);
  1833. }
  1834. static void sec_bat_polling_work(struct work_struct *work)
  1835. {
  1836. struct sec_battery_info *battery = container_of(
  1837. work, struct sec_battery_info, polling_work.work);
  1838. __pm_stay_awake(&battery->monitor_ws);
  1839. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  1840. dev_dbg(battery->dev, "%s: Activated\n", __func__);
  1841. }
  1842. static void sec_bat_program_alarm(
  1843. struct sec_battery_info *battery, int seconds)
  1844. {
  1845. ktime_t low_interval = ktime_set(seconds, 0);
  1846. ktime_t next;
  1847. next = ktime_add(battery->last_poll_time, low_interval);
  1848. /* The original slack time called for, 10 seconds, exceeds
  1849. * the length allowed for an unsigned long in nanoseconds. Use
  1850. * ULONG_MAX instead
  1851. */
  1852. hrtimer_start_range_ns(&battery->polling_hrtimer,
  1853. next, ULONG_MAX, HRTIMER_MODE_ABS);
  1854. }
  1855. enum hrtimer_restart sec_bat_alarm(struct hrtimer *timer)
  1856. {
  1857. struct sec_battery_info *battery = container_of(timer,
  1858. struct sec_battery_info, polling_hrtimer);
  1859. /* In wake up, monitor work will be queued in complete function
  1860. * To avoid duplicated queuing of monitor work,
  1861. * do NOT queue monitor work in wake up by polling alarm
  1862. */
  1863. if (!battery->polling_in_sleep) {
  1864. __pm_stay_awake(&battery->monitor_ws);
  1865. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  1866. dev_dbg(battery->dev, "%s: Activated\n", __func__);
  1867. }
  1868. return HRTIMER_NORESTART;
  1869. }
  1870. static unsigned int sec_bat_get_polling_time(
  1871. struct sec_battery_info *battery)
  1872. {
  1873. if (battery->status ==
  1874. POWER_SUPPLY_STATUS_FULL)
  1875. battery->polling_time =
  1876. battery->pdata->polling_time[
  1877. POWER_SUPPLY_STATUS_CHARGING];
  1878. else
  1879. battery->polling_time =
  1880. battery->pdata->polling_time[
  1881. battery->status];
  1882. battery->polling_short = true;
  1883. switch (battery->status) {
  1884. case POWER_SUPPLY_STATUS_CHARGING:
  1885. if (battery->polling_in_sleep)
  1886. battery->polling_short = false;
  1887. break;
  1888. case POWER_SUPPLY_STATUS_DISCHARGING:
  1889. if (battery->polling_in_sleep && (battery->ps_enable != true))
  1890. battery->polling_time =
  1891. battery->pdata->polling_time[
  1892. SEC_BATTERY_POLLING_TIME_SLEEP];
  1893. else
  1894. battery->polling_time =
  1895. battery->pdata->polling_time[
  1896. battery->status];
  1897. battery->polling_short = false;
  1898. break;
  1899. case POWER_SUPPLY_STATUS_FULL:
  1900. if (battery->polling_in_sleep) {
  1901. if (!(battery->pdata->full_condition_type &
  1902. SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL) &&
  1903. battery->charging_mode ==
  1904. SEC_BATTERY_CHARGING_NONE)
  1905. battery->polling_time =
  1906. battery->pdata->polling_time[
  1907. SEC_BATTERY_POLLING_TIME_SLEEP];
  1908. battery->polling_short = false;
  1909. } else {
  1910. if (battery->charging_mode ==
  1911. SEC_BATTERY_CHARGING_NONE)
  1912. battery->polling_short = false;
  1913. }
  1914. break;
  1915. }
  1916. if (battery->polling_short)
  1917. return battery->pdata->polling_time[
  1918. SEC_BATTERY_POLLING_TIME_BASIC];
  1919. /* set polling time to 46s to reduce current noise on wc */
  1920. else if (battery->cable_type == POWER_SUPPLY_TYPE_WIRELESS &&
  1921. battery->status == POWER_SUPPLY_STATUS_CHARGING)
  1922. battery->polling_time = 46;
  1923. return battery->polling_time;
  1924. }
  1925. static bool sec_bat_is_short_polling(
  1926. struct sec_battery_info *battery)
  1927. {
  1928. /* Change the full and short monitoring sequence
  1929. * Originally, full monitoring was the last time of polling_count
  1930. * But change full monitoring to first time
  1931. * because temperature check is too late
  1932. */
  1933. if (!battery->polling_short || battery->polling_count == 1)
  1934. return false;
  1935. else
  1936. return true;
  1937. }
  1938. static void sec_bat_update_polling_count(
  1939. struct sec_battery_info *battery)
  1940. {
  1941. /* do NOT change polling count in sleep
  1942. * even though it is short polling
  1943. * to keep polling count along sleep/wakeup
  1944. */
  1945. if (battery->polling_short && battery->polling_in_sleep)
  1946. return;
  1947. if (battery->polling_short &&
  1948. ((battery->polling_time /
  1949. battery->pdata->polling_time[
  1950. SEC_BATTERY_POLLING_TIME_BASIC])
  1951. > battery->polling_count))
  1952. battery->polling_count++;
  1953. else
  1954. battery->polling_count = 1; /* initial value = 1 */
  1955. }
  1956. static void sec_bat_set_polling(
  1957. struct sec_battery_info *battery)
  1958. {
  1959. unsigned int polling_time_temp;
  1960. dev_dbg(battery->dev, "%s: Start\n", __func__);
  1961. polling_time_temp = sec_bat_get_polling_time(battery);
  1962. dev_dbg(battery->dev,
  1963. "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
  1964. __func__, sec_bat_status_str[battery->status],
  1965. battery->polling_in_sleep ? "Yes" : "No",
  1966. (battery->charging_mode ==
  1967. SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
  1968. battery->polling_short ? "Yes" : "No");
  1969. dev_dbg(battery->dev,
  1970. "%s: Polling time %d/%d sec.\n", __func__,
  1971. battery->polling_short ?
  1972. (polling_time_temp * battery->polling_count) :
  1973. polling_time_temp, battery->polling_time);
  1974. /* To sync with log above,
  1975. * change polling count after log is displayed
  1976. * Do NOT update polling count in initial monitor
  1977. */
  1978. if (!battery->pdata->monitor_initial_count)
  1979. sec_bat_update_polling_count(battery);
  1980. else
  1981. dev_dbg(battery->dev,
  1982. "%s: Initial monitor %d times left.\n", __func__,
  1983. battery->pdata->monitor_initial_count);
  1984. switch (battery->pdata->polling_type) {
  1985. case SEC_BATTERY_MONITOR_WORKQUEUE:
  1986. if (battery->pdata->monitor_initial_count) {
  1987. battery->pdata->monitor_initial_count--;
  1988. schedule_delayed_work(&battery->polling_work, HZ);
  1989. } else
  1990. schedule_delayed_work(&battery->polling_work,
  1991. polling_time_temp * HZ);
  1992. break;
  1993. case SEC_BATTERY_MONITOR_ALARM:
  1994. battery->last_poll_time = ktime_get_boottime();
  1995. if (battery->pdata->monitor_initial_count) {
  1996. battery->pdata->monitor_initial_count--;
  1997. sec_bat_program_alarm(battery, 1);
  1998. } else
  1999. sec_bat_program_alarm(battery, polling_time_temp);
  2000. break;
  2001. case SEC_BATTERY_MONITOR_TIMER:
  2002. break;
  2003. default:
  2004. break;
  2005. }
  2006. dev_dbg(battery->dev, "%s: End\n", __func__);
  2007. }
  2008. #if defined(CONFIG_BATTERY_SWELLING)
  2009. static void sec_bat_swelling_fullcharged_check(struct sec_battery_info *battery)
  2010. {
  2011. union power_supply_propval value;
  2012. switch (battery->pdata->full_check_type) {
  2013. case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
  2014. if ((battery->current_now > 0 && battery->current_now <
  2015. battery->pdata->charging_current[
  2016. battery->cable_type].full_check_current_1st) &&
  2017. (battery->current_avg > 0 && battery->current_avg <
  2018. battery->pdata->charging_current[
  2019. battery->cable_type].full_check_current_1st)) {
  2020. value.intval = POWER_SUPPLY_STATUS_FULL;
  2021. }
  2022. break;
  2023. case SEC_BATTERY_FULLCHARGED_CHGPSY:
  2024. default:
  2025. psy_do_property(battery->pdata->charger_name, get,
  2026. POWER_SUPPLY_PROP_STATUS, value);
  2027. break;
  2028. }
  2029. if (value.intval == POWER_SUPPLY_STATUS_FULL) {
  2030. battery->swelling_full_check_cnt++;
  2031. pr_info("%s: Swelling mode full-charged check (%d)\n",
  2032. __func__, battery->swelling_full_check_cnt);
  2033. } else
  2034. battery->swelling_full_check_cnt = 0;
  2035. if (battery->swelling_full_check_cnt >=
  2036. battery->pdata->full_check_count) {
  2037. battery->swelling_full_check_cnt = 0;
  2038. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2039. battery->is_recharging = false;
  2040. sec_bat_set_charge(battery, false);
  2041. }
  2042. }
  2043. #endif
  2044. static void sec_bat_monitor_work(
  2045. struct work_struct *work)
  2046. {
  2047. struct sec_battery_info *battery =
  2048. container_of(work, struct sec_battery_info,
  2049. monitor_work.work);
  2050. static struct timespec old_ts;
  2051. struct timespec c_ts;
  2052. dev_dbg(battery->dev, "%s: Start\n", __func__);
  2053. c_ts = ktime_to_timespec(ktime_get_boottime());
  2054. /* monitor once after wakeup */
  2055. if (battery->polling_in_sleep) {
  2056. battery->polling_in_sleep = false;
  2057. if ((battery->status == POWER_SUPPLY_STATUS_DISCHARGING) &&
  2058. (battery->ps_enable != true)) {
  2059. if ((unsigned long)(c_ts.tv_sec - old_ts.tv_sec) < 5 * 60) {
  2060. pr_info("Skip monitor_work(%ld)\n",
  2061. c_ts.tv_sec - old_ts.tv_sec);
  2062. goto skip_monitor;
  2063. }
  2064. }
  2065. }
  2066. /* update last monitor time */
  2067. old_ts = c_ts;
  2068. sec_bat_get_battery_info(battery);
  2069. /* 0. test mode */
  2070. if (battery->test_mode) {
  2071. dev_err(battery->dev, "%s: Test Mode\n", __func__);
  2072. sec_bat_do_test_function(battery);
  2073. if (battery->test_mode != 0)
  2074. goto continue_monitor;
  2075. }
  2076. /* 1. battery check */
  2077. if (!sec_bat_battery_cable_check(battery))
  2078. goto continue_monitor;
  2079. /* 2. voltage check */
  2080. if (!sec_bat_voltage_check(battery))
  2081. goto continue_monitor;
  2082. /* monitor short routine in initial monitor */
  2083. if (battery->pdata->monitor_initial_count ||
  2084. sec_bat_is_short_polling(battery))
  2085. goto continue_monitor;
  2086. /* 3. time management */
  2087. if (!sec_bat_time_management(battery))
  2088. goto continue_monitor;
  2089. /* 4. temperature check */
  2090. if (!sec_bat_temperature_check(battery))
  2091. goto continue_monitor;
  2092. /* 5. full charging check */
  2093. #if defined(CONFIG_BATTERY_SWELLING)
  2094. sec_bat_swelling_check(battery, battery->temperature);
  2095. if (battery->swelling_mode && !battery->charging_block)
  2096. sec_bat_swelling_fullcharged_check(battery);
  2097. else
  2098. sec_bat_fullcharged_check(battery);
  2099. #else
  2100. sec_bat_fullcharged_check(battery);
  2101. #endif
  2102. /* 6. additional check */
  2103. if (battery->pdata->monitor_additional_check)
  2104. battery->pdata->monitor_additional_check();
  2105. #if !defined(CONFIG_SEC_FACTORY)
  2106. /* 7. charger temperature check */
  2107. if (battery->pdata->chg_temp_check)
  2108. sec_bat_chg_temperature_check(battery);
  2109. #endif
  2110. continue_monitor:
  2111. dev_info(battery->dev,
  2112. "%s: Status(%s), Mode(%s), Health(%s), Cable(%d), Vendor(%s), level(%d%%)\n",
  2113. __func__,
  2114. sec_bat_status_str[battery->status],
  2115. sec_bat_charging_mode_str[battery->charging_mode],
  2116. sec_bat_health_str[battery->health],
  2117. battery->cable_type, battery->pdata->vendor, battery->siop_level);
  2118. #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
  2119. dev_info(battery->dev,
  2120. "%s: battery->stability_test(%d), battery->eng_not_full_status(%d)\n",
  2121. __func__, battery->stability_test, battery->eng_not_full_status);
  2122. #endif
  2123. if (battery->store_mode && battery->cable_type != POWER_SUPPLY_TYPE_BATTERY) {
  2124. dev_info(battery->dev,
  2125. "%s: @battery->capacity = (%d), battery->status= (%d), battery->store_mode=(%d)\n",
  2126. __func__, battery->capacity, battery->status, battery->store_mode);
  2127. if ((battery->capacity >= 35) && (battery->status == POWER_SUPPLY_STATUS_CHARGING)) {
  2128. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  2129. sec_bat_set_charge(battery, false);
  2130. }
  2131. if ((battery->capacity <= 30) && (battery->status == POWER_SUPPLY_STATUS_DISCHARGING)) {
  2132. battery->status = POWER_SUPPLY_STATUS_CHARGING;
  2133. sec_bat_set_charge(battery, true);
  2134. }
  2135. }
  2136. power_supply_changed(&battery->psy_bat);
  2137. skip_monitor:
  2138. sec_bat_set_polling(battery);
  2139. if (battery->capacity <= 0 || battery->health_change)
  2140. __pm_wakeup_event(&battery->monitor_ws, HZ * 5);
  2141. else
  2142. __pm_relax(&battery->monitor_ws);
  2143. dev_dbg(battery->dev, "%s: End\n", __func__);
  2144. return;
  2145. }
  2146. static void sec_bat_cable_work(struct work_struct *work)
  2147. {
  2148. struct sec_battery_info *battery = container_of(work,
  2149. struct sec_battery_info, cable_work.work);
  2150. union power_supply_propval val;
  2151. int wl_cur, wr_cur, current_cable_type;
  2152. int sleep_check_count;
  2153. dev_dbg(battery->dev, "%s: Start\n", __func__);
  2154. /* check fuelgauge in sleep for i2c */
  2155. sleep_check_count = 10;
  2156. while ((battery->fuelgauge_in_sleep == true) && (sleep_check_count > 0)) {
  2157. dev_info(battery->dev, "%s in suspend status count (%d)\n",
  2158. __func__, sleep_check_count);
  2159. sleep_check_count--;
  2160. msleep(50);
  2161. }
  2162. wl_cur = battery->pdata->charging_current[
  2163. POWER_SUPPLY_TYPE_WIRELESS].input_current_limit;
  2164. wr_cur = battery->pdata->charging_current[
  2165. battery->wire_status].input_current_limit;
  2166. if (battery->wc_status && battery->wc_enable &&
  2167. (wl_cur > wr_cur))
  2168. current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
  2169. else
  2170. current_cable_type = battery->wire_status;
  2171. if ((current_cable_type == battery->cable_type) && !battery->slate_mode) {
  2172. dev_dbg(battery->dev,
  2173. "%s: Cable is NOT Changed(%d)\n",
  2174. __func__, battery->cable_type);
  2175. /* Do NOT activate cable work for NOT changed */
  2176. goto end_of_cable_work;
  2177. }
  2178. #if defined(CONFIG_BATTERY_SWELLING)
  2179. battery->swelling_mode = false;
  2180. /* restore 4.4V float voltage */
  2181. val.intval = battery->pdata->swelling_normal_float_voltage;
  2182. psy_do_property(battery->pdata->charger_name, set,
  2183. POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
  2184. #endif
  2185. battery->cable_type = current_cable_type;
  2186. sec_bat_check_cable_result_callback(battery->dev, battery->cable_type);
  2187. #ifdef CONFIG_SAMSUNG_BATTERY_DISALLOW_DEEP_SLEEP
  2188. if (battery->pdata->charging_current[battery->cable_type].fast_charging_current != 0) {
  2189. pr_info("QMCK: block xo shutdown\n");
  2190. if (!xo_chr)
  2191. xo_chr = clk_get_sys("charger", "xo_chr"); // Disable xo shutdown
  2192. clk_prepare_enable(xo_chr);
  2193. clk_set_rate(xo_chr, 19200000);
  2194. } else {
  2195. pr_info("QMCK: Enable xo shutdown\n");
  2196. if (xo_chr) {
  2197. clk_disable_unprepare(xo_chr);
  2198. clk_put(xo_chr);
  2199. }
  2200. }
  2201. #endif
  2202. /* platform can NOT get information of cable connection
  2203. * because wakeup time is too short to check uevent
  2204. * To make sure that target is wakeup
  2205. * if cable is connected and disconnected,
  2206. * activated wake lock in a few seconds
  2207. */
  2208. __pm_wakeup_event(&battery->vbus_ws, HZ * 10);
  2209. if (battery->cable_type == POWER_SUPPLY_TYPE_BATTERY ||
  2210. ((battery->pdata->cable_check_type &
  2211. SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE) &&
  2212. battery->cable_type == POWER_SUPPLY_TYPE_UNKNOWN)) {
  2213. if (battery->status == POWER_SUPPLY_STATUS_FULL || battery->capacity == 100) {
  2214. /* To prevent soc jumping to 100 when cable is removed on progressing
  2215. forced full-charged sequence */
  2216. #if defined(CONFIG_AFC_CHARGER_MODE)
  2217. val.intval = battery->capacity;
  2218. psy_do_property(battery->pdata->fuelgauge_name, set,
  2219. POWER_SUPPLY_PROP_CHARGE_FULL, val);
  2220. #else
  2221. val.intval = POWER_SUPPLY_TYPE_BATTERY;
  2222. psy_do_property(battery->pdata->fuelgauge_name, set,
  2223. POWER_SUPPLY_PROP_CHARGE_FULL, val);
  2224. #endif
  2225. /* To get SOC value (NOT raw SOC), need to reset value */
  2226. val.intval = 0;
  2227. psy_do_property(battery->pdata->fuelgauge_name, get,
  2228. POWER_SUPPLY_PROP_CAPACITY, val);
  2229. battery->prev_reported_soc = 100;
  2230. sec_bat_check_changed_soc(battery, &val);
  2231. battery->capacity = val.intval;
  2232. }
  2233. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2234. battery->is_recharging = false;
  2235. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  2236. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  2237. if (sec_bat_set_charge(battery, false))
  2238. goto end_of_cable_work;
  2239. } else if (battery->slate_mode == true) {
  2240. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  2241. battery->cable_type = POWER_SUPPLY_TYPE_BATTERY;
  2242. val.intval = 0;
  2243. psy_do_property(battery->pdata->charger_name, set,
  2244. POWER_SUPPLY_PROP_CURRENT_NOW, val);
  2245. dev_info(battery->dev,
  2246. "%s:slate mode on\n",__func__);
  2247. } else {
  2248. #if defined(CONFIG_EN_OOPS)
  2249. val.intval = battery->cable_type;
  2250. psy_do_property(battery->pdata->fuelgauge_name, set,
  2251. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, val);
  2252. #endif
  2253. /* Do NOT display the charging icon when OTG is enabled */
  2254. if (battery->cable_type == POWER_SUPPLY_TYPE_OTG) {
  2255. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  2256. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  2257. } else if (battery->cable_type == POWER_SUPPLY_TYPE_HV_PREPARE_MAINS) {
  2258. val.intval = battery->cable_type;
  2259. psy_do_property(battery->pdata->charger_name, set,
  2260. POWER_SUPPLY_PROP_ONLINE, val);
  2261. dev_info(battery->dev,
  2262. "%s: Prepare AFC cable plugin\n", __func__);
  2263. goto end_of_cable_work;
  2264. } else {
  2265. if (battery->pdata->full_check_type !=
  2266. SEC_BATTERY_FULLCHARGED_NONE)
  2267. battery->charging_mode =
  2268. SEC_BATTERY_CHARGING_1ST;
  2269. else
  2270. battery->charging_mode =
  2271. SEC_BATTERY_CHARGING_2ND;
  2272. battery->status = POWER_SUPPLY_STATUS_CHARGING;
  2273. }
  2274. if (sec_bat_set_charge(battery, true))
  2275. goto end_of_cable_work;
  2276. /* No need for wakelock in Alarm */
  2277. if (battery->pdata->polling_type != SEC_BATTERY_MONITOR_ALARM)
  2278. __pm_stay_awake(&battery->vbus_ws);
  2279. }
  2280. /* polling time should be reset when cable is changed
  2281. * polling_in_sleep should be reset also
  2282. * before polling time is re-calculated
  2283. * to prevent from counting 1 for events
  2284. * right after cable is connected
  2285. */
  2286. battery->polling_in_sleep = false;
  2287. sec_bat_get_polling_time(battery);
  2288. dev_info(battery->dev,
  2289. "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
  2290. __func__, sec_bat_status_str[battery->status],
  2291. battery->polling_in_sleep ? "Yes" : "No",
  2292. (battery->charging_mode ==
  2293. SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
  2294. battery->polling_short ? "Yes" : "No");
  2295. dev_info(battery->dev,
  2296. "%s: Polling time is reset to %d sec.\n", __func__,
  2297. battery->polling_time);
  2298. battery->polling_count = 1; /* initial value = 1 */
  2299. __pm_stay_awake(&battery->monitor_ws);
  2300. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work,
  2301. msecs_to_jiffies(500));
  2302. end_of_cable_work:
  2303. __pm_relax(&battery->cable_ws);
  2304. dev_dbg(battery->dev, "%s: End\n", __func__);
  2305. }
  2306. static void sec_bat_vbus_detect_work(struct work_struct *work)
  2307. {
  2308. struct sec_battery_info *battery = container_of(work,
  2309. struct sec_battery_info, vbus_detect_work.work);
  2310. dev_dbg(battery->dev, "%s\n", __func__);
  2311. sec_bat_check_cable_callback(battery);
  2312. __pm_relax(&battery->vbus_detect_ws);
  2313. }
  2314. ssize_t sec_bat_show_attrs(struct device *dev,
  2315. struct device_attribute *attr, char *buf)
  2316. {
  2317. struct power_supply *psy = dev_get_drvdata(dev);
  2318. struct sec_battery_info *battery =
  2319. container_of(psy, struct sec_battery_info, psy_bat);
  2320. const ptrdiff_t offset = attr - sec_battery_attrs;
  2321. union power_supply_propval value;
  2322. int i = 0;
  2323. int ret = 0;
  2324. switch (offset) {
  2325. case BATT_RESET_SOC:
  2326. break;
  2327. case BATT_READ_RAW_SOC:
  2328. {
  2329. union power_supply_propval value;
  2330. value.intval =
  2331. SEC_FUELGAUGE_CAPACITY_TYPE_RAW;
  2332. psy_do_property(battery->pdata->fuelgauge_name, get,
  2333. POWER_SUPPLY_PROP_CAPACITY, value);
  2334. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2335. value.intval);
  2336. }
  2337. break;
  2338. case BATT_READ_ADJ_SOC:
  2339. break;
  2340. case BATT_TYPE:
  2341. i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
  2342. battery->pdata->vendor);
  2343. break;
  2344. case BATT_VFOCV:
  2345. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2346. battery->voltage_ocv);
  2347. break;
  2348. case BATT_VOL_ADC:
  2349. break;
  2350. case BATT_VOL_ADC_CAL:
  2351. break;
  2352. case BATT_VOL_AVER:
  2353. break;
  2354. case BATT_VOL_ADC_AVER:
  2355. break;
  2356. case BATT_CURRENT_UA_NOW:
  2357. {
  2358. union power_supply_propval value;
  2359. value.intval = SEC_BATTEY_CURRENT_UA;
  2360. psy_do_property(battery->pdata->fuelgauge_name, get,
  2361. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  2362. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2363. value.intval);
  2364. }
  2365. break;
  2366. case BATT_CURRENT_UA_AVG:
  2367. {
  2368. union power_supply_propval value;
  2369. value.intval = SEC_BATTEY_CURRENT_UA;
  2370. psy_do_property(battery->pdata->fuelgauge_name, get,
  2371. POWER_SUPPLY_PROP_CURRENT_AVG, value);
  2372. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2373. value.intval);
  2374. }
  2375. break;
  2376. case BATT_TEMP:
  2377. switch (battery->pdata->thermal_source) {
  2378. case SEC_BATTERY_THERMAL_SOURCE_FG:
  2379. psy_do_property(battery->pdata->fuelgauge_name, get,
  2380. POWER_SUPPLY_PROP_TEMP, value);
  2381. break;
  2382. case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
  2383. if (battery->pdata->get_temperature_callback) {
  2384. battery->pdata->get_temperature_callback(
  2385. POWER_SUPPLY_PROP_TEMP, &value);
  2386. }
  2387. break;
  2388. case SEC_BATTERY_THERMAL_SOURCE_ADC:
  2389. sec_bat_get_temperature_by_adc(battery,
  2390. SEC_BAT_ADC_CHANNEL_TEMP, &value);
  2391. break;
  2392. default:
  2393. break;
  2394. }
  2395. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2396. value.intval);
  2397. break;
  2398. case BATT_TEMP_ADC:
  2399. /*
  2400. If F/G is used for reading the temperature and
  2401. compensation table is used,
  2402. the raw value that isn't compensated can be read by
  2403. POWER_SUPPLY_PROP_TEMP_AMBIENT
  2404. */
  2405. switch (battery->pdata->thermal_source) {
  2406. case SEC_BATTERY_THERMAL_SOURCE_FG:
  2407. psy_do_property(battery->pdata->fuelgauge_name, get,
  2408. POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
  2409. battery->temp_adc = value.intval;
  2410. break;
  2411. default:
  2412. break;
  2413. }
  2414. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2415. battery->temp_adc);
  2416. break;
  2417. case BATT_TEMP_AVER:
  2418. break;
  2419. case BATT_TEMP_ADC_AVER:
  2420. break;
  2421. case BATT_CHG_TEMP:
  2422. if (battery->pdata->chg_temp_check) {
  2423. sec_bat_get_temperature_by_adc(battery,
  2424. SEC_BAT_ADC_CHANNEL_CHG_TEMP, &value);
  2425. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2426. value.intval);
  2427. } else {
  2428. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2429. 0);
  2430. }
  2431. break;
  2432. case BATT_CHG_TEMP_ADC:
  2433. if (battery->pdata->chg_temp_check) {
  2434. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2435. battery->chg_temp_adc);
  2436. } else {
  2437. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2438. 0);
  2439. }
  2440. break;
  2441. case BATT_VF_ADC:
  2442. break;
  2443. case BATT_SLATE_MODE:
  2444. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2445. battery->slate_mode);
  2446. break;
  2447. case BATT_LP_CHARGING:
  2448. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2449. sec_bat_is_lpm(battery) ? 1 : 0);
  2450. break;
  2451. case SIOP_ACTIVATED:
  2452. break;
  2453. case SIOP_LEVEL:
  2454. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2455. battery->siop_level);
  2456. break;
  2457. case BATT_CHARGING_SOURCE:
  2458. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2459. battery->cable_type);
  2460. break;
  2461. case FG_REG_DUMP:
  2462. break;
  2463. case FG_RESET_CAP:
  2464. break;
  2465. case FG_CAPACITY:
  2466. {
  2467. union power_supply_propval value;
  2468. value.intval =
  2469. SEC_BATTEY_CAPACITY_DESIGNED;
  2470. psy_do_property(battery->pdata->fuelgauge_name, get,
  2471. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  2472. i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
  2473. value.intval);
  2474. value.intval =
  2475. SEC_BATTEY_CAPACITY_ABSOLUTE;
  2476. psy_do_property(battery->pdata->fuelgauge_name, get,
  2477. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  2478. i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
  2479. value.intval);
  2480. value.intval =
  2481. SEC_BATTEY_CAPACITY_TEMPERARY;
  2482. psy_do_property(battery->pdata->fuelgauge_name, get,
  2483. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  2484. i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
  2485. value.intval);
  2486. value.intval =
  2487. SEC_BATTEY_CAPACITY_CURRENT;
  2488. psy_do_property(battery->pdata->fuelgauge_name, get,
  2489. POWER_SUPPLY_PROP_ENERGY_NOW, value);
  2490. i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x\n",
  2491. value.intval);
  2492. }
  2493. break;
  2494. case FG_ASOC:
  2495. psy_do_property(battery->pdata->fuelgauge_name, get,
  2496. POWER_SUPPLY_PROP_ENERGY_FULL, value);
  2497. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2498. value.intval);
  2499. break;
  2500. case AUTH:
  2501. break;
  2502. case CHG_CURRENT_ADC:
  2503. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2504. battery->current_adc);
  2505. break;
  2506. case WC_ADC:
  2507. break;
  2508. case WC_STATUS:
  2509. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2510. (battery->cable_type == POWER_SUPPLY_TYPE_WIRELESS));
  2511. break;
  2512. case WC_ENABLE:
  2513. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2514. battery->wc_enable);
  2515. break;
  2516. case HV_CHARGER_STATUS:
  2517. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2518. ((battery->cable_type == POWER_SUPPLY_TYPE_HV_MAINS) ||
  2519. (battery->cable_type == POWER_SUPPLY_TYPE_HV_ERR)) ? 1 : 0);
  2520. break;
  2521. case HV_CHARGER_SET:
  2522. break;
  2523. case FACTORY_MODE:
  2524. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2525. battery->factory_mode);
  2526. break;
  2527. case STORE_MODE:
  2528. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2529. battery->store_mode);
  2530. break;
  2531. case UPDATE:
  2532. break;
  2533. case TEST_MODE:
  2534. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2535. battery->test_mode);
  2536. break;
  2537. case BATT_EVENT_CALL:
  2538. case BATT_EVENT_2G_CALL:
  2539. case BATT_EVENT_TALK_GSM:
  2540. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2541. (battery->event & EVENT_2G_CALL) ? 1 : 0);
  2542. break;
  2543. case BATT_EVENT_3G_CALL:
  2544. case BATT_EVENT_TALK_WCDMA:
  2545. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2546. (battery->event & EVENT_3G_CALL) ? 1 : 0);
  2547. break;
  2548. case BATT_EVENT_MUSIC:
  2549. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2550. (battery->event & EVENT_MUSIC) ? 1 : 0);
  2551. break;
  2552. case BATT_EVENT_VIDEO:
  2553. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2554. (battery->event & EVENT_VIDEO) ? 1 : 0);
  2555. break;
  2556. case BATT_EVENT_BROWSER:
  2557. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2558. (battery->event & EVENT_BROWSER) ? 1 : 0);
  2559. break;
  2560. case BATT_EVENT_HOTSPOT:
  2561. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2562. (battery->event & EVENT_HOTSPOT) ? 1 : 0);
  2563. break;
  2564. case BATT_EVENT_CAMERA:
  2565. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2566. (battery->event & EVENT_CAMERA) ? 1 : 0);
  2567. break;
  2568. case BATT_EVENT_CAMCORDER:
  2569. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2570. (battery->event & EVENT_CAMCORDER) ? 1 : 0);
  2571. break;
  2572. case BATT_EVENT_DATA_CALL:
  2573. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2574. (battery->event & EVENT_DATA_CALL) ? 1 : 0);
  2575. break;
  2576. case BATT_EVENT_WIFI:
  2577. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2578. (battery->event & EVENT_WIFI) ? 1 : 0);
  2579. break;
  2580. case BATT_EVENT_WIBRO:
  2581. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2582. (battery->event & EVENT_WIBRO) ? 1 : 0);
  2583. break;
  2584. case BATT_EVENT_LTE:
  2585. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2586. (battery->event & EVENT_LTE) ? 1 : 0);
  2587. break;
  2588. case BATT_EVENT_LCD:
  2589. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2590. (battery->event & EVENT_LCD) ? 1 : 0);
  2591. break;
  2592. case BATT_EVENT_GPS:
  2593. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2594. (battery->event & EVENT_GPS) ? 1 : 0);
  2595. break;
  2596. case BATT_EVENT:
  2597. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2598. battery->event);
  2599. break;
  2600. case BATT_TEMP_TABLE:
  2601. i += scnprintf(buf + i, PAGE_SIZE - i,
  2602. "%d %d %d %d %d %d %d %d %d %d %d %d\n",
  2603. battery->pdata->temp_high_threshold_event,
  2604. battery->pdata->temp_high_recovery_event,
  2605. battery->pdata->temp_low_threshold_event,
  2606. battery->pdata->temp_low_recovery_event,
  2607. battery->pdata->temp_high_threshold_normal,
  2608. battery->pdata->temp_high_recovery_normal,
  2609. battery->pdata->temp_low_threshold_normal,
  2610. battery->pdata->temp_low_recovery_normal,
  2611. battery->pdata->temp_high_threshold_lpm,
  2612. battery->pdata->temp_high_recovery_lpm,
  2613. battery->pdata->temp_low_threshold_lpm,
  2614. battery->pdata->temp_low_recovery_lpm);
  2615. break;
  2616. case BATT_HIGH_CURRENT_USB:
  2617. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2618. battery->is_hc_usb);
  2619. break;
  2620. #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
  2621. case BATT_TEST_CHARGE_CURRENT:
  2622. {
  2623. union power_supply_propval value;
  2624. psy_do_property(battery->pdata->charger_name, get,
  2625. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  2626. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2627. value.intval);
  2628. }
  2629. break;
  2630. #endif
  2631. case BATT_STABILITY_TEST:
  2632. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2633. battery->stability_test);
  2634. break;
  2635. case BATT_INBAT_VOLTAGE:
  2636. ret = sec_bat_get_adc_value(battery, SEC_BAT_ADC_CHANNEL_INBAT_VOLTAGE);
  2637. dev_info(battery->dev, "in-battery voltage(%d)\n", ret);
  2638. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
  2639. ret);
  2640. break;
  2641. #if !defined(CONFIG_DISABLE_SAVE_CAPACITY_MAX)
  2642. case BATT_CAPACITY_MAX:
  2643. psy_do_property(battery->pdata->fuelgauge_name, get,
  2644. POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, value);
  2645. i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
  2646. break;
  2647. #endif
  2648. default:
  2649. i = -EINVAL;
  2650. }
  2651. return i;
  2652. }
  2653. void update_external_temp_table(struct sec_battery_info *battery, int temp[])
  2654. {
  2655. battery->pdata->temp_high_threshold_event = temp[0];
  2656. battery->pdata->temp_high_recovery_event = temp[1];
  2657. battery->pdata->temp_low_threshold_event = temp[2];
  2658. battery->pdata->temp_low_recovery_event = temp[3];
  2659. battery->pdata->temp_high_threshold_normal = temp[4];
  2660. battery->pdata->temp_high_recovery_normal = temp[5];
  2661. battery->pdata->temp_low_threshold_normal = temp[6];
  2662. battery->pdata->temp_low_recovery_normal = temp[7];
  2663. battery->pdata->temp_high_threshold_lpm = temp[8];
  2664. battery->pdata->temp_high_recovery_lpm = temp[9];
  2665. battery->pdata->temp_low_threshold_lpm = temp[10];
  2666. battery->pdata->temp_low_recovery_lpm = temp[11];
  2667. if (battery->pdata->temp_high_threshold_event !=
  2668. battery->pdata->temp_high_threshold_normal)
  2669. battery->pdata->event_check = 1;
  2670. }
  2671. ssize_t sec_bat_store_attrs(
  2672. struct device *dev,
  2673. struct device_attribute *attr,
  2674. const char *buf, size_t count)
  2675. {
  2676. struct power_supply *psy = dev_get_drvdata(dev);
  2677. struct sec_battery_info *battery =
  2678. container_of(psy, struct sec_battery_info, psy_bat);
  2679. const ptrdiff_t offset = attr - sec_battery_attrs;
  2680. int ret = -EINVAL;
  2681. int x = 0;
  2682. int t[12];
  2683. switch (offset) {
  2684. case BATT_RESET_SOC:
  2685. /* Do NOT reset fuel gauge in charging mode */
  2686. if ((battery->cable_type == POWER_SUPPLY_TYPE_BATTERY) ||
  2687. sec_bat_check_jig_status()) {
  2688. #if defined(CONFIG_QPNP_BMS)
  2689. extern void bms_quickstart(void);
  2690. battery->voltage_now = 1234;
  2691. battery->voltage_avg = 1234;
  2692. power_supply_changed(&battery->psy_bat);
  2693. bms_quickstart();
  2694. #else
  2695. union power_supply_propval value;
  2696. battery->voltage_now = 1234;
  2697. battery->voltage_avg = 1234;
  2698. power_supply_changed(&battery->psy_bat);
  2699. value.intval =
  2700. SEC_FUELGAUGE_CAPACITY_TYPE_RESET;
  2701. psy_do_property(battery->pdata->fuelgauge_name, set,
  2702. POWER_SUPPLY_PROP_CAPACITY, value);
  2703. #endif
  2704. dev_info(battery->dev,"do reset SOC\n");
  2705. /* init prev_reported_soc for not checking sec_bat_check_changed_soc() */
  2706. battery->prev_reported_soc = -EINVAL;
  2707. /* update battery info */
  2708. sec_bat_get_battery_info(battery);
  2709. }
  2710. ret = count;
  2711. break;
  2712. case BATT_READ_RAW_SOC:
  2713. break;
  2714. case BATT_READ_ADJ_SOC:
  2715. break;
  2716. case BATT_TYPE:
  2717. break;
  2718. case BATT_VFOCV:
  2719. break;
  2720. case BATT_VOL_ADC:
  2721. break;
  2722. case BATT_VOL_ADC_CAL:
  2723. break;
  2724. case BATT_VOL_AVER:
  2725. break;
  2726. case BATT_VOL_ADC_AVER:
  2727. break;
  2728. case BATT_CURRENT_UA_NOW:
  2729. break;
  2730. case BATT_CURRENT_UA_AVG:
  2731. break;
  2732. case BATT_TEMP:
  2733. break;
  2734. case BATT_TEMP_ADC:
  2735. break;
  2736. case BATT_TEMP_AVER:
  2737. break;
  2738. case BATT_TEMP_ADC_AVER:
  2739. break;
  2740. case BATT_CHG_TEMP:
  2741. break;
  2742. case BATT_CHG_TEMP_ADC:
  2743. break;
  2744. case BATT_VF_ADC:
  2745. break;
  2746. case BATT_SLATE_MODE:
  2747. if (sscanf(buf, "%d\n", &x) == 1) {
  2748. if (x == 1) {
  2749. battery->slate_mode = true;
  2750. } else if (x == 0) {
  2751. battery->slate_mode = false;
  2752. } else {
  2753. dev_info(battery->dev,
  2754. "%s: SLATE MODE unknown command\n",
  2755. __func__);
  2756. return -EINVAL;
  2757. }
  2758. __pm_stay_awake(&battery->cable_ws);
  2759. queue_delayed_work(battery->monitor_wqueue,
  2760. &battery->cable_work, 0);
  2761. ret = count;
  2762. }
  2763. break;
  2764. case BATT_LP_CHARGING:
  2765. break;
  2766. case SIOP_ACTIVATED:
  2767. break;
  2768. case SIOP_LEVEL:
  2769. #if defined(CONFIG_TMM_CHG_CTRL)
  2770. if(tuner_running_status==TUNER_IS_OFF) {
  2771. dev_dbg(battery->dev,
  2772. "%s: tmm tuner is off!\n", __func__);
  2773. #endif
  2774. if (sscanf(buf, "%d\n", &x) == 1) {
  2775. union power_supply_propval value;
  2776. dev_info(battery->dev,
  2777. "%s: siop level: %d\n", __func__, x);
  2778. if (battery->capacity <= 5)
  2779. battery->siop_level = 100;
  2780. else if (x >= 0 && x <= 100)
  2781. battery->siop_level = x;
  2782. else
  2783. battery->siop_level = 100;
  2784. value.intval = battery->siop_level;
  2785. psy_do_property(battery->pdata->charger_name, set,
  2786. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, value);
  2787. ret = count;
  2788. }
  2789. #if defined(CONFIG_TMM_CHG_CTRL)
  2790. }
  2791. #endif
  2792. break;
  2793. case BATT_CHARGING_SOURCE:
  2794. break;
  2795. case FG_REG_DUMP:
  2796. break;
  2797. case FG_RESET_CAP:
  2798. break;
  2799. case FG_CAPACITY:
  2800. break;
  2801. case AUTH:
  2802. break;
  2803. case CHG_CURRENT_ADC:
  2804. break;
  2805. case WC_ADC:
  2806. break;
  2807. case WC_STATUS:
  2808. break;
  2809. case WC_ENABLE:
  2810. if (sscanf(buf, "%d\n", &x) == 1) {
  2811. if (x == 0) {
  2812. battery->wc_enable = false;
  2813. } else if (x == 1) {
  2814. battery->wc_enable = true;
  2815. } else {
  2816. dev_info(battery->dev,
  2817. "%s: WPC ENABLE unknown command\n",
  2818. __func__);
  2819. return -EINVAL;
  2820. }
  2821. __pm_stay_awake(&battery->cable_ws);
  2822. queue_delayed_work(battery->monitor_wqueue,
  2823. &battery->cable_work, 0);
  2824. ret = count;
  2825. }
  2826. break;
  2827. case HV_CHARGER_STATUS:
  2828. break;
  2829. case HV_CHARGER_SET:
  2830. if (sscanf(buf, "%d\n", &x) == 1) {
  2831. dev_info(battery->dev,
  2832. "%s: HV_CHARGER_SET(%d)\n", __func__, x);
  2833. if (x == 1) {
  2834. battery->wire_status = POWER_SUPPLY_TYPE_HV_MAINS;
  2835. __pm_stay_awake(&battery->cable_ws);
  2836. queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
  2837. } else {
  2838. battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
  2839. __pm_stay_awake(&battery->cable_ws);
  2840. queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
  2841. }
  2842. ret = count;
  2843. }
  2844. break;
  2845. case FACTORY_MODE:
  2846. if (sscanf(buf, "%d\n", &x) == 1) {
  2847. battery->factory_mode = x ? true : false;
  2848. ret = count;
  2849. }
  2850. break;
  2851. case STORE_MODE:
  2852. if (sscanf(buf, "%d\n", &x) == 1) {
  2853. if (x)
  2854. battery->store_mode = true;
  2855. ret = count;
  2856. }
  2857. break;
  2858. case UPDATE:
  2859. if (sscanf(buf, "%d\n", &x) == 1) {
  2860. /* update battery info */
  2861. sec_bat_get_battery_info(battery);
  2862. ret = count;
  2863. }
  2864. break;
  2865. case TEST_MODE:
  2866. if (sscanf(buf, "%d\n", &x) == 1) {
  2867. battery->test_mode = x;
  2868. __pm_stay_awake(&battery->monitor_ws);
  2869. queue_delayed_work(battery->monitor_wqueue,
  2870. &battery->monitor_work, 0);
  2871. ret = count;
  2872. }
  2873. break;
  2874. case BATT_EVENT_CALL:
  2875. case BATT_EVENT_2G_CALL:
  2876. case BATT_EVENT_TALK_GSM:
  2877. if (sscanf(buf, "%d\n", &x) == 1) {
  2878. sec_bat_event_set(battery, EVENT_2G_CALL, x);
  2879. ret = count;
  2880. }
  2881. break;
  2882. case BATT_EVENT_3G_CALL:
  2883. case BATT_EVENT_TALK_WCDMA:
  2884. if (sscanf(buf, "%d\n", &x) == 1) {
  2885. sec_bat_event_set(battery, EVENT_3G_CALL, x);
  2886. ret = count;
  2887. }
  2888. break;
  2889. case BATT_EVENT_MUSIC:
  2890. if (sscanf(buf, "%d\n", &x) == 1) {
  2891. sec_bat_event_set(battery, EVENT_MUSIC, x);
  2892. ret = count;
  2893. }
  2894. break;
  2895. case BATT_EVENT_VIDEO:
  2896. if (sscanf(buf, "%d\n", &x) == 1) {
  2897. sec_bat_event_set(battery, EVENT_VIDEO, x);
  2898. ret = count;
  2899. }
  2900. break;
  2901. case BATT_EVENT_BROWSER:
  2902. if (sscanf(buf, "%d\n", &x) == 1) {
  2903. sec_bat_event_set(battery, EVENT_BROWSER, x);
  2904. ret = count;
  2905. }
  2906. break;
  2907. case BATT_EVENT_HOTSPOT:
  2908. if (sscanf(buf, "%d\n", &x) == 1) {
  2909. sec_bat_event_set(battery, EVENT_HOTSPOT, x);
  2910. ret = count;
  2911. }
  2912. break;
  2913. case BATT_EVENT_CAMERA:
  2914. if (sscanf(buf, "%d\n", &x) == 1) {
  2915. sec_bat_event_set(battery, EVENT_CAMERA, x);
  2916. ret = count;
  2917. }
  2918. break;
  2919. case BATT_EVENT_CAMCORDER:
  2920. if (sscanf(buf, "%d\n", &x) == 1) {
  2921. sec_bat_event_set(battery, EVENT_CAMCORDER, x);
  2922. ret = count;
  2923. }
  2924. break;
  2925. case BATT_EVENT_DATA_CALL:
  2926. if (sscanf(buf, "%d\n", &x) == 1) {
  2927. sec_bat_event_set(battery, EVENT_DATA_CALL, x);
  2928. ret = count;
  2929. }
  2930. break;
  2931. case BATT_EVENT_WIFI:
  2932. if (sscanf(buf, "%d\n", &x) == 1) {
  2933. sec_bat_event_set(battery, EVENT_WIFI, x);
  2934. ret = count;
  2935. }
  2936. break;
  2937. case BATT_EVENT_WIBRO:
  2938. if (sscanf(buf, "%d\n", &x) == 1) {
  2939. sec_bat_event_set(battery, EVENT_WIBRO, x);
  2940. ret = count;
  2941. }
  2942. break;
  2943. case BATT_EVENT_LTE:
  2944. if (sscanf(buf, "%d\n", &x) == 1) {
  2945. sec_bat_event_set(battery, EVENT_LTE, x);
  2946. ret = count;
  2947. }
  2948. break;
  2949. case BATT_EVENT_LCD:
  2950. if (sscanf(buf, "%d\n", &x) == 1) {
  2951. /* we need to test
  2952. sec_bat_event_set(battery, EVENT_LCD, x);
  2953. */
  2954. ret = count;
  2955. }
  2956. break;
  2957. case BATT_EVENT_GPS:
  2958. if (sscanf(buf, "%d\n", &x) == 1) {
  2959. sec_bat_event_set(battery, EVENT_GPS, x);
  2960. ret = count;
  2961. }
  2962. break;
  2963. case BATT_TEMP_TABLE:
  2964. if (sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d\n",
  2965. &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6], &t[7], &t[8], &t[9], &t[10], &t[11]) == 12) {
  2966. pr_info("%s: (new) %d %d %d %d %d %d %d %d %d %d %d %d\n",
  2967. __func__, t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9], t[10], t[11]);
  2968. pr_info("%s: (default) %d %d %d %d %d %d %d %d %d %d %d %d\n",
  2969. __func__,
  2970. battery->pdata->temp_high_threshold_event,
  2971. battery->pdata->temp_high_recovery_event,
  2972. battery->pdata->temp_low_threshold_event,
  2973. battery->pdata->temp_low_recovery_event,
  2974. battery->pdata->temp_high_threshold_normal,
  2975. battery->pdata->temp_high_recovery_normal,
  2976. battery->pdata->temp_low_threshold_normal,
  2977. battery->pdata->temp_low_recovery_normal,
  2978. battery->pdata->temp_high_threshold_lpm,
  2979. battery->pdata->temp_high_recovery_lpm,
  2980. battery->pdata->temp_low_threshold_lpm,
  2981. battery->pdata->temp_low_recovery_lpm);
  2982. update_external_temp_table(battery, t);
  2983. ret = count;
  2984. }
  2985. break;
  2986. case BATT_HIGH_CURRENT_USB:
  2987. if (sscanf(buf, "%d\n", &x) == 1) {
  2988. union power_supply_propval value;
  2989. battery->is_hc_usb = x ? true : false;
  2990. value.intval = battery->is_hc_usb;
  2991. psy_do_property(battery->pdata->charger_name, set,
  2992. POWER_SUPPLY_PROP_USB_HC, value);
  2993. pr_info("%s: is_hc_usb (%d)\n", __func__, battery->is_hc_usb);
  2994. ret = count;
  2995. }
  2996. break;
  2997. #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
  2998. case BATT_TEST_CHARGE_CURRENT:
  2999. if (sscanf(buf, "%d\n", &x) == 1) {
  3000. if (x >= 0 && x <= 2000) {
  3001. union power_supply_propval value;
  3002. dev_err(battery->dev,
  3003. "%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__, x);
  3004. battery->pdata->charging_current[
  3005. POWER_SUPPLY_TYPE_USB].input_current_limit = x;
  3006. battery->pdata->charging_current[
  3007. POWER_SUPPLY_TYPE_USB].fast_charging_current = x;
  3008. if (x > 500) {
  3009. battery->eng_not_full_status = true;
  3010. battery->pdata->temp_check_type =
  3011. SEC_BATTERY_TEMP_CHECK_NONE;
  3012. battery->pdata->charging_total_time =
  3013. 10000 * 60 * 60;
  3014. }
  3015. if (battery->cable_type == POWER_SUPPLY_TYPE_USB) {
  3016. value.intval = x;
  3017. #if defined(CONFIG_TMM_CHG_CTRL)
  3018. if(tuner_running_status==TUNER_IS_ON) {
  3019. dev_dbg(battery->dev,
  3020. "%s: tmm tuner is on!\n", __func__);
  3021. if(value.intval > TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE) {
  3022. value.intval = TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE;
  3023. }
  3024. }
  3025. #endif
  3026. psy_do_property(battery->pdata->charger_name, set,
  3027. POWER_SUPPLY_PROP_CURRENT_NOW,
  3028. value);
  3029. }
  3030. }
  3031. ret = count;
  3032. }
  3033. break;
  3034. #endif
  3035. case BATT_STABILITY_TEST:
  3036. if (sscanf(buf, "%d\n", &x) == 1) {
  3037. dev_err(battery->dev,
  3038. "%s: BATT_STABILITY_TEST(%d)\n", __func__, x);
  3039. if (x) {
  3040. battery->stability_test = true;
  3041. battery->eng_not_full_status = true;
  3042. }
  3043. else {
  3044. battery->stability_test = false;
  3045. battery->eng_not_full_status = false;
  3046. }
  3047. }
  3048. case BATT_INBAT_VOLTAGE:
  3049. break;
  3050. #if !defined(CONFIG_DISABLE_SAVE_CAPACITY_MAX)
  3051. case BATT_CAPACITY_MAX:
  3052. if (sscanf(buf, "%d\n", &x) == 1 && !fg_reset) {
  3053. union power_supply_propval value;
  3054. dev_err(battery->dev,
  3055. "%s: BATT_CAPACITY_MAX(%d)\n", __func__, x);
  3056. if (x > 800 && x < 1200) {
  3057. value.intval = x;
  3058. psy_do_property(battery->pdata->fuelgauge_name, set,
  3059. POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, value);
  3060. ret = count;
  3061. psy_do_property(battery->pdata->fuelgauge_name, get,
  3062. POWER_SUPPLY_PROP_CAPACITY, value);
  3063. battery->capacity = value.intval;
  3064. }
  3065. }
  3066. break;
  3067. #endif
  3068. default:
  3069. ret = -EINVAL;
  3070. }
  3071. return ret;
  3072. }
  3073. static int sec_bat_create_attrs(struct device *dev)
  3074. {
  3075. int i, rc;
  3076. for (i = 0; i < ARRAY_SIZE(sec_battery_attrs); i++) {
  3077. rc = device_create_file(dev, &sec_battery_attrs[i]);
  3078. if (rc)
  3079. goto create_attrs_failed;
  3080. }
  3081. goto create_attrs_succeed;
  3082. create_attrs_failed:
  3083. while (i--)
  3084. device_remove_file(dev, &sec_battery_attrs[i]);
  3085. create_attrs_succeed:
  3086. return rc;
  3087. }
  3088. static int sec_bat_set_property(struct power_supply *psy,
  3089. enum power_supply_property psp,
  3090. const union power_supply_propval *val)
  3091. {
  3092. struct sec_battery_info *battery =
  3093. container_of(psy, struct sec_battery_info, psy_bat);
  3094. int current_cable_type;
  3095. int full_check_type;
  3096. #if defined(CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK)
  3097. union power_supply_propval value;
  3098. #endif
  3099. dev_dbg(battery->dev,
  3100. "%s: (%d,%d)\n", __func__, psp, val->intval);
  3101. switch (psp) {
  3102. case POWER_SUPPLY_PROP_STATUS:
  3103. if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
  3104. full_check_type = battery->pdata->full_check_type;
  3105. else
  3106. full_check_type = battery->pdata->full_check_type_2nd;
  3107. if ((full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT) &&
  3108. (val->intval == POWER_SUPPLY_STATUS_FULL))
  3109. sec_bat_do_fullcharged(battery);
  3110. battery->status = val->intval;
  3111. break;
  3112. case POWER_SUPPLY_PROP_HEALTH:
  3113. sec_bat_ovp_uvlo_result(battery, val->intval);
  3114. break;
  3115. case POWER_SUPPLY_PROP_ONLINE:
  3116. current_cable_type = val->intval;
  3117. #if defined(CONFIG_EXTCON)
  3118. if ((battery->muic_cable_type != EXTCON_SMARTDOCK_TA)
  3119. #if defined(CONFIG_MUIC_MAX77804K_SUPPORT_LANHUB)
  3120. && (battery->muic_cable_type != EXTCON_LANHUB_TA)
  3121. #endif
  3122. && ((current_cable_type == POWER_SUPPLY_TYPE_SMART_OTG) ||
  3123. (current_cable_type == POWER_SUPPLY_TYPE_SMART_NOTG)))
  3124. break;
  3125. #endif
  3126. #if defined(CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK)
  3127. /* if previous cable type is MDOCK_TA & new cable type is SMART_OTG or SMART_NOTG, change the charging current */
  3128. if( battery->cable_type == POWER_SUPPLY_TYPE_MDOCK_TA &&
  3129. (current_cable_type == POWER_SUPPLY_TYPE_SMART_OTG || current_cable_type == POWER_SUPPLY_TYPE_SMART_NOTG)) {
  3130. dev_info(battery->dev, "%s: set charging current for cable type %d\n", __func__, current_cable_type);
  3131. value.intval = current_cable_type;
  3132. psy_do_property(battery->pdata->charger_name, set,
  3133. POWER_SUPPLY_PROP_ONLINE, value);
  3134. break;
  3135. }
  3136. #endif
  3137. if (current_cable_type < 0) {
  3138. dev_info(battery->dev,
  3139. "%s: ignore event(%d)\n",
  3140. __func__, current_cable_type);
  3141. } else {
  3142. battery->wire_status = current_cable_type;
  3143. if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
  3144. && battery->wc_status)
  3145. current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
  3146. }
  3147. dev_info(battery->dev,
  3148. "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
  3149. __func__, current_cable_type, battery->wc_status,
  3150. battery->wire_status);
  3151. /* cable is attached or detached
  3152. * if current_cable_type is minus value,
  3153. * check cable by sec_bat_get_cable_type()
  3154. * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
  3155. * (0 is POWER_SUPPLY_TYPE_UNKNOWN)
  3156. */
  3157. if ((current_cable_type >= 0) &&
  3158. (current_cable_type < SEC_SIZEOF_POWER_SUPPLY_TYPE) &&
  3159. (battery->pdata->cable_source_type &
  3160. SEC_BATTERY_CABLE_SOURCE_EXTERNAL ||
  3161. battery->pdata->cable_source_type &
  3162. SEC_BATTERY_CABLE_SOURCE_EXTENDED)) {
  3163. __pm_stay_awake(&battery->cable_ws);
  3164. queue_delayed_work(battery->monitor_wqueue,
  3165. &battery->cable_work,0);
  3166. } else {
  3167. if (sec_bat_get_cable_type(battery,
  3168. battery->pdata->cable_source_type)) {
  3169. __pm_stay_awake(&battery->cable_ws);
  3170. queue_delayed_work(battery->monitor_wqueue,
  3171. &battery->cable_work,0);
  3172. }
  3173. }
  3174. break;
  3175. case POWER_SUPPLY_PROP_CAPACITY:
  3176. battery->capacity = val->intval;
  3177. power_supply_changed(&battery->psy_bat);
  3178. break;
  3179. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  3180. /* If JIG is attached, the voltage is set as 1079 */
  3181. pr_info("%s : set to the battery history : (%d)\n",__func__, val->intval);
  3182. if(val->intval == 1079)
  3183. {
  3184. battery->voltage_now = 1079;
  3185. battery->voltage_avg = 1079;
  3186. power_supply_changed(&battery->psy_bat);
  3187. }
  3188. break;
  3189. #if defined(CONFIG_TMM_CHG_CTRL)
  3190. case POWER_SUPPLY_PROP_CURRENT_NOW:
  3191. if((val->intval)==TUNER_SWITCHED_ON_SIGNAL) {
  3192. dev_dbg(battery->dev,
  3193. "%s: tmm switched on!\n", __func__);
  3194. if((battery->cable_type != POWER_SUPPLY_TYPE_UNKNOWN) &&
  3195. (battery->cable_type != POWER_SUPPLY_TYPE_BATTERY)) {
  3196. union power_supply_propval value_Check_CurrentNow;
  3197. int input_curr_limit;
  3198. psy_do_property(battery->pdata->charger_name, get,
  3199. POWER_SUPPLY_PROP_CURRENT_NOW, value_Check_CurrentNow);
  3200. input_curr_limit = value_Check_CurrentNow.intval;
  3201. if(input_curr_limit > TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE) {
  3202. union power_supply_propval value;
  3203. value.intval = TMM_CHG_CTRL_INPUT_LIMIT_CURRENT_VALUE;
  3204. psy_do_property(battery->pdata->charger_name, set,
  3205. POWER_SUPPLY_PROP_CURRENT_NOW, value);
  3206. }
  3207. }
  3208. tuner_running_status=TUNER_IS_ON;
  3209. }else if((val->intval)==TUNER_SWITCHED_OFF_SIGNAL) {
  3210. union power_supply_propval value;
  3211. dev_dbg(battery->dev,
  3212. "%s: tmm switched off!\n", __func__);
  3213. value.intval = battery->cable_type;
  3214. psy_do_property(battery->pdata->charger_name, set,
  3215. POWER_SUPPLY_PROP_ONLINE, value);
  3216. tuner_running_status=TUNER_IS_OFF;
  3217. }
  3218. break;
  3219. #endif
  3220. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  3221. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3222. break;
  3223. case POWER_SUPPLY_PROP_PRESENT:
  3224. battery->present = val->intval;
  3225. __pm_stay_awake(&battery->monitor_ws);
  3226. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3227. break;
  3228. default:
  3229. return -EINVAL;
  3230. }
  3231. return 0;
  3232. }
  3233. static int sec_bat_get_property(struct power_supply *psy,
  3234. enum power_supply_property psp,
  3235. union power_supply_propval *val)
  3236. {
  3237. struct sec_battery_info *battery =
  3238. container_of(psy, struct sec_battery_info, psy_bat);
  3239. union power_supply_propval value;
  3240. switch (psp) {
  3241. case POWER_SUPPLY_PROP_STATUS:
  3242. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  3243. (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
  3244. val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
  3245. } else {
  3246. if ((battery->pdata->cable_check_type &
  3247. SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE) &&
  3248. !sec_bat_is_lpm(battery)) {
  3249. switch (battery->cable_type) {
  3250. case POWER_SUPPLY_TYPE_USB:
  3251. case POWER_SUPPLY_TYPE_USB_DCP:
  3252. case POWER_SUPPLY_TYPE_USB_CDP:
  3253. case POWER_SUPPLY_TYPE_USB_ACA:
  3254. #if defined(CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK)
  3255. case POWER_SUPPLY_TYPE_MDOCK_USB:
  3256. #endif
  3257. val->intval =
  3258. POWER_SUPPLY_STATUS_DISCHARGING;
  3259. return 0;
  3260. }
  3261. }
  3262. #if defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAKOR) || defined(CONFIG_MACH_V2) || \
  3263. defined(CONFIG_SEC_MILLET_PROJECT) || defined(CONFIG_SEC_MATISSE_PROJECT) || \
  3264. defined(CONFIG_AFC_CHARGER_MODE) || defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLIMT_VZW)|| defined(CONFIG_SEC_KLIMT_PROJECT) || defined(CONFIG_SEC_DEGAS_PROJECT)
  3265. if (battery->status == POWER_SUPPLY_STATUS_FULL &&
  3266. battery->capacity != 100) {
  3267. val->intval = POWER_SUPPLY_STATUS_CHARGING;
  3268. pr_info("%s: forced full-charged sequence progressing\n", __func__);
  3269. } else
  3270. #endif
  3271. val->intval = battery->status;
  3272. }
  3273. break;
  3274. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  3275. if (battery->cable_type == POWER_SUPPLY_TYPE_BATTERY ||
  3276. battery->cable_type == POWER_SUPPLY_TYPE_MHL_USB_100) {
  3277. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  3278. } else {
  3279. psy_do_property(battery->pdata->charger_name, get,
  3280. POWER_SUPPLY_PROP_CHARGE_TYPE, value);
  3281. if (value.intval == POWER_SUPPLY_CHARGE_TYPE_UNKNOWN)
  3282. /* if error in CHARGE_TYPE of charger
  3283. * set CHARGE_TYPE as NONE
  3284. */
  3285. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  3286. else
  3287. val->intval = value.intval;
  3288. }
  3289. break;
  3290. case POWER_SUPPLY_PROP_HEALTH:
  3291. val->intval = battery->health;
  3292. break;
  3293. case POWER_SUPPLY_PROP_PRESENT:
  3294. val->intval = battery->present;
  3295. break;
  3296. case POWER_SUPPLY_PROP_ONLINE:
  3297. if (battery->pdata->use_wireless_to_pogo &&
  3298. (battery->cable_type == POWER_SUPPLY_TYPE_WIRELESS))
  3299. val->intval = POWER_SUPPLY_TYPE_POGODOCK;
  3300. else
  3301. val->intval = battery->cable_type;
  3302. break;
  3303. case POWER_SUPPLY_PROP_TECHNOLOGY:
  3304. val->intval = battery->pdata->technology;
  3305. break;
  3306. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  3307. #ifdef CONFIG_SEC_FACTORY
  3308. psy_do_property(battery->pdata->fuelgauge_name, get,
  3309. POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
  3310. battery->voltage_now = value.intval;
  3311. dev_err(battery->dev,
  3312. "%s: voltage now(%d)\n", __func__, battery->voltage_now);
  3313. #endif
  3314. /* voltage value should be in uV */
  3315. val->intval = battery->voltage_now * 1000;
  3316. break;
  3317. case POWER_SUPPLY_PROP_VOLTAGE_AVG:
  3318. #ifdef CONFIG_SEC_FACTORY
  3319. value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
  3320. psy_do_property(battery->pdata->fuelgauge_name, get,
  3321. POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
  3322. battery->voltage_avg = value.intval;
  3323. dev_err(battery->dev,
  3324. "%s: voltage avg(%d)\n", __func__, battery->voltage_avg);
  3325. #endif
  3326. /* voltage value should be in uV */
  3327. val->intval = battery->voltage_avg * 1000;
  3328. break;
  3329. case POWER_SUPPLY_PROP_CURRENT_NOW:
  3330. val->intval = battery->current_now;
  3331. break;
  3332. case POWER_SUPPLY_PROP_CURRENT_AVG:
  3333. val->intval = battery->current_avg;
  3334. break;
  3335. /* charging mode (differ from power supply) */
  3336. case POWER_SUPPLY_PROP_CHARGE_NOW:
  3337. val->intval = battery->charging_mode;
  3338. break;
  3339. case POWER_SUPPLY_PROP_CAPACITY:
  3340. #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
  3341. if (battery->status == POWER_SUPPLY_STATUS_FULL) {
  3342. if(battery->eng_not_full_status)
  3343. val->intval = battery->capacity;
  3344. else
  3345. val->intval = 100;
  3346. } else {
  3347. val->intval = battery->capacity;
  3348. }
  3349. #else
  3350. #if defined(CONFIG_MACH_VIENNAEUR) || defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAKOR) || defined(CONFIG_MACH_V2) || \
  3351. defined(CONFIG_SEC_MILLET_PROJECT) || defined(CONFIG_SEC_MATISSE_PROJECT) || \
  3352. defined(CONFIG_AFC_CHARGER_MODE) || defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLIMT_VZW)|| defined(CONFIG_SEC_KLIMT_PROJECT) || defined(CONFIG_SEC_DEGAS_PROJECT)
  3353. val->intval = battery->capacity;
  3354. #else
  3355. /* In full-charged status, SOC is always 100% */
  3356. if (battery->status == POWER_SUPPLY_STATUS_FULL)
  3357. val->intval = 100;
  3358. else
  3359. val->intval = battery->capacity;
  3360. #endif
  3361. #endif
  3362. break;
  3363. case POWER_SUPPLY_PROP_TEMP:
  3364. val->intval = battery->temperature;
  3365. break;
  3366. case POWER_SUPPLY_PROP_TEMP_AMBIENT:
  3367. val->intval = battery->temper_amb;
  3368. break;
  3369. #if defined(CONFIG_QPNP_CHARGER)
  3370. case POWER_SUPPLY_PROP_BATFET:
  3371. psy_do_property(battery->pdata->charger_name, get,
  3372. POWER_SUPPLY_PROP_BATFET, value);
  3373. val->intval = value.intval;
  3374. break;
  3375. #endif
  3376. default:
  3377. return -EINVAL;
  3378. }
  3379. return 0;
  3380. }
  3381. static int sec_usb_get_property(struct power_supply *psy,
  3382. enum power_supply_property psp,
  3383. union power_supply_propval *val)
  3384. {
  3385. struct sec_battery_info *battery =
  3386. container_of(psy, struct sec_battery_info, psy_usb);
  3387. #if defined(CONFIG_QPNP_CHARGER)
  3388. union power_supply_propval value;
  3389. #endif
  3390. switch (psp) {
  3391. case POWER_SUPPLY_PROP_ONLINE:
  3392. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  3393. (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
  3394. val->intval = 0;
  3395. return 0;
  3396. }
  3397. /* Set enable=1 only if the USB charger is connected */
  3398. switch (battery->wire_status) {
  3399. case POWER_SUPPLY_TYPE_USB:
  3400. case POWER_SUPPLY_TYPE_USB_DCP:
  3401. case POWER_SUPPLY_TYPE_USB_CDP:
  3402. case POWER_SUPPLY_TYPE_USB_ACA:
  3403. case POWER_SUPPLY_TYPE_MHL_USB:
  3404. case POWER_SUPPLY_TYPE_MHL_USB_100:
  3405. #if defined(CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK)
  3406. case POWER_SUPPLY_TYPE_MDOCK_USB:
  3407. #endif
  3408. val->intval = 1;
  3409. break;
  3410. default:
  3411. val->intval = 0;
  3412. break;
  3413. }
  3414. if (battery->slate_mode)
  3415. val->intval = 0;
  3416. break;
  3417. #if defined(CONFIG_QPNP_CHARGER)
  3418. case POWER_SUPPLY_PROP_PRESENT:
  3419. val->intval = battery->cable_type == POWER_SUPPLY_TYPE_BATTERY ? 0 : 1;
  3420. break;
  3421. case POWER_SUPPLY_PROP_CURRENT_MAX:
  3422. psy_do_property(battery->pdata->charger_name, get,
  3423. POWER_SUPPLY_PROP_CURRENT_MAX, value);
  3424. val->intval = value.intval * 1000;
  3425. break;
  3426. #endif
  3427. default:
  3428. return -EINVAL;
  3429. }
  3430. return 0;
  3431. }
  3432. static int sec_ac_get_property(struct power_supply *psy,
  3433. enum power_supply_property psp,
  3434. union power_supply_propval *val)
  3435. {
  3436. struct sec_battery_info *battery =
  3437. container_of(psy, struct sec_battery_info, psy_ac);
  3438. if (psp != POWER_SUPPLY_PROP_ONLINE)
  3439. return -EINVAL;
  3440. if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
  3441. (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
  3442. val->intval = 0;
  3443. return 0;
  3444. }
  3445. /* Set enable=1 only if the AC charger is connected */
  3446. switch (battery->cable_type) {
  3447. case POWER_SUPPLY_TYPE_MAINS:
  3448. case POWER_SUPPLY_TYPE_MISC:
  3449. case POWER_SUPPLY_TYPE_CARDOCK:
  3450. case POWER_SUPPLY_TYPE_UARTOFF:
  3451. case POWER_SUPPLY_TYPE_LAN_HUB:
  3452. case POWER_SUPPLY_TYPE_UNKNOWN:
  3453. case POWER_SUPPLY_TYPE_MHL_500:
  3454. case POWER_SUPPLY_TYPE_MHL_900:
  3455. case POWER_SUPPLY_TYPE_MHL_1500:
  3456. case POWER_SUPPLY_TYPE_MHL_2000:
  3457. case POWER_SUPPLY_TYPE_SMART_OTG:
  3458. case POWER_SUPPLY_TYPE_SMART_NOTG:
  3459. case POWER_SUPPLY_TYPE_HV_PREPARE_MAINS:
  3460. case POWER_SUPPLY_TYPE_HV_ERR:
  3461. case POWER_SUPPLY_TYPE_HV_UNKNOWN:
  3462. case POWER_SUPPLY_TYPE_HV_MAINS:
  3463. #if defined(CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK)
  3464. case POWER_SUPPLY_TYPE_MDOCK_TA:
  3465. #endif
  3466. val->intval = 1;
  3467. break;
  3468. default:
  3469. val->intval = 0;
  3470. break;
  3471. }
  3472. return 0;
  3473. }
  3474. static int sec_wireless_get_property(struct power_supply *psy,
  3475. enum power_supply_property psp,
  3476. union power_supply_propval *val)
  3477. {
  3478. struct sec_battery_info *battery =
  3479. container_of(psy, struct sec_battery_info, psy_wireless);
  3480. if (psp != POWER_SUPPLY_PROP_ONLINE)
  3481. return -EINVAL;
  3482. if ((battery->wc_status) && !battery->pdata->use_wireless_to_pogo)
  3483. val->intval = 1;
  3484. else
  3485. val->intval = 0;
  3486. return 0;
  3487. }
  3488. static int sec_wireless_set_property(struct power_supply *psy,
  3489. enum power_supply_property psp,
  3490. const union power_supply_propval *val)
  3491. {
  3492. struct sec_battery_info *battery =
  3493. container_of(psy, struct sec_battery_info, psy_wireless);
  3494. if (psp != POWER_SUPPLY_PROP_ONLINE)
  3495. return -EINVAL;
  3496. battery->wc_status = val->intval;
  3497. __pm_stay_awake(&battery->cable_ws);
  3498. queue_delayed_work(battery->monitor_wqueue,
  3499. &battery->cable_work, 0);
  3500. return 0;
  3501. }
  3502. static int sec_pogo_get_property(struct power_supply *psy,
  3503. enum power_supply_property psp,
  3504. union power_supply_propval *val)
  3505. {
  3506. struct sec_battery_info *battery =
  3507. container_of(psy, struct sec_battery_info, psy_pogo);
  3508. if (psp != POWER_SUPPLY_PROP_ONLINE)
  3509. return -EINVAL;
  3510. dev_info(battery->dev,
  3511. "%s: pogo charger is online (%d)\n", __func__, battery->wc_status);
  3512. if ((battery->wc_status) && battery->pdata->use_wireless_to_pogo)
  3513. val->intval = 1;
  3514. else
  3515. val->intval = 0;
  3516. return 0;
  3517. }
  3518. static int sec_ps_set_property(struct power_supply *psy,
  3519. enum power_supply_property psp,
  3520. const union power_supply_propval *val)
  3521. {
  3522. struct sec_battery_info *battery =
  3523. container_of(psy, struct sec_battery_info, psy_ps);
  3524. union power_supply_propval value;
  3525. switch (psp) {
  3526. case POWER_SUPPLY_PROP_STATUS:
  3527. if (val->intval == 0) {
  3528. if (battery->ps_enable == true) {
  3529. battery->ps_enable = val->intval;
  3530. dev_info(battery->dev,
  3531. "%s: power sharing cable set (%d)\n", __func__, battery->ps_enable);
  3532. value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
  3533. psy_do_property(battery->pdata->charger_name, set,
  3534. POWER_SUPPLY_PROP_ONLINE, value);
  3535. }
  3536. } else if ((val->intval == 1) && (battery->ps_status == true)) {
  3537. battery->ps_enable = val->intval;
  3538. dev_info(battery->dev,
  3539. "%s: power sharing cable set (%d)\n", __func__, battery->ps_enable);
  3540. value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
  3541. psy_do_property(battery->pdata->charger_name, set,
  3542. POWER_SUPPLY_PROP_ONLINE, value);
  3543. } else {
  3544. dev_err(battery->dev,
  3545. "%s: invalid setting (%d) ps_status (%d)\n",
  3546. __func__, val->intval, battery->ps_status);
  3547. }
  3548. break;
  3549. case POWER_SUPPLY_PROP_ONLINE:
  3550. if (val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
  3551. battery->ps_status = true;
  3552. battery->ps_enable = true;
  3553. battery->ps_changed = true;
  3554. dev_info(battery->dev,
  3555. "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
  3556. __pm_stay_awake(&battery->monitor_ws);
  3557. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3558. } else {
  3559. battery->ps_status = false;
  3560. dev_info(battery->dev,
  3561. "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
  3562. __pm_stay_awake(&battery->monitor_ws);
  3563. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3564. }
  3565. break;
  3566. default:
  3567. return -EINVAL;
  3568. }
  3569. return 0;
  3570. }
  3571. static int sec_ps_get_property(struct power_supply *psy,
  3572. enum power_supply_property psp,
  3573. union power_supply_propval *val)
  3574. {
  3575. struct sec_battery_info *battery =
  3576. container_of(psy, struct sec_battery_info, psy_ps);
  3577. union power_supply_propval value;
  3578. switch (psp) {
  3579. case POWER_SUPPLY_PROP_STATUS:
  3580. if (battery->ps_enable)
  3581. val->intval = 1;
  3582. else
  3583. val->intval = 0;
  3584. break;
  3585. case POWER_SUPPLY_PROP_ONLINE:
  3586. if (battery->ps_status) {
  3587. if ((battery->ps_enable == true) && (battery->ps_changed == true)) {
  3588. battery->ps_changed = false;
  3589. value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
  3590. psy_do_property(battery->pdata->charger_name, set,
  3591. POWER_SUPPLY_PROP_ONLINE, value);
  3592. }
  3593. val->intval = 1;
  3594. } else {
  3595. if (battery->ps_enable == true) {
  3596. battery->ps_enable = false;
  3597. dev_info(battery->dev,
  3598. "%s: power sharing cable disconnected! ps disable (%d)\n",
  3599. __func__, battery->ps_enable);
  3600. value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
  3601. psy_do_property(battery->pdata->charger_name, set,
  3602. POWER_SUPPLY_PROP_ONLINE, value);
  3603. }
  3604. val->intval = 0;
  3605. }
  3606. break;
  3607. default:
  3608. return -EINVAL;
  3609. }
  3610. return 0;
  3611. }
  3612. static irqreturn_t sec_bat_irq_thread(int irq, void *irq_data)
  3613. {
  3614. struct sec_battery_info *battery = irq_data;
  3615. if ((battery->pdata->battery_check_type == SEC_BATTERY_CHECK_INT)
  3616. || (battery->pdata->battery_check_type == SEC_BATTERY_CHECK_FUELGAUGE)
  3617. || (battery->pdata->battery_check_type == SEC_BATTERY_CHECK_ADC)) {
  3618. if (battery->pdata->check_battery_callback)
  3619. battery->present = battery->pdata->check_battery_callback();
  3620. __pm_stay_awake(&battery->monitor_ws);
  3621. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3622. }
  3623. return IRQ_HANDLED;
  3624. }
  3625. static irqreturn_t sec_ta_irq_thread(int irq, void *irq_data)
  3626. {
  3627. struct sec_battery_info *battery = irq_data;
  3628. if (battery->pdata->cable_source_type & SEC_BATTERY_CABLE_SOURCE_CALLBACK) {
  3629. __pm_stay_awake(&battery->vbus_detect_ws);
  3630. queue_delayed_work(battery->monitor_wqueue,
  3631. &battery->vbus_detect_work, msecs_to_jiffies(750));
  3632. }
  3633. return IRQ_HANDLED;
  3634. }
  3635. #if defined(CONFIG_EXTCON)
  3636. static int sec_bat_cable_check(struct sec_battery_info *battery,
  3637. enum extcon_cable_name attached_dev)
  3638. {
  3639. int current_cable_type = -1;
  3640. switch (attached_dev)
  3641. {
  3642. case EXTCON_JIG_UARTOFF:
  3643. case EXTCON_JIG_UARTON:
  3644. case EXTCON_CARDOCK:
  3645. case EXTCON_DESKDOCK:
  3646. case EXTCON_SMARTDOCK:
  3647. current_cable_type = POWER_SUPPLY_TYPE_BATTERY;
  3648. break;
  3649. case EXTCON_USB_HOST:
  3650. current_cable_type = POWER_SUPPLY_TYPE_OTG;
  3651. break;
  3652. case EXTCON_USB:
  3653. case EXTCON_JIG_USBOFF:
  3654. case EXTCON_JIG_USBON:
  3655. case EXTCON_SMARTDOCK_USB:
  3656. current_cable_type = POWER_SUPPLY_TYPE_USB;
  3657. break;
  3658. case EXTCON_JIG_UARTOFF_VB:
  3659. current_cable_type = POWER_SUPPLY_TYPE_UARTOFF;
  3660. break;
  3661. case EXTCON_TA:
  3662. case EXTCON_CARDOCK_VB:
  3663. case EXTCON_DESKDOCK_VB:
  3664. case EXTCON_SMARTDOCK_TA:
  3665. #if defined(CONFIG_MUIC_MAX77804K_SUPPORT_LANHUB)
  3666. case EXTCON_LANHUB_TA:
  3667. #endif
  3668. current_cable_type = POWER_SUPPLY_TYPE_MAINS;
  3669. break;
  3670. case EXTCON_CHARGE_DOWNSTREAM:
  3671. current_cable_type = POWER_SUPPLY_TYPE_USB_CDP;
  3672. break;
  3673. case EXTCON_INCOMPATIBLE:
  3674. current_cable_type = POWER_SUPPLY_TYPE_UNKNOWN;
  3675. break;
  3676. case EXTCON_AUDIODOCK:
  3677. current_cable_type = POWER_SUPPLY_TYPE_MISC;
  3678. break;
  3679. case EXTCON_CHARGING_CABLE:
  3680. current_cable_type = POWER_SUPPLY_TYPE_POWER_SHARING;
  3681. break;
  3682. #if defined(CONFIG_MUIC_SUPPORT_HV_CHARGER)
  3683. case EXTCON_HV_PREPARE:
  3684. current_cable_type = POWER_SUPPLY_TYPE_HV_PREPARE_MAINS;
  3685. break;
  3686. case EXTCON_HV_TA_ERR:
  3687. current_cable_type = POWER_SUPPLY_TYPE_HV_ERR;
  3688. break;
  3689. case EXTCON_HV_TA_1A:
  3690. current_cable_type = POWER_SUPPLY_TYPE_HV_UNKNOWN;
  3691. break;
  3692. case EXTCON_HV_TA:
  3693. current_cable_type = POWER_SUPPLY_TYPE_HV_MAINS;
  3694. break;
  3695. #endif
  3696. default:
  3697. pr_err("%s: invalid type for charger:%d\n",
  3698. __func__, attached_dev);
  3699. }
  3700. return current_cable_type;
  3701. }
  3702. static int batt_handle_notification(struct notifier_block *nb,
  3703. unsigned long action, void *data)
  3704. {
  3705. const char *cmd;
  3706. int cable_type;
  3707. struct sec_battery_extcon_cable *obj =
  3708. container_of(nb, struct sec_battery_extcon_cable, batt_nb);
  3709. enum extcon_cable_name attached_dev = obj->cable_index;
  3710. struct sec_battery_info *battery =
  3711. container_of(nb, struct sec_battery_info,
  3712. extcon_cable_list[attached_dev].batt_nb);
  3713. battery->muic_cable_type = attached_dev;
  3714. if (action) {
  3715. cmd = "ATTACH";
  3716. cable_type = sec_bat_cable_check(battery, attached_dev);
  3717. } else {
  3718. cmd = "DETACH";
  3719. cable_type = POWER_SUPPLY_TYPE_BATTERY;
  3720. }
  3721. if (cable_type < 0) {
  3722. dev_info(battery->dev, "%s: ignore event(%d)\n",
  3723. __func__, cable_type);
  3724. } else if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
  3725. battery->ps_status = true;
  3726. battery->ps_enable = true;
  3727. battery->ps_changed = true;
  3728. dev_info(battery->dev,
  3729. "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
  3730. } else if (cable_type == POWER_SUPPLY_TYPE_WIRELESS) {
  3731. battery->wc_status = true;
  3732. } else {
  3733. battery->wire_status = cable_type;
  3734. if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
  3735. && battery->wc_status && !battery->ps_status)
  3736. cable_type = POWER_SUPPLY_TYPE_WIRELESS;
  3737. }
  3738. dev_info(battery->dev,
  3739. "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
  3740. __func__, cable_type, battery->wc_status,
  3741. battery->wire_status);
  3742. if ((cable_type >= 0) &&
  3743. cable_type < SEC_SIZEOF_POWER_SUPPLY_TYPE) {
  3744. if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
  3745. __pm_stay_awake(&battery->monitor_ws);
  3746. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3747. } else if((cable_type == POWER_SUPPLY_TYPE_BATTERY)
  3748. && battery->ps_status) {
  3749. battery->ps_status = false;
  3750. dev_info(battery->dev,
  3751. "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
  3752. __pm_stay_awake(&battery->monitor_ws);
  3753. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3754. } else if(cable_type != battery->cable_type) {
  3755. __pm_stay_awake(&battery->cable_ws);
  3756. queue_delayed_work(battery->monitor_wqueue,
  3757. &battery->cable_work, 0);
  3758. } else {
  3759. dev_info(battery->dev,
  3760. "%s: Cable is Not Changed(%d)\n",
  3761. __func__, battery->cable_type);
  3762. }
  3763. }
  3764. pr_info("%s: CMD=%s, attached_dev=%d\n", __func__, cmd, attached_dev);
  3765. return 0;
  3766. }
  3767. #endif /* CONFIG_EXTCON */
  3768. #ifdef CONFIG_OF
  3769. static int sec_bat_read_u32_index_dt(const struct device_node *np,
  3770. const char *propname,
  3771. u32 index, u32 *out_value)
  3772. {
  3773. struct property *prop = of_find_property(np, propname, NULL);
  3774. u32 len = (index + 1) * sizeof(*out_value);
  3775. if (!prop)
  3776. return (-EINVAL);
  3777. if (!prop->value)
  3778. return (-ENODATA);
  3779. if (len > prop->length)
  3780. return (-EOVERFLOW);
  3781. *out_value = be32_to_cpup(((__be32 *)prop->value) + index);
  3782. return 0;
  3783. }
  3784. static int sec_bat_parse_dt(struct device *dev,
  3785. struct sec_battery_info *battery)
  3786. {
  3787. struct device_node *np = dev->of_node;
  3788. sec_battery_platform_data_t *pdata = battery->pdata;
  3789. int ret, len;
  3790. unsigned int i;
  3791. const u32 *p;
  3792. if (!np) {
  3793. pr_info("%s: np NULL\n", __func__);
  3794. return 1;
  3795. }
  3796. ret = of_property_read_string(np,
  3797. "battery,vendor", (char const **)&pdata->vendor);
  3798. if (ret)
  3799. pr_info("%s: Vendor is Empty\n", __func__);
  3800. #if defined(CONFIG_PM8926_BATTERY_CHECK_INTERRUPT)
  3801. ret = of_property_read_string(np,
  3802. "battery,pmic_name", (char const **)&pdata->pmic_name);
  3803. if (ret)
  3804. pr_info("%s: Vendor is Empty\n", __func__);
  3805. #endif
  3806. ret = of_property_read_string(np,
  3807. "battery,charger_name", (char const **)&pdata->charger_name);
  3808. if (ret)
  3809. pr_info("%s: Vendor is Empty\n", __func__);
  3810. ret = of_property_read_string(np,
  3811. "battery,fuelgauge_name", (char const **)&pdata->fuelgauge_name);
  3812. if (ret)
  3813. pr_info("%s: Vendor is Empty\n", __func__);
  3814. ret = of_property_read_string(np,
  3815. "battery,chip_vendor", (char const **)&pdata->chip_vendor);
  3816. if (ret)
  3817. pr_info("%s: Vendor is Empty\n", __func__);
  3818. ret = of_property_read_u32(np, "battery,technology",
  3819. &pdata->technology);
  3820. if (ret)
  3821. pr_info("%s: technology is Empty\n", __func__);
  3822. ret = of_get_named_gpio(np, "battery,bat_int", 0);
  3823. if (ret > 0) {
  3824. pdata->bat_irq_gpio = ret;
  3825. pdata->bat_irq = gpio_to_irq(ret);
  3826. pr_info("%s reading bat_int_gpio = %d\n", __func__, ret);
  3827. } else {
  3828. pr_info("%s reading bat_int_gpio is empty\n", __func__);
  3829. }
  3830. ret = of_property_read_u32(np, "battery,bat_irq_attr",
  3831. (unsigned int *)&pdata->bat_irq_attr);
  3832. if (ret)
  3833. pr_info("%s: bat_irq_attr is Empty\n", __func__);
  3834. ret = of_get_named_gpio(np, "battery,ta_int", 0);
  3835. if (ret > 0) {
  3836. pdata->ta_irq_gpio = ret;
  3837. pdata->ta_irq = gpio_to_irq(ret);
  3838. pr_info("%s reading ta_int_gpio = %d\n", __func__, ret);
  3839. }
  3840. ret = of_property_read_u32(np, "battery,ta_irq_attr",
  3841. (unsigned int *)&pdata->ta_irq_attr);
  3842. if (ret)
  3843. pr_info("%s: ta_irq_attr is Empty\n", __func__);
  3844. p = of_get_property(np, "battery,polling_time", &len);
  3845. len = len / sizeof(u32);
  3846. pdata->polling_time = kzalloc(sizeof(*pdata->polling_time) * len, GFP_KERNEL);
  3847. ret = of_property_read_u32_array(np, "battery,polling_time",
  3848. pdata->polling_time, len);
  3849. if (ret)
  3850. pr_info("%s: polling_time is Empty\n", __func__);
  3851. ret = of_property_read_u32(np, "battery,adc_check_count",
  3852. &pdata->adc_check_count);
  3853. if (ret)
  3854. pr_info("%s: adc_check_count is Empty\n", __func__);
  3855. ret = of_property_read_u32(np, "battery,temp_adc_type",
  3856. &pdata->temp_adc_type);
  3857. if (ret)
  3858. pr_info("%s: temp_adc_type is Empty\n", __func__);
  3859. ret = of_property_read_u32(np, "battery,cable_check_type",
  3860. &pdata->cable_check_type);
  3861. #if defined(CONFIG_CHARGING_VZWCONCEPT)
  3862. #if !defined(CONFIG_MACH_VIENNAVZW) && !defined(CONFIG_MACH_LT03_VZW)
  3863. pdata->cable_check_type &= ~SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE;
  3864. #endif
  3865. pdata->cable_check_type |= SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE;
  3866. #endif
  3867. if (ret)
  3868. pr_info("%s: cable_check_type is Empty\n", __func__);
  3869. ret = of_property_read_u32(np, "battery,cable_source_type",
  3870. &pdata->cable_source_type);
  3871. if (ret)
  3872. pr_info("%s: cable_source_type is Empty\n", __func__);
  3873. pdata->event_check = of_property_read_bool(np,
  3874. "battery,event_check");
  3875. pdata->chg_temp_check = of_property_read_bool(np,
  3876. "battery,chg_temp_check");
  3877. pr_info("%s: chg_temp_check: %d \n", __func__, pdata->chg_temp_check);
  3878. if (pdata->chg_temp_check) {
  3879. ret = of_property_read_u32(np, "battery,chg_high_temp",
  3880. &pdata->chg_high_temp);
  3881. if (ret)
  3882. pr_info("%s: chg_high_temp is Empty\n", __func__);
  3883. ret = of_property_read_u32(np, "battery,chg_high_temp_recovery",
  3884. &pdata->chg_high_temp_recovery);
  3885. if (ret)
  3886. pr_info("%s: chg_high_temp_recovery is Empty\n", __func__);
  3887. ret = of_property_read_u32(np, "battery,chg_charging_limit_current",
  3888. &pdata->chg_charging_limit_current);
  3889. if (ret)
  3890. pr_info("%s: chg_charging_limit_current is Empty\n", __func__);
  3891. }
  3892. ret = of_property_read_u32(np, "battery,event_waiting_time",
  3893. &pdata->event_waiting_time);
  3894. if (ret)
  3895. pr_info("%s: event_waiting_time is Empty\n", __func__);
  3896. ret = of_property_read_u32(np, "battery,polling_type",
  3897. &pdata->polling_type);
  3898. if (ret)
  3899. pr_info("%s: polling_type is Empty\n", __func__);
  3900. ret = of_property_read_u32(np, "battery,monitor_initial_count",
  3901. &pdata->monitor_initial_count);
  3902. if (ret)
  3903. pr_info("%s: monitor_initial_count is Empty\n", __func__);
  3904. pdata->use_wireless_to_pogo = of_property_read_bool(np,
  3905. "battery,use_wireless_to_pogo");
  3906. ret = of_property_read_u32(np, "battery,battery_check_type",
  3907. &pdata->battery_check_type);
  3908. if (ret)
  3909. pr_info("%s: battery_check_type is Empty\n", __func__);
  3910. ret = of_property_read_u32(np, "battery,check_count",
  3911. &pdata->check_count);
  3912. if (ret)
  3913. pr_info("%s: check_count is Empty\n", __func__);
  3914. ret = of_property_read_u32(np, "battery,check_adc_max",
  3915. &pdata->check_adc_max);
  3916. if (ret)
  3917. pr_info("%s: check_adc_max is Empty\n", __func__);
  3918. ret = of_property_read_u32(np, "battery,check_adc_min",
  3919. &pdata->check_adc_min);
  3920. if (ret)
  3921. pr_info("%s: check_adc_min is Empty\n", __func__);
  3922. ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
  3923. &pdata->ovp_uvlo_check_type);
  3924. if (ret)
  3925. pr_info("%s: ovp_uvlo_check_type is Empty\n", __func__);
  3926. ret = of_property_read_u32(np, "battery,thermal_source",
  3927. &pdata->thermal_source);
  3928. if (ret)
  3929. pr_info("%s: thermal_source is Empty\n", __func__);
  3930. ret = of_property_read_u32(np, "battery,temp_check_type",
  3931. &pdata->temp_check_type);
  3932. if (ret)
  3933. pr_info("%s: temp_check_type is Empty\n", __func__);
  3934. ret = of_property_read_u32(np, "battery,temp_check_count",
  3935. &pdata->temp_check_count);
  3936. if (ret)
  3937. pr_info("%s: temp_check_count is Empty\n", __func__);
  3938. ret = of_property_read_u32(np, "battery,full_check_type",
  3939. &pdata->full_check_type);
  3940. if (ret)
  3941. pr_info("%s: full_check_type is Empty\n", __func__);
  3942. ret = of_property_read_u32(np, "battery,full_check_type_2nd",
  3943. &pdata->full_check_type_2nd);
  3944. if (ret)
  3945. pr_info("%s: full_check_type_2nd is Empty\n", __func__);
  3946. ret = of_property_read_u32(np, "battery,full_check_count",
  3947. &pdata->full_check_count);
  3948. if (ret)
  3949. pr_info("%s: full_check_count is Empty\n", __func__);
  3950. ret = of_property_read_u32(np, "battery,chg_gpio_full_check",
  3951. &pdata->chg_gpio_full_check);
  3952. if (ret)
  3953. pr_info("%s: chg_gpio_full_check is Empty\n", __func__);
  3954. ret = of_property_read_u32(np, "battery,chg_polarity_full_check",
  3955. &pdata->chg_polarity_full_check);
  3956. if (ret)
  3957. pr_info("%s: chg_polarity_full_check is Empty\n", __func__);
  3958. ret = of_property_read_u32(np, "battery,full_condition_type",
  3959. &pdata->full_condition_type);
  3960. if (ret)
  3961. pr_info("%s: full_condition_type is Empty\n", __func__);
  3962. ret = of_property_read_u32(np, "battery,full_condition_soc",
  3963. &pdata->full_condition_soc);
  3964. if (ret)
  3965. pr_info("%s: full_condition_soc is Empty\n", __func__);
  3966. ret = of_property_read_u32(np, "battery,full_condition_vcell",
  3967. &pdata->full_condition_vcell);
  3968. if (ret)
  3969. pr_info("%s: full_condition_vcell is Empty\n", __func__);
  3970. ret = of_property_read_u32(np, "battery,recharge_check_count",
  3971. &pdata->recharge_check_count);
  3972. if (ret)
  3973. pr_info("%s: recharge_check_count is Empty\n", __func__);
  3974. ret = of_property_read_u32(np, "battery,recharge_condition_type",
  3975. &pdata->recharge_condition_type);
  3976. if (ret)
  3977. pr_info("%s: recharge_condition_type is Empty\n", __func__);
  3978. ret = of_property_read_u32(np, "battery,recharge_condition_soc",
  3979. &pdata->recharge_condition_soc);
  3980. if (ret)
  3981. pr_info("%s: recharge_condition_soc is Empty\n", __func__);
  3982. ret = of_property_read_u32(np, "battery,recharge_condition_vcell",
  3983. &pdata->recharge_condition_vcell);
  3984. if (ret)
  3985. pr_info("%s: recharge_condition_vcell is Empty\n", __func__);
  3986. ret = of_property_read_u32(np, "battery,charging_total_time",
  3987. (unsigned int *)&pdata->charging_total_time);
  3988. if (ret)
  3989. pr_info("%s: charging_total_time is Empty\n", __func__);
  3990. ret = of_property_read_u32(np, "battery,recharging_total_time",
  3991. (unsigned int *)&pdata->recharging_total_time);
  3992. if (ret)
  3993. pr_info("%s: recharging_total_time is Empty\n", __func__);
  3994. ret = of_property_read_u32(np, "battery,charging_reset_time",
  3995. (unsigned int *)&pdata->charging_reset_time);
  3996. if (ret)
  3997. pr_info("%s: charging_reset_time is Empty\n", __func__);
  3998. np = of_find_node_by_name(NULL, "charger");
  3999. if (!np) {
  4000. pr_info("%s : np NULL\n", __func__);
  4001. return 1;
  4002. }
  4003. #if defined(CONFIG_BATTERY_SWELLING)
  4004. ret = of_property_read_u32(np, "battery,chg_float_voltage",
  4005. (unsigned int *)&pdata->swelling_normal_float_voltage);
  4006. if (ret)
  4007. pr_info("%s: chg_float_voltage is Empty\n", __func__);
  4008. #endif
  4009. p = of_get_property(np, "battery,input_current_limit", &len);
  4010. len = len / sizeof(u32);
  4011. pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
  4012. GFP_KERNEL);
  4013. for(i = 0; i < len; i++) {
  4014. ret = sec_bat_read_u32_index_dt(np,
  4015. "battery,input_current_limit", i,
  4016. &pdata->charging_current[i].input_current_limit);
  4017. ret = sec_bat_read_u32_index_dt(np,
  4018. "battery,fast_charging_current", i,
  4019. &pdata->charging_current[i].fast_charging_current);
  4020. ret = sec_bat_read_u32_index_dt(np,
  4021. "battery,full_check_current_1st", i,
  4022. &pdata->charging_current[i].full_check_current_1st);
  4023. ret = sec_bat_read_u32_index_dt(np,
  4024. "battery,full_check_current_2nd", i,
  4025. &pdata->charging_current[i].full_check_current_2nd);
  4026. }
  4027. pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
  4028. "cable_source_type : %d, use_wireless_to_pogo : %d, event_waiting_time : %d\n"
  4029. "polling_type : %d, initial_count : %d, check_count : %d\n"
  4030. "check_adc_max : %d, check_adc_min : %d\n"
  4031. "ovp_uvlo_check_type : %d, thermal_source : %d\n"
  4032. "temp_check_type : %d, temp_check_count : %d\n",
  4033. __func__,
  4034. pdata->vendor, pdata->technology,pdata->cable_check_type,
  4035. pdata->cable_source_type, pdata->use_wireless_to_pogo, pdata->event_waiting_time,
  4036. pdata->polling_type, pdata->monitor_initial_count,
  4037. pdata->check_count, pdata->check_adc_max, pdata->check_adc_min,
  4038. pdata->ovp_uvlo_check_type, pdata->thermal_source,
  4039. pdata->temp_check_type, pdata->temp_check_count);
  4040. return ret;
  4041. }
  4042. #endif
  4043. static int __devinit sec_battery_probe(struct platform_device *pdev)
  4044. {
  4045. sec_battery_platform_data_t *pdata = NULL;
  4046. struct sec_battery_info *battery;
  4047. int ret = 0;
  4048. #if !defined(CONFIG_OF) || defined(CONFIG_EXTCON)
  4049. int i;
  4050. #endif
  4051. #if defined(CONFIG_TMM_CHG_CTRL)
  4052. tuner_running_status=TUNER_IS_OFF;
  4053. #endif
  4054. dev_dbg(&pdev->dev,
  4055. "%s: SEC Battery Driver Loading\n", __func__);
  4056. battery = kzalloc(sizeof(*battery), GFP_KERNEL);
  4057. if (!battery)
  4058. return -ENOMEM;
  4059. if (pdev->dev.of_node) {
  4060. pdata = devm_kzalloc(&pdev->dev,
  4061. sizeof(sec_battery_platform_data_t),
  4062. GFP_KERNEL);
  4063. if (!pdata) {
  4064. dev_err(&pdev->dev, "Failed to allocate memory\n");
  4065. ret = -ENOMEM;
  4066. goto err_bat_free;
  4067. }
  4068. battery->pdata = pdata;
  4069. if (sec_bat_parse_dt(&pdev->dev, battery)) {
  4070. dev_err(&pdev->dev,
  4071. "%s: Failed to get battery dt\n", __func__);
  4072. ret = -EINVAL;
  4073. goto err_bat_free;
  4074. }
  4075. } else {
  4076. pdata = dev_get_platdata(&pdev->dev);
  4077. battery->pdata = pdata;
  4078. }
  4079. platform_set_drvdata(pdev, battery);
  4080. battery->dev = &pdev->dev;
  4081. mutex_init(&battery->adclock);
  4082. dev_dbg(battery->dev, "%s: ADC init\n", __func__);
  4083. battery->pdata->temp_highlimit_threshold_event = TEMP_HIGHLIMIT_DEFAULT;
  4084. battery->pdata->temp_highlimit_recovery_event = TEMP_HIGHLIMIT_DEFAULT;
  4085. battery->pdata->temp_highlimit_threshold_normal = TEMP_HIGHLIMIT_DEFAULT;
  4086. battery->pdata->temp_highlimit_recovery_normal =TEMP_HIGHLIMIT_DEFAULT;
  4087. battery->pdata->temp_highlimit_threshold_lpm = TEMP_HIGHLIMIT_DEFAULT;
  4088. battery->pdata->temp_highlimit_recovery_lpm = TEMP_HIGHLIMIT_DEFAULT;
  4089. #ifdef CONFIG_OF
  4090. board_battery_init(pdev, battery);
  4091. #if defined(CONFIG_BATTERY_SWELLING)
  4092. pr_info("%s : SWELLING_HIGH_TEMP(%d) SWELLING_HIGH_TEMP_RECOVERY(%d)\n"
  4093. "SWELLING_LOW_TEMP(%d) SWELLING_LOW_TEMP_RECOVERY(%d)\n"
  4094. "SWELLING_HIGH_CHG_CURRENT(%d) SWELLING_LOW_CHG_CURRENT(%d)\n",
  4095. __func__, battery->pdata->swelling_high_temp_block, battery->pdata->swelling_high_temp_recov,
  4096. battery->pdata->swelling_low_temp_block, battery->pdata->swelling_low_temp_recov,
  4097. battery->pdata->swelling_high_chg_current, battery->pdata->swelling_low_chg_current);
  4098. #endif
  4099. #else
  4100. for (i = 0; i < SEC_BAT_ADC_CHANNEL_NUM; i++)
  4101. adc_init(pdev, pdata, i);
  4102. #endif
  4103. wakeup_source_init(&battery->monitor_ws, "sec-battery-monitor");
  4104. wakeup_source_init(&battery->cable_ws, "sec-battery-cable");
  4105. wakeup_source_init(&battery->vbus_ws, "sec-battery-vbus");
  4106. wakeup_source_init(&battery->vbus_detect_ws, "sec-battery-vbus-detect");
  4107. /* initialization of battery info */
  4108. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  4109. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  4110. battery->present = true;
  4111. battery->polling_count = 1; /* initial value = 1 */
  4112. battery->polling_time = pdata->polling_time[
  4113. SEC_BATTERY_POLLING_TIME_DISCHARGING];
  4114. battery->polling_in_sleep = false;
  4115. battery->polling_short = false;
  4116. battery->fuelgauge_in_sleep = false;
  4117. battery->check_count = 0;
  4118. battery->check_adc_count = 0;
  4119. battery->check_adc_value = 0;
  4120. battery->charging_start_time = 0;
  4121. battery->charging_passed_time = 0;
  4122. battery->charging_next_time = 0;
  4123. battery->charging_fullcharged_time = 0;
  4124. battery->siop_level = 100;
  4125. battery->wc_enable = 1;
  4126. battery->stability_test = 0;
  4127. battery->eng_not_full_status = 0;
  4128. battery->chg_limit = false;
  4129. if (battery->pdata->check_batt_id)
  4130. battery->pdata->check_batt_id();
  4131. battery->wc_status = 0;
  4132. battery->ps_status= 0;
  4133. battery->ps_changed= 0;
  4134. battery->ps_enable= 0;
  4135. battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
  4136. #if defined(CONFIG_BATTERY_SWELLING)
  4137. battery->swelling_mode = false;
  4138. battery->charging_block = false;
  4139. #endif
  4140. hrtimer_init(&battery->event_termination_hrtimer,
  4141. CLOCK_BOOTTIME,
  4142. HRTIMER_MODE_ABS);
  4143. battery->event_termination_hrtimer.function =
  4144. &sec_bat_event_expired_timer_func;
  4145. battery->temp_highlimit_threshold =
  4146. pdata->temp_highlimit_threshold_normal;
  4147. battery->temp_highlimit_recovery =
  4148. pdata->temp_highlimit_recovery_normal;
  4149. battery->temp_high_threshold =
  4150. pdata->temp_high_threshold_normal;
  4151. battery->temp_high_recovery =
  4152. pdata->temp_high_recovery_normal;
  4153. battery->temp_low_recovery =
  4154. pdata->temp_low_recovery_normal;
  4155. battery->temp_low_threshold =
  4156. pdata->temp_low_threshold_normal;
  4157. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  4158. battery->is_recharging = false;
  4159. battery->cable_type = POWER_SUPPLY_TYPE_BATTERY;
  4160. battery->test_mode = 0;
  4161. battery->factory_mode = false;
  4162. battery->store_mode = false;
  4163. battery->slate_mode = false;
  4164. battery->is_hc_usb = false;
  4165. battery->health_change = false;
  4166. battery->prev_reported_soc = -EINVAL;
  4167. if (battery->pdata->charger_name == NULL)
  4168. battery->pdata->charger_name = "sec-charger";
  4169. if (battery->pdata->fuelgauge_name == NULL)
  4170. battery->pdata->fuelgauge_name = "sec-fuelgauge";
  4171. battery->psy_bat.name = "battery",
  4172. battery->psy_bat.type = POWER_SUPPLY_TYPE_BATTERY,
  4173. battery->psy_bat.properties = sec_battery_props,
  4174. battery->psy_bat.num_properties = ARRAY_SIZE(sec_battery_props),
  4175. battery->psy_bat.get_property = sec_bat_get_property,
  4176. battery->psy_bat.set_property = sec_bat_set_property,
  4177. #if defined(CONFIG_QPNP_BMS)
  4178. battery->psy_bat.supplied_to = pm_batt_supplied_to;
  4179. battery->psy_bat.num_supplicants =
  4180. ARRAY_SIZE(pm_batt_supplied_to);
  4181. #endif
  4182. battery->psy_usb.name = "usb",
  4183. battery->psy_usb.type = POWER_SUPPLY_TYPE_USB,
  4184. battery->psy_usb.supplied_to = supply_list,
  4185. battery->psy_usb.num_supplicants = ARRAY_SIZE(supply_list),
  4186. battery->psy_usb.properties = sec_power_props,
  4187. battery->psy_usb.num_properties = ARRAY_SIZE(sec_power_props),
  4188. battery->psy_usb.get_property = sec_usb_get_property,
  4189. battery->psy_ac.name = "ac",
  4190. battery->psy_ac.type = POWER_SUPPLY_TYPE_MAINS,
  4191. battery->psy_ac.supplied_to = supply_list,
  4192. battery->psy_ac.num_supplicants = ARRAY_SIZE(supply_list),
  4193. battery->psy_ac.properties = sec_power_props,
  4194. battery->psy_ac.num_properties = ARRAY_SIZE(sec_power_props),
  4195. battery->psy_ac.get_property = sec_ac_get_property;
  4196. battery->psy_wireless.name = "wireless",
  4197. battery->psy_wireless.type = POWER_SUPPLY_TYPE_WIRELESS,
  4198. battery->psy_wireless.supplied_to = supply_list,
  4199. battery->psy_wireless.num_supplicants = ARRAY_SIZE(supply_list),
  4200. battery->psy_wireless.properties = sec_power_props,
  4201. battery->psy_wireless.num_properties = ARRAY_SIZE(sec_power_props),
  4202. battery->psy_wireless.get_property = sec_wireless_get_property;
  4203. battery->psy_wireless.set_property = sec_wireless_set_property;
  4204. battery->psy_pogo.name = "pogo",
  4205. battery->psy_pogo.type = POWER_SUPPLY_TYPE_POGODOCK,
  4206. battery->psy_pogo.supplied_to = supply_list,
  4207. battery->psy_pogo.num_supplicants = ARRAY_SIZE(supply_list),
  4208. battery->psy_pogo.properties = sec_power_props,
  4209. battery->psy_pogo.num_properties = ARRAY_SIZE(sec_power_props),
  4210. battery->psy_pogo.get_property = sec_pogo_get_property;
  4211. battery->psy_ps.name = "ps",
  4212. battery->psy_ps.type = POWER_SUPPLY_TYPE_POWER_SHARING,
  4213. battery->psy_ps.supplied_to = supply_list,
  4214. battery->psy_ps.num_supplicants = ARRAY_SIZE(supply_list),
  4215. battery->psy_ps.properties = sec_ps_props,
  4216. battery->psy_ps.num_properties = ARRAY_SIZE(sec_ps_props),
  4217. battery->psy_ps.get_property = sec_ps_get_property;
  4218. battery->psy_ps.set_property = sec_ps_set_property;
  4219. /* create work queue */
  4220. battery->monitor_wqueue =
  4221. create_singlethread_workqueue(dev_name(&pdev->dev));
  4222. if (!battery->monitor_wqueue) {
  4223. dev_err(battery->dev,
  4224. "%s: Fail to Create Workqueue\n", __func__);
  4225. goto err_wake_lock;
  4226. }
  4227. INIT_DELAYED_WORK(&battery->monitor_work, sec_bat_monitor_work);
  4228. INIT_DELAYED_WORK(&battery->cable_work, sec_bat_cable_work);
  4229. INIT_DELAYED_WORK(&battery->vbus_detect_work, sec_bat_vbus_detect_work);
  4230. switch (pdata->polling_type) {
  4231. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4232. INIT_DELAYED_WORK_DEFERRABLE(&battery->polling_work,
  4233. sec_bat_polling_work);
  4234. break;
  4235. case SEC_BATTERY_MONITOR_ALARM:
  4236. battery->last_poll_time = ktime_get_boottime();
  4237. hrtimer_init(&battery->polling_hrtimer,
  4238. CLOCK_BOOTTIME,
  4239. HRTIMER_MODE_ABS);
  4240. battery->polling_hrtimer.function =
  4241. &sec_bat_alarm;
  4242. break;
  4243. default:
  4244. break;
  4245. }
  4246. sec_bat_get_battery_info(battery);
  4247. /* init power supplier framework */
  4248. ret = power_supply_register(&pdev->dev, &battery->psy_ps);
  4249. if (ret) {
  4250. dev_err(battery->dev,
  4251. "%s: Failed to Register psy_ps\n", __func__);
  4252. goto err_workqueue;
  4253. }
  4254. ret = power_supply_register(&pdev->dev, &battery->psy_wireless);
  4255. if (ret) {
  4256. dev_err(battery->dev,
  4257. "%s: Failed to Register psy_wireless\n", __func__);
  4258. goto err_supply_unreg_ps;
  4259. }
  4260. ret = power_supply_register(&pdev->dev, &battery->psy_usb);
  4261. if (ret) {
  4262. dev_err(battery->dev,
  4263. "%s: Failed to Register psy_usb\n", __func__);
  4264. goto err_supply_unreg_wireless;
  4265. }
  4266. ret = power_supply_register(&pdev->dev, &battery->psy_ac);
  4267. if (ret) {
  4268. dev_err(battery->dev,
  4269. "%s: Failed to Register psy_ac\n", __func__);
  4270. goto err_supply_unreg_usb;
  4271. }
  4272. ret = power_supply_register(&pdev->dev, &battery->psy_pogo);
  4273. if (ret) {
  4274. dev_err(battery->dev,
  4275. "%s: Failed to Register psy_pogo\n", __func__);
  4276. goto err_supply_unreg_ac;
  4277. }
  4278. ret = power_supply_register(&pdev->dev, &battery->psy_bat);
  4279. if (ret) {
  4280. dev_err(battery->dev,
  4281. "%s: Failed to Register psy_bat\n", __func__);
  4282. goto err_supply_unreg_pogo;
  4283. }
  4284. if (battery->pdata->bat_gpio_init && !battery->pdata->bat_gpio_init()) {
  4285. dev_err(battery->dev,
  4286. "%s: Failed to Initialize GPIO\n", __func__);
  4287. goto err_supply_unreg_bat;
  4288. }
  4289. if (battery->pdata->bat_irq) {
  4290. ret = request_threaded_irq(battery->pdata->bat_irq,
  4291. NULL, sec_bat_irq_thread,
  4292. battery->pdata->bat_irq_attr,
  4293. "battery-irq", battery);
  4294. if (ret) {
  4295. dev_err(battery->dev,
  4296. "%s: Failed to Request IRQ (bat_int)\n", __func__);
  4297. goto err_supply_unreg_bat;
  4298. }
  4299. if (battery->pdata->bat_irq_gpio) {
  4300. ret = enable_irq_wake(battery->pdata->bat_irq);
  4301. if (ret < 0)
  4302. dev_err(battery->dev,
  4303. "%s: Failed to Enable Wakeup Source(%d)(bat_int)\n",
  4304. __func__, ret);
  4305. }
  4306. }
  4307. if (battery->pdata->ta_irq) {
  4308. ret = request_threaded_irq(battery->pdata->ta_irq,
  4309. NULL, sec_ta_irq_thread,
  4310. battery->pdata->ta_irq_attr,
  4311. "ta-irq", battery);
  4312. if (ret) {
  4313. dev_err(battery->dev,
  4314. "%s: Failed to Request IRQ (ta_int)\n", __func__);
  4315. goto err_req_irq;
  4316. }
  4317. if (battery->pdata->ta_irq_gpio) {
  4318. ret = enable_irq_wake(battery->pdata->ta_irq);
  4319. if (ret < 0)
  4320. dev_err(battery->dev,
  4321. "%s: Failed to Enable Wakeup Source(%d)(ta_int)\n",
  4322. __func__, ret);
  4323. }
  4324. }
  4325. ret = sec_bat_create_attrs(battery->psy_bat.dev);
  4326. if (ret) {
  4327. dev_err(battery->dev,
  4328. "%s : Failed to create_attrs\n", __func__);
  4329. goto err_req_ta_irq;
  4330. }
  4331. #if defined(CONFIG_EXTCON)
  4332. for (i=0; i < EXTCON_NONE; i++) {
  4333. battery->extcon_cable_list[i].batt_nb.notifier_call = batt_handle_notification;
  4334. battery->extcon_cable_list[i].cable_index = i;
  4335. ret = extcon_register_interest(&battery->extcon_cable_list[i].extcon_nb,
  4336. EXTCON_DEV_NAME,
  4337. extcon_cable_name[i],
  4338. &battery->extcon_cable_list[i].batt_nb);
  4339. if (ret)
  4340. pr_err("%s: fail to register extcon notifier(%s, %d)\n",
  4341. __func__, extcon_cable_name[i], ret);
  4342. if (extcon_get_cable_state_(battery->extcon_cable_list[i].extcon_nb.edev, i)) {
  4343. battery->wire_status = sec_bat_cable_check(battery, i);
  4344. pr_info("%s: %s(wire_status = %d) attached from extcon\n", __func__,
  4345. extcon_cable_name[i], battery->wire_status);
  4346. }
  4347. }
  4348. if ((battery->wire_status > POWER_SUPPLY_TYPE_BATTERY) &&
  4349. (battery->wire_status < SEC_SIZEOF_POWER_SUPPLY_TYPE) &&
  4350. (battery->pdata->cable_source_type &
  4351. SEC_BATTERY_CABLE_SOURCE_EXTERNAL)) {
  4352. __pm_stay_awake(&battery->cable_ws);
  4353. queue_delayed_work(battery->monitor_wqueue,
  4354. &battery->cable_work, 0);
  4355. } else {
  4356. union power_supply_propval value;
  4357. psy_do_property(battery->pdata->charger_name, get,
  4358. POWER_SUPPLY_PROP_ONLINE, value);
  4359. if (value.intval == POWER_SUPPLY_TYPE_WIRELESS) {
  4360. battery->wc_status = 1;
  4361. __pm_stay_awake(&battery->cable_ws);
  4362. queue_delayed_work(battery->monitor_wqueue,
  4363. &battery->cable_work, 0);
  4364. }
  4365. }
  4366. #else
  4367. cable_initial_check(battery);
  4368. #endif
  4369. __pm_stay_awake(&battery->monitor_ws);
  4370. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  4371. sec_bat_check_cable_result_callback(battery->dev, POWER_SUPPLY_TYPE_MAINS);
  4372. battery->present = sec_bat_check(battery);
  4373. sec_bat_check_cable_result_callback(battery->dev, battery->cable_type);
  4374. dev_info(battery->dev,
  4375. "%s: SEC Battery Driver Loaded\n", __func__);
  4376. #ifdef CONFIG_SAMSUNG_BATTERY_FACTORY
  4377. /* do not sleep in lpm mode & factory mode */
  4378. if (sec_bat_is_lpm(battery)) {
  4379. wakeup_source_init(&battery->lpm_ws, "sec-lpm-monitor");
  4380. __pm_stay_awake(&battery->lpm_ws);
  4381. }
  4382. #endif
  4383. return 0;
  4384. err_req_ta_irq:
  4385. if (battery->pdata->ta_irq)
  4386. free_irq(battery->pdata->ta_irq, battery);
  4387. err_req_irq:
  4388. if (battery->pdata->bat_irq)
  4389. free_irq(battery->pdata->bat_irq, battery);
  4390. err_supply_unreg_bat:
  4391. power_supply_unregister(&battery->psy_bat);
  4392. err_supply_unreg_pogo:
  4393. power_supply_unregister(&battery->psy_pogo);
  4394. err_supply_unreg_ac:
  4395. power_supply_unregister(&battery->psy_ac);
  4396. err_supply_unreg_usb:
  4397. power_supply_unregister(&battery->psy_usb);
  4398. err_supply_unreg_wireless:
  4399. power_supply_unregister(&battery->psy_wireless);
  4400. err_supply_unreg_ps:
  4401. power_supply_unregister(&battery->psy_ps);
  4402. err_workqueue:
  4403. destroy_workqueue(battery->monitor_wqueue);
  4404. err_wake_lock:
  4405. wakeup_source_trash(&battery->monitor_ws);
  4406. wakeup_source_trash(&battery->cable_ws);
  4407. wakeup_source_trash(&battery->vbus_ws);
  4408. wakeup_source_trash(&battery->vbus_detect_ws);
  4409. mutex_destroy(&battery->adclock);
  4410. kfree(pdata);
  4411. err_bat_free:
  4412. kfree(battery);
  4413. return ret;
  4414. }
  4415. static int __devexit sec_battery_remove(struct platform_device *pdev)
  4416. {
  4417. struct sec_battery_info *battery = platform_get_drvdata(pdev);
  4418. #ifndef CONFIG_OF
  4419. int i;
  4420. #endif
  4421. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4422. switch (battery->pdata->polling_type) {
  4423. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4424. cancel_delayed_work(&battery->polling_work);
  4425. break;
  4426. case SEC_BATTERY_MONITOR_ALARM:
  4427. hrtimer_cancel(&battery->polling_hrtimer);
  4428. break;
  4429. default:
  4430. break;
  4431. }
  4432. hrtimer_cancel(&battery->event_termination_hrtimer);
  4433. flush_workqueue(battery->monitor_wqueue);
  4434. destroy_workqueue(battery->monitor_wqueue);
  4435. wakeup_source_trash(&battery->monitor_ws);
  4436. wakeup_source_trash(&battery->cable_ws);
  4437. wakeup_source_trash(&battery->vbus_ws);
  4438. wakeup_source_trash(&battery->vbus_detect_ws);
  4439. mutex_destroy(&battery->adclock);
  4440. #ifdef CONFIG_OF
  4441. adc_exit(battery);
  4442. #else
  4443. for (i = 0; i < SEC_BAT_ADC_CHANNEL_NUM; i++)
  4444. adc_exit(battery->pdata, i);
  4445. #endif
  4446. power_supply_unregister(&battery->psy_ps);
  4447. power_supply_unregister(&battery->psy_wireless);
  4448. power_supply_unregister(&battery->psy_ac);
  4449. power_supply_unregister(&battery->psy_usb);
  4450. power_supply_unregister(&battery->psy_bat);
  4451. dev_dbg(battery->dev, "%s: End\n", __func__);
  4452. kfree(battery);
  4453. return 0;
  4454. }
  4455. static int sec_battery_prepare(struct device *dev)
  4456. {
  4457. struct sec_battery_info *battery
  4458. = dev_get_drvdata(dev);
  4459. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4460. switch (battery->pdata->polling_type) {
  4461. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4462. cancel_delayed_work(&battery->polling_work);
  4463. break;
  4464. case SEC_BATTERY_MONITOR_ALARM:
  4465. hrtimer_cancel(&battery->polling_hrtimer);
  4466. break;
  4467. default:
  4468. break;
  4469. }
  4470. cancel_delayed_work_sync(&battery->monitor_work);
  4471. battery->polling_in_sleep = true;
  4472. sec_bat_set_polling(battery);
  4473. /* cancel work for polling
  4474. * that is set in sec_bat_set_polling()
  4475. * no need for polling in sleep
  4476. */
  4477. if (battery->pdata->polling_type ==
  4478. SEC_BATTERY_MONITOR_WORKQUEUE)
  4479. cancel_delayed_work(&battery->polling_work);
  4480. dev_dbg(battery->dev, "%s: End\n", __func__);
  4481. return 0;
  4482. }
  4483. static int sec_battery_suspend(struct device *dev)
  4484. {
  4485. return 0;
  4486. }
  4487. static int sec_battery_resume(struct device *dev)
  4488. {
  4489. return 0;
  4490. }
  4491. static void sec_battery_complete(struct device *dev)
  4492. {
  4493. struct sec_battery_info *battery
  4494. = dev_get_drvdata(dev);
  4495. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4496. /* cancel current alarm and reset after monitor work */
  4497. if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
  4498. hrtimer_cancel(&battery->polling_hrtimer);
  4499. __pm_stay_awake(&battery->monitor_ws);
  4500. queue_delayed_work(battery->monitor_wqueue,
  4501. &battery->monitor_work, 0);
  4502. dev_dbg(battery->dev, "%s: End\n", __func__);
  4503. return;
  4504. }
  4505. static void sec_battery_shutdown(struct device *dev)
  4506. {
  4507. }
  4508. #ifdef CONFIG_OF
  4509. static struct of_device_id sec_battery_dt_ids[] = {
  4510. { .compatible = "samsung,sec-battery" },
  4511. { }
  4512. };
  4513. MODULE_DEVICE_TABLE(of, sec_battery_dt_ids);
  4514. #endif /* CONFIG_OF */
  4515. static const struct dev_pm_ops sec_battery_pm_ops = {
  4516. .prepare = sec_battery_prepare,
  4517. .suspend = sec_battery_suspend,
  4518. .resume = sec_battery_resume,
  4519. .complete = sec_battery_complete,
  4520. };
  4521. static struct platform_driver sec_battery_driver = {
  4522. .driver = {
  4523. .name = "sec-battery",
  4524. .owner = THIS_MODULE,
  4525. .pm = &sec_battery_pm_ops,
  4526. .shutdown = sec_battery_shutdown,
  4527. #ifdef CONFIG_OF
  4528. .of_match_table = sec_battery_dt_ids,
  4529. #endif
  4530. },
  4531. .probe = sec_battery_probe,
  4532. .remove = __devexit_p(sec_battery_remove),
  4533. };
  4534. static int __init sec_battery_init(void)
  4535. {
  4536. return platform_driver_register(&sec_battery_driver);
  4537. }
  4538. static void __exit sec_battery_exit(void)
  4539. {
  4540. platform_driver_unregister(&sec_battery_driver);
  4541. }
  4542. late_initcall(sec_battery_init);
  4543. module_exit(sec_battery_exit);
  4544. MODULE_DESCRIPTION("Samsung Battery Driver");
  4545. MODULE_AUTHOR("Samsung Electronics");
  4546. MODULE_LICENSE("GPL");