goodix_brl_spi.c 7.4 KB

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