goodix_brl_i2c.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*
  2. * Goodix Touchscreen Driver
  3. * Copyright (C) 2020 - 2021 Goodix, Inc.
  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 as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be a reference
  11. * to you, when you are integrating the GOODiX's CTP IC into your system,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. */
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/i2c.h>
  20. #include <linux/version.h>
  21. #include "goodix_ts_core.h"
  22. #define TS_DRIVER_NAME "gtx8_i2c"
  23. #define I2C_MAX_TRANSFER_SIZE 256
  24. #define GOODIX_BUS_RETRY_TIMES 2
  25. #define GOODIX_REG_ADDR_SIZE 4
  26. static struct platform_device *goodix_pdev;
  27. struct goodix_bus_interface goodix_i2c_bus;
  28. static int goodix_i2c_read(struct device *dev, unsigned int reg,
  29. unsigned char *data, unsigned int len)
  30. {
  31. struct i2c_client *client = to_i2c_client(dev);
  32. unsigned int transfer_length = 0;
  33. unsigned int pos = 0, address = reg;
  34. unsigned char get_buf[128], addr_buf[GOODIX_REG_ADDR_SIZE];
  35. int retry, r = 0;
  36. struct i2c_msg msgs[] = {
  37. {
  38. .addr = client->addr,
  39. .flags = !I2C_M_RD,
  40. .buf = &addr_buf[0],
  41. .len = GOODIX_REG_ADDR_SIZE,
  42. }, {
  43. .addr = client->addr,
  44. .flags = I2C_M_RD,
  45. }
  46. };
  47. if (likely(len < sizeof(get_buf))) {
  48. /* code optimize, use stack memory */
  49. msgs[1].buf = &get_buf[0];
  50. } else {
  51. msgs[1].buf = kzalloc(len, GFP_KERNEL);
  52. if (msgs[1].buf == NULL)
  53. return -ENOMEM;
  54. }
  55. while (pos != len) {
  56. if (unlikely(len - pos > I2C_MAX_TRANSFER_SIZE))
  57. transfer_length = I2C_MAX_TRANSFER_SIZE;
  58. else
  59. transfer_length = len - pos;
  60. msgs[0].buf[0] = (address >> 24) & 0xFF;
  61. msgs[0].buf[1] = (address >> 16) & 0xFF;
  62. msgs[0].buf[2] = (address >> 8) & 0xFF;
  63. msgs[0].buf[3] = address & 0xFF;
  64. msgs[1].len = transfer_length;
  65. for (retry = 0; retry < GOODIX_BUS_RETRY_TIMES; retry++) {
  66. if (likely(i2c_transfer(client->adapter, msgs, 2) == 2)) {
  67. memcpy(&data[pos], msgs[1].buf, transfer_length);
  68. pos += transfer_length;
  69. address += transfer_length;
  70. break;
  71. }
  72. ts_info("I2c read retry[%d]:0x%x", retry + 1, reg);
  73. usleep_range(2000, 2100);
  74. }
  75. if (unlikely(retry == GOODIX_BUS_RETRY_TIMES)) {
  76. ts_err("I2c read failed,dev:%02x,reg:%04x,size:%u",
  77. client->addr, reg, len);
  78. r = -EAGAIN;
  79. goto read_exit;
  80. }
  81. }
  82. read_exit:
  83. if (unlikely(len >= sizeof(get_buf)))
  84. kfree(msgs[1].buf);
  85. return r;
  86. }
  87. static int goodix_i2c_write(struct device *dev, unsigned int reg,
  88. unsigned char *data, unsigned int len)
  89. {
  90. struct i2c_client *client = to_i2c_client(dev);
  91. unsigned int pos = 0, transfer_length = 0;
  92. unsigned int address = reg;
  93. unsigned char put_buf[128];
  94. int retry, r = 0;
  95. struct i2c_msg msg = {
  96. .addr = client->addr,
  97. .flags = !I2C_M_RD,
  98. };
  99. if (likely(len + GOODIX_REG_ADDR_SIZE < sizeof(put_buf))) {
  100. /* code optimize,use stack memory*/
  101. msg.buf = &put_buf[0];
  102. } else {
  103. msg.buf = kmalloc(len + GOODIX_REG_ADDR_SIZE, GFP_KERNEL);
  104. if (msg.buf == NULL)
  105. return -ENOMEM;
  106. }
  107. while (pos != len) {
  108. if (unlikely(len - pos > I2C_MAX_TRANSFER_SIZE -
  109. GOODIX_REG_ADDR_SIZE))
  110. transfer_length = I2C_MAX_TRANSFER_SIZE -
  111. GOODIX_REG_ADDR_SIZE;
  112. else
  113. transfer_length = len - pos;
  114. msg.buf[0] = (address >> 24) & 0xFF;
  115. msg.buf[1] = (address >> 16) & 0xFF;
  116. msg.buf[2] = (address >> 8) & 0xFF;
  117. msg.buf[3] = address & 0xFF;
  118. msg.len = transfer_length + GOODIX_REG_ADDR_SIZE;
  119. memcpy(&msg.buf[GOODIX_REG_ADDR_SIZE],
  120. &data[pos], transfer_length);
  121. for (retry = 0; retry < GOODIX_BUS_RETRY_TIMES; retry++) {
  122. if (likely(i2c_transfer(client->adapter,
  123. &msg, 1) == 1)) {
  124. pos += transfer_length;
  125. address += transfer_length;
  126. break;
  127. }
  128. ts_debug("I2c write retry[%d]", retry + 1);
  129. msleep(20);
  130. }
  131. if (unlikely(retry == GOODIX_BUS_RETRY_TIMES)) {
  132. ts_err("I2c write failed,dev:%02x,reg:%04x,size:%u",
  133. client->addr, reg, len);
  134. r = -EAGAIN;
  135. goto write_exit;
  136. }
  137. }
  138. write_exit:
  139. if (likely(len + GOODIX_REG_ADDR_SIZE >= sizeof(put_buf)))
  140. kfree(msg.buf);
  141. return r;
  142. }
  143. static void goodix_pdev_release(struct device *dev)
  144. {
  145. ts_info("goodix pdev released");
  146. kfree(goodix_pdev);
  147. }
  148. static int goodix_i2c_probe(struct i2c_client *client,
  149. const struct i2c_device_id *dev_id)
  150. {
  151. int ret = 0;
  152. ts_info("goodix i2c probe in");
  153. #ifndef CONFIG_ARCH_QTI_VM
  154. ret = i2c_check_functionality(client->adapter, I2C_FUNC_I2C);
  155. if (!ret)
  156. return -EIO;
  157. #endif
  158. /* get ic type */
  159. ret = goodix_get_ic_type(client->dev.of_node);
  160. if (ret < 0)
  161. return ret;
  162. goodix_i2c_bus.ic_type = ret;
  163. goodix_i2c_bus.bus_type = GOODIX_BUS_TYPE_I2C;
  164. goodix_i2c_bus.dev = &client->dev;
  165. goodix_i2c_bus.read = goodix_i2c_read;
  166. goodix_i2c_bus.write = goodix_i2c_write;
  167. /* ts core device */
  168. goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
  169. if (!goodix_pdev)
  170. return -ENOMEM;
  171. goodix_pdev->name = GOODIX_CORE_DRIVER_NAME;
  172. goodix_pdev->id = 0;
  173. goodix_pdev->num_resources = 0;
  174. /*
  175. * you can find this platform dev in
  176. * /sys/devices/platform/goodix_ts.0
  177. * goodix_pdev->dev.parent = &client->dev;
  178. */
  179. goodix_pdev->dev.platform_data = &goodix_i2c_bus;
  180. goodix_pdev->dev.release = goodix_pdev_release;
  181. /* register platform device, then the goodix_ts_core
  182. * module will probe the touch device.
  183. */
  184. ret = platform_device_register(goodix_pdev);
  185. if (ret) {
  186. ts_err("failed register goodix platform device, %d", ret);
  187. goto err_pdev;
  188. }
  189. ts_info("i2c probe out");
  190. return ret;
  191. err_pdev:
  192. kfree(goodix_pdev);
  193. goodix_pdev = NULL;
  194. ts_info("i2c probe out, %d", ret);
  195. return ret;
  196. }
  197. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
  198. static void goodix_i2c_remove(struct i2c_client *client)
  199. {
  200. platform_device_unregister(goodix_pdev);
  201. }
  202. #else
  203. static int goodix_i2c_remove(struct i2c_client *client)
  204. {
  205. platform_device_unregister(goodix_pdev);
  206. return 0;
  207. }
  208. #endif
  209. #ifdef CONFIG_OF
  210. static const struct of_device_id i2c_matchs[] = {
  211. {.compatible = "goodix,gt9897",},
  212. {.compatible = "goodix,gt9966",},
  213. {.compatible = "goodix,gt9916",},
  214. {},
  215. };
  216. MODULE_DEVICE_TABLE(of, i2c_matchs);
  217. #endif
  218. static const struct i2c_device_id i2c_id_table[] = {
  219. {TS_DRIVER_NAME, 0},
  220. {},
  221. };
  222. MODULE_DEVICE_TABLE(i2c, i2c_id_table);
  223. static struct i2c_driver goodix_i2c_driver = {
  224. .driver = {
  225. .name = TS_DRIVER_NAME,
  226. //.owner = THIS_MODULE,
  227. .of_match_table = of_match_ptr(i2c_matchs),
  228. },
  229. .probe = goodix_i2c_probe,
  230. .remove = goodix_i2c_remove,
  231. .id_table = i2c_id_table,
  232. };
  233. int goodix_i2c_bus_init(void)
  234. {
  235. ts_info("Goodix i2c driver init");
  236. return i2c_add_driver(&goodix_i2c_driver);
  237. }
  238. void goodix_i2c_bus_exit(void)
  239. {
  240. ts_info("Goodix i2c driver exit");
  241. i2c_del_driver(&goodix_i2c_driver);
  242. }