1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * cyttsp4_core.h 4 * Cypress TrueTouch(TM) Standard Product V4 Core driver module. 5 * For use with Cypress Txx4xx parts. 6 * Supported parts include: 7 * TMA4XX 8 * TMA1036 9 * 10 * Copyright (C) 2012 Cypress Semiconductor 11 * 12 * Contact Cypress Semiconductor at www.cypress.com <ttdrivers@cypress.com> 13 */ 14 15 #ifndef _LINUX_CYTTSP4_CORE_H 16 #define _LINUX_CYTTSP4_CORE_H 17 18 #include <linux/device.h> 19 #include <linux/err.h> 20 #include <linux/input.h> 21 #include <linux/kernel.h> 22 #include <linux/limits.h> 23 #include <linux/module.h> 24 #include <linux/stringify.h> 25 #include <linux/types.h> 26 #include <linux/platform_data/cyttsp4.h> 27 28 #define CY_REG_BASE 0x00 29 30 #define CY_POST_CODEL_WDG_RST 0x01 31 #define CY_POST_CODEL_CFG_DATA_CRC_FAIL 0x02 32 #define CY_POST_CODEL_PANEL_TEST_FAIL 0x04 33 34 #define CY_NUM_BTN_PER_REG 4 35 36 /* touch record system information offset masks and shifts */ 37 #define CY_BYTE_OFS_MASK 0x1F 38 #define CY_BOFS_MASK 0xE0 39 #define CY_BOFS_SHIFT 5 40 41 #define CY_TMA1036_TCH_REC_SIZE 6 42 #define CY_TMA4XX_TCH_REC_SIZE 9 43 #define CY_TMA1036_MAX_TCH 0x0E 44 #define CY_TMA4XX_MAX_TCH 0x1E 45 46 #define CY_NORMAL_ORIGIN 0 /* upper, left corner */ 47 #define CY_INVERT_ORIGIN 1 /* lower, right corner */ 48 49 /* helpers */ 50 #define GET_NUM_TOUCHES(x) ((x) & 0x1F) 51 #define IS_LARGE_AREA(x) ((x) & 0x20) 52 #define IS_BAD_PKT(x) ((x) & 0x20) 53 #define IS_BOOTLOADER(hst_mode, reset_detect) \ 54 ((hst_mode) & 0x01 || (reset_detect) != 0) 55 #define IS_TMO(t) ((t) == 0) 56 57 58 enum cyttsp_cmd_bits { 59 CY_CMD_COMPLETE = (1 << 6), 60 }; 61 62 /* Timeout in ms. */ 63 #define CY_WATCHDOG_TIMEOUT 1000 64 65 #define CY_MAX_PRINT_SIZE 512 66 #ifdef VERBOSE_DEBUG 67 #define CY_MAX_PRBUF_SIZE PIPE_BUF 68 #define CY_PR_TRUNCATED " truncated..." 69 #endif 70 71 enum cyttsp4_ic_grpnum { 72 CY_IC_GRPNUM_RESERVED, 73 CY_IC_GRPNUM_CMD_REGS, 74 CY_IC_GRPNUM_TCH_REP, 75 CY_IC_GRPNUM_DATA_REC, 76 CY_IC_GRPNUM_TEST_REC, 77 CY_IC_GRPNUM_PCFG_REC, 78 CY_IC_GRPNUM_TCH_PARM_VAL, 79 CY_IC_GRPNUM_TCH_PARM_SIZE, 80 CY_IC_GRPNUM_RESERVED1, 81 CY_IC_GRPNUM_RESERVED2, 82 CY_IC_GRPNUM_OPCFG_REC, 83 CY_IC_GRPNUM_DDATA_REC, 84 CY_IC_GRPNUM_MDATA_REC, 85 CY_IC_GRPNUM_TEST_REGS, 86 CY_IC_GRPNUM_BTN_KEYS, 87 CY_IC_GRPNUM_TTHE_REGS, 88 CY_IC_GRPNUM_NUM 89 }; 90 91 enum cyttsp4_int_state { 92 CY_INT_NONE, 93 CY_INT_IGNORE = (1 << 0), 94 CY_INT_MODE_CHANGE = (1 << 1), 95 CY_INT_EXEC_CMD = (1 << 2), 96 CY_INT_AWAKE = (1 << 3), 97 }; 98 99 enum cyttsp4_mode { 100 CY_MODE_UNKNOWN, 101 CY_MODE_BOOTLOADER = (1 << 1), 102 CY_MODE_OPERATIONAL = (1 << 2), 103 CY_MODE_SYSINFO = (1 << 3), 104 CY_MODE_CAT = (1 << 4), 105 CY_MODE_STARTUP = (1 << 5), 106 CY_MODE_LOADER = (1 << 6), 107 CY_MODE_CHANGE_MODE = (1 << 7), 108 CY_MODE_CHANGED = (1 << 8), 109 CY_MODE_CMD_COMPLETE = (1 << 9), 110 }; 111 112 enum cyttsp4_sleep_state { 113 SS_SLEEP_OFF, 114 SS_SLEEP_ON, 115 SS_SLEEPING, 116 SS_WAKING, 117 }; 118 119 enum cyttsp4_startup_state { 120 STARTUP_NONE, 121 STARTUP_QUEUED, 122 STARTUP_RUNNING, 123 }; 124 125 #define CY_NUM_REVCTRL 8 126 struct cyttsp4_cydata { 127 u8 ttpidh; 128 u8 ttpidl; 129 u8 fw_ver_major; 130 u8 fw_ver_minor; 131 u8 revctrl[CY_NUM_REVCTRL]; 132 u8 blver_major; 133 u8 blver_minor; 134 u8 jtag_si_id3; 135 u8 jtag_si_id2; 136 u8 jtag_si_id1; 137 u8 jtag_si_id0; 138 u8 mfgid_sz; 139 u8 cyito_idh; 140 u8 cyito_idl; 141 u8 cyito_verh; 142 u8 cyito_verl; 143 u8 ttsp_ver_major; 144 u8 ttsp_ver_minor; 145 u8 device_info; 146 u8 mfg_id[]; 147 } __packed; 148 149 struct cyttsp4_test { 150 u8 post_codeh; 151 u8 post_codel; 152 } __packed; 153 154 struct cyttsp4_pcfg { 155 u8 electrodes_x; 156 u8 electrodes_y; 157 u8 len_xh; 158 u8 len_xl; 159 u8 len_yh; 160 u8 len_yl; 161 u8 res_xh; 162 u8 res_xl; 163 u8 res_yh; 164 u8 res_yl; 165 u8 max_zh; 166 u8 max_zl; 167 u8 panel_info0; 168 } __packed; 169 170 struct cyttsp4_tch_rec_params { 171 u8 loc; 172 u8 size; 173 } __packed; 174 175 #define CY_NUM_TCH_FIELDS 7 176 #define CY_NUM_EXT_TCH_FIELDS 3 177 struct cyttsp4_opcfg { 178 u8 cmd_ofs; 179 u8 rep_ofs; 180 u8 rep_szh; 181 u8 rep_szl; 182 u8 num_btns; 183 u8 tt_stat_ofs; 184 u8 obj_cfg0; 185 u8 max_tchs; 186 u8 tch_rec_size; 187 struct cyttsp4_tch_rec_params tch_rec_old[CY_NUM_TCH_FIELDS]; 188 u8 btn_rec_size; /* btn record size (in bytes) */ 189 u8 btn_diff_ofs; /* btn data loc, diff counts */ 190 u8 btn_diff_size; /* btn size of diff counts (in bits) */ 191 struct cyttsp4_tch_rec_params tch_rec_new[CY_NUM_EXT_TCH_FIELDS]; 192 } __packed; 193 194 struct cyttsp4_sysinfo_ptr { 195 struct cyttsp4_cydata *cydata; 196 struct cyttsp4_test *test; 197 struct cyttsp4_pcfg *pcfg; 198 struct cyttsp4_opcfg *opcfg; 199 struct cyttsp4_ddata *ddata; 200 struct cyttsp4_mdata *mdata; 201 } __packed; 202 203 struct cyttsp4_sysinfo_data { 204 u8 hst_mode; 205 u8 reserved; 206 u8 map_szh; 207 u8 map_szl; 208 u8 cydata_ofsh; 209 u8 cydata_ofsl; 210 u8 test_ofsh; 211 u8 test_ofsl; 212 u8 pcfg_ofsh; 213 u8 pcfg_ofsl; 214 u8 opcfg_ofsh; 215 u8 opcfg_ofsl; 216 u8 ddata_ofsh; 217 u8 ddata_ofsl; 218 u8 mdata_ofsh; 219 u8 mdata_ofsl; 220 } __packed; 221 222 enum cyttsp4_tch_abs { /* for ordering within the extracted touch data array */ 223 CY_TCH_X, /* X */ 224 CY_TCH_Y, /* Y */ 225 CY_TCH_P, /* P (Z) */ 226 CY_TCH_T, /* TOUCH ID */ 227 CY_TCH_E, /* EVENT ID */ 228 CY_TCH_O, /* OBJECT ID */ 229 CY_TCH_W, /* SIZE */ 230 CY_TCH_MAJ, /* TOUCH_MAJOR */ 231 CY_TCH_MIN, /* TOUCH_MINOR */ 232 CY_TCH_OR, /* ORIENTATION */ 233 CY_TCH_NUM_ABS 234 }; 235 236 static const char * const cyttsp4_tch_abs_string[] = { 237 [CY_TCH_X] = "X", 238 [CY_TCH_Y] = "Y", 239 [CY_TCH_P] = "P", 240 [CY_TCH_T] = "T", 241 [CY_TCH_E] = "E", 242 [CY_TCH_O] = "O", 243 [CY_TCH_W] = "W", 244 [CY_TCH_MAJ] = "MAJ", 245 [CY_TCH_MIN] = "MIN", 246 [CY_TCH_OR] = "OR", 247 [CY_TCH_NUM_ABS] = "INVALID" 248 }; 249 250 struct cyttsp4_touch { 251 int abs[CY_TCH_NUM_ABS]; 252 }; 253 254 struct cyttsp4_tch_abs_params { 255 size_t ofs; /* abs byte offset */ 256 size_t size; /* size in bits */ 257 size_t max; /* max value */ 258 size_t bofs; /* bit offset */ 259 }; 260 261 struct cyttsp4_sysinfo_ofs { 262 size_t chip_type; 263 size_t cmd_ofs; 264 size_t rep_ofs; 265 size_t rep_sz; 266 size_t num_btns; 267 size_t num_btn_regs; /* ceil(num_btns/4) */ 268 size_t tt_stat_ofs; 269 size_t tch_rec_size; 270 size_t obj_cfg0; 271 size_t max_tchs; 272 size_t mode_size; 273 size_t data_size; 274 size_t map_sz; 275 size_t max_x; 276 size_t x_origin; /* left or right corner */ 277 size_t max_y; 278 size_t y_origin; /* upper or lower corner */ 279 size_t max_p; 280 size_t cydata_ofs; 281 size_t test_ofs; 282 size_t pcfg_ofs; 283 size_t opcfg_ofs; 284 size_t ddata_ofs; 285 size_t mdata_ofs; 286 size_t cydata_size; 287 size_t test_size; 288 size_t pcfg_size; 289 size_t opcfg_size; 290 size_t ddata_size; 291 size_t mdata_size; 292 size_t btn_keys_size; 293 struct cyttsp4_tch_abs_params tch_abs[CY_TCH_NUM_ABS]; 294 size_t btn_rec_size; /* btn record size (in bytes) */ 295 size_t btn_diff_ofs;/* btn data loc ,diff counts, (Op-Mode byte ofs) */ 296 size_t btn_diff_size;/* btn size of diff counts (in bits) */ 297 }; 298 299 enum cyttsp4_btn_state { 300 CY_BTN_RELEASED, 301 CY_BTN_PRESSED, 302 CY_BTN_NUM_STATE 303 }; 304 305 struct cyttsp4_btn { 306 bool enabled; 307 int state; /* CY_BTN_PRESSED, CY_BTN_RELEASED */ 308 int key_code; 309 }; 310 311 struct cyttsp4_sysinfo { 312 bool ready; 313 struct cyttsp4_sysinfo_data si_data; 314 struct cyttsp4_sysinfo_ptr si_ptrs; 315 struct cyttsp4_sysinfo_ofs si_ofs; 316 struct cyttsp4_btn *btn; /* button states */ 317 u8 *btn_rec_data; /* button diff count data */ 318 u8 *xy_mode; /* operational mode and status regs */ 319 u8 *xy_data; /* operational touch regs */ 320 }; 321 322 struct cyttsp4_mt_data { 323 struct cyttsp4_mt_platform_data *pdata; 324 struct cyttsp4_sysinfo *si; 325 struct input_dev *input; 326 struct mutex report_lock; 327 bool is_suspended; 328 char phys[NAME_MAX]; 329 int num_prv_tch; 330 }; 331 332 struct cyttsp4 { 333 struct device *dev; 334 struct mutex system_lock; 335 struct mutex adap_lock; 336 enum cyttsp4_mode mode; 337 enum cyttsp4_sleep_state sleep_state; 338 enum cyttsp4_startup_state startup_state; 339 int int_status; 340 wait_queue_head_t wait_q; 341 int irq; 342 struct work_struct startup_work; 343 struct work_struct watchdog_work; 344 struct timer_list watchdog_timer; 345 struct cyttsp4_sysinfo sysinfo; 346 void *exclusive_dev; 347 int exclusive_waits; 348 atomic_t ignore_irq; 349 bool invalid_touch_app; 350 struct cyttsp4_mt_data md; 351 struct cyttsp4_platform_data *pdata; 352 struct cyttsp4_core_platform_data *cpdata; 353 const struct cyttsp4_bus_ops *bus_ops; 354 u8 *xfer_buf; 355 #ifdef VERBOSE_DEBUG 356 u8 pr_buf[CY_MAX_PRBUF_SIZE]; 357 #endif 358 }; 359 360 struct cyttsp4_bus_ops { 361 u16 bustype; 362 int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, 363 const void *values); 364 int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, 365 void *values); 366 }; 367 368 enum cyttsp4_hst_mode_bits { 369 CY_HST_TOGGLE = (1 << 7), 370 CY_HST_MODE_CHANGE = (1 << 3), 371 CY_HST_MODE = (7 << 4), 372 CY_HST_OPERATE = (0 << 4), 373 CY_HST_SYSINFO = (1 << 4), 374 CY_HST_CAT = (2 << 4), 375 CY_HST_LOWPOW = (1 << 2), 376 CY_HST_SLEEP = (1 << 1), 377 CY_HST_RESET = (1 << 0), 378 }; 379 380 /* abs settings */ 381 #define CY_IGNORE_VALUE 0xFFFF 382 383 /* abs signal capabilities offsets in the frameworks array */ 384 enum cyttsp4_sig_caps { 385 CY_SIGNAL_OST, 386 CY_MIN_OST, 387 CY_MAX_OST, 388 CY_FUZZ_OST, 389 CY_FLAT_OST, 390 CY_NUM_ABS_SET /* number of signal capability fields */ 391 }; 392 393 /* abs axis signal offsets in the framworks array */ 394 enum cyttsp4_sig_ost { 395 CY_ABS_X_OST, 396 CY_ABS_Y_OST, 397 CY_ABS_P_OST, 398 CY_ABS_W_OST, 399 CY_ABS_ID_OST, 400 CY_ABS_MAJ_OST, 401 CY_ABS_MIN_OST, 402 CY_ABS_OR_OST, 403 CY_NUM_ABS_OST /* number of abs signals */ 404 }; 405 406 enum cyttsp4_flags { 407 CY_FLAG_NONE = 0x00, 408 CY_FLAG_HOVER = 0x04, 409 CY_FLAG_FLIP = 0x08, 410 CY_FLAG_INV_X = 0x10, 411 CY_FLAG_INV_Y = 0x20, 412 CY_FLAG_VKEYS = 0x40, 413 }; 414 415 enum cyttsp4_object_id { 416 CY_OBJ_STANDARD_FINGER, 417 CY_OBJ_LARGE_OBJECT, 418 CY_OBJ_STYLUS, 419 CY_OBJ_HOVER, 420 }; 421 422 enum cyttsp4_event_id { 423 CY_EV_NO_EVENT, 424 CY_EV_TOUCHDOWN, 425 CY_EV_MOVE, /* significant displacement (> act dist) */ 426 CY_EV_LIFTOFF, /* record reports last position */ 427 }; 428 429 /* x-axis resolution of panel in pixels */ 430 #define CY_PCFG_RESOLUTION_X_MASK 0x7F 431 432 /* y-axis resolution of panel in pixels */ 433 #define CY_PCFG_RESOLUTION_Y_MASK 0x7F 434 435 /* x-axis, 0:origin is on left side of panel, 1: right */ 436 #define CY_PCFG_ORIGIN_X_MASK 0x80 437 438 /* y-axis, 0:origin is on top side of panel, 1: bottom */ 439 #define CY_PCFG_ORIGIN_Y_MASK 0x80 440 441 static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u16 addr, int size, 442 void *buf) 443 { 444 return ts->bus_ops->read(ts->dev, ts->xfer_buf, addr, size, buf); 445 } 446 447 static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u16 addr, int size, 448 const void *buf) 449 { 450 return ts->bus_ops->write(ts->dev, ts->xfer_buf, addr, size, buf); 451 } 452 453 extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, 454 struct device *dev, u16 irq, size_t xfer_buf_size); 455 extern int cyttsp4_remove(struct cyttsp4 *ts); 456 int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr, 457 u8 length, const void *values); 458 int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr, 459 u8 length, void *values); 460 extern const struct dev_pm_ops cyttsp4_pm_ops; 461 462 #endif /* _LINUX_CYTTSP4_CORE_H */ 463