zet6223.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2016, Jelle van der Waa <[email protected]>
  4. */
  5. #include <linux/delay.h>
  6. #include <linux/i2c.h>
  7. #include <linux/input.h>
  8. #include <linux/input/mt.h>
  9. #include <linux/input/touchscreen.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/module.h>
  12. #include <linux/regulator/consumer.h>
  13. #include <asm/unaligned.h>
  14. #define ZET6223_MAX_FINGERS 16
  15. #define ZET6223_MAX_PKT_SIZE (3 + 4 * ZET6223_MAX_FINGERS)
  16. #define ZET6223_CMD_INFO 0xB2
  17. #define ZET6223_CMD_INFO_LENGTH 17
  18. #define ZET6223_VALID_PACKET 0x3c
  19. #define ZET6223_POWER_ON_DELAY_MSEC 30
  20. struct zet6223_ts {
  21. struct i2c_client *client;
  22. struct input_dev *input;
  23. struct regulator *vcc;
  24. struct regulator *vio;
  25. struct touchscreen_properties prop;
  26. struct regulator_bulk_data supplies[2];
  27. u16 max_x;
  28. u16 max_y;
  29. u8 fingernum;
  30. };
  31. static int zet6223_start(struct input_dev *dev)
  32. {
  33. struct zet6223_ts *ts = input_get_drvdata(dev);
  34. enable_irq(ts->client->irq);
  35. return 0;
  36. }
  37. static void zet6223_stop(struct input_dev *dev)
  38. {
  39. struct zet6223_ts *ts = input_get_drvdata(dev);
  40. disable_irq(ts->client->irq);
  41. }
  42. static irqreturn_t zet6223_irq(int irq, void *dev_id)
  43. {
  44. struct zet6223_ts *ts = dev_id;
  45. u16 finger_bits;
  46. /*
  47. * First 3 bytes are an identifier, two bytes of finger data.
  48. * X, Y data per finger is 4 bytes.
  49. */
  50. u8 bufsize = 3 + 4 * ts->fingernum;
  51. u8 buf[ZET6223_MAX_PKT_SIZE];
  52. int i;
  53. int ret;
  54. int error;
  55. ret = i2c_master_recv(ts->client, buf, bufsize);
  56. if (ret != bufsize) {
  57. error = ret < 0 ? ret : -EIO;
  58. dev_err_ratelimited(&ts->client->dev,
  59. "Error reading input data: %d\n", error);
  60. return IRQ_HANDLED;
  61. }
  62. if (buf[0] != ZET6223_VALID_PACKET)
  63. return IRQ_HANDLED;
  64. finger_bits = get_unaligned_be16(buf + 1);
  65. for (i = 0; i < ts->fingernum; i++) {
  66. if (!(finger_bits & BIT(15 - i)))
  67. continue;
  68. input_mt_slot(ts->input, i);
  69. input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, true);
  70. input_event(ts->input, EV_ABS, ABS_MT_POSITION_X,
  71. ((buf[i + 3] >> 4) << 8) + buf[i + 4]);
  72. input_event(ts->input, EV_ABS, ABS_MT_POSITION_Y,
  73. ((buf[i + 3] & 0xF) << 8) + buf[i + 5]);
  74. }
  75. input_mt_sync_frame(ts->input);
  76. input_sync(ts->input);
  77. return IRQ_HANDLED;
  78. }
  79. static void zet6223_power_off(void *_ts)
  80. {
  81. struct zet6223_ts *ts = _ts;
  82. regulator_bulk_disable(ARRAY_SIZE(ts->supplies), ts->supplies);
  83. }
  84. static int zet6223_power_on(struct zet6223_ts *ts)
  85. {
  86. struct device *dev = &ts->client->dev;
  87. int error;
  88. ts->supplies[0].supply = "vio";
  89. ts->supplies[1].supply = "vcc";
  90. error = devm_regulator_bulk_get(dev, ARRAY_SIZE(ts->supplies),
  91. ts->supplies);
  92. if (error)
  93. return error;
  94. error = regulator_bulk_enable(ARRAY_SIZE(ts->supplies), ts->supplies);
  95. if (error)
  96. return error;
  97. msleep(ZET6223_POWER_ON_DELAY_MSEC);
  98. error = devm_add_action_or_reset(dev, zet6223_power_off, ts);
  99. if (error) {
  100. dev_err(dev, "failed to install poweroff action: %d\n", error);
  101. return error;
  102. }
  103. return 0;
  104. }
  105. static int zet6223_query_device(struct zet6223_ts *ts)
  106. {
  107. u8 buf[ZET6223_CMD_INFO_LENGTH];
  108. u8 cmd = ZET6223_CMD_INFO;
  109. int ret;
  110. int error;
  111. ret = i2c_master_send(ts->client, &cmd, sizeof(cmd));
  112. if (ret != sizeof(cmd)) {
  113. error = ret < 0 ? ret : -EIO;
  114. dev_err(&ts->client->dev,
  115. "touchpanel info cmd failed: %d\n", error);
  116. return error;
  117. }
  118. ret = i2c_master_recv(ts->client, buf, sizeof(buf));
  119. if (ret != sizeof(buf)) {
  120. error = ret < 0 ? ret : -EIO;
  121. dev_err(&ts->client->dev,
  122. "failed to retrieve touchpanel info: %d\n", error);
  123. return error;
  124. }
  125. ts->fingernum = buf[15] & 0x7F;
  126. if (ts->fingernum > ZET6223_MAX_FINGERS) {
  127. dev_warn(&ts->client->dev,
  128. "touchpanel reports %d fingers, limiting to %d\n",
  129. ts->fingernum, ZET6223_MAX_FINGERS);
  130. ts->fingernum = ZET6223_MAX_FINGERS;
  131. }
  132. ts->max_x = get_unaligned_le16(&buf[8]);
  133. ts->max_y = get_unaligned_le16(&buf[10]);
  134. return 0;
  135. }
  136. static int zet6223_probe(struct i2c_client *client,
  137. const struct i2c_device_id *id)
  138. {
  139. struct device *dev = &client->dev;
  140. struct zet6223_ts *ts;
  141. struct input_dev *input;
  142. int error;
  143. if (!client->irq) {
  144. dev_err(dev, "no irq specified\n");
  145. return -EINVAL;
  146. }
  147. ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
  148. if (!ts)
  149. return -ENOMEM;
  150. ts->client = client;
  151. error = zet6223_power_on(ts);
  152. if (error)
  153. return error;
  154. error = zet6223_query_device(ts);
  155. if (error)
  156. return error;
  157. ts->input = input = devm_input_allocate_device(dev);
  158. if (!input)
  159. return -ENOMEM;
  160. input_set_drvdata(input, ts);
  161. input->name = client->name;
  162. input->id.bustype = BUS_I2C;
  163. input->open = zet6223_start;
  164. input->close = zet6223_stop;
  165. input_set_abs_params(input, ABS_MT_POSITION_X, 0, ts->max_x, 0, 0);
  166. input_set_abs_params(input, ABS_MT_POSITION_Y, 0, ts->max_y, 0, 0);
  167. touchscreen_parse_properties(input, true, &ts->prop);
  168. error = input_mt_init_slots(input, ts->fingernum,
  169. INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
  170. if (error)
  171. return error;
  172. error = devm_request_threaded_irq(dev, client->irq, NULL, zet6223_irq,
  173. IRQF_ONESHOT, client->name, ts);
  174. if (error) {
  175. dev_err(dev, "failed to request irq %d: %d\n",
  176. client->irq, error);
  177. return error;
  178. }
  179. zet6223_stop(input);
  180. error = input_register_device(input);
  181. if (error)
  182. return error;
  183. return 0;
  184. }
  185. static const struct of_device_id zet6223_of_match[] = {
  186. { .compatible = "zeitec,zet6223" },
  187. { }
  188. };
  189. MODULE_DEVICE_TABLE(of, zet6223_of_match);
  190. static const struct i2c_device_id zet6223_id[] = {
  191. { "zet6223", 0},
  192. { }
  193. };
  194. MODULE_DEVICE_TABLE(i2c, zet6223_id);
  195. static struct i2c_driver zet6223_driver = {
  196. .driver = {
  197. .name = "zet6223",
  198. .of_match_table = zet6223_of_match,
  199. },
  200. .probe = zet6223_probe,
  201. .id_table = zet6223_id
  202. };
  203. module_i2c_driver(zet6223_driver);
  204. MODULE_AUTHOR("Jelle van der Waa <[email protected]>");
  205. MODULE_DESCRIPTION("ZEITEC zet622x I2C touchscreen driver");
  206. MODULE_LICENSE("GPL");