Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (C) 2015-2016 Red Hat
  4 * Copyright (C) 2015 Lyude Paul <thatslyude@gmail.com>
  5 */
  6
  7#include <linux/kernel.h>
  8#include <linux/slab.h>
  9#include <linux/serio.h>
 10#include <linux/notifier.h>
 11#include "rmi_driver.h"
 12
 13#define RMI_F03_RX_DATA_OFB		0x01
 14#define RMI_F03_OB_SIZE			2
 15
 16#define RMI_F03_OB_OFFSET		2
 17#define RMI_F03_OB_DATA_OFFSET		1
 18#define RMI_F03_OB_FLAG_TIMEOUT		BIT(6)
 19#define RMI_F03_OB_FLAG_PARITY		BIT(7)
 20
 21#define RMI_F03_DEVICE_COUNT		0x07
 22#define RMI_F03_BYTES_PER_DEVICE	0x07
 23#define RMI_F03_BYTES_PER_DEVICE_SHIFT	4
 24#define RMI_F03_QUEUE_LENGTH		0x0F
 25
 26#define PSMOUSE_OOB_EXTRA_BTNS		0x01
 27
 28struct f03_data {
 29	struct rmi_function *fn;
 30
 31	struct serio *serio;
 32	bool serio_registered;
 33
 34	unsigned int overwrite_buttons;
 35
 36	u8 device_count;
 37	u8 rx_queue_length;
 38};
 39
 40int rmi_f03_overwrite_button(struct rmi_function *fn, unsigned int button,
 41			     int value)
 42{
 43	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 44	unsigned int bit;
 45
 46	if (button < BTN_LEFT || button > BTN_MIDDLE)
 47		return -EINVAL;
 48
 49	bit = BIT(button - BTN_LEFT);
 50
 51	if (value)
 52		f03->overwrite_buttons |= bit;
 53	else
 54		f03->overwrite_buttons &= ~bit;
 55
 56	return 0;
 57}
 58
 59void rmi_f03_commit_buttons(struct rmi_function *fn)
 60{
 61	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 62	struct serio *serio = f03->serio;
 63
 64	serio_pause_rx(serio);
 65	if (serio->drv) {
 66		serio->drv->interrupt(serio, PSMOUSE_OOB_EXTRA_BTNS,
 67				      SERIO_OOB_DATA);
 68		serio->drv->interrupt(serio, f03->overwrite_buttons,
 69				      SERIO_OOB_DATA);
 70	}
 71	serio_continue_rx(serio);
 72}
 73
 74static int rmi_f03_pt_write(struct serio *id, unsigned char val)
 75{
 76	struct f03_data *f03 = id->port_data;
 77	int error;
 78
 79	rmi_dbg(RMI_DEBUG_FN, &f03->fn->dev,
 80		"%s: Wrote %.2hhx to PS/2 passthrough address",
 81		__func__, val);
 82
 83	error = rmi_write(f03->fn->rmi_dev, f03->fn->fd.data_base_addr, val);
 84	if (error) {
 85		dev_err(&f03->fn->dev,
 86			"%s: Failed to write to F03 TX register (%d).\n",
 87			__func__, error);
 88		return error;
 89	}
 90
 91	return 0;
 92}
 93
 94static int rmi_f03_initialize(struct f03_data *f03)
 95{
 96	struct rmi_function *fn = f03->fn;
 97	struct device *dev = &fn->dev;
 98	int error;
 99	u8 bytes_per_device;
100	u8 query1;
101	u8 query2[RMI_F03_DEVICE_COUNT * RMI_F03_BYTES_PER_DEVICE];
102	size_t query2_len;
103
104	error = rmi_read(fn->rmi_dev, fn->fd.query_base_addr, &query1);
105	if (error) {
106		dev_err(dev, "Failed to read query register (%d).\n", error);
107		return error;
108	}
109
110	f03->device_count = query1 & RMI_F03_DEVICE_COUNT;
111	bytes_per_device = (query1 >> RMI_F03_BYTES_PER_DEVICE_SHIFT) &
112				RMI_F03_BYTES_PER_DEVICE;
113
114	query2_len = f03->device_count * bytes_per_device;
115
116	/*
117	 * The first generation of image sensors don't have a second part to
118	 * their f03 query, as such we have to set some of these values manually
119	 */
120	if (query2_len < 1) {
121		f03->device_count = 1;
122		f03->rx_queue_length = 7;
123	} else {
124		error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr + 1,
125				       query2, query2_len);
126		if (error) {
127			dev_err(dev,
128				"Failed to read second set of query registers (%d).\n",
129				error);
130			return error;
131		}
132
133		f03->rx_queue_length = query2[0] & RMI_F03_QUEUE_LENGTH;
134	}
135
136	return 0;
137}
138
139static int rmi_f03_pt_open(struct serio *serio)
140{
141	struct f03_data *f03 = serio->port_data;
142	struct rmi_function *fn = f03->fn;
143	const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
144	const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
145	u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
146	int error;
147
148	/*
149	 * Consume any pending data. Some devices like to spam with
150	 * 0xaa 0x00 announcements which may confuse us as we try to
151	 * probe the device.
152	 */
153	error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
154	if (!error)
155		rmi_dbg(RMI_DEBUG_FN, &fn->dev,
156			"%s: Consumed %*ph (%d) from PS2 guest\n",
157			__func__, ob_len, obs, ob_len);
158
159	return fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
160}
161
162static void rmi_f03_pt_close(struct serio *serio)
163{
164	struct f03_data *f03 = serio->port_data;
165	struct rmi_function *fn = f03->fn;
166
167	fn->rmi_dev->driver->clear_irq_bits(fn->rmi_dev, fn->irq_mask);
168}
169
170static int rmi_f03_register_pt(struct f03_data *f03)
171{
172	struct serio *serio;
173
174	serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
175	if (!serio)
176		return -ENOMEM;
177
178	serio->id.type = SERIO_PS_PSTHRU;
179	serio->write = rmi_f03_pt_write;
180	serio->open = rmi_f03_pt_open;
181	serio->close = rmi_f03_pt_close;
182	serio->port_data = f03;
183
184	strscpy(serio->name, "RMI4 PS/2 pass-through", sizeof(serio->name));
185	snprintf(serio->phys, sizeof(serio->phys), "%s/serio0",
186		 dev_name(&f03->fn->dev));
187	serio->dev.parent = &f03->fn->dev;
188
189	f03->serio = serio;
190
191	printk(KERN_INFO "serio: %s port at %s\n",
192		serio->name, dev_name(&f03->fn->dev));
193	serio_register_port(serio);
194
195	return 0;
196}
197
198static int rmi_f03_probe(struct rmi_function *fn)
199{
200	struct device *dev = &fn->dev;
201	struct f03_data *f03;
202	int error;
203
204	f03 = devm_kzalloc(dev, sizeof(struct f03_data), GFP_KERNEL);
205	if (!f03)
206		return -ENOMEM;
207
208	f03->fn = fn;
209
210	error = rmi_f03_initialize(f03);
211	if (error < 0)
212		return error;
213
214	if (f03->device_count != 1)
215		dev_warn(dev, "found %d devices on PS/2 passthrough",
216			 f03->device_count);
217
218	dev_set_drvdata(dev, f03);
219	return 0;
220}
221
222static int rmi_f03_config(struct rmi_function *fn)
223{
224	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
225	int error;
226
227	if (!f03->serio_registered) {
228		error = rmi_f03_register_pt(f03);
229		if (error)
230			return error;
231
232		f03->serio_registered = true;
233	} else {
234		/*
235		 * We must be re-configuring the sensor, just enable
236		 * interrupts for this function.
237		 */
238		fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
239	}
240
241	return 0;
242}
243
244static irqreturn_t rmi_f03_attention(int irq, void *ctx)
245{
246	struct rmi_function *fn = ctx;
247	struct rmi_device *rmi_dev = fn->rmi_dev;
248	struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
249	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
250	const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
251	const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
252	u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
253	u8 ob_status;
254	u8 ob_data;
255	unsigned int serio_flags;
256	int i;
257	int error;
258
259	if (drvdata->attn_data.data) {
260		/* First grab the data passed by the transport device */
261		if (drvdata->attn_data.size < ob_len) {
262			dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n");
263			return IRQ_HANDLED;
264		}
265
266		memcpy(obs, drvdata->attn_data.data, ob_len);
267
268		drvdata->attn_data.data += ob_len;
269		drvdata->attn_data.size -= ob_len;
270	} else {
271		/* Grab all of the data registers, and check them for data */
272		error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
273		if (error) {
274			dev_err(&fn->dev,
275				"%s: Failed to read F03 output buffers: %d\n",
276				__func__, error);
277			serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
278			return IRQ_RETVAL(error);
279		}
280	}
281
282	for (i = 0; i < ob_len; i += RMI_F03_OB_SIZE) {
283		ob_status = obs[i];
284		ob_data = obs[i + RMI_F03_OB_DATA_OFFSET];
285		serio_flags = 0;
286
287		if (!(ob_status & RMI_F03_RX_DATA_OFB))
288			continue;
289
290		if (ob_status & RMI_F03_OB_FLAG_TIMEOUT)
291			serio_flags |= SERIO_TIMEOUT;
292		if (ob_status & RMI_F03_OB_FLAG_PARITY)
293			serio_flags |= SERIO_PARITY;
294
295		rmi_dbg(RMI_DEBUG_FN, &fn->dev,
296			"%s: Received %.2hhx from PS2 guest T: %c P: %c\n",
297			__func__, ob_data,
298			serio_flags & SERIO_TIMEOUT ?  'Y' : 'N',
299			serio_flags & SERIO_PARITY ? 'Y' : 'N');
300
301		serio_interrupt(f03->serio, ob_data, serio_flags);
302	}
303
304	return IRQ_HANDLED;
305}
306
307static void rmi_f03_remove(struct rmi_function *fn)
308{
309	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
310
311	if (f03->serio_registered)
312		serio_unregister_port(f03->serio);
313}
314
315struct rmi_function_handler rmi_f03_handler = {
316	.driver = {
317		.name = "rmi4_f03",
318	},
319	.func = 0x03,
320	.probe = rmi_f03_probe,
321	.config = rmi_f03_config,
322	.attention = rmi_f03_attention,
323	.remove = rmi_f03_remove,
324};
325
326MODULE_AUTHOR("Lyude Paul <thatslyude@gmail.com>");
327MODULE_DESCRIPTION("RMI F03 module");
328MODULE_LICENSE("GPL");