mms252.c 102 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398
  1. /*
  2. * mms_ts.c - Touchscreen driver for Melfas MMS-series touch controllers
  3. *
  4. * Copyright (C) 2011 Google Inc.
  5. * Author: Dima Zavin <dima@android.com>
  6. * Simon Wilson <simonwilson@google.com>
  7. *
  8. * ISP reflashing code based on original code from Melfas.
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License as published by the
  12. * Free Software Foundation; either version 2 of the License, or (at your
  13. * option) any later version.
  14. *
  15. */
  16. #define DEBUG
  17. /* #define VERBOSE_DEBUG */
  18. #define SEC_TSP_DEBUG
  19. #define USE_OPEN_CLOSE
  20. /* #define FORCE_FW_FLASH */
  21. /* #define FORCE_FW_PASS */
  22. /* #define ESD_DEBUG */
  23. #define DEBUG_PRINT2 1
  24. #define SEC_TSP_FACTORY_TEST
  25. #define TSP_BUF_SIZE 1024
  26. #define RAW_FAIL -1
  27. #include <linux/delay.h>
  28. #include <linux/earlysuspend.h>
  29. #include <linux/firmware.h>
  30. #include <linux/gpio.h>
  31. #include <linux/i2c.h>
  32. #include <linux/init.h>
  33. #include <linux/input.h>
  34. #include <linux/input/mt.h>
  35. #include <linux/cdev.h>
  36. #include <linux/interrupt.h>
  37. #include <linux/irq.h>
  38. #include <linux/module.h>
  39. #include <linux/mutex.h>
  40. #include <linux/slab.h>
  41. #include <linux/mfd/pm8xxx/gpio.h>
  42. #include <linux/uaccess.h>
  43. #include <linux/cpufreq.h>
  44. #include <asm/mach-types.h>
  45. #include <linux/delay.h>
  46. #ifdef CONFIG_SEC_DVFS
  47. #include <linux/cpufreq.h>
  48. #define TOUCH_BOOSTER_DVFS
  49. #define DVFS_STAGE_TRIPLE 3
  50. #define DVFS_STAGE_DUAL 2
  51. #define DVFS_STAGE_SINGLE 1
  52. #define DVFS_STAGE_NONE 0
  53. #endif
  54. /* #include <mach/dev.h> */
  55. #include <linux/regulator/consumer.h>
  56. #include <linux/i2c/mms252.h>
  57. #include <linux/of_gpio.h>
  58. #include <asm/unaligned.h>
  59. #define MAX_FINGERS 10
  60. #define MAX_WIDTH 30
  61. #define MAX_PRESSURE 255
  62. /* Registers */
  63. #define MMS_MODE_CONTROL 0x01
  64. #define MMS_XYRES_HI 0x02
  65. #define MMS_XRES_LO 0x03
  66. #define MMS_YRES_LO 0x04
  67. #define MMS_INPUT_EVENT_PKT_SZ 0x0F
  68. #define MMS_INPUT_EVENT 0x10
  69. #define EVENT_SZ 8
  70. #define MMS_CORE_VERSION 0xE1
  71. #define MMS_TSP_REVISION 0xF0
  72. #define MMS_HW_REVISION 0xF1
  73. #define MMS_COMPAT_GROUP 0xF2
  74. #define MMS_FW_VERSION 0xF4
  75. #ifdef SEC_TSP_FACTORY_TEST
  76. #define TX_NUM 30
  77. #define RX_NUM 20
  78. #define NODE_NUM 620
  79. /* self diagnostic */
  80. #define ADDR_CH_NUM 0x0B
  81. #define ADDR_UNIV_CMD 0xA0
  82. #define CMD_ENTER_TEST 0x40
  83. #define CMD_EXIT_TEST 0x4F
  84. #define CMD_CM_DELTA 0x41
  85. #define CMD_GET_DELTA 0x42
  86. #define CMD_CM_ABS 0X43
  87. #define CMD_GET_ABS 0X44
  88. #define CMD_CM_JITTER 0X45
  89. #define CMD_GET_JITTER 0X46
  90. #define CMD_GET_INTEN 0x70
  91. #define CMD_GET_INTEN_KEY 0x71
  92. #define CMD_RESULT_SZ 0XAE
  93. #define CMD_RESULT 0XAF
  94. /* VSC(Vender Specific Command) */
  95. #define MMS_VSC_CMD 0xB0 /* vendor specific command */
  96. #define MMS_VSC_MODE 0x1A /* mode of vendor */
  97. #define MMS_VSC_CMD_ENTER 0X01
  98. #define MMS_VSC_CMD_CM_DELTA 0X02
  99. #define MMS_VSC_CMD_CM_ABS 0X03
  100. #define MMS_VSC_CMD_EXIT 0X05
  101. #define MMS_VSC_CMD_INTENSITY 0X04
  102. #define MMS_VSC_CMD_RAW 0X06
  103. #define MMS_VSC_CMD_REFER 0X07
  104. #define TSP_CMD_STR_LEN 32
  105. #define TSP_CMD_RESULT_STR_LEN 512
  106. #define TSP_CMD_PARAM_NUM 8
  107. #define tostring(x) #x
  108. #endif /* SEC_TSP_FACTORY_TEST */
  109. /* START - Added to support API's for TSP tuning */
  110. #define ESD_DETECT_COUNT 10
  111. #define FINGER_EVENT_SZ 6
  112. #define MAX_LOG_LENGTH 128
  113. #define MMS_EVENT_PKT_SZ 0x0F
  114. /* Universal commands */
  115. #define MMS_CMD_SET_LOG_MODE 0x20
  116. /* Event types */
  117. #define MMS_LOG_EVENT 0xD
  118. #define MMS_NOTIFY_EVENT 0xE
  119. #define MMS_ERROR_EVENT 0xF
  120. #define MMS_TOUCH_KEY_EVENT 0x40
  121. #ifdef TOUCH_BOOSTER_DVFS
  122. #define TOUCH_BOOSTER_OFF_TIME 500
  123. #define TOUCH_BOOSTER_CHG_TIME 130
  124. #endif
  125. enum {
  126. GET_RX_NUM = 1,
  127. GET_TX_NUM,
  128. GET_EVENT_DATA,
  129. };
  130. enum {
  131. LOG_TYPE_U08 = 2,
  132. LOG_TYPE_S08,
  133. LOG_TYPE_U16,
  134. LOG_TYPE_S16,
  135. LOG_TYPE_U32 = 8,
  136. LOG_TYPE_S32,
  137. };
  138. /* END - Added to support API's for TSP tuning */
  139. extern int poweroff_charging;
  140. struct device *sec_touchscreen;
  141. struct device *sec_touchkey;
  142. /* Touch booster */
  143. int touch_is_pressed;
  144. static int tsp_power_enabled;
  145. /* panel info */
  146. #define ILJIN 0x4
  147. #define EELY 0x0
  148. #define NO_PANEL 0x7
  149. #define YONGFAST 0x8
  150. #define WINTEC 0x9
  151. /* ILJIN panel */
  152. #define BOOT_VERSION_IJ 0x1
  153. #define CORE_VERSION_IJ 0x73
  154. #define FW_VERSION_IJ 0x17
  155. /* EELY panel */
  156. #define BOOT_VERSION_EL 0x1
  157. #define CORE_VERSION_EL 0x78
  158. #if defined(CONFIG_MACH_MILLET3G_CHN_OPEN)
  159. #define FW_VERSION_DATE "140415"
  160. #endif
  161. #define FW_VERSION_EL 0x18
  162. #define MAX_FW_PATH 255
  163. #define TSP_FW_FILENAME "melfas_fw.bin"
  164. #define MMS_COORDS_ARR_SIZE 4
  165. #define SECTION_NUM 3
  166. #define ISC_XFER_LEN 256
  167. #define MMS_FLASH_PAGE_SZ 1024
  168. #define ISC_BLOCK_NUM (MMS_FLASH_PAGE_SZ / ISC_XFER_LEN)
  169. #define MMS_CMD_ENTER_ISC 0x5F
  170. #define FLASH_VERBOSE_DEBUG 1
  171. enum {
  172. ISC_NONE = -1,
  173. ISC_SUCCESS = 0,
  174. ISC_FILE_OPEN_ERROR,
  175. ISC_FILE_CLOSE_ERROR,
  176. ISC_FILE_FORMAT_ERROR,
  177. ISC_WRITE_BUFFER_ERROR,
  178. ISC_I2C_ERROR,
  179. ISC_UPDATE_MODE_ENTER_ERROR,
  180. ISC_CRC_ERROR,
  181. ISC_VALIDATION_ERROR,
  182. ISC_COMPATIVILITY_ERROR,
  183. ISC_UPDATE_SECTION_ERROR,
  184. ISC_SLAVE_ERASE_ERROR,
  185. ISC_SLAVE_DOWNLOAD_ERROR,
  186. ISC_DOWNLOAD_WHEN_SLAVE_IS_UPDATED_ERROR,
  187. ISC_INITIAL_PACKET_ERROR,
  188. ISC_NO_NEED_UPDATE_ERROR,
  189. ISC_LIMIT
  190. };
  191. enum {
  192. SEC_NONE = -1,
  193. SEC_BOOTLOADER = 0,
  194. SEC_CORE,
  195. SEC_CONFIG,
  196. SEC_LIMIT
  197. };
  198. enum {
  199. ISC_ADDR = 0xD5,
  200. ISC_CMD_READ_STATUS = 0xD9,
  201. ISC_CMD_READ = 0x4000,
  202. ISC_CMD_EXIT = 0x8200,
  203. ISC_CMD_PAGE_ERASE = 0xC000,
  204. ISC_PAGE_ERASE_DONE = 0x10000,
  205. ISC_PAGE_ERASE_ENTER = 0x20000,
  206. };
  207. enum {
  208. EXT_INFO_ERASE = 0x01,
  209. EXT_INFO_WRITE = 0x10,
  210. };
  211. enum {
  212. BUILT_IN = 0,
  213. UMS,
  214. };
  215. struct tsp_callbacks {
  216. void (*inform_charger)(struct tsp_callbacks *tsp_cb, bool mode);
  217. };
  218. struct mms_ts_info {
  219. struct i2c_client *client;
  220. struct input_dev *input_dev;
  221. struct melfas_tsi_platform_data *pdata;
  222. char phys[32];
  223. int max_x;
  224. int max_y;
  225. bool invert_x;
  226. bool invert_y;
  227. u8 palm_flag;
  228. int irq;
  229. int (*power) (struct mms_ts_info *info,int on);
  230. void (*input_event)(void *data);
  231. #if TOUCHKEY
  232. int (*keyled) (struct mms_ts_info *info,int on);
  233. #endif
  234. #ifdef CONFIG_HAS_EARLYSUSPEND
  235. struct early_suspend early_suspend;
  236. #endif
  237. #ifdef TOUCH_BOOSTER_DVFS
  238. struct delayed_work work_dvfs_off;
  239. struct delayed_work work_dvfs_chg;
  240. struct mutex dvfs_lock;
  241. bool dvfs_lock_status;
  242. u8 finger_cnt1;
  243. int dvfs_boost_mode;
  244. int dvfs_freq;
  245. int dvfs_old_stauts;
  246. bool stay_awake;
  247. #endif
  248. #if TOUCHKEY
  249. bool touchkey[3];
  250. int keycode[3];
  251. bool led_cmd;
  252. #if defined(SEC_TSP_FACTORY_TEST)
  253. int menu_s;
  254. int back_s;
  255. #endif
  256. #endif
  257. /* protects the enabled flag */
  258. struct mutex lock;
  259. bool enabled;
  260. void (*register_cb)(void *);
  261. struct tsp_callbacks callbacks;
  262. bool ta_status;
  263. bool noise_mode;
  264. bool threewave_mode;
  265. bool sleep_wakeup_ta_check;
  266. #if defined(SEC_TSP_DEBUG)
  267. unsigned char finger_state[MAX_FINGERS];
  268. #endif
  269. u8 fw_update_state;
  270. u8 panel;
  271. u8 fw_boot_ver;
  272. u8 fw_core_ver;
  273. u8 fw_ic_ver;
  274. #if defined(SEC_TSP_FACTORY_TEST)
  275. struct list_head cmd_list_head;
  276. u8 cmd_state;
  277. char cmd[TSP_CMD_STR_LEN];
  278. int cmd_param[TSP_CMD_PARAM_NUM];
  279. char cmd_result[TSP_CMD_RESULT_STR_LEN];
  280. struct mutex cmd_lock;
  281. bool cmd_is_running;
  282. unsigned int reference[NODE_NUM];
  283. unsigned int raw[NODE_NUM]; /* CM_ABS */
  284. unsigned int inspection[NODE_NUM];/* CM_DELTA */
  285. unsigned int intensity[NODE_NUM];
  286. bool ft_flag;
  287. #endif /* SEC_TSP_FACTORY_TEST */
  288. struct cdev cdev;
  289. dev_t mms_dev;
  290. struct class *class;
  291. struct mms_log_data {
  292. u8 *data;
  293. int cmd;
  294. } log;
  295. };
  296. struct mms_bin_hdr {
  297. char tag[8];
  298. u16 core_version;
  299. u16 section_num;
  300. u16 contains_full_binary;
  301. u16 reserved0;
  302. u32 binary_offset;
  303. u32 binary_length;
  304. u32 extention_offset;
  305. u32 reserved1;
  306. } __attribute__ ((packed));
  307. struct mms_ext_hdr {
  308. u32 data_ID;
  309. u32 offset;
  310. u32 length;
  311. u32 next_item;
  312. u8 data[0];
  313. } __attribute__ ((packed));
  314. struct mms_fw_img {
  315. u16 type;
  316. u16 version;
  317. u16 start_page;
  318. u16 end_page;
  319. u32 offset;
  320. u32 length;
  321. } __attribute__ ((packed));
  322. struct isc_packet {
  323. u8 cmd;
  324. u32 addr;
  325. u8 data[0];
  326. } __attribute__ ((packed));
  327. struct mms_fw_image {
  328. __le32 hdr_len;
  329. __le32 data_len;
  330. __le32 fw_ver;
  331. __le32 hdr_ver;
  332. u8 data[0];
  333. } __packed;
  334. #ifdef CONFIG_HAS_EARLYSUSPEND
  335. static void mms_ts_early_suspend(struct early_suspend *h);
  336. static void mms_ts_late_resume(struct early_suspend *h);
  337. #endif
  338. static int mms_ts_resume(struct device *dev);
  339. static int mms_ts_suspend(struct device *dev);
  340. #if defined(SEC_TSP_FACTORY_TEST)
  341. #define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func
  342. enum {
  343. WAITING = 0,
  344. RUNNING,
  345. OK,
  346. FAIL,
  347. NOT_APPLICABLE,
  348. NG,
  349. };
  350. struct tsp_cmd {
  351. struct list_head list;
  352. const char *cmd_name;
  353. void (*cmd_func)(void *device_data);
  354. };
  355. extern unsigned int system_rev;
  356. static void fw_update(void *device_data);
  357. static void get_fw_ver_bin(void *device_data);
  358. static void get_fw_ver_ic(void *device_data);
  359. static void get_config_ver(void *device_data);
  360. static void get_threshold(void *device_data);
  361. static void module_off_master(void *device_data);
  362. static void module_on_master(void *device_data);
  363. /*static void module_off_slave(void *device_data);
  364. static void module_on_slave(void *device_data);*/
  365. static void get_module_vendor(void *device_data);
  366. static void get_chip_vendor(void *device_data);
  367. static void get_chip_name(void *device_data);
  368. static void get_reference(void *device_data);
  369. static void get_cm_abs(void *device_data);
  370. static void get_cm_delta(void *device_data);
  371. static void get_intensity(void *device_data);
  372. static void get_x_num(void *device_data);
  373. static void get_y_num(void *device_data);
  374. static void run_reference_read(void *device_data);
  375. static void run_cm_abs_read(void *device_data);
  376. static void run_cm_delta_read(void *device_data);
  377. static void run_intensity_read(void *device_data);
  378. static void not_support_cmd(void *device_data);
  379. #ifdef TOUCH_BOOSTER_DVFS
  380. static void boost_level(void *device_data);
  381. #endif
  382. struct tsp_cmd tsp_cmds[] = {
  383. {TSP_CMD("fw_update", fw_update),},
  384. {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),},
  385. {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),},
  386. {TSP_CMD("get_config_ver", get_config_ver),},
  387. {TSP_CMD("get_threshold", get_threshold),},
  388. {TSP_CMD("module_off_master", module_off_master),},
  389. {TSP_CMD("module_on_master", module_on_master),},
  390. {TSP_CMD("module_off_slave", not_support_cmd),},
  391. {TSP_CMD("module_on_slave", not_support_cmd),},
  392. {TSP_CMD("get_chip_vendor", get_chip_vendor),},
  393. {TSP_CMD("get_module_vendor", get_module_vendor),},
  394. {TSP_CMD("get_chip_name", get_chip_name),},
  395. {TSP_CMD("get_x_num", get_x_num),},
  396. {TSP_CMD("get_y_num", get_y_num),},
  397. {TSP_CMD("get_reference", get_reference),},
  398. {TSP_CMD("get_cm_abs", get_cm_abs),},
  399. {TSP_CMD("get_cm_delta", get_cm_delta),},
  400. {TSP_CMD("get_intensity", get_intensity),},
  401. {TSP_CMD("run_reference_read", run_reference_read),},
  402. {TSP_CMD("run_cm_abs_read", run_cm_abs_read),},
  403. {TSP_CMD("run_cm_delta_read", run_cm_delta_read),},
  404. {TSP_CMD("run_intensity_read", run_intensity_read),},
  405. {TSP_CMD("not_support_cmd", not_support_cmd),},
  406. #ifdef TOUCH_BOOSTER_DVFS
  407. {TSP_CMD("boost_level", boost_level),},
  408. #endif
  409. };
  410. #endif
  411. #ifdef TOUCH_BOOSTER_DVFS
  412. static void samsung_change_dvfs_lock(struct work_struct *work)
  413. {
  414. struct mms_ts_info *info =
  415. container_of(work,
  416. struct mms_ts_info, work_dvfs_chg.work);
  417. int retval = 0;
  418. mutex_lock(&info->dvfs_lock);
  419. if (info->dvfs_boost_mode == DVFS_STAGE_DUAL) {
  420. if (info->stay_awake) {
  421. dev_info(&info->client->dev,
  422. "%s: do fw update, do not change cpu frequency.\n",
  423. __func__);
  424. } else {
  425. retval = set_freq_limit(DVFS_TOUCH_ID,
  426. MIN_TOUCH_LIMIT_SECOND);
  427. info->dvfs_freq = MIN_TOUCH_LIMIT_SECOND;
  428. }
  429. } else if (info->dvfs_boost_mode == DVFS_STAGE_SINGLE ||
  430. info->dvfs_boost_mode == DVFS_STAGE_TRIPLE) {
  431. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  432. info->dvfs_freq = -1;
  433. }
  434. if (retval < 0)
  435. dev_err(&info->client->dev,
  436. "%s: booster change failed(%d).\n",
  437. __func__, retval);
  438. mutex_unlock(&info->dvfs_lock);
  439. }
  440. static void samsung_set_dvfs_off(struct work_struct *work)
  441. {
  442. struct mms_ts_info *info =
  443. container_of(work,
  444. struct mms_ts_info, work_dvfs_off.work);
  445. int retval;
  446. if (info->stay_awake) {
  447. dev_info(&info->client->dev,
  448. "%s: do fw update, do not change cpu frequency.\n",
  449. __func__);
  450. } else {
  451. mutex_lock(&info->dvfs_lock);
  452. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  453. info->dvfs_freq = -1;
  454. if (retval < 0)
  455. dev_err(&info->client->dev,
  456. "%s: booster stop failed(%d).\n",
  457. __func__, retval);
  458. info->dvfs_lock_status = false;
  459. mutex_unlock(&info->dvfs_lock);
  460. }
  461. }
  462. static void samsung_set_dvfs_lock(struct mms_ts_info *info,
  463. int32_t on)
  464. {
  465. int ret = 0;
  466. if (info->dvfs_boost_mode == DVFS_STAGE_NONE) {
  467. dev_dbg(&info->client->dev,
  468. "%s: DVFS stage is none(%d)\n",
  469. __func__, info->dvfs_boost_mode);
  470. return;
  471. }
  472. mutex_lock(&info->dvfs_lock);
  473. if (on == 0) {
  474. if (info->dvfs_lock_status)
  475. schedule_delayed_work(&info->work_dvfs_off,
  476. msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME));
  477. } else if (on > 0) {
  478. cancel_delayed_work(&info->work_dvfs_off);
  479. if ((!info->dvfs_lock_status) || (info->dvfs_old_stauts < on)) {
  480. cancel_delayed_work(&info->work_dvfs_chg);
  481. if (info->dvfs_freq != MIN_TOUCH_LIMIT) {
  482. if (info->dvfs_boost_mode == DVFS_STAGE_TRIPLE)
  483. ret = set_freq_limit(DVFS_TOUCH_ID,
  484. MIN_TOUCH_LIMIT_SECOND);
  485. else
  486. ret = set_freq_limit(DVFS_TOUCH_ID,
  487. MIN_TOUCH_LIMIT);
  488. info->dvfs_freq = MIN_TOUCH_LIMIT;
  489. if (ret < 0)
  490. dev_err(&info->client->dev,
  491. "%s: cpu first lock failed(%d)\n",
  492. __func__, ret);
  493. }
  494. schedule_delayed_work(&info->work_dvfs_chg,
  495. msecs_to_jiffies(TOUCH_BOOSTER_CHG_TIME));
  496. info->dvfs_lock_status = true;
  497. }
  498. } else if (on < 0) {
  499. if (info->dvfs_lock_status) {
  500. cancel_delayed_work(&info->work_dvfs_off);
  501. cancel_delayed_work(&info->work_dvfs_chg);
  502. schedule_work(&info->work_dvfs_off.work);
  503. }
  504. }
  505. info->dvfs_old_stauts = on;
  506. mutex_unlock(&info->dvfs_lock);
  507. }
  508. static void samsung_init_dvfs(struct mms_ts_info *info)
  509. {
  510. mutex_init(&info->dvfs_lock);
  511. info->dvfs_boost_mode = DVFS_STAGE_DUAL;
  512. INIT_DELAYED_WORK(&info->work_dvfs_off, samsung_set_dvfs_off);
  513. INIT_DELAYED_WORK(&info->work_dvfs_chg, samsung_change_dvfs_lock);
  514. info->dvfs_lock_status = false;
  515. }
  516. #endif
  517. #if 0
  518. static inline void mms_pwr_on_reset(struct mms_ts_info *info)
  519. {
  520. struct i2c_adapter *adapter = to_i2c_adapter(info->client->dev.parent);
  521. /* if (!info->pdata->mux_fw_flash) {
  522. dev_info(&info->client->dev,
  523. "missing platform data, can't do power-on-reset\n");
  524. return;
  525. }
  526. */
  527. i2c_lock_adapter(adapter);
  528. // info->pdata->mux_fw_flash(true);
  529. //info->pdata->power(0);
  530. gpio_direction_output(info->pdata->gpio_sda, 0);
  531. gpio_direction_output(info->pdata->gpio_scl, 0);
  532. gpio_direction_output(info->pdata->gpio_int, 0);
  533. msleep(50);
  534. //info->pdata->power(1);
  535. msleep(100);
  536. // info->pdata->mux_fw_flash(false);
  537. i2c_unlock_adapter(adapter);
  538. /* TODO: Seems long enough for the firmware to boot.
  539. * Find the right value */
  540. msleep(250);
  541. }
  542. #endif
  543. static void release_all_fingers(struct mms_ts_info *info)
  544. {
  545. struct i2c_client *client = info->client;
  546. int i;
  547. dev_dbg(&client->dev, "[TSP] %s\n", __func__);
  548. #if TOUCHKEY
  549. for (i = 1; i < 3; i++) {
  550. if (info->touchkey[i] == 1) {
  551. info->touchkey[i] = 0;
  552. input_report_key(info->input_dev,
  553. info->keycode[i], 0);
  554. }
  555. }
  556. #endif
  557. for (i = 0; i < MAX_FINGERS; i++) {
  558. #ifdef SEC_TSP_DEBUG
  559. if (info->finger_state[i] == 1)
  560. dev_notice(&client->dev, "finger %d up(force)\n", i);
  561. #endif
  562. info->finger_state[i] = 0;
  563. input_mt_slot(info->input_dev, i);
  564. input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER,
  565. false);
  566. }
  567. input_sync(info->input_dev);
  568. #ifdef TOUCH_BOOSTER_DVFS
  569. info->finger_cnt1=0;
  570. samsung_set_dvfs_lock(info, -1);
  571. #endif
  572. }
  573. static void mms_set_noise_mode(struct mms_ts_info *info)
  574. {
  575. struct i2c_client *client = info->client;
  576. if (!(info->noise_mode && info->enabled))
  577. return;
  578. dev_notice(&client->dev, "%s\n", __func__);
  579. if (info->ta_status) {
  580. dev_notice(&client->dev, "noise_mode & TA connect!!!\n");
  581. i2c_smbus_write_byte_data(info->client, 0x30, 0x1);
  582. } else {
  583. dev_notice(&client->dev, "noise_mode & TA disconnect!!!\n");
  584. i2c_smbus_write_byte_data(info->client, 0x30, 0x2);
  585. info->noise_mode = 0;
  586. }
  587. }
  588. static void mms_set_threewave_mode(struct mms_ts_info *info)
  589. {
  590. struct i2c_client *client = info->client;
  591. dev_notice(&client->dev, "%s\n", __func__);
  592. i2c_smbus_write_byte_data(info->client, 0x32, 0x1);
  593. }
  594. static int mms_reset(struct mms_ts_info *info)
  595. {
  596. printk(KERN_ERR" %s excute\n", __func__);
  597. info->power(info,0);
  598. msleep(150);
  599. info->power(info,1);
  600. msleep(50);
  601. return ISC_SUCCESS;
  602. }
  603. static void reset_mms_ts(struct mms_ts_info *info)
  604. {
  605. struct i2c_client *client = info->client;
  606. if (info->enabled == false)
  607. return;
  608. dev_notice(&client->dev, "%s++\n", __func__);
  609. /* Disabling irq as it is not required since we're using oneshot irq
  610. * and this function is called only from the irq handler
  611. */
  612. //disable_irq_nosync(info->irq);
  613. info->enabled = false;
  614. touch_is_pressed = 0;
  615. release_all_fingers(info);
  616. mms_reset(info);
  617. info->enabled = true;
  618. if (info->ta_status) {
  619. dev_notice(&client->dev, "TA connect!!!\n");
  620. i2c_smbus_write_byte_data(info->client, 0x33, 0x1);
  621. } else {
  622. dev_notice(&client->dev, "TA disconnect!!!\n");
  623. i2c_smbus_write_byte_data(info->client, 0x33, 0x2);
  624. }
  625. mms_set_noise_mode(info);
  626. //enable_irq(info->irq);
  627. dev_notice(&client->dev, "%s--\n", __func__);
  628. }
  629. static void melfas_ta_cb(struct tsp_callbacks *cb, bool ta_status)
  630. {
  631. struct mms_ts_info *info =
  632. container_of(cb, struct mms_ts_info, callbacks);
  633. struct i2c_client *client = info->client;
  634. dev_notice(&client->dev, "%s\n", __func__);
  635. info->ta_status = ta_status;
  636. if (info->enabled) {
  637. if (info->ta_status) {
  638. dev_notice(&client->dev, "TA connect!!!\n");
  639. i2c_smbus_write_byte_data(info->client, 0x33, 0x1);
  640. } else {
  641. dev_notice(&client->dev, "TA disconnect!!!\n");
  642. i2c_smbus_write_byte_data(info->client, 0x33, 0x2);
  643. }
  644. mms_set_noise_mode(info);
  645. }
  646. /* if (!ta_status)
  647. mms_set_noise_mode(info);
  648. */
  649. }
  650. static irqreturn_t mms_ts_interrupt(int irq, void *dev_id)
  651. {
  652. struct mms_ts_info *info = dev_id;
  653. struct i2c_client *client = info->client;
  654. int ret;
  655. int i;
  656. int sz = 0;
  657. u8 buf[MAX_FINGERS * EVENT_SZ] = { 0 };
  658. u8 reg = MMS_INPUT_EVENT;
  659. struct i2c_msg msg[] = {
  660. {
  661. .addr = client->addr,
  662. .flags = 0,
  663. .buf = &reg,
  664. .len = 1,
  665. }, {
  666. .addr = client->addr,
  667. .flags = I2C_M_RD,
  668. .buf = buf,
  669. },
  670. };
  671. mutex_lock(&info->lock);
  672. if (!info->enabled)
  673. goto out;
  674. sz = i2c_smbus_read_byte_data(client, MMS_INPUT_EVENT_PKT_SZ);
  675. if (sz < 0) {
  676. dev_err(&client->dev, "%s bytes=%d\n", __func__, sz);
  677. for (i = 0; i < 50; i++) {
  678. sz = i2c_smbus_read_byte_data(client,
  679. MMS_INPUT_EVENT_PKT_SZ);
  680. if (sz > 0)
  681. break;
  682. }
  683. if (i == 50) {
  684. dev_dbg(&client->dev, "i2c failed... reset!!\n");
  685. reset_mms_ts(info);
  686. goto out;
  687. }
  688. }
  689. if (sz == 0)
  690. goto out;
  691. if (sz > MAX_FINGERS * EVENT_SZ) {
  692. dev_err(&client->dev, "abnormal data inputed\n");
  693. goto out;
  694. }
  695. msg[1].len = sz;
  696. ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
  697. if (ret != ARRAY_SIZE(msg)) {
  698. dev_err(&client->dev,
  699. "failed to read %d bytes of touch data (%d)\n",
  700. sz, ret);
  701. if (ret < 0) {
  702. dev_err(&client->dev,
  703. "%s bytes=%d\n", __func__, sz);
  704. for (i = 0; i < 5; i++) {
  705. msleep(20);
  706. ret = i2c_transfer(client->adapter,
  707. msg, ARRAY_SIZE(msg));
  708. if (ret > 0)
  709. break;
  710. }
  711. if (i == 5) {
  712. dev_dbg(&client->dev,
  713. "[TSP] i2c failed E2... reset!!\n");
  714. reset_mms_ts(info);
  715. goto out;
  716. }
  717. }
  718. }
  719. #if defined(VERBOSE_DEBUG)
  720. print_hex_dump(KERN_DEBUG, "mms_ts raw: ",
  721. DUMP_PREFIX_OFFSET, 32, 1, buf, sz, false);
  722. #endif
  723. if (buf[0] == 0x0F) { /* ESD */
  724. if(buf[1] == 0x00)
  725. {
  726. dev_dbg(&client->dev, "ESD DETECT.... reset!!\n");
  727. reset_mms_ts(info);
  728. }
  729. else
  730. dev_dbg(&client->dev, "Recal Notify %d.... reset!!\n", buf[1]);
  731. goto out;
  732. }
  733. if (buf[0] == 0x0E) { /* NOISE MODE */
  734. dev_dbg(&client->dev, "[TSP] noise mode enter!!\n");
  735. info->noise_mode = 1;
  736. mms_set_noise_mode(info);
  737. goto out;
  738. }
  739. if (buf[0] == 0x0B) { /* THREEWAVE MODE */
  740. if (buf[1] == 0x01) {
  741. dev_dbg(&client->dev, "[TSP] three-wave mode enter!!\n");
  742. info->threewave_mode = 1;
  743. } else {
  744. dev_dbg(&client->dev, "[TSP] three-wave mode exit!!\n");
  745. info->threewave_mode = 0;
  746. }
  747. goto out;
  748. }
  749. for (i = 0; i < sz; i += EVENT_SZ) {
  750. u8 *tmp = &buf[i];
  751. int id, x, y, angle, palm;
  752. #if TOUCHKEY
  753. u8 keycode;
  754. u8 key_press;
  755. if ((tmp[0] & 0x20) == 0x0) { /* touch key */
  756. keycode = tmp[0] & 0xf;
  757. key_press = (tmp[0] >> 7);
  758. if (key_press == 0) {
  759. input_report_key(info->input_dev,
  760. info->keycode[keycode], 0);
  761. #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP
  762. dev_notice(&client->dev,
  763. "key R(%d)\n", info->panel);
  764. #else
  765. dev_notice(&client->dev,
  766. "key R : %d(%d)(%d)\n",
  767. info->keycode[keycode],
  768. tmp[0] & 0xf, info->panel);
  769. #endif
  770. } else {
  771. input_report_key(info->input_dev,
  772. info->keycode[keycode], 1);
  773. #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP
  774. dev_notice(&client->dev,
  775. "key P(%d)\n", info->panel);
  776. #else
  777. dev_notice(&client->dev,
  778. "key P : %d(%d)(%d)\n",
  779. info->keycode[keycode],
  780. tmp[0] & 0xf, info->panel);
  781. #endif
  782. }
  783. continue;
  784. }
  785. #else
  786. if ((tmp[0] & 0x20) == 0x0)
  787. continue;
  788. #endif
  789. id = (tmp[0] & 0xf) - 1;
  790. x = tmp[2] | ((tmp[1] & 0xf) << 8);
  791. y = tmp[3] | ((tmp[1] >> 4) << 8);
  792. angle = (tmp[5] >= 127) ? (-(256 - tmp[5])) : tmp[5];
  793. palm = (tmp[0] & 0x10) >> 4;
  794. if (info->invert_x) {
  795. x = info->max_x - x;
  796. if (x < 0)
  797. x = 0;
  798. }
  799. if (info->invert_y) {
  800. y = info->max_y - y;
  801. if (y < 0)
  802. y = 0;
  803. }
  804. if (palm) {
  805. if (info->palm_flag == 3) {
  806. info->palm_flag = 1;
  807. } else {
  808. info->palm_flag = 3;
  809. palm = 3;
  810. }
  811. } else {
  812. if (info->palm_flag == 2) {
  813. info->palm_flag = 0;
  814. } else {
  815. info->palm_flag = 2;
  816. palm = 2;
  817. }
  818. }
  819. if (id >= MAX_FINGERS) {
  820. dev_notice(&client->dev,
  821. "finger id error [%d]\n", id);
  822. reset_mms_ts(info);
  823. goto out;
  824. }
  825. if (x == 0 && y == 0)
  826. continue;
  827. if ((tmp[0] & 0x80) == 0) {
  828. input_mt_slot(info->input_dev, id);
  829. input_mt_report_slot_state(info->input_dev,
  830. MT_TOOL_FINGER, false);
  831. #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP
  832. if (info->finger_state[id] != 0) {
  833. info->finger_state[id] = 0;
  834. touch_is_pressed--;
  835. dev_notice(&client->dev,
  836. "R [%2d](%d)", id, info->panel);
  837. }
  838. #else /*CONFIG_SAMSUNG_PRODUCT_SHIP */
  839. if (info->finger_state[id] != 0) {
  840. info->finger_state[id] = 0;
  841. touch_is_pressed--;
  842. dev_notice(&client->dev,
  843. "R [%2d],([%4d],[%3d])(%d)",
  844. id, x, y, info->panel);
  845. }
  846. #endif /*CONFIG_SAMSUNG_PRODUCT_SHIP */
  847. continue;
  848. }
  849. input_mt_slot(info->input_dev, id);
  850. input_mt_report_slot_state(info->input_dev,
  851. MT_TOOL_FINGER, true);
  852. input_report_abs(info->input_dev,
  853. ABS_MT_POSITION_X, x);
  854. input_report_abs(info->input_dev,
  855. ABS_MT_POSITION_Y, y);
  856. #if defined(CONFIG_MACH_MILLETLTE_VZW)
  857. input_report_abs(info->input_dev,
  858. ABS_MT_WIDTH_MAJOR, (1229*tmp[4]) >>10); //ABS_MT_WIDTH_MAJOR * 1.2 (only for VZW)
  859. #else
  860. input_report_abs(info->input_dev,
  861. ABS_MT_WIDTH_MAJOR, tmp[4]);
  862. #endif
  863. input_report_abs(info->input_dev,
  864. ABS_MT_TOUCH_MAJOR, tmp[6]);
  865. input_report_abs(info->input_dev,
  866. ABS_MT_TOUCH_MINOR, tmp[7]);
  867. input_report_abs(info->input_dev,
  868. ABS_MT_PALM, palm);
  869. #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP
  870. if (info->finger_state[id] == 0) {
  871. info->finger_state[id] = 1;
  872. touch_is_pressed++;
  873. dev_notice(&client->dev,
  874. "P [%2d](%d)", id, info->panel);
  875. }
  876. #else /* CONFIG_SAMSUNG_PRODUCT_SHIP */
  877. if (info->finger_state[id] == 0) {
  878. info->finger_state[id] = 1;
  879. touch_is_pressed++;
  880. #if defined(CONFIG_MACH_MILLETLTE_VZW)
  881. dev_notice(&client->dev,
  882. "P [%2d],([%3d],[%4d]) w=%d, major=%d, minor=%d, angle=%d, palm=%d(%d)",
  883. id, x, y,((1229*tmp[4]) >>10), tmp[6], tmp[7],
  884. angle, palm, info->panel);
  885. #else
  886. dev_notice(&client->dev,
  887. "P [%2d],([%3d],[%4d]) w=%d, major=%d, minor=%d, angle=%d, palm=%d(%d)",
  888. id, x, y, tmp[4], tmp[6], tmp[7],
  889. angle, palm, info->panel);
  890. #endif
  891. }
  892. #endif /* CONFIG_SAMSUNG_PRODUCT_SHIP */
  893. }
  894. input_sync(info->input_dev);
  895. #ifdef TOUCH_BOOSTER_DVFS
  896. samsung_set_dvfs_lock(info, touch_is_pressed);
  897. #endif
  898. out:
  899. mutex_unlock(&info->lock);
  900. return IRQ_HANDLED;
  901. }
  902. int get_tsp_status(void)
  903. {
  904. return touch_is_pressed;
  905. }
  906. EXPORT_SYMBOL(get_tsp_status);
  907. static int get_fw_version(struct mms_ts_info *info)
  908. {
  909. struct i2c_client *client = info->client;
  910. struct i2c_adapter *adapter = client->adapter;
  911. struct i2c_msg msg[2];
  912. u8 reg = MMS_CORE_VERSION;
  913. int ret;
  914. unsigned char buf[3] = { 0, };
  915. msg[0].addr = client->addr;
  916. msg[0].flags = 0x00;
  917. msg[0].len = 1;
  918. msg[0].buf = &reg;
  919. msg[1].addr = client->addr;
  920. msg[1].flags = I2C_M_RD;
  921. msg[1].len = SECTION_NUM;
  922. msg[1].buf = buf;
  923. ret = i2c_transfer(adapter, msg, ARRAY_SIZE(msg));
  924. if (ret != ARRAY_SIZE(msg)) {
  925. pr_err("[TSP] : read error : [%d]", ret);
  926. return ret;
  927. }
  928. info->fw_boot_ver = buf[0];
  929. info->fw_core_ver = buf[1];
  930. info->fw_ic_ver = buf[2];
  931. dev_info(&info->client->dev,
  932. "boot : 0x%x, core : 0x%x, config : 0x%x\n",
  933. buf[0], buf[1], buf[2]);
  934. return 0;
  935. }
  936. /*
  937. static int mms_ts_enable(struct mms_ts_info *info, int wakeupcmd)
  938. {
  939. mutex_lock(&info->lock);
  940. if (info->enabled)
  941. goto out;
  942. if (wakeupcmd == 1) {
  943. i2c_smbus_write_byte_data(info->client, 0, 0);
  944. usleep_range(3000, 5000);
  945. }
  946. info->enabled = true;
  947. enable_irq(info->irq);
  948. out:
  949. mutex_unlock(&info->lock);
  950. return 0;
  951. }
  952. static int mms_ts_disable(struct mms_ts_info *info, int sleepcmd)
  953. {
  954. mutex_lock(&info->lock);
  955. if (!info->enabled)
  956. goto out;
  957. disable_irq_nosync(info->irq);
  958. if (sleepcmd == 1) {
  959. i2c_smbus_write_byte_data(info->client, MMS_MODE_CONTROL, 0);
  960. usleep_range(10000, 12000);
  961. }
  962. info->enabled = false;
  963. touch_is_pressed = 0;
  964. out:
  965. mutex_unlock(&info->lock);
  966. return 0;
  967. }
  968. */
  969. #ifdef SEC_TSP_FACTORY_TEST
  970. static void set_cmd_result(struct mms_ts_info *info, char *buff, int len)
  971. {
  972. strncat(info->cmd_result, buff, len);
  973. }
  974. static int get_data(struct mms_ts_info *info, u8 addr, u8 size, u8 *array)
  975. {
  976. struct i2c_client *client = info->client;
  977. struct i2c_adapter *adapter = client->adapter;
  978. struct i2c_msg msg;
  979. u8 reg = addr;
  980. unsigned char buf[size];
  981. int ret;
  982. msg.addr = client->addr;
  983. msg.flags = 0x00;
  984. msg.len = 1;
  985. msg.buf = &reg;
  986. ret = i2c_transfer(adapter, &msg, 1);
  987. if (ret >= 0) {
  988. msg.addr = client->addr;
  989. msg.flags = I2C_M_RD;
  990. msg.len = size;
  991. msg.buf = buf;
  992. ret = i2c_transfer(adapter, &msg, 1);
  993. }
  994. if (ret < 0) {
  995. pr_err("[TSP] : read error : [%d]", ret);
  996. return ret;
  997. }
  998. memcpy(array, &buf, size);
  999. return size;
  1000. }
  1001. static void get_intensity_data(struct mms_ts_info *info)
  1002. {
  1003. u8 w_buf[4];
  1004. u8 r_buf;
  1005. u8 read_buffer[60] = {0};
  1006. int i, j;
  1007. int ret;
  1008. u16 max_value = 0, min_value = 0;
  1009. u16 raw_data;
  1010. char buff[TSP_CMD_STR_LEN] = {0};
  1011. disable_irq(info->irq);
  1012. w_buf[0] = ADDR_UNIV_CMD;
  1013. w_buf[1] = CMD_GET_INTEN;
  1014. w_buf[2] = 0xFF;
  1015. for (i = 0; i < RX_NUM; i++) {
  1016. w_buf[3] = i;
  1017. ret = i2c_smbus_write_i2c_block_data(info->client,
  1018. w_buf[0], 3, &w_buf[1]);
  1019. if (ret < 0)
  1020. goto err_i2c;
  1021. usleep_range(1, 5);
  1022. ret = i2c_smbus_read_i2c_block_data(info->client,
  1023. CMD_RESULT_SZ, 1, &r_buf);
  1024. if (ret < 0)
  1025. goto err_i2c;
  1026. ret = get_data(info, CMD_RESULT, r_buf, read_buffer);
  1027. if (ret < 0)
  1028. goto err_i2c;
  1029. for (j = 0; j < r_buf/2; j++) {
  1030. raw_data = read_buffer[2*j] | (read_buffer[2*j+1] << 8);
  1031. if (raw_data > 32767)
  1032. raw_data = 0;
  1033. if (i == 0 && j == 0) {
  1034. max_value = min_value = raw_data;
  1035. } else {
  1036. max_value = max(max_value, raw_data);
  1037. min_value = min(min_value, raw_data);
  1038. }
  1039. info->intensity[i * TX_NUM + j] = raw_data;
  1040. dev_dbg(&info->client->dev,
  1041. "[TSP] intensity[%d][%d] = %d\n", j, i,
  1042. info->intensity[i * TX_NUM + j]);
  1043. }
  1044. }
  1045. snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value);
  1046. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1047. enable_irq(info->irq);
  1048. return;
  1049. err_i2c:
  1050. dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n",
  1051. __func__, MMS_VSC_CMD_INTENSITY);
  1052. }
  1053. static int get_raw_data(struct mms_ts_info *info, u8 cmd)
  1054. {
  1055. u8 w_buf[4];
  1056. u8 r_buf = 0;
  1057. u8 read_buffer[60] = {0};
  1058. int ret;
  1059. int i, j;
  1060. int max_value = 0, min_value = 0;
  1061. int raw_data;
  1062. int retry;
  1063. char buff[TSP_CMD_STR_LEN] = {0};
  1064. int gpio = info->pdata->gpio_int;
  1065. disable_irq(info->irq);
  1066. ret = i2c_smbus_write_byte_data(info->client,
  1067. ADDR_UNIV_CMD, CMD_ENTER_TEST);
  1068. if (ret < 0)
  1069. goto err_i2c;
  1070. /* event type check */
  1071. retry = 1;
  1072. while (retry) {
  1073. while (gpio_get_value(gpio))
  1074. udelay(100);
  1075. ret = i2c_smbus_read_i2c_block_data(info->client,
  1076. 0x0F, 1, &r_buf);
  1077. if (ret < 0)
  1078. goto err_i2c;
  1079. ret = i2c_smbus_read_i2c_block_data(info->client,
  1080. 0x10, 1, &r_buf);
  1081. if (ret < 0)
  1082. goto err_i2c;
  1083. dev_info(&info->client->dev, "event type = 0x%x\n", r_buf);
  1084. if (r_buf == 0x0C)
  1085. retry = 0;
  1086. }
  1087. w_buf[0] = ADDR_UNIV_CMD;
  1088. if (cmd == MMS_VSC_CMD_CM_DELTA)
  1089. w_buf[1] = CMD_CM_DELTA;
  1090. else
  1091. w_buf[1] = CMD_CM_ABS;
  1092. ret = i2c_smbus_write_i2c_block_data(info->client,
  1093. w_buf[0], 1, &w_buf[1]);
  1094. if (ret < 0)
  1095. goto err_i2c;
  1096. while (gpio_get_value(gpio))
  1097. udelay(100);
  1098. ret = i2c_smbus_read_i2c_block_data(info->client,
  1099. CMD_RESULT_SZ, 1, &r_buf);
  1100. if (ret < 0)
  1101. goto err_i2c;
  1102. ret = i2c_smbus_read_i2c_block_data(info->client,
  1103. CMD_RESULT, 1, &r_buf);
  1104. if (ret < 0)
  1105. goto err_i2c;
  1106. if (r_buf == 1)
  1107. dev_info(&info->client->dev, "PASS\n");
  1108. else
  1109. dev_info(&info->client->dev, "FAIL\n");
  1110. if (cmd == MMS_VSC_CMD_CM_DELTA)
  1111. w_buf[1] = CMD_GET_DELTA;
  1112. else
  1113. w_buf[1] = CMD_GET_ABS;
  1114. w_buf[2] = 0xFF;
  1115. for (i = 0; i < RX_NUM; i++) {
  1116. w_buf[3] = i;
  1117. ret = i2c_smbus_write_i2c_block_data(info->client,
  1118. w_buf[0], 3, &w_buf[1]);
  1119. if (ret < 0)
  1120. goto err_i2c;
  1121. while (gpio_get_value(gpio))
  1122. udelay(100);
  1123. ret = i2c_smbus_read_i2c_block_data(info->client,
  1124. CMD_RESULT_SZ, 1, &r_buf);
  1125. if (ret < 0)
  1126. goto err_i2c;
  1127. ret = get_data(info, CMD_RESULT, r_buf, read_buffer);
  1128. if (ret < 0)
  1129. goto err_i2c;
  1130. for (j = 0; j < TX_NUM; j++) {
  1131. raw_data = read_buffer[2*j] | (read_buffer[2*j+1] << 8);
  1132. if (i == 0 && j == 0) {
  1133. max_value = min_value = raw_data;
  1134. } else {
  1135. max_value = max(max_value, raw_data);
  1136. min_value = min(min_value, raw_data);
  1137. }
  1138. if (cmd == MMS_VSC_CMD_CM_DELTA) {
  1139. info->inspection[i * TX_NUM + j] =
  1140. raw_data;
  1141. dev_dbg(&info->client->dev,
  1142. "[TSP] delta[%d][%d] = %d\n", j, i,
  1143. info->inspection[i * TX_NUM + j]);
  1144. } else if (cmd == MMS_VSC_CMD_CM_ABS) {
  1145. info->raw[i * TX_NUM + j] =
  1146. raw_data;
  1147. dev_dbg(&info->client->dev,
  1148. "[TSP] raw[%d][%d] = %d\n", j, i,
  1149. info->raw[i * TX_NUM + j]);
  1150. } else if (cmd == MMS_VSC_CMD_REFER) {
  1151. info->reference[i * TX_NUM + j] =
  1152. raw_data;
  1153. dev_dbg(&info->client->dev,
  1154. "[TSP] reference[%d][%d] = %d\n", j, i,
  1155. info->reference[i * TX_NUM + j]);
  1156. }
  1157. }
  1158. }
  1159. ret = i2c_smbus_write_byte_data(info->client,
  1160. ADDR_UNIV_CMD, CMD_EXIT_TEST);
  1161. snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value);
  1162. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1163. touch_is_pressed = 0;
  1164. release_all_fingers(info);
  1165. mms_reset(info);
  1166. info->enabled = true;
  1167. if (info->ta_status) {
  1168. dev_notice(&info->client->dev, "TA connect!!!\n");
  1169. i2c_smbus_write_byte_data(info->client, 0x33, 0x1);
  1170. } else {
  1171. dev_notice(&info->client->dev, "TA disconnect!!!\n");
  1172. i2c_smbus_write_byte_data(info->client, 0x33, 0x2);
  1173. }
  1174. mms_set_noise_mode(info);
  1175. enable_irq(info->irq);
  1176. if((min_value < 2 && max_value < 2)||(min_value > 1680 && max_value < 1730))
  1177. return -ECHRNG;
  1178. return 0;
  1179. err_i2c:
  1180. dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n",
  1181. __func__, cmd);
  1182. enable_irq(info->irq);
  1183. return -EIO;
  1184. }
  1185. static void get_raw_data_all(struct mms_ts_info *info, u8 cmd)
  1186. {
  1187. u8 w_buf[6];
  1188. u8 read_buffer[2]; /* 52 */
  1189. int ret;
  1190. int i, j;
  1191. u32 max_value = 0, min_value = 0;
  1192. u32 raw_data;
  1193. char buff[TSP_CMD_STR_LEN] = {0};
  1194. int gpio = info->pdata->gpio_int;
  1195. /* gpio = msm_irq_to_gpio(info->irq); */
  1196. disable_irq(info->irq);
  1197. w_buf[0] = MMS_VSC_CMD; /* vendor specific command id */
  1198. w_buf[1] = MMS_VSC_MODE; /* mode of vendor */
  1199. w_buf[2] = 0; /* tx line */
  1200. w_buf[3] = 0; /* rx line */
  1201. w_buf[4] = 0; /* reserved */
  1202. w_buf[5] = 0; /* sub command */
  1203. if (cmd == MMS_VSC_CMD_EXIT) {
  1204. w_buf[5] = MMS_VSC_CMD_EXIT; /* exit test mode */
  1205. ret = i2c_smbus_write_i2c_block_data(info->client,
  1206. w_buf[0], 5, &w_buf[1]);
  1207. if (ret < 0)
  1208. goto err_i2c;
  1209. enable_irq(info->irq);
  1210. msleep(200);
  1211. return;
  1212. }
  1213. /* MMS_VSC_CMD_CM_DELTA or MMS_VSC_CMD_CM_ABS
  1214. * this two mode need to enter the test mode
  1215. * exit command must be followed by testing.
  1216. */
  1217. if (cmd == MMS_VSC_CMD_CM_DELTA || cmd == MMS_VSC_CMD_CM_ABS) {
  1218. /* enter the debug mode */
  1219. w_buf[2] = 0x0; /* tx */
  1220. w_buf[3] = 0x0; /* rx */
  1221. w_buf[5] = MMS_VSC_CMD_ENTER;
  1222. ret = i2c_smbus_write_i2c_block_data(info->client,
  1223. w_buf[0], 5, &w_buf[1]);
  1224. if (ret < 0)
  1225. goto err_i2c;
  1226. /* wating for the interrupt */
  1227. while (gpio_get_value(gpio))
  1228. udelay(100);
  1229. }
  1230. for (i = 0; i < RX_NUM; i++) {
  1231. for (j = 0; j < TX_NUM; j++) {
  1232. w_buf[2] = j; /* tx */
  1233. w_buf[3] = i; /* rx */
  1234. w_buf[5] = cmd;
  1235. ret = i2c_smbus_write_i2c_block_data(info->client,
  1236. w_buf[0], 5, &w_buf[1]);
  1237. if (ret < 0)
  1238. goto err_i2c;
  1239. usleep_range(1, 5);
  1240. ret = i2c_smbus_read_i2c_block_data(info->client, 0xBF,
  1241. 2, read_buffer);
  1242. if (ret < 0)
  1243. goto err_i2c;
  1244. raw_data = ((u16) read_buffer[1] << 8) | read_buffer[0];
  1245. if (i == 0 && j == 0) {
  1246. max_value = min_value = raw_data;
  1247. } else {
  1248. max_value = max(max_value, raw_data);
  1249. min_value = min(min_value, raw_data);
  1250. }
  1251. if (cmd == MMS_VSC_CMD_INTENSITY) {
  1252. info->intensity[i * TX_NUM + j] =
  1253. raw_data;
  1254. dev_dbg(&info->client->dev,
  1255. "[TSP] intensity[%d][%d] = %d\n", j, i,
  1256. info->intensity[i * TX_NUM + j]);
  1257. } else if (cmd == MMS_VSC_CMD_CM_DELTA) {
  1258. info->inspection[i * TX_NUM + j] =
  1259. raw_data;
  1260. dev_dbg(&info->client->dev,
  1261. "[TSP] delta[%d][%d] = %d\n", j, i,
  1262. info->inspection[i * TX_NUM + j]);
  1263. } else if (cmd == MMS_VSC_CMD_CM_ABS) {
  1264. info->raw[i * TX_NUM + j] =
  1265. raw_data;
  1266. dev_dbg(&info->client->dev,
  1267. "[TSP] raw[%d][%d] = %d\n", j, i,
  1268. info->raw[i * TX_NUM + j]);
  1269. } else if (cmd == MMS_VSC_CMD_REFER) {
  1270. info->reference[i * TX_NUM + j] =
  1271. raw_data;
  1272. dev_dbg(&info->client->dev,
  1273. "[TSP] reference[%d][%d] = %d\n", j, i,
  1274. info->reference[i * TX_NUM + j]);
  1275. }
  1276. }
  1277. }
  1278. snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value);
  1279. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1280. enable_irq(info->irq);
  1281. return;
  1282. err_i2c:
  1283. dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n",
  1284. __func__, cmd);
  1285. }
  1286. static ssize_t show_close_tsp_test(struct device *dev,
  1287. struct device_attribute *attr, char *buf)
  1288. {
  1289. struct mms_ts_info *info = dev_get_drvdata(dev);
  1290. get_raw_data_all(info, MMS_VSC_CMD_EXIT);
  1291. info->ft_flag = 0;
  1292. return snprintf(buf, TSP_BUF_SIZE, "%u\n", 0);
  1293. }
  1294. static void set_default_result(struct mms_ts_info *info)
  1295. {
  1296. char delim = ':';
  1297. memset(info->cmd_result, 0x00, ARRAY_SIZE(info->cmd_result));
  1298. memcpy(info->cmd_result, info->cmd, strlen(info->cmd));
  1299. strncat(info->cmd_result, &delim, 1);
  1300. }
  1301. static int check_rx_tx_num(void *device_data)
  1302. {
  1303. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1304. char buff[TSP_CMD_STR_LEN] = {0};
  1305. int node;
  1306. if (info->cmd_param[0] < 0 ||
  1307. info->cmd_param[0] >= TX_NUM ||
  1308. info->cmd_param[1] < 0 ||
  1309. info->cmd_param[1] >= RX_NUM) {
  1310. snprintf(buff, sizeof(buff) , "%s", "NG");
  1311. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1312. info->cmd_state = FAIL;
  1313. dev_info(&info->client->dev, "%s: parameter error: %u,%u\n",
  1314. __func__, info->cmd_param[0],
  1315. info->cmd_param[1]);
  1316. node = -1;
  1317. return node;
  1318. }
  1319. node = info->cmd_param[1] * TX_NUM + info->cmd_param[0];
  1320. dev_info(&info->client->dev, "%s: node = %d\n", __func__,
  1321. node);
  1322. return node;
  1323. }
  1324. static void not_support_cmd(void *device_data)
  1325. {
  1326. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1327. char buff[16] = {0};
  1328. set_default_result(info);
  1329. sprintf(buff, "%s", "NA");
  1330. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1331. mutex_lock(&info->cmd_lock);
  1332. info->cmd_is_running = false;
  1333. mutex_unlock(&info->cmd_lock);
  1334. info->cmd_state = WAITING;
  1335. dev_info(&info->client->dev, "%s: \"%s(%d)\"\n", __func__,
  1336. buff, strnlen(buff, sizeof(buff)));
  1337. return;
  1338. }
  1339. #ifdef TOUCH_BOOSTER_DVFS
  1340. static void boost_level(void *device_data)
  1341. {
  1342. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1343. struct i2c_client *client = info->client;
  1344. char buff[16] = {0};
  1345. int retval = 0;
  1346. dev_info(&client->dev, "%s\n", __func__);
  1347. set_default_result(info);
  1348. info->dvfs_boost_mode = info->cmd_param[0];
  1349. dev_info(&client->dev,
  1350. "%s: dvfs_boost_mode = %d\n",
  1351. __func__, info->dvfs_boost_mode);
  1352. snprintf(buff, sizeof(buff), "OK");
  1353. info->cmd_state = RUNNING;
  1354. if (info->dvfs_boost_mode == DVFS_STAGE_NONE) {
  1355. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  1356. if (retval < 0) {
  1357. dev_err(&info->client->dev,
  1358. "%s: booster stop failed(%d).\n",
  1359. __func__, retval);
  1360. snprintf(buff, sizeof(buff), "NG");
  1361. info->cmd_state = FAIL;
  1362. info->dvfs_lock_status = false;
  1363. }
  1364. }
  1365. set_cmd_result(info, buff,
  1366. strnlen(buff, sizeof(buff)));
  1367. mutex_lock(&info->cmd_lock);
  1368. info->cmd_is_running = false;
  1369. mutex_unlock(&info->cmd_lock);
  1370. info->cmd_state = WAITING;
  1371. return;
  1372. }
  1373. #endif
  1374. static int mms_isc_read_status(struct mms_ts_info *info, u32 val)
  1375. {
  1376. struct i2c_client *client = info->client;
  1377. u8 cmd = ISC_CMD_READ_STATUS;
  1378. u32 result = 0;
  1379. int cnt = 100;
  1380. int ret = 0;
  1381. do {
  1382. ret = i2c_smbus_read_i2c_block_data(client,
  1383. cmd, 4, (u8 *)&result);
  1384. if (ret < 0)
  1385. usleep_range(1000, 1000);
  1386. if (result == val)
  1387. break;
  1388. usleep_range(1000, 1000);
  1389. } while (--cnt);
  1390. if (!cnt) {
  1391. dev_err(&client->dev,
  1392. "status read fail. cnt : %d, val : 0x%x != 0x%x\n",
  1393. cnt, result, val);
  1394. }
  1395. return ret;
  1396. }
  1397. static int mms_isc_transfer_cmd(struct mms_ts_info *info, int cmd)
  1398. {
  1399. struct i2c_client *client = info->client;
  1400. struct isc_packet pkt = { ISC_ADDR, cmd };
  1401. struct i2c_msg msg = {
  1402. .addr = client->addr,
  1403. .flags = 0,
  1404. .len = sizeof(struct isc_packet),
  1405. .buf = (u8 *)&pkt,
  1406. };
  1407. return (i2c_transfer(client->adapter, &msg, 1) != 1);
  1408. }
  1409. static int mms_isc_erase_page(struct mms_ts_info *info, int page)
  1410. {
  1411. int ret = 0;
  1412. ret = mms_isc_transfer_cmd(info, ISC_CMD_PAGE_ERASE | page);
  1413. ret |= mms_isc_read_status(info, ISC_PAGE_ERASE_DONE | ISC_PAGE_ERASE_ENTER | page);
  1414. return ret;
  1415. }
  1416. #if 0
  1417. static int mms_isc_enter(struct mms_ts_info *info)
  1418. {
  1419. return i2c_smbus_write_byte_data(info->client, MMS_CMD_ENTER_ISC, true);
  1420. }
  1421. #endif
  1422. static int mms_isc_exit(struct mms_ts_info *info)
  1423. {
  1424. return mms_isc_transfer_cmd(info, ISC_CMD_EXIT);
  1425. }
  1426. static int mms_flash_section(struct mms_ts_info *info,
  1427. struct mms_fw_img *img, const u8 *data,
  1428. struct mms_ext_hdr *ext)
  1429. {
  1430. struct i2c_client *client = info->client;
  1431. struct isc_packet *isc_packet;
  1432. int ret;
  1433. int page, i;
  1434. struct i2c_msg msg[2] = {
  1435. {
  1436. .addr = client->addr,
  1437. .flags = 0,
  1438. }, {
  1439. .addr = client->addr,
  1440. .flags = I2C_M_RD,
  1441. .len = ISC_XFER_LEN,
  1442. },
  1443. };
  1444. int ptr = img->offset;
  1445. isc_packet = kzalloc(sizeof(*isc_packet) + ISC_XFER_LEN, GFP_KERNEL);
  1446. isc_packet->cmd = ISC_ADDR;
  1447. msg[0].buf = (u8 *)isc_packet;
  1448. msg[1].buf = kzalloc(ISC_XFER_LEN, GFP_KERNEL);
  1449. for (page = img->start_page; page <= img->end_page; page++) {
  1450. if (ext->data[page] & EXT_INFO_ERASE)
  1451. mms_isc_erase_page(info, page);
  1452. if (!(ext->data[page] & EXT_INFO_WRITE)) {
  1453. ptr += MMS_FLASH_PAGE_SZ;
  1454. continue;
  1455. }
  1456. for (i = 0; i < ISC_BLOCK_NUM; i++, ptr += ISC_XFER_LEN) {
  1457. /* flash firmware */
  1458. u32 tmp = page * 256 + i * (ISC_XFER_LEN / 4);
  1459. put_unaligned_le32(tmp, &isc_packet->addr);
  1460. msg[0].len = sizeof(struct isc_packet) + ISC_XFER_LEN;
  1461. memcpy(isc_packet->data, data + ptr, ISC_XFER_LEN);
  1462. if (i2c_transfer(client->adapter, msg, 1) != 1)
  1463. goto i2c_err;
  1464. /* verify firmware */
  1465. tmp |= ISC_CMD_READ;
  1466. put_unaligned_le32(tmp, &isc_packet->addr);
  1467. msg[0].len = sizeof(struct isc_packet);
  1468. if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) != ARRAY_SIZE(msg))
  1469. goto i2c_err;
  1470. if (memcmp(isc_packet->data, msg[1].buf, ISC_XFER_LEN)) {
  1471. #if FLASH_VERBOSE_DEBUG
  1472. print_hex_dump(KERN_ERR, "mms fw wr : ",
  1473. DUMP_PREFIX_OFFSET, 16, 1,
  1474. isc_packet->data, ISC_XFER_LEN, false);
  1475. print_hex_dump(KERN_ERR, "mms fw rd : ",
  1476. DUMP_PREFIX_OFFSET, 16, 1,
  1477. msg[1].buf, ISC_XFER_LEN, false);
  1478. #endif
  1479. dev_err(&client->dev, "flash verify failed\n");
  1480. ret = -1;
  1481. goto out;
  1482. }
  1483. }
  1484. }
  1485. dev_info(&client->dev, "section [%d] update succeeded\n", img->type);
  1486. ret = 0;
  1487. goto out;
  1488. i2c_err:
  1489. dev_err(&client->dev, "i2c failed @ %s\n", __func__);
  1490. ret = -1;
  1491. out:
  1492. kfree(isc_packet);
  1493. kfree(msg[1].buf);
  1494. return ret;
  1495. }
  1496. static int mms_flash_fw(struct mms_ts_info *info, bool force_update, int cmd)
  1497. {
  1498. struct i2c_client *client = info->client;
  1499. struct mms_bin_hdr *fw_hdr;
  1500. struct mms_fw_img **img;
  1501. struct mms_ext_hdr *ext;
  1502. struct file *fp = NULL;
  1503. const struct firmware *fw;
  1504. char fw_path[MAX_FW_PATH + 1];
  1505. const u8 *buff = 0;
  1506. long fsize = 0, nread = 0;
  1507. mm_segment_t old_fs = {0};
  1508. u8 ver[SECTION_NUM];
  1509. u8 target[SECTION_NUM];
  1510. int offset = sizeof(struct mms_bin_hdr);
  1511. int ret;
  1512. int i;
  1513. bool update_flag = false;
  1514. ret = get_fw_version(info);
  1515. if (ret == 0) {
  1516. ver[0] = info->fw_boot_ver;
  1517. ver[1] = info->fw_core_ver;
  1518. ver[2] = info->fw_ic_ver;
  1519. } else {
  1520. ver[0] = 0;
  1521. ver[1] = 0;
  1522. ver[2] = 0;
  1523. }
  1524. if (cmd == UMS) {
  1525. old_fs = get_fs();
  1526. set_fs(get_ds());
  1527. snprintf(fw_path, MAX_FW_PATH,
  1528. "/sdcard/%s", TSP_FW_FILENAME);
  1529. fp = filp_open(fw_path, O_RDONLY, 0);
  1530. if (IS_ERR(fp)) {
  1531. dev_err(&client->dev,
  1532. "file %s open error:%d\n", fw_path, (s32)fp);
  1533. set_fs(old_fs);
  1534. ret = -1;
  1535. goto fw_read_fail;
  1536. }
  1537. fsize = fp->f_path.dentry->d_inode->i_size;
  1538. buff = kzalloc((size_t)fsize, GFP_KERNEL);
  1539. if (!buff) {
  1540. dev_err(&client->dev, "fail to alloc buffer for fw\n");
  1541. set_fs(old_fs);
  1542. filp_close(fp, current->files);
  1543. ret = -1;
  1544. goto fw_read_fail;
  1545. }
  1546. nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos);
  1547. if (nread != fsize) {
  1548. dev_err(&client->dev, "fail to vfs_read file\n");
  1549. kfree(buff);
  1550. set_fs(old_fs);
  1551. filp_close(fp, current->files);
  1552. ret = -1;
  1553. goto fw_read_fail;
  1554. }
  1555. fw_hdr = (struct mms_bin_hdr *)buff;
  1556. ext = (struct mms_ext_hdr *)(buff + fw_hdr->extention_offset);
  1557. img = kzalloc(sizeof(*img) * fw_hdr->section_num, GFP_KERNEL);
  1558. mms_reset(info);
  1559. msleep(50);
  1560. for (i = 0; i < fw_hdr->section_num; i++,
  1561. offset += sizeof(struct mms_fw_img)) {
  1562. img[i] = (struct mms_fw_img *)(buff + offset);
  1563. target[i] = img[i]->version;
  1564. if ((ver[img[i]->type] != target[i]) ||
  1565. (force_update == true)) {
  1566. dev_info(&client->dev,
  1567. "section [%d] is need to be updated. ver : 0x%x, bin : 0x%x\n",
  1568. i, ver[i], target[i]);
  1569. update_flag = true;
  1570. ret = mms_flash_section(info, img[i],
  1571. buff + fw_hdr->binary_offset, ext);
  1572. if (ret != 0) {
  1573. mms_reset(info);
  1574. goto out;
  1575. }
  1576. } else {
  1577. dev_info(&client->dev, "section [%d] is up to date\n", i);
  1578. }
  1579. }
  1580. } else {
  1581. if(info->panel == EELY) {
  1582. dev_err(&client->dev, "requesting tsp_melfas/lt/mms252_el.fw\n");
  1583. ret = request_firmware(&fw,
  1584. "tsp_melfas/lt/mms252_el.fw",
  1585. &client->dev);
  1586. } else if (info->panel == ILJIN) {
  1587. ret = request_firmware(&fw,
  1588. "tsp_melfas/lt/melfas_ij.fw",
  1589. &client->dev);
  1590. dev_err(&client->dev, "requesting tsp_melfas/lt/melfas_ij.fw\n");
  1591. }
  1592. else {
  1593. ret = -1;
  1594. dev_err(&client->dev, "[TSP] wrong panel - no firmware requested\n");
  1595. }
  1596. if (ret) {
  1597. dev_err(&client->dev, "failed to read firmware\n");
  1598. goto fw_read_fail;
  1599. }
  1600. fw_hdr = (struct mms_bin_hdr *)fw->data;
  1601. ext = (struct mms_ext_hdr *)(fw->data + fw_hdr->extention_offset);
  1602. img = kzalloc(sizeof(*img) * fw_hdr->section_num, GFP_KERNEL);
  1603. mms_reset(info);
  1604. msleep(50);
  1605. for (i = 0; i < fw_hdr->section_num; i++,
  1606. offset += sizeof(struct mms_fw_img)) {
  1607. img[i] = (struct mms_fw_img *)(fw->data + offset);
  1608. target[i] = img[i]->version;
  1609. if ((ver[img[i]->type] != target[i]) ||
  1610. (force_update == true)) {
  1611. dev_info(&client->dev,
  1612. "section [%d] is need to be updated. ver : 0x%x, bin : 0x%x\n",
  1613. i, ver[i], target[i]);
  1614. update_flag = true;
  1615. ret = mms_flash_section(info, img[i],
  1616. fw->data + fw_hdr->binary_offset, ext);
  1617. if (ret != 0) {
  1618. mms_reset(info);
  1619. goto out;
  1620. }
  1621. } else {
  1622. dev_info(&client->dev, "section [%d] is up to date\n", i);
  1623. }
  1624. }
  1625. }
  1626. if (update_flag)
  1627. mms_isc_exit(info);
  1628. msleep(5);
  1629. mms_reset(info);
  1630. ret = get_fw_version(info);
  1631. if (ret != 0) {
  1632. dev_err(&client->dev, "failed to obtain version after flash\n");
  1633. ret = -1;
  1634. goto out;
  1635. } else {
  1636. ver[0] = info->fw_boot_ver;
  1637. ver[1] = info->fw_core_ver;
  1638. ver[2] = info->fw_ic_ver;
  1639. for (i = 0; i < fw_hdr->section_num; i++) {
  1640. if (ver[img[i]->type] != target[i]) {
  1641. dev_info(&client->dev,
  1642. "version mismatch after flash. [%d] 0x%x != 0x%x\n",
  1643. i, ver[img[i]->type], target[i]);
  1644. ret = -1;
  1645. goto out;
  1646. }
  1647. }
  1648. }
  1649. ret = 0;
  1650. printk(KERN_INFO "mms_flash_fw end");
  1651. out:
  1652. if (cmd == UMS) {
  1653. filp_close(fp, current->files);
  1654. set_fs(old_fs);
  1655. kfree(buff);
  1656. } else {
  1657. release_firmware(fw);
  1658. }
  1659. kfree(img);
  1660. fw_read_fail:
  1661. if (ret != 0) {
  1662. info->fw_boot_ver = 0;
  1663. info->fw_core_ver = 0;
  1664. info->fw_ic_ver = 0;
  1665. }
  1666. return ret;
  1667. }
  1668. static void fw_update(void *device_data)
  1669. {
  1670. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1671. struct i2c_client *client = info->client;
  1672. int ret = 0;
  1673. int fw_bin_ver = 0;
  1674. int fw_core_ver = 0;
  1675. int retries = 4;
  1676. char result[16] = {0};
  1677. if(info->panel == EELY) {
  1678. fw_bin_ver = FW_VERSION_EL;
  1679. fw_core_ver = CORE_VERSION_EL;
  1680. }
  1681. else if (info->panel == ILJIN) {
  1682. fw_bin_ver = FW_VERSION_IJ;
  1683. fw_core_ver = CORE_VERSION_IJ;
  1684. }
  1685. else {
  1686. pr_err("[TSP] fw_update Wrong Panel");
  1687. }
  1688. set_default_result(info);
  1689. dev_info(&client->dev,
  1690. "fw_ic_ver = 0x%02x, fw_bin_ver = 0x%02x\n",
  1691. info->fw_ic_ver, fw_bin_ver);
  1692. switch (info->cmd_param[0]) {
  1693. case BUILT_IN:
  1694. dev_info(&client->dev, "built in fw update\n");
  1695. if (info->fw_core_ver > fw_core_ver) {
  1696. dev_info(&client->dev,
  1697. "fw update does not need\n");
  1698. goto do_not_need_update;
  1699. } else if (info->fw_core_ver == fw_core_ver) {
  1700. if (info->fw_ic_ver >= fw_bin_ver) {
  1701. dev_info(&client->dev,
  1702. "fw update does not need\n");
  1703. goto do_not_need_update;
  1704. }
  1705. } else { /* core < fw_core_ver */
  1706. dev_info(&client->dev,
  1707. "fw update excute(core:0x%x)\n",
  1708. info->fw_core_ver);
  1709. }
  1710. disable_irq(info->irq);
  1711. while (retries--) {
  1712. ret = mms_flash_fw(info, false, BUILT_IN);
  1713. if (ret == 0) {
  1714. pr_err("[TSP] fw update success");
  1715. break;
  1716. } else {
  1717. pr_err("[TSP] fw update fail[%d], retry = %d",
  1718. ret, retries);
  1719. }
  1720. }
  1721. enable_irq(info->irq);
  1722. break;
  1723. case UMS:
  1724. dev_info(&client->dev, "UMS fw update!!\n");
  1725. disable_irq(info->irq);
  1726. while (retries--) {
  1727. ret = mms_flash_fw(info, true, UMS);
  1728. if (ret == 0) {
  1729. pr_err("[TSP] fw update success");
  1730. break;
  1731. } else {
  1732. pr_err("[TSP] fw update fail[%d], retry = %d",
  1733. ret, retries);
  1734. }
  1735. }
  1736. enable_irq(info->irq);
  1737. break;
  1738. default:
  1739. dev_err(&client->dev, "invalid fw update type\n");
  1740. ret = -1;
  1741. break;
  1742. }
  1743. do_not_need_update:
  1744. dev_info(&client->dev, "boot version : %d\n",
  1745. info->fw_boot_ver);
  1746. dev_info(&client->dev, "core version : 0x%02x\n",
  1747. info->fw_core_ver);
  1748. dev_info(&client->dev, "config version : 0x%02x\n",
  1749. info->fw_ic_ver);
  1750. if (ret == 0) {
  1751. snprintf(result, sizeof(result) , "%s", "OK");
  1752. set_cmd_result(info, result,
  1753. strnlen(result, sizeof(result)));
  1754. info->cmd_state = OK;
  1755. } else {
  1756. snprintf(result, sizeof(result) , "%s", "NG");
  1757. set_cmd_result(info, result,
  1758. strnlen(result, sizeof(result)));
  1759. info->cmd_state = FAIL;
  1760. }
  1761. }
  1762. static void get_fw_ver_bin(void *device_data)
  1763. {
  1764. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1765. char buff[16] = {0};
  1766. set_default_result(info);
  1767. if (info->panel == ILJIN) {
  1768. snprintf(buff, sizeof(buff), "ME%02x%02x%02x",
  1769. info->panel, CORE_VERSION_IJ, FW_VERSION_IJ);
  1770. }
  1771. else { /* EELY*/
  1772. snprintf(buff, sizeof(buff), "ME%02x%02x%02x",
  1773. info->panel, CORE_VERSION_EL, FW_VERSION_EL);
  1774. }
  1775. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1776. info->cmd_state = OK;
  1777. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1778. buff, strnlen(buff, sizeof(buff)));
  1779. }
  1780. static void get_fw_ver_ic(void *device_data)
  1781. {
  1782. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1783. char buff[16] = {0};
  1784. set_default_result(info);
  1785. if (info->enabled){
  1786. if(get_fw_version(info)<0)
  1787. pr_err("[TSP] : get_fw_version");
  1788. }
  1789. snprintf(buff, sizeof(buff), "ME%02x%02x%02x",
  1790. info->panel, info->fw_core_ver, info->fw_ic_ver);
  1791. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1792. info->cmd_state = OK;
  1793. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1794. buff, strnlen(buff, sizeof(buff)));
  1795. }
  1796. static void get_config_ver(void *device_data)
  1797. {
  1798. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1799. char buff[20] = {0};
  1800. set_default_result(info);
  1801. if (info->panel == ILJIN)
  1802. snprintf(buff, sizeof(buff), "T311_Me_0608_IJ");
  1803. else if (info->panel == EELY)
  1804. #if defined(CONFIG_MACH_MILLET3G_CHN_OPEN)
  1805. snprintf(buff, sizeof(buff), "SM-T331C_ME_%s", FW_VERSION_DATE);
  1806. #else
  1807. snprintf(buff, sizeof(buff), "T335_ME_0x%02x", FW_VERSION_EL);
  1808. #endif
  1809. else
  1810. snprintf(buff, sizeof(buff), "T311_Me_0608_UN");
  1811. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1812. info->cmd_state = OK;
  1813. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1814. buff, strnlen(buff, sizeof(buff)));
  1815. }
  1816. static void get_threshold(void *device_data)
  1817. {
  1818. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1819. char buff[16] = {0};
  1820. int threshold;
  1821. set_default_result(info);
  1822. threshold = i2c_smbus_read_byte_data(info->client, 0x05);
  1823. if (threshold < 0) {
  1824. snprintf(buff, sizeof(buff), "%s", "NG");
  1825. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1826. info->cmd_state = FAIL;
  1827. return;
  1828. }
  1829. snprintf(buff, sizeof(buff), "%d", threshold);
  1830. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1831. info->cmd_state = OK;
  1832. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1833. buff, strnlen(buff, sizeof(buff)));
  1834. }
  1835. static int is_melfas_vdd_on(struct mms_ts_info *info)
  1836. {
  1837. int ret;
  1838. ret = gpio_get_value(info->pdata->vdd_en);
  1839. pr_info("[TSP] %s = %d\n", __func__, ret);
  1840. if (ret)
  1841. return 1;
  1842. return 0;
  1843. }
  1844. static void module_off_master(void *device_data)
  1845. {
  1846. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1847. char buff[3] = {0};
  1848. mutex_lock(&info->lock);
  1849. if (info->enabled) {
  1850. disable_irq_nosync(info->irq);
  1851. info->enabled = false;
  1852. touch_is_pressed = 0;
  1853. }
  1854. mutex_unlock(&info->lock);
  1855. info->power(info, 0);
  1856. if (is_melfas_vdd_on(info) == 0)
  1857. snprintf(buff, sizeof(buff), "%s", "OK");
  1858. else
  1859. snprintf(buff, sizeof(buff), "%s", "NG");
  1860. set_default_result(info);
  1861. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1862. if (strncmp(buff, "OK", 2) == 0)
  1863. info->cmd_state = OK;
  1864. else
  1865. info->cmd_state = FAIL;
  1866. dev_info(&info->client->dev, "%s: %s\n", __func__, buff);
  1867. }
  1868. static void module_on_master(void *device_data)
  1869. {
  1870. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1871. char buff[3] = {0};
  1872. mms_reset(info);
  1873. mutex_lock(&info->lock);
  1874. if (!info->enabled) {
  1875. enable_irq(info->irq);
  1876. info->enabled = true;
  1877. }
  1878. mutex_unlock(&info->lock);
  1879. if (is_melfas_vdd_on(info) == 1)
  1880. snprintf(buff, sizeof(buff), "%s", "OK");
  1881. else
  1882. snprintf(buff, sizeof(buff), "%s", "NG");
  1883. set_default_result(info);
  1884. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1885. if (strncmp(buff, "OK", 2) == 0)
  1886. info->cmd_state = OK;
  1887. else
  1888. info->cmd_state = FAIL;
  1889. dev_info(&info->client->dev, "%s: %s\n", __func__, buff);
  1890. }
  1891. /*
  1892. static void module_off_slave(void *device_data)
  1893. {
  1894. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1895. not_support_cmd(info);
  1896. }
  1897. static void module_on_slave(void *device_data)
  1898. {
  1899. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1900. not_support_cmd(info);
  1901. }
  1902. */
  1903. static void get_module_vendor(void *device_data)
  1904. {
  1905. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1906. char buff[16] = {0};
  1907. int val,val2;
  1908. set_default_result(info);
  1909. if (!(gpio_get_value(info->pdata->vdd_en) &&
  1910. gpio_get_value(info->pdata->vdd_en2))) {
  1911. dev_err(&info->client->dev, "%s: [ERROR] Touch is stopped\n",
  1912. __func__);
  1913. snprintf(buff, sizeof(buff), "%s", "TSP turned off");
  1914. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1915. info->cmd_state = NOT_APPLICABLE;
  1916. return;
  1917. }
  1918. if (info->pdata->tsp_vendor1 > 0 && info->pdata->tsp_vendor2 > 0 ) {
  1919. gpio_tlmm_config(GPIO_CFG(info->pdata->tsp_vendor1, 0,
  1920. GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), 1);
  1921. gpio_tlmm_config(GPIO_CFG(info->pdata->tsp_vendor2, 0,
  1922. GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), 1);
  1923. val = gpio_get_value(info->pdata->tsp_vendor1);
  1924. val2 = gpio_get_value(info->pdata->tsp_vendor2);
  1925. dev_info(&info->client->dev,
  1926. "%s: TSP_ID: %d[%d]%d[%d]\n", __func__,
  1927. info->pdata->tsp_vendor1, val,info->pdata->tsp_vendor2, val2);
  1928. snprintf(buff, sizeof(buff), "%s,%d%d", tostring(OK), val,val2);
  1929. info->cmd_state = OK;
  1930. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1931. return;
  1932. }
  1933. snprintf(buff, sizeof(buff), "%s", tostring(NG));
  1934. info->cmd_state = FAIL;
  1935. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1936. }
  1937. static void get_chip_vendor(void *device_data)
  1938. {
  1939. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1940. char buff[16] = {0};
  1941. set_default_result(info);
  1942. snprintf(buff, sizeof(buff), "%s", "MELFAS");
  1943. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1944. info->cmd_state = OK;
  1945. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1946. buff, strnlen(buff, sizeof(buff)));
  1947. }
  1948. static void get_chip_name(void *device_data)
  1949. {
  1950. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1951. char buff[16] = {0};
  1952. set_default_result(info);
  1953. snprintf(buff, sizeof(buff), "%s", "MMS252");
  1954. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1955. info->cmd_state = OK;
  1956. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1957. buff, strnlen(buff, sizeof(buff)));
  1958. }
  1959. static void get_reference(void *device_data)
  1960. {
  1961. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1962. char buff[16] = {0};
  1963. unsigned int val;
  1964. int node;
  1965. set_default_result(info);
  1966. node = check_rx_tx_num(info);
  1967. if (node < 0)
  1968. return;
  1969. val = info->reference[node];
  1970. snprintf(buff, sizeof(buff), "%u", val);
  1971. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1972. info->cmd_state = OK;
  1973. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__,
  1974. buff, strnlen(buff, sizeof(buff)));
  1975. }
  1976. static void get_cm_abs(void *device_data)
  1977. {
  1978. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1979. char buff[16] = {0};
  1980. unsigned int val;
  1981. int node;
  1982. set_default_result(info);
  1983. node = check_rx_tx_num(info);
  1984. if (node < 0)
  1985. return;
  1986. val = info->raw[node];
  1987. snprintf(buff, sizeof(buff), "%u", val);
  1988. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  1989. info->cmd_state = OK;
  1990. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff,
  1991. strnlen(buff, sizeof(buff)));
  1992. }
  1993. static void get_cm_delta(void *device_data)
  1994. {
  1995. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  1996. char buff[16] = {0};
  1997. unsigned int val;
  1998. int node;
  1999. set_default_result(info);
  2000. node = check_rx_tx_num(info);
  2001. if (node < 0)
  2002. return;
  2003. val = info->inspection[node];
  2004. snprintf(buff, sizeof(buff), "%u", val);
  2005. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2006. info->cmd_state = OK;
  2007. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff,
  2008. strnlen(buff, sizeof(buff)));
  2009. }
  2010. static void get_intensity(void *device_data)
  2011. {
  2012. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2013. char buff[16] = {0};
  2014. unsigned int val;
  2015. int node;
  2016. set_default_result(info);
  2017. node = check_rx_tx_num(info);
  2018. if (node < 0)
  2019. return;
  2020. val = info->intensity[node];
  2021. snprintf(buff, sizeof(buff), "%u", val);
  2022. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2023. info->cmd_state = OK;
  2024. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff,
  2025. strnlen(buff, sizeof(buff)));
  2026. }
  2027. #if DEBUG_PRINT2
  2028. #define BUF_SIZE PAGE_SIZE
  2029. static char get_debug_data[BUF_SIZE];
  2030. static int get_intensity1(struct mms_ts_info *info)
  2031. {
  2032. struct i2c_client *client = info->client;
  2033. int r, t;
  2034. int ret = 0;
  2035. u8 sz = 0;
  2036. u8 buf[100]={0, };
  2037. u8 reg[4]={ 0, };
  2038. u8 tx_num;
  2039. u8 rx_num;
  2040. u8 key_num;
  2041. s16 cmdata;
  2042. char data[6];
  2043. struct i2c_msg msg[] = {
  2044. {
  2045. .addr = client->addr,
  2046. .flags = 0,
  2047. .buf = reg,
  2048. },{
  2049. .addr = client->addr,
  2050. .flags = I2C_M_RD,
  2051. },
  2052. };
  2053. tx_num = i2c_smbus_read_byte_data(client, 0x0B);
  2054. rx_num = i2c_smbus_read_byte_data(client, 0x0C);
  2055. key_num = i2c_smbus_read_byte_data(client, 0x0D);
  2056. disable_irq_nosync(info->irq);
  2057. memset(get_debug_data,0,BUF_SIZE);
  2058. sprintf(get_debug_data,"%s", "start intensity\n");
  2059. for(r = 0 ; r < rx_num ; r++)
  2060. {
  2061. printk("[%2d]",r);
  2062. sprintf(data,"[%2d]",r);
  2063. strcat(get_debug_data,data);
  2064. memset(data,0,5);
  2065. reg[0] = 0xA0;
  2066. reg[1] = 0x70;
  2067. reg[2] = 0xFF;
  2068. reg[3] = r;
  2069. msg[0].len = 4;
  2070. msleep(1);
  2071. if(i2c_transfer(client->adapter, &msg[0],1)!=1){
  2072. dev_err(&client->dev, "intensity i2c transfer failed\n");
  2073. ret = -1;
  2074. enable_irq(info->irq);
  2075. return ret;
  2076. }
  2077. sz = i2c_smbus_read_byte_data(client, 0xAE);
  2078. reg[0] =0xAF;
  2079. msg[0].len = 1;
  2080. msg[1].len = sz;
  2081. msg[1].buf = buf;
  2082. if(i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg))!=ARRAY_SIZE(msg)){
  2083. ret = -1;
  2084. enable_irq(info->irq);
  2085. return ret;
  2086. }
  2087. sz >>=1;
  2088. for(t = 0 ; t <sz ; t++){
  2089. cmdata = (s16)(buf[2*t] | (buf[2*t+1] << 8));
  2090. printk("%3d",cmdata);
  2091. sprintf(data,"%3d",cmdata);
  2092. strcat(get_debug_data,data);
  2093. memset(data,0,5);
  2094. }
  2095. printk("\n");
  2096. sprintf(data,"\n");
  2097. strcat(get_debug_data,data);
  2098. memset(data,0,5);
  2099. }
  2100. if (key_num)
  2101. {
  2102. printk("---key intensity---\n");
  2103. strcat(get_debug_data,"key intensity\n");
  2104. memset(data,0,5);
  2105. reg[0] = 0xA0;
  2106. reg[1] = 0x71;
  2107. reg[2] = 0xFF;
  2108. reg[3] = 0x00;
  2109. msg[0].len = 4;
  2110. if(i2c_transfer(client->adapter, &msg[0],1)!=1){
  2111. dev_err(&client->dev, "Cm delta i2c transfer failed\n");
  2112. ret = -1;
  2113. enable_irq(info->irq);
  2114. return ret;
  2115. }
  2116. while (gpio_get_value(info->pdata->gpio_int)){
  2117. }
  2118. sz = i2c_smbus_read_byte_data(info->client, 0xAE);
  2119. reg[0] =0xAF;
  2120. msg[0].len = 1;
  2121. msg[1].len = sz;
  2122. msg[1].buf = buf;
  2123. if(i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg))!=ARRAY_SIZE(msg)){
  2124. ret = -1;
  2125. enable_irq(info->irq);
  2126. return ret;
  2127. }
  2128. for(t = 0; t< key_num; t++){
  2129. cmdata = (s16)(buf[2*t] | (buf[2*t+1] << 8));
  2130. printk("%5d",cmdata);
  2131. sprintf(data,"%5d",cmdata);
  2132. strcat(get_debug_data,data);
  2133. memset(data,0,5);
  2134. }
  2135. printk("\n");
  2136. sprintf(data,"\n");
  2137. strcat(get_debug_data,data);
  2138. memset(data,0,5);
  2139. }
  2140. enable_irq(info->irq);
  2141. return 0;
  2142. }
  2143. static ssize_t mms_intensity(struct device *dev, struct device_attribute *attr, char *buf)
  2144. {
  2145. struct mms_ts_info *info = dev_get_drvdata(dev);
  2146. int ret;
  2147. dev_info(&info->client->dev, "Intensity Test\n");
  2148. if(get_intensity1(info)!=0){
  2149. dev_err(&info->client->dev, "Intensity Test failed\n");
  2150. return -1;
  2151. }
  2152. ret = snprintf(buf,BUF_SIZE,"%s\n",get_debug_data);
  2153. return ret;
  2154. }
  2155. static DEVICE_ATTR(intensity, 0664, mms_intensity, NULL);
  2156. static struct attribute *mms_attrs[] = {
  2157. &dev_attr_intensity.attr,
  2158. NULL,
  2159. };
  2160. static const struct attribute_group mms_attr_group = {
  2161. .attrs = mms_attrs,
  2162. };
  2163. #endif
  2164. static int using = 0;
  2165. static struct mms_ts_info *ts = NULL;
  2166. void dump_tsp_log(void){
  2167. #if DEBUG_PRINT2
  2168. if(using ==0){
  2169. using = 1;
  2170. dev_info(&ts->client->dev, "demp_tsp_log, Intensity value\n");
  2171. if(get_intensity1(ts)!=0){
  2172. dev_err(&ts->client->dev, "Intensity Test failed\n");
  2173. }
  2174. using = 0;
  2175. }else{
  2176. dev_err(&ts->client->dev, "Intensity Testing. wait.\n");
  2177. }
  2178. #else
  2179. dev_info(&ts->client->dev, "demp_tsp_log, not debug2 mode\n");
  2180. #endif
  2181. }
  2182. EXPORT_SYMBOL(dump_tsp_log);
  2183. static void get_x_num(void *device_data)
  2184. {
  2185. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2186. char buff[16] = {0};
  2187. u32 val;
  2188. u8 r_buf[2];
  2189. int ret;
  2190. set_default_result(info);
  2191. ret = i2c_smbus_read_i2c_block_data(info->client,
  2192. ADDR_CH_NUM, 2, r_buf);
  2193. val = r_buf[0];
  2194. if (ret < 0) {
  2195. snprintf(buff, sizeof(buff), "%s", "NG");
  2196. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2197. info->cmd_state = FAIL;
  2198. dev_info(&info->client->dev,
  2199. "%s: fail to read num of x (%d).\n",
  2200. __func__, val);
  2201. return;
  2202. }
  2203. snprintf(buff, sizeof(buff), "%u", val);
  2204. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2205. info->cmd_state = OK;
  2206. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff,
  2207. strnlen(buff, sizeof(buff)));
  2208. }
  2209. static void get_y_num(void *device_data)
  2210. {
  2211. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2212. char buff[16] = {0};
  2213. u32 val;
  2214. u8 r_buf[2];
  2215. int ret;
  2216. set_default_result(info);
  2217. ret = i2c_smbus_read_i2c_block_data(info->client,
  2218. ADDR_CH_NUM, 2, r_buf);
  2219. val = r_buf[1];
  2220. if (ret < 0) {
  2221. snprintf(buff, sizeof(buff), "%s", "NG");
  2222. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2223. info->cmd_state = FAIL;
  2224. dev_info(&info->client->dev,
  2225. "%s: fail to read num of x (%d).\n",
  2226. __func__, val);
  2227. return;
  2228. }
  2229. snprintf(buff, sizeof(buff), "%u", val);
  2230. set_cmd_result(info, buff, strnlen(buff, sizeof(buff)));
  2231. info->cmd_state = OK;
  2232. dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff,
  2233. strnlen(buff, sizeof(buff)));
  2234. }
  2235. static void run_reference_read(void *device_data)
  2236. {
  2237. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2238. set_default_result(info);
  2239. if(!get_raw_data(info, MMS_VSC_CMD_REFER))
  2240. info->cmd_state = OK;
  2241. else
  2242. info->cmd_state = NG;
  2243. /* dev_info(&info->client->dev, "%s: %s(%d)\n", __func__); */
  2244. }
  2245. static void run_cm_abs_read(void *device_data)
  2246. {
  2247. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2248. set_default_result(info);
  2249. if(!get_raw_data(info, MMS_VSC_CMD_CM_ABS))
  2250. info->cmd_state = OK;
  2251. else
  2252. info->cmd_state = NG;
  2253. /* dev_info(&info->client->dev, "%s: %s(%d)\n", __func__); */
  2254. }
  2255. static void run_cm_delta_read(void *device_data)
  2256. {
  2257. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2258. set_default_result(info);
  2259. if(!get_raw_data(info, MMS_VSC_CMD_CM_DELTA))
  2260. info->cmd_state = OK;
  2261. else
  2262. info->cmd_state = NG;
  2263. /* dev_info(&info->client->dev, "%s: %s(%d)\n", __func__); */
  2264. }
  2265. static void run_intensity_read(void *device_data)
  2266. {
  2267. struct mms_ts_info *info = (struct mms_ts_info *)device_data;
  2268. set_default_result(info);
  2269. get_intensity_data(info);
  2270. info->cmd_state = OK;
  2271. /* dev_info(&info->client->dev, "%s: %s(%d)\n", __func__); */
  2272. }
  2273. static ssize_t store_cmd(struct device *dev, struct device_attribute
  2274. *devattr, const char *buf, size_t count)
  2275. {
  2276. struct mms_ts_info *info = dev_get_drvdata(dev);
  2277. struct i2c_client *client = info->client;
  2278. char *cur, *start, *end;
  2279. char buff[TSP_CMD_STR_LEN] = {0};
  2280. int len, i;
  2281. struct tsp_cmd *tsp_cmd_ptr = NULL;
  2282. char delim = ',';
  2283. bool cmd_found = false;
  2284. int param_cnt = 0;
  2285. int ret;
  2286. if (strlen(buf) >= TSP_CMD_STR_LEN) {
  2287. dev_err(&info->client->dev, "%s: cmd length is over(%s,%d)!!\n", __func__, buf, (int)strlen(buf));
  2288. return -EINVAL;
  2289. }
  2290. if (info->cmd_is_running == true) {
  2291. dev_err(&info->client->dev, "tsp_cmd: other cmd is running.\n");
  2292. goto err_out;
  2293. }
  2294. /* check lock */
  2295. mutex_lock(&info->cmd_lock);
  2296. info->cmd_is_running = true;
  2297. mutex_unlock(&info->cmd_lock);
  2298. info->cmd_state = RUNNING;
  2299. for (i = 0; i < ARRAY_SIZE(info->cmd_param); i++)
  2300. info->cmd_param[i] = 0;
  2301. len = (int)count;
  2302. if (*(buf + len - 1) == '\n')
  2303. len--;
  2304. memset(info->cmd, 0x00, ARRAY_SIZE(info->cmd));
  2305. memcpy(info->cmd, buf, len);
  2306. cur = strchr(buf, (int)delim);
  2307. if (cur)
  2308. memcpy(buff, buf, cur - buf);
  2309. else
  2310. memcpy(buff, buf, len);
  2311. /* find command */
  2312. list_for_each_entry(tsp_cmd_ptr, &info->cmd_list_head, list) {
  2313. if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) {
  2314. cmd_found = true;
  2315. break;
  2316. }
  2317. }
  2318. /* set not_support_cmd */
  2319. if (!cmd_found) {
  2320. list_for_each_entry(tsp_cmd_ptr, &info->cmd_list_head, list) {
  2321. if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name))
  2322. break;
  2323. }
  2324. }
  2325. /* parsing parameters */
  2326. if (cur && cmd_found) {
  2327. cur++;
  2328. start = cur;
  2329. memset(buff, 0x00, ARRAY_SIZE(buff));
  2330. do {
  2331. if (*cur == delim || cur - buf == len) {
  2332. end = cur;
  2333. memcpy(buff, start, end - start);
  2334. *(buff + strlen(buff)) = '\0';
  2335. ret = kstrtoint(buff, 10,\
  2336. info->cmd_param + param_cnt);
  2337. start = cur + 1;
  2338. memset(buff, 0x00, ARRAY_SIZE(buff));
  2339. param_cnt++;
  2340. }
  2341. cur++;
  2342. } while ((cur - buf <= len) && (param_cnt < TSP_CMD_PARAM_NUM));
  2343. }
  2344. dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name);
  2345. for (i = 0; i < param_cnt; i++)
  2346. dev_info(&client->dev, "cmd param %d= %d\n", i,
  2347. info->cmd_param[i]);
  2348. tsp_cmd_ptr->cmd_func(info);
  2349. err_out:
  2350. return count;
  2351. }
  2352. static ssize_t show_cmd_status(struct device *dev,
  2353. struct device_attribute *devattr, char *buf)
  2354. {
  2355. struct mms_ts_info *info = dev_get_drvdata(dev);
  2356. char buff[16] = {0};
  2357. dev_info(&info->client->dev, "tsp cmd: status:%d\n",
  2358. info->cmd_state);
  2359. if (info->cmd_state == WAITING)
  2360. snprintf(buff, sizeof(buff), "WAITING");
  2361. else if (info->cmd_state == RUNNING)
  2362. snprintf(buff, sizeof(buff), "RUNNING");
  2363. else if (info->cmd_state == OK)
  2364. snprintf(buff, sizeof(buff), "OK");
  2365. else if (info->cmd_state == FAIL)
  2366. snprintf(buff, sizeof(buff), "FAIL");
  2367. else if (info->cmd_state == NOT_APPLICABLE)
  2368. snprintf(buff, sizeof(buff), "NOT_APPLICABLE");
  2369. else if (info->cmd_state == NG)
  2370. snprintf(buff, sizeof(buff), "NG");
  2371. return snprintf(buf, TSP_BUF_SIZE, "%s\n", buff);
  2372. }
  2373. static ssize_t show_cmd_result(struct device *dev, struct device_attribute
  2374. *devattr, char *buf)
  2375. {
  2376. struct mms_ts_info *info = dev_get_drvdata(dev);
  2377. dev_info(&info->client->dev, "tsp cmd: result: %s\n", info->cmd_result);
  2378. mutex_lock(&info->cmd_lock);
  2379. info->cmd_is_running = false;
  2380. mutex_unlock(&info->cmd_lock);
  2381. info->cmd_state = WAITING;
  2382. return snprintf(buf, TSP_BUF_SIZE, "%s\n", info->cmd_result);
  2383. }
  2384. #if TOUCHKEY
  2385. static ssize_t touch_led_control(struct device *dev,
  2386. struct device_attribute *attr, const char *buf,
  2387. size_t count)
  2388. {
  2389. struct mms_ts_info *info = dev_get_drvdata(dev);
  2390. struct i2c_client *client = info->client;
  2391. u32 data;
  2392. int ret;
  2393. ret = sscanf(buf, "%d", &data);
  2394. //ret = kstrtol(buf,12, &data);
  2395. if (ret != 1) {
  2396. dev_err(&client->dev, "%s: cmd read err\n", __func__);
  2397. return count;
  2398. }
  2399. if (!(data == 0 || data == 1)) {
  2400. dev_err(&client->dev, "%s: wrong command(%d)\n",
  2401. __func__, data);
  2402. return count;
  2403. }
  2404. if (data == 1) {
  2405. dev_notice(&client->dev, "led on\n");
  2406. info->keyled(info, 1);
  2407. info->led_cmd = true;
  2408. } else {
  2409. dev_notice(&client->dev, "led off\n");
  2410. info->keyled(info, 0);
  2411. info->led_cmd = false;
  2412. }
  2413. return count;
  2414. }
  2415. static ssize_t touchkey_threshold_show(struct device *dev,
  2416. struct device_attribute *attr, char *buf)
  2417. {
  2418. struct mms_ts_info *info = dev_get_drvdata(dev);
  2419. u8 r_buf[2];
  2420. int i;
  2421. if (!info->enabled)
  2422. return sprintf(buf, "0 0\n");
  2423. for (i = 0; i < 2; i++) {
  2424. i2c_smbus_write_byte_data(info->client, 0x20, i+1);
  2425. r_buf[i] = i2c_smbus_read_byte_data(info->client, 0x20);
  2426. }
  2427. //return sprintf(buf, "%d %d\n", r_buf[0], r_buf[1]);
  2428. return sprintf(buf,"%d\n", r_buf[0]);
  2429. }
  2430. static void get_intensity_key(struct mms_ts_info *info)
  2431. {
  2432. u8 w_buf[4];
  2433. u8 r_buf;
  2434. u8 read_buffer[10] = {0};
  2435. int i;
  2436. int ret;
  2437. u16 raw_data;
  2438. int data;
  2439. if (!info->enabled) {
  2440. info->menu_s = 0;
  2441. info->back_s = 0;
  2442. return;
  2443. }
  2444. disable_irq(info->irq);
  2445. w_buf[0] = ADDR_UNIV_CMD;
  2446. w_buf[1] = CMD_GET_INTEN_KEY;
  2447. w_buf[2] = 0xFF;
  2448. w_buf[3] = 0;
  2449. ret = i2c_smbus_write_i2c_block_data(info->client,
  2450. w_buf[0], 3, &w_buf[1]);
  2451. if (ret < 0)
  2452. goto err_i2c;
  2453. usleep_range(1, 5);
  2454. ret = i2c_smbus_read_i2c_block_data(info->client,
  2455. CMD_RESULT_SZ, 1, &r_buf);
  2456. if (ret < 0)
  2457. goto err_i2c;
  2458. ret = get_data(info, CMD_RESULT, r_buf, read_buffer);
  2459. if (ret < 0)
  2460. goto err_i2c;
  2461. for (i = 0; i < r_buf/2; i++) {
  2462. raw_data = read_buffer[2*i] | (read_buffer[2*i+1] << 8);
  2463. if (raw_data < 32767)
  2464. data = (int)raw_data;
  2465. else
  2466. data = -(65536 - raw_data);
  2467. if (i == 0)
  2468. info->menu_s = data;
  2469. if (i == 1)
  2470. info->back_s = data;
  2471. }
  2472. enable_irq(info->irq);
  2473. return;
  2474. err_i2c:
  2475. dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n",
  2476. __func__, MMS_VSC_CMD_INTENSITY);
  2477. info->menu_s = 0;
  2478. info->back_s = 0;
  2479. release_all_fingers(info);
  2480. mms_reset(info);
  2481. enable_irq(info->irq);
  2482. }
  2483. static ssize_t touchkey_recent_show(struct device *dev,
  2484. struct device_attribute *attr, char *buf)
  2485. {
  2486. struct mms_ts_info *info = dev_get_drvdata(dev);
  2487. get_intensity_key(info);
  2488. return sprintf(buf, "%d\n", info->menu_s);
  2489. }
  2490. static ssize_t touchkey_back_show(struct device *dev,
  2491. struct device_attribute *attr, char *buf)
  2492. {
  2493. struct mms_ts_info *info = dev_get_drvdata(dev);
  2494. get_intensity_key(info);
  2495. return sprintf(buf, "%d\n", info->back_s);
  2496. }
  2497. static ssize_t touchkey_fw_read(struct device *dev,
  2498. struct device_attribute *attr, char *buf)
  2499. {
  2500. #if 0
  2501. struct mms_ts_info *info = dev_get_drvdata(dev);
  2502. if(info->panel == ILJIN) {
  2503. return snprintf(buf, 10, "ME%02x%02x%02x",
  2504. info->panel, CORE_VERSION_IJ, FW_VERSION_IJ);
  2505. } else { /* EELY */
  2506. return snprintf(buf, 10, "ME%02x%02x%02x",
  2507. info->panel, CORE_VERSION_EL, FW_VERSION_EL);
  2508. }
  2509. #endif
  2510. return snprintf(buf, 4, "%s", "N");
  2511. }
  2512. #endif
  2513. #ifdef ESD_DEBUG
  2514. static bool intensity_log_flag;
  2515. static u32 get_raw_data_one(struct mms_ts_info *info, u16 rx_idx, u16 tx_idx,
  2516. u8 cmd)
  2517. {
  2518. u8 w_buf[6];
  2519. u8 read_buffer[2];
  2520. int ret;
  2521. u32 raw_data;
  2522. w_buf[0] = MMS_VSC_CMD; /* vendor specific command id */
  2523. w_buf[1] = MMS_VSC_MODE; /* mode of vendor */
  2524. w_buf[2] = 0; /* tx line */
  2525. w_buf[3] = 0; /* rx line */
  2526. w_buf[4] = 0; /* reserved */
  2527. w_buf[5] = 0; /* sub command */
  2528. if (cmd != MMS_VSC_CMD_INTENSITY && cmd != MMS_VSC_CMD_RAW &&
  2529. cmd != MMS_VSC_CMD_REFER) {
  2530. dev_err(&info->client->dev, "%s: not profer command(cmd=%d)\n",
  2531. __func__, cmd);
  2532. return RAW_FAIL;
  2533. }
  2534. w_buf[2] = tx_idx; /* tx */
  2535. w_buf[3] = rx_idx; /* rx */
  2536. w_buf[5] = cmd; /* sub command */
  2537. ret = i2c_smbus_write_i2c_block_data(info->client, w_buf[0], 5,
  2538. &w_buf[1]);
  2539. if (ret < 0)
  2540. goto err_i2c;
  2541. ret = i2c_smbus_read_i2c_block_data(info->client, 0xBF, 2, read_buffer);
  2542. if (ret < 0)
  2543. goto err_i2c;
  2544. raw_data = ((u16) read_buffer[1] << 8) | read_buffer[0];
  2545. if (cmd == MMS_VSC_CMD_REFER)
  2546. raw_data = raw_data >> 4;
  2547. return raw_data;
  2548. err_i2c:
  2549. dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n",
  2550. __func__, cmd);
  2551. return RAW_FAIL;
  2552. }
  2553. static ssize_t show_intensity_logging_on(struct device *dev,
  2554. struct device_attribute *devattr, char *buf)
  2555. {
  2556. struct mms_ts_info *info = dev_get_drvdata(dev);
  2557. struct i2c_client *client = info->client;
  2558. struct file *fp;
  2559. char log_data[160] = { 0, };
  2560. char buff[16] = { 0, };
  2561. mm_segment_t old_fs;
  2562. long nwrite;
  2563. u32 val;
  2564. int i, c;
  2565. u32 y;
  2566. old_fs = get_fs();
  2567. set_fs(KERNEL_DS);
  2568. #define MELFAS_DEBUG_LOG_PATH "/sdcard/melfas_log"
  2569. dev_info(&client->dev, "%s: start.\n", __func__);
  2570. fp = filp_open(MELFAS_DEBUG_LOG_PATH, O_RDWR | O_CREAT,
  2571. S_IRWXU | S_IRWXG | S_IRWXO);
  2572. if (IS_ERR(fp)) {
  2573. dev_err(&client->dev, "%s: fail to open log file\n", __func__);
  2574. goto open_err;
  2575. }
  2576. intensity_log_flag = 1;
  2577. do {
  2578. for (y = 0; y < 3; y++) {
  2579. /* for tx chanel 0~2 */
  2580. memset(log_data, 0x00, 160);
  2581. snprintf(buff, 16, "%1u: ", y);
  2582. strncat(log_data, buff, strnlen(buff, 16));
  2583. for (i = 0; i < RX_NUM; i++) {
  2584. val = get_raw_data_one(info, i, y,
  2585. MMS_VSC_CMD_INTENSITY);
  2586. snprintf(buff, 16, "%5u, ", val);
  2587. strncat(log_data, buff, strnlen(buff, 16));
  2588. }
  2589. memset(buff, '\n', 2);
  2590. c = (y == 2) ? 2 : 1;
  2591. strncat(log_data, buff, c);
  2592. nwrite = vfs_write(fp, (const char __user *)log_data,
  2593. strnlen(log_data, 160), &fp->f_pos);
  2594. }
  2595. usleep_range(3000, 5000);
  2596. } while (intensity_log_flag);
  2597. filp_close(fp, current->files);
  2598. set_fs(old_fs);
  2599. return 0;
  2600. open_err:
  2601. set_fs(old_fs);
  2602. return RAW_FAIL;
  2603. }
  2604. static ssize_t show_intensity_logging_off(struct device *dev,
  2605. struct device_attribute *devattr, char *buf)
  2606. {
  2607. struct mms_ts_info *info = dev_get_drvdata(dev);
  2608. intensity_log_flag = 0;
  2609. usleep_range(10000, 12000);
  2610. get_raw_data_all(info, MMS_VSC_CMD_EXIT);
  2611. return 0;
  2612. }
  2613. #endif
  2614. static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL);
  2615. static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd);
  2616. static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL);
  2617. static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL);
  2618. #if TOUCHKEY
  2619. static DEVICE_ATTR(touchkey_threshold, S_IRUGO, touchkey_threshold_show, NULL);
  2620. static DEVICE_ATTR(touchkey_recent, S_IRUGO, touchkey_recent_show, NULL);
  2621. static DEVICE_ATTR(touchkey_back, S_IRUGO, touchkey_back_show, NULL);
  2622. static DEVICE_ATTR(touchkey_firm_version_panel, S_IRUGO,
  2623. touchkey_fw_read, NULL);
  2624. static DEVICE_ATTR(touchkey_firm_version_phone, S_IRUGO,
  2625. touchkey_fw_read, NULL);
  2626. #endif
  2627. #ifdef ESD_DEBUG
  2628. static DEVICE_ATTR(intensity_logging_on, S_IRUGO, show_intensity_logging_on,
  2629. NULL);
  2630. static DEVICE_ATTR(intensity_logging_off, S_IRUGO, show_intensity_logging_off,
  2631. NULL);
  2632. #endif
  2633. static struct attribute *sec_touch_facotry_attributes[] = {
  2634. &dev_attr_close_tsp_test.attr,
  2635. &dev_attr_cmd.attr,
  2636. &dev_attr_cmd_status.attr,
  2637. &dev_attr_cmd_result.attr,
  2638. #ifdef ESD_DEBUG
  2639. &dev_attr_intensity_logging_on.attr,
  2640. &dev_attr_intensity_logging_off.attr,
  2641. #endif
  2642. NULL,
  2643. };
  2644. static struct attribute_group sec_touch_factory_attr_group = {
  2645. .attrs = sec_touch_facotry_attributes,
  2646. };
  2647. #endif /* SEC_TSP_FACTORY_TEST */
  2648. #if TOUCHKEY
  2649. static DEVICE_ATTR(brightness, S_IRUGO | S_IWUSR | S_IWGRP, NULL,
  2650. touch_led_control);
  2651. static struct attribute *sec_touchkeyled_attributes[] = {
  2652. &dev_attr_brightness.attr,
  2653. NULL,
  2654. };
  2655. static struct attribute *sec_touchkey_attributes[] = {
  2656. #ifdef SEC_TSP_FACTORY_TEST
  2657. &dev_attr_touchkey_threshold.attr,
  2658. &dev_attr_touchkey_recent.attr,
  2659. &dev_attr_touchkey_back.attr,
  2660. &dev_attr_touchkey_firm_version_panel.attr,
  2661. &dev_attr_touchkey_firm_version_phone.attr,
  2662. #endif
  2663. NULL,
  2664. };
  2665. static struct attribute_group sec_touchkeyled_attr_group = {
  2666. .attrs = sec_touchkeyled_attributes,
  2667. };
  2668. static struct attribute_group sec_touchkey_attr_group = {
  2669. .attrs = sec_touchkey_attributes,
  2670. };
  2671. #endif
  2672. static int mms_ts_fw_check(struct mms_ts_info *info)
  2673. {
  2674. struct i2c_client *client = info->client;
  2675. int ret, retry;
  2676. char buf[4] = { 0, };
  2677. bool update = false;
  2678. ret = i2c_master_recv(client, buf, 1);
  2679. if (ret < 0) { /* tsp connect check */
  2680. pr_err("%s: i2c fail...[%d], addr[%d]\n",
  2681. __func__, ret, info->client->addr);
  2682. #if defined(CONFIG_MACH_MILLET3G_CHN_OPEN)
  2683. retry = 4;
  2684. while (retry)
  2685. {
  2686. ret = i2c_master_recv(client, buf, 1);
  2687. if(ret > 0 && ret == 0)
  2688. {
  2689. break;
  2690. }
  2691. msleep(10);
  2692. retry--;
  2693. }
  2694. if (retry == 0 && ret < 0)
  2695. {
  2696. pr_info("[TSP] force update firmware \n");
  2697. update = true;
  2698. }
  2699. #else
  2700. pr_err("%s: tsp driver unload\n", __func__);
  2701. return ret;
  2702. #endif
  2703. }
  2704. if (info->panel == EELY)
  2705. dev_info(&client->dev,
  2706. "EELY panel\n");
  2707. else if (info->panel == ILJIN)
  2708. dev_info(&client->dev,
  2709. "IJLIN panel\n");
  2710. else
  2711. dev_info(&client->dev,
  2712. "unknown panel\n");
  2713. if (info->panel == ILJIN)
  2714. {
  2715. #if defined(CONFIG_MACH_MILLET3G_CHN_OPEN)
  2716. if (!update) {
  2717. ret = get_fw_version(info);
  2718. }
  2719. else {
  2720. ret = 0;
  2721. }
  2722. #else
  2723. ret = get_fw_version(info);
  2724. #endif
  2725. if (ret != 0) {
  2726. dev_err(&client->dev, "fw_version read fail\n");
  2727. update = true;
  2728. }
  2729. if (!update) {
  2730. if (info->fw_boot_ver != BOOT_VERSION_IJ) {
  2731. dev_err(&client->dev,
  2732. "boot version must be 0x%x\n",
  2733. BOOT_VERSION_IJ);
  2734. update = true;
  2735. }
  2736. }
  2737. if (!update) {
  2738. if ((info->fw_core_ver < CORE_VERSION_IJ) ||
  2739. (info->fw_core_ver == 0xff)) {
  2740. dev_err(&client->dev,
  2741. "core version must be 0x%x\n",
  2742. CORE_VERSION_IJ);
  2743. update = true;
  2744. }
  2745. }
  2746. if (!update) {
  2747. if ((info->fw_ic_ver < FW_VERSION_IJ) ||
  2748. (info->fw_ic_ver == 0xff)) {
  2749. dev_err(&client->dev,
  2750. "config version must be over 0x%x\n",
  2751. FW_VERSION_IJ);
  2752. update = true;
  2753. }
  2754. }
  2755. }
  2756. else if (info->panel == EELY)
  2757. {
  2758. #if defined(CONFIG_MACH_MILLET3G_CHN_OPEN)
  2759. if (!update){
  2760. ret = get_fw_version(info);
  2761. }
  2762. else {
  2763. ret = 0;
  2764. }
  2765. #else
  2766. ret = get_fw_version(info);
  2767. #endif
  2768. if (ret != 0) {
  2769. dev_err(&client->dev, "fw_version read fail\n");
  2770. update = true;
  2771. }
  2772. if (!update) {
  2773. if (info->fw_boot_ver != BOOT_VERSION_EL) {
  2774. dev_err(&client->dev,
  2775. "boot version must be 0x%x\n",
  2776. BOOT_VERSION_EL);
  2777. update = true;
  2778. }
  2779. }
  2780. if (!update) {
  2781. if ((info->fw_core_ver < CORE_VERSION_EL) ||
  2782. (info->fw_core_ver == 0xff)) {
  2783. dev_err(&client->dev,
  2784. "core version must be 0x%x\n",
  2785. CORE_VERSION_EL);
  2786. update = true;
  2787. }
  2788. }
  2789. if (!update) {
  2790. if ((info->fw_ic_ver < FW_VERSION_EL) ||
  2791. (info->fw_ic_ver == 0xff)) {
  2792. dev_err(&client->dev,
  2793. "config version must be over 0x%x\n",
  2794. FW_VERSION_EL);
  2795. update = true;
  2796. }
  2797. }
  2798. }
  2799. if (update) {
  2800. dev_err(&client->dev, "excute mms_flash_fw\n");
  2801. retry = 4;
  2802. while (retry--) {
  2803. ret = mms_flash_fw(info, true, BUILT_IN);
  2804. if (ret) {
  2805. dev_err(&client->dev,
  2806. "failed to mms_flash_fw (%d)\n", ret);
  2807. dev_err(&client->dev,
  2808. "retry flash (%d)\n", retry);
  2809. } else {
  2810. dev_info(&client->dev,
  2811. "fw update success\n");
  2812. break;
  2813. }
  2814. }
  2815. }
  2816. if (update && !!ret)
  2817. return -1;
  2818. return 0;
  2819. }
  2820. static void melfas_request_gpio(struct melfas_tsi_platform_data *pdata)
  2821. {
  2822. int ret;
  2823. pr_info("[TSP] %s called \n", __func__);
  2824. ret = gpio_request(pdata->gpio_int, "melfas_tsp_irq");
  2825. if (ret) {
  2826. pr_err("[TSP]%s: unable to request melfas_tsp_irq [%d]\n",
  2827. __func__, pdata->gpio_int);
  2828. return;
  2829. }
  2830. ret = gpio_request(pdata->vdd_en, "melfas_vdd_en");
  2831. if (ret) {
  2832. pr_err("[TSP]%s: unable to request melfas_vdd_en [%d]\n",
  2833. __func__, pdata->vdd_en);
  2834. return;
  2835. }
  2836. ret = gpio_request(pdata->vdd_en2, "melfas_vdd_en2");
  2837. if (ret) {
  2838. pr_err("[TSP]%s: unable to request melfas_vdd_en2 [%d]\n",
  2839. __func__, pdata->vdd_en2);
  2840. return;
  2841. }
  2842. ret = gpio_request(pdata->tsp_vendor1, "melfas_tsp_vendor1");
  2843. if (ret) {
  2844. pr_err("[TSP]%s: unable to request melfas_vdd_en2 [%d]\n",
  2845. __func__, pdata->tsp_vendor1);
  2846. return;
  2847. }
  2848. ret = gpio_request(pdata->tsp_vendor2, "melfas_tsp_vendor2");
  2849. if (ret) {
  2850. pr_err("[TSP]%s: unable to request melfas_vdd_en2 [%d]\n",
  2851. __func__, pdata->tsp_vendor2);
  2852. return;
  2853. }
  2854. if(pdata->tkey_led_en >= 0){
  2855. ret = gpio_request(pdata->tkey_led_en, "tkey_enable");
  2856. if (ret) {
  2857. pr_err("[TSP]%s: unable to request tkey_enable [%d]\n",
  2858. __func__, pdata->tkey_led_en);
  2859. return;
  2860. }
  2861. }
  2862. }
  2863. #ifdef CONFIG_OF
  2864. static int mms_get_dt_coords(struct device *dev, char *name,
  2865. struct melfas_tsi_platform_data *pdata)
  2866. {
  2867. u32 coords[MMS_COORDS_ARR_SIZE];
  2868. struct property *prop;
  2869. struct device_node *np = dev->of_node;
  2870. int coords_size, rc;
  2871. prop = of_find_property(np, name, NULL);
  2872. if (!prop)
  2873. return -EINVAL;
  2874. if (!prop->value)
  2875. return -ENODATA;
  2876. coords_size = prop->length / sizeof(u32);
  2877. if (coords_size != MMS_COORDS_ARR_SIZE) {
  2878. dev_err(dev, "invalid %s\n", name);
  2879. return -EINVAL;
  2880. }
  2881. rc = of_property_read_u32_array(np, name, coords, coords_size);
  2882. if (rc && (rc != -EINVAL)) {
  2883. dev_err(dev, "Unable to read %s\n", name);
  2884. return rc;
  2885. }
  2886. if (strncmp(name, "melfas,panel-coords",
  2887. sizeof("melfas,panel-coords")) == 0) {
  2888. pdata->invert_x = coords[0];
  2889. pdata->invert_y = coords[1];
  2890. pdata->max_x = coords[2];
  2891. pdata->max_y = coords[3];
  2892. } else {
  2893. dev_err(dev, "unsupported property %s\n", name);
  2894. return -EINVAL;
  2895. }
  2896. return 0;
  2897. }
  2898. static int get_panel_version(struct mms_ts_info *info){
  2899. struct regulator *regulator_pullup;
  2900. int rc = 0;
  2901. regulator_pullup = regulator_get(NULL, "8226_l6");
  2902. if (IS_ERR(regulator_pullup))
  2903. return PTR_ERR(regulator_pullup);
  2904. regulator_set_voltage(regulator_pullup, 1800000, 1800000);
  2905. regulator_enable(regulator_pullup);
  2906. gpio_tlmm_config(GPIO_CFG(info->pdata->tsp_vendor1,0,GPIO_CFG_INPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  2907. gpio_tlmm_config(GPIO_CFG(info->pdata->tsp_vendor2,0,GPIO_CFG_INPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  2908. if (gpio_get_value(info->pdata->tsp_vendor1))
  2909. info->pdata->panel = 1;
  2910. else
  2911. info->pdata->panel = 0;
  2912. if (gpio_get_value(info->pdata->tsp_vendor2))
  2913. info->pdata->panel = info->pdata->panel | (1 << 1);
  2914. regulator_disable(regulator_pullup);
  2915. return rc;
  2916. }
  2917. int melfas_power(struct mms_ts_info *info, int on){
  2918. if (tsp_power_enabled == on)
  2919. return 0;
  2920. printk(KERN_DEBUG "[TSP] %s %s\n",
  2921. __func__, on ? "on" : "off");
  2922. gpio_tlmm_config(GPIO_CFG(info->pdata->vdd_en,0,GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  2923. gpio_tlmm_config(GPIO_CFG(info->pdata->vdd_en2,0,GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  2924. gpio_set_value(info->pdata->vdd_en,on);
  2925. gpio_set_value(info->pdata->vdd_en2,on);
  2926. msleep(20);
  2927. tsp_power_enabled = on;
  2928. return 0;
  2929. }
  2930. #if TOUCHKEY
  2931. int key_led_control(struct mms_ts_info *info, int on)
  2932. {
  2933. printk(KERN_DEBUG "[TSP] %s %s\n",
  2934. __func__, on ? "on" : "off");
  2935. if(info->pdata->tkey_led_en >= 0){
  2936. gpio_set_value(info->pdata->tkey_led_en,on);
  2937. }
  2938. return 0;
  2939. }
  2940. #endif
  2941. static int mms_parse_dt(struct device *dev,
  2942. struct melfas_tsi_platform_data *pdata)
  2943. {
  2944. int rc;
  2945. struct device_node *np = dev->of_node;
  2946. rc = mms_get_dt_coords(dev, "melfas,panel-coords", pdata);
  2947. if (rc)
  2948. return rc;
  2949. /* regulator info */
  2950. pdata->i2c_pull_up = of_property_read_bool(np, "melfas,i2c-pull-up");
  2951. pdata->vdd_en = of_get_named_gpio(np, "vdd_en-gpio", 0);
  2952. pdata->vdd_en2 = of_get_named_gpio(np, "vdd_en2-gpio", 0);
  2953. pdata->tkey_led_en = of_get_named_gpio(np, "tkey_en-gpio", 0);
  2954. if(pdata->tkey_led_en < 0){
  2955. pr_info("[TSP] error %d requesting ledgpio, ignoring\n",
  2956. pdata->tkey_led_en);
  2957. }
  2958. pdata->tsp_vendor1 = of_get_named_gpio(np, "tsp_vendor1-gpio", 0);
  2959. pdata->tsp_vendor2 = of_get_named_gpio(np, "tsp_vendor2-gpio", 0);
  2960. if(of_property_read_u32(np, "melfas,key1", &pdata->key1))
  2961. pdata->key1 = KEY_MENU;
  2962. /* reset, irq gpio info */
  2963. //pdata->gpio_scl = of_get_named_gpio_flags(np, "melfas,scl-gpio",
  2964. // 0, &pdata->scl_gpio_flags);
  2965. //pdata->gpio_sda = of_get_named_gpio_flags(np, "melfas,sda-gpio",
  2966. // 0, &pdata->sda_gpio_flags);
  2967. pdata->gpio_int = of_get_named_gpio_flags(np, "melfas,irq-gpio",
  2968. 0, &pdata->irq_gpio_flags);
  2969. pdata->config_fw_version = of_get_property(np,
  2970. "melfas,config_fw_version", NULL);
  2971. return 0;
  2972. }
  2973. #else
  2974. static int mms_parse_dt(struct device *dev,
  2975. struct melfas_tsi_platform_data *pdata)
  2976. {
  2977. return -ENODEV;
  2978. }
  2979. #endif
  2980. #if 0
  2981. static ssize_t melfas_enabled_store(struct device *dev,
  2982. struct device_attribute *attr, const char *buf, size_t count)
  2983. {
  2984. long input;
  2985. int ret = 0;
  2986. ret = kstrtol(buf, 10, &input);
  2987. if(ret || ret < 0){
  2988. printk(KERN_INFO "Error value melfas_enabled_store \n");
  2989. return ret;
  2990. }
  2991. pr_info("TSP enabled: %d\n",(int)input);
  2992. if(input == 1)
  2993. mms_ts_resume(dev);
  2994. else if(input == 0)
  2995. mms_ts_suspend(dev);
  2996. else
  2997. return -EINVAL;
  2998. return count;
  2999. }
  3000. static struct device_attribute attrs[] = {
  3001. __ATTR(enabled, (S_IRUGO | S_IWUSR | S_IWGRP),
  3002. NULL,
  3003. melfas_enabled_store),
  3004. };
  3005. #endif
  3006. /* START - Added to support API's for TSP tuning */
  3007. static int mms_fs_open(struct inode *node, struct file *fp)
  3008. {
  3009. struct mms_ts_info *info;
  3010. struct i2c_client *client;
  3011. struct i2c_msg msg;
  3012. u8 buf[3] = {
  3013. ADDR_UNIV_CMD,//MMS_UNIVERSAL_CMD,
  3014. MMS_CMD_SET_LOG_MODE,
  3015. true,
  3016. };
  3017. info = container_of(node->i_cdev, struct mms_ts_info, cdev);
  3018. client = info->client;
  3019. disable_irq(info->irq);
  3020. fp->private_data = info;
  3021. msg.addr = client->addr;
  3022. msg.flags = 0;
  3023. msg.buf = buf;
  3024. msg.len = sizeof(buf);
  3025. i2c_transfer(client->adapter, &msg, 1);
  3026. info->log.data = kzalloc(MAX_LOG_LENGTH * 20 + 5, GFP_KERNEL);
  3027. //mms_clear_input_data(info);
  3028. touch_is_pressed = 0;
  3029. release_all_fingers(info);
  3030. return 0;
  3031. }
  3032. static int mms_fs_release(struct inode *node, struct file *fp)
  3033. {
  3034. struct mms_ts_info *info = fp->private_data;
  3035. // mms_clear_input_data(info);
  3036. touch_is_pressed = 0;
  3037. release_all_fingers(info);
  3038. //mms_reboot(info);
  3039. mms_reset(info);
  3040. kfree(info->log.data);
  3041. enable_irq(info->irq);
  3042. return 0;
  3043. }
  3044. static int esd_cnt;
  3045. static void mms_report_input_data(struct mms_ts_info *info, u8 sz, u8 *buf)
  3046. {
  3047. int i;
  3048. struct i2c_client *client = info->client;
  3049. int id;
  3050. int x;
  3051. int y;
  3052. int touch_major;
  3053. int pressure;
  3054. int key_code;
  3055. int key_state;
  3056. u8 *tmp;
  3057. if (buf[0] == MMS_NOTIFY_EVENT) {
  3058. dev_info(&client->dev, "TSP mode changed (%d)\n", buf[1]);
  3059. goto out;
  3060. } else if (buf[0] == MMS_ERROR_EVENT) {
  3061. dev_info(&client->dev, "Error detected, restarting TSP\n");
  3062. //mms_clear_input_data(info);
  3063. touch_is_pressed = 0;
  3064. release_all_fingers(info);
  3065. //mms_reboot(info);
  3066. mms_reset(info);
  3067. esd_cnt++;
  3068. if (esd_cnt>= ESD_DETECT_COUNT)
  3069. {
  3070. i2c_smbus_write_byte_data(info->client, MMS_MODE_CONTROL, 0x04);
  3071. esd_cnt = 0;
  3072. }
  3073. goto out;
  3074. }
  3075. for (i = 0; i < sz; i += FINGER_EVENT_SZ) {
  3076. tmp = buf + i;
  3077. esd_cnt = 0;
  3078. if (tmp[0] & MMS_TOUCH_KEY_EVENT) {
  3079. switch (tmp[0] & 0xf) {
  3080. case 1:
  3081. key_code = info->pdata->key1;
  3082. break;
  3083. case 2:
  3084. key_code = KEY_BACK;
  3085. break;
  3086. default:
  3087. dev_err(&client->dev, "unknown key type\n");
  3088. goto out;
  3089. break;
  3090. }
  3091. key_state = (tmp[0] & 0x80) ? 1 : 0;
  3092. input_report_key(info->input_dev, key_code, key_state);
  3093. } else {
  3094. id = (tmp[0] & 0xf) -1;
  3095. x = tmp[2] | ((tmp[1] & 0xf) << 8);
  3096. y = tmp[3] | (((tmp[1] >> 4 ) & 0xf) << 8);
  3097. touch_major = tmp[4];
  3098. pressure = tmp[5];
  3099. input_mt_slot(info->input_dev, id);
  3100. if (!(tmp[0] & 0x80)) {
  3101. input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, false);
  3102. continue;
  3103. }
  3104. input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, true);
  3105. input_report_abs(info->input_dev, ABS_MT_POSITION_X, x);
  3106. input_report_abs(info->input_dev, ABS_MT_POSITION_Y, y);
  3107. input_report_abs(info->input_dev, ABS_MT_TOUCH_MAJOR, touch_major);
  3108. input_report_abs(info->input_dev, ABS_MT_PRESSURE, pressure);
  3109. }
  3110. }
  3111. input_sync(info->input_dev);
  3112. out:
  3113. return;
  3114. }
  3115. static void mms_event_handler(struct mms_ts_info *info)
  3116. {
  3117. struct i2c_client *client = info->client;
  3118. int sz;
  3119. int ret;
  3120. int row_num;
  3121. u8 reg = MMS_INPUT_EVENT;
  3122. struct i2c_msg msg[] = {
  3123. {
  3124. .addr = client->addr,
  3125. .flags = 0,
  3126. .buf = &reg,
  3127. .len = 1,
  3128. }, {
  3129. .addr = client->addr,
  3130. .flags = I2C_M_RD,
  3131. .buf = info->log.data,
  3132. },
  3133. };
  3134. struct mms_log_pkt {
  3135. u8 marker;
  3136. u8 log_info;
  3137. u8 code;
  3138. u8 element_sz;
  3139. u8 row_sz;
  3140. } __attribute__ ((packed)) *pkt = (struct mms_log_pkt *)info->log.data;
  3141. memset(pkt, 0, sizeof(*pkt));
  3142. //if (gpio_get_value(info->pdata->gpio_resetb))
  3143. // return;
  3144. sz = i2c_smbus_read_byte_data(client, MMS_EVENT_PKT_SZ);
  3145. msg[1].len = sz;
  3146. ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
  3147. if (ret != ARRAY_SIZE(msg)) {
  3148. dev_err(&client->dev,
  3149. "failed to read %d bytes of data\n",
  3150. sz);
  3151. return;
  3152. }
  3153. if ((pkt->marker & 0xf) == MMS_LOG_EVENT) {
  3154. if ((pkt->log_info & 0x7) == 0x1) {
  3155. pkt->element_sz = 0;
  3156. pkt->row_sz = 0;
  3157. return;
  3158. }
  3159. switch (pkt->log_info >> 4) {
  3160. case LOG_TYPE_U08:
  3161. case LOG_TYPE_S08:
  3162. msg[1].len = pkt->element_sz;
  3163. break;
  3164. case LOG_TYPE_U16:
  3165. case LOG_TYPE_S16:
  3166. msg[1].len = pkt->element_sz * 2;
  3167. break;
  3168. case LOG_TYPE_U32:
  3169. case LOG_TYPE_S32:
  3170. msg[1].len = pkt->element_sz * 4;
  3171. break;
  3172. default:
  3173. dev_err(&client->dev, "invalied log type\n");
  3174. return;
  3175. }
  3176. msg[1].buf = info->log.data + sizeof(struct mms_log_pkt);
  3177. reg = CMD_RESULT;//MMS_UNIVERSAL_RESULT;
  3178. row_num = pkt->row_sz ? pkt->row_sz : 1;
  3179. while (row_num--) {
  3180. //while (gpio_get_value(info->pdata->gpio_resetb))
  3181. // ;
  3182. ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
  3183. msg[1].buf += msg[1].len;
  3184. };
  3185. } else {
  3186. mms_report_input_data(info, sz, info->log.data);
  3187. memset(pkt, 0, sizeof(*pkt));
  3188. }
  3189. return;
  3190. }
  3191. static ssize_t mms_fs_read(struct file *fp, char *rbuf, size_t cnt, loff_t *fpos)
  3192. {
  3193. struct mms_ts_info *info = fp->private_data;
  3194. struct i2c_client *client = info->client;
  3195. int ret = 0;
  3196. char rx_num, tx_num;
  3197. switch (info->log.cmd) {
  3198. case GET_RX_NUM:
  3199. rx_num = RX_NUM;
  3200. ret = copy_to_user(rbuf, &rx_num, 1);
  3201. break;
  3202. case GET_TX_NUM:
  3203. tx_num = TX_NUM;
  3204. ret = copy_to_user(rbuf, &tx_num, 1);
  3205. break;
  3206. case GET_EVENT_DATA:
  3207. mms_event_handler(info);
  3208. /* copy data without log marker */
  3209. ret = copy_to_user(rbuf, info->log.data + 1, cnt);
  3210. break;
  3211. default:
  3212. dev_err(&client->dev, "unknown command\n");
  3213. ret = -EFAULT;
  3214. break;
  3215. }
  3216. return ret;
  3217. }
  3218. static ssize_t mms_fs_write(struct file *fp, const char *wbuf, size_t cnt, loff_t *fpos)
  3219. {
  3220. struct mms_ts_info *info = fp->private_data;
  3221. struct i2c_client *client = info->client;
  3222. u8 *buf;
  3223. struct i2c_msg msg = {
  3224. .addr = client->addr,
  3225. .flags = 0,
  3226. .len = cnt,
  3227. };
  3228. int ret = 0;
  3229. mutex_lock(&info->lock);
  3230. if (!info->enabled)
  3231. goto tsp_disabled;
  3232. msg.buf = buf = kzalloc(cnt + 1, GFP_KERNEL);
  3233. if ((buf == NULL) || copy_from_user(buf, wbuf, cnt)) {
  3234. dev_err(&client->dev, "failed to read data from user\n");
  3235. ret = -EIO;
  3236. goto out;
  3237. }
  3238. if (cnt == 1) {
  3239. info->log.cmd = *buf;
  3240. } else {
  3241. if (i2c_transfer(client->adapter, &msg, 1) != 1) {
  3242. dev_err(&client->dev, "failed to transfer data\n");
  3243. ret = -EIO;
  3244. goto out;
  3245. }
  3246. }
  3247. ret = 0;
  3248. out:
  3249. kfree(buf);
  3250. tsp_disabled:
  3251. mutex_unlock(&info->lock);
  3252. return ret;
  3253. }
  3254. static struct file_operations mms_fops = {
  3255. .owner = THIS_MODULE,
  3256. .open = mms_fs_open,
  3257. .release = mms_fs_release,
  3258. .read = mms_fs_read,
  3259. .write = mms_fs_write,
  3260. };
  3261. /* END - Added to support API's for TSP tuning */
  3262. #ifdef USE_OPEN_CLOSE
  3263. static int mms_ts_input_open(struct input_dev *dev)
  3264. {
  3265. struct mms_ts_info *info;
  3266. pr_info("[TSP] %s\n", __func__);
  3267. info = input_get_drvdata(dev);
  3268. return mms_ts_resume(&info->client->dev);
  3269. }
  3270. static void mms_ts_input_close(struct input_dev *dev)
  3271. {
  3272. struct mms_ts_info *info;
  3273. pr_info("[TSP] %s\n", __func__);
  3274. info = input_get_drvdata(dev);
  3275. mms_ts_suspend(&info->client->dev);
  3276. }
  3277. #endif
  3278. void melfas_register_callback(void *);
  3279. #if defined(CONFIG_FB_MSM8x26_MDSS_CHECK_LCD_CONNECTION)
  3280. extern int get_lcd_attached(void);
  3281. #endif
  3282. static int __devinit mms_ts_probe(struct i2c_client *client,
  3283. const struct i2c_device_id *id)
  3284. {
  3285. struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
  3286. struct melfas_tsi_platform_data *pdata;
  3287. struct mms_ts_info *info;
  3288. struct input_dev *input_dev;
  3289. int ret = 0;
  3290. int error;
  3291. #ifdef SEC_TSP_FACTORY_TEST
  3292. int i;
  3293. struct device *fac_dev_ts;
  3294. #endif
  3295. #if TOUCHKEY
  3296. struct device *touchkey_dev;
  3297. #endif
  3298. touch_is_pressed = 0;
  3299. #if defined(CONFIG_FB_MSM8x26_MDSS_CHECK_LCD_CONNECTION)
  3300. if (get_lcd_attached() == 0) {
  3301. dev_err(&client->dev, "%s : get_lcd_attached()=0 \n", __func__);
  3302. return -EIO;
  3303. }
  3304. #endif
  3305. if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
  3306. return -EIO;
  3307. if (client->dev.of_node) {
  3308. pdata = devm_kzalloc(&client->dev,
  3309. sizeof(struct melfas_tsi_platform_data), GFP_KERNEL);
  3310. if (!pdata) {
  3311. dev_err(&client->dev, "Failed to allocate memory\n");
  3312. return -ENOMEM;
  3313. }
  3314. error = mms_parse_dt(&client->dev, pdata);
  3315. if (error)
  3316. return error;
  3317. pdata->register_cb = melfas_register_callback;
  3318. } else
  3319. pdata = client->dev.platform_data;
  3320. if (!pdata)
  3321. return -EINVAL;
  3322. melfas_request_gpio(pdata);
  3323. info = kzalloc(sizeof(struct mms_ts_info), GFP_KERNEL);
  3324. if (!info) {
  3325. dev_err(&client->dev, "Failed to allocate memory\n");
  3326. ret = -ENOMEM;
  3327. goto err_alloc;
  3328. }
  3329. ts = info;
  3330. input_dev = input_allocate_device();
  3331. if (!input_dev) {
  3332. dev_err(&client->dev, "Failed to allocate memory for input device\n");
  3333. ret = -ENOMEM;
  3334. goto err_input_alloc;
  3335. }
  3336. info->client = client;
  3337. info->input_dev = input_dev;
  3338. info->pdata = pdata;
  3339. if(pdata->tkey_led_en >= 0)
  3340. info->keyled = key_led_control;
  3341. ret = get_panel_version(info);
  3342. if(ret < 0)
  3343. printk(KERN_INFO "get_panel_version error" );
  3344. info->irq = -1;
  3345. mutex_init(&info->lock);
  3346. info->max_x = info->pdata->max_x;
  3347. info->max_y = info->pdata->max_y;
  3348. info->invert_x = info->pdata->invert_x;
  3349. info->invert_y = info->pdata->invert_y;
  3350. info->input_event = info->pdata->input_event;
  3351. info->register_cb = info->pdata->register_cb;
  3352. info->threewave_mode = false;
  3353. info->power = melfas_power;
  3354. #if TOUCHKEY
  3355. info->keycode[0] = 0;
  3356. info->keycode[1] = pdata->key1;
  3357. info->keycode[2] = KEY_BACK;
  3358. for (i = 0; i < 3; i++)
  3359. info->touchkey[i] = 0;
  3360. info->led_cmd = false;
  3361. if(info->keyled)
  3362. info->keyled(info, 0);
  3363. info->menu_s = 0;
  3364. info->back_s = 0;
  3365. #endif
  3366. i2c_set_clientdata(client, info);
  3367. if (info->power == NULL) {
  3368. dev_err(&client->dev,
  3369. "missing power control\n");
  3370. goto err_config;
  3371. } else {
  3372. info->power(info, 1);
  3373. msleep(100);
  3374. }
  3375. info->panel = info->pdata->panel;
  3376. #if defined(CONFIG_MACH_MILLET3G_EUR)
  3377. if ((info->panel == 0) && (system_rev < 2))
  3378. info->panel = ILJIN;
  3379. #endif
  3380. printk(KERN_INFO "%s: [TSP] panel = %d!!\n", __func__, info->panel);
  3381. printk("%s: [TSP] system_rev = %d\n", __func__, system_rev);
  3382. dev_info(&client->dev, "%d panel\n", info->panel);
  3383. //mms_reset(info); //need to check
  3384. ret = mms_ts_fw_check(info);
  3385. if (ret) {
  3386. dev_err(&client->dev,
  3387. "failed to initialize (%d)\n", ret);
  3388. goto err_reg_input_dev;
  3389. }
  3390. info->callbacks.inform_charger = melfas_ta_cb;
  3391. if (info->register_cb)
  3392. info->register_cb(&info->callbacks);
  3393. snprintf(info->phys, sizeof(info->phys),
  3394. "%s/input0", dev_name(&client->dev));
  3395. input_dev->name = "sec_touchscreen";
  3396. input_dev->phys = info->phys;
  3397. input_dev->id.bustype = BUS_I2C;
  3398. input_dev->dev.parent = &client->dev;
  3399. __set_bit(EV_ABS, input_dev->evbit);
  3400. __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
  3401. #if TOUCHKEY
  3402. set_bit(EV_KEY, input_dev->evbit);
  3403. set_bit(pdata->key1, input_dev->keybit);
  3404. set_bit(KEY_BACK, input_dev->keybit);
  3405. set_bit(EV_LED, input_dev->evbit);
  3406. set_bit(LED_MISC, input_dev->ledbit);
  3407. #endif
  3408. input_mt_init_slots(input_dev, MAX_FINGERS);
  3409. input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
  3410. 0, MAX_PRESSURE, 0, 0);
  3411. input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
  3412. 0, MAX_PRESSURE, 0, 0);
  3413. input_set_abs_params(input_dev, ABS_MT_POSITION_X,
  3414. 0, (info->max_x)-1, 0, 0);
  3415. input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
  3416. 0, (info->max_y)-1, 0, 0);
  3417. input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR,
  3418. 0, MAX_WIDTH, 0, 0);
  3419. input_set_abs_params(input_dev, ABS_MT_PALM,
  3420. 0, 1, 0, 0);
  3421. #ifdef USE_OPEN_CLOSE
  3422. input_dev->open = mms_ts_input_open;
  3423. input_dev->close = mms_ts_input_close;
  3424. #endif
  3425. input_set_drvdata(input_dev, info);
  3426. ret = input_register_device(input_dev);
  3427. if (ret) {
  3428. dev_err(&client->dev, "failed to register input dev (%d)\n",
  3429. ret);
  3430. goto err_reg_input_dev;
  3431. }
  3432. #ifdef TOUCH_BOOSTER_DVFS
  3433. samsung_init_dvfs(info);
  3434. #endif
  3435. info->enabled = true;
  3436. client->irq = gpio_to_irq(pdata->gpio_int);
  3437. ret = request_threaded_irq(client->irq, NULL, mms_ts_interrupt,
  3438. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  3439. MELFAS_TS_NAME, info);
  3440. if (ret < 0) {
  3441. dev_err(&client->dev, "Failed to register interrupt\n");
  3442. goto err_req_irq;
  3443. }
  3444. info->irq = client->irq;
  3445. #ifdef CONFIG_HAS_EARLYSUSPEND
  3446. info->early_suspend.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING;
  3447. info->early_suspend.suspend = mms_ts_early_suspend;
  3448. info->early_suspend.resume = mms_ts_late_resume;
  3449. register_early_suspend(&info->early_suspend);
  3450. #endif
  3451. /* START - Added to support API's for TSP tuning */
  3452. if (alloc_chrdev_region(&info->mms_dev, 0, 1, "mms_ts")) {
  3453. dev_err(&client->dev, "failed to allocate device region\n");
  3454. return -ENOMEM;
  3455. }
  3456. cdev_init(&info->cdev, &mms_fops);
  3457. info->cdev.owner = THIS_MODULE;
  3458. if (cdev_add(&info->cdev, info->mms_dev, 1)) {
  3459. dev_err(&client->dev, "failed to add ch dev\n");
  3460. return -EIO;
  3461. }
  3462. info->class = class_create(THIS_MODULE, "mms_ts");
  3463. device_create(info->class, NULL, info->mms_dev, NULL, "mms_ts");
  3464. /* END - Added to support API's for TSP tuning */
  3465. sec_touchscreen = device_create(sec_class,
  3466. NULL, 0, info, "sec_touchscreen");
  3467. if (IS_ERR(sec_touchscreen)) {
  3468. dev_err(&client->dev,
  3469. "Failed to create device for the sysfs1\n");
  3470. ret = -ENODEV;
  3471. }
  3472. #if DEBUG_PRINT2
  3473. if (sysfs_create_group(&sec_touchscreen->kobj, &mms_attr_group)) {
  3474. dev_err(&client->dev, "failed to create sysfs group, debug2 \n");
  3475. return -EAGAIN;
  3476. }
  3477. /* if (sysfs_create_link(NULL, &sec_touchscreen->kobj, "sec_touchscreen")) {
  3478. dev_err(&client->dev, "failed to create sysfs symlink, debug2 \n");
  3479. return -EAGAIN;
  3480. }*/
  3481. #endif
  3482. #if 0
  3483. ret = sysfs_create_file(&info->input_dev->dev.kobj,
  3484. &attrs[0].attr);
  3485. if (ret < 0) {
  3486. dev_err(&client->dev,
  3487. "%s: Failed to create sysfs attributes\n",
  3488. __func__);
  3489. }
  3490. #endif
  3491. #if TOUCHKEY
  3492. touchkey_dev = device_create(sec_class,
  3493. NULL, 0, info, "sec_touchkey");
  3494. if (IS_ERR(touchkey_dev))
  3495. dev_err(&client->dev,
  3496. "Failed to create device for the touchkey sysfs\n");
  3497. ret = sysfs_create_group(&touchkey_dev->kobj,
  3498. &sec_touchkey_attr_group);
  3499. if (ret)
  3500. dev_err(&client->dev, "Failed to create sysfs group\n");
  3501. if(info->keyled){
  3502. ret = sysfs_create_group(&touchkey_dev->kobj,
  3503. &sec_touchkeyled_attr_group);
  3504. if (ret)
  3505. dev_err(&client->dev, "Failed to create sysfs group\n");
  3506. }
  3507. #endif
  3508. #ifdef SEC_TSP_FACTORY_TEST
  3509. INIT_LIST_HEAD(&info->cmd_list_head);
  3510. for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++)
  3511. list_add_tail(&tsp_cmds[i].list, &info->cmd_list_head);
  3512. mutex_init(&info->cmd_lock);
  3513. info->cmd_is_running = false;
  3514. fac_dev_ts = device_create(sec_class,
  3515. NULL, 0, info, "tsp");
  3516. if (IS_ERR(fac_dev_ts))
  3517. dev_err(&client->dev,
  3518. "Failed to create device for the tsp sysfs\n");
  3519. ret = sysfs_create_group(&fac_dev_ts->kobj,
  3520. &sec_touch_factory_attr_group);
  3521. if (ret)
  3522. dev_err(&client->dev, "Failed to create sysfs group\n");
  3523. ret = sysfs_create_link(&fac_dev_ts->kobj, &info->input_dev->dev.kobj, "input");
  3524. if (ret < 0) {
  3525. dev_err(&client->dev,
  3526. "%s: Failed to create input symbolic link\n",
  3527. __func__);
  3528. }
  3529. #endif
  3530. return 0;
  3531. err_req_irq:
  3532. input_unregister_device(input_dev);
  3533. err_reg_input_dev:
  3534. info->power(info,0);
  3535. #if TOUCHKEY
  3536. if(info->keyled)
  3537. info->keyled(info, 0);
  3538. #endif
  3539. err_config:
  3540. input_free_device(input_dev);
  3541. /*input_dev = NULL;*/
  3542. err_input_alloc:
  3543. kfree(info);
  3544. err_alloc:
  3545. return ret;
  3546. }
  3547. static int __devexit mms_ts_remove(struct i2c_client *client)
  3548. {
  3549. struct mms_ts_info *info = i2c_get_clientdata(client);
  3550. if (info->enabled)
  3551. info->power(info,0);
  3552. #if DEBUG_PRINT2
  3553. sysfs_remove_link(NULL, "sec_touchscreen");
  3554. sysfs_remove_group(&client->dev.kobj, &mms_attr_group);
  3555. #endif
  3556. #if TOUCHKEY
  3557. if (info->led_cmd)
  3558. if(info->keyled)
  3559. info->keyled(info, 0);
  3560. #endif
  3561. unregister_early_suspend(&info->early_suspend);
  3562. if (info->irq >= 0)
  3563. free_irq(info->irq, info);
  3564. input_unregister_device(info->input_dev);
  3565. kfree(info);
  3566. return 0;
  3567. }
  3568. static void mms_ts_shutdown(struct i2c_client *client)
  3569. {
  3570. struct mms_ts_info *info = i2c_get_clientdata(client);
  3571. if (info->enabled)
  3572. info->power(info,0);
  3573. #if TOUCHKEY
  3574. if (info->led_cmd)
  3575. if(info->keyled)
  3576. info->keyled(info, 0);
  3577. #endif
  3578. }
  3579. #if defined(CONFIG_PM) || defined(CONFIG_HAS_EARLYSUSPEND)
  3580. static int mms_ts_suspend(struct device *dev)
  3581. {
  3582. struct i2c_client *client = to_i2c_client(dev);
  3583. struct mms_ts_info *info = i2c_get_clientdata(client);
  3584. mutex_lock(&info->lock);
  3585. if (!info->enabled)
  3586. goto out;
  3587. info->enabled = false;
  3588. disable_irq_nosync(info->irq);
  3589. dev_notice(&info->client->dev, "%s: users=%d\n", __func__,
  3590. info->input_dev->users);
  3591. touch_is_pressed = 0;
  3592. release_all_fingers(info);
  3593. info->power(info,0);
  3594. info->sleep_wakeup_ta_check = info->ta_status;
  3595. #if TOUCHKEY
  3596. if (info->led_cmd == true) {
  3597. if(info->keyled)
  3598. info->keyled(info, 0);
  3599. info->led_cmd = false;
  3600. }
  3601. #endif
  3602. /* This delay needs to prevent unstable POR by
  3603. rapid frequently pressing of PWR key. */
  3604. msleep(50);
  3605. #ifdef TOUCH_BOOSTER_DVFS
  3606. samsung_set_dvfs_lock(info, -1);
  3607. dev_info(&info->client->dev,
  3608. "%s: dvfs_lock free.\n", __func__);
  3609. #endif
  3610. out:
  3611. mutex_unlock(&info->lock);
  3612. return 0;
  3613. }
  3614. static int mms_ts_resume(struct device *dev)
  3615. {
  3616. struct i2c_client *client = to_i2c_client(dev);
  3617. struct mms_ts_info *info = i2c_get_clientdata(client);
  3618. if (info->enabled)
  3619. return 0;
  3620. dev_notice(&info->client->dev, "%s: users=%d\n", __func__,
  3621. info->input_dev->users);
  3622. info->power(info, 1);
  3623. if (info->threewave_mode)
  3624. mms_set_threewave_mode(info);
  3625. if (info->ta_status) {
  3626. dev_notice(&client->dev, "TA connect!!!\n");
  3627. i2c_smbus_write_byte_data(info->client, 0x33, 0x1);
  3628. } else {
  3629. dev_notice(&client->dev, "TA disconnect!!!\n");
  3630. i2c_smbus_write_byte_data(info->client, 0x33, 0x2);
  3631. }
  3632. info->enabled = true;
  3633. mms_set_noise_mode(info);
  3634. /* Because irq_type by EXT_INTxCON register is changed to low_level
  3635. * after wakeup, irq_type set to falling edge interrupt again.
  3636. */
  3637. enable_irq(info->irq);
  3638. return 0;
  3639. }
  3640. #endif
  3641. #ifdef CONFIG_HAS_EARLYSUSPEND
  3642. static void mms_ts_early_suspend(struct early_suspend *h)
  3643. {
  3644. struct mms_ts_info *info;
  3645. info = container_of(h, struct mms_ts_info, early_suspend);
  3646. mms_ts_suspend(&info->client->dev);
  3647. }
  3648. static void mms_ts_late_resume(struct early_suspend *h)
  3649. {
  3650. struct mms_ts_info *info;
  3651. info = container_of(h, struct mms_ts_info, early_suspend);
  3652. mms_ts_resume(&info->client->dev);
  3653. }
  3654. #endif
  3655. #if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND)
  3656. static const struct dev_pm_ops mms_ts_pm_ops = {
  3657. .suspend = mms_ts_suspend,
  3658. .resume = mms_ts_resume,
  3659. #ifdef CONFIG_HIBERNATION
  3660. .freeze = mms_ts_suspend,
  3661. .thaw = mms_ts_resume,
  3662. .restore = mms_ts_resume,
  3663. #endif
  3664. };
  3665. #endif
  3666. static const struct i2c_device_id mms_ts_id[] = {
  3667. {MELFAS_TS_NAME, 0},
  3668. {}
  3669. };
  3670. MODULE_DEVICE_TABLE(i2c, mms_ts_id);
  3671. #ifdef CONFIG_OF
  3672. static struct of_device_id mms_match_table[] = {
  3673. { .compatible = "melfas,mms252-ts",},
  3674. { },
  3675. };
  3676. #else
  3677. #define mms_match_table NULL
  3678. #endif
  3679. static struct i2c_driver mms_ts_driver = {
  3680. .probe = mms_ts_probe,
  3681. .remove = __devexit_p(mms_ts_remove),
  3682. .shutdown = mms_ts_shutdown,
  3683. .driver = {
  3684. .name = MELFAS_TS_NAME,
  3685. .owner = THIS_MODULE,
  3686. .of_match_table = mms_match_table,
  3687. #if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND)
  3688. .pm = &mms_ts_pm_ops,
  3689. #endif
  3690. },
  3691. .id_table = mms_ts_id,
  3692. };
  3693. static int __devinit mms_ts_init(void)
  3694. {
  3695. if (poweroff_charging) {
  3696. printk("%s : LPM Charging Mode!!\n", __func__);
  3697. return 0;
  3698. }
  3699. else {
  3700. return i2c_add_driver(&mms_ts_driver);
  3701. }
  3702. }
  3703. static void __exit mms_ts_exit(void)
  3704. {
  3705. i2c_del_driver(&mms_ts_driver);
  3706. }
  3707. module_init(mms_ts_init);
  3708. module_exit(mms_ts_exit);
  3709. /* Module information */
  3710. MODULE_DESCRIPTION("Touchscreen driver for Melfas MMS-series controllers");
  3711. MODULE_LICENSE("GPL");