xref: /openbmc/linux/drivers/input/mouse/elantech.h (revision e4c90627)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
22a0bd75eSArjan Opmeer /*
33f8c0df4SArjan Opmeer  * Elantech Touchpad driver (v6)
42a0bd75eSArjan Opmeer  *
53f8c0df4SArjan Opmeer  * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
62a0bd75eSArjan Opmeer  *
72a0bd75eSArjan Opmeer  * Trademarks are the property of their respective owners.
82a0bd75eSArjan Opmeer  */
92a0bd75eSArjan Opmeer 
102a0bd75eSArjan Opmeer #ifndef _ELANTECH_H
112a0bd75eSArjan Opmeer #define _ELANTECH_H
122a0bd75eSArjan Opmeer 
132a0bd75eSArjan Opmeer /*
142a0bd75eSArjan Opmeer  * Command values for Synaptics style queries
152a0bd75eSArjan Opmeer  */
1628f49616SJJ Ding #define ETP_FW_ID_QUERY			0x00
172a0bd75eSArjan Opmeer #define ETP_FW_VERSION_QUERY		0x01
182a0bd75eSArjan Opmeer #define ETP_CAPABILITIES_QUERY		0x02
1984a90b61SJJ Ding #define ETP_SAMPLE_QUERY		0x03
203d95fd6aSJJ Ding #define ETP_RESOLUTION_QUERY		0x04
21*e4c90627Sjingle.wu #define ETP_ICBODY_QUERY		0x05
222a0bd75eSArjan Opmeer 
232a0bd75eSArjan Opmeer /*
242a0bd75eSArjan Opmeer  * Command values for register reading or writing
252a0bd75eSArjan Opmeer  */
262a0bd75eSArjan Opmeer #define ETP_REGISTER_READ		0x10
272a0bd75eSArjan Opmeer #define ETP_REGISTER_WRITE		0x11
2828f49616SJJ Ding #define ETP_REGISTER_READWRITE		0x00
292a0bd75eSArjan Opmeer 
302a0bd75eSArjan Opmeer /*
312a0bd75eSArjan Opmeer  * Hardware version 2 custom PS/2 command value
322a0bd75eSArjan Opmeer  */
332a0bd75eSArjan Opmeer #define ETP_PS2_CUSTOM_COMMAND		0xf8
342a0bd75eSArjan Opmeer 
352a0bd75eSArjan Opmeer /*
362a0bd75eSArjan Opmeer  * Times to retry a ps2_command and millisecond delay between tries
372a0bd75eSArjan Opmeer  */
382a0bd75eSArjan Opmeer #define ETP_PS2_COMMAND_TRIES		3
392a0bd75eSArjan Opmeer #define ETP_PS2_COMMAND_DELAY		500
402a0bd75eSArjan Opmeer 
412a0bd75eSArjan Opmeer /*
422a0bd75eSArjan Opmeer  * Times to try to read back a register and millisecond delay between tries
432a0bd75eSArjan Opmeer  */
442a0bd75eSArjan Opmeer #define ETP_READ_BACK_TRIES		5
452a0bd75eSArjan Opmeer #define ETP_READ_BACK_DELAY		2000
462a0bd75eSArjan Opmeer 
472a0bd75eSArjan Opmeer /*
482a0bd75eSArjan Opmeer  * Register bitmasks for hardware version 1
492a0bd75eSArjan Opmeer  */
502a0bd75eSArjan Opmeer #define ETP_R10_ABSOLUTE_MODE		0x04
512a0bd75eSArjan Opmeer #define ETP_R11_4_BYTE_MODE		0x02
522a0bd75eSArjan Opmeer 
532a0bd75eSArjan Opmeer /*
542a0bd75eSArjan Opmeer  * Capability bitmasks
552a0bd75eSArjan Opmeer  */
562a0bd75eSArjan Opmeer #define ETP_CAP_HAS_ROCKER		0x04
572a0bd75eSArjan Opmeer 
582a0bd75eSArjan Opmeer /*
592a0bd75eSArjan Opmeer  * One hard to find application note states that X axis range is 0 to 576
602a0bd75eSArjan Opmeer  * and Y axis range is 0 to 384 for harware version 1.
612a0bd75eSArjan Opmeer  * Edge fuzz might be necessary because of bezel around the touchpad
622a0bd75eSArjan Opmeer  */
632a0bd75eSArjan Opmeer #define ETP_EDGE_FUZZ_V1		32
642a0bd75eSArjan Opmeer 
652a0bd75eSArjan Opmeer #define ETP_XMIN_V1			(  0 + ETP_EDGE_FUZZ_V1)
662a0bd75eSArjan Opmeer #define ETP_XMAX_V1			(576 - ETP_EDGE_FUZZ_V1)
672a0bd75eSArjan Opmeer #define ETP_YMIN_V1			(  0 + ETP_EDGE_FUZZ_V1)
682a0bd75eSArjan Opmeer #define ETP_YMAX_V1			(384 - ETP_EDGE_FUZZ_V1)
692a0bd75eSArjan Opmeer 
702a0bd75eSArjan Opmeer /*
718a360d09SJJ Ding  * The resolution for older v2 hardware doubled.
728a360d09SJJ Ding  * (newer v2's firmware provides command so we can query)
732a0bd75eSArjan Opmeer  */
748a360d09SJJ Ding #define ETP_XMIN_V2			0
758a360d09SJJ Ding #define ETP_XMAX_V2			1152
768a360d09SJJ Ding #define ETP_YMIN_V2			0
778a360d09SJJ Ding #define ETP_YMAX_V2			768
782a0bd75eSArjan Opmeer 
79f941c705SÉric Piel #define ETP_PMIN_V2			0
80f941c705SÉric Piel #define ETP_PMAX_V2			255
81f941c705SÉric Piel #define ETP_WMIN_V2			0
82f941c705SÉric Piel #define ETP_WMAX_V2			15
83f941c705SÉric Piel 
8428f49616SJJ Ding /*
851dc6edecSJJ Ding  * v3 hardware has 2 kinds of packet types,
861dc6edecSJJ Ding  * v4 hardware has 3.
8728f49616SJJ Ding  */
8828f49616SJJ Ding #define PACKET_UNKNOWN			0x01
8928f49616SJJ Ding #define PACKET_DEBOUNCE			0x02
9028f49616SJJ Ding #define PACKET_V3_HEAD			0x03
9128f49616SJJ Ding #define PACKET_V3_TAIL			0x04
921dc6edecSJJ Ding #define PACKET_V4_HEAD			0x05
931dc6edecSJJ Ding #define PACKET_V4_MOTION		0x06
941dc6edecSJJ Ding #define PACKET_V4_STATUS		0x07
95a2418fc4SUlrik De Bie #define PACKET_TRACKPOINT		0x08
961dc6edecSJJ Ding 
971dc6edecSJJ Ding /*
981dc6edecSJJ Ding  * track up to 5 fingers for v4 hardware
991dc6edecSJJ Ding  */
1001dc6edecSJJ Ding #define ETP_MAX_FINGERS			5
1011dc6edecSJJ Ding 
1021dc6edecSJJ Ding /*
1031dc6edecSJJ Ding  * weight value for v4 hardware
1041dc6edecSJJ Ding  */
1051dc6edecSJJ Ding #define ETP_WEIGHT_VALUE		5
1061dc6edecSJJ Ding 
1071dc6edecSJJ Ding /*
10821c48dbdSBenjamin Tissoires  * Bus information on 3rd byte of query ETP_RESOLUTION_QUERY(0x04)
10921c48dbdSBenjamin Tissoires  */
11021c48dbdSBenjamin Tissoires #define ETP_BUS_PS2_ONLY		0
11121c48dbdSBenjamin Tissoires #define ETP_BUS_SMB_ALERT_ONLY		1
11221c48dbdSBenjamin Tissoires #define ETP_BUS_SMB_HST_NTFY_ONLY	2
11321c48dbdSBenjamin Tissoires #define ETP_BUS_PS2_SMB_ALERT		3
11421c48dbdSBenjamin Tissoires #define ETP_BUS_PS2_SMB_HST_NTFY	4
11521c48dbdSBenjamin Tissoires 
11621c48dbdSBenjamin Tissoires /*
117df077237SBenjamin Tissoires  * New ICs are either using SMBus Host Notify or just plain PS2.
118df077237SBenjamin Tissoires  *
119df077237SBenjamin Tissoires  * ETP_FW_VERSION_QUERY is:
120df077237SBenjamin Tissoires  * Byte 1:
121df077237SBenjamin Tissoires  *  - bit 0..3: IC BODY
122df077237SBenjamin Tissoires  * Byte 2:
123df077237SBenjamin Tissoires  *  - bit 4: HiddenButton
124df077237SBenjamin Tissoires  *  - bit 5: PS2_SMBUS_NOTIFY
125df077237SBenjamin Tissoires  *  - bit 6: PS2CRCCheck
126df077237SBenjamin Tissoires  */
127df077237SBenjamin Tissoires #define ETP_NEW_IC_SMBUS_HOST_NOTIFY(fw_version)	\
128df077237SBenjamin Tissoires 		((((fw_version) & 0x0f2000) == 0x0f2000) && \
129df077237SBenjamin Tissoires 		 ((fw_version) & 0x0000ff) > 0)
130df077237SBenjamin Tissoires 
131df077237SBenjamin Tissoires /*
1321dc6edecSJJ Ding  * The base position for one finger, v4 hardware
1331dc6edecSJJ Ding  */
1341dc6edecSJJ Ding struct finger_pos {
1351dc6edecSJJ Ding 	unsigned int x;
1361dc6edecSJJ Ding 	unsigned int y;
1371dc6edecSJJ Ding };
13828f49616SJJ Ding 
139f0787592SBenjamin Tissoires struct elantech_device_info {
140f0787592SBenjamin Tissoires 	unsigned char capabilities[3];
141f0787592SBenjamin Tissoires 	unsigned char samples[3];
142f0787592SBenjamin Tissoires 	unsigned char debug;
143f0787592SBenjamin Tissoires 	unsigned char hw_version;
144*e4c90627Sjingle.wu 	unsigned char pattern;
145f0787592SBenjamin Tissoires 	unsigned int fw_version;
146*e4c90627Sjingle.wu 	unsigned int ic_version;
147*e4c90627Sjingle.wu 	unsigned int product_id;
14837548659SBenjamin Tissoires 	unsigned int x_min;
14937548659SBenjamin Tissoires 	unsigned int y_min;
15037548659SBenjamin Tissoires 	unsigned int x_max;
15137548659SBenjamin Tissoires 	unsigned int y_max;
15280212ed7SBenjamin Tissoires 	unsigned int x_res;
15380212ed7SBenjamin Tissoires 	unsigned int y_res;
1543abcc532SBenjamin Tissoires 	unsigned int x_traces;
1553abcc532SBenjamin Tissoires 	unsigned int y_traces;
15637548659SBenjamin Tissoires 	unsigned int width;
15721c48dbdSBenjamin Tissoires 	unsigned int bus;
158f0787592SBenjamin Tissoires 	bool paritycheck;
159f0787592SBenjamin Tissoires 	bool jumpy_cursor;
160f0787592SBenjamin Tissoires 	bool reports_pressure;
161f0787592SBenjamin Tissoires 	bool crc_enabled;
162f0787592SBenjamin Tissoires 	bool set_hw_resolution;
163f0787592SBenjamin Tissoires 	bool has_trackpoint;
164fd1cf11fSBenjamin Tissoires 	bool has_middle_button;
165f0787592SBenjamin Tissoires 	int (*send_cmd)(struct psmouse *psmouse, unsigned char c,
166f0787592SBenjamin Tissoires 			unsigned char *param);
167f0787592SBenjamin Tissoires };
168f0787592SBenjamin Tissoires 
1692a0bd75eSArjan Opmeer struct elantech_data {
170a2418fc4SUlrik De Bie 	struct input_dev *tp_dev;	/* Relative device for trackpoint */
171a2418fc4SUlrik De Bie 	char tp_phys[32];
1721dc6edecSJJ Ding 	unsigned char reg_07;
1732a0bd75eSArjan Opmeer 	unsigned char reg_10;
1742a0bd75eSArjan Opmeer 	unsigned char reg_11;
1752a0bd75eSArjan Opmeer 	unsigned char reg_20;
1762a0bd75eSArjan Opmeer 	unsigned char reg_21;
1772a0bd75eSArjan Opmeer 	unsigned char reg_22;
1782a0bd75eSArjan Opmeer 	unsigned char reg_23;
1792a0bd75eSArjan Opmeer 	unsigned char reg_24;
1802a0bd75eSArjan Opmeer 	unsigned char reg_25;
1812a0bd75eSArjan Opmeer 	unsigned char reg_26;
1827f29f17bSÉric Piel 	unsigned int single_finger_reports;
183230282a7SJJ Ding 	unsigned int y_max;
1841dc6edecSJJ Ding 	unsigned int width;
1851dc6edecSJJ Ding 	struct finger_pos mt[ETP_MAX_FINGERS];
1862a0bd75eSArjan Opmeer 	unsigned char parity[256];
187f0787592SBenjamin Tissoires 	struct elantech_device_info info;
188bd884149SUlrik De Bie 	void (*original_set_rate)(struct psmouse *psmouse, unsigned int rate);
1892a0bd75eSArjan Opmeer };
1902a0bd75eSArjan Opmeer 
191b7802c5cSDmitry Torokhov int elantech_detect(struct psmouse *psmouse, bool set_properties);
19221c48dbdSBenjamin Tissoires int elantech_init_ps2(struct psmouse *psmouse);
193cfd8579dSHui Wang 
194cfd8579dSHui Wang #ifdef CONFIG_MOUSE_PS2_ELANTECH
1952a0bd75eSArjan Opmeer int elantech_init(struct psmouse *psmouse);
1962a0bd75eSArjan Opmeer #else
elantech_init(struct psmouse * psmouse)1972a0bd75eSArjan Opmeer static inline int elantech_init(struct psmouse *psmouse)
1982a0bd75eSArjan Opmeer {
1992a0bd75eSArjan Opmeer 	return -ENOSYS;
2002a0bd75eSArjan Opmeer }
2012a0bd75eSArjan Opmeer #endif /* CONFIG_MOUSE_PS2_ELANTECH */
2022a0bd75eSArjan Opmeer 
20321c48dbdSBenjamin Tissoires int elantech_init_smbus(struct psmouse *psmouse);
20421c48dbdSBenjamin Tissoires 
2052a0bd75eSArjan Opmeer #endif
206