goodix_brl_i2c.c 6.6 KB

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