1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _CYPRESS_PS2_H 3*4882a593Smuzhiyun #define _CYPRESS_PS2_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include "psmouse.h" 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define CMD_BITS_MASK 0x03 8*4882a593Smuzhiyun #define COMPOSIT(x, s) (((x) & CMD_BITS_MASK) << (s)) 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define ENCODE_CMD(aa, bb, cc, dd) \ 11*4882a593Smuzhiyun (COMPOSIT((aa), 6) | COMPOSIT((bb), 4) | COMPOSIT((cc), 2) | COMPOSIT((dd), 0)) 12*4882a593Smuzhiyun #define CYTP_CMD_ABS_NO_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 0) 13*4882a593Smuzhiyun #define CYTP_CMD_ABS_WITH_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 1) 14*4882a593Smuzhiyun #define CYTP_CMD_SMBUS_MODE ENCODE_CMD(0, 1, 1, 0) 15*4882a593Smuzhiyun #define CYTP_CMD_STANDARD_MODE ENCODE_CMD(0, 2, 0, 0) /* not implemented yet. */ 16*4882a593Smuzhiyun #define CYTP_CMD_CYPRESS_REL_MODE ENCODE_CMD(1, 1, 1, 1) /* not implemented yet. */ 17*4882a593Smuzhiyun #define CYTP_CMD_READ_CYPRESS_ID ENCODE_CMD(0, 0, 0, 0) 18*4882a593Smuzhiyun #define CYTP_CMD_READ_TP_METRICS ENCODE_CMD(0, 0, 0, 1) 19*4882a593Smuzhiyun #define CYTP_CMD_SET_HSCROLL_WIDTH(w) ENCODE_CMD(1, 1, 0, (w)) 20*4882a593Smuzhiyun #define CYTP_CMD_SET_HSCROLL_MASK ENCODE_CMD(1, 1, 0, 0) 21*4882a593Smuzhiyun #define CYTP_CMD_SET_VSCROLL_WIDTH(w) ENCODE_CMD(1, 2, 0, (w)) 22*4882a593Smuzhiyun #define CYTP_CMD_SET_VSCROLL_MASK ENCODE_CMD(1, 2, 0, 0) 23*4882a593Smuzhiyun #define CYTP_CMD_SET_PALM_GEOMETRY(e) ENCODE_CMD(1, 2, 1, (e)) 24*4882a593Smuzhiyun #define CYTP_CMD_PALM_GEMMETRY_MASK ENCODE_CMD(1, 2, 1, 0) 25*4882a593Smuzhiyun #define CYTP_CMD_SET_PALM_SENSITIVITY(s) ENCODE_CMD(1, 2, 2, (s)) 26*4882a593Smuzhiyun #define CYTP_CMD_PALM_SENSITIVITY_MASK ENCODE_CMD(1, 2, 2, 0) 27*4882a593Smuzhiyun #define CYTP_CMD_SET_MOUSE_SENSITIVITY(s) ENCODE_CMD(1, 3, ((s) >> 2), (s)) 28*4882a593Smuzhiyun #define CYTP_CMD_MOUSE_SENSITIVITY_MASK ENCODE_CMD(1, 3, 0, 0) 29*4882a593Smuzhiyun #define CYTP_CMD_REQUEST_BASELINE_STATUS ENCODE_CMD(2, 0, 0, 1) 30*4882a593Smuzhiyun #define CYTP_CMD_REQUEST_RECALIBRATION ENCODE_CMD(2, 0, 0, 3) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define DECODE_CMD_AA(x) (((x) >> 6) & CMD_BITS_MASK) 33*4882a593Smuzhiyun #define DECODE_CMD_BB(x) (((x) >> 4) & CMD_BITS_MASK) 34*4882a593Smuzhiyun #define DECODE_CMD_CC(x) (((x) >> 2) & CMD_BITS_MASK) 35*4882a593Smuzhiyun #define DECODE_CMD_DD(x) ((x) & CMD_BITS_MASK) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* Cypress trackpad working mode. */ 38*4882a593Smuzhiyun #define CYTP_BIT_ABS_PRESSURE (1 << 3) 39*4882a593Smuzhiyun #define CYTP_BIT_ABS_NO_PRESSURE (1 << 2) 40*4882a593Smuzhiyun #define CYTP_BIT_CYPRESS_REL (1 << 1) 41*4882a593Smuzhiyun #define CYTP_BIT_STANDARD_REL (1 << 0) 42*4882a593Smuzhiyun #define CYTP_BIT_REL_MASK (CYTP_BIT_CYPRESS_REL | CYTP_BIT_STANDARD_REL) 43*4882a593Smuzhiyun #define CYTP_BIT_ABS_MASK (CYTP_BIT_ABS_PRESSURE | CYTP_BIT_ABS_NO_PRESSURE) 44*4882a593Smuzhiyun #define CYTP_BIT_ABS_REL_MASK (CYTP_BIT_ABS_MASK | CYTP_BIT_REL_MASK) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define CYTP_BIT_HIGH_RATE (1 << 4) 47*4882a593Smuzhiyun /* 48*4882a593Smuzhiyun * report mode bit is set, firmware working in Remote Mode. 49*4882a593Smuzhiyun * report mode bit is cleared, firmware working in Stream Mode. 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun #define CYTP_BIT_REPORT_MODE (1 << 5) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* scrolling width values for set HSCROLL and VSCROLL width command. */ 54*4882a593Smuzhiyun #define SCROLL_WIDTH_NARROW 1 55*4882a593Smuzhiyun #define SCROLL_WIDTH_NORMAL 2 56*4882a593Smuzhiyun #define SCROLL_WIDTH_WIDE 3 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define PALM_GEOMETRY_ENABLE 1 59*4882a593Smuzhiyun #define PALM_GEOMETRY_DISABLE 0 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define TP_METRICS_MASK 0x80 62*4882a593Smuzhiyun #define FW_VERSION_MASX 0x7f 63*4882a593Smuzhiyun #define FW_VER_HIGH_MASK 0x70 64*4882a593Smuzhiyun #define FW_VER_LOW_MASK 0x0f 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Times to retry a ps2_command and millisecond delay between tries. */ 67*4882a593Smuzhiyun #define CYTP_PS2_CMD_TRIES 3 68*4882a593Smuzhiyun #define CYTP_PS2_CMD_DELAY 500 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* time out for PS/2 command only in milliseconds. */ 71*4882a593Smuzhiyun #define CYTP_CMD_TIMEOUT 200 72*4882a593Smuzhiyun #define CYTP_DATA_TIMEOUT 30 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define CYTP_EXT_CMD 0xe8 75*4882a593Smuzhiyun #define CYTP_PS2_RETRY 0xfe 76*4882a593Smuzhiyun #define CYTP_PS2_ERROR 0xfc 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define CYTP_RESP_RETRY 0x01 79*4882a593Smuzhiyun #define CYTP_RESP_ERROR 0xfe 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define CYTP_105001_WIDTH 97 /* Dell XPS 13 */ 83*4882a593Smuzhiyun #define CYTP_105001_HIGH 59 84*4882a593Smuzhiyun #define CYTP_DEFAULT_WIDTH (CYTP_105001_WIDTH) 85*4882a593Smuzhiyun #define CYTP_DEFAULT_HIGH (CYTP_105001_HIGH) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define CYTP_ABS_MAX_X 1600 88*4882a593Smuzhiyun #define CYTP_ABS_MAX_Y 900 89*4882a593Smuzhiyun #define CYTP_MAX_PRESSURE 255 90*4882a593Smuzhiyun #define CYTP_MIN_PRESSURE 0 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* header byte bits of relative package. */ 93*4882a593Smuzhiyun #define BTN_LEFT_BIT 0x01 94*4882a593Smuzhiyun #define BTN_RIGHT_BIT 0x02 95*4882a593Smuzhiyun #define BTN_MIDDLE_BIT 0x04 96*4882a593Smuzhiyun #define REL_X_SIGN_BIT 0x10 97*4882a593Smuzhiyun #define REL_Y_SIGN_BIT 0x20 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* header byte bits of absolute package. */ 100*4882a593Smuzhiyun #define ABS_VSCROLL_BIT 0x10 101*4882a593Smuzhiyun #define ABS_HSCROLL_BIT 0x20 102*4882a593Smuzhiyun #define ABS_MULTIFINGER_TAP 0x04 103*4882a593Smuzhiyun #define ABS_EDGE_MOTION_MASK 0x80 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define DFLT_RESP_BITS_VALID 0x88 /* SMBus bit should not be set. */ 106*4882a593Smuzhiyun #define DFLT_RESP_SMBUS_BIT 0x80 107*4882a593Smuzhiyun #define DFLT_SMBUS_MODE 0x80 108*4882a593Smuzhiyun #define DFLT_PS2_MODE 0x00 109*4882a593Smuzhiyun #define DFLT_RESP_BIT_MODE 0x40 110*4882a593Smuzhiyun #define DFLT_RESP_REMOTE_MODE 0x40 111*4882a593Smuzhiyun #define DFLT_RESP_STREAM_MODE 0x00 112*4882a593Smuzhiyun #define DFLT_RESP_BIT_REPORTING 0x20 113*4882a593Smuzhiyun #define DFLT_RESP_BIT_SCALING 0x10 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define TP_METRICS_BIT_PALM 0x80 116*4882a593Smuzhiyun #define TP_METRICS_BIT_STUBBORN 0x40 117*4882a593Smuzhiyun #define TP_METRICS_BIT_2F_JITTER 0x30 118*4882a593Smuzhiyun #define TP_METRICS_BIT_1F_JITTER 0x0c 119*4882a593Smuzhiyun #define TP_METRICS_BIT_APA 0x02 120*4882a593Smuzhiyun #define TP_METRICS_BIT_MTG 0x01 121*4882a593Smuzhiyun #define TP_METRICS_BIT_ABS_PKT_FORMAT_SET 0xf0 122*4882a593Smuzhiyun #define TP_METRICS_BIT_2F_SPIKE 0x0c 123*4882a593Smuzhiyun #define TP_METRICS_BIT_1F_SPIKE 0x03 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* bits of first byte response of E9h-Status Request command. */ 126*4882a593Smuzhiyun #define RESP_BTN_RIGHT_BIT 0x01 127*4882a593Smuzhiyun #define RESP_BTN_MIDDLE_BIT 0x02 128*4882a593Smuzhiyun #define RESP_BTN_LEFT_BIT 0x04 129*4882a593Smuzhiyun #define RESP_SCALING_BIT 0x10 130*4882a593Smuzhiyun #define RESP_ENABLE_BIT 0x20 131*4882a593Smuzhiyun #define RESP_REMOTE_BIT 0x40 132*4882a593Smuzhiyun #define RESP_SMBUS_BIT 0x80 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define CYTP_MAX_MT_SLOTS 2 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct cytp_contact { 137*4882a593Smuzhiyun int x; 138*4882a593Smuzhiyun int y; 139*4882a593Smuzhiyun int z; /* also named as touch pressure. */ 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* The structure of Cypress Trackpad event data. */ 143*4882a593Smuzhiyun struct cytp_report_data { 144*4882a593Smuzhiyun int contact_cnt; 145*4882a593Smuzhiyun struct cytp_contact contacts[CYTP_MAX_MT_SLOTS]; 146*4882a593Smuzhiyun unsigned int left:1; 147*4882a593Smuzhiyun unsigned int right:1; 148*4882a593Smuzhiyun unsigned int middle:1; 149*4882a593Smuzhiyun unsigned int tap:1; /* multi-finger tap detected. */ 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* The structure of Cypress Trackpad device private data. */ 153*4882a593Smuzhiyun struct cytp_data { 154*4882a593Smuzhiyun int fw_version; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun int pkt_size; 157*4882a593Smuzhiyun int mode; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun int tp_min_pressure; 160*4882a593Smuzhiyun int tp_max_pressure; 161*4882a593Smuzhiyun int tp_width; /* X direction physical size in mm. */ 162*4882a593Smuzhiyun int tp_high; /* Y direction physical size in mm. */ 163*4882a593Smuzhiyun int tp_max_abs_x; /* Max X absolute units that can be reported. */ 164*4882a593Smuzhiyun int tp_max_abs_y; /* Max Y absolute units that can be reported. */ 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun int tp_res_x; /* X resolution in units/mm. */ 167*4882a593Smuzhiyun int tp_res_y; /* Y resolution in units/mm. */ 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun int tp_metrics_supported; 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun int cypress_detect(struct psmouse *psmouse, bool set_properties); 174*4882a593Smuzhiyun int cypress_init(struct psmouse *psmouse); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #endif /* _CYPRESS_PS2_H */ 177