static ssize_t calibrate_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; int length = 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_calibrate_idacs_cmd(dev, dad->calibrate_sensing_mode, &dad->ic_buf[0]); if (rc < 0) { dev_err(dev, "%s: Error on calibrate idacs r=%d\n", __func__, rc); goto resume_scan; } length = 1; /* Check if baseline initialization is requested */ if (dad->calibrate_initialize_baselines) { /* Perform baseline initialization for all modes */ rc = _cyttsp5_initialize_baselines_cmd(dev, CY_IB_SM_MUTCAP | CY_IB_SM_SELFCAP | CY_IB_SM_BUTTON, &dad->ic_buf[length]); if (rc < 0) { dev_err(dev, "%s: Error on initialize baselines r=%d\n", __func__, rc); goto resume_scan; } length++; } 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, 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); }
static ssize_t cyttsp5_calibrate_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; 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_calibrate_idacs_cmd(dev, dad->calibrate_sensing_mode, &dad->ic_buf[0]); if (rc < 0) { dev_err(dev, "%s: Error on calibrate idacs r=%d\n", __func__, rc); goto resume_scan; } length = 1; /* Check if baseline initialization is requested */ if (dad->calibrate_initialize_baselines) { /* Perform baseline initialization for all modes */ rc = _cyttsp5_initialize_baselines_cmd(dev, CY_IB_SM_MUTCAP | CY_IB_SM_SELFCAP | CY_IB_SM_BUTTON, &dad->ic_buf[length]); if (rc < 0) { dev_err(dev, "%s: Error on initialize baselines r=%d\n", __func__, rc); goto resume_scan; } length++; } 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; }