synaptics_dsx_active_pen.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. /*
  2. * Synaptics DSX touchscreen driver
  3. *
  4. * Copyright (C) 2012-2016 Synaptics Incorporated. All rights reserved.
  5. *
  6. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  7. * Copyright (C) 2012 Alexandra Chin <[email protected]>
  8. * Copyright (C) 2012 Scott Lin <[email protected]>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
  21. * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
  23. * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
  24. * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
  26. * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
  27. * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  28. * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
  29. * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
  30. * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
  31. * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
  32. * DOLLARS.
  33. */
  34. #include <linux/kernel.h>
  35. #include <linux/module.h>
  36. #include <linux/slab.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/delay.h>
  39. #include <linux/input.h>
  40. #include <linux/platform_device.h>
  41. #include <linux/input/synaptics_dsx.h>
  42. #include "synaptics_dsx_core.h"
  43. #define APEN_PHYS_NAME "synaptics_dsx/active_pen"
  44. #define ACTIVE_PEN_MAX_PRESSURE_16BIT 65535
  45. #define ACTIVE_PEN_MAX_PRESSURE_8BIT 255
  46. struct synaptics_rmi4_f12_query_8 {
  47. union {
  48. struct {
  49. unsigned char size_of_query9;
  50. struct {
  51. unsigned char data0_is_present:1;
  52. unsigned char data1_is_present:1;
  53. unsigned char data2_is_present:1;
  54. unsigned char data3_is_present:1;
  55. unsigned char data4_is_present:1;
  56. unsigned char data5_is_present:1;
  57. unsigned char data6_is_present:1;
  58. unsigned char data7_is_present:1;
  59. } __packed;
  60. };
  61. unsigned char data[2];
  62. };
  63. };
  64. struct apen_data_8b_pressure {
  65. union {
  66. struct {
  67. unsigned char status_pen:1;
  68. unsigned char status_invert:1;
  69. unsigned char status_barrel:1;
  70. unsigned char status_reserved:5;
  71. unsigned char x_lsb;
  72. unsigned char x_msb;
  73. unsigned char y_lsb;
  74. unsigned char y_msb;
  75. unsigned char pressure_msb;
  76. unsigned char battery_state;
  77. unsigned char pen_id_0_7;
  78. unsigned char pen_id_8_15;
  79. unsigned char pen_id_16_23;
  80. unsigned char pen_id_24_31;
  81. } __packed;
  82. unsigned char data[11];
  83. };
  84. };
  85. struct apen_data {
  86. union {
  87. struct {
  88. unsigned char status_pen:1;
  89. unsigned char status_invert:1;
  90. unsigned char status_barrel:1;
  91. unsigned char status_reserved:5;
  92. unsigned char x_lsb;
  93. unsigned char x_msb;
  94. unsigned char y_lsb;
  95. unsigned char y_msb;
  96. unsigned char pressure_lsb;
  97. unsigned char pressure_msb;
  98. unsigned char battery_state;
  99. unsigned char pen_id_0_7;
  100. unsigned char pen_id_8_15;
  101. unsigned char pen_id_16_23;
  102. unsigned char pen_id_24_31;
  103. } __packed;
  104. unsigned char data[12];
  105. };
  106. };
  107. struct synaptics_rmi4_apen_handle {
  108. bool apen_present;
  109. unsigned char intr_mask;
  110. unsigned char battery_state;
  111. unsigned short query_base_addr;
  112. unsigned short control_base_addr;
  113. unsigned short data_base_addr;
  114. unsigned short command_base_addr;
  115. unsigned short apen_data_addr;
  116. unsigned short max_pressure;
  117. unsigned int pen_id;
  118. struct input_dev *apen_dev;
  119. struct apen_data *apen_data;
  120. struct synaptics_rmi4_data *rmi4_data;
  121. };
  122. static struct synaptics_rmi4_apen_handle *apen;
  123. DECLARE_COMPLETION(apen_remove_complete);
  124. static void apen_lift(void)
  125. {
  126. input_report_key(apen->apen_dev, BTN_TOUCH, 0);
  127. input_report_key(apen->apen_dev, BTN_TOOL_PEN, 0);
  128. input_report_key(apen->apen_dev, BTN_TOOL_RUBBER, 0);
  129. input_sync(apen->apen_dev);
  130. apen->apen_present = false;
  131. }
  132. static void apen_report(void)
  133. {
  134. int retval;
  135. int x;
  136. int y;
  137. int pressure;
  138. static int invert = -1;
  139. struct apen_data_8b_pressure *apen_data_8b;
  140. struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
  141. retval = synaptics_rmi4_reg_read(rmi4_data,
  142. apen->apen_data_addr,
  143. apen->apen_data->data,
  144. sizeof(apen->apen_data->data));
  145. if (retval < 0) {
  146. dev_err(rmi4_data->pdev->dev.parent,
  147. "%s: Failed to read active pen data\n",
  148. __func__);
  149. return;
  150. }
  151. if (apen->apen_data->status_pen == 0) {
  152. if (apen->apen_present)
  153. apen_lift();
  154. dev_dbg(rmi4_data->pdev->dev.parent,
  155. "%s: No active pen data\n",
  156. __func__);
  157. return;
  158. }
  159. x = (apen->apen_data->x_msb << 8) | (apen->apen_data->x_lsb);
  160. y = (apen->apen_data->y_msb << 8) | (apen->apen_data->y_lsb);
  161. if ((x == -1) && (y == -1)) {
  162. if (apen->apen_present)
  163. apen_lift();
  164. dev_dbg(rmi4_data->pdev->dev.parent,
  165. "%s: Active pen in range but no valid x & y\n",
  166. __func__);
  167. return;
  168. }
  169. if (!apen->apen_present)
  170. invert = -1;
  171. if (invert != -1 && invert != apen->apen_data->status_invert)
  172. apen_lift();
  173. invert = apen->apen_data->status_invert;
  174. if (apen->max_pressure == ACTIVE_PEN_MAX_PRESSURE_16BIT) {
  175. pressure = (apen->apen_data->pressure_msb << 8) |
  176. apen->apen_data->pressure_lsb;
  177. apen->battery_state = apen->apen_data->battery_state;
  178. apen->pen_id = (apen->apen_data->pen_id_24_31 << 24) |
  179. (apen->apen_data->pen_id_16_23 << 16) |
  180. (apen->apen_data->pen_id_8_15 << 8) |
  181. apen->apen_data->pen_id_0_7;
  182. } else {
  183. apen_data_8b = (struct apen_data_8b_pressure *)apen->apen_data;
  184. pressure = apen_data_8b->pressure_msb;
  185. apen->battery_state = apen_data_8b->battery_state;
  186. apen->pen_id = (apen_data_8b->pen_id_24_31 << 24) |
  187. (apen_data_8b->pen_id_16_23 << 16) |
  188. (apen_data_8b->pen_id_8_15 << 8) |
  189. apen_data_8b->pen_id_0_7;
  190. }
  191. input_report_key(apen->apen_dev, BTN_TOUCH, pressure > 0 ? 1 : 0);
  192. input_report_key(apen->apen_dev,
  193. apen->apen_data->status_invert > 0 ?
  194. BTN_TOOL_RUBBER : BTN_TOOL_PEN, 1);
  195. input_report_key(apen->apen_dev,
  196. BTN_STYLUS, apen->apen_data->status_barrel > 0 ?
  197. 1 : 0);
  198. input_report_abs(apen->apen_dev, ABS_X, x);
  199. input_report_abs(apen->apen_dev, ABS_Y, y);
  200. input_report_abs(apen->apen_dev, ABS_PRESSURE, pressure);
  201. input_sync(apen->apen_dev);
  202. dev_dbg(rmi4_data->pdev->dev.parent,
  203. "%s: Active pen: status = %d, invert = %d, barrel = %d, x = %d, y = %d, pressure = %d\n",
  204. __func__,
  205. apen->apen_data->status_pen,
  206. apen->apen_data->status_invert,
  207. apen->apen_data->status_barrel,
  208. x, y, pressure);
  209. apen->apen_present = true;
  210. }
  211. static void apen_set_params(void)
  212. {
  213. input_set_abs_params(apen->apen_dev, ABS_X, 0,
  214. apen->rmi4_data->sensor_max_x, 0, 0);
  215. input_set_abs_params(apen->apen_dev, ABS_Y, 0,
  216. apen->rmi4_data->sensor_max_y, 0, 0);
  217. input_set_abs_params(apen->apen_dev, ABS_PRESSURE, 0,
  218. apen->max_pressure, 0, 0);
  219. }
  220. static int apen_pressure(struct synaptics_rmi4_f12_query_8 *query_8)
  221. {
  222. int retval;
  223. unsigned char ii;
  224. unsigned char data_reg_presence;
  225. unsigned char size_of_query_9;
  226. unsigned char *query_9;
  227. unsigned char *data_desc;
  228. struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
  229. data_reg_presence = query_8->data[1];
  230. size_of_query_9 = query_8->size_of_query9;
  231. query_9 = kmalloc(size_of_query_9, GFP_KERNEL);
  232. retval = synaptics_rmi4_reg_read(rmi4_data,
  233. apen->query_base_addr + 9,
  234. query_9,
  235. size_of_query_9);
  236. if (retval < 0)
  237. goto exit;
  238. data_desc = query_9;
  239. for (ii = 0; ii < 6; ii++) {
  240. if (!(data_reg_presence & (1 << ii)))
  241. continue; /* The data register is not present */
  242. data_desc++; /* Jump over the size entry */
  243. while (*data_desc & (1 << 7))
  244. data_desc++;
  245. data_desc++; /* Go to the next descriptor */
  246. }
  247. data_desc++; /* Jump over the size entry */
  248. /* Check for the presence of subpackets 1 and 2 */
  249. if ((*data_desc & (3 << 1)) == (3 << 1))
  250. apen->max_pressure = ACTIVE_PEN_MAX_PRESSURE_16BIT;
  251. else
  252. apen->max_pressure = ACTIVE_PEN_MAX_PRESSURE_8BIT;
  253. exit:
  254. kfree(query_9);
  255. return retval;
  256. }
  257. static int apen_reg_init(void)
  258. {
  259. int retval;
  260. unsigned char data_offset;
  261. unsigned char size_of_query8;
  262. struct synaptics_rmi4_f12_query_8 query_8;
  263. struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
  264. retval = synaptics_rmi4_reg_read(rmi4_data,
  265. apen->query_base_addr + 7,
  266. &size_of_query8,
  267. sizeof(size_of_query8));
  268. if (retval < 0)
  269. return retval;
  270. retval = synaptics_rmi4_reg_read(rmi4_data,
  271. apen->query_base_addr + 8,
  272. query_8.data,
  273. sizeof(query_8.data));
  274. if (retval < 0)
  275. return retval;
  276. if ((size_of_query8 >= 2) && (query_8.data6_is_present)) {
  277. data_offset = query_8.data0_is_present +
  278. query_8.data1_is_present +
  279. query_8.data2_is_present +
  280. query_8.data3_is_present +
  281. query_8.data4_is_present +
  282. query_8.data5_is_present;
  283. apen->apen_data_addr = apen->data_base_addr + data_offset;
  284. retval = apen_pressure(&query_8);
  285. if (retval < 0)
  286. return retval;
  287. } else {
  288. dev_err(rmi4_data->pdev->dev.parent,
  289. "%s: Active pen support unavailable\n",
  290. __func__);
  291. retval = -ENODEV;
  292. }
  293. return retval;
  294. }
  295. static int apen_scan_pdt(void)
  296. {
  297. int retval;
  298. unsigned char ii;
  299. unsigned char page;
  300. unsigned char intr_count = 0;
  301. unsigned char intr_off;
  302. unsigned char intr_src;
  303. unsigned short addr;
  304. struct synaptics_rmi4_fn_desc fd;
  305. struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
  306. for (page = 0; page < PAGES_TO_SERVICE; page++) {
  307. for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
  308. addr |= (page << 8);
  309. retval = synaptics_rmi4_reg_read(rmi4_data,
  310. addr,
  311. (unsigned char *)&fd,
  312. sizeof(fd));
  313. if (retval < 0)
  314. return retval;
  315. addr &= ~(MASK_8BIT << 8);
  316. if (fd.fn_number) {
  317. dev_dbg(rmi4_data->pdev->dev.parent,
  318. "%s: Found F%02x\n",
  319. __func__, fd.fn_number);
  320. switch (fd.fn_number) {
  321. case SYNAPTICS_RMI4_F12:
  322. goto f12_found;
  323. }
  324. } else {
  325. break;
  326. }
  327. intr_count += fd.intr_src_count;
  328. }
  329. }
  330. dev_err(rmi4_data->pdev->dev.parent,
  331. "%s: Failed to find F12\n",
  332. __func__);
  333. return -EINVAL;
  334. f12_found:
  335. apen->query_base_addr = fd.query_base_addr | (page << 8);
  336. apen->control_base_addr = fd.ctrl_base_addr | (page << 8);
  337. apen->data_base_addr = fd.data_base_addr | (page << 8);
  338. apen->command_base_addr = fd.cmd_base_addr | (page << 8);
  339. retval = apen_reg_init();
  340. if (retval < 0) {
  341. dev_err(rmi4_data->pdev->dev.parent,
  342. "%s: Failed to initialize active pen registers\n",
  343. __func__);
  344. return retval;
  345. }
  346. apen->intr_mask = 0;
  347. intr_src = fd.intr_src_count;
  348. intr_off = intr_count % 8;
  349. for (ii = intr_off;
  350. ii < (intr_src + intr_off);
  351. ii++) {
  352. apen->intr_mask |= 1 << ii;
  353. }
  354. rmi4_data->intr_mask[0] |= apen->intr_mask;
  355. addr = rmi4_data->f01_ctrl_base_addr + 1;
  356. retval = synaptics_rmi4_reg_write(rmi4_data,
  357. addr,
  358. &(rmi4_data->intr_mask[0]),
  359. sizeof(rmi4_data->intr_mask[0]));
  360. if (retval < 0) {
  361. dev_err(rmi4_data->pdev->dev.parent,
  362. "%s: Failed to set interrupt enable bit\n",
  363. __func__);
  364. return retval;
  365. }
  366. return 0;
  367. }
  368. static void synaptics_rmi4_apen_attn(struct synaptics_rmi4_data *rmi4_data,
  369. unsigned char intr_mask)
  370. {
  371. if (!apen)
  372. return;
  373. if (apen->intr_mask & intr_mask)
  374. apen_report();
  375. return;
  376. }
  377. static int synaptics_rmi4_apen_init(struct synaptics_rmi4_data *rmi4_data)
  378. {
  379. int retval;
  380. if (apen) {
  381. dev_dbg(rmi4_data->pdev->dev.parent,
  382. "%s: Handle already exists\n",
  383. __func__);
  384. return 0;
  385. }
  386. apen = kzalloc(sizeof(*apen), GFP_KERNEL);
  387. if (!apen) {
  388. dev_err(rmi4_data->pdev->dev.parent,
  389. "%s: Failed to alloc mem for apen\n",
  390. __func__);
  391. retval = -ENOMEM;
  392. goto exit;
  393. }
  394. apen->apen_data = kzalloc(sizeof(*(apen->apen_data)), GFP_KERNEL);
  395. if (!apen->apen_data) {
  396. dev_err(rmi4_data->pdev->dev.parent,
  397. "%s: Failed to alloc mem for apen_data\n",
  398. __func__);
  399. retval = -ENOMEM;
  400. goto exit_free_apen;
  401. }
  402. apen->rmi4_data = rmi4_data;
  403. retval = apen_scan_pdt();
  404. if (retval < 0)
  405. goto exit_free_apen_data;
  406. apen->apen_dev = input_allocate_device();
  407. if (apen->apen_dev == NULL) {
  408. dev_err(rmi4_data->pdev->dev.parent,
  409. "%s: Failed to allocate active pen device\n",
  410. __func__);
  411. retval = -ENOMEM;
  412. goto exit_free_apen_data;
  413. }
  414. apen->apen_dev->name = ACTIVE_PEN_DRIVER_NAME;
  415. apen->apen_dev->phys = APEN_PHYS_NAME;
  416. apen->apen_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
  417. apen->apen_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
  418. apen->apen_dev->dev.parent = rmi4_data->pdev->dev.parent;
  419. input_set_drvdata(apen->apen_dev, rmi4_data);
  420. set_bit(EV_KEY, apen->apen_dev->evbit);
  421. set_bit(EV_ABS, apen->apen_dev->evbit);
  422. set_bit(BTN_TOUCH, apen->apen_dev->keybit);
  423. set_bit(BTN_TOOL_PEN, apen->apen_dev->keybit);
  424. set_bit(BTN_TOOL_RUBBER, apen->apen_dev->keybit);
  425. set_bit(BTN_STYLUS, apen->apen_dev->keybit);
  426. #ifdef INPUT_PROP_DIRECT
  427. set_bit(INPUT_PROP_DIRECT, apen->apen_dev->propbit);
  428. #endif
  429. apen_set_params();
  430. retval = input_register_device(apen->apen_dev);
  431. if (retval) {
  432. dev_err(rmi4_data->pdev->dev.parent,
  433. "%s: Failed to register active pen device\n",
  434. __func__);
  435. goto exit_free_input_device;
  436. }
  437. return 0;
  438. exit_free_input_device:
  439. input_free_device(apen->apen_dev);
  440. exit_free_apen_data:
  441. kfree(apen->apen_data);
  442. exit_free_apen:
  443. kfree(apen);
  444. apen = NULL;
  445. exit:
  446. return retval;
  447. }
  448. static void synaptics_rmi4_apen_remove(struct synaptics_rmi4_data *rmi4_data)
  449. {
  450. if (!apen)
  451. goto exit;
  452. input_unregister_device(apen->apen_dev);
  453. kfree(apen->apen_data);
  454. kfree(apen);
  455. apen = NULL;
  456. exit:
  457. complete(&apen_remove_complete);
  458. }
  459. static void synaptics_rmi4_apen_reset(struct synaptics_rmi4_data *rmi4_data)
  460. {
  461. if (!apen) {
  462. synaptics_rmi4_apen_init(rmi4_data);
  463. return;
  464. }
  465. apen_lift();
  466. apen_scan_pdt();
  467. }
  468. static void synaptics_rmi4_apen_reinit(struct synaptics_rmi4_data *rmi4_data)
  469. {
  470. if (!apen)
  471. return;
  472. apen_lift();
  473. }
  474. static void synaptics_rmi4_apen_e_suspend(struct synaptics_rmi4_data *rmi4_data)
  475. {
  476. if (!apen)
  477. return;
  478. apen_lift();
  479. }
  480. static void synaptics_rmi4_apen_suspend(struct synaptics_rmi4_data *rmi4_data)
  481. {
  482. if (!apen)
  483. return;
  484. apen_lift();
  485. }
  486. static struct synaptics_rmi4_exp_fn active_pen_module = {
  487. .fn_type = RMI_ACTIVE_PEN,
  488. .init = synaptics_rmi4_apen_init,
  489. .remove = synaptics_rmi4_apen_remove,
  490. .reset = synaptics_rmi4_apen_reset,
  491. .reinit = synaptics_rmi4_apen_reinit,
  492. .early_suspend = synaptics_rmi4_apen_e_suspend,
  493. .suspend = synaptics_rmi4_apen_suspend,
  494. .resume = NULL,
  495. .late_resume = NULL,
  496. .attn = synaptics_rmi4_apen_attn,
  497. };
  498. static int __init rmi4_active_pen_module_init(void)
  499. {
  500. synaptics_rmi4_new_function(&active_pen_module, true);
  501. return 0;
  502. }
  503. static void __exit rmi4_active_pen_module_exit(void)
  504. {
  505. synaptics_rmi4_new_function(&active_pen_module, false);
  506. wait_for_completion(&apen_remove_complete);
  507. }
  508. module_init(rmi4_active_pen_module_init);
  509. module_exit(rmi4_active_pen_module_exit);
  510. MODULE_AUTHOR("Synaptics, Inc.");
  511. MODULE_DESCRIPTION("Synaptics DSX Active Pen Module");
  512. MODULE_LICENSE("GPL v2");