Lines Matching refs:cd

80 static int cyttsp4_load_status_regs(struct cyttsp4 *cd)  in cyttsp4_load_status_regs()  argument
82 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_load_status_regs()
83 struct device *dev = cd->dev; in cyttsp4_load_status_regs()
86 rc = cyttsp4_adap_read(cd, CY_REG_BASE, si->si_ofs.mode_size, in cyttsp4_load_status_regs()
92 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_mode, in cyttsp4_load_status_regs()
98 static int cyttsp4_handshake(struct cyttsp4 *cd, u8 mode) in cyttsp4_handshake() argument
110 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(cmd), &cmd); in cyttsp4_handshake()
112 dev_err(cd->dev, "%s: bus write fail on handshake (ret=%d)\n", in cyttsp4_handshake()
118 static int cyttsp4_hw_soft_reset(struct cyttsp4 *cd) in cyttsp4_hw_soft_reset() argument
121 int rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(cmd), &cmd); in cyttsp4_hw_soft_reset()
123 dev_err(cd->dev, "%s: FAILED to execute SOFT reset\n", in cyttsp4_hw_soft_reset()
130 static int cyttsp4_hw_hard_reset(struct cyttsp4 *cd) in cyttsp4_hw_hard_reset() argument
132 if (cd->cpdata->xres) { in cyttsp4_hw_hard_reset()
133 cd->cpdata->xres(cd->cpdata, cd->dev); in cyttsp4_hw_hard_reset()
134 dev_dbg(cd->dev, "%s: execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
137 dev_err(cd->dev, "%s: FAILED to execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
141 static int cyttsp4_hw_reset(struct cyttsp4 *cd) in cyttsp4_hw_reset() argument
143 int rc = cyttsp4_hw_hard_reset(cd); in cyttsp4_hw_reset()
145 rc = cyttsp4_hw_soft_reset(cd); in cyttsp4_hw_reset()
160 static int cyttsp4_si_data_offsets(struct cyttsp4 *cd) in cyttsp4_si_data_offsets() argument
162 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_data_offsets()
163 int rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(si->si_data), in cyttsp4_si_data_offsets()
166 dev_err(cd->dev, "%s: fail read sysinfo data offsets r=%d\n", in cyttsp4_si_data_offsets()
172 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)&si->si_data, in cyttsp4_si_data_offsets()
196 static int cyttsp4_si_get_cydata(struct cyttsp4 *cd) in cyttsp4_si_get_cydata() argument
198 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_cydata()
205 dev_dbg(cd->dev, "%s: cydata size: %Zd\n", __func__, in cyttsp4_si_get_cydata()
210 dev_err(cd->dev, "%s: fail alloc cydata memory\n", __func__); in cyttsp4_si_get_cydata()
218 rc = cyttsp4_adap_read(cd, read_offset, in cyttsp4_si_get_cydata()
223 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
232 dev_err(cd->dev, "%s: mismatch in MFGID size, reported:%d calculated:%d\n", in cyttsp4_si_get_cydata()
241 rc = cyttsp4_adap_read(cd, read_offset, si->si_ptrs.cydata->mfgid_sz, in cyttsp4_si_get_cydata()
244 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
252 rc = cyttsp4_adap_read(cd, read_offset, in cyttsp4_si_get_cydata()
257 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
262 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.cydata, in cyttsp4_si_get_cydata()
267 static int cyttsp4_si_get_test_data(struct cyttsp4 *cd) in cyttsp4_si_get_test_data() argument
269 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_test_data()
277 dev_err(cd->dev, "%s: fail alloc test memory\n", __func__); in cyttsp4_si_get_test_data()
282 rc = cyttsp4_adap_read(cd, si->si_ofs.test_ofs, si->si_ofs.test_size, in cyttsp4_si_get_test_data()
285 dev_err(cd->dev, "%s: fail read test data r=%d\n", in cyttsp4_si_get_test_data()
290 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_test_data()
295 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
301 dev_info(cd->dev, "%s: %s codel=%02X\n", __func__, in cyttsp4_si_get_test_data()
307 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
311 dev_info(cd->dev, "%s: SCANNING is %s codel=%02X\n", in cyttsp4_si_get_test_data()
318 static int cyttsp4_si_get_pcfg_data(struct cyttsp4 *cd) in cyttsp4_si_get_pcfg_data() argument
320 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_pcfg_data()
329 dev_err(cd->dev, "%s: fail alloc pcfg memory r=%d\n", in cyttsp4_si_get_pcfg_data()
335 rc = cyttsp4_adap_read(cd, si->si_ofs.pcfg_ofs, si->si_ofs.pcfg_size, in cyttsp4_si_get_pcfg_data()
338 dev_err(cd->dev, "%s: fail read pcfg data r=%d\n", in cyttsp4_si_get_pcfg_data()
354 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_pcfg_data()
360 static int cyttsp4_si_get_opcfg_data(struct cyttsp4 *cd) in cyttsp4_si_get_opcfg_data() argument
362 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_opcfg_data()
374 dev_err(cd->dev, "%s: fail alloc opcfg memory\n", __func__); in cyttsp4_si_get_opcfg_data()
380 rc = cyttsp4_adap_read(cd, si->si_ofs.opcfg_ofs, si->si_ofs.opcfg_size, in cyttsp4_si_get_opcfg_data()
383 dev_err(cd->dev, "%s: fail read opcfg data r=%d\n", in cyttsp4_si_get_opcfg_data()
431 dev_dbg(cd->dev, "%s: tch_rec_%s\n", __func__, in cyttsp4_si_get_opcfg_data()
433 dev_dbg(cd->dev, "%s: ofs =%2Zd\n", __func__, in cyttsp4_si_get_opcfg_data()
435 dev_dbg(cd->dev, "%s: siz =%2Zd\n", __func__, in cyttsp4_si_get_opcfg_data()
437 dev_dbg(cd->dev, "%s: max =%2Zd\n", __func__, in cyttsp4_si_get_opcfg_data()
439 dev_dbg(cd->dev, "%s: bofs=%2Zd\n", __func__, in cyttsp4_si_get_opcfg_data()
447 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.opcfg, in cyttsp4_si_get_opcfg_data()
454 static int cyttsp4_si_get_ddata(struct cyttsp4 *cd) in cyttsp4_si_get_ddata() argument
456 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_ddata()
464 dev_err(cd->dev, "%s: fail alloc ddata memory\n", __func__); in cyttsp4_si_get_ddata()
469 rc = cyttsp4_adap_read(cd, si->si_ofs.ddata_ofs, si->si_ofs.ddata_size, in cyttsp4_si_get_ddata()
472 dev_err(cd->dev, "%s: fail read ddata data r=%d\n", in cyttsp4_si_get_ddata()
475 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_ddata()
481 static int cyttsp4_si_get_mdata(struct cyttsp4 *cd) in cyttsp4_si_get_mdata() argument
483 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_mdata()
491 dev_err(cd->dev, "%s: fail alloc mdata memory\n", __func__); in cyttsp4_si_get_mdata()
496 rc = cyttsp4_adap_read(cd, si->si_ofs.mdata_ofs, si->si_ofs.mdata_size, in cyttsp4_si_get_mdata()
499 dev_err(cd->dev, "%s: fail read mdata data r=%d\n", in cyttsp4_si_get_mdata()
502 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_mdata()
508 static int cyttsp4_si_get_btn_data(struct cyttsp4 *cd) in cyttsp4_si_get_btn_data() argument
510 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_btn_data()
524 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_si_get_btn_data()
530 if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS] == NULL) in cyttsp4_si_get_btn_data()
532 else if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS]->data == NULL) in cyttsp4_si_get_btn_data()
535 num_defined_keys = cd->cpdata->sett in cyttsp4_si_get_btn_data()
540 key_table = (u16 *)cd->cpdata->sett in cyttsp4_si_get_btn_data()
561 static int cyttsp4_si_get_op_data_ptrs(struct cyttsp4 *cd) in cyttsp4_si_get_op_data_ptrs() argument
563 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_op_data_ptrs()
586 static void cyttsp4_si_put_log_data(struct cyttsp4 *cd) in cyttsp4_si_put_log_data() argument
588 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_put_log_data()
589 dev_dbg(cd->dev, "%s: cydata_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
591 dev_dbg(cd->dev, "%s: test_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
593 dev_dbg(cd->dev, "%s: pcfg_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
595 dev_dbg(cd->dev, "%s: opcfg_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
597 dev_dbg(cd->dev, "%s: ddata_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
599 dev_dbg(cd->dev, "%s: mdata_ofs =%4Zd siz=%4Zd\n", __func__, in cyttsp4_si_put_log_data()
602 dev_dbg(cd->dev, "%s: cmd_ofs =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
604 dev_dbg(cd->dev, "%s: rep_ofs =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
606 dev_dbg(cd->dev, "%s: rep_sz =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
608 dev_dbg(cd->dev, "%s: num_btns =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
610 dev_dbg(cd->dev, "%s: num_btn_regs =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
612 dev_dbg(cd->dev, "%s: tt_stat_ofs =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
614 dev_dbg(cd->dev, "%s: tch_rec_size =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
616 dev_dbg(cd->dev, "%s: max_tchs =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
618 dev_dbg(cd->dev, "%s: mode_size =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
620 dev_dbg(cd->dev, "%s: data_size =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
622 dev_dbg(cd->dev, "%s: map_sz =%4Zd\n", __func__, in cyttsp4_si_put_log_data()
625 dev_dbg(cd->dev, "%s: btn_rec_size =%2Zd\n", __func__, in cyttsp4_si_put_log_data()
627 dev_dbg(cd->dev, "%s: btn_diff_ofs =%2Zd\n", __func__, in cyttsp4_si_put_log_data()
629 dev_dbg(cd->dev, "%s: btn_diff_size =%2Zd\n", __func__, in cyttsp4_si_put_log_data()
632 dev_dbg(cd->dev, "%s: max_x = 0x%04ZX (%Zd)\n", __func__, in cyttsp4_si_put_log_data()
634 dev_dbg(cd->dev, "%s: x_origin = %Zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
638 dev_dbg(cd->dev, "%s: max_y = 0x%04ZX (%Zd)\n", __func__, in cyttsp4_si_put_log_data()
640 dev_dbg(cd->dev, "%s: y_origin = %Zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
644 dev_dbg(cd->dev, "%s: max_p = 0x%04ZX (%Zd)\n", __func__, in cyttsp4_si_put_log_data()
647 dev_dbg(cd->dev, "%s: xy_mode=%p xy_data=%p\n", __func__, in cyttsp4_si_put_log_data()
651 static int cyttsp4_get_sysinfo_regs(struct cyttsp4 *cd) in cyttsp4_get_sysinfo_regs() argument
653 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_get_sysinfo_regs()
656 rc = cyttsp4_si_data_offsets(cd); in cyttsp4_get_sysinfo_regs()
660 rc = cyttsp4_si_get_cydata(cd); in cyttsp4_get_sysinfo_regs()
664 rc = cyttsp4_si_get_test_data(cd); in cyttsp4_get_sysinfo_regs()
668 rc = cyttsp4_si_get_pcfg_data(cd); in cyttsp4_get_sysinfo_regs()
672 rc = cyttsp4_si_get_opcfg_data(cd); in cyttsp4_get_sysinfo_regs()
676 rc = cyttsp4_si_get_ddata(cd); in cyttsp4_get_sysinfo_regs()
680 rc = cyttsp4_si_get_mdata(cd); in cyttsp4_get_sysinfo_regs()
684 rc = cyttsp4_si_get_btn_data(cd); in cyttsp4_get_sysinfo_regs()
688 rc = cyttsp4_si_get_op_data_ptrs(cd); in cyttsp4_get_sysinfo_regs()
690 dev_err(cd->dev, "%s: failed to get_op_data\n", in cyttsp4_get_sysinfo_regs()
695 cyttsp4_si_put_log_data(cd); in cyttsp4_get_sysinfo_regs()
698 rc = cyttsp4_handshake(cd, si->si_data.hst_mode); in cyttsp4_get_sysinfo_regs()
700 dev_err(cd->dev, "%s: handshake fail on sysinfo reg\n", in cyttsp4_get_sysinfo_regs()
707 static void cyttsp4_queue_startup_(struct cyttsp4 *cd) in cyttsp4_queue_startup_() argument
709 if (cd->startup_state == STARTUP_NONE) { in cyttsp4_queue_startup_()
710 cd->startup_state = STARTUP_QUEUED; in cyttsp4_queue_startup_()
711 schedule_work(&cd->startup_work); in cyttsp4_queue_startup_()
712 dev_dbg(cd->dev, "%s: cyttsp4_startup queued\n", __func__); in cyttsp4_queue_startup_()
714 dev_dbg(cd->dev, "%s: startup_state = %d\n", __func__, in cyttsp4_queue_startup_()
715 cd->startup_state); in cyttsp4_queue_startup_()
936 static int cyttsp4_xy_worker(struct cyttsp4 *cd) in cyttsp4_xy_worker() argument
938 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_xy_worker()
978 rc = cyttsp4_adap_read(cd, si->si_ofs.tt_stat_ofs + 1, in cyttsp4_xy_worker()
989 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_data, num_cur_tch * in cyttsp4_xy_worker()
1022 static int cyttsp4_mt_attention(struct cyttsp4 *cd) in cyttsp4_mt_attention() argument
1024 struct device *dev = cd->dev; in cyttsp4_mt_attention()
1025 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_attention()
1034 rc = cyttsp4_xy_worker(cd); in cyttsp4_mt_attention()
1048 struct cyttsp4 *cd = handle; in cyttsp4_irq() local
1049 struct device *dev = cd->dev; in cyttsp4_irq()
1051 u8 cmd_ofs = cd->sysinfo.si_ofs.cmd_ofs; in cyttsp4_irq()
1060 if (atomic_read(&cd->ignore_irq)) { in cyttsp4_irq()
1065 dev_dbg(dev, "%s int:0x%x\n", __func__, cd->int_status); in cyttsp4_irq()
1067 mutex_lock(&cd->system_lock); in cyttsp4_irq()
1070 if (cd->sleep_state == SS_SLEEP_ON || cd->sleep_state == SS_SLEEPING) in cyttsp4_irq()
1073 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), mode); in cyttsp4_irq()
1075 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_irq()
1084 if (cd->mode == CY_MODE_BOOTLOADER) { in cyttsp4_irq()
1086 wake_up(&cd->wait_q); in cyttsp4_irq()
1092 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1095 if (cd->mode != CY_MODE_UNKNOWN) { in cyttsp4_irq()
1097 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_irq()
1098 cyttsp4_queue_startup_(cd); in cyttsp4_irq()
1107 cd->mode = cur_mode; in cyttsp4_irq()
1133 if (cd->int_status & CY_INT_IGNORE) { in cyttsp4_irq()
1139 if (cd->int_status & CY_INT_AWAKE) { in cyttsp4_irq()
1140 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_irq()
1141 wake_up(&cd->wait_q); in cyttsp4_irq()
1147 if ((cd->int_status & CY_INT_MODE_CHANGE) in cyttsp4_irq()
1149 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_irq()
1151 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1152 cd->mode = cur_mode; in cyttsp4_irq()
1153 wake_up(&cd->wait_q); in cyttsp4_irq()
1159 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1160 if ((mode[0] & CY_HST_MODE_CHANGE) == 0 && cd->mode != cur_mode) { in cyttsp4_irq()
1162 dev_err(dev, "%s %d->%d 0x%x\n", __func__, cd->mode, in cyttsp4_irq()
1163 cur_mode, cd->int_status); in cyttsp4_irq()
1166 cyttsp4_queue_startup_(cd); in cyttsp4_irq()
1172 if ((cd->int_status & CY_INT_EXEC_CMD) in cyttsp4_irq()
1174 cd->int_status &= ~CY_INT_EXEC_CMD; in cyttsp4_irq()
1177 wake_up(&cd->wait_q); in cyttsp4_irq()
1186 if (cd->mode == CY_MODE_OPERATIONAL) { in cyttsp4_irq()
1188 rc = cyttsp4_load_status_regs(cd); in cyttsp4_irq()
1194 cyttsp4_mt_attention(cd); in cyttsp4_irq()
1200 rc = cyttsp4_handshake(cd, mode[0]); in cyttsp4_irq()
1210 udelay(cd->cpdata->level_irq_udelay); in cyttsp4_irq()
1213 mutex_unlock(&cd->system_lock); in cyttsp4_irq()
1217 static void cyttsp4_start_wd_timer(struct cyttsp4 *cd) in cyttsp4_start_wd_timer() argument
1222 mod_timer(&cd->watchdog_timer, jiffies + in cyttsp4_start_wd_timer()
1226 static void cyttsp4_stop_wd_timer(struct cyttsp4 *cd) in cyttsp4_stop_wd_timer() argument
1235 del_timer_sync(&cd->watchdog_timer); in cyttsp4_stop_wd_timer()
1236 cancel_work_sync(&cd->watchdog_work); in cyttsp4_stop_wd_timer()
1237 del_timer_sync(&cd->watchdog_timer); in cyttsp4_stop_wd_timer()
1242 struct cyttsp4 *cd = (struct cyttsp4 *)handle; in cyttsp4_watchdog_timer() local
1244 dev_vdbg(cd->dev, "%s: Watchdog timer triggered\n", __func__); in cyttsp4_watchdog_timer()
1246 schedule_work(&cd->watchdog_work); in cyttsp4_watchdog_timer()
1251 static int cyttsp4_request_exclusive(struct cyttsp4 *cd, void *ownptr, in cyttsp4_request_exclusive() argument
1257 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1258 if (!cd->exclusive_dev && cd->exclusive_waits == 0) { in cyttsp4_request_exclusive()
1259 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1263 cd->exclusive_waits++; in cyttsp4_request_exclusive()
1265 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1267 t = wait_event_timeout(cd->wait_q, !cd->exclusive_dev, t); in cyttsp4_request_exclusive()
1269 dev_err(cd->dev, "%s: tmo waiting exclusive access\n", in cyttsp4_request_exclusive()
1271 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1272 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1273 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1277 wait_event(cd->wait_q, !cd->exclusive_dev); in cyttsp4_request_exclusive()
1279 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1280 if (cd->exclusive_dev) in cyttsp4_request_exclusive()
1282 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1283 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1285 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1293 static int cyttsp4_release_exclusive(struct cyttsp4 *cd, void *ownptr) in cyttsp4_release_exclusive() argument
1295 mutex_lock(&cd->system_lock); in cyttsp4_release_exclusive()
1296 if (cd->exclusive_dev != ownptr) { in cyttsp4_release_exclusive()
1297 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1301 dev_vdbg(cd->dev, "%s: exclusive_dev %p freed\n", in cyttsp4_release_exclusive()
1302 __func__, cd->exclusive_dev); in cyttsp4_release_exclusive()
1303 cd->exclusive_dev = NULL; in cyttsp4_release_exclusive()
1304 wake_up(&cd->wait_q); in cyttsp4_release_exclusive()
1305 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1309 static int cyttsp4_wait_bl_heartbeat(struct cyttsp4 *cd) in cyttsp4_wait_bl_heartbeat() argument
1315 dev_vdbg(cd->dev, "%s: wait heartbeat...\n", __func__); in cyttsp4_wait_bl_heartbeat()
1316 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_BOOTLOADER, in cyttsp4_wait_bl_heartbeat()
1319 dev_err(cd->dev, "%s: tmo waiting bl heartbeat cd->mode=%d\n", in cyttsp4_wait_bl_heartbeat()
1320 __func__, cd->mode); in cyttsp4_wait_bl_heartbeat()
1327 static int cyttsp4_wait_sysinfo_mode(struct cyttsp4 *cd) in cyttsp4_wait_sysinfo_mode() argument
1331 dev_vdbg(cd->dev, "%s: wait sysinfo...\n", __func__); in cyttsp4_wait_sysinfo_mode()
1333 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_SYSINFO, in cyttsp4_wait_sysinfo_mode()
1336 dev_err(cd->dev, "%s: tmo waiting exit bl cd->mode=%d\n", in cyttsp4_wait_sysinfo_mode()
1337 __func__, cd->mode); in cyttsp4_wait_sysinfo_mode()
1338 mutex_lock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1339 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_wait_sysinfo_mode()
1340 mutex_unlock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1347 static int cyttsp4_reset_and_wait(struct cyttsp4 *cd) in cyttsp4_reset_and_wait() argument
1352 mutex_lock(&cd->system_lock); in cyttsp4_reset_and_wait()
1353 dev_dbg(cd->dev, "%s: reset hw...\n", __func__); in cyttsp4_reset_and_wait()
1354 rc = cyttsp4_hw_reset(cd); in cyttsp4_reset_and_wait()
1355 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_reset_and_wait()
1356 mutex_unlock(&cd->system_lock); in cyttsp4_reset_and_wait()
1358 dev_err(cd->dev, "%s:Fail hw reset r=%d\n", __func__, rc); in cyttsp4_reset_and_wait()
1362 return cyttsp4_wait_bl_heartbeat(cd); in cyttsp4_reset_and_wait()
1369 static int cyttsp4_set_mode(struct cyttsp4 *cd, int new_mode) in cyttsp4_set_mode() argument
1387 dev_err(cd->dev, "%s: invalid mode: %02X(%d)\n", in cyttsp4_set_mode()
1393 dev_dbg(cd->dev, "%s: %s=%p new_dev_mode=%02X new_mode=%d\n", in cyttsp4_set_mode()
1394 __func__, "have exclusive", cd->exclusive_dev, in cyttsp4_set_mode()
1397 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1398 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1400 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1401 dev_err(cd->dev, "%s: Fail read mode r=%d\n", in cyttsp4_set_mode()
1410 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1411 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1412 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1414 dev_err(cd->dev, "%s: Fail write mode change r=%d\n", in cyttsp4_set_mode()
1420 t = wait_event_timeout(cd->wait_q, in cyttsp4_set_mode()
1421 (cd->int_status & CY_INT_MODE_CHANGE) == 0, in cyttsp4_set_mode()
1423 dev_dbg(cd->dev, "%s: back from wait t=%ld cd->mode=%d\n", in cyttsp4_set_mode()
1424 __func__, t, cd->mode); in cyttsp4_set_mode()
1427 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_set_mode()
1429 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1430 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1431 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1441 struct cyttsp4 *cd = in cyttsp4_watchdog_work() local
1446 mutex_lock(&cd->system_lock); in cyttsp4_watchdog_work()
1447 retval = cyttsp4_load_status_regs(cd); in cyttsp4_watchdog_work()
1449 dev_err(cd->dev, in cyttsp4_watchdog_work()
1452 cyttsp4_queue_startup_(cd); in cyttsp4_watchdog_work()
1455 mode = &cd->sysinfo.xy_mode[CY_REG_BASE]; in cyttsp4_watchdog_work()
1457 dev_err(cd->dev, in cyttsp4_watchdog_work()
1460 cyttsp4_queue_startup_(cd); in cyttsp4_watchdog_work()
1464 cyttsp4_start_wd_timer(cd); in cyttsp4_watchdog_work()
1466 mutex_unlock(&cd->system_lock); in cyttsp4_watchdog_work()
1470 static int cyttsp4_core_sleep_(struct cyttsp4 *cd) in cyttsp4_core_sleep_() argument
1478 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1479 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_core_sleep_()
1480 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1483 cd->sleep_state = SS_SLEEPING; in cyttsp4_core_sleep_()
1484 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1486 cyttsp4_stop_wd_timer(cd); in cyttsp4_core_sleep_()
1489 disable_irq(cd->irq); in cyttsp4_core_sleep_()
1491 dev_vdbg(cd->dev, "%s: write DEEP SLEEP...\n", __func__); in cyttsp4_core_sleep_()
1492 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1493 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_sleep_()
1495 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1496 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1501 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1502 dev_err(cd->dev, "%s: Device in BOOTLADER mode.\n", __func__); in cyttsp4_core_sleep_()
1508 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode[0]), &mode[0]); in cyttsp4_core_sleep_()
1509 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1511 dev_err(cd->dev, "%s: Fail write adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1514 dev_vdbg(cd->dev, "%s: write DEEP SLEEP succeeded\n", __func__); in cyttsp4_core_sleep_()
1516 if (cd->cpdata->power) { in cyttsp4_core_sleep_()
1517 dev_dbg(cd->dev, "%s: Power down HW\n", __func__); in cyttsp4_core_sleep_()
1518 rc = cd->cpdata->power(cd->cpdata, 0, cd->dev, &cd->ignore_irq); in cyttsp4_core_sleep_()
1520 dev_dbg(cd->dev, "%s: No power function\n", __func__); in cyttsp4_core_sleep_()
1524 dev_err(cd->dev, "%s: HW Power down fails r=%d\n", in cyttsp4_core_sleep_()
1537 cyttsp4_start_wd_timer(cd); in cyttsp4_core_sleep_()
1540 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1541 cd->sleep_state = ss; in cyttsp4_core_sleep_()
1542 cd->int_status |= int_status; in cyttsp4_core_sleep_()
1543 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1544 enable_irq(cd->irq); in cyttsp4_core_sleep_()
1548 static int cyttsp4_startup_(struct cyttsp4 *cd) in cyttsp4_startup_() argument
1553 cyttsp4_stop_wd_timer(cd); in cyttsp4_startup_()
1557 dev_dbg(cd->dev, "%s: Retry %d\n", __func__, in cyttsp4_startup_()
1561 rc = cyttsp4_reset_and_wait(cd); in cyttsp4_startup_()
1563 dev_err(cd->dev, "%s: Error on h/w reset r=%d\n", __func__, rc); in cyttsp4_startup_()
1570 dev_vdbg(cd->dev, "%s: write exit ldr...\n", __func__); in cyttsp4_startup_()
1571 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1572 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_startup_()
1573 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_startup_()
1575 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(ldr_exit), in cyttsp4_startup_()
1577 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1579 dev_err(cd->dev, "%s: Fail write r=%d\n", __func__, rc); in cyttsp4_startup_()
1585 rc = cyttsp4_wait_sysinfo_mode(cd); in cyttsp4_startup_()
1591 rc1 = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(ldr_err_app), in cyttsp4_startup_()
1594 dev_err(cd->dev, "%s: Fail read r=%d\n", __func__, rc1); in cyttsp4_startup_()
1596 dev_err(cd->dev, "%s: Error launching touch application\n", in cyttsp4_startup_()
1598 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1599 cd->invalid_touch_app = true; in cyttsp4_startup_()
1600 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1609 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1610 cd->invalid_touch_app = false; in cyttsp4_startup_()
1611 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1614 dev_vdbg(cd->dev, "%s: get sysinfo regs..\n", __func__); in cyttsp4_startup_()
1615 rc = cyttsp4_get_sysinfo_regs(cd); in cyttsp4_startup_()
1617 dev_err(cd->dev, "%s: failed to get sysinfo regs rc=%d\n", in cyttsp4_startup_()
1624 rc = cyttsp4_set_mode(cd, CY_MODE_OPERATIONAL); in cyttsp4_startup_()
1626 dev_err(cd->dev, "%s: failed to set mode to operational rc=%d\n", in cyttsp4_startup_()
1633 cyttsp4_lift_all(&cd->md); in cyttsp4_startup_()
1636 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1637 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_startup_()
1638 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_startup_()
1639 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1640 cyttsp4_core_sleep_(cd); in cyttsp4_startup_()
1643 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1646 cyttsp4_start_wd_timer(cd); in cyttsp4_startup_()
1651 static int cyttsp4_startup(struct cyttsp4 *cd) in cyttsp4_startup() argument
1655 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1656 cd->startup_state = STARTUP_RUNNING; in cyttsp4_startup()
1657 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1659 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_startup()
1662 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_startup()
1663 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_startup()
1667 rc = cyttsp4_startup_(cd); in cyttsp4_startup()
1669 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_startup()
1671 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_startup()
1673 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_startup()
1676 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1677 cd->startup_state = STARTUP_NONE; in cyttsp4_startup()
1678 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1681 wake_up(&cd->wait_q); in cyttsp4_startup()
1688 struct cyttsp4 *cd = container_of(work, struct cyttsp4, startup_work); in cyttsp4_startup_work_function() local
1691 rc = cyttsp4_startup(cd); in cyttsp4_startup_work_function()
1693 dev_err(cd->dev, "%s: Fail queued startup r=%d\n", in cyttsp4_startup_work_function()
1697 static void cyttsp4_free_si_ptrs(struct cyttsp4 *cd) in cyttsp4_free_si_ptrs() argument
1699 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_free_si_ptrs()
1717 static int cyttsp4_core_sleep(struct cyttsp4 *cd) in cyttsp4_core_sleep() argument
1721 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_sleep()
1724 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_sleep()
1725 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_sleep()
1729 rc = cyttsp4_core_sleep_(cd); in cyttsp4_core_sleep()
1731 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_sleep()
1732 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_sleep()
1734 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_sleep()
1739 static int cyttsp4_core_wake_(struct cyttsp4 *cd) in cyttsp4_core_wake_() argument
1741 struct device *dev = cd->dev; in cyttsp4_core_wake_()
1747 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1748 if (cd->sleep_state == SS_SLEEP_OFF) { in cyttsp4_core_wake_()
1749 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1752 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_core_wake_()
1753 cd->int_status |= CY_INT_AWAKE; in cyttsp4_core_wake_()
1754 cd->sleep_state = SS_WAKING; in cyttsp4_core_wake_()
1756 if (cd->cpdata->power) { in cyttsp4_core_wake_()
1758 rc = cd->cpdata->power(cd->cpdata, 1, dev, &cd->ignore_irq); in cyttsp4_core_wake_()
1768 cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_wake_()
1770 dev_vdbg(cd->dev, "%s: HW power up succeeds\n", in cyttsp4_core_wake_()
1772 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1774 t = wait_event_timeout(cd->wait_q, in cyttsp4_core_wake_()
1775 (cd->int_status & CY_INT_AWAKE) == 0, in cyttsp4_core_wake_()
1779 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1780 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_core_wake_()
1782 cyttsp4_queue_startup_(cd); in cyttsp4_core_wake_()
1783 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1786 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1787 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_core_wake_()
1788 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1790 cyttsp4_start_wd_timer(cd); in cyttsp4_core_wake_()
1795 static int cyttsp4_core_wake(struct cyttsp4 *cd) in cyttsp4_core_wake() argument
1799 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_wake()
1802 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_wake()
1803 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_wake()
1807 rc = cyttsp4_core_wake_(cd); in cyttsp4_core_wake()
1809 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_wake()
1810 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_wake()
1812 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_wake()
1819 struct cyttsp4 *cd = dev_get_drvdata(dev); in cyttsp4_core_suspend() local
1820 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_suspend()
1825 rc = cyttsp4_core_sleep(cd); in cyttsp4_core_suspend()
1835 struct cyttsp4 *cd = dev_get_drvdata(dev); in cyttsp4_core_resume() local
1836 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_resume()
1841 rc = cyttsp4_core_wake(cd); in cyttsp4_core_resume()
1873 static int cyttsp4_setup_input_device(struct cyttsp4 *cd) in cyttsp4_setup_input_device() argument
1875 struct device *dev = cd->dev; in cyttsp4_setup_input_device()
1876 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_setup_input_device()
1944 static int cyttsp4_mt_probe(struct cyttsp4 *cd) in cyttsp4_mt_probe() argument
1946 struct device *dev = cd->dev; in cyttsp4_mt_probe()
1947 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_probe()
1948 struct cyttsp4_mt_platform_data *pdata = cd->pdata->mt_pdata; in cyttsp4_mt_probe()
1967 md->input->id.bustype = cd->bus_ops->bustype; in cyttsp4_mt_probe()
1974 md->si = &cd->sysinfo; in cyttsp4_mt_probe()
1981 rc = cyttsp4_setup_input_device(cd); in cyttsp4_mt_probe()
1999 struct cyttsp4 *cd; in cyttsp4_probe() local
2010 cd = kzalloc(sizeof(*cd), GFP_KERNEL); in cyttsp4_probe()
2011 if (!cd) { in cyttsp4_probe()
2017 cd->xfer_buf = kzalloc(xfer_buf_size, GFP_KERNEL); in cyttsp4_probe()
2018 if (!cd->xfer_buf) { in cyttsp4_probe()
2025 cd->dev = dev; in cyttsp4_probe()
2026 cd->pdata = pdata; in cyttsp4_probe()
2027 cd->cpdata = pdata->core_pdata; in cyttsp4_probe()
2028 cd->bus_ops = ops; in cyttsp4_probe()
2031 mutex_init(&cd->system_lock); in cyttsp4_probe()
2032 mutex_init(&cd->adap_lock); in cyttsp4_probe()
2035 init_waitqueue_head(&cd->wait_q); in cyttsp4_probe()
2038 INIT_WORK(&cd->startup_work, cyttsp4_startup_work_function); in cyttsp4_probe()
2039 INIT_WORK(&cd->watchdog_work, cyttsp4_watchdog_work); in cyttsp4_probe()
2042 cd->irq = gpio_to_irq(cd->cpdata->irq_gpio); in cyttsp4_probe()
2043 if (cd->irq < 0) { in cyttsp4_probe()
2048 dev_set_drvdata(dev, cd); in cyttsp4_probe()
2051 if (cd->cpdata->init) { in cyttsp4_probe()
2052 dev_dbg(cd->dev, "%s: Init HW\n", __func__); in cyttsp4_probe()
2053 rc = cd->cpdata->init(cd->cpdata, 1, cd->dev); in cyttsp4_probe()
2055 dev_dbg(cd->dev, "%s: No HW INIT function\n", __func__); in cyttsp4_probe()
2059 dev_err(cd->dev, "%s: HW Init fail r=%d\n", __func__, rc); in cyttsp4_probe()
2061 dev_dbg(dev, "%s: initialize threaded irq=%d\n", __func__, cd->irq); in cyttsp4_probe()
2062 if (cd->cpdata->level_irq_udelay > 0) in cyttsp4_probe()
2069 rc = request_threaded_irq(cd->irq, NULL, cyttsp4_irq, irq_flags, in cyttsp4_probe()
2070 dev_name(dev), cd); in cyttsp4_probe()
2077 setup_timer(&cd->watchdog_timer, cyttsp4_watchdog_timer, in cyttsp4_probe()
2078 (unsigned long)cd); in cyttsp4_probe()
2084 rc = cyttsp4_startup(cd); in cyttsp4_probe()
2087 if (rc < 0 && cd->mode == CY_MODE_UNKNOWN) { in cyttsp4_probe()
2088 dev_err(cd->dev, "%s: Fail initial startup r=%d\n", in cyttsp4_probe()
2093 rc = cyttsp4_mt_probe(cd); in cyttsp4_probe()
2101 return cd; in cyttsp4_probe()
2104 cancel_work_sync(&cd->startup_work); in cyttsp4_probe()
2105 cyttsp4_stop_wd_timer(cd); in cyttsp4_probe()
2107 cyttsp4_free_si_ptrs(cd); in cyttsp4_probe()
2108 free_irq(cd->irq, cd); in cyttsp4_probe()
2110 if (cd->cpdata->init) in cyttsp4_probe()
2111 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_probe()
2113 kfree(cd->xfer_buf); in cyttsp4_probe()
2115 kfree(cd); in cyttsp4_probe()
2129 int cyttsp4_remove(struct cyttsp4 *cd) in cyttsp4_remove() argument
2131 struct device *dev = cd->dev; in cyttsp4_remove()
2133 cyttsp4_mt_release(&cd->md); in cyttsp4_remove()
2142 cancel_work_sync(&cd->startup_work); in cyttsp4_remove()
2144 cyttsp4_stop_wd_timer(cd); in cyttsp4_remove()
2146 free_irq(cd->irq, cd); in cyttsp4_remove()
2147 if (cd->cpdata->init) in cyttsp4_remove()
2148 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_remove()
2149 cyttsp4_free_si_ptrs(cd); in cyttsp4_remove()
2150 kfree(cd); in cyttsp4_remove()