mxts_sec.c 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025
  1. #if TSP_SEC_FACTORY
  2. #include <linux/uaccess.h>
  3. static void set_default_result(struct mxt_fac_data *data)
  4. {
  5. char delim = ':';
  6. memset(data->cmd_result, 0x00, ARRAY_SIZE(data->cmd_result));
  7. memcpy(data->cmd_result, data->cmd, strlen(data->cmd));
  8. strncat(data->cmd_result, &delim, 1);
  9. }
  10. static void set_cmd_result(struct mxt_fac_data *data, char *buff, int len)
  11. {
  12. strncat(data->cmd_result, buff, len);
  13. }
  14. static void not_support_cmd(void *device_data)
  15. {
  16. struct mxt_data *data = (struct mxt_data *)device_data;
  17. struct i2c_client *client = data->client;
  18. struct mxt_fac_data *fdata = data->fdata;
  19. char buff[16] = {0};
  20. set_default_result(fdata);
  21. sprintf(buff, "%s", "NA");
  22. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  23. fdata->cmd_state = CMD_STATUS_NOT_APPLICABLE;
  24. dev_info(&client->dev, "%s: %s\"%s(%d)\"\n",
  25. __func__, fdata->cmd, buff, strnlen(buff, sizeof(buff)));
  26. mutex_lock(&fdata->cmd_lock);
  27. fdata->cmd_is_running = false;
  28. mutex_unlock(&fdata->cmd_lock);
  29. }
  30. static bool mxt_check_xy_range(struct mxt_data *data, u16 node)
  31. {
  32. u8 x_line = node / data->info.matrix_ysize;
  33. u8 y_line = node % data->info.matrix_ysize;
  34. return (y_line < data->fdata->num_ynode) ?
  35. (x_line < data->fdata->num_xnode) : false;
  36. }
  37. /* + Vendor specific helper functions */
  38. static int mxt_xy_to_node(struct mxt_data *data)
  39. {
  40. struct i2c_client *client = data->client;
  41. struct mxt_fac_data *fdata = data->fdata;
  42. char buff[16] = {0};
  43. int node;
  44. /* cmd_param[0][1] : [x][y] */
  45. if (fdata->cmd_param[0] < 0
  46. || fdata->cmd_param[0] >= data->fdata->num_xnode
  47. || fdata->cmd_param[1] < 0
  48. || fdata->cmd_param[1] >= data->fdata->num_ynode) {
  49. snprintf(buff, sizeof(buff) , "%s", "NG");
  50. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  51. fdata->cmd_state = CMD_STATUS_FAIL;
  52. dev_info(&client->dev, "%s: parameter error: %u,%u\n",
  53. __func__, fdata->cmd_param[0], fdata->cmd_param[1]);
  54. return -EINVAL;
  55. }
  56. /*
  57. * maybe need to consider orient.
  58. * --> y number
  59. * |(0,0) (0,1)
  60. * |(1,0) (1,1)
  61. * v
  62. * x number
  63. */
  64. node = fdata->cmd_param[0] * data->fdata->num_ynode
  65. + fdata->cmd_param[1];
  66. dev_info(&client->dev, "%s: node = %d\n", __func__, node);
  67. return node;
  68. }
  69. static void mxt_node_to_xy(struct mxt_data *data, u16 *x, u16 *y)
  70. {
  71. struct i2c_client *client = data->client;
  72. struct mxt_fac_data *fdata = data->fdata;
  73. *x = fdata->delta_max_node / data->fdata->num_ynode;
  74. *y = fdata->delta_max_node % data->fdata->num_ynode;
  75. dev_info(&client->dev, "%s: node[%d] is X,Y=%d,%d\n",
  76. __func__, fdata->delta_max_node, *x, *y);
  77. }
  78. static int mxt_set_diagnostic_mode(struct mxt_data *data, u8 dbg_mode)
  79. {
  80. struct i2c_client *client = data->client;
  81. u8 cur_mode;
  82. int ret;
  83. ret = mxt_write_object(data, MXT_GEN_COMMANDPROCESSOR_T6,
  84. MXT_COMMAND_DIAGNOSTIC, dbg_mode);
  85. if (ret) {
  86. dev_err(&client->dev, "Failed change diagnositc mode to %d\n",
  87. dbg_mode);
  88. goto out;
  89. }
  90. if (dbg_mode & MXT_DIAG_MODE_MASK) {
  91. do {
  92. ret = mxt_read_object(data, MXT_DEBUG_DIAGNOSTIC_T37,
  93. MXT_DIAGNOSTIC_MODE, &cur_mode);
  94. if (ret) {
  95. dev_err(&client->dev, "Failed getting diagnositc mode\n");
  96. goto out;
  97. }
  98. msleep(20);
  99. } while (cur_mode != dbg_mode);
  100. dev_dbg(&client->dev, "current dianostic chip mode is %d\n",
  101. cur_mode);
  102. }
  103. out:
  104. return ret;
  105. }
  106. #if ENABLE_TOUCH_KEY
  107. static int mxt_read_diagnostic_data(struct mxt_data *data,
  108. u8 dbg_mode, u16 node, u16 *dbg_data)
  109. {
  110. struct i2c_client *client = data->client;
  111. struct mxt_object *dbg_object;
  112. u8 read_page, read_point;
  113. u8 cur_page, cnt_page;
  114. u8 data_buf[DATA_PER_NODE] = { 0 };
  115. int ret = 0;
  116. /* calculate the read page and point */
  117. read_page = node / NODE_PER_PAGE;
  118. node %= NODE_PER_PAGE;
  119. read_point = (node * DATA_PER_NODE) + 2;
  120. /* to make the Page Num to 0 */
  121. ret = mxt_set_diagnostic_mode(data, MXT_DIAG_CTE_MODE);
  122. if (ret)
  123. goto out;
  124. /* change the debug mode */
  125. ret = mxt_set_diagnostic_mode(data, dbg_mode);
  126. if (ret)
  127. goto out;
  128. /* get object info for diagnostic */
  129. dbg_object = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37);
  130. if (!dbg_object) {
  131. dev_err(&client->dev, "fail to get object_info\n");
  132. ret = -EINVAL;
  133. goto out;
  134. }
  135. /* move to the proper page */
  136. for (cnt_page = 1; cnt_page <= read_page; cnt_page++) {
  137. ret = mxt_set_diagnostic_mode(data, MXT_DIAG_PAGE_UP);
  138. if (ret)
  139. goto out;
  140. do {
  141. msleep(20);
  142. ret = mxt_read_mem(data,
  143. dbg_object->start_address + MXT_DIAGNOSTIC_PAGE,
  144. 1, &cur_page);
  145. if (ret) {
  146. dev_err(&client->dev, "%s Read fail page\n",
  147. __func__);
  148. goto out;
  149. }
  150. } while (cur_page != cnt_page);
  151. }
  152. /* read the dbg data */
  153. ret = mxt_read_mem(data, dbg_object->start_address + read_point,
  154. DATA_PER_NODE, data_buf);
  155. if (ret)
  156. goto out;
  157. *dbg_data = ((u16)data_buf[1] << 8) + (u16)data_buf[0];
  158. dev_info(&client->dev, "dbg_mode[%d]: dbg data[%d] = %d\n",
  159. dbg_mode, (read_page * NODE_PER_PAGE) + node,
  160. dbg_mode == MXT_DIAG_DELTA_MODE ? (s16)(*dbg_data) : *dbg_data);
  161. out:
  162. return ret;
  163. }
  164. #endif
  165. static void mxt_treat_dbg_data(struct mxt_data *data,
  166. struct mxt_object *dbg_object, u8 dbg_mode, u8 read_point, u16 num)
  167. {
  168. struct i2c_client *client = data->client;
  169. struct mxt_fac_data *fdata = data->fdata;
  170. u8 data_buffer[DATA_PER_NODE] = { 0 };
  171. int x_num = num / data->fdata->num_ynode;
  172. int y_num = num % data->fdata->num_ynode;
  173. u16 reference_temp = 0;
  174. #if ENABLE_TOUCH_KEY
  175. bool reference_compare = true;
  176. #endif
  177. if (dbg_mode == MXT_DIAG_DELTA_MODE) {
  178. /* read delta data */
  179. mxt_read_mem(data, dbg_object->start_address + read_point,
  180. DATA_PER_NODE, data_buffer);
  181. fdata->delta[num] =
  182. ((u16)data_buffer[1]<<8) + (u16)data_buffer[0];
  183. dev_dbg(&client->dev, "delta[%d] = %d\n",
  184. num, fdata->delta[num]);
  185. if (abs(fdata->delta[num])
  186. > abs(fdata->delta_max_data)) {
  187. fdata->delta_max_node = num;
  188. fdata->delta_max_data = fdata->delta[num];
  189. }
  190. } else if (dbg_mode == MXT_DIAG_REFERENCE_MODE) {
  191. /* read reference data */
  192. mxt_read_mem(data, dbg_object->start_address + read_point,
  193. DATA_PER_NODE, data_buffer);
  194. reference_temp = ((u16)data_buffer[1] << 8) + (u16)data_buffer[0];
  195. if (reference_temp < REF_OFFSET_VALUE ) {
  196. msleep(10);
  197. dev_err(&client->dev, "reference[%d] is out of range = %d(%d,%d) & retry!\n",
  198. num, reference_temp, x_num, y_num);
  199. mxt_read_mem(data, dbg_object->start_address + read_point,
  200. DATA_PER_NODE, data_buffer);
  201. reference_temp = ((u16)data_buffer[1] << 8) + (u16)data_buffer[0];
  202. dev_err(&client->dev, "reference_temp[%d](x,y) = %d(%d,%d)\n",
  203. num, reference_temp, x_num, y_num);
  204. }
  205. reference_temp = reference_temp < REF_OFFSET_VALUE ? 0 : reference_temp;
  206. fdata->reference[num] = reference_temp ? reference_temp - REF_OFFSET_VALUE : 0;
  207. /* check that reference is in spec or not */
  208. if (fdata->reference[num] < REF_MIN_VALUE
  209. || fdata->reference[num] > REF_MAX_VALUE) {
  210. dev_err(&client->dev, "reference[%d] is out of range = %d(%d,%d)\n",
  211. num, fdata->reference[num], x_num, y_num);
  212. }
  213. #if ENABLE_TOUCH_KEY
  214. /* Y-node of touch-key reference value does not compared. */
  215. if (y_num == (data->pdata->touchkey[0].ynode)) {
  216. reference_compare = false;
  217. }
  218. if (reference_compare)
  219. #endif
  220. {
  221. if (fdata->reference[num] > fdata->ref_max_data)
  222. fdata->ref_max_data = fdata->reference[num];
  223. if (fdata->reference[num] < fdata->ref_min_data)
  224. fdata->ref_min_data = fdata->reference[num];
  225. }
  226. #if ENABLE_TOUCH_KEY
  227. reference_compare = true;
  228. #endif
  229. dev_dbg(&client->dev, "reference[%d] = %d\n",
  230. num, fdata->reference[num]);
  231. }
  232. }
  233. int mxt_read_all_diagnostic_data(struct mxt_data *data, u8 dbg_mode)
  234. {
  235. struct i2c_client *client = data->client;
  236. struct mxt_fac_data *fdata = data->fdata;
  237. struct mxt_object *dbg_object;
  238. u8 read_page, cur_page, end_page, read_point;
  239. u16 node, num = 0, cnt = 0;
  240. int ret = 0;
  241. /* to make the Page Num to 0 */
  242. ret = mxt_set_diagnostic_mode(data, MXT_DIAG_CTE_MODE);
  243. if (ret)
  244. goto out;
  245. /* change the debug mode */
  246. ret = mxt_set_diagnostic_mode(data, dbg_mode);
  247. if (ret)
  248. goto out;
  249. /* get object info for diagnostic */
  250. dbg_object = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37);
  251. if (!dbg_object) {
  252. dev_err(&client->dev, "fail to get object_info\n");
  253. ret = -EINVAL;
  254. goto out;
  255. }
  256. fdata->ref_min_data = REF_MAX_VALUE;
  257. fdata->ref_max_data = REF_MIN_VALUE;
  258. fdata->delta_max_data = 0;
  259. fdata->delta_max_node = 0;
  260. end_page = (data->info.matrix_xsize * data->info.matrix_ysize)
  261. / NODE_PER_PAGE;
  262. /* read the dbg data */
  263. for (read_page = 0 ; read_page < end_page; read_page++) {
  264. for (node = 0; node < NODE_PER_PAGE; node++) {
  265. read_point = (node * DATA_PER_NODE) + 2;
  266. if (mxt_check_xy_range(data, cnt)) {
  267. mxt_treat_dbg_data(data, dbg_object, dbg_mode,
  268. read_point, num);
  269. num++;
  270. }
  271. cnt++;
  272. }
  273. ret = mxt_set_diagnostic_mode(data, MXT_DIAG_PAGE_UP);
  274. if (ret)
  275. goto out;
  276. do {
  277. msleep(20);
  278. ret = mxt_read_mem(data,
  279. dbg_object->start_address + MXT_DIAGNOSTIC_PAGE,
  280. 1, &cur_page);
  281. if (ret) {
  282. dev_err(&client->dev,
  283. "%s Read fail page\n", __func__);
  284. goto out;
  285. }
  286. } while (cur_page != read_page + 1);
  287. }
  288. if (dbg_mode == MXT_DIAG_REFERENCE_MODE) {
  289. dev_info(&client->dev, "min/max reference is [%d/%d]\n",
  290. fdata->ref_min_data, fdata->ref_max_data);
  291. } else if (dbg_mode == MXT_DIAG_DELTA_MODE) {
  292. dev_info(&client->dev, "max delta node %d=[%d]\n",
  293. fdata->delta_max_node, fdata->delta_max_data);
  294. }
  295. out:
  296. return ret;
  297. }
  298. /*
  299. * find the x,y position to use maximum delta.
  300. * it is diffult to map the orientation and caculate the node number
  301. * because layout is always different according to device
  302. */
  303. static void find_delta_node(void *device_data)
  304. {
  305. struct mxt_data *data = (struct mxt_data *)device_data;
  306. struct mxt_fac_data *fdata = data->fdata;
  307. char buff[16] = {0};
  308. u16 x, y;
  309. int ret;
  310. set_default_result(fdata);
  311. /* read all delta to get the maximum delta value */
  312. ret = mxt_read_all_diagnostic_data(data,
  313. MXT_DIAG_DELTA_MODE);
  314. if (ret) {
  315. fdata->cmd_state = CMD_STATUS_FAIL;
  316. } else {
  317. mxt_node_to_xy(data, &x, &y);
  318. snprintf(buff, sizeof(buff), "%d,%d", x, y);
  319. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  320. fdata->cmd_state = CMD_STATUS_OK;
  321. }
  322. }
  323. /* - Vendor specific helper functions */
  324. /* + function realted samsung factory test */
  325. static int mxt_load_fw_from_ums(struct mxt_fw_info *fw_info,
  326. const u8 *fw_data)
  327. {
  328. struct mxt_data *data = fw_info->data;
  329. struct device *dev = &data->client->dev;
  330. struct file *filp = NULL;
  331. struct firmware fw;
  332. mm_segment_t old_fs = {0};
  333. const char *firmware_name = MXT_DEFAULT_FIRMWARE_NAME;
  334. char *fw_path;
  335. int ret = 0;
  336. memset(&fw, 0, sizeof(struct firmware));
  337. fw_path = kzalloc(MXT_MAX_FW_PATH, GFP_KERNEL);
  338. if (fw_path == NULL) {
  339. dev_err(dev, "Failed to allocate firmware path.\n");
  340. return -ENOMEM;
  341. }
  342. snprintf(fw_path, MXT_MAX_FW_PATH, "/sdcard/%s", firmware_name);
  343. old_fs = get_fs();
  344. set_fs(get_ds());
  345. filp = filp_open(fw_path, O_RDONLY, 0);
  346. if (IS_ERR(filp)) {
  347. dev_err(dev, "Could not open firmware: %s,%d\n",
  348. fw_path, (s32)filp);
  349. ret = -ENOENT;
  350. goto err_open;
  351. }
  352. fw.size = filp->f_path.dentry->d_inode->i_size;
  353. fw_data = kzalloc(fw.size, GFP_KERNEL);
  354. if (!fw_data) {
  355. dev_err(dev, "Failed to alloc buffer for fw\n");
  356. ret = -ENOMEM;
  357. goto err_alloc;
  358. }
  359. ret = vfs_read(filp, (char __user *)fw_data, fw.size, &filp->f_pos);
  360. if (ret != fw.size) {
  361. dev_err(dev, "Failed to read file %s (ret = %d)\n",
  362. fw_path, ret);
  363. ret = -EINVAL;
  364. goto err_alloc;
  365. }
  366. fw.data = fw_data;
  367. ret = mxt_verify_fw(fw_info, &fw);
  368. err_alloc:
  369. filp_close(filp, current->files);
  370. err_open:
  371. set_fs(old_fs);
  372. kfree(fw_path);
  373. return ret;
  374. }
  375. static int mxt_load_fw_from_req_fw(struct mxt_fw_info *fw_info,
  376. const struct firmware *fw)
  377. {
  378. struct mxt_data *data = fw_info->data;
  379. struct device *dev = &data->client->dev;
  380. const char *firmware_name = data->pdata->firmware_name;
  381. int ret = 0;
  382. if (firmware_name == NULL) {
  383. dev_err(dev, "%s: firmware name is NULL!, return\n",
  384. __func__);
  385. return -EINVAL;
  386. }
  387. if (MXT_FIRMWARE_UPDATE_TYPE) {
  388. char fw_path[MXT_MAX_FW_PATH];
  389. memset(&fw_path, 0, MXT_MAX_FW_PATH);
  390. snprintf(fw_path, MXT_MAX_FW_PATH, "%s%s",
  391. MXT_FIRMWARE_INKERNEL_PATH, firmware_name);
  392. dev_err(dev, "%s\n", fw_path);
  393. ret = request_firmware(&fw, fw_path, dev);
  394. if (ret) {
  395. dev_err(dev,
  396. "Could not request firmware %s\n", fw_path);
  397. goto out;
  398. }
  399. } else {
  400. ret = request_firmware_nowait(THIS_MODULE, true, firmware_name,
  401. dev, GFP_KERNEL,
  402. data, mxt_request_firmware_work);
  403. if (ret) {
  404. dev_err(dev,
  405. "Could not request firmware %s\n",
  406. firmware_name);
  407. goto out;
  408. }
  409. }
  410. ret = mxt_verify_fw(fw_info, fw);
  411. out:
  412. return ret;
  413. }
  414. static void fw_update(void *device_data)
  415. {
  416. struct mxt_data *data = (struct mxt_data *)device_data;
  417. struct device *dev = &data->client->dev;
  418. struct mxt_fac_data *fdata = data->fdata;
  419. struct mxt_fw_info fw_info;
  420. const u8 *fw_data = NULL;
  421. const struct firmware *fw = NULL;
  422. int ret = 0;
  423. char buff[16] = {0};
  424. memset(&fw_info, 0, sizeof(struct mxt_fw_info));
  425. fw_info.data = data;
  426. set_default_result(fdata);
  427. switch (fdata->cmd_param[0]) {
  428. case MXT_FW_FROM_UMS:
  429. ret = mxt_load_fw_from_ums(&fw_info, fw_data);
  430. if (ret)
  431. goto out;
  432. break;
  433. case MXT_FW_FROM_BUILT_IN:
  434. case MXT_FW_FROM_REQ_FW:
  435. ret = mxt_load_fw_from_req_fw(&fw_info, fw);
  436. if (ret)
  437. goto out;
  438. break;
  439. default:
  440. dev_err(dev, "invalid fw file type!!\n");
  441. ret = -EINVAL;
  442. goto out;
  443. }
  444. #ifdef TSP_INIT_COMPLETE
  445. ret = wait_for_completion_interruptible_timeout(&data->init_done,
  446. msecs_to_jiffies(90 * MSEC_PER_SEC));
  447. if (ret <= 0) {
  448. dev_err(dev, "error while waiting for device to init (%d)\n",
  449. ret);
  450. ret = -EBUSY;
  451. goto out;
  452. }
  453. #endif
  454. mutex_lock(&data->input_dev->mutex);
  455. disable_irq(data->client->irq);
  456. /* Change to the bootloader mode */
  457. ret = mxt_command_reset(data, MXT_BOOT_VALUE);
  458. if (ret)
  459. goto irq_enable;
  460. ret = mxt_flash_fw(&fw_info);
  461. if (ret) {
  462. dev_err(dev, "The firmware update failed(%d)\n", ret);
  463. } else {
  464. dev_info(dev, "The firmware update succeeded\n");
  465. kfree(data->objects);
  466. data->objects = NULL;
  467. ret = mxt_initialize(data);
  468. if (ret) {
  469. dev_err(dev, "Failed to initialize\n");
  470. goto irq_enable;
  471. }
  472. ret = mxt_rest_initialize(&fw_info);
  473. if (ret) {
  474. dev_err(dev, "Failed to rest init\n");
  475. goto irq_enable;
  476. }
  477. }
  478. ret = mxt_make_highchg(data);
  479. irq_enable:
  480. enable_irq(data->client->irq);
  481. mutex_unlock(&data->input_dev->mutex);
  482. out:
  483. release_firmware(fw);
  484. kfree(fw_data);
  485. if (ret) {
  486. snprintf(buff, sizeof(buff), "FAIL");
  487. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  488. fdata->cmd_state = CMD_STATUS_FAIL;
  489. } else {
  490. snprintf(buff, sizeof(buff), "OK");
  491. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  492. fdata->cmd_state = CMD_STATUS_OK;
  493. }
  494. return;
  495. }
  496. #if TSP_PATCH
  497. static int mxt_load_patch_from_ums(struct mxt_data *data,
  498. u8 *patch_data)
  499. {
  500. struct device *dev = &data->client->dev;
  501. struct file *filp = NULL;
  502. struct firmware fw;
  503. mm_segment_t old_fs = {0};
  504. const char *firmware_name = "patch.bin";
  505. char *fw_path;
  506. int ret = 0;
  507. memset(&fw, 0, sizeof(struct firmware));
  508. fw_path = kzalloc(MXT_MAX_FW_PATH, GFP_KERNEL);
  509. if (fw_path == NULL) {
  510. dev_err(dev, "Failed to allocate firmware path.\n");
  511. return -ENOMEM;
  512. }
  513. snprintf(fw_path, MXT_MAX_FW_PATH, "/sdcard/%s", firmware_name);
  514. old_fs = get_fs();
  515. set_fs(get_ds());
  516. filp = filp_open(fw_path, O_RDONLY, 0);
  517. if (IS_ERR(filp)) {
  518. dev_err(dev, "Could not open firmware: %s,%d\n",
  519. fw_path, (s32)filp);
  520. ret = -ENOENT;
  521. goto err_open;
  522. }
  523. fw.size = filp->f_path.dentry->d_inode->i_size;
  524. patch_data = kzalloc(fw.size, GFP_KERNEL);
  525. if (!patch_data) {
  526. dev_err(dev, "Failed to alloc buffer for fw\n");
  527. ret = -ENOMEM;
  528. goto err_alloc;
  529. }
  530. ret = vfs_read(filp, (char __user *)patch_data, fw.size, &filp->f_pos);
  531. if (ret != fw.size) {
  532. dev_err(dev, "Failed to read file %s (ret = %d)\n",
  533. fw_path, ret);
  534. ret = -EINVAL;
  535. goto err_alloc;
  536. }
  537. fw.data = patch_data;
  538. data->patch.patch = patch_data;
  539. dev_info(dev, "%s patch file size:%d\n", __func__, fw.size);
  540. #if 0
  541. print_hex_dump(KERN_INFO, "PATCH FILE:", DUMP_PREFIX_NONE, 16, 1,
  542. patch_data, fw.size, false);
  543. #endif
  544. //ret = mxt_verify_fw(fw_info, &fw);
  545. ret = 0;
  546. err_alloc:
  547. filp_close(filp, current->files);
  548. err_open:
  549. set_fs(old_fs);
  550. kfree(fw_path);
  551. return ret;
  552. }
  553. static void patch_update(void *device_data)
  554. {
  555. struct mxt_data *data = (struct mxt_data *)device_data;
  556. struct device *dev = &data->client->dev;
  557. struct mxt_fac_data *fdata = data->fdata;
  558. u8 *patch_data = NULL;
  559. int ret = 0;
  560. char buff[16] = {0};
  561. set_default_result(fdata);
  562. switch (fdata->cmd_param[0]) {
  563. case 1:
  564. ret = mxt_load_patch_from_ums(data, patch_data);
  565. if (ret)
  566. goto out;
  567. break;
  568. default:
  569. dev_err(dev, "invalid patch file type!!\n");
  570. ret = -EINVAL;
  571. goto out;
  572. }
  573. dev_info(&data->client->dev, "%s ppatch:%p %p\n", __func__,
  574. patch_data, data->patch.patch);
  575. ret = mxt_patch_init(data, data->patch.patch);
  576. out:
  577. kfree(patch_data);
  578. if (ret) {
  579. snprintf(buff, sizeof(buff), "FAIL");
  580. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  581. fdata->cmd_state = CMD_STATUS_FAIL;
  582. } else {
  583. snprintf(buff, sizeof(buff), "OK");
  584. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  585. fdata->cmd_state = CMD_STATUS_OK;
  586. }
  587. return;
  588. }
  589. #endif
  590. static void get_fw_ver_bin(void *device_data)
  591. {
  592. struct mxt_data *data = (struct mxt_data *)device_data;
  593. struct device *dev = &data->client->dev;
  594. struct mxt_fac_data *fdata = data->fdata;
  595. char buff[40] = {0};
  596. set_default_result(fdata);
  597. if (!fdata->fw_ver && !fdata->build_ver) {
  598. snprintf(buff, sizeof(buff), "NG");
  599. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  600. fdata->cmd_state = CMD_STATUS_FAIL;
  601. } else {
  602. /* Format : IC vendor + H/W verion of IC + F/W version
  603. * ex) Atmel : AT00201B
  604. */
  605. snprintf(buff, sizeof(buff), "AT00%02x%02x",
  606. fdata->fw_ver, fdata->build_ver);
  607. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  608. fdata->cmd_state = CMD_STATUS_OK;
  609. }
  610. dev_info(dev, "%s: %s(%d)\n",
  611. __func__, buff, strnlen(buff, sizeof(buff)));
  612. }
  613. static void get_fw_ver_ic(void *device_data)
  614. {
  615. struct mxt_data *data = (struct mxt_data *)device_data;
  616. struct i2c_client *client = data->client;
  617. struct mxt_fac_data *fdata = data->fdata;
  618. char buff[40] = {0};
  619. int ver, build;
  620. set_default_result(fdata);
  621. ver = data->info.version;
  622. build = data->info.build;
  623. /* Format : IC vendor + H/W verion of IC + F/W version
  624. * ex) Atmel : AT00201B
  625. */
  626. snprintf(buff, sizeof(buff), "AT00%02x%02x", ver, build);
  627. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  628. fdata->cmd_state = CMD_STATUS_OK;
  629. dev_info(&client->dev, "%s: %s(%d)\n",
  630. __func__, buff, strnlen(buff, sizeof(buff)));
  631. }
  632. static void get_config_ver(void *device_data)
  633. {
  634. struct mxt_data *data = (struct mxt_data *)device_data;
  635. struct i2c_client *client = data->client;
  636. struct mxt_fac_data *fdata = data->fdata;
  637. struct mxt_object *user_object;
  638. const char *model_name = data->pdata->model_name;
  639. char buff[50] = {0};
  640. char date[10] = {0};
  641. int error = 0;
  642. u32 current_crc = 0;
  643. set_default_result(fdata);
  644. /* Get the config version from userdata */
  645. user_object = mxt_get_object(data, MXT_SPT_USERDATA_T38);
  646. if (!user_object) {
  647. dev_err(&client->dev, "fail to get object_info\n");
  648. snprintf(buff, sizeof(buff), "%s", "NG");
  649. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  650. fdata->cmd_state = CMD_STATUS_FAIL;
  651. return;
  652. }
  653. mxt_read_mem(data, user_object->start_address,
  654. MXT_CONFIG_VERSION_LENGTH, date);
  655. disable_irq(data->client->irq);
  656. /* Get config CRC from device */
  657. error = mxt_read_config_crc(data, &current_crc);
  658. if (error)
  659. dev_err(&client->dev, "%s Error getting configuration CRC:%d\n",
  660. __func__, error);
  661. enable_irq(data->client->irq);
  662. /* Model number_vendor_date_CRC value */
  663. snprintf(buff, sizeof(buff), "%s_AT_%s", model_name, date);
  664. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  665. fdata->cmd_state = CMD_STATUS_OK;
  666. dev_info(&client->dev, "%s: %s(%d)\n",
  667. __func__, buff, strnlen(buff, sizeof(buff)));
  668. }
  669. static void get_threshold(void *device_data)
  670. {
  671. struct mxt_data *data = (struct mxt_data *)device_data;
  672. struct i2c_client *client = data->client;
  673. struct mxt_fac_data *fdata = data->fdata;
  674. int error;
  675. char buff[16] = {0};
  676. u8 threshold = 0;
  677. set_default_result(fdata);
  678. if (data->pdata->revision == MXT_REVISION_I)
  679. error = mxt_read_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T100,
  680. 30, &threshold);
  681. else
  682. error = mxt_read_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T9,
  683. 7, &threshold);
  684. if (error) {
  685. dev_err(&client->dev, "Failed get the threshold\n");
  686. snprintf(buff, sizeof(buff), "%s", "NG");
  687. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  688. fdata->cmd_state = CMD_STATUS_FAIL;
  689. return;
  690. }
  691. snprintf(buff, sizeof(buff), "%d", threshold);
  692. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  693. fdata->cmd_state = CMD_STATUS_OK;
  694. dev_info(&client->dev, "%s: %s(%d)\n",
  695. __func__, buff, strnlen(buff, sizeof(buff)));
  696. }
  697. static void module_off_master(void *device_data)
  698. {
  699. struct mxt_data *data = (struct mxt_data *)device_data;
  700. struct i2c_client *client = data->client;
  701. struct mxt_fac_data *fdata = data->fdata;
  702. char buff[3] = {0};
  703. mutex_lock(&data->input_dev->mutex);
  704. if (mxt_stop(data))
  705. snprintf(buff, sizeof(buff), "%s", "NG");
  706. else
  707. snprintf(buff, sizeof(buff), "%s", "OK");
  708. mutex_unlock(&data->input_dev->mutex);
  709. set_default_result(fdata);
  710. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  711. if (strncmp(buff, "OK", 2) == 0)
  712. fdata->cmd_state = CMD_STATUS_OK;
  713. else
  714. fdata->cmd_state = CMD_STATUS_FAIL;
  715. dev_info(&client->dev, "%s: %s\n", __func__, buff);
  716. }
  717. static void module_on_master(void *device_data)
  718. {
  719. struct mxt_data *data = (struct mxt_data *)device_data;
  720. struct i2c_client *client = data->client;
  721. struct mxt_fac_data *fdata = data->fdata;
  722. char buff[3] = {0};
  723. mutex_lock(&data->input_dev->mutex);
  724. if (mxt_start(data))
  725. snprintf(buff, sizeof(buff), "%s", "NG");
  726. else
  727. snprintf(buff, sizeof(buff), "%s", "OK");
  728. mutex_unlock(&data->input_dev->mutex);
  729. set_default_result(fdata);
  730. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  731. if (strncmp(buff, "OK", 2) == 0)
  732. fdata->cmd_state = CMD_STATUS_OK;
  733. else
  734. fdata->cmd_state = CMD_STATUS_FAIL;
  735. dev_info(&client->dev, "%s: %s\n", __func__, buff);
  736. }
  737. static void get_chip_vendor(void *device_data)
  738. {
  739. struct mxt_data *data = (struct mxt_data *)device_data;
  740. struct i2c_client *client = data->client;
  741. struct mxt_fac_data *fdata = data->fdata;
  742. char buff[16] = {0};
  743. set_default_result(fdata);
  744. snprintf(buff, sizeof(buff), "%s", "ATMEL");
  745. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  746. fdata->cmd_state = CMD_STATUS_OK;
  747. dev_info(&client->dev, "%s: %s(%d)\n",
  748. __func__, buff, strnlen(buff, sizeof(buff)));
  749. }
  750. static void get_chip_name(void *device_data)
  751. {
  752. struct mxt_data *data = (struct mxt_data *)device_data;
  753. struct i2c_client *client = data->client;
  754. struct mxt_fac_data *fdata = data->fdata;
  755. char buff[16] = {0};
  756. set_default_result(fdata);
  757. snprintf(buff, sizeof(buff), "%s", MXT_DEV_NAME);
  758. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  759. fdata->cmd_state = CMD_STATUS_OK;
  760. dev_info(&client->dev, "%s: %s(%d)\n",
  761. __func__, buff, strnlen(buff, sizeof(buff)));
  762. }
  763. static void get_x_num(void *device_data)
  764. {
  765. struct mxt_data *data = (struct mxt_data *)device_data;
  766. struct i2c_client *client = data->client;
  767. struct mxt_fac_data *fdata = data->fdata;
  768. char buff[16] = {0};
  769. int val;
  770. set_default_result(fdata);
  771. val = fdata->num_xnode;
  772. if (val < 0) {
  773. snprintf(buff, sizeof(buff), "%s", "NG");
  774. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  775. fdata->cmd_state = CMD_STATUS_FAIL;
  776. dev_info(&client->dev, "%s: fail to read num of x (%d).\n",
  777. __func__, val);
  778. return;
  779. }
  780. snprintf(buff, sizeof(buff), "%u", val);
  781. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  782. fdata->cmd_state = CMD_STATUS_OK;
  783. dev_info(&client->dev, "%s: %s(%d)\n",
  784. __func__, buff, strnlen(buff, sizeof(buff)));
  785. }
  786. static void get_y_num(void *device_data)
  787. {
  788. struct mxt_data *data = (struct mxt_data *)device_data;
  789. struct i2c_client *client = data->client;
  790. struct mxt_fac_data *fdata = data->fdata;
  791. char buff[16] = {0};
  792. int val;
  793. set_default_result(fdata);
  794. val = fdata->num_ynode;
  795. if (val < 0) {
  796. snprintf(buff, sizeof(buff), "%s", "NG");
  797. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  798. fdata->cmd_state = CMD_STATUS_FAIL;
  799. dev_info(&client->dev, "%s: fail to read num of y (%d).\n",
  800. __func__, val);
  801. return;
  802. }
  803. snprintf(buff, sizeof(buff), "%u", val);
  804. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  805. fdata->cmd_state = CMD_STATUS_OK;
  806. dev_info(&client->dev, "%s: %s(%d)\n",
  807. __func__, buff, strnlen(buff, sizeof(buff)));
  808. }
  809. static void run_reference_read(void *device_data)
  810. {
  811. struct mxt_data *data = (struct mxt_data *)device_data;
  812. struct mxt_fac_data *fdata = data->fdata;
  813. int ret;
  814. char buff[16] = {0};
  815. set_default_result(fdata);
  816. #if TSP_PATCH
  817. if(data->patch.event_cnt)
  818. mxt_patch_test_event(data, 2);
  819. #endif
  820. ret = mxt_read_all_diagnostic_data(data,
  821. MXT_DIAG_REFERENCE_MODE);
  822. if (ret)
  823. fdata->cmd_state = CMD_STATUS_FAIL;
  824. else {
  825. snprintf(buff, sizeof(buff), "%d,%d",
  826. fdata->ref_min_data, fdata->ref_max_data);
  827. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  828. fdata->cmd_state = CMD_STATUS_OK;
  829. }
  830. }
  831. static void get_reference(void *device_data)
  832. {
  833. struct mxt_data *data = (struct mxt_data *)device_data;
  834. struct i2c_client *client = data->client;
  835. struct mxt_fac_data *fdata = data->fdata;
  836. char buff[16] = {0};
  837. int node;
  838. set_default_result(fdata);
  839. /* add read function */
  840. node = mxt_xy_to_node(data);
  841. if (node < 0) {
  842. fdata->cmd_state = CMD_STATUS_FAIL;
  843. return;
  844. }
  845. snprintf(buff, sizeof(buff), "%u", fdata->reference[node]);
  846. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  847. fdata->cmd_state = CMD_STATUS_OK;
  848. dev_info(&client->dev, "%s: %s(%d)\n",
  849. __func__, buff, strnlen(buff, sizeof(buff)));
  850. }
  851. static void run_delta_read(void *device_data)
  852. {
  853. struct mxt_data *data = (struct mxt_data *)device_data;
  854. struct mxt_fac_data *fdata = data->fdata;
  855. int ret;
  856. set_default_result(fdata);
  857. ret = mxt_read_all_diagnostic_data(data,
  858. MXT_DIAG_DELTA_MODE);
  859. if (ret)
  860. fdata->cmd_state = CMD_STATUS_FAIL;
  861. else
  862. fdata->cmd_state = CMD_STATUS_OK;
  863. }
  864. static void get_delta(void *device_data)
  865. {
  866. struct mxt_data *data = (struct mxt_data *)device_data;
  867. struct i2c_client *client = data->client;
  868. struct mxt_fac_data *fdata = data->fdata;
  869. char buff[16] = {0};
  870. int node;
  871. set_default_result(fdata);
  872. /* add read function */
  873. node = mxt_xy_to_node(data);
  874. if (node < 0) {
  875. fdata->cmd_state = CMD_STATUS_FAIL;
  876. return;
  877. }
  878. snprintf(buff, sizeof(buff), "%d", fdata->delta[node]);
  879. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  880. fdata->cmd_state = CMD_STATUS_OK;
  881. dev_info(&client->dev, "%s: %s(%d)\n",
  882. __func__, buff, strnlen(buff, sizeof(buff)));
  883. }
  884. static int mxt_check_fcal_status(struct mxt_data *data, u8 status)
  885. {
  886. struct device *dev = &data->client->dev;
  887. int error = -EINVAL;
  888. dev_info(dev, "FCAL : state[%s]\n",
  889. MXT_FCALSTATE(status) ? (MXT_FCALSTATE(status) == 1 ?
  890. "PRIMED" : "GENERATED") : "IDLE");
  891. switch (MXT_FCALSTATE(status)) {
  892. case MXT_FCALSTATE_IDLE:
  893. if (status & MXT_FCALSTATUS_SEQTO) {
  894. dev_err(dev, "Sequence Timeout:[0x%x]\n", status);
  895. goto out;
  896. }
  897. if (status & MXT_FCALSTATUS_SEQERR) {
  898. dev_err(dev, "Sequence Error:[0x%x]\n", status);
  899. goto out;
  900. }
  901. if (status & MXT_FCALSTATUS_SEQDONE) {
  902. dev_info(dev, "Sequence Done:[0x%x]\n", status);
  903. error = FCALSEQDONE_MAGIC;
  904. goto out;
  905. }
  906. break;
  907. case MXT_FCALSTATE_PRIMED:
  908. error = mxt_write_object(data, MXT_SPT_GOLDENREFERENCES_T66,
  909. 0, MXT_FCALCMD(MXT_FCALCMD_GENERATE) | 0x03);
  910. if (error) {
  911. dev_err(dev, "Failed to write FALCMD_GENERATE\n");
  912. goto out;
  913. }
  914. break;
  915. case MXT_FCALSTATE_GENERATED:
  916. if (status & MXT_FCALSTATUS_FAIL) {
  917. dev_err(dev, "Calibration Failed:[0x%x]\n", status);
  918. goto out;
  919. }
  920. if (status & MXT_FCALSTATUS_PASS) {
  921. dev_info(dev, "Calibration Passed:[0x%x]\n", status);
  922. error = mxt_write_object(data,
  923. MXT_SPT_GOLDENREFERENCES_T66, 0,
  924. MXT_FCALCMD(MXT_FCALCMD_STORE) | 0x03);
  925. if (error) {
  926. dev_err(dev, "Failed to write FCALCMD_STORE\n");
  927. goto out;
  928. }
  929. }
  930. break;
  931. default:
  932. dev_err(dev, "Invaild Factory Calibration status[0x%x]\n",
  933. status);
  934. }
  935. out:
  936. return error;
  937. }
  938. static int mxt_read_message_on_fcal(struct mxt_data *data,
  939. struct mxt_message *message)
  940. {
  941. struct device *dev = &data->client->dev;
  942. u8 report_id = 0, type = 0, fcal_status = 0;
  943. int error = 0;
  944. do {
  945. if (mxt_read_message(data, message)) {
  946. dev_err(dev, "Failed to read message\n");
  947. return -EIO;
  948. }
  949. #if TSP_USE_ATMELDBG
  950. if (data->atmeldbg.display_log) {
  951. print_hex_dump(KERN_INFO, "MXT MSG:",
  952. DUMP_PREFIX_NONE, 16, 1,
  953. message,
  954. sizeof(struct mxt_message), false);
  955. }
  956. #endif
  957. report_id = message->reportid;
  958. if (report_id > data->max_reportid)
  959. goto end;
  960. type = data->reportids[report_id].type;
  961. /* check message is avaiable on Factory calibration */
  962. switch (type) {
  963. case MXT_SPT_GOLDENREFERENCES_T66:
  964. fcal_status = message->message[0];
  965. dev_dbg(dev, "T%d:\t[0x%x][0x%x][0x%x][0x%x][0x%x]\n",
  966. type, message->reportid,
  967. message->message[0], message->message[1],
  968. message->message[2], message->message[3]);
  969. error = mxt_check_fcal_status(data, fcal_status);
  970. if (error)
  971. return error;
  972. break;
  973. /* need to add exception case such as T9 touch message.
  974. * I think T9 message represent that user touch the device
  975. * during Factory calibration
  976. */
  977. case MXT_TOUCH_MULTITOUCHSCREEN_T9:
  978. case MXT_PROCI_TOUCHSUPPRESSION_T42:
  979. dev_err(dev, "Object detected on screen[T%d]\n",
  980. type);
  981. #if 0 /* TODO : Need to review..... */
  982. /* Store the fail cause in cmd_result */
  983. snprintf(buff, sizeof(buff), "%s",
  984. "Object detected on screen");
  985. set_cmd_result(data->fdata, buff,
  986. strnlen(buff, sizeof(buff)));
  987. /* Send the PRIME commnad to make sequence error */
  988. error = mxt_write_object(data,
  989. MXT_SPT_GOLDENREFERENCES_T66, 0,
  990. MXT_FCALCMD(MXT_FCALCMD_PRIME) | 0x03);
  991. if (error) {
  992. dev_err(&client->dev, "Failed to write FCALCMD_PRIME\n");
  993. return error;
  994. }
  995. #endif
  996. break;
  997. default:
  998. dev_dbg(dev, "T%d:\t[0x%x][0x%x][0x%x][0x%x][0x%x][0x%x][0x%x][0x%x][0x%x]\n",
  999. type, message->reportid,
  1000. message->message[0], message->message[1],
  1001. message->message[2], message->message[3],
  1002. message->message[4], message->message[5],
  1003. message->message[6], message->message[7]);
  1004. }
  1005. } while (!data->pdata->read_chg());
  1006. end:
  1007. return 0;
  1008. }
  1009. static void mxt_run_factory_cal(void *device_data)
  1010. {
  1011. struct mxt_data *data = (struct mxt_data *)device_data;
  1012. struct i2c_client *client = data->client;
  1013. struct mxt_fac_data *fdata = data->fdata;
  1014. struct mxt_message message;
  1015. int error = 0;
  1016. set_default_result(fdata);
  1017. /* To ensure that previous touchs are released */
  1018. msleep(500);
  1019. /* CTRL : enable RPTEN and ENABLE */
  1020. error = mxt_write_object(data, MXT_SPT_GOLDENREFERENCES_T66,
  1021. 0, MXT_FCALCMD(MXT_FCALCMD_PRIME) | 0x03);
  1022. if (error) {
  1023. dev_err(&client->dev, "Failed to write FCALCMD_PRIME\n");
  1024. fdata->cmd_state = CMD_STATUS_FAIL;
  1025. return;
  1026. }
  1027. disable_irq(client->irq);
  1028. do {
  1029. error = mxt_read_message_on_fcal(data, &message);
  1030. if (!error)
  1031. msleep(1000);
  1032. } while (!error);
  1033. enable_irq(client->irq);
  1034. if (error == FCALSEQDONE_MAGIC) {
  1035. dev_info(&client->dev, "Sucessed Factory Calibration\n");
  1036. fdata->cmd_state = CMD_STATUS_OK;
  1037. } else {
  1038. dev_err(&client->dev, "Failed Factory Calibration [%d]", error);
  1039. fdata->cmd_state = CMD_STATUS_FAIL;
  1040. }
  1041. }
  1042. static void set_jitter_level(void *device_data)
  1043. {
  1044. struct mxt_data *data = (struct mxt_data *)device_data;
  1045. struct i2c_client *client = data->client;
  1046. struct mxt_fac_data *fdata = data->fdata;
  1047. char buff[16] = {0};
  1048. set_default_result(fdata);
  1049. if (!data->mxt_enabled) {
  1050. dev_err(&client->dev, "%s failed, TSP IC is not ready!\n", __func__);
  1051. snprintf(buff, sizeof(buff), "%s", "NG");
  1052. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1053. fdata->cmd_state = CMD_STATUS_FAIL;
  1054. } else if (fdata->cmd_param[0] < 1 || fdata->cmd_param[0] > 8) {
  1055. dev_err(&client->dev, "%s failed, the range of jitter level is 1~8[%d]\n",
  1056. __func__, fdata->cmd_param[0]);
  1057. snprintf(buff, sizeof(buff), "%s", "NG");
  1058. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1059. fdata->cmd_state = CMD_STATUS_FAIL;
  1060. } else {
  1061. int retval = 0, level = 0;
  1062. u8 cfg_val;
  1063. level = fdata->cmd_param[0];
  1064. retval = mxt_read_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T9, MXT_TOUCH_MOVFILTER2, &cfg_val);
  1065. if (!retval) {
  1066. cfg_val = ((cfg_val & 0xf0 )| level);
  1067. /* TODO: Write config value for changing jitter value on tsp ic */
  1068. retval = mxt_write_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T9, MXT_TOUCH_MOVFILTER2, cfg_val);
  1069. } else {
  1070. dev_err(&client->dev, "%s: failed to read T9 object.\n", __func__);
  1071. retval = -EINVAL;
  1072. }
  1073. if (retval < 0) {
  1074. dev_err(&client->dev, "%s: failed, retval=%d,level=%d,cfg_val=%d\n",
  1075. __func__, retval, level, cfg_val);
  1076. snprintf(buff, sizeof(buff), "%s", "NG");
  1077. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1078. fdata->cmd_state = CMD_STATUS_FAIL;
  1079. } else {
  1080. dev_err(&client->dev, "%s: success write level[%d],cfg_val=[%d]\n",
  1081. __func__, level, cfg_val);
  1082. snprintf(buff, sizeof(buff), "%s", "OK");
  1083. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1084. fdata->cmd_state = CMD_STATUS_OK;
  1085. }
  1086. }
  1087. mutex_lock(&fdata->cmd_lock);
  1088. fdata->cmd_is_running = false;
  1089. mutex_unlock(&fdata->cmd_lock);
  1090. fdata->cmd_state = CMD_STATUS_WAITING;
  1091. return;
  1092. }
  1093. #if ENABLE_TOUCH_KEY
  1094. static void get_tk_threshold(void *device_data)
  1095. {
  1096. struct mxt_data *data = (struct mxt_data *)device_data;
  1097. struct i2c_client *client = data->client;
  1098. struct mxt_fac_data *fdata = data->fdata;
  1099. int error;
  1100. char buff[16] = {0};
  1101. u8 threshold = 0;
  1102. set_default_result(fdata);
  1103. error = mxt_read_object(data, MXT_TOUCH_KEYARRAY_T15, 7, &threshold);
  1104. if (error) {
  1105. dev_err(&client->dev, "Failed get the tk_threshold\n");
  1106. snprintf(buff, sizeof(buff), "%s", "NG");
  1107. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1108. fdata->cmd_state = CMD_STATUS_FAIL;
  1109. return;
  1110. }
  1111. snprintf(buff, sizeof(buff), "%d", threshold);
  1112. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1113. fdata->cmd_state = CMD_STATUS_OK;
  1114. dev_info(&client->dev, "%s: %s(%d)\n",
  1115. __func__, buff, strnlen(buff, sizeof(buff)));
  1116. }
  1117. static void get_tk_delta(void *device_data)
  1118. {
  1119. struct mxt_data *data = (struct mxt_data *)device_data;
  1120. struct i2c_client *client = data->client;
  1121. struct mxt_fac_data *fdata = data->fdata;
  1122. char buff[16] = {0};
  1123. int i = 0;
  1124. u16 keydelta = 0;
  1125. set_default_result(fdata);
  1126. /* add read function */
  1127. for (i=0 ; i < data->pdata->num_touchkey ; i++) {
  1128. if (!strcmp(fdata->cmd_param_str[0], data->pdata->touchkey[i].name))
  1129. break;
  1130. }
  1131. if (i != data->pdata->num_touchkey) {
  1132. dev_info(&client->dev, "%s: before touchkey ref read[%s]\n",
  1133. __func__, fdata->cmd_param_str[0]);
  1134. mxt_read_diagnostic_data(data, MXT_DIAG_KEYDELTA_MODE,
  1135. data->pdata->touchkey[i].deltaobj, &keydelta);
  1136. dev_info(&client->dev, "%s: after touchkey ref read[%d]\n",
  1137. __func__, (s16)keydelta);
  1138. } else {
  1139. dev_info(&client->dev, "%s: find touchkey name fail![%s]\n",
  1140. __func__, fdata->cmd_param_str[0]);
  1141. fdata->cmd_state = CMD_STATUS_FAIL;
  1142. return;
  1143. }
  1144. snprintf(buff, sizeof(buff), "%d", (s16)keydelta > 0 ? keydelta : 0 );
  1145. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1146. fdata->cmd_state = CMD_STATUS_OK;
  1147. dev_info(&client->dev, "%s: %s(%d)\n",
  1148. __func__, buff, strnlen(buff, sizeof(buff)));
  1149. }
  1150. #ifdef WORKAROUND_THRESHOLD
  1151. bool set_threshold(void *device_data)
  1152. {
  1153. struct mxt_data *data = (struct mxt_data *)device_data;
  1154. struct i2c_client *client = data->client;
  1155. int retval = 0;
  1156. bool command_success = true;
  1157. if (data->setdata == 1) {
  1158. retval = mxt_write_object(data, MXT_GEN_POWERCONFIG_T7, 1, 255);
  1159. if (retval) {
  1160. dev_info(&client->dev, "Failed T7[1] ACTVACQINT =255\n");
  1161. command_success = false;
  1162. }
  1163. retval = mxt_write_object(data, MXT_TOUCH_KEYARRAY_T15, 6, 75);
  1164. if (retval) {
  1165. dev_info(&client->dev, "Failed T15[6] TCHDI = 75\n");
  1166. command_success = false;
  1167. }
  1168. retval = mxt_write_object(data, MXT_TOUCH_KEYARRAY_T15, 7, 55);
  1169. if (retval) {
  1170. dev_info(&client->dev, "Failed T15[7] TCHTHR = 60\n");
  1171. command_success = false;
  1172. }
  1173. retval = mxt_write_object(data, MXT_TOUCH_KEYARRAY_T15, 8, 5);
  1174. if (retval) {
  1175. dev_info(&client->dev, "Failed T15[8] TCHDI = 3\n");
  1176. command_success = false;
  1177. }
  1178. retval = mxt_write_object(data, MXT_SPT_CTECONFIG_T46, 3, 63);
  1179. if (retval) {
  1180. dev_info(&client->dev, "Failed T46[3] ACTVSYNCSPERX = 16\n");
  1181. command_success = false;
  1182. }
  1183. retval = mxt_write_object(data, MXT_PROCI_SHIELDLESS_T56, 0, 3);
  1184. if (retval) {
  1185. dev_info(&client->dev, "Failed T56[0] CTRL = 3\n");
  1186. command_success = false;
  1187. }
  1188. retval = mxt_write_object(data, 77, 0, 5);
  1189. if (retval) {
  1190. dev_info(&client->dev, "Failed T77[0] CTRL = 5\n");
  1191. command_success = false;
  1192. }
  1193. retval = mxt_write_object(data, 77, 1, 5);
  1194. if (retval) {
  1195. dev_info(&client->dev, "Failed T77[1] ACTVPRCSSCNEXT = 5\n");
  1196. command_success = false;
  1197. }
  1198. dev_info(&client->dev, "success confing write\n");
  1199. } else {
  1200. retval = mxt_command_reset(data, MXT_RESET_VALUE);
  1201. if (retval) {
  1202. dev_info(&client->dev, "Failed Reset IC\n");
  1203. command_success = false;
  1204. } else
  1205. dev_info(&client->dev, "success SW Reset IC\n");
  1206. }
  1207. return command_success;
  1208. }
  1209. static void set_tk_threshold(void *device_data)
  1210. {
  1211. struct mxt_data *data = (struct mxt_data *)device_data;
  1212. struct i2c_client *client = data->client;
  1213. struct mxt_fac_data *fdata = data->fdata;
  1214. char buff[16] = {0};
  1215. bool command_success;
  1216. unsigned int revision;
  1217. set_default_result(fdata);
  1218. #ifdef KOR_REVISION
  1219. revision = 9; /* All of revision change threshold of Touch key */
  1220. #else
  1221. revision = 11;
  1222. #endif
  1223. if (system_rev >= revision) {
  1224. dev_info(&client->dev, "%s failed, not suppport[%d] !\n",
  1225. __func__, system_rev);
  1226. mutex_lock(&fdata->cmd_lock);
  1227. fdata->cmd_is_running = false;
  1228. mutex_unlock(&fdata->cmd_lock);
  1229. fdata->cmd_state = CMD_STATUS_WAITING;
  1230. return;
  1231. }
  1232. if (data->setdata == fdata->cmd_param[0]) {
  1233. dev_info(&client->dev, "%s ,same state : nothing to do[%s], TSP %s!\n",
  1234. __func__, fdata->cmd_param[0] == 1 ? "ON" : "OFF",
  1235. data->mxt_enabled ? "ON" : "OFF");
  1236. mutex_lock(&fdata->cmd_lock);
  1237. fdata->cmd_is_running = false;
  1238. mutex_unlock(&fdata->cmd_lock);
  1239. fdata->cmd_state = CMD_STATUS_WAITING;
  1240. return;
  1241. }
  1242. data->setdata = fdata->cmd_param[0];
  1243. if (!data->mxt_enabled) {
  1244. dev_info(&client->dev, "%s failed, TSP IC is not ready!\n",
  1245. __func__);
  1246. snprintf(buff, sizeof(buff), "%s", "NG");
  1247. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1248. fdata->cmd_state = CMD_STATUS_FAIL;
  1249. mutex_lock(&fdata->cmd_lock);
  1250. fdata->cmd_is_running = false;
  1251. mutex_unlock(&fdata->cmd_lock);
  1252. return;
  1253. }
  1254. command_success = set_threshold(data);
  1255. if (command_success) {
  1256. dev_info(&client->dev, "%s: success write configs\n",
  1257. __func__);
  1258. snprintf(buff, sizeof(buff), "%s", "OK");
  1259. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1260. fdata->cmd_state = CMD_STATUS_OK;
  1261. } else {
  1262. dev_info(&client->dev, "%s: fail write configs\n",
  1263. __func__);
  1264. snprintf(buff, sizeof(buff), "%s", "NG");
  1265. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1266. fdata->cmd_state = CMD_STATUS_FAIL;
  1267. }
  1268. mutex_lock(&fdata->cmd_lock);
  1269. fdata->cmd_is_running = false;
  1270. mutex_unlock(&fdata->cmd_lock);
  1271. fdata->cmd_state = CMD_STATUS_WAITING;
  1272. return;
  1273. }
  1274. #endif
  1275. #endif
  1276. /* - function realted samsung factory test */
  1277. #define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func
  1278. struct tsp_cmd {
  1279. struct list_head list;
  1280. const char *cmd_name;
  1281. void (*cmd_func)(void *device_data);
  1282. };
  1283. #if TSP_BOOSTER
  1284. static void boost_level(void *device_data)
  1285. {
  1286. struct mxt_data *data = (struct mxt_data *)device_data;
  1287. struct i2c_client *client = data->client;
  1288. struct mxt_fac_data *fdata = data->fdata;
  1289. char buff[16] = {0};
  1290. int retval;
  1291. dev_info(&client->dev, "%s\n", __func__);
  1292. set_default_result(fdata);
  1293. data->dvfs_boost_mode = fdata->cmd_param[0];
  1294. dev_info(&client->dev, "%s: dvfs_boost_mode = %d\n",
  1295. __func__, data->dvfs_boost_mode);
  1296. snprintf(buff, sizeof(buff), "OK");
  1297. fdata->cmd_state = CMD_STATUS_OK;
  1298. if (data->dvfs_boost_mode == DVFS_STAGE_NONE) {
  1299. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  1300. if (retval < 0) {
  1301. dev_err(&client->dev,
  1302. "%s: booster stop failed(%d).\n",
  1303. __func__, retval);
  1304. snprintf(buff, sizeof(buff), "NG");
  1305. fdata->cmd_state = CMD_STATUS_FAIL;
  1306. data->dvfs_lock_status = false;
  1307. }
  1308. }
  1309. set_cmd_result(fdata, buff, strnlen(buff, sizeof(buff)));
  1310. mutex_lock(&fdata->cmd_lock);
  1311. fdata->cmd_is_running = false;
  1312. mutex_unlock(&fdata->cmd_lock);
  1313. fdata->cmd_state = CMD_STATUS_WAITING;
  1314. return;
  1315. }
  1316. #endif
  1317. static struct tsp_cmd tsp_cmds[] = {
  1318. {TSP_CMD("fw_update", fw_update),},
  1319. {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),},
  1320. {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),},
  1321. {TSP_CMD("get_config_ver", get_config_ver),},
  1322. {TSP_CMD("get_threshold", get_threshold),},
  1323. {TSP_CMD("module_off_master", module_off_master),},
  1324. {TSP_CMD("module_on_master", module_on_master),},
  1325. {TSP_CMD("module_off_slave", not_support_cmd),},
  1326. {TSP_CMD("module_on_slave", not_support_cmd),},
  1327. {TSP_CMD("get_chip_vendor", get_chip_vendor),},
  1328. {TSP_CMD("get_chip_name", get_chip_name),},
  1329. {TSP_CMD("get_x_num", get_x_num),},
  1330. {TSP_CMD("get_y_num", get_y_num),},
  1331. {TSP_CMD("run_reference_read", run_reference_read),},
  1332. {TSP_CMD("get_reference", get_reference),},
  1333. {TSP_CMD("run_delta_read", run_delta_read),},
  1334. {TSP_CMD("get_delta", get_delta),},
  1335. {TSP_CMD("find_delta", find_delta_node),},
  1336. {TSP_CMD("run_factory_cal", mxt_run_factory_cal),},
  1337. {TSP_CMD("set_jitter_level", set_jitter_level),},
  1338. #if ENABLE_TOUCH_KEY
  1339. {TSP_CMD("get_tk_threshold", get_tk_threshold),},
  1340. {TSP_CMD("get_tk_delta", get_tk_delta),},
  1341. #ifdef WORKAROUND_THRESHOLD
  1342. {TSP_CMD("set_tk_threshold", set_tk_threshold),},
  1343. #endif
  1344. #endif
  1345. #if TSP_BOOSTER
  1346. {TSP_CMD("boost_level", boost_level),},
  1347. #endif
  1348. #if TSP_PATCH
  1349. {TSP_CMD("patch_update", patch_update),},
  1350. #endif
  1351. {TSP_CMD("not_support_cmd", not_support_cmd),},
  1352. };
  1353. /* Functions related to basic interface */
  1354. static ssize_t store_cmd(struct device *dev, struct device_attribute
  1355. *devattr, const char *buf, size_t count)
  1356. {
  1357. struct mxt_data *data = dev_get_drvdata(dev);
  1358. struct i2c_client *client = data->client;
  1359. struct mxt_fac_data *fdata = data->fdata;
  1360. char *cur, *start, *end;
  1361. char buff[TSP_CMD_STR_LEN] = {0};
  1362. int len, i;
  1363. struct tsp_cmd *tsp_cmd_ptr = NULL;
  1364. char delim = ',';
  1365. bool cmd_found = false;
  1366. int param_cnt = 0;
  1367. int ret;
  1368. if (strlen(buf) >= TSP_CMD_STR_LEN) {
  1369. dev_err(&client->dev, "%s: cmd length is over(%s,%d)!!\n", __func__, buf, (int)strlen(buf));
  1370. return -EINVAL;
  1371. }
  1372. if (fdata->cmd_is_running == true) {
  1373. dev_err(&client->dev, "tsp_cmd: other cmd is running.\n");
  1374. goto err_out;
  1375. }
  1376. len = (int)count;
  1377. if (*(buf + len - 1) == '\n')
  1378. len--;
  1379. /* if wrong cmd is coming */
  1380. if (len > TSP_CMD_STR_LEN) {
  1381. dev_info(&client->dev, "%s: length overflow[%d]\n", __func__, len);
  1382. goto err_out;
  1383. }
  1384. /* check lock */
  1385. mutex_lock(&fdata->cmd_lock);
  1386. fdata->cmd_is_running = true;
  1387. mutex_unlock(&fdata->cmd_lock);
  1388. fdata->cmd_state = CMD_STATUS_RUNNING;
  1389. for (i = 0; i < ARRAY_SIZE(fdata->cmd_param); i++)
  1390. fdata->cmd_param[i] = 0;
  1391. memset(fdata->cmd, 0x00, ARRAY_SIZE(fdata->cmd));
  1392. memcpy(fdata->cmd, buf, len);
  1393. cur = strchr(buf, (int)delim);
  1394. if (cur)
  1395. memcpy(buff, buf, cur - buf);
  1396. else
  1397. memcpy(buff, buf, len);
  1398. /* find command */
  1399. list_for_each_entry(tsp_cmd_ptr, &fdata->cmd_list_head, list) {
  1400. if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) {
  1401. cmd_found = true;
  1402. break;
  1403. }
  1404. }
  1405. /* set not_support_cmd */
  1406. if (!cmd_found) {
  1407. list_for_each_entry(tsp_cmd_ptr,
  1408. &fdata->cmd_list_head, list) {
  1409. if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name))
  1410. break;
  1411. }
  1412. }
  1413. /* parsing parameters */
  1414. if (cur && cmd_found) {
  1415. cur++;
  1416. start = cur;
  1417. memset(buff, 0x00, ARRAY_SIZE(buff));
  1418. do {
  1419. if (*cur == delim || cur - buf == len) {
  1420. end = cur;
  1421. memcpy(buff, start, end - start);
  1422. *(buff + strlen(buff)) = '\0';
  1423. memcpy(fdata->cmd_param_str + param_cnt, buff,\
  1424. end - start + 1);
  1425. ret = kstrtoint(buff, 10,\
  1426. fdata->cmd_param + param_cnt);
  1427. start = cur + 1;
  1428. memset(buff, 0x00, ARRAY_SIZE(buff));
  1429. param_cnt++;
  1430. }
  1431. cur++;
  1432. } while ((cur - buf <= len) && (param_cnt < TSP_CMD_PARAM_NUM));
  1433. }
  1434. dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name);
  1435. for (i = 0; i < param_cnt; i++) {
  1436. dev_info(&client->dev, "cmd param %d= %d, cmd param str = %s\n",
  1437. i, fdata->cmd_param[i], fdata->cmd_param_str[i]);
  1438. }
  1439. tsp_cmd_ptr->cmd_func(data);
  1440. err_out:
  1441. return count;
  1442. }
  1443. static ssize_t show_cmd_status(struct device *dev,
  1444. struct device_attribute *devattr, char *buf)
  1445. {
  1446. struct mxt_data *data = dev_get_drvdata(dev);
  1447. struct mxt_fac_data *fdata = data->fdata;
  1448. char buff[16] = {0};
  1449. dev_info(&data->client->dev, "tsp cmd: status:%d\n",
  1450. fdata->cmd_state);
  1451. if (fdata->cmd_state == CMD_STATUS_WAITING)
  1452. snprintf(buff, sizeof(buff), "WAITING");
  1453. else if (fdata->cmd_state == CMD_STATUS_RUNNING)
  1454. snprintf(buff, sizeof(buff), "RUNNING");
  1455. else if (fdata->cmd_state == CMD_STATUS_OK)
  1456. snprintf(buff, sizeof(buff), "OK");
  1457. else if (fdata->cmd_state == CMD_STATUS_FAIL)
  1458. snprintf(buff, sizeof(buff), "FAIL");
  1459. else if (fdata->cmd_state == CMD_STATUS_NOT_APPLICABLE)
  1460. snprintf(buff, sizeof(buff), "NOT_APPLICABLE");
  1461. return snprintf(buf, TSP_BUF_SIZE, "%s\n", buff);
  1462. }
  1463. static ssize_t show_cmd_result(struct device *dev, struct device_attribute
  1464. *devattr, char *buf)
  1465. {
  1466. struct mxt_data *data = dev_get_drvdata(dev);
  1467. struct mxt_fac_data *fdata = data->fdata;
  1468. dev_info(&data->client->dev, "tsp cmd: result: %s\n",
  1469. fdata->cmd_result);
  1470. mutex_lock(&fdata->cmd_lock);
  1471. fdata->cmd_is_running = false;
  1472. mutex_unlock(&fdata->cmd_lock);
  1473. fdata->cmd_state = CMD_STATUS_WAITING;
  1474. return snprintf(buf, TSP_BUF_SIZE, "%s\n", fdata->cmd_result);
  1475. }
  1476. static ssize_t cmd_list_show(struct device *dev,
  1477. struct device_attribute *attr, char *buf)
  1478. {
  1479. int ii = 0;
  1480. char buffer[896];
  1481. char buffer_name[32];
  1482. snprintf(buffer, 30, "++factory command list++\n");
  1483. while (strncmp(tsp_cmds[ii].cmd_name, "not_support_cmd", 16) != 0) {
  1484. snprintf(buffer_name, 32, "%s\n", tsp_cmds[ii].cmd_name);
  1485. strncat(buffer, buffer_name, (int)strlen(buffer_name));
  1486. ii++;
  1487. }
  1488. return snprintf(buf, PAGE_SIZE, "%s\n", buffer);
  1489. }
  1490. static ssize_t set_tsp_for_inputmethod_show(struct device *dev,
  1491. struct device_attribute *attr, char *buf)
  1492. {
  1493. struct mxt_data *data = dev_get_drvdata(dev);
  1494. return snprintf(buf, PAGE_SIZE, "%u\n",
  1495. data->is_inputmethod);
  1496. }
  1497. static ssize_t set_tsp_for_inputmethod_store(struct device *dev,
  1498. struct device_attribute *attr, const char *buf, size_t size)
  1499. {
  1500. u8 jump_limit = 0;
  1501. struct mxt_data *data = dev_get_drvdata(dev);
  1502. printk(KERN_ERR "[TSP]set_tsp_for_inputmethod_store. call");
  1503. if (!data->mxt_enabled) {
  1504. printk(KERN_ERR
  1505. "[TSP]set_tsp_for_inputmethod_store. "
  1506. "mxt_enabled is 0\n");
  1507. return 1;
  1508. }
  1509. if (*buf == '1' && (!data->is_inputmethod)) {
  1510. dev_err(&(data->input_dev->dev),
  1511. "%s: Set TSP inputmethod IN\n",
  1512. __func__);
  1513. jump_limit = 30;
  1514. data->is_inputmethod = true;
  1515. } else if (*buf == '0' && (data->is_inputmethod)) {
  1516. dev_err(&(data->input_dev->dev),
  1517. "%s: Set TSP inputmethod OUT\n",
  1518. __func__);
  1519. jump_limit = 60;
  1520. data->is_inputmethod = false;
  1521. }
  1522. else {
  1523. dev_err(&(data->input_dev->dev),
  1524. "%s: err in argument for inputmethod\n",
  1525. __func__);
  1526. return 1;
  1527. }
  1528. mxt_write_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T9, 30, jump_limit);
  1529. dev_info(&(data->input_dev->dev),
  1530. "%s: read T9,jump_limit(%d)\n",
  1531. __func__,jump_limit);
  1532. return 1;
  1533. }
  1534. static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd);
  1535. static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL);
  1536. static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL);
  1537. static DEVICE_ATTR(cmd_list, S_IRUGO, cmd_list_show, NULL);
  1538. static DEVICE_ATTR(set_tsp_for_inputmethod, S_IRUGO | S_IWUSR | S_IWGRP,
  1539. set_tsp_for_inputmethod_show, set_tsp_for_inputmethod_store);
  1540. static struct attribute *touchscreen_factory_attributes[] = {
  1541. &dev_attr_cmd.attr,
  1542. &dev_attr_cmd_status.attr,
  1543. &dev_attr_cmd_result.attr,
  1544. &dev_attr_cmd_list.attr,
  1545. NULL,
  1546. };
  1547. static struct attribute_group touchscreen_factory_attr_group = {
  1548. .attrs = touchscreen_factory_attributes,
  1549. };
  1550. #if ENABLE_TOUCH_KEY
  1551. static int touchkey_delta_show(struct mxt_data *data, char *key_name)
  1552. {
  1553. struct i2c_client *client = data->client;
  1554. struct mxt_fac_data *fdata = data->fdata;
  1555. int i;
  1556. u16 keydelta = 0;
  1557. /* check lock */
  1558. mutex_lock(&fdata->cmd_lock);
  1559. fdata->cmd_is_running = true;
  1560. fdata->cmd_state = CMD_STATUS_RUNNING;
  1561. mutex_unlock(&fdata->cmd_lock);
  1562. /* find touch key data */
  1563. for (i=0 ; i < data->pdata->num_touchkey ; i++) {
  1564. if (!strcmp(key_name, data->pdata->touchkey[i].name))
  1565. break;
  1566. }
  1567. dev_info(&client->dev, "%s: %s touchkey delta read\n",
  1568. __func__, key_name);
  1569. if (i != data->pdata->num_touchkey) {
  1570. mxt_read_diagnostic_data(data, MXT_DIAG_KEYDELTA_MODE,
  1571. data->pdata->touchkey[i].deltaobj, &keydelta);
  1572. } else {
  1573. dev_info(&client->dev, "%s: Can't find %s touchkey!\n",
  1574. __func__, key_name);
  1575. return 0;
  1576. }
  1577. dev_info(&client->dev, "%s: %s touchkey delta read : %d\n",
  1578. __func__, key_name, (s16)keydelta);
  1579. /* check lock */
  1580. mutex_lock(&fdata->cmd_lock);
  1581. fdata->cmd_is_running = false;
  1582. fdata->cmd_state = CMD_STATUS_WAITING;
  1583. mutex_unlock(&fdata->cmd_lock);
  1584. return ((s16)keydelta > 0 ? (keydelta / 8) : 0);
  1585. }
  1586. static ssize_t touchkey_d_menu_show(struct device *dev,
  1587. struct device_attribute *attr, char *buf)
  1588. {
  1589. struct mxt_data *data = dev_get_drvdata(dev);
  1590. return sprintf(buf, "%d\n", touchkey_delta_show(data, "d_menu"));
  1591. }
  1592. static ssize_t touchkey_d_home1_show(struct device *dev,
  1593. struct device_attribute *attr, char *buf)
  1594. {
  1595. struct mxt_data *data = dev_get_drvdata(dev);
  1596. return sprintf(buf, "%d\n", touchkey_delta_show(data, "d_home1"));
  1597. }
  1598. static ssize_t touchkey_d_home2_show(struct device *dev,
  1599. struct device_attribute *attr, char *buf)
  1600. {
  1601. struct mxt_data *data = dev_get_drvdata(dev);
  1602. return sprintf(buf, "%d\n", touchkey_delta_show(data, "d_home2"));
  1603. }
  1604. static ssize_t touchkey_d_back_show(struct device *dev,
  1605. struct device_attribute *attr, char *buf)
  1606. {
  1607. struct mxt_data *data = dev_get_drvdata(dev);
  1608. return sprintf(buf, "%d\n", touchkey_delta_show(data, "d_back"));
  1609. }
  1610. #ifdef USE_MENU_TOUCHKEY
  1611. static ssize_t touchkey_menu_show(struct device *dev,
  1612. struct device_attribute *attr, char *buf)
  1613. {
  1614. struct mxt_data *data = dev_get_drvdata(dev);
  1615. return sprintf(buf, "%d\n", touchkey_delta_show(data, "menu"));
  1616. }
  1617. #else
  1618. static ssize_t touchkey_recent_show(struct device *dev,
  1619. struct device_attribute *attr, char *buf)
  1620. {
  1621. struct mxt_data *data = dev_get_drvdata(dev);
  1622. return sprintf(buf, "%d\n", touchkey_delta_show(data, "recent"));
  1623. }
  1624. #endif
  1625. static ssize_t touchkey_back_show(struct device *dev,
  1626. struct device_attribute *attr, char *buf)
  1627. {
  1628. struct mxt_data *data = dev_get_drvdata(dev);
  1629. return sprintf(buf, "%d\n", touchkey_delta_show(data, "back"));
  1630. }
  1631. static ssize_t get_touchkey_threshold(struct device *dev,
  1632. struct device_attribute *attr, char *buf)
  1633. {
  1634. struct mxt_data *data = dev_get_drvdata(dev);
  1635. u8 threshold;
  1636. int error;
  1637. error = mxt_read_object(data, MXT_TOUCH_KEYARRAY_T15, 7, &threshold);
  1638. if (error) {
  1639. printk(KERN_ERR "[TouchKey] Failed get the touchkey threshold\n");
  1640. return sprintf(buf, "0\n");
  1641. }
  1642. printk(KERN_DEBUG "[TouchKey] %s [%d]\n", __func__, threshold);
  1643. return sprintf(buf, "%d\n", threshold);
  1644. }
  1645. #ifdef CONFIG_LEDS_QPNP
  1646. extern void tkey_led_enables(int level);
  1647. #endif
  1648. static ssize_t touchkey_led_control(struct device *dev,
  1649. struct device_attribute *attr, const char *buf,
  1650. size_t size)
  1651. {
  1652. /*
  1653. struct mxt_data *data = dev_get_drvdata(dev);
  1654. */
  1655. int input;
  1656. int ret;
  1657. ret = sscanf(buf, "%d", &input);
  1658. if (ret != 1) {
  1659. printk(KERN_DEBUG "[TouchKey] %s, %d err\n",
  1660. __func__, __LINE__);
  1661. return size;
  1662. }
  1663. if (input != 0 && input != 1) {
  1664. printk(KERN_DEBUG "[TouchKey] %s wrong cmd %x\n",
  1665. __func__, input);
  1666. return size;
  1667. }
  1668. #ifdef CONFIG_LEDS_QPNP
  1669. tkey_led_enables(input);
  1670. #endif
  1671. /* control led */
  1672. /*
  1673. if (input == 1)
  1674. data->pdata->led_power_on();
  1675. else
  1676. data->pdata->led_power_off();
  1677. */
  1678. return size;
  1679. }
  1680. static ssize_t touchkey_report_dummy_key_show(struct device *dev,
  1681. struct device_attribute *attr, char *buf)
  1682. {
  1683. struct mxt_data *data = dev_get_drvdata(dev);
  1684. return sprintf(buf, "%s\n", data->report_dummy_key ? "True" : "False");
  1685. }
  1686. static ssize_t touchkey_report_dummy_key_store(struct device *dev,
  1687. struct device_attribute *attr, const char *buf,
  1688. size_t size)
  1689. {
  1690. struct mxt_data *data = dev_get_drvdata(dev);
  1691. int input;
  1692. int ret;
  1693. ret = sscanf(buf, "%d", &input);
  1694. if (ret != 1) {
  1695. dev_info(&data->client->dev, "%s: %d err\n",
  1696. __func__, ret);
  1697. return size;
  1698. }
  1699. if (input)
  1700. data->report_dummy_key = true;
  1701. else
  1702. data->report_dummy_key = false;
  1703. return size;
  1704. }
  1705. #if MXT_TKEY_BOOSTER
  1706. static ssize_t boost_level_store(struct device *dev,
  1707. struct device_attribute *attr,
  1708. const char *buf, size_t count)
  1709. {
  1710. struct mxt_data *data = dev_get_drvdata(dev);
  1711. int val, retval;
  1712. dev_info(&data->client->dev, "%s\n", __func__);
  1713. sscanf(buf, "%d", &val);
  1714. if (val != 1 && val != 2 && val != 0) {
  1715. dev_info(&data->client->dev,
  1716. "%s: wrong cmd %d\n", __func__, val);
  1717. return count;
  1718. }
  1719. data->tkey_dvfs_boost_mode = val;
  1720. dev_info(&data->client->dev,
  1721. "%s: tkey_dvfs_boost_mode = %d\n",
  1722. __func__, data->tkey_dvfs_boost_mode);
  1723. if (data->tkey_dvfs_boost_mode == DVFS_STAGE_DUAL) {
  1724. data->tkey_dvfs_freq = MIN_TOUCH_LIMIT_SECOND;
  1725. dev_info(&data->client->dev,
  1726. "%s: boost_mode DUAL, tkey_dvfs_freq = %d\n",
  1727. __func__, data->tkey_dvfs_freq);
  1728. } else if (data->tkey_dvfs_boost_mode == DVFS_STAGE_SINGLE) {
  1729. data->tkey_dvfs_freq = MIN_TOUCH_LIMIT;
  1730. dev_info(&data->client->dev,
  1731. "%s: boost_mode SINGLE, tkey_dvfs_freq = %d\n",
  1732. __func__, data->tkey_dvfs_freq);
  1733. } else if (data->tkey_dvfs_boost_mode == DVFS_STAGE_NONE) {
  1734. data->tkey_dvfs_freq = -1;
  1735. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  1736. if (retval < 0) {
  1737. dev_err(&data->client->dev,
  1738. "%s: booster stop failed(%d).\n",
  1739. __func__, retval);
  1740. data->tkey_dvfs_lock_status = false;
  1741. }
  1742. }
  1743. return count;
  1744. }
  1745. #endif
  1746. static DEVICE_ATTR(touchkey_d_menu, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_d_menu_show, NULL);
  1747. static DEVICE_ATTR(touchkey_d_home1, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_d_home1_show, NULL);
  1748. static DEVICE_ATTR(touchkey_d_home2, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_d_home2_show, NULL);
  1749. static DEVICE_ATTR(touchkey_d_back, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_d_back_show, NULL);
  1750. #ifdef USE_MENU_TOUCHKEY
  1751. static DEVICE_ATTR(touchkey_menu, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_menu_show, NULL);
  1752. #else
  1753. static DEVICE_ATTR(touchkey_recent, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_recent_show, NULL);
  1754. #endif
  1755. static DEVICE_ATTR(touchkey_back, S_IRUGO | S_IWUSR | S_IWGRP, touchkey_back_show, NULL);
  1756. static DEVICE_ATTR(touchkey_threshold, S_IRUGO | S_IWUSR | S_IWGRP, get_touchkey_threshold, NULL);
  1757. static DEVICE_ATTR(brightness, S_IRUGO | S_IWUSR | S_IWGRP, NULL, touchkey_led_control);
  1758. static DEVICE_ATTR(extra_button_event, S_IRUGO | S_IWUSR | S_IWGRP,
  1759. touchkey_report_dummy_key_show, touchkey_report_dummy_key_store);
  1760. #if MXT_TKEY_BOOSTER
  1761. static DEVICE_ATTR(boost_level, S_IWUSR | S_IWGRP, NULL, boost_level_store);
  1762. #endif
  1763. static struct attribute *touchkey_attributes[] = {
  1764. &dev_attr_touchkey_d_menu.attr,
  1765. &dev_attr_touchkey_d_home1.attr,
  1766. &dev_attr_touchkey_d_home2.attr,
  1767. &dev_attr_touchkey_d_back.attr,
  1768. #ifdef USE_MENU_TOUCHKEY
  1769. &dev_attr_touchkey_menu.attr,
  1770. #else
  1771. &dev_attr_touchkey_recent.attr,
  1772. #endif
  1773. &dev_attr_touchkey_back.attr,
  1774. &dev_attr_touchkey_threshold.attr,
  1775. &dev_attr_brightness.attr,
  1776. &dev_attr_extra_button_event.attr,
  1777. #if MXT_TKEY_BOOSTER
  1778. &dev_attr_boost_level.attr,
  1779. #endif
  1780. NULL,
  1781. };
  1782. static struct attribute_group touchkey_attr_group = {
  1783. .attrs = touchkey_attributes,
  1784. };
  1785. #endif
  1786. #endif /* TSP_SEC_FACTORY*/
  1787. #if TSP_USE_ATMELDBG
  1788. static int mxt_atmeldbg_read_block(struct i2c_client *client,
  1789. u16 addr, u16 length, u8 *value)
  1790. {
  1791. struct i2c_adapter *adapter = client->adapter;
  1792. struct i2c_msg msg[2];
  1793. __le16 le_addr;
  1794. struct mxt_data *data = i2c_get_clientdata(client);
  1795. struct mxt_object *object;
  1796. if (data == NULL) {
  1797. dev_err(&client->dev, "%s Data is Null\n", __func__);
  1798. return -EINVAL;
  1799. }
  1800. object = mxt_get_object(data, MXT_GEN_MESSAGEPROCESSOR_T5);
  1801. if ((data->atmeldbg.last_read_addr == addr) &&
  1802. (addr == object->start_address)) {
  1803. if (i2c_master_recv(client, value, length) == length) {
  1804. if (data->atmeldbg.display_log)
  1805. print_hex_dump(KERN_INFO, "MXT RX:",
  1806. DUMP_PREFIX_NONE, 16, 1,
  1807. value, length, false);
  1808. return 0;
  1809. } else
  1810. return -EIO;
  1811. } else {
  1812. data->atmeldbg.last_read_addr = addr;
  1813. }
  1814. le_addr = cpu_to_le16(addr);
  1815. msg[0].addr = client->addr;
  1816. msg[0].flags = 0x00;
  1817. msg[0].len = 2;
  1818. msg[0].buf = (u8 *) &le_addr;
  1819. msg[1].addr = client->addr;
  1820. msg[1].flags = I2C_M_RD;
  1821. msg[1].len = length;
  1822. msg[1].buf = (u8 *) value;
  1823. if (i2c_transfer(adapter, msg, 2) == 2) {
  1824. if (data->atmeldbg.display_log) {
  1825. print_hex_dump(KERN_INFO, "MXT TX:", DUMP_PREFIX_NONE,
  1826. 16, 1, msg[0].buf, msg[0].len, false);
  1827. print_hex_dump(KERN_INFO, "MXT RX:", DUMP_PREFIX_NONE,
  1828. 16, 1, msg[1].buf, msg[1].len, false);
  1829. }
  1830. return 0;
  1831. } else
  1832. return -EIO;
  1833. }
  1834. /* Writes a block of bytes (max 256) to given address in mXT chip. */
  1835. static int mxt_atmeldbg_write_block(struct i2c_client *client,
  1836. u16 addr, u16 length, u8 *value)
  1837. {
  1838. int i;
  1839. struct {
  1840. __le16 le_addr;
  1841. u8 data[256];
  1842. } i2c_block_transfer;
  1843. struct mxt_data *data = i2c_get_clientdata(client);
  1844. if (length > 256)
  1845. return -EINVAL;
  1846. if (data == NULL) {
  1847. dev_err(&client->dev, "%s Data is Null\n", __func__);
  1848. return -EINVAL;
  1849. }
  1850. data->atmeldbg.last_read_addr = -1;
  1851. for (i = 0; i < length; i++)
  1852. i2c_block_transfer.data[i] = *value++;
  1853. i2c_block_transfer.le_addr = cpu_to_le16(addr);
  1854. i = i2c_master_send(client, (u8 *) &i2c_block_transfer, length + 2);
  1855. if (i == (length + 2)) {
  1856. if (data->atmeldbg.display_log)
  1857. print_hex_dump(KERN_INFO, "MXT TX:", DUMP_PREFIX_NONE,
  1858. 16, 1, &i2c_block_transfer, length+2, false);
  1859. return length;
  1860. } else
  1861. return -EIO;
  1862. }
  1863. static ssize_t mem_atmeldbg_access_read(struct file *filp, struct kobject *kobj,
  1864. struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)
  1865. {
  1866. int ret = 0;
  1867. struct i2c_client *client =
  1868. to_i2c_client(container_of(kobj, struct device, kobj));
  1869. dev_info(&client->dev, "%s p=%p off=%lli c=%zi\n",
  1870. __func__, buf, off, count);
  1871. if (off >= 32768)
  1872. return -EIO;
  1873. if (off + count > 32768)
  1874. count = 32768 - off;
  1875. if (count > 256)
  1876. count = 256;
  1877. if (count > 0)
  1878. ret = mxt_atmeldbg_read_block(client, off, count, buf);
  1879. return ret >= 0 ? count : ret;
  1880. }
  1881. static ssize_t mem_atmeldbg_access_write(struct file *filp,
  1882. struct kobject *kobj, struct bin_attribute *bin_attr,
  1883. char *buf, loff_t off, size_t count)
  1884. {
  1885. int ret = 0;
  1886. struct i2c_client *client =
  1887. to_i2c_client(container_of(kobj, struct device, kobj));
  1888. dev_info(&client->dev, "%s p=%p off=%lli c=%zi\n",
  1889. __func__, buf, off, count);
  1890. if (off >= 32768)
  1891. return -EIO;
  1892. if (off + count > 32768)
  1893. count = 32768 - off;
  1894. if (count > 256)
  1895. count = 256;
  1896. if (count > 0)
  1897. ret = mxt_atmeldbg_write_block(client, off, count, buf);
  1898. return ret >= 0 ? count : 0;
  1899. }
  1900. static ssize_t mxt_atmeldbg_pause_driver_show(struct device *dev,
  1901. struct device_attribute *attr, char *buf)
  1902. {
  1903. struct mxt_data *data = dev_get_drvdata(dev);
  1904. int count = 0;
  1905. count += sprintf(buf + count, "%d", data->atmeldbg.stop_sync);
  1906. count += sprintf(buf + count, "\n");
  1907. return count;
  1908. }
  1909. static ssize_t mxt_atmeldbg_pause_driver_store(struct device *dev,
  1910. struct device_attribute *attr, const char *buf, size_t count)
  1911. {
  1912. struct mxt_data *data = dev_get_drvdata(dev);
  1913. struct i2c_client *client = data->client;
  1914. int i;
  1915. if (sscanf(buf, "%u", &i) == 1 && i < 2) {
  1916. data->atmeldbg.stop_sync = i;
  1917. dev_info(&client->dev, "%s input sync for Atmel dbug App\n",
  1918. i ? "Stop" : "Start");
  1919. } else {
  1920. dev_info(&client->dev, "Error %s\n", __func__);
  1921. }
  1922. return count;
  1923. }
  1924. static ssize_t mxt_atmeldbg_debug_enable_show(struct device *dev,
  1925. struct device_attribute *attr, char *buf)
  1926. {
  1927. struct mxt_data *data = dev_get_drvdata(dev);
  1928. int count = 0;
  1929. count += sprintf(buf + count, "%d", data->atmeldbg.display_log);
  1930. count += sprintf(buf + count, "\n");
  1931. return count;
  1932. }
  1933. static ssize_t mxt_atmeldbg_debug_enable_store(struct device *dev,
  1934. struct device_attribute *attr, const char *buf, size_t count)
  1935. {
  1936. struct mxt_data *data = dev_get_drvdata(dev);
  1937. struct i2c_client *client = data->client;
  1938. int i;
  1939. if (sscanf(buf, "%u", &i) == 1 && i < 2) {
  1940. data->atmeldbg.display_log = i;
  1941. if (i)
  1942. dmesg_restrict = 0;
  1943. else
  1944. dmesg_restrict = 1;
  1945. dev_info(&client->dev, "%s, dmsesg_restricted :%d\n",
  1946. i ? "debug enabled" : "debug disabled", dmesg_restrict);
  1947. dev_info(&client->dev, "%s raw data message for Atmel debug App\n",
  1948. i ? "Display" : "Undisplay");
  1949. } else {
  1950. dev_info(&client->dev, "Error %s\n", __func__);
  1951. }
  1952. return count;
  1953. }
  1954. static ssize_t mxt_atmeldbg_command_off_store(struct device *dev,
  1955. struct device_attribute *attr, const char *buf, size_t count)
  1956. {
  1957. struct mxt_data *data = dev_get_drvdata(dev);
  1958. struct i2c_client *client = data->client;
  1959. int i;
  1960. if (sscanf(buf, "%u", &i) == 1 && i < 2) {
  1961. data->atmeldbg.block_access = i;
  1962. if (data->atmeldbg.block_access)
  1963. disable_irq(client->irq);
  1964. else
  1965. enable_irq(client->irq);
  1966. dev_info(&client->dev, "%s host driver access IC for Atmel dbug App\n",
  1967. i ? "Stop" : "Start");
  1968. } else
  1969. dev_info(&client->dev, "Error %s\n", __func__);
  1970. return count;
  1971. }
  1972. static ssize_t mxt_atmeldbg_cmd_calibrate_store(struct device *dev,
  1973. struct device_attribute *attr, const char *buf, size_t count)
  1974. {
  1975. struct mxt_data *data = dev_get_drvdata(dev);
  1976. int ret;
  1977. /* send calibration command to the chip */
  1978. ret = mxt_write_object(data, MXT_GEN_COMMANDPROCESSOR_T6,
  1979. MXT_COMMAND_CALIBRATE, 1);
  1980. return (ret < 0) ? ret : count;
  1981. }
  1982. static ssize_t mxt_atmeldbg_cmd_reset_store(struct device *dev,
  1983. struct device_attribute *attr, const char *buf, size_t count)
  1984. {
  1985. struct mxt_data *data = dev_get_drvdata(dev);
  1986. int ret;
  1987. /* send reset command to the chip */
  1988. ret = mxt_write_object(data, MXT_GEN_COMMANDPROCESSOR_T6,
  1989. MXT_COMMAND_RESET, MXT_RESET_VALUE);
  1990. return (ret < 0) ? ret : count;
  1991. }
  1992. static ssize_t mxt_atmeldbg_cmd_backup_store(struct device *dev,
  1993. struct device_attribute *attr, const char *buf, size_t count)
  1994. {
  1995. struct mxt_data *data = dev_get_drvdata(dev);
  1996. int ret;
  1997. /* send backup command to the chip */
  1998. ret = mxt_write_object(data, MXT_GEN_COMMANDPROCESSOR_T6,
  1999. MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE);
  2000. return (ret < 0) ? ret : count;
  2001. }
  2002. #endif
  2003. static ssize_t mxt_object_setting(struct device *dev,
  2004. struct device_attribute *attr,
  2005. const char *buf, size_t count)
  2006. {
  2007. struct mxt_data *data = dev_get_drvdata(dev);
  2008. struct i2c_client *client = data->client;
  2009. unsigned int type;
  2010. unsigned int offset;
  2011. unsigned int value;
  2012. u8 val;
  2013. int ret;
  2014. sscanf(buf, "%u%u%u", &type, &offset, &value);
  2015. dev_info(&client->dev, "object type T%d", type);
  2016. dev_info(&client->dev, "data offset %d\n", offset);
  2017. dev_info(&client->dev, "data value %d\n", value);
  2018. ret = mxt_write_object(data,
  2019. (u8)type, (u8)offset, (u8)value);
  2020. if (ret) {
  2021. dev_err(&client->dev, "fail to write T%d index:%d, value:%d\n",
  2022. type, offset, value);
  2023. goto out;
  2024. } else {
  2025. ret = mxt_read_object(data,
  2026. (u8)type, (u8)offset, &val);
  2027. if (ret) {
  2028. dev_err(&client->dev, "fail to read T%d\n",
  2029. type);
  2030. goto out;
  2031. } else
  2032. dev_info(&client->dev, "T%d Byte%d is %d\n",
  2033. type, offset, val);
  2034. }
  2035. out:
  2036. return count;
  2037. }
  2038. static ssize_t mxt_object_show(struct device *dev,
  2039. struct device_attribute *attr,
  2040. const char *buf, size_t count)
  2041. {
  2042. struct mxt_data *data = dev_get_drvdata(dev);
  2043. struct i2c_client *client = data->client;
  2044. struct mxt_object *object;
  2045. unsigned int type;
  2046. u8 val;
  2047. u16 i;
  2048. sscanf(buf, "%u", &type);
  2049. dev_info(&client->dev, "object type T%d\n", type);
  2050. object = mxt_get_object(data, type);
  2051. if (!object) {
  2052. dev_err(&client->dev, "fail to get object_info\n");
  2053. return -EINVAL;
  2054. } else {
  2055. for (i = 0; i < object->size; i++) {
  2056. mxt_read_mem(data, object->start_address + i,
  2057. 1, &val);
  2058. dev_info(&client->dev, "Byte %u --> %u\n", i, val);
  2059. }
  2060. }
  2061. return count;
  2062. }
  2063. #if TSP_USE_ATMELDBG
  2064. /* Functions for mem_access interface */
  2065. static struct bin_attribute mem_access_attr;
  2066. /* Sysfs files for libmaxtouch interface */
  2067. static DEVICE_ATTR(pause_driver, S_IRUGO | S_IWUSR | S_IWGRP,
  2068. mxt_atmeldbg_pause_driver_show, mxt_atmeldbg_pause_driver_store);
  2069. static DEVICE_ATTR(debug_enable, S_IRUGO | S_IWUSR | S_IWGRP,
  2070. mxt_atmeldbg_debug_enable_show, mxt_atmeldbg_debug_enable_store);
  2071. static DEVICE_ATTR(command_calibrate, S_IRUGO | S_IWUSR | S_IWGRP,
  2072. NULL, mxt_atmeldbg_cmd_calibrate_store);
  2073. static DEVICE_ATTR(command_reset, S_IRUGO | S_IWUSR | S_IWGRP,
  2074. NULL, mxt_atmeldbg_cmd_reset_store);
  2075. static DEVICE_ATTR(command_backup, S_IRUGO | S_IWUSR | S_IWGRP,
  2076. NULL, mxt_atmeldbg_cmd_backup_store);
  2077. static DEVICE_ATTR(command_off, S_IRUGO | S_IWUSR | S_IWGRP,
  2078. NULL, mxt_atmeldbg_command_off_store);
  2079. #endif
  2080. static DEVICE_ATTR(object_show, S_IWUSR | S_IWGRP, NULL,
  2081. mxt_object_show);
  2082. static DEVICE_ATTR(object_write, S_IWUSR | S_IWGRP, NULL,
  2083. mxt_object_setting);
  2084. static struct attribute *libmaxtouch_attributes[] = {
  2085. #if TSP_USE_ATMELDBG
  2086. &dev_attr_pause_driver.attr,
  2087. &dev_attr_debug_enable.attr,
  2088. &dev_attr_command_calibrate.attr,
  2089. &dev_attr_command_reset.attr,
  2090. &dev_attr_command_backup.attr,
  2091. &dev_attr_command_off.attr,
  2092. #endif
  2093. &dev_attr_object_show.attr,
  2094. &dev_attr_object_write.attr,
  2095. NULL,
  2096. };
  2097. static struct attribute_group libmaxtouch_attr_group = {
  2098. .attrs = libmaxtouch_attributes,
  2099. };
  2100. #if TSP_SEC_FACTORY
  2101. static void mxt_deallocate_factory(struct mxt_data *data)
  2102. {
  2103. struct mxt_fac_data *fdata = data->fdata;
  2104. kfree(fdata->delta);
  2105. kfree(fdata->reference);
  2106. kfree(fdata);
  2107. }
  2108. static int mxt_allocate_factory(struct mxt_data *data)
  2109. {
  2110. const struct mxt_platform_data *pdata = data->pdata;
  2111. struct mxt_fac_data *fdata = NULL;
  2112. struct device *dev = &data->client->dev;
  2113. int error = 0;
  2114. int i;
  2115. fdata = kzalloc(sizeof(struct mxt_fac_data), GFP_KERNEL);
  2116. if (fdata == NULL) {
  2117. dev_err(dev, "Fail to allocate sysfs data.\n");
  2118. return -ENOMEM;
  2119. }
  2120. if (!pdata->num_xnode || !pdata->num_ynode) {
  2121. dev_err(dev, "%s num of x,y is 0\n", __func__);
  2122. error = -EINVAL;
  2123. goto err_get_num_node;
  2124. }
  2125. fdata->num_xnode = pdata->num_xnode;
  2126. fdata->num_ynode = pdata->num_ynode;
  2127. fdata->num_nodes = fdata->num_xnode * fdata->num_ynode;
  2128. #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
  2129. dev_info(dev, "%s: x=%d, y=%d, total=%d\n",
  2130. __func__, fdata->num_xnode,
  2131. fdata->num_ynode, fdata->num_nodes);
  2132. #endif
  2133. fdata->reference = kzalloc(fdata->num_nodes * sizeof(u16),
  2134. GFP_KERNEL);
  2135. if (!fdata->reference) {
  2136. dev_err(dev, "Fail to alloc reference of fdata\n");
  2137. error = -ENOMEM;
  2138. goto err_alloc_reference;
  2139. }
  2140. fdata->delta = kzalloc(fdata->num_nodes * sizeof(s16), GFP_KERNEL);
  2141. if (!fdata->delta) {
  2142. dev_err(dev, "Fail to alloc delta of fdata\n");
  2143. error = -ENOMEM;
  2144. goto err_alloc_delta;
  2145. }
  2146. INIT_LIST_HEAD(&fdata->cmd_list_head);
  2147. for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++)
  2148. list_add_tail(&tsp_cmds[i].list, &fdata->cmd_list_head);
  2149. mutex_init(&fdata->cmd_lock);
  2150. fdata->cmd_is_running = false;
  2151. data->fdata = fdata;
  2152. return error;
  2153. err_alloc_delta:
  2154. kfree(fdata->reference);
  2155. err_alloc_reference:
  2156. err_get_num_node:
  2157. kfree(fdata);
  2158. return error;
  2159. }
  2160. static int mxt_init_factory(struct mxt_data *data)
  2161. {
  2162. struct device *dev = &data->client->dev;
  2163. int error;
  2164. error = mxt_allocate_factory(data);
  2165. if (error)
  2166. return -ENOMEM;
  2167. data->fdata->fac_dev_ts = device_create(sec_class,
  2168. NULL, 0, data, "tsp");
  2169. if (IS_ERR(data->fdata->fac_dev_ts)) {
  2170. dev_err(dev, "Failed to create device for the sysfs\n");
  2171. error = IS_ERR(data->fdata->fac_dev_ts);
  2172. goto err_create_device;
  2173. }
  2174. error = sysfs_create_group(&data->fdata->fac_dev_ts->kobj,
  2175. &touchscreen_factory_attr_group);
  2176. if (error) {
  2177. dev_err(dev, "Failed to create touchscreen sysfs group\n");
  2178. goto err_create_group;
  2179. }
  2180. error = sysfs_create_link(&data->fdata->fac_dev_ts->kobj,
  2181. &data->input_dev->dev.kobj, "input");
  2182. if (error < 0) {
  2183. dev_err(dev, "%s: Failed to create input symbolic link\n",
  2184. __func__);
  2185. }
  2186. return 0;
  2187. err_create_group:
  2188. err_create_device:
  2189. mxt_deallocate_factory(data);
  2190. return error;
  2191. }
  2192. #if ENABLE_TOUCH_KEY
  2193. static int mxt_sysfs_init_for_touchkeyled(struct mxt_data *data)
  2194. {
  2195. struct device *dev = &data->client->dev;
  2196. int error;
  2197. data->fdata->touchkey_dev_ts = device_create(sec_class,
  2198. NULL, 0, data, "sec_touchkey");
  2199. if (IS_ERR(data->fdata->touchkey_dev_ts)) {
  2200. dev_err(dev, "Failed to create device for the sysfs\n");
  2201. error = IS_ERR(data->fdata->touchkey_dev_ts);
  2202. return 0;
  2203. }
  2204. error = sysfs_create_group(&data->fdata->touchkey_dev_ts->kobj,
  2205. &touchkey_attr_group);
  2206. if (error)
  2207. dev_err(dev, "Failed to create touchscreen sysfs group\n");
  2208. return 0;
  2209. }
  2210. #endif
  2211. static void mxt_exit_factory(struct mxt_data *data)
  2212. {
  2213. struct mxt_fac_data *fdata = data->fdata;
  2214. sysfs_remove_group(&fdata->fac_dev_ts->kobj,
  2215. &touchscreen_factory_attr_group);
  2216. mxt_deallocate_factory(data);
  2217. }
  2218. #endif
  2219. #if TSP_USE_ATMELDBG
  2220. static int __devinit mxt_sysfs_init_for_ATMELDBG(struct mxt_data *data)
  2221. {
  2222. struct i2c_client *client = data->client;
  2223. sysfs_bin_attr_init(&mem_access_attr);
  2224. mem_access_attr.attr.name = "mem_access";
  2225. mem_access_attr.attr.mode = S_IRUGO | S_IWUSR | S_IWGRP;
  2226. mem_access_attr.read = mem_atmeldbg_access_read;
  2227. mem_access_attr.write = mem_atmeldbg_access_write;
  2228. mem_access_attr.size = 65535;
  2229. data->atmeldbg.display_log = 0;
  2230. if (sysfs_create_bin_file(&client->dev.kobj, &mem_access_attr) < 0) {
  2231. dev_err(&client->dev, "Failed to create device file(%s)!\n",
  2232. mem_access_attr.attr.name);
  2233. return -EINVAL;
  2234. }
  2235. return 0;
  2236. }
  2237. #endif
  2238. extern struct class *sec_class;
  2239. static ssize_t set_tsp_for_inputmethod_show(struct device *dev,
  2240. struct device_attribute *attr, char *buf);
  2241. static ssize_t set_tsp_for_inputmethod_store(struct device *dev,
  2242. struct device_attribute *attr, const char *buf, size_t size);
  2243. static int __devinit mxt_sysfs_init(struct i2c_client *client)
  2244. {
  2245. struct mxt_data *data = i2c_get_clientdata(client);
  2246. int error;
  2247. struct device *sec_touchscreen;
  2248. error = sysfs_create_group(&client->dev.kobj, &libmaxtouch_attr_group);
  2249. if (error) {
  2250. dev_err(&client->dev, "Failed to create libmaxtouch sysfs group\n");
  2251. return -EINVAL;
  2252. }
  2253. sec_touchscreen = device_create(sec_class, NULL, 0, data, "sec_touchscreen");
  2254. if (IS_ERR(sec_touchscreen))
  2255. dev_err(&client->dev,
  2256. "%s: Failed to create device(sec_touchscreen)!\n",
  2257. __func__);
  2258. if (device_create_file(sec_touchscreen, &dev_attr_set_tsp_for_inputmethod) < 0)
  2259. dev_err(&client->dev,
  2260. "%s: Failed to create device file(%s)\n",
  2261. __func__, dev_attr_set_tsp_for_inputmethod.attr.name);
  2262. #if TSP_USE_ATMELDBG
  2263. error = mxt_sysfs_init_for_ATMELDBG(data);
  2264. #endif
  2265. if (error)
  2266. goto err_sysfs_init_for_ATMELDBG;
  2267. #if TSP_SEC_FACTORY
  2268. error = mxt_init_factory(data);
  2269. #endif
  2270. if (error)
  2271. goto err_mxt_init_factory;
  2272. #if ENABLE_TOUCH_KEY
  2273. mxt_sysfs_init_for_touchkeyled(data);
  2274. #endif
  2275. return 0;
  2276. err_mxt_init_factory:
  2277. #if TSP_USE_ATMELDBG
  2278. sysfs_remove_bin_file(&client->dev.kobj, &mem_access_attr);
  2279. #endif
  2280. err_sysfs_init_for_ATMELDBG:
  2281. sysfs_remove_group(&client->dev.kobj, &libmaxtouch_attr_group);
  2282. return error;
  2283. }
  2284. static void mxt_sysfs_remove(struct mxt_data *data)
  2285. {
  2286. sysfs_remove_group(&data->client->dev.kobj, &libmaxtouch_attr_group);
  2287. #if TSP_USE_ATMELDBG
  2288. sysfs_remove_bin_file(&data->client->dev.kobj, &mem_access_attr);
  2289. #endif
  2290. #if TSP_SEC_FACTORY
  2291. mxt_exit_factory(data);
  2292. #endif
  2293. }
  2294. #if TSP_BOOSTER
  2295. static void mxt_change_dvfs_lock(struct work_struct *work)
  2296. {
  2297. struct mxt_data *data =
  2298. container_of(work,
  2299. struct mxt_data, work_dvfs_chg.work);
  2300. int ret = 0;
  2301. mutex_lock(&data->dvfs_lock);
  2302. if (data->dvfs_boost_mode == DVFS_STAGE_DUAL) {
  2303. if (!data->mxt_enabled) {
  2304. dev_info(&data->client->dev,
  2305. "%s: mxt is disabled.\n", __func__);
  2306. return;
  2307. } else {
  2308. ret = set_freq_limit(DVFS_TOUCH_ID,
  2309. MIN_TOUCH_LIMIT_SECOND);
  2310. data->dvfs_freq = MIN_TOUCH_LIMIT_SECOND;
  2311. }
  2312. } else if (data->dvfs_boost_mode == DVFS_STAGE_NINTH) {
  2313. if (!data->mxt_enabled) {
  2314. dev_info(&data->client->dev,
  2315. "%s: mxt is disabled.\n", __func__);
  2316. return;
  2317. } else {
  2318. ret = set_freq_limit(DVFS_TOUCH_ID,
  2319. MIN_TOUCH_LIMIT);
  2320. data->dvfs_freq = MIN_TOUCH_LIMIT;
  2321. }
  2322. } else if (data->dvfs_boost_mode == DVFS_STAGE_SINGLE ||
  2323. data->dvfs_boost_mode == DVFS_STAGE_TRIPLE) {
  2324. ret = set_freq_limit(DVFS_TOUCH_ID, -1);
  2325. data->dvfs_freq = -1;
  2326. }
  2327. if (ret < 0)
  2328. dev_err(&data->client->dev,
  2329. "%s: booster change failed(%d).\n",
  2330. __func__, ret);
  2331. mutex_unlock(&data->dvfs_lock);
  2332. }
  2333. static void mxt_set_dvfs_off(struct work_struct *work)
  2334. {
  2335. struct mxt_data *data =
  2336. container_of(work,
  2337. struct mxt_data, work_dvfs_off.work);
  2338. int ret;
  2339. if (!data->mxt_enabled) {
  2340. dev_info(&data->client->dev,
  2341. "%s: mxt is disabled.\n", __func__);
  2342. } else {
  2343. mutex_lock(&data->dvfs_lock);
  2344. ret = set_freq_limit(DVFS_TOUCH_ID, -1);
  2345. data->dvfs_freq = -1;
  2346. if (ret < 0)
  2347. dev_err(&data->client->dev,
  2348. "%s: booster stop failed(%d).\n",
  2349. __func__, ret);
  2350. data->dvfs_lock_status = false;
  2351. mutex_unlock(&data->dvfs_lock);
  2352. }
  2353. }
  2354. void mxt_set_dvfs_lock(struct mxt_data *data, int on)
  2355. {
  2356. int ret = 0;
  2357. if (data->dvfs_boost_mode == DVFS_STAGE_NONE) {
  2358. dev_info(&data->client->dev,
  2359. "%s: DVFS stage is none(%d)\n",
  2360. __func__, data->dvfs_boost_mode);
  2361. return;
  2362. }
  2363. mutex_lock(&data->dvfs_lock);
  2364. if (on == 0) {
  2365. if (data->dvfs_lock_status) {
  2366. if (data->dvfs_boost_mode == DVFS_STAGE_NINTH)
  2367. schedule_delayed_work(&data->work_dvfs_off,
  2368. msecs_to_jiffies(TOUCH_BOOSTER_HIGH_OFF_TIME));
  2369. else
  2370. schedule_delayed_work(&data->work_dvfs_off,
  2371. msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME));
  2372. }
  2373. } else if (on > 0) {
  2374. cancel_delayed_work(&data->work_dvfs_off);
  2375. if ((!data->dvfs_lock_status) || (data->dvfs_old_stauts < on)) {
  2376. cancel_delayed_work(&data->work_dvfs_chg);
  2377. if ((data->dvfs_freq != MIN_TOUCH_LIMIT) &&
  2378. (data->dvfs_boost_mode != DVFS_STAGE_NINTH)) {
  2379. if (data->dvfs_boost_mode == DVFS_STAGE_TRIPLE)
  2380. ret = set_freq_limit(DVFS_TOUCH_ID,
  2381. MIN_TOUCH_LIMIT_SECOND);
  2382. else
  2383. ret = set_freq_limit(DVFS_TOUCH_ID,
  2384. MIN_TOUCH_LIMIT);
  2385. data->dvfs_freq = MIN_TOUCH_LIMIT;
  2386. if (ret < 0)
  2387. dev_err(&data->client->dev,
  2388. "%s: cpu first lock failed(%d)\n",
  2389. __func__, ret);
  2390. }
  2391. else if ((data->dvfs_freq != MIN_TOUCH_LIMIT) &&
  2392. (data->dvfs_boost_mode == DVFS_STAGE_NINTH)) {
  2393. ret = set_freq_limit(DVFS_TOUCH_ID,
  2394. MIN_TOUCH_HIGH_LIMIT);
  2395. data->dvfs_freq = MIN_TOUCH_HIGH_LIMIT;
  2396. if (ret < 0)
  2397. dev_err(&data->client->dev,
  2398. "%s: cpu first lock failed(%d)\n",
  2399. __func__, ret);
  2400. }
  2401. if (data->dvfs_boost_mode == DVFS_STAGE_NINTH)
  2402. schedule_delayed_work(&data->work_dvfs_chg,
  2403. msecs_to_jiffies(TOUCH_BOOSTER_HIGH_CHG_TIME));
  2404. else
  2405. schedule_delayed_work(&data->work_dvfs_chg,
  2406. msecs_to_jiffies(TOUCH_BOOSTER_CHG_TIME));
  2407. data->dvfs_lock_status = true;
  2408. }
  2409. } else if (on < 0) {
  2410. if (data->dvfs_lock_status) {
  2411. cancel_delayed_work(&data->work_dvfs_off);
  2412. cancel_delayed_work(&data->work_dvfs_chg);
  2413. schedule_work(&data->work_dvfs_off.work);
  2414. }
  2415. }
  2416. data->dvfs_old_stauts = on;
  2417. mutex_unlock(&data->dvfs_lock);
  2418. }
  2419. void mxt_init_dvfs(struct mxt_data *data)
  2420. {
  2421. mutex_init(&data->dvfs_lock);
  2422. data->dvfs_boost_mode = DVFS_STAGE_DUAL;
  2423. INIT_DELAYED_WORK(&data->work_dvfs_off, mxt_set_dvfs_off);
  2424. INIT_DELAYED_WORK(&data->work_dvfs_chg, mxt_change_dvfs_lock);
  2425. data->dvfs_lock_status = false;
  2426. }
  2427. #endif
  2428. #if MXT_TKEY_BOOSTER
  2429. static void mxt_tkey_change_dvfs_lock(struct work_struct *work)
  2430. {
  2431. struct mxt_data *data =
  2432. container_of(work,
  2433. struct mxt_data, work_tkey_dvfs_chg.work);
  2434. int retval = 0;
  2435. mutex_lock(&data->tkey_dvfs_lock);
  2436. retval = set_freq_limit(DVFS_TOUCH_ID, data->tkey_dvfs_freq);
  2437. if (retval < 0)
  2438. dev_info(&data->client->dev,
  2439. "%s: booster change failed(%d).\n",
  2440. __func__, retval);
  2441. data->tkey_dvfs_lock_status = false;
  2442. mutex_unlock(&data->tkey_dvfs_lock);
  2443. }
  2444. static void mxt_tkey_set_dvfs_off(struct work_struct *work)
  2445. {
  2446. struct mxt_data *data =
  2447. container_of(work,
  2448. struct mxt_data, work_tkey_dvfs_off.work);
  2449. int retval;
  2450. mutex_lock(&data->tkey_dvfs_lock);
  2451. retval = set_freq_limit(DVFS_TOUCH_ID, -1);
  2452. if (retval < 0)
  2453. dev_info(&data->client->dev,
  2454. "%s: booster stop failed(%d).\n",
  2455. __func__, retval);
  2456. data->tkey_dvfs_lock_status = true;
  2457. mutex_unlock(&data->tkey_dvfs_lock);
  2458. }
  2459. void mxt_tkey_set_dvfs_lock(struct mxt_data *data, int on)
  2460. {
  2461. int ret = 0;
  2462. if (data->tkey_dvfs_boost_mode == DVFS_STAGE_NONE) {
  2463. dev_dbg(&data->client->dev,
  2464. "%s: DVFS stage is none(%d)\n",
  2465. __func__, data->tkey_dvfs_boost_mode);
  2466. return;
  2467. }
  2468. mutex_lock(&data->tkey_dvfs_lock);
  2469. if (on == 0) {
  2470. cancel_delayed_work(&data->work_tkey_dvfs_chg);
  2471. if (data->tkey_dvfs_lock_status) {
  2472. ret = set_freq_limit(DVFS_TOUCH_ID, data->tkey_dvfs_freq);
  2473. if (ret < 0)
  2474. dev_info(&data->client->dev,
  2475. "%s: cpu first lock failed(%d)\n", __func__, ret);
  2476. data->tkey_dvfs_lock_status = false;
  2477. }
  2478. schedule_delayed_work(&data->work_tkey_dvfs_off,
  2479. msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME));
  2480. } else if (on == 1) {
  2481. cancel_delayed_work(&data->work_tkey_dvfs_off);
  2482. schedule_delayed_work(&data->work_tkey_dvfs_chg,
  2483. msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME));
  2484. } else if (on == 2) {
  2485. if (data->tkey_dvfs_lock_status) {
  2486. cancel_delayed_work(&data->work_tkey_dvfs_off);
  2487. cancel_delayed_work(&data->work_tkey_dvfs_chg);
  2488. schedule_work(&data->work_tkey_dvfs_off.work);
  2489. }
  2490. }
  2491. mutex_unlock(&data->tkey_dvfs_lock);
  2492. }
  2493. void mxt_tkey_init_dvfs(struct mxt_data *data)
  2494. {
  2495. mutex_init(&data->tkey_dvfs_lock);
  2496. data->tkey_dvfs_boost_mode = DVFS_STAGE_DUAL;
  2497. data->tkey_dvfs_freq = MIN_TOUCH_LIMIT_SECOND;
  2498. INIT_DELAYED_WORK(&data->work_tkey_dvfs_off, mxt_tkey_set_dvfs_off);
  2499. INIT_DELAYED_WORK(&data->work_tkey_dvfs_chg, mxt_tkey_change_dvfs_lock);
  2500. data->tkey_dvfs_lock_status = true;
  2501. }
  2502. #endif