Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp3367584ybb; Tue, 31 Mar 2020 03:56:27 -0700 (PDT) X-Google-Smtp-Source: ADFU+vuSMPamixtxlM5pzARlFZnNM4HlvGDxcku/RdJhIoCVsxFS7G5fCFy9Om10KM0s+eXswSal X-Received: by 2002:aca:c45:: with SMTP id i5mr1497345oiy.101.1585652186770; Tue, 31 Mar 2020 03:56:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585652186; cv=none; d=google.com; s=arc-20160816; b=mQnNk7Mb5/F9w6EaiLn9t77E6T6uFeBDZzTdvEjDfKe5Fk6FBtSMTONQxUZYC71LSe 6VgcaLxDAfPVrWl8IOI1f1nuzlWdTrCUbkp9RN6x//8dcW5gluX/UnRkqKMaCtix3ybb TUGz8m9/O7JgJBPWFKObl0hdxzbdmo2tCY/4Ai3fwG+GraHXfQT3mA43lk8eA8vhUhoK vQKkX/tugIBMcepq+g7XSoOAPvh5IhRpLAeT/cm5600Y3Y87+Ior4WWsDPUdGnyz8nbc aHxb7B3CJ26eizFcvUr+7hRpc8ZAdLu2nkcPHnXaaFd+xeDTfbFO6Gc72HJLPsml6ZpM CTNw== 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=Tig/LQ5Ik/1+T3KQdJzGVPPo4zbCxfL8q0uc40yYfoA=; b=sjP/HI3kBcQm7k+z6atc5o29XZH9w2akW/TLGdcOwCyWx6bhVZ1WKej5GTtVccLPRu qpzaSabuqYTgUM1dVyAb3ccqQ3U1FRxtEkVnTt0dAAiTx6gWvxQpBXzHWMpk/8fkKPP4 yQDW1JouXSNlNjUl6ly8vmzAuI81j60i/2scawU9JufSmkgijnbUgTXfuKrZJZlTw+VP UPLpj6Py2xWBGTz/VVirBzN99p/Pv2RE5KqexB4+cGFMIcKcZ2R/N9KLGfLtOje7V3H5 +J2+jI0f9fPhJ/m/DBYv+CJw2pBe4BDowBjTxVa9DtXTx5B+otAH9Kqmiw+pb6HFqUWm tjZw== 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 i133si6847674oih.80.2020.03.31.03.56.14; Tue, 31 Mar 2020 03:56:26 -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 S1730822AbgCaKyS (ORCPT + 99 others); Tue, 31 Mar 2020 06:54:18 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:28112 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731057AbgCaKyR (ORCPT ); Tue, 31 Mar 2020 06:54:17 -0400 IronPort-SDR: h+TNjXr6Ll1dr6uT0F7vg/JUXBbUFvoV5x95jk9HM7RqSPdQ/jwRgcu7HkXEnKc5HMs/neoeXp WAnx1am3tKyEx56WGH0//xSIJKiToamXq3xv2ONvoUtYf1b+7NC/WFvgPQliVA2x0uAGWrIAze GHczuczCNMdeEphGrxBjNkHBeEbzD12DMW1CL5EQtxKyzdjw+5BlV+QL9AUODcaIJ1ARngbs01 ZdNVgJITtUJUwrOqn9zshwTKxkjaYeO2w70Mya1AuaqesOSEEnwl3CCo5MIs91NQyzekNuj+FO v/g= X-IronPort-AV: E=Sophos;i="5.72,327,1580803200"; d="scan'208";a="47293539" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa3.mentor.iphmx.com with ESMTP; 31 Mar 2020 02:54:16 -0800 IronPort-SDR: p8NJS/VmkhBqAPLQsogdZYWiw1TRxw2ju6VGP/Kvv5t5Mk5PsYmSked5KLPn7qTPPQcNK5J1/D 3lVE2vb/LPNWZYGUrc+4KDu2rqRf0U41WXC1R8gcTMfP2K632L5lW+X3oDGOo2vJDXzOODc+Yl W2Owkd3mrUdEgjXWyX2sJEIYuMZkSN+dxvU6QkCsYhpp/fICG6Gr4zxmxhsG5u5LCz5wilBYHF L3EOiAUFoJnJIVGM0eBT3NU7JMBaKYKJjPsrwZWe2SY1JOUvY3Lqti9JQhEpm7xRokdbKZ1LUu sKA= From: Jiada Wang To: , , , , CC: , , , , Subject: [PATCH v10 53/55] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Date: Tue, 31 Mar 2020 03:50:49 -0700 Message-ID: <20200331105051.58896-54-jiada_wang@mentor.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200331105051.58896-1-jiada_wang@mentor.com> References: <20200331105051.58896-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 dda10bb51cb3..10d6726de9c4 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -4015,6 +4015,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); @@ -4025,6 +4125,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, @@ -4037,6 +4138,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