1*a9c95d17SMarge Yang // SPDX-License-Identifier: GPL-2.0-only
2*a9c95d17SMarge Yang /*
3*a9c95d17SMarge Yang * Copyright (c) 2012-2025 Synaptics Incorporated
4*a9c95d17SMarge Yang */
5*a9c95d17SMarge Yang
6*a9c95d17SMarge Yang #include <linux/bits.h>
7*a9c95d17SMarge Yang #include <linux/dev_printk.h>
8*a9c95d17SMarge Yang #include <linux/kernel.h>
9*a9c95d17SMarge Yang #include <linux/rmi.h>
10*a9c95d17SMarge Yang #include <linux/input.h>
11*a9c95d17SMarge Yang #include <linux/slab.h>
12*a9c95d17SMarge Yang #include "rmi_driver.h"
13*a9c95d17SMarge Yang
14*a9c95d17SMarge Yang #define RMI_F21_SENSOR_COUNT_MASK GENMASK(3, 0)
15*a9c95d17SMarge Yang #define RMI_F21_FINGER_COUNT_PRESENT BIT(5)
16*a9c95d17SMarge Yang #define RMI_F21_NEW_REPORT_FORMAT BIT(6)
17*a9c95d17SMarge Yang
18*a9c95d17SMarge Yang #define RMI_F21_FINGER_COUNT_MASK GENMASK(3, 0)
19*a9c95d17SMarge Yang
20*a9c95d17SMarge Yang #define RMI_F21_MAX_SENSORS 16
21*a9c95d17SMarge Yang #define RMI_F21_MAX_FINGERS 16
22*a9c95d17SMarge Yang #define RMI_F21_DATA_REGS_MAX_SIZE (RMI_F21_MAX_SENSORS * 2 + \
23*a9c95d17SMarge Yang RMI_F21_MAX_FINGERS * 2 + 1)
24*a9c95d17SMarge Yang
25*a9c95d17SMarge Yang #define RMI_F21_FORCE_CLICK_BIT BIT(0)
26*a9c95d17SMarge Yang
27*a9c95d17SMarge Yang #define RMI_F21_FORCEPAD_BUTTON_COUNT 1
28*a9c95d17SMarge Yang
29*a9c95d17SMarge Yang struct f21_data {
30*a9c95d17SMarge Yang struct input_dev *input;
31*a9c95d17SMarge Yang u16 key_code;
32*a9c95d17SMarge Yang
33*a9c95d17SMarge Yang unsigned int attn_data_size;
34*a9c95d17SMarge Yang unsigned int attn_data_button_offset;
35*a9c95d17SMarge Yang
36*a9c95d17SMarge Yang unsigned int data_reg_size;
37*a9c95d17SMarge Yang unsigned int data_reg_button_offset;
38*a9c95d17SMarge Yang u8 data_regs[RMI_F21_DATA_REGS_MAX_SIZE];
39*a9c95d17SMarge Yang };
40*a9c95d17SMarge Yang
rmi_f21_attention(int irq,void * ctx)41*a9c95d17SMarge Yang static irqreturn_t rmi_f21_attention(int irq, void *ctx)
42*a9c95d17SMarge Yang {
43*a9c95d17SMarge Yang struct rmi_function *fn = ctx;
44*a9c95d17SMarge Yang struct f21_data *f21 = dev_get_drvdata(&fn->dev);
45*a9c95d17SMarge Yang struct rmi_driver_data *drvdata = dev_get_drvdata(&fn->rmi_dev->dev);
46*a9c95d17SMarge Yang u8 *pdata;
47*a9c95d17SMarge Yang int error;
48*a9c95d17SMarge Yang bool pressed;
49*a9c95d17SMarge Yang
50*a9c95d17SMarge Yang if (drvdata->attn_data.data) {
51*a9c95d17SMarge Yang if (drvdata->attn_data.size < f21->attn_data_size) {
52*a9c95d17SMarge Yang dev_warn(&fn->dev, "f21 interrupt, but data is missing\n");
53*a9c95d17SMarge Yang return IRQ_HANDLED;
54*a9c95d17SMarge Yang }
55*a9c95d17SMarge Yang
56*a9c95d17SMarge Yang pdata = drvdata->attn_data.data + f21->attn_data_button_offset;
57*a9c95d17SMarge Yang
58*a9c95d17SMarge Yang drvdata->attn_data.data += f21->attn_data_size;
59*a9c95d17SMarge Yang drvdata->attn_data.size -= f21->attn_data_size;
60*a9c95d17SMarge Yang } else {
61*a9c95d17SMarge Yang error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr,
62*a9c95d17SMarge Yang f21->data_regs, f21->data_reg_size);
63*a9c95d17SMarge Yang if (error) {
64*a9c95d17SMarge Yang dev_err(&fn->dev, "failed to read f21 data registers: %d\n",
65*a9c95d17SMarge Yang error);
66*a9c95d17SMarge Yang return IRQ_RETVAL(error);
67*a9c95d17SMarge Yang }
68*a9c95d17SMarge Yang
69*a9c95d17SMarge Yang pdata = f21->data_regs + f21->data_reg_button_offset;
70*a9c95d17SMarge Yang }
71*a9c95d17SMarge Yang
72*a9c95d17SMarge Yang pressed = *pdata & RMI_F21_FORCE_CLICK_BIT;
73*a9c95d17SMarge Yang input_report_key(f21->input, f21->key_code, pressed);
74*a9c95d17SMarge Yang
75*a9c95d17SMarge Yang return IRQ_HANDLED;
76*a9c95d17SMarge Yang }
77*a9c95d17SMarge Yang
rmi_f21_config(struct rmi_function * fn)78*a9c95d17SMarge Yang static int rmi_f21_config(struct rmi_function *fn)
79*a9c95d17SMarge Yang {
80*a9c95d17SMarge Yang struct rmi_driver *drv = fn->rmi_dev->driver;
81*a9c95d17SMarge Yang
82*a9c95d17SMarge Yang drv->set_irq_bits(fn->rmi_dev, fn->irq_mask);
83*a9c95d17SMarge Yang
84*a9c95d17SMarge Yang return 0;
85*a9c95d17SMarge Yang }
86*a9c95d17SMarge Yang
rmi_f21_initialize(struct rmi_function * fn,struct f21_data * f21)87*a9c95d17SMarge Yang static int rmi_f21_initialize(struct rmi_function *fn, struct f21_data *f21)
88*a9c95d17SMarge Yang {
89*a9c95d17SMarge Yang struct input_dev *input = f21->input;
90*a9c95d17SMarge Yang
91*a9c95d17SMarge Yang f21->key_code = BTN_LEFT;
92*a9c95d17SMarge Yang
93*a9c95d17SMarge Yang input->keycode = &f21->key_code;
94*a9c95d17SMarge Yang input->keycodesize = sizeof(f21->key_code);
95*a9c95d17SMarge Yang input->keycodemax = RMI_F21_FORCEPAD_BUTTON_COUNT;
96*a9c95d17SMarge Yang
97*a9c95d17SMarge Yang input_set_capability(input, EV_KEY, f21->key_code);
98*a9c95d17SMarge Yang __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
99*a9c95d17SMarge Yang
100*a9c95d17SMarge Yang return 0;
101*a9c95d17SMarge Yang }
102*a9c95d17SMarge Yang
rmi_f21_probe(struct rmi_function * fn)103*a9c95d17SMarge Yang static int rmi_f21_probe(struct rmi_function *fn)
104*a9c95d17SMarge Yang {
105*a9c95d17SMarge Yang struct rmi_device *rmi_dev = fn->rmi_dev;
106*a9c95d17SMarge Yang struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev);
107*a9c95d17SMarge Yang struct f21_data *f21;
108*a9c95d17SMarge Yang unsigned int sensor_count;
109*a9c95d17SMarge Yang unsigned int max_fingers;
110*a9c95d17SMarge Yang unsigned int query15_offset;
111*a9c95d17SMarge Yang u8 query15_data;
112*a9c95d17SMarge Yang int error;
113*a9c95d17SMarge Yang
114*a9c95d17SMarge Yang if (!drv_data->input) {
115*a9c95d17SMarge Yang dev_info(&fn->dev, "f21: no input device found, ignoring\n");
116*a9c95d17SMarge Yang return -ENXIO;
117*a9c95d17SMarge Yang }
118*a9c95d17SMarge Yang
119*a9c95d17SMarge Yang f21 = devm_kzalloc(&fn->dev, sizeof(*f21), GFP_KERNEL);
120*a9c95d17SMarge Yang if (!f21)
121*a9c95d17SMarge Yang return -ENOMEM;
122*a9c95d17SMarge Yang
123*a9c95d17SMarge Yang f21->input = drv_data->input;
124*a9c95d17SMarge Yang
125*a9c95d17SMarge Yang error = rmi_f21_initialize(fn, f21);
126*a9c95d17SMarge Yang if (error)
127*a9c95d17SMarge Yang return error;
128*a9c95d17SMarge Yang
129*a9c95d17SMarge Yang dev_set_drvdata(&fn->dev, f21);
130*a9c95d17SMarge Yang
131*a9c95d17SMarge Yang sensor_count = fn->fd.query_base_addr & RMI_F21_SENSOR_COUNT_MASK;
132*a9c95d17SMarge Yang if (fn->fd.query_base_addr & RMI_F21_FINGER_COUNT_PRESENT) {
133*a9c95d17SMarge Yang query15_offset = fn->fd.query_base_addr & RMI_F21_NEW_REPORT_FORMAT ? 2 : 1;
134*a9c95d17SMarge Yang error = rmi_read_block(fn->rmi_dev,
135*a9c95d17SMarge Yang fn->fd.query_base_addr + query15_offset,
136*a9c95d17SMarge Yang &query15_data, sizeof(query15_data));
137*a9c95d17SMarge Yang if (error)
138*a9c95d17SMarge Yang return dev_err_probe(&fn->dev, error,
139*a9c95d17SMarge Yang "failed to read 'query15' data");
140*a9c95d17SMarge Yang
141*a9c95d17SMarge Yang max_fingers = query15_data & RMI_F21_FINGER_COUNT_MASK;
142*a9c95d17SMarge Yang } else {
143*a9c95d17SMarge Yang max_fingers = 5;
144*a9c95d17SMarge Yang }
145*a9c95d17SMarge Yang
146*a9c95d17SMarge Yang if (fn->fd.query_base_addr & RMI_F21_NEW_REPORT_FORMAT) {
147*a9c95d17SMarge Yang /* Each finger uses one byte, and the button state uses one byte.*/
148*a9c95d17SMarge Yang f21->attn_data_size = max_fingers + 1;
149*a9c95d17SMarge Yang f21->attn_data_button_offset = f21->attn_data_size - 1;
150*a9c95d17SMarge Yang /*
151*a9c95d17SMarge Yang * Each sensor uses two bytes, the button state uses one byte,
152*a9c95d17SMarge Yang * and each finger uses two bytes.
153*a9c95d17SMarge Yang */
154*a9c95d17SMarge Yang f21->data_reg_size = sensor_count * 2 + 1 + max_fingers * 2;
155*a9c95d17SMarge Yang f21->data_reg_button_offset = sensor_count * 2;
156*a9c95d17SMarge Yang } else {
157*a9c95d17SMarge Yang /*
158*a9c95d17SMarge Yang * Regardless of the transport each finger uses two bytes,
159*a9c95d17SMarge Yang * and the button state uses one byte.
160*a9c95d17SMarge Yang */
161*a9c95d17SMarge Yang f21->attn_data_size = sensor_count * 2 + 1;
162*a9c95d17SMarge Yang f21->attn_data_button_offset = sensor_count * 2;
163*a9c95d17SMarge Yang
164*a9c95d17SMarge Yang f21->data_reg_size = f21->attn_data_size;
165*a9c95d17SMarge Yang f21->data_reg_button_offset = f21->attn_data_button_offset;
166*a9c95d17SMarge Yang }
167*a9c95d17SMarge Yang
168*a9c95d17SMarge Yang return 0;
169*a9c95d17SMarge Yang }
170*a9c95d17SMarge Yang
171*a9c95d17SMarge Yang struct rmi_function_handler rmi_f21_handler = {
172*a9c95d17SMarge Yang .driver = {
173*a9c95d17SMarge Yang .name = "rmi4_f21",
174*a9c95d17SMarge Yang },
175*a9c95d17SMarge Yang .func = 0x21,
176*a9c95d17SMarge Yang .probe = rmi_f21_probe,
177*a9c95d17SMarge Yang .config = rmi_f21_config,
178*a9c95d17SMarge Yang .attention = rmi_f21_attention,
179*a9c95d17SMarge Yang };
180