Lines Matching refs:ps2dev

37 int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout)  in ps2_sendbyte()  argument
39 serio_pause_rx(ps2dev->serio); in ps2_sendbyte()
40 ps2dev->nak = 1; in ps2_sendbyte()
41 ps2dev->flags |= PS2_FLAG_ACK; in ps2_sendbyte()
42 serio_continue_rx(ps2dev->serio); in ps2_sendbyte()
44 if (serio_write(ps2dev->serio, byte) == 0) in ps2_sendbyte()
45 wait_event_timeout(ps2dev->wait, in ps2_sendbyte()
46 !(ps2dev->flags & PS2_FLAG_ACK), in ps2_sendbyte()
49 serio_pause_rx(ps2dev->serio); in ps2_sendbyte()
50 ps2dev->flags &= ~PS2_FLAG_ACK; in ps2_sendbyte()
51 serio_continue_rx(ps2dev->serio); in ps2_sendbyte()
53 return -ps2dev->nak; in ps2_sendbyte()
57 void ps2_begin_command(struct ps2dev *ps2dev) in ps2_begin_command() argument
59 mutex_lock(&ps2dev->cmd_mutex); in ps2_begin_command()
61 if (i8042_check_port_owner(ps2dev->serio)) in ps2_begin_command()
66 void ps2_end_command(struct ps2dev *ps2dev) in ps2_end_command() argument
68 if (i8042_check_port_owner(ps2dev->serio)) in ps2_end_command()
71 mutex_unlock(&ps2dev->cmd_mutex); in ps2_end_command()
80 void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout) in ps2_drain() argument
82 if (maxbytes > sizeof(ps2dev->cmdbuf)) { in ps2_drain()
84 maxbytes = sizeof(ps2dev->cmdbuf); in ps2_drain()
87 ps2_begin_command(ps2dev); in ps2_drain()
89 serio_pause_rx(ps2dev->serio); in ps2_drain()
90 ps2dev->flags = PS2_FLAG_CMD; in ps2_drain()
91 ps2dev->cmdcnt = maxbytes; in ps2_drain()
92 serio_continue_rx(ps2dev->serio); in ps2_drain()
94 wait_event_timeout(ps2dev->wait, in ps2_drain()
95 !(ps2dev->flags & PS2_FLAG_CMD), in ps2_drain()
98 ps2_end_command(ps2dev); in ps2_drain()
128 static int ps2_adjust_timeout(struct ps2dev *ps2dev, int command, int timeout) in ps2_adjust_timeout() argument
150 if (ps2dev->cmdbuf[1] == 0xaa) { in ps2_adjust_timeout()
151 serio_pause_rx(ps2dev->serio); in ps2_adjust_timeout()
152 ps2dev->flags = 0; in ps2_adjust_timeout()
153 serio_continue_rx(ps2dev->serio); in ps2_adjust_timeout()
161 if (!ps2_is_keyboard_id(ps2dev->cmdbuf[1])) { in ps2_adjust_timeout()
162 serio_pause_rx(ps2dev->serio); in ps2_adjust_timeout()
163 ps2dev->flags = ps2dev->cmdcnt = 0; in ps2_adjust_timeout()
164 serio_continue_rx(ps2dev->serio); in ps2_adjust_timeout()
183 int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) in __ps2_command() argument
191 if (receive > sizeof(ps2dev->cmdbuf)) { in __ps2_command()
201 serio_pause_rx(ps2dev->serio); in __ps2_command()
202 ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; in __ps2_command()
203 ps2dev->cmdcnt = receive; in __ps2_command()
206 ps2dev->cmdbuf[(receive - 1) - i] = param[i]; in __ps2_command()
207 serio_continue_rx(ps2dev->serio); in __ps2_command()
214 if (ps2_sendbyte(ps2dev, command & 0xff, in __ps2_command()
219 if (ps2_sendbyte(ps2dev, param[i], 200)) in __ps2_command()
227 timeout = wait_event_timeout(ps2dev->wait, in __ps2_command()
228 !(ps2dev->flags & PS2_FLAG_CMD1), timeout); in __ps2_command()
230 if (ps2dev->cmdcnt && !(ps2dev->flags & PS2_FLAG_CMD1)) { in __ps2_command()
232 timeout = ps2_adjust_timeout(ps2dev, command, timeout); in __ps2_command()
233 wait_event_timeout(ps2dev->wait, in __ps2_command()
234 !(ps2dev->flags & PS2_FLAG_CMD), timeout); in __ps2_command()
239 param[i] = ps2dev->cmdbuf[(receive - 1) - i]; in __ps2_command()
241 if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1)) in __ps2_command()
247 serio_pause_rx(ps2dev->serio); in __ps2_command()
248 ps2dev->flags = 0; in __ps2_command()
249 serio_continue_rx(ps2dev->serio); in __ps2_command()
255 int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) in ps2_command() argument
259 ps2_begin_command(ps2dev); in ps2_command()
260 rc = __ps2_command(ps2dev, param, command); in ps2_command()
261 ps2_end_command(ps2dev); in ps2_command()
271 void ps2_init(struct ps2dev *ps2dev, struct serio *serio) in ps2_init() argument
273 mutex_init(&ps2dev->cmd_mutex); in ps2_init()
274 lockdep_set_subclass(&ps2dev->cmd_mutex, serio->depth); in ps2_init()
275 init_waitqueue_head(&ps2dev->wait); in ps2_init()
276 ps2dev->serio = serio; in ps2_init()
285 int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data) in ps2_handle_ack() argument
289 ps2dev->nak = 0; in ps2_handle_ack()
293 ps2dev->flags |= PS2_FLAG_NAK; in ps2_handle_ack()
294 ps2dev->nak = PS2_RET_NAK; in ps2_handle_ack()
298 if (ps2dev->flags & PS2_FLAG_NAK) { in ps2_handle_ack()
299 ps2dev->flags &= ~PS2_FLAG_NAK; in ps2_handle_ack()
300 ps2dev->nak = PS2_RET_ERR; in ps2_handle_ack()
311 if (ps2dev->flags & PS2_FLAG_WAITID) { in ps2_handle_ack()
312 ps2dev->nak = 0; in ps2_handle_ack()
321 if (!ps2dev->nak) { in ps2_handle_ack()
322 ps2dev->flags &= ~PS2_FLAG_NAK; in ps2_handle_ack()
323 if (ps2dev->cmdcnt) in ps2_handle_ack()
324 ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1; in ps2_handle_ack()
327 ps2dev->flags &= ~PS2_FLAG_ACK; in ps2_handle_ack()
328 wake_up(&ps2dev->wait); in ps2_handle_ack()
331 ps2_handle_response(ps2dev, data); in ps2_handle_ack()
343 int ps2_handle_response(struct ps2dev *ps2dev, unsigned char data) in ps2_handle_response() argument
345 if (ps2dev->cmdcnt) in ps2_handle_response()
346 ps2dev->cmdbuf[--ps2dev->cmdcnt] = data; in ps2_handle_response()
348 if (ps2dev->flags & PS2_FLAG_CMD1) { in ps2_handle_response()
349 ps2dev->flags &= ~PS2_FLAG_CMD1; in ps2_handle_response()
350 if (ps2dev->cmdcnt) in ps2_handle_response()
351 wake_up(&ps2dev->wait); in ps2_handle_response()
354 if (!ps2dev->cmdcnt) { in ps2_handle_response()
355 ps2dev->flags &= ~PS2_FLAG_CMD; in ps2_handle_response()
356 wake_up(&ps2dev->wait); in ps2_handle_response()
363 void ps2_cmd_aborted(struct ps2dev *ps2dev) in ps2_cmd_aborted() argument
365 if (ps2dev->flags & PS2_FLAG_ACK) in ps2_cmd_aborted()
366 ps2dev->nak = 1; in ps2_cmd_aborted()
368 if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD)) in ps2_cmd_aborted()
369 wake_up(&ps2dev->wait); in ps2_cmd_aborted()
372 ps2dev->flags &= PS2_FLAG_NAK; in ps2_cmd_aborted()