static ssize_t cyttsp5_run_and_get_selftest_result(struct device *dev, char *buf, size_t buf_len, u8 test_id, u16 read_length, bool get_result_on_pass) { struct cyttsp5_device_access_data *dad = cyttsp5_get_device_access_data(dev); int status = STATUS_FAIL; u8 cmd_status = 0; u8 summary_result = 0; u16 act_length = 0; int length = 0; int size; int rc; mutex_lock(&dad->sysfs_lock); pm_runtime_get_sync(dev); rc = cmd->request_exclusive(dev, CY_REQUEST_EXCLUSIVE_TIMEOUT); if (rc < 0) { dev_err(dev, "%s: Error on request exclusive r=%d\n", __func__, rc); goto put_pm_runtime; } rc = cyttsp5_suspend_scan_cmd_(dev); if (rc < 0) { dev_err(dev, "%s: Error on suspend scan r=%d\n", __func__, rc); goto release_exclusive; } rc = cyttsp5_run_selftest_cmd_(dev, test_id, 0, &cmd_status, &summary_result, NULL); if (rc < 0) { dev_err(dev, "%s: Error on run self test for test_id:%d r=%d\n", __func__, test_id, rc); goto resume_scan; } /* Form response buffer */ dad->ic_buf[0] = cmd_status; dad->ic_buf[1] = summary_result; length = 2; /* Get data if command status is success */ if (cmd_status != CY_CMD_STATUS_SUCCESS) goto status_success; /* Get data unless test result is pass */ if (summary_result == CY_ST_RESULT_PASS && !get_result_on_pass) goto status_success; rc = cyttsp5_get_selftest_result_cmd_(dev, 0, read_length, test_id, &cmd_status, &act_length, &dad->ic_buf[6]); if (rc < 0) { dev_err(dev, "%s: Error on get self test result r=%d\n", __func__, rc); goto resume_scan; } dad->ic_buf[2] = cmd_status; dad->ic_buf[3] = test_id; dad->ic_buf[4] = LOW_BYTE(act_length); dad->ic_buf[5] = HI_BYTE(act_length); length = 6 + act_length; status_success: status = STATUS_SUCCESS; resume_scan: cyttsp5_resume_scan_cmd_(dev); release_exclusive: cmd->release_exclusive(dev); put_pm_runtime: pm_runtime_put(dev); if (status == STATUS_FAIL) length = 0; size = prepare_print_buffer(status, dad->ic_buf, length, buf, buf_len); mutex_unlock(&dad->sysfs_lock); return size; }
static ssize_t cyttsp5_opens_show(struct device *dev, struct cyttsp5_attribute *attr, char *buf) { struct cyttsp5_device_access_data *dad = cyttsp5_get_device_access_data(dev); int status = STATUS_FAIL; u8 cmd_status = 0; u8 summary_result = 0; u16 act_length = 0; int length = 0; int size; int rc; mutex_lock(&dad->sysfs_lock); pm_runtime_get_sync(dev); rc = cmd->request_exclusive(dev, CY_REQUEST_EXCLUSIVE_TIMEOUT); if (rc < 0) { dev_err(dev, "%s: Error on request exclusive r=%d\n", __func__, rc); goto put_pm_runtime; } rc = cyttsp5_suspend_scan_cmd_(dev); if (rc < 0) { dev_err(dev, "%s: Error on suspend scan r=%d\n", __func__, rc); goto release_exclusive; } rc = cyttsp5_run_selftest_cmd_(dev, CY_ST_ID_OPENS, 0, &cmd_status, &summary_result, NULL); if (rc < 0) { dev_err(dev, "%s: Error on run self test r=%d\n", __func__, rc); goto resume_scan; } /* Form response buffer */ dad->ic_buf[0] = cmd_status; dad->ic_buf[1] = summary_result; length = 2; /* Get data unless test result is success */ if (cmd_status == CY_CMD_STATUS_SUCCESS && summary_result == CY_ST_RESULT_PASS) goto status_success; /* Set length to PIP_CMD_MAX_LENGTH to read all */ rc = cyttsp5_get_selftest_result_cmd_(dev, 0, PIP_CMD_MAX_LENGTH, CY_ST_ID_OPENS, &cmd_status, &act_length, &dad->ic_buf[6]); if (rc < 0) { dev_err(dev, "%s: Error on get self test result r=%d\n", __func__, rc); goto resume_scan; } dad->ic_buf[2] = cmd_status; dad->ic_buf[3] = CY_ST_ID_OPENS; dad->ic_buf[4] = LOW_BYTE(act_length); dad->ic_buf[5] = HI_BYTE(act_length); length = 6 + act_length; status_success: status = STATUS_SUCCESS; resume_scan: cyttsp5_resume_scan_cmd_(dev); release_exclusive: cmd->release_exclusive(dev); put_pm_runtime: pm_runtime_put(dev); if (status == STATUS_FAIL) length = 0; size = prepare_print_buffer(status, dad->ic_buf, length, buf); mutex_unlock(&dad->sysfs_lock); return size; }