1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 1999-2002 Vojtech Pavlik
6 * Copyright (c) 2004 Dmitry Torokhov
10 #include <linux/delay.h>
11 #include <linux/module.h>
12 #include <linux/sched.h>
13 #include <linux/interrupt.h>
14 #include <linux/input.h>
15 #include <linux/serio.h>
16 #include <linux/i8042.h>
17 #include <linux/libps2.h>
19 #define DRIVER_DESC "PS/2 driver library"
21 MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");
22 MODULE_DESCRIPTION("PS/2 driver library");
23 MODULE_LICENSE("GPL");
25 static int ps2_do_sendbyte(struct ps2dev
*ps2dev
, u8 byte
,
26 unsigned int timeout
, unsigned int max_attempts
)
27 __releases(&ps2dev
->serio
->lock
) __acquires(&ps2dev
->serio
->lock
)
32 lockdep_assert_held(&ps2dev
->serio
->lock
);
36 ps2dev
->flags
|= PS2_FLAG_ACK
;
38 serio_continue_rx(ps2dev
->serio
);
40 error
= serio_write(ps2dev
->serio
, byte
);
42 dev_dbg(&ps2dev
->serio
->dev
,
43 "failed to write %#02x: %d\n", byte
, error
);
45 wait_event_timeout(ps2dev
->wait
,
46 !(ps2dev
->flags
& PS2_FLAG_ACK
),
47 msecs_to_jiffies(timeout
));
49 serio_pause_rx(ps2dev
->serio
);
50 } while (ps2dev
->nak
== PS2_RET_NAK
&& ++attempt
< max_attempts
);
52 ps2dev
->flags
&= ~PS2_FLAG_ACK
;
55 switch (ps2dev
->nak
) {
70 if (error
|| attempt
> 1)
71 dev_dbg(&ps2dev
->serio
->dev
,
72 "%02x - %d (%x), attempt %d\n",
73 byte
, error
, ps2dev
->nak
, attempt
);
79 * ps2_sendbyte() sends a byte to the device and waits for acknowledge.
80 * It doesn't handle retransmission, the caller is expected to handle
83 * ps2_sendbyte() can only be called from a process context.
86 int ps2_sendbyte(struct ps2dev
*ps2dev
, u8 byte
, unsigned int timeout
)
90 serio_pause_rx(ps2dev
->serio
);
92 retval
= ps2_do_sendbyte(ps2dev
, byte
, timeout
, 1);
93 dev_dbg(&ps2dev
->serio
->dev
, "%02x - %x\n", byte
, ps2dev
->nak
);
95 serio_continue_rx(ps2dev
->serio
);
99 EXPORT_SYMBOL(ps2_sendbyte
);
101 void ps2_begin_command(struct ps2dev
*ps2dev
)
103 struct mutex
*m
= ps2dev
->serio
->ps2_cmd_mutex
?: &ps2dev
->cmd_mutex
;
107 EXPORT_SYMBOL(ps2_begin_command
);
109 void ps2_end_command(struct ps2dev
*ps2dev
)
111 struct mutex
*m
= ps2dev
->serio
->ps2_cmd_mutex
?: &ps2dev
->cmd_mutex
;
115 EXPORT_SYMBOL(ps2_end_command
);
118 * ps2_drain() waits for device to transmit requested number of bytes
122 void ps2_drain(struct ps2dev
*ps2dev
, size_t maxbytes
, unsigned int timeout
)
124 if (maxbytes
> sizeof(ps2dev
->cmdbuf
)) {
126 maxbytes
= sizeof(ps2dev
->cmdbuf
);
129 ps2_begin_command(ps2dev
);
131 serio_pause_rx(ps2dev
->serio
);
132 ps2dev
->flags
= PS2_FLAG_CMD
;
133 ps2dev
->cmdcnt
= maxbytes
;
134 serio_continue_rx(ps2dev
->serio
);
136 wait_event_timeout(ps2dev
->wait
,
137 !(ps2dev
->flags
& PS2_FLAG_CMD
),
138 msecs_to_jiffies(timeout
));
140 ps2_end_command(ps2dev
);
142 EXPORT_SYMBOL(ps2_drain
);
145 * ps2_is_keyboard_id() checks received ID byte against the list of
146 * known keyboard IDs.
149 bool ps2_is_keyboard_id(u8 id_byte
)
151 static const u8 keyboard_ids
[] = {
152 0xab, /* Regular keyboards */
153 0xac, /* NCD Sun keyboard */
154 0x2b, /* Trust keyboard, translated */
155 0x5d, /* Trust keyboard */
156 0x60, /* NMB SGI keyboard, translated */
157 0x47, /* NMB SGI keyboard */
160 return memchr(keyboard_ids
, id_byte
, sizeof(keyboard_ids
)) != NULL
;
162 EXPORT_SYMBOL(ps2_is_keyboard_id
);
165 * ps2_adjust_timeout() is called after receiving 1st byte of command
166 * response and tries to reduce remaining timeout to speed up command
170 static int ps2_adjust_timeout(struct ps2dev
*ps2dev
,
171 unsigned int command
, unsigned int timeout
)
174 case PS2_CMD_RESET_BAT
:
176 * Device has sent the first response byte after
177 * reset command, reset is thus done, so we can
178 * shorten the timeout.
179 * The next byte will come soon (keyboard) or not
182 if (timeout
> msecs_to_jiffies(100))
183 timeout
= msecs_to_jiffies(100);
188 * Microsoft Natural Elite keyboard responds to
189 * the GET ID command as it were a mouse, with
190 * a single byte. Fail the command so atkbd will
191 * use alternative probe to detect it.
193 if (ps2dev
->cmdbuf
[1] == 0xaa) {
194 serio_pause_rx(ps2dev
->serio
);
196 serio_continue_rx(ps2dev
->serio
);
201 * If device behind the port is not a keyboard there
202 * won't be 2nd byte of ID response.
204 if (!ps2_is_keyboard_id(ps2dev
->cmdbuf
[1])) {
205 serio_pause_rx(ps2dev
->serio
);
206 ps2dev
->flags
= ps2dev
->cmdcnt
= 0;
207 serio_continue_rx(ps2dev
->serio
);
220 * ps2_command() sends a command and its parameters to the mouse,
221 * then waits for the response and puts it in the param array.
223 * ps2_command() can only be called from a process context
226 int __ps2_command(struct ps2dev
*ps2dev
, u8
*param
, unsigned int command
)
228 unsigned int timeout
;
229 unsigned int send
= (command
>> 12) & 0xf;
230 unsigned int receive
= (command
>> 8) & 0xf;
235 if (receive
> sizeof(ps2dev
->cmdbuf
)) {
240 if (send
&& !param
) {
245 memcpy(send_param
, param
, send
);
247 serio_pause_rx(ps2dev
->serio
);
249 ps2dev
->flags
= command
== PS2_CMD_GETID
? PS2_FLAG_WAITID
: 0;
250 ps2dev
->cmdcnt
= receive
;
251 if (receive
&& param
)
252 for (i
= 0; i
< receive
; i
++)
253 ps2dev
->cmdbuf
[(receive
- 1) - i
] = param
[i
];
255 /* Signal that we are sending the command byte */
256 ps2dev
->flags
|= PS2_FLAG_ACK_CMD
;
259 * Some devices (Synaptics) peform the reset before
260 * ACKing the reset command, and so it can take a long
261 * time before the ACK arrives.
263 timeout
= command
== PS2_CMD_RESET_BAT
? 1000 : 200;
265 rc
= ps2_do_sendbyte(ps2dev
, command
& 0xff, timeout
, 2);
267 goto out_reset_flags
;
269 /* Now we are sending command parameters, if any */
270 ps2dev
->flags
&= ~PS2_FLAG_ACK_CMD
;
272 for (i
= 0; i
< send
; i
++) {
273 rc
= ps2_do_sendbyte(ps2dev
, param
[i
], 200, 2);
275 goto out_reset_flags
;
278 serio_continue_rx(ps2dev
->serio
);
281 * The reset command takes a long time to execute.
283 timeout
= msecs_to_jiffies(command
== PS2_CMD_RESET_BAT
? 4000 : 500);
285 timeout
= wait_event_timeout(ps2dev
->wait
,
286 !(ps2dev
->flags
& PS2_FLAG_CMD1
), timeout
);
288 if (ps2dev
->cmdcnt
&& !(ps2dev
->flags
& PS2_FLAG_CMD1
)) {
290 timeout
= ps2_adjust_timeout(ps2dev
, command
, timeout
);
291 wait_event_timeout(ps2dev
->wait
,
292 !(ps2dev
->flags
& PS2_FLAG_CMD
), timeout
);
295 serio_pause_rx(ps2dev
->serio
);
298 for (i
= 0; i
< receive
; i
++)
299 param
[i
] = ps2dev
->cmdbuf
[(receive
- 1) - i
];
301 if (ps2dev
->cmdcnt
&&
302 (command
!= PS2_CMD_RESET_BAT
|| ps2dev
->cmdcnt
!= 1)) {
304 goto out_reset_flags
;
311 serio_continue_rx(ps2dev
->serio
);
313 dev_dbg(&ps2dev
->serio
->dev
,
314 "%02x [%*ph] - %x/%08lx [%*ph]\n",
315 command
& 0xff, send
, send_param
,
316 ps2dev
->nak
, ps2dev
->flags
,
317 receive
, param
?: send_param
);
320 * ps_command() handles resends itself, so do not leak -EAGAIN
323 return rc
!= -EAGAIN
? rc
: -EPROTO
;
325 EXPORT_SYMBOL(__ps2_command
);
327 int ps2_command(struct ps2dev
*ps2dev
, u8
*param
, unsigned int command
)
331 ps2_begin_command(ps2dev
);
332 rc
= __ps2_command(ps2dev
, param
, command
);
333 ps2_end_command(ps2dev
);
337 EXPORT_SYMBOL(ps2_command
);
340 * ps2_sliced_command() sends an extended PS/2 command to the mouse
341 * using sliced syntax, understood by advanced devices, such as Logitech
342 * or Synaptics touchpads. The command is encoded as:
343 * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
347 int ps2_sliced_command(struct ps2dev
*ps2dev
, u8 command
)
352 ps2_begin_command(ps2dev
);
354 retval
= __ps2_command(ps2dev
, NULL
, PS2_CMD_SETSCALE11
);
358 for (i
= 6; i
>= 0; i
-= 2) {
359 u8 d
= (command
>> i
) & 3;
360 retval
= __ps2_command(ps2dev
, &d
, PS2_CMD_SETRES
);
366 dev_dbg(&ps2dev
->serio
->dev
, "%02x - %d\n", command
, retval
);
367 ps2_end_command(ps2dev
);
370 EXPORT_SYMBOL(ps2_sliced_command
);
373 * ps2_init() initializes ps2dev structure
376 void ps2_init(struct ps2dev
*ps2dev
, struct serio
*serio
)
378 mutex_init(&ps2dev
->cmd_mutex
);
379 lockdep_set_subclass(&ps2dev
->cmd_mutex
, serio
->depth
);
380 init_waitqueue_head(&ps2dev
->wait
);
381 ps2dev
->serio
= serio
;
383 EXPORT_SYMBOL(ps2_init
);
386 * ps2_handle_ack() is supposed to be used in interrupt handler
387 * to properly process ACK/NAK of a command from a PS/2 device.
390 bool ps2_handle_ack(struct ps2dev
*ps2dev
, u8 data
)
398 ps2dev
->flags
|= PS2_FLAG_NAK
;
399 ps2dev
->nak
= PS2_RET_NAK
;
403 if (ps2dev
->flags
& PS2_FLAG_NAK
) {
404 ps2dev
->flags
&= ~PS2_FLAG_NAK
;
405 ps2dev
->nak
= PS2_RET_ERR
;
411 * Workaround for mice which don't ACK the Get ID command.
412 * These are valid mouse IDs that we recognize.
417 if (ps2dev
->flags
& PS2_FLAG_WAITID
) {
424 * Do not signal errors if we get unexpected reply while
425 * waiting for an ACK to the initial (first) command byte:
426 * the device might not be quiesced yet and continue
428 * Note that we reset PS2_FLAG_WAITID flag, so the workaround
429 * for mice not acknowledging the Get ID command only triggers
430 * on the 1st byte; if device spews data we really want to see
431 * a real ACK from it.
433 dev_dbg(&ps2dev
->serio
->dev
, "unexpected %#02x\n", data
);
434 ps2dev
->flags
&= ~PS2_FLAG_WAITID
;
435 return ps2dev
->flags
& PS2_FLAG_ACK_CMD
;
439 ps2dev
->flags
&= ~PS2_FLAG_NAK
;
441 ps2dev
->flags
|= PS2_FLAG_CMD
| PS2_FLAG_CMD1
;
444 ps2dev
->flags
&= ~PS2_FLAG_ACK
;
445 wake_up(&ps2dev
->wait
);
447 if (data
!= PS2_RET_ACK
)
448 ps2_handle_response(ps2dev
, data
);
452 EXPORT_SYMBOL(ps2_handle_ack
);
455 * ps2_handle_response() is supposed to be used in interrupt handler
456 * to properly store device's response to a command and notify process
457 * waiting for completion of the command.
460 bool ps2_handle_response(struct ps2dev
*ps2dev
, u8 data
)
463 ps2dev
->cmdbuf
[--ps2dev
->cmdcnt
] = data
;
465 if (ps2dev
->flags
& PS2_FLAG_CMD1
) {
466 ps2dev
->flags
&= ~PS2_FLAG_CMD1
;
468 wake_up(&ps2dev
->wait
);
471 if (!ps2dev
->cmdcnt
) {
472 ps2dev
->flags
&= ~PS2_FLAG_CMD
;
473 wake_up(&ps2dev
->wait
);
478 EXPORT_SYMBOL(ps2_handle_response
);
480 void ps2_cmd_aborted(struct ps2dev
*ps2dev
)
482 if (ps2dev
->flags
& PS2_FLAG_ACK
)
485 if (ps2dev
->flags
& (PS2_FLAG_ACK
| PS2_FLAG_CMD
))
486 wake_up(&ps2dev
->wait
);
488 /* reset all flags except last nack */
489 ps2dev
->flags
&= PS2_FLAG_NAK
;
491 EXPORT_SYMBOL(ps2_cmd_aborted
);