goodix_berlin_spi.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Goodix Berlin Touchscreen Driver
  4. *
  5. * Copyright (C) 2020 - 2021 Goodix, Inc.
  6. * Copyright (C) 2023 Linaro Ltd.
  7. *
  8. * Based on goodix_ts_berlin driver.
  9. */
  10. #include <linux/unaligned.h>
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/regmap.h>
  14. #include <linux/spi/spi.h>
  15. #include <linux/input.h>
  16. #include "goodix_berlin.h"
  17. #define GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN 1
  18. #define GOODIX_BERLIN_REGISTER_WIDTH 4
  19. #define GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A 4
  20. #define GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D 3
  21. #define GOODIX_BERLIN_SPI_READ_PREFIX_LEN_A (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
  22. GOODIX_BERLIN_REGISTER_WIDTH + \
  23. GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A)
  24. #define GOODIX_BERLIN_SPI_READ_PREFIX_LEN_D (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
  25. GOODIX_BERLIN_REGISTER_WIDTH + \
  26. GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D)
  27. #define GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
  28. GOODIX_BERLIN_REGISTER_WIDTH)
  29. #define GOODIX_BERLIN_SPI_WRITE_FLAG 0xF0
  30. #define GOODIX_BERLIN_SPI_READ_FLAG 0xF1
  31. static int goodix_berlin_spi_read(void *context, const void *reg_buf,
  32. size_t reg_size, void *val_buf,
  33. size_t val_size)
  34. {
  35. struct spi_device *spi = context;
  36. const struct goodix_berlin_ic_data *ic_data = spi_get_device_match_data(spi);
  37. struct spi_transfer xfers;
  38. struct spi_message spi_msg;
  39. const u32 *reg = reg_buf; /* reg is stored as native u32 at start of buffer */
  40. int error;
  41. if (reg_size != GOODIX_BERLIN_REGISTER_WIDTH)
  42. return -EINVAL;
  43. u8 *buf __free(kfree) =
  44. kzalloc(ic_data->read_prefix_len + val_size, GFP_KERNEL);
  45. if (!buf)
  46. return -ENOMEM;
  47. spi_message_init(&spi_msg);
  48. memset(&xfers, 0, sizeof(xfers));
  49. /* buffer format: 0xF1 + addr(4bytes) + dummy(3/4bytes) + data */
  50. buf[0] = GOODIX_BERLIN_SPI_READ_FLAG;
  51. put_unaligned_be32(*reg, buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN);
  52. memset(buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + GOODIX_BERLIN_REGISTER_WIDTH,
  53. 0xff, ic_data->read_dummy_len);
  54. xfers.tx_buf = buf;
  55. xfers.rx_buf = buf;
  56. xfers.len = ic_data->read_prefix_len + val_size;
  57. xfers.cs_change = 0;
  58. spi_message_add_tail(&xfers, &spi_msg);
  59. error = spi_sync(spi, &spi_msg);
  60. if (error < 0) {
  61. dev_err(&spi->dev, "spi transfer error, %d", error);
  62. return error;
  63. }
  64. memcpy(val_buf, buf + ic_data->read_prefix_len, val_size);
  65. return error;
  66. }
  67. static int goodix_berlin_spi_write(void *context, const void *data,
  68. size_t count)
  69. {
  70. unsigned int len = count - GOODIX_BERLIN_REGISTER_WIDTH;
  71. struct spi_device *spi = context;
  72. struct spi_transfer xfers;
  73. struct spi_message spi_msg;
  74. const u32 *reg = data; /* reg is stored as native u32 at start of buffer */
  75. int error;
  76. u8 *buf __free(kfree) =
  77. kzalloc(GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len, GFP_KERNEL);
  78. if (!buf)
  79. return -ENOMEM;
  80. spi_message_init(&spi_msg);
  81. memset(&xfers, 0, sizeof(xfers));
  82. buf[0] = GOODIX_BERLIN_SPI_WRITE_FLAG;
  83. put_unaligned_be32(*reg, buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN);
  84. memcpy(buf + GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN,
  85. data + GOODIX_BERLIN_REGISTER_WIDTH, len);
  86. xfers.tx_buf = buf;
  87. xfers.len = GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len;
  88. xfers.cs_change = 0;
  89. spi_message_add_tail(&xfers, &spi_msg);
  90. error = spi_sync(spi, &spi_msg);
  91. if (error < 0) {
  92. dev_err(&spi->dev, "spi transfer error, %d", error);
  93. return error;
  94. }
  95. return 0;
  96. }
  97. static const struct regmap_config goodix_berlin_spi_regmap_conf = {
  98. .reg_bits = 32,
  99. .val_bits = 8,
  100. .read = goodix_berlin_spi_read,
  101. .write = goodix_berlin_spi_write,
  102. };
  103. /* vendor & product left unassigned here, should probably be updated from fw info */
  104. static const struct input_id goodix_berlin_spi_input_id = {
  105. .bustype = BUS_SPI,
  106. };
  107. static int goodix_berlin_spi_probe(struct spi_device *spi)
  108. {
  109. const struct goodix_berlin_ic_data *ic_data = spi_get_device_match_data(spi);
  110. struct regmap_config regmap_config;
  111. struct regmap *regmap;
  112. size_t max_size;
  113. int error = 0;
  114. spi->mode = SPI_MODE_0;
  115. spi->bits_per_word = 8;
  116. error = spi_setup(spi);
  117. if (error)
  118. return error;
  119. max_size = spi_max_transfer_size(spi);
  120. regmap_config = goodix_berlin_spi_regmap_conf;
  121. regmap_config.max_raw_read = max_size - ic_data->read_prefix_len;
  122. regmap_config.max_raw_write = max_size - GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN;
  123. regmap = devm_regmap_init(&spi->dev, NULL, spi, &regmap_config);
  124. if (IS_ERR(regmap))
  125. return PTR_ERR(regmap);
  126. error = goodix_berlin_probe(&spi->dev, spi->irq,
  127. &goodix_berlin_spi_input_id, regmap,
  128. ic_data);
  129. if (error)
  130. return error;
  131. return 0;
  132. }
  133. static const struct goodix_berlin_ic_data gt9897_data = {
  134. .fw_version_info_addr = GOODIX_BERLIN_FW_VERSION_INFO_ADDR_A,
  135. .ic_info_addr = GOODIX_BERLIN_IC_INFO_ADDR_A,
  136. .read_dummy_len = GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A,
  137. .read_prefix_len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN_A,
  138. };
  139. static const struct goodix_berlin_ic_data gt9916_data = {
  140. .fw_version_info_addr = GOODIX_BERLIN_FW_VERSION_INFO_ADDR_D,
  141. .ic_info_addr = GOODIX_BERLIN_IC_INFO_ADDR_D,
  142. .read_dummy_len = GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D,
  143. .read_prefix_len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN_D,
  144. };
  145. static const struct spi_device_id goodix_berlin_spi_ids[] = {
  146. { .name = "gt9897", .driver_data = (long)&gt9897_data },
  147. { .name = "gt9916", .driver_data = (long)&gt9916_data },
  148. { },
  149. };
  150. MODULE_DEVICE_TABLE(spi, goodix_berlin_spi_ids);
  151. static const struct of_device_id goodix_berlin_spi_of_match[] = {
  152. { .compatible = "goodix,gt9897", .data = &gt9897_data },
  153. { .compatible = "goodix,gt9916", .data = &gt9916_data },
  154. { }
  155. };
  156. MODULE_DEVICE_TABLE(of, goodix_berlin_spi_of_match);
  157. static struct spi_driver goodix_berlin_spi_driver = {
  158. .driver = {
  159. .name = "goodix-berlin-spi",
  160. .of_match_table = goodix_berlin_spi_of_match,
  161. .pm = pm_sleep_ptr(&goodix_berlin_pm_ops),
  162. .dev_groups = goodix_berlin_groups,
  163. },
  164. .probe = goodix_berlin_spi_probe,
  165. .id_table = goodix_berlin_spi_ids,
  166. };
  167. module_spi_driver(goodix_berlin_spi_driver);
  168. MODULE_LICENSE("GPL");
  169. MODULE_DESCRIPTION("Goodix Berlin SPI Touchscreen driver");
  170. MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");