Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp4315968ybc; Fri, 22 Nov 2019 00:29:29 -0800 (PST) X-Google-Smtp-Source: APXvYqyrE5BiuRDJLVCV2uVRoANfzd0H1gDJUHFKWkKWqO/0xBjB7Lb0UNq4STy2l2hWcWe56djZ X-Received: by 2002:a17:906:b5b:: with SMTP id v27mr20289882ejg.327.1574411369290; Fri, 22 Nov 2019 00:29:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574411369; cv=none; d=google.com; s=arc-20160816; b=uYwS6zv8Zo/yTh5wfauyIPpRfBEHaZfkC9X0gHYraC/qaW57n/8fFuEitef9P0/P28 0YQIkm4xjTLosAxDoi/AZcriExZh2bOYtxWYcReFioAlHLspmTdlSef9KPN+gZaR2AQn BJKwwo80GyLhwO6F2PHPXdEt73betLvr1TY65gOWsH1ceJ0c4SRcI3JtIvXJZLjJb5HT 7RD3s9L7t293VESrlVMVTe4qUUt17nMAcCndjkYOobCf3OttTOow5TocS5bc87Gnn+Xq hazG8VjnASDT/UZ4YZsnWX1pEhBgv7Mu0F19/GP6FU9fy+/5GiIGwWZb3LLi2pY0b46a bR+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:ironport-sdr:ironport-sdr; bh=cpasgRLzhRHsx19wDDvAoJST5cbrrhX5UrkGGEqsjws=; b=jeHGIke0/wyE2soOeaQwf1svb+gudXPI5pX2KnfiCO5fVowuIfkdqKX6fcFvgU933o Bm9bY+qBYBVgZgYQtiNwL64HewZLvdbERioaYtb1CjWVy+03yixoYL/neYXWK3FDy6YG QLEvAFF4g3+2xwmMQ+iivVYy2gVA/mnBRBlMf8ILNMScdW+GgfFFJgvAqKk14Ot38i9W RzkKfGkZUKM4iRft4y47MfeR4dRLYpCy8/3jExqRwkUa/jHv8Yc8w88aFwU/2mF2SJa2 6jSbVcaML4eeqUT0OjIVLYBWRXL6PwabRN/vWVICtJJ8NUM6P9PEMHbT+vTxk/mRqePi 8UKw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q23si191194ejn.236.2019.11.22.00.29.04; Fri, 22 Nov 2019 00:29:29 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727772AbfKVI06 (ORCPT + 99 others); Fri, 22 Nov 2019 03:26:58 -0500 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:62619 "EHLO esa4.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727764AbfKVI04 (ORCPT ); Fri, 22 Nov 2019 03:26:56 -0500 IronPort-SDR: aPWFnJJfncbRd6BIwUX/gqOkeY/0L01ZvfK9fB6VNnQ6xqYO4mhW51IW0DIEz5gbN2GKaDAHNc kqilWxNfC5SNHeQ6VKcTW3rcN5oxwuR0EFGB/9iWx90pmV2TKxZrAiNIKC/qQ7c2VPXzYX/xnx AwWKN9hy4qT49+z5jbuXwb+HKUu590Qg0bJ7zAQH6FX6JR+2CfZ6OapaflEwNJX9XGMXwvjWBI Ca6bnm1bVu/yro1hMMM/tGxSDSwwy8VXmLXxG5LO7qf0ydqpbUeidzeuCyk192lFGLrPSVTs43 wDg= X-IronPort-AV: E=Sophos;i="5.69,229,1571731200"; d="scan'208";a="43457662" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 22 Nov 2019 00:26:56 -0800 IronPort-SDR: eLS9Ny9s5SShUsN76NALs6tm5kN6tpk5CkpShrSofqCShIPB7PkA/nIDsKhbP6W0N7KYYxjOnI Hpa9qm1lluIb3XjTQ0+SMpLl3PrjNBcHYPGeT552tCxXS4ZG6Wc96BHGvNL1vHkw9LT5W97wl2 rdJwGMd8rYAHDWKW5LDhyZJVp9X51mTAFJ3a0XAZ9DTmm0+fzXXUO5DLOpzX8mOSerNsjYsWgp Iqv7//AuZxVKE2w+S29cETyRbPIvIZ/pzgcfAkwo9HezycsIA/922kv/iC9r9G/xHcc00fC4Ar Ao8= From: Jiada Wang To: , , , , CC: , , , , Subject: [PATCH v6 46/48] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Date: Fri, 22 Nov 2019 17:24:00 +0900 Message-ID: <20191122082402.18173-47-jiada_wang@mentor.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191122082402.18173-1-jiada_wang@mentor.com> References: <20191122082402.18173-1-jiada_wang@mentor.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Naveen Chakka Atmel touch controller contains T38 object where a user can store its own data of length 64 bytes. T38 data will not be part of checksum calculation on executing T6 BACKUP command. format used to update the T38 data is given below: offset: offset address of the data to be written in the t38 object (in decimal) length: length of the data to be written into the t38 object(in decimal) data: actual data bytes to be written into the t38 object (values should be in hex) Ex: 1. 0 2 10 20 updates first two bytes of the t38 data with values 10 and 20 2. 19 6 10 2f 30 4a 50 60 updates 6 bytes of t38 data from the index 19-24 with hex values Signed-off-by: Naveen Chakka Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 102 +++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index d22a00ec69c1..a867960dc59b 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -4027,6 +4027,106 @@ static ssize_t mxt_touch_device_status(struct device *dev, struct return ret; } +static ssize_t mxt_t38_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct mxt_object *object; + size_t count = 0, size; + u8 i, *t38_buf; + + if (!data->object_table) + return -ENXIO; + + object = mxt_get_object(data, MXT_SPT_USERDATA_T38); + size = mxt_obj_size(object); + + /* Pre-allocate buffer large enough to hold max size of t38 object.*/ + t38_buf = kmalloc(size, GFP_KERNEL); + if (!t38_buf) + return -ENOMEM; + + count = __mxt_read_reg(data->client, object->start_address, + size, t38_buf); + if (count) + goto end; + + for (i = 0; i < size; i++) + count += scnprintf(buf + count, PAGE_SIZE - count, + "[%2u]: %02x\n", i, t38_buf[i]); + count += scnprintf(buf + count, PAGE_SIZE - count, "\n"); +end: + kfree(t38_buf); + return count; +} + +static ssize_t mxt_t38_data_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct mxt_object *object; + ssize_t ret = 0, pos, offset; + unsigned int i, len, index; + u8 *t38_buf; + + if (!data->object_table) + return -ENXIO; + + object = mxt_get_object(data, MXT_SPT_USERDATA_T38); + + /* Pre-allocate buffer large enough to hold max size of t38 object.*/ + t38_buf = kmalloc(mxt_obj_size(object), GFP_KERNEL); + if (!t38_buf) + return -ENOMEM; + + ret = sscanf(buf, "%zd %d%zd", &offset, &len, &pos); + if (ret != 2) { + dev_err(dev, "Bad format: Invalid parameter to update t38\n"); + ret = -EINVAL; + goto end; + } + + if (len == 0) { + dev_err(dev, + "Bad format: Data length should not be equal to 0\n"); + ret = -EINVAL; + goto end; + } + + if (offset < 0 || ((offset + len) > 64)) { + dev_err(dev, "Invalid offset value to update t38\n"); + ret = -EINVAL; + goto end; + } + + index = pos; + for (i = 0; i < len; i++) { + ret = sscanf(buf + index, "%hhx%zd", t38_buf + i, &pos); + if (ret != 1) { + dev_err(dev, "Bad format: Invalid Data\n"); + ret = -EINVAL; + goto end; + } + index += pos; + } + + ret = __mxt_write_reg(data->client, object->start_address + offset, + len, t38_buf); + if (ret) + goto end; + + ret = mxt_t6_command(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE, + true); + if (ret) + dev_err(dev, "backup command failed\n"); + else + ret = count; +end: + kfree(t38_buf); + return ret; +} + static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL); static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL); static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL); @@ -4039,6 +4139,7 @@ static DEVICE_ATTR(debug_v2_enable, S_IWUSR | S_IRUSR, NULL, static DEVICE_ATTR(debug_notify, S_IRUGO, mxt_debug_notify_show, NULL); static DEVICE_ATTR(t25, 0600, mxt_t25_selftest_show, mxt_t25_selftest_store); static DEVICE_ATTR(touch_dev_stat, 0444, mxt_touch_device_status, NULL); +static DEVICE_ATTR(t38_data, 0600, mxt_t38_data_show, mxt_t38_data_store); static struct attribute *mxt_attrs[] = { &dev_attr_fw_version.attr, @@ -4051,6 +4152,7 @@ static struct attribute *mxt_attrs[] = { &dev_attr_debug_notify.attr, &dev_attr_t25.attr, &dev_attr_touch_dev_stat.attr, + &dev_attr_t38_data.attr, NULL }; -- 2.17.1