Lines Matching +full:s +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
71 max = (CY_MAX_PRBUF_SIZE - 1) - sizeof(CY_PR_TRUNCATED); in cyttsp4_pr_buf()
77 dev_vdbg(dev, "%s: %s[0..%d]=%s%s\n", __func__, data_name, size - 1, in cyttsp4_pr_buf()
86 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_load_status_regs()
87 struct device *dev = cd->dev; in cyttsp4_load_status_regs()
90 rc = cyttsp4_adap_read(cd, CY_REG_BASE, si->si_ofs.mode_size, in cyttsp4_load_status_regs()
91 si->xy_mode); in cyttsp4_load_status_regs()
93 dev_err(dev, "%s: fail read mode regs r=%d\n", in cyttsp4_load_status_regs()
96 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_mode, in cyttsp4_load_status_regs()
97 si->si_ofs.mode_size, "xy_mode"); in cyttsp4_load_status_regs()
102 static int cyttsp4_handshake(struct cyttsp4 *cd, u8 mode) in cyttsp4_handshake() argument
104 u8 cmd = mode ^ CY_HST_TOGGLE; in cyttsp4_handshake()
108 * Mode change issued, handshaking now will cause endless mode change in cyttsp4_handshake()
109 * requests, for sync mode modechange will do same with handshake in cyttsp4_handshake()
111 if (mode & CY_HST_MODE_CHANGE) in cyttsp4_handshake()
116 dev_err(cd->dev, "%s: bus write fail on handshake (ret=%d)\n", in cyttsp4_handshake()
127 dev_err(cd->dev, "%s: FAILED to execute SOFT reset\n", in cyttsp4_hw_soft_reset()
136 if (cd->cpdata->xres) { in cyttsp4_hw_hard_reset()
137 cd->cpdata->xres(cd->cpdata, cd->dev); in cyttsp4_hw_hard_reset()
138 dev_dbg(cd->dev, "%s: execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
141 dev_err(cd->dev, "%s: FAILED to execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
142 return -ENOSYS; in cyttsp4_hw_hard_reset()
148 if (rc == -ENOSYS) in cyttsp4_hw_reset()
166 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_data_offsets()
167 int rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(si->si_data), in cyttsp4_si_data_offsets()
168 &si->si_data); in cyttsp4_si_data_offsets()
170 dev_err(cd->dev, "%s: fail read sysinfo data offsets r=%d\n", in cyttsp4_si_data_offsets()
176 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)&si->si_data, in cyttsp4_si_data_offsets()
177 sizeof(si->si_data), "sysinfo_data_offsets"); in cyttsp4_si_data_offsets()
181 si->si_ofs.map_sz = merge_bytes(si->si_data.map_szh, in cyttsp4_si_data_offsets()
182 si->si_data.map_szl); in cyttsp4_si_data_offsets()
183 si->si_ofs.map_sz = merge_bytes(si->si_data.map_szh, in cyttsp4_si_data_offsets()
184 si->si_data.map_szl); in cyttsp4_si_data_offsets()
185 si->si_ofs.cydata_ofs = merge_bytes(si->si_data.cydata_ofsh, in cyttsp4_si_data_offsets()
186 si->si_data.cydata_ofsl); in cyttsp4_si_data_offsets()
187 si->si_ofs.test_ofs = merge_bytes(si->si_data.test_ofsh, in cyttsp4_si_data_offsets()
188 si->si_data.test_ofsl); in cyttsp4_si_data_offsets()
189 si->si_ofs.pcfg_ofs = merge_bytes(si->si_data.pcfg_ofsh, in cyttsp4_si_data_offsets()
190 si->si_data.pcfg_ofsl); in cyttsp4_si_data_offsets()
191 si->si_ofs.opcfg_ofs = merge_bytes(si->si_data.opcfg_ofsh, in cyttsp4_si_data_offsets()
192 si->si_data.opcfg_ofsl); in cyttsp4_si_data_offsets()
193 si->si_ofs.ddata_ofs = merge_bytes(si->si_data.ddata_ofsh, in cyttsp4_si_data_offsets()
194 si->si_data.ddata_ofsl); in cyttsp4_si_data_offsets()
195 si->si_ofs.mdata_ofs = merge_bytes(si->si_data.mdata_ofsh, in cyttsp4_si_data_offsets()
196 si->si_data.mdata_ofsl); in cyttsp4_si_data_offsets()
202 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_cydata()
208 if (si->si_ofs.test_ofs <= si->si_ofs.cydata_ofs) { in cyttsp4_si_get_cydata()
209 dev_err(cd->dev, in cyttsp4_si_get_cydata()
210 "%s: invalid offset test_ofs: %zu, cydata_ofs: %zu\n", in cyttsp4_si_get_cydata()
211 __func__, si->si_ofs.test_ofs, si->si_ofs.cydata_ofs); in cyttsp4_si_get_cydata()
212 return -EINVAL; in cyttsp4_si_get_cydata()
215 si->si_ofs.cydata_size = si->si_ofs.test_ofs - si->si_ofs.cydata_ofs; in cyttsp4_si_get_cydata()
216 dev_dbg(cd->dev, "%s: cydata size: %zd\n", __func__, in cyttsp4_si_get_cydata()
217 si->si_ofs.cydata_size); in cyttsp4_si_get_cydata()
219 p = krealloc(si->si_ptrs.cydata, si->si_ofs.cydata_size, GFP_KERNEL); in cyttsp4_si_get_cydata()
221 dev_err(cd->dev, "%s: failed to allocate cydata memory\n", in cyttsp4_si_get_cydata()
223 return -ENOMEM; in cyttsp4_si_get_cydata()
225 si->si_ptrs.cydata = p; in cyttsp4_si_get_cydata()
227 read_offset = si->si_ofs.cydata_ofs; in cyttsp4_si_get_cydata()
232 + sizeof(si->si_ptrs.cydata->mfgid_sz), in cyttsp4_si_get_cydata()
233 si->si_ptrs.cydata); in cyttsp4_si_get_cydata()
235 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
241 mfgid_sz = si->si_ptrs.cydata->mfgid_sz; in cyttsp4_si_get_cydata()
242 calc_mfgid_sz = si->si_ofs.cydata_size - sizeof(struct cyttsp4_cydata); in cyttsp4_si_get_cydata()
244 dev_err(cd->dev, "%s: mismatch in MFGID size, reported:%d calculated:%d\n", in cyttsp4_si_get_cydata()
246 return -EINVAL; in cyttsp4_si_get_cydata()
250 + sizeof(si->si_ptrs.cydata->mfgid_sz); in cyttsp4_si_get_cydata()
253 rc = cyttsp4_adap_read(cd, read_offset, si->si_ptrs.cydata->mfgid_sz, in cyttsp4_si_get_cydata()
254 si->si_ptrs.cydata->mfg_id); in cyttsp4_si_get_cydata()
256 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
261 read_offset += si->si_ptrs.cydata->mfgid_sz; in cyttsp4_si_get_cydata()
266 - offsetof(struct cyttsp4_cydata, cyito_idh), in cyttsp4_si_get_cydata()
267 &si->si_ptrs.cydata->cyito_idh); in cyttsp4_si_get_cydata()
269 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
274 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.cydata, in cyttsp4_si_get_cydata()
275 si->si_ofs.cydata_size, "sysinfo_cydata"); in cyttsp4_si_get_cydata()
281 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_test_data()
285 if (si->si_ofs.pcfg_ofs <= si->si_ofs.test_ofs) { in cyttsp4_si_get_test_data()
286 dev_err(cd->dev, in cyttsp4_si_get_test_data()
287 "%s: invalid offset pcfg_ofs: %zu, test_ofs: %zu\n", in cyttsp4_si_get_test_data()
288 __func__, si->si_ofs.pcfg_ofs, si->si_ofs.test_ofs); in cyttsp4_si_get_test_data()
289 return -EINVAL; in cyttsp4_si_get_test_data()
292 si->si_ofs.test_size = si->si_ofs.pcfg_ofs - si->si_ofs.test_ofs; in cyttsp4_si_get_test_data()
294 p = krealloc(si->si_ptrs.test, si->si_ofs.test_size, GFP_KERNEL); in cyttsp4_si_get_test_data()
296 dev_err(cd->dev, "%s: failed to allocate test memory\n", in cyttsp4_si_get_test_data()
298 return -ENOMEM; in cyttsp4_si_get_test_data()
300 si->si_ptrs.test = p; in cyttsp4_si_get_test_data()
302 rc = cyttsp4_adap_read(cd, si->si_ofs.test_ofs, si->si_ofs.test_size, in cyttsp4_si_get_test_data()
303 si->si_ptrs.test); in cyttsp4_si_get_test_data()
305 dev_err(cd->dev, "%s: fail read test data r=%d\n", in cyttsp4_si_get_test_data()
310 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_test_data()
311 (u8 *)si->si_ptrs.test, si->si_ofs.test_size, in cyttsp4_si_get_test_data()
313 if (si->si_ptrs.test->post_codel & in cyttsp4_si_get_test_data()
315 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
317 si->si_ptrs.test->post_codel); in cyttsp4_si_get_test_data()
319 if (!(si->si_ptrs.test->post_codel & in cyttsp4_si_get_test_data()
321 dev_info(cd->dev, "%s: %s codel=%02X\n", __func__, in cyttsp4_si_get_test_data()
323 si->si_ptrs.test->post_codel); in cyttsp4_si_get_test_data()
325 if (!(si->si_ptrs.test->post_codel & in cyttsp4_si_get_test_data()
327 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
329 si->si_ptrs.test->post_codel); in cyttsp4_si_get_test_data()
331 dev_info(cd->dev, "%s: SCANNING is %s codel=%02X\n", in cyttsp4_si_get_test_data()
332 __func__, si->si_ptrs.test->post_codel & 0x08 ? in cyttsp4_si_get_test_data()
334 si->si_ptrs.test->post_codel); in cyttsp4_si_get_test_data()
340 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_pcfg_data()
344 if (si->si_ofs.opcfg_ofs <= si->si_ofs.pcfg_ofs) { in cyttsp4_si_get_pcfg_data()
345 dev_err(cd->dev, in cyttsp4_si_get_pcfg_data()
346 "%s: invalid offset opcfg_ofs: %zu, pcfg_ofs: %zu\n", in cyttsp4_si_get_pcfg_data()
347 __func__, si->si_ofs.opcfg_ofs, si->si_ofs.pcfg_ofs); in cyttsp4_si_get_pcfg_data()
348 return -EINVAL; in cyttsp4_si_get_pcfg_data()
351 si->si_ofs.pcfg_size = si->si_ofs.opcfg_ofs - si->si_ofs.pcfg_ofs; in cyttsp4_si_get_pcfg_data()
353 p = krealloc(si->si_ptrs.pcfg, si->si_ofs.pcfg_size, GFP_KERNEL); in cyttsp4_si_get_pcfg_data()
355 dev_err(cd->dev, "%s: failed to allocate pcfg memory\n", in cyttsp4_si_get_pcfg_data()
357 return -ENOMEM; in cyttsp4_si_get_pcfg_data()
359 si->si_ptrs.pcfg = p; in cyttsp4_si_get_pcfg_data()
361 rc = cyttsp4_adap_read(cd, si->si_ofs.pcfg_ofs, si->si_ofs.pcfg_size, in cyttsp4_si_get_pcfg_data()
362 si->si_ptrs.pcfg); in cyttsp4_si_get_pcfg_data()
364 dev_err(cd->dev, "%s: fail read pcfg data r=%d\n", in cyttsp4_si_get_pcfg_data()
369 si->si_ofs.max_x = merge_bytes((si->si_ptrs.pcfg->res_xh in cyttsp4_si_get_pcfg_data()
370 & CY_PCFG_RESOLUTION_X_MASK), si->si_ptrs.pcfg->res_xl); in cyttsp4_si_get_pcfg_data()
371 si->si_ofs.x_origin = !!(si->si_ptrs.pcfg->res_xh in cyttsp4_si_get_pcfg_data()
373 si->si_ofs.max_y = merge_bytes((si->si_ptrs.pcfg->res_yh in cyttsp4_si_get_pcfg_data()
374 & CY_PCFG_RESOLUTION_Y_MASK), si->si_ptrs.pcfg->res_yl); in cyttsp4_si_get_pcfg_data()
375 si->si_ofs.y_origin = !!(si->si_ptrs.pcfg->res_yh in cyttsp4_si_get_pcfg_data()
377 si->si_ofs.max_p = merge_bytes(si->si_ptrs.pcfg->max_zh, in cyttsp4_si_get_pcfg_data()
378 si->si_ptrs.pcfg->max_zl); in cyttsp4_si_get_pcfg_data()
380 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_pcfg_data()
381 (u8 *)si->si_ptrs.pcfg, in cyttsp4_si_get_pcfg_data()
382 si->si_ofs.pcfg_size, "sysinfo_pcfg_data"); in cyttsp4_si_get_pcfg_data()
388 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_opcfg_data()
396 if (si->si_ofs.ddata_ofs <= si->si_ofs.opcfg_ofs) { in cyttsp4_si_get_opcfg_data()
397 dev_err(cd->dev, in cyttsp4_si_get_opcfg_data()
398 "%s: invalid offset ddata_ofs: %zu, opcfg_ofs: %zu\n", in cyttsp4_si_get_opcfg_data()
399 __func__, si->si_ofs.ddata_ofs, si->si_ofs.opcfg_ofs); in cyttsp4_si_get_opcfg_data()
400 return -EINVAL; in cyttsp4_si_get_opcfg_data()
403 si->si_ofs.opcfg_size = si->si_ofs.ddata_ofs - si->si_ofs.opcfg_ofs; in cyttsp4_si_get_opcfg_data()
405 p = krealloc(si->si_ptrs.opcfg, si->si_ofs.opcfg_size, GFP_KERNEL); in cyttsp4_si_get_opcfg_data()
407 dev_err(cd->dev, "%s: failed to allocate opcfg memory\n", in cyttsp4_si_get_opcfg_data()
409 return -ENOMEM; in cyttsp4_si_get_opcfg_data()
411 si->si_ptrs.opcfg = p; in cyttsp4_si_get_opcfg_data()
413 rc = cyttsp4_adap_read(cd, si->si_ofs.opcfg_ofs, si->si_ofs.opcfg_size, in cyttsp4_si_get_opcfg_data()
414 si->si_ptrs.opcfg); in cyttsp4_si_get_opcfg_data()
416 dev_err(cd->dev, "%s: fail read opcfg data r=%d\n", in cyttsp4_si_get_opcfg_data()
420 si->si_ofs.cmd_ofs = si->si_ptrs.opcfg->cmd_ofs; in cyttsp4_si_get_opcfg_data()
421 si->si_ofs.rep_ofs = si->si_ptrs.opcfg->rep_ofs; in cyttsp4_si_get_opcfg_data()
422 si->si_ofs.rep_sz = (si->si_ptrs.opcfg->rep_szh * 256) + in cyttsp4_si_get_opcfg_data()
423 si->si_ptrs.opcfg->rep_szl; in cyttsp4_si_get_opcfg_data()
424 si->si_ofs.num_btns = si->si_ptrs.opcfg->num_btns; in cyttsp4_si_get_opcfg_data()
425 si->si_ofs.num_btn_regs = (si->si_ofs.num_btns + in cyttsp4_si_get_opcfg_data()
426 CY_NUM_BTN_PER_REG - 1) / CY_NUM_BTN_PER_REG; in cyttsp4_si_get_opcfg_data()
427 si->si_ofs.tt_stat_ofs = si->si_ptrs.opcfg->tt_stat_ofs; in cyttsp4_si_get_opcfg_data()
428 si->si_ofs.obj_cfg0 = si->si_ptrs.opcfg->obj_cfg0; in cyttsp4_si_get_opcfg_data()
429 si->si_ofs.max_tchs = si->si_ptrs.opcfg->max_tchs & in cyttsp4_si_get_opcfg_data()
431 si->si_ofs.tch_rec_size = si->si_ptrs.opcfg->tch_rec_size & in cyttsp4_si_get_opcfg_data()
436 tch = &si->si_ofs.tch_abs[abs]; in cyttsp4_si_get_opcfg_data()
437 tch_old = &si->si_ptrs.opcfg->tch_rec_old[abs]; in cyttsp4_si_get_opcfg_data()
439 tch->ofs = tch_old->loc & CY_BYTE_OFS_MASK; in cyttsp4_si_get_opcfg_data()
440 tch->size = cyttsp4_bits_2_bytes(tch_old->size, in cyttsp4_si_get_opcfg_data()
441 &tch->max); in cyttsp4_si_get_opcfg_data()
442 tch->bofs = (tch_old->loc & CY_BOFS_MASK) >> CY_BOFS_SHIFT; in cyttsp4_si_get_opcfg_data()
446 si->si_ofs.btn_rec_size = si->si_ptrs.opcfg->btn_rec_size; in cyttsp4_si_get_opcfg_data()
447 si->si_ofs.btn_diff_ofs = si->si_ptrs.opcfg->btn_diff_ofs; in cyttsp4_si_get_opcfg_data()
448 si->si_ofs.btn_diff_size = si->si_ptrs.opcfg->btn_diff_size; in cyttsp4_si_get_opcfg_data()
450 if (si->si_ofs.tch_rec_size > CY_TMA1036_TCH_REC_SIZE) { in cyttsp4_si_get_opcfg_data()
453 tch = &si->si_ofs.tch_abs[abs]; in cyttsp4_si_get_opcfg_data()
454 tch_new = &si->si_ptrs.opcfg->tch_rec_new[i]; in cyttsp4_si_get_opcfg_data()
456 tch->ofs = tch_new->loc & CY_BYTE_OFS_MASK; in cyttsp4_si_get_opcfg_data()
457 tch->size = cyttsp4_bits_2_bytes(tch_new->size, in cyttsp4_si_get_opcfg_data()
458 &tch->max); in cyttsp4_si_get_opcfg_data()
459 tch->bofs = (tch_new->loc & CY_BOFS_MASK) >> CY_BOFS_SHIFT; in cyttsp4_si_get_opcfg_data()
464 dev_dbg(cd->dev, "%s: tch_rec_%s\n", __func__, in cyttsp4_si_get_opcfg_data()
466 dev_dbg(cd->dev, "%s: ofs =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
467 si->si_ofs.tch_abs[abs].ofs); in cyttsp4_si_get_opcfg_data()
468 dev_dbg(cd->dev, "%s: siz =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
469 si->si_ofs.tch_abs[abs].size); in cyttsp4_si_get_opcfg_data()
470 dev_dbg(cd->dev, "%s: max =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
471 si->si_ofs.tch_abs[abs].max); in cyttsp4_si_get_opcfg_data()
472 dev_dbg(cd->dev, "%s: bofs=%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
473 si->si_ofs.tch_abs[abs].bofs); in cyttsp4_si_get_opcfg_data()
476 si->si_ofs.mode_size = si->si_ofs.tt_stat_ofs + 1; in cyttsp4_si_get_opcfg_data()
477 si->si_ofs.data_size = si->si_ofs.max_tchs * in cyttsp4_si_get_opcfg_data()
478 si->si_ptrs.opcfg->tch_rec_size; in cyttsp4_si_get_opcfg_data()
480 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.opcfg, in cyttsp4_si_get_opcfg_data()
481 si->si_ofs.opcfg_size, "sysinfo_opcfg_data"); in cyttsp4_si_get_opcfg_data()
488 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_ddata()
492 si->si_ofs.ddata_size = si->si_ofs.mdata_ofs - si->si_ofs.ddata_ofs; in cyttsp4_si_get_ddata()
494 p = krealloc(si->si_ptrs.ddata, si->si_ofs.ddata_size, GFP_KERNEL); in cyttsp4_si_get_ddata()
496 dev_err(cd->dev, "%s: fail alloc ddata memory\n", __func__); in cyttsp4_si_get_ddata()
497 return -ENOMEM; in cyttsp4_si_get_ddata()
499 si->si_ptrs.ddata = p; in cyttsp4_si_get_ddata()
501 rc = cyttsp4_adap_read(cd, si->si_ofs.ddata_ofs, si->si_ofs.ddata_size, in cyttsp4_si_get_ddata()
502 si->si_ptrs.ddata); in cyttsp4_si_get_ddata()
504 dev_err(cd->dev, "%s: fail read ddata data r=%d\n", in cyttsp4_si_get_ddata()
507 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_ddata()
508 (u8 *)si->si_ptrs.ddata, in cyttsp4_si_get_ddata()
509 si->si_ofs.ddata_size, "sysinfo_ddata"); in cyttsp4_si_get_ddata()
515 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_mdata()
519 si->si_ofs.mdata_size = si->si_ofs.map_sz - si->si_ofs.mdata_ofs; in cyttsp4_si_get_mdata()
521 p = krealloc(si->si_ptrs.mdata, si->si_ofs.mdata_size, GFP_KERNEL); in cyttsp4_si_get_mdata()
523 dev_err(cd->dev, "%s: fail alloc mdata memory\n", __func__); in cyttsp4_si_get_mdata()
524 return -ENOMEM; in cyttsp4_si_get_mdata()
526 si->si_ptrs.mdata = p; in cyttsp4_si_get_mdata()
528 rc = cyttsp4_adap_read(cd, si->si_ofs.mdata_ofs, si->si_ofs.mdata_size, in cyttsp4_si_get_mdata()
529 si->si_ptrs.mdata); in cyttsp4_si_get_mdata()
531 dev_err(cd->dev, "%s: fail read mdata data r=%d\n", in cyttsp4_si_get_mdata()
534 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_mdata()
535 (u8 *)si->si_ptrs.mdata, in cyttsp4_si_get_mdata()
536 si->si_ofs.mdata_size, "sysinfo_mdata"); in cyttsp4_si_get_mdata()
542 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_btn_data()
549 if (si->si_ofs.num_btns) { in cyttsp4_si_get_btn_data()
550 si->si_ofs.btn_keys_size = si->si_ofs.num_btns * in cyttsp4_si_get_btn_data()
553 p = krealloc(si->btn, si->si_ofs.btn_keys_size, in cyttsp4_si_get_btn_data()
556 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_si_get_btn_data()
558 return -ENOMEM; in cyttsp4_si_get_btn_data()
560 si->btn = p; in cyttsp4_si_get_btn_data()
562 if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS] == NULL) in cyttsp4_si_get_btn_data()
564 else if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS]->data == NULL) in cyttsp4_si_get_btn_data()
567 num_defined_keys = cd->cpdata->sett in cyttsp4_si_get_btn_data()
568 [CY_IC_GRPNUM_BTN_KEYS]->size; in cyttsp4_si_get_btn_data()
570 for (btn = 0; btn < si->si_ofs.num_btns && in cyttsp4_si_get_btn_data()
572 key_table = (u16 *)cd->cpdata->sett in cyttsp4_si_get_btn_data()
573 [CY_IC_GRPNUM_BTN_KEYS]->data; in cyttsp4_si_get_btn_data()
574 si->btn[btn].key_code = key_table[btn]; in cyttsp4_si_get_btn_data()
575 si->btn[btn].state = CY_BTN_RELEASED; in cyttsp4_si_get_btn_data()
576 si->btn[btn].enabled = true; in cyttsp4_si_get_btn_data()
578 for (; btn < si->si_ofs.num_btns; btn++) { in cyttsp4_si_get_btn_data()
579 si->btn[btn].key_code = KEY_RESERVED; in cyttsp4_si_get_btn_data()
580 si->btn[btn].state = CY_BTN_RELEASED; in cyttsp4_si_get_btn_data()
581 si->btn[btn].enabled = true; in cyttsp4_si_get_btn_data()
587 si->si_ofs.btn_keys_size = 0; in cyttsp4_si_get_btn_data()
588 kfree(si->btn); in cyttsp4_si_get_btn_data()
589 si->btn = NULL; in cyttsp4_si_get_btn_data()
595 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_op_data_ptrs()
598 p = krealloc(si->xy_mode, si->si_ofs.mode_size, GFP_KERNEL|__GFP_ZERO); in cyttsp4_si_get_op_data_ptrs()
600 return -ENOMEM; in cyttsp4_si_get_op_data_ptrs()
601 si->xy_mode = p; in cyttsp4_si_get_op_data_ptrs()
603 p = krealloc(si->xy_data, si->si_ofs.data_size, GFP_KERNEL|__GFP_ZERO); in cyttsp4_si_get_op_data_ptrs()
605 return -ENOMEM; in cyttsp4_si_get_op_data_ptrs()
606 si->xy_data = p; in cyttsp4_si_get_op_data_ptrs()
608 p = krealloc(si->btn_rec_data, in cyttsp4_si_get_op_data_ptrs()
609 si->si_ofs.btn_rec_size * si->si_ofs.num_btns, in cyttsp4_si_get_op_data_ptrs()
612 return -ENOMEM; in cyttsp4_si_get_op_data_ptrs()
613 si->btn_rec_data = p; in cyttsp4_si_get_op_data_ptrs()
620 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_put_log_data()
621 dev_dbg(cd->dev, "%s: cydata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
622 si->si_ofs.cydata_ofs, si->si_ofs.cydata_size); in cyttsp4_si_put_log_data()
623 dev_dbg(cd->dev, "%s: test_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
624 si->si_ofs.test_ofs, si->si_ofs.test_size); in cyttsp4_si_put_log_data()
625 dev_dbg(cd->dev, "%s: pcfg_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
626 si->si_ofs.pcfg_ofs, si->si_ofs.pcfg_size); in cyttsp4_si_put_log_data()
627 dev_dbg(cd->dev, "%s: opcfg_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
628 si->si_ofs.opcfg_ofs, si->si_ofs.opcfg_size); in cyttsp4_si_put_log_data()
629 dev_dbg(cd->dev, "%s: ddata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
630 si->si_ofs.ddata_ofs, si->si_ofs.ddata_size); in cyttsp4_si_put_log_data()
631 dev_dbg(cd->dev, "%s: mdata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
632 si->si_ofs.mdata_ofs, si->si_ofs.mdata_size); in cyttsp4_si_put_log_data()
634 dev_dbg(cd->dev, "%s: cmd_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
635 si->si_ofs.cmd_ofs); in cyttsp4_si_put_log_data()
636 dev_dbg(cd->dev, "%s: rep_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
637 si->si_ofs.rep_ofs); in cyttsp4_si_put_log_data()
638 dev_dbg(cd->dev, "%s: rep_sz =%4zd\n", __func__, in cyttsp4_si_put_log_data()
639 si->si_ofs.rep_sz); in cyttsp4_si_put_log_data()
640 dev_dbg(cd->dev, "%s: num_btns =%4zd\n", __func__, in cyttsp4_si_put_log_data()
641 si->si_ofs.num_btns); in cyttsp4_si_put_log_data()
642 dev_dbg(cd->dev, "%s: num_btn_regs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
643 si->si_ofs.num_btn_regs); in cyttsp4_si_put_log_data()
644 dev_dbg(cd->dev, "%s: tt_stat_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
645 si->si_ofs.tt_stat_ofs); in cyttsp4_si_put_log_data()
646 dev_dbg(cd->dev, "%s: tch_rec_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
647 si->si_ofs.tch_rec_size); in cyttsp4_si_put_log_data()
648 dev_dbg(cd->dev, "%s: max_tchs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
649 si->si_ofs.max_tchs); in cyttsp4_si_put_log_data()
650 dev_dbg(cd->dev, "%s: mode_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
651 si->si_ofs.mode_size); in cyttsp4_si_put_log_data()
652 dev_dbg(cd->dev, "%s: data_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
653 si->si_ofs.data_size); in cyttsp4_si_put_log_data()
654 dev_dbg(cd->dev, "%s: map_sz =%4zd\n", __func__, in cyttsp4_si_put_log_data()
655 si->si_ofs.map_sz); in cyttsp4_si_put_log_data()
657 dev_dbg(cd->dev, "%s: btn_rec_size =%2zd\n", __func__, in cyttsp4_si_put_log_data()
658 si->si_ofs.btn_rec_size); in cyttsp4_si_put_log_data()
659 dev_dbg(cd->dev, "%s: btn_diff_ofs =%2zd\n", __func__, in cyttsp4_si_put_log_data()
660 si->si_ofs.btn_diff_ofs); in cyttsp4_si_put_log_data()
661 dev_dbg(cd->dev, "%s: btn_diff_size =%2zd\n", __func__, in cyttsp4_si_put_log_data()
662 si->si_ofs.btn_diff_size); in cyttsp4_si_put_log_data()
664 dev_dbg(cd->dev, "%s: max_x = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
665 si->si_ofs.max_x, si->si_ofs.max_x); in cyttsp4_si_put_log_data()
666 dev_dbg(cd->dev, "%s: x_origin = %zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
667 si->si_ofs.x_origin, in cyttsp4_si_put_log_data()
668 si->si_ofs.x_origin == CY_NORMAL_ORIGIN ? in cyttsp4_si_put_log_data()
670 dev_dbg(cd->dev, "%s: max_y = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
671 si->si_ofs.max_y, si->si_ofs.max_y); in cyttsp4_si_put_log_data()
672 dev_dbg(cd->dev, "%s: y_origin = %zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
673 si->si_ofs.y_origin, in cyttsp4_si_put_log_data()
674 si->si_ofs.y_origin == CY_NORMAL_ORIGIN ? in cyttsp4_si_put_log_data()
676 dev_dbg(cd->dev, "%s: max_p = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
677 si->si_ofs.max_p, si->si_ofs.max_p); in cyttsp4_si_put_log_data()
679 dev_dbg(cd->dev, "%s: xy_mode=%p xy_data=%p\n", __func__, in cyttsp4_si_put_log_data()
680 si->xy_mode, si->xy_data); in cyttsp4_si_put_log_data()
685 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_get_sysinfo_regs()
722 dev_err(cd->dev, "%s: failed to get_op_data\n", in cyttsp4_get_sysinfo_regs()
730 rc = cyttsp4_handshake(cd, si->si_data.hst_mode); in cyttsp4_get_sysinfo_regs()
732 dev_err(cd->dev, "%s: handshake fail on sysinfo reg\n", in cyttsp4_get_sysinfo_regs()
735 si->ready = true; in cyttsp4_get_sysinfo_regs()
741 if (cd->startup_state == STARTUP_NONE) { in cyttsp4_queue_startup_()
742 cd->startup_state = STARTUP_QUEUED; in cyttsp4_queue_startup_()
743 schedule_work(&cd->startup_work); in cyttsp4_queue_startup_()
744 dev_dbg(cd->dev, "%s: cyttsp4_startup queued\n", __func__); in cyttsp4_queue_startup_()
746 dev_dbg(cd->dev, "%s: startup_state = %d\n", __func__, in cyttsp4_queue_startup_()
747 cd->startup_state); in cyttsp4_queue_startup_()
756 if (md->num_prv_tch == 0) in cyttsp4_report_slot_liftoff()
760 input_mt_slot(md->input, t); in cyttsp4_report_slot_liftoff()
761 input_mt_report_slot_inactive(md->input); in cyttsp4_report_slot_liftoff()
767 if (!md->si) in cyttsp4_lift_all()
770 if (md->num_prv_tch != 0) { in cyttsp4_lift_all()
772 md->si->si_ofs.tch_abs[CY_TCH_T].max); in cyttsp4_lift_all()
773 input_sync(md->input); in cyttsp4_lift_all()
774 md->num_prv_tch = 0; in cyttsp4_lift_all()
785 dev_vdbg(&md->input->dev, in cyttsp4_get_touch_axis()
786 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p" in cyttsp4_get_touch_axis()
794 *axis &= max - 1; in cyttsp4_get_touch_axis()
796 dev_vdbg(&md->input->dev, in cyttsp4_get_touch_axis()
797 "%s: *axis=%02X(%d) size=%d max=%08X xy_data=%p" in cyttsp4_get_touch_axis()
806 struct device *dev = &md->input->dev; in cyttsp4_get_touch()
807 struct cyttsp4_sysinfo *si = md->si; in cyttsp4_get_touch()
812 cyttsp4_get_touch_axis(md, &touch->abs[abs], in cyttsp4_get_touch()
813 si->si_ofs.tch_abs[abs].size, in cyttsp4_get_touch()
814 si->si_ofs.tch_abs[abs].max, in cyttsp4_get_touch()
815 xy_data + si->si_ofs.tch_abs[abs].ofs, in cyttsp4_get_touch()
816 si->si_ofs.tch_abs[abs].bofs); in cyttsp4_get_touch()
817 dev_vdbg(dev, "%s: get %s=%04X(%d)\n", __func__, in cyttsp4_get_touch()
819 touch->abs[abs], touch->abs[abs]); in cyttsp4_get_touch()
822 if (md->pdata->flags & CY_FLAG_FLIP) { in cyttsp4_get_touch()
823 swap(touch->abs[CY_TCH_X], touch->abs[CY_TCH_Y]); in cyttsp4_get_touch()
828 if (md->pdata->flags & CY_FLAG_INV_X) { in cyttsp4_get_touch()
830 touch->abs[CY_TCH_X] = md->si->si_ofs.max_y - in cyttsp4_get_touch()
831 touch->abs[CY_TCH_X]; in cyttsp4_get_touch()
833 touch->abs[CY_TCH_X] = md->si->si_ofs.max_x - in cyttsp4_get_touch()
834 touch->abs[CY_TCH_X]; in cyttsp4_get_touch()
836 if (md->pdata->flags & CY_FLAG_INV_Y) { in cyttsp4_get_touch()
838 touch->abs[CY_TCH_Y] = md->si->si_ofs.max_x - in cyttsp4_get_touch()
839 touch->abs[CY_TCH_Y]; in cyttsp4_get_touch()
841 touch->abs[CY_TCH_Y] = md->si->si_ofs.max_y - in cyttsp4_get_touch()
842 touch->abs[CY_TCH_Y]; in cyttsp4_get_touch()
845 dev_vdbg(dev, "%s: flip=%s inv-x=%s inv-y=%s x=%04X(%d) y=%04X(%d)\n", in cyttsp4_get_touch()
847 md->pdata->flags & CY_FLAG_INV_X ? "true" : "false", in cyttsp4_get_touch()
848 md->pdata->flags & CY_FLAG_INV_Y ? "true" : "false", in cyttsp4_get_touch()
849 touch->abs[CY_TCH_X], touch->abs[CY_TCH_X], in cyttsp4_get_touch()
850 touch->abs[CY_TCH_Y], touch->abs[CY_TCH_Y]); in cyttsp4_get_touch()
869 struct device *dev = &md->input->dev; in cyttsp4_get_mt_touches()
870 struct cyttsp4_sysinfo *si = md->si; in cyttsp4_get_mt_touches()
876 memset(ids, 0, si->si_ofs.tch_abs[CY_TCH_T].max * sizeof(int)); in cyttsp4_get_mt_touches()
878 cyttsp4_get_touch(md, &tch, si->xy_data + in cyttsp4_get_mt_touches()
879 (i * si->si_ofs.tch_rec_size)); in cyttsp4_get_mt_touches()
880 if ((tch.abs[CY_TCH_T] < md->pdata->frmwrk->abs in cyttsp4_get_mt_touches()
882 (tch.abs[CY_TCH_T] > md->pdata->frmwrk->abs in cyttsp4_get_mt_touches()
884 dev_err(dev, "%s: tch=%d -> bad trk_id=%d max_id=%d\n", in cyttsp4_get_mt_touches()
886 md->pdata->frmwrk->abs[(CY_ABS_ID_OST * in cyttsp4_get_mt_touches()
891 /* use 0 based track id's */ in cyttsp4_get_mt_touches()
892 sig = md->pdata->frmwrk->abs in cyttsp4_get_mt_touches()
895 t = tch.abs[CY_TCH_T] - md->pdata->frmwrk->abs in cyttsp4_get_mt_touches()
898 dev_dbg(dev, "%s: t=%d e=%d lift-off\n", in cyttsp4_get_mt_touches()
902 input_mt_slot(md->input, t); in cyttsp4_get_mt_touches()
903 input_mt_report_slot_state(md->input, MT_TOOL_FINGER, in cyttsp4_get_mt_touches()
910 sig = md->pdata->frmwrk->abs[((CY_ABS_X_OST + j) * in cyttsp4_get_mt_touches()
913 input_report_abs(md->input, sig, in cyttsp4_get_mt_touches()
916 if (si->si_ofs.tch_rec_size > CY_TMA1036_TCH_REC_SIZE) { in cyttsp4_get_mt_touches()
919 * if pressure is non-zero and major touch in cyttsp4_get_mt_touches()
921 * signals to minimum non-zero value in cyttsp4_get_mt_touches()
928 sig = md->pdata->frmwrk->abs in cyttsp4_get_mt_touches()
932 input_report_abs(md->input, sig, in cyttsp4_get_mt_touches()
938 if (si->si_ofs.tch_rec_size > CY_TMA1036_TCH_REC_SIZE) in cyttsp4_get_mt_touches()
940 "%s: t=%d x=%d y=%d z=%d M=%d m=%d o=%d e=%d\n", in cyttsp4_get_mt_touches()
951 "%s: t=%d x=%d y=%d z=%d e=%d\n", __func__, in cyttsp4_get_mt_touches()
959 cyttsp4_final_sync(md->input, si->si_ofs.tch_abs[CY_TCH_T].max, ids); in cyttsp4_get_mt_touches()
961 md->num_prv_tch = num_cur_tch; in cyttsp4_get_mt_touches()
969 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_xy_worker()
970 struct device *dev = &md->input->dev; in cyttsp4_xy_worker()
971 struct cyttsp4_sysinfo *si = md->si; in cyttsp4_xy_worker()
987 * 1st read to get mode + button bytes + touch count (core) in cyttsp4_xy_worker()
988 * 2nd read (optional) to get touch 1 - touch n data in cyttsp4_xy_worker()
990 hst_mode = si->xy_mode[CY_REG_BASE]; in cyttsp4_xy_worker()
991 rep_len = si->xy_mode[si->si_ofs.rep_ofs]; in cyttsp4_xy_worker()
992 rep_stat = si->xy_mode[si->si_ofs.rep_ofs + 1]; in cyttsp4_xy_worker()
993 tt_stat = si->xy_mode[si->si_ofs.tt_stat_ofs]; in cyttsp4_xy_worker()
994 dev_vdbg(dev, "%s: %s%02X %s%d %s%02X %s%02X\n", __func__, in cyttsp4_xy_worker()
999 dev_vdbg(dev, "%s: num_cur_tch=%d\n", __func__, num_cur_tch); in cyttsp4_xy_worker()
1002 dev_err(dev, "%s: report length error rep_len=%d num_tch=%d\n", in cyttsp4_xy_worker()
1009 rc = cyttsp4_adap_read(cd, si->si_ofs.tt_stat_ofs + 1, in cyttsp4_xy_worker()
1010 num_cur_tch * si->si_ofs.tch_rec_size, in cyttsp4_xy_worker()
1011 si->xy_data); in cyttsp4_xy_worker()
1013 dev_err(dev, "%s: read fail on touch regs r=%d\n", in cyttsp4_xy_worker()
1020 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_data, num_cur_tch * in cyttsp4_xy_worker()
1021 si->si_ofs.tch_rec_size, "xy_data"); in cyttsp4_xy_worker()
1025 dev_dbg(dev, "%s: Invalid buffer detected\n", __func__); in cyttsp4_xy_worker()
1031 dev_dbg(dev, "%s: Large area detected\n", __func__); in cyttsp4_xy_worker()
1033 if (num_cur_tch > si->si_ofs.max_tchs) { in cyttsp4_xy_worker()
1034 dev_err(dev, "%s: too many tch; set to max tch (n=%d c=%zd)\n", in cyttsp4_xy_worker()
1035 __func__, num_cur_tch, si->si_ofs.max_tchs); in cyttsp4_xy_worker()
1036 num_cur_tch = si->si_ofs.max_tchs; in cyttsp4_xy_worker()
1040 dev_vdbg(dev, "%s: extract data num_cur_tch=%d\n", __func__, in cyttsp4_xy_worker()
1055 struct device *dev = cd->dev; in cyttsp4_mt_attention()
1056 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_attention()
1059 if (!md->si) in cyttsp4_mt_attention()
1062 mutex_lock(&md->report_lock); in cyttsp4_mt_attention()
1063 if (!md->is_suspended) { in cyttsp4_mt_attention()
1067 dev_vdbg(dev, "%s: Ignoring report while suspended\n", in cyttsp4_mt_attention()
1070 mutex_unlock(&md->report_lock); in cyttsp4_mt_attention()
1072 dev_err(dev, "%s: xy_worker error r=%d\n", __func__, rc); in cyttsp4_mt_attention()
1080 struct device *dev = cd->dev; in cyttsp4_irq()
1082 u8 cmd_ofs = cd->sysinfo.si_ofs.cmd_ofs; in cyttsp4_irq()
1083 u8 mode[3]; in cyttsp4_irq() local
1091 if (atomic_read(&cd->ignore_irq)) { in cyttsp4_irq()
1092 dev_vdbg(dev, "%s: Ignoring IRQ\n", __func__); in cyttsp4_irq()
1096 dev_dbg(dev, "%s int:0x%x\n", __func__, cd->int_status); in cyttsp4_irq()
1098 mutex_lock(&cd->system_lock); in cyttsp4_irq()
1101 if (cd->sleep_state == SS_SLEEP_ON || cd->sleep_state == SS_SLEEPING) in cyttsp4_irq()
1102 dev_vdbg(dev, "%s: Received IRQ while in sleep\n", __func__); in cyttsp4_irq()
1104 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), mode); in cyttsp4_irq()
1106 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_irq()
1109 dev_vdbg(dev, "%s mode[0-2]:0x%X 0x%X 0x%X\n", __func__, in cyttsp4_irq()
1110 mode[0], mode[1], mode[2]); in cyttsp4_irq()
1112 if (IS_BOOTLOADER(mode[0], mode[1])) { in cyttsp4_irq()
1114 dev_vdbg(dev, "%s: bl running\n", __func__); in cyttsp4_irq()
1115 if (cd->mode == CY_MODE_BOOTLOADER) { in cyttsp4_irq()
1117 wake_up(&cd->wait_q); in cyttsp4_irq()
1122 dev_dbg(dev, "%s: restart switch to bl m=%d -> m=%d\n", in cyttsp4_irq()
1123 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1125 /* catch operation->bl glitch */ in cyttsp4_irq()
1126 if (cd->mode != CY_MODE_UNKNOWN) { in cyttsp4_irq()
1128 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_irq()
1138 cd->mode = cur_mode; in cyttsp4_irq()
1143 switch (mode[0] & CY_HST_MODE) { in cyttsp4_irq()
1146 dev_vdbg(dev, "%s: operational\n", __func__); in cyttsp4_irq()
1150 dev_vdbg(dev, "%s: CaT\n", __func__); in cyttsp4_irq()
1154 dev_vdbg(dev, "%s: sysinfo\n", __func__); in cyttsp4_irq()
1158 dev_err(dev, "%s: unknown HST mode 0x%02X\n", __func__, in cyttsp4_irq()
1159 mode[0]); in cyttsp4_irq()
1164 if (cd->int_status & CY_INT_IGNORE) { in cyttsp4_irq()
1165 dev_vdbg(dev, "%s: Ignoring IRQ\n", __func__); in cyttsp4_irq()
1170 if (cd->int_status & CY_INT_AWAKE) { in cyttsp4_irq()
1171 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_irq()
1172 wake_up(&cd->wait_q); in cyttsp4_irq()
1173 dev_vdbg(dev, "%s: Received wake up interrupt\n", __func__); in cyttsp4_irq()
1177 /* Expecting mode change interrupt */ in cyttsp4_irq()
1178 if ((cd->int_status & CY_INT_MODE_CHANGE) in cyttsp4_irq()
1179 && (mode[0] & CY_HST_MODE_CHANGE) == 0) { in cyttsp4_irq()
1180 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_irq()
1181 dev_dbg(dev, "%s: finish mode switch m=%d -> m=%d\n", in cyttsp4_irq()
1182 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1183 cd->mode = cur_mode; in cyttsp4_irq()
1184 wake_up(&cd->wait_q); in cyttsp4_irq()
1188 /* compare current core mode to current device mode */ in cyttsp4_irq()
1189 dev_vdbg(dev, "%s: cd->mode=%d cur_mode=%d\n", in cyttsp4_irq()
1190 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1191 if ((mode[0] & CY_HST_MODE_CHANGE) == 0 && cd->mode != cur_mode) { in cyttsp4_irq()
1192 /* Unexpected mode change occurred */ in cyttsp4_irq()
1193 dev_err(dev, "%s %d->%d 0x%x\n", __func__, cd->mode, in cyttsp4_irq()
1194 cur_mode, cd->int_status); in cyttsp4_irq()
1195 dev_dbg(dev, "%s: Unexpected mode change, startup\n", in cyttsp4_irq()
1202 dev_vdbg(dev, "%s: command byte:0x%x\n", __func__, mode[cmd_ofs]); in cyttsp4_irq()
1203 if ((cd->int_status & CY_INT_EXEC_CMD) in cyttsp4_irq()
1204 && mode[cmd_ofs] & CY_CMD_COMPLETE) { in cyttsp4_irq()
1205 cd->int_status &= ~CY_INT_EXEC_CMD; in cyttsp4_irq()
1206 dev_vdbg(dev, "%s: Received command complete interrupt\n", in cyttsp4_irq()
1208 wake_up(&cd->wait_q); in cyttsp4_irq()
1217 if (cd->mode == CY_MODE_OPERATIONAL) { in cyttsp4_irq()
1218 dev_vdbg(dev, "%s: Read status registers\n", __func__); in cyttsp4_irq()
1221 dev_err(dev, "%s: fail read mode regs r=%d\n", in cyttsp4_irq()
1229 dev_vdbg(dev, "%s: Handshake mode=0x%02X r=%d\n", in cyttsp4_irq()
1230 __func__, mode[0], rc); in cyttsp4_irq()
1231 rc = cyttsp4_handshake(cd, mode[0]); in cyttsp4_irq()
1233 dev_err(dev, "%s: Fail handshake mode=0x%02X r=%d\n", in cyttsp4_irq()
1234 __func__, mode[0], rc); in cyttsp4_irq()
1237 * a non-zero udelay period is required for using in cyttsp4_irq()
1241 udelay(cd->cpdata->level_irq_udelay); in cyttsp4_irq()
1244 mutex_unlock(&cd->system_lock); in cyttsp4_irq()
1253 mod_timer(&cd->watchdog_timer, jiffies + in cyttsp4_start_wd_timer()
1266 timer_shutdown_sync(&cd->watchdog_timer); in cyttsp4_stop_wd_timer()
1267 cancel_work_sync(&cd->watchdog_work); in cyttsp4_stop_wd_timer()
1274 dev_vdbg(cd->dev, "%s: Watchdog timer triggered\n", __func__); in cyttsp4_watchdog_timer()
1276 schedule_work(&cd->watchdog_work); in cyttsp4_watchdog_timer()
1287 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1288 if (!cd->exclusive_dev && cd->exclusive_waits == 0) { in cyttsp4_request_exclusive()
1289 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1293 cd->exclusive_waits++; in cyttsp4_request_exclusive()
1295 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1297 t = wait_event_timeout(cd->wait_q, !cd->exclusive_dev, t); in cyttsp4_request_exclusive()
1299 dev_err(cd->dev, "%s: tmo waiting exclusive access\n", in cyttsp4_request_exclusive()
1301 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1302 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1303 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1304 return -ETIME; in cyttsp4_request_exclusive()
1307 wait_event(cd->wait_q, !cd->exclusive_dev); in cyttsp4_request_exclusive()
1309 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1310 if (cd->exclusive_dev) in cyttsp4_request_exclusive()
1312 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1313 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1315 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1325 mutex_lock(&cd->system_lock); in cyttsp4_release_exclusive()
1326 if (cd->exclusive_dev != ownptr) { in cyttsp4_release_exclusive()
1327 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1328 return -EINVAL; in cyttsp4_release_exclusive()
1331 dev_vdbg(cd->dev, "%s: exclusive_dev %p freed\n", in cyttsp4_release_exclusive()
1332 __func__, cd->exclusive_dev); in cyttsp4_release_exclusive()
1333 cd->exclusive_dev = NULL; in cyttsp4_release_exclusive()
1334 wake_up(&cd->wait_q); in cyttsp4_release_exclusive()
1335 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1345 dev_vdbg(cd->dev, "%s: wait heartbeat...\n", __func__); in cyttsp4_wait_bl_heartbeat()
1346 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_BOOTLOADER, in cyttsp4_wait_bl_heartbeat()
1349 dev_err(cd->dev, "%s: tmo waiting bl heartbeat cd->mode=%d\n", in cyttsp4_wait_bl_heartbeat()
1350 __func__, cd->mode); in cyttsp4_wait_bl_heartbeat()
1351 rc = -ETIME; in cyttsp4_wait_bl_heartbeat()
1361 dev_vdbg(cd->dev, "%s: wait sysinfo...\n", __func__); in cyttsp4_wait_sysinfo_mode()
1363 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_SYSINFO, in cyttsp4_wait_sysinfo_mode()
1366 dev_err(cd->dev, "%s: tmo waiting exit bl cd->mode=%d\n", in cyttsp4_wait_sysinfo_mode()
1367 __func__, cd->mode); in cyttsp4_wait_sysinfo_mode()
1368 mutex_lock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1369 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_wait_sysinfo_mode()
1370 mutex_unlock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1371 return -ETIME; in cyttsp4_wait_sysinfo_mode()
1382 mutex_lock(&cd->system_lock); in cyttsp4_reset_and_wait()
1383 dev_dbg(cd->dev, "%s: reset hw...\n", __func__); in cyttsp4_reset_and_wait()
1385 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_reset_and_wait()
1386 mutex_unlock(&cd->system_lock); in cyttsp4_reset_and_wait()
1388 dev_err(cd->dev, "%s:Fail hw reset r=%d\n", __func__, rc); in cyttsp4_reset_and_wait()
1396 * returns err if refused or timeout; block until mode change complete
1397 * bit is set (mode change interrupt)
1402 u8 mode; in cyttsp4_set_mode() local
1417 dev_err(cd->dev, "%s: invalid mode: %02X(%d)\n", in cyttsp4_set_mode()
1419 return -EINVAL; in cyttsp4_set_mode()
1422 /* change mode */ in cyttsp4_set_mode()
1423 dev_dbg(cd->dev, "%s: %s=%p new_dev_mode=%02X new_mode=%d\n", in cyttsp4_set_mode()
1424 __func__, "have exclusive", cd->exclusive_dev, in cyttsp4_set_mode()
1427 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1428 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1430 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1431 dev_err(cd->dev, "%s: Fail read mode r=%d\n", in cyttsp4_set_mode()
1436 /* Clear device mode bits and set to new mode */ in cyttsp4_set_mode()
1437 mode &= ~CY_HST_MODE; in cyttsp4_set_mode()
1438 mode |= new_dev_mode | CY_HST_MODE_CHANGE; in cyttsp4_set_mode()
1440 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1441 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1442 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1444 dev_err(cd->dev, "%s: Fail write mode change r=%d\n", in cyttsp4_set_mode()
1449 /* wait for mode change done interrupt */ in cyttsp4_set_mode()
1450 t = wait_event_timeout(cd->wait_q, in cyttsp4_set_mode()
1451 (cd->int_status & CY_INT_MODE_CHANGE) == 0, in cyttsp4_set_mode()
1453 dev_dbg(cd->dev, "%s: back from wait t=%ld cd->mode=%d\n", in cyttsp4_set_mode()
1454 __func__, t, cd->mode); in cyttsp4_set_mode()
1457 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_set_mode()
1458 "tmo waiting mode change"); in cyttsp4_set_mode()
1459 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1460 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1461 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1462 rc = -EINVAL; in cyttsp4_set_mode()
1473 u8 *mode; in cyttsp4_watchdog_work() local
1476 mutex_lock(&cd->system_lock); in cyttsp4_watchdog_work()
1479 dev_err(cd->dev, in cyttsp4_watchdog_work()
1480 "%s: failed to access device in watchdog timer r=%d\n", in cyttsp4_watchdog_work()
1485 mode = &cd->sysinfo.xy_mode[CY_REG_BASE]; in cyttsp4_watchdog_work()
1486 if (IS_BOOTLOADER(mode[0], mode[1])) { in cyttsp4_watchdog_work()
1487 dev_err(cd->dev, in cyttsp4_watchdog_work()
1488 "%s: device found in bootloader mode when operational mode\n", in cyttsp4_watchdog_work()
1496 mutex_unlock(&cd->system_lock); in cyttsp4_watchdog_work()
1505 u8 mode[2]; in cyttsp4_core_sleep_() local
1507 /* Already in sleep mode? */ in cyttsp4_core_sleep_()
1508 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1509 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_core_sleep_()
1510 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1513 cd->sleep_state = SS_SLEEPING; in cyttsp4_core_sleep_()
1514 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1519 disable_irq(cd->irq); in cyttsp4_core_sleep_()
1521 dev_vdbg(cd->dev, "%s: write DEEP SLEEP...\n", __func__); in cyttsp4_core_sleep_()
1522 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1523 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_sleep_()
1525 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1526 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1530 if (IS_BOOTLOADER(mode[0], mode[1])) { in cyttsp4_core_sleep_()
1531 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1532 dev_err(cd->dev, "%s: Device in BOOTLOADER mode.\n", __func__); in cyttsp4_core_sleep_()
1533 rc = -EINVAL; in cyttsp4_core_sleep_()
1537 mode[0] |= CY_HST_SLEEP; in cyttsp4_core_sleep_()
1538 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode[0]), &mode[0]); in cyttsp4_core_sleep_()
1539 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1541 dev_err(cd->dev, "%s: Fail write adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1544 dev_vdbg(cd->dev, "%s: write DEEP SLEEP succeeded\n", __func__); in cyttsp4_core_sleep_()
1546 if (cd->cpdata->power) { in cyttsp4_core_sleep_()
1547 dev_dbg(cd->dev, "%s: Power down HW\n", __func__); in cyttsp4_core_sleep_()
1548 rc = cd->cpdata->power(cd->cpdata, 0, cd->dev, &cd->ignore_irq); in cyttsp4_core_sleep_()
1550 dev_dbg(cd->dev, "%s: No power function\n", __func__); in cyttsp4_core_sleep_()
1554 dev_err(cd->dev, "%s: HW Power down fails r=%d\n", in cyttsp4_core_sleep_()
1570 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1571 cd->sleep_state = ss; in cyttsp4_core_sleep_()
1572 cd->int_status |= int_status; in cyttsp4_core_sleep_()
1573 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1574 enable_irq(cd->irq); in cyttsp4_core_sleep_()
1587 dev_dbg(cd->dev, "%s: Retry %d\n", __func__, in cyttsp4_startup_()
1588 CY_CORE_STARTUP_RETRY_COUNT - retry); in cyttsp4_startup_()
1593 dev_err(cd->dev, "%s: Error on h/w reset r=%d\n", __func__, rc); in cyttsp4_startup_()
1594 if (retry--) in cyttsp4_startup_()
1599 /* exit bl into sysinfo mode */ in cyttsp4_startup_()
1600 dev_vdbg(cd->dev, "%s: write exit ldr...\n", __func__); in cyttsp4_startup_()
1601 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1602 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_startup_()
1603 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_startup_()
1607 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1609 dev_err(cd->dev, "%s: Fail write r=%d\n", __func__, rc); in cyttsp4_startup_()
1610 if (retry--) in cyttsp4_startup_()
1624 dev_err(cd->dev, "%s: Fail read r=%d\n", __func__, rc1); in cyttsp4_startup_()
1626 dev_err(cd->dev, "%s: Error launching touch application\n", in cyttsp4_startup_()
1628 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1629 cd->invalid_touch_app = true; in cyttsp4_startup_()
1630 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1634 if (retry--) in cyttsp4_startup_()
1639 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1640 cd->invalid_touch_app = false; in cyttsp4_startup_()
1641 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1644 dev_vdbg(cd->dev, "%s: get sysinfo regs..\n", __func__); in cyttsp4_startup_()
1647 dev_err(cd->dev, "%s: failed to get sysinfo regs rc=%d\n", in cyttsp4_startup_()
1649 if (retry--) in cyttsp4_startup_()
1656 dev_err(cd->dev, "%s: failed to set mode to operational rc=%d\n", in cyttsp4_startup_()
1658 if (retry--) in cyttsp4_startup_()
1663 cyttsp4_lift_all(&cd->md); in cyttsp4_startup_()
1666 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1667 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_startup_()
1668 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_startup_()
1669 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1673 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1685 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1686 cd->startup_state = STARTUP_RUNNING; in cyttsp4_startup()
1687 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1689 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_startup()
1692 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_startup()
1693 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_startup()
1699 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_startup()
1700 /* Don't return fail code, mode is already changed. */ in cyttsp4_startup()
1701 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_startup()
1703 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_startup()
1706 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1707 cd->startup_state = STARTUP_NONE; in cyttsp4_startup()
1708 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1711 wake_up(&cd->wait_q); in cyttsp4_startup()
1723 dev_err(cd->dev, "%s: Fail queued startup r=%d\n", in cyttsp4_startup_work_function()
1729 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_free_si_ptrs()
1734 kfree(si->si_ptrs.cydata); in cyttsp4_free_si_ptrs()
1735 kfree(si->si_ptrs.test); in cyttsp4_free_si_ptrs()
1736 kfree(si->si_ptrs.pcfg); in cyttsp4_free_si_ptrs()
1737 kfree(si->si_ptrs.opcfg); in cyttsp4_free_si_ptrs()
1738 kfree(si->si_ptrs.ddata); in cyttsp4_free_si_ptrs()
1739 kfree(si->si_ptrs.mdata); in cyttsp4_free_si_ptrs()
1740 kfree(si->btn); in cyttsp4_free_si_ptrs()
1741 kfree(si->xy_mode); in cyttsp4_free_si_ptrs()
1742 kfree(si->xy_data); in cyttsp4_free_si_ptrs()
1743 kfree(si->btn_rec_data); in cyttsp4_free_si_ptrs()
1750 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_sleep()
1753 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_sleep()
1754 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_sleep()
1760 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_sleep()
1761 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_sleep()
1763 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_sleep()
1770 struct device *dev = cd->dev; in cyttsp4_core_wake_()
1772 u8 mode; in cyttsp4_core_wake_() local
1776 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1777 if (cd->sleep_state == SS_SLEEP_OFF) { in cyttsp4_core_wake_()
1778 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1781 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_core_wake_()
1782 cd->int_status |= CY_INT_AWAKE; in cyttsp4_core_wake_()
1783 cd->sleep_state = SS_WAKING; in cyttsp4_core_wake_()
1785 if (cd->cpdata->power) { in cyttsp4_core_wake_()
1786 dev_dbg(dev, "%s: Power up HW\n", __func__); in cyttsp4_core_wake_()
1787 rc = cd->cpdata->power(cd->cpdata, 1, dev, &cd->ignore_irq); in cyttsp4_core_wake_()
1789 dev_dbg(dev, "%s: No power function\n", __func__); in cyttsp4_core_wake_()
1790 rc = -ENOSYS; in cyttsp4_core_wake_()
1793 dev_err(dev, "%s: HW Power up fails r=%d\n", in cyttsp4_core_wake_()
1797 cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_wake_()
1799 dev_vdbg(cd->dev, "%s: HW power up succeeds\n", in cyttsp4_core_wake_()
1801 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1803 t = wait_event_timeout(cd->wait_q, in cyttsp4_core_wake_()
1804 (cd->int_status & CY_INT_AWAKE) == 0, in cyttsp4_core_wake_()
1807 dev_err(dev, "%s: TMO waiting for wakeup\n", __func__); in cyttsp4_core_wake_()
1808 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1809 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_core_wake_()
1812 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1815 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1816 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_core_wake_()
1817 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1828 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_wake()
1831 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_wake()
1832 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_wake()
1838 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_wake()
1839 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_wake()
1841 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_wake()
1849 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_suspend()
1852 md->is_suspended = true; in cyttsp4_core_suspend()
1856 dev_err(dev, "%s: Error on sleep\n", __func__); in cyttsp4_core_suspend()
1857 return -EAGAIN; in cyttsp4_core_suspend()
1865 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_resume()
1868 md->is_suspended = false; in cyttsp4_core_resume()
1872 dev_err(dev, "%s: Error on wake\n", __func__); in cyttsp4_core_resume()
1873 return -EAGAIN; in cyttsp4_core_resume()
1884 pm_runtime_get(input->dev.parent); in cyttsp4_mt_open()
1891 mutex_lock(&md->report_lock); in cyttsp4_mt_close()
1892 if (!md->is_suspended) in cyttsp4_mt_close()
1893 pm_runtime_put(input->dev.parent); in cyttsp4_mt_close()
1894 mutex_unlock(&md->report_lock); in cyttsp4_mt_close()
1900 struct device *dev = cd->dev; in cyttsp4_setup_input_device()
1901 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_setup_input_device()
1908 dev_vdbg(dev, "%s: Initialize event signals\n", __func__); in cyttsp4_setup_input_device()
1909 __set_bit(EV_ABS, md->input->evbit); in cyttsp4_setup_input_device()
1910 __set_bit(EV_REL, md->input->evbit); in cyttsp4_setup_input_device()
1911 __set_bit(EV_KEY, md->input->evbit); in cyttsp4_setup_input_device()
1913 max_x_tmp = md->si->si_ofs.max_x; in cyttsp4_setup_input_device()
1914 max_y_tmp = md->si->si_ofs.max_y; in cyttsp4_setup_input_device()
1917 if (md->pdata->flags & CY_FLAG_FLIP) { in cyttsp4_setup_input_device()
1918 max_x = max_y_tmp - 1; in cyttsp4_setup_input_device()
1919 max_y = max_x_tmp - 1; in cyttsp4_setup_input_device()
1921 max_x = max_x_tmp - 1; in cyttsp4_setup_input_device()
1922 max_y = max_y_tmp - 1; in cyttsp4_setup_input_device()
1924 max_p = md->si->si_ofs.max_p; in cyttsp4_setup_input_device()
1927 for (i = 0; i < (md->pdata->frmwrk->size / CY_NUM_ABS_SET); i++) { in cyttsp4_setup_input_device()
1928 signal = md->pdata->frmwrk->abs in cyttsp4_setup_input_device()
1931 __set_bit(signal, md->input->absbit); in cyttsp4_setup_input_device()
1932 min = md->pdata->frmwrk->abs in cyttsp4_setup_input_device()
1934 max = md->pdata->frmwrk->abs in cyttsp4_setup_input_device()
1938 max = max - min; in cyttsp4_setup_input_device()
1939 min = min - min; in cyttsp4_setup_input_device()
1946 input_set_abs_params(md->input, signal, min, max, in cyttsp4_setup_input_device()
1947 md->pdata->frmwrk->abs in cyttsp4_setup_input_device()
1949 md->pdata->frmwrk->abs in cyttsp4_setup_input_device()
1951 dev_dbg(dev, "%s: register signal=%02X min=%d max=%d\n", in cyttsp4_setup_input_device()
1954 (md->si->si_ofs.tch_rec_size < in cyttsp4_setup_input_device()
1960 input_mt_init_slots(md->input, md->si->si_ofs.tch_abs[CY_TCH_T].max, in cyttsp4_setup_input_device()
1962 rc = input_register_device(md->input); in cyttsp4_setup_input_device()
1964 dev_err(dev, "%s: Error, failed register input device r=%d\n", in cyttsp4_setup_input_device()
1971 struct device *dev = cd->dev; in cyttsp4_mt_probe()
1972 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_probe()
1973 struct cyttsp4_mt_platform_data *pdata = cd->pdata->mt_pdata; in cyttsp4_mt_probe()
1976 mutex_init(&md->report_lock); in cyttsp4_mt_probe()
1977 md->pdata = pdata; in cyttsp4_mt_probe()
1979 dev_vdbg(dev, "%s: Create the input device and register it\n", in cyttsp4_mt_probe()
1981 md->input = input_allocate_device(); in cyttsp4_mt_probe()
1982 if (md->input == NULL) { in cyttsp4_mt_probe()
1983 dev_err(dev, "%s: Error, failed to allocate input device\n", in cyttsp4_mt_probe()
1985 rc = -ENOSYS; in cyttsp4_mt_probe()
1989 md->input->name = pdata->inp_dev_name; in cyttsp4_mt_probe()
1990 scnprintf(md->phys, sizeof(md->phys)-1, "%s", dev_name(dev)); in cyttsp4_mt_probe()
1991 md->input->phys = md->phys; in cyttsp4_mt_probe()
1992 md->input->id.bustype = cd->bus_ops->bustype; in cyttsp4_mt_probe()
1993 md->input->dev.parent = dev; in cyttsp4_mt_probe()
1994 md->input->open = cyttsp4_mt_open; in cyttsp4_mt_probe()
1995 md->input->close = cyttsp4_mt_close; in cyttsp4_mt_probe()
1996 input_set_drvdata(md->input, md); in cyttsp4_mt_probe()
1999 md->si = &cd->sysinfo; in cyttsp4_mt_probe()
2008 input_free_device(md->input); in cyttsp4_mt_probe()
2010 dev_err(dev, "%s failed.\n", __func__); in cyttsp4_mt_probe()
2022 if (!pdata || !pdata->core_pdata || !pdata->mt_pdata) { in cyttsp4_probe()
2023 dev_err(dev, "%s: Missing platform data\n", __func__); in cyttsp4_probe()
2024 rc = -ENODEV; in cyttsp4_probe()
2030 dev_err(dev, "%s: Error, kzalloc\n", __func__); in cyttsp4_probe()
2031 rc = -ENOMEM; in cyttsp4_probe()
2035 cd->xfer_buf = kzalloc(xfer_buf_size, GFP_KERNEL); in cyttsp4_probe()
2036 if (!cd->xfer_buf) { in cyttsp4_probe()
2037 dev_err(dev, "%s: Error, kzalloc\n", __func__); in cyttsp4_probe()
2038 rc = -ENOMEM; in cyttsp4_probe()
2043 cd->dev = dev; in cyttsp4_probe()
2044 cd->pdata = pdata; in cyttsp4_probe()
2045 cd->cpdata = pdata->core_pdata; in cyttsp4_probe()
2046 cd->bus_ops = ops; in cyttsp4_probe()
2049 mutex_init(&cd->system_lock); in cyttsp4_probe()
2050 mutex_init(&cd->adap_lock); in cyttsp4_probe()
2053 init_waitqueue_head(&cd->wait_q); in cyttsp4_probe()
2056 INIT_WORK(&cd->startup_work, cyttsp4_startup_work_function); in cyttsp4_probe()
2057 INIT_WORK(&cd->watchdog_work, cyttsp4_watchdog_work); in cyttsp4_probe()
2060 cd->irq = gpio_to_irq(cd->cpdata->irq_gpio); in cyttsp4_probe()
2061 if (cd->irq < 0) { in cyttsp4_probe()
2062 rc = -EINVAL; in cyttsp4_probe()
2069 if (cd->cpdata->init) { in cyttsp4_probe()
2070 dev_dbg(cd->dev, "%s: Init HW\n", __func__); in cyttsp4_probe()
2071 rc = cd->cpdata->init(cd->cpdata, 1, cd->dev); in cyttsp4_probe()
2073 dev_dbg(cd->dev, "%s: No HW INIT function\n", __func__); in cyttsp4_probe()
2077 dev_err(cd->dev, "%s: HW Init fail r=%d\n", __func__, rc); in cyttsp4_probe()
2079 dev_dbg(dev, "%s: initialize threaded irq=%d\n", __func__, cd->irq); in cyttsp4_probe()
2080 if (cd->cpdata->level_irq_udelay > 0) in cyttsp4_probe()
2087 rc = request_threaded_irq(cd->irq, NULL, cyttsp4_irq, irq_flags, in cyttsp4_probe()
2090 dev_err(dev, "%s: Error, could not request irq\n", __func__); in cyttsp4_probe()
2095 timer_setup(&cd->watchdog_timer, cyttsp4_watchdog_timer, 0); in cyttsp4_probe()
2104 if (rc < 0 && cd->mode == CY_MODE_UNKNOWN) { in cyttsp4_probe()
2105 dev_err(cd->dev, "%s: Fail initial startup r=%d\n", in cyttsp4_probe()
2112 dev_err(dev, "%s: Error, fail mt probe\n", __func__); in cyttsp4_probe()
2121 cancel_work_sync(&cd->startup_work); in cyttsp4_probe()
2125 free_irq(cd->irq, cd); in cyttsp4_probe()
2127 if (cd->cpdata->init) in cyttsp4_probe()
2128 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_probe()
2130 kfree(cd->xfer_buf); in cyttsp4_probe()
2135 dev_err(dev, "%s failed.\n", __func__); in cyttsp4_probe()
2142 input_unregister_device(md->input); in cyttsp4_mt_release()
2143 input_set_drvdata(md->input, NULL); in cyttsp4_mt_release()
2148 struct device *dev = cd->dev; in cyttsp4_remove()
2150 cyttsp4_mt_release(&cd->md); in cyttsp4_remove()
2159 cancel_work_sync(&cd->startup_work); in cyttsp4_remove()
2163 free_irq(cd->irq, cd); in cyttsp4_remove()
2164 if (cd->cpdata->init) in cyttsp4_remove()
2165 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_remove()