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 Opmeerstatic 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