sec_input.c 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2020 Samsung Electronics Co., Ltd.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include "sec_input.h"
  10. static char *lcd_id;
  11. module_param(lcd_id, charp, 0444);
  12. static char *lcd_id1;
  13. module_param(lcd_id1, charp, 0444);
  14. struct device *ptsp;
  15. EXPORT_SYMBOL(ptsp);
  16. struct sec_ts_secure_data *psecuretsp;
  17. EXPORT_SYMBOL(psecuretsp);
  18. void sec_input_utc_marker(struct device *dev, const char *annotation)
  19. {
  20. struct timespec64 ts;
  21. struct rtc_time tm;
  22. ktime_get_real_ts64(&ts);
  23. rtc_time64_to_tm(ts.tv_sec, &tm);
  24. input_info(true, dev, "%s %d-%02d-%02d %02d:%02d:%02d.%09lu UTC\n",
  25. annotation, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  26. tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
  27. }
  28. bool sec_input_cmp_ic_status(struct device *dev, int check_bit)
  29. {
  30. struct sec_ts_plat_data *plat_data = dev->platform_data;
  31. if (MODE_TO_CHECK_BIT(atomic_read(&plat_data->power_state)) & check_bit)
  32. return true;
  33. return false;
  34. }
  35. EXPORT_SYMBOL(sec_input_cmp_ic_status);
  36. bool sec_input_need_ic_off(struct sec_ts_plat_data *pdata)
  37. {
  38. bool lpm = pdata->lowpower_mode || pdata->ed_enable || pdata->pocket_mode || pdata->fod_lp_mode || pdata->support_always_on;
  39. return (sec_input_need_fold_off(pdata->multi_dev) || !lpm);
  40. }
  41. EXPORT_SYMBOL(sec_input_need_ic_off);
  42. bool sec_check_secure_trusted_mode_status(struct sec_ts_plat_data *pdata)
  43. {
  44. #if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH)
  45. if (atomic_read(&pdata->secure_enabled) == SECURE_TOUCH_ENABLE) {
  46. input_err(true, pdata->dev, "%s: secure touch enabled\n", __func__);
  47. return true;
  48. }
  49. #if IS_ENABLED(CONFIG_INPUT_SEC_TRUSTED_TOUCH)
  50. if (!IS_ERR_OR_NULL(pdata->pvm)) {
  51. if (atomic_read(&pdata->pvm->trusted_touch_enabled) != 0) {
  52. input_err(true, pdata->dev, "%s: TVM is enabled\n", __func__);
  53. return true;
  54. }
  55. }
  56. #endif
  57. #endif
  58. return false;
  59. }
  60. EXPORT_SYMBOL(sec_check_secure_trusted_mode_status);
  61. static int sec_input_lcd_parse_panel_id(char *panel_id)
  62. {
  63. char *pt;
  64. int lcd_id_p = 0;
  65. if (IS_ERR_OR_NULL(panel_id))
  66. return lcd_id_p;
  67. for (pt = panel_id; *pt != 0; pt++) {
  68. lcd_id_p <<= 4;
  69. switch (*pt) {
  70. case '0' ... '9':
  71. lcd_id_p += *pt - '0';
  72. break;
  73. case 'a' ... 'f':
  74. lcd_id_p += 10 + *pt - 'a';
  75. break;
  76. case 'A' ... 'F':
  77. lcd_id_p += 10 + *pt - 'A';
  78. break;
  79. }
  80. }
  81. return lcd_id_p;
  82. }
  83. int sec_input_get_lcd_id(struct device *dev)
  84. {
  85. #if !IS_ENABLED(CONFIG_SMCDSD_PANEL)
  86. int lcdtype = 0;
  87. #endif
  88. #if IS_ENABLED(CONFIG_EXYNOS_DPU30) || IS_ENABLED(CONFIG_MCD_PANEL) || IS_ENABLED(CONFIG_USDM_PANEL)
  89. int connected;
  90. #endif
  91. int lcd_id_param = 0;
  92. int dev_id;
  93. #if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG)
  94. lcdtype = get_lcd_attached("GET");
  95. if (lcdtype == 0xFFFFFF) {
  96. input_err(true, dev, "%s: lcd is not attached(GET)\n", __func__);
  97. return -ENODEV;
  98. }
  99. #endif
  100. #if IS_ENABLED(CONFIG_EXYNOS_DPU30) || IS_ENABLED(CONFIG_MCD_PANEL) || IS_ENABLED(CONFIG_USDM_PANEL)
  101. connected = get_lcd_info("connected");
  102. if (connected < 0) {
  103. input_err(true, dev, "%s: Failed to get lcd info(connected)\n", __func__);
  104. return -EINVAL;
  105. }
  106. if (!connected) {
  107. input_err(true, dev, "%s: lcd is disconnected(connected)\n", __func__);
  108. return -ENODEV;
  109. }
  110. input_info(true, dev, "%s: lcd is connected\n", __func__);
  111. lcdtype = get_lcd_info("id");
  112. if (lcdtype < 0) {
  113. input_err(true, dev, "%s: Failed to get lcd info(id)\n", __func__);
  114. return -EINVAL;
  115. }
  116. #endif
  117. #if IS_ENABLED(CONFIG_SMCDSD_PANEL)
  118. if (!lcdtype) {
  119. input_err(true, dev, "%s: lcd is disconnected(lcdtype)\n", __func__);
  120. return -ENODEV;
  121. }
  122. #endif
  123. dev_id = sec_input_multi_device_parse_dt(dev);
  124. input_info(true, dev, "%s: foldable %s\n", __func__, GET_FOLD_STR(dev_id));
  125. if (dev_id == MULTI_DEV_SUB)
  126. lcd_id_param = sec_input_lcd_parse_panel_id(lcd_id1);
  127. else
  128. lcd_id_param = sec_input_lcd_parse_panel_id(lcd_id);
  129. if (lcdtype <= 0 && lcd_id_param != 0) {
  130. lcdtype = lcd_id_param;
  131. if (lcdtype == 0xFFFFFF) {
  132. input_err(true, dev, "%s: lcd is not attached(PARAM)\n", __func__);
  133. return -ENODEV;
  134. }
  135. }
  136. input_info(true, dev, "%s: lcdtype 0x%08X\n", __func__, lcdtype);
  137. return lcdtype;
  138. }
  139. EXPORT_SYMBOL(sec_input_get_lcd_id);
  140. void sec_input_probe_work_remove(struct sec_ts_plat_data *pdata)
  141. {
  142. if (pdata == NULL)
  143. return;
  144. if (!pdata->work_queue_probe_enabled) {
  145. input_err(true, pdata->dev, "%s: work_queue_probe_enabled is false\n", __func__);
  146. return;
  147. }
  148. cancel_work_sync(&pdata->probe_work);
  149. flush_workqueue(pdata->probe_workqueue);
  150. destroy_workqueue(pdata->probe_workqueue);
  151. }
  152. EXPORT_SYMBOL(sec_input_probe_work_remove);
  153. static void sec_input_probe_work(struct work_struct *work)
  154. {
  155. struct sec_ts_plat_data *pdata = container_of(work, struct sec_ts_plat_data, probe_work);
  156. int ret = 0;
  157. if (pdata->probe == NULL) {
  158. input_err(true, pdata->dev, "%s: probe function is null\n", __func__);
  159. return;
  160. }
  161. sec_delay(pdata->work_queue_probe_delay);
  162. ret = pdata->probe(pdata->dev);
  163. if (pdata->first_booting_disabled && ret == 0) {
  164. input_info(true, pdata->dev, "%s: first_booting_disabled.\n", __func__);
  165. pdata->disable(pdata->dev);
  166. }
  167. }
  168. static void sec_input_handler_wait_resume_work(struct work_struct *work)
  169. {
  170. struct sec_ts_plat_data *pdata = container_of(work, struct sec_ts_plat_data, irq_work);
  171. unsigned int irq = gpio_to_irq(pdata->irq_gpio);
  172. struct irq_desc *desc = irq_to_desc(irq);
  173. int ret;
  174. ret = wait_for_completion_interruptible_timeout(&pdata->resume_done,
  175. msecs_to_jiffies(SEC_TS_WAKE_LOCK_TIME));
  176. if (ret == 0) {
  177. input_err(true, pdata->dev, "%s: LPM: pm resume is not handled\n", __func__);
  178. goto out;
  179. }
  180. if (ret < 0) {
  181. input_err(true, pdata->dev, "%s: LPM: -ERESTARTSYS if interrupted, %d\n", __func__, ret);
  182. goto out;
  183. }
  184. if (desc && desc->action && desc->action->thread_fn) {
  185. input_info(true, pdata->dev, "%s: run irq thread\n", __func__);
  186. desc->action->thread_fn(irq, desc->action->dev_id);
  187. }
  188. out:
  189. sec_input_forced_enable_irq(irq);
  190. }
  191. int sec_input_handler_start(struct device *dev)
  192. {
  193. struct sec_ts_plat_data *pdata = dev->platform_data;
  194. unsigned int irq = gpio_to_irq(pdata->irq_gpio);
  195. struct irq_desc *desc = irq_to_desc(irq);
  196. if (desc && desc->action) {
  197. if ((desc->action->flags & IRQF_TRIGGER_LOW) && (gpio_get_value(pdata->irq_gpio) == 1))
  198. return SEC_ERROR;
  199. }
  200. if (sec_input_cmp_ic_status(dev, CHECK_LPMODE)) {
  201. __pm_wakeup_event(pdata->sec_ws, SEC_TS_WAKE_LOCK_TIME);
  202. if (!pdata->resume_done.done) {
  203. if (!IS_ERR_OR_NULL(pdata->irq_workqueue)) {
  204. input_info(true, dev, "%s: disable irq and queue waiting work\n", __func__);
  205. disable_irq_nosync(gpio_to_irq(pdata->irq_gpio));
  206. queue_work(pdata->irq_workqueue, &pdata->irq_work);
  207. } else {
  208. input_err(true, dev, "%s: irq_workqueue not exist\n", __func__);
  209. }
  210. return SEC_ERROR;
  211. }
  212. }
  213. return SEC_SUCCESS;
  214. }
  215. EXPORT_SYMBOL(sec_input_handler_start);
  216. /************************************************************
  217. * 720 * 1480 : <48 96 60>
  218. * indicator: 24dp navigator:48dp edge:60px dpi=320
  219. * 1080 * 2220 : 4096 * 4096 : <133 266 341> (approximately value)
  220. ************************************************************/
  221. static void location_detect(struct sec_ts_plat_data *pdata, int t_id)
  222. {
  223. int x = pdata->coord[t_id].x, y = pdata->coord[t_id].y;
  224. memset(pdata->location, 0x00, SEC_TS_LOCATION_DETECT_SIZE);
  225. if (x < pdata->area_edge)
  226. strlcat(pdata->location, "E.", SEC_TS_LOCATION_DETECT_SIZE);
  227. else if (x < (pdata->max_x - pdata->area_edge))
  228. strlcat(pdata->location, "C.", SEC_TS_LOCATION_DETECT_SIZE);
  229. else
  230. strlcat(pdata->location, "e.", SEC_TS_LOCATION_DETECT_SIZE);
  231. if (y < pdata->area_indicator)
  232. strlcat(pdata->location, "S", SEC_TS_LOCATION_DETECT_SIZE);
  233. else if (y < (pdata->max_y - pdata->area_navigation))
  234. strlcat(pdata->location, "C", SEC_TS_LOCATION_DETECT_SIZE);
  235. else
  236. strlcat(pdata->location, "N", SEC_TS_LOCATION_DETECT_SIZE);
  237. }
  238. void sec_delay(unsigned int ms)
  239. {
  240. if (!ms)
  241. return;
  242. if (ms < 20)
  243. usleep_range(ms * 1000, ms * 1000);
  244. else
  245. msleep(ms);
  246. }
  247. EXPORT_SYMBOL(sec_delay);
  248. int sec_input_set_temperature(struct device *dev, int state)
  249. {
  250. struct sec_ts_plat_data *pdata = dev->platform_data;
  251. int ret = 0;
  252. u8 temperature_data = 0;
  253. bool bforced = false;
  254. if (pdata->set_temperature == NULL) {
  255. input_dbg(false, dev, "%s: vendor function is not allocated\n", __func__);
  256. return SEC_ERROR;
  257. }
  258. if (state == SEC_INPUT_SET_TEMPERATURE_NORMAL) {
  259. if (pdata->touch_count) {
  260. pdata->tsp_temperature_data_skip = true;
  261. input_err(true, dev, "%s: skip, t_cnt(%d)\n",
  262. __func__, pdata->touch_count);
  263. return SEC_SUCCESS;
  264. }
  265. } else if (state == SEC_INPUT_SET_TEMPERATURE_IN_IRQ) {
  266. if (pdata->touch_count != 0 || pdata->tsp_temperature_data_skip == false)
  267. return SEC_SUCCESS;
  268. } else if (state == SEC_INPUT_SET_TEMPERATURE_FORCE) {
  269. bforced = true;
  270. } else {
  271. input_err(true, dev, "%s: invalid param %d\n", __func__, state);
  272. return SEC_ERROR;
  273. }
  274. pdata->tsp_temperature_data_skip = false;
  275. if (!pdata->psy)
  276. pdata->psy = power_supply_get_by_name("battery");
  277. if (!pdata->psy) {
  278. input_err(true, dev, "%s: cannot find power supply\n", __func__);
  279. return SEC_ERROR;
  280. }
  281. ret = power_supply_get_property(pdata->psy, POWER_SUPPLY_PROP_TEMP, &pdata->psy_value);
  282. if (ret < 0) {
  283. input_err(true, dev, "%s: couldn't get temperature value, ret:%d\n", __func__, ret);
  284. return ret;
  285. }
  286. temperature_data = (u8)(pdata->psy_value.intval / 10);
  287. if (bforced || pdata->tsp_temperature_data != temperature_data) {
  288. ret = pdata->set_temperature(dev, temperature_data);
  289. if (ret < 0) {
  290. input_err(true, dev, "%s: failed to write temperature %u, ret=%d\n",
  291. __func__, temperature_data, ret);
  292. return ret;
  293. }
  294. pdata->tsp_temperature_data = temperature_data;
  295. input_info(true, dev, "%s set temperature:%u\n", __func__, temperature_data);
  296. } else {
  297. input_dbg(true, dev, "%s skip temperature:%u\n", __func__, temperature_data);
  298. }
  299. return SEC_SUCCESS;
  300. }
  301. EXPORT_SYMBOL(sec_input_set_temperature);
  302. void sec_input_set_grip_type(struct device *dev, u8 set_type)
  303. {
  304. struct sec_ts_plat_data *pdata = dev->platform_data;
  305. u8 mode = G_NONE;
  306. if (pdata->set_grip_data == NULL) {
  307. input_dbg(true, dev, "%s: vendor function is not allocated\n", __func__);
  308. return;
  309. }
  310. input_info(true, dev, "%s: re-init grip(%d), edh:%d, edg:%d, lan:%d\n", __func__,
  311. set_type, pdata->grip_data.edgehandler_direction,
  312. pdata->grip_data.edge_range, pdata->grip_data.landscape_mode);
  313. if (pdata->grip_data.edgehandler_direction != 0)
  314. mode |= G_SET_EDGE_HANDLER;
  315. if (set_type == GRIP_ALL_DATA) {
  316. /* edge */
  317. if (pdata->grip_data.edge_range != 60)
  318. mode |= G_SET_EDGE_ZONE;
  319. /* dead zone default 0 mode, 32 */
  320. if (pdata->grip_data.landscape_mode == 1)
  321. mode |= G_SET_LANDSCAPE_MODE;
  322. else
  323. mode |= G_SET_NORMAL_MODE;
  324. }
  325. if (mode)
  326. pdata->set_grip_data(dev, mode);
  327. }
  328. EXPORT_SYMBOL(sec_input_set_grip_type);
  329. int sec_input_store_grip_data(struct device *dev, int *cmd_param)
  330. {
  331. struct sec_ts_plat_data *pdata = dev->platform_data;
  332. int mode = G_NONE;
  333. if (!pdata)
  334. return -ENODEV;
  335. if (cmd_param[0] == 0) {
  336. mode |= G_SET_EDGE_HANDLER;
  337. if (cmd_param[1] == 0) {
  338. pdata->grip_data.edgehandler_direction = 0;
  339. input_info(true, dev, "%s: [edge handler] clear\n", __func__);
  340. } else if (cmd_param[1] < 5) {
  341. pdata->grip_data.edgehandler_direction = cmd_param[1];
  342. pdata->grip_data.edgehandler_start_y = cmd_param[2];
  343. pdata->grip_data.edgehandler_end_y = cmd_param[3];
  344. input_info(true, dev, "%s: [edge handler] dir:%d, range:%d,%d\n", __func__,
  345. pdata->grip_data.edgehandler_direction,
  346. pdata->grip_data.edgehandler_start_y,
  347. pdata->grip_data.edgehandler_end_y);
  348. } else {
  349. input_err(true, dev, "%s: [edge handler] cmd1 is abnormal, %d\n", __func__, cmd_param[1]);
  350. return -EINVAL;
  351. }
  352. } else if (cmd_param[0] == 1) {
  353. if (pdata->grip_data.edge_range != cmd_param[1])
  354. mode = mode | G_SET_EDGE_ZONE;
  355. pdata->grip_data.edge_range = cmd_param[1];
  356. pdata->grip_data.deadzone_up_x = cmd_param[2];
  357. pdata->grip_data.deadzone_dn_x = cmd_param[3];
  358. pdata->grip_data.deadzone_y = cmd_param[4];
  359. /* 3rd reject zone */
  360. pdata->grip_data.deadzone_dn2_x = cmd_param[5];
  361. pdata->grip_data.deadzone_dn_y = cmd_param[6];
  362. mode |= G_SET_NORMAL_MODE;
  363. if (pdata->grip_data.landscape_mode == 1) {
  364. pdata->grip_data.landscape_mode = 0;
  365. mode |= G_CLR_LANDSCAPE_MODE;
  366. }
  367. /*
  368. * w means width of divided by 3 zone (X1, X2, X3)
  369. * h means height of divided by 3 zone (Y1, Y2) - y coordinate which is the point of divide line
  370. */
  371. input_info(true, dev, "%s: [%sportrait] grip:%d | reject w:%d/%d/%d, h:%d/%d\n",
  372. __func__, (mode & G_CLR_LANDSCAPE_MODE) ? "landscape->" : "",
  373. pdata->grip_data.edge_range, pdata->grip_data.deadzone_up_x,
  374. pdata->grip_data.deadzone_dn_x, pdata->grip_data.deadzone_dn2_x,
  375. pdata->grip_data.deadzone_y, pdata->grip_data.deadzone_dn_y);
  376. } else if (cmd_param[0] == 2) {
  377. if (cmd_param[1] == 0) {
  378. pdata->grip_data.landscape_mode = 0;
  379. mode |= G_CLR_LANDSCAPE_MODE;
  380. input_info(true, dev, "%s: [landscape] clear\n", __func__);
  381. } else if (cmd_param[1] == 1) {
  382. pdata->grip_data.landscape_mode = 1;
  383. pdata->grip_data.landscape_edge = cmd_param[2];
  384. pdata->grip_data.landscape_deadzone = cmd_param[3];
  385. pdata->grip_data.landscape_top_deadzone = cmd_param[4];
  386. pdata->grip_data.landscape_bottom_deadzone = cmd_param[5];
  387. pdata->grip_data.landscape_top_gripzone = cmd_param[6];
  388. pdata->grip_data.landscape_bottom_gripzone = cmd_param[7];
  389. mode |= G_SET_LANDSCAPE_MODE;
  390. /*
  391. * v means width of grip/reject zone of vertical both edge side
  392. * h means height of grip/reject zone of horizontal top/bottom side (top/bottom)
  393. */
  394. input_info(true, dev, "%s: [landscape] grip v:%d, h:%d/%d | reject v:%d, h:%d/%d\n",
  395. __func__, pdata->grip_data.landscape_edge,
  396. pdata->grip_data.landscape_top_gripzone, pdata->grip_data.landscape_bottom_gripzone,
  397. pdata->grip_data.landscape_deadzone, pdata->grip_data.landscape_top_deadzone,
  398. pdata->grip_data.landscape_bottom_deadzone);
  399. } else {
  400. input_err(true, dev, "%s: [landscape] cmd1 is abnormal, %d\n", __func__, cmd_param[1]);
  401. return -EINVAL;
  402. }
  403. } else {
  404. input_err(true, dev, "%s: cmd0 is abnormal, %d", __func__, cmd_param[0]);
  405. return -EINVAL;
  406. }
  407. return mode;
  408. }
  409. EXPORT_SYMBOL(sec_input_store_grip_data);
  410. int sec_input_check_cover_type(struct device *dev)
  411. {
  412. struct sec_ts_plat_data *pdata = dev->platform_data;
  413. int cover_cmd = 0;
  414. switch (pdata->cover_type) {
  415. case SEC_TS_FLIP_COVER:
  416. case SEC_TS_SVIEW_COVER:
  417. case SEC_TS_SVIEW_CHARGER_COVER:
  418. case SEC_TS_S_VIEW_WALLET_COVER:
  419. case SEC_TS_LED_COVER:
  420. case SEC_TS_CLEAR_COVER:
  421. case SEC_TS_KEYBOARD_KOR_COVER:
  422. case SEC_TS_KEYBOARD_US_COVER:
  423. case SEC_TS_CLEAR_SIDE_VIEW_COVER:
  424. case SEC_TS_MINI_SVIEW_WALLET_COVER:
  425. case SEC_TS_MONTBLANC_COVER:
  426. case SEC_TS_CLEAR_CAMERA_VIEW_COVER:
  427. cover_cmd = pdata->cover_type;
  428. break;
  429. default:
  430. input_err(true, dev, "%s: not change touch state, cover_type=%d\n",
  431. __func__, pdata->cover_type);
  432. break;
  433. }
  434. return cover_cmd;
  435. }
  436. EXPORT_SYMBOL(sec_input_check_cover_type);
  437. void sec_input_set_fod_info(struct device *dev, int vi_x, int vi_y, int vi_size, int vi_event)
  438. {
  439. struct sec_ts_plat_data *pdata = dev->platform_data;
  440. int byte_size = vi_x * vi_y / 8;
  441. if (vi_x * vi_y % 8)
  442. byte_size++;
  443. pdata->fod_data.vi_x = vi_x;
  444. pdata->fod_data.vi_y = vi_y;
  445. pdata->fod_data.vi_size = vi_size;
  446. pdata->fod_data.vi_event = vi_event;
  447. if (byte_size != vi_size)
  448. input_err(true, dev, "%s: NEED TO CHECK! vi size %d maybe wrong (byte size should be %d)\n",
  449. __func__, vi_size, byte_size);
  450. input_info(true, dev, "%s: vi_event:%d, x:%d, y:%d, size:%d\n",
  451. __func__, pdata->fod_data.vi_event, pdata->fod_data.vi_x, pdata->fod_data.vi_y,
  452. pdata->fod_data.vi_size);
  453. }
  454. EXPORT_SYMBOL(sec_input_set_fod_info);
  455. ssize_t sec_input_get_fod_info(struct device *dev, char *buf)
  456. {
  457. struct sec_ts_plat_data *pdata = dev->platform_data;
  458. if (!pdata->support_fod) {
  459. input_err(true, dev, "%s: fod is not supported\n", __func__);
  460. return snprintf(buf, SEC_CMD_BUF_SIZE, "NA");
  461. }
  462. if (pdata->x_node_num <= 0 || pdata->y_node_num <= 0) {
  463. input_err(true, dev, "%s: x/y node num value is wrong\n", __func__);
  464. return snprintf(buf, SEC_CMD_BUF_SIZE, "NG");
  465. }
  466. input_info(true, dev, "%s: x:%d/%d, y:%d/%d, size:%d\n",
  467. __func__, pdata->fod_data.vi_x, pdata->x_node_num,
  468. pdata->fod_data.vi_y, pdata->y_node_num, pdata->fod_data.vi_size);
  469. return snprintf(buf, SEC_CMD_BUF_SIZE, "%d,%d,%d,%d,%d",
  470. pdata->fod_data.vi_x, pdata->fod_data.vi_y,
  471. pdata->fod_data.vi_size, pdata->x_node_num, pdata->y_node_num);
  472. }
  473. EXPORT_SYMBOL(sec_input_get_fod_info);
  474. bool sec_input_set_fod_rect(struct device *dev, int *rect_data)
  475. {
  476. struct sec_ts_plat_data *pdata = dev->platform_data;
  477. int i;
  478. pdata->fod_data.set_val = 1;
  479. if (rect_data[0] <= 0 || rect_data[1] <= 0 || rect_data[2] <= 0 || rect_data[3] <= 0)
  480. pdata->fod_data.set_val = 0;
  481. if (pdata->fod_data.set_val)
  482. for (i = 0; i < 4; i++)
  483. pdata->fod_data.rect_data[i] = rect_data[i];
  484. return pdata->fod_data.set_val;
  485. }
  486. EXPORT_SYMBOL(sec_input_set_fod_rect);
  487. int sec_input_check_wirelesscharger_mode(struct device *dev, int mode, int force)
  488. {
  489. struct sec_ts_plat_data *pdata = dev->platform_data;
  490. if (mode != TYPE_WIRELESS_CHARGER_NONE
  491. && mode != TYPE_WIRELESS_CHARGER
  492. && mode != TYPE_WIRELESS_BATTERY_PACK) {
  493. input_err(true, dev,
  494. "%s: invalid param %d\n", __func__, mode);
  495. return SEC_ERROR;
  496. }
  497. if (pdata->force_wirelesscharger_mode == true && force == 0) {
  498. input_err(true, dev,
  499. "%s: [force enable] skip %d\n", __func__, mode);
  500. return SEC_SKIP;
  501. }
  502. if (force == 1) {
  503. if (mode == TYPE_WIRELESS_CHARGER_NONE) {
  504. pdata->force_wirelesscharger_mode = false;
  505. input_err(true, dev,
  506. "%s: force enable off\n", __func__);
  507. return SEC_SKIP;
  508. }
  509. pdata->force_wirelesscharger_mode = true;
  510. }
  511. pdata->wirelesscharger_mode = mode & 0xFF;
  512. return SEC_SUCCESS;
  513. }
  514. EXPORT_SYMBOL(sec_input_check_wirelesscharger_mode);
  515. ssize_t sec_input_get_common_hw_param(struct sec_ts_plat_data *pdata, char *buf)
  516. {
  517. char buff[SEC_INPUT_HW_PARAM_SIZE];
  518. char tbuff[SEC_CMD_STR_LEN];
  519. char mdev[SEC_CMD_STR_LEN];
  520. memset(mdev, 0x00, sizeof(mdev));
  521. if (GET_DEV_COUNT(pdata->multi_dev) == MULTI_DEV_SUB)
  522. snprintf(mdev, sizeof(mdev), "%s", "2");
  523. else
  524. snprintf(mdev, sizeof(mdev), "%s", "");
  525. memset(buff, 0x00, sizeof(buff));
  526. memset(tbuff, 0x00, sizeof(tbuff));
  527. snprintf(tbuff, sizeof(tbuff), "\"TITO%s\":\"%02X%02X%02X%02X\",",
  528. mdev, pdata->hw_param.ito_test[0], pdata->hw_param.ito_test[1],
  529. pdata->hw_param.ito_test[2], pdata->hw_param.ito_test[3]);
  530. strlcat(buff, tbuff, sizeof(buff));
  531. memset(tbuff, 0x00, sizeof(tbuff));
  532. snprintf(tbuff, sizeof(tbuff), "\"TWET%s\":\"%d\",", mdev, pdata->hw_param.wet_count);
  533. strlcat(buff, tbuff, sizeof(buff));
  534. memset(tbuff, 0x00, sizeof(tbuff));
  535. snprintf(tbuff, sizeof(tbuff), "\"TNOI%s\":\"%d\",", mdev, pdata->hw_param.noise_count);
  536. strlcat(buff, tbuff, sizeof(buff));
  537. memset(tbuff, 0x00, sizeof(tbuff));
  538. snprintf(tbuff, sizeof(tbuff), "\"TCOM%s\":\"%d\",", mdev, pdata->hw_param.comm_err_count);
  539. strlcat(buff, tbuff, sizeof(buff));
  540. memset(tbuff, 0x00, sizeof(tbuff));
  541. snprintf(tbuff, sizeof(tbuff), "\"TCHK%s\":\"%d\",", mdev, pdata->hw_param.checksum_result);
  542. strlcat(buff, tbuff, sizeof(buff));
  543. memset(tbuff, 0x00, sizeof(tbuff));
  544. snprintf(tbuff, sizeof(tbuff), "\"TRIC%s\":\"%d\"", mdev, pdata->hw_param.ic_reset_count);
  545. strlcat(buff, tbuff, sizeof(buff));
  546. if (GET_DEV_COUNT(pdata->multi_dev) != MULTI_DEV_SUB) {
  547. memset(tbuff, 0x00, sizeof(tbuff));
  548. snprintf(tbuff, sizeof(tbuff), ",\"TMUL\":\"%d\",", pdata->hw_param.multi_count);
  549. strlcat(buff, tbuff, sizeof(buff));
  550. memset(tbuff, 0x00, sizeof(tbuff));
  551. snprintf(tbuff, sizeof(tbuff), "\"TTCN\":\"%d\",\"TACN\":\"%d\",\"TSCN\":\"%d\",",
  552. pdata->hw_param.all_finger_count, pdata->hw_param.all_aod_tap_count,
  553. pdata->hw_param.all_spay_count);
  554. strlcat(buff, tbuff, sizeof(buff));
  555. memset(tbuff, 0x00, sizeof(tbuff));
  556. snprintf(tbuff, sizeof(tbuff), "\"TMCF\":\"%d\"", pdata->hw_param.mode_change_failed_count);
  557. strlcat(buff, tbuff, sizeof(buff));
  558. }
  559. return snprintf(buf, SEC_INPUT_HW_PARAM_SIZE, "%s", buff);
  560. }
  561. EXPORT_SYMBOL(sec_input_get_common_hw_param);
  562. void sec_input_clear_common_hw_param(struct sec_ts_plat_data *pdata)
  563. {
  564. pdata->hw_param.multi_count = 0;
  565. pdata->hw_param.wet_count = 0;
  566. pdata->hw_param.noise_count = 0;
  567. pdata->hw_param.comm_err_count = 0;
  568. pdata->hw_param.checksum_result = 0;
  569. pdata->hw_param.all_finger_count = 0;
  570. pdata->hw_param.all_aod_tap_count = 0;
  571. pdata->hw_param.all_spay_count = 0;
  572. pdata->hw_param.mode_change_failed_count = 0;
  573. pdata->hw_param.ic_reset_count = 0;
  574. }
  575. EXPORT_SYMBOL(sec_input_clear_common_hw_param);
  576. void sec_input_print_info(struct device *dev, struct sec_tclm_data *tdata)
  577. {
  578. struct sec_ts_plat_data *pdata = dev->platform_data;
  579. unsigned int irq = gpio_to_irq(pdata->irq_gpio);
  580. struct irq_desc *desc = irq_to_desc(irq);
  581. char tclm_buff[INPUT_TCLM_LOG_BUF_SIZE] = { 0 };
  582. char fw_ver_prefix[7] = { 0 };
  583. pdata->print_info_cnt_open++;
  584. if (pdata->print_info_cnt_open > 0xfff0)
  585. pdata->print_info_cnt_open = 0;
  586. if (pdata->touch_count == 0)
  587. pdata->print_info_cnt_release++;
  588. #if IS_ENABLED(CONFIG_INPUT_TOUCHSCREEN_TCLMV2)
  589. if (tdata && (tdata->tclm_level == TCLM_LEVEL_NOT_SUPPORT))
  590. snprintf(tclm_buff, sizeof(tclm_buff), "");
  591. else if (tdata && tdata->tclm_string)
  592. snprintf(tclm_buff, sizeof(tclm_buff), "C%02XT%04X.%4s%s Cal_flag:%d fail_cnt:%d",
  593. tdata->nvdata.cal_count, tdata->nvdata.tune_fix_ver,
  594. tdata->tclm_string[tdata->nvdata.cal_position].f_name,
  595. (tdata->tclm_level == TCLM_LEVEL_LOCKDOWN) ? ".L" : " ",
  596. tdata->nvdata.cal_fail_falg, tdata->nvdata.cal_fail_cnt);
  597. else
  598. snprintf(tclm_buff, sizeof(tclm_buff), "TCLM data is empty");
  599. #else
  600. snprintf(tclm_buff, sizeof(tclm_buff), "");
  601. #endif
  602. if (pdata->ic_vendor_name[0] != 0)
  603. snprintf(fw_ver_prefix, sizeof(fw_ver_prefix), "%c%c%02X%02X",
  604. pdata->ic_vendor_name[0], pdata->ic_vendor_name[1], pdata->img_version_of_ic[0], pdata->img_version_of_ic[1]);
  605. input_info(true, dev,
  606. "tc:%d noise:%d/%d ext_n:%d wet:%d wc:%d(f:%d) lp:%x fn:%04X/%04X irqd:%d ED:%d PK:%d LS:%d// v:%s%02X%02X %s chk:%d // tmp:%d // #%d %d\n",
  607. pdata->touch_count,
  608. atomic_read(&pdata->touch_noise_status), atomic_read(&pdata->touch_pre_noise_status),
  609. pdata->external_noise_mode, pdata->wet_mode,
  610. pdata->wirelesscharger_mode, pdata->force_wirelesscharger_mode,
  611. pdata->lowpower_mode, pdata->touch_functions, pdata->ic_status, desc->depth,
  612. pdata->ed_enable, pdata->pocket_mode, pdata->low_sensitivity_mode,
  613. fw_ver_prefix, pdata->img_version_of_ic[2], pdata->img_version_of_ic[3],
  614. tclm_buff, pdata->hw_param.checksum_result,
  615. pdata->tsp_temperature_data,
  616. pdata->print_info_cnt_open, pdata->print_info_cnt_release);
  617. }
  618. EXPORT_SYMBOL(sec_input_print_info);
  619. void sec_input_proximity_report(struct device *dev, int data)
  620. {
  621. struct sec_ts_plat_data *pdata = dev->platform_data;
  622. if (!pdata->input_dev_proximity)
  623. return;
  624. if (pdata->support_lightsensor_detect) {
  625. if (data == PROX_EVENT_TYPE_LIGHTSENSOR_PRESS || data == PROX_EVENT_TYPE_LIGHTSENSOR_RELEASE) {
  626. input_report_abs(pdata->input_dev_proximity, ABS_MT_CUSTOM, data);
  627. input_sync(pdata->input_dev_proximity);
  628. input_info(true, dev, "%s: LIGHTSENSOR(%d)\n", __func__, data & 1);
  629. return;
  630. }
  631. }
  632. if (pdata->support_ear_detect) {
  633. if (!(pdata->ed_enable || pdata->pocket_mode))
  634. return;
  635. input_report_abs(pdata->input_dev_proximity, ABS_MT_CUSTOM, data);
  636. input_sync(pdata->input_dev_proximity);
  637. input_info(true, dev, "%s: PROX(%d)\n", __func__, data);
  638. }
  639. }
  640. EXPORT_SYMBOL(sec_input_proximity_report);
  641. void sec_input_gesture_report(struct device *dev, int id, int x, int y)
  642. {
  643. struct sec_ts_plat_data *pdata = dev->platform_data;
  644. char buff[SEC_TS_GESTURE_REPORT_BUFF_SIZE] = { 0 };
  645. if (pdata->support_gesture_uevent) {
  646. if (!IS_ERR_OR_NULL(pdata->sec))
  647. sec_cmd_send_gesture_uevent(pdata->sec, id, x, y);
  648. return;
  649. }
  650. pdata->gesture_id = id;
  651. pdata->gesture_x = x;
  652. pdata->gesture_y = y;
  653. input_report_key(pdata->input_dev, KEY_BLACK_UI_GESTURE, 1);
  654. input_sync(pdata->input_dev);
  655. input_report_key(pdata->input_dev, KEY_BLACK_UI_GESTURE, 0);
  656. input_sync(pdata->input_dev);
  657. if (id == SPONGE_EVENT_TYPE_SPAY) {
  658. snprintf(buff, sizeof(buff), "SPAY");
  659. pdata->hw_param.all_spay_count++;
  660. } else if (id == SPONGE_EVENT_TYPE_SINGLE_TAP) {
  661. snprintf(buff, sizeof(buff), "SINGLE TAP");
  662. } else if (id == SPONGE_EVENT_TYPE_AOD_DOUBLETAB) {
  663. snprintf(buff, sizeof(buff), "AOD");
  664. pdata->hw_param.all_aod_tap_count++;
  665. } else if (id == SPONGE_EVENT_TYPE_FOD_PRESS) {
  666. snprintf(buff, sizeof(buff), "FOD PRESS");
  667. } else if (id == SPONGE_EVENT_TYPE_FOD_RELEASE) {
  668. snprintf(buff, sizeof(buff), "FOD RELEASE");
  669. } else if (id == SPONGE_EVENT_TYPE_FOD_OUT) {
  670. snprintf(buff, sizeof(buff), "FOD OUT");
  671. } else if (id == SPONGE_EVENT_TYPE_TSP_SCAN_UNBLOCK) {
  672. snprintf(buff, sizeof(buff), "SCAN UNBLOCK");
  673. } else if (id == SPONGE_EVENT_TYPE_TSP_SCAN_BLOCK) {
  674. snprintf(buff, sizeof(buff), "SCAN BLOCK");
  675. } else if (id == SPONGE_EVENT_TYPE_LONG_PRESS) {
  676. snprintf(buff, sizeof(buff), "LONG PRESS");
  677. } else {
  678. snprintf(buff, sizeof(buff), "");
  679. }
  680. #if IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP)
  681. input_info(true, dev, "%s: %s: %d\n", __func__, buff, pdata->gesture_id);
  682. #else
  683. input_info(true, dev, "%s: %s: %d, %d, %d\n",
  684. __func__, buff, pdata->gesture_id, pdata->gesture_x, pdata->gesture_y);
  685. #endif
  686. }
  687. EXPORT_SYMBOL(sec_input_gesture_report);
  688. static void sec_input_coord_report(struct device *dev, u8 t_id)
  689. {
  690. struct sec_ts_plat_data *pdata = dev->platform_data;
  691. int action = pdata->coord[t_id].action;
  692. if (action == SEC_TS_COORDINATE_ACTION_RELEASE) {
  693. input_mt_slot(pdata->input_dev, t_id);
  694. input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, 0);
  695. pdata->palm_flag &= ~(1 << t_id);
  696. if (pdata->touch_count > 0)
  697. pdata->touch_count--;
  698. if (pdata->touch_count == 0) {
  699. input_report_key(pdata->input_dev, BTN_TOUCH, 0);
  700. input_report_key(pdata->input_dev, BTN_TOOL_FINGER, 0);
  701. pdata->hw_param.check_multi = 0;
  702. pdata->print_info_cnt_release = 0;
  703. pdata->palm_flag = 0;
  704. }
  705. if (pdata->blocking_palm)
  706. input_report_key(pdata->input_dev, BTN_PALM, 0);
  707. else
  708. input_report_key(pdata->input_dev, BTN_PALM, pdata->palm_flag);
  709. } else if (action == SEC_TS_COORDINATE_ACTION_PRESS || action == SEC_TS_COORDINATE_ACTION_MOVE) {
  710. if (action == SEC_TS_COORDINATE_ACTION_PRESS) {
  711. pdata->touch_count++;
  712. pdata->coord[t_id].p_x = pdata->coord[t_id].x;
  713. pdata->coord[t_id].p_y = pdata->coord[t_id].y;
  714. pdata->hw_param.all_finger_count++;
  715. if ((pdata->touch_count > 4) && (pdata->hw_param.check_multi == 0)) {
  716. pdata->hw_param.check_multi = 1;
  717. pdata->hw_param.multi_count++;
  718. }
  719. } else {
  720. /* action == SEC_TS_COORDINATE_ACTION_MOVE */
  721. pdata->coord[t_id].mcount++;
  722. }
  723. input_mt_slot(pdata->input_dev, t_id);
  724. input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, 1);
  725. input_report_key(pdata->input_dev, BTN_TOUCH, 1);
  726. input_report_key(pdata->input_dev, BTN_TOOL_FINGER, 1);
  727. if (pdata->blocking_palm)
  728. input_report_key(pdata->input_dev, BTN_PALM, 0);
  729. else
  730. input_report_key(pdata->input_dev, BTN_PALM, pdata->palm_flag);
  731. input_report_abs(pdata->input_dev, ABS_MT_POSITION_X, pdata->coord[t_id].x);
  732. input_report_abs(pdata->input_dev, ABS_MT_POSITION_Y, pdata->coord[t_id].y);
  733. input_report_abs(pdata->input_dev, ABS_MT_TOUCH_MAJOR, pdata->coord[t_id].major);
  734. input_report_abs(pdata->input_dev, ABS_MT_TOUCH_MINOR, pdata->coord[t_id].minor);
  735. }
  736. }
  737. static void sec_input_coord_log(struct device *dev, u8 t_id, int action)
  738. {
  739. struct sec_ts_plat_data *pdata = dev->platform_data;
  740. location_detect(pdata, t_id);
  741. if (action == SEC_TS_COORDINATE_ACTION_PRESS) {
  742. #if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP)
  743. input_info(true, dev,
  744. "[P] tID:%d.%d x:%d y:%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  745. t_id, input_mt_get_value(&pdata->input_dev->mt->slots[t_id], ABS_MT_TRACKING_ID),
  746. pdata->coord[t_id].x, pdata->coord[t_id].y, pdata->coord[t_id].z,
  747. pdata->coord[t_id].major, pdata->coord[t_id].minor,
  748. pdata->location, pdata->touch_count,
  749. pdata->coord[t_id].ttype,
  750. pdata->coord[t_id].noise_status, atomic_read(&pdata->touch_noise_status),
  751. atomic_read(&pdata->touch_pre_noise_status), pdata->coord[t_id].noise_level,
  752. pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num,
  753. pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  754. #else
  755. input_info(true, dev,
  756. "[P] tID:%d.%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  757. t_id, input_mt_get_value(&pdata->input_dev->mt->slots[t_id], ABS_MT_TRACKING_ID),
  758. pdata->coord[t_id].z, pdata->coord[t_id].major,
  759. pdata->coord[t_id].minor, pdata->location, pdata->touch_count,
  760. pdata->coord[t_id].ttype,
  761. pdata->coord[t_id].noise_status, atomic_read(&pdata->touch_noise_status),
  762. atomic_read(&pdata->touch_pre_noise_status), pdata->coord[t_id].noise_level,
  763. pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num,
  764. pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  765. #endif
  766. } else if (action == SEC_TS_COORDINATE_ACTION_MOVE) {
  767. #if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP)
  768. input_info(true, dev,
  769. "[M] tID:%d.%d x:%d y:%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  770. t_id, input_mt_get_value(&pdata->input_dev->mt->slots[t_id], ABS_MT_TRACKING_ID),
  771. pdata->coord[t_id].x, pdata->coord[t_id].y, pdata->coord[t_id].z,
  772. pdata->coord[t_id].major, pdata->coord[t_id].minor,
  773. pdata->location, pdata->touch_count,
  774. pdata->coord[t_id].ttype, pdata->coord[t_id].noise_status,
  775. atomic_read(&pdata->touch_noise_status), atomic_read(&pdata->touch_pre_noise_status),
  776. pdata->coord[t_id].noise_level, pdata->coord[t_id].max_strength,
  777. pdata->coord[t_id].hover_id_num, pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  778. #else
  779. input_info(true, dev,
  780. "[M] tID:%d.%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  781. t_id, input_mt_get_value(&pdata->input_dev->mt->slots[t_id], ABS_MT_TRACKING_ID),
  782. pdata->coord[t_id].z,
  783. pdata->coord[t_id].major, pdata->coord[t_id].minor,
  784. pdata->location, pdata->touch_count,
  785. pdata->coord[t_id].ttype, pdata->coord[t_id].noise_status,
  786. atomic_read(&pdata->touch_noise_status), atomic_read(&pdata->touch_pre_noise_status),
  787. pdata->coord[t_id].noise_level, pdata->coord[t_id].max_strength,
  788. pdata->coord[t_id].hover_id_num, pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  789. #endif
  790. } else if (action == SEC_TS_COORDINATE_ACTION_RELEASE || action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE) {
  791. #if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP)
  792. input_info(true, dev,
  793. "[R%s] tID:%d loc:%s dd:%d,%d mc:%d tc:%d lx:%d ly:%d p:%d noise:(%x,%d%d) nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  794. action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE ? "A" : "",
  795. t_id, pdata->location,
  796. pdata->coord[t_id].x - pdata->coord[t_id].p_x,
  797. pdata->coord[t_id].y - pdata->coord[t_id].p_y,
  798. pdata->coord[t_id].mcount, pdata->touch_count,
  799. pdata->coord[t_id].x, pdata->coord[t_id].y,
  800. pdata->coord[t_id].palm_count,
  801. pdata->coord[t_id].noise_status, atomic_read(&pdata->touch_noise_status),
  802. atomic_read(&pdata->touch_pre_noise_status), pdata->coord[t_id].noise_level,
  803. pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num,
  804. pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  805. #else
  806. input_info(true, dev,
  807. "[R%s] tID:%d loc:%s dd:%d,%d mc:%d tc:%d p:%d noise:(%x,%d%d) nlvl:%d, maxS:%d, hid:%d, fid:%d fod:%x\n",
  808. action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE ? "A" : "",
  809. t_id, pdata->location,
  810. pdata->coord[t_id].x - pdata->coord[t_id].p_x,
  811. pdata->coord[t_id].y - pdata->coord[t_id].p_y,
  812. pdata->coord[t_id].mcount, pdata->touch_count,
  813. pdata->coord[t_id].palm_count,
  814. pdata->coord[t_id].noise_status, atomic_read(&pdata->touch_noise_status),
  815. atomic_read(&pdata->touch_pre_noise_status), pdata->coord[t_id].noise_level,
  816. pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num,
  817. pdata->coord[t_id].freq_id, pdata->coord[t_id].fod_debug);
  818. #endif
  819. }
  820. }
  821. void sec_input_coord_event_fill_slot(struct device *dev, int t_id)
  822. {
  823. struct sec_ts_plat_data *pdata = dev->platform_data;
  824. if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) {
  825. if (pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_NONE
  826. || pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) {
  827. input_err(true, dev,
  828. "%s: tID %d released without press\n", __func__, t_id);
  829. return;
  830. }
  831. sec_input_coord_report(dev, t_id);
  832. if ((pdata->touch_count == 0) && !IS_ERR_OR_NULL(&pdata->interrupt_notify_work.work)) {
  833. if (pdata->interrupt_notify_work.work.func && list_empty(&pdata->interrupt_notify_work.work.entry))
  834. schedule_work(&pdata->interrupt_notify_work.work);
  835. }
  836. sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_RELEASE);
  837. pdata->coord[t_id].action = SEC_TS_COORDINATE_ACTION_NONE;
  838. pdata->coord[t_id].mcount = 0;
  839. pdata->coord[t_id].palm_count = 0;
  840. pdata->coord[t_id].noise_level = 0;
  841. pdata->coord[t_id].max_strength = 0;
  842. pdata->coord[t_id].hover_id_num = 0;
  843. } else if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_PRESS) {
  844. sec_input_coord_report(dev, t_id);
  845. if ((pdata->touch_count == 1) && !IS_ERR_OR_NULL(&pdata->interrupt_notify_work.work)) {
  846. if (pdata->interrupt_notify_work.work.func && list_empty(&pdata->interrupt_notify_work.work.entry))
  847. schedule_work(&pdata->interrupt_notify_work.work);
  848. }
  849. sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_PRESS);
  850. } else if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_MOVE) {
  851. if (pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_NONE
  852. || pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) {
  853. pdata->coord[t_id].action = SEC_TS_COORDINATE_ACTION_PRESS;
  854. sec_input_coord_report(dev, t_id);
  855. sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_MOVE);
  856. } else {
  857. sec_input_coord_report(dev, t_id);
  858. }
  859. } else {
  860. input_dbg(true, dev,
  861. "%s: do not support coordinate action(%d)\n",
  862. __func__, pdata->coord[t_id].action);
  863. }
  864. if ((pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_PRESS)
  865. || (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_MOVE)) {
  866. if (pdata->coord[t_id].ttype != pdata->prev_coord[t_id].ttype) {
  867. input_info(true, dev, "%s : tID:%d ttype(%x->%x)\n",
  868. __func__, pdata->coord[t_id].id,
  869. pdata->prev_coord[t_id].ttype, pdata->coord[t_id].ttype);
  870. }
  871. }
  872. pdata->fill_slot = true;
  873. }
  874. EXPORT_SYMBOL(sec_input_coord_event_fill_slot);
  875. void sec_input_coord_event_sync_slot(struct device *dev)
  876. {
  877. struct sec_ts_plat_data *pdata = dev->platform_data;
  878. if (pdata->fill_slot)
  879. input_sync(pdata->input_dev);
  880. pdata->fill_slot = false;
  881. }
  882. EXPORT_SYMBOL(sec_input_coord_event_sync_slot);
  883. void sec_input_release_all_finger(struct device *dev)
  884. {
  885. struct sec_ts_plat_data *pdata = dev->platform_data;
  886. int i;
  887. if (!pdata->input_dev)
  888. return;
  889. if (pdata->touch_count > 0) {
  890. input_report_key(pdata->input_dev, KEY_INT_CANCEL, 1);
  891. input_sync(pdata->input_dev);
  892. input_report_key(pdata->input_dev, KEY_INT_CANCEL, 0);
  893. input_sync(pdata->input_dev);
  894. }
  895. if (pdata->input_dev_proximity) {
  896. input_report_abs(pdata->input_dev_proximity, ABS_MT_CUSTOM, 0xff);
  897. input_sync(pdata->input_dev_proximity);
  898. }
  899. for (i = 0; i < SEC_TS_SUPPORT_TOUCH_COUNT; i++) {
  900. input_mt_slot(pdata->input_dev, i);
  901. input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, false);
  902. if (pdata->coord[i].action == SEC_TS_COORDINATE_ACTION_PRESS
  903. || pdata->coord[i].action == SEC_TS_COORDINATE_ACTION_MOVE) {
  904. sec_input_coord_log(dev, i, SEC_TS_COORDINATE_ACTION_FORCE_RELEASE);
  905. pdata->coord[i].action = SEC_TS_COORDINATE_ACTION_RELEASE;
  906. }
  907. pdata->coord[i].mcount = 0;
  908. pdata->coord[i].palm_count = 0;
  909. pdata->coord[i].noise_level = 0;
  910. pdata->coord[i].max_strength = 0;
  911. pdata->coord[i].hover_id_num = 0;
  912. }
  913. input_mt_slot(pdata->input_dev, 0);
  914. input_report_key(pdata->input_dev, BTN_PALM, false);
  915. input_report_key(pdata->input_dev, BTN_LARGE_PALM, false);
  916. input_report_key(pdata->input_dev, BTN_TOUCH, false);
  917. input_report_key(pdata->input_dev, BTN_TOOL_FINGER, false);
  918. pdata->palm_flag = 0;
  919. pdata->touch_count = 0;
  920. pdata->hw_param.check_multi = 0;
  921. input_sync(pdata->input_dev);
  922. }
  923. EXPORT_SYMBOL(sec_input_release_all_finger);
  924. static void sec_input_set_prop(struct device *dev, struct input_dev *input_dev, u8 propbit, void *data)
  925. {
  926. struct sec_ts_plat_data *pdata = dev->platform_data;
  927. input_dev->phys = input_dev->name;
  928. input_dev->id.bustype = BUS_I2C;
  929. input_dev->dev.parent = dev;
  930. set_bit(EV_SYN, input_dev->evbit);
  931. set_bit(EV_KEY, input_dev->evbit);
  932. set_bit(EV_ABS, input_dev->evbit);
  933. set_bit(EV_SW, input_dev->evbit);
  934. set_bit(BTN_TOUCH, input_dev->keybit);
  935. set_bit(BTN_TOOL_FINGER, input_dev->keybit);
  936. set_bit(BTN_PALM, input_dev->keybit);
  937. set_bit(BTN_LARGE_PALM, input_dev->keybit);
  938. if (!pdata->support_gesture_uevent)
  939. set_bit(KEY_BLACK_UI_GESTURE, input_dev->keybit);
  940. set_bit(KEY_INT_CANCEL, input_dev->keybit);
  941. set_bit(propbit, input_dev->propbit);
  942. set_bit(KEY_WAKEUP, input_dev->keybit);
  943. set_bit(KEY_WATCH, input_dev->keybit);
  944. input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, pdata->max_x, 0, 0);
  945. input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, pdata->max_y, 0, 0);
  946. input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
  947. input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0);
  948. if (propbit == INPUT_PROP_POINTER)
  949. input_mt_init_slots(input_dev, SEC_TS_SUPPORT_TOUCH_COUNT, INPUT_MT_POINTER);
  950. else
  951. input_mt_init_slots(input_dev, SEC_TS_SUPPORT_TOUCH_COUNT, INPUT_MT_DIRECT);
  952. input_set_drvdata(input_dev, data);
  953. }
  954. static void sec_input_set_prop_proximity(struct device *dev, struct input_dev *input_dev, void *data)
  955. {
  956. input_dev->phys = input_dev->name;
  957. input_dev->id.bustype = BUS_I2C;
  958. input_dev->dev.parent = dev;
  959. set_bit(EV_SYN, input_dev->evbit);
  960. set_bit(EV_SW, input_dev->evbit);
  961. set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
  962. input_set_abs_params(input_dev, ABS_MT_CUSTOM, 0, 0xFFFFFFFF, 0, 0);
  963. input_set_drvdata(input_dev, data);
  964. }
  965. int sec_input_device_register(struct device *dev, void *data)
  966. {
  967. struct sec_ts_plat_data *pdata = dev->platform_data;
  968. int ret = 0;
  969. /* register input_dev */
  970. pdata->input_dev = devm_input_allocate_device(dev);
  971. if (!pdata->input_dev) {
  972. input_err(true, dev, "%s: allocate input_dev err!\n", __func__);
  973. return -ENOMEM;
  974. }
  975. if (GET_DEV_COUNT(pdata->multi_dev) == MULTI_DEV_SUB)
  976. pdata->input_dev->name = "sec_touchscreen2";
  977. else
  978. pdata->input_dev->name = "sec_touchscreen";
  979. sec_input_set_prop(dev, pdata->input_dev, INPUT_PROP_DIRECT, data);
  980. ret = input_register_device(pdata->input_dev);
  981. if (ret) {
  982. input_err(true, dev, "%s: Unable to register %s input device\n",
  983. __func__, pdata->input_dev->name);
  984. return ret;
  985. }
  986. if (pdata->support_dex) {
  987. /* register input_dev_pad */
  988. pdata->input_dev_pad = devm_input_allocate_device(dev);
  989. if (!pdata->input_dev_pad) {
  990. input_err(true, dev, "%s: allocate input_dev_pad err!\n", __func__);
  991. return -ENOMEM;
  992. }
  993. pdata->input_dev_pad->name = "sec_touchpad";
  994. sec_input_set_prop(dev, pdata->input_dev_pad, INPUT_PROP_POINTER, data);
  995. ret = input_register_device(pdata->input_dev_pad);
  996. if (ret) {
  997. input_err(true, dev, "%s: Unable to register %s input device\n",
  998. __func__, pdata->input_dev_pad->name);
  999. return ret;
  1000. }
  1001. }
  1002. if (pdata->support_ear_detect || pdata->support_lightsensor_detect) {
  1003. /* register input_dev_proximity */
  1004. pdata->input_dev_proximity = devm_input_allocate_device(dev);
  1005. if (!pdata->input_dev_proximity) {
  1006. input_err(true, dev, "%s: allocate input_dev_proximity err!\n", __func__);
  1007. return -ENOMEM;
  1008. }
  1009. if (GET_DEV_COUNT(pdata->multi_dev) == MULTI_DEV_SUB)
  1010. pdata->input_dev_proximity->name = "sec_touchproximity2";
  1011. else
  1012. pdata->input_dev_proximity->name = "sec_touchproximity";
  1013. sec_input_set_prop_proximity(dev, pdata->input_dev_proximity, data);
  1014. ret = input_register_device(pdata->input_dev_proximity);
  1015. if (ret) {
  1016. input_err(true, dev, "%s: Unable to register %s input device\n",
  1017. __func__, pdata->input_dev_proximity->name);
  1018. return ret;
  1019. }
  1020. }
  1021. return 0;
  1022. }
  1023. EXPORT_SYMBOL(sec_input_device_register);
  1024. int sec_input_pinctrl_configure(struct device *dev, bool on)
  1025. {
  1026. struct sec_ts_plat_data *pdata = dev->platform_data;
  1027. struct pinctrl_state *state;
  1028. input_info(true, dev, "%s: %s\n", __func__, on ? "ACTIVE" : "SUSPEND");
  1029. if (sec_check_secure_trusted_mode_status(pdata))
  1030. return 0;
  1031. if (on) {
  1032. state = pinctrl_lookup_state(pdata->pinctrl, "on_state");
  1033. if (IS_ERR(pdata->pinctrl))
  1034. input_err(true, dev, "%s: could not get active pinstate\n", __func__);
  1035. } else {
  1036. state = pinctrl_lookup_state(pdata->pinctrl, "off_state");
  1037. if (IS_ERR(pdata->pinctrl))
  1038. input_err(true, dev, "%s: could not get suspend pinstate\n", __func__);
  1039. }
  1040. if (!IS_ERR_OR_NULL(state))
  1041. return pinctrl_select_state(pdata->pinctrl, state);
  1042. return 0;
  1043. }
  1044. EXPORT_SYMBOL(sec_input_pinctrl_configure);
  1045. int sec_input_power(struct device *dev, bool on)
  1046. {
  1047. struct sec_ts_plat_data *pdata = dev->platform_data;
  1048. int ret = 0;
  1049. if (pdata->power_enabled == on) {
  1050. input_info(true, dev, "%s: power_enabled %d\n", __func__, pdata->power_enabled);
  1051. return ret;
  1052. }
  1053. if (on) {
  1054. if (!pdata->not_support_io_ldo) {
  1055. ret = regulator_enable(pdata->dvdd);
  1056. if (ret) {
  1057. input_err(true, dev, "%s: Failed to enable dvdd: %d\n", __func__, ret);
  1058. goto out;
  1059. }
  1060. sec_delay(1);
  1061. }
  1062. ret = regulator_enable(pdata->avdd);
  1063. if (ret) {
  1064. input_err(true, dev, "%s: Failed to enable avdd: %d\n", __func__, ret);
  1065. goto out;
  1066. }
  1067. } else {
  1068. regulator_disable(pdata->avdd);
  1069. if (!pdata->not_support_io_ldo) {
  1070. sec_delay(4);
  1071. regulator_disable(pdata->dvdd);
  1072. }
  1073. }
  1074. pdata->power_enabled = on;
  1075. out:
  1076. if (!pdata->not_support_io_ldo) {
  1077. input_info(true, dev, "%s: %s: avdd:%s, dvdd:%s\n", __func__, on ? "on" : "off",
  1078. regulator_is_enabled(pdata->avdd) ? "on" : "off",
  1079. regulator_is_enabled(pdata->dvdd) ? "on" : "off");
  1080. } else {
  1081. input_info(true, dev, "%s: %s: avdd:%s\n", __func__, on ? "on" : "off",
  1082. regulator_is_enabled(pdata->avdd) ? "on" : "off");
  1083. }
  1084. return ret;
  1085. }
  1086. EXPORT_SYMBOL(sec_input_power);
  1087. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER)
  1088. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  1089. static int sec_input_ccic_notification(struct notifier_block *nb,
  1090. unsigned long action, void *data)
  1091. {
  1092. struct sec_ts_plat_data *pdata = container_of(nb, struct sec_ts_plat_data, ccic_nb);
  1093. PD_NOTI_USB_STATUS_TYPEDEF usb_status = *(PD_NOTI_USB_STATUS_TYPEDEF *)data;
  1094. if (pdata->dev == NULL) {
  1095. pr_err("%s %s: dev is null\n", SECLOG, __func__);
  1096. return 0;
  1097. }
  1098. if (usb_status.dest != PDIC_NOTIFY_DEV_USB)
  1099. return 0;
  1100. switch (usb_status.drp) {
  1101. case USB_STATUS_NOTIFY_ATTACH_DFP:
  1102. pdata->otg_flag = true;
  1103. input_info(true, pdata->dev, "%s: otg_flag %d\n", __func__, pdata->otg_flag);
  1104. break;
  1105. case USB_STATUS_NOTIFY_DETACH:
  1106. pdata->otg_flag = false;
  1107. input_info(true, pdata->dev, "%s: otg_flag %d\n", __func__, pdata->otg_flag);
  1108. break;
  1109. default:
  1110. break;
  1111. }
  1112. return 0;
  1113. }
  1114. #endif
  1115. static int sec_input_vbus_notification(struct notifier_block *nb,
  1116. unsigned long cmd, void *data)
  1117. {
  1118. struct sec_ts_plat_data *pdata = container_of(nb, struct sec_ts_plat_data, vbus_nb);
  1119. vbus_status_t vbus_type = *(vbus_status_t *) data;
  1120. if (pdata->dev == NULL) {
  1121. pr_err("%s %s: dev is null\n", SECLOG, __func__);
  1122. return 0;
  1123. }
  1124. input_info(true, pdata->dev, "%s: cmd=%lu, vbus_type=%d, otg_flag:%d\n",
  1125. __func__, cmd, vbus_type, pdata->otg_flag);
  1126. if (atomic_read(&pdata->shutdown_called))
  1127. return 0;
  1128. switch (vbus_type) {
  1129. case STATUS_VBUS_HIGH:
  1130. if (!pdata->otg_flag)
  1131. pdata->charger_flag = true;
  1132. else
  1133. return 0;
  1134. break;
  1135. case STATUS_VBUS_LOW:
  1136. pdata->charger_flag = false;
  1137. break;
  1138. default:
  1139. return 0;
  1140. }
  1141. queue_work(pdata->vbus_notifier_workqueue, &pdata->vbus_notifier_work);
  1142. return 0;
  1143. }
  1144. static void sec_input_vbus_notification_work(struct work_struct *work)
  1145. {
  1146. struct sec_ts_plat_data *pdata = container_of(work, struct sec_ts_plat_data, vbus_notifier_work);
  1147. int ret = 0;
  1148. if (pdata->dev == NULL) {
  1149. pr_err("%s %s: dev is null\n", SECLOG, __func__);
  1150. return;
  1151. }
  1152. if (pdata->set_charger_mode == NULL) {
  1153. input_err(true, pdata->dev, "%s: set_charger_mode function is not allocated\n", __func__);
  1154. return;
  1155. }
  1156. if (atomic_read(&pdata->shutdown_called))
  1157. return;
  1158. input_info(true, pdata->dev, "%s: charger_flag:%d\n", __func__, pdata->charger_flag);
  1159. ret = pdata->set_charger_mode(pdata->dev, pdata->charger_flag);
  1160. if (ret < 0) {
  1161. input_info(true, pdata->dev, "%s: failed to set charger_flag\n", __func__);
  1162. return;
  1163. }
  1164. }
  1165. #endif
  1166. void sec_input_register_vbus_notifier(struct device *dev)
  1167. {
  1168. struct sec_ts_plat_data *pdata = dev->platform_data;
  1169. if (!pdata->support_vbus_notifier)
  1170. return;
  1171. input_info(true, dev, "%s\n", __func__);
  1172. pdata->otg_flag = false;
  1173. pdata->charger_flag = false;
  1174. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER)
  1175. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  1176. manager_notifier_register(&pdata->ccic_nb, sec_input_ccic_notification,
  1177. MANAGER_NOTIFY_PDIC_INITIAL);
  1178. input_info(true, dev, "%s: register ccic notification\n", __func__);
  1179. #endif
  1180. pdata->vbus_notifier_workqueue = create_singlethread_workqueue("sec_input_vbus_noti");
  1181. INIT_WORK(&pdata->vbus_notifier_work, sec_input_vbus_notification_work);
  1182. vbus_notifier_register(&pdata->vbus_nb, sec_input_vbus_notification, VBUS_NOTIFY_DEV_CHARGER);
  1183. input_info(true, dev, "%s: register vbus notification\n", __func__);
  1184. #endif
  1185. }
  1186. EXPORT_SYMBOL(sec_input_register_vbus_notifier);
  1187. void sec_input_unregister_vbus_notifier(struct device *dev)
  1188. {
  1189. struct sec_ts_plat_data *pdata = dev->platform_data;
  1190. if (!pdata->support_vbus_notifier)
  1191. return;
  1192. input_info(true, dev, "%s\n", __func__);
  1193. #if IS_ENABLED(CONFIG_VBUS_NOTIFIER)
  1194. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  1195. manager_notifier_unregister(&pdata->ccic_nb);
  1196. #endif
  1197. vbus_notifier_unregister(&pdata->vbus_nb);
  1198. cancel_work_sync(&pdata->vbus_notifier_work);
  1199. flush_workqueue(pdata->vbus_notifier_workqueue);
  1200. destroy_workqueue(pdata->vbus_notifier_workqueue);
  1201. #endif
  1202. }
  1203. EXPORT_SYMBOL(sec_input_unregister_vbus_notifier);
  1204. void sec_input_support_feature_parse_dt(struct device *dev)
  1205. {
  1206. struct sec_ts_plat_data *pdata = dev->platform_data;
  1207. struct device_node *np = dev->of_node;
  1208. pdata->dev = dev;
  1209. pdata->regulator_boot_on = of_property_read_bool(np, "sec,regulator_boot_on");
  1210. pdata->support_dex = of_property_read_bool(np, "support_dex_mode");
  1211. pdata->support_fod = of_property_read_bool(np, "support_fod");
  1212. pdata->support_fod_lp_mode = of_property_read_bool(np, "support_fod_lp_mode");
  1213. pdata->enable_settings_aot = of_property_read_bool(np, "enable_settings_aot");
  1214. pdata->support_refresh_rate_mode = of_property_read_bool(np, "support_refresh_rate_mode");
  1215. pdata->support_vrr = of_property_read_bool(np, "support_vrr");
  1216. pdata->support_ear_detect = of_property_read_bool(np, "support_ear_detect_mode");
  1217. pdata->support_open_short_test = of_property_read_bool(np, "support_open_short_test");
  1218. pdata->support_mis_calibration_test = of_property_read_bool(np, "support_mis_calibration_test");
  1219. pdata->support_wireless_tx = of_property_read_bool(np, "support_wireless_tx");
  1220. pdata->support_input_monitor = of_property_read_bool(np, "support_input_monitor");
  1221. pdata->disable_vsync_scan = of_property_read_bool(np, "disable_vsync_scan");
  1222. pdata->sense_off_when_cover_closed = of_property_read_bool(np, "sense_off_when_cover_closed");
  1223. pdata->not_support_temp_noti = of_property_read_bool(np, "not_support_temp_noti");
  1224. pdata->support_vbus_notifier = of_property_read_bool(np, "support_vbus_notifier");
  1225. pdata->support_gesture_uevent = of_property_read_bool(np, "support_gesture_uevent");
  1226. pdata->support_always_on = of_property_read_bool(np, "support_always_on");
  1227. if (of_property_read_u32(np, "support_rawdata_map_num", &pdata->support_rawdata_map_num) < 0)
  1228. pdata->support_rawdata_map_num = 0;
  1229. if (of_property_read_u32(np, "sec,support_sensor_hall", &pdata->support_sensor_hall) < 0)
  1230. pdata->support_sensor_hall = 0;
  1231. pdata->support_lightsensor_detect = of_property_read_bool(np, "support_lightsensor_detect");
  1232. pdata->prox_lp_scan_enabled = of_property_read_bool(np, "sec,prox_lp_scan_enabled");
  1233. input_info(true, dev, "%s: Prox LP Scan enabled %s\n",
  1234. __func__, pdata->prox_lp_scan_enabled ? "ON" : "OFF");
  1235. pdata->enable_sysinput_enabled = of_property_read_bool(np, "sec,enable_sysinput_enabled");
  1236. input_info(true, dev, "%s: Sysinput enabled %s\n",
  1237. __func__, pdata->enable_sysinput_enabled ? "ON" : "OFF");
  1238. pdata->support_rawdata = of_property_read_bool(np, "sec,support_rawdata");
  1239. input_info(true, dev, "%s: report rawdata %s\n",
  1240. __func__, pdata->support_rawdata ? "ON" : "OFF");
  1241. pdata->support_rawdata_motion_aivf = of_property_read_bool(np, "sec,support_rawdata_motion_aivf");
  1242. input_info(true, dev, "%s: motion aivf %s\n",
  1243. __func__, pdata->support_rawdata_motion_aivf ? "ON" : "OFF");
  1244. pdata->support_rawdata_motion_palm = of_property_read_bool(np, "sec,support_rawdata_motion_palm");
  1245. input_info(true, dev, "%s: motion palm %s\n",
  1246. __func__, pdata->support_rawdata_motion_palm ? "ON" : "OFF");
  1247. input_info(true, dev, "dex:%d, max(%d/%d), FOD:%d, AOT:%d, ED:%d, FLM:%d,\n",
  1248. pdata->support_dex, pdata->max_x, pdata->max_y,
  1249. pdata->support_fod, pdata->enable_settings_aot,
  1250. pdata->support_ear_detect, pdata->support_fod_lp_mode);
  1251. input_info(true, dev, "COB:%d, disable_vsync_scan:%d,\n",
  1252. pdata->chip_on_board, pdata->disable_vsync_scan);
  1253. input_info(true, dev, "not_support_temp_noti:%d, support_vbus_notifier:%d support_always_on:%d\n",
  1254. pdata->not_support_temp_noti, pdata->support_vbus_notifier, pdata->support_always_on);
  1255. }
  1256. EXPORT_SYMBOL(sec_input_support_feature_parse_dt);
  1257. int sec_input_parse_dt(struct device *dev)
  1258. {
  1259. struct sec_ts_plat_data *pdata;
  1260. struct device_node *np;
  1261. u32 coords[2];
  1262. int ret = 0;
  1263. int count = 0, i;
  1264. u32 px_zone[3] = { 0 };
  1265. int lcd_type = 0;
  1266. u32 lcd_bitmask[10] = { 0 };
  1267. if (IS_ERR_OR_NULL(dev)) {
  1268. input_err(true, dev, "%s: dev is null\n", __func__);
  1269. return -ENODEV;
  1270. }
  1271. pdata = dev->platform_data;
  1272. np = dev->of_node;
  1273. pdata->dev = dev;
  1274. pdata->chip_on_board = of_property_read_bool(np, "chip_on_board");
  1275. lcd_type = sec_input_get_lcd_id(dev);
  1276. if (lcd_type < 0) {
  1277. input_err(true, dev, "%s: lcd is not attached\n", __func__);
  1278. if (!pdata->chip_on_board)
  1279. return -ENODEV;
  1280. }
  1281. input_info(true, dev, "%s: lcdtype 0x%06X\n", __func__, lcd_type);
  1282. /*
  1283. * usage of sec,bitmask_unload
  1284. * bitmask[0] : masking bit
  1285. * bitmask[1],[2]... : target bit (max 9)
  1286. * ie) sec,bitmask_unload = <0x00FF00 0x008100 0x008200>;
  1287. * -> unload lcd id XX81XX, XX82XX
  1288. */
  1289. count = of_property_count_u32_elems(np, "sec,bitmask_unload");
  1290. if (lcd_type != 0 && count > 1 && count < 10 &&
  1291. (!of_property_read_u32_array(np, "sec,bitmask_unload", lcd_bitmask, count))) {
  1292. input_info(true, dev, "%s: bitmask_unload: 0x%06X, check %d type\n",
  1293. __func__, lcd_bitmask[0], count - 1);
  1294. for (i = 1; i < count; i++) {
  1295. if ((lcd_type & lcd_bitmask[0]) == lcd_bitmask[i]) {
  1296. input_err(true, dev,
  1297. "%s: do not load lcdtype:0x%06X masked:0x%06X\n",
  1298. __func__, lcd_type, lcd_bitmask[i]);
  1299. return -ENODEV;
  1300. }
  1301. }
  1302. }
  1303. mutex_init(&pdata->irq_lock);
  1304. pdata->irq_gpio = of_get_named_gpio_flags(np, "sec,irq_gpio", 0, &pdata->irq_flag);
  1305. if (gpio_is_valid(pdata->irq_gpio)) {
  1306. char label[15] = { 0 };
  1307. snprintf(label, sizeof(label), "sec,%s", dev_driver_string(dev));
  1308. ret = devm_gpio_request_one(dev, pdata->irq_gpio, GPIOF_DIR_IN, label);
  1309. if (ret) {
  1310. input_err(true, dev, "%s: Unable to request %s [%d]\n", __func__, label, pdata->irq_gpio);
  1311. return -EINVAL;
  1312. }
  1313. input_info(true, dev, "%s: irq gpio requested. %s [%d]\n", __func__, label, pdata->irq_gpio);
  1314. if (pdata->irq_flag)
  1315. input_info(true, dev, "%s: irq flag 0x%02X\n", __func__, pdata->irq_flag);
  1316. pdata->irq = gpio_to_irq(pdata->irq_gpio);
  1317. } else {
  1318. input_err(true, dev, "%s: Failed to get irq gpio\n", __func__);
  1319. return -EINVAL;
  1320. }
  1321. pdata->gpio_spi_cs = of_get_named_gpio(np, "sec,gpio_spi_cs", 0);
  1322. if (gpio_is_valid(pdata->gpio_spi_cs)) {
  1323. ret = gpio_request(pdata->gpio_spi_cs, "tsp,gpio_spi_cs");
  1324. input_info(true, dev, "%s: gpio_spi_cs: %d, ret: %d\n", __func__, pdata->gpio_spi_cs, ret);
  1325. }
  1326. if (of_property_read_u32(np, "sec,i2c-burstmax", &pdata->i2c_burstmax)) {
  1327. input_dbg(false, dev, "%s: Failed to get i2c_burstmax property\n", __func__);
  1328. pdata->i2c_burstmax = 0xffff;
  1329. }
  1330. if (of_property_read_u32_array(np, "sec,max_coords", coords, 2)) {
  1331. input_err(true, dev, "%s: Failed to get max_coords property\n", __func__);
  1332. return -EINVAL;
  1333. }
  1334. pdata->max_x = coords[0] - 1;
  1335. pdata->max_y = coords[1] - 1;
  1336. if (of_property_read_u32(np, "sec,bringup", &pdata->bringup) < 0)
  1337. pdata->bringup = 0;
  1338. count = of_property_count_strings(np, "sec,firmware_name");
  1339. if (count <= 0) {
  1340. pdata->firmware_name = NULL;
  1341. } else {
  1342. u8 lcd_id_num = of_property_count_u32_elems(np, "sec,select_lcdid");
  1343. if ((lcd_id_num != count) || (lcd_id_num <= 0)) {
  1344. of_property_read_string_index(np, "sec,firmware_name", 0, &pdata->firmware_name);
  1345. } else {
  1346. u32 *lcd_id_t;
  1347. u32 lcd_id_mask;
  1348. lcd_id_t = kcalloc(lcd_id_num, sizeof(u32), GFP_KERNEL);
  1349. if (!lcd_id_t)
  1350. return -ENOMEM;
  1351. of_property_read_u32_array(np, "sec,select_lcdid", lcd_id_t, lcd_id_num);
  1352. if (of_property_read_u32(np, "sec,lcdid_mask", &lcd_id_mask) < 0)
  1353. lcd_id_mask = 0xFFFFFF;
  1354. else
  1355. input_info(true, dev, "%s: lcd_id_mask: 0x%06X\n", __func__, lcd_id_mask);
  1356. for (i = 0; i < lcd_id_num; i++) {
  1357. if (((lcd_id_t[i] & lcd_id_mask) == (lcd_type & lcd_id_mask)) || (i == (lcd_id_num - 1))) {
  1358. of_property_read_string_index(np, "sec,firmware_name", i, &pdata->firmware_name);
  1359. break;
  1360. }
  1361. }
  1362. if (!pdata->firmware_name)
  1363. pdata->bringup = 1;
  1364. else if (strlen(pdata->firmware_name) == 0)
  1365. pdata->bringup = 1;
  1366. input_info(true, dev, "%s: count: %d, index:%d, lcd_id: 0x%X, firmware: %s\n",
  1367. __func__, count, i, lcd_id_t[i], pdata->firmware_name);
  1368. kfree(lcd_id_t);
  1369. }
  1370. if (pdata->bringup == 4)
  1371. pdata->bringup = 3;
  1372. }
  1373. pdata->not_support_vdd = of_property_read_bool(np, "not_support_vdd");
  1374. if (!pdata->not_support_vdd) {
  1375. const char *avdd_name, *dvdd_name;
  1376. pdata->not_support_io_ldo = of_property_read_bool(np, "not_support_io_ldo");
  1377. if (!pdata->not_support_io_ldo) {
  1378. if (of_property_read_string(np, "sec,dvdd_name", &dvdd_name) < 0)
  1379. dvdd_name = SEC_INPUT_DEFAULT_DVDD_NAME;
  1380. input_info(true, dev, "%s: get dvdd: %s\n", __func__, dvdd_name);
  1381. pdata->dvdd = devm_regulator_get(dev, dvdd_name);
  1382. if (IS_ERR_OR_NULL(pdata->dvdd)) {
  1383. input_err(true, dev, "%s: Failed to get %s regulator.\n",
  1384. __func__, dvdd_name);
  1385. #if !IS_ENABLED(CONFIG_QGKI)
  1386. if (gpio_is_valid(pdata->gpio_spi_cs))
  1387. gpio_free(pdata->gpio_spi_cs);
  1388. #endif
  1389. return -EINVAL;
  1390. }
  1391. }
  1392. if (of_property_read_string(np, "sec,avdd_name", &avdd_name) < 0)
  1393. avdd_name = SEC_INPUT_DEFAULT_AVDD_NAME;
  1394. input_info(true, dev, "%s: get avdd: %s\n", __func__, avdd_name);
  1395. pdata->avdd = devm_regulator_get(dev, avdd_name);
  1396. if (IS_ERR_OR_NULL(pdata->avdd)) {
  1397. input_err(true, dev, "%s: Failed to get %s regulator.\n",
  1398. __func__, avdd_name);
  1399. #if !IS_ENABLED(CONFIG_QGKI)
  1400. if (gpio_is_valid(pdata->gpio_spi_cs))
  1401. gpio_free(pdata->gpio_spi_cs);
  1402. #endif
  1403. return -EINVAL;
  1404. }
  1405. }
  1406. if (of_property_read_u32(np, "sec,dump_ic_ver", &pdata->dump_ic_ver) < 0)
  1407. pdata->dump_ic_ver = 0;
  1408. if (of_property_read_u32_array(np, "sec,area-size", px_zone, 3)) {
  1409. input_info(true, dev, "Failed to get zone's size\n");
  1410. pdata->area_indicator = 48;
  1411. pdata->area_navigation = 96;
  1412. pdata->area_edge = 60;
  1413. } else {
  1414. pdata->area_indicator = px_zone[0];
  1415. pdata->area_navigation = px_zone[1];
  1416. pdata->area_edge = px_zone[2];
  1417. }
  1418. input_info(true, dev, "%s : zone's size - indicator:%d, navigation:%d, edge:%d\n",
  1419. __func__, pdata->area_indicator, pdata->area_navigation, pdata->area_edge);
  1420. #if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH)
  1421. of_property_read_u32(np, "sec,ss_touch_num", &pdata->ss_touch_num);
  1422. input_err(true, dev, "%s: ss_touch_num:%d\n", __func__, pdata->ss_touch_num);
  1423. #endif
  1424. input_info(true, dev, "%s: i2c buffer limit: %d, lcd_id:%06X, bringup:%d,\n",
  1425. __func__, pdata->i2c_burstmax, lcd_type, pdata->bringup);
  1426. pdata->irq_workqueue = create_singlethread_workqueue("sec_input_irq_wq");
  1427. if (!IS_ERR_OR_NULL(pdata->irq_workqueue)) {
  1428. SEC_INPUT_INIT_WORK(dev, &pdata->irq_work, sec_input_handler_wait_resume_work);
  1429. input_info(true, dev, "%s: set sec_input_handler_wait_resume_work\n", __func__);
  1430. } else {
  1431. input_err(true, dev, "%s: failed to create irq_workqueue, err: %ld\n",
  1432. __func__, PTR_ERR(pdata->irq_workqueue));
  1433. }
  1434. pdata->work_queue_probe_enabled = of_property_read_bool(np, "work_queue_probe_enabled");
  1435. if (pdata->work_queue_probe_enabled) {
  1436. pdata->probe_workqueue = create_singlethread_workqueue("sec_tsp_probe_wq");
  1437. if (!IS_ERR_OR_NULL(pdata->probe_workqueue)) {
  1438. INIT_WORK(&pdata->probe_work, sec_input_probe_work);
  1439. input_info(true, dev, "%s: set sec_input_probe_work\n", __func__);
  1440. } else {
  1441. pdata->work_queue_probe_enabled = false;
  1442. input_err(true, dev, "%s: failed to create probe_work, err: %ld enabled:%s\n",
  1443. __func__, PTR_ERR(pdata->probe_workqueue),
  1444. pdata->work_queue_probe_enabled ? "ON" : "OFF");
  1445. }
  1446. }
  1447. if (of_property_read_u32(np, "sec,probe_queue_delay", &pdata->work_queue_probe_delay)) {
  1448. input_dbg(false, dev, "%s: Failed to get work_queue_probe_delay property\n", __func__);
  1449. pdata->work_queue_probe_delay = 0;
  1450. }
  1451. sec_input_support_feature_parse_dt(dev);
  1452. return 0;
  1453. }
  1454. EXPORT_SYMBOL(sec_input_parse_dt);
  1455. int sec_input_multi_device_parse_dt(struct device *dev)
  1456. {
  1457. struct device_node *np = dev->of_node;
  1458. int device_count;
  1459. if (!np)
  1460. return 0;
  1461. if (of_property_read_u32(np, "sec,multi_device_count", &device_count) < 0)
  1462. device_count = MULTI_DEV_NONE;
  1463. input_info(true, dev, "%s: device_count:%d\n", __func__, device_count);
  1464. return device_count;
  1465. }
  1466. EXPORT_SYMBOL(sec_input_multi_device_parse_dt);
  1467. void sec_tclm_parse_dt(struct device *dev, struct sec_tclm_data *tdata)
  1468. {
  1469. struct device_node *np = dev->of_node;
  1470. if (of_property_read_u32(np, "sec,tclm_level", &tdata->tclm_level) < 0) {
  1471. tdata->tclm_level = 0;
  1472. input_err(true, dev, "%s: Failed to get tclm_level property\n", __func__);
  1473. }
  1474. if (of_property_read_u32(np, "sec,afe_base", &tdata->afe_base) < 0) {
  1475. tdata->afe_base = 0;
  1476. input_err(true, dev, "%s: Failed to get afe_base property\n", __func__);
  1477. }
  1478. tdata->support_tclm_test = of_property_read_bool(np, "support_tclm_test");
  1479. input_err(true, dev, "%s: tclm_level %d, sec_afe_base %04X\n", __func__, tdata->tclm_level, tdata->afe_base);
  1480. }
  1481. EXPORT_SYMBOL(sec_tclm_parse_dt);
  1482. int sec_input_check_fw_name_incell(struct device *dev, const char **firmware_name, const char **firmware_name_2nd)
  1483. {
  1484. struct device_node *np = dev->of_node;
  1485. int lcd_id1_gpio = 0, lcd_id2_gpio = 0, lcd_id3_gpio = 0, dt_lcdtype = 0;
  1486. int fw_name_cnt = 0;
  1487. int lcdtype_cnt = 0;
  1488. int fw_sel_idx = 0;
  1489. int lcdtype = 0;
  1490. int vendor_chk_gpio = 0;
  1491. int ret = 0;
  1492. if (!np)
  1493. return -ENODEV;
  1494. vendor_chk_gpio = of_get_named_gpio(np, "sec,vendor_check-gpio", 0);
  1495. if (gpio_is_valid(vendor_chk_gpio)) {
  1496. int vendor_chk_en_val = 0;
  1497. int vendor_chk_gpio_val = gpio_get_value(vendor_chk_gpio);
  1498. ret = of_property_read_u32(np, "sec,vendor_check_enable_value", &vendor_chk_en_val);
  1499. if (ret < 0) {
  1500. input_err(true, dev, "%s: Unable to get vendor_check_enable_value, %d\n", __func__, ret);
  1501. return -ENODEV;
  1502. }
  1503. if (vendor_chk_gpio_val != vendor_chk_en_val) {
  1504. input_err(true, dev, "%s: tsp ic mismated (%d) != (%d)\n",
  1505. __func__, vendor_chk_gpio_val, vendor_chk_en_val);
  1506. return -ENODEV;
  1507. }
  1508. input_info(true, dev, "%s: lcd vendor_check_gpio %d (%d) == vendor_check_enable_value(%d)\n",
  1509. __func__, vendor_chk_gpio, vendor_chk_gpio_val, vendor_chk_en_val);
  1510. } else
  1511. input_info(true, dev, "%s: Not support vendor_check-gpio\n", __func__);
  1512. lcdtype = sec_input_get_lcd_id(dev);
  1513. if (lcdtype < 0) {
  1514. input_err(true, dev, "lcd is not attached\n");
  1515. return -ENODEV;
  1516. }
  1517. fw_name_cnt = of_property_count_strings(np, "sec,fw_name");
  1518. if (fw_name_cnt == 0) {
  1519. input_err(true, dev, "%s: no fw_name in DT\n", __func__);
  1520. return -EINVAL;
  1521. } else if (fw_name_cnt == 1) {
  1522. ret = of_property_read_u32(np, "sec,lcdtype", &dt_lcdtype);
  1523. if (ret < 0)
  1524. input_err(true, dev, "%s: failed to read lcdtype in DT\n", __func__);
  1525. else {
  1526. input_info(true, dev, "%s: fw_name_cnt(1), ap lcdtype=0x%06X & dt lcdtype=0x%06X\n",
  1527. __func__, lcdtype, dt_lcdtype);
  1528. if (lcdtype != dt_lcdtype) {
  1529. input_err(true, dev, "%s: panel mismatched, unload driver\n", __func__);
  1530. return -EINVAL;
  1531. }
  1532. }
  1533. fw_sel_idx = 0;
  1534. } else {
  1535. lcd_id1_gpio = of_get_named_gpio(np, "sec,lcdid1-gpio", 0);
  1536. if (gpio_is_valid(lcd_id1_gpio))
  1537. input_info(true, dev, "%s: lcd sec,id1_gpio %d(%d)\n", __func__, lcd_id1_gpio, gpio_get_value(lcd_id1_gpio));
  1538. else
  1539. input_err(true, dev, "%s: Failed to get sec,lcdid1-gpio\n", __func__);
  1540. lcd_id2_gpio = of_get_named_gpio(np, "sec,lcdid2-gpio", 0);
  1541. if (gpio_is_valid(lcd_id2_gpio))
  1542. input_info(true, dev, "%s: lcd sec,id2_gpio %d(%d)\n", __func__, lcd_id2_gpio, gpio_get_value(lcd_id2_gpio));
  1543. else
  1544. input_err(true, dev, "%s: Failed to get sec,lcdid2-gpio\n", __func__);
  1545. lcd_id3_gpio = of_get_named_gpio(np, "sec,lcdid3-gpio", 0);
  1546. if (gpio_is_valid(lcd_id3_gpio))
  1547. input_info(true, dev, "%s: lcd sec,id3_gpio %d(%d)\n", __func__, lcd_id3_gpio, gpio_get_value(lcd_id3_gpio));
  1548. else
  1549. input_err(true, dev, "%s: Failed to get sec,lcdid3-gpio\n", __func__);
  1550. fw_sel_idx = (gpio_get_value(lcd_id3_gpio) << 2) | (gpio_get_value(lcd_id2_gpio) << 1) | gpio_get_value(lcd_id1_gpio);
  1551. lcdtype_cnt = of_property_count_u32_elems(np, "sec,lcdtype");
  1552. input_info(true, dev, "%s: fw_name_cnt(%d) & lcdtype_cnt(%d) & fw_sel_idx(%d)\n",
  1553. __func__, fw_name_cnt, lcdtype_cnt, fw_sel_idx);
  1554. if (lcdtype_cnt <= 0 || fw_name_cnt <= 0 || lcdtype_cnt <= fw_sel_idx || fw_name_cnt <= fw_sel_idx) {
  1555. input_err(true, dev, "%s: abnormal lcdtype & fw name count, fw_sel_idx(%d)\n", __func__, fw_sel_idx);
  1556. return -EINVAL;
  1557. }
  1558. of_property_read_u32_index(np, "sec,lcdtype", fw_sel_idx, &dt_lcdtype);
  1559. input_info(true, dev, "%s: lcd id(%d), ap lcdtype=0x%06X & dt lcdtype=0x%06X\n",
  1560. __func__, fw_sel_idx, lcdtype, dt_lcdtype);
  1561. }
  1562. ret = of_property_read_string_index(np, "sec,fw_name", fw_sel_idx, firmware_name);
  1563. if (ret < 0 || *firmware_name == NULL || strlen(*firmware_name) == 0) {
  1564. input_err(true, dev, "%s: Failed to get fw name\n", __func__);
  1565. return -EINVAL;
  1566. } else
  1567. input_info(true, dev, "%s: fw name(%s)\n", __func__, *firmware_name);
  1568. /* only for novatek */
  1569. if (of_property_count_strings(np, "sec,fw_name_2nd") > 0) {
  1570. ret = of_property_read_string_index(np, "sec,fw_name_2nd", fw_sel_idx, firmware_name_2nd);
  1571. if (ret < 0 || *firmware_name_2nd == NULL || strlen(*firmware_name_2nd) == 0) {
  1572. input_err(true, dev, "%s: Failed to get fw name 2nd\n", __func__);
  1573. return -EINVAL;
  1574. } else
  1575. input_info(true, dev, "%s: firmware name 2nd(%s)\n", __func__, *firmware_name_2nd);
  1576. }
  1577. return ret;
  1578. }
  1579. EXPORT_SYMBOL(sec_input_check_fw_name_incell);
  1580. void stui_tsp_init(int (*stui_tsp_enter)(void), int (*stui_tsp_exit)(void), int (*stui_tsp_type)(void))
  1581. {
  1582. pr_info("%s %s: called\n", SECLOG, __func__);
  1583. psecuretsp = kzalloc(sizeof(struct sec_ts_secure_data), GFP_KERNEL);
  1584. psecuretsp->stui_tsp_enter = stui_tsp_enter;
  1585. psecuretsp->stui_tsp_exit = stui_tsp_exit;
  1586. psecuretsp->stui_tsp_type = stui_tsp_type;
  1587. }
  1588. EXPORT_SYMBOL(stui_tsp_init);
  1589. int stui_tsp_enter(void)
  1590. {
  1591. struct sec_ts_plat_data *pdata = NULL;
  1592. if (psecuretsp != NULL) {
  1593. pr_info("%s %s: psecuretsp->stui_tsp_enter called!\n", SECLOG, __func__);
  1594. return psecuretsp->stui_tsp_enter();
  1595. }
  1596. if (ptsp == NULL) {
  1597. pr_info("%s: ptsp is null\n", __func__);
  1598. return -EINVAL;
  1599. }
  1600. pdata = ptsp->platform_data;
  1601. if (pdata == NULL) {
  1602. pr_info("%s: pdata is null\n", __func__);
  1603. return -EINVAL;
  1604. }
  1605. pr_info("%s %s: pdata->stui_tsp_enter called!\n", SECLOG, __func__);
  1606. return pdata->stui_tsp_enter();
  1607. }
  1608. EXPORT_SYMBOL(stui_tsp_enter);
  1609. int stui_tsp_exit(void)
  1610. {
  1611. struct sec_ts_plat_data *pdata = NULL;
  1612. if (psecuretsp != NULL) {
  1613. pr_info("%s %s: psecuretsp->stui_tsp_exit called!\n", SECLOG, __func__);
  1614. return psecuretsp->stui_tsp_exit();
  1615. }
  1616. if (ptsp == NULL)
  1617. return -EINVAL;
  1618. pdata = ptsp->platform_data;
  1619. if (pdata == NULL)
  1620. return -EINVAL;
  1621. pr_info("%s %s: pdata->stui_tsp_exit called!\n", SECLOG, __func__);
  1622. return pdata->stui_tsp_exit();
  1623. }
  1624. EXPORT_SYMBOL(stui_tsp_exit);
  1625. int stui_tsp_type(void)
  1626. {
  1627. struct sec_ts_plat_data *pdata = NULL;
  1628. if (psecuretsp != NULL) {
  1629. pr_info("%s %s: psecuretsp->stui_tsp_type called!\n", SECLOG, __func__);
  1630. return psecuretsp->stui_tsp_type();
  1631. }
  1632. if (ptsp == NULL)
  1633. return -EINVAL;
  1634. pdata = ptsp->platform_data;
  1635. if (pdata == NULL)
  1636. return -EINVAL;
  1637. pr_info("%s %s: pdata->stui_tsp_type called!\n", SECLOG, __func__);
  1638. return pdata->stui_tsp_type();
  1639. }
  1640. EXPORT_SYMBOL(stui_tsp_type);
  1641. void sec_input_irq_enable(struct sec_ts_plat_data *pdata)
  1642. {
  1643. struct irq_desc *desc;
  1644. if (!pdata->irq)
  1645. return;
  1646. desc = irq_to_desc(pdata->irq);
  1647. if (!desc) {
  1648. pr_info("%s: invalid irq number: %d\n", __func__, pdata->irq);
  1649. return;
  1650. }
  1651. mutex_lock(&pdata->irq_lock);
  1652. while (desc->depth > 0) {
  1653. enable_irq(pdata->irq);
  1654. pr_info("%s: depth: %d\n", __func__, desc->depth);
  1655. }
  1656. atomic_set(&pdata->irq_enabled, SEC_INPUT_IRQ_ENABLE);
  1657. mutex_unlock(&pdata->irq_lock);
  1658. }
  1659. EXPORT_SYMBOL(sec_input_irq_enable);
  1660. void sec_input_irq_disable(struct sec_ts_plat_data *pdata)
  1661. {
  1662. struct irq_desc *desc;
  1663. if (!pdata->irq)
  1664. return;
  1665. desc = irq_to_desc(pdata->irq);
  1666. if (!desc) {
  1667. pr_info("%s: invalid irq number: %d\n", __func__, pdata->irq);
  1668. return;
  1669. }
  1670. mutex_lock(&pdata->irq_lock);
  1671. if (atomic_read(&pdata->irq_enabled) == SEC_INPUT_IRQ_ENABLE)
  1672. disable_irq(pdata->irq);
  1673. pr_info("%s: depth: %d\n", __func__, desc->depth);
  1674. atomic_set(&pdata->irq_enabled, SEC_INPUT_IRQ_DISABLE);
  1675. mutex_unlock(&pdata->irq_lock);
  1676. }
  1677. EXPORT_SYMBOL(sec_input_irq_disable);
  1678. void sec_input_irq_disable_nosync(struct sec_ts_plat_data *pdata)
  1679. {
  1680. struct irq_desc *desc;
  1681. if (!pdata->irq)
  1682. return;
  1683. desc = irq_to_desc(pdata->irq);
  1684. if (!desc) {
  1685. pr_info("%s: invalid irq number: %d\n", __func__, pdata->irq);
  1686. return;
  1687. }
  1688. mutex_lock(&pdata->irq_lock);
  1689. if (atomic_read(&pdata->irq_enabled) == SEC_INPUT_IRQ_ENABLE)
  1690. disable_irq_nosync(pdata->irq);
  1691. pr_info("%s: depth: %d\n", __func__, desc->depth);
  1692. atomic_set(&pdata->irq_enabled, SEC_INPUT_IRQ_DISABLE_NOSYNC);
  1693. mutex_unlock(&pdata->irq_lock);
  1694. }
  1695. EXPORT_SYMBOL(sec_input_irq_disable_nosync);
  1696. void sec_input_forced_enable_irq(int irq)
  1697. {
  1698. struct irq_desc *desc = irq_to_desc(irq);
  1699. if (!desc)
  1700. return;
  1701. while (desc->depth > 0) {
  1702. enable_irq(irq);
  1703. pr_info("%s: depth: %d\n", __func__, desc->depth);
  1704. }
  1705. }
  1706. EXPORT_SYMBOL(sec_input_forced_enable_irq);
  1707. int sec_input_enable_device(struct device *dev)
  1708. {
  1709. struct sec_ts_plat_data *pdata = dev->platform_data;
  1710. int retval;
  1711. sec_input_utc_marker(dev, __func__);
  1712. retval = mutex_lock_interruptible(&pdata->enable_mutex);
  1713. if (retval)
  1714. return retval;
  1715. if (pdata->enable)
  1716. retval = pdata->enable(dev);
  1717. mutex_unlock(&pdata->enable_mutex);
  1718. return retval;
  1719. }
  1720. EXPORT_SYMBOL(sec_input_enable_device);
  1721. int sec_input_disable_device(struct device *dev)
  1722. {
  1723. struct sec_ts_plat_data *pdata = dev->platform_data;
  1724. int retval;
  1725. sec_input_utc_marker(dev, __func__);
  1726. retval = mutex_lock_interruptible(&pdata->enable_mutex);
  1727. if (retval)
  1728. return retval;
  1729. if (pdata->disable)
  1730. retval = pdata->disable(dev);
  1731. mutex_unlock(&pdata->enable_mutex);
  1732. return 0;
  1733. }
  1734. EXPORT_SYMBOL(sec_input_disable_device);
  1735. static int __init sec_input_init(void)
  1736. {
  1737. int ret = 0;
  1738. pr_info("%s %s ++\n", SECLOG, __func__);
  1739. #if IS_ENABLED(CONFIG_SEC_DEBUG_TSP_LOG)
  1740. ret = sec_tsp_log_init();
  1741. pr_info("%s %s: sec_tsp_log_init %d\n", SECLOG, __func__, ret);
  1742. #endif
  1743. #if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH)
  1744. ret = sec_secure_touch_init();
  1745. pr_info("%s %s: sec_secure_touch_init %d\n", SECLOG, __func__, ret);
  1746. #endif
  1747. #if IS_ENABLED(CONFIG_TOUCHSCREEN_DUMP_MODE)
  1748. ret = sec_tsp_dumpkey_init();
  1749. pr_info("%s %s: sec_tsp_dumpkey_init %d\n", SECLOG, __func__, ret);
  1750. #endif
  1751. pr_info("%s %s --\n", SECLOG, __func__);
  1752. return ret;
  1753. }
  1754. static void __exit sec_input_exit(void)
  1755. {
  1756. pr_info("%s %s ++\n", SECLOG, __func__);
  1757. #if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH)
  1758. sec_secure_touch_exit();
  1759. #endif
  1760. #if IS_ENABLED(CONFIG_TOUCHSCREEN_DUMP_MODE)
  1761. sec_tsp_dumpkey_exit();
  1762. #endif
  1763. pr_info("%s %s --\n", SECLOG, __func__);
  1764. }
  1765. module_init(sec_input_init);
  1766. module_exit(sec_input_exit);
  1767. MODULE_DESCRIPTION("Samsung input common functions");
  1768. MODULE_LICENSE("GPL");