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