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,
  66. msgs, 2) == 2)) {
  67. memcpy(&data[pos], msgs[1].buf,
  68. transfer_length);
  69. pos += transfer_length;
  70. address += transfer_length;
  71. break;
  72. }
  73. ts_info("I2c read retry[%d]:0x%x", retry + 1, reg);
  74. usleep_range(2000, 2100);
  75. }
  76. if (unlikely(retry == GOODIX_BUS_RETRY_TIMES)) {
  77. ts_err("I2c read failed,dev:%02x,reg:%04x,size:%u",
  78. client->addr, reg, len);
  79. r = -EAGAIN;
  80. goto read_exit;
  81. }
  82. }
  83. read_exit:
  84. if (unlikely(len >= sizeof(get_buf)))
  85. kfree(msgs[1].buf);
  86. return r;
  87. }
  88. static int goodix_i2c_write(struct device *dev, unsigned int reg,
  89. unsigned char *data, unsigned int len)
  90. {
  91. struct i2c_client *client = to_i2c_client(dev);
  92. unsigned int pos = 0, transfer_length = 0;
  93. unsigned int address = reg;
  94. unsigned char put_buf[128];
  95. int retry, r = 0;
  96. struct i2c_msg msg = {
  97. .addr = client->addr,
  98. .flags = !I2C_M_RD,
  99. };
  100. if (likely(len + GOODIX_REG_ADDR_SIZE < sizeof(put_buf))) {
  101. /* code optimize,use stack memory*/
  102. msg.buf = &put_buf[0];
  103. } else {
  104. msg.buf = kmalloc(len + GOODIX_REG_ADDR_SIZE, GFP_KERNEL);
  105. if (msg.buf == NULL)
  106. return -ENOMEM;
  107. }
  108. while (pos != len) {
  109. if (unlikely(len - pos > I2C_MAX_TRANSFER_SIZE -
  110. GOODIX_REG_ADDR_SIZE))
  111. transfer_length = I2C_MAX_TRANSFER_SIZE -
  112. GOODIX_REG_ADDR_SIZE;
  113. else
  114. transfer_length = len - pos;
  115. msg.buf[0] = (address >> 24) & 0xFF;
  116. msg.buf[1] = (address >> 16) & 0xFF;
  117. msg.buf[2] = (address >> 8) & 0xFF;
  118. msg.buf[3] = address & 0xFF;
  119. msg.len = transfer_length + GOODIX_REG_ADDR_SIZE;
  120. memcpy(&msg.buf[GOODIX_REG_ADDR_SIZE],
  121. &data[pos], transfer_length);
  122. for (retry = 0; retry < GOODIX_BUS_RETRY_TIMES; retry++) {
  123. if (likely(i2c_transfer(client->adapter,
  124. &msg, 1) == 1)) {
  125. pos += transfer_length;
  126. address += transfer_length;
  127. break;
  128. }
  129. ts_debug("I2c write retry[%d]", retry + 1);
  130. msleep(20);
  131. }
  132. if (unlikely(retry == GOODIX_BUS_RETRY_TIMES)) {
  133. ts_err("I2c write failed,dev:%02x,reg:%04x,size:%u",
  134. client->addr, reg, len);
  135. r = -EAGAIN;
  136. goto write_exit;
  137. }
  138. }
  139. write_exit:
  140. if (likely(len + GOODIX_REG_ADDR_SIZE >= sizeof(put_buf)))
  141. kfree(msg.buf);
  142. return r;
  143. }
  144. static void goodix_pdev_release(struct device *dev)
  145. {
  146. ts_info("goodix pdev released");
  147. kfree(goodix_pdev);
  148. }
  149. static int goodix_i2c_probe(struct i2c_client *client,
  150. const struct i2c_device_id *dev_id)
  151. {
  152. int ret = 0;
  153. ts_info("goodix i2c probe in");
  154. ret = i2c_check_functionality(client->adapter,
  155. I2C_FUNC_I2C);
  156. if (!ret)
  157. return -EIO;
  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. static int goodix_i2c_remove(struct i2c_client *client)
  198. {
  199. platform_device_unregister(goodix_pdev);
  200. return 0;
  201. }
  202. #ifdef CONFIG_OF
  203. static const struct of_device_id i2c_matchs[] = {
  204. {.compatible = "goodix,gt9897",},
  205. {.compatible = "goodix,gt9966",},
  206. {.compatible = "goodix,gt9916",},
  207. {},
  208. };
  209. MODULE_DEVICE_TABLE(of, i2c_matchs);
  210. #endif
  211. static const struct i2c_device_id i2c_id_table[] = {
  212. {TS_DRIVER_NAME, 0},
  213. {},
  214. };
  215. MODULE_DEVICE_TABLE(i2c, i2c_id_table);
  216. static struct i2c_driver goodix_i2c_driver = {
  217. .driver = {
  218. .name = TS_DRIVER_NAME,
  219. //.owner = THIS_MODULE,
  220. .of_match_table = of_match_ptr(i2c_matchs),
  221. },
  222. .probe = goodix_i2c_probe,
  223. .remove = goodix_i2c_remove,
  224. .id_table = i2c_id_table,
  225. };
  226. int goodix_i2c_bus_init(void)
  227. {
  228. ts_info("Goodix i2c driver init");
  229. return i2c_add_driver(&goodix_i2c_driver);
  230. }
  231. void goodix_i2c_bus_exit(void)
  232. {
  233. ts_info("Goodix i2c driver exit");
  234. i2c_del_driver(&goodix_i2c_driver);
  235. }