^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-2016 Synaptics Incorporated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/input/mt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/rmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "rmi_driver.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "rmi_2d_sensor.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) enum rmi_f12_object_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) RMI_F12_OBJECT_NONE = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) RMI_F12_OBJECT_FINGER = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) RMI_F12_OBJECT_STYLUS = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) RMI_F12_OBJECT_PALM = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) RMI_F12_OBJECT_UNCLASSIFIED = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) RMI_F12_OBJECT_GLOVED_FINGER = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) RMI_F12_OBJECT_NARROW_OBJECT = 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) RMI_F12_OBJECT_HAND_EDGE = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) RMI_F12_OBJECT_COVER = 0x0A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) RMI_F12_OBJECT_STYLUS_2 = 0x0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) RMI_F12_OBJECT_ERASER = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) RMI_F12_OBJECT_SMALL_OBJECT = 0x0D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define F12_DATA1_BYTES_PER_OBJ 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct f12_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct rmi_2d_sensor sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct rmi_2d_sensor_platform_data sensor_pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) bool has_dribble;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) u16 data_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct rmi_register_descriptor query_reg_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct rmi_register_descriptor control_reg_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct rmi_register_descriptor data_reg_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* F12 Data1 describes sensed objects */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) const struct rmi_register_desc_item *data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u16 data1_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* F12 Data5 describes finger ACM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) const struct rmi_register_desc_item *data5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u16 data5_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* F12 Data5 describes Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) const struct rmi_register_desc_item *data6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u16 data6_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* F12 Data9 reports relative data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) const struct rmi_register_desc_item *data9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u16 data9_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) const struct rmi_register_desc_item *data15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u16 data15_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned long *abs_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) unsigned long *rel_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) static int rmi_f12_read_sensor_tuning(struct f12_data *f12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) const struct rmi_register_desc_item *item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct rmi_2d_sensor *sensor = &f12->sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct rmi_function *fn = sensor->fn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct rmi_device *rmi_dev = fn->rmi_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u8 buf[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int pitch_x = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int pitch_y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) int rx_receivers = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int tx_receivers = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) item = rmi_get_register_desc_item(&f12->control_reg_desc, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (!item) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) "F12 does not have the sensor tuning control register\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) offset = rmi_register_desc_calc_reg_offset(&f12->control_reg_desc, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (item->reg_size > sizeof(buf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) "F12 control8 should be no bigger than %zd bytes, not: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) sizeof(buf), item->reg_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ret = rmi_read_block(rmi_dev, fn->fd.control_base_addr + offset, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) item->reg_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (rmi_register_desc_has_subpacket(item, 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) sensor->max_x = (buf[offset + 1] << 8) | buf[offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) sensor->max_y = (buf[offset + 3] << 8) | buf[offset + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) offset += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: max_x: %d max_y: %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) sensor->max_x, sensor->max_y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (rmi_register_desc_has_subpacket(item, 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) pitch_x = (buf[offset + 1] << 8) | buf[offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) pitch_y = (buf[offset + 3] << 8) | buf[offset + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) offset += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) if (rmi_register_desc_has_subpacket(item, 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* Units 1/128 sensor pitch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) rmi_dbg(RMI_DEBUG_FN, &fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) "%s: Inactive Border xlo:%d xhi:%d ylo:%d yhi:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) buf[offset], buf[offset + 1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) buf[offset + 2], buf[offset + 3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) offset += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (rmi_register_desc_has_subpacket(item, 3)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) rx_receivers = buf[offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) tx_receivers = buf[offset + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) offset += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* Skip over sensor flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (rmi_register_desc_has_subpacket(item, 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) offset += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) sensor->x_mm = (pitch_x * rx_receivers) >> 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) sensor->y_mm = (pitch_y * tx_receivers) >> 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: x_mm: %d y_mm: %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) sensor->x_mm, sensor->y_mm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static void rmi_f12_process_objects(struct f12_data *f12, u8 *data1, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct rmi_2d_sensor *sensor = &f12->sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) int objects = f12->data1->num_subpackets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if ((f12->data1->num_subpackets * F12_DATA1_BYTES_PER_OBJ) > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) objects = size / F12_DATA1_BYTES_PER_OBJ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) for (i = 0; i < objects; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct rmi_2d_sensor_abs_object *obj = &sensor->objs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) obj->type = RMI_2D_OBJECT_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) obj->mt_tool = MT_TOOL_FINGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) switch (data1[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) case RMI_F12_OBJECT_FINGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) obj->type = RMI_2D_OBJECT_FINGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) case RMI_F12_OBJECT_STYLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) obj->type = RMI_2D_OBJECT_STYLUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) obj->mt_tool = MT_TOOL_PEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) case RMI_F12_OBJECT_PALM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) obj->type = RMI_2D_OBJECT_PALM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) obj->mt_tool = MT_TOOL_PALM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) case RMI_F12_OBJECT_UNCLASSIFIED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) obj->type = RMI_2D_OBJECT_UNCLASSIFIED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) obj->x = (data1[2] << 8) | data1[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) obj->y = (data1[4] << 8) | data1[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) obj->z = data1[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) obj->wx = data1[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) obj->wy = data1[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) rmi_2d_sensor_abs_process(sensor, obj, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) data1 += F12_DATA1_BYTES_PER_OBJ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (sensor->kernel_tracking)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) input_mt_assign_slots(sensor->input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) sensor->tracking_slots,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) sensor->tracking_pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) sensor->nbr_fingers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) sensor->dmax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) for (i = 0; i < objects; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static irqreturn_t rmi_f12_attention(int irq, void *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct rmi_function *fn = ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct rmi_device *rmi_dev = fn->rmi_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct f12_data *f12 = dev_get_drvdata(&fn->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct rmi_2d_sensor *sensor = &f12->sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int valid_bytes = sensor->pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (drvdata->attn_data.data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (sensor->attn_size > drvdata->attn_data.size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) valid_bytes = drvdata->attn_data.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) valid_bytes = sensor->attn_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) memcpy(sensor->data_pkt, drvdata->attn_data.data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) valid_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) drvdata->attn_data.data += valid_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) drvdata->attn_data.size -= valid_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) retval = rmi_read_block(rmi_dev, f12->data_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) sensor->data_pkt, sensor->pkt_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) dev_err(&fn->dev, "Failed to read object data. Code: %d.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return IRQ_RETVAL(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (f12->data1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) rmi_f12_process_objects(f12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) &sensor->data_pkt[f12->data1_offset], valid_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) input_mt_sync_frame(sensor->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static int rmi_f12_write_control_regs(struct rmi_function *fn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) const struct rmi_register_desc_item *item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct rmi_device *rmi_dev = fn->rmi_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct f12_data *f12 = dev_get_drvdata(&fn->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) int control_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) u16 control_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) u8 subpacket_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (f12->has_dribble
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) && (f12->sensor.dribble != RMI_REG_STATE_DEFAULT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) item = rmi_get_register_desc_item(&f12->control_reg_desc, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (item) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) control_offset = rmi_register_desc_calc_reg_offset(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) &f12->control_reg_desc, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * The byte containing the EnableDribble bit will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * in either byte 0 or byte 2 of control 20. Depending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * on the existence of subpacket 0. If control 20 is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * larger then 3 bytes, just read the first 3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) control_size = min(item->reg_size, 3UL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) ret = rmi_read_block(rmi_dev, fn->fd.control_base_addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) + control_offset, buf, control_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (rmi_register_desc_has_subpacket(item, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) subpacket_offset += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) switch (f12->sensor.dribble) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) case RMI_REG_STATE_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) buf[subpacket_offset] &= ~BIT(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) case RMI_REG_STATE_ON:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) buf[subpacket_offset] |= BIT(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) case RMI_REG_STATE_DEFAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) ret = rmi_write_block(rmi_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) fn->fd.control_base_addr + control_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) buf, control_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) static int rmi_f12_config(struct rmi_function *fn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct rmi_driver *drv = fn->rmi_dev->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct f12_data *f12 = dev_get_drvdata(&fn->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct rmi_2d_sensor *sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) sensor = &f12->sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (!sensor->report_abs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) drv->clear_irq_bits(fn->rmi_dev, f12->abs_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) drv->set_irq_bits(fn->rmi_dev, f12->abs_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) drv->clear_irq_bits(fn->rmi_dev, f12->rel_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ret = rmi_f12_write_control_regs(fn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) dev_warn(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) "Failed to write F12 control registers: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) static int rmi_f12_probe(struct rmi_function *fn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) struct f12_data *f12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) struct rmi_device *rmi_dev = fn->rmi_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) char buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u16 query_addr = fn->fd.query_base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) const struct rmi_register_desc_item *item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct rmi_2d_sensor *sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) u16 data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) int mask_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) mask_size = BITS_TO_LONGS(drvdata->irq_count) * sizeof(unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) ret = rmi_read(fn->rmi_dev, query_addr, &buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) dev_err(&fn->dev, "Failed to read general info register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ++query_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) if (!(buf & BIT(0))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) "Behavior of F12 without register descriptors is undefined.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (!f12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) f12->abs_mask = (unsigned long *)((char *)f12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) + sizeof(struct f12_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) f12->rel_mask = (unsigned long *)((char *)f12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) + sizeof(struct f12_data) + mask_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) set_bit(fn->irq_pos, f12->abs_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) set_bit(fn->irq_pos + 1, f12->rel_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) f12->has_dribble = !!(buf & BIT(3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) if (fn->dev.of_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) ret = rmi_2d_sensor_of_probe(&fn->dev, &f12->sensor_pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) f12->sensor_pdata = pdata->sensor_pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) ret = rmi_read_register_desc(rmi_dev, query_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) &f12->query_reg_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) "Failed to read the Query Register Descriptor: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) query_addr += 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ret = rmi_read_register_desc(rmi_dev, query_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) &f12->control_reg_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) "Failed to read the Control Register Descriptor: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) query_addr += 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) ret = rmi_read_register_desc(rmi_dev, query_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) &f12->data_reg_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) dev_err(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) "Failed to read the Data Register Descriptor: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) query_addr += 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) sensor = &f12->sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) sensor->fn = fn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) f12->data_addr = fn->fd.data_base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) sensor->pkt_size = rmi_register_desc_calc_size(&f12->data_reg_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) sensor->axis_align =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) f12->sensor_pdata.axis_align;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) sensor->x_mm = f12->sensor_pdata.x_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) sensor->y_mm = f12->sensor_pdata.y_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) sensor->dribble = f12->sensor_pdata.dribble;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (sensor->sensor_type == rmi_sensor_default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) sensor->sensor_type =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) f12->sensor_pdata.sensor_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) sensor->pkt_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) sensor->data_pkt = devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) if (!sensor->data_pkt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) dev_set_drvdata(&fn->dev, f12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) ret = rmi_f12_read_sensor_tuning(f12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * Figure out what data is contained in the data registers. HID devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * may have registers defined, but their data is not reported in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * HID attention report. Registers which are not reported in the HID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) * attention report check to see if the device is receiving data from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) * HID attention reports.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) item = rmi_get_register_desc_item(&f12->data_reg_desc, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) item = rmi_get_register_desc_item(&f12->data_reg_desc, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (item) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) f12->data1 = item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) f12->data1_offset = data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) sensor->nbr_fingers = item->num_subpackets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) sensor->report_abs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) sensor->attn_size += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) item = rmi_get_register_desc_item(&f12->data_reg_desc, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) item = rmi_get_register_desc_item(&f12->data_reg_desc, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) item = rmi_get_register_desc_item(&f12->data_reg_desc, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) item = rmi_get_register_desc_item(&f12->data_reg_desc, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) if (item) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) f12->data5 = item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) f12->data5_offset = data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) sensor->attn_size += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) item = rmi_get_register_desc_item(&f12->data_reg_desc, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (item && !drvdata->attn_data.data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) f12->data6 = item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) f12->data6_offset = data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) item = rmi_get_register_desc_item(&f12->data_reg_desc, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) item = rmi_get_register_desc_item(&f12->data_reg_desc, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) item = rmi_get_register_desc_item(&f12->data_reg_desc, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) if (item && !drvdata->attn_data.data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) f12->data9 = item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) f12->data9_offset = data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (!sensor->report_abs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) sensor->report_rel = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) item = rmi_get_register_desc_item(&f12->data_reg_desc, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) item = rmi_get_register_desc_item(&f12->data_reg_desc, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) item = rmi_get_register_desc_item(&f12->data_reg_desc, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) item = rmi_get_register_desc_item(&f12->data_reg_desc, 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) item = rmi_get_register_desc_item(&f12->data_reg_desc, 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (item && !drvdata->attn_data.data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) item = rmi_get_register_desc_item(&f12->data_reg_desc, 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) if (item && !drvdata->attn_data.data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) f12->data15 = item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) f12->data15_offset = data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) data_offset += item->reg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) /* allocate the in-kernel tracking buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) sensor->tracking_pos = devm_kcalloc(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) sensor->nbr_fingers, sizeof(struct input_mt_pos),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) sensor->tracking_slots = devm_kcalloc(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) sensor->nbr_fingers, sizeof(int), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) sensor->objs = devm_kcalloc(&fn->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) sensor->nbr_fingers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) sizeof(struct rmi_2d_sensor_abs_object),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (!sensor->tracking_pos || !sensor->tracking_slots || !sensor->objs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) ret = rmi_2d_sensor_configure_input(fn, sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) struct rmi_function_handler rmi_f12_handler = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) .name = "rmi4_f12",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) .func = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) .probe = rmi_f12_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) .config = rmi_f12_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) .attention = rmi_f12_attention,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) };