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