sec_battery.c 144 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock_timeout(&battery->vbus_wake_lock, 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. wake_lock_timeout(&battery->vbus_wake_lock, 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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock_timeout(&battery->monitor_wake_lock, HZ * 5);
  2141. else
  2142. wake_unlock(&battery->monitor_wake_lock);
  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. wake_lock_timeout(&battery->vbus_wake_lock, 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. wake_lock(&battery->vbus_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  2300. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work,
  2301. msecs_to_jiffies(500));
  2302. end_of_cable_work:
  2303. wake_unlock(&battery->cable_wake_lock);
  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. wake_unlock(&battery->vbus_detect_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  2836. queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
  2837. } else {
  2838. battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
  2839. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->cable_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->vbus_detect_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  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. wake_lock(&battery->monitor_wake_lock);
  3753. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  3754. } else if(cable_type != battery->cable_type) {
  3755. wake_lock(&battery->cable_wake_lock);
  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. wake_lock_init(&battery->monitor_wake_lock, WAKE_LOCK_SUSPEND,
  4104. "sec-battery-monitor");
  4105. wake_lock_init(&battery->cable_wake_lock, WAKE_LOCK_SUSPEND,
  4106. "sec-battery-cable");
  4107. wake_lock_init(&battery->vbus_wake_lock, WAKE_LOCK_SUSPEND,
  4108. "sec-battery-vbus");
  4109. wake_lock_init(&battery->vbus_detect_wake_lock, WAKE_LOCK_SUSPEND,
  4110. "sec-battery-vbus-detect");
  4111. /* initialization of battery info */
  4112. battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
  4113. battery->health = POWER_SUPPLY_HEALTH_GOOD;
  4114. battery->present = true;
  4115. battery->polling_count = 1; /* initial value = 1 */
  4116. battery->polling_time = pdata->polling_time[
  4117. SEC_BATTERY_POLLING_TIME_DISCHARGING];
  4118. battery->polling_in_sleep = false;
  4119. battery->polling_short = false;
  4120. battery->fuelgauge_in_sleep = false;
  4121. battery->check_count = 0;
  4122. battery->check_adc_count = 0;
  4123. battery->check_adc_value = 0;
  4124. battery->charging_start_time = 0;
  4125. battery->charging_passed_time = 0;
  4126. battery->charging_next_time = 0;
  4127. battery->charging_fullcharged_time = 0;
  4128. battery->siop_level = 100;
  4129. battery->wc_enable = 1;
  4130. battery->stability_test = 0;
  4131. battery->eng_not_full_status = 0;
  4132. battery->chg_limit = false;
  4133. if (battery->pdata->check_batt_id)
  4134. battery->pdata->check_batt_id();
  4135. battery->wc_status = 0;
  4136. battery->ps_status= 0;
  4137. battery->ps_changed= 0;
  4138. battery->ps_enable= 0;
  4139. battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
  4140. #if defined(CONFIG_BATTERY_SWELLING)
  4141. battery->swelling_mode = false;
  4142. battery->charging_block = false;
  4143. #endif
  4144. hrtimer_init(&battery->event_termination_hrtimer,
  4145. CLOCK_BOOTTIME,
  4146. HRTIMER_MODE_ABS);
  4147. battery->event_termination_hrtimer.function =
  4148. &sec_bat_event_expired_timer_func;
  4149. battery->temp_highlimit_threshold =
  4150. pdata->temp_highlimit_threshold_normal;
  4151. battery->temp_highlimit_recovery =
  4152. pdata->temp_highlimit_recovery_normal;
  4153. battery->temp_high_threshold =
  4154. pdata->temp_high_threshold_normal;
  4155. battery->temp_high_recovery =
  4156. pdata->temp_high_recovery_normal;
  4157. battery->temp_low_recovery =
  4158. pdata->temp_low_recovery_normal;
  4159. battery->temp_low_threshold =
  4160. pdata->temp_low_threshold_normal;
  4161. battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
  4162. battery->is_recharging = false;
  4163. battery->cable_type = POWER_SUPPLY_TYPE_BATTERY;
  4164. battery->test_mode = 0;
  4165. battery->factory_mode = false;
  4166. battery->store_mode = false;
  4167. battery->slate_mode = false;
  4168. battery->is_hc_usb = false;
  4169. battery->health_change = false;
  4170. battery->prev_reported_soc = -EINVAL;
  4171. if (battery->pdata->charger_name == NULL)
  4172. battery->pdata->charger_name = "sec-charger";
  4173. if (battery->pdata->fuelgauge_name == NULL)
  4174. battery->pdata->fuelgauge_name = "sec-fuelgauge";
  4175. battery->psy_bat.name = "battery",
  4176. battery->psy_bat.type = POWER_SUPPLY_TYPE_BATTERY,
  4177. battery->psy_bat.properties = sec_battery_props,
  4178. battery->psy_bat.num_properties = ARRAY_SIZE(sec_battery_props),
  4179. battery->psy_bat.get_property = sec_bat_get_property,
  4180. battery->psy_bat.set_property = sec_bat_set_property,
  4181. #if defined(CONFIG_QPNP_BMS)
  4182. battery->psy_bat.supplied_to = pm_batt_supplied_to;
  4183. battery->psy_bat.num_supplicants =
  4184. ARRAY_SIZE(pm_batt_supplied_to);
  4185. #endif
  4186. battery->psy_usb.name = "usb",
  4187. battery->psy_usb.type = POWER_SUPPLY_TYPE_USB,
  4188. battery->psy_usb.supplied_to = supply_list,
  4189. battery->psy_usb.num_supplicants = ARRAY_SIZE(supply_list),
  4190. battery->psy_usb.properties = sec_power_props,
  4191. battery->psy_usb.num_properties = ARRAY_SIZE(sec_power_props),
  4192. battery->psy_usb.get_property = sec_usb_get_property,
  4193. battery->psy_ac.name = "ac",
  4194. battery->psy_ac.type = POWER_SUPPLY_TYPE_MAINS,
  4195. battery->psy_ac.supplied_to = supply_list,
  4196. battery->psy_ac.num_supplicants = ARRAY_SIZE(supply_list),
  4197. battery->psy_ac.properties = sec_power_props,
  4198. battery->psy_ac.num_properties = ARRAY_SIZE(sec_power_props),
  4199. battery->psy_ac.get_property = sec_ac_get_property;
  4200. battery->psy_wireless.name = "wireless",
  4201. battery->psy_wireless.type = POWER_SUPPLY_TYPE_WIRELESS,
  4202. battery->psy_wireless.supplied_to = supply_list,
  4203. battery->psy_wireless.num_supplicants = ARRAY_SIZE(supply_list),
  4204. battery->psy_wireless.properties = sec_power_props,
  4205. battery->psy_wireless.num_properties = ARRAY_SIZE(sec_power_props),
  4206. battery->psy_wireless.get_property = sec_wireless_get_property;
  4207. battery->psy_wireless.set_property = sec_wireless_set_property;
  4208. battery->psy_pogo.name = "pogo",
  4209. battery->psy_pogo.type = POWER_SUPPLY_TYPE_POGODOCK,
  4210. battery->psy_pogo.supplied_to = supply_list,
  4211. battery->psy_pogo.num_supplicants = ARRAY_SIZE(supply_list),
  4212. battery->psy_pogo.properties = sec_power_props,
  4213. battery->psy_pogo.num_properties = ARRAY_SIZE(sec_power_props),
  4214. battery->psy_pogo.get_property = sec_pogo_get_property;
  4215. battery->psy_ps.name = "ps",
  4216. battery->psy_ps.type = POWER_SUPPLY_TYPE_POWER_SHARING,
  4217. battery->psy_ps.supplied_to = supply_list,
  4218. battery->psy_ps.num_supplicants = ARRAY_SIZE(supply_list),
  4219. battery->psy_ps.properties = sec_ps_props,
  4220. battery->psy_ps.num_properties = ARRAY_SIZE(sec_ps_props),
  4221. battery->psy_ps.get_property = sec_ps_get_property;
  4222. battery->psy_ps.set_property = sec_ps_set_property;
  4223. /* create work queue */
  4224. battery->monitor_wqueue =
  4225. create_singlethread_workqueue(dev_name(&pdev->dev));
  4226. if (!battery->monitor_wqueue) {
  4227. dev_err(battery->dev,
  4228. "%s: Fail to Create Workqueue\n", __func__);
  4229. goto err_wake_lock;
  4230. }
  4231. INIT_DELAYED_WORK(&battery->monitor_work, sec_bat_monitor_work);
  4232. INIT_DELAYED_WORK(&battery->cable_work, sec_bat_cable_work);
  4233. INIT_DELAYED_WORK(&battery->vbus_detect_work, sec_bat_vbus_detect_work);
  4234. switch (pdata->polling_type) {
  4235. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4236. INIT_DELAYED_WORK_DEFERRABLE(&battery->polling_work,
  4237. sec_bat_polling_work);
  4238. break;
  4239. case SEC_BATTERY_MONITOR_ALARM:
  4240. battery->last_poll_time = ktime_get_boottime();
  4241. hrtimer_init(&battery->polling_hrtimer,
  4242. CLOCK_BOOTTIME,
  4243. HRTIMER_MODE_ABS);
  4244. battery->polling_hrtimer.function =
  4245. &sec_bat_alarm;
  4246. break;
  4247. default:
  4248. break;
  4249. }
  4250. sec_bat_get_battery_info(battery);
  4251. /* init power supplier framework */
  4252. ret = power_supply_register(&pdev->dev, &battery->psy_ps);
  4253. if (ret) {
  4254. dev_err(battery->dev,
  4255. "%s: Failed to Register psy_ps\n", __func__);
  4256. goto err_workqueue;
  4257. }
  4258. ret = power_supply_register(&pdev->dev, &battery->psy_wireless);
  4259. if (ret) {
  4260. dev_err(battery->dev,
  4261. "%s: Failed to Register psy_wireless\n", __func__);
  4262. goto err_supply_unreg_ps;
  4263. }
  4264. ret = power_supply_register(&pdev->dev, &battery->psy_usb);
  4265. if (ret) {
  4266. dev_err(battery->dev,
  4267. "%s: Failed to Register psy_usb\n", __func__);
  4268. goto err_supply_unreg_wireless;
  4269. }
  4270. ret = power_supply_register(&pdev->dev, &battery->psy_ac);
  4271. if (ret) {
  4272. dev_err(battery->dev,
  4273. "%s: Failed to Register psy_ac\n", __func__);
  4274. goto err_supply_unreg_usb;
  4275. }
  4276. ret = power_supply_register(&pdev->dev, &battery->psy_pogo);
  4277. if (ret) {
  4278. dev_err(battery->dev,
  4279. "%s: Failed to Register psy_pogo\n", __func__);
  4280. goto err_supply_unreg_ac;
  4281. }
  4282. ret = power_supply_register(&pdev->dev, &battery->psy_bat);
  4283. if (ret) {
  4284. dev_err(battery->dev,
  4285. "%s: Failed to Register psy_bat\n", __func__);
  4286. goto err_supply_unreg_pogo;
  4287. }
  4288. if (battery->pdata->bat_gpio_init && !battery->pdata->bat_gpio_init()) {
  4289. dev_err(battery->dev,
  4290. "%s: Failed to Initialize GPIO\n", __func__);
  4291. goto err_supply_unreg_bat;
  4292. }
  4293. if (battery->pdata->bat_irq) {
  4294. ret = request_threaded_irq(battery->pdata->bat_irq,
  4295. NULL, sec_bat_irq_thread,
  4296. battery->pdata->bat_irq_attr,
  4297. "battery-irq", battery);
  4298. if (ret) {
  4299. dev_err(battery->dev,
  4300. "%s: Failed to Request IRQ (bat_int)\n", __func__);
  4301. goto err_supply_unreg_bat;
  4302. }
  4303. if (battery->pdata->bat_irq_gpio) {
  4304. ret = enable_irq_wake(battery->pdata->bat_irq);
  4305. if (ret < 0)
  4306. dev_err(battery->dev,
  4307. "%s: Failed to Enable Wakeup Source(%d)(bat_int)\n",
  4308. __func__, ret);
  4309. }
  4310. }
  4311. if (battery->pdata->ta_irq) {
  4312. ret = request_threaded_irq(battery->pdata->ta_irq,
  4313. NULL, sec_ta_irq_thread,
  4314. battery->pdata->ta_irq_attr,
  4315. "ta-irq", battery);
  4316. if (ret) {
  4317. dev_err(battery->dev,
  4318. "%s: Failed to Request IRQ (ta_int)\n", __func__);
  4319. goto err_req_irq;
  4320. }
  4321. if (battery->pdata->ta_irq_gpio) {
  4322. ret = enable_irq_wake(battery->pdata->ta_irq);
  4323. if (ret < 0)
  4324. dev_err(battery->dev,
  4325. "%s: Failed to Enable Wakeup Source(%d)(ta_int)\n",
  4326. __func__, ret);
  4327. }
  4328. }
  4329. ret = sec_bat_create_attrs(battery->psy_bat.dev);
  4330. if (ret) {
  4331. dev_err(battery->dev,
  4332. "%s : Failed to create_attrs\n", __func__);
  4333. goto err_req_ta_irq;
  4334. }
  4335. #if defined(CONFIG_EXTCON)
  4336. for (i=0; i < EXTCON_NONE; i++) {
  4337. battery->extcon_cable_list[i].batt_nb.notifier_call = batt_handle_notification;
  4338. battery->extcon_cable_list[i].cable_index = i;
  4339. ret = extcon_register_interest(&battery->extcon_cable_list[i].extcon_nb,
  4340. EXTCON_DEV_NAME,
  4341. extcon_cable_name[i],
  4342. &battery->extcon_cable_list[i].batt_nb);
  4343. if (ret)
  4344. pr_err("%s: fail to register extcon notifier(%s, %d)\n",
  4345. __func__, extcon_cable_name[i], ret);
  4346. if (extcon_get_cable_state_(battery->extcon_cable_list[i].extcon_nb.edev, i)) {
  4347. battery->wire_status = sec_bat_cable_check(battery, i);
  4348. pr_info("%s: %s(wire_status = %d) attached from extcon\n", __func__,
  4349. extcon_cable_name[i], battery->wire_status);
  4350. }
  4351. }
  4352. if ((battery->wire_status > POWER_SUPPLY_TYPE_BATTERY) &&
  4353. (battery->wire_status < SEC_SIZEOF_POWER_SUPPLY_TYPE) &&
  4354. (battery->pdata->cable_source_type &
  4355. SEC_BATTERY_CABLE_SOURCE_EXTERNAL)) {
  4356. wake_lock(&battery->cable_wake_lock);
  4357. queue_delayed_work(battery->monitor_wqueue,
  4358. &battery->cable_work, 0);
  4359. } else {
  4360. union power_supply_propval value;
  4361. psy_do_property(battery->pdata->charger_name, get,
  4362. POWER_SUPPLY_PROP_ONLINE, value);
  4363. if (value.intval == POWER_SUPPLY_TYPE_WIRELESS) {
  4364. battery->wc_status = 1;
  4365. wake_lock(&battery->cable_wake_lock);
  4366. queue_delayed_work(battery->monitor_wqueue,
  4367. &battery->cable_work, 0);
  4368. }
  4369. }
  4370. #else
  4371. cable_initial_check(battery);
  4372. #endif
  4373. wake_lock(&battery->monitor_wake_lock);
  4374. queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
  4375. sec_bat_check_cable_result_callback(battery->dev, POWER_SUPPLY_TYPE_MAINS);
  4376. battery->present = sec_bat_check(battery);
  4377. sec_bat_check_cable_result_callback(battery->dev, battery->cable_type);
  4378. dev_info(battery->dev,
  4379. "%s: SEC Battery Driver Loaded\n", __func__);
  4380. #ifdef CONFIG_SAMSUNG_BATTERY_FACTORY
  4381. /* do not sleep in lpm mode & factory mode */
  4382. if (sec_bat_is_lpm(battery)) {
  4383. wake_lock_init(&battery->lpm_wake_lock, WAKE_LOCK_SUSPEND,
  4384. "sec-lpm-monitor");
  4385. wake_lock(&battery->lpm_wake_lock);
  4386. }
  4387. #endif
  4388. return 0;
  4389. err_req_ta_irq:
  4390. if (battery->pdata->ta_irq)
  4391. free_irq(battery->pdata->ta_irq, battery);
  4392. err_req_irq:
  4393. if (battery->pdata->bat_irq)
  4394. free_irq(battery->pdata->bat_irq, battery);
  4395. err_supply_unreg_bat:
  4396. power_supply_unregister(&battery->psy_bat);
  4397. err_supply_unreg_pogo:
  4398. power_supply_unregister(&battery->psy_pogo);
  4399. err_supply_unreg_ac:
  4400. power_supply_unregister(&battery->psy_ac);
  4401. err_supply_unreg_usb:
  4402. power_supply_unregister(&battery->psy_usb);
  4403. err_supply_unreg_wireless:
  4404. power_supply_unregister(&battery->psy_wireless);
  4405. err_supply_unreg_ps:
  4406. power_supply_unregister(&battery->psy_ps);
  4407. err_workqueue:
  4408. destroy_workqueue(battery->monitor_wqueue);
  4409. err_wake_lock:
  4410. wake_lock_destroy(&battery->monitor_wake_lock);
  4411. wake_lock_destroy(&battery->cable_wake_lock);
  4412. wake_lock_destroy(&battery->vbus_wake_lock);
  4413. wake_lock_destroy(&battery->vbus_detect_wake_lock);
  4414. mutex_destroy(&battery->adclock);
  4415. kfree(pdata);
  4416. err_bat_free:
  4417. kfree(battery);
  4418. return ret;
  4419. }
  4420. static int __devexit sec_battery_remove(struct platform_device *pdev)
  4421. {
  4422. struct sec_battery_info *battery = platform_get_drvdata(pdev);
  4423. #ifndef CONFIG_OF
  4424. int i;
  4425. #endif
  4426. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4427. switch (battery->pdata->polling_type) {
  4428. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4429. cancel_delayed_work(&battery->polling_work);
  4430. break;
  4431. case SEC_BATTERY_MONITOR_ALARM:
  4432. hrtimer_cancel(&battery->polling_hrtimer);
  4433. break;
  4434. default:
  4435. break;
  4436. }
  4437. hrtimer_cancel(&battery->event_termination_hrtimer);
  4438. flush_workqueue(battery->monitor_wqueue);
  4439. destroy_workqueue(battery->monitor_wqueue);
  4440. wake_lock_destroy(&battery->monitor_wake_lock);
  4441. wake_lock_destroy(&battery->cable_wake_lock);
  4442. wake_lock_destroy(&battery->vbus_wake_lock);
  4443. wake_lock_destroy(&battery->vbus_detect_wake_lock);
  4444. mutex_destroy(&battery->adclock);
  4445. #ifdef CONFIG_OF
  4446. adc_exit(battery);
  4447. #else
  4448. for (i = 0; i < SEC_BAT_ADC_CHANNEL_NUM; i++)
  4449. adc_exit(battery->pdata, i);
  4450. #endif
  4451. power_supply_unregister(&battery->psy_ps);
  4452. power_supply_unregister(&battery->psy_wireless);
  4453. power_supply_unregister(&battery->psy_ac);
  4454. power_supply_unregister(&battery->psy_usb);
  4455. power_supply_unregister(&battery->psy_bat);
  4456. dev_dbg(battery->dev, "%s: End\n", __func__);
  4457. kfree(battery);
  4458. return 0;
  4459. }
  4460. static int sec_battery_prepare(struct device *dev)
  4461. {
  4462. struct sec_battery_info *battery
  4463. = dev_get_drvdata(dev);
  4464. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4465. switch (battery->pdata->polling_type) {
  4466. case SEC_BATTERY_MONITOR_WORKQUEUE:
  4467. cancel_delayed_work(&battery->polling_work);
  4468. break;
  4469. case SEC_BATTERY_MONITOR_ALARM:
  4470. hrtimer_cancel(&battery->polling_hrtimer);
  4471. break;
  4472. default:
  4473. break;
  4474. }
  4475. cancel_delayed_work_sync(&battery->monitor_work);
  4476. battery->polling_in_sleep = true;
  4477. sec_bat_set_polling(battery);
  4478. /* cancel work for polling
  4479. * that is set in sec_bat_set_polling()
  4480. * no need for polling in sleep
  4481. */
  4482. if (battery->pdata->polling_type ==
  4483. SEC_BATTERY_MONITOR_WORKQUEUE)
  4484. cancel_delayed_work(&battery->polling_work);
  4485. dev_dbg(battery->dev, "%s: End\n", __func__);
  4486. return 0;
  4487. }
  4488. static int sec_battery_suspend(struct device *dev)
  4489. {
  4490. return 0;
  4491. }
  4492. static int sec_battery_resume(struct device *dev)
  4493. {
  4494. return 0;
  4495. }
  4496. static void sec_battery_complete(struct device *dev)
  4497. {
  4498. struct sec_battery_info *battery
  4499. = dev_get_drvdata(dev);
  4500. dev_dbg(battery->dev, "%s: Start\n", __func__);
  4501. /* cancel current alarm and reset after monitor work */
  4502. if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
  4503. hrtimer_cancel(&battery->polling_hrtimer);
  4504. wake_lock(&battery->monitor_wake_lock);
  4505. queue_delayed_work(battery->monitor_wqueue,
  4506. &battery->monitor_work, 0);
  4507. dev_dbg(battery->dev, "%s: End\n", __func__);
  4508. return;
  4509. }
  4510. static void sec_battery_shutdown(struct device *dev)
  4511. {
  4512. }
  4513. #ifdef CONFIG_OF
  4514. static struct of_device_id sec_battery_dt_ids[] = {
  4515. { .compatible = "samsung,sec-battery" },
  4516. { }
  4517. };
  4518. MODULE_DEVICE_TABLE(of, sec_battery_dt_ids);
  4519. #endif /* CONFIG_OF */
  4520. static const struct dev_pm_ops sec_battery_pm_ops = {
  4521. .prepare = sec_battery_prepare,
  4522. .suspend = sec_battery_suspend,
  4523. .resume = sec_battery_resume,
  4524. .complete = sec_battery_complete,
  4525. };
  4526. static struct platform_driver sec_battery_driver = {
  4527. .driver = {
  4528. .name = "sec-battery",
  4529. .owner = THIS_MODULE,
  4530. .pm = &sec_battery_pm_ops,
  4531. .shutdown = sec_battery_shutdown,
  4532. #ifdef CONFIG_OF
  4533. .of_match_table = sec_battery_dt_ids,
  4534. #endif
  4535. },
  4536. .probe = sec_battery_probe,
  4537. .remove = __devexit_p(sec_battery_remove),
  4538. };
  4539. static int __init sec_battery_init(void)
  4540. {
  4541. return platform_driver_register(&sec_battery_driver);
  4542. }
  4543. static void __exit sec_battery_exit(void)
  4544. {
  4545. platform_driver_unregister(&sec_battery_driver);
  4546. }
  4547. late_initcall(sec_battery_init);
  4548. module_exit(sec_battery_exit);
  4549. MODULE_DESCRIPTION("Samsung Battery Driver");
  4550. MODULE_AUTHOR("Samsung Electronics");
  4551. MODULE_LICENSE("GPL");