There is no need to allocate buffer each time we switch modes. First of all, the code is protected by checking the factory_mode state. The size of the buffer is static and can't be changed after ->probe() anyway. Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/input/touchscreen/edt-ft5x06.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index 1023d4134b8d..3895e194006a 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -544,16 +544,6 @@ static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) disable_irq(client->irq); - if (!tsdata->raw_buffer) { - tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * - sizeof(u16); - tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); - if (!tsdata->raw_buffer) { - error = -ENOMEM; - goto err_out; - } - } - /* mode register is 0x3c when in the work mode */ error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); if (error) { @@ -581,8 +571,6 @@ static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) return 0; err_out: - kfree(tsdata->raw_buffer); - tsdata->raw_buffer = NULL; tsdata->factory_mode = false; enable_irq(client->irq); @@ -622,9 +610,6 @@ static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) return -EIO; } - kfree(tsdata->raw_buffer); - tsdata->raw_buffer = NULL; - /* restore parameters */ edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, tsdata->threshold); @@ -697,7 +682,7 @@ static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file, mutex_lock(&tsdata->mutex); - if (!tsdata->factory_mode || !tsdata->raw_buffer) { + if (!tsdata->factory_mode) { error = -EIO; goto out; } @@ -774,6 +759,12 @@ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, debugfs_create_file("mode", S_IRUSR | S_IWUSR, tsdata->debug_dir, tsdata, &debugfs_mode_fops); + + tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * sizeof(u16); + tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); + if (!tsdata->raw_buffer) + return; + debugfs_create_file("raw_data", S_IRUSR, tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); } -- 2.25.1