linux/drivers/input/serio/libps2.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * PS/2 driver library
 *
 * Copyright (c) 1999-2002 Vojtech Pavlik
 * Copyright (c) 2004 Dmitry Torokhov
 */


#include <linux/delay.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/kmsan-checks.h>
#include <linux/serio.h>
#include <linux/i8042.h>
#include <linux/libps2.h>

#define DRIVER_DESC

#define PS2_CMD_SETSCALE11
#define PS2_CMD_SETRES
#define PS2_CMD_EX_SETLEDS
#define PS2_CMD_SETLEDS
#define PS2_CMD_GETID
#define PS2_CMD_SETREP
#define PS2_CMD_RESET_BAT

#define PS2_RET_BAT
#define PS2_RET_ID
#define PS2_RET_ACK
#define PS2_RET_NAK
#define PS2_RET_ERR

#define PS2_FLAG_ACK
#define PS2_FLAG_CMD
#define PS2_FLAG_CMD1
#define PS2_FLAG_WAITID
#define PS2_FLAG_NAK
#define PS2_FLAG_PASS_NOACK

static int ps2_do_sendbyte(struct ps2dev *ps2dev, u8 byte,
			   unsigned int timeout, unsigned int max_attempts)
	__releases(&ps2dev->serio->lock) __acquires(&ps2dev->serio->lock)
{}

/**
 * ps2_sendbyte - sends a byte to the device and wait for acknowledgement
 * @ps2dev: a PS/2 device to send the data to
 * @byte: data to be sent to the device
 * @timeout: timeout for sending the data and receiving an acknowledge
 *
 * The function doesn't handle retransmission, the caller is expected to handle
 * it when needed.
 *
 * ps2_sendbyte() can only be called from a process context.
 */
int ps2_sendbyte(struct ps2dev *ps2dev, u8 byte, unsigned int timeout)
{}
EXPORT_SYMBOL();

/**
 * ps2_begin_command - mark beginning of execution of a complex command
 * @ps2dev: a PS/2 device executing the command
 *
 * Serializes a complex/compound command. Once command is finished
 * ps2_end_command() should be called.
 */
void ps2_begin_command(struct ps2dev *ps2dev)
{}
EXPORT_SYMBOL();

/**
 * ps2_end_command - mark end of execution of a complex command
 * @ps2dev: a PS/2 device executing the command
 */
void ps2_end_command(struct ps2dev *ps2dev)
{}
EXPORT_SYMBOL();

/**
 * ps2_drain - waits for device to transmit requested number of bytes
 * and discards them
 * @ps2dev: the PS/2 device that should be drained
 * @maxbytes: maximum number of bytes to be drained
 * @timeout: time to drain the device
 */
void ps2_drain(struct ps2dev *ps2dev, size_t maxbytes, unsigned int timeout)
{}
EXPORT_SYMBOL();

/**
 * ps2_is_keyboard_id - checks received ID byte against the list of
 *   known keyboard IDs
 * @id_byte: data byte that should be checked
 */
bool ps2_is_keyboard_id(u8 id_byte)
{}
EXPORT_SYMBOL();

/*
 * ps2_adjust_timeout() is called after receiving 1st byte of command
 * response and tries to reduce remaining timeout to speed up command
 * completion.
 */
static int ps2_adjust_timeout(struct ps2dev *ps2dev,
			      unsigned int command, unsigned int timeout)
{}

/**
 * __ps2_command - send a command to PS/2 device
 * @ps2dev: the PS/2 device that should execute the command
 * @param: a buffer containing parameters to be sent along with the command,
 *   or place where the results of the command execution will be deposited,
 *   or both
 * @command: command word that encodes the command itself, as well as number of
 *   additional parameter bytes that should be sent to the device and expected
 *   length of the command response
 *
 * Not serialized. Callers should use ps2_begin_command() and ps2_end_command()
 * to ensure proper serialization for complex commands.
 */
int __ps2_command(struct ps2dev *ps2dev, u8 *param, unsigned int command)
{}
EXPORT_SYMBOL();

/**
 * ps2_command - send a command to PS/2 device
 * @ps2dev: the PS/2 device that should execute the command
 * @param: a buffer containing parameters to be sent along with the command,
 *   or place where the results of the command execution will be deposited,
 *   or both
 * @command: command word that encodes the command itself, as well as number of
 *   additional parameter bytes that should be sent to the device and expected
 *   length of the command response
 *
 * Note: ps2_command() serializes the command execution so that only one
 * command can be executed at a time for either individual port or the entire
 * 8042 controller.
 */
int ps2_command(struct ps2dev *ps2dev, u8 *param, unsigned int command)
{}
EXPORT_SYMBOL();

/**
 * ps2_sliced_command - sends an extended PS/2 command to a mouse
 * @ps2dev: the PS/2 device that should execute the command
 * @command: command byte
 *
 * The command is sent using "sliced" syntax understood by advanced devices,
 * such as Logitech or Synaptics touchpads. The command is encoded as:
 * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
 * is the command.
 */
int ps2_sliced_command(struct ps2dev *ps2dev, u8 command)
{}
EXPORT_SYMBOL();

/**
 * ps2_init - initializes ps2dev structure
 * @ps2dev: structure to be initialized
 * @serio: serio port associated with the PS/2 device
 * @pre_receive_handler: validation handler to check basic communication state
 * @receive_handler: main protocol handler
 *
 * Prepares ps2dev structure for use in drivers for PS/2 devices.
 */
void ps2_init(struct ps2dev *ps2dev, struct serio *serio,
	      ps2_pre_receive_handler_t pre_receive_handler,
	      ps2_receive_handler_t receive_handler)
{}
EXPORT_SYMBOL();

/*
 * ps2_handle_response() stores device's response to a command and notifies
 * the process waiting for completion of the command. Note that there is a
 * distinction between waiting for the first byte of the response, and
 * waiting for subsequent bytes. It is done so that callers could shorten
 * timeouts once first byte of response is received.
 */
static void ps2_handle_response(struct ps2dev *ps2dev, u8 data)
{}

/*
 * ps2_handle_ack() processes ACK/NAK of a command from a PS/2 device,
 * possibly applying workarounds for mice not acknowledging the "get ID"
 * command.
 */
static void ps2_handle_ack(struct ps2dev *ps2dev, u8 data)
{}

/*
 * Clears state of PS/2 device after communication error by resetting majority
 * of flags and waking up waiters, if any.
 */
static void ps2_cleanup(struct ps2dev *ps2dev)
{}

/**
 * ps2_interrupt - common interrupt handler for PS/2 devices
 * @serio: serio port for the device
 * @data: a data byte received from the device
 * @flags: flags such as %SERIO_PARITY or %SERIO_TIMEOUT indicating state of
 *   the data transfer
 *
 * ps2_interrupt() invokes pre-receive handler, optionally handles command
 * acknowledgement and response from the device, and finally passes the data
 * to the main protocol handler for future processing.
 */
irqreturn_t ps2_interrupt(struct serio *serio, u8 data, unsigned int flags) {}
EXPORT_SYMBOL();

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();