static ssize_t baseline_debugfs_write(struct file *filp, const 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; ssize_t length; int rc = 0; rc = simple_write_to_buffer(data->pr_buf, sizeof(data->pr_buf), ppos, buf, count); if (rc < 0) return rc; count = rc; mutex_lock(&dad->sysfs_lock); length = cyttsp5_ic_parse_input(dad->dev, buf, count, dad->ic_buf, CY_MAX_PRBUF_SIZE); if (length != 1) { dev_err(dad->dev, "%s: Malformed input\n", __func__); rc = -EINVAL; goto exit_unlock; } dad->baseline_sensing_mode = dad->ic_buf[0]; exit_unlock: mutex_unlock(&dad->sysfs_lock); if (rc) return rc; return count; }
static ssize_t cyttsp5_calibrate_store(struct device *dev, struct cyttsp5_attribute *attr, const char *buf, size_t size) { struct cyttsp5_device_access_data *dad = cyttsp5_get_device_access_data(dev); ssize_t length; int rc = 0; mutex_lock(&dad->sysfs_lock); length = cyttsp5_ic_parse_input(dev, buf, size, dad->ic_buf, CY_MAX_PRBUF_SIZE); if (length != 2) { dev_err(dev, "%s: Malformed input\n", __func__); rc = -EINVAL; goto exit_unlock; } dad->calibrate_sensing_mode = dad->ic_buf[0]; dad->calibrate_initialize_baselines = dad->ic_buf[1]; exit_unlock: mutex_unlock(&dad->sysfs_lock); if (rc) return rc; return size; }
static ssize_t tthe_get_panel_data_debugfs_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { struct cyttsp5_device_access_data *dad = filp->private_data; struct device *dev = &dad->ttsp->dev; ssize_t length; int max_read; u8 *buf_in = dad->tthe_get_panel_data_buf; int ret; mutex_lock(&dad->debugfs_lock); ret = copy_from_user(buf_in + (*ppos), buf, count); if (ret) goto exit; buf_in[count] = 0; length = cyttsp5_ic_parse_input(dev, buf_in, count, dad->ic_buf, CY_MAX_PRBUF_SIZE); if (length <= 0) { dev_err(dev, "%s: %s Group Data store\n", __func__, "Malformed input for"); goto exit; } /* update parameter value */ dad->heatmap.num_element = get_unaligned_le16(&dad->ic_buf[3]); dad->heatmap.data_type = dad->ic_buf[5]; if (dad->ic_buf[6] > 0) dad->heatmap.scan_start = true; else dad->heatmap.scan_start = false; /* elem can not be bigger then buffer size */ max_read = CY_CMD_RET_PANEL_HDR; max_read += dad->heatmap.num_element * CY_CMD_RET_PANEL_ELMNT_SZ_MAX; if (max_read >= CY_MAX_PRBUF_SIZE) { dad->heatmap.num_element = (CY_MAX_PRBUF_SIZE - CY_CMD_RET_PANEL_HDR) / CY_CMD_RET_PANEL_ELMNT_SZ_MAX; dev_err(dev, "%s: Will get %d element\n", __func__, dad->heatmap.num_element); } exit: mutex_unlock(&dad->debugfs_lock); dev_vdbg(dev, "%s: return count=%d\n", __func__, count); return count; }
static ssize_t cyttsp5_command_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct cyttsp5_device_access_data *dad = dev_get_drvdata(dev); ssize_t length; int rc; mutex_lock(&dad->sysfs_lock); dad->status = 0; #ifdef CONFIG_TCMD dad->tcmdread_status = 0; #endif dad->response_length = 0; length = cyttsp5_ic_parse_input(dev, buf, size, dad->ic_buf, CY_MAX_PRBUF_SIZE); if (length <= 0) { dev_err(dev, "%s: %s Group Data store\n", __func__, "Malformed input for"); goto exit; } /* write ic_buf to log */ cyttsp5_pr_buf(dev, dad->pr_buf, dad->ic_buf, length, "ic_buf"); pm_runtime_get_sync(dev); rc = cyttsp5_request_nonhid_user_cmd(dad->ttsp, 1, CY_MAX_PRBUF_SIZE, dad->response_buf, length, dad->ic_buf, &dad->response_length); pm_runtime_put(dev); if (rc) { dad->response_length = 0; dev_err(dev, "%s: Failed to store command\n", __func__); } else { dad->status = 1; #ifdef CONFIG_TCMD dad->tcmdread_status = 1; #endif } exit: mutex_unlock(&dad->sysfs_lock); dev_vdbg(dev, "%s: return size=%d\n", __func__, size); return size; }