| 1 |
|
| 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
|
| 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 |
|
| 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
|
| 73 | };
|
| 74 |
|
| 75 | struct psmouse;
|
| 76 |
|
| 77 | struct psmouse_protocol {
|
| 78 | enum psmouse_type type;
|
| 79 | bool maxproto;
|
| 80 | bool ignore_parity;
|
| 81 | bool try_passthru;
|
| 82 | bool smbus_companion;
|
| 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 work_struct 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;
|
| 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 | int psmouse_reset(struct psmouse *psmouse);
|
| 136 | void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state);
|
| 137 | void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
|
| 138 | psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse);
|
| 139 | int psmouse_activate(struct psmouse *psmouse);
|
| 140 | int psmouse_deactivate(struct psmouse *psmouse);
|
| 141 | bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]);
|
| 142 |
|
| 143 | void psmouse_report_standard_buttons(struct input_dev *, u8 buttons);
|
| 144 | void psmouse_report_standard_motion(struct input_dev *, u8 *packet);
|
| 145 | void psmouse_report_standard_packet(struct input_dev *, u8 *packet);
|
| 146 |
|
| 147 | struct psmouse_attribute {
|
| 148 | struct device_attribute dattr;
|
| 149 | void *data;
|
| 150 | ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf);
|
| 151 | ssize_t (*set)(struct psmouse *psmouse, void *data,
|
| 152 | const char *buf, size_t count);
|
| 153 | bool protect;
|
| 154 | };
|
| 155 | #define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr)
|
| 156 |
|
| 157 | ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr,
|
| 158 | char *buf);
|
| 159 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr,
|
| 160 | const char *buf, size_t count);
|
| 161 |
|
| 162 | #define __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect) \
|
| 163 | static struct psmouse_attribute psmouse_attr_##_name = { \
|
| 164 | .dattr = { \
|
| 165 | .attr = { \
|
| 166 | .name = __stringify(_name), \
|
| 167 | .mode = _mode, \
|
| 168 | }, \
|
| 169 | .show = psmouse_attr_show_helper, \
|
| 170 | .store = psmouse_attr_set_helper, \
|
| 171 | }, \
|
| 172 | .data = _data, \
|
| 173 | .show = _show, \
|
| 174 | .set = _set, \
|
| 175 | .protect = _protect, \
|
| 176 | }
|
| 177 |
|
| 178 | #define __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, _protect) \
|
| 179 | static ssize_t _show(struct psmouse *, void *, char *); \
|
| 180 | static ssize_t _set(struct psmouse *, void *, const char *, size_t); \
|
| 181 | __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect)
|
| 182 |
|
| 183 | #define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set) \
|
| 184 | __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, true)
|
| 185 |
|
| 186 | #define PSMOUSE_DEFINE_RO_ATTR(_name, _mode, _data, _show) \
|
| 187 | static ssize_t _show(struct psmouse *, void *, char *); \
|
| 188 | __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, NULL, true)
|
| 189 |
|
| 190 | #define PSMOUSE_DEFINE_WO_ATTR(_name, _mode, _data, _set) \
|
| 191 | static ssize_t _set(struct psmouse *, void *, const char *, size_t); \
|
| 192 | __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true)
|
| 193 |
|
| 194 | #ifndef psmouse_fmt
|
| 195 | #define psmouse_fmt(fmt) KBUILD_BASENAME ": " fmt
|
| 196 | #endif
|
| 197 |
|
| 198 | #define psmouse_dbg(psmouse, format, ...) \
|
| 199 | dev_dbg(&(psmouse)->ps2dev.serio->dev, \
|
| 200 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 201 | #define psmouse_info(psmouse, format, ...) \
|
| 202 | dev_info(&(psmouse)->ps2dev.serio->dev, \
|
| 203 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 204 | #define psmouse_warn(psmouse, format, ...) \
|
| 205 | dev_warn(&(psmouse)->ps2dev.serio->dev, \
|
| 206 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 207 | #define psmouse_err(psmouse, format, ...) \
|
| 208 | dev_err(&(psmouse)->ps2dev.serio->dev, \
|
| 209 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 210 | #define psmouse_notice(psmouse, format, ...) \
|
| 211 | dev_notice(&(psmouse)->ps2dev.serio->dev, \
|
| 212 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 213 | #define psmouse_printk(level, psmouse, format, ...) \
|
| 214 | dev_printk(level, \
|
| 215 | &(psmouse)->ps2dev.serio->dev, \
|
| 216 | psmouse_fmt(format), ##__VA_ARGS__)
|
| 217 |
|
| 218 | #ifdef CONFIG_MOUSE_PS2_SMBUS
|
| 219 |
|
| 220 | int psmouse_smbus_module_init(void);
|
| 221 | void psmouse_smbus_module_exit(void);
|
| 222 |
|
| 223 | struct i2c_board_info;
|
| 224 |
|
| 225 | int psmouse_smbus_init(struct psmouse *psmouse,
|
| 226 | const struct i2c_board_info *board,
|
| 227 | const void *pdata, size_t pdata_size,
|
| 228 | bool need_deactivate,
|
| 229 | bool leave_breadcrumbs);
|
| 230 | void psmouse_smbus_cleanup(struct psmouse *psmouse);
|
| 231 |
|
| 232 | #else
|
| 233 |
|
| 234 | static inline int psmouse_smbus_module_init(void)
|
| 235 | {
|
| 236 | return 0;
|
| 237 | }
|
| 238 |
|
| 239 | static inline void psmouse_smbus_module_exit(void)
|
| 240 | {
|
| 241 | }
|
| 242 |
|
| 243 | static inline void psmouse_smbus_cleanup(struct psmouse *psmouse)
|
| 244 | {
|
| 245 | }
|
| 246 |
|
| 247 | #endif
|
| 248 |
|
| 249 | #endif
|