xref: /openbmc/linux/drivers/input/keyboard/hil_kbd.c (revision d0b73b48)
1 /*
2  * Generic linux-input device driver for keyboard devices
3  *
4  * Copyright (c) 2001 Brian S. Julin
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions, and the following disclaimer,
12  *    without modification.
13  * 2. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission.
15  *
16  * Alternatively, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL").
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  *
29  * References:
30  * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
31  *
32  */
33 
34 #include <linux/hil.h>
35 #include <linux/input.h>
36 #include <linux/serio.h>
37 #include <linux/kernel.h>
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/completion.h>
41 #include <linux/slab.h>
42 #include <linux/pci_ids.h>
43 
44 #define PREFIX "HIL: "
45 
46 MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
47 MODULE_DESCRIPTION("HIL keyboard/mouse driver");
48 MODULE_LICENSE("Dual BSD/GPL");
49 MODULE_ALIAS("serio:ty03pr25id00ex*"); /* HIL keyboard */
50 MODULE_ALIAS("serio:ty03pr25id0Fex*"); /* HIL mouse */
51 
52 #define HIL_PACKET_MAX_LENGTH 16
53 
54 #define HIL_KBD_SET1_UPBIT 0x01
55 #define HIL_KBD_SET1_SHIFT 1
56 static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly =
57 	{ HIL_KEYCODES_SET1 };
58 
59 #define HIL_KBD_SET2_UPBIT 0x01
60 #define HIL_KBD_SET2_SHIFT 1
61 /* Set2 is user defined */
62 
63 #define HIL_KBD_SET3_UPBIT 0x80
64 #define HIL_KBD_SET3_SHIFT 0
65 static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] __read_mostly =
66 	{ HIL_KEYCODES_SET3 };
67 
68 static const char hil_language[][16] = { HIL_LOCALE_MAP };
69 
70 struct hil_dev {
71 	struct input_dev *dev;
72 	struct serio *serio;
73 
74 	/* Input buffer and index for packets from HIL bus. */
75 	hil_packet data[HIL_PACKET_MAX_LENGTH];
76 	int idx4; /* four counts per packet */
77 
78 	/* Raw device info records from HIL bus, see hil.h for fields. */
79 	char	idd[HIL_PACKET_MAX_LENGTH];	/* DID byte and IDD record */
80 	char	rsc[HIL_PACKET_MAX_LENGTH];	/* RSC record */
81 	char	exd[HIL_PACKET_MAX_LENGTH];	/* EXD record */
82 	char	rnm[HIL_PACKET_MAX_LENGTH + 1];	/* RNM record + NULL term. */
83 
84 	struct completion cmd_done;
85 
86 	bool is_pointer;
87 	/* Extra device details needed for pointing devices. */
88 	unsigned int nbtn, naxes;
89 	unsigned int btnmap[7];
90 };
91 
92 static bool hil_dev_is_command_response(hil_packet p)
93 {
94 	if ((p & ~HIL_CMDCT_POL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL))
95 		return false;
96 
97 	if ((p & ~HIL_CMDCT_RPL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL))
98 		return false;
99 
100 	return true;
101 }
102 
103 static void hil_dev_handle_command_response(struct hil_dev *dev)
104 {
105 	hil_packet p;
106 	char *buf;
107 	int i, idx;
108 
109 	idx = dev->idx4 / 4;
110 	p = dev->data[idx - 1];
111 
112 	switch (p & HIL_PKT_DATA_MASK) {
113 	case HIL_CMD_IDD:
114 		buf = dev->idd;
115 		break;
116 
117 	case HIL_CMD_RSC:
118 		buf = dev->rsc;
119 		break;
120 
121 	case HIL_CMD_EXD:
122 		buf = dev->exd;
123 		break;
124 
125 	case HIL_CMD_RNM:
126 		dev->rnm[HIL_PACKET_MAX_LENGTH] = 0;
127 		buf = dev->rnm;
128 		break;
129 
130 	default:
131 		/* These occur when device isn't present */
132 		if (p != (HIL_ERR_INT | HIL_PKT_CMD)) {
133 			/* Anything else we'd like to know about. */
134 			printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);
135 		}
136 		goto out;
137 	}
138 
139 	for (i = 0; i < idx; i++)
140 		buf[i] = dev->data[i] & HIL_PKT_DATA_MASK;
141 	for (; i < HIL_PACKET_MAX_LENGTH; i++)
142 		buf[i] = 0;
143  out:
144 	complete(&dev->cmd_done);
145 }
146 
147 static void hil_dev_handle_kbd_events(struct hil_dev *kbd)
148 {
149 	struct input_dev *dev = kbd->dev;
150 	int idx = kbd->idx4 / 4;
151 	int i;
152 
153 	switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) {
154 	case HIL_POL_CHARTYPE_NONE:
155 		return;
156 
157 	case HIL_POL_CHARTYPE_ASCII:
158 		for (i = 1; i < idx - 1; i++)
159 			input_report_key(dev, kbd->data[i] & 0x7f, 1);
160 		break;
161 
162 	case HIL_POL_CHARTYPE_RSVD1:
163 	case HIL_POL_CHARTYPE_RSVD2:
164 	case HIL_POL_CHARTYPE_BINARY:
165 		for (i = 1; i < idx - 1; i++)
166 			input_report_key(dev, kbd->data[i], 1);
167 		break;
168 
169 	case HIL_POL_CHARTYPE_SET1:
170 		for (i = 1; i < idx - 1; i++) {
171 			unsigned int key = kbd->data[i];
172 			int up = key & HIL_KBD_SET1_UPBIT;
173 
174 			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
175 			key = hil_kbd_set1[key >> HIL_KBD_SET1_SHIFT];
176 			input_report_key(dev, key, !up);
177 		}
178 		break;
179 
180 	case HIL_POL_CHARTYPE_SET2:
181 		for (i = 1; i < idx - 1; i++) {
182 			unsigned int key = kbd->data[i];
183 			int up = key & HIL_KBD_SET2_UPBIT;
184 
185 			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
186 			key = key >> HIL_KBD_SET2_SHIFT;
187 			input_report_key(dev, key, !up);
188 		}
189 		break;
190 
191 	case HIL_POL_CHARTYPE_SET3:
192 		for (i = 1; i < idx - 1; i++) {
193 			unsigned int key = kbd->data[i];
194 			int up = key & HIL_KBD_SET3_UPBIT;
195 
196 			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
197 			key = hil_kbd_set3[key >> HIL_KBD_SET3_SHIFT];
198 			input_report_key(dev, key, !up);
199 		}
200 		break;
201 	}
202 
203 	input_sync(dev);
204 }
205 
206 static void hil_dev_handle_ptr_events(struct hil_dev *ptr)
207 {
208 	struct input_dev *dev = ptr->dev;
209 	int idx = ptr->idx4 / 4;
210 	hil_packet p = ptr->data[idx - 1];
211 	int i, cnt, laxis;
212 	bool absdev, ax16;
213 
214 	if ((p & HIL_CMDCT_POL) != idx - 1) {
215 		printk(KERN_WARNING PREFIX
216 			"Malformed poll packet %x (idx = %i)\n", p, idx);
217 		return;
218 	}
219 
220 	i = (p & HIL_POL_AXIS_ALT) ? 3 : 0;
221 	laxis = (p & HIL_POL_NUM_AXES_MASK) + i;
222 
223 	ax16 = ptr->idd[1] & HIL_IDD_HEADER_16BIT; /* 8 or 16bit resolution */
224 	absdev = ptr->idd[1] & HIL_IDD_HEADER_ABS;
225 
226 	for (cnt = 1; i < laxis; i++) {
227 		unsigned int lo, hi, val;
228 
229 		lo = ptr->data[cnt++] & HIL_PKT_DATA_MASK;
230 		hi = ax16 ? (ptr->data[cnt++] & HIL_PKT_DATA_MASK) : 0;
231 
232 		if (absdev) {
233 			val = lo + (hi << 8);
234 #ifdef TABLET_AUTOADJUST
235 			if (val < input_abs_get_min(dev, ABS_X + i))
236 				input_abs_set_min(dev, ABS_X + i, val);
237 			if (val > input_abs_get_max(dev, ABS_X + i))
238 				input_abs_set_max(dev, ABS_X + i, val);
239 #endif
240 			if (i % 3)
241 				val = input_abs_get_max(dev, ABS_X + i) - val;
242 			input_report_abs(dev, ABS_X + i, val);
243 		} else {
244 			val = (int) (((int8_t) lo) | ((int8_t) hi << 8));
245 			if (i % 3)
246 				val *= -1;
247 			input_report_rel(dev, REL_X + i, val);
248 		}
249 	}
250 
251 	while (cnt < idx - 1) {
252 		unsigned int btn = ptr->data[cnt++];
253 		int up = btn & 1;
254 
255 		btn &= 0xfe;
256 		if (btn == 0x8e)
257 			continue; /* TODO: proximity == touch? */
258 		if (btn > 0x8c || btn < 0x80)
259 			continue;
260 		btn = (btn - 0x80) >> 1;
261 		btn = ptr->btnmap[btn];
262 		input_report_key(dev, btn, !up);
263 	}
264 
265 	input_sync(dev);
266 }
267 
268 static void hil_dev_process_err(struct hil_dev *dev)
269 {
270 	printk(KERN_WARNING PREFIX "errored HIL packet\n");
271 	dev->idx4 = 0;
272 	complete(&dev->cmd_done); /* just in case somebody is waiting */
273 }
274 
275 static irqreturn_t hil_dev_interrupt(struct serio *serio,
276 				unsigned char data, unsigned int flags)
277 {
278 	struct hil_dev *dev;
279 	hil_packet packet;
280 	int idx;
281 
282 	dev = serio_get_drvdata(serio);
283 	BUG_ON(dev == NULL);
284 
285 	if (dev->idx4 >= HIL_PACKET_MAX_LENGTH * sizeof(hil_packet)) {
286 		hil_dev_process_err(dev);
287 		goto out;
288 	}
289 
290 	idx = dev->idx4 / 4;
291 	if (!(dev->idx4 % 4))
292 		dev->data[idx] = 0;
293 	packet = dev->data[idx];
294 	packet |= ((hil_packet)data) << ((3 - (dev->idx4 % 4)) * 8);
295 	dev->data[idx] = packet;
296 
297 	/* Records of N 4-byte hil_packets must terminate with a command. */
298 	if ((++dev->idx4 % 4) == 0) {
299 		if ((packet & 0xffff0000) != HIL_ERR_INT) {
300 			hil_dev_process_err(dev);
301 		} else if (packet & HIL_PKT_CMD) {
302 			if (hil_dev_is_command_response(packet))
303 				hil_dev_handle_command_response(dev);
304 			else if (dev->is_pointer)
305 				hil_dev_handle_ptr_events(dev);
306 			else
307 				hil_dev_handle_kbd_events(dev);
308 			dev->idx4 = 0;
309 		}
310 	}
311  out:
312 	return IRQ_HANDLED;
313 }
314 
315 static void hil_dev_disconnect(struct serio *serio)
316 {
317 	struct hil_dev *dev = serio_get_drvdata(serio);
318 
319 	BUG_ON(dev == NULL);
320 
321 	serio_close(serio);
322 	input_unregister_device(dev->dev);
323 	serio_set_drvdata(serio, NULL);
324 	kfree(dev);
325 }
326 
327 static void hil_dev_keyboard_setup(struct hil_dev *kbd)
328 {
329 	struct input_dev *input_dev = kbd->dev;
330 	uint8_t did = kbd->idd[0];
331 	int i;
332 
333 	input_dev->evbit[0]	= BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
334 	input_dev->ledbit[0]	= BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) |
335 				  BIT_MASK(LED_SCROLLL);
336 
337 	for (i = 0; i < 128; i++) {
338 		__set_bit(hil_kbd_set1[i], input_dev->keybit);
339 		__set_bit(hil_kbd_set3[i], input_dev->keybit);
340 	}
341 	__clear_bit(KEY_RESERVED, input_dev->keybit);
342 
343 	input_dev->keycodemax	= HIL_KEYCODES_SET1_TBLSIZE;
344 	input_dev->keycodesize	= sizeof(hil_kbd_set1[0]);
345 	input_dev->keycode	= hil_kbd_set1;
346 
347 	input_dev->name	= strlen(kbd->rnm) ? kbd->rnm : "HIL keyboard";
348 	input_dev->phys	= "hpkbd/input0";
349 
350 	printk(KERN_INFO PREFIX "HIL keyboard found (did = 0x%02x, lang = %s)\n",
351 		did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]);
352 }
353 
354 static void hil_dev_pointer_setup(struct hil_dev *ptr)
355 {
356 	struct input_dev *input_dev = ptr->dev;
357 	uint8_t did = ptr->idd[0];
358 	uint8_t *idd = ptr->idd + 1;
359 	unsigned int naxsets = HIL_IDD_NUM_AXSETS(*idd);
360 	unsigned int i, btntype;
361 	const char *txt;
362 
363 	ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd);
364 
365 	switch (did & HIL_IDD_DID_TYPE_MASK) {
366 	case HIL_IDD_DID_TYPE_REL:
367 		input_dev->evbit[0] = BIT_MASK(EV_REL);
368 
369 		for (i = 0; i < ptr->naxes; i++)
370 			__set_bit(REL_X + i, input_dev->relbit);
371 
372 		for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++)
373 			__set_bit(REL_X + i, input_dev->relbit);
374 
375 		txt = "relative";
376 		break;
377 
378 	case HIL_IDD_DID_TYPE_ABS:
379 		input_dev->evbit[0] = BIT_MASK(EV_ABS);
380 
381 		for (i = 0; i < ptr->naxes; i++)
382 			input_set_abs_params(input_dev, ABS_X + i,
383 					0, HIL_IDD_AXIS_MAX(idd, i), 0, 0);
384 
385 		for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++)
386 			input_set_abs_params(input_dev, ABS_X + i,
387 					0, HIL_IDD_AXIS_MAX(idd, i - 3), 0, 0);
388 
389 #ifdef TABLET_AUTOADJUST
390 		for (i = 0; i < ABS_MAX; i++) {
391 			int diff = input_abs_get_max(input_dev, ABS_X + i) / 10;
392 			input_abs_set_min(input_dev, ABS_X + i,
393 				input_abs_get_min(input_dev, ABS_X + i) + diff);
394 			input_abs_set_max(input_dev, ABS_X + i,
395 				input_abs_get_max(input_dev, ABS_X + i) - diff);
396 		}
397 #endif
398 
399 		txt = "absolute";
400 		break;
401 
402 	default:
403 		BUG();
404 	}
405 
406 	ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd);
407 	if (ptr->nbtn)
408 		input_dev->evbit[0] |= BIT_MASK(EV_KEY);
409 
410 	btntype = BTN_MISC;
411 	if ((did & HIL_IDD_DID_ABS_TABLET_MASK) == HIL_IDD_DID_ABS_TABLET)
412 #ifdef TABLET_SIMULATES_MOUSE
413 		btntype = BTN_TOUCH;
414 #else
415 		btntype = BTN_DIGI;
416 #endif
417 	if ((did & HIL_IDD_DID_ABS_TSCREEN_MASK) == HIL_IDD_DID_ABS_TSCREEN)
418 		btntype = BTN_TOUCH;
419 
420 	if ((did & HIL_IDD_DID_REL_MOUSE_MASK) == HIL_IDD_DID_REL_MOUSE)
421 		btntype = BTN_MOUSE;
422 
423 	for (i = 0; i < ptr->nbtn; i++) {
424 		__set_bit(btntype | i, input_dev->keybit);
425 		ptr->btnmap[i] = btntype | i;
426 	}
427 
428 	if (btntype == BTN_MOUSE) {
429 		/* Swap buttons 2 and 3 */
430 		ptr->btnmap[1] = BTN_MIDDLE;
431 		ptr->btnmap[2] = BTN_RIGHT;
432 	}
433 
434 	input_dev->name = strlen(ptr->rnm) ? ptr->rnm : "HIL pointer device";
435 
436 	printk(KERN_INFO PREFIX
437 		"HIL pointer device found (did: 0x%02x, axis: %s)\n",
438 		did, txt);
439 	printk(KERN_INFO PREFIX
440 		"HIL pointer has %i buttons and %i sets of %i axes\n",
441 		ptr->nbtn, naxsets, ptr->naxes);
442 }
443 
444 static int hil_dev_connect(struct serio *serio, struct serio_driver *drv)
445 {
446 	struct hil_dev *dev;
447 	struct input_dev *input_dev;
448 	uint8_t did, *idd;
449 	int error;
450 
451 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
452 	input_dev = input_allocate_device();
453 	if (!dev || !input_dev) {
454 		error = -ENOMEM;
455 		goto bail0;
456 	}
457 
458 	dev->serio = serio;
459 	dev->dev = input_dev;
460 
461 	error = serio_open(serio, drv);
462 	if (error)
463 		goto bail0;
464 
465 	serio_set_drvdata(serio, dev);
466 
467 	/* Get device info.  MLC driver supplies devid/status/etc. */
468 	init_completion(&dev->cmd_done);
469 	serio_write(serio, 0);
470 	serio_write(serio, 0);
471 	serio_write(serio, HIL_PKT_CMD >> 8);
472 	serio_write(serio, HIL_CMD_IDD);
473 	error = wait_for_completion_killable(&dev->cmd_done);
474 	if (error)
475 		goto bail1;
476 
477 	init_completion(&dev->cmd_done);
478 	serio_write(serio, 0);
479 	serio_write(serio, 0);
480 	serio_write(serio, HIL_PKT_CMD >> 8);
481 	serio_write(serio, HIL_CMD_RSC);
482 	error = wait_for_completion_killable(&dev->cmd_done);
483 	if (error)
484 		goto bail1;
485 
486 	init_completion(&dev->cmd_done);
487 	serio_write(serio, 0);
488 	serio_write(serio, 0);
489 	serio_write(serio, HIL_PKT_CMD >> 8);
490 	serio_write(serio, HIL_CMD_RNM);
491 	error = wait_for_completion_killable(&dev->cmd_done);
492 	if (error)
493 		goto bail1;
494 
495 	init_completion(&dev->cmd_done);
496 	serio_write(serio, 0);
497 	serio_write(serio, 0);
498 	serio_write(serio, HIL_PKT_CMD >> 8);
499 	serio_write(serio, HIL_CMD_EXD);
500 	error = wait_for_completion_killable(&dev->cmd_done);
501 	if (error)
502 		goto bail1;
503 
504 	did = dev->idd[0];
505 	idd = dev->idd + 1;
506 
507 	switch (did & HIL_IDD_DID_TYPE_MASK) {
508 	case HIL_IDD_DID_TYPE_KB_INTEGRAL:
509 	case HIL_IDD_DID_TYPE_KB_ITF:
510 	case HIL_IDD_DID_TYPE_KB_RSVD:
511 	case HIL_IDD_DID_TYPE_CHAR:
512 		if (HIL_IDD_NUM_BUTTONS(idd) ||
513 		    HIL_IDD_NUM_AXES_PER_SET(*idd)) {
514 			printk(KERN_INFO PREFIX
515 				"combo devices are not supported.\n");
516 			goto bail1;
517 		}
518 
519 		dev->is_pointer = false;
520 		hil_dev_keyboard_setup(dev);
521 		break;
522 
523 	case HIL_IDD_DID_TYPE_REL:
524 	case HIL_IDD_DID_TYPE_ABS:
525 		dev->is_pointer = true;
526 		hil_dev_pointer_setup(dev);
527 		break;
528 
529 	default:
530 		goto bail1;
531 	}
532 
533 	input_dev->id.bustype	= BUS_HIL;
534 	input_dev->id.vendor	= PCI_VENDOR_ID_HP;
535 	input_dev->id.product	= 0x0001; /* TODO: get from kbd->rsc */
536 	input_dev->id.version	= 0x0100; /* TODO: get from kbd->rsc */
537 	input_dev->dev.parent	= &serio->dev;
538 
539 	if (!dev->is_pointer) {
540 		serio_write(serio, 0);
541 		serio_write(serio, 0);
542 		serio_write(serio, HIL_PKT_CMD >> 8);
543 		/* Enable Keyswitch Autorepeat 1 */
544 		serio_write(serio, HIL_CMD_EK1);
545 		/* No need to wait for completion */
546 	}
547 
548 	error = input_register_device(input_dev);
549 	if (error)
550 		goto bail1;
551 
552 	return 0;
553 
554  bail1:
555 	serio_close(serio);
556 	serio_set_drvdata(serio, NULL);
557  bail0:
558 	input_free_device(input_dev);
559 	kfree(dev);
560 	return error;
561 }
562 
563 static struct serio_device_id hil_dev_ids[] = {
564 	{
565 		.type = SERIO_HIL_MLC,
566 		.proto = SERIO_HIL,
567 		.id = SERIO_ANY,
568 		.extra = SERIO_ANY,
569 	},
570 	{ 0 }
571 };
572 
573 MODULE_DEVICE_TABLE(serio, hil_dev_ids);
574 
575 static struct serio_driver hil_serio_drv = {
576 	.driver		= {
577 		.name	= "hil_dev",
578 	},
579 	.description	= "HP HIL keyboard/mouse/tablet driver",
580 	.id_table	= hil_dev_ids,
581 	.connect	= hil_dev_connect,
582 	.disconnect	= hil_dev_disconnect,
583 	.interrupt	= hil_dev_interrupt
584 };
585 
586 module_serio_driver(hil_serio_drv);
587