1 // SPDX-License-Identifier: GPL-2.0-only
4 * Cypress TrueTouch(TM) Standard Product V4 Core driver module.
5 * For use with Cypress Txx4xx parts.
6 * Supported parts include:
10 * Copyright (C) 2012 Cypress Semiconductor
12 * Contact Cypress Semiconductor at www.cypress.com <ttdrivers@cypress.com>
15 #include "cyttsp4_core.h"
16 #include <linux/delay.h>
17 #include <linux/gpio.h>
18 #include <linux/input/mt.h>
19 #include <linux/interrupt.h>
20 #include <linux/pm_runtime.h>
21 #include <linux/sched.h>
22 #include <linux/slab.h>
25 #define CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT 500
26 #define CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT 5000
27 #define CY_CORE_MODE_CHANGE_TIMEOUT 1000
28 #define CY_CORE_RESET_AND_WAIT_TIMEOUT 500
29 #define CY_CORE_WAKEUP_TIMEOUT 500
31 #define CY_CORE_STARTUP_RETRY_COUNT 3
33 static const char * const cyttsp4_tch_abs_string
[] = {
44 [CY_TCH_NUM_ABS
] = "INVALID"
47 static const u8 ldr_exit
[] = {
48 0xFF, 0x01, 0x3B, 0x00, 0x00, 0x4F, 0x6D, 0x17
51 static const u8 ldr_err_app
[] = {
52 0x01, 0x02, 0x00, 0x00, 0x55, 0xDD, 0x17
55 static inline size_t merge_bytes(u8 high
, u8 low
)
57 return (high
<< 8) + low
;
61 static void cyttsp4_pr_buf(struct device
*dev
, u8
*pr_buf
, u8
*dptr
, int size
,
62 const char *data_name
)
65 const char fmt
[] = "%02X ";
71 max
= (CY_MAX_PRBUF_SIZE
- 1) - sizeof(CY_PR_TRUNCATED
);
74 for (i
= k
= 0; i
< size
&& k
< max
; i
++, k
+= 3)
75 scnprintf(pr_buf
+ k
, CY_MAX_PRBUF_SIZE
, fmt
, dptr
[i
]);
77 dev_vdbg(dev
, "%s: %s[0..%d]=%s%s\n", __func__
, data_name
, size
- 1,
78 pr_buf
, size
<= max
? "" : CY_PR_TRUNCATED
);
81 #define cyttsp4_pr_buf(dev, pr_buf, dptr, size, data_name) do { } while (0)
84 static int cyttsp4_load_status_regs(struct cyttsp4
*cd
)
86 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
87 struct device
*dev
= cd
->dev
;
90 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, si
->si_ofs
.mode_size
,
93 dev_err(dev
, "%s: fail read mode regs r=%d\n",
96 cyttsp4_pr_buf(dev
, cd
->pr_buf
, si
->xy_mode
,
97 si
->si_ofs
.mode_size
, "xy_mode");
102 static int cyttsp4_handshake(struct cyttsp4
*cd
, u8 mode
)
104 u8 cmd
= mode
^ CY_HST_TOGGLE
;
108 * Mode change issued, handshaking now will cause endless mode change
109 * requests, for sync mode modechange will do same with handshake
111 if (mode
& CY_HST_MODE_CHANGE
)
114 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(cmd
), &cmd
);
116 dev_err(cd
->dev
, "%s: bus write fail on handshake (ret=%d)\n",
122 static int cyttsp4_hw_soft_reset(struct cyttsp4
*cd
)
124 u8 cmd
= CY_HST_RESET
;
125 int rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(cmd
), &cmd
);
127 dev_err(cd
->dev
, "%s: FAILED to execute SOFT reset\n",
134 static int cyttsp4_hw_hard_reset(struct cyttsp4
*cd
)
136 if (cd
->cpdata
->xres
) {
137 cd
->cpdata
->xres(cd
->cpdata
, cd
->dev
);
138 dev_dbg(cd
->dev
, "%s: execute HARD reset\n", __func__
);
141 dev_err(cd
->dev
, "%s: FAILED to execute HARD reset\n", __func__
);
145 static int cyttsp4_hw_reset(struct cyttsp4
*cd
)
147 int rc
= cyttsp4_hw_hard_reset(cd
);
149 rc
= cyttsp4_hw_soft_reset(cd
);
154 * Gets number of bits for a touch filed as parameter,
155 * sets maximum value for field which is used as bit mask
156 * and returns number of bytes required for that field
158 static int cyttsp4_bits_2_bytes(unsigned int nbits
, size_t *max
)
161 return (nbits
+ 7) / 8;
164 static int cyttsp4_si_data_offsets(struct cyttsp4
*cd
)
166 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
167 int rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(si
->si_data
),
170 dev_err(cd
->dev
, "%s: fail read sysinfo data offsets r=%d\n",
175 /* Print sysinfo data offsets */
176 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)&si
->si_data
,
177 sizeof(si
->si_data
), "sysinfo_data_offsets");
179 /* convert sysinfo data offset bytes into integers */
181 si
->si_ofs
.map_sz
= merge_bytes(si
->si_data
.map_szh
,
182 si
->si_data
.map_szl
);
183 si
->si_ofs
.map_sz
= merge_bytes(si
->si_data
.map_szh
,
184 si
->si_data
.map_szl
);
185 si
->si_ofs
.cydata_ofs
= merge_bytes(si
->si_data
.cydata_ofsh
,
186 si
->si_data
.cydata_ofsl
);
187 si
->si_ofs
.test_ofs
= merge_bytes(si
->si_data
.test_ofsh
,
188 si
->si_data
.test_ofsl
);
189 si
->si_ofs
.pcfg_ofs
= merge_bytes(si
->si_data
.pcfg_ofsh
,
190 si
->si_data
.pcfg_ofsl
);
191 si
->si_ofs
.opcfg_ofs
= merge_bytes(si
->si_data
.opcfg_ofsh
,
192 si
->si_data
.opcfg_ofsl
);
193 si
->si_ofs
.ddata_ofs
= merge_bytes(si
->si_data
.ddata_ofsh
,
194 si
->si_data
.ddata_ofsl
);
195 si
->si_ofs
.mdata_ofs
= merge_bytes(si
->si_data
.mdata_ofsh
,
196 si
->si_data
.mdata_ofsl
);
200 static int cyttsp4_si_get_cydata(struct cyttsp4
*cd
)
202 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
204 int mfgid_sz
, calc_mfgid_sz
;
208 if (si
->si_ofs
.test_ofs
<= si
->si_ofs
.cydata_ofs
) {
210 "%s: invalid offset test_ofs: %zu, cydata_ofs: %zu\n",
211 __func__
, si
->si_ofs
.test_ofs
, si
->si_ofs
.cydata_ofs
);
215 si
->si_ofs
.cydata_size
= si
->si_ofs
.test_ofs
- si
->si_ofs
.cydata_ofs
;
216 dev_dbg(cd
->dev
, "%s: cydata size: %zd\n", __func__
,
217 si
->si_ofs
.cydata_size
);
219 p
= krealloc(si
->si_ptrs
.cydata
, si
->si_ofs
.cydata_size
, GFP_KERNEL
);
221 dev_err(cd
->dev
, "%s: failed to allocate cydata memory\n",
225 si
->si_ptrs
.cydata
= p
;
227 read_offset
= si
->si_ofs
.cydata_ofs
;
229 /* Read the CYDA registers up to MFGID field */
230 rc
= cyttsp4_adap_read(cd
, read_offset
,
231 offsetof(struct cyttsp4_cydata
, mfgid_sz
)
232 + sizeof(si
->si_ptrs
.cydata
->mfgid_sz
),
235 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
240 /* Check MFGID size */
241 mfgid_sz
= si
->si_ptrs
.cydata
->mfgid_sz
;
242 calc_mfgid_sz
= si
->si_ofs
.cydata_size
- sizeof(struct cyttsp4_cydata
);
243 if (mfgid_sz
!= calc_mfgid_sz
) {
244 dev_err(cd
->dev
, "%s: mismatch in MFGID size, reported:%d calculated:%d\n",
245 __func__
, mfgid_sz
, calc_mfgid_sz
);
249 read_offset
+= offsetof(struct cyttsp4_cydata
, mfgid_sz
)
250 + sizeof(si
->si_ptrs
.cydata
->mfgid_sz
);
252 /* Read the CYDA registers for MFGID field */
253 rc
= cyttsp4_adap_read(cd
, read_offset
, si
->si_ptrs
.cydata
->mfgid_sz
,
254 si
->si_ptrs
.cydata
->mfg_id
);
256 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
261 read_offset
+= si
->si_ptrs
.cydata
->mfgid_sz
;
263 /* Read the rest of the CYDA registers */
264 rc
= cyttsp4_adap_read(cd
, read_offset
,
265 sizeof(struct cyttsp4_cydata
)
266 - offsetof(struct cyttsp4_cydata
, cyito_idh
),
267 &si
->si_ptrs
.cydata
->cyito_idh
);
269 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
274 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)si
->si_ptrs
.cydata
,
275 si
->si_ofs
.cydata_size
, "sysinfo_cydata");
279 static int cyttsp4_si_get_test_data(struct cyttsp4
*cd
)
281 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
285 if (si
->si_ofs
.pcfg_ofs
<= si
->si_ofs
.test_ofs
) {
287 "%s: invalid offset pcfg_ofs: %zu, test_ofs: %zu\n",
288 __func__
, si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.test_ofs
);
292 si
->si_ofs
.test_size
= si
->si_ofs
.pcfg_ofs
- si
->si_ofs
.test_ofs
;
294 p
= krealloc(si
->si_ptrs
.test
, si
->si_ofs
.test_size
, GFP_KERNEL
);
296 dev_err(cd
->dev
, "%s: failed to allocate test memory\n",
300 si
->si_ptrs
.test
= p
;
302 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.test_ofs
, si
->si_ofs
.test_size
,
305 dev_err(cd
->dev
, "%s: fail read test data r=%d\n",
310 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
311 (u8
*)si
->si_ptrs
.test
, si
->si_ofs
.test_size
,
312 "sysinfo_test_data");
313 if (si
->si_ptrs
.test
->post_codel
&
314 CY_POST_CODEL_WDG_RST
)
315 dev_info(cd
->dev
, "%s: %s codel=%02X\n",
316 __func__
, "Reset was a WATCHDOG RESET",
317 si
->si_ptrs
.test
->post_codel
);
319 if (!(si
->si_ptrs
.test
->post_codel
&
320 CY_POST_CODEL_CFG_DATA_CRC_FAIL
))
321 dev_info(cd
->dev
, "%s: %s codel=%02X\n", __func__
,
322 "Config Data CRC FAIL",
323 si
->si_ptrs
.test
->post_codel
);
325 if (!(si
->si_ptrs
.test
->post_codel
&
326 CY_POST_CODEL_PANEL_TEST_FAIL
))
327 dev_info(cd
->dev
, "%s: %s codel=%02X\n",
328 __func__
, "PANEL TEST FAIL",
329 si
->si_ptrs
.test
->post_codel
);
331 dev_info(cd
->dev
, "%s: SCANNING is %s codel=%02X\n",
332 __func__
, si
->si_ptrs
.test
->post_codel
& 0x08 ?
333 "ENABLED" : "DISABLED",
334 si
->si_ptrs
.test
->post_codel
);
338 static int cyttsp4_si_get_pcfg_data(struct cyttsp4
*cd
)
340 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
344 if (si
->si_ofs
.opcfg_ofs
<= si
->si_ofs
.pcfg_ofs
) {
346 "%s: invalid offset opcfg_ofs: %zu, pcfg_ofs: %zu\n",
347 __func__
, si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.pcfg_ofs
);
351 si
->si_ofs
.pcfg_size
= si
->si_ofs
.opcfg_ofs
- si
->si_ofs
.pcfg_ofs
;
353 p
= krealloc(si
->si_ptrs
.pcfg
, si
->si_ofs
.pcfg_size
, GFP_KERNEL
);
355 dev_err(cd
->dev
, "%s: failed to allocate pcfg memory\n",
359 si
->si_ptrs
.pcfg
= p
;
361 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.pcfg_size
,
364 dev_err(cd
->dev
, "%s: fail read pcfg data r=%d\n",
369 si
->si_ofs
.max_x
= merge_bytes((si
->si_ptrs
.pcfg
->res_xh
370 & CY_PCFG_RESOLUTION_X_MASK
), si
->si_ptrs
.pcfg
->res_xl
);
371 si
->si_ofs
.x_origin
= !!(si
->si_ptrs
.pcfg
->res_xh
372 & CY_PCFG_ORIGIN_X_MASK
);
373 si
->si_ofs
.max_y
= merge_bytes((si
->si_ptrs
.pcfg
->res_yh
374 & CY_PCFG_RESOLUTION_Y_MASK
), si
->si_ptrs
.pcfg
->res_yl
);
375 si
->si_ofs
.y_origin
= !!(si
->si_ptrs
.pcfg
->res_yh
376 & CY_PCFG_ORIGIN_Y_MASK
);
377 si
->si_ofs
.max_p
= merge_bytes(si
->si_ptrs
.pcfg
->max_zh
,
378 si
->si_ptrs
.pcfg
->max_zl
);
380 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
381 (u8
*)si
->si_ptrs
.pcfg
,
382 si
->si_ofs
.pcfg_size
, "sysinfo_pcfg_data");
386 static int cyttsp4_si_get_opcfg_data(struct cyttsp4
*cd
)
388 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
389 struct cyttsp4_tch_abs_params
*tch
;
390 struct cyttsp4_tch_rec_params
*tch_old
, *tch_new
;
391 enum cyttsp4_tch_abs abs
;
396 if (si
->si_ofs
.ddata_ofs
<= si
->si_ofs
.opcfg_ofs
) {
398 "%s: invalid offset ddata_ofs: %zu, opcfg_ofs: %zu\n",
399 __func__
, si
->si_ofs
.ddata_ofs
, si
->si_ofs
.opcfg_ofs
);
403 si
->si_ofs
.opcfg_size
= si
->si_ofs
.ddata_ofs
- si
->si_ofs
.opcfg_ofs
;
405 p
= krealloc(si
->si_ptrs
.opcfg
, si
->si_ofs
.opcfg_size
, GFP_KERNEL
);
407 dev_err(cd
->dev
, "%s: failed to allocate opcfg memory\n",
411 si
->si_ptrs
.opcfg
= p
;
413 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.opcfg_size
,
416 dev_err(cd
->dev
, "%s: fail read opcfg data r=%d\n",
420 si
->si_ofs
.cmd_ofs
= si
->si_ptrs
.opcfg
->cmd_ofs
;
421 si
->si_ofs
.rep_ofs
= si
->si_ptrs
.opcfg
->rep_ofs
;
422 si
->si_ofs
.rep_sz
= (si
->si_ptrs
.opcfg
->rep_szh
* 256) +
423 si
->si_ptrs
.opcfg
->rep_szl
;
424 si
->si_ofs
.num_btns
= si
->si_ptrs
.opcfg
->num_btns
;
425 si
->si_ofs
.num_btn_regs
= (si
->si_ofs
.num_btns
+
426 CY_NUM_BTN_PER_REG
- 1) / CY_NUM_BTN_PER_REG
;
427 si
->si_ofs
.tt_stat_ofs
= si
->si_ptrs
.opcfg
->tt_stat_ofs
;
428 si
->si_ofs
.obj_cfg0
= si
->si_ptrs
.opcfg
->obj_cfg0
;
429 si
->si_ofs
.max_tchs
= si
->si_ptrs
.opcfg
->max_tchs
&
431 si
->si_ofs
.tch_rec_size
= si
->si_ptrs
.opcfg
->tch_rec_size
&
434 /* Get the old touch fields */
435 for (abs
= CY_TCH_X
; abs
< CY_NUM_TCH_FIELDS
; abs
++) {
436 tch
= &si
->si_ofs
.tch_abs
[abs
];
437 tch_old
= &si
->si_ptrs
.opcfg
->tch_rec_old
[abs
];
439 tch
->ofs
= tch_old
->loc
& CY_BYTE_OFS_MASK
;
440 tch
->size
= cyttsp4_bits_2_bytes(tch_old
->size
,
442 tch
->bofs
= (tch_old
->loc
& CY_BOFS_MASK
) >> CY_BOFS_SHIFT
;
446 si
->si_ofs
.btn_rec_size
= si
->si_ptrs
.opcfg
->btn_rec_size
;
447 si
->si_ofs
.btn_diff_ofs
= si
->si_ptrs
.opcfg
->btn_diff_ofs
;
448 si
->si_ofs
.btn_diff_size
= si
->si_ptrs
.opcfg
->btn_diff_size
;
450 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
) {
451 /* Get the extended touch fields */
452 for (i
= 0; i
< CY_NUM_EXT_TCH_FIELDS
; abs
++, i
++) {
453 tch
= &si
->si_ofs
.tch_abs
[abs
];
454 tch_new
= &si
->si_ptrs
.opcfg
->tch_rec_new
[i
];
456 tch
->ofs
= tch_new
->loc
& CY_BYTE_OFS_MASK
;
457 tch
->size
= cyttsp4_bits_2_bytes(tch_new
->size
,
459 tch
->bofs
= (tch_new
->loc
& CY_BOFS_MASK
) >> CY_BOFS_SHIFT
;
463 for (abs
= 0; abs
< CY_TCH_NUM_ABS
; abs
++) {
464 dev_dbg(cd
->dev
, "%s: tch_rec_%s\n", __func__
,
465 cyttsp4_tch_abs_string
[abs
]);
466 dev_dbg(cd
->dev
, "%s: ofs =%2zd\n", __func__
,
467 si
->si_ofs
.tch_abs
[abs
].ofs
);
468 dev_dbg(cd
->dev
, "%s: siz =%2zd\n", __func__
,
469 si
->si_ofs
.tch_abs
[abs
].size
);
470 dev_dbg(cd
->dev
, "%s: max =%2zd\n", __func__
,
471 si
->si_ofs
.tch_abs
[abs
].max
);
472 dev_dbg(cd
->dev
, "%s: bofs=%2zd\n", __func__
,
473 si
->si_ofs
.tch_abs
[abs
].bofs
);
476 si
->si_ofs
.mode_size
= si
->si_ofs
.tt_stat_ofs
+ 1;
477 si
->si_ofs
.data_size
= si
->si_ofs
.max_tchs
*
478 si
->si_ptrs
.opcfg
->tch_rec_size
;
480 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)si
->si_ptrs
.opcfg
,
481 si
->si_ofs
.opcfg_size
, "sysinfo_opcfg_data");
486 static int cyttsp4_si_get_ddata(struct cyttsp4
*cd
)
488 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
492 si
->si_ofs
.ddata_size
= si
->si_ofs
.mdata_ofs
- si
->si_ofs
.ddata_ofs
;
494 p
= krealloc(si
->si_ptrs
.ddata
, si
->si_ofs
.ddata_size
, GFP_KERNEL
);
496 dev_err(cd
->dev
, "%s: fail alloc ddata memory\n", __func__
);
499 si
->si_ptrs
.ddata
= p
;
501 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.ddata_ofs
, si
->si_ofs
.ddata_size
,
504 dev_err(cd
->dev
, "%s: fail read ddata data r=%d\n",
507 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
508 (u8
*)si
->si_ptrs
.ddata
,
509 si
->si_ofs
.ddata_size
, "sysinfo_ddata");
513 static int cyttsp4_si_get_mdata(struct cyttsp4
*cd
)
515 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
519 si
->si_ofs
.mdata_size
= si
->si_ofs
.map_sz
- si
->si_ofs
.mdata_ofs
;
521 p
= krealloc(si
->si_ptrs
.mdata
, si
->si_ofs
.mdata_size
, GFP_KERNEL
);
523 dev_err(cd
->dev
, "%s: fail alloc mdata memory\n", __func__
);
526 si
->si_ptrs
.mdata
= p
;
528 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.mdata_ofs
, si
->si_ofs
.mdata_size
,
531 dev_err(cd
->dev
, "%s: fail read mdata data r=%d\n",
534 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
535 (u8
*)si
->si_ptrs
.mdata
,
536 si
->si_ofs
.mdata_size
, "sysinfo_mdata");
540 static int cyttsp4_si_get_btn_data(struct cyttsp4
*cd
)
542 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
544 int num_defined_keys
;
549 if (si
->si_ofs
.num_btns
) {
550 si
->si_ofs
.btn_keys_size
= si
->si_ofs
.num_btns
*
551 sizeof(struct cyttsp4_btn
);
553 p
= krealloc(si
->btn
, si
->si_ofs
.btn_keys_size
,
554 GFP_KERNEL
|__GFP_ZERO
);
556 dev_err(cd
->dev
, "%s: %s\n", __func__
,
557 "fail alloc btn_keys memory");
562 if (cd
->cpdata
->sett
[CY_IC_GRPNUM_BTN_KEYS
] == NULL
)
563 num_defined_keys
= 0;
564 else if (cd
->cpdata
->sett
[CY_IC_GRPNUM_BTN_KEYS
]->data
== NULL
)
565 num_defined_keys
= 0;
567 num_defined_keys
= cd
->cpdata
->sett
568 [CY_IC_GRPNUM_BTN_KEYS
]->size
;
570 for (btn
= 0; btn
< si
->si_ofs
.num_btns
&&
571 btn
< num_defined_keys
; btn
++) {
572 key_table
= (u16
*)cd
->cpdata
->sett
573 [CY_IC_GRPNUM_BTN_KEYS
]->data
;
574 si
->btn
[btn
].key_code
= key_table
[btn
];
575 si
->btn
[btn
].state
= CY_BTN_RELEASED
;
576 si
->btn
[btn
].enabled
= true;
578 for (; btn
< si
->si_ofs
.num_btns
; btn
++) {
579 si
->btn
[btn
].key_code
= KEY_RESERVED
;
580 si
->btn
[btn
].state
= CY_BTN_RELEASED
;
581 si
->btn
[btn
].enabled
= true;
587 si
->si_ofs
.btn_keys_size
= 0;
593 static int cyttsp4_si_get_op_data_ptrs(struct cyttsp4
*cd
)
595 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
598 p
= krealloc(si
->xy_mode
, si
->si_ofs
.mode_size
, GFP_KERNEL
|__GFP_ZERO
);
603 p
= krealloc(si
->xy_data
, si
->si_ofs
.data_size
, GFP_KERNEL
|__GFP_ZERO
);
608 p
= krealloc(si
->btn_rec_data
,
609 si
->si_ofs
.btn_rec_size
* si
->si_ofs
.num_btns
,
610 GFP_KERNEL
|__GFP_ZERO
);
613 si
->btn_rec_data
= p
;
618 static void cyttsp4_si_put_log_data(struct cyttsp4
*cd
)
620 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
621 dev_dbg(cd
->dev
, "%s: cydata_ofs =%4zd siz=%4zd\n", __func__
,
622 si
->si_ofs
.cydata_ofs
, si
->si_ofs
.cydata_size
);
623 dev_dbg(cd
->dev
, "%s: test_ofs =%4zd siz=%4zd\n", __func__
,
624 si
->si_ofs
.test_ofs
, si
->si_ofs
.test_size
);
625 dev_dbg(cd
->dev
, "%s: pcfg_ofs =%4zd siz=%4zd\n", __func__
,
626 si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.pcfg_size
);
627 dev_dbg(cd
->dev
, "%s: opcfg_ofs =%4zd siz=%4zd\n", __func__
,
628 si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.opcfg_size
);
629 dev_dbg(cd
->dev
, "%s: ddata_ofs =%4zd siz=%4zd\n", __func__
,
630 si
->si_ofs
.ddata_ofs
, si
->si_ofs
.ddata_size
);
631 dev_dbg(cd
->dev
, "%s: mdata_ofs =%4zd siz=%4zd\n", __func__
,
632 si
->si_ofs
.mdata_ofs
, si
->si_ofs
.mdata_size
);
634 dev_dbg(cd
->dev
, "%s: cmd_ofs =%4zd\n", __func__
,
636 dev_dbg(cd
->dev
, "%s: rep_ofs =%4zd\n", __func__
,
638 dev_dbg(cd
->dev
, "%s: rep_sz =%4zd\n", __func__
,
640 dev_dbg(cd
->dev
, "%s: num_btns =%4zd\n", __func__
,
641 si
->si_ofs
.num_btns
);
642 dev_dbg(cd
->dev
, "%s: num_btn_regs =%4zd\n", __func__
,
643 si
->si_ofs
.num_btn_regs
);
644 dev_dbg(cd
->dev
, "%s: tt_stat_ofs =%4zd\n", __func__
,
645 si
->si_ofs
.tt_stat_ofs
);
646 dev_dbg(cd
->dev
, "%s: tch_rec_size =%4zd\n", __func__
,
647 si
->si_ofs
.tch_rec_size
);
648 dev_dbg(cd
->dev
, "%s: max_tchs =%4zd\n", __func__
,
649 si
->si_ofs
.max_tchs
);
650 dev_dbg(cd
->dev
, "%s: mode_size =%4zd\n", __func__
,
651 si
->si_ofs
.mode_size
);
652 dev_dbg(cd
->dev
, "%s: data_size =%4zd\n", __func__
,
653 si
->si_ofs
.data_size
);
654 dev_dbg(cd
->dev
, "%s: map_sz =%4zd\n", __func__
,
657 dev_dbg(cd
->dev
, "%s: btn_rec_size =%2zd\n", __func__
,
658 si
->si_ofs
.btn_rec_size
);
659 dev_dbg(cd
->dev
, "%s: btn_diff_ofs =%2zd\n", __func__
,
660 si
->si_ofs
.btn_diff_ofs
);
661 dev_dbg(cd
->dev
, "%s: btn_diff_size =%2zd\n", __func__
,
662 si
->si_ofs
.btn_diff_size
);
664 dev_dbg(cd
->dev
, "%s: max_x = 0x%04zX (%zd)\n", __func__
,
665 si
->si_ofs
.max_x
, si
->si_ofs
.max_x
);
666 dev_dbg(cd
->dev
, "%s: x_origin = %zd (%s)\n", __func__
,
668 si
->si_ofs
.x_origin
== CY_NORMAL_ORIGIN
?
669 "left corner" : "right corner");
670 dev_dbg(cd
->dev
, "%s: max_y = 0x%04zX (%zd)\n", __func__
,
671 si
->si_ofs
.max_y
, si
->si_ofs
.max_y
);
672 dev_dbg(cd
->dev
, "%s: y_origin = %zd (%s)\n", __func__
,
674 si
->si_ofs
.y_origin
== CY_NORMAL_ORIGIN
?
675 "upper corner" : "lower corner");
676 dev_dbg(cd
->dev
, "%s: max_p = 0x%04zX (%zd)\n", __func__
,
677 si
->si_ofs
.max_p
, si
->si_ofs
.max_p
);
679 dev_dbg(cd
->dev
, "%s: xy_mode=%p xy_data=%p\n", __func__
,
680 si
->xy_mode
, si
->xy_data
);
683 static int cyttsp4_get_sysinfo_regs(struct cyttsp4
*cd
)
685 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
688 rc
= cyttsp4_si_data_offsets(cd
);
692 rc
= cyttsp4_si_get_cydata(cd
);
696 rc
= cyttsp4_si_get_test_data(cd
);
700 rc
= cyttsp4_si_get_pcfg_data(cd
);
704 rc
= cyttsp4_si_get_opcfg_data(cd
);
708 rc
= cyttsp4_si_get_ddata(cd
);
712 rc
= cyttsp4_si_get_mdata(cd
);
716 rc
= cyttsp4_si_get_btn_data(cd
);
720 rc
= cyttsp4_si_get_op_data_ptrs(cd
);
722 dev_err(cd
->dev
, "%s: failed to get_op_data\n",
727 cyttsp4_si_put_log_data(cd
);
729 /* provide flow control handshake */
730 rc
= cyttsp4_handshake(cd
, si
->si_data
.hst_mode
);
732 dev_err(cd
->dev
, "%s: handshake fail on sysinfo reg\n",
739 static void cyttsp4_queue_startup_(struct cyttsp4
*cd
)
741 if (cd
->startup_state
== STARTUP_NONE
) {
742 cd
->startup_state
= STARTUP_QUEUED
;
743 schedule_work(&cd
->startup_work
);
744 dev_dbg(cd
->dev
, "%s: cyttsp4_startup queued\n", __func__
);
746 dev_dbg(cd
->dev
, "%s: startup_state = %d\n", __func__
,
751 static void cyttsp4_report_slot_liftoff(struct cyttsp4_mt_data
*md
,
756 if (md
->num_prv_tch
== 0)
759 for (t
= 0; t
< max_slots
; t
++) {
760 input_mt_slot(md
->input
, t
);
761 input_mt_report_slot_inactive(md
->input
);
765 static void cyttsp4_lift_all(struct cyttsp4_mt_data
*md
)
770 if (md
->num_prv_tch
!= 0) {
771 cyttsp4_report_slot_liftoff(md
,
772 md
->si
->si_ofs
.tch_abs
[CY_TCH_T
].max
);
773 input_sync(md
->input
);
778 static void cyttsp4_get_touch_axis(struct cyttsp4_mt_data
*md
,
779 int *axis
, int size
, int max
, u8
*xy_data
, int bofs
)
784 for (nbyte
= 0, *axis
= 0, next
= 0; nbyte
< size
; nbyte
++) {
785 dev_vdbg(&md
->input
->dev
,
786 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p"
787 " xy_data[%d]=%02X(%d) bofs=%d\n",
788 __func__
, *axis
, *axis
, size
, max
, xy_data
, next
,
789 xy_data
[next
], xy_data
[next
], bofs
);
790 *axis
= (*axis
* 256) + (xy_data
[next
] >> bofs
);
796 dev_vdbg(&md
->input
->dev
,
797 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p"
798 " xy_data[%d]=%02X(%d)\n",
799 __func__
, *axis
, *axis
, size
, max
, xy_data
, next
,
800 xy_data
[next
], xy_data
[next
]);
803 static void cyttsp4_get_touch(struct cyttsp4_mt_data
*md
,
804 struct cyttsp4_touch
*touch
, u8
*xy_data
)
806 struct device
*dev
= &md
->input
->dev
;
807 struct cyttsp4_sysinfo
*si
= md
->si
;
808 enum cyttsp4_tch_abs abs
;
811 for (abs
= CY_TCH_X
; abs
< CY_TCH_NUM_ABS
; abs
++) {
812 cyttsp4_get_touch_axis(md
, &touch
->abs
[abs
],
813 si
->si_ofs
.tch_abs
[abs
].size
,
814 si
->si_ofs
.tch_abs
[abs
].max
,
815 xy_data
+ si
->si_ofs
.tch_abs
[abs
].ofs
,
816 si
->si_ofs
.tch_abs
[abs
].bofs
);
817 dev_vdbg(dev
, "%s: get %s=%04X(%d)\n", __func__
,
818 cyttsp4_tch_abs_string
[abs
],
819 touch
->abs
[abs
], touch
->abs
[abs
]);
822 if (md
->pdata
->flags
& CY_FLAG_FLIP
) {
823 swap(touch
->abs
[CY_TCH_X
], touch
->abs
[CY_TCH_Y
]);
828 if (md
->pdata
->flags
& CY_FLAG_INV_X
) {
830 touch
->abs
[CY_TCH_X
] = md
->si
->si_ofs
.max_y
-
831 touch
->abs
[CY_TCH_X
];
833 touch
->abs
[CY_TCH_X
] = md
->si
->si_ofs
.max_x
-
834 touch
->abs
[CY_TCH_X
];
836 if (md
->pdata
->flags
& CY_FLAG_INV_Y
) {
838 touch
->abs
[CY_TCH_Y
] = md
->si
->si_ofs
.max_x
-
839 touch
->abs
[CY_TCH_Y
];
841 touch
->abs
[CY_TCH_Y
] = md
->si
->si_ofs
.max_y
-
842 touch
->abs
[CY_TCH_Y
];
845 dev_vdbg(dev
, "%s: flip=%s inv-x=%s inv-y=%s x=%04X(%d) y=%04X(%d)\n",
846 __func__
, flipped
? "true" : "false",
847 md
->pdata
->flags
& CY_FLAG_INV_X
? "true" : "false",
848 md
->pdata
->flags
& CY_FLAG_INV_Y
? "true" : "false",
849 touch
->abs
[CY_TCH_X
], touch
->abs
[CY_TCH_X
],
850 touch
->abs
[CY_TCH_Y
], touch
->abs
[CY_TCH_Y
]);
853 static void cyttsp4_final_sync(struct input_dev
*input
, int max_slots
, int *ids
)
857 for (t
= 0; t
< max_slots
; t
++) {
860 input_mt_slot(input
, t
);
861 input_mt_report_slot_inactive(input
);
867 static void cyttsp4_get_mt_touches(struct cyttsp4_mt_data
*md
, int num_cur_tch
)
869 struct device
*dev
= &md
->input
->dev
;
870 struct cyttsp4_sysinfo
*si
= md
->si
;
871 struct cyttsp4_touch tch
;
874 int ids
[max(CY_TMA1036_MAX_TCH
, CY_TMA4XX_MAX_TCH
)];
876 memset(ids
, 0, si
->si_ofs
.tch_abs
[CY_TCH_T
].max
* sizeof(int));
877 for (i
= 0; i
< num_cur_tch
; i
++) {
878 cyttsp4_get_touch(md
, &tch
, si
->xy_data
+
879 (i
* si
->si_ofs
.tch_rec_size
));
880 if ((tch
.abs
[CY_TCH_T
] < md
->pdata
->frmwrk
->abs
881 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MIN_OST
]) ||
882 (tch
.abs
[CY_TCH_T
] > md
->pdata
->frmwrk
->abs
883 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MAX_OST
])) {
884 dev_err(dev
, "%s: tch=%d -> bad trk_id=%d max_id=%d\n",
885 __func__
, i
, tch
.abs
[CY_TCH_T
],
886 md
->pdata
->frmwrk
->abs
[(CY_ABS_ID_OST
*
887 CY_NUM_ABS_SET
) + CY_MAX_OST
]);
891 /* use 0 based track id's */
892 sig
= md
->pdata
->frmwrk
->abs
893 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + 0];
894 if (sig
!= CY_IGNORE_VALUE
) {
895 t
= tch
.abs
[CY_TCH_T
] - md
->pdata
->frmwrk
->abs
896 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MIN_OST
];
897 if (tch
.abs
[CY_TCH_E
] == CY_EV_LIFTOFF
) {
898 dev_dbg(dev
, "%s: t=%d e=%d lift-off\n",
899 __func__
, t
, tch
.abs
[CY_TCH_E
]);
900 goto cyttsp4_get_mt_touches_pr_tch
;
902 input_mt_slot(md
->input
, t
);
903 input_mt_report_slot_state(md
->input
, MT_TOOL_FINGER
,
908 /* all devices: position and pressure fields */
909 for (j
= 0; j
<= CY_ABS_W_OST
; j
++) {
910 sig
= md
->pdata
->frmwrk
->abs
[((CY_ABS_X_OST
+ j
) *
911 CY_NUM_ABS_SET
) + 0];
912 if (sig
!= CY_IGNORE_VALUE
)
913 input_report_abs(md
->input
, sig
,
914 tch
.abs
[CY_TCH_X
+ j
]);
916 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
) {
918 * TMA400 size and orientation fields:
919 * if pressure is non-zero and major touch
920 * signal is zero, then set major and minor touch
921 * signals to minimum non-zero value
923 if (tch
.abs
[CY_TCH_P
] > 0 && tch
.abs
[CY_TCH_MAJ
] == 0)
924 tch
.abs
[CY_TCH_MAJ
] = tch
.abs
[CY_TCH_MIN
] = 1;
926 /* Get the extended touch fields */
927 for (j
= 0; j
< CY_NUM_EXT_TCH_FIELDS
; j
++) {
928 sig
= md
->pdata
->frmwrk
->abs
929 [((CY_ABS_MAJ_OST
+ j
) *
930 CY_NUM_ABS_SET
) + 0];
931 if (sig
!= CY_IGNORE_VALUE
)
932 input_report_abs(md
->input
, sig
,
933 tch
.abs
[CY_TCH_MAJ
+ j
]);
937 cyttsp4_get_mt_touches_pr_tch
:
938 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
)
940 "%s: t=%d x=%d y=%d z=%d M=%d m=%d o=%d e=%d\n",
951 "%s: t=%d x=%d y=%d z=%d e=%d\n", __func__
,
959 cyttsp4_final_sync(md
->input
, si
->si_ofs
.tch_abs
[CY_TCH_T
].max
, ids
);
961 md
->num_prv_tch
= num_cur_tch
;
966 /* read xy_data for all current touches */
967 static int cyttsp4_xy_worker(struct cyttsp4
*cd
)
969 struct cyttsp4_mt_data
*md
= &cd
->md
;
970 struct device
*dev
= &md
->input
->dev
;
971 struct cyttsp4_sysinfo
*si
= md
->si
;
980 * Get event data from cyttsp4 device.
981 * The event data includes all data
982 * for all active touches.
983 * Event data also includes button data
987 * 1st read to get mode + button bytes + touch count (core)
988 * 2nd read (optional) to get touch 1 - touch n data
990 hst_mode
= si
->xy_mode
[CY_REG_BASE
];
991 rep_len
= si
->xy_mode
[si
->si_ofs
.rep_ofs
];
992 rep_stat
= si
->xy_mode
[si
->si_ofs
.rep_ofs
+ 1];
993 tt_stat
= si
->xy_mode
[si
->si_ofs
.tt_stat_ofs
];
994 dev_vdbg(dev
, "%s: %s%02X %s%d %s%02X %s%02X\n", __func__
,
995 "hst_mode=", hst_mode
, "rep_len=", rep_len
,
996 "rep_stat=", rep_stat
, "tt_stat=", tt_stat
);
998 num_cur_tch
= GET_NUM_TOUCHES(tt_stat
);
999 dev_vdbg(dev
, "%s: num_cur_tch=%d\n", __func__
, num_cur_tch
);
1001 if (rep_len
== 0 && num_cur_tch
> 0) {
1002 dev_err(dev
, "%s: report length error rep_len=%d num_tch=%d\n",
1003 __func__
, rep_len
, num_cur_tch
);
1004 goto cyttsp4_xy_worker_exit
;
1008 if (num_cur_tch
> 0) {
1009 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.tt_stat_ofs
+ 1,
1010 num_cur_tch
* si
->si_ofs
.tch_rec_size
,
1013 dev_err(dev
, "%s: read fail on touch regs r=%d\n",
1015 goto cyttsp4_xy_worker_exit
;
1020 cyttsp4_pr_buf(dev
, cd
->pr_buf
, si
->xy_data
, num_cur_tch
*
1021 si
->si_ofs
.tch_rec_size
, "xy_data");
1023 /* check any error conditions */
1024 if (IS_BAD_PKT(rep_stat
)) {
1025 dev_dbg(dev
, "%s: Invalid buffer detected\n", __func__
);
1027 goto cyttsp4_xy_worker_exit
;
1030 if (IS_LARGE_AREA(tt_stat
))
1031 dev_dbg(dev
, "%s: Large area detected\n", __func__
);
1033 if (num_cur_tch
> si
->si_ofs
.max_tchs
) {
1034 dev_err(dev
, "%s: too many tch; set to max tch (n=%d c=%zd)\n",
1035 __func__
, num_cur_tch
, si
->si_ofs
.max_tchs
);
1036 num_cur_tch
= si
->si_ofs
.max_tchs
;
1039 /* extract xy_data for all currently reported touches */
1040 dev_vdbg(dev
, "%s: extract data num_cur_tch=%d\n", __func__
,
1043 cyttsp4_get_mt_touches(md
, num_cur_tch
);
1045 cyttsp4_lift_all(md
);
1049 cyttsp4_xy_worker_exit
:
1053 static int cyttsp4_mt_attention(struct cyttsp4
*cd
)
1055 struct device
*dev
= cd
->dev
;
1056 struct cyttsp4_mt_data
*md
= &cd
->md
;
1062 mutex_lock(&md
->report_lock
);
1063 if (!md
->is_suspended
) {
1064 /* core handles handshake */
1065 rc
= cyttsp4_xy_worker(cd
);
1067 dev_vdbg(dev
, "%s: Ignoring report while suspended\n",
1070 mutex_unlock(&md
->report_lock
);
1072 dev_err(dev
, "%s: xy_worker error r=%d\n", __func__
, rc
);
1077 static irqreturn_t
cyttsp4_irq(int irq
, void *handle
)
1079 struct cyttsp4
*cd
= handle
;
1080 struct device
*dev
= cd
->dev
;
1081 enum cyttsp4_mode cur_mode
;
1082 u8 cmd_ofs
= cd
->sysinfo
.si_ofs
.cmd_ofs
;
1087 * Check whether this IRQ should be ignored (external)
1088 * This should be the very first thing to check since
1089 * ignore_irq may be set for a very short period of time
1091 if (atomic_read(&cd
->ignore_irq
)) {
1092 dev_vdbg(dev
, "%s: Ignoring IRQ\n", __func__
);
1096 dev_dbg(dev
, "%s int:0x%x\n", __func__
, cd
->int_status
);
1098 mutex_lock(&cd
->system_lock
);
1101 if (cd
->sleep_state
== SS_SLEEP_ON
|| cd
->sleep_state
== SS_SLEEPING
)
1102 dev_vdbg(dev
, "%s: Received IRQ while in sleep\n", __func__
);
1104 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), mode
);
1106 dev_err(cd
->dev
, "%s: Fail read adapter r=%d\n", __func__
, rc
);
1107 goto cyttsp4_irq_exit
;
1109 dev_vdbg(dev
, "%s mode[0-2]:0x%X 0x%X 0x%X\n", __func__
,
1110 mode
[0], mode
[1], mode
[2]);
1112 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1113 cur_mode
= CY_MODE_BOOTLOADER
;
1114 dev_vdbg(dev
, "%s: bl running\n", __func__
);
1115 if (cd
->mode
== CY_MODE_BOOTLOADER
) {
1116 /* Signal bootloader heartbeat heard */
1117 wake_up(&cd
->wait_q
);
1118 goto cyttsp4_irq_exit
;
1121 /* switch to bootloader */
1122 dev_dbg(dev
, "%s: restart switch to bl m=%d -> m=%d\n",
1123 __func__
, cd
->mode
, cur_mode
);
1125 /* catch operation->bl glitch */
1126 if (cd
->mode
!= CY_MODE_UNKNOWN
) {
1127 /* Incase startup_state do not let startup_() */
1128 cd
->mode
= CY_MODE_UNKNOWN
;
1129 cyttsp4_queue_startup_(cd
);
1130 goto cyttsp4_irq_exit
;
1134 * do not wake thread on this switch since
1135 * it is possible to get an early heartbeat
1136 * prior to performing the reset
1138 cd
->mode
= cur_mode
;
1140 goto cyttsp4_irq_exit
;
1143 switch (mode
[0] & CY_HST_MODE
) {
1144 case CY_HST_OPERATE
:
1145 cur_mode
= CY_MODE_OPERATIONAL
;
1146 dev_vdbg(dev
, "%s: operational\n", __func__
);
1149 cur_mode
= CY_MODE_CAT
;
1150 dev_vdbg(dev
, "%s: CaT\n", __func__
);
1152 case CY_HST_SYSINFO
:
1153 cur_mode
= CY_MODE_SYSINFO
;
1154 dev_vdbg(dev
, "%s: sysinfo\n", __func__
);
1157 cur_mode
= CY_MODE_UNKNOWN
;
1158 dev_err(dev
, "%s: unknown HST mode 0x%02X\n", __func__
,
1163 /* Check whether this IRQ should be ignored (internal) */
1164 if (cd
->int_status
& CY_INT_IGNORE
) {
1165 dev_vdbg(dev
, "%s: Ignoring IRQ\n", __func__
);
1166 goto cyttsp4_irq_exit
;
1169 /* Check for wake up interrupt */
1170 if (cd
->int_status
& CY_INT_AWAKE
) {
1171 cd
->int_status
&= ~CY_INT_AWAKE
;
1172 wake_up(&cd
->wait_q
);
1173 dev_vdbg(dev
, "%s: Received wake up interrupt\n", __func__
);
1174 goto cyttsp4_irq_handshake
;
1177 /* Expecting mode change interrupt */
1178 if ((cd
->int_status
& CY_INT_MODE_CHANGE
)
1179 && (mode
[0] & CY_HST_MODE_CHANGE
) == 0) {
1180 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1181 dev_dbg(dev
, "%s: finish mode switch m=%d -> m=%d\n",
1182 __func__
, cd
->mode
, cur_mode
);
1183 cd
->mode
= cur_mode
;
1184 wake_up(&cd
->wait_q
);
1185 goto cyttsp4_irq_handshake
;
1188 /* compare current core mode to current device mode */
1189 dev_vdbg(dev
, "%s: cd->mode=%d cur_mode=%d\n",
1190 __func__
, cd
->mode
, cur_mode
);
1191 if ((mode
[0] & CY_HST_MODE_CHANGE
) == 0 && cd
->mode
!= cur_mode
) {
1192 /* Unexpected mode change occurred */
1193 dev_err(dev
, "%s %d->%d 0x%x\n", __func__
, cd
->mode
,
1194 cur_mode
, cd
->int_status
);
1195 dev_dbg(dev
, "%s: Unexpected mode change, startup\n",
1197 cyttsp4_queue_startup_(cd
);
1198 goto cyttsp4_irq_exit
;
1201 /* Expecting command complete interrupt */
1202 dev_vdbg(dev
, "%s: command byte:0x%x\n", __func__
, mode
[cmd_ofs
]);
1203 if ((cd
->int_status
& CY_INT_EXEC_CMD
)
1204 && mode
[cmd_ofs
] & CY_CMD_COMPLETE
) {
1205 cd
->int_status
&= ~CY_INT_EXEC_CMD
;
1206 dev_vdbg(dev
, "%s: Received command complete interrupt\n",
1208 wake_up(&cd
->wait_q
);
1210 * It is possible to receive a single interrupt for
1211 * command complete and touch/button status report.
1212 * Continue processing for a possible status report.
1216 /* This should be status report, read status regs */
1217 if (cd
->mode
== CY_MODE_OPERATIONAL
) {
1218 dev_vdbg(dev
, "%s: Read status registers\n", __func__
);
1219 rc
= cyttsp4_load_status_regs(cd
);
1221 dev_err(dev
, "%s: fail read mode regs r=%d\n",
1225 cyttsp4_mt_attention(cd
);
1227 cyttsp4_irq_handshake
:
1228 /* handshake the event */
1229 dev_vdbg(dev
, "%s: Handshake mode=0x%02X r=%d\n",
1230 __func__
, mode
[0], rc
);
1231 rc
= cyttsp4_handshake(cd
, mode
[0]);
1233 dev_err(dev
, "%s: Fail handshake mode=0x%02X r=%d\n",
1234 __func__
, mode
[0], rc
);
1237 * a non-zero udelay period is required for using
1238 * IRQF_TRIGGER_LOW in order to delay until the
1239 * device completes isr deassert
1241 udelay(cd
->cpdata
->level_irq_udelay
);
1244 mutex_unlock(&cd
->system_lock
);
1248 static void cyttsp4_start_wd_timer(struct cyttsp4
*cd
)
1250 if (!CY_WATCHDOG_TIMEOUT
)
1253 mod_timer(&cd
->watchdog_timer
, jiffies
+
1254 msecs_to_jiffies(CY_WATCHDOG_TIMEOUT
));
1257 static void cyttsp4_stop_wd_timer(struct cyttsp4
*cd
)
1259 if (!CY_WATCHDOG_TIMEOUT
)
1263 * Ensure we wait until the watchdog timer
1264 * running on a different CPU finishes
1266 del_timer_sync(&cd
->watchdog_timer
);
1267 cancel_work_sync(&cd
->watchdog_work
);
1268 del_timer_sync(&cd
->watchdog_timer
);
1271 static void cyttsp4_watchdog_timer(struct timer_list
*t
)
1273 struct cyttsp4
*cd
= from_timer(cd
, t
, watchdog_timer
);
1275 dev_vdbg(cd
->dev
, "%s: Watchdog timer triggered\n", __func__
);
1277 schedule_work(&cd
->watchdog_work
);
1282 static int cyttsp4_request_exclusive(struct cyttsp4
*cd
, void *ownptr
,
1285 int t
= msecs_to_jiffies(timeout_ms
);
1286 bool with_timeout
= (timeout_ms
!= 0);
1288 mutex_lock(&cd
->system_lock
);
1289 if (!cd
->exclusive_dev
&& cd
->exclusive_waits
== 0) {
1290 cd
->exclusive_dev
= ownptr
;
1294 cd
->exclusive_waits
++;
1296 mutex_unlock(&cd
->system_lock
);
1298 t
= wait_event_timeout(cd
->wait_q
, !cd
->exclusive_dev
, t
);
1300 dev_err(cd
->dev
, "%s: tmo waiting exclusive access\n",
1302 mutex_lock(&cd
->system_lock
);
1303 cd
->exclusive_waits
--;
1304 mutex_unlock(&cd
->system_lock
);
1308 wait_event(cd
->wait_q
, !cd
->exclusive_dev
);
1310 mutex_lock(&cd
->system_lock
);
1311 if (cd
->exclusive_dev
)
1313 cd
->exclusive_dev
= ownptr
;
1314 cd
->exclusive_waits
--;
1316 mutex_unlock(&cd
->system_lock
);
1322 * returns error if was not owned
1324 static int cyttsp4_release_exclusive(struct cyttsp4
*cd
, void *ownptr
)
1326 mutex_lock(&cd
->system_lock
);
1327 if (cd
->exclusive_dev
!= ownptr
) {
1328 mutex_unlock(&cd
->system_lock
);
1332 dev_vdbg(cd
->dev
, "%s: exclusive_dev %p freed\n",
1333 __func__
, cd
->exclusive_dev
);
1334 cd
->exclusive_dev
= NULL
;
1335 wake_up(&cd
->wait_q
);
1336 mutex_unlock(&cd
->system_lock
);
1340 static int cyttsp4_wait_bl_heartbeat(struct cyttsp4
*cd
)
1345 /* wait heartbeat */
1346 dev_vdbg(cd
->dev
, "%s: wait heartbeat...\n", __func__
);
1347 t
= wait_event_timeout(cd
->wait_q
, cd
->mode
== CY_MODE_BOOTLOADER
,
1348 msecs_to_jiffies(CY_CORE_RESET_AND_WAIT_TIMEOUT
));
1350 dev_err(cd
->dev
, "%s: tmo waiting bl heartbeat cd->mode=%d\n",
1351 __func__
, cd
->mode
);
1358 static int cyttsp4_wait_sysinfo_mode(struct cyttsp4
*cd
)
1362 dev_vdbg(cd
->dev
, "%s: wait sysinfo...\n", __func__
);
1364 t
= wait_event_timeout(cd
->wait_q
, cd
->mode
== CY_MODE_SYSINFO
,
1365 msecs_to_jiffies(CY_CORE_MODE_CHANGE_TIMEOUT
));
1367 dev_err(cd
->dev
, "%s: tmo waiting exit bl cd->mode=%d\n",
1368 __func__
, cd
->mode
);
1369 mutex_lock(&cd
->system_lock
);
1370 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1371 mutex_unlock(&cd
->system_lock
);
1378 static int cyttsp4_reset_and_wait(struct cyttsp4
*cd
)
1382 /* reset hardware */
1383 mutex_lock(&cd
->system_lock
);
1384 dev_dbg(cd
->dev
, "%s: reset hw...\n", __func__
);
1385 rc
= cyttsp4_hw_reset(cd
);
1386 cd
->mode
= CY_MODE_UNKNOWN
;
1387 mutex_unlock(&cd
->system_lock
);
1389 dev_err(cd
->dev
, "%s:Fail hw reset r=%d\n", __func__
, rc
);
1393 return cyttsp4_wait_bl_heartbeat(cd
);
1397 * returns err if refused or timeout; block until mode change complete
1398 * bit is set (mode change interrupt)
1400 static int cyttsp4_set_mode(struct cyttsp4
*cd
, int new_mode
)
1408 case CY_MODE_OPERATIONAL
:
1409 new_dev_mode
= CY_HST_OPERATE
;
1411 case CY_MODE_SYSINFO
:
1412 new_dev_mode
= CY_HST_SYSINFO
;
1415 new_dev_mode
= CY_HST_CAT
;
1418 dev_err(cd
->dev
, "%s: invalid mode: %02X(%d)\n",
1419 __func__
, new_mode
, new_mode
);
1424 dev_dbg(cd
->dev
, "%s: %s=%p new_dev_mode=%02X new_mode=%d\n",
1425 __func__
, "have exclusive", cd
->exclusive_dev
,
1426 new_dev_mode
, new_mode
);
1428 mutex_lock(&cd
->system_lock
);
1429 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1431 mutex_unlock(&cd
->system_lock
);
1432 dev_err(cd
->dev
, "%s: Fail read mode r=%d\n",
1437 /* Clear device mode bits and set to new mode */
1438 mode
&= ~CY_HST_MODE
;
1439 mode
|= new_dev_mode
| CY_HST_MODE_CHANGE
;
1441 cd
->int_status
|= CY_INT_MODE_CHANGE
;
1442 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1443 mutex_unlock(&cd
->system_lock
);
1445 dev_err(cd
->dev
, "%s: Fail write mode change r=%d\n",
1450 /* wait for mode change done interrupt */
1451 t
= wait_event_timeout(cd
->wait_q
,
1452 (cd
->int_status
& CY_INT_MODE_CHANGE
) == 0,
1453 msecs_to_jiffies(CY_CORE_MODE_CHANGE_TIMEOUT
));
1454 dev_dbg(cd
->dev
, "%s: back from wait t=%ld cd->mode=%d\n",
1455 __func__
, t
, cd
->mode
);
1458 dev_err(cd
->dev
, "%s: %s\n", __func__
,
1459 "tmo waiting mode change");
1460 mutex_lock(&cd
->system_lock
);
1461 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1462 mutex_unlock(&cd
->system_lock
);
1470 static void cyttsp4_watchdog_work(struct work_struct
*work
)
1472 struct cyttsp4
*cd
=
1473 container_of(work
, struct cyttsp4
, watchdog_work
);
1477 mutex_lock(&cd
->system_lock
);
1478 retval
= cyttsp4_load_status_regs(cd
);
1481 "%s: failed to access device in watchdog timer r=%d\n",
1483 cyttsp4_queue_startup_(cd
);
1484 goto cyttsp4_timer_watchdog_exit_error
;
1486 mode
= &cd
->sysinfo
.xy_mode
[CY_REG_BASE
];
1487 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1489 "%s: device found in bootloader mode when operational mode\n",
1491 cyttsp4_queue_startup_(cd
);
1492 goto cyttsp4_timer_watchdog_exit_error
;
1495 cyttsp4_start_wd_timer(cd
);
1496 cyttsp4_timer_watchdog_exit_error
:
1497 mutex_unlock(&cd
->system_lock
);
1501 static int cyttsp4_core_sleep_(struct cyttsp4
*cd
)
1503 enum cyttsp4_sleep_state ss
= SS_SLEEP_ON
;
1504 enum cyttsp4_int_state int_status
= CY_INT_IGNORE
;
1508 /* Already in sleep mode? */
1509 mutex_lock(&cd
->system_lock
);
1510 if (cd
->sleep_state
== SS_SLEEP_ON
) {
1511 mutex_unlock(&cd
->system_lock
);
1514 cd
->sleep_state
= SS_SLEEPING
;
1515 mutex_unlock(&cd
->system_lock
);
1517 cyttsp4_stop_wd_timer(cd
);
1519 /* Wait until currently running IRQ handler exits and disable IRQ */
1520 disable_irq(cd
->irq
);
1522 dev_vdbg(cd
->dev
, "%s: write DEEP SLEEP...\n", __func__
);
1523 mutex_lock(&cd
->system_lock
);
1524 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1526 mutex_unlock(&cd
->system_lock
);
1527 dev_err(cd
->dev
, "%s: Fail read adapter r=%d\n", __func__
, rc
);
1531 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1532 mutex_unlock(&cd
->system_lock
);
1533 dev_err(cd
->dev
, "%s: Device in BOOTLOADER mode.\n", __func__
);
1538 mode
[0] |= CY_HST_SLEEP
;
1539 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(mode
[0]), &mode
[0]);
1540 mutex_unlock(&cd
->system_lock
);
1542 dev_err(cd
->dev
, "%s: Fail write adapter r=%d\n", __func__
, rc
);
1545 dev_vdbg(cd
->dev
, "%s: write DEEP SLEEP succeeded\n", __func__
);
1547 if (cd
->cpdata
->power
) {
1548 dev_dbg(cd
->dev
, "%s: Power down HW\n", __func__
);
1549 rc
= cd
->cpdata
->power(cd
->cpdata
, 0, cd
->dev
, &cd
->ignore_irq
);
1551 dev_dbg(cd
->dev
, "%s: No power function\n", __func__
);
1555 dev_err(cd
->dev
, "%s: HW Power down fails r=%d\n",
1560 /* Give time to FW to sleep */
1567 int_status
= CY_INT_NONE
;
1568 cyttsp4_start_wd_timer(cd
);
1571 mutex_lock(&cd
->system_lock
);
1572 cd
->sleep_state
= ss
;
1573 cd
->int_status
|= int_status
;
1574 mutex_unlock(&cd
->system_lock
);
1575 enable_irq(cd
->irq
);
1579 static int cyttsp4_startup_(struct cyttsp4
*cd
)
1581 int retry
= CY_CORE_STARTUP_RETRY_COUNT
;
1584 cyttsp4_stop_wd_timer(cd
);
1587 if (retry
!= CY_CORE_STARTUP_RETRY_COUNT
)
1588 dev_dbg(cd
->dev
, "%s: Retry %d\n", __func__
,
1589 CY_CORE_STARTUP_RETRY_COUNT
- retry
);
1591 /* reset hardware and wait for heartbeat */
1592 rc
= cyttsp4_reset_and_wait(cd
);
1594 dev_err(cd
->dev
, "%s: Error on h/w reset r=%d\n", __func__
, rc
);
1600 /* exit bl into sysinfo mode */
1601 dev_vdbg(cd
->dev
, "%s: write exit ldr...\n", __func__
);
1602 mutex_lock(&cd
->system_lock
);
1603 cd
->int_status
&= ~CY_INT_IGNORE
;
1604 cd
->int_status
|= CY_INT_MODE_CHANGE
;
1606 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(ldr_exit
),
1608 mutex_unlock(&cd
->system_lock
);
1610 dev_err(cd
->dev
, "%s: Fail write r=%d\n", __func__
, rc
);
1616 rc
= cyttsp4_wait_sysinfo_mode(cd
);
1618 u8 buf
[sizeof(ldr_err_app
)];
1621 /* Check for invalid/corrupted touch application */
1622 rc1
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(ldr_err_app
),
1625 dev_err(cd
->dev
, "%s: Fail read r=%d\n", __func__
, rc1
);
1626 } else if (!memcmp(buf
, ldr_err_app
, sizeof(ldr_err_app
))) {
1627 dev_err(cd
->dev
, "%s: Error launching touch application\n",
1629 mutex_lock(&cd
->system_lock
);
1630 cd
->invalid_touch_app
= true;
1631 mutex_unlock(&cd
->system_lock
);
1640 mutex_lock(&cd
->system_lock
);
1641 cd
->invalid_touch_app
= false;
1642 mutex_unlock(&cd
->system_lock
);
1644 /* read sysinfo data */
1645 dev_vdbg(cd
->dev
, "%s: get sysinfo regs..\n", __func__
);
1646 rc
= cyttsp4_get_sysinfo_regs(cd
);
1648 dev_err(cd
->dev
, "%s: failed to get sysinfo regs rc=%d\n",
1655 rc
= cyttsp4_set_mode(cd
, CY_MODE_OPERATIONAL
);
1657 dev_err(cd
->dev
, "%s: failed to set mode to operational rc=%d\n",
1664 cyttsp4_lift_all(&cd
->md
);
1666 /* restore to sleep if was suspended */
1667 mutex_lock(&cd
->system_lock
);
1668 if (cd
->sleep_state
== SS_SLEEP_ON
) {
1669 cd
->sleep_state
= SS_SLEEP_OFF
;
1670 mutex_unlock(&cd
->system_lock
);
1671 cyttsp4_core_sleep_(cd
);
1674 mutex_unlock(&cd
->system_lock
);
1677 cyttsp4_start_wd_timer(cd
);
1682 static int cyttsp4_startup(struct cyttsp4
*cd
)
1686 mutex_lock(&cd
->system_lock
);
1687 cd
->startup_state
= STARTUP_RUNNING
;
1688 mutex_unlock(&cd
->system_lock
);
1690 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1691 CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
1693 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1694 __func__
, cd
->exclusive_dev
, cd
->dev
);
1698 rc
= cyttsp4_startup_(cd
);
1700 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1701 /* Don't return fail code, mode is already changed. */
1702 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1704 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1707 mutex_lock(&cd
->system_lock
);
1708 cd
->startup_state
= STARTUP_NONE
;
1709 mutex_unlock(&cd
->system_lock
);
1711 /* Wake the waiters for end of startup */
1712 wake_up(&cd
->wait_q
);
1717 static void cyttsp4_startup_work_function(struct work_struct
*work
)
1719 struct cyttsp4
*cd
= container_of(work
, struct cyttsp4
, startup_work
);
1722 rc
= cyttsp4_startup(cd
);
1724 dev_err(cd
->dev
, "%s: Fail queued startup r=%d\n",
1728 static void cyttsp4_free_si_ptrs(struct cyttsp4
*cd
)
1730 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
1735 kfree(si
->si_ptrs
.cydata
);
1736 kfree(si
->si_ptrs
.test
);
1737 kfree(si
->si_ptrs
.pcfg
);
1738 kfree(si
->si_ptrs
.opcfg
);
1739 kfree(si
->si_ptrs
.ddata
);
1740 kfree(si
->si_ptrs
.mdata
);
1744 kfree(si
->btn_rec_data
);
1748 static int cyttsp4_core_sleep(struct cyttsp4
*cd
)
1752 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1753 CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT
);
1755 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1756 __func__
, cd
->exclusive_dev
, cd
->dev
);
1760 rc
= cyttsp4_core_sleep_(cd
);
1762 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1763 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1765 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1770 static int cyttsp4_core_wake_(struct cyttsp4
*cd
)
1772 struct device
*dev
= cd
->dev
;
1777 /* Already woken? */
1778 mutex_lock(&cd
->system_lock
);
1779 if (cd
->sleep_state
== SS_SLEEP_OFF
) {
1780 mutex_unlock(&cd
->system_lock
);
1783 cd
->int_status
&= ~CY_INT_IGNORE
;
1784 cd
->int_status
|= CY_INT_AWAKE
;
1785 cd
->sleep_state
= SS_WAKING
;
1787 if (cd
->cpdata
->power
) {
1788 dev_dbg(dev
, "%s: Power up HW\n", __func__
);
1789 rc
= cd
->cpdata
->power(cd
->cpdata
, 1, dev
, &cd
->ignore_irq
);
1791 dev_dbg(dev
, "%s: No power function\n", __func__
);
1795 dev_err(dev
, "%s: HW Power up fails r=%d\n",
1798 /* Initiate a read transaction to wake up */
1799 cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1801 dev_vdbg(cd
->dev
, "%s: HW power up succeeds\n",
1803 mutex_unlock(&cd
->system_lock
);
1805 t
= wait_event_timeout(cd
->wait_q
,
1806 (cd
->int_status
& CY_INT_AWAKE
) == 0,
1807 msecs_to_jiffies(CY_CORE_WAKEUP_TIMEOUT
));
1809 dev_err(dev
, "%s: TMO waiting for wakeup\n", __func__
);
1810 mutex_lock(&cd
->system_lock
);
1811 cd
->int_status
&= ~CY_INT_AWAKE
;
1812 /* Try starting up */
1813 cyttsp4_queue_startup_(cd
);
1814 mutex_unlock(&cd
->system_lock
);
1817 mutex_lock(&cd
->system_lock
);
1818 cd
->sleep_state
= SS_SLEEP_OFF
;
1819 mutex_unlock(&cd
->system_lock
);
1821 cyttsp4_start_wd_timer(cd
);
1826 static int cyttsp4_core_wake(struct cyttsp4
*cd
)
1830 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1831 CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
1833 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1834 __func__
, cd
->exclusive_dev
, cd
->dev
);
1838 rc
= cyttsp4_core_wake_(cd
);
1840 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1841 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1843 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1848 static int cyttsp4_core_suspend(struct device
*dev
)
1850 struct cyttsp4
*cd
= dev_get_drvdata(dev
);
1851 struct cyttsp4_mt_data
*md
= &cd
->md
;
1854 md
->is_suspended
= true;
1856 rc
= cyttsp4_core_sleep(cd
);
1858 dev_err(dev
, "%s: Error on sleep\n", __func__
);
1864 static int cyttsp4_core_resume(struct device
*dev
)
1866 struct cyttsp4
*cd
= dev_get_drvdata(dev
);
1867 struct cyttsp4_mt_data
*md
= &cd
->md
;
1870 md
->is_suspended
= false;
1872 rc
= cyttsp4_core_wake(cd
);
1874 dev_err(dev
, "%s: Error on wake\n", __func__
);
1882 const struct dev_pm_ops cyttsp4_pm_ops
= {
1883 SET_SYSTEM_SLEEP_PM_OPS(cyttsp4_core_suspend
, cyttsp4_core_resume
)
1884 SET_RUNTIME_PM_OPS(cyttsp4_core_suspend
, cyttsp4_core_resume
, NULL
)
1886 EXPORT_SYMBOL_GPL(cyttsp4_pm_ops
);
1888 static int cyttsp4_mt_open(struct input_dev
*input
)
1890 pm_runtime_get(input
->dev
.parent
);
1894 static void cyttsp4_mt_close(struct input_dev
*input
)
1896 struct cyttsp4_mt_data
*md
= input_get_drvdata(input
);
1897 mutex_lock(&md
->report_lock
);
1898 if (!md
->is_suspended
)
1899 pm_runtime_put(input
->dev
.parent
);
1900 mutex_unlock(&md
->report_lock
);
1904 static int cyttsp4_setup_input_device(struct cyttsp4
*cd
)
1906 struct device
*dev
= cd
->dev
;
1907 struct cyttsp4_mt_data
*md
= &cd
->md
;
1908 int signal
= CY_IGNORE_VALUE
;
1909 int max_x
, max_y
, max_p
, min
, max
;
1910 int max_x_tmp
, max_y_tmp
;
1914 dev_vdbg(dev
, "%s: Initialize event signals\n", __func__
);
1915 __set_bit(EV_ABS
, md
->input
->evbit
);
1916 __set_bit(EV_REL
, md
->input
->evbit
);
1917 __set_bit(EV_KEY
, md
->input
->evbit
);
1919 max_x_tmp
= md
->si
->si_ofs
.max_x
;
1920 max_y_tmp
= md
->si
->si_ofs
.max_y
;
1922 /* get maximum values from the sysinfo data */
1923 if (md
->pdata
->flags
& CY_FLAG_FLIP
) {
1924 max_x
= max_y_tmp
- 1;
1925 max_y
= max_x_tmp
- 1;
1927 max_x
= max_x_tmp
- 1;
1928 max_y
= max_y_tmp
- 1;
1930 max_p
= md
->si
->si_ofs
.max_p
;
1932 /* set event signal capabilities */
1933 for (i
= 0; i
< (md
->pdata
->frmwrk
->size
/ CY_NUM_ABS_SET
); i
++) {
1934 signal
= md
->pdata
->frmwrk
->abs
1935 [(i
* CY_NUM_ABS_SET
) + CY_SIGNAL_OST
];
1936 if (signal
!= CY_IGNORE_VALUE
) {
1937 __set_bit(signal
, md
->input
->absbit
);
1938 min
= md
->pdata
->frmwrk
->abs
1939 [(i
* CY_NUM_ABS_SET
) + CY_MIN_OST
];
1940 max
= md
->pdata
->frmwrk
->abs
1941 [(i
* CY_NUM_ABS_SET
) + CY_MAX_OST
];
1942 if (i
== CY_ABS_ID_OST
) {
1943 /* shift track ids down to start at 0 */
1946 } else if (i
== CY_ABS_X_OST
)
1948 else if (i
== CY_ABS_Y_OST
)
1950 else if (i
== CY_ABS_P_OST
)
1952 input_set_abs_params(md
->input
, signal
, min
, max
,
1953 md
->pdata
->frmwrk
->abs
1954 [(i
* CY_NUM_ABS_SET
) + CY_FUZZ_OST
],
1955 md
->pdata
->frmwrk
->abs
1956 [(i
* CY_NUM_ABS_SET
) + CY_FLAT_OST
]);
1957 dev_dbg(dev
, "%s: register signal=%02X min=%d max=%d\n",
1958 __func__
, signal
, min
, max
);
1959 if ((i
== CY_ABS_ID_OST
) &&
1960 (md
->si
->si_ofs
.tch_rec_size
<
1961 CY_TMA4XX_TCH_REC_SIZE
))
1966 input_mt_init_slots(md
->input
, md
->si
->si_ofs
.tch_abs
[CY_TCH_T
].max
,
1968 rc
= input_register_device(md
->input
);
1970 dev_err(dev
, "%s: Error, failed register input device r=%d\n",
1975 static int cyttsp4_mt_probe(struct cyttsp4
*cd
)
1977 struct device
*dev
= cd
->dev
;
1978 struct cyttsp4_mt_data
*md
= &cd
->md
;
1979 struct cyttsp4_mt_platform_data
*pdata
= cd
->pdata
->mt_pdata
;
1982 mutex_init(&md
->report_lock
);
1984 /* Create the input device and register it. */
1985 dev_vdbg(dev
, "%s: Create the input device and register it\n",
1987 md
->input
= input_allocate_device();
1988 if (md
->input
== NULL
) {
1989 dev_err(dev
, "%s: Error, failed to allocate input device\n",
1992 goto error_alloc_failed
;
1995 md
->input
->name
= pdata
->inp_dev_name
;
1996 scnprintf(md
->phys
, sizeof(md
->phys
)-1, "%s", dev_name(dev
));
1997 md
->input
->phys
= md
->phys
;
1998 md
->input
->id
.bustype
= cd
->bus_ops
->bustype
;
1999 md
->input
->dev
.parent
= dev
;
2000 md
->input
->open
= cyttsp4_mt_open
;
2001 md
->input
->close
= cyttsp4_mt_close
;
2002 input_set_drvdata(md
->input
, md
);
2005 md
->si
= &cd
->sysinfo
;
2007 rc
= cyttsp4_setup_input_device(cd
);
2009 goto error_init_input
;
2014 input_free_device(md
->input
);
2016 dev_err(dev
, "%s failed.\n", __func__
);
2020 struct cyttsp4
*cyttsp4_probe(const struct cyttsp4_bus_ops
*ops
,
2021 struct device
*dev
, u16 irq
, size_t xfer_buf_size
)
2024 struct cyttsp4_platform_data
*pdata
= dev_get_platdata(dev
);
2025 unsigned long irq_flags
;
2028 if (!pdata
|| !pdata
->core_pdata
|| !pdata
->mt_pdata
) {
2029 dev_err(dev
, "%s: Missing platform data\n", __func__
);
2031 goto error_no_pdata
;
2034 cd
= kzalloc(sizeof(*cd
), GFP_KERNEL
);
2036 dev_err(dev
, "%s: Error, kzalloc\n", __func__
);
2038 goto error_alloc_data
;
2041 cd
->xfer_buf
= kzalloc(xfer_buf_size
, GFP_KERNEL
);
2042 if (!cd
->xfer_buf
) {
2043 dev_err(dev
, "%s: Error, kzalloc\n", __func__
);
2048 /* Initialize device info */
2051 cd
->cpdata
= pdata
->core_pdata
;
2054 /* Initialize mutexes and spinlocks */
2055 mutex_init(&cd
->system_lock
);
2056 mutex_init(&cd
->adap_lock
);
2058 /* Initialize wait queue */
2059 init_waitqueue_head(&cd
->wait_q
);
2061 /* Initialize works */
2062 INIT_WORK(&cd
->startup_work
, cyttsp4_startup_work_function
);
2063 INIT_WORK(&cd
->watchdog_work
, cyttsp4_watchdog_work
);
2065 /* Initialize IRQ */
2066 cd
->irq
= gpio_to_irq(cd
->cpdata
->irq_gpio
);
2069 goto error_free_xfer
;
2072 dev_set_drvdata(dev
, cd
);
2074 /* Call platform init function */
2075 if (cd
->cpdata
->init
) {
2076 dev_dbg(cd
->dev
, "%s: Init HW\n", __func__
);
2077 rc
= cd
->cpdata
->init(cd
->cpdata
, 1, cd
->dev
);
2079 dev_dbg(cd
->dev
, "%s: No HW INIT function\n", __func__
);
2083 dev_err(cd
->dev
, "%s: HW Init fail r=%d\n", __func__
, rc
);
2085 dev_dbg(dev
, "%s: initialize threaded irq=%d\n", __func__
, cd
->irq
);
2086 if (cd
->cpdata
->level_irq_udelay
> 0)
2087 /* use level triggered interrupts */
2088 irq_flags
= IRQF_TRIGGER_LOW
| IRQF_ONESHOT
;
2090 /* use edge triggered interrupts */
2091 irq_flags
= IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
;
2093 rc
= request_threaded_irq(cd
->irq
, NULL
, cyttsp4_irq
, irq_flags
,
2096 dev_err(dev
, "%s: Error, could not request irq\n", __func__
);
2097 goto error_request_irq
;
2100 /* Setup watchdog timer */
2101 timer_setup(&cd
->watchdog_timer
, cyttsp4_watchdog_timer
, 0);
2104 * call startup directly to ensure that the device
2105 * is tested before leaving the probe
2107 rc
= cyttsp4_startup(cd
);
2109 /* Do not fail probe if startup fails but the device is detected */
2110 if (rc
< 0 && cd
->mode
== CY_MODE_UNKNOWN
) {
2111 dev_err(cd
->dev
, "%s: Fail initial startup r=%d\n",
2116 rc
= cyttsp4_mt_probe(cd
);
2118 dev_err(dev
, "%s: Error, fail mt probe\n", __func__
);
2122 pm_runtime_enable(dev
);
2127 cancel_work_sync(&cd
->startup_work
);
2128 cyttsp4_stop_wd_timer(cd
);
2129 pm_runtime_disable(dev
);
2130 cyttsp4_free_si_ptrs(cd
);
2131 free_irq(cd
->irq
, cd
);
2133 if (cd
->cpdata
->init
)
2134 cd
->cpdata
->init(cd
->cpdata
, 0, dev
);
2136 kfree(cd
->xfer_buf
);
2141 dev_err(dev
, "%s failed.\n", __func__
);
2144 EXPORT_SYMBOL_GPL(cyttsp4_probe
);
2146 static void cyttsp4_mt_release(struct cyttsp4_mt_data
*md
)
2148 input_unregister_device(md
->input
);
2149 input_set_drvdata(md
->input
, NULL
);
2152 int cyttsp4_remove(struct cyttsp4
*cd
)
2154 struct device
*dev
= cd
->dev
;
2156 cyttsp4_mt_release(&cd
->md
);
2159 * Suspend the device before freeing the startup_work and stopping
2160 * the watchdog since sleep function restarts watchdog on failure
2162 pm_runtime_suspend(dev
);
2163 pm_runtime_disable(dev
);
2165 cancel_work_sync(&cd
->startup_work
);
2167 cyttsp4_stop_wd_timer(cd
);
2169 free_irq(cd
->irq
, cd
);
2170 if (cd
->cpdata
->init
)
2171 cd
->cpdata
->init(cd
->cpdata
, 0, dev
);
2172 cyttsp4_free_si_ptrs(cd
);
2176 EXPORT_SYMBOL_GPL(cyttsp4_remove
);
2178 MODULE_LICENSE("GPL");
2179 MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard touchscreen core driver");
2180 MODULE_AUTHOR("Cypress");