1/* SPDX-License-Identifier: GPL-2.0-only */
2#ifndef _LINUX_I8042_H
3#define _LINUX_I8042_H
4
5
6#include <linux/errno.h>
7#include <linux/types.h>
8
9/*
10 * Standard commands.
11 */
12
13#define I8042_CMD_CTL_RCTR 0x0120
14#define I8042_CMD_CTL_WCTR 0x1060
15#define I8042_CMD_CTL_TEST 0x01aa
16
17#define I8042_CMD_KBD_DISABLE 0x00ad
18#define I8042_CMD_KBD_ENABLE 0x00ae
19#define I8042_CMD_KBD_TEST 0x01ab
20#define I8042_CMD_KBD_LOOP 0x11d2
21
22#define I8042_CMD_AUX_DISABLE 0x00a7
23#define I8042_CMD_AUX_ENABLE 0x00a8
24#define I8042_CMD_AUX_TEST 0x01a9
25#define I8042_CMD_AUX_SEND 0x10d4
26#define I8042_CMD_AUX_LOOP 0x11d3
27
28#define I8042_CMD_MUX_PFX 0x0090
29#define I8042_CMD_MUX_SEND 0x1090
30
31/*
32 * Status register bits.
33 */
34
35#define I8042_STR_PARITY 0x80
36#define I8042_STR_TIMEOUT 0x40
37#define I8042_STR_AUXDATA 0x20
38#define I8042_STR_KEYLOCK 0x10
39#define I8042_STR_CMDDAT 0x08
40#define I8042_STR_MUXERR 0x04
41#define I8042_STR_IBF 0x02
42#define I8042_STR_OBF 0x01
43
44/*
45 * Control register bits.
46 */
47
48#define I8042_CTR_KBDINT 0x01
49#define I8042_CTR_AUXINT 0x02
50#define I8042_CTR_IGNKEYLOCK 0x08
51#define I8042_CTR_KBDDIS 0x10
52#define I8042_CTR_AUXDIS 0x20
53#define I8042_CTR_XLATE 0x40
54
55struct serio;
56
57/**
58 * typedef i8042_filter_t - i8042 filter callback
59 * @data: Data received by the i8042 controller
60 * @str: Status register of the i8042 controller
61 * @serio: Serio of the i8042 controller
62 * @context: Context pointer associated with this callback
63 *
64 * This represents a i8042 filter callback which can be used with i8042_install_filter()
65 * and i8042_remove_filter() to filter the i8042 input for platform-specific key codes.
66 *
67 * Context: Interrupt context.
68 * Returns: true if the data should be filtered out, false if otherwise.
69 */
70typedef bool (*i8042_filter_t)(unsigned char data, unsigned char str, struct serio *serio,
71 void *context);
72
73#if defined(CONFIG_SERIO_I8042) || defined(CONFIG_SERIO_I8042_MODULE)
74
75void i8042_lock_chip(void);
76void i8042_unlock_chip(void);
77int i8042_command(unsigned char *param, int command);
78int i8042_install_filter(i8042_filter_t filter, void *context);
79int i8042_remove_filter(i8042_filter_t filter);
80
81#else
82
83static inline void i8042_lock_chip(void)
84{
85}
86
87static inline void i8042_unlock_chip(void)
88{
89}
90
91static inline int i8042_command(unsigned char *param, int command)
92{
93 return -ENODEV;
94}
95
96static inline int i8042_install_filter(i8042_filter_t filter, void *context)
97{
98 return -ENODEV;
99}
100
101static inline int i8042_remove_filter(i8042_filter_t filter)
102{
103 return -ENODEV;
104}
105
106#endif
107
108#endif
109