goodix_brl_spi.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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/spi/spi.h>
  20. #include <linux/version.h>
  21. #include "goodix_ts_core.h"
  22. #define TS_DRIVER_NAME "gtx8_spi"
  23. #define SPI_TRANS_PREFIX_LEN 1
  24. #define REGISTER_WIDTH 4
  25. #define SPI_READ_DUMMY_LEN 4
  26. #define SPI_READ_PREFIX_LEN \
  27. (SPI_TRANS_PREFIX_LEN + REGISTER_WIDTH + SPI_READ_DUMMY_LEN)
  28. #define SPI_WRITE_PREFIX_LEN (SPI_TRANS_PREFIX_LEN + REGISTER_WIDTH)
  29. #define SPI_WRITE_FLAG 0xF0
  30. #define SPI_READ_FLAG 0xF1
  31. static struct platform_device *goodix_pdev;
  32. struct goodix_bus_interface goodix_spi_bus[MAX_SUPPORTED_TOUCH_PANELS];
  33. /**
  34. * goodix_spi_read_bra- read device register through spi bus
  35. * @dev: pointer to device data
  36. * @addr: register address
  37. * @data: read buffer
  38. * @len: bytes to read
  39. * return: 0 - read ok, < 0 - spi transter error
  40. */
  41. static int goodix_spi_read_bra(struct device *dev, unsigned int addr,
  42. unsigned char *data, unsigned int len)
  43. {
  44. struct spi_device *spi = to_spi_device(dev);
  45. u8 *rx_buf = NULL;
  46. u8 *tx_buf = NULL;
  47. struct spi_transfer xfers;
  48. struct spi_message spi_msg;
  49. int ret = 0;
  50. rx_buf = kzalloc(SPI_READ_PREFIX_LEN + len, GFP_KERNEL);
  51. tx_buf = kzalloc(SPI_READ_PREFIX_LEN + len, GFP_KERNEL);
  52. if (!rx_buf || !tx_buf) {
  53. ts_err("alloc tx/rx_buf failed, size:%d",
  54. SPI_READ_PREFIX_LEN + len);
  55. return -ENOMEM;
  56. }
  57. spi_message_init(&spi_msg);
  58. memset(&xfers, 0, sizeof(xfers));
  59. /*spi_read tx_buf format: 0xF1 + addr(4bytes) + data*/
  60. tx_buf[0] = SPI_READ_FLAG;
  61. tx_buf[1] = (addr >> 24) & 0xFF;
  62. tx_buf[2] = (addr >> 16) & 0xFF;
  63. tx_buf[3] = (addr >> 8) & 0xFF;
  64. tx_buf[4] = addr & 0xFF;
  65. tx_buf[5] = 0xFF;
  66. tx_buf[6] = 0xFF;
  67. tx_buf[7] = 0xFF;
  68. tx_buf[8] = 0xFF;
  69. xfers.tx_buf = tx_buf;
  70. xfers.rx_buf = rx_buf;
  71. xfers.len = SPI_READ_PREFIX_LEN + len;
  72. xfers.cs_change = 0;
  73. spi_message_add_tail(&xfers, &spi_msg);
  74. ret = spi_sync(spi, &spi_msg);
  75. if (ret < 0) {
  76. ts_err("spi transfer error:%d", ret);
  77. goto exit;
  78. }
  79. memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN], len);
  80. exit:
  81. kfree(rx_buf);
  82. kfree(tx_buf);
  83. return ret;
  84. }
  85. static int goodix_spi_read(struct device *dev, unsigned int addr,
  86. unsigned char *data, unsigned int len)
  87. {
  88. struct spi_device *spi = to_spi_device(dev);
  89. u8 *rx_buf = NULL;
  90. u8 *tx_buf = NULL;
  91. struct spi_transfer xfers;
  92. struct spi_message spi_msg;
  93. int ret = 0;
  94. rx_buf = kzalloc(SPI_READ_PREFIX_LEN - 1 + len, GFP_KERNEL);
  95. tx_buf = kzalloc(SPI_READ_PREFIX_LEN - 1 + len, GFP_KERNEL);
  96. if (!rx_buf || !tx_buf) {
  97. ts_err("alloc tx/rx_buf failed, size:%d",
  98. SPI_READ_PREFIX_LEN - 1 + len);
  99. return -ENOMEM;
  100. }
  101. spi_message_init(&spi_msg);
  102. memset(&xfers, 0, sizeof(xfers));
  103. /*spi_read tx_buf format: 0xF1 + addr(4bytes) + data*/
  104. tx_buf[0] = SPI_READ_FLAG;
  105. tx_buf[1] = (addr >> 24) & 0xFF;
  106. tx_buf[2] = (addr >> 16) & 0xFF;
  107. tx_buf[3] = (addr >> 8) & 0xFF;
  108. tx_buf[4] = addr & 0xFF;
  109. tx_buf[5] = 0xFF;
  110. tx_buf[6] = 0xFF;
  111. tx_buf[7] = 0xFF;
  112. xfers.tx_buf = tx_buf;
  113. xfers.rx_buf = rx_buf;
  114. xfers.len = SPI_READ_PREFIX_LEN - 1 + len;
  115. xfers.cs_change = 0;
  116. spi_message_add_tail(&xfers, &spi_msg);
  117. ret = spi_sync(spi, &spi_msg);
  118. if (ret < 0) {
  119. ts_err("spi transfer error:%d", ret);
  120. goto exit;
  121. }
  122. memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN - 1], len);
  123. exit:
  124. kfree(rx_buf);
  125. kfree(tx_buf);
  126. return ret;
  127. }
  128. /**
  129. * goodix_spi_write- write device register through spi bus
  130. * @dev: pointer to device data
  131. * @addr: register address
  132. * @data: write buffer
  133. * @len: bytes to write
  134. * return: 0 - write ok; < 0 - spi transter error.
  135. */
  136. static int goodix_spi_write(struct device *dev, unsigned int addr,
  137. unsigned char *data, unsigned int len)
  138. {
  139. struct spi_device *spi = to_spi_device(dev);
  140. u8 *tx_buf = NULL;
  141. struct spi_transfer xfers;
  142. struct spi_message spi_msg;
  143. int ret = 0;
  144. tx_buf = kzalloc(SPI_WRITE_PREFIX_LEN + len, GFP_KERNEL);
  145. if (!tx_buf)
  146. return -ENOMEM;
  147. spi_message_init(&spi_msg);
  148. memset(&xfers, 0, sizeof(xfers));
  149. tx_buf[0] = SPI_WRITE_FLAG;
  150. tx_buf[1] = (addr >> 24) & 0xFF;
  151. tx_buf[2] = (addr >> 16) & 0xFF;
  152. tx_buf[3] = (addr >> 8) & 0xFF;
  153. tx_buf[4] = addr & 0xFF;
  154. memcpy(&tx_buf[SPI_WRITE_PREFIX_LEN], data, len);
  155. xfers.tx_buf = tx_buf;
  156. xfers.len = SPI_WRITE_PREFIX_LEN + len;
  157. xfers.cs_change = 0;
  158. spi_message_add_tail(&xfers, &spi_msg);
  159. ret = spi_sync(spi, &spi_msg);
  160. if (ret < 0)
  161. ts_err("spi transfer error:%d", ret);
  162. kfree(tx_buf);
  163. return ret;
  164. }
  165. static void goodix_pdev_release(struct device *dev)
  166. {
  167. ts_info("goodix pdev released");
  168. kfree(goodix_pdev);
  169. }
  170. static int goodix_spi_probe(struct spi_device *spi)
  171. {
  172. int ret = 0, idx;
  173. ts_info("goodix spi probe in");
  174. /* init spi_device */
  175. spi->mode = SPI_MODE_0;
  176. spi->bits_per_word = 8;
  177. ret = spi_setup(spi);
  178. if (ret) {
  179. ts_err("failed set spi mode, %d", ret);
  180. return ret;
  181. }
  182. /* get ic type */
  183. ret = goodix_get_ic_type(spi->dev.of_node);
  184. if (ret < 0)
  185. return ret;
  186. idx = goodix_get_touch_type(spi->dev.of_node);
  187. if (idx < 0 || idx >= MAX_SUPPORTED_TOUCH_PANELS) {
  188. ts_err("unsupported touch type idx:%d", idx);
  189. return -ENODEV;
  190. }
  191. goodix_spi_bus[idx].ic_type = ret;
  192. goodix_spi_bus[idx].bus_type = GOODIX_BUS_TYPE_SPI;
  193. goodix_spi_bus[idx].dev = &spi->dev;
  194. if (goodix_spi_bus[idx].ic_type == IC_TYPE_BERLIN_A)
  195. goodix_spi_bus[idx].read = goodix_spi_read_bra;
  196. else
  197. goodix_spi_bus[idx].read = goodix_spi_read;
  198. goodix_spi_bus[idx].write = goodix_spi_write;
  199. /* ts core device */
  200. goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
  201. if (!goodix_pdev)
  202. return -ENOMEM;
  203. if (idx)
  204. goodix_pdev->name = GOODIX_CORE_DEVICE_2_NAME;
  205. else
  206. goodix_pdev->name = GOODIX_CORE_DEVICE_NAME;
  207. goodix_pdev->id = 0;
  208. goodix_pdev->num_resources = 0;
  209. /*
  210. * you can find this platform dev in
  211. * /sys/devices/platfrom/goodix_ts.0
  212. * goodix_pdev->dev.parent = &client->dev;
  213. */
  214. goodix_pdev->dev.platform_data = &goodix_spi_bus[idx];
  215. goodix_pdev->dev.release = goodix_pdev_release;
  216. /*
  217. * register platform device, then the goodix_ts_core
  218. * module will probe the touch deivce.
  219. */
  220. ret = platform_device_register(goodix_pdev);
  221. if (ret) {
  222. ts_err("failed register goodix platform device, %d", ret);
  223. goto err_pdev;
  224. }
  225. ts_info("spi probe out");
  226. return 0;
  227. err_pdev:
  228. kfree(goodix_pdev);
  229. goodix_pdev = NULL;
  230. ts_info("spi probe out, %d", ret);
  231. return ret;
  232. }
  233. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
  234. static void goodix_spi_remove(struct spi_device *spi)
  235. {
  236. platform_device_unregister(goodix_pdev);
  237. }
  238. #else
  239. static int goodix_spi_remove(struct spi_device *spi)
  240. {
  241. platform_device_unregister(goodix_pdev);
  242. return 0;
  243. }
  244. #endif
  245. #ifdef CONFIG_OF
  246. static const struct of_device_id spi_matchs[] = {
  247. {.compatible = "goodix,gt9897S",},
  248. {.compatible = "goodix,gt9897T",},
  249. {.compatible = "goodix,gt9966S",},
  250. {.compatible = "goodix,gt9916S",},
  251. {.compatible = "goodix,gt9916S2",},
  252. {},
  253. };
  254. #endif
  255. static const struct spi_device_id spi_id_table[] = {
  256. {TS_DRIVER_NAME, 0},
  257. {},
  258. };
  259. static struct spi_driver goodix_spi_driver = {
  260. .driver = {
  261. .name = TS_DRIVER_NAME,
  262. //.owner = THIS_MODULE,
  263. .of_match_table = spi_matchs,
  264. },
  265. .id_table = spi_id_table,
  266. .probe = goodix_spi_probe,
  267. .remove = goodix_spi_remove,
  268. };
  269. int goodix_spi_bus_init(void)
  270. {
  271. ts_info("Goodix spi driver init");
  272. return spi_register_driver(&goodix_spi_driver);
  273. }
  274. void goodix_spi_bus_exit(void)
  275. {
  276. ts_info("Goodix spi driver exit");
  277. spi_unregister_driver(&goodix_spi_driver);
  278. }