static ssize_t tthe_get_panel_data_debugfs_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { struct cyttsp5_device_access_data *dad = filp->private_data; struct cyttsp5_device *ttsp; struct device *dev; u8 config; u16 actual_read_len; u16 length = 0; u8 element_size = 0; u8 *buf_offset; u8 *buf_out; int elem; int elem_offset = 0; int print_idx = 0; int rc; int rc1; int i; mutex_lock(&dad->debugfs_lock); ttsp = dad->ttsp; dev = &ttsp->dev; buf_out = dad->tthe_get_panel_data_buf; if (!buf_out) goto release_mutex; pm_runtime_get_sync(dev); rc = cyttsp5_request_exclusive(ttsp, CY_REQUEST_EXCLUSIVE_TIMEOUT); if (rc < 0) goto put_runtime; if (dad->heatmap.scan_start) { /* Start scan */ rc = cyttsp5_exec_scan_cmd_(ttsp); if (rc < 0) goto release_exclusive; } elem = dad->heatmap.num_element; rc = cyttsp5_ret_scan_data_cmd_(ttsp, elem_offset, elem, dad->heatmap.data_type, dad->ic_buf, &config, &actual_read_len, NULL); if (rc < 0) goto release_exclusive; length = get_unaligned_le16(&dad->ic_buf[0]); buf_offset = dad->ic_buf + length; element_size = config & CY_CMD_RET_PANEL_ELMNT_SZ_MASK; elem -= actual_read_len; elem_offset = actual_read_len; while (elem > 0) { rc = cyttsp5_ret_scan_data_cmd_(ttsp, elem_offset, elem, dad->heatmap.data_type, NULL, &config, &actual_read_len, buf_offset); if (rc < 0) goto release_exclusive; if (!actual_read_len) break; length += actual_read_len * element_size; buf_offset = dad->ic_buf + length; elem -= actual_read_len; elem_offset += actual_read_len; } /* Reconstruct cmd header */ put_unaligned_le16(length, &dad->ic_buf[0]); put_unaligned_le16(elem_offset, &dad->ic_buf[7]); release_exclusive: rc1 = cyttsp5_release_exclusive(ttsp); put_runtime: pm_runtime_put(dev); if (rc < 0) goto release_mutex; print_idx += scnprintf(buf_out, TTHE_TUNER_MAX_BUF, "CY_DATA:"); for (i = 0; i < length; i++) print_idx += scnprintf(buf_out + print_idx, TTHE_TUNER_MAX_BUF - print_idx, "%02X ", dad->ic_buf[i]); print_idx += scnprintf(buf_out + print_idx, TTHE_TUNER_MAX_BUF - print_idx, ":(%d bytes)\n", length); rc = simple_read_from_buffer(buf, count, ppos, buf_out, print_idx); print_idx = rc; release_mutex: mutex_unlock(&dad->debugfs_lock); return print_idx; }
static ssize_t panel_scan_debugfs_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { struct cyttsp5_device_access_debugfs_data *data = filp->private_data; struct cyttsp5_device_access_data *dad = data->dad; struct device *dev = dad->dev; int status = STATUS_FAIL; u8 config; u16 actual_read_len; int length = 0; u8 element_size = 0; u8 *buf_offset; int elem_offset = 0; int rc; if (*ppos) goto exit; 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_exec_scan_cmd_(dev); if (rc < 0) { dev_err(dev, "%s: Error on execute panel scan r=%d\n", __func__, rc); goto resume_scan; } /* Set length to max to read all */ rc = cyttsp5_ret_scan_data_cmd_(dev, 0, 0xFFFF, dad->panel_scan_data_id, dad->ic_buf, &config, &actual_read_len, NULL); if (rc < 0) { dev_err(dev, "%s: Error on retrieve panel scan r=%d\n", __func__, rc); goto resume_scan; } length = get_unaligned_le16(&dad->ic_buf[0]); buf_offset = dad->ic_buf + length; element_size = config & 0x07; elem_offset = actual_read_len; while (actual_read_len > 0) { rc = cyttsp5_ret_scan_data_cmd_(dev, elem_offset, 0xFFFF, dad->panel_scan_data_id, NULL, &config, &actual_read_len, buf_offset); if (rc < 0) goto resume_scan; length += actual_read_len * element_size; buf_offset = dad->ic_buf + length; elem_offset += actual_read_len; } /* Reconstruct cmd header */ put_unaligned_le16(length, &dad->ic_buf[0]); put_unaligned_le16(elem_offset, &dad->ic_buf[7]); /* Do not print command header */ length -= 5; 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; data->pr_buf_len = prepare_print_buffer(status, &dad->ic_buf[5], length, data->pr_buf, sizeof(data->pr_buf)); mutex_unlock(&dad->sysfs_lock); exit: return simple_read_from_buffer(buf, count, ppos, data->pr_buf, data->pr_buf_len); }