Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp626410ybb; Wed, 25 Mar 2020 06:38:17 -0700 (PDT) X-Google-Smtp-Source: ADFU+vvuktZwDd75F47Ar4ZxVJ0UAd2sfqYbRidlx8CfGCFuyXKnG0eaa8ofCXSB1uFFO3BVeWZ4 X-Received: by 2002:a05:6808:6c9:: with SMTP id m9mr2467426oih.157.1585143496856; Wed, 25 Mar 2020 06:38:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585143496; cv=none; d=google.com; s=arc-20160816; b=MxcsiTfver8gz2fF5DegQD1TBjL3hhVURddiITpBUiDASG+NLNu5SlSj7Eec0531zu 7NdNKP6uDK553/JN+uC3R4Ei+MqVWmBejtpnPhi4WfTaI8V9x0KWrpZHWNpUvXfhYfbP Kn58SlPMXtDU+SvmZVz8b3bComWHE85c7itc5HfwNkNsTKJw6nLvxbCzOMk3xTbWaJsM 68VZKaILqlB1WChKqymmjKLYM+hti3n4yzV6eomda8SIxW9tsLalV1fCH31Kwg0FyMw7 Gt7aDf+d0QGrmTWceFZcOLm4bHVFfPkPfvII6fMVbl+IqHbBOSN9CR84FiF7T8Cam7L0 eh3Q== 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=qbACYhsuTo/vVrhkZp/d549MFUeM9qOcM2iHyb6IMdE=; b=MyYDbqh0QRXxmNC1CkmVMauS5mPhPXHVumAXFKKvBwRAOycT3ZhJCE86miGJKvTIXV vrz5hVaWoCocsMACEBT063i14mjShADP5axRnJWDYGo5vBfHmybY+CTfbUtdFJkB87hg gYAnRsPJYxdNYeZJq4FIlkvaccTHOFPnCcnIy/b/cMjRYIXsiaaLaqbl+FVfVUEpM8OG s+KDdRUsVSTGEOA1i81TyTjwv/ymmGV8wgYE7Bu4a8pWbPUK5z05P0opZVopXGjKQ/GC B2KDzbLrusDJdw0WOfqmfxeTGhE5vhblmV0i2atp7dfmlkJoN6/ndU38t/RCYKd95qB9 mxpw== 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 g129si1473259oob.1.2020.03.25.06.38.04; Wed, 25 Mar 2020 06:38:16 -0700 (PDT) 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 S1727644AbgCYNhP (ORCPT + 99 others); Wed, 25 Mar 2020 09:37:15 -0400 Received: from esa1.mentor.iphmx.com ([68.232.129.153]:4560 "EHLO esa1.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727841AbgCYNhO (ORCPT ); Wed, 25 Mar 2020 09:37:14 -0400 IronPort-SDR: lzM+9JOtMTXfukZVHEGaKqhAhlq70FV6hmPqIa/HvpaIMJrF2hxv11Lc3HY4lkZ4xreYsKnULE f+tWRGbsg47LgETRIc0VKv6TK1RSPui0Nb4kdSHxggUm66yen56SMdRel2Dmh3NPL++dlJiy0p i5xNsmd99ZG9SLn6xKW5CXDmlnQZvp0LAGAoek9lhMHd6hZIqNk5xXsxzqDN6JAxsa/6FadKe9 wZwUDn1ijMPqgMuYri40coV4wzPOm3F77xuwhETMSkKSCR9CQ340/42OzMdNkyIouPtAlNi2u6 adE= X-IronPort-AV: E=Sophos;i="5.72,304,1580803200"; d="scan'208";a="49060242" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa1.mentor.iphmx.com with ESMTP; 25 Mar 2020 05:37:12 -0800 IronPort-SDR: v0pCpSjWjqTJM2RO29tCtxtag62e5Wzl54+Mm3P7ZY0abPslX6ewbxYfdq0ydE0ZDsqA3PItI5 ffTPo7ZQJC2rgrwecyVpQkRsvpHRV1bhNJIhquKKFofO2Kl4iACIhWLm6jtN8OhOTHsZSG8Wse WsBMzhbY+1XxKIjPK3IkVihAaEnLFoCOMNUBGZzzxMbmspA77WPkwstlZLt9PwLEszC6gdJPsY +L9POfrhe/uNIqKixotPlF3oGOxCkNcW0ZVQyXqT14JuPHYfwUcxobs3Q8dLDv2AcDsf0Onek5 VWU= From: Jiada Wang To: , , , , , CC: , , , , Subject: [PATCH v9 53/55] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Date: Wed, 25 Mar 2020 06:33:32 -0700 Message-ID: <20200325133334.19346-54-jiada_wang@mentor.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200325133334.19346-1-jiada_wang@mentor.com> References: <20200325133334.19346-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 [jiada: Rename mxt_t38_data_show to t38_data_show Rename mxt_t38_data_store to t38_data_store Replace DEVICE_ATTR with DEVICE_ATTR_RW] 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 0cd807988382..1ba34c5f12bd 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -4039,6 +4039,106 @@ static ssize_t touch_dev_stat_show(struct device *dev, struct return ret; } +static ssize_t 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 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_RO(fw_version); static DEVICE_ATTR_RO(hw_version); static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL); @@ -4049,6 +4149,7 @@ static DEVICE_ATTR_RW(debug_v2_enable); static DEVICE_ATTR_RO(debug_notify); static DEVICE_ATTR_RW(t25_selftest); static DEVICE_ATTR_RO(touch_dev_stat); +static DEVICE_ATTR_RW(t38_data); static struct attribute *mxt_attrs[] = { &dev_attr_fw_version.attr, @@ -4061,6 +4162,7 @@ static struct attribute *mxt_attrs[] = { &dev_attr_debug_notify.attr, &dev_attr_t25_selftest.attr, &dev_attr_touch_dev_stat.attr, + &dev_attr_t38_data.attr, NULL }; -- 2.17.1