rmi_f55.c 3.3 KB

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