4d8acfe0d82aa3017413628d5a8ba8f917ec080f
[releases.git] / psmouse.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _PSMOUSE_H
3 #define _PSMOUSE_H
4
5 #define PSMOUSE_OOB_NONE        0x00
6 #define PSMOUSE_OOB_EXTRA_BTNS  0x01
7
8 #define PSMOUSE_CMD_SETSCALE11  0x00e6
9 #define PSMOUSE_CMD_SETSCALE21  0x00e7
10 #define PSMOUSE_CMD_SETRES      0x10e8
11 #define PSMOUSE_CMD_GETINFO     0x03e9
12 #define PSMOUSE_CMD_SETSTREAM   0x00ea
13 #define PSMOUSE_CMD_SETPOLL     0x00f0
14 #define PSMOUSE_CMD_POLL        0x00eb  /* caller sets number of bytes to receive */
15 #define PSMOUSE_CMD_RESET_WRAP  0x00ec
16 #define PSMOUSE_CMD_GETID       0x02f2
17 #define PSMOUSE_CMD_SETRATE     0x10f3
18 #define PSMOUSE_CMD_ENABLE      0x00f4
19 #define PSMOUSE_CMD_DISABLE     0x00f5
20 #define PSMOUSE_CMD_RESET_DIS   0x00f6
21 #define PSMOUSE_CMD_RESET_BAT   0x02ff
22
23 #define PSMOUSE_RET_BAT         0xaa
24 #define PSMOUSE_RET_ID          0x00
25 #define PSMOUSE_RET_ACK         0xfa
26 #define PSMOUSE_RET_NAK         0xfe
27
28 enum psmouse_state {
29         PSMOUSE_IGNORE,
30         PSMOUSE_INITIALIZING,
31         PSMOUSE_RESYNCING,
32         PSMOUSE_CMD_MODE,
33         PSMOUSE_ACTIVATED,
34 };
35
36 /* psmouse protocol handler return codes */
37 typedef enum {
38         PSMOUSE_BAD_DATA,
39         PSMOUSE_GOOD_DATA,
40         PSMOUSE_FULL_PACKET
41 } psmouse_ret_t;
42
43 enum psmouse_scale {
44         PSMOUSE_SCALE11,
45         PSMOUSE_SCALE21
46 };
47
48 enum psmouse_type {
49         PSMOUSE_NONE,
50         PSMOUSE_PS2,
51         PSMOUSE_PS2PP,
52         PSMOUSE_THINKPS,
53         PSMOUSE_GENPS,
54         PSMOUSE_IMPS,
55         PSMOUSE_IMEX,
56         PSMOUSE_SYNAPTICS,
57         PSMOUSE_ALPS,
58         PSMOUSE_LIFEBOOK,
59         PSMOUSE_TRACKPOINT,
60         PSMOUSE_TOUCHKIT_PS2,
61         PSMOUSE_CORTRON,
62         PSMOUSE_HGPK,
63         PSMOUSE_ELANTECH,
64         PSMOUSE_FSP,
65         PSMOUSE_SYNAPTICS_RELATIVE,
66         PSMOUSE_CYPRESS,
67         PSMOUSE_FOCALTECH,
68         PSMOUSE_VMMOUSE,
69         PSMOUSE_BYD,
70         PSMOUSE_SYNAPTICS_SMBUS,
71         PSMOUSE_ELANTECH_SMBUS,
72         PSMOUSE_AUTO            /* This one should always be last */
73 };
74
75 struct psmouse;
76
77 struct psmouse_protocol {
78         enum psmouse_type type;
79         bool maxproto;
80         bool ignore_parity; /* Protocol should ignore parity errors from KBC */
81         bool try_passthru; /* Try protocol also on passthrough ports */
82         bool smbus_companion; /* "Protocol" is a stub, device is on SMBus */
83         const char *name;
84         const char *alias;
85         int (*detect)(struct psmouse *, bool);
86         int (*init)(struct psmouse *);
87 };
88
89 struct psmouse {
90         void *private;
91         struct input_dev *dev;
92         struct ps2dev ps2dev;
93         struct delayed_work resync_work;
94         const char *vendor;
95         const char *name;
96         const struct psmouse_protocol *protocol;
97         unsigned char packet[8];
98         unsigned char badbyte;
99         unsigned char pktcnt;
100         unsigned char pktsize;
101         unsigned char oob_data_type;
102         unsigned char extra_buttons;
103         bool acks_disable_command;
104         unsigned int model;
105         unsigned long last;
106         unsigned long out_of_sync_cnt;
107         unsigned long num_resyncs;
108         enum psmouse_state state;
109         char devname[64];
110         char phys[32];
111
112         unsigned int rate;
113         unsigned int resolution;
114         unsigned int resetafter;
115         unsigned int resync_time;
116         bool smartscroll;       /* Logitech only */
117
118         psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);
119         void (*set_rate)(struct psmouse *psmouse, unsigned int rate);
120         void (*set_resolution)(struct psmouse *psmouse, unsigned int resolution);
121         void (*set_scale)(struct psmouse *psmouse, enum psmouse_scale scale);
122
123         int (*reconnect)(struct psmouse *psmouse);
124         int (*fast_reconnect)(struct psmouse *psmouse);
125         void (*disconnect)(struct psmouse *psmouse);
126         void (*cleanup)(struct psmouse *psmouse);
127         int (*poll)(struct psmouse *psmouse);
128
129         void (*pt_activate)(struct psmouse *psmouse);
130         void (*pt_deactivate)(struct psmouse *psmouse);
131 };
132
133 struct psmouse *psmouse_from_serio(struct serio *serio);
134
135 void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
136                 unsigned long delay);
137 int psmouse_reset(struct psmouse *psmouse);
138 void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state);
139 void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
140 psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse);
141 int psmouse_activate(struct psmouse *psmouse);
142 int psmouse_deactivate(struct psmouse *psmouse);
143 bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]);
144
145 void psmouse_report_standard_buttons(struct input_dev *, u8 buttons);
146 void psmouse_report_standard_motion(struct input_dev *, u8 *packet);
147 void psmouse_report_standard_packet(struct input_dev *, u8 *packet);
148
149 struct psmouse_attribute {
150         struct device_attribute dattr;
151         void *data;
152         ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf);
153         ssize_t (*set)(struct psmouse *psmouse, void *data,
154                         const char *buf, size_t count);
155         bool protect;
156 };
157 #define to_psmouse_attr(a)      container_of((a), struct psmouse_attribute, dattr)
158
159 ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr,
160                                  char *buf);
161 ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr,
162                                 const char *buf, size_t count);
163
164 #define __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect)   \
165 static struct psmouse_attribute psmouse_attr_##_name = {                        \
166         .dattr  = {                                                             \
167                 .attr   = {                                                     \
168                         .name   = __stringify(_name),                           \
169                         .mode   = _mode,                                        \
170                 },                                                              \
171                 .show   = psmouse_attr_show_helper,                             \
172                 .store  = psmouse_attr_set_helper,                              \
173         },                                                                      \
174         .data   = _data,                                                        \
175         .show   = _show,                                                        \
176         .set    = _set,                                                         \
177         .protect = _protect,                                                    \
178 }
179
180 #define __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, _protect)       \
181         static ssize_t _show(struct psmouse *, void *, char *);                 \
182         static ssize_t _set(struct psmouse *, void *, const char *, size_t);    \
183         __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect)
184
185 #define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set)                   \
186         __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, true)
187
188 #define PSMOUSE_DEFINE_RO_ATTR(_name, _mode, _data, _show)                      \
189         static ssize_t _show(struct psmouse *, void *, char *);                 \
190         __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, NULL, true)
191
192 #define PSMOUSE_DEFINE_WO_ATTR(_name, _mode, _data, _set)                       \
193         static ssize_t _set(struct psmouse *, void *, const char *, size_t);    \
194         __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true)
195
196 #ifndef psmouse_fmt
197 #define psmouse_fmt(fmt)        KBUILD_BASENAME ": " fmt
198 #endif
199
200 #define psmouse_dbg(psmouse, format, ...)               \
201         dev_dbg(&(psmouse)->ps2dev.serio->dev,          \
202                 psmouse_fmt(format), ##__VA_ARGS__)
203 #define psmouse_info(psmouse, format, ...)              \
204         dev_info(&(psmouse)->ps2dev.serio->dev,         \
205                  psmouse_fmt(format), ##__VA_ARGS__)
206 #define psmouse_warn(psmouse, format, ...)              \
207         dev_warn(&(psmouse)->ps2dev.serio->dev,         \
208                  psmouse_fmt(format), ##__VA_ARGS__)
209 #define psmouse_err(psmouse, format, ...)               \
210         dev_err(&(psmouse)->ps2dev.serio->dev,          \
211                 psmouse_fmt(format), ##__VA_ARGS__)
212 #define psmouse_notice(psmouse, format, ...)            \
213         dev_notice(&(psmouse)->ps2dev.serio->dev,       \
214                    psmouse_fmt(format), ##__VA_ARGS__)
215 #define psmouse_printk(level, psmouse, format, ...)     \
216         dev_printk(level,                               \
217                    &(psmouse)->ps2dev.serio->dev,       \
218                    psmouse_fmt(format), ##__VA_ARGS__)
219
220 #ifdef CONFIG_MOUSE_PS2_SMBUS
221
222 int psmouse_smbus_module_init(void);
223 void psmouse_smbus_module_exit(void);
224
225 struct i2c_board_info;
226
227 int psmouse_smbus_init(struct psmouse *psmouse,
228                        const struct i2c_board_info *board,
229                        const void *pdata, size_t pdata_size,
230                        bool need_deactivate,
231                        bool leave_breadcrumbs);
232 void psmouse_smbus_cleanup(struct psmouse *psmouse);
233
234 #else /* !CONFIG_MOUSE_PS2_SMBUS */
235
236 static inline int psmouse_smbus_module_init(void)
237 {
238         return 0;
239 }
240
241 static inline void psmouse_smbus_module_exit(void)
242 {
243 }
244
245 static inline void psmouse_smbus_cleanup(struct psmouse *psmouse)
246 {
247 }
248
249 #endif /* CONFIG_MOUSE_PS2_SMBUS */
250
251 #endif /* _PSMOUSE_H */