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
68enum 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
81enum 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
101enum 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
109enum 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
122enum cyttsp4_sleep_state {
123 SS_SLEEP_OFF,
124 SS_SLEEP_ON,
125 SS_SLEEPING,
126 SS_WAKING,
127};
128
129enum cyttsp4_startup_state {
130 STARTUP_NONE,
131 STARTUP_QUEUED,
132 STARTUP_RUNNING,
133};
134
135#define CY_NUM_REVCTRL 8
136struct 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
159struct cyttsp4_test {
160 u8 post_codeh;
161 u8 post_codel;
162} __packed;
163
164struct 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
180struct 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
187struct 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
204struct 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
213struct 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
232enum 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
246static 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
260struct cyttsp4_touch {
261 int abs[CY_TCH_NUM_ABS];
262};
263
264struct 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
271struct 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
309enum cyttsp4_btn_state {
310 CY_BTN_RELEASED,
311 CY_BTN_PRESSED,
312 CY_BTN_NUM_STATE
313};
314
315struct cyttsp4_btn {
316 bool enabled;
317 int state; /* CY_BTN_PRESSED, CY_BTN_RELEASED */
318 int key_code;
319};
320
321struct 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
332struct 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
342struct 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
370struct 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
378enum 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 */
394enum 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 */
404enum 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
416enum 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
425enum cyttsp4_object_id {
426 CY_OBJ_STANDARD_FINGER,
427 CY_OBJ_LARGE_OBJECT,
428 CY_OBJ_STYLUS,
429 CY_OBJ_HOVER,
430};
431
432enum 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
451static 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
457static 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
463extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
464 struct device *dev, u16 irq, size_t xfer_buf_size);
465extern int cyttsp4_remove(struct cyttsp4 *ts);
466int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
467 u8 length, const void *values);
468int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr,
469 u8 length, void *values);
470extern const struct dev_pm_ops cyttsp4_pm_ops;
471
472#endif /* _LINUX_CYTTSP4_CORE_H */
473