rmi_f55.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2015 Synaptics Incorporated
  4. * Copyright (C) 2016 Zodiac Inflight Innovations
  5. */
  6. #include <linux/bitops.h>
  7. #include <linux/kernel.h>
  8. #include <linux/rmi.h>
  9. #include <linux/slab.h>
  10. #include "rmi_driver.h"
  11. #define F55_NAME "rmi4_f55"
  12. /* F55 data offsets */
  13. #define F55_NUM_RX_OFFSET 0
  14. #define F55_NUM_TX_OFFSET 1
  15. #define F55_PHYS_CHAR_OFFSET 2
  16. /* Only read required query registers */
  17. #define F55_QUERY_LEN 3
  18. /* F55 capabilities */
  19. #define F55_CAP_SENSOR_ASSIGN BIT(0)
  20. struct f55_data {
  21. struct rmi_function *fn;
  22. u8 qry[F55_QUERY_LEN];
  23. u8 num_rx_electrodes;
  24. u8 cfg_num_rx_electrodes;
  25. u8 num_tx_electrodes;
  26. u8 cfg_num_tx_electrodes;
  27. };
  28. static int rmi_f55_detect(struct rmi_function *fn)
  29. {
  30. struct rmi_device *rmi_dev = fn->rmi_dev;
  31. struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev);
  32. struct f55_data *f55;
  33. int error;
  34. f55 = dev_get_drvdata(&fn->dev);
  35. error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr,
  36. &f55->qry, sizeof(f55->qry));
  37. if (error) {
  38. dev_err(&fn->dev, "%s: Failed to query F55 properties\n",
  39. __func__);
  40. return error;
  41. }
  42. f55->num_rx_electrodes = f55->qry[F55_NUM_RX_OFFSET];
  43. f55->num_tx_electrodes = f55->qry[F55_NUM_TX_OFFSET];
  44. f55->cfg_num_rx_electrodes = f55->num_rx_electrodes;
  45. f55->cfg_num_tx_electrodes = f55->num_rx_electrodes;
  46. drv_data->num_rx_electrodes = f55->cfg_num_rx_electrodes;
  47. drv_data->num_tx_electrodes = f55->cfg_num_rx_electrodes;
  48. if (f55->qry[F55_PHYS_CHAR_OFFSET] & F55_CAP_SENSOR_ASSIGN) {
  49. int i, total;
  50. u8 buf[256];
  51. /*
  52. * Calculate the number of enabled receive and transmit
  53. * electrodes by reading F55:Ctrl1 (sensor receiver assignment)
  54. * and F55:Ctrl2 (sensor transmitter assignment). The number of
  55. * enabled electrodes is the sum of all field entries with a
  56. * value other than 0xff.
  57. */
  58. error = rmi_read_block(fn->rmi_dev,
  59. fn->fd.control_base_addr + 1,
  60. buf, f55->num_rx_electrodes);
  61. if (!error) {
  62. total = 0;
  63. for (i = 0; i < f55->num_rx_electrodes; i++) {
  64. if (buf[i] != 0xff)
  65. total++;
  66. }
  67. f55->cfg_num_rx_electrodes = total;
  68. drv_data->num_rx_electrodes = total;
  69. }
  70. error = rmi_read_block(fn->rmi_dev,
  71. fn->fd.control_base_addr + 2,
  72. buf, f55->num_tx_electrodes);
  73. if (!error) {
  74. total = 0;
  75. for (i = 0; i < f55->num_tx_electrodes; i++) {
  76. if (buf[i] != 0xff)
  77. total++;
  78. }
  79. f55->cfg_num_tx_electrodes = total;
  80. drv_data->num_tx_electrodes = total;
  81. }
  82. }
  83. rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F55 num_rx_electrodes: %d (raw %d)\n",
  84. f55->cfg_num_rx_electrodes, f55->num_rx_electrodes);
  85. rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F55 num_tx_electrodes: %d (raw %d)\n",
  86. f55->cfg_num_tx_electrodes, f55->num_tx_electrodes);
  87. return 0;
  88. }
  89. static int rmi_f55_probe(struct rmi_function *fn)
  90. {
  91. struct f55_data *f55;
  92. f55 = devm_kzalloc(&fn->dev, sizeof(struct f55_data), GFP_KERNEL);
  93. if (!f55)
  94. return -ENOMEM;
  95. f55->fn = fn;
  96. dev_set_drvdata(&fn->dev, f55);
  97. return rmi_f55_detect(fn);
  98. }
  99. struct rmi_function_handler rmi_f55_handler = {
  100. .driver = {
  101. .name = F55_NAME,
  102. },
  103. .func = 0x55,
  104. .probe = rmi_f55_probe,
  105. };