Lines Matching full:cd

70 static int cyttsp4_load_status_regs(struct cyttsp4 *cd)  in cyttsp4_load_status_regs()  argument
72 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_load_status_regs()
73 struct device *dev = cd->dev; in cyttsp4_load_status_regs()
76 rc = cyttsp4_adap_read(cd, CY_REG_BASE, si->si_ofs.mode_size, in cyttsp4_load_status_regs()
82 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_mode, in cyttsp4_load_status_regs()
88 static int cyttsp4_handshake(struct cyttsp4 *cd, u8 mode) in cyttsp4_handshake() argument
100 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(cmd), &cmd); in cyttsp4_handshake()
102 dev_err(cd->dev, "%s: bus write fail on handshake (ret=%d)\n", in cyttsp4_handshake()
108 static int cyttsp4_hw_soft_reset(struct cyttsp4 *cd) in cyttsp4_hw_soft_reset() argument
111 int rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(cmd), &cmd); in cyttsp4_hw_soft_reset()
113 dev_err(cd->dev, "%s: FAILED to execute SOFT reset\n", in cyttsp4_hw_soft_reset()
120 static int cyttsp4_hw_hard_reset(struct cyttsp4 *cd) in cyttsp4_hw_hard_reset() argument
122 if (cd->cpdata->xres) { in cyttsp4_hw_hard_reset()
123 cd->cpdata->xres(cd->cpdata, cd->dev); in cyttsp4_hw_hard_reset()
124 dev_dbg(cd->dev, "%s: execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
127 dev_err(cd->dev, "%s: FAILED to execute HARD reset\n", __func__); in cyttsp4_hw_hard_reset()
131 static int cyttsp4_hw_reset(struct cyttsp4 *cd) in cyttsp4_hw_reset() argument
133 int rc = cyttsp4_hw_hard_reset(cd); in cyttsp4_hw_reset()
135 rc = cyttsp4_hw_soft_reset(cd); in cyttsp4_hw_reset()
150 static int cyttsp4_si_data_offsets(struct cyttsp4 *cd) in cyttsp4_si_data_offsets() argument
152 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_data_offsets()
153 int rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(si->si_data), in cyttsp4_si_data_offsets()
156 dev_err(cd->dev, "%s: fail read sysinfo data offsets r=%d\n", in cyttsp4_si_data_offsets()
162 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)&si->si_data, in cyttsp4_si_data_offsets()
186 static int cyttsp4_si_get_cydata(struct cyttsp4 *cd) in cyttsp4_si_get_cydata() argument
188 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_cydata()
195 dev_err(cd->dev, in cyttsp4_si_get_cydata()
202 dev_dbg(cd->dev, "%s: cydata size: %zd\n", __func__, in cyttsp4_si_get_cydata()
207 dev_err(cd->dev, "%s: failed to allocate cydata memory\n", in cyttsp4_si_get_cydata()
216 rc = cyttsp4_adap_read(cd, read_offset, in cyttsp4_si_get_cydata()
221 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
230 dev_err(cd->dev, "%s: mismatch in MFGID size, reported:%d calculated:%d\n", in cyttsp4_si_get_cydata()
239 rc = cyttsp4_adap_read(cd, read_offset, si->si_ptrs.cydata->mfgid_sz, in cyttsp4_si_get_cydata()
242 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
250 rc = cyttsp4_adap_read(cd, read_offset, in cyttsp4_si_get_cydata()
255 dev_err(cd->dev, "%s: fail read cydata r=%d\n", in cyttsp4_si_get_cydata()
260 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.cydata, in cyttsp4_si_get_cydata()
265 static int cyttsp4_si_get_test_data(struct cyttsp4 *cd) in cyttsp4_si_get_test_data() argument
267 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_test_data()
272 dev_err(cd->dev, in cyttsp4_si_get_test_data()
282 dev_err(cd->dev, "%s: failed to allocate test memory\n", in cyttsp4_si_get_test_data()
288 rc = cyttsp4_adap_read(cd, si->si_ofs.test_ofs, si->si_ofs.test_size, in cyttsp4_si_get_test_data()
291 dev_err(cd->dev, "%s: fail read test data r=%d\n", in cyttsp4_si_get_test_data()
296 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_test_data()
301 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
307 dev_info(cd->dev, "%s: %s codel=%02X\n", __func__, in cyttsp4_si_get_test_data()
313 dev_info(cd->dev, "%s: %s codel=%02X\n", in cyttsp4_si_get_test_data()
317 dev_info(cd->dev, "%s: SCANNING is %s codel=%02X\n", in cyttsp4_si_get_test_data()
324 static int cyttsp4_si_get_pcfg_data(struct cyttsp4 *cd) in cyttsp4_si_get_pcfg_data() argument
326 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_pcfg_data()
331 dev_err(cd->dev, in cyttsp4_si_get_pcfg_data()
341 dev_err(cd->dev, "%s: failed to allocate pcfg memory\n", in cyttsp4_si_get_pcfg_data()
347 rc = cyttsp4_adap_read(cd, si->si_ofs.pcfg_ofs, si->si_ofs.pcfg_size, in cyttsp4_si_get_pcfg_data()
350 dev_err(cd->dev, "%s: fail read pcfg data r=%d\n", in cyttsp4_si_get_pcfg_data()
366 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_pcfg_data()
372 static int cyttsp4_si_get_opcfg_data(struct cyttsp4 *cd) in cyttsp4_si_get_opcfg_data() argument
374 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_opcfg_data()
383 dev_err(cd->dev, in cyttsp4_si_get_opcfg_data()
393 dev_err(cd->dev, "%s: failed to allocate opcfg memory\n", in cyttsp4_si_get_opcfg_data()
399 rc = cyttsp4_adap_read(cd, si->si_ofs.opcfg_ofs, si->si_ofs.opcfg_size, in cyttsp4_si_get_opcfg_data()
402 dev_err(cd->dev, "%s: fail read opcfg data r=%d\n", in cyttsp4_si_get_opcfg_data()
450 dev_dbg(cd->dev, "%s: tch_rec_%s\n", __func__, in cyttsp4_si_get_opcfg_data()
452 dev_dbg(cd->dev, "%s: ofs =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
454 dev_dbg(cd->dev, "%s: siz =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
456 dev_dbg(cd->dev, "%s: max =%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
458 dev_dbg(cd->dev, "%s: bofs=%2zd\n", __func__, in cyttsp4_si_get_opcfg_data()
466 cyttsp4_pr_buf(cd->dev, cd->pr_buf, (u8 *)si->si_ptrs.opcfg, in cyttsp4_si_get_opcfg_data()
472 static int cyttsp4_si_get_ddata(struct cyttsp4 *cd) in cyttsp4_si_get_ddata() argument
474 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_ddata()
482 dev_err(cd->dev, "%s: fail alloc ddata memory\n", __func__); in cyttsp4_si_get_ddata()
487 rc = cyttsp4_adap_read(cd, si->si_ofs.ddata_ofs, si->si_ofs.ddata_size, in cyttsp4_si_get_ddata()
490 dev_err(cd->dev, "%s: fail read ddata data r=%d\n", in cyttsp4_si_get_ddata()
493 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_ddata()
499 static int cyttsp4_si_get_mdata(struct cyttsp4 *cd) in cyttsp4_si_get_mdata() argument
501 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_mdata()
509 dev_err(cd->dev, "%s: fail alloc mdata memory\n", __func__); in cyttsp4_si_get_mdata()
514 rc = cyttsp4_adap_read(cd, si->si_ofs.mdata_ofs, si->si_ofs.mdata_size, in cyttsp4_si_get_mdata()
517 dev_err(cd->dev, "%s: fail read mdata data r=%d\n", in cyttsp4_si_get_mdata()
520 cyttsp4_pr_buf(cd->dev, cd->pr_buf, in cyttsp4_si_get_mdata()
526 static int cyttsp4_si_get_btn_data(struct cyttsp4 *cd) in cyttsp4_si_get_btn_data() argument
528 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_btn_data()
542 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_si_get_btn_data()
548 if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS] == NULL) in cyttsp4_si_get_btn_data()
550 else if (cd->cpdata->sett[CY_IC_GRPNUM_BTN_KEYS]->data == NULL) in cyttsp4_si_get_btn_data()
553 num_defined_keys = cd->cpdata->sett in cyttsp4_si_get_btn_data()
558 key_table = (u16 *)cd->cpdata->sett in cyttsp4_si_get_btn_data()
579 static int cyttsp4_si_get_op_data_ptrs(struct cyttsp4 *cd) in cyttsp4_si_get_op_data_ptrs() argument
581 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_get_op_data_ptrs()
604 static void cyttsp4_si_put_log_data(struct cyttsp4 *cd) in cyttsp4_si_put_log_data() argument
606 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_si_put_log_data()
607 dev_dbg(cd->dev, "%s: cydata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
609 dev_dbg(cd->dev, "%s: test_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
611 dev_dbg(cd->dev, "%s: pcfg_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
613 dev_dbg(cd->dev, "%s: opcfg_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
615 dev_dbg(cd->dev, "%s: ddata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
617 dev_dbg(cd->dev, "%s: mdata_ofs =%4zd siz=%4zd\n", __func__, in cyttsp4_si_put_log_data()
620 dev_dbg(cd->dev, "%s: cmd_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
622 dev_dbg(cd->dev, "%s: rep_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
624 dev_dbg(cd->dev, "%s: rep_sz =%4zd\n", __func__, in cyttsp4_si_put_log_data()
626 dev_dbg(cd->dev, "%s: num_btns =%4zd\n", __func__, in cyttsp4_si_put_log_data()
628 dev_dbg(cd->dev, "%s: num_btn_regs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
630 dev_dbg(cd->dev, "%s: tt_stat_ofs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
632 dev_dbg(cd->dev, "%s: tch_rec_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
634 dev_dbg(cd->dev, "%s: max_tchs =%4zd\n", __func__, in cyttsp4_si_put_log_data()
636 dev_dbg(cd->dev, "%s: mode_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
638 dev_dbg(cd->dev, "%s: data_size =%4zd\n", __func__, in cyttsp4_si_put_log_data()
640 dev_dbg(cd->dev, "%s: map_sz =%4zd\n", __func__, in cyttsp4_si_put_log_data()
643 dev_dbg(cd->dev, "%s: btn_rec_size =%2zd\n", __func__, in cyttsp4_si_put_log_data()
645 dev_dbg(cd->dev, "%s: btn_diff_ofs =%2zd\n", __func__, in cyttsp4_si_put_log_data()
647 dev_dbg(cd->dev, "%s: btn_diff_size =%2zd\n", __func__, in cyttsp4_si_put_log_data()
650 dev_dbg(cd->dev, "%s: max_x = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
652 dev_dbg(cd->dev, "%s: x_origin = %zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
656 dev_dbg(cd->dev, "%s: max_y = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
658 dev_dbg(cd->dev, "%s: y_origin = %zd (%s)\n", __func__, in cyttsp4_si_put_log_data()
662 dev_dbg(cd->dev, "%s: max_p = 0x%04zX (%zd)\n", __func__, in cyttsp4_si_put_log_data()
665 dev_dbg(cd->dev, "%s: xy_mode=%p xy_data=%p\n", __func__, in cyttsp4_si_put_log_data()
669 static int cyttsp4_get_sysinfo_regs(struct cyttsp4 *cd) in cyttsp4_get_sysinfo_regs() argument
671 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_get_sysinfo_regs()
674 rc = cyttsp4_si_data_offsets(cd); in cyttsp4_get_sysinfo_regs()
678 rc = cyttsp4_si_get_cydata(cd); in cyttsp4_get_sysinfo_regs()
682 rc = cyttsp4_si_get_test_data(cd); in cyttsp4_get_sysinfo_regs()
686 rc = cyttsp4_si_get_pcfg_data(cd); in cyttsp4_get_sysinfo_regs()
690 rc = cyttsp4_si_get_opcfg_data(cd); in cyttsp4_get_sysinfo_regs()
694 rc = cyttsp4_si_get_ddata(cd); in cyttsp4_get_sysinfo_regs()
698 rc = cyttsp4_si_get_mdata(cd); in cyttsp4_get_sysinfo_regs()
702 rc = cyttsp4_si_get_btn_data(cd); in cyttsp4_get_sysinfo_regs()
706 rc = cyttsp4_si_get_op_data_ptrs(cd); in cyttsp4_get_sysinfo_regs()
708 dev_err(cd->dev, "%s: failed to get_op_data\n", in cyttsp4_get_sysinfo_regs()
713 cyttsp4_si_put_log_data(cd); in cyttsp4_get_sysinfo_regs()
716 rc = cyttsp4_handshake(cd, si->si_data.hst_mode); in cyttsp4_get_sysinfo_regs()
718 dev_err(cd->dev, "%s: handshake fail on sysinfo reg\n", in cyttsp4_get_sysinfo_regs()
725 static void cyttsp4_queue_startup_(struct cyttsp4 *cd) in cyttsp4_queue_startup_() argument
727 if (cd->startup_state == STARTUP_NONE) { in cyttsp4_queue_startup_()
728 cd->startup_state = STARTUP_QUEUED; in cyttsp4_queue_startup_()
729 schedule_work(&cd->startup_work); in cyttsp4_queue_startup_()
730 dev_dbg(cd->dev, "%s: cyttsp4_startup queued\n", __func__); in cyttsp4_queue_startup_()
732 dev_dbg(cd->dev, "%s: startup_state = %d\n", __func__, in cyttsp4_queue_startup_()
733 cd->startup_state); in cyttsp4_queue_startup_()
953 static int cyttsp4_xy_worker(struct cyttsp4 *cd) in cyttsp4_xy_worker() argument
955 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_xy_worker()
995 rc = cyttsp4_adap_read(cd, si->si_ofs.tt_stat_ofs + 1, in cyttsp4_xy_worker()
1006 cyttsp4_pr_buf(dev, cd->pr_buf, si->xy_data, num_cur_tch * in cyttsp4_xy_worker()
1039 static int cyttsp4_mt_attention(struct cyttsp4 *cd) in cyttsp4_mt_attention() argument
1041 struct device *dev = cd->dev; in cyttsp4_mt_attention()
1042 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_attention()
1051 rc = cyttsp4_xy_worker(cd); in cyttsp4_mt_attention()
1065 struct cyttsp4 *cd = handle; in cyttsp4_irq() local
1066 struct device *dev = cd->dev; in cyttsp4_irq()
1068 u8 cmd_ofs = cd->sysinfo.si_ofs.cmd_ofs; in cyttsp4_irq()
1077 if (atomic_read(&cd->ignore_irq)) { in cyttsp4_irq()
1082 dev_dbg(dev, "%s int:0x%x\n", __func__, cd->int_status); in cyttsp4_irq()
1084 mutex_lock(&cd->system_lock); in cyttsp4_irq()
1087 if (cd->sleep_state == SS_SLEEP_ON || cd->sleep_state == SS_SLEEPING) in cyttsp4_irq()
1090 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), mode); in cyttsp4_irq()
1092 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_irq()
1101 if (cd->mode == CY_MODE_BOOTLOADER) { in cyttsp4_irq()
1103 wake_up(&cd->wait_q); in cyttsp4_irq()
1109 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1112 if (cd->mode != CY_MODE_UNKNOWN) { in cyttsp4_irq()
1114 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_irq()
1115 cyttsp4_queue_startup_(cd); in cyttsp4_irq()
1124 cd->mode = cur_mode; in cyttsp4_irq()
1150 if (cd->int_status & CY_INT_IGNORE) { in cyttsp4_irq()
1156 if (cd->int_status & CY_INT_AWAKE) { in cyttsp4_irq()
1157 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_irq()
1158 wake_up(&cd->wait_q); in cyttsp4_irq()
1164 if ((cd->int_status & CY_INT_MODE_CHANGE) in cyttsp4_irq()
1166 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_irq()
1168 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1169 cd->mode = cur_mode; in cyttsp4_irq()
1170 wake_up(&cd->wait_q); in cyttsp4_irq()
1175 dev_vdbg(dev, "%s: cd->mode=%d cur_mode=%d\n", in cyttsp4_irq()
1176 __func__, cd->mode, cur_mode); in cyttsp4_irq()
1177 if ((mode[0] & CY_HST_MODE_CHANGE) == 0 && cd->mode != cur_mode) { in cyttsp4_irq()
1179 dev_err(dev, "%s %d->%d 0x%x\n", __func__, cd->mode, in cyttsp4_irq()
1180 cur_mode, cd->int_status); in cyttsp4_irq()
1183 cyttsp4_queue_startup_(cd); in cyttsp4_irq()
1189 if ((cd->int_status & CY_INT_EXEC_CMD) in cyttsp4_irq()
1191 cd->int_status &= ~CY_INT_EXEC_CMD; in cyttsp4_irq()
1194 wake_up(&cd->wait_q); in cyttsp4_irq()
1203 if (cd->mode == CY_MODE_OPERATIONAL) { in cyttsp4_irq()
1205 rc = cyttsp4_load_status_regs(cd); in cyttsp4_irq()
1211 cyttsp4_mt_attention(cd); in cyttsp4_irq()
1217 rc = cyttsp4_handshake(cd, mode[0]); in cyttsp4_irq()
1227 udelay(cd->cpdata->level_irq_udelay); in cyttsp4_irq()
1230 mutex_unlock(&cd->system_lock); in cyttsp4_irq()
1234 static void cyttsp4_start_wd_timer(struct cyttsp4 *cd) in cyttsp4_start_wd_timer() argument
1239 mod_timer(&cd->watchdog_timer, jiffies + in cyttsp4_start_wd_timer()
1243 static void cyttsp4_stop_wd_timer(struct cyttsp4 *cd) in cyttsp4_stop_wd_timer() argument
1252 del_timer_sync(&cd->watchdog_timer); in cyttsp4_stop_wd_timer()
1253 cancel_work_sync(&cd->watchdog_work); in cyttsp4_stop_wd_timer()
1254 del_timer_sync(&cd->watchdog_timer); in cyttsp4_stop_wd_timer()
1259 struct cyttsp4 *cd = from_timer(cd, t, watchdog_timer); in cyttsp4_watchdog_timer() local
1261 dev_vdbg(cd->dev, "%s: Watchdog timer triggered\n", __func__); in cyttsp4_watchdog_timer()
1263 schedule_work(&cd->watchdog_work); in cyttsp4_watchdog_timer()
1268 static int cyttsp4_request_exclusive(struct cyttsp4 *cd, void *ownptr, in cyttsp4_request_exclusive() argument
1274 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1275 if (!cd->exclusive_dev && cd->exclusive_waits == 0) { in cyttsp4_request_exclusive()
1276 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1280 cd->exclusive_waits++; in cyttsp4_request_exclusive()
1282 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1284 t = wait_event_timeout(cd->wait_q, !cd->exclusive_dev, t); in cyttsp4_request_exclusive()
1286 dev_err(cd->dev, "%s: tmo waiting exclusive access\n", in cyttsp4_request_exclusive()
1288 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1289 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1290 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1294 wait_event(cd->wait_q, !cd->exclusive_dev); in cyttsp4_request_exclusive()
1296 mutex_lock(&cd->system_lock); in cyttsp4_request_exclusive()
1297 if (cd->exclusive_dev) in cyttsp4_request_exclusive()
1299 cd->exclusive_dev = ownptr; in cyttsp4_request_exclusive()
1300 cd->exclusive_waits--; in cyttsp4_request_exclusive()
1302 mutex_unlock(&cd->system_lock); in cyttsp4_request_exclusive()
1310 static int cyttsp4_release_exclusive(struct cyttsp4 *cd, void *ownptr) in cyttsp4_release_exclusive() argument
1312 mutex_lock(&cd->system_lock); in cyttsp4_release_exclusive()
1313 if (cd->exclusive_dev != ownptr) { in cyttsp4_release_exclusive()
1314 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1318 dev_vdbg(cd->dev, "%s: exclusive_dev %p freed\n", in cyttsp4_release_exclusive()
1319 __func__, cd->exclusive_dev); in cyttsp4_release_exclusive()
1320 cd->exclusive_dev = NULL; in cyttsp4_release_exclusive()
1321 wake_up(&cd->wait_q); in cyttsp4_release_exclusive()
1322 mutex_unlock(&cd->system_lock); in cyttsp4_release_exclusive()
1326 static int cyttsp4_wait_bl_heartbeat(struct cyttsp4 *cd) in cyttsp4_wait_bl_heartbeat() argument
1332 dev_vdbg(cd->dev, "%s: wait heartbeat...\n", __func__); in cyttsp4_wait_bl_heartbeat()
1333 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_BOOTLOADER, in cyttsp4_wait_bl_heartbeat()
1336 dev_err(cd->dev, "%s: tmo waiting bl heartbeat cd->mode=%d\n", in cyttsp4_wait_bl_heartbeat()
1337 __func__, cd->mode); in cyttsp4_wait_bl_heartbeat()
1344 static int cyttsp4_wait_sysinfo_mode(struct cyttsp4 *cd) in cyttsp4_wait_sysinfo_mode() argument
1348 dev_vdbg(cd->dev, "%s: wait sysinfo...\n", __func__); in cyttsp4_wait_sysinfo_mode()
1350 t = wait_event_timeout(cd->wait_q, cd->mode == CY_MODE_SYSINFO, in cyttsp4_wait_sysinfo_mode()
1353 dev_err(cd->dev, "%s: tmo waiting exit bl cd->mode=%d\n", in cyttsp4_wait_sysinfo_mode()
1354 __func__, cd->mode); in cyttsp4_wait_sysinfo_mode()
1355 mutex_lock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1356 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_wait_sysinfo_mode()
1357 mutex_unlock(&cd->system_lock); in cyttsp4_wait_sysinfo_mode()
1364 static int cyttsp4_reset_and_wait(struct cyttsp4 *cd) in cyttsp4_reset_and_wait() argument
1369 mutex_lock(&cd->system_lock); in cyttsp4_reset_and_wait()
1370 dev_dbg(cd->dev, "%s: reset hw...\n", __func__); in cyttsp4_reset_and_wait()
1371 rc = cyttsp4_hw_reset(cd); in cyttsp4_reset_and_wait()
1372 cd->mode = CY_MODE_UNKNOWN; in cyttsp4_reset_and_wait()
1373 mutex_unlock(&cd->system_lock); in cyttsp4_reset_and_wait()
1375 dev_err(cd->dev, "%s:Fail hw reset r=%d\n", __func__, rc); in cyttsp4_reset_and_wait()
1379 return cyttsp4_wait_bl_heartbeat(cd); in cyttsp4_reset_and_wait()
1386 static int cyttsp4_set_mode(struct cyttsp4 *cd, int new_mode) in cyttsp4_set_mode() argument
1404 dev_err(cd->dev, "%s: invalid mode: %02X(%d)\n", in cyttsp4_set_mode()
1410 dev_dbg(cd->dev, "%s: %s=%p new_dev_mode=%02X new_mode=%d\n", in cyttsp4_set_mode()
1411 __func__, "have exclusive", cd->exclusive_dev, in cyttsp4_set_mode()
1414 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1415 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1417 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1418 dev_err(cd->dev, "%s: Fail read mode r=%d\n", in cyttsp4_set_mode()
1427 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1428 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_set_mode()
1429 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1431 dev_err(cd->dev, "%s: Fail write mode change r=%d\n", in cyttsp4_set_mode()
1437 t = wait_event_timeout(cd->wait_q, in cyttsp4_set_mode()
1438 (cd->int_status & CY_INT_MODE_CHANGE) == 0, in cyttsp4_set_mode()
1440 dev_dbg(cd->dev, "%s: back from wait t=%ld cd->mode=%d\n", in cyttsp4_set_mode()
1441 __func__, t, cd->mode); in cyttsp4_set_mode()
1444 dev_err(cd->dev, "%s: %s\n", __func__, in cyttsp4_set_mode()
1446 mutex_lock(&cd->system_lock); in cyttsp4_set_mode()
1447 cd->int_status &= ~CY_INT_MODE_CHANGE; in cyttsp4_set_mode()
1448 mutex_unlock(&cd->system_lock); in cyttsp4_set_mode()
1458 struct cyttsp4 *cd = in cyttsp4_watchdog_work() local
1463 mutex_lock(&cd->system_lock); in cyttsp4_watchdog_work()
1464 retval = cyttsp4_load_status_regs(cd); in cyttsp4_watchdog_work()
1466 dev_err(cd->dev, in cyttsp4_watchdog_work()
1469 cyttsp4_queue_startup_(cd); in cyttsp4_watchdog_work()
1472 mode = &cd->sysinfo.xy_mode[CY_REG_BASE]; in cyttsp4_watchdog_work()
1474 dev_err(cd->dev, in cyttsp4_watchdog_work()
1477 cyttsp4_queue_startup_(cd); in cyttsp4_watchdog_work()
1481 cyttsp4_start_wd_timer(cd); in cyttsp4_watchdog_work()
1483 mutex_unlock(&cd->system_lock); in cyttsp4_watchdog_work()
1487 static int cyttsp4_core_sleep_(struct cyttsp4 *cd) in cyttsp4_core_sleep_() argument
1495 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1496 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_core_sleep_()
1497 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1500 cd->sleep_state = SS_SLEEPING; in cyttsp4_core_sleep_()
1501 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1503 cyttsp4_stop_wd_timer(cd); in cyttsp4_core_sleep_()
1506 disable_irq(cd->irq); in cyttsp4_core_sleep_()
1508 dev_vdbg(cd->dev, "%s: write DEEP SLEEP...\n", __func__); in cyttsp4_core_sleep_()
1509 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1510 rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_sleep_()
1512 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1513 dev_err(cd->dev, "%s: Fail read adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1518 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1519 dev_err(cd->dev, "%s: Device in BOOTLOADER mode.\n", __func__); in cyttsp4_core_sleep_()
1525 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(mode[0]), &mode[0]); in cyttsp4_core_sleep_()
1526 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1528 dev_err(cd->dev, "%s: Fail write adapter r=%d\n", __func__, rc); in cyttsp4_core_sleep_()
1531 dev_vdbg(cd->dev, "%s: write DEEP SLEEP succeeded\n", __func__); in cyttsp4_core_sleep_()
1533 if (cd->cpdata->power) { in cyttsp4_core_sleep_()
1534 dev_dbg(cd->dev, "%s: Power down HW\n", __func__); in cyttsp4_core_sleep_()
1535 rc = cd->cpdata->power(cd->cpdata, 0, cd->dev, &cd->ignore_irq); in cyttsp4_core_sleep_()
1537 dev_dbg(cd->dev, "%s: No power function\n", __func__); in cyttsp4_core_sleep_()
1541 dev_err(cd->dev, "%s: HW Power down fails r=%d\n", in cyttsp4_core_sleep_()
1554 cyttsp4_start_wd_timer(cd); in cyttsp4_core_sleep_()
1557 mutex_lock(&cd->system_lock); in cyttsp4_core_sleep_()
1558 cd->sleep_state = ss; in cyttsp4_core_sleep_()
1559 cd->int_status |= int_status; in cyttsp4_core_sleep_()
1560 mutex_unlock(&cd->system_lock); in cyttsp4_core_sleep_()
1561 enable_irq(cd->irq); in cyttsp4_core_sleep_()
1565 static int cyttsp4_startup_(struct cyttsp4 *cd) in cyttsp4_startup_() argument
1570 cyttsp4_stop_wd_timer(cd); in cyttsp4_startup_()
1574 dev_dbg(cd->dev, "%s: Retry %d\n", __func__, in cyttsp4_startup_()
1578 rc = cyttsp4_reset_and_wait(cd); in cyttsp4_startup_()
1580 dev_err(cd->dev, "%s: Error on h/w reset r=%d\n", __func__, rc); in cyttsp4_startup_()
1587 dev_vdbg(cd->dev, "%s: write exit ldr...\n", __func__); in cyttsp4_startup_()
1588 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1589 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_startup_()
1590 cd->int_status |= CY_INT_MODE_CHANGE; in cyttsp4_startup_()
1592 rc = cyttsp4_adap_write(cd, CY_REG_BASE, sizeof(ldr_exit), in cyttsp4_startup_()
1594 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1596 dev_err(cd->dev, "%s: Fail write r=%d\n", __func__, rc); in cyttsp4_startup_()
1602 rc = cyttsp4_wait_sysinfo_mode(cd); in cyttsp4_startup_()
1608 rc1 = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(ldr_err_app), in cyttsp4_startup_()
1611 dev_err(cd->dev, "%s: Fail read r=%d\n", __func__, rc1); in cyttsp4_startup_()
1613 dev_err(cd->dev, "%s: Error launching touch application\n", in cyttsp4_startup_()
1615 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1616 cd->invalid_touch_app = true; in cyttsp4_startup_()
1617 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1626 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1627 cd->invalid_touch_app = false; in cyttsp4_startup_()
1628 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1631 dev_vdbg(cd->dev, "%s: get sysinfo regs..\n", __func__); in cyttsp4_startup_()
1632 rc = cyttsp4_get_sysinfo_regs(cd); in cyttsp4_startup_()
1634 dev_err(cd->dev, "%s: failed to get sysinfo regs rc=%d\n", in cyttsp4_startup_()
1641 rc = cyttsp4_set_mode(cd, CY_MODE_OPERATIONAL); in cyttsp4_startup_()
1643 dev_err(cd->dev, "%s: failed to set mode to operational rc=%d\n", in cyttsp4_startup_()
1650 cyttsp4_lift_all(&cd->md); in cyttsp4_startup_()
1653 mutex_lock(&cd->system_lock); in cyttsp4_startup_()
1654 if (cd->sleep_state == SS_SLEEP_ON) { in cyttsp4_startup_()
1655 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_startup_()
1656 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1657 cyttsp4_core_sleep_(cd); in cyttsp4_startup_()
1660 mutex_unlock(&cd->system_lock); in cyttsp4_startup_()
1663 cyttsp4_start_wd_timer(cd); in cyttsp4_startup_()
1668 static int cyttsp4_startup(struct cyttsp4 *cd) in cyttsp4_startup() argument
1672 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1673 cd->startup_state = STARTUP_RUNNING; in cyttsp4_startup()
1674 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1676 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_startup()
1679 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_startup()
1680 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_startup()
1684 rc = cyttsp4_startup_(cd); in cyttsp4_startup()
1686 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_startup()
1688 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_startup()
1690 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_startup()
1693 mutex_lock(&cd->system_lock); in cyttsp4_startup()
1694 cd->startup_state = STARTUP_NONE; in cyttsp4_startup()
1695 mutex_unlock(&cd->system_lock); in cyttsp4_startup()
1698 wake_up(&cd->wait_q); in cyttsp4_startup()
1705 struct cyttsp4 *cd = container_of(work, struct cyttsp4, startup_work); in cyttsp4_startup_work_function() local
1708 rc = cyttsp4_startup(cd); in cyttsp4_startup_work_function()
1710 dev_err(cd->dev, "%s: Fail queued startup r=%d\n", in cyttsp4_startup_work_function()
1714 static void cyttsp4_free_si_ptrs(struct cyttsp4 *cd) in cyttsp4_free_si_ptrs() argument
1716 struct cyttsp4_sysinfo *si = &cd->sysinfo; in cyttsp4_free_si_ptrs()
1734 static int cyttsp4_core_sleep(struct cyttsp4 *cd) in cyttsp4_core_sleep() argument
1738 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_sleep()
1741 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_sleep()
1742 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_sleep()
1746 rc = cyttsp4_core_sleep_(cd); in cyttsp4_core_sleep()
1748 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_sleep()
1749 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_sleep()
1751 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_sleep()
1756 static int cyttsp4_core_wake_(struct cyttsp4 *cd) in cyttsp4_core_wake_() argument
1758 struct device *dev = cd->dev; in cyttsp4_core_wake_()
1764 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1765 if (cd->sleep_state == SS_SLEEP_OFF) { in cyttsp4_core_wake_()
1766 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1769 cd->int_status &= ~CY_INT_IGNORE; in cyttsp4_core_wake_()
1770 cd->int_status |= CY_INT_AWAKE; in cyttsp4_core_wake_()
1771 cd->sleep_state = SS_WAKING; in cyttsp4_core_wake_()
1773 if (cd->cpdata->power) { in cyttsp4_core_wake_()
1775 rc = cd->cpdata->power(cd->cpdata, 1, dev, &cd->ignore_irq); in cyttsp4_core_wake_()
1785 cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); in cyttsp4_core_wake_()
1787 dev_vdbg(cd->dev, "%s: HW power up succeeds\n", in cyttsp4_core_wake_()
1789 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1791 t = wait_event_timeout(cd->wait_q, in cyttsp4_core_wake_()
1792 (cd->int_status & CY_INT_AWAKE) == 0, in cyttsp4_core_wake_()
1796 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1797 cd->int_status &= ~CY_INT_AWAKE; in cyttsp4_core_wake_()
1799 cyttsp4_queue_startup_(cd); in cyttsp4_core_wake_()
1800 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1803 mutex_lock(&cd->system_lock); in cyttsp4_core_wake_()
1804 cd->sleep_state = SS_SLEEP_OFF; in cyttsp4_core_wake_()
1805 mutex_unlock(&cd->system_lock); in cyttsp4_core_wake_()
1807 cyttsp4_start_wd_timer(cd); in cyttsp4_core_wake_()
1812 static int cyttsp4_core_wake(struct cyttsp4 *cd) in cyttsp4_core_wake() argument
1816 rc = cyttsp4_request_exclusive(cd, cd->dev, in cyttsp4_core_wake()
1819 dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n", in cyttsp4_core_wake()
1820 __func__, cd->exclusive_dev, cd->dev); in cyttsp4_core_wake()
1824 rc = cyttsp4_core_wake_(cd); in cyttsp4_core_wake()
1826 if (cyttsp4_release_exclusive(cd, cd->dev) < 0) in cyttsp4_core_wake()
1827 dev_err(cd->dev, "%s: fail to release exclusive\n", __func__); in cyttsp4_core_wake()
1829 dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__); in cyttsp4_core_wake()
1836 struct cyttsp4 *cd = dev_get_drvdata(dev); in cyttsp4_core_suspend() local
1837 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_suspend()
1842 rc = cyttsp4_core_sleep(cd); in cyttsp4_core_suspend()
1852 struct cyttsp4 *cd = dev_get_drvdata(dev); in cyttsp4_core_resume() local
1853 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_core_resume()
1858 rc = cyttsp4_core_wake(cd); in cyttsp4_core_resume()
1890 static int cyttsp4_setup_input_device(struct cyttsp4 *cd) in cyttsp4_setup_input_device() argument
1892 struct device *dev = cd->dev; in cyttsp4_setup_input_device()
1893 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_setup_input_device()
1961 static int cyttsp4_mt_probe(struct cyttsp4 *cd) in cyttsp4_mt_probe() argument
1963 struct device *dev = cd->dev; in cyttsp4_mt_probe()
1964 struct cyttsp4_mt_data *md = &cd->md; in cyttsp4_mt_probe()
1965 struct cyttsp4_mt_platform_data *pdata = cd->pdata->mt_pdata; in cyttsp4_mt_probe()
1984 md->input->id.bustype = cd->bus_ops->bustype; in cyttsp4_mt_probe()
1991 md->si = &cd->sysinfo; in cyttsp4_mt_probe()
1993 rc = cyttsp4_setup_input_device(cd); in cyttsp4_mt_probe()
2009 struct cyttsp4 *cd; in cyttsp4_probe() local
2020 cd = kzalloc(sizeof(*cd), GFP_KERNEL); in cyttsp4_probe()
2021 if (!cd) { in cyttsp4_probe()
2027 cd->xfer_buf = kzalloc(xfer_buf_size, GFP_KERNEL); in cyttsp4_probe()
2028 if (!cd->xfer_buf) { in cyttsp4_probe()
2035 cd->dev = dev; in cyttsp4_probe()
2036 cd->pdata = pdata; in cyttsp4_probe()
2037 cd->cpdata = pdata->core_pdata; in cyttsp4_probe()
2038 cd->bus_ops = ops; in cyttsp4_probe()
2041 mutex_init(&cd->system_lock); in cyttsp4_probe()
2042 mutex_init(&cd->adap_lock); in cyttsp4_probe()
2045 init_waitqueue_head(&cd->wait_q); in cyttsp4_probe()
2048 INIT_WORK(&cd->startup_work, cyttsp4_startup_work_function); in cyttsp4_probe()
2049 INIT_WORK(&cd->watchdog_work, cyttsp4_watchdog_work); in cyttsp4_probe()
2052 cd->irq = gpio_to_irq(cd->cpdata->irq_gpio); in cyttsp4_probe()
2053 if (cd->irq < 0) { in cyttsp4_probe()
2058 dev_set_drvdata(dev, cd); in cyttsp4_probe()
2061 if (cd->cpdata->init) { in cyttsp4_probe()
2062 dev_dbg(cd->dev, "%s: Init HW\n", __func__); in cyttsp4_probe()
2063 rc = cd->cpdata->init(cd->cpdata, 1, cd->dev); in cyttsp4_probe()
2065 dev_dbg(cd->dev, "%s: No HW INIT function\n", __func__); in cyttsp4_probe()
2069 dev_err(cd->dev, "%s: HW Init fail r=%d\n", __func__, rc); in cyttsp4_probe()
2071 dev_dbg(dev, "%s: initialize threaded irq=%d\n", __func__, cd->irq); in cyttsp4_probe()
2072 if (cd->cpdata->level_irq_udelay > 0) in cyttsp4_probe()
2079 rc = request_threaded_irq(cd->irq, NULL, cyttsp4_irq, irq_flags, in cyttsp4_probe()
2080 dev_name(dev), cd); in cyttsp4_probe()
2087 timer_setup(&cd->watchdog_timer, cyttsp4_watchdog_timer, 0); in cyttsp4_probe()
2093 rc = cyttsp4_startup(cd); in cyttsp4_probe()
2096 if (rc < 0 && cd->mode == CY_MODE_UNKNOWN) { in cyttsp4_probe()
2097 dev_err(cd->dev, "%s: Fail initial startup r=%d\n", in cyttsp4_probe()
2102 rc = cyttsp4_mt_probe(cd); in cyttsp4_probe()
2110 return cd; in cyttsp4_probe()
2113 cancel_work_sync(&cd->startup_work); in cyttsp4_probe()
2114 cyttsp4_stop_wd_timer(cd); in cyttsp4_probe()
2116 cyttsp4_free_si_ptrs(cd); in cyttsp4_probe()
2117 free_irq(cd->irq, cd); in cyttsp4_probe()
2119 if (cd->cpdata->init) in cyttsp4_probe()
2120 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_probe()
2122 kfree(cd->xfer_buf); in cyttsp4_probe()
2124 kfree(cd); in cyttsp4_probe()
2138 int cyttsp4_remove(struct cyttsp4 *cd) in cyttsp4_remove() argument
2140 struct device *dev = cd->dev; in cyttsp4_remove()
2142 cyttsp4_mt_release(&cd->md); in cyttsp4_remove()
2151 cancel_work_sync(&cd->startup_work); in cyttsp4_remove()
2153 cyttsp4_stop_wd_timer(cd); in cyttsp4_remove()
2155 free_irq(cd->irq, cd); in cyttsp4_remove()
2156 if (cd->cpdata->init) in cyttsp4_remove()
2157 cd->cpdata->init(cd->cpdata, 0, dev); in cyttsp4_remove()
2158 cyttsp4_free_si_ptrs(cd); in cyttsp4_remove()
2159 kfree(cd); in cyttsp4_remove()