battery_common_fg_20.c 142 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630
  1. /*****************************************************************************
  2. *
  3. * Filename:
  4. * ---------
  5. * battery_common.c
  6. *
  7. * Project:
  8. * --------
  9. * Android_Software
  10. *
  11. * Description:
  12. * ------------
  13. * This Module defines functions of mt6323 Battery charging algorithm
  14. * and the Anroid Battery service for updating the battery status
  15. *
  16. * Author:
  17. * -------
  18. * Oscar Liu
  19. *
  20. ****************************************************************************/
  21. #include <linux/init.h> /* For init/exit macros */
  22. #include <linux/module.h> /* For MODULE_ marcros */
  23. #include <linux/fs.h>
  24. #include <linux/device.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/device.h>
  29. #include <linux/kdev_t.h>
  30. #include <linux/fs.h>
  31. #include <linux/cdev.h>
  32. #include <linux/delay.h>
  33. #include <linux/kernel.h>
  34. #include <linux/init.h>
  35. #include <linux/types.h>
  36. #include <linux/wait.h>
  37. #include <linux/slab.h>
  38. #include <linux/fs.h>
  39. #include <linux/sched.h>
  40. #include <linux/poll.h>
  41. #include <linux/power_supply.h>
  42. #include <linux/wakelock.h>
  43. #include <linux/time.h>
  44. #include <linux/mutex.h>
  45. #include <linux/kthread.h>
  46. #include <linux/proc_fs.h>
  47. #include <linux/platform_device.h>
  48. #include <linux/seq_file.h>
  49. #include <linux/scatterlist.h>
  50. #ifdef CONFIG_OF
  51. #include <linux/of.h>
  52. #include <linux/of_irq.h>
  53. #include <linux/of_address.h>
  54. #endif
  55. #include <linux/suspend.h>
  56. #include <asm/scatterlist.h>
  57. #include <asm/uaccess.h>
  58. #include <asm/io.h>
  59. #include <asm/irq.h>
  60. #include <linux/reboot.h>
  61. #include <mt-plat/mt_boot.h>
  62. #include <mt-plat/mtk_rtc.h>
  63. #include <mach/mt_charging.h>
  64. #include <mt-plat/upmu_common.h>
  65. #include <mt-plat/charging.h>
  66. #include <mt-plat/battery_meter.h>
  67. #include <mt-plat/battery_common.h>
  68. #include <mach/mt_battery_meter.h>
  69. #include <mach/mt_charging.h>
  70. #include <mach/mt_pmic.h>
  71. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--start
  72. #ifdef CONFIG_AW2015
  73. extern unsigned char AW2015_LED_OFF(void);
  74. extern unsigned char AW2015_LED_RED_ON(void);
  75. extern unsigned char AW2015_LED_RED_OFF(void);
  76. #endif
  77. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--end
  78. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  79. #include <mach/diso.h>
  80. #endif
  81. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  82. #include <mach/mt_pe.h>
  83. #endif
  84. /* ////////////////////////////////////////////////////////////////////////////// */
  85. /* Battery Logging Entry */
  86. /* ////////////////////////////////////////////////////////////////////////////// */
  87. int Enable_BATDRV_LOG = BAT_LOG_CRTI;
  88. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  89. /* // Smart Battery Structure */
  90. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  91. PMU_ChargerStruct BMT_status;
  92. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  93. DISO_ChargerStruct DISO_data;
  94. /* Debug Msg */
  95. static char *DISO_state_s[8] = {
  96. "IDLE",
  97. "OTG_ONLY",
  98. "USB_ONLY",
  99. "USB_WITH_OTG",
  100. "DC_ONLY",
  101. "DC_WITH_OTG",
  102. "DC_WITH_USB",
  103. "DC_USB_OTG",
  104. };
  105. #endif
  106. struct battery_custom_data batt_cust_data;
  107. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  108. /* // Thermal related flags */
  109. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  110. /* 0:nothing, 1:enable batTT&chrTimer, 2:disable batTT&chrTimer, 3:enable batTT, disable chrTimer */
  111. int g_battery_thermal_throttling_flag = 3;
  112. int battery_cmd_thermal_test_mode = 0;
  113. int battery_cmd_thermal_test_mode_value = 0;
  114. int g_battery_tt_check_flag = 0; /* 0:default enable check batteryTT, 1:default disable check batteryTT */
  115. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  116. /* // Global Variable */
  117. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  118. struct wake_lock battery_suspend_lock, battery_meter_lock;
  119. CHARGING_CONTROL battery_charging_control;
  120. unsigned int g_BatteryNotifyCode = 0x0000;
  121. unsigned int g_BN_TestMode = 0x0000;
  122. kal_bool g_bat_init_flag = 0;
  123. unsigned int g_call_state = CALL_IDLE;
  124. kal_bool g_charging_full_reset_bat_meter = KAL_FALSE;
  125. int g_platform_boot_mode = 0;
  126. struct timespec g_bat_time_before_sleep;
  127. int g_smartbook_update = 0;
  128. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  129. kal_bool g_vcdt_irq_delay_flag = 0;
  130. #endif
  131. #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT)
  132. unsigned int g_batt_temp_status = TEMP_POS_NORMAL;
  133. #endif
  134. kal_bool battery_suspended = KAL_FALSE;
  135. struct timespec battery_duration_time[DURATION_NUM]; /* sec */
  136. unsigned int wake_up_smooth_time = 0; /* sec */
  137. unsigned int battery_tracking_time;
  138. signed int batterypseudo1 = BATTERYPSEUDO1;
  139. signed int batterypseudo100 = BATTERYPSEUDO100;
  140. int Is_In_IPOH;
  141. int pending_wake_up_bat;
  142. /* ////////////////////////////////////////////////////////////////////////////// */
  143. /* Integrate with NVRAM */
  144. /* ////////////////////////////////////////////////////////////////////////////// */
  145. #define ADC_CALI_DEVNAME "MT_pmic_adc_cali"
  146. #define TEST_ADC_CALI_PRINT _IO('k', 0)
  147. #define SET_ADC_CALI_Slop _IOW('k', 1, int)
  148. #define SET_ADC_CALI_Offset _IOW('k', 2, int)
  149. #define SET_ADC_CALI_Cal _IOW('k', 3, int)
  150. #define ADC_CHANNEL_READ _IOW('k', 4, int)
  151. #define BAT_STATUS_READ _IOW('k', 5, int)
  152. #define Set_Charger_Current _IOW('k', 6, int)
  153. /* add for meta tool----------------------------------------- */
  154. #define Get_META_BAT_VOL _IOW('k', 10, int)
  155. #define Get_META_BAT_SOC _IOW('k', 11, int)
  156. /* add for meta tool----------------------------------------- */
  157. static struct class *adc_cali_class;
  158. static int adc_cali_major;
  159. static dev_t adc_cali_devno;
  160. static struct cdev *adc_cali_cdev;
  161. int adc_cali_slop[14] = {
  162. 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000
  163. };
  164. int adc_cali_offset[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  165. int adc_cali_cal[1] = { 0 };
  166. int battery_in_data[1] = { 0 };
  167. int battery_out_data[1] = { 0 };
  168. int charging_level_data[1] = { 0 };
  169. kal_bool g_ADC_Cali = KAL_FALSE;
  170. kal_bool g_ftm_battery_flag = KAL_FALSE;
  171. #if !defined(CONFIG_POWER_EXT)
  172. static int g_wireless_state;
  173. #endif
  174. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  175. /* // Thread related */
  176. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  177. #define BAT_MS_TO_NS(x) (x * 1000 * 1000)
  178. static kal_bool bat_routine_thread_timeout = KAL_FALSE;
  179. static kal_bool bat_update_thread_timeout = KAL_FALSE;
  180. static kal_bool chr_wake_up_bat = KAL_FALSE; /* charger in/out to wake up battery thread */
  181. static kal_bool bat_meter_timeout = KAL_FALSE;
  182. static DEFINE_MUTEX(bat_mutex);
  183. static DEFINE_MUTEX(bat_update_mutex);
  184. static DEFINE_MUTEX(charger_type_mutex);
  185. static DECLARE_WAIT_QUEUE_HEAD(bat_routine_wq);
  186. static DECLARE_WAIT_QUEUE_HEAD(bat_update_wq);
  187. static struct hrtimer charger_hv_detect_timer;
  188. static struct task_struct *charger_hv_detect_thread;
  189. static kal_bool charger_hv_detect_flag = KAL_FALSE;
  190. static DECLARE_WAIT_QUEUE_HEAD(charger_hv_detect_waiter);
  191. static struct hrtimer battery_kthread_timer;
  192. kal_bool g_battery_soc_ready = KAL_FALSE;
  193. unsigned char fg_ipoh_reset;
  194. /* ////////////////////////////////////////////////////////////////////////////// */
  195. /* FOR ADB CMD */
  196. /* ////////////////////////////////////////////////////////////////////////////// */
  197. /* Dual battery */
  198. int g_status_smb = POWER_SUPPLY_STATUS_NOT_CHARGING;
  199. int g_capacity_smb = 50;
  200. int g_present_smb = 0;
  201. /* ADB charging CMD */
  202. static int cmd_discharging = -1;
  203. static int adjust_power = -1;
  204. static int suspend_discharging = -1;
  205. /* ////////////////////////////////////////////////////////////////////////////// */
  206. /* FOR ANDROID BATTERY SERVICE */
  207. /* ////////////////////////////////////////////////////////////////////////////// */
  208. struct wireless_data {
  209. struct power_supply psy;
  210. int WIRELESS_ONLINE;
  211. };
  212. struct ac_data {
  213. struct power_supply psy;
  214. int AC_ONLINE;
  215. };
  216. struct usb_data {
  217. struct power_supply psy;
  218. int USB_ONLINE;
  219. };
  220. struct battery_data {
  221. struct power_supply psy;
  222. int BAT_STATUS;
  223. int BAT_HEALTH;
  224. int BAT_PRESENT;
  225. int BAT_TECHNOLOGY;
  226. int BAT_CAPACITY;
  227. /* Add for Battery Service */
  228. int BAT_batt_vol;
  229. int BAT_batt_temp;
  230. /* Add for EM */
  231. int BAT_TemperatureR;
  232. int BAT_TempBattVoltage;
  233. int BAT_InstatVolt;
  234. int BAT_BatteryAverageCurrent;
  235. int BAT_BatterySenseVoltage;
  236. int BAT_ISenseVoltage;
  237. int BAT_ChargerVoltage;
  238. /* Dual battery */
  239. int status_smb;
  240. int capacity_smb;
  241. int present_smb;
  242. int adjust_power;
  243. };
  244. static enum power_supply_property wireless_props[] = {
  245. POWER_SUPPLY_PROP_ONLINE,
  246. };
  247. static enum power_supply_property ac_props[] = {
  248. POWER_SUPPLY_PROP_ONLINE,
  249. };
  250. static enum power_supply_property usb_props[] = {
  251. POWER_SUPPLY_PROP_ONLINE,
  252. };
  253. static enum power_supply_property battery_props[] = {
  254. POWER_SUPPLY_PROP_STATUS,
  255. POWER_SUPPLY_PROP_HEALTH,
  256. POWER_SUPPLY_PROP_PRESENT,
  257. POWER_SUPPLY_PROP_TECHNOLOGY,
  258. POWER_SUPPLY_PROP_CAPACITY,
  259. /* Add for Battery Service */
  260. POWER_SUPPLY_PROP_batt_vol,
  261. POWER_SUPPLY_PROP_batt_temp,
  262. /* Add for EM */
  263. POWER_SUPPLY_PROP_TemperatureR,
  264. POWER_SUPPLY_PROP_TempBattVoltage,
  265. POWER_SUPPLY_PROP_InstatVolt,
  266. POWER_SUPPLY_PROP_BatteryAverageCurrent,
  267. POWER_SUPPLY_PROP_BatterySenseVoltage,
  268. POWER_SUPPLY_PROP_ISenseVoltage,
  269. POWER_SUPPLY_PROP_ChargerVoltage,
  270. /* Dual battery */
  271. POWER_SUPPLY_PROP_status_smb,
  272. POWER_SUPPLY_PROP_capacity_smb,
  273. POWER_SUPPLY_PROP_present_smb,
  274. /* ADB CMD Discharging */
  275. POWER_SUPPLY_PROP_adjust_power,
  276. };
  277. struct timespec batteryThreadRunTime;
  278. void mt_battery_update_time(struct timespec *pre_time, BATTERY_TIME_ENUM duration_type)
  279. {
  280. struct timespec time;
  281. time.tv_sec = 0;
  282. time.tv_nsec = 0;
  283. get_monotonic_boottime(&time);
  284. battery_duration_time[duration_type] = timespec_sub(time, *pre_time);
  285. battery_log(BAT_LOG_CRTI,
  286. "[Battery] mt_battery_update_duration_time , last_time=%d current_time=%d duration=%d\n",
  287. (int)pre_time->tv_sec, (int)time.tv_sec,
  288. (int)battery_duration_time[duration_type].tv_sec);
  289. pre_time->tv_sec = time.tv_sec;
  290. pre_time->tv_nsec = time.tv_nsec;
  291. }
  292. unsigned int mt_battery_get_duration_time(BATTERY_TIME_ENUM duration_type)
  293. {
  294. return battery_duration_time[duration_type].tv_sec;
  295. }
  296. struct timespec mt_battery_get_duration_time_act(BATTERY_TIME_ENUM duration_type)
  297. {
  298. return battery_duration_time[duration_type];
  299. }
  300. void charging_suspend_enable(void)
  301. {
  302. unsigned int charging_enable = true;
  303. suspend_discharging = 0;
  304. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  305. }
  306. void charging_suspend_disable(void)
  307. {
  308. unsigned int charging_enable = false;
  309. suspend_discharging = 1;
  310. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  311. }
  312. int read_tbat_value(void)
  313. {
  314. return BMT_status.temperature;
  315. }
  316. int get_charger_detect_status(void)
  317. {
  318. kal_bool chr_status;
  319. battery_charging_control(CHARGING_CMD_GET_CHARGER_DET_STATUS, &chr_status);
  320. return chr_status;
  321. }
  322. #if defined(CONFIG_MTK_POWER_EXT_DETECT)
  323. kal_bool bat_is_ext_power(void)
  324. {
  325. kal_bool pwr_src = 0;
  326. battery_charging_control(CHARGING_CMD_GET_POWER_SOURCE, &pwr_src);
  327. battery_log(BAT_LOG_FULL, "[BAT_IS_EXT_POWER] is_ext_power = %d\n", pwr_src);
  328. return pwr_src;
  329. }
  330. #endif
  331. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--start
  332. #ifdef CONFIG_AW2015
  333. static int LED_ON_COUNT = 1;
  334. #endif
  335. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--end
  336. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  337. /* // PMIC PCHR Related APIs */
  338. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  339. kal_bool upmu_is_chr_det(void)
  340. {
  341. #if !defined(CONFIG_POWER_EXT)
  342. unsigned int tmp32;
  343. #endif
  344. if (!g_bat_init_flag) {
  345. battery_log(BAT_LOG_CRTI,
  346. "[upmu_is_chr_det] battery thread not ready, will do after bettery init.\n");
  347. return KAL_FALSE;
  348. }
  349. #if defined(CONFIG_POWER_EXT)
  350. /* return KAL_TRUE; */
  351. return get_charger_detect_status();
  352. #else
  353. if (suspend_discharging == 1)
  354. return KAL_FALSE;
  355. tmp32 = get_charger_detect_status();
  356. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  357. if (KAL_TRUE == bat_is_ext_power())
  358. return tmp32;
  359. #endif
  360. if (tmp32 == 0)
  361. return KAL_FALSE;
  362. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  363. if (mt_usb_is_device()) {
  364. battery_log(BAT_LOG_FULL, "[upmu_is_chr_det] Charger exist and USB is not host\n");
  365. return KAL_TRUE;
  366. }
  367. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--start
  368. #ifdef CONFIG_AW2015
  369. if(LED_ON_COUNT)
  370. {
  371. //pr_err("xmwuwh close LED\n");
  372. AW2015_LED_OFF();
  373. LED_ON_COUNT--;
  374. }
  375. #endif
  376. // Disable LED when DTU boot and pulg OTG by xmwuwh@20161118--end
  377. battery_log(BAT_LOG_CRTI, "[upmu_is_chr_det] Charger exist but USB is host\n");
  378. return KAL_FALSE;
  379. #else
  380. return KAL_TRUE;
  381. #endif
  382. #endif
  383. }
  384. EXPORT_SYMBOL(upmu_is_chr_det);
  385. void wake_up_bat(void)
  386. {
  387. battery_log(BAT_LOG_CRTI, "[BATTERY] wake_up_bat. \r\n");
  388. chr_wake_up_bat = KAL_TRUE;
  389. bat_routine_thread_timeout = KAL_TRUE;
  390. battery_meter_reset_sleep_time();
  391. if (!Is_In_IPOH)
  392. wake_up(&bat_routine_wq);
  393. else
  394. pending_wake_up_bat = TRUE;
  395. }
  396. EXPORT_SYMBOL(wake_up_bat);
  397. void wake_up_bat3(void)
  398. {
  399. battery_log(BAT_LOG_CRTI, "[BATTERY] wake_up_bat 3 \r\n");
  400. wake_up(&bat_routine_wq);
  401. }
  402. EXPORT_SYMBOL(wake_up_bat3);
  403. static ssize_t bat_log_write(struct file *filp, const char __user *buff, size_t len, loff_t *data)
  404. {
  405. char proc_bat_data;
  406. if ((len <= 0) || copy_from_user(&proc_bat_data, buff, 1)) {
  407. battery_log(BAT_LOG_FULL, "bat_log_write error.\n");
  408. return -EFAULT;
  409. }
  410. if (proc_bat_data == '1') {
  411. battery_log(BAT_LOG_CRTI, "enable battery driver log system\n");
  412. Enable_BATDRV_LOG = 1;
  413. } else if (proc_bat_data == '2') {
  414. battery_log(BAT_LOG_CRTI, "enable battery driver log system:2\n");
  415. Enable_BATDRV_LOG = 2;
  416. } else {
  417. battery_log(BAT_LOG_CRTI, "Disable battery driver log system\n");
  418. Enable_BATDRV_LOG = 0;
  419. }
  420. return len;
  421. }
  422. static const struct file_operations bat_proc_fops = {
  423. .write = bat_log_write,
  424. };
  425. int init_proc_log(void)
  426. {
  427. int ret = 0;
  428. #if 1
  429. proc_create("batdrv_log", 0644, NULL, &bat_proc_fops);
  430. battery_log(BAT_LOG_CRTI, "proc_create bat_proc_fops\n");
  431. #else
  432. proc_entry = create_proc_entry("batdrv_log", 0644, NULL);
  433. if (proc_entry == NULL) {
  434. ret = -ENOMEM;
  435. battery_log(BAT_LOG_FULL, "init_proc_log: Couldn't create proc entry\n");
  436. } else {
  437. proc_entry->write_proc = bat_log_write;
  438. battery_log(BAT_LOG_CRTI, "init_proc_log loaded.\n");
  439. }
  440. #endif
  441. return ret;
  442. }
  443. static int wireless_get_property(struct power_supply *psy,
  444. enum power_supply_property psp, union power_supply_propval *val)
  445. {
  446. int ret = 0;
  447. struct wireless_data *data = container_of(psy, struct wireless_data, psy);
  448. switch (psp) {
  449. case POWER_SUPPLY_PROP_ONLINE:
  450. val->intval = data->WIRELESS_ONLINE;
  451. break;
  452. default:
  453. ret = -EINVAL;
  454. break;
  455. }
  456. return ret;
  457. }
  458. static int ac_get_property(struct power_supply *psy,
  459. enum power_supply_property psp, union power_supply_propval *val)
  460. {
  461. int ret = 0;
  462. struct ac_data *data = container_of(psy, struct ac_data, psy);
  463. switch (psp) {
  464. case POWER_SUPPLY_PROP_ONLINE:
  465. val->intval = data->AC_ONLINE;
  466. break;
  467. default:
  468. ret = -EINVAL;
  469. break;
  470. }
  471. return ret;
  472. }
  473. static int usb_get_property(struct power_supply *psy,
  474. enum power_supply_property psp, union power_supply_propval *val)
  475. {
  476. int ret = 0;
  477. struct usb_data *data = container_of(psy, struct usb_data, psy);
  478. switch (psp) {
  479. case POWER_SUPPLY_PROP_ONLINE:
  480. #if defined(CONFIG_POWER_EXT)
  481. /* #if 0 */
  482. data->USB_ONLINE = 1;
  483. val->intval = data->USB_ONLINE;
  484. #else
  485. #if defined(CONFIG_MTK_POWER_EXT_DETECT)
  486. if (KAL_TRUE == bat_is_ext_power())
  487. data->USB_ONLINE = 1;
  488. #endif
  489. val->intval = data->USB_ONLINE;
  490. #endif
  491. break;
  492. default:
  493. ret = -EINVAL;
  494. break;
  495. }
  496. return ret;
  497. }
  498. static int battery_get_property(struct power_supply *psy,
  499. enum power_supply_property psp, union power_supply_propval *val)
  500. {
  501. int ret = 0;
  502. struct battery_data *data = container_of(psy, struct battery_data, psy);
  503. switch (psp) {
  504. case POWER_SUPPLY_PROP_STATUS:
  505. val->intval = data->BAT_STATUS;
  506. break;
  507. case POWER_SUPPLY_PROP_HEALTH:
  508. val->intval = data->BAT_HEALTH;
  509. break;
  510. case POWER_SUPPLY_PROP_PRESENT:
  511. val->intval = data->BAT_PRESENT;
  512. break;
  513. case POWER_SUPPLY_PROP_TECHNOLOGY:
  514. val->intval = data->BAT_TECHNOLOGY;
  515. break;
  516. case POWER_SUPPLY_PROP_CAPACITY:
  517. val->intval = data->BAT_CAPACITY;
  518. break;
  519. case POWER_SUPPLY_PROP_batt_vol:
  520. val->intval = data->BAT_batt_vol;
  521. break;
  522. case POWER_SUPPLY_PROP_batt_temp:
  523. val->intval = data->BAT_batt_temp;
  524. break;
  525. case POWER_SUPPLY_PROP_TemperatureR:
  526. val->intval = data->BAT_TemperatureR;
  527. break;
  528. case POWER_SUPPLY_PROP_TempBattVoltage:
  529. val->intval = data->BAT_TempBattVoltage;
  530. break;
  531. case POWER_SUPPLY_PROP_InstatVolt:
  532. val->intval = data->BAT_InstatVolt;
  533. break;
  534. case POWER_SUPPLY_PROP_BatteryAverageCurrent:
  535. val->intval = data->BAT_BatteryAverageCurrent;
  536. break;
  537. case POWER_SUPPLY_PROP_BatterySenseVoltage:
  538. val->intval = data->BAT_BatterySenseVoltage;
  539. break;
  540. case POWER_SUPPLY_PROP_ISenseVoltage:
  541. val->intval = data->BAT_ISenseVoltage;
  542. break;
  543. case POWER_SUPPLY_PROP_ChargerVoltage:
  544. val->intval = data->BAT_ChargerVoltage;
  545. break;
  546. /* Dual battery */
  547. case POWER_SUPPLY_PROP_status_smb:
  548. val->intval = data->status_smb;
  549. break;
  550. case POWER_SUPPLY_PROP_capacity_smb:
  551. val->intval = data->capacity_smb;
  552. break;
  553. case POWER_SUPPLY_PROP_present_smb:
  554. val->intval = data->present_smb;
  555. break;
  556. case POWER_SUPPLY_PROP_adjust_power:
  557. val->intval = data->adjust_power;
  558. break;
  559. default:
  560. ret = -EINVAL;
  561. break;
  562. }
  563. return ret;
  564. }
  565. /* wireless_data initialization */
  566. static struct wireless_data wireless_main = {
  567. .psy = {
  568. .name = "wireless",
  569. .type = POWER_SUPPLY_TYPE_WIRELESS,
  570. .properties = wireless_props,
  571. .num_properties = ARRAY_SIZE(wireless_props),
  572. .get_property = wireless_get_property,
  573. },
  574. .WIRELESS_ONLINE = 0,
  575. };
  576. /* ac_data initialization */
  577. static struct ac_data ac_main = {
  578. .psy = {
  579. .name = "ac",
  580. .type = POWER_SUPPLY_TYPE_MAINS,
  581. .properties = ac_props,
  582. .num_properties = ARRAY_SIZE(ac_props),
  583. .get_property = ac_get_property,
  584. },
  585. .AC_ONLINE = 0,
  586. };
  587. /* usb_data initialization */
  588. static struct usb_data usb_main = {
  589. .psy = {
  590. .name = "usb",
  591. .type = POWER_SUPPLY_TYPE_USB,
  592. .properties = usb_props,
  593. .num_properties = ARRAY_SIZE(usb_props),
  594. .get_property = usb_get_property,
  595. },
  596. .USB_ONLINE = 0,
  597. };
  598. /* battery_data initialization */
  599. static struct battery_data battery_main = {
  600. .psy = {
  601. .name = "battery",
  602. .type = POWER_SUPPLY_TYPE_BATTERY,
  603. .properties = battery_props,
  604. .num_properties = ARRAY_SIZE(battery_props),
  605. .get_property = battery_get_property,
  606. },
  607. /* CC: modify to have a full power supply status */
  608. #if defined(CONFIG_POWER_EXT)
  609. .BAT_STATUS = POWER_SUPPLY_STATUS_FULL,
  610. .BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD,
  611. .BAT_PRESENT = 1,
  612. .BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION,
  613. .BAT_CAPACITY = 100,
  614. .BAT_batt_vol = 4200,
  615. .BAT_batt_temp = 22,
  616. /* Dual battery */
  617. .status_smb = POWER_SUPPLY_STATUS_NOT_CHARGING,
  618. .capacity_smb = 50,
  619. .present_smb = 0,
  620. /* ADB CMD discharging */
  621. .adjust_power = -1,
  622. #else
  623. .BAT_STATUS = POWER_SUPPLY_STATUS_NOT_CHARGING,
  624. .BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD,
  625. .BAT_PRESENT = 1,
  626. .BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION,
  627. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  628. .BAT_CAPACITY = -1,
  629. #else
  630. .BAT_CAPACITY = 50,
  631. #endif
  632. .BAT_batt_vol = 0,
  633. .BAT_batt_temp = 0,
  634. /* Dual battery */
  635. .status_smb = POWER_SUPPLY_STATUS_NOT_CHARGING,
  636. .capacity_smb = 50,
  637. .present_smb = 0,
  638. /* ADB CMD discharging */
  639. .adjust_power = -1,
  640. #endif
  641. };
  642. void mt_battery_set_init_vol(int init_voltage)
  643. {
  644. BMT_status.bat_vol = init_voltage;
  645. battery_main.BAT_batt_vol = init_voltage;
  646. }
  647. #if !defined(CONFIG_POWER_EXT)
  648. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  649. /* // Create File For EM : ADC_Charger_Voltage */
  650. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  651. static ssize_t show_ADC_Charger_Voltage(struct device *dev, struct device_attribute *attr,
  652. char *buf)
  653. {
  654. battery_log(BAT_LOG_CRTI, "[EM] show_ADC_Charger_Voltage : %d\n", BMT_status.charger_vol);
  655. return sprintf(buf, "%d\n", BMT_status.charger_vol);
  656. }
  657. static ssize_t store_ADC_Charger_Voltage(struct device *dev, struct device_attribute *attr,
  658. const char *buf, size_t size)
  659. {
  660. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  661. return size;
  662. }
  663. static DEVICE_ATTR(ADC_Charger_Voltage, 0664, show_ADC_Charger_Voltage, store_ADC_Charger_Voltage);
  664. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  665. /* // Create File For EM : ADC_Channel_0_Slope */
  666. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  667. static ssize_t show_ADC_Channel_0_Slope(struct device *dev, struct device_attribute *attr,
  668. char *buf)
  669. {
  670. int ret_value = 1;
  671. ret_value = (*(adc_cali_slop + 0));
  672. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_0_Slope : %d\n", ret_value);
  673. return sprintf(buf, "%u\n", ret_value);
  674. }
  675. static ssize_t store_ADC_Channel_0_Slope(struct device *dev, struct device_attribute *attr,
  676. const char *buf, size_t size)
  677. {
  678. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  679. return size;
  680. }
  681. static DEVICE_ATTR(ADC_Channel_0_Slope, 0664, show_ADC_Channel_0_Slope, store_ADC_Channel_0_Slope);
  682. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  683. /* // Create File For EM : ADC_Channel_1_Slope */
  684. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  685. static ssize_t show_ADC_Channel_1_Slope(struct device *dev, struct device_attribute *attr,
  686. char *buf)
  687. {
  688. int ret_value = 1;
  689. ret_value = (*(adc_cali_slop + 1));
  690. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_1_Slope : %d\n", ret_value);
  691. return sprintf(buf, "%u\n", ret_value);
  692. }
  693. static ssize_t store_ADC_Channel_1_Slope(struct device *dev, struct device_attribute *attr,
  694. const char *buf, size_t size)
  695. {
  696. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  697. return size;
  698. }
  699. static DEVICE_ATTR(ADC_Channel_1_Slope, 0664, show_ADC_Channel_1_Slope, store_ADC_Channel_1_Slope);
  700. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  701. /* // Create File For EM : ADC_Channel_2_Slope */
  702. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  703. static ssize_t show_ADC_Channel_2_Slope(struct device *dev, struct device_attribute *attr,
  704. char *buf)
  705. {
  706. int ret_value = 1;
  707. ret_value = (*(adc_cali_slop + 2));
  708. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_2_Slope : %d\n", ret_value);
  709. return sprintf(buf, "%u\n", ret_value);
  710. }
  711. static ssize_t store_ADC_Channel_2_Slope(struct device *dev, struct device_attribute *attr,
  712. const char *buf, size_t size)
  713. {
  714. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  715. return size;
  716. }
  717. static DEVICE_ATTR(ADC_Channel_2_Slope, 0664, show_ADC_Channel_2_Slope, store_ADC_Channel_2_Slope);
  718. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  719. /* // Create File For EM : ADC_Channel_3_Slope */
  720. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  721. static ssize_t show_ADC_Channel_3_Slope(struct device *dev, struct device_attribute *attr,
  722. char *buf)
  723. {
  724. int ret_value = 1;
  725. ret_value = (*(adc_cali_slop + 3));
  726. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_3_Slope : %d\n", ret_value);
  727. return sprintf(buf, "%u\n", ret_value);
  728. }
  729. static ssize_t store_ADC_Channel_3_Slope(struct device *dev, struct device_attribute *attr,
  730. const char *buf, size_t size)
  731. {
  732. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  733. return size;
  734. }
  735. static DEVICE_ATTR(ADC_Channel_3_Slope, 0664, show_ADC_Channel_3_Slope, store_ADC_Channel_3_Slope);
  736. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  737. /* // Create File For EM : ADC_Channel_4_Slope */
  738. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  739. static ssize_t show_ADC_Channel_4_Slope(struct device *dev, struct device_attribute *attr,
  740. char *buf)
  741. {
  742. int ret_value = 1;
  743. ret_value = (*(adc_cali_slop + 4));
  744. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_4_Slope : %d\n", ret_value);
  745. return sprintf(buf, "%u\n", ret_value);
  746. }
  747. static ssize_t store_ADC_Channel_4_Slope(struct device *dev, struct device_attribute *attr,
  748. const char *buf, size_t size)
  749. {
  750. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  751. return size;
  752. }
  753. static DEVICE_ATTR(ADC_Channel_4_Slope, 0664, show_ADC_Channel_4_Slope, store_ADC_Channel_4_Slope);
  754. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  755. /* // Create File For EM : ADC_Channel_5_Slope */
  756. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  757. static ssize_t show_ADC_Channel_5_Slope(struct device *dev, struct device_attribute *attr,
  758. char *buf)
  759. {
  760. int ret_value = 1;
  761. ret_value = (*(adc_cali_slop + 5));
  762. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_5_Slope : %d\n", ret_value);
  763. return sprintf(buf, "%u\n", ret_value);
  764. }
  765. static ssize_t store_ADC_Channel_5_Slope(struct device *dev, struct device_attribute *attr,
  766. const char *buf, size_t size)
  767. {
  768. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  769. return size;
  770. }
  771. static DEVICE_ATTR(ADC_Channel_5_Slope, 0664, show_ADC_Channel_5_Slope, store_ADC_Channel_5_Slope);
  772. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  773. /* // Create File For EM : ADC_Channel_6_Slope */
  774. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  775. static ssize_t show_ADC_Channel_6_Slope(struct device *dev, struct device_attribute *attr,
  776. char *buf)
  777. {
  778. int ret_value = 1;
  779. ret_value = (*(adc_cali_slop + 6));
  780. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_6_Slope : %d\n", ret_value);
  781. return sprintf(buf, "%u\n", ret_value);
  782. }
  783. static ssize_t store_ADC_Channel_6_Slope(struct device *dev, struct device_attribute *attr,
  784. const char *buf, size_t size)
  785. {
  786. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  787. return size;
  788. }
  789. static DEVICE_ATTR(ADC_Channel_6_Slope, 0664, show_ADC_Channel_6_Slope, store_ADC_Channel_6_Slope);
  790. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  791. /* // Create File For EM : ADC_Channel_7_Slope */
  792. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  793. static ssize_t show_ADC_Channel_7_Slope(struct device *dev, struct device_attribute *attr,
  794. char *buf)
  795. {
  796. int ret_value = 1;
  797. ret_value = (*(adc_cali_slop + 7));
  798. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_7_Slope : %d\n", ret_value);
  799. return sprintf(buf, "%u\n", ret_value);
  800. }
  801. static ssize_t store_ADC_Channel_7_Slope(struct device *dev, struct device_attribute *attr,
  802. const char *buf, size_t size)
  803. {
  804. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  805. return size;
  806. }
  807. static DEVICE_ATTR(ADC_Channel_7_Slope, 0664, show_ADC_Channel_7_Slope, store_ADC_Channel_7_Slope);
  808. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  809. /* // Create File For EM : ADC_Channel_8_Slope */
  810. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  811. static ssize_t show_ADC_Channel_8_Slope(struct device *dev, struct device_attribute *attr,
  812. char *buf)
  813. {
  814. int ret_value = 1;
  815. ret_value = (*(adc_cali_slop + 8));
  816. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_8_Slope : %d\n", ret_value);
  817. return sprintf(buf, "%u\n", ret_value);
  818. }
  819. static ssize_t store_ADC_Channel_8_Slope(struct device *dev, struct device_attribute *attr,
  820. const char *buf, size_t size)
  821. {
  822. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  823. return size;
  824. }
  825. static DEVICE_ATTR(ADC_Channel_8_Slope, 0664, show_ADC_Channel_8_Slope, store_ADC_Channel_8_Slope);
  826. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  827. /* // Create File For EM : ADC_Channel_9_Slope */
  828. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  829. static ssize_t show_ADC_Channel_9_Slope(struct device *dev, struct device_attribute *attr,
  830. char *buf)
  831. {
  832. int ret_value = 1;
  833. ret_value = (*(adc_cali_slop + 9));
  834. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_9_Slope : %d\n", ret_value);
  835. return sprintf(buf, "%u\n", ret_value);
  836. }
  837. static ssize_t store_ADC_Channel_9_Slope(struct device *dev, struct device_attribute *attr,
  838. const char *buf, size_t size)
  839. {
  840. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  841. return size;
  842. }
  843. static DEVICE_ATTR(ADC_Channel_9_Slope, 0664, show_ADC_Channel_9_Slope, store_ADC_Channel_9_Slope);
  844. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  845. /* // Create File For EM : ADC_Channel_10_Slope */
  846. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  847. static ssize_t show_ADC_Channel_10_Slope(struct device *dev, struct device_attribute *attr,
  848. char *buf)
  849. {
  850. int ret_value = 1;
  851. ret_value = (*(adc_cali_slop + 10));
  852. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_10_Slope : %d\n", ret_value);
  853. return sprintf(buf, "%u\n", ret_value);
  854. }
  855. static ssize_t store_ADC_Channel_10_Slope(struct device *dev, struct device_attribute *attr,
  856. const char *buf, size_t size)
  857. {
  858. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  859. return size;
  860. }
  861. static DEVICE_ATTR(ADC_Channel_10_Slope, 0664, show_ADC_Channel_10_Slope,
  862. store_ADC_Channel_10_Slope);
  863. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  864. /* // Create File For EM : ADC_Channel_11_Slope */
  865. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  866. static ssize_t show_ADC_Channel_11_Slope(struct device *dev, struct device_attribute *attr,
  867. char *buf)
  868. {
  869. int ret_value = 1;
  870. ret_value = (*(adc_cali_slop + 11));
  871. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_11_Slope : %d\n", ret_value);
  872. return sprintf(buf, "%u\n", ret_value);
  873. }
  874. static ssize_t store_ADC_Channel_11_Slope(struct device *dev, struct device_attribute *attr,
  875. const char *buf, size_t size)
  876. {
  877. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  878. return size;
  879. }
  880. static DEVICE_ATTR(ADC_Channel_11_Slope, 0664, show_ADC_Channel_11_Slope,
  881. store_ADC_Channel_11_Slope);
  882. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  883. /* // Create File For EM : ADC_Channel_12_Slope */
  884. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  885. static ssize_t show_ADC_Channel_12_Slope(struct device *dev, struct device_attribute *attr,
  886. char *buf)
  887. {
  888. int ret_value = 1;
  889. ret_value = (*(adc_cali_slop + 12));
  890. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_12_Slope : %d\n", ret_value);
  891. return sprintf(buf, "%u\n", ret_value);
  892. }
  893. static ssize_t store_ADC_Channel_12_Slope(struct device *dev, struct device_attribute *attr,
  894. const char *buf, size_t size)
  895. {
  896. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  897. return size;
  898. }
  899. static DEVICE_ATTR(ADC_Channel_12_Slope, 0664, show_ADC_Channel_12_Slope,
  900. store_ADC_Channel_12_Slope);
  901. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  902. /* // Create File For EM : ADC_Channel_13_Slope */
  903. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  904. static ssize_t show_ADC_Channel_13_Slope(struct device *dev, struct device_attribute *attr,
  905. char *buf)
  906. {
  907. int ret_value = 1;
  908. ret_value = (*(adc_cali_slop + 13));
  909. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_13_Slope : %d\n", ret_value);
  910. return sprintf(buf, "%u\n", ret_value);
  911. }
  912. static ssize_t store_ADC_Channel_13_Slope(struct device *dev, struct device_attribute *attr,
  913. const char *buf, size_t size)
  914. {
  915. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  916. return size;
  917. }
  918. static DEVICE_ATTR(ADC_Channel_13_Slope, 0664, show_ADC_Channel_13_Slope,
  919. store_ADC_Channel_13_Slope);
  920. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  921. /* // Create File For EM : ADC_Channel_0_Offset */
  922. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  923. static ssize_t show_ADC_Channel_0_Offset(struct device *dev, struct device_attribute *attr,
  924. char *buf)
  925. {
  926. int ret_value = 1;
  927. ret_value = (*(adc_cali_offset + 0));
  928. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_0_Offset : %d\n", ret_value);
  929. return sprintf(buf, "%u\n", ret_value);
  930. }
  931. static ssize_t store_ADC_Channel_0_Offset(struct device *dev, struct device_attribute *attr,
  932. const char *buf, size_t size)
  933. {
  934. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  935. return size;
  936. }
  937. static DEVICE_ATTR(ADC_Channel_0_Offset, 0664, show_ADC_Channel_0_Offset,
  938. store_ADC_Channel_0_Offset);
  939. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  940. /* // Create File For EM : ADC_Channel_1_Offset */
  941. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  942. static ssize_t show_ADC_Channel_1_Offset(struct device *dev, struct device_attribute *attr,
  943. char *buf)
  944. {
  945. int ret_value = 1;
  946. ret_value = (*(adc_cali_offset + 1));
  947. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_1_Offset : %d\n", ret_value);
  948. return sprintf(buf, "%u\n", ret_value);
  949. }
  950. static ssize_t store_ADC_Channel_1_Offset(struct device *dev, struct device_attribute *attr,
  951. const char *buf, size_t size)
  952. {
  953. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  954. return size;
  955. }
  956. static DEVICE_ATTR(ADC_Channel_1_Offset, 0664, show_ADC_Channel_1_Offset,
  957. store_ADC_Channel_1_Offset);
  958. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  959. /* // Create File For EM : ADC_Channel_2_Offset */
  960. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  961. static ssize_t show_ADC_Channel_2_Offset(struct device *dev, struct device_attribute *attr,
  962. char *buf)
  963. {
  964. int ret_value = 1;
  965. ret_value = (*(adc_cali_offset + 2));
  966. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_2_Offset : %d\n", ret_value);
  967. return sprintf(buf, "%u\n", ret_value);
  968. }
  969. static ssize_t store_ADC_Channel_2_Offset(struct device *dev, struct device_attribute *attr,
  970. const char *buf, size_t size)
  971. {
  972. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  973. return size;
  974. }
  975. static DEVICE_ATTR(ADC_Channel_2_Offset, 0664, show_ADC_Channel_2_Offset,
  976. store_ADC_Channel_2_Offset);
  977. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  978. /* // Create File For EM : ADC_Channel_3_Offset */
  979. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  980. static ssize_t show_ADC_Channel_3_Offset(struct device *dev, struct device_attribute *attr,
  981. char *buf)
  982. {
  983. int ret_value = 1;
  984. ret_value = (*(adc_cali_offset + 3));
  985. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_3_Offset : %d\n", ret_value);
  986. return sprintf(buf, "%u\n", ret_value);
  987. }
  988. static ssize_t store_ADC_Channel_3_Offset(struct device *dev, struct device_attribute *attr,
  989. const char *buf, size_t size)
  990. {
  991. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  992. return size;
  993. }
  994. static DEVICE_ATTR(ADC_Channel_3_Offset, 0664, show_ADC_Channel_3_Offset,
  995. store_ADC_Channel_3_Offset);
  996. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  997. /* // Create File For EM : ADC_Channel_4_Offset */
  998. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  999. static ssize_t show_ADC_Channel_4_Offset(struct device *dev, struct device_attribute *attr,
  1000. char *buf)
  1001. {
  1002. int ret_value = 1;
  1003. ret_value = (*(adc_cali_offset + 4));
  1004. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_4_Offset : %d\n", ret_value);
  1005. return sprintf(buf, "%u\n", ret_value);
  1006. }
  1007. static ssize_t store_ADC_Channel_4_Offset(struct device *dev, struct device_attribute *attr,
  1008. const char *buf, size_t size)
  1009. {
  1010. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1011. return size;
  1012. }
  1013. static DEVICE_ATTR(ADC_Channel_4_Offset, 0664, show_ADC_Channel_4_Offset,
  1014. store_ADC_Channel_4_Offset);
  1015. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1016. /* // Create File For EM : ADC_Channel_5_Offset */
  1017. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1018. static ssize_t show_ADC_Channel_5_Offset(struct device *dev, struct device_attribute *attr,
  1019. char *buf)
  1020. {
  1021. int ret_value = 1;
  1022. ret_value = (*(adc_cali_offset + 5));
  1023. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_5_Offset : %d\n", ret_value);
  1024. return sprintf(buf, "%u\n", ret_value);
  1025. }
  1026. static ssize_t store_ADC_Channel_5_Offset(struct device *dev, struct device_attribute *attr,
  1027. const char *buf, size_t size)
  1028. {
  1029. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1030. return size;
  1031. }
  1032. static DEVICE_ATTR(ADC_Channel_5_Offset, 0664, show_ADC_Channel_5_Offset,
  1033. store_ADC_Channel_5_Offset);
  1034. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1035. /* // Create File For EM : ADC_Channel_6_Offset */
  1036. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1037. static ssize_t show_ADC_Channel_6_Offset(struct device *dev, struct device_attribute *attr,
  1038. char *buf)
  1039. {
  1040. int ret_value = 1;
  1041. ret_value = (*(adc_cali_offset + 6));
  1042. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_6_Offset : %d\n", ret_value);
  1043. return sprintf(buf, "%u\n", ret_value);
  1044. }
  1045. static ssize_t store_ADC_Channel_6_Offset(struct device *dev, struct device_attribute *attr,
  1046. const char *buf, size_t size)
  1047. {
  1048. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1049. return size;
  1050. }
  1051. static DEVICE_ATTR(ADC_Channel_6_Offset, 0664, show_ADC_Channel_6_Offset,
  1052. store_ADC_Channel_6_Offset);
  1053. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1054. /* // Create File For EM : ADC_Channel_7_Offset */
  1055. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1056. static ssize_t show_ADC_Channel_7_Offset(struct device *dev, struct device_attribute *attr,
  1057. char *buf)
  1058. {
  1059. int ret_value = 1;
  1060. ret_value = (*(adc_cali_offset + 7));
  1061. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_7_Offset : %d\n", ret_value);
  1062. return sprintf(buf, "%u\n", ret_value);
  1063. }
  1064. static ssize_t store_ADC_Channel_7_Offset(struct device *dev, struct device_attribute *attr,
  1065. const char *buf, size_t size)
  1066. {
  1067. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1068. return size;
  1069. }
  1070. static DEVICE_ATTR(ADC_Channel_7_Offset, 0664, show_ADC_Channel_7_Offset,
  1071. store_ADC_Channel_7_Offset);
  1072. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1073. /* // Create File For EM : ADC_Channel_8_Offset */
  1074. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1075. static ssize_t show_ADC_Channel_8_Offset(struct device *dev, struct device_attribute *attr,
  1076. char *buf)
  1077. {
  1078. int ret_value = 1;
  1079. ret_value = (*(adc_cali_offset + 8));
  1080. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_8_Offset : %d\n", ret_value);
  1081. return sprintf(buf, "%u\n", ret_value);
  1082. }
  1083. static ssize_t store_ADC_Channel_8_Offset(struct device *dev, struct device_attribute *attr,
  1084. const char *buf, size_t size)
  1085. {
  1086. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1087. return size;
  1088. }
  1089. static DEVICE_ATTR(ADC_Channel_8_Offset, 0664, show_ADC_Channel_8_Offset,
  1090. store_ADC_Channel_8_Offset);
  1091. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1092. /* // Create File For EM : ADC_Channel_9_Offset */
  1093. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1094. static ssize_t show_ADC_Channel_9_Offset(struct device *dev, struct device_attribute *attr,
  1095. char *buf)
  1096. {
  1097. int ret_value = 1;
  1098. ret_value = (*(adc_cali_offset + 9));
  1099. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_9_Offset : %d\n", ret_value);
  1100. return sprintf(buf, "%u\n", ret_value);
  1101. }
  1102. static ssize_t store_ADC_Channel_9_Offset(struct device *dev, struct device_attribute *attr,
  1103. const char *buf, size_t size)
  1104. {
  1105. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1106. return size;
  1107. }
  1108. static DEVICE_ATTR(ADC_Channel_9_Offset, 0664, show_ADC_Channel_9_Offset,
  1109. store_ADC_Channel_9_Offset);
  1110. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1111. /* // Create File For EM : ADC_Channel_10_Offset */
  1112. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1113. static ssize_t show_ADC_Channel_10_Offset(struct device *dev, struct device_attribute *attr,
  1114. char *buf)
  1115. {
  1116. int ret_value = 1;
  1117. ret_value = (*(adc_cali_offset + 10));
  1118. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_10_Offset : %d\n", ret_value);
  1119. return sprintf(buf, "%u\n", ret_value);
  1120. }
  1121. static ssize_t store_ADC_Channel_10_Offset(struct device *dev, struct device_attribute *attr,
  1122. const char *buf, size_t size)
  1123. {
  1124. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1125. return size;
  1126. }
  1127. static DEVICE_ATTR(ADC_Channel_10_Offset, 0664, show_ADC_Channel_10_Offset,
  1128. store_ADC_Channel_10_Offset);
  1129. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1130. /* // Create File For EM : ADC_Channel_11_Offset */
  1131. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1132. static ssize_t show_ADC_Channel_11_Offset(struct device *dev, struct device_attribute *attr,
  1133. char *buf)
  1134. {
  1135. int ret_value = 1;
  1136. ret_value = (*(adc_cali_offset + 11));
  1137. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_11_Offset : %d\n", ret_value);
  1138. return sprintf(buf, "%u\n", ret_value);
  1139. }
  1140. static ssize_t store_ADC_Channel_11_Offset(struct device *dev, struct device_attribute *attr,
  1141. const char *buf, size_t size)
  1142. {
  1143. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1144. return size;
  1145. }
  1146. static DEVICE_ATTR(ADC_Channel_11_Offset, 0664, show_ADC_Channel_11_Offset,
  1147. store_ADC_Channel_11_Offset);
  1148. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1149. /* // Create File For EM : ADC_Channel_12_Offset */
  1150. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1151. static ssize_t show_ADC_Channel_12_Offset(struct device *dev, struct device_attribute *attr,
  1152. char *buf)
  1153. {
  1154. int ret_value = 1;
  1155. ret_value = (*(adc_cali_offset + 12));
  1156. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_12_Offset : %d\n", ret_value);
  1157. return sprintf(buf, "%u\n", ret_value);
  1158. }
  1159. static ssize_t store_ADC_Channel_12_Offset(struct device *dev, struct device_attribute *attr,
  1160. const char *buf, size_t size)
  1161. {
  1162. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1163. return size;
  1164. }
  1165. static DEVICE_ATTR(ADC_Channel_12_Offset, 0664, show_ADC_Channel_12_Offset,
  1166. store_ADC_Channel_12_Offset);
  1167. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1168. /* // Create File For EM : ADC_Channel_13_Offset */
  1169. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1170. static ssize_t show_ADC_Channel_13_Offset(struct device *dev, struct device_attribute *attr,
  1171. char *buf)
  1172. {
  1173. int ret_value = 1;
  1174. ret_value = (*(adc_cali_offset + 13));
  1175. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_13_Offset : %d\n", ret_value);
  1176. return sprintf(buf, "%u\n", ret_value);
  1177. }
  1178. static ssize_t store_ADC_Channel_13_Offset(struct device *dev, struct device_attribute *attr,
  1179. const char *buf, size_t size)
  1180. {
  1181. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1182. return size;
  1183. }
  1184. static DEVICE_ATTR(ADC_Channel_13_Offset, 0664, show_ADC_Channel_13_Offset,
  1185. store_ADC_Channel_13_Offset);
  1186. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1187. /* // Create File For EM : ADC_Channel_Is_Calibration */
  1188. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1189. static ssize_t show_ADC_Channel_Is_Calibration(struct device *dev, struct device_attribute *attr,
  1190. char *buf)
  1191. {
  1192. int ret_value = 2;
  1193. ret_value = g_ADC_Cali;
  1194. battery_log(BAT_LOG_CRTI, "[EM] ADC_Channel_Is_Calibration : %d\n", ret_value);
  1195. return sprintf(buf, "%u\n", ret_value);
  1196. }
  1197. static ssize_t store_ADC_Channel_Is_Calibration(struct device *dev, struct device_attribute *attr,
  1198. const char *buf, size_t size)
  1199. {
  1200. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1201. return size;
  1202. }
  1203. static DEVICE_ATTR(ADC_Channel_Is_Calibration, 0664, show_ADC_Channel_Is_Calibration,
  1204. store_ADC_Channel_Is_Calibration);
  1205. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1206. /* // Create File For EM : Power_On_Voltage */
  1207. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1208. static ssize_t show_Power_On_Voltage(struct device *dev, struct device_attribute *attr, char *buf)
  1209. {
  1210. int ret_value = 1;
  1211. ret_value = 3400;
  1212. battery_log(BAT_LOG_CRTI, "[EM] Power_On_Voltage : %d\n", ret_value);
  1213. return sprintf(buf, "%u\n", ret_value);
  1214. }
  1215. static ssize_t store_Power_On_Voltage(struct device *dev, struct device_attribute *attr,
  1216. const char *buf, size_t size)
  1217. {
  1218. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1219. return size;
  1220. }
  1221. static DEVICE_ATTR(Power_On_Voltage, 0664, show_Power_On_Voltage, store_Power_On_Voltage);
  1222. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1223. /* // Create File For EM : Power_Off_Voltage */
  1224. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1225. static ssize_t show_Power_Off_Voltage(struct device *dev, struct device_attribute *attr, char *buf)
  1226. {
  1227. int ret_value = 1;
  1228. ret_value = 3400;
  1229. battery_log(BAT_LOG_CRTI, "[EM] Power_Off_Voltage : %d\n", ret_value);
  1230. return sprintf(buf, "%u\n", ret_value);
  1231. }
  1232. static ssize_t store_Power_Off_Voltage(struct device *dev, struct device_attribute *attr,
  1233. const char *buf, size_t size)
  1234. {
  1235. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1236. return size;
  1237. }
  1238. static DEVICE_ATTR(Power_Off_Voltage, 0664, show_Power_Off_Voltage, store_Power_Off_Voltage);
  1239. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1240. /* // Create File For EM : Charger_TopOff_Value */
  1241. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1242. static ssize_t show_Charger_TopOff_Value(struct device *dev, struct device_attribute *attr,
  1243. char *buf)
  1244. {
  1245. int ret_value = 1;
  1246. ret_value = 4110;
  1247. battery_log(BAT_LOG_CRTI, "[EM] Charger_TopOff_Value : %d\n", ret_value);
  1248. return sprintf(buf, "%u\n", ret_value);
  1249. }
  1250. static ssize_t store_Charger_TopOff_Value(struct device *dev, struct device_attribute *attr,
  1251. const char *buf, size_t size)
  1252. {
  1253. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1254. return size;
  1255. }
  1256. static DEVICE_ATTR(Charger_TopOff_Value, 0664, show_Charger_TopOff_Value,
  1257. store_Charger_TopOff_Value);
  1258. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1259. /* // Create File For EM : FG_Battery_CurrentConsumption */
  1260. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1261. static ssize_t show_FG_Battery_CurrentConsumption(struct device *dev, struct device_attribute *attr,
  1262. char *buf)
  1263. {
  1264. int ret_value = 8888;
  1265. ret_value = battery_meter_get_battery_current();
  1266. battery_log(BAT_LOG_CRTI, "[EM] FG_Battery_CurrentConsumption : %d/10 mA\n", ret_value);
  1267. return sprintf(buf, "%u\n", ret_value);
  1268. }
  1269. static ssize_t store_FG_Battery_CurrentConsumption(struct device *dev,
  1270. struct device_attribute *attr, const char *buf,
  1271. size_t size)
  1272. {
  1273. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1274. return size;
  1275. }
  1276. static DEVICE_ATTR(FG_Battery_CurrentConsumption, 0664, show_FG_Battery_CurrentConsumption,
  1277. store_FG_Battery_CurrentConsumption);
  1278. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1279. /* // Create File For EM : FG_SW_CoulombCounter */
  1280. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1281. static ssize_t show_FG_SW_CoulombCounter(struct device *dev, struct device_attribute *attr,
  1282. char *buf)
  1283. {
  1284. signed int ret_value = 7777;
  1285. ret_value = battery_meter_get_car();
  1286. battery_log(BAT_LOG_CRTI, "[EM] FG_SW_CoulombCounter : %d\n", ret_value);
  1287. return sprintf(buf, "%u\n", ret_value);
  1288. }
  1289. static ssize_t store_FG_SW_CoulombCounter(struct device *dev, struct device_attribute *attr,
  1290. const char *buf, size_t size)
  1291. {
  1292. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1293. return size;
  1294. }
  1295. static DEVICE_ATTR(FG_SW_CoulombCounter, 0664, show_FG_SW_CoulombCounter,
  1296. store_FG_SW_CoulombCounter);
  1297. static ssize_t show_Charging_CallState(struct device *dev, struct device_attribute *attr, char *buf)
  1298. {
  1299. battery_log(BAT_LOG_CRTI, "call state = %d\n", g_call_state);
  1300. return sprintf(buf, "%u\n", g_call_state);
  1301. }
  1302. static ssize_t store_Charging_CallState(struct device *dev, struct device_attribute *attr,
  1303. const char *buf, size_t size)
  1304. {
  1305. if (kstrtouint(buf, 10, &g_call_state) == 0) {
  1306. battery_log(BAT_LOG_CRTI, "call state = %d\n", g_call_state);
  1307. return size;
  1308. }
  1309. /* hidden else, for sscanf format error */
  1310. {
  1311. battery_log(BAT_LOG_CRTI, " bad argument, echo [enable] > current_cmd\n");
  1312. }
  1313. return 0;
  1314. }
  1315. static DEVICE_ATTR(Charging_CallState, 0664, show_Charging_CallState, store_Charging_CallState);
  1316. static ssize_t show_Charger_Type(struct device *dev, struct device_attribute *attr, char *buf)
  1317. {
  1318. unsigned int chr_ype = CHARGER_UNKNOWN;
  1319. chr_ype = BMT_status.charger_exist ? BMT_status.charger_type : CHARGER_UNKNOWN;
  1320. battery_log(BAT_LOG_CRTI, "CHARGER_TYPE = %d\n", chr_ype);
  1321. return sprintf(buf, "%u\n", chr_ype);
  1322. }
  1323. static ssize_t store_Charger_Type(struct device *dev, struct device_attribute *attr,
  1324. const char *buf, size_t size)
  1325. {
  1326. battery_log(BAT_LOG_CRTI, "[EM] Not Support Write Function\n");
  1327. return size;
  1328. }
  1329. static DEVICE_ATTR(Charger_Type, 0664, show_Charger_Type, store_Charger_Type);
  1330. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  1331. static ssize_t show_Pump_Express(struct device *dev, struct device_attribute *attr, char *buf)
  1332. {
  1333. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  1334. int icount = 20; /* max debouncing time 20 * 0.2 sec */
  1335. if (KAL_TRUE == ta_check_chr_type &&
  1336. STANDARD_CHARGER == BMT_status.charger_type &&
  1337. #if defined(CONFIG_MTK_HAFG_20)
  1338. BMT_status.UI_SOC2 >= TA_START_BATTERY_SOC &&
  1339. BMT_status.UI_SOC2 < TA_STOP_BATTERY_SOC)
  1340. #else
  1341. BMT_status.SOC >= TA_START_BATTERY_SOC &&
  1342. BMT_status.SOC < TA_STOP_BATTERY_SOC)
  1343. #endif
  1344. {
  1345. battery_log(BAT_LOG_CRTI, "[%s]Wait for PE detection\n", __func__);
  1346. do {
  1347. icount--;
  1348. msleep(200);
  1349. } while (icount && ta_check_chr_type);
  1350. }
  1351. #endif
  1352. battery_log(BAT_LOG_CRTI, "Pump express = %d\n", is_ta_connect);
  1353. return sprintf(buf, "%u\n", is_ta_connect);
  1354. }
  1355. static ssize_t store_Pump_Express(struct device *dev, struct device_attribute *attr,
  1356. const char *buf, size_t size)
  1357. {
  1358. unsigned int val;
  1359. if (kstrtouint(buf, 10, &val) == 0) {
  1360. is_ta_connect = val;
  1361. battery_log(BAT_LOG_CRTI, "Pump express= %d\n", is_ta_connect);
  1362. return size;
  1363. }
  1364. /* hidden else, for sscanf format error */
  1365. {
  1366. battery_log(BAT_LOG_CRTI, " bad argument, echo [enable] > current_cmd\n");
  1367. }
  1368. return 0;
  1369. }
  1370. static DEVICE_ATTR(Pump_Express, 0664, show_Pump_Express, store_Pump_Express);
  1371. #endif
  1372. static void mt_battery_update_EM(struct battery_data *bat_data)
  1373. {
  1374. bat_data->BAT_CAPACITY = BMT_status.UI_SOC2;
  1375. bat_data->BAT_TemperatureR = BMT_status.temperatureR; /* API */
  1376. bat_data->BAT_TempBattVoltage = BMT_status.temperatureV; /* API */
  1377. bat_data->BAT_InstatVolt = BMT_status.bat_vol; /* VBAT */
  1378. bat_data->BAT_BatteryAverageCurrent = BMT_status.ICharging;
  1379. bat_data->BAT_BatterySenseVoltage = BMT_status.bat_vol;
  1380. bat_data->BAT_ISenseVoltage = BMT_status.Vsense; /* API */
  1381. bat_data->BAT_ChargerVoltage = BMT_status.charger_vol;
  1382. /* Dual battery */
  1383. bat_data->status_smb = g_status_smb;
  1384. bat_data->capacity_smb = g_capacity_smb;
  1385. bat_data->present_smb = g_present_smb;
  1386. battery_log(BAT_LOG_FULL, "status_smb = %d, capacity_smb = %d, present_smb = %d\n",
  1387. bat_data->status_smb, bat_data->capacity_smb, bat_data->present_smb);
  1388. if ((BMT_status.UI_SOC2 == 100) && (BMT_status.charger_exist == KAL_TRUE))
  1389. bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_FULL;
  1390. #ifdef CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION
  1391. if (bat_data->BAT_CAPACITY <= 0)
  1392. bat_data->BAT_CAPACITY = 1;
  1393. battery_log(BAT_LOG_CRTI,
  1394. "BAT_CAPACITY=1, due to define CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION\r\n");
  1395. #endif
  1396. }
  1397. static void battery_update(struct battery_data *bat_data)
  1398. {
  1399. struct power_supply *bat_psy = &bat_data->psy;
  1400. static unsigned int shutdown_cnt = 0xBADDCAFE;
  1401. static unsigned int shutdown_cnt_chr = 0xBADDCAFE;
  1402. if (shutdown_cnt == 0xBADDCAFE)
  1403. shutdown_cnt = 0;
  1404. if (shutdown_cnt_chr == 0xBADDCAFE)
  1405. shutdown_cnt_chr = 0;
  1406. bat_data->BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION;
  1407. bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD;
  1408. bat_data->BAT_batt_vol = BMT_status.bat_vol;
  1409. bat_data->BAT_batt_temp = BMT_status.temperature * 10;
  1410. bat_data->BAT_PRESENT = BMT_status.bat_exist;
  1411. if ((BMT_status.charger_exist == KAL_TRUE) && (BMT_status.bat_charging_state != CHR_ERROR)) {
  1412. if (BMT_status.bat_exist) {
  1413. bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_CHARGING;
  1414. } else {
  1415. /* No Battery, Only Charger */
  1416. bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_UNKNOWN;
  1417. }
  1418. } else {
  1419. /* Only Battery */
  1420. bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_NOT_CHARGING;
  1421. }
  1422. mt_battery_update_EM(bat_data);
  1423. if (cmd_discharging == 1)
  1424. bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_CMD_DISCHARGING;
  1425. if (adjust_power != -1) {
  1426. bat_data->adjust_power = adjust_power;
  1427. battery_log(BAT_LOG_CRTI, "adjust_power=(%d)\n", adjust_power);
  1428. }
  1429. battery_log(BAT_LOG_CRTI,
  1430. "[kernel][battery_update] SOC %d,UI_SOC2 %d, status %d\n",
  1431. BMT_status.SOC, BMT_status.UI_SOC2, bat_data->BAT_STATUS);
  1432. #ifdef DLPT_POWER_OFF_EN
  1433. #ifndef DISABLE_DLPT_FEATURE
  1434. if (bat_data->BAT_CAPACITY <= DLPT_POWER_OFF_THD) {
  1435. static unsigned char cnt = 0xff;
  1436. if (cnt == 0xff)
  1437. cnt = 0;
  1438. battery_log(BAT_LOG_CRTI, "[DLPT_POWER_OFF_EN] run\n");
  1439. if (dlpt_check_power_off() == 1) {
  1440. bat_data->BAT_CAPACITY = 0;
  1441. BMT_status.UI_SOC2 = 0;
  1442. cnt++;
  1443. battery_log(BAT_LOG_CRTI,
  1444. "[DLPT_POWER_OFF_EN] SOC=%d to power off , cnt=%d\n",
  1445. bat_data->BAT_CAPACITY, cnt);
  1446. if (cnt >= 4)
  1447. kernel_restart("DLPT reboot system");
  1448. } else {
  1449. cnt = 0;
  1450. }
  1451. } else {
  1452. battery_log(BAT_LOG_CRTI, "[DLPT_POWER_OFF_EN] disable(%d)\n",
  1453. bat_data->BAT_CAPACITY);
  1454. }
  1455. #endif
  1456. #endif
  1457. power_supply_changed(bat_psy);
  1458. }
  1459. void update_charger_info(int wireless_state)
  1460. {
  1461. #if defined(CONFIG_POWER_VERIFY)
  1462. battery_log(BAT_LOG_CRTI, "[update_charger_info] no support\n");
  1463. #else
  1464. g_wireless_state = wireless_state;
  1465. battery_log(BAT_LOG_CRTI, "[update_charger_info] get wireless_state=%d\n", wireless_state);
  1466. wake_up_bat();
  1467. #endif
  1468. }
  1469. static void wireless_update(struct wireless_data *wireless_data)
  1470. {
  1471. static int wireless_status = -1;
  1472. struct power_supply *wireless_psy = &wireless_data->psy;
  1473. if (BMT_status.charger_exist == KAL_TRUE || g_wireless_state) {
  1474. if ((BMT_status.charger_type == WIRELESS_CHARGER) || g_wireless_state) {
  1475. wireless_data->WIRELESS_ONLINE = 1;
  1476. wireless_psy->type = POWER_SUPPLY_TYPE_WIRELESS;
  1477. } else {
  1478. wireless_data->WIRELESS_ONLINE = 0;
  1479. }
  1480. } else {
  1481. wireless_data->WIRELESS_ONLINE = 0;
  1482. }
  1483. if (wireless_status != wireless_data->WIRELESS_ONLINE) {
  1484. wireless_status = wireless_data->WIRELESS_ONLINE;
  1485. power_supply_changed(wireless_psy);
  1486. }
  1487. }
  1488. static void ac_update(struct ac_data *ac_data)
  1489. {
  1490. static int ac_status = -1;
  1491. struct power_supply *ac_psy = &ac_data->psy;
  1492. if (BMT_status.charger_exist == KAL_TRUE) {
  1493. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  1494. if ((BMT_status.charger_type == NONSTANDARD_CHARGER) ||
  1495. (BMT_status.charger_type == STANDARD_CHARGER) ||
  1496. (BMT_status.charger_type == APPLE_2_1A_CHARGER) ||
  1497. (BMT_status.charger_type == APPLE_1_0A_CHARGER) ||
  1498. (BMT_status.charger_type == APPLE_0_5A_CHARGER)) {
  1499. #else
  1500. if ((BMT_status.charger_type == NONSTANDARD_CHARGER) ||
  1501. (BMT_status.charger_type == STANDARD_CHARGER) ||
  1502. (BMT_status.charger_type == APPLE_2_1A_CHARGER) ||
  1503. (BMT_status.charger_type == APPLE_1_0A_CHARGER) ||
  1504. (BMT_status.charger_type == APPLE_0_5A_CHARGER) ||
  1505. (DISO_data.diso_state.cur_vdc_state == DISO_ONLINE)) {
  1506. #endif
  1507. ac_data->AC_ONLINE = 1;
  1508. ac_psy->type = POWER_SUPPLY_TYPE_MAINS;
  1509. } else {
  1510. ac_data->AC_ONLINE = 0;
  1511. }
  1512. } else {
  1513. ac_data->AC_ONLINE = 0;
  1514. }
  1515. if (ac_status != ac_data->AC_ONLINE) {
  1516. ac_status = ac_data->AC_ONLINE;
  1517. power_supply_changed(ac_psy);
  1518. }
  1519. }
  1520. static void usb_update(struct usb_data *usb_data)
  1521. {
  1522. static int usb_status = -1;
  1523. struct power_supply *usb_psy = &usb_data->psy;
  1524. if (BMT_status.charger_exist == KAL_TRUE) {
  1525. if ((BMT_status.charger_type == STANDARD_HOST) ||
  1526. (BMT_status.charger_type == CHARGING_HOST)) {
  1527. usb_data->USB_ONLINE = 1;
  1528. usb_psy->type = POWER_SUPPLY_TYPE_USB;
  1529. } else {
  1530. usb_data->USB_ONLINE = 0;
  1531. }
  1532. } else {
  1533. usb_data->USB_ONLINE = 0;
  1534. }
  1535. if (usb_status != usb_data->USB_ONLINE) {
  1536. usb_status = usb_data->USB_ONLINE;
  1537. power_supply_changed(usb_psy);
  1538. }
  1539. }
  1540. #endif
  1541. unsigned char bat_is_kpoc(void)
  1542. {
  1543. #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING
  1544. if (g_platform_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT
  1545. || g_platform_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) {
  1546. return KAL_TRUE;
  1547. }
  1548. #endif
  1549. return KAL_FALSE;
  1550. }
  1551. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1552. /* // Battery Temprature Parameters and functions */
  1553. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1554. kal_bool pmic_chrdet_status(void)
  1555. {
  1556. if (upmu_is_chr_det() == KAL_TRUE)
  1557. return KAL_TRUE;
  1558. battery_log(BAT_LOG_CRTI, "[pmic_chrdet_status] No charger\r\n");
  1559. return KAL_FALSE;
  1560. }
  1561. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1562. /* // Pulse Charging Algorithm */
  1563. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  1564. kal_bool bat_is_charger_exist(void)
  1565. {
  1566. return get_charger_detect_status();
  1567. }
  1568. kal_bool bat_is_charging_full(void)
  1569. {
  1570. if ((BMT_status.bat_full == KAL_TRUE) && (BMT_status.bat_in_recharging_state == KAL_FALSE))
  1571. return KAL_TRUE;
  1572. else
  1573. return KAL_FALSE;
  1574. }
  1575. unsigned int bat_get_ui_percentage(void)
  1576. {
  1577. if ((g_platform_boot_mode == META_BOOT) ||
  1578. (g_platform_boot_mode == ADVMETA_BOOT) ||
  1579. (g_platform_boot_mode == FACTORY_BOOT) ||
  1580. (g_platform_boot_mode == ATE_FACTORY_BOOT))
  1581. return 75;
  1582. return BMT_status.UI_SOC2;
  1583. }
  1584. /* Full state --> recharge voltage --> full state */
  1585. unsigned int bat_is_recharging_phase(void)
  1586. {
  1587. return (BMT_status.bat_in_recharging_state || BMT_status.bat_full == KAL_TRUE);
  1588. }
  1589. int get_bat_charging_current_level(void)
  1590. {
  1591. CHR_CURRENT_ENUM charging_current;
  1592. battery_charging_control(CHARGING_CMD_GET_CURRENT, &charging_current);
  1593. return charging_current;
  1594. }
  1595. #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT)
  1596. PMU_STATUS do_batt_temp_state_machine(void)
  1597. {
  1598. if (BMT_status.temperature == ERR_CHARGE_TEMPERATURE)
  1599. return PMU_STATUS_FAIL;
  1600. #ifdef BAT_LOW_TEMP_PROTECT_ENABLE
  1601. // if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) {
  1602. if (BMT_status.temperature < batt_cust_data.min_charge_temperature) {
  1603. battery_log(BAT_LOG_CRTI, "[BATTERY] Battery Under Temperature or NTC fail !!\n\r");
  1604. g_batt_temp_status = TEMP_POS_LOW;
  1605. return PMU_STATUS_FAIL;
  1606. } else if (g_batt_temp_status == TEMP_POS_LOW) {
  1607. // if (BMT_status.temperature >= MIN_CHARGE_TEMPERATURE_PLUS_X_DEGREE) {
  1608. if (BMT_status.temperature >= batt_cust_data.min_charge_temperature_plus_x_degree) {
  1609. battery_log(BAT_LOG_CRTI,
  1610. "[BATTERY] Battery Temperature raise from %d to %d(%d), allow charging!!\n\r",
  1611. batt_cust_data.min_charge_temperature, BMT_status.temperature,
  1612. batt_cust_data.min_charge_temperature_plus_x_degree);
  1613. g_batt_temp_status = TEMP_POS_NORMAL;
  1614. BMT_status.bat_charging_state = CHR_PRE;
  1615. return PMU_STATUS_OK;
  1616. } else {
  1617. return PMU_STATUS_FAIL;
  1618. }
  1619. } else
  1620. #endif
  1621. // if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) {
  1622. if (BMT_status.temperature >= batt_cust_data.max_charge_temperature){
  1623. battery_log(BAT_LOG_CRTI, "[BATTERY] Battery Over Temperature !!\n\r");
  1624. g_batt_temp_status = TEMP_POS_HIGH;
  1625. return PMU_STATUS_FAIL;
  1626. } else if (g_batt_temp_status == TEMP_POS_HIGH) {
  1627. // if (BMT_status.temperature < MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE) {
  1628. if (BMT_status.temperature < batt_cust_data.max_charge_temperature_minus_x_degree) {
  1629. battery_log(BAT_LOG_CRTI,
  1630. "[BATTERY] Battery Temperature down from %d to %d(%d), allow charging!!\n\r",
  1631. batt_cust_data.max_charge_temperature, BMT_status.temperature,
  1632. batt_cust_data.max_charge_temperature_minus_x_degree);
  1633. g_batt_temp_status = TEMP_POS_NORMAL;
  1634. BMT_status.bat_charging_state = CHR_PRE;
  1635. return PMU_STATUS_OK;
  1636. } else {
  1637. return PMU_STATUS_FAIL;
  1638. }
  1639. } else {
  1640. g_batt_temp_status = TEMP_POS_NORMAL;
  1641. }
  1642. return PMU_STATUS_OK;
  1643. }
  1644. #endif
  1645. unsigned long BAT_Get_Battery_Voltage(int polling_mode)
  1646. {
  1647. unsigned long ret_val = 0;
  1648. #if defined(CONFIG_POWER_EXT)
  1649. ret_val = 4000;
  1650. #else
  1651. ret_val = battery_meter_get_battery_voltage(KAL_FALSE);
  1652. #endif
  1653. return ret_val;
  1654. }
  1655. static void mt_battery_average_method_init(BATTERY_AVG_ENUM type, unsigned int *bufferdata,
  1656. unsigned int data, signed int *sum)
  1657. {
  1658. unsigned int i;
  1659. static kal_bool batteryBufferFirst = KAL_TRUE;
  1660. static kal_bool previous_charger_exist = KAL_FALSE;
  1661. static kal_bool previous_in_recharge_state = KAL_FALSE;
  1662. static unsigned char index;
  1663. /* reset charging current window while plug in/out { */
  1664. if (type == BATTERY_AVG_CURRENT) {
  1665. if (BMT_status.charger_exist == KAL_TRUE) {
  1666. if (previous_charger_exist == KAL_FALSE) {
  1667. batteryBufferFirst = KAL_TRUE;
  1668. previous_charger_exist = KAL_TRUE;
  1669. if ((BMT_status.charger_type == STANDARD_CHARGER)
  1670. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  1671. && (DISO_data.diso_state.cur_vdc_state == DISO_ONLINE)
  1672. #endif
  1673. )
  1674. data = batt_cust_data.ac_charger_current / 100;//AC_CHARGER_CURRENT / 100;
  1675. else if (BMT_status.charger_type == CHARGING_HOST)
  1676. data = batt_cust_data.charging_host_charger_current / 100;//CHARGING_HOST_CHARGER_CURRENT / 100;
  1677. else if (BMT_status.charger_type == NONSTANDARD_CHARGER)
  1678. data = batt_cust_data.non_std_ac_charger_current / 100;//NON_STD_AC_CHARGER_CURRENT / 100; /* mA */
  1679. else /* USB */
  1680. data = batt_cust_data.usb_charger_current / 100;//USB_CHARGER_CURRENT / 100; /* mA */
  1681. } else if ((previous_in_recharge_state == KAL_FALSE)
  1682. && (BMT_status.bat_in_recharging_state == KAL_TRUE)) {
  1683. batteryBufferFirst = KAL_TRUE;
  1684. if ((BMT_status.charger_type == STANDARD_CHARGER)
  1685. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  1686. && (DISO_data.diso_state.cur_vdc_state == DISO_ONLINE)
  1687. #endif
  1688. )
  1689. data = batt_cust_data.ac_charger_current / 100;//AC_CHARGER_CURRENT / 100;
  1690. else if (BMT_status.charger_type == CHARGING_HOST)
  1691. data = batt_cust_data.charging_host_charger_current / 100;//CHARGING_HOST_CHARGER_CURRENT / 100;
  1692. else if (BMT_status.charger_type == NONSTANDARD_CHARGER)
  1693. data = batt_cust_data.non_std_ac_charger_current /100;//NON_STD_AC_CHARGER_CURRENT / 100; /* mA */
  1694. else /* USB */
  1695. data = batt_cust_data.usb_charger_current / 100;//USB_CHARGER_CURRENT / 100; /* mA */
  1696. }
  1697. previous_in_recharge_state = BMT_status.bat_in_recharging_state;
  1698. } else {
  1699. if (previous_charger_exist == KAL_TRUE) {
  1700. batteryBufferFirst = KAL_TRUE;
  1701. previous_charger_exist = KAL_FALSE;
  1702. data = 0;
  1703. }
  1704. }
  1705. }
  1706. /* reset charging current window while plug in/out } */
  1707. battery_log(BAT_LOG_FULL, "batteryBufferFirst =%d, data= (%d)\n", batteryBufferFirst, data);
  1708. if (batteryBufferFirst == KAL_TRUE) {
  1709. for (i = 0; i < BATTERY_AVERAGE_SIZE; i++)
  1710. bufferdata[i] = data;
  1711. *sum = data * BATTERY_AVERAGE_SIZE;
  1712. }
  1713. index++;
  1714. if (index >= BATTERY_AVERAGE_DATA_NUMBER) {
  1715. index = BATTERY_AVERAGE_DATA_NUMBER;
  1716. batteryBufferFirst = KAL_FALSE;
  1717. }
  1718. }
  1719. static unsigned int mt_battery_average_method(BATTERY_AVG_ENUM type, unsigned int *bufferdata,
  1720. unsigned int data, signed int *sum,
  1721. unsigned char batteryIndex)
  1722. {
  1723. unsigned int avgdata;
  1724. mt_battery_average_method_init(type, bufferdata, data, sum);
  1725. *sum -= bufferdata[batteryIndex];
  1726. *sum += data;
  1727. bufferdata[batteryIndex] = data;
  1728. avgdata = (*sum) / BATTERY_AVERAGE_SIZE;
  1729. battery_log(BAT_LOG_FULL, "bufferdata[%d]= (%d)\n", batteryIndex, bufferdata[batteryIndex]);
  1730. return avgdata;
  1731. }
  1732. void mt_battery_GetBatteryData(void)
  1733. {
  1734. unsigned int bat_vol, charger_vol, Vsense, ZCV;
  1735. signed int ICharging, temperature, temperatureR, temperatureV;
  1736. static signed int bat_sum, icharging_sum, temperature_sum;
  1737. static signed int batteryVoltageBuffer[BATTERY_AVERAGE_SIZE];
  1738. static signed int batteryCurrentBuffer[BATTERY_AVERAGE_SIZE];
  1739. static signed int batteryTempBuffer[BATTERY_AVERAGE_SIZE];
  1740. static unsigned char batteryIndex = 0xff;
  1741. static signed int previous_SOC = -1;
  1742. if (batteryIndex == 0xff)
  1743. batteryIndex = 0;
  1744. bat_vol = battery_meter_get_battery_voltage(KAL_TRUE);
  1745. Vsense = battery_meter_get_VSense();
  1746. // if (upmu_is_chr_det() == KAL_TRUE) {//remove fan warning by xmtjx
  1747. ICharging = battery_meter_get_charging_current();
  1748. charger_vol = battery_meter_get_charger_voltage();
  1749. // } else {
  1750. // ICharging = 0;
  1751. // charger_vol = 0;
  1752. // }
  1753. temperature = battery_meter_get_battery_temperature();
  1754. temperatureV = battery_meter_get_tempV();
  1755. temperatureR = battery_meter_get_tempR(temperatureV);
  1756. ZCV = battery_meter_get_battery_zcv();
  1757. BMT_status.ICharging =
  1758. mt_battery_average_method(BATTERY_AVG_CURRENT, &batteryCurrentBuffer[0], ICharging,
  1759. &icharging_sum, batteryIndex);
  1760. // if (previous_SOC == -1 && bat_vol <= V_0PERCENT_TRACKING) {
  1761. if (previous_SOC == -1 && bat_vol <= batt_cust_data.v_0percent_tracking) {
  1762. previous_SOC = 0;
  1763. if (ZCV != 0) {
  1764. battery_log(BAT_LOG_CRTI,
  1765. "battery voltage too low, use ZCV to init average data.\n");
  1766. BMT_status.bat_vol =
  1767. mt_battery_average_method(BATTERY_AVG_VOLT, &batteryVoltageBuffer[0],
  1768. ZCV, &bat_sum, batteryIndex);
  1769. } else {
  1770. battery_log(BAT_LOG_CRTI,
  1771. "battery voltage too low, use v_0percent_tracking + 100 to init average data.\n");
  1772. BMT_status.bat_vol =
  1773. mt_battery_average_method(BATTERY_AVG_VOLT, &batteryVoltageBuffer[0],
  1774. batt_cust_data.v_0percent_tracking + 100, &bat_sum,
  1775. batteryIndex);
  1776. }
  1777. } else {
  1778. BMT_status.bat_vol =
  1779. mt_battery_average_method(BATTERY_AVG_VOLT, &batteryVoltageBuffer[0], bat_vol,
  1780. &bat_sum, batteryIndex);
  1781. }
  1782. BMT_status.temperature =
  1783. mt_battery_average_method(BATTERY_AVG_TEMP, &batteryTempBuffer[0], temperature,
  1784. &temperature_sum, batteryIndex);
  1785. BMT_status.Vsense = Vsense;
  1786. BMT_status.charger_vol = charger_vol;
  1787. BMT_status.temperatureV = temperatureV;
  1788. BMT_status.temperatureR = temperatureR;
  1789. BMT_status.ZCV = ZCV;
  1790. batteryIndex++;
  1791. if (batteryIndex >= BATTERY_AVERAGE_SIZE)
  1792. batteryIndex = 0;
  1793. battery_log(BAT_LOG_CRTI,
  1794. "[kernel]AvgVbat %d,bat_vol %d, AvgI %d, I %d, VChr %d, AvgT %d, T %d, ZCV %d, CHR_Type %d, SOC %3d:%3d:%3d\n",
  1795. BMT_status.bat_vol, bat_vol, BMT_status.ICharging, ICharging,
  1796. BMT_status.charger_vol, BMT_status.temperature, temperature, BMT_status.ZCV,
  1797. BMT_status.charger_type, BMT_status.SOC, BMT_status.UI_SOC, BMT_status.UI_SOC2);
  1798. }
  1799. static PMU_STATUS mt_battery_CheckBatteryTemp(void)
  1800. {
  1801. PMU_STATUS status = PMU_STATUS_OK;
  1802. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  1803. battery_log(BAT_LOG_CRTI, "[BATTERY] support JEITA, temperature=%d\n",
  1804. BMT_status.temperature);
  1805. if (do_jeita_state_machine() == PMU_STATUS_FAIL) {
  1806. battery_log(BAT_LOG_CRTI, "[BATTERY] JEITA : fail\n");
  1807. status = PMU_STATUS_FAIL;
  1808. }
  1809. #else
  1810. #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT)
  1811. if (do_batt_temp_state_machine() == PMU_STATUS_FAIL) {
  1812. battery_log(BAT_LOG_CRTI, "[BATTERY] Batt temp check : fail\n");
  1813. status = PMU_STATUS_FAIL;
  1814. }
  1815. #else
  1816. #ifdef BAT_LOW_TEMP_PROTECT_ENABLE
  1817. // if ((BMT_status.temperature < MIN_CHARGE_TEMPERATURE)
  1818. if ((BMT_status.temperature < batt_cust_data.min_charge_temperature)
  1819. || (BMT_status.temperature == ERR_CHARGE_TEMPERATURE)) {
  1820. battery_log(BAT_LOG_CRTI, "[BATTERY] Battery Under Temperature or NTC fail !!\n\r");
  1821. status = PMU_STATUS_FAIL;
  1822. }
  1823. #endif
  1824. // if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) {
  1825. if (BMT_status.temperature >= batt_cust_data.max_charge_temperature){
  1826. battery_log(BAT_LOG_CRTI, "[BATTERY] Battery Over Temperature !!\n\r");
  1827. status = PMU_STATUS_FAIL;
  1828. }
  1829. #endif
  1830. #endif
  1831. return status;
  1832. }
  1833. static PMU_STATUS mt_battery_CheckChargerVoltage(void)
  1834. {
  1835. PMU_STATUS status = PMU_STATUS_OK;
  1836. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  1837. unsigned int v_charger_max = DISO_data.hv_voltage;
  1838. #endif
  1839. if (BMT_status.charger_exist == KAL_TRUE) {
  1840. //#if (V_CHARGER_ENABLE == 1)
  1841. // if (BMT_status.charger_vol <= V_CHARGER_MIN) {
  1842. if (batt_cust_data.v_charger_enable == 1) {
  1843. if (BMT_status.charger_vol <= batt_cust_data.v_charger_min) {
  1844. battery_log(BAT_LOG_CRTI, "[BATTERY]Charger under voltage!!\r\n");
  1845. BMT_status.bat_charging_state = CHR_ERROR;
  1846. status = PMU_STATUS_FAIL;
  1847. }
  1848. }
  1849. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  1850. // if (BMT_status.charger_vol >= V_CHARGER_MAX) {
  1851. if (BMT_status.charger_vol >= batt_cust_data.v_charger_max) {
  1852. #else
  1853. if (BMT_status.charger_vol >= v_charger_max) {
  1854. #endif
  1855. battery_log(BAT_LOG_CRTI, "[BATTERY]Charger over voltage !!\r\n");
  1856. BMT_status.charger_protect_status = charger_OVER_VOL;
  1857. BMT_status.bat_charging_state = CHR_ERROR;
  1858. status = PMU_STATUS_FAIL;
  1859. }
  1860. }
  1861. return status;
  1862. }
  1863. static PMU_STATUS mt_battery_CheckChargingTime(void)
  1864. {
  1865. PMU_STATUS status = PMU_STATUS_OK;
  1866. if ((g_battery_thermal_throttling_flag == 2) || (g_battery_thermal_throttling_flag == 3)) {
  1867. battery_log(BAT_LOG_FULL,
  1868. "[TestMode] Disable Safety Timer. bat_tt_enable=%d, bat_thr_test_mode=%d, bat_thr_test_value=%d\n",
  1869. g_battery_thermal_throttling_flag,
  1870. battery_cmd_thermal_test_mode, battery_cmd_thermal_test_mode_value);
  1871. } else {
  1872. /* Charging OT */
  1873. if (BMT_status.total_charging_time >= MAX_CHARGING_TIME) {
  1874. battery_log(BAT_LOG_CRTI, "[BATTERY] Charging Over Time.\n");
  1875. status = PMU_STATUS_FAIL;
  1876. }
  1877. }
  1878. return status;
  1879. }
  1880. #if defined(STOP_CHARGING_IN_TAKLING)
  1881. static PMU_STATUS mt_battery_CheckCallState(void)
  1882. {
  1883. PMU_STATUS status = PMU_STATUS_OK;
  1884. // if ((g_call_state == CALL_ACTIVE) && (BMT_status.bat_vol > V_CC2TOPOFF_THRES))
  1885. if ((g_call_state == CALL_ACTIVE) && (BMT_status.bat_vol > batt_cust_data.v_cc2topoff_thres))
  1886. status = PMU_STATUS_FAIL;
  1887. return status;
  1888. }
  1889. #endif
  1890. static void mt_battery_CheckBatteryStatus(void)
  1891. {
  1892. battery_log(BAT_LOG_FULL, "[mt_battery_CheckBatteryStatus] cmd_discharging=(%d)\n",
  1893. cmd_discharging);
  1894. if (cmd_discharging == 1) {
  1895. battery_log(BAT_LOG_CRTI,
  1896. "[mt_battery_CheckBatteryStatus] cmd_discharging=(%d)\n",
  1897. cmd_discharging);
  1898. BMT_status.bat_charging_state = CHR_ERROR;
  1899. battery_charging_control(CHARGING_CMD_SET_ERROR_STATE, &cmd_discharging);
  1900. return;
  1901. } else if (cmd_discharging == 0) {
  1902. BMT_status.bat_charging_state = CHR_PRE;
  1903. battery_charging_control(CHARGING_CMD_SET_ERROR_STATE, &cmd_discharging);
  1904. cmd_discharging = -1;
  1905. }
  1906. if (mt_battery_CheckBatteryTemp() != PMU_STATUS_OK) {
  1907. BMT_status.bat_charging_state = CHR_ERROR;
  1908. return;
  1909. }
  1910. if (mt_battery_CheckChargerVoltage() != PMU_STATUS_OK) {
  1911. BMT_status.bat_charging_state = CHR_ERROR;
  1912. return;
  1913. }
  1914. #if defined(STOP_CHARGING_IN_TAKLING)
  1915. if (mt_battery_CheckCallState() != PMU_STATUS_OK) {
  1916. BMT_status.bat_charging_state = CHR_HOLD;
  1917. return;
  1918. }
  1919. #endif
  1920. if (mt_battery_CheckChargingTime() != PMU_STATUS_OK) {
  1921. BMT_status.bat_charging_state = CHR_ERROR;
  1922. return;
  1923. }
  1924. }
  1925. static void mt_battery_notify_TotalChargingTime_check(void)
  1926. {
  1927. #if defined(BATTERY_NOTIFY_CASE_0005_TOTAL_CHARGINGTIME)
  1928. if ((g_battery_thermal_throttling_flag == 2) || (g_battery_thermal_throttling_flag == 3)) {
  1929. battery_log(BAT_LOG_FULL, "[TestMode] Disable Safety Timer : no UI display\n");
  1930. } else {
  1931. if (BMT_status.total_charging_time >= MAX_CHARGING_TIME)
  1932. /* if (BMT_status.total_charging_time >= 60) //test */
  1933. {
  1934. g_BatteryNotifyCode |= 0x0010;
  1935. battery_log(BAT_LOG_CRTI, "[BATTERY] Charging Over Time\n");
  1936. } else {
  1937. g_BatteryNotifyCode &= ~(0x0010);
  1938. }
  1939. }
  1940. battery_log(BAT_LOG_CRTI,
  1941. "[BATTERY] BATTERY_NOTIFY_CASE_0005_TOTAL_CHARGINGTIME (%x)\n",
  1942. g_BatteryNotifyCode);
  1943. #endif
  1944. }
  1945. static void mt_battery_notify_VBat_check(void)
  1946. {
  1947. #if defined(BATTERY_NOTIFY_CASE_0004_VBAT)
  1948. if (BMT_status.bat_vol > 4350)
  1949. /* if (BMT_status.bat_vol > 3800) //test */
  1950. {
  1951. g_BatteryNotifyCode |= 0x0008;
  1952. battery_log(BAT_LOG_CRTI, "[BATTERY] bat_vlot(%ld) > 4350mV\n", BMT_status.bat_vol);
  1953. } else {
  1954. g_BatteryNotifyCode &= ~(0x0008);
  1955. }
  1956. battery_log(BAT_LOG_CRTI, "[BATTERY] BATTERY_NOTIFY_CASE_0004_VBAT (%x)\n",
  1957. g_BatteryNotifyCode);
  1958. #endif
  1959. }
  1960. static void mt_battery_notify_ICharging_check(void)
  1961. {
  1962. #if defined(BATTERY_NOTIFY_CASE_0003_ICHARGING)
  1963. if ((BMT_status.ICharging > 1000) && (BMT_status.total_charging_time > 300)) {
  1964. g_BatteryNotifyCode |= 0x0004;
  1965. battery_log(BAT_LOG_CRTI, "[BATTERY] I_charging(%ld) > 1000mA\n",
  1966. BMT_status.ICharging);
  1967. } else {
  1968. g_BatteryNotifyCode &= ~(0x0004);
  1969. }
  1970. battery_log(BAT_LOG_CRTI, "[BATTERY] BATTERY_NOTIFY_CASE_0003_ICHARGING (%x)\n",
  1971. g_BatteryNotifyCode);
  1972. #endif
  1973. }
  1974. static void mt_battery_notify_VBatTemp_check(void)
  1975. {
  1976. #if defined(BATTERY_NOTIFY_CASE_0002_VBATTEMP)
  1977. // if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) {
  1978. if (BMT_status.temperature >= batt_cust_data.max_charge_temperature){
  1979. g_BatteryNotifyCode |= 0x0002;
  1980. battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too high)\n",
  1981. BMT_status.temperature);
  1982. }
  1983. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  1984. else if (BMT_status.temperature < TEMP_NEG_10_THRESHOLD) {
  1985. g_BatteryNotifyCode |= 0x0020;
  1986. battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n",
  1987. BMT_status.temperature);
  1988. }
  1989. #else
  1990. #ifdef BAT_LOW_TEMP_PROTECT_ENABLE
  1991. // else if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) {
  1992. else if (BMT_status.temperature < batt_cust_data.min_charge_temperature) {
  1993. g_BatteryNotifyCode |= 0x0020;
  1994. battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n",
  1995. BMT_status.temperature);
  1996. }
  1997. #endif
  1998. #endif
  1999. battery_log(BAT_LOG_FULL, "[BATTERY] BATTERY_NOTIFY_CASE_0002_VBATTEMP (%x)\n",
  2000. g_BatteryNotifyCode);
  2001. #endif
  2002. }
  2003. static void mt_battery_notify_VCharger_check(void)
  2004. {
  2005. #if defined(BATTERY_NOTIFY_CASE_0001_VCHARGER)
  2006. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2007. unsigned int v_charger_max = DISO_data.hv_voltage;
  2008. #endif
  2009. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2010. // if (BMT_status.charger_vol > V_CHARGER_MAX) {
  2011. if (BMT_status.charger_vol > batt_cust_data.v_charger_max) {
  2012. #else
  2013. if (BMT_status.charger_vol > v_charger_max) {
  2014. #endif
  2015. g_BatteryNotifyCode |= 0x0001;
  2016. battery_log(BAT_LOG_CRTI, "[BATTERY] BMT_status.charger_vol(%d) > %d mV\n",
  2017. BMT_status.charger_vol, batt_cust_data.v_charger_max);
  2018. } else {
  2019. g_BatteryNotifyCode &= ~(0x0001);
  2020. }
  2021. if (g_BatteryNotifyCode != 0x0000)
  2022. battery_log(BAT_LOG_CRTI,
  2023. "[BATTERY] BATTERY_NOTIFY_CASE_0001_VCHARGER (%x)\n",
  2024. g_BatteryNotifyCode);
  2025. #endif
  2026. }
  2027. static void mt_battery_notify_UI_test(void)
  2028. {
  2029. if (g_BN_TestMode == 0x0001) {
  2030. g_BatteryNotifyCode = 0x0001;
  2031. battery_log(BAT_LOG_CRTI, "[BATTERY_TestMode] BATTERY_NOTIFY_CASE_0001_VCHARGER\n");
  2032. } else if (g_BN_TestMode == 0x0002) {
  2033. g_BatteryNotifyCode = 0x0002;
  2034. battery_log(BAT_LOG_CRTI, "[BATTERY_TestMode] BATTERY_NOTIFY_CASE_0002_VBATTEMP\n");
  2035. } else if (g_BN_TestMode == 0x0003) {
  2036. g_BatteryNotifyCode = 0x0004;
  2037. battery_log(BAT_LOG_CRTI,
  2038. "[BATTERY_TestMode] BATTERY_NOTIFY_CASE_0003_ICHARGING\n");
  2039. } else if (g_BN_TestMode == 0x0004) {
  2040. g_BatteryNotifyCode = 0x0008;
  2041. battery_log(BAT_LOG_CRTI, "[BATTERY_TestMode] BATTERY_NOTIFY_CASE_0004_VBAT\n");
  2042. } else if (g_BN_TestMode == 0x0005) {
  2043. g_BatteryNotifyCode = 0x0010;
  2044. battery_log(BAT_LOG_CRTI,
  2045. "[BATTERY_TestMode] BATTERY_NOTIFY_CASE_0005_TOTAL_CHARGINGTIME\n");
  2046. } else {
  2047. battery_log(BAT_LOG_CRTI, "[BATTERY] Unknown BN_TestMode Code : %x\n",
  2048. g_BN_TestMode);
  2049. }
  2050. }
  2051. void mt_battery_notify_check(void)
  2052. {
  2053. g_BatteryNotifyCode = 0x0000;
  2054. if (g_BN_TestMode == 0x0000) { /* for normal case */
  2055. battery_log(BAT_LOG_FULL, "[BATTERY] mt_battery_notify_check\n");
  2056. mt_battery_notify_VCharger_check();
  2057. mt_battery_notify_VBatTemp_check();
  2058. mt_battery_notify_ICharging_check();
  2059. mt_battery_notify_VBat_check();
  2060. mt_battery_notify_TotalChargingTime_check();
  2061. } else { /* for UI test */
  2062. mt_battery_notify_UI_test();
  2063. }
  2064. }
  2065. static void mt_battery_thermal_check(void)
  2066. {
  2067. if ((g_battery_thermal_throttling_flag == 1) || (g_battery_thermal_throttling_flag == 3)) {
  2068. if (battery_cmd_thermal_test_mode == 1) {
  2069. BMT_status.temperature = battery_cmd_thermal_test_mode_value;
  2070. battery_log(BAT_LOG_FULL,
  2071. "[Battery] In thermal_test_mode , Tbat=%d\n",
  2072. BMT_status.temperature);
  2073. }
  2074. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  2075. /* ignore default rule */
  2076. #else
  2077. if (BMT_status.temperature >= 60) {
  2078. #if defined(CONFIG_POWER_EXT)
  2079. battery_log(BAT_LOG_CRTI,
  2080. "[BATTERY] CONFIG_POWER_EXT, no update battery update power down.\n");
  2081. #else
  2082. {
  2083. if ((g_platform_boot_mode == META_BOOT)
  2084. || (g_platform_boot_mode == ADVMETA_BOOT)
  2085. || (g_platform_boot_mode == ATE_FACTORY_BOOT)) {
  2086. battery_log(BAT_LOG_FULL,
  2087. "[BATTERY] boot mode = %d, bypass temperature check\n",
  2088. g_platform_boot_mode);
  2089. } else {
  2090. struct battery_data *bat_data = &battery_main;
  2091. struct power_supply *bat_psy = &bat_data->psy;
  2092. battery_log(BAT_LOG_CRTI,
  2093. "[Battery] Tbat(%d)>=60, system need power down.\n",
  2094. BMT_status.temperature);
  2095. bat_data->BAT_CAPACITY = 0;
  2096. power_supply_changed(bat_psy);
  2097. if (BMT_status.charger_exist == KAL_TRUE) {
  2098. /* can not power down due to charger exist, so need reset system */
  2099. battery_charging_control
  2100. (CHARGING_CMD_SET_PLATFORM_RESET, NULL);
  2101. }
  2102. /* avoid SW no feedback */
  2103. battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL);
  2104. /* mt_power_off(); */
  2105. }
  2106. }
  2107. #endif
  2108. }
  2109. #endif
  2110. }
  2111. }
  2112. void mt_battery_update_status(void)
  2113. {
  2114. #if defined(CONFIG_POWER_EXT)
  2115. battery_log(BAT_LOG_CRTI, "[BATTERY] CONFIG_POWER_EXT, no update Android.\n");
  2116. #else
  2117. if (g_battery_soc_ready) {
  2118. wireless_update(&wireless_main);
  2119. battery_update(&battery_main);
  2120. ac_update(&ac_main);
  2121. usb_update(&usb_main);
  2122. } else {
  2123. battery_log(BAT_LOG_CRTI, "User space SOC init still waiting\n");
  2124. return;
  2125. }
  2126. #endif
  2127. }
  2128. CHARGER_TYPE mt_charger_type_detection(void)
  2129. {
  2130. CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
  2131. mutex_lock(&charger_type_mutex);
  2132. #if defined(CONFIG_MTK_WIRELESS_CHARGER_SUPPORT)
  2133. battery_charging_control(CHARGING_CMD_GET_CHARGER_TYPE, &CHR_Type_num);
  2134. BMT_status.charger_type = CHR_Type_num;
  2135. #else
  2136. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2137. if (BMT_status.charger_type == CHARGER_UNKNOWN) {
  2138. #else
  2139. if ((BMT_status.charger_type == CHARGER_UNKNOWN) &&
  2140. (DISO_data.diso_state.cur_vusb_state == DISO_ONLINE)) {
  2141. #endif
  2142. battery_charging_control(CHARGING_CMD_GET_CHARGER_TYPE, &CHR_Type_num);
  2143. BMT_status.charger_type = CHR_Type_num;
  2144. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)
  2145. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  2146. /*if (BMT_status.UI_SOC2 == 100) {
  2147. BMT_status.bat_charging_state = CHR_BATFULL;
  2148. BMT_status.bat_full = KAL_TRUE;
  2149. g_charging_full_reset_bat_meter = KAL_TRUE;
  2150. }*/
  2151. if (g_battery_soc_ready == KAL_FALSE) {
  2152. if (BMT_status.nPercent_ZCV == 0)
  2153. battery_meter_initial();
  2154. BMT_status.SOC = battery_meter_get_battery_percentage();
  2155. }
  2156. if (BMT_status.bat_vol > 0)
  2157. mt_battery_update_status();
  2158. #endif
  2159. #endif
  2160. }
  2161. #endif
  2162. mutex_unlock(&charger_type_mutex);
  2163. return BMT_status.charger_type;
  2164. }
  2165. CHARGER_TYPE mt_get_charger_type(void)
  2166. {
  2167. #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
  2168. return STANDARD_HOST;
  2169. #else
  2170. return BMT_status.charger_type;
  2171. #endif
  2172. }
  2173. static void mt_battery_charger_detect_check(void)
  2174. {
  2175. #ifdef CONFIG_MTK_BQ25896_SUPPORT
  2176. /*New low power feature of MT6531: disable charger CLK without CHARIN.
  2177. * MT6351 API abstracted in charging_hw_bw25896.c. Any charger with MT6351 needs to set this.
  2178. * Compile option is not limited to CONFIG_MTK_BQ25896_SUPPORT.
  2179. * PowerDown = 0
  2180. */
  2181. unsigned int pwr;
  2182. #endif
  2183. if (upmu_is_chr_det() == KAL_TRUE) {
  2184. wake_lock(&battery_suspend_lock);
  2185. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2186. BMT_status.charger_exist = KAL_TRUE;
  2187. #endif
  2188. #if defined(CONFIG_MTK_WIRELESS_CHARGER_SUPPORT)
  2189. mt_charger_type_detection();
  2190. if ((BMT_status.charger_type == STANDARD_HOST)
  2191. || (BMT_status.charger_type == CHARGING_HOST)) {
  2192. mt_usb_connect();
  2193. }
  2194. #else
  2195. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2196. if (BMT_status.charger_type == CHARGER_UNKNOWN) {
  2197. #else
  2198. if ((BMT_status.charger_type == CHARGER_UNKNOWN) &&
  2199. (DISO_data.diso_state.cur_vusb_state == DISO_ONLINE)) {
  2200. #endif
  2201. mt_charger_type_detection();
  2202. if ((BMT_status.charger_type == STANDARD_HOST)
  2203. || (BMT_status.charger_type == CHARGING_HOST)) {
  2204. mt_usb_connect();
  2205. }
  2206. }
  2207. #endif
  2208. #ifdef CONFIG_MTK_BQ25896_SUPPORT
  2209. /*New low power feature of MT6531: disable charger CLK without CHARIN.
  2210. * MT6351 API abstracted in charging_hw_bw25896.c. Any charger with MT6351 needs to set this.
  2211. * Compile option is not limited to CONFIG_MTK_BQ25896_SUPPORT.
  2212. * PowerDown = 0
  2213. */
  2214. pwr = 0;
  2215. battery_charging_control(CHARGING_CMD_SET_CHRIND_CK_PDN, &pwr);
  2216. #endif
  2217. battery_log(BAT_LOG_CRTI, "[BAT_thread]Cable in, CHR_Type_num=%d\r\n",
  2218. BMT_status.charger_type);
  2219. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  2220. /* is_ta_connect = KAL_FALSE; */
  2221. /* ta_check_chr_type = KAL_TRUE; */
  2222. ta_cable_out_occur = KAL_FALSE;
  2223. battery_log(BAT_LOG_CRTI, "[PE+] Cable In\n");
  2224. #endif
  2225. } else {
  2226. wake_unlock(&battery_suspend_lock);
  2227. BMT_status.charger_exist = KAL_FALSE;
  2228. BMT_status.charger_type = CHARGER_UNKNOWN;
  2229. BMT_status.bat_full = KAL_FALSE;
  2230. BMT_status.bat_in_recharging_state = KAL_FALSE;
  2231. BMT_status.bat_charging_state = CHR_PRE;
  2232. BMT_status.total_charging_time = 0;
  2233. BMT_status.PRE_charging_time = 0;
  2234. BMT_status.CC_charging_time = 0;
  2235. BMT_status.TOPOFF_charging_time = 0;
  2236. BMT_status.POSTFULL_charging_time = 0;
  2237. battery_log(BAT_LOG_CRTI, "[BAT_thread]Cable out \r\n");
  2238. mt_usb_disconnect();
  2239. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  2240. is_ta_connect = KAL_FALSE;
  2241. ta_check_chr_type = KAL_TRUE;
  2242. ta_cable_out_occur = KAL_TRUE;
  2243. battery_log(BAT_LOG_CRTI, "[PE+] Cable OUT\n");
  2244. #endif
  2245. #ifdef CONFIG_MTK_BQ25896_SUPPORT
  2246. /*New low power feature of MT6531: disable charger CLK without CHARIN.
  2247. * MT6351 API abstracted in charging_hw_bw25896.c. Any charger with MT6351 needs to set this.
  2248. * Compile option is not limited to CONFIG_MTK_BQ25896_SUPPORT.
  2249. * PowerDown = 1
  2250. */
  2251. pwr = 1;
  2252. battery_charging_control(CHARGING_CMD_SET_CHRIND_CK_PDN, &pwr);
  2253. #endif
  2254. }
  2255. }
  2256. static void mt_kpoc_power_off_check(void)
  2257. {
  2258. #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING
  2259. battery_log(BAT_LOG_CRTI,
  2260. "[mt_kpoc_power_off_check] , chr_vol=%d, boot_mode=%d\r\n",
  2261. BMT_status.charger_vol, g_platform_boot_mode);
  2262. if (g_platform_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT
  2263. || g_platform_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) {
  2264. if ((upmu_is_chr_det() == KAL_FALSE) && (BMT_status.charger_vol < 2500)) { /* vbus < 2.5V */
  2265. battery_log(BAT_LOG_CRTI,
  2266. "[mt_kpoc_power_off_check] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\r\n");
  2267. battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL);
  2268. }
  2269. }
  2270. #endif
  2271. }
  2272. void update_battery_2nd_info(int status_smb, int capacity_smb, int present_smb)
  2273. {
  2274. #if defined(CONFIG_POWER_VERIFY)
  2275. battery_log(BAT_LOG_CRTI, "[update_battery_smb_info] no support\n");
  2276. #else
  2277. g_status_smb = status_smb;
  2278. g_capacity_smb = capacity_smb;
  2279. g_present_smb = present_smb;
  2280. battery_log(BAT_LOG_CRTI,
  2281. "[update_battery_smb_info] get status_smb=%d,capacity_smb=%d,present_smb=%d\n",
  2282. status_smb, capacity_smb, present_smb);
  2283. wake_up_bat();
  2284. g_smartbook_update = 1;
  2285. #endif
  2286. }
  2287. void do_chrdet_int_task(void)
  2288. {
  2289. if (g_bat_init_flag == KAL_TRUE) {
  2290. #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2291. if (upmu_is_chr_det() == KAL_TRUE) {
  2292. #else
  2293. battery_charging_control(CHARGING_CMD_GET_DISO_STATE, &DISO_data);
  2294. if ((DISO_data.diso_state.cur_vusb_state == DISO_ONLINE) ||
  2295. (DISO_data.diso_state.cur_vdc_state == DISO_ONLINE)) {
  2296. #endif
  2297. battery_log(BAT_LOG_CRTI, "[do_chrdet_int_task] charger exist!\n");
  2298. BMT_status.charger_exist = KAL_TRUE;
  2299. #ifdef CONFIG_AW2015
  2300. if (BMT_status.UI_SOC2 <= 90)
  2301. {
  2302. AW2015_LED_RED_ON();
  2303. }
  2304. #endif
  2305. wake_lock(&battery_suspend_lock);
  2306. #if defined(CONFIG_POWER_EXT)
  2307. mt_usb_connect();
  2308. battery_log(BAT_LOG_CRTI,
  2309. "[do_chrdet_int_task] call mt_usb_connect() in EVB\n");
  2310. #elif defined(CONFIG_MTK_POWER_EXT_DETECT)
  2311. if (KAL_TRUE == bat_is_ext_power()) {
  2312. mt_usb_connect();
  2313. battery_log(BAT_LOG_CRTI,
  2314. "[do_chrdet_int_task] call mt_usb_connect() in EVB\n");
  2315. return;
  2316. }
  2317. #endif
  2318. } else {
  2319. battery_log(BAT_LOG_CRTI, "[do_chrdet_int_task] charger NOT exist!\n");
  2320. BMT_status.charger_exist = KAL_FALSE;
  2321. #ifdef CONFIG_AW2015
  2322. if (BMT_status.UI_SOC2 <= 90)
  2323. {
  2324. AW2015_LED_RED_OFF();
  2325. }
  2326. #endif
  2327. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2328. battery_log(BAT_LOG_CRTI,
  2329. "turn off charging for no available charging source\n");
  2330. battery_charging_control(CHARGING_CMD_ENABLE, &BMT_status.charger_exist);
  2331. #endif
  2332. #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING
  2333. if (g_platform_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT
  2334. || g_platform_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) {
  2335. battery_log(BAT_LOG_CRTI,
  2336. "[pmic_thread_kthread] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\r\n");
  2337. battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL);
  2338. /* mt_power_off(); */
  2339. }
  2340. #endif
  2341. wake_unlock(&battery_suspend_lock);
  2342. #if defined(CONFIG_POWER_EXT)
  2343. mt_usb_disconnect();
  2344. battery_log(BAT_LOG_CRTI,
  2345. "[do_chrdet_int_task] call mt_usb_disconnect() in EVB\n");
  2346. #elif defined(CONFIG_MTK_POWER_EXT_DETECT)
  2347. if (KAL_TRUE == bat_is_ext_power()) {
  2348. mt_usb_disconnect();
  2349. battery_log(BAT_LOG_CRTI,
  2350. "[do_chrdet_int_task] call mt_usb_disconnect() in EVB\n");
  2351. return;
  2352. }
  2353. #endif
  2354. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  2355. is_ta_connect = KAL_FALSE;
  2356. ta_check_chr_type = KAL_TRUE;
  2357. ta_cable_out_occur = KAL_TRUE;
  2358. #endif
  2359. }
  2360. /* reset_parameter_dod_charger_plug_event(); */
  2361. wakeup_fg_algo(FG_CHARGER);
  2362. /* Place charger detection and battery update here is used to speed up charging icon display. */
  2363. mt_battery_charger_detect_check();
  2364. if (BMT_status.UI_SOC2 == 100 && BMT_status.charger_exist == KAL_TRUE) {
  2365. BMT_status.bat_charging_state = CHR_BATFULL;
  2366. BMT_status.bat_full = KAL_TRUE;
  2367. g_charging_full_reset_bat_meter = KAL_TRUE;
  2368. }
  2369. if (g_battery_soc_ready == KAL_FALSE) {
  2370. if (BMT_status.nPercent_ZCV == 0)
  2371. battery_meter_initial();
  2372. BMT_status.SOC = battery_meter_get_battery_percentage();
  2373. }
  2374. if (BMT_status.bat_vol > 0)
  2375. mt_battery_update_status();
  2376. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2377. DISO_data.chr_get_diso_state = KAL_TRUE;
  2378. #endif
  2379. wake_up_bat();
  2380. } else {
  2381. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2382. g_vcdt_irq_delay_flag = KAL_TRUE;
  2383. #endif
  2384. battery_log(BAT_LOG_CRTI,
  2385. "[do_chrdet_int_task] battery thread not ready, will do after bettery init.\n");
  2386. }
  2387. }
  2388. void BAT_thread(void)
  2389. {
  2390. static kal_bool battery_meter_initilized = KAL_FALSE;
  2391. if (battery_meter_initilized == KAL_FALSE) {
  2392. battery_meter_initial(); /* move from battery_probe() to decrease booting time */
  2393. BMT_status.nPercent_ZCV = battery_meter_get_battery_nPercent_zcv();
  2394. battery_meter_initilized = KAL_TRUE;
  2395. }
  2396. battery_log(BAT_LOG_CRTI, "[fg2.0]CUST_TRACKING_POINT: %d.\n", CUST_TRACKING_POINT);
  2397. mt_battery_update_time(&batteryThreadRunTime, BATTERY_THREAD_TIME);
  2398. if (fg_ipoh_reset) {
  2399. battery_log(BAT_LOG_CRTI, "[FG BAT_thread]FG_MAIN because IPOH .\n");
  2400. battery_meter_set_init_flag(false);
  2401. fgauge_algo_run_get_init_data();
  2402. wakeup_fg_algo((FG_MAIN));
  2403. fg_ipoh_reset = 0;
  2404. bat_spm_timeout = FALSE;
  2405. } else if (bat_spm_timeout) {
  2406. wakeup_fg_algo((FG_MAIN + FG_RESUME));
  2407. bat_spm_timeout = FALSE;
  2408. } else {
  2409. wakeup_fg_algo(FG_MAIN);
  2410. }
  2411. mt_battery_charger_detect_check();
  2412. mt_battery_GetBatteryData();
  2413. if (BMT_status.charger_exist == KAL_TRUE)
  2414. check_battery_exist();
  2415. mt_battery_thermal_check();
  2416. mt_battery_notify_check();
  2417. if (BMT_status.charger_exist == KAL_TRUE) {
  2418. mt_battery_CheckBatteryStatus();
  2419. mt_battery_charging_algorithm();
  2420. }
  2421. mt_kpoc_power_off_check();
  2422. battery_meter_set_fg_int();
  2423. }
  2424. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  2425. /* // Internal API */
  2426. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  2427. int bat_routine_thread(void *x)
  2428. {
  2429. ktime_t ktime = ktime_set(3, 0); /* 10s, 10* 1000 ms */
  2430. /* Run on a process content */
  2431. while (1) {
  2432. wake_lock(&battery_meter_lock);
  2433. mutex_lock(&bat_mutex);
  2434. if (((chargin_hw_init_done == KAL_TRUE) && (battery_suspended == KAL_FALSE))
  2435. || ((chargin_hw_init_done == KAL_TRUE) && (chr_wake_up_bat == KAL_TRUE)))
  2436. BAT_thread();
  2437. if (chr_wake_up_bat == KAL_TRUE)
  2438. chr_wake_up_bat = KAL_FALSE;
  2439. mutex_unlock(&bat_mutex);
  2440. wake_unlock(&battery_meter_lock);
  2441. battery_log(BAT_LOG_CRTI, "wait event 1\n");
  2442. wait_event(bat_routine_wq, (bat_routine_thread_timeout == KAL_TRUE));
  2443. bat_routine_thread_timeout = KAL_FALSE;
  2444. hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);
  2445. ktime = ktime_set(BAT_TASK_PERIOD, 0); /* 10s, 10* 1000 ms */
  2446. if (chr_wake_up_bat == KAL_TRUE && g_smartbook_update != 1) {
  2447. /* for charger plug in/ out */
  2448. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2449. if (DISO_data.chr_get_diso_state) {
  2450. DISO_data.chr_get_diso_state = KAL_FALSE;
  2451. battery_charging_control(CHARGING_CMD_GET_DISO_STATE, &DISO_data);
  2452. }
  2453. #endif
  2454. g_smartbook_update = 0;
  2455. /* battery_meter_reset(); */
  2456. /* chr_wake_up_bat = KAL_FALSE; */
  2457. }
  2458. }
  2459. return 0;
  2460. }
  2461. void bat_thread_wakeup(void)
  2462. {
  2463. battery_log(BAT_LOG_FULL, "******** battery : bat_thread_wakeup ********\n");
  2464. bat_routine_thread_timeout = KAL_TRUE;
  2465. bat_meter_timeout = KAL_TRUE;
  2466. battery_meter_reset_sleep_time();
  2467. wake_up(&bat_routine_wq);
  2468. }
  2469. int bat_update_thread(void *x)
  2470. {
  2471. /* Run on a process content */
  2472. while (1) {
  2473. mutex_lock(&bat_update_mutex);
  2474. #ifdef USING_SMOOTH_UI_SOC2
  2475. battery_meter_smooth_uisoc2();
  2476. #endif
  2477. mt_battery_update_status();
  2478. mutex_unlock(&bat_update_mutex);
  2479. battery_log(BAT_LOG_CRTI, "wait event 2\n");
  2480. wait_event(bat_update_wq, (bat_update_thread_timeout == KAL_TRUE));
  2481. bat_update_thread_timeout = KAL_FALSE;
  2482. }
  2483. return 0;
  2484. }
  2485. void bat_update_thread_wakeup(void)
  2486. {
  2487. battery_log(BAT_LOG_FULL, "******** battery : bat_update_thread_wakeup ********\n");
  2488. bat_update_thread_timeout = KAL_TRUE;
  2489. wake_up(&bat_update_wq);
  2490. }
  2491. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  2492. /* // fop API */
  2493. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  2494. static long adc_cali_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  2495. {
  2496. int *user_data_addr;
  2497. int *naram_data_addr;
  2498. int i = 0;
  2499. int ret = 0;
  2500. int adc_in_data[2] = { 1, 1 };
  2501. int adc_out_data[2] = { 1, 1 };
  2502. mutex_lock(&bat_mutex);
  2503. switch (cmd) {
  2504. case TEST_ADC_CALI_PRINT:
  2505. g_ADC_Cali = KAL_FALSE;
  2506. break;
  2507. case SET_ADC_CALI_Slop:
  2508. naram_data_addr = (int *)arg;
  2509. ret = copy_from_user(adc_cali_slop, naram_data_addr, 36);
  2510. g_ADC_Cali = KAL_FALSE; /* enable calibration after setting ADC_CALI_Cal */
  2511. /* Protection */
  2512. for (i = 0; i < 14; i++) {
  2513. if ((*(adc_cali_slop + i) == 0) || (*(adc_cali_slop + i) == 1))
  2514. *(adc_cali_slop + i) = 1000;
  2515. }
  2516. for (i = 0; i < 14; i++)
  2517. battery_log(BAT_LOG_CRTI, "adc_cali_slop[%d] = %d\n", i,
  2518. *(adc_cali_slop + i));
  2519. battery_log(BAT_LOG_FULL, "**** unlocked_ioctl : SET_ADC_CALI_Slop Done!\n");
  2520. break;
  2521. case SET_ADC_CALI_Offset:
  2522. naram_data_addr = (int *)arg;
  2523. ret = copy_from_user(adc_cali_offset, naram_data_addr, 36);
  2524. g_ADC_Cali = KAL_FALSE; /* enable calibration after setting ADC_CALI_Cal */
  2525. for (i = 0; i < 14; i++)
  2526. battery_log(BAT_LOG_CRTI, "adc_cali_offset[%d] = %d\n", i,
  2527. *(adc_cali_offset + i));
  2528. battery_log(BAT_LOG_FULL, "**** unlocked_ioctl : SET_ADC_CALI_Offset Done!\n");
  2529. break;
  2530. case SET_ADC_CALI_Cal:
  2531. naram_data_addr = (int *)arg;
  2532. ret = copy_from_user(adc_cali_cal, naram_data_addr, 4);
  2533. g_ADC_Cali = KAL_TRUE;
  2534. if (adc_cali_cal[0] == 1)
  2535. g_ADC_Cali = KAL_TRUE;
  2536. else
  2537. g_ADC_Cali = KAL_FALSE;
  2538. for (i = 0; i < 1; i++)
  2539. battery_log(BAT_LOG_CRTI, "adc_cali_cal[%d] = %d\n", i,
  2540. *(adc_cali_cal + i));
  2541. battery_log(BAT_LOG_FULL, "**** unlocked_ioctl : SET_ADC_CALI_Cal Done!\n");
  2542. break;
  2543. case ADC_CHANNEL_READ:
  2544. /* g_ADC_Cali = KAL_FALSE; *//* 20100508 Infinity */
  2545. user_data_addr = (int *)arg;
  2546. ret = copy_from_user(adc_in_data, user_data_addr, 8); /* 2*int = 2*4 */
  2547. if (adc_in_data[0] == 0) {
  2548. /* I_SENSE */
  2549. adc_out_data[0] = battery_meter_get_VSense() * adc_in_data[1];
  2550. } else if (adc_in_data[0] == 1) {
  2551. /* BAT_SENSE */
  2552. adc_out_data[0] =
  2553. battery_meter_get_battery_voltage(KAL_TRUE) * adc_in_data[1];
  2554. } else if (adc_in_data[0] == 3) {
  2555. /* V_Charger */
  2556. adc_out_data[0] = battery_meter_get_charger_voltage() * adc_in_data[1];
  2557. /* adc_out_data[0] = adc_out_data[0] / 100; */
  2558. } else if (adc_in_data[0] == 30) {
  2559. /* V_Bat_temp magic number */
  2560. adc_out_data[0] = battery_meter_get_battery_temperature() * adc_in_data[1];
  2561. } else if (adc_in_data[0] == 66) {
  2562. adc_out_data[0] = (battery_meter_get_battery_current()) / 10;
  2563. if (battery_meter_get_battery_current_sign() == KAL_TRUE)
  2564. adc_out_data[0] = 0 - adc_out_data[0]; /* charging */
  2565. } else {
  2566. battery_log(BAT_LOG_FULL, "unknown channel(%d,%d)\n",
  2567. adc_in_data[0], adc_in_data[1]);
  2568. }
  2569. if (adc_out_data[0] < 0)
  2570. adc_out_data[1] = 1; /* failed */
  2571. else
  2572. adc_out_data[1] = 0; /* success */
  2573. if (adc_in_data[0] == 30)
  2574. adc_out_data[1] = 0; /* success */
  2575. if (adc_in_data[0] == 66)
  2576. adc_out_data[1] = 0; /* success */
  2577. ret = copy_to_user(user_data_addr, adc_out_data, 8);
  2578. battery_log(BAT_LOG_CRTI,
  2579. "**** unlocked_ioctl : Channel %d * %d times = %d\n",
  2580. adc_in_data[0], adc_in_data[1], adc_out_data[0]);
  2581. break;
  2582. case BAT_STATUS_READ:
  2583. user_data_addr = (int *)arg;
  2584. ret = copy_from_user(battery_in_data, user_data_addr, 4);
  2585. /* [0] is_CAL */
  2586. if (g_ADC_Cali)
  2587. battery_out_data[0] = 1;
  2588. else
  2589. battery_out_data[0] = 0;
  2590. ret = copy_to_user(user_data_addr, battery_out_data, 4);
  2591. battery_log(BAT_LOG_CRTI, "**** unlocked_ioctl : CAL:%d\n", battery_out_data[0]);
  2592. break;
  2593. case Set_Charger_Current: /* For Factory Mode */
  2594. user_data_addr = (int *)arg;
  2595. ret = copy_from_user(charging_level_data, user_data_addr, 4);
  2596. g_ftm_battery_flag = KAL_TRUE;
  2597. if (charging_level_data[0] == 0)
  2598. charging_level_data[0] = CHARGE_CURRENT_70_00_MA;
  2599. else if (charging_level_data[0] == 1)
  2600. charging_level_data[0] = CHARGE_CURRENT_200_00_MA;
  2601. else if (charging_level_data[0] == 2)
  2602. charging_level_data[0] = CHARGE_CURRENT_400_00_MA;
  2603. else if (charging_level_data[0] == 3)
  2604. charging_level_data[0] = CHARGE_CURRENT_450_00_MA;
  2605. else if (charging_level_data[0] == 4)
  2606. charging_level_data[0] = CHARGE_CURRENT_550_00_MA;
  2607. else if (charging_level_data[0] == 5)
  2608. charging_level_data[0] = CHARGE_CURRENT_650_00_MA;
  2609. else if (charging_level_data[0] == 6)
  2610. charging_level_data[0] = CHARGE_CURRENT_700_00_MA;
  2611. else if (charging_level_data[0] == 7)
  2612. charging_level_data[0] = CHARGE_CURRENT_800_00_MA;
  2613. else if (charging_level_data[0] == 8)
  2614. charging_level_data[0] = CHARGE_CURRENT_900_00_MA;
  2615. else if (charging_level_data[0] == 9)
  2616. charging_level_data[0] = CHARGE_CURRENT_1000_00_MA;
  2617. else if (charging_level_data[0] == 10)
  2618. charging_level_data[0] = CHARGE_CURRENT_1100_00_MA;
  2619. else if (charging_level_data[0] == 11)
  2620. charging_level_data[0] = CHARGE_CURRENT_1200_00_MA;
  2621. else if (charging_level_data[0] == 12)
  2622. charging_level_data[0] = CHARGE_CURRENT_1300_00_MA;
  2623. else if (charging_level_data[0] == 13)
  2624. charging_level_data[0] = CHARGE_CURRENT_1400_00_MA;
  2625. else if (charging_level_data[0] == 14)
  2626. charging_level_data[0] = CHARGE_CURRENT_1500_00_MA;
  2627. else if (charging_level_data[0] == 15)
  2628. charging_level_data[0] = CHARGE_CURRENT_1600_00_MA;
  2629. else
  2630. charging_level_data[0] = CHARGE_CURRENT_450_00_MA;
  2631. wake_up_bat();
  2632. battery_log(BAT_LOG_CRTI, "**** unlocked_ioctl : set_Charger_Current:%d\n",
  2633. charging_level_data[0]);
  2634. break;
  2635. /* add for meta tool------------------------------- */
  2636. case Get_META_BAT_VOL:
  2637. user_data_addr = (int *)arg;
  2638. ret = copy_from_user(adc_in_data, user_data_addr, 8);
  2639. adc_out_data[0] = BMT_status.bat_vol;
  2640. ret = copy_to_user(user_data_addr, adc_out_data, 8);
  2641. break;
  2642. case Get_META_BAT_SOC:
  2643. user_data_addr = (int *)arg;
  2644. ret = copy_from_user(adc_in_data, user_data_addr, 8);
  2645. adc_out_data[0] = BMT_status.UI_SOC2;
  2646. ret = copy_to_user(user_data_addr, adc_out_data, 8);
  2647. break;
  2648. /* add bing meta tool------------------------------- */
  2649. default:
  2650. g_ADC_Cali = KAL_FALSE;
  2651. break;
  2652. }
  2653. mutex_unlock(&bat_mutex);
  2654. return 0;
  2655. }
  2656. static int adc_cali_open(struct inode *inode, struct file *file)
  2657. {
  2658. return 0;
  2659. }
  2660. static int adc_cali_release(struct inode *inode, struct file *file)
  2661. {
  2662. return 0;
  2663. }
  2664. static const struct file_operations adc_cali_fops = {
  2665. .owner = THIS_MODULE,
  2666. .unlocked_ioctl = adc_cali_ioctl,
  2667. .open = adc_cali_open,
  2668. .release = adc_cali_release,
  2669. };
  2670. void check_battery_exist(void)
  2671. {
  2672. #if defined(CONFIG_DIS_CHECK_BATTERY)
  2673. battery_log(BAT_LOG_CRTI, "[BATTERY] Disable check battery exist.\n");
  2674. #else
  2675. unsigned int baton_count = 0;
  2676. unsigned int charging_enable = KAL_FALSE;
  2677. unsigned int battery_status;
  2678. unsigned int i;
  2679. for (i = 0; i < 3; i++) {
  2680. battery_charging_control(CHARGING_CMD_GET_BATTERY_STATUS, &battery_status);
  2681. baton_count += battery_status;
  2682. }
  2683. if (baton_count >= 3) {
  2684. if ((g_platform_boot_mode == META_BOOT) || (g_platform_boot_mode == ADVMETA_BOOT)
  2685. || (g_platform_boot_mode == ATE_FACTORY_BOOT)) {
  2686. battery_log(BAT_LOG_FULL,
  2687. "[BATTERY] boot mode = %d, bypass battery check\n",
  2688. g_platform_boot_mode);
  2689. } else {
  2690. battery_log(BAT_LOG_CRTI,
  2691. "[BATTERY] Battery is not exist, power off FAN5405 and system (%d)\n",
  2692. baton_count);
  2693. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  2694. #ifdef CONFIG_MTK_POWER_PATH_MANAGEMENT_SUPPORT
  2695. battery_charging_control(CHARGING_CMD_SET_PLATFORM_RESET, NULL);
  2696. #else
  2697. battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL);
  2698. #endif
  2699. }
  2700. }
  2701. #endif
  2702. }
  2703. int charger_hv_detect_sw_thread_handler(void *unused)
  2704. {
  2705. ktime_t ktime;
  2706. unsigned int charging_enable;
  2707. unsigned int hv_voltage = batt_cust_data.v_charger_max* 1000;//V_CHARGER_MAX * 1000;
  2708. kal_bool hv_status;
  2709. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2710. hv_voltage = DISO_data.hv_voltage;
  2711. #endif
  2712. do {
  2713. #ifdef CONFIG_MTK_BQ25896_SUPPORT
  2714. /*this annoying SW workaround wakes up bat_thread. 10 secs is set instead of 1 sec */
  2715. ktime = ktime_set(10, 0);
  2716. #else
  2717. ktime = ktime_set(0, BAT_MS_TO_NS(1000));
  2718. #endif
  2719. if (chargin_hw_init_done)
  2720. battery_charging_control(CHARGING_CMD_SET_HV_THRESHOLD, &hv_voltage);
  2721. wait_event_interruptible(charger_hv_detect_waiter,
  2722. (charger_hv_detect_flag == KAL_TRUE));
  2723. if (upmu_is_chr_det() == KAL_TRUE)
  2724. check_battery_exist();
  2725. charger_hv_detect_flag = KAL_FALSE;
  2726. if (chargin_hw_init_done)
  2727. battery_charging_control(CHARGING_CMD_GET_HV_STATUS, &hv_status);
  2728. if (hv_status == KAL_TRUE) {
  2729. battery_log(BAT_LOG_CRTI,
  2730. "[charger_hv_detect_sw_thread_handler] charger hv\n");
  2731. charging_enable = KAL_FALSE;
  2732. if (chargin_hw_init_done)
  2733. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  2734. } else {
  2735. battery_log(BAT_LOG_FULL,
  2736. "[charger_hv_detect_sw_thread_handler] upmu_chr_get_vcdt_hv_det() != 1\n");
  2737. }
  2738. if (chargin_hw_init_done)
  2739. battery_charging_control(CHARGING_CMD_RESET_WATCH_DOG_TIMER, NULL);
  2740. hrtimer_start(&charger_hv_detect_timer, ktime, HRTIMER_MODE_REL);
  2741. } while (!kthread_should_stop());
  2742. return 0;
  2743. }
  2744. enum hrtimer_restart charger_hv_detect_sw_workaround(struct hrtimer *timer)
  2745. {
  2746. charger_hv_detect_flag = KAL_TRUE;
  2747. wake_up_interruptible(&charger_hv_detect_waiter);
  2748. battery_log(BAT_LOG_FULL, "[charger_hv_detect_sw_workaround]\n");
  2749. return HRTIMER_NORESTART;
  2750. }
  2751. void charger_hv_detect_sw_workaround_init(void)
  2752. {
  2753. ktime_t ktime;
  2754. ktime = ktime_set(0, BAT_MS_TO_NS(2000));
  2755. hrtimer_init(&charger_hv_detect_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  2756. charger_hv_detect_timer.function = charger_hv_detect_sw_workaround;
  2757. hrtimer_start(&charger_hv_detect_timer, ktime, HRTIMER_MODE_REL);
  2758. charger_hv_detect_thread =
  2759. kthread_run(charger_hv_detect_sw_thread_handler, 0,
  2760. "mtk charger_hv_detect_sw_workaround");
  2761. if (IS_ERR(charger_hv_detect_thread)) {
  2762. battery_log(BAT_LOG_FULL,
  2763. "[%s]: failed to create charger_hv_detect_sw_workaround thread\n",
  2764. __func__);
  2765. }
  2766. check_battery_exist();
  2767. battery_log(BAT_LOG_CRTI, "charger_hv_detect_sw_workaround_init : done\n");
  2768. }
  2769. enum hrtimer_restart battery_kthread_hrtimer_func(struct hrtimer *timer)
  2770. {
  2771. bat_thread_wakeup();
  2772. return HRTIMER_NORESTART;
  2773. }
  2774. void battery_kthread_hrtimer_init(void)
  2775. {
  2776. ktime_t ktime;
  2777. #ifdef CONFIG_MTK_BQ25896_SUPPORT
  2778. /*watchdog timer before 40 secs*/
  2779. ktime = ktime_set(10, 0); /* 3s, 10* 1000 ms */
  2780. #else
  2781. ktime = ktime_set(1, 0);
  2782. #endif
  2783. hrtimer_init(&battery_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  2784. battery_kthread_timer.function = battery_kthread_hrtimer_func;
  2785. hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);
  2786. battery_log(BAT_LOG_CRTI, "battery_kthread_hrtimer_init : done\n");
  2787. }
  2788. static void get_charging_control(void)
  2789. {
  2790. battery_charging_control = chr_control_interface;
  2791. }
  2792. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  2793. static irqreturn_t diso_auxadc_irq_thread(int irq, void *dev_id)
  2794. {
  2795. int pre_diso_state = (DISO_data.diso_state.pre_otg_state |
  2796. (DISO_data.diso_state.pre_vusb_state << 1) |
  2797. (DISO_data.diso_state.pre_vdc_state << 2)) & 0x7;
  2798. battery_log(BAT_LOG_CRTI,
  2799. "[DISO]auxadc IRQ threaded handler triggered, pre_diso_state is %s\n",
  2800. DISO_state_s[pre_diso_state]);
  2801. switch (pre_diso_state) {
  2802. #ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */
  2803. case USB_ONLY:
  2804. #endif
  2805. case OTG_ONLY:
  2806. BMT_status.charger_exist = KAL_TRUE;
  2807. wake_lock(&battery_suspend_lock);
  2808. wake_up_bat();
  2809. break;
  2810. case DC_WITH_OTG:
  2811. BMT_status.charger_exist = KAL_FALSE;
  2812. /* need stop charger quickly */
  2813. battery_charging_control(CHARGING_CMD_ENABLE, &BMT_status.charger_exist);
  2814. BMT_status.charger_exist = KAL_FALSE; /* reset charger status */
  2815. BMT_status.charger_type = CHARGER_UNKNOWN;
  2816. wake_unlock(&battery_suspend_lock);
  2817. wake_up_bat();
  2818. break;
  2819. case DC_WITH_USB:
  2820. /* usb delayed work will reflact BMT_staus , so need update state ASAP */
  2821. if ((BMT_status.charger_type == STANDARD_HOST)
  2822. || (BMT_status.charger_type == CHARGING_HOST))
  2823. mt_usb_disconnect(); /* disconnect if connected */
  2824. BMT_status.charger_type = CHARGER_UNKNOWN; /* reset chr_type */
  2825. wake_up_bat();
  2826. break;
  2827. case DC_ONLY:
  2828. BMT_status.charger_type = CHARGER_UNKNOWN;
  2829. mt_battery_charger_detect_check(); /* plug in VUSB, check if need connect usb */
  2830. break;
  2831. default:
  2832. battery_log(BAT_LOG_CRTI,
  2833. "[DISO]VUSB auxadc threaded handler triggered ERROR OR TEST\n");
  2834. break;
  2835. }
  2836. return IRQ_HANDLED;
  2837. }
  2838. static void dual_input_init(void)
  2839. {
  2840. DISO_data.irq_callback_func = diso_auxadc_irq_thread;
  2841. battery_charging_control(CHARGING_CMD_DISO_INIT, &DISO_data);
  2842. }
  2843. #endif
  2844. int __batt_init_cust_data_from_cust_header(void)
  2845. {
  2846. /* mt_charging.h */
  2847. /* stop charging while in talking mode */
  2848. #if defined(STOP_CHARGING_IN_TAKLING)
  2849. batt_cust_data.stop_charging_in_takling = 1;
  2850. #else /* #if defined(STOP_CHARGING_IN_TAKLING) */
  2851. batt_cust_data.stop_charging_in_takling = 0;
  2852. #endif /* #if defined(STOP_CHARGING_IN_TAKLING) */
  2853. #if defined(TALKING_RECHARGE_VOLTAGE)
  2854. batt_cust_data.talking_recharge_voltage = TALKING_RECHARGE_VOLTAGE;
  2855. #endif
  2856. #if defined(TALKING_SYNC_TIME)
  2857. batt_cust_data.talking_sync_time = TALKING_SYNC_TIME;
  2858. #endif
  2859. /* Battery Temperature Protection */
  2860. #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT)
  2861. batt_cust_data.mtk_temperature_recharge_support = 1;
  2862. #else /* #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT) */
  2863. batt_cust_data.mtk_temperature_recharge_support = 0;
  2864. #endif /* #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT) */
  2865. #if defined(MAX_CHARGE_TEMPERATURE)
  2866. batt_cust_data.max_charge_temperature = MAX_CHARGE_TEMPERATURE;
  2867. #endif
  2868. #if defined(MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE)
  2869. batt_cust_data.max_charge_temperature_minus_x_degree =
  2870. MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE;
  2871. #endif
  2872. #if defined(MIN_CHARGE_TEMPERATURE)
  2873. batt_cust_data.min_charge_temperature = MIN_CHARGE_TEMPERATURE;
  2874. #endif
  2875. #if defined(MIN_CHARGE_TEMPERATURE_PLUS_X_DEGREE)
  2876. batt_cust_data.min_charge_temperature_plus_x_degree = MIN_CHARGE_TEMPERATURE_PLUS_X_DEGREE;
  2877. #endif
  2878. #if defined(ERR_CHARGE_TEMPERATURE)
  2879. batt_cust_data.err_charge_temperature = ERR_CHARGE_TEMPERATURE;
  2880. #endif
  2881. /* Linear Charging Threshold */
  2882. #if defined(V_PRE2CC_THRES)
  2883. batt_cust_data.v_pre2cc_thres = V_PRE2CC_THRES;
  2884. #endif
  2885. #if defined(V_CC2TOPOFF_THRES)
  2886. batt_cust_data.v_cc2topoff_thres = V_CC2TOPOFF_THRES;
  2887. #endif
  2888. #if defined(RECHARGING_VOLTAGE)
  2889. batt_cust_data.recharging_voltage = RECHARGING_VOLTAGE;
  2890. #endif
  2891. #if defined(CHARGING_FULL_CURRENT)
  2892. batt_cust_data.charging_full_current = CHARGING_FULL_CURRENT;
  2893. #endif
  2894. /* Charging Current Setting */
  2895. #if defined(CONFIG_USB_IF)
  2896. batt_cust_data.config_usb_if = 1;
  2897. #else /* #if defined(CONFIG_USB_IF) */
  2898. batt_cust_data.config_usb_if = 0;
  2899. #endif /* #if defined(CONFIG_USB_IF) */
  2900. #if defined(USB_CHARGER_CURRENT_SUSPEND)
  2901. batt_cust_data.usb_charger_current_suspend = USB_CHARGER_CURRENT_SUSPEND;
  2902. #endif
  2903. #if defined(USB_CHARGER_CURRENT_UNCONFIGURED)
  2904. batt_cust_data.usb_charger_current_unconfigured = USB_CHARGER_CURRENT_UNCONFIGURED;
  2905. #endif
  2906. #if defined(USB_CHARGER_CURRENT_CONFIGURED)
  2907. batt_cust_data.usb_charger_current_configured = USB_CHARGER_CURRENT_CONFIGURED;
  2908. #endif
  2909. #if defined(USB_CHARGER_CURRENT)
  2910. batt_cust_data.usb_charger_current = USB_CHARGER_CURRENT;
  2911. #endif
  2912. #if defined(AC_CHARGER_INPUT_CURRENT)
  2913. batt_cust_data.ac_charger_input_current = AC_CHARGER_INPUT_CURRENT;
  2914. #endif
  2915. #if defined(AC_CHARGER_CURRENT)
  2916. batt_cust_data.ac_charger_current = AC_CHARGER_CURRENT;
  2917. #endif
  2918. #if defined(NON_STD_AC_CHARGER_CURRENT)
  2919. batt_cust_data.non_std_ac_charger_current = NON_STD_AC_CHARGER_CURRENT;
  2920. #endif
  2921. #if defined(CHARGING_HOST_CHARGER_CURRENT)
  2922. batt_cust_data.charging_host_charger_current = CHARGING_HOST_CHARGER_CURRENT;
  2923. #endif
  2924. #if defined(APPLE_0_5A_CHARGER_CURRENT)
  2925. batt_cust_data.apple_0_5a_charger_current = APPLE_0_5A_CHARGER_CURRENT;
  2926. #endif
  2927. #if defined(APPLE_1_0A_CHARGER_CURRENT)
  2928. batt_cust_data.apple_1_0a_charger_current = APPLE_1_0A_CHARGER_CURRENT;
  2929. #endif
  2930. #if defined(APPLE_2_1A_CHARGER_CURRENT)
  2931. batt_cust_data.apple_2_1a_charger_current = APPLE_2_1A_CHARGER_CURRENT;
  2932. #endif
  2933. /* Precise Tunning
  2934. batt_cust_data.battery_average_data_number = BATTERY_AVERAGE_DATA_NUMBER;
  2935. batt_cust_data.battery_average_size = BATTERY_AVERAGE_SIZE;
  2936. */
  2937. /* charger error check */
  2938. #if defined(BAT_LOW_TEMP_PROTECT_ENABLE)
  2939. batt_cust_data.bat_low_temp_protect_enable = 1;
  2940. #else /* #if defined(BAT_LOW_TEMP_PROTECT_ENABLE) */
  2941. batt_cust_data.bat_low_temp_protect_enable = 0;
  2942. #endif /* #if defined(BAT_LOW_TEMP_PROTECT_ENABLE) */
  2943. #if defined(V_CHARGER_ENABLE)
  2944. batt_cust_data.v_charger_enable = V_CHARGER_ENABLE;
  2945. #endif
  2946. #if defined(V_CHARGER_MAX)
  2947. batt_cust_data.v_charger_max = V_CHARGER_MAX;
  2948. #endif
  2949. #if defined(V_CHARGER_MIN)
  2950. batt_cust_data.v_charger_min = V_CHARGER_MIN;
  2951. #endif
  2952. /* Tracking TIME */
  2953. #if defined(ONEHUNDRED_PERCENT_TRACKING_TIME)
  2954. batt_cust_data.onehundred_percent_tracking_time = ONEHUNDRED_PERCENT_TRACKING_TIME;
  2955. #endif
  2956. #if defined(NPERCENT_TRACKING_TIME)
  2957. batt_cust_data.npercent_tracking_time = NPERCENT_TRACKING_TIME;
  2958. #endif
  2959. #if defined(SYNC_TO_REAL_TRACKING_TIME)
  2960. batt_cust_data.sync_to_real_tracking_time = SYNC_TO_REAL_TRACKING_TIME;
  2961. #endif
  2962. #if defined(V_0PERCENT_TRACKING)
  2963. batt_cust_data.v_0percent_tracking = V_0PERCENT_TRACKING;
  2964. #endif
  2965. /* High battery support */
  2966. #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT)
  2967. batt_cust_data.high_battery_voltage_support = 1;
  2968. #else /* #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT) */
  2969. batt_cust_data.high_battery_voltage_support = 0;
  2970. #endif /* #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT) */
  2971. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  2972. batt_cust_data.mtk_pump_express_plus_support = 1;
  2973. #if defined(TA_START_BATTERY_SOC)
  2974. batt_cust_data.ta_start_battery_soc = TA_START_BATTERY_SOC;
  2975. #endif
  2976. #if defined(TA_STOP_BATTERY_SOC)
  2977. batt_cust_data.ta_stop_battery_soc = TA_STOP_BATTERY_SOC;
  2978. #endif
  2979. #if defined(TA_AC_12V_INPUT_CURRENT)
  2980. batt_cust_data.ta_ac_12v_input_current = TA_AC_12V_INPUT_CURRENT;
  2981. #endif
  2982. #if defined(TA_AC_9V_INPUT_CURRENT)
  2983. batt_cust_data.ta_ac_9v_input_current = TA_AC_9V_INPUT_CURRENT;
  2984. #endif
  2985. #if defined(TA_AC_7V_INPUT_CURRENT)
  2986. batt_cust_data.ta_ac_7v_input_current = TA_AC_7V_INPUT_CURRENT;
  2987. #endif
  2988. #if defined(TA_AC_CHARGING_CURRENT)
  2989. batt_cust_data.ta_ac_charging_current = TA_AC_CHARGING_CURRENT;
  2990. #endif
  2991. #if defined(TA_9V_SUPPORT)
  2992. batt_cust_data.ta_9v_support = 1;
  2993. #endif
  2994. #if defined(TA_12V_SUPPORT)
  2995. batt_cust_data.ta_12v_support = 1;
  2996. #endif
  2997. #endif
  2998. return 0;
  2999. }
  3000. #if defined(CONFIG_OF)
  3001. static void __batt_parse_node(const struct device_node *np,
  3002. const char *node_srting, int *cust_val)
  3003. {
  3004. u32 val;
  3005. if (of_property_read_u32(np, node_srting, &val) == 0) {
  3006. (*cust_val) = (int)val;
  3007. battery_log(BAT_LOG_FULL, "Get %s: %d\n", node_srting, (*cust_val));
  3008. } else {
  3009. battery_log(BAT_LOG_CRTI, "Get %s failed\n", node_srting);
  3010. }
  3011. }
  3012. static int __batt_init_cust_data_from_dt(void)
  3013. {
  3014. /* struct device_node *np = dev->dev.of_node; */
  3015. struct device_node *np;
  3016. /* check customer setting */
  3017. np = of_find_compatible_node(NULL, NULL, "mediatek,battery");
  3018. if (!np) {
  3019. /* printk(KERN_ERR "(E) Failed to find device-tree node: %s\n", path); */
  3020. battery_log(BAT_LOG_CRTI, "Failed to find device-tree node: bat_comm\n");
  3021. return -ENODEV;
  3022. }
  3023. __batt_parse_node(np, "stop_charging_in_takling",
  3024. &batt_cust_data.stop_charging_in_takling);
  3025. __batt_parse_node(np, "talking_recharge_voltage",
  3026. &batt_cust_data.talking_recharge_voltage);
  3027. __batt_parse_node(np, "talking_sync_time",
  3028. &batt_cust_data.talking_sync_time);
  3029. __batt_parse_node(np, "mtk_temperature_recharge_support",
  3030. &batt_cust_data.mtk_temperature_recharge_support);
  3031. __batt_parse_node(np, "max_charge_temperature",
  3032. &batt_cust_data.max_charge_temperature);
  3033. __batt_parse_node(np, "max_charge_temperature_minus_x_degree",
  3034. &batt_cust_data.max_charge_temperature_minus_x_degree);
  3035. __batt_parse_node(np, "min_charge_temperature",
  3036. &batt_cust_data.min_charge_temperature);
  3037. __batt_parse_node(np, "min_charge_temperature_plus_x_degree",
  3038. &batt_cust_data.min_charge_temperature_plus_x_degree);
  3039. __batt_parse_node(np, "err_charge_temperature",
  3040. &batt_cust_data.err_charge_temperature);
  3041. __batt_parse_node(np, "v_pre2cc_thres",
  3042. &batt_cust_data.v_pre2cc_thres);
  3043. __batt_parse_node(np, "v_cc2topoff_thres",
  3044. &batt_cust_data.v_cc2topoff_thres);
  3045. __batt_parse_node(np, "recharging_voltage",
  3046. &batt_cust_data.recharging_voltage);
  3047. __batt_parse_node(np, "charging_full_current",
  3048. &batt_cust_data.charging_full_current);
  3049. __batt_parse_node(np, "config_usb_if",
  3050. &batt_cust_data.config_usb_if);
  3051. __batt_parse_node(np, "usb_charger_current_suspend",
  3052. &batt_cust_data.usb_charger_current_suspend);
  3053. __batt_parse_node(np, "usb_charger_current_unconfigured",
  3054. &batt_cust_data.usb_charger_current_unconfigured);
  3055. __batt_parse_node(np, "usb_charger_current_configured",
  3056. &batt_cust_data.usb_charger_current_configured);
  3057. __batt_parse_node(np, "usb_charger_current",
  3058. &batt_cust_data.usb_charger_current);
  3059. __batt_parse_node(np, "ac_charger_input_current",
  3060. &batt_cust_data.ac_charger_input_current);
  3061. __batt_parse_node(np, "ac_charger_current",
  3062. &batt_cust_data.ac_charger_current);
  3063. __batt_parse_node(np, "non_std_ac_charger_current",
  3064. &batt_cust_data.non_std_ac_charger_current);
  3065. __batt_parse_node(np, "charging_host_charger_current",
  3066. &batt_cust_data.charging_host_charger_current);
  3067. __batt_parse_node(np, "apple_0_5a_charger_current",
  3068. &batt_cust_data.apple_0_5a_charger_current);
  3069. __batt_parse_node(np, "apple_1_0a_charger_current",
  3070. &batt_cust_data.apple_1_0a_charger_current);
  3071. __batt_parse_node(np, "apple_2_1a_charger_current",
  3072. &batt_cust_data.apple_2_1a_charger_current);
  3073. __batt_parse_node(np, "bat_low_temp_protect_enable",
  3074. &batt_cust_data.bat_low_temp_protect_enable);
  3075. __batt_parse_node(np, "v_charger_enable",
  3076. &batt_cust_data.v_charger_enable);
  3077. __batt_parse_node(np, "v_charger_max",
  3078. &batt_cust_data.v_charger_max);
  3079. __batt_parse_node(np, "v_charger_min",
  3080. &batt_cust_data.v_charger_min);
  3081. __batt_parse_node(np, "onehundred_percent_tracking_time",
  3082. &batt_cust_data.onehundred_percent_tracking_time);
  3083. __batt_parse_node(np, "npercent_tracking_time",
  3084. &batt_cust_data.npercent_tracking_time);
  3085. __batt_parse_node(np, "sync_to_real_tracking_time",
  3086. &batt_cust_data.sync_to_real_tracking_time);
  3087. __batt_parse_node(np, "v_0percent_tracking",
  3088. &batt_cust_data.v_0percent_tracking);
  3089. __batt_parse_node(np, "high_battery_voltage_support",
  3090. &batt_cust_data.high_battery_voltage_support);
  3091. __batt_parse_node(np, "mtk_jeita_standard_support",
  3092. &batt_cust_data.mtk_jeita_standard_support);
  3093. __batt_parse_node(np, "cust_soc_jeita_sync_time",
  3094. &batt_cust_data.cust_soc_jeita_sync_time);
  3095. __batt_parse_node(np, "jeita_recharge_voltage",
  3096. &batt_cust_data.jeita_recharge_voltage);
  3097. __batt_parse_node(np, "jeita_temp_above_pos_60_cv_voltage",
  3098. &batt_cust_data.jeita_temp_above_pos_60_cv_voltage);
  3099. __batt_parse_node(np, "jeita_temp_pos_10_to_pos_45_cv_voltage",
  3100. &batt_cust_data.jeita_temp_pos_10_to_pos_45_cv_voltage);
  3101. __batt_parse_node(np, "jeita_temp_pos_0_to_pos_10_cv_voltage",
  3102. &batt_cust_data.jeita_temp_pos_0_to_pos_10_cv_voltage);
  3103. __batt_parse_node(np, "jeita_temp_neg_10_to_pos_0_cv_voltage",
  3104. &batt_cust_data.jeita_temp_neg_10_to_pos_0_cv_voltage);
  3105. __batt_parse_node(np, "jeita_temp_below_neg_10_cv_voltage",
  3106. &batt_cust_data.jeita_temp_below_neg_10_cv_voltage);
  3107. __batt_parse_node(np, "jeita_neg_10_to_pos_0_full_current",
  3108. &batt_cust_data.jeita_neg_10_to_pos_0_full_current);
  3109. __batt_parse_node(np, "jeita_temp_pos_45_to_pos_60_recharge_voltage",
  3110. &batt_cust_data.jeita_temp_pos_45_to_pos_60_recharge_voltage);
  3111. __batt_parse_node(np, "jeita_temp_pos_10_to_pos_45_recharge_voltage",
  3112. &batt_cust_data.jeita_temp_pos_10_to_pos_45_recharge_voltage);
  3113. __batt_parse_node(np, "jeita_temp_pos_0_to_pos_10_recharge_voltage",
  3114. &batt_cust_data.jeita_temp_pos_0_to_pos_10_recharge_voltage);
  3115. __batt_parse_node(np, "jeita_temp_neg_10_to_pos_0_recharge_voltage",
  3116. &batt_cust_data.jeita_temp_neg_10_to_pos_0_recharge_voltage);
  3117. __batt_parse_node(np, "jeita_temp_pos_45_to_pos_60_cc2topoff_threshold",
  3118. &batt_cust_data.jeita_temp_pos_45_to_pos_60_cc2topoff_threshold);
  3119. __batt_parse_node(np, "jeita_temp_pos_10_to_pos_45_cc2topoff_threshold",
  3120. &batt_cust_data.jeita_temp_pos_10_to_pos_45_cc2topoff_threshold);
  3121. __batt_parse_node(np, "jeita_temp_pos_0_to_pos_10_cc2topoff_threshold",
  3122. &batt_cust_data.jeita_temp_pos_0_to_pos_10_cc2topoff_threshold);
  3123. __batt_parse_node(np, "jeita_temp_neg_10_to_pos_0_cc2topoff_threshold",
  3124. &batt_cust_data.jeita_temp_neg_10_to_pos_0_cc2topoff_threshold);
  3125. #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  3126. __batt_parse_node(np, "mtk_pump_express_plus_support",
  3127. &batt_cust_data.mtk_pump_express_plus_support);
  3128. __batt_parse_node(np, "ta_start_battery_soc",
  3129. &batt_cust_data.ta_start_battery_soc);
  3130. __batt_parse_node(np, "ta_stop_battery_soc",
  3131. &batt_cust_data.ta_stop_battery_soc);
  3132. __batt_parse_node(np, "ta_ac_12v_input_current",
  3133. &batt_cust_data.ta_ac_12v_input_current);
  3134. __batt_parse_node(np, "ta_ac_9v_input_current",
  3135. &batt_cust_data.ta_ac_9v_input_current);
  3136. __batt_parse_node(np, "ta_ac_7v_input_current",
  3137. &batt_cust_data.ta_ac_7v_input_current);
  3138. __batt_parse_node(np, "ta_ac_charging_current",
  3139. &batt_cust_data.ta_ac_charging_current);
  3140. __batt_parse_node(np, "ta_9v_support",
  3141. &batt_cust_data.ta_9v_support);
  3142. __batt_parse_node(np, "ta_12v_support",
  3143. &batt_cust_data.ta_12v_support);
  3144. #endif
  3145. return 0;
  3146. }
  3147. #endif
  3148. int batt_init_cust_data(void)
  3149. {
  3150. __batt_init_cust_data_from_cust_header();
  3151. #if defined(CONFIG_OF)
  3152. battery_log(BAT_LOG_CRTI, "battery custom init by DTS\n");
  3153. __batt_init_cust_data_from_dt();
  3154. #endif
  3155. return 0;
  3156. }
  3157. static int battery_probe(struct platform_device *dev)
  3158. {
  3159. struct class_device *class_dev = NULL;
  3160. int ret = 0;
  3161. battery_log(BAT_LOG_CRTI, "******** battery driver probe!! ********\n");
  3162. get_monotonic_boottime(&batteryThreadRunTime);
  3163. /* Integrate with NVRAM */
  3164. ret = alloc_chrdev_region(&adc_cali_devno, 0, 1, ADC_CALI_DEVNAME);
  3165. if (ret)
  3166. battery_log(BAT_LOG_CRTI, "Error: Can't Get Major number for adc_cali\n");
  3167. adc_cali_cdev = cdev_alloc();
  3168. adc_cali_cdev->owner = THIS_MODULE;
  3169. adc_cali_cdev->ops = &adc_cali_fops;
  3170. ret = cdev_add(adc_cali_cdev, adc_cali_devno, 1);
  3171. if (ret)
  3172. battery_log(BAT_LOG_CRTI, "adc_cali Error: cdev_add\n");
  3173. adc_cali_major = MAJOR(adc_cali_devno);
  3174. adc_cali_class = class_create(THIS_MODULE, ADC_CALI_DEVNAME);
  3175. class_dev = (struct class_device *)device_create(adc_cali_class,
  3176. NULL,
  3177. adc_cali_devno, NULL, ADC_CALI_DEVNAME);
  3178. battery_log(BAT_LOG_CRTI, "[BAT_probe] adc_cali prepare : done !!\n ");
  3179. get_charging_control();
  3180. batt_init_cust_data();
  3181. #if defined(BATTERY_SW_INIT)
  3182. battery_charging_control(CHARGING_CMD_SW_INIT, NULL);
  3183. #endif
  3184. battery_charging_control(CHARGING_CMD_GET_PLATFORM_BOOT_MODE, &g_platform_boot_mode);
  3185. battery_log(BAT_LOG_CRTI, "[BAT_probe] g_platform_boot_mode = %d\n ", g_platform_boot_mode);
  3186. wake_lock_init(&battery_suspend_lock, WAKE_LOCK_SUSPEND, "battery suspend wakelock");
  3187. wake_lock_init(&battery_meter_lock, WAKE_LOCK_SUSPEND, "battery meter wakelock");
  3188. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  3189. wake_lock_init(&TA_charger_suspend_lock, WAKE_LOCK_SUSPEND, "TA charger suspend wakelock");
  3190. #endif
  3191. /* Integrate with Android Battery Service */
  3192. ret = power_supply_register(&(dev->dev), &ac_main.psy);
  3193. if (ret) {
  3194. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register AC Fail !!\n");
  3195. return ret;
  3196. }
  3197. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register AC Success !!\n");
  3198. ret = power_supply_register(&(dev->dev), &usb_main.psy);
  3199. if (ret) {
  3200. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register USB Fail !!\n");
  3201. return ret;
  3202. }
  3203. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register USB Success !!\n");
  3204. ret = power_supply_register(&(dev->dev), &wireless_main.psy);
  3205. if (ret) {
  3206. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register WIRELESS Fail !!\n");
  3207. return ret;
  3208. }
  3209. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register WIRELESS Success !!\n");
  3210. ret = power_supply_register(&(dev->dev), &battery_main.psy);
  3211. if (ret) {
  3212. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register Battery Fail !!\n");
  3213. return ret;
  3214. }
  3215. battery_log(BAT_LOG_CRTI, "[BAT_probe] power_supply_register Battery Success !!\n");
  3216. #if !defined(CONFIG_POWER_EXT)
  3217. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  3218. if (KAL_TRUE == bat_is_ext_power()) {
  3219. battery_main.BAT_STATUS = POWER_SUPPLY_STATUS_FULL;
  3220. battery_main.BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD;
  3221. battery_main.BAT_PRESENT = 1;
  3222. battery_main.BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION;
  3223. battery_main.BAT_CAPACITY = 100;
  3224. battery_main.BAT_batt_vol = 4200;
  3225. battery_main.BAT_batt_temp = 220;
  3226. g_bat_init_flag = KAL_TRUE;
  3227. return 0;
  3228. }
  3229. #endif
  3230. /* For EM */
  3231. {
  3232. int ret_device_file = 0;
  3233. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Charger_Voltage);
  3234. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_0_Slope);
  3235. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_1_Slope);
  3236. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_2_Slope);
  3237. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_3_Slope);
  3238. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_4_Slope);
  3239. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_5_Slope);
  3240. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_6_Slope);
  3241. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_7_Slope);
  3242. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_8_Slope);
  3243. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_9_Slope);
  3244. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_10_Slope);
  3245. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_11_Slope);
  3246. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_12_Slope);
  3247. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_13_Slope);
  3248. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_0_Offset);
  3249. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_1_Offset);
  3250. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_2_Offset);
  3251. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_3_Offset);
  3252. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_4_Offset);
  3253. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_5_Offset);
  3254. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_6_Offset);
  3255. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_7_Offset);
  3256. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_8_Offset);
  3257. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_9_Offset);
  3258. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_10_Offset);
  3259. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_11_Offset);
  3260. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_12_Offset);
  3261. ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_13_Offset);
  3262. ret_device_file =
  3263. device_create_file(&(dev->dev), &dev_attr_ADC_Channel_Is_Calibration);
  3264. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Power_On_Voltage);
  3265. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Power_Off_Voltage);
  3266. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charger_TopOff_Value);
  3267. ret_device_file =
  3268. device_create_file(&(dev->dev), &dev_attr_FG_Battery_CurrentConsumption);
  3269. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_SW_CoulombCounter);
  3270. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charging_CallState);
  3271. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charger_Type);
  3272. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
  3273. ret_device_file = device_create_file(&(dev->dev), &dev_attr_Pump_Express);
  3274. #endif
  3275. }
  3276. /* battery_meter_initial(); //move to mt_battery_GetBatteryData() to decrease booting time */
  3277. /* Initialization BMT Struct */
  3278. BMT_status.bat_exist = KAL_TRUE; /* phone must have battery */
  3279. BMT_status.charger_exist = KAL_FALSE; /* for default, no charger */
  3280. BMT_status.bat_vol = 0;
  3281. BMT_status.ICharging = 0;
  3282. BMT_status.temperature = 0;
  3283. BMT_status.charger_vol = 0;
  3284. BMT_status.total_charging_time = 0;
  3285. BMT_status.PRE_charging_time = 0;
  3286. BMT_status.CC_charging_time = 0;
  3287. BMT_status.TOPOFF_charging_time = 0;
  3288. BMT_status.POSTFULL_charging_time = 0;
  3289. BMT_status.SOC = 0;
  3290. BMT_status.UI_SOC = -100;
  3291. BMT_status.UI_SOC2 = -1;
  3292. BMT_status.bat_charging_state = CHR_PRE;
  3293. BMT_status.bat_in_recharging_state = KAL_FALSE;
  3294. BMT_status.bat_full = KAL_FALSE;
  3295. BMT_status.nPercent_ZCV = 0;
  3296. BMT_status.nPrecent_UI_SOC_check_point = battery_meter_get_battery_nPercent_UI_SOC();
  3297. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  3298. dual_input_init();
  3299. #endif
  3300. /* battery kernel thread for 10s check and charger in/out event */
  3301. /* Replace GPT timer by hrtime */
  3302. battery_kthread_hrtimer_init();
  3303. kthread_run(bat_routine_thread, NULL, "bat_routine_thread");
  3304. kthread_run(bat_update_thread, NULL, "bat_update_thread");
  3305. battery_log(BAT_LOG_CRTI, "[battery_probe] battery kthread init done\n");
  3306. charger_hv_detect_sw_workaround_init();
  3307. /* LOG System Set */
  3308. init_proc_log();
  3309. #else
  3310. /* keep HW alive */
  3311. charger_hv_detect_sw_workaround_init();
  3312. #endif
  3313. g_bat_init_flag = KAL_TRUE;
  3314. #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
  3315. if (g_vcdt_irq_delay_flag == KAL_TRUE)
  3316. do_chrdet_int_task();
  3317. #endif
  3318. return 0;
  3319. }
  3320. static void battery_timer_pause(void)
  3321. {
  3322. /* battery_log(BAT_LOG_CRTI, "******** battery driver suspend!! ********\n" ); */
  3323. #ifdef CONFIG_POWER_EXT
  3324. #else
  3325. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  3326. if (KAL_TRUE == bat_is_ext_power())
  3327. return 0;
  3328. #endif
  3329. mutex_lock(&bat_mutex);
  3330. /* cancel timer */
  3331. hrtimer_cancel(&battery_kthread_timer);
  3332. hrtimer_cancel(&charger_hv_detect_timer);
  3333. battery_suspended = KAL_TRUE;
  3334. mutex_unlock(&bat_mutex);
  3335. battery_log(BAT_LOG_CRTI, "@bs=1@\n");
  3336. #endif
  3337. get_monotonic_boottime(&g_bat_time_before_sleep);
  3338. }
  3339. static void battery_timer_resume(void)
  3340. {
  3341. #ifdef CONFIG_POWER_EXT
  3342. #else
  3343. kal_bool is_pcm_timer_trigger = KAL_FALSE;
  3344. struct timespec bat_time_after_sleep;
  3345. ktime_t ktime, hvtime;
  3346. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  3347. if (KAL_TRUE == bat_is_ext_power())
  3348. return 0;
  3349. #endif
  3350. ktime = ktime_set(BAT_TASK_PERIOD, 0); /* 10s, 10* 1000 ms */
  3351. hvtime = ktime_set(0, BAT_MS_TO_NS(2000));
  3352. get_monotonic_boottime(&bat_time_after_sleep);
  3353. battery_charging_control(CHARGING_CMD_GET_IS_PCM_TIMER_TRIGGER, &is_pcm_timer_trigger);
  3354. battery_log(BAT_LOG_CRTI, "[battery_timer_resume] is_pcm_timer_trigger %d bat_spm_timeout %d lbat %d\n",
  3355. is_pcm_timer_trigger, bat_spm_timeout, battery_meter_get_low_battery_interrupt_status());
  3356. if (is_pcm_timer_trigger == KAL_TRUE || bat_spm_timeout || battery_meter_get_low_battery_interrupt_status()) {
  3357. mutex_lock(&bat_mutex);
  3358. battery_meter_reset_sleep_time();
  3359. BAT_thread();
  3360. mutex_unlock(&bat_mutex);
  3361. } else {
  3362. battery_log(BAT_LOG_CRTI, "battery resume NOT by pcm timer!!\n");
  3363. }
  3364. /* phone call last than x min */
  3365. if (g_call_state == CALL_ACTIVE
  3366. && (bat_time_after_sleep.tv_sec - g_bat_time_before_sleep.tv_sec >=
  3367. TALKING_SYNC_TIME)) {
  3368. BMT_status.UI_SOC = battery_meter_get_battery_percentage();
  3369. battery_log(BAT_LOG_CRTI, "Sync UI SOC to SOC immediately\n");
  3370. }
  3371. mutex_lock(&bat_mutex);
  3372. /* restore timer */
  3373. hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);
  3374. hrtimer_start(&charger_hv_detect_timer, hvtime, HRTIMER_MODE_REL);
  3375. /*
  3376. battery_log(BAT_LOG_CRTI,
  3377. "[fg reg] current:0x%x 0x%x low:0x%x 0x%x high:0x%x 0x%x\r\n",
  3378. pmic_get_register_value(MT6351_PMIC_FG_CAR_18_03), pmic_get_register_value(MT6351_PMIC_FG_CAR_34_19),
  3379. pmic_get_register_value(MT6351_PMIC_FG_BLTR_15_00), pmic_get_register_value(MT6351_PMIC_FG_BLTR_31_16),
  3380. pmic_get_register_value(MT6351_PMIC_FG_BFTR_15_00), pmic_get_register_value(MT6351_PMIC_FG_BFTR_31_16));
  3381. {
  3382. signed int cur, low, high;
  3383. cur = (pmic_get_register_value(MT6351_PMIC_FG_CAR_18_03));
  3384. cur |= ((pmic_get_register_value(MT6351_PMIC_FG_CAR_34_19)) & 0xffff) << 16;
  3385. low = (pmic_get_register_value(MT6351_PMIC_FG_BLTR_15_00));
  3386. low |= ((pmic_get_register_value(MT6351_PMIC_FG_BLTR_31_16)) & 0xffff) << 16;
  3387. high = (pmic_get_register_value(MT6351_PMIC_FG_BFTR_15_00));
  3388. high |= ((pmic_get_register_value(MT6351_PMIC_FG_BFTR_31_16)) & 0xffff) << 16;
  3389. battery_log(BAT_LOG_CRTI,
  3390. "[fg reg] current:%d low:%d high:%d\r\n", cur, low, high);
  3391. }
  3392. */
  3393. battery_suspended = KAL_FALSE;
  3394. battery_log(BAT_LOG_CRTI, "@bs=0@\n");
  3395. mutex_unlock(&bat_mutex);
  3396. #endif
  3397. }
  3398. static int battery_remove(struct platform_device *dev)
  3399. {
  3400. battery_log(BAT_LOG_CRTI, "******** battery driver remove!! ********\n");
  3401. return 0;
  3402. }
  3403. static void battery_shutdown(struct platform_device *dev)
  3404. {
  3405. battery_log(BAT_LOG_CRTI, "******** battery driver shutdown!! ********\n");
  3406. }
  3407. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  3408. /* // Battery Notify API */
  3409. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  3410. static ssize_t show_BatteryNotify(struct device *dev, struct device_attribute *attr, char *buf)
  3411. {
  3412. battery_log(BAT_LOG_CRTI, "[Battery] show_BatteryNotify : %x\n", g_BatteryNotifyCode);
  3413. return sprintf(buf, "%u\n", g_BatteryNotifyCode);
  3414. }
  3415. static ssize_t store_BatteryNotify(struct device *dev, struct device_attribute *attr,
  3416. const char *buf, size_t size)
  3417. {
  3418. unsigned int reg_BatteryNotifyCode = 0;
  3419. int ret;
  3420. battery_log(BAT_LOG_CRTI, "[Battery] store_BatteryNotify\n");
  3421. if (buf != NULL && size != 0) {
  3422. battery_log(BAT_LOG_CRTI, "[Battery] buf is %s and size is %Zu\n", buf, size);
  3423. ret = kstrtouint(buf, 16, &reg_BatteryNotifyCode);
  3424. g_BatteryNotifyCode = reg_BatteryNotifyCode;
  3425. battery_log(BAT_LOG_CRTI, "[Battery] store code : %x\n", g_BatteryNotifyCode);
  3426. }
  3427. return size;
  3428. }
  3429. static DEVICE_ATTR(BatteryNotify, 0664, show_BatteryNotify, store_BatteryNotify);
  3430. static ssize_t show_BN_TestMode(struct device *dev, struct device_attribute *attr, char *buf)
  3431. {
  3432. battery_log(BAT_LOG_CRTI, "[Battery] show_BN_TestMode : %x\n", g_BN_TestMode);
  3433. return sprintf(buf, "%u\n", g_BN_TestMode);
  3434. }
  3435. static ssize_t store_BN_TestMode(struct device *dev, struct device_attribute *attr, const char *buf,
  3436. size_t size)
  3437. {
  3438. unsigned int reg_BN_TestMode = 0;
  3439. int ret;
  3440. battery_log(BAT_LOG_CRTI, "[Battery] store_BN_TestMode\n");
  3441. if (buf != NULL && size != 0) {
  3442. battery_log(BAT_LOG_CRTI, "[Battery] buf is %s and size is %Zu\n", buf, size);
  3443. ret = kstrtouint(buf, 16, &reg_BN_TestMode);
  3444. g_BN_TestMode = reg_BN_TestMode;
  3445. battery_log(BAT_LOG_CRTI, "[Battery] store g_BN_TestMode : %x\n", g_BN_TestMode);
  3446. }
  3447. return size;
  3448. }
  3449. static DEVICE_ATTR(BN_TestMode, 0664, show_BN_TestMode, store_BN_TestMode);
  3450. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  3451. /* // platform_driver API */
  3452. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  3453. #if 0
  3454. static int battery_cmd_read(char *buf, char **start, off_t off, int count, int *eof, void *data)
  3455. {
  3456. int len = 0;
  3457. char *p = buf;
  3458. p += sprintf(p,
  3459. "g_battery_thermal_throttling_flag=%d,\nbattery_cmd_thermal_test_mode=%d,\nbattery_cmd_thermal_test_mode_value=%d\n",
  3460. g_battery_thermal_throttling_flag, battery_cmd_thermal_test_mode,
  3461. battery_cmd_thermal_test_mode_value);
  3462. *start = buf + off;
  3463. len = p - buf;
  3464. if (len > off)
  3465. len -= off;
  3466. else
  3467. len = 0;
  3468. return len < count ? len : count;
  3469. }
  3470. #endif
  3471. static ssize_t battery_cmd_write(struct file *file, const char *buffer, size_t count, loff_t *data)
  3472. {
  3473. int len = 0, bat_tt_enable = 0, bat_thr_test_mode = 0, bat_thr_test_value = 0;
  3474. char desc[32];
  3475. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  3476. if (copy_from_user(desc, buffer, len))
  3477. return 0;
  3478. desc[len] = '\0';
  3479. if (sscanf(desc, "%d %d %d", &bat_tt_enable, &bat_thr_test_mode, &bat_thr_test_value) == 3) {
  3480. g_battery_thermal_throttling_flag = bat_tt_enable;
  3481. battery_cmd_thermal_test_mode = bat_thr_test_mode;
  3482. battery_cmd_thermal_test_mode_value = bat_thr_test_value;
  3483. battery_log(BAT_LOG_CRTI,
  3484. "bat_tt_enable=%d, bat_thr_test_mode=%d, bat_thr_test_value=%d\n",
  3485. g_battery_thermal_throttling_flag,
  3486. battery_cmd_thermal_test_mode, battery_cmd_thermal_test_mode_value);
  3487. return count;
  3488. }
  3489. /* hidden else, for sscanf format error */
  3490. {
  3491. battery_log(BAT_LOG_CRTI,
  3492. "bad argument, echo [bat_tt_enable] [bat_thr_test_mode] [bat_thr_test_value] > battery_cmd\n");
  3493. }
  3494. return -EINVAL;
  3495. }
  3496. static int proc_utilization_show(struct seq_file *m, void *v)
  3497. {
  3498. seq_printf(m,
  3499. "=> g_battery_thermal_throttling_flag=%d,\nbattery_cmd_thermal_test_mode=%d,\nbattery_cmd_thermal_test_mode_value=%d\n",
  3500. g_battery_thermal_throttling_flag, battery_cmd_thermal_test_mode,
  3501. battery_cmd_thermal_test_mode_value);
  3502. seq_printf(m, "=> get_usb_current_unlimited=%d,\ncmd_discharging = %d\n",
  3503. get_usb_current_unlimited(), cmd_discharging);
  3504. return 0;
  3505. }
  3506. static int proc_utilization_open(struct inode *inode, struct file *file)
  3507. {
  3508. return single_open(file, proc_utilization_show, NULL);
  3509. }
  3510. static const struct file_operations battery_cmd_proc_fops = {
  3511. .open = proc_utilization_open,
  3512. .read = seq_read,
  3513. .write = battery_cmd_write,
  3514. };
  3515. static ssize_t current_cmd_write(struct file *file, const char *buffer, size_t count, loff_t *data)
  3516. {
  3517. int len = 0;
  3518. char desc[32];
  3519. int cmd_current_unlimited = false;
  3520. unsigned int charging_enable = false;
  3521. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  3522. if (copy_from_user(desc, buffer, len))
  3523. return 0;
  3524. desc[len] = '\0';
  3525. if (sscanf(desc, "%d %d", &cmd_current_unlimited, &cmd_discharging) == 2) {
  3526. set_usb_current_unlimited(cmd_current_unlimited);
  3527. if (cmd_discharging == 1) {
  3528. charging_enable = false;
  3529. adjust_power = -1;
  3530. } else if (cmd_discharging == 0) {
  3531. charging_enable = true;
  3532. adjust_power = -1;
  3533. }
  3534. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  3535. battery_log(BAT_LOG_CRTI,
  3536. "[current_cmd_write] cmd_current_unlimited=%d, cmd_discharging=%d\n",
  3537. cmd_current_unlimited, cmd_discharging);
  3538. return count;
  3539. }
  3540. /* hidden else, for sscanf format error */
  3541. {
  3542. battery_log(BAT_LOG_CRTI, " bad argument, echo [enable] > current_cmd\n");
  3543. }
  3544. return -EINVAL;
  3545. }
  3546. static int current_cmd_read(struct seq_file *m, void *v)
  3547. {
  3548. unsigned int charging_enable = false;
  3549. cmd_discharging = 1;
  3550. charging_enable = false;
  3551. adjust_power = -1;
  3552. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  3553. battery_log(BAT_LOG_CRTI, "[current_cmd_write] cmd_discharging=%d\n", cmd_discharging);
  3554. return 0;
  3555. }
  3556. static int proc_utilization_open_cur_stop(struct inode *inode, struct file *file)
  3557. {
  3558. return single_open(file, current_cmd_read, NULL);
  3559. }
  3560. static ssize_t discharging_cmd_write(struct file *file, const char *buffer, size_t count,
  3561. loff_t *data)
  3562. {
  3563. int len = 0;
  3564. char desc[32];
  3565. unsigned int charging_enable = false;
  3566. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  3567. if (copy_from_user(desc, buffer, len))
  3568. return 0;
  3569. desc[len] = '\0';
  3570. if (sscanf(desc, "%d %d", &charging_enable, &adjust_power) == 2) {
  3571. battery_log(BAT_LOG_CRTI, "[current_cmd_write] adjust_power = %d\n", adjust_power);
  3572. return count;
  3573. }
  3574. /* hidden else, for sscanf format error */
  3575. {
  3576. battery_log(BAT_LOG_CRTI, " bad argument, echo [enable] > current_cmd\n");
  3577. }
  3578. return -EINVAL;
  3579. }
  3580. static const struct file_operations discharging_cmd_proc_fops = {
  3581. .open = proc_utilization_open,
  3582. .read = seq_read,
  3583. .write = discharging_cmd_write,
  3584. };
  3585. static const struct file_operations current_cmd_proc_fops = {
  3586. .open = proc_utilization_open_cur_stop,
  3587. .read = seq_read,
  3588. .write = current_cmd_write,
  3589. };
  3590. static int mt_batteryNotify_probe(struct platform_device *dev)
  3591. {
  3592. int ret_device_file = 0;
  3593. /* struct proc_dir_entry *entry = NULL; */
  3594. struct proc_dir_entry *battery_dir = NULL;
  3595. battery_log(BAT_LOG_CRTI, "******** mt_batteryNotify_probe!! ********\n");
  3596. ret_device_file = device_create_file(&(dev->dev), &dev_attr_BatteryNotify);
  3597. ret_device_file = device_create_file(&(dev->dev), &dev_attr_BN_TestMode);
  3598. battery_dir = proc_mkdir("mtk_battery_cmd", NULL);
  3599. if (!battery_dir) {
  3600. pr_err("[%s]: mkdir /proc/mtk_battery_cmd failed\n", __func__);
  3601. } else {
  3602. #if 1
  3603. proc_create("battery_cmd", S_IRUGO | S_IWUSR, battery_dir, &battery_cmd_proc_fops);
  3604. battery_log(BAT_LOG_CRTI, "proc_create battery_cmd_proc_fops\n");
  3605. proc_create("current_cmd", S_IRUGO | S_IWUSR, battery_dir, &current_cmd_proc_fops);
  3606. battery_log(BAT_LOG_CRTI, "proc_create current_cmd_proc_fops\n");
  3607. proc_create("discharging_cmd", S_IRUGO | S_IWUSR, battery_dir,
  3608. &discharging_cmd_proc_fops);
  3609. battery_log(BAT_LOG_CRTI, "proc_create discharging_cmd_proc_fops\n");
  3610. #else
  3611. entry = create_proc_entry("battery_cmd", S_IRUGO | S_IWUSR, battery_dir);
  3612. if (entry) {
  3613. entry->read_proc = battery_cmd_read;
  3614. entry->write_proc = battery_cmd_write;
  3615. }
  3616. #endif
  3617. }
  3618. battery_log(BAT_LOG_CRTI, "******** mtk_battery_cmd!! ********\n");
  3619. return 0;
  3620. }
  3621. #ifdef CONFIG_OF
  3622. static const struct of_device_id mt_battery_of_match[] = {
  3623. {.compatible = "mediatek,battery",},
  3624. {},
  3625. };
  3626. MODULE_DEVICE_TABLE(of, mt_battery_of_match);
  3627. #endif
  3628. static int battery_pm_suspend(struct device *device)
  3629. {
  3630. int ret = 0;
  3631. struct platform_device *pdev = to_platform_device(device);
  3632. BUG_ON(pdev == NULL);
  3633. return ret;
  3634. }
  3635. static int battery_pm_resume(struct device *device)
  3636. {
  3637. int ret = 0;
  3638. struct platform_device *pdev = to_platform_device(device);
  3639. BUG_ON(pdev == NULL);
  3640. return ret;
  3641. }
  3642. static int battery_pm_freeze(struct device *device)
  3643. {
  3644. int ret = 0;
  3645. struct platform_device *pdev = to_platform_device(device);
  3646. BUG_ON(pdev == NULL);
  3647. return ret;
  3648. }
  3649. static int battery_pm_restore(struct device *device)
  3650. {
  3651. int ret = 0;
  3652. struct platform_device *pdev = to_platform_device(device);
  3653. BUG_ON(pdev == NULL);
  3654. return ret;
  3655. }
  3656. static int battery_pm_restore_noirq(struct device *device)
  3657. {
  3658. int ret = 0;
  3659. struct platform_device *pdev = to_platform_device(device);
  3660. BUG_ON(pdev == NULL);
  3661. return ret;
  3662. }
  3663. struct dev_pm_ops const battery_pm_ops = {
  3664. .suspend = battery_pm_suspend,
  3665. .resume = battery_pm_resume,
  3666. .freeze = battery_pm_freeze,
  3667. .thaw = battery_pm_restore,
  3668. .restore = battery_pm_restore,
  3669. .restore_noirq = battery_pm_restore_noirq,
  3670. };
  3671. #if defined(CONFIG_OF) || defined(BATTERY_MODULE_INIT)
  3672. struct platform_device battery_device = {
  3673. .name = "battery",
  3674. .id = -1,
  3675. };
  3676. #endif
  3677. static struct platform_driver battery_driver = {
  3678. .probe = battery_probe,
  3679. .remove = battery_remove,
  3680. .shutdown = battery_shutdown,
  3681. .driver = {
  3682. .name = "battery",
  3683. .pm = &battery_pm_ops,
  3684. },
  3685. };
  3686. #ifdef CONFIG_OF
  3687. static int battery_dts_probe(struct platform_device *dev)
  3688. {
  3689. int ret = 0;
  3690. battery_log(BAT_LOG_CRTI, "******** battery_dts_probe!! ********\n");
  3691. battery_device.dev.of_node = dev->dev.of_node;
  3692. ret = platform_device_register(&battery_device);
  3693. if (ret) {
  3694. battery_log(BAT_LOG_CRTI,
  3695. "****[battery_dts_probe] Unable to register device (%d)\n", ret);
  3696. return ret;
  3697. }
  3698. return 0;
  3699. }
  3700. static struct platform_driver battery_dts_driver = {
  3701. .probe = battery_dts_probe,
  3702. .remove = NULL,
  3703. .shutdown = NULL,
  3704. .driver = {
  3705. .name = "battery-dts",
  3706. #ifdef CONFIG_OF
  3707. .of_match_table = mt_battery_of_match,
  3708. #endif
  3709. },
  3710. };
  3711. /* -------------------------------------------------------- */
  3712. static const struct of_device_id mt_bat_notify_of_match[] = {
  3713. {.compatible = "mediatek,bat_notify",},
  3714. {},
  3715. };
  3716. MODULE_DEVICE_TABLE(of, mt_bat_notify_of_match);
  3717. #endif
  3718. struct platform_device MT_batteryNotify_device = {
  3719. .name = "mt-battery",
  3720. .id = -1,
  3721. };
  3722. static struct platform_driver mt_batteryNotify_driver = {
  3723. .probe = mt_batteryNotify_probe,
  3724. .driver = {
  3725. .name = "mt-battery",
  3726. },
  3727. };
  3728. #ifdef CONFIG_OF
  3729. static int mt_batteryNotify_dts_probe(struct platform_device *dev)
  3730. {
  3731. int ret = 0;
  3732. battery_log(BAT_LOG_CRTI, "******** mt_batteryNotify_dts_probe!! ********\n");
  3733. MT_batteryNotify_device.dev.of_node = dev->dev.of_node;
  3734. ret = platform_device_register(&MT_batteryNotify_device);
  3735. if (ret) {
  3736. battery_log(BAT_LOG_CRTI,
  3737. "****[mt_batteryNotify_dts] Unable to register device (%d)\n", ret);
  3738. return ret;
  3739. }
  3740. return 0;
  3741. }
  3742. static struct platform_driver mt_batteryNotify_dts_driver = {
  3743. .probe = mt_batteryNotify_dts_probe,
  3744. .driver = {
  3745. .name = "mt-dts-battery",
  3746. #ifdef CONFIG_OF
  3747. .of_match_table = mt_bat_notify_of_match,
  3748. #endif
  3749. },
  3750. };
  3751. #endif
  3752. /* -------------------------------------------------------- */
  3753. static int battery_pm_event(struct notifier_block *notifier, unsigned long pm_event, void *unused)
  3754. {
  3755. switch (pm_event) {
  3756. case PM_HIBERNATION_PREPARE: /* Going to hibernate */
  3757. pr_warn("[%s] pm_event %lu (IPOH)\n", __func__, pm_event);
  3758. Is_In_IPOH = TRUE;
  3759. case PM_RESTORE_PREPARE: /* Going to restore a saved image */
  3760. case PM_SUSPEND_PREPARE: /* Going to suspend the system */
  3761. pr_warn("[%s] pm_event %lu\n", __func__, pm_event);
  3762. battery_timer_pause();
  3763. return NOTIFY_DONE;
  3764. case PM_POST_SUSPEND: /* Suspend finished */
  3765. case PM_POST_RESTORE: /* Restore failed */
  3766. pr_warn("[%s] pm_event %lu\n", __func__, pm_event);
  3767. battery_timer_resume();
  3768. return NOTIFY_DONE;
  3769. case PM_POST_HIBERNATION: /* Hibernation finished */
  3770. pr_warn("[%s] pm_event %lu\n", __func__, pm_event);
  3771. fg_ipoh_reset = 1;
  3772. battery_timer_resume();
  3773. if (pending_wake_up_bat) {
  3774. pr_warn("[%s] PM_POST_HIBERNATION b4r wakeup bat_routine_wq\n", __func__);
  3775. wake_up(&bat_routine_wq);
  3776. }
  3777. pending_wake_up_bat = FALSE;
  3778. Is_In_IPOH = FALSE;
  3779. return NOTIFY_DONE;
  3780. }
  3781. return NOTIFY_OK;
  3782. }
  3783. static struct notifier_block battery_pm_notifier_block = {
  3784. .notifier_call = battery_pm_event,
  3785. .priority = 0,
  3786. };
  3787. static int __init battery_init(void)
  3788. {
  3789. int ret;
  3790. battery_log(BAT_LOG_CRTI, "battery_init\n");
  3791. #ifdef CONFIG_OF
  3792. /* */
  3793. #else
  3794. #ifdef BATTERY_MODULE_INIT
  3795. ret = platform_device_register(&battery_device);
  3796. if (ret) {
  3797. battery_log(BAT_LOG_CRTI,
  3798. "****[battery_device] Unable to device register(%d)\n", ret);
  3799. return ret;
  3800. }
  3801. #endif
  3802. #endif
  3803. ret = platform_driver_register(&battery_driver);
  3804. if (ret) {
  3805. battery_log(BAT_LOG_CRTI,
  3806. "****[battery_driver] Unable to register driver (%d)\n", ret);
  3807. return ret;
  3808. }
  3809. /* battery notofy UI */
  3810. #ifdef CONFIG_OF
  3811. /* */
  3812. #else
  3813. ret = platform_device_register(&MT_batteryNotify_device);
  3814. if (ret) {
  3815. battery_log(BAT_LOG_CRTI,
  3816. "****[mt_batteryNotify] Unable to device register(%d)\n", ret);
  3817. return ret;
  3818. }
  3819. #endif
  3820. ret = platform_driver_register(&mt_batteryNotify_driver);
  3821. if (ret) {
  3822. battery_log(BAT_LOG_CRTI,
  3823. "****[mt_batteryNotify] Unable to register driver (%d)\n", ret);
  3824. return ret;
  3825. }
  3826. #ifdef CONFIG_OF
  3827. ret = platform_driver_register(&battery_dts_driver);
  3828. ret = platform_driver_register(&mt_batteryNotify_dts_driver);
  3829. #endif
  3830. ret = register_pm_notifier(&battery_pm_notifier_block);
  3831. if (ret)
  3832. battery_log(BAT_LOG_CRTI, "[%s] failed to register PM notifier %d\n", __func__,
  3833. ret);
  3834. battery_log(BAT_LOG_CRTI, "****[battery_driver] Initialization : DONE !!\n");
  3835. return 0;
  3836. }
  3837. #ifdef BATTERY_MODULE_INIT
  3838. late_initcall(battery_init);
  3839. #else
  3840. static void __exit battery_exit(void)
  3841. {
  3842. }
  3843. module_init(battery_init);
  3844. module_exit(battery_exit);
  3845. #endif
  3846. MODULE_AUTHOR("Oscar Liu");
  3847. MODULE_DESCRIPTION("Battery Device Driver");
  3848. MODULE_LICENSE("GPL");