3 * Cypress TrueTouch(TM) Standard Product V4 Core driver module.
4 * For use with Cypress Txx4xx parts.
5 * Supported parts include:
9 * Copyright (C) 2012 Cypress Semiconductor
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.
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.
21 * Contact Cypress Semiconductor at www.cypress.com <ttdrivers@cypress.com>
25 #include "cyttsp4_core.h"
26 #include <linux/delay.h>
27 #include <linux/gpio.h>
28 #include <linux/input/mt.h>
29 #include <linux/interrupt.h>
30 #include <linux/pm_runtime.h>
31 #include <linux/sched.h>
32 #include <linux/slab.h>
35 #define CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT 500
36 #define CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT 5000
37 #define CY_CORE_MODE_CHANGE_TIMEOUT 1000
38 #define CY_CORE_RESET_AND_WAIT_TIMEOUT 500
39 #define CY_CORE_WAKEUP_TIMEOUT 500
41 #define CY_CORE_STARTUP_RETRY_COUNT 3
43 static const u8 ldr_exit
[] = {
44 0xFF, 0x01, 0x3B, 0x00, 0x00, 0x4F, 0x6D, 0x17
47 static const u8 ldr_err_app
[] = {
48 0x01, 0x02, 0x00, 0x00, 0x55, 0xDD, 0x17
51 static inline size_t merge_bytes(u8 high
, u8 low
)
53 return (high
<< 8) + low
;
57 static void cyttsp4_pr_buf(struct device
*dev
, u8
*pr_buf
, u8
*dptr
, int size
,
58 const char *data_name
)
61 const char fmt
[] = "%02X ";
67 max
= (CY_MAX_PRBUF_SIZE
- 1) - sizeof(CY_PR_TRUNCATED
);
70 for (i
= k
= 0; i
< size
&& k
< max
; i
++, k
+= 3)
71 scnprintf(pr_buf
+ k
, CY_MAX_PRBUF_SIZE
, fmt
, dptr
[i
]);
73 dev_vdbg(dev
, "%s: %s[0..%d]=%s%s\n", __func__
, data_name
, size
- 1,
74 pr_buf
, size
<= max
? "" : CY_PR_TRUNCATED
);
77 #define cyttsp4_pr_buf(dev, pr_buf, dptr, size, data_name) do { } while (0)
80 static int cyttsp4_load_status_regs(struct cyttsp4
*cd
)
82 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
83 struct device
*dev
= cd
->dev
;
86 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, si
->si_ofs
.mode_size
,
89 dev_err(dev
, "%s: fail read mode regs r=%d\n",
92 cyttsp4_pr_buf(dev
, cd
->pr_buf
, si
->xy_mode
,
93 si
->si_ofs
.mode_size
, "xy_mode");
98 static int cyttsp4_handshake(struct cyttsp4
*cd
, u8 mode
)
100 u8 cmd
= mode
^ CY_HST_TOGGLE
;
104 * Mode change issued, handshaking now will cause endless mode change
105 * requests, for sync mode modechange will do same with handshake
107 if (mode
& CY_HST_MODE_CHANGE
)
110 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(cmd
), &cmd
);
112 dev_err(cd
->dev
, "%s: bus write fail on handshake (ret=%d)\n",
118 static int cyttsp4_hw_soft_reset(struct cyttsp4
*cd
)
120 u8 cmd
= CY_HST_RESET
;
121 int rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(cmd
), &cmd
);
123 dev_err(cd
->dev
, "%s: FAILED to execute SOFT reset\n",
130 static int cyttsp4_hw_hard_reset(struct cyttsp4
*cd
)
132 if (cd
->cpdata
->xres
) {
133 cd
->cpdata
->xres(cd
->cpdata
, cd
->dev
);
134 dev_dbg(cd
->dev
, "%s: execute HARD reset\n", __func__
);
137 dev_err(cd
->dev
, "%s: FAILED to execute HARD reset\n", __func__
);
141 static int cyttsp4_hw_reset(struct cyttsp4
*cd
)
143 int rc
= cyttsp4_hw_hard_reset(cd
);
145 rc
= cyttsp4_hw_soft_reset(cd
);
150 * Gets number of bits for a touch filed as parameter,
151 * sets maximum value for field which is used as bit mask
152 * and returns number of bytes required for that field
154 static int cyttsp4_bits_2_bytes(unsigned int nbits
, size_t *max
)
157 return (nbits
+ 7) / 8;
160 static int cyttsp4_si_data_offsets(struct cyttsp4
*cd
)
162 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
163 int rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(si
->si_data
),
166 dev_err(cd
->dev
, "%s: fail read sysinfo data offsets r=%d\n",
171 /* Print sysinfo data offsets */
172 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)&si
->si_data
,
173 sizeof(si
->si_data
), "sysinfo_data_offsets");
175 /* convert sysinfo data offset bytes into integers */
177 si
->si_ofs
.map_sz
= merge_bytes(si
->si_data
.map_szh
,
178 si
->si_data
.map_szl
);
179 si
->si_ofs
.map_sz
= merge_bytes(si
->si_data
.map_szh
,
180 si
->si_data
.map_szl
);
181 si
->si_ofs
.cydata_ofs
= merge_bytes(si
->si_data
.cydata_ofsh
,
182 si
->si_data
.cydata_ofsl
);
183 si
->si_ofs
.test_ofs
= merge_bytes(si
->si_data
.test_ofsh
,
184 si
->si_data
.test_ofsl
);
185 si
->si_ofs
.pcfg_ofs
= merge_bytes(si
->si_data
.pcfg_ofsh
,
186 si
->si_data
.pcfg_ofsl
);
187 si
->si_ofs
.opcfg_ofs
= merge_bytes(si
->si_data
.opcfg_ofsh
,
188 si
->si_data
.opcfg_ofsl
);
189 si
->si_ofs
.ddata_ofs
= merge_bytes(si
->si_data
.ddata_ofsh
,
190 si
->si_data
.ddata_ofsl
);
191 si
->si_ofs
.mdata_ofs
= merge_bytes(si
->si_data
.mdata_ofsh
,
192 si
->si_data
.mdata_ofsl
);
196 static int cyttsp4_si_get_cydata(struct cyttsp4
*cd
)
198 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
200 int mfgid_sz
, calc_mfgid_sz
;
204 if (si
->si_ofs
.test_ofs
<= si
->si_ofs
.cydata_ofs
) {
206 "%s: invalid offset test_ofs: %zu, cydata_ofs: %zu\n",
207 __func__
, si
->si_ofs
.test_ofs
, si
->si_ofs
.cydata_ofs
);
211 si
->si_ofs
.cydata_size
= si
->si_ofs
.test_ofs
- si
->si_ofs
.cydata_ofs
;
212 dev_dbg(cd
->dev
, "%s: cydata size: %zd\n", __func__
,
213 si
->si_ofs
.cydata_size
);
215 p
= krealloc(si
->si_ptrs
.cydata
, si
->si_ofs
.cydata_size
, GFP_KERNEL
);
217 dev_err(cd
->dev
, "%s: failed to allocate cydata memory\n",
221 si
->si_ptrs
.cydata
= p
;
223 read_offset
= si
->si_ofs
.cydata_ofs
;
225 /* Read the CYDA registers up to MFGID field */
226 rc
= cyttsp4_adap_read(cd
, read_offset
,
227 offsetof(struct cyttsp4_cydata
, mfgid_sz
)
228 + sizeof(si
->si_ptrs
.cydata
->mfgid_sz
),
231 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
236 /* Check MFGID size */
237 mfgid_sz
= si
->si_ptrs
.cydata
->mfgid_sz
;
238 calc_mfgid_sz
= si
->si_ofs
.cydata_size
- sizeof(struct cyttsp4_cydata
);
239 if (mfgid_sz
!= calc_mfgid_sz
) {
240 dev_err(cd
->dev
, "%s: mismatch in MFGID size, reported:%d calculated:%d\n",
241 __func__
, mfgid_sz
, calc_mfgid_sz
);
245 read_offset
+= offsetof(struct cyttsp4_cydata
, mfgid_sz
)
246 + sizeof(si
->si_ptrs
.cydata
->mfgid_sz
);
248 /* Read the CYDA registers for MFGID field */
249 rc
= cyttsp4_adap_read(cd
, read_offset
, si
->si_ptrs
.cydata
->mfgid_sz
,
250 si
->si_ptrs
.cydata
->mfg_id
);
252 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
257 read_offset
+= si
->si_ptrs
.cydata
->mfgid_sz
;
259 /* Read the rest of the CYDA registers */
260 rc
= cyttsp4_adap_read(cd
, read_offset
,
261 sizeof(struct cyttsp4_cydata
)
262 - offsetof(struct cyttsp4_cydata
, cyito_idh
),
263 &si
->si_ptrs
.cydata
->cyito_idh
);
265 dev_err(cd
->dev
, "%s: fail read cydata r=%d\n",
270 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)si
->si_ptrs
.cydata
,
271 si
->si_ofs
.cydata_size
, "sysinfo_cydata");
275 static int cyttsp4_si_get_test_data(struct cyttsp4
*cd
)
277 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
281 if (si
->si_ofs
.pcfg_ofs
<= si
->si_ofs
.test_ofs
) {
283 "%s: invalid offset pcfg_ofs: %zu, test_ofs: %zu\n",
284 __func__
, si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.test_ofs
);
288 si
->si_ofs
.test_size
= si
->si_ofs
.pcfg_ofs
- si
->si_ofs
.test_ofs
;
290 p
= krealloc(si
->si_ptrs
.test
, si
->si_ofs
.test_size
, GFP_KERNEL
);
292 dev_err(cd
->dev
, "%s: failed to allocate test memory\n",
296 si
->si_ptrs
.test
= p
;
298 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.test_ofs
, si
->si_ofs
.test_size
,
301 dev_err(cd
->dev
, "%s: fail read test data r=%d\n",
306 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
307 (u8
*)si
->si_ptrs
.test
, si
->si_ofs
.test_size
,
308 "sysinfo_test_data");
309 if (si
->si_ptrs
.test
->post_codel
&
310 CY_POST_CODEL_WDG_RST
)
311 dev_info(cd
->dev
, "%s: %s codel=%02X\n",
312 __func__
, "Reset was a WATCHDOG RESET",
313 si
->si_ptrs
.test
->post_codel
);
315 if (!(si
->si_ptrs
.test
->post_codel
&
316 CY_POST_CODEL_CFG_DATA_CRC_FAIL
))
317 dev_info(cd
->dev
, "%s: %s codel=%02X\n", __func__
,
318 "Config Data CRC FAIL",
319 si
->si_ptrs
.test
->post_codel
);
321 if (!(si
->si_ptrs
.test
->post_codel
&
322 CY_POST_CODEL_PANEL_TEST_FAIL
))
323 dev_info(cd
->dev
, "%s: %s codel=%02X\n",
324 __func__
, "PANEL TEST FAIL",
325 si
->si_ptrs
.test
->post_codel
);
327 dev_info(cd
->dev
, "%s: SCANNING is %s codel=%02X\n",
328 __func__
, si
->si_ptrs
.test
->post_codel
& 0x08 ?
329 "ENABLED" : "DISABLED",
330 si
->si_ptrs
.test
->post_codel
);
334 static int cyttsp4_si_get_pcfg_data(struct cyttsp4
*cd
)
336 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
340 if (si
->si_ofs
.opcfg_ofs
<= si
->si_ofs
.pcfg_ofs
) {
342 "%s: invalid offset opcfg_ofs: %zu, pcfg_ofs: %zu\n",
343 __func__
, si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.pcfg_ofs
);
347 si
->si_ofs
.pcfg_size
= si
->si_ofs
.opcfg_ofs
- si
->si_ofs
.pcfg_ofs
;
349 p
= krealloc(si
->si_ptrs
.pcfg
, si
->si_ofs
.pcfg_size
, GFP_KERNEL
);
351 dev_err(cd
->dev
, "%s: failed to allocate pcfg memory\n",
355 si
->si_ptrs
.pcfg
= p
;
357 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.pcfg_size
,
360 dev_err(cd
->dev
, "%s: fail read pcfg data r=%d\n",
365 si
->si_ofs
.max_x
= merge_bytes((si
->si_ptrs
.pcfg
->res_xh
366 & CY_PCFG_RESOLUTION_X_MASK
), si
->si_ptrs
.pcfg
->res_xl
);
367 si
->si_ofs
.x_origin
= !!(si
->si_ptrs
.pcfg
->res_xh
368 & CY_PCFG_ORIGIN_X_MASK
);
369 si
->si_ofs
.max_y
= merge_bytes((si
->si_ptrs
.pcfg
->res_yh
370 & CY_PCFG_RESOLUTION_Y_MASK
), si
->si_ptrs
.pcfg
->res_yl
);
371 si
->si_ofs
.y_origin
= !!(si
->si_ptrs
.pcfg
->res_yh
372 & CY_PCFG_ORIGIN_Y_MASK
);
373 si
->si_ofs
.max_p
= merge_bytes(si
->si_ptrs
.pcfg
->max_zh
,
374 si
->si_ptrs
.pcfg
->max_zl
);
376 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
377 (u8
*)si
->si_ptrs
.pcfg
,
378 si
->si_ofs
.pcfg_size
, "sysinfo_pcfg_data");
382 static int cyttsp4_si_get_opcfg_data(struct cyttsp4
*cd
)
384 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
385 struct cyttsp4_tch_abs_params
*tch
;
386 struct cyttsp4_tch_rec_params
*tch_old
, *tch_new
;
387 enum cyttsp4_tch_abs abs
;
392 if (si
->si_ofs
.ddata_ofs
<= si
->si_ofs
.opcfg_ofs
) {
394 "%s: invalid offset ddata_ofs: %zu, opcfg_ofs: %zu\n",
395 __func__
, si
->si_ofs
.ddata_ofs
, si
->si_ofs
.opcfg_ofs
);
399 si
->si_ofs
.opcfg_size
= si
->si_ofs
.ddata_ofs
- si
->si_ofs
.opcfg_ofs
;
401 p
= krealloc(si
->si_ptrs
.opcfg
, si
->si_ofs
.opcfg_size
, GFP_KERNEL
);
403 dev_err(cd
->dev
, "%s: failed to allocate opcfg memory\n",
407 si
->si_ptrs
.opcfg
= p
;
409 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.opcfg_size
,
412 dev_err(cd
->dev
, "%s: fail read opcfg data r=%d\n",
416 si
->si_ofs
.cmd_ofs
= si
->si_ptrs
.opcfg
->cmd_ofs
;
417 si
->si_ofs
.rep_ofs
= si
->si_ptrs
.opcfg
->rep_ofs
;
418 si
->si_ofs
.rep_sz
= (si
->si_ptrs
.opcfg
->rep_szh
* 256) +
419 si
->si_ptrs
.opcfg
->rep_szl
;
420 si
->si_ofs
.num_btns
= si
->si_ptrs
.opcfg
->num_btns
;
421 si
->si_ofs
.num_btn_regs
= (si
->si_ofs
.num_btns
+
422 CY_NUM_BTN_PER_REG
- 1) / CY_NUM_BTN_PER_REG
;
423 si
->si_ofs
.tt_stat_ofs
= si
->si_ptrs
.opcfg
->tt_stat_ofs
;
424 si
->si_ofs
.obj_cfg0
= si
->si_ptrs
.opcfg
->obj_cfg0
;
425 si
->si_ofs
.max_tchs
= si
->si_ptrs
.opcfg
->max_tchs
&
427 si
->si_ofs
.tch_rec_size
= si
->si_ptrs
.opcfg
->tch_rec_size
&
430 /* Get the old touch fields */
431 for (abs
= CY_TCH_X
; abs
< CY_NUM_TCH_FIELDS
; abs
++) {
432 tch
= &si
->si_ofs
.tch_abs
[abs
];
433 tch_old
= &si
->si_ptrs
.opcfg
->tch_rec_old
[abs
];
435 tch
->ofs
= tch_old
->loc
& CY_BYTE_OFS_MASK
;
436 tch
->size
= cyttsp4_bits_2_bytes(tch_old
->size
,
438 tch
->bofs
= (tch_old
->loc
& CY_BOFS_MASK
) >> CY_BOFS_SHIFT
;
442 si
->si_ofs
.btn_rec_size
= si
->si_ptrs
.opcfg
->btn_rec_size
;
443 si
->si_ofs
.btn_diff_ofs
= si
->si_ptrs
.opcfg
->btn_diff_ofs
;
444 si
->si_ofs
.btn_diff_size
= si
->si_ptrs
.opcfg
->btn_diff_size
;
446 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
) {
447 /* Get the extended touch fields */
448 for (i
= 0; i
< CY_NUM_EXT_TCH_FIELDS
; abs
++, i
++) {
449 tch
= &si
->si_ofs
.tch_abs
[abs
];
450 tch_new
= &si
->si_ptrs
.opcfg
->tch_rec_new
[i
];
452 tch
->ofs
= tch_new
->loc
& CY_BYTE_OFS_MASK
;
453 tch
->size
= cyttsp4_bits_2_bytes(tch_new
->size
,
455 tch
->bofs
= (tch_new
->loc
& CY_BOFS_MASK
) >> CY_BOFS_SHIFT
;
459 for (abs
= 0; abs
< CY_TCH_NUM_ABS
; abs
++) {
460 dev_dbg(cd
->dev
, "%s: tch_rec_%s\n", __func__
,
461 cyttsp4_tch_abs_string
[abs
]);
462 dev_dbg(cd
->dev
, "%s: ofs =%2zd\n", __func__
,
463 si
->si_ofs
.tch_abs
[abs
].ofs
);
464 dev_dbg(cd
->dev
, "%s: siz =%2zd\n", __func__
,
465 si
->si_ofs
.tch_abs
[abs
].size
);
466 dev_dbg(cd
->dev
, "%s: max =%2zd\n", __func__
,
467 si
->si_ofs
.tch_abs
[abs
].max
);
468 dev_dbg(cd
->dev
, "%s: bofs=%2zd\n", __func__
,
469 si
->si_ofs
.tch_abs
[abs
].bofs
);
472 si
->si_ofs
.mode_size
= si
->si_ofs
.tt_stat_ofs
+ 1;
473 si
->si_ofs
.data_size
= si
->si_ofs
.max_tchs
*
474 si
->si_ptrs
.opcfg
->tch_rec_size
;
476 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
, (u8
*)si
->si_ptrs
.opcfg
,
477 si
->si_ofs
.opcfg_size
, "sysinfo_opcfg_data");
482 static int cyttsp4_si_get_ddata(struct cyttsp4
*cd
)
484 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
488 si
->si_ofs
.ddata_size
= si
->si_ofs
.mdata_ofs
- si
->si_ofs
.ddata_ofs
;
490 p
= krealloc(si
->si_ptrs
.ddata
, si
->si_ofs
.ddata_size
, GFP_KERNEL
);
492 dev_err(cd
->dev
, "%s: fail alloc ddata memory\n", __func__
);
495 si
->si_ptrs
.ddata
= p
;
497 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.ddata_ofs
, si
->si_ofs
.ddata_size
,
500 dev_err(cd
->dev
, "%s: fail read ddata data r=%d\n",
503 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
504 (u8
*)si
->si_ptrs
.ddata
,
505 si
->si_ofs
.ddata_size
, "sysinfo_ddata");
509 static int cyttsp4_si_get_mdata(struct cyttsp4
*cd
)
511 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
515 si
->si_ofs
.mdata_size
= si
->si_ofs
.map_sz
- si
->si_ofs
.mdata_ofs
;
517 p
= krealloc(si
->si_ptrs
.mdata
, si
->si_ofs
.mdata_size
, GFP_KERNEL
);
519 dev_err(cd
->dev
, "%s: fail alloc mdata memory\n", __func__
);
522 si
->si_ptrs
.mdata
= p
;
524 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.mdata_ofs
, si
->si_ofs
.mdata_size
,
527 dev_err(cd
->dev
, "%s: fail read mdata data r=%d\n",
530 cyttsp4_pr_buf(cd
->dev
, cd
->pr_buf
,
531 (u8
*)si
->si_ptrs
.mdata
,
532 si
->si_ofs
.mdata_size
, "sysinfo_mdata");
536 static int cyttsp4_si_get_btn_data(struct cyttsp4
*cd
)
538 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
540 int num_defined_keys
;
545 if (si
->si_ofs
.num_btns
) {
546 si
->si_ofs
.btn_keys_size
= si
->si_ofs
.num_btns
*
547 sizeof(struct cyttsp4_btn
);
549 p
= krealloc(si
->btn
, si
->si_ofs
.btn_keys_size
,
550 GFP_KERNEL
|__GFP_ZERO
);
552 dev_err(cd
->dev
, "%s: %s\n", __func__
,
553 "fail alloc btn_keys memory");
558 if (cd
->cpdata
->sett
[CY_IC_GRPNUM_BTN_KEYS
] == NULL
)
559 num_defined_keys
= 0;
560 else if (cd
->cpdata
->sett
[CY_IC_GRPNUM_BTN_KEYS
]->data
== NULL
)
561 num_defined_keys
= 0;
563 num_defined_keys
= cd
->cpdata
->sett
564 [CY_IC_GRPNUM_BTN_KEYS
]->size
;
566 for (btn
= 0; btn
< si
->si_ofs
.num_btns
&&
567 btn
< num_defined_keys
; btn
++) {
568 key_table
= (u16
*)cd
->cpdata
->sett
569 [CY_IC_GRPNUM_BTN_KEYS
]->data
;
570 si
->btn
[btn
].key_code
= key_table
[btn
];
571 si
->btn
[btn
].state
= CY_BTN_RELEASED
;
572 si
->btn
[btn
].enabled
= true;
574 for (; btn
< si
->si_ofs
.num_btns
; btn
++) {
575 si
->btn
[btn
].key_code
= KEY_RESERVED
;
576 si
->btn
[btn
].state
= CY_BTN_RELEASED
;
577 si
->btn
[btn
].enabled
= true;
583 si
->si_ofs
.btn_keys_size
= 0;
589 static int cyttsp4_si_get_op_data_ptrs(struct cyttsp4
*cd
)
591 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
594 p
= krealloc(si
->xy_mode
, si
->si_ofs
.mode_size
, GFP_KERNEL
|__GFP_ZERO
);
599 p
= krealloc(si
->xy_data
, si
->si_ofs
.data_size
, GFP_KERNEL
|__GFP_ZERO
);
604 p
= krealloc(si
->btn_rec_data
,
605 si
->si_ofs
.btn_rec_size
* si
->si_ofs
.num_btns
,
606 GFP_KERNEL
|__GFP_ZERO
);
609 si
->btn_rec_data
= p
;
614 static void cyttsp4_si_put_log_data(struct cyttsp4
*cd
)
616 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
617 dev_dbg(cd
->dev
, "%s: cydata_ofs =%4zd siz=%4zd\n", __func__
,
618 si
->si_ofs
.cydata_ofs
, si
->si_ofs
.cydata_size
);
619 dev_dbg(cd
->dev
, "%s: test_ofs =%4zd siz=%4zd\n", __func__
,
620 si
->si_ofs
.test_ofs
, si
->si_ofs
.test_size
);
621 dev_dbg(cd
->dev
, "%s: pcfg_ofs =%4zd siz=%4zd\n", __func__
,
622 si
->si_ofs
.pcfg_ofs
, si
->si_ofs
.pcfg_size
);
623 dev_dbg(cd
->dev
, "%s: opcfg_ofs =%4zd siz=%4zd\n", __func__
,
624 si
->si_ofs
.opcfg_ofs
, si
->si_ofs
.opcfg_size
);
625 dev_dbg(cd
->dev
, "%s: ddata_ofs =%4zd siz=%4zd\n", __func__
,
626 si
->si_ofs
.ddata_ofs
, si
->si_ofs
.ddata_size
);
627 dev_dbg(cd
->dev
, "%s: mdata_ofs =%4zd siz=%4zd\n", __func__
,
628 si
->si_ofs
.mdata_ofs
, si
->si_ofs
.mdata_size
);
630 dev_dbg(cd
->dev
, "%s: cmd_ofs =%4zd\n", __func__
,
632 dev_dbg(cd
->dev
, "%s: rep_ofs =%4zd\n", __func__
,
634 dev_dbg(cd
->dev
, "%s: rep_sz =%4zd\n", __func__
,
636 dev_dbg(cd
->dev
, "%s: num_btns =%4zd\n", __func__
,
637 si
->si_ofs
.num_btns
);
638 dev_dbg(cd
->dev
, "%s: num_btn_regs =%4zd\n", __func__
,
639 si
->si_ofs
.num_btn_regs
);
640 dev_dbg(cd
->dev
, "%s: tt_stat_ofs =%4zd\n", __func__
,
641 si
->si_ofs
.tt_stat_ofs
);
642 dev_dbg(cd
->dev
, "%s: tch_rec_size =%4zd\n", __func__
,
643 si
->si_ofs
.tch_rec_size
);
644 dev_dbg(cd
->dev
, "%s: max_tchs =%4zd\n", __func__
,
645 si
->si_ofs
.max_tchs
);
646 dev_dbg(cd
->dev
, "%s: mode_size =%4zd\n", __func__
,
647 si
->si_ofs
.mode_size
);
648 dev_dbg(cd
->dev
, "%s: data_size =%4zd\n", __func__
,
649 si
->si_ofs
.data_size
);
650 dev_dbg(cd
->dev
, "%s: map_sz =%4zd\n", __func__
,
653 dev_dbg(cd
->dev
, "%s: btn_rec_size =%2zd\n", __func__
,
654 si
->si_ofs
.btn_rec_size
);
655 dev_dbg(cd
->dev
, "%s: btn_diff_ofs =%2zd\n", __func__
,
656 si
->si_ofs
.btn_diff_ofs
);
657 dev_dbg(cd
->dev
, "%s: btn_diff_size =%2zd\n", __func__
,
658 si
->si_ofs
.btn_diff_size
);
660 dev_dbg(cd
->dev
, "%s: max_x = 0x%04zX (%zd)\n", __func__
,
661 si
->si_ofs
.max_x
, si
->si_ofs
.max_x
);
662 dev_dbg(cd
->dev
, "%s: x_origin = %zd (%s)\n", __func__
,
664 si
->si_ofs
.x_origin
== CY_NORMAL_ORIGIN
?
665 "left corner" : "right corner");
666 dev_dbg(cd
->dev
, "%s: max_y = 0x%04zX (%zd)\n", __func__
,
667 si
->si_ofs
.max_y
, si
->si_ofs
.max_y
);
668 dev_dbg(cd
->dev
, "%s: y_origin = %zd (%s)\n", __func__
,
670 si
->si_ofs
.y_origin
== CY_NORMAL_ORIGIN
?
671 "upper corner" : "lower corner");
672 dev_dbg(cd
->dev
, "%s: max_p = 0x%04zX (%zd)\n", __func__
,
673 si
->si_ofs
.max_p
, si
->si_ofs
.max_p
);
675 dev_dbg(cd
->dev
, "%s: xy_mode=%p xy_data=%p\n", __func__
,
676 si
->xy_mode
, si
->xy_data
);
679 static int cyttsp4_get_sysinfo_regs(struct cyttsp4
*cd
)
681 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
684 rc
= cyttsp4_si_data_offsets(cd
);
688 rc
= cyttsp4_si_get_cydata(cd
);
692 rc
= cyttsp4_si_get_test_data(cd
);
696 rc
= cyttsp4_si_get_pcfg_data(cd
);
700 rc
= cyttsp4_si_get_opcfg_data(cd
);
704 rc
= cyttsp4_si_get_ddata(cd
);
708 rc
= cyttsp4_si_get_mdata(cd
);
712 rc
= cyttsp4_si_get_btn_data(cd
);
716 rc
= cyttsp4_si_get_op_data_ptrs(cd
);
718 dev_err(cd
->dev
, "%s: failed to get_op_data\n",
723 cyttsp4_si_put_log_data(cd
);
725 /* provide flow control handshake */
726 rc
= cyttsp4_handshake(cd
, si
->si_data
.hst_mode
);
728 dev_err(cd
->dev
, "%s: handshake fail on sysinfo reg\n",
735 static void cyttsp4_queue_startup_(struct cyttsp4
*cd
)
737 if (cd
->startup_state
== STARTUP_NONE
) {
738 cd
->startup_state
= STARTUP_QUEUED
;
739 schedule_work(&cd
->startup_work
);
740 dev_dbg(cd
->dev
, "%s: cyttsp4_startup queued\n", __func__
);
742 dev_dbg(cd
->dev
, "%s: startup_state = %d\n", __func__
,
747 static void cyttsp4_report_slot_liftoff(struct cyttsp4_mt_data
*md
,
752 if (md
->num_prv_tch
== 0)
755 for (t
= 0; t
< max_slots
; t
++) {
756 input_mt_slot(md
->input
, t
);
757 input_mt_report_slot_state(md
->input
,
758 MT_TOOL_FINGER
, false);
762 static void cyttsp4_lift_all(struct cyttsp4_mt_data
*md
)
767 if (md
->num_prv_tch
!= 0) {
768 cyttsp4_report_slot_liftoff(md
,
769 md
->si
->si_ofs
.tch_abs
[CY_TCH_T
].max
);
770 input_sync(md
->input
);
775 static void cyttsp4_get_touch_axis(struct cyttsp4_mt_data
*md
,
776 int *axis
, int size
, int max
, u8
*xy_data
, int bofs
)
781 for (nbyte
= 0, *axis
= 0, next
= 0; nbyte
< size
; nbyte
++) {
782 dev_vdbg(&md
->input
->dev
,
783 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p"
784 " xy_data[%d]=%02X(%d) bofs=%d\n",
785 __func__
, *axis
, *axis
, size
, max
, xy_data
, next
,
786 xy_data
[next
], xy_data
[next
], bofs
);
787 *axis
= (*axis
* 256) + (xy_data
[next
] >> bofs
);
793 dev_vdbg(&md
->input
->dev
,
794 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p"
795 " xy_data[%d]=%02X(%d)\n",
796 __func__
, *axis
, *axis
, size
, max
, xy_data
, next
,
797 xy_data
[next
], xy_data
[next
]);
800 static void cyttsp4_get_touch(struct cyttsp4_mt_data
*md
,
801 struct cyttsp4_touch
*touch
, u8
*xy_data
)
803 struct device
*dev
= &md
->input
->dev
;
804 struct cyttsp4_sysinfo
*si
= md
->si
;
805 enum cyttsp4_tch_abs abs
;
808 for (abs
= CY_TCH_X
; abs
< CY_TCH_NUM_ABS
; abs
++) {
809 cyttsp4_get_touch_axis(md
, &touch
->abs
[abs
],
810 si
->si_ofs
.tch_abs
[abs
].size
,
811 si
->si_ofs
.tch_abs
[abs
].max
,
812 xy_data
+ si
->si_ofs
.tch_abs
[abs
].ofs
,
813 si
->si_ofs
.tch_abs
[abs
].bofs
);
814 dev_vdbg(dev
, "%s: get %s=%04X(%d)\n", __func__
,
815 cyttsp4_tch_abs_string
[abs
],
816 touch
->abs
[abs
], touch
->abs
[abs
]);
819 if (md
->pdata
->flags
& CY_FLAG_FLIP
) {
820 swap(touch
->abs
[CY_TCH_X
], touch
->abs
[CY_TCH_Y
]);
825 if (md
->pdata
->flags
& CY_FLAG_INV_X
) {
827 touch
->abs
[CY_TCH_X
] = md
->si
->si_ofs
.max_y
-
828 touch
->abs
[CY_TCH_X
];
830 touch
->abs
[CY_TCH_X
] = md
->si
->si_ofs
.max_x
-
831 touch
->abs
[CY_TCH_X
];
833 if (md
->pdata
->flags
& CY_FLAG_INV_Y
) {
835 touch
->abs
[CY_TCH_Y
] = md
->si
->si_ofs
.max_x
-
836 touch
->abs
[CY_TCH_Y
];
838 touch
->abs
[CY_TCH_Y
] = md
->si
->si_ofs
.max_y
-
839 touch
->abs
[CY_TCH_Y
];
842 dev_vdbg(dev
, "%s: flip=%s inv-x=%s inv-y=%s x=%04X(%d) y=%04X(%d)\n",
843 __func__
, flipped
? "true" : "false",
844 md
->pdata
->flags
& CY_FLAG_INV_X
? "true" : "false",
845 md
->pdata
->flags
& CY_FLAG_INV_Y
? "true" : "false",
846 touch
->abs
[CY_TCH_X
], touch
->abs
[CY_TCH_X
],
847 touch
->abs
[CY_TCH_Y
], touch
->abs
[CY_TCH_Y
]);
850 static void cyttsp4_final_sync(struct input_dev
*input
, int max_slots
, int *ids
)
854 for (t
= 0; t
< max_slots
; t
++) {
857 input_mt_slot(input
, t
);
858 input_mt_report_slot_state(input
, MT_TOOL_FINGER
, false);
864 static void cyttsp4_get_mt_touches(struct cyttsp4_mt_data
*md
, int num_cur_tch
)
866 struct device
*dev
= &md
->input
->dev
;
867 struct cyttsp4_sysinfo
*si
= md
->si
;
868 struct cyttsp4_touch tch
;
871 int ids
[max(CY_TMA1036_MAX_TCH
, CY_TMA4XX_MAX_TCH
)];
873 memset(ids
, 0, si
->si_ofs
.tch_abs
[CY_TCH_T
].max
* sizeof(int));
874 for (i
= 0; i
< num_cur_tch
; i
++) {
875 cyttsp4_get_touch(md
, &tch
, si
->xy_data
+
876 (i
* si
->si_ofs
.tch_rec_size
));
877 if ((tch
.abs
[CY_TCH_T
] < md
->pdata
->frmwrk
->abs
878 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MIN_OST
]) ||
879 (tch
.abs
[CY_TCH_T
] > md
->pdata
->frmwrk
->abs
880 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MAX_OST
])) {
881 dev_err(dev
, "%s: tch=%d -> bad trk_id=%d max_id=%d\n",
882 __func__
, i
, tch
.abs
[CY_TCH_T
],
883 md
->pdata
->frmwrk
->abs
[(CY_ABS_ID_OST
*
884 CY_NUM_ABS_SET
) + CY_MAX_OST
]);
888 /* use 0 based track id's */
889 sig
= md
->pdata
->frmwrk
->abs
890 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + 0];
891 if (sig
!= CY_IGNORE_VALUE
) {
892 t
= tch
.abs
[CY_TCH_T
] - md
->pdata
->frmwrk
->abs
893 [(CY_ABS_ID_OST
* CY_NUM_ABS_SET
) + CY_MIN_OST
];
894 if (tch
.abs
[CY_TCH_E
] == CY_EV_LIFTOFF
) {
895 dev_dbg(dev
, "%s: t=%d e=%d lift-off\n",
896 __func__
, t
, tch
.abs
[CY_TCH_E
]);
897 goto cyttsp4_get_mt_touches_pr_tch
;
899 input_mt_slot(md
->input
, t
);
900 input_mt_report_slot_state(md
->input
, MT_TOOL_FINGER
,
905 /* all devices: position and pressure fields */
906 for (j
= 0; j
<= CY_ABS_W_OST
; j
++) {
907 sig
= md
->pdata
->frmwrk
->abs
[((CY_ABS_X_OST
+ j
) *
908 CY_NUM_ABS_SET
) + 0];
909 if (sig
!= CY_IGNORE_VALUE
)
910 input_report_abs(md
->input
, sig
,
911 tch
.abs
[CY_TCH_X
+ j
]);
913 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
) {
915 * TMA400 size and orientation fields:
916 * if pressure is non-zero and major touch
917 * signal is zero, then set major and minor touch
918 * signals to minimum non-zero value
920 if (tch
.abs
[CY_TCH_P
] > 0 && tch
.abs
[CY_TCH_MAJ
] == 0)
921 tch
.abs
[CY_TCH_MAJ
] = tch
.abs
[CY_TCH_MIN
] = 1;
923 /* Get the extended touch fields */
924 for (j
= 0; j
< CY_NUM_EXT_TCH_FIELDS
; j
++) {
925 sig
= md
->pdata
->frmwrk
->abs
926 [((CY_ABS_MAJ_OST
+ j
) *
927 CY_NUM_ABS_SET
) + 0];
928 if (sig
!= CY_IGNORE_VALUE
)
929 input_report_abs(md
->input
, sig
,
930 tch
.abs
[CY_TCH_MAJ
+ j
]);
934 cyttsp4_get_mt_touches_pr_tch
:
935 if (si
->si_ofs
.tch_rec_size
> CY_TMA1036_TCH_REC_SIZE
)
937 "%s: t=%d x=%d y=%d z=%d M=%d m=%d o=%d e=%d\n",
948 "%s: t=%d x=%d y=%d z=%d e=%d\n", __func__
,
956 cyttsp4_final_sync(md
->input
, si
->si_ofs
.tch_abs
[CY_TCH_T
].max
, ids
);
958 md
->num_prv_tch
= num_cur_tch
;
963 /* read xy_data for all current touches */
964 static int cyttsp4_xy_worker(struct cyttsp4
*cd
)
966 struct cyttsp4_mt_data
*md
= &cd
->md
;
967 struct device
*dev
= &md
->input
->dev
;
968 struct cyttsp4_sysinfo
*si
= md
->si
;
977 * Get event data from cyttsp4 device.
978 * The event data includes all data
979 * for all active touches.
980 * Event data also includes button data
984 * 1st read to get mode + button bytes + touch count (core)
985 * 2nd read (optional) to get touch 1 - touch n data
987 hst_mode
= si
->xy_mode
[CY_REG_BASE
];
988 rep_len
= si
->xy_mode
[si
->si_ofs
.rep_ofs
];
989 rep_stat
= si
->xy_mode
[si
->si_ofs
.rep_ofs
+ 1];
990 tt_stat
= si
->xy_mode
[si
->si_ofs
.tt_stat_ofs
];
991 dev_vdbg(dev
, "%s: %s%02X %s%d %s%02X %s%02X\n", __func__
,
992 "hst_mode=", hst_mode
, "rep_len=", rep_len
,
993 "rep_stat=", rep_stat
, "tt_stat=", tt_stat
);
995 num_cur_tch
= GET_NUM_TOUCHES(tt_stat
);
996 dev_vdbg(dev
, "%s: num_cur_tch=%d\n", __func__
, num_cur_tch
);
998 if (rep_len
== 0 && num_cur_tch
> 0) {
999 dev_err(dev
, "%s: report length error rep_len=%d num_tch=%d\n",
1000 __func__
, rep_len
, num_cur_tch
);
1001 goto cyttsp4_xy_worker_exit
;
1005 if (num_cur_tch
> 0) {
1006 rc
= cyttsp4_adap_read(cd
, si
->si_ofs
.tt_stat_ofs
+ 1,
1007 num_cur_tch
* si
->si_ofs
.tch_rec_size
,
1010 dev_err(dev
, "%s: read fail on touch regs r=%d\n",
1012 goto cyttsp4_xy_worker_exit
;
1017 cyttsp4_pr_buf(dev
, cd
->pr_buf
, si
->xy_data
, num_cur_tch
*
1018 si
->si_ofs
.tch_rec_size
, "xy_data");
1020 /* check any error conditions */
1021 if (IS_BAD_PKT(rep_stat
)) {
1022 dev_dbg(dev
, "%s: Invalid buffer detected\n", __func__
);
1024 goto cyttsp4_xy_worker_exit
;
1027 if (IS_LARGE_AREA(tt_stat
))
1028 dev_dbg(dev
, "%s: Large area detected\n", __func__
);
1030 if (num_cur_tch
> si
->si_ofs
.max_tchs
) {
1031 dev_err(dev
, "%s: too many tch; set to max tch (n=%d c=%zd)\n",
1032 __func__
, num_cur_tch
, si
->si_ofs
.max_tchs
);
1033 num_cur_tch
= si
->si_ofs
.max_tchs
;
1036 /* extract xy_data for all currently reported touches */
1037 dev_vdbg(dev
, "%s: extract data num_cur_tch=%d\n", __func__
,
1040 cyttsp4_get_mt_touches(md
, num_cur_tch
);
1042 cyttsp4_lift_all(md
);
1046 cyttsp4_xy_worker_exit
:
1050 static int cyttsp4_mt_attention(struct cyttsp4
*cd
)
1052 struct device
*dev
= cd
->dev
;
1053 struct cyttsp4_mt_data
*md
= &cd
->md
;
1059 mutex_lock(&md
->report_lock
);
1060 if (!md
->is_suspended
) {
1061 /* core handles handshake */
1062 rc
= cyttsp4_xy_worker(cd
);
1064 dev_vdbg(dev
, "%s: Ignoring report while suspended\n",
1067 mutex_unlock(&md
->report_lock
);
1069 dev_err(dev
, "%s: xy_worker error r=%d\n", __func__
, rc
);
1074 static irqreturn_t
cyttsp4_irq(int irq
, void *handle
)
1076 struct cyttsp4
*cd
= handle
;
1077 struct device
*dev
= cd
->dev
;
1078 enum cyttsp4_mode cur_mode
;
1079 u8 cmd_ofs
= cd
->sysinfo
.si_ofs
.cmd_ofs
;
1084 * Check whether this IRQ should be ignored (external)
1085 * This should be the very first thing to check since
1086 * ignore_irq may be set for a very short period of time
1088 if (atomic_read(&cd
->ignore_irq
)) {
1089 dev_vdbg(dev
, "%s: Ignoring IRQ\n", __func__
);
1093 dev_dbg(dev
, "%s int:0x%x\n", __func__
, cd
->int_status
);
1095 mutex_lock(&cd
->system_lock
);
1098 if (cd
->sleep_state
== SS_SLEEP_ON
|| cd
->sleep_state
== SS_SLEEPING
)
1099 dev_vdbg(dev
, "%s: Received IRQ while in sleep\n", __func__
);
1101 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), mode
);
1103 dev_err(cd
->dev
, "%s: Fail read adapter r=%d\n", __func__
, rc
);
1104 goto cyttsp4_irq_exit
;
1106 dev_vdbg(dev
, "%s mode[0-2]:0x%X 0x%X 0x%X\n", __func__
,
1107 mode
[0], mode
[1], mode
[2]);
1109 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1110 cur_mode
= CY_MODE_BOOTLOADER
;
1111 dev_vdbg(dev
, "%s: bl running\n", __func__
);
1112 if (cd
->mode
== CY_MODE_BOOTLOADER
) {
1113 /* Signal bootloader heartbeat heard */
1114 wake_up(&cd
->wait_q
);
1115 goto cyttsp4_irq_exit
;
1118 /* switch to bootloader */
1119 dev_dbg(dev
, "%s: restart switch to bl m=%d -> m=%d\n",
1120 __func__
, cd
->mode
, cur_mode
);
1122 /* catch operation->bl glitch */
1123 if (cd
->mode
!= CY_MODE_UNKNOWN
) {
1124 /* Incase startup_state do not let startup_() */
1125 cd
->mode
= CY_MODE_UNKNOWN
;
1126 cyttsp4_queue_startup_(cd
);
1127 goto cyttsp4_irq_exit
;
1131 * do not wake thread on this switch since
1132 * it is possible to get an early heartbeat
1133 * prior to performing the reset
1135 cd
->mode
= cur_mode
;
1137 goto cyttsp4_irq_exit
;
1140 switch (mode
[0] & CY_HST_MODE
) {
1141 case CY_HST_OPERATE
:
1142 cur_mode
= CY_MODE_OPERATIONAL
;
1143 dev_vdbg(dev
, "%s: operational\n", __func__
);
1146 cur_mode
= CY_MODE_CAT
;
1147 dev_vdbg(dev
, "%s: CaT\n", __func__
);
1149 case CY_HST_SYSINFO
:
1150 cur_mode
= CY_MODE_SYSINFO
;
1151 dev_vdbg(dev
, "%s: sysinfo\n", __func__
);
1154 cur_mode
= CY_MODE_UNKNOWN
;
1155 dev_err(dev
, "%s: unknown HST mode 0x%02X\n", __func__
,
1160 /* Check whether this IRQ should be ignored (internal) */
1161 if (cd
->int_status
& CY_INT_IGNORE
) {
1162 dev_vdbg(dev
, "%s: Ignoring IRQ\n", __func__
);
1163 goto cyttsp4_irq_exit
;
1166 /* Check for wake up interrupt */
1167 if (cd
->int_status
& CY_INT_AWAKE
) {
1168 cd
->int_status
&= ~CY_INT_AWAKE
;
1169 wake_up(&cd
->wait_q
);
1170 dev_vdbg(dev
, "%s: Received wake up interrupt\n", __func__
);
1171 goto cyttsp4_irq_handshake
;
1174 /* Expecting mode change interrupt */
1175 if ((cd
->int_status
& CY_INT_MODE_CHANGE
)
1176 && (mode
[0] & CY_HST_MODE_CHANGE
) == 0) {
1177 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1178 dev_dbg(dev
, "%s: finish mode switch m=%d -> m=%d\n",
1179 __func__
, cd
->mode
, cur_mode
);
1180 cd
->mode
= cur_mode
;
1181 wake_up(&cd
->wait_q
);
1182 goto cyttsp4_irq_handshake
;
1185 /* compare current core mode to current device mode */
1186 dev_vdbg(dev
, "%s: cd->mode=%d cur_mode=%d\n",
1187 __func__
, cd
->mode
, cur_mode
);
1188 if ((mode
[0] & CY_HST_MODE_CHANGE
) == 0 && cd
->mode
!= cur_mode
) {
1189 /* Unexpected mode change occurred */
1190 dev_err(dev
, "%s %d->%d 0x%x\n", __func__
, cd
->mode
,
1191 cur_mode
, cd
->int_status
);
1192 dev_dbg(dev
, "%s: Unexpected mode change, startup\n",
1194 cyttsp4_queue_startup_(cd
);
1195 goto cyttsp4_irq_exit
;
1198 /* Expecting command complete interrupt */
1199 dev_vdbg(dev
, "%s: command byte:0x%x\n", __func__
, mode
[cmd_ofs
]);
1200 if ((cd
->int_status
& CY_INT_EXEC_CMD
)
1201 && mode
[cmd_ofs
] & CY_CMD_COMPLETE
) {
1202 cd
->int_status
&= ~CY_INT_EXEC_CMD
;
1203 dev_vdbg(dev
, "%s: Received command complete interrupt\n",
1205 wake_up(&cd
->wait_q
);
1207 * It is possible to receive a single interrupt for
1208 * command complete and touch/button status report.
1209 * Continue processing for a possible status report.
1213 /* This should be status report, read status regs */
1214 if (cd
->mode
== CY_MODE_OPERATIONAL
) {
1215 dev_vdbg(dev
, "%s: Read status registers\n", __func__
);
1216 rc
= cyttsp4_load_status_regs(cd
);
1218 dev_err(dev
, "%s: fail read mode regs r=%d\n",
1222 cyttsp4_mt_attention(cd
);
1224 cyttsp4_irq_handshake
:
1225 /* handshake the event */
1226 dev_vdbg(dev
, "%s: Handshake mode=0x%02X r=%d\n",
1227 __func__
, mode
[0], rc
);
1228 rc
= cyttsp4_handshake(cd
, mode
[0]);
1230 dev_err(dev
, "%s: Fail handshake mode=0x%02X r=%d\n",
1231 __func__
, mode
[0], rc
);
1234 * a non-zero udelay period is required for using
1235 * IRQF_TRIGGER_LOW in order to delay until the
1236 * device completes isr deassert
1238 udelay(cd
->cpdata
->level_irq_udelay
);
1241 mutex_unlock(&cd
->system_lock
);
1245 static void cyttsp4_start_wd_timer(struct cyttsp4
*cd
)
1247 if (!CY_WATCHDOG_TIMEOUT
)
1250 mod_timer(&cd
->watchdog_timer
, jiffies
+
1251 msecs_to_jiffies(CY_WATCHDOG_TIMEOUT
));
1254 static void cyttsp4_stop_wd_timer(struct cyttsp4
*cd
)
1256 if (!CY_WATCHDOG_TIMEOUT
)
1260 * Ensure we wait until the watchdog timer
1261 * running on a different CPU finishes
1263 del_timer_sync(&cd
->watchdog_timer
);
1264 cancel_work_sync(&cd
->watchdog_work
);
1265 del_timer_sync(&cd
->watchdog_timer
);
1268 static void cyttsp4_watchdog_timer(struct timer_list
*t
)
1270 struct cyttsp4
*cd
= from_timer(cd
, t
, watchdog_timer
);
1272 dev_vdbg(cd
->dev
, "%s: Watchdog timer triggered\n", __func__
);
1274 schedule_work(&cd
->watchdog_work
);
1279 static int cyttsp4_request_exclusive(struct cyttsp4
*cd
, void *ownptr
,
1282 int t
= msecs_to_jiffies(timeout_ms
);
1283 bool with_timeout
= (timeout_ms
!= 0);
1285 mutex_lock(&cd
->system_lock
);
1286 if (!cd
->exclusive_dev
&& cd
->exclusive_waits
== 0) {
1287 cd
->exclusive_dev
= ownptr
;
1291 cd
->exclusive_waits
++;
1293 mutex_unlock(&cd
->system_lock
);
1295 t
= wait_event_timeout(cd
->wait_q
, !cd
->exclusive_dev
, t
);
1297 dev_err(cd
->dev
, "%s: tmo waiting exclusive access\n",
1299 mutex_lock(&cd
->system_lock
);
1300 cd
->exclusive_waits
--;
1301 mutex_unlock(&cd
->system_lock
);
1305 wait_event(cd
->wait_q
, !cd
->exclusive_dev
);
1307 mutex_lock(&cd
->system_lock
);
1308 if (cd
->exclusive_dev
)
1310 cd
->exclusive_dev
= ownptr
;
1311 cd
->exclusive_waits
--;
1313 mutex_unlock(&cd
->system_lock
);
1319 * returns error if was not owned
1321 static int cyttsp4_release_exclusive(struct cyttsp4
*cd
, void *ownptr
)
1323 mutex_lock(&cd
->system_lock
);
1324 if (cd
->exclusive_dev
!= ownptr
) {
1325 mutex_unlock(&cd
->system_lock
);
1329 dev_vdbg(cd
->dev
, "%s: exclusive_dev %p freed\n",
1330 __func__
, cd
->exclusive_dev
);
1331 cd
->exclusive_dev
= NULL
;
1332 wake_up(&cd
->wait_q
);
1333 mutex_unlock(&cd
->system_lock
);
1337 static int cyttsp4_wait_bl_heartbeat(struct cyttsp4
*cd
)
1342 /* wait heartbeat */
1343 dev_vdbg(cd
->dev
, "%s: wait heartbeat...\n", __func__
);
1344 t
= wait_event_timeout(cd
->wait_q
, cd
->mode
== CY_MODE_BOOTLOADER
,
1345 msecs_to_jiffies(CY_CORE_RESET_AND_WAIT_TIMEOUT
));
1347 dev_err(cd
->dev
, "%s: tmo waiting bl heartbeat cd->mode=%d\n",
1348 __func__
, cd
->mode
);
1355 static int cyttsp4_wait_sysinfo_mode(struct cyttsp4
*cd
)
1359 dev_vdbg(cd
->dev
, "%s: wait sysinfo...\n", __func__
);
1361 t
= wait_event_timeout(cd
->wait_q
, cd
->mode
== CY_MODE_SYSINFO
,
1362 msecs_to_jiffies(CY_CORE_MODE_CHANGE_TIMEOUT
));
1364 dev_err(cd
->dev
, "%s: tmo waiting exit bl cd->mode=%d\n",
1365 __func__
, cd
->mode
);
1366 mutex_lock(&cd
->system_lock
);
1367 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1368 mutex_unlock(&cd
->system_lock
);
1375 static int cyttsp4_reset_and_wait(struct cyttsp4
*cd
)
1379 /* reset hardware */
1380 mutex_lock(&cd
->system_lock
);
1381 dev_dbg(cd
->dev
, "%s: reset hw...\n", __func__
);
1382 rc
= cyttsp4_hw_reset(cd
);
1383 cd
->mode
= CY_MODE_UNKNOWN
;
1384 mutex_unlock(&cd
->system_lock
);
1386 dev_err(cd
->dev
, "%s:Fail hw reset r=%d\n", __func__
, rc
);
1390 return cyttsp4_wait_bl_heartbeat(cd
);
1394 * returns err if refused or timeout; block until mode change complete
1395 * bit is set (mode change interrupt)
1397 static int cyttsp4_set_mode(struct cyttsp4
*cd
, int new_mode
)
1405 case CY_MODE_OPERATIONAL
:
1406 new_dev_mode
= CY_HST_OPERATE
;
1408 case CY_MODE_SYSINFO
:
1409 new_dev_mode
= CY_HST_SYSINFO
;
1412 new_dev_mode
= CY_HST_CAT
;
1415 dev_err(cd
->dev
, "%s: invalid mode: %02X(%d)\n",
1416 __func__
, new_mode
, new_mode
);
1421 dev_dbg(cd
->dev
, "%s: %s=%p new_dev_mode=%02X new_mode=%d\n",
1422 __func__
, "have exclusive", cd
->exclusive_dev
,
1423 new_dev_mode
, new_mode
);
1425 mutex_lock(&cd
->system_lock
);
1426 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1428 mutex_unlock(&cd
->system_lock
);
1429 dev_err(cd
->dev
, "%s: Fail read mode r=%d\n",
1434 /* Clear device mode bits and set to new mode */
1435 mode
&= ~CY_HST_MODE
;
1436 mode
|= new_dev_mode
| CY_HST_MODE_CHANGE
;
1438 cd
->int_status
|= CY_INT_MODE_CHANGE
;
1439 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1440 mutex_unlock(&cd
->system_lock
);
1442 dev_err(cd
->dev
, "%s: Fail write mode change r=%d\n",
1447 /* wait for mode change done interrupt */
1448 t
= wait_event_timeout(cd
->wait_q
,
1449 (cd
->int_status
& CY_INT_MODE_CHANGE
) == 0,
1450 msecs_to_jiffies(CY_CORE_MODE_CHANGE_TIMEOUT
));
1451 dev_dbg(cd
->dev
, "%s: back from wait t=%ld cd->mode=%d\n",
1452 __func__
, t
, cd
->mode
);
1455 dev_err(cd
->dev
, "%s: %s\n", __func__
,
1456 "tmo waiting mode change");
1457 mutex_lock(&cd
->system_lock
);
1458 cd
->int_status
&= ~CY_INT_MODE_CHANGE
;
1459 mutex_unlock(&cd
->system_lock
);
1467 static void cyttsp4_watchdog_work(struct work_struct
*work
)
1469 struct cyttsp4
*cd
=
1470 container_of(work
, struct cyttsp4
, watchdog_work
);
1474 mutex_lock(&cd
->system_lock
);
1475 retval
= cyttsp4_load_status_regs(cd
);
1478 "%s: failed to access device in watchdog timer r=%d\n",
1480 cyttsp4_queue_startup_(cd
);
1481 goto cyttsp4_timer_watchdog_exit_error
;
1483 mode
= &cd
->sysinfo
.xy_mode
[CY_REG_BASE
];
1484 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1486 "%s: device found in bootloader mode when operational mode\n",
1488 cyttsp4_queue_startup_(cd
);
1489 goto cyttsp4_timer_watchdog_exit_error
;
1492 cyttsp4_start_wd_timer(cd
);
1493 cyttsp4_timer_watchdog_exit_error
:
1494 mutex_unlock(&cd
->system_lock
);
1498 static int cyttsp4_core_sleep_(struct cyttsp4
*cd
)
1500 enum cyttsp4_sleep_state ss
= SS_SLEEP_ON
;
1501 enum cyttsp4_int_state int_status
= CY_INT_IGNORE
;
1505 /* Already in sleep mode? */
1506 mutex_lock(&cd
->system_lock
);
1507 if (cd
->sleep_state
== SS_SLEEP_ON
) {
1508 mutex_unlock(&cd
->system_lock
);
1511 cd
->sleep_state
= SS_SLEEPING
;
1512 mutex_unlock(&cd
->system_lock
);
1514 cyttsp4_stop_wd_timer(cd
);
1516 /* Wait until currently running IRQ handler exits and disable IRQ */
1517 disable_irq(cd
->irq
);
1519 dev_vdbg(cd
->dev
, "%s: write DEEP SLEEP...\n", __func__
);
1520 mutex_lock(&cd
->system_lock
);
1521 rc
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1523 mutex_unlock(&cd
->system_lock
);
1524 dev_err(cd
->dev
, "%s: Fail read adapter r=%d\n", __func__
, rc
);
1528 if (IS_BOOTLOADER(mode
[0], mode
[1])) {
1529 mutex_unlock(&cd
->system_lock
);
1530 dev_err(cd
->dev
, "%s: Device in BOOTLOADER mode.\n", __func__
);
1535 mode
[0] |= CY_HST_SLEEP
;
1536 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(mode
[0]), &mode
[0]);
1537 mutex_unlock(&cd
->system_lock
);
1539 dev_err(cd
->dev
, "%s: Fail write adapter r=%d\n", __func__
, rc
);
1542 dev_vdbg(cd
->dev
, "%s: write DEEP SLEEP succeeded\n", __func__
);
1544 if (cd
->cpdata
->power
) {
1545 dev_dbg(cd
->dev
, "%s: Power down HW\n", __func__
);
1546 rc
= cd
->cpdata
->power(cd
->cpdata
, 0, cd
->dev
, &cd
->ignore_irq
);
1548 dev_dbg(cd
->dev
, "%s: No power function\n", __func__
);
1552 dev_err(cd
->dev
, "%s: HW Power down fails r=%d\n",
1557 /* Give time to FW to sleep */
1564 int_status
= CY_INT_NONE
;
1565 cyttsp4_start_wd_timer(cd
);
1568 mutex_lock(&cd
->system_lock
);
1569 cd
->sleep_state
= ss
;
1570 cd
->int_status
|= int_status
;
1571 mutex_unlock(&cd
->system_lock
);
1572 enable_irq(cd
->irq
);
1576 static int cyttsp4_startup_(struct cyttsp4
*cd
)
1578 int retry
= CY_CORE_STARTUP_RETRY_COUNT
;
1581 cyttsp4_stop_wd_timer(cd
);
1584 if (retry
!= CY_CORE_STARTUP_RETRY_COUNT
)
1585 dev_dbg(cd
->dev
, "%s: Retry %d\n", __func__
,
1586 CY_CORE_STARTUP_RETRY_COUNT
- retry
);
1588 /* reset hardware and wait for heartbeat */
1589 rc
= cyttsp4_reset_and_wait(cd
);
1591 dev_err(cd
->dev
, "%s: Error on h/w reset r=%d\n", __func__
, rc
);
1597 /* exit bl into sysinfo mode */
1598 dev_vdbg(cd
->dev
, "%s: write exit ldr...\n", __func__
);
1599 mutex_lock(&cd
->system_lock
);
1600 cd
->int_status
&= ~CY_INT_IGNORE
;
1601 cd
->int_status
|= CY_INT_MODE_CHANGE
;
1603 rc
= cyttsp4_adap_write(cd
, CY_REG_BASE
, sizeof(ldr_exit
),
1605 mutex_unlock(&cd
->system_lock
);
1607 dev_err(cd
->dev
, "%s: Fail write r=%d\n", __func__
, rc
);
1613 rc
= cyttsp4_wait_sysinfo_mode(cd
);
1615 u8 buf
[sizeof(ldr_err_app
)];
1618 /* Check for invalid/corrupted touch application */
1619 rc1
= cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(ldr_err_app
),
1622 dev_err(cd
->dev
, "%s: Fail read r=%d\n", __func__
, rc1
);
1623 } else if (!memcmp(buf
, ldr_err_app
, sizeof(ldr_err_app
))) {
1624 dev_err(cd
->dev
, "%s: Error launching touch application\n",
1626 mutex_lock(&cd
->system_lock
);
1627 cd
->invalid_touch_app
= true;
1628 mutex_unlock(&cd
->system_lock
);
1637 mutex_lock(&cd
->system_lock
);
1638 cd
->invalid_touch_app
= false;
1639 mutex_unlock(&cd
->system_lock
);
1641 /* read sysinfo data */
1642 dev_vdbg(cd
->dev
, "%s: get sysinfo regs..\n", __func__
);
1643 rc
= cyttsp4_get_sysinfo_regs(cd
);
1645 dev_err(cd
->dev
, "%s: failed to get sysinfo regs rc=%d\n",
1652 rc
= cyttsp4_set_mode(cd
, CY_MODE_OPERATIONAL
);
1654 dev_err(cd
->dev
, "%s: failed to set mode to operational rc=%d\n",
1661 cyttsp4_lift_all(&cd
->md
);
1663 /* restore to sleep if was suspended */
1664 mutex_lock(&cd
->system_lock
);
1665 if (cd
->sleep_state
== SS_SLEEP_ON
) {
1666 cd
->sleep_state
= SS_SLEEP_OFF
;
1667 mutex_unlock(&cd
->system_lock
);
1668 cyttsp4_core_sleep_(cd
);
1671 mutex_unlock(&cd
->system_lock
);
1674 cyttsp4_start_wd_timer(cd
);
1679 static int cyttsp4_startup(struct cyttsp4
*cd
)
1683 mutex_lock(&cd
->system_lock
);
1684 cd
->startup_state
= STARTUP_RUNNING
;
1685 mutex_unlock(&cd
->system_lock
);
1687 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1688 CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
1690 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1691 __func__
, cd
->exclusive_dev
, cd
->dev
);
1695 rc
= cyttsp4_startup_(cd
);
1697 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1698 /* Don't return fail code, mode is already changed. */
1699 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1701 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1704 mutex_lock(&cd
->system_lock
);
1705 cd
->startup_state
= STARTUP_NONE
;
1706 mutex_unlock(&cd
->system_lock
);
1708 /* Wake the waiters for end of startup */
1709 wake_up(&cd
->wait_q
);
1714 static void cyttsp4_startup_work_function(struct work_struct
*work
)
1716 struct cyttsp4
*cd
= container_of(work
, struct cyttsp4
, startup_work
);
1719 rc
= cyttsp4_startup(cd
);
1721 dev_err(cd
->dev
, "%s: Fail queued startup r=%d\n",
1725 static void cyttsp4_free_si_ptrs(struct cyttsp4
*cd
)
1727 struct cyttsp4_sysinfo
*si
= &cd
->sysinfo
;
1732 kfree(si
->si_ptrs
.cydata
);
1733 kfree(si
->si_ptrs
.test
);
1734 kfree(si
->si_ptrs
.pcfg
);
1735 kfree(si
->si_ptrs
.opcfg
);
1736 kfree(si
->si_ptrs
.ddata
);
1737 kfree(si
->si_ptrs
.mdata
);
1741 kfree(si
->btn_rec_data
);
1745 static int cyttsp4_core_sleep(struct cyttsp4
*cd
)
1749 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1750 CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT
);
1752 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1753 __func__
, cd
->exclusive_dev
, cd
->dev
);
1757 rc
= cyttsp4_core_sleep_(cd
);
1759 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1760 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1762 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1767 static int cyttsp4_core_wake_(struct cyttsp4
*cd
)
1769 struct device
*dev
= cd
->dev
;
1774 /* Already woken? */
1775 mutex_lock(&cd
->system_lock
);
1776 if (cd
->sleep_state
== SS_SLEEP_OFF
) {
1777 mutex_unlock(&cd
->system_lock
);
1780 cd
->int_status
&= ~CY_INT_IGNORE
;
1781 cd
->int_status
|= CY_INT_AWAKE
;
1782 cd
->sleep_state
= SS_WAKING
;
1784 if (cd
->cpdata
->power
) {
1785 dev_dbg(dev
, "%s: Power up HW\n", __func__
);
1786 rc
= cd
->cpdata
->power(cd
->cpdata
, 1, dev
, &cd
->ignore_irq
);
1788 dev_dbg(dev
, "%s: No power function\n", __func__
);
1792 dev_err(dev
, "%s: HW Power up fails r=%d\n",
1795 /* Initiate a read transaction to wake up */
1796 cyttsp4_adap_read(cd
, CY_REG_BASE
, sizeof(mode
), &mode
);
1798 dev_vdbg(cd
->dev
, "%s: HW power up succeeds\n",
1800 mutex_unlock(&cd
->system_lock
);
1802 t
= wait_event_timeout(cd
->wait_q
,
1803 (cd
->int_status
& CY_INT_AWAKE
) == 0,
1804 msecs_to_jiffies(CY_CORE_WAKEUP_TIMEOUT
));
1806 dev_err(dev
, "%s: TMO waiting for wakeup\n", __func__
);
1807 mutex_lock(&cd
->system_lock
);
1808 cd
->int_status
&= ~CY_INT_AWAKE
;
1809 /* Try starting up */
1810 cyttsp4_queue_startup_(cd
);
1811 mutex_unlock(&cd
->system_lock
);
1814 mutex_lock(&cd
->system_lock
);
1815 cd
->sleep_state
= SS_SLEEP_OFF
;
1816 mutex_unlock(&cd
->system_lock
);
1818 cyttsp4_start_wd_timer(cd
);
1823 static int cyttsp4_core_wake(struct cyttsp4
*cd
)
1827 rc
= cyttsp4_request_exclusive(cd
, cd
->dev
,
1828 CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
1830 dev_err(cd
->dev
, "%s: fail get exclusive ex=%p own=%p\n",
1831 __func__
, cd
->exclusive_dev
, cd
->dev
);
1835 rc
= cyttsp4_core_wake_(cd
);
1837 if (cyttsp4_release_exclusive(cd
, cd
->dev
) < 0)
1838 dev_err(cd
->dev
, "%s: fail to release exclusive\n", __func__
);
1840 dev_vdbg(cd
->dev
, "%s: pass release exclusive\n", __func__
);
1845 static int cyttsp4_core_suspend(struct device
*dev
)
1847 struct cyttsp4
*cd
= dev_get_drvdata(dev
);
1848 struct cyttsp4_mt_data
*md
= &cd
->md
;
1851 md
->is_suspended
= true;
1853 rc
= cyttsp4_core_sleep(cd
);
1855 dev_err(dev
, "%s: Error on sleep\n", __func__
);
1861 static int cyttsp4_core_resume(struct device
*dev
)
1863 struct cyttsp4
*cd
= dev_get_drvdata(dev
);
1864 struct cyttsp4_mt_data
*md
= &cd
->md
;
1867 md
->is_suspended
= false;
1869 rc
= cyttsp4_core_wake(cd
);
1871 dev_err(dev
, "%s: Error on wake\n", __func__
);
1879 const struct dev_pm_ops cyttsp4_pm_ops
= {
1880 SET_SYSTEM_SLEEP_PM_OPS(cyttsp4_core_suspend
, cyttsp4_core_resume
)
1881 SET_RUNTIME_PM_OPS(cyttsp4_core_suspend
, cyttsp4_core_resume
, NULL
)
1883 EXPORT_SYMBOL_GPL(cyttsp4_pm_ops
);
1885 static int cyttsp4_mt_open(struct input_dev
*input
)
1887 pm_runtime_get(input
->dev
.parent
);
1891 static void cyttsp4_mt_close(struct input_dev
*input
)
1893 struct cyttsp4_mt_data
*md
= input_get_drvdata(input
);
1894 mutex_lock(&md
->report_lock
);
1895 if (!md
->is_suspended
)
1896 pm_runtime_put(input
->dev
.parent
);
1897 mutex_unlock(&md
->report_lock
);
1901 static int cyttsp4_setup_input_device(struct cyttsp4
*cd
)
1903 struct device
*dev
= cd
->dev
;
1904 struct cyttsp4_mt_data
*md
= &cd
->md
;
1905 int signal
= CY_IGNORE_VALUE
;
1906 int max_x
, max_y
, max_p
, min
, max
;
1907 int max_x_tmp
, max_y_tmp
;
1911 dev_vdbg(dev
, "%s: Initialize event signals\n", __func__
);
1912 __set_bit(EV_ABS
, md
->input
->evbit
);
1913 __set_bit(EV_REL
, md
->input
->evbit
);
1914 __set_bit(EV_KEY
, md
->input
->evbit
);
1916 max_x_tmp
= md
->si
->si_ofs
.max_x
;
1917 max_y_tmp
= md
->si
->si_ofs
.max_y
;
1919 /* get maximum values from the sysinfo data */
1920 if (md
->pdata
->flags
& CY_FLAG_FLIP
) {
1921 max_x
= max_y_tmp
- 1;
1922 max_y
= max_x_tmp
- 1;
1924 max_x
= max_x_tmp
- 1;
1925 max_y
= max_y_tmp
- 1;
1927 max_p
= md
->si
->si_ofs
.max_p
;
1929 /* set event signal capabilities */
1930 for (i
= 0; i
< (md
->pdata
->frmwrk
->size
/ CY_NUM_ABS_SET
); i
++) {
1931 signal
= md
->pdata
->frmwrk
->abs
1932 [(i
* CY_NUM_ABS_SET
) + CY_SIGNAL_OST
];
1933 if (signal
!= CY_IGNORE_VALUE
) {
1934 __set_bit(signal
, md
->input
->absbit
);
1935 min
= md
->pdata
->frmwrk
->abs
1936 [(i
* CY_NUM_ABS_SET
) + CY_MIN_OST
];
1937 max
= md
->pdata
->frmwrk
->abs
1938 [(i
* CY_NUM_ABS_SET
) + CY_MAX_OST
];
1939 if (i
== CY_ABS_ID_OST
) {
1940 /* shift track ids down to start at 0 */
1943 } else if (i
== CY_ABS_X_OST
)
1945 else if (i
== CY_ABS_Y_OST
)
1947 else if (i
== CY_ABS_P_OST
)
1949 input_set_abs_params(md
->input
, signal
, min
, max
,
1950 md
->pdata
->frmwrk
->abs
1951 [(i
* CY_NUM_ABS_SET
) + CY_FUZZ_OST
],
1952 md
->pdata
->frmwrk
->abs
1953 [(i
* CY_NUM_ABS_SET
) + CY_FLAT_OST
]);
1954 dev_dbg(dev
, "%s: register signal=%02X min=%d max=%d\n",
1955 __func__
, signal
, min
, max
);
1956 if ((i
== CY_ABS_ID_OST
) &&
1957 (md
->si
->si_ofs
.tch_rec_size
<
1958 CY_TMA4XX_TCH_REC_SIZE
))
1963 input_mt_init_slots(md
->input
, md
->si
->si_ofs
.tch_abs
[CY_TCH_T
].max
,
1965 rc
= input_register_device(md
->input
);
1967 dev_err(dev
, "%s: Error, failed register input device r=%d\n",
1972 static int cyttsp4_mt_probe(struct cyttsp4
*cd
)
1974 struct device
*dev
= cd
->dev
;
1975 struct cyttsp4_mt_data
*md
= &cd
->md
;
1976 struct cyttsp4_mt_platform_data
*pdata
= cd
->pdata
->mt_pdata
;
1979 mutex_init(&md
->report_lock
);
1981 /* Create the input device and register it. */
1982 dev_vdbg(dev
, "%s: Create the input device and register it\n",
1984 md
->input
= input_allocate_device();
1985 if (md
->input
== NULL
) {
1986 dev_err(dev
, "%s: Error, failed to allocate input device\n",
1989 goto error_alloc_failed
;
1992 md
->input
->name
= pdata
->inp_dev_name
;
1993 scnprintf(md
->phys
, sizeof(md
->phys
)-1, "%s", dev_name(dev
));
1994 md
->input
->phys
= md
->phys
;
1995 md
->input
->id
.bustype
= cd
->bus_ops
->bustype
;
1996 md
->input
->dev
.parent
= dev
;
1997 md
->input
->open
= cyttsp4_mt_open
;
1998 md
->input
->close
= cyttsp4_mt_close
;
1999 input_set_drvdata(md
->input
, md
);
2002 md
->si
= &cd
->sysinfo
;
2004 dev_err(dev
, "%s: Fail get sysinfo pointer from core p=%p\n",
2006 goto error_get_sysinfo
;
2009 rc
= cyttsp4_setup_input_device(cd
);
2011 goto error_init_input
;
2016 input_free_device(md
->input
);
2018 input_set_drvdata(md
->input
, NULL
);
2020 dev_err(dev
, "%s failed.\n", __func__
);
2024 struct cyttsp4
*cyttsp4_probe(const struct cyttsp4_bus_ops
*ops
,
2025 struct device
*dev
, u16 irq
, size_t xfer_buf_size
)
2028 struct cyttsp4_platform_data
*pdata
= dev_get_platdata(dev
);
2029 unsigned long irq_flags
;
2032 if (!pdata
|| !pdata
->core_pdata
|| !pdata
->mt_pdata
) {
2033 dev_err(dev
, "%s: Missing platform data\n", __func__
);
2035 goto error_no_pdata
;
2038 cd
= kzalloc(sizeof(*cd
), GFP_KERNEL
);
2040 dev_err(dev
, "%s: Error, kzalloc\n", __func__
);
2042 goto error_alloc_data
;
2045 cd
->xfer_buf
= kzalloc(xfer_buf_size
, GFP_KERNEL
);
2046 if (!cd
->xfer_buf
) {
2047 dev_err(dev
, "%s: Error, kzalloc\n", __func__
);
2052 /* Initialize device info */
2055 cd
->cpdata
= pdata
->core_pdata
;
2058 /* Initialize mutexes and spinlocks */
2059 mutex_init(&cd
->system_lock
);
2060 mutex_init(&cd
->adap_lock
);
2062 /* Initialize wait queue */
2063 init_waitqueue_head(&cd
->wait_q
);
2065 /* Initialize works */
2066 INIT_WORK(&cd
->startup_work
, cyttsp4_startup_work_function
);
2067 INIT_WORK(&cd
->watchdog_work
, cyttsp4_watchdog_work
);
2069 /* Initialize IRQ */
2070 cd
->irq
= gpio_to_irq(cd
->cpdata
->irq_gpio
);
2073 goto error_free_xfer
;
2076 dev_set_drvdata(dev
, cd
);
2078 /* Call platform init function */
2079 if (cd
->cpdata
->init
) {
2080 dev_dbg(cd
->dev
, "%s: Init HW\n", __func__
);
2081 rc
= cd
->cpdata
->init(cd
->cpdata
, 1, cd
->dev
);
2083 dev_dbg(cd
->dev
, "%s: No HW INIT function\n", __func__
);
2087 dev_err(cd
->dev
, "%s: HW Init fail r=%d\n", __func__
, rc
);
2089 dev_dbg(dev
, "%s: initialize threaded irq=%d\n", __func__
, cd
->irq
);
2090 if (cd
->cpdata
->level_irq_udelay
> 0)
2091 /* use level triggered interrupts */
2092 irq_flags
= IRQF_TRIGGER_LOW
| IRQF_ONESHOT
;
2094 /* use edge triggered interrupts */
2095 irq_flags
= IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
;
2097 rc
= request_threaded_irq(cd
->irq
, NULL
, cyttsp4_irq
, irq_flags
,
2100 dev_err(dev
, "%s: Error, could not request irq\n", __func__
);
2101 goto error_request_irq
;
2104 /* Setup watchdog timer */
2105 timer_setup(&cd
->watchdog_timer
, cyttsp4_watchdog_timer
, 0);
2108 * call startup directly to ensure that the device
2109 * is tested before leaving the probe
2111 rc
= cyttsp4_startup(cd
);
2113 /* Do not fail probe if startup fails but the device is detected */
2114 if (rc
< 0 && cd
->mode
== CY_MODE_UNKNOWN
) {
2115 dev_err(cd
->dev
, "%s: Fail initial startup r=%d\n",
2120 rc
= cyttsp4_mt_probe(cd
);
2122 dev_err(dev
, "%s: Error, fail mt probe\n", __func__
);
2126 pm_runtime_enable(dev
);
2131 cancel_work_sync(&cd
->startup_work
);
2132 cyttsp4_stop_wd_timer(cd
);
2133 pm_runtime_disable(dev
);
2134 cyttsp4_free_si_ptrs(cd
);
2135 free_irq(cd
->irq
, cd
);
2137 if (cd
->cpdata
->init
)
2138 cd
->cpdata
->init(cd
->cpdata
, 0, dev
);
2140 kfree(cd
->xfer_buf
);
2145 dev_err(dev
, "%s failed.\n", __func__
);
2148 EXPORT_SYMBOL_GPL(cyttsp4_probe
);
2150 static void cyttsp4_mt_release(struct cyttsp4_mt_data
*md
)
2152 input_unregister_device(md
->input
);
2153 input_set_drvdata(md
->input
, NULL
);
2156 int cyttsp4_remove(struct cyttsp4
*cd
)
2158 struct device
*dev
= cd
->dev
;
2160 cyttsp4_mt_release(&cd
->md
);
2163 * Suspend the device before freeing the startup_work and stopping
2164 * the watchdog since sleep function restarts watchdog on failure
2166 pm_runtime_suspend(dev
);
2167 pm_runtime_disable(dev
);
2169 cancel_work_sync(&cd
->startup_work
);
2171 cyttsp4_stop_wd_timer(cd
);
2173 free_irq(cd
->irq
, cd
);
2174 if (cd
->cpdata
->init
)
2175 cd
->cpdata
->init(cd
->cpdata
, 0, dev
);
2176 cyttsp4_free_si_ptrs(cd
);
2180 EXPORT_SYMBOL_GPL(cyttsp4_remove
);
2182 MODULE_LICENSE("GPL");
2183 MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard touchscreen core driver");
2184 MODULE_AUTHOR("Cypress");