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