goodix_brl_spi.c 7.7 KB

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