Linux Input Archive on lore.kernel.org
 help / color / Atom feed
From: Jiada Wang <jiada_wang@mentor.com>
To: <nick@shmanahar.org>, <dmitry.torokhov@gmail.com>,
	<jikos@kernel.org>, <benjamin.tissoires@redhat.com>,
	<bsz@semihalf.com>, <rydberg@bitmath.org>
Cc: <linux-input@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<erosca@de.adit-jv.com>, <Andrew_Gabbasov@mentor.com>,
	<jiada_wang@mentor.com>
Subject: [PATCH v8 38/52] Input: atmel_mxt_ts: Add support for run self-test routine.
Date: Thu, 19 Mar 2020 08:00:02 -0700
Message-ID: <20200319150016.61398-39-jiada_wang@mentor.com> (raw)
In-Reply-To: <20200319150016.61398-1-jiada_wang@mentor.com>

From: Nikhil Ravindran <Nikhil.Ravindran@in.bosch.com>

The self test object T25 runs self test routines in device to find faults
Sysfs entry add to start self test routine and read back the test results
for atmel touchcontrollers.The feature will be used for A-IVI and CAF
projects.

Signed-off-by: Nikhil Ravindran <Nikhil.Ravindran@in.bosch.com>
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
 drivers/input/touchscreen/atmel_mxt_ts.c | 113 +++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index edffdec0d2a2..fe646d7edccf 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -336,6 +336,9 @@ struct mxt_data {
 	u8 t100_aux_ampl;
 	u8 t100_aux_area;
 	u8 t100_aux_vect;
+	u16 T25_address;
+	u8  T25_reportid;
+	u8  t25_msg[6];
 	bool debug_enabled;
 	bool debug_v2_enabled;
 	u8 *debug_msg_data;
@@ -413,6 +416,8 @@ struct mxt_data {
 
 	/* Indicates whether device is updating configuration */
 	bool updating_config;
+
+	bool t25_status;
 };
 
 struct mxt_vb2_buffer {
@@ -1356,6 +1361,24 @@ static void mxt_proc_t93_messages(struct mxt_data *data, u8 *msg)
 	dev_info(dev, "T93 report double tap %d\n", status);
 }
 
+static void mxt_proc_t25_messages(struct mxt_data *data, u8 *msg)
+{
+	struct device *dev = &data->client->dev;
+
+	/* Output debug if status has changed */
+	dev_dbg(dev, "T25 Status 0x%x Info: %x %x %x %x %x\n",
+		msg[1],
+		msg[2],
+		msg[3],
+		msg[4],
+		msg[5],
+		msg[6]);
+
+	/* Save current status */
+	memcpy(&data->t25_msg[0], &msg[1], sizeof(data->t25_msg));
+	data->t25_status = false;
+}
+
 static int mxt_proc_message(struct mxt_data *data, u8 *message)
 {
 	u8 report_id = message[0];
@@ -1386,6 +1409,8 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message)
 	} else if (report_id == data->T19_reportid) {
 		mxt_input_button(data, message);
 		data->update_input = true;
+	} else if (report_id == data->T25_reportid) {
+		mxt_proc_t25_messages(data, message);
 	} else if (report_id >= data->T15_reportid_min
 		   && report_id <= data->T15_reportid_max) {
 		mxt_proc_t15_messages(data, message);
@@ -1610,6 +1635,86 @@ static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset,
 	return 0;
 }
 
+static int mxt_t25_command(struct mxt_data *data, u8 cmd, bool wait)
+{
+	u16 reg;
+	int timeout_counter = 0;
+	int ret;
+	u8  val[2];
+
+	reg = data->T25_address;
+	val[0] = 0x3;
+	val[1] = cmd;
+
+	data->t25_status = true;
+	ret = __mxt_write_reg(data->client, reg, sizeof(val), val);
+	if (ret) {
+		data->t25_status = false;
+		return ret;
+	}
+
+	if (!wait)
+		return 0;
+
+	do {
+		msleep(MXT_WAKEUP_TIME);
+		ret = __mxt_read_reg(data->client, reg + 1, 1, &val[1]);
+		if (ret)
+			return ret;
+	} while ((val[1] != 0) && (timeout_counter++ <= 100));
+
+	if (timeout_counter > 100) {
+		dev_err(&data->client->dev, "Command failed!\n");
+		data->t25_status = false;
+		return -EIO;
+	}
+	return 0;
+}
+
+/* Firmware Version is returned as Major.Minor.Build */
+static ssize_t mxt_t25_selftest_show(struct device *dev, struct
+				     device_attribute * attr, char *buf)
+{
+	struct mxt_data *data = dev_get_drvdata(dev);
+	ssize_t offset = 0;
+
+	if (data->t25_status)
+		return -EAGAIN;
+
+	if (data->t25_msg[0] == 0xFE)
+		offset += scnprintf(buf, PAGE_SIZE, "PASS\n");
+	else
+		offset += scnprintf(buf, PAGE_SIZE, "FAILED\n");
+
+	offset += scnprintf(buf + offset, PAGE_SIZE, "%x %x %x %x %x %x\n",
+		 data->t25_msg[0],
+		 data->t25_msg[1],
+		 data->t25_msg[2],
+		 data->t25_msg[3],
+		 data->t25_msg[4],
+		 data->t25_msg[5]);
+	return offset;
+}
+
+static ssize_t mxt_t25_selftest_store(struct device *dev, struct
+				      device_attribute * attr, const char *buf,
+				      size_t count)
+{
+	struct mxt_data *data = dev_get_drvdata(dev);
+	u32 cmd;
+	int ret;
+
+	ret = kstrtou32(buf, 0, &cmd);
+	if (ret)
+		return ret;
+
+	if (mxt_t25_command(data, (u8)cmd, 1) == 0)
+		return count;
+
+	dev_dbg(dev, "mxt_t25_cmd_store write cmd %x error\n", cmd);
+	return -EINVAL;
+}
+
 static int mxt_acquire_irq(struct mxt_data *data)
 {
 	int error;
@@ -2088,6 +2193,8 @@ static void mxt_free_object_table(struct mxt_data *data)
 	data->T15_reportid_max = 0;
 	data->T18_address = 0;
 	data->T19_reportid = 0;
+	data->T25_address = 0;
+	data->T25_reportid = 0;
 	data->T42_reportid_min = 0;
 	data->T42_reportid_max = 0;
 	data->T44_address = 0;
@@ -2175,6 +2282,10 @@ static int mxt_parse_object_table(struct mxt_data *data,
 		case MXT_SPT_COMMSCONFIG_T18:
 			data->T18_address = object->start_address;
 			break;
+		case MXT_SPT_SELFTEST_T25:
+			data->T25_address = object->start_address;
+			data->T25_reportid = min_id;
+			break;
 		case MXT_PROCI_TOUCHSUPPRESSION_T42:
 			data->T42_reportid_min = min_id;
 			data->T42_reportid_max = max_id;
@@ -3761,6 +3872,7 @@ static DEVICE_ATTR(debug_enable, 0600, mxt_debug_enable_show,
 static DEVICE_ATTR(debug_v2_enable, 0600, NULL,
 		   mxt_debug_v2_enable_store);
 static DEVICE_ATTR(debug_notify, 0444, mxt_debug_notify_show, NULL);
+static DEVICE_ATTR(t25, 0600, mxt_t25_selftest_show, mxt_t25_selftest_store);
 
 static struct attribute *mxt_attrs[] = {
 	&dev_attr_fw_version.attr,
@@ -3771,6 +3883,7 @@ static struct attribute *mxt_attrs[] = {
 	&dev_attr_debug_enable.attr,
 	&dev_attr_debug_v2_enable.attr,
 	&dev_attr_debug_notify.attr,
+	&dev_attr_t25.attr,
 	NULL
 };
 
-- 
2.17.1


  parent reply index

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-19 14:59 [PATCH v8 00/52] atmel_mxt_ts misc Jiada Wang
2020-03-19 14:59 ` [PATCH v8 01/52] Input: introduce input_mt_report_slot_inactive Jiada Wang
2020-03-19 14:59 ` [PATCH v8 02/52] Input: atmel_mxt_ts - rework sysfs init/remove Jiada Wang
2020-03-19 14:59 ` [PATCH v8 03/52] Input: atmel_mxt_ts - only read messages in mxt_acquire_irq() when necessary Jiada Wang
2020-03-19 14:59 ` [PATCH v8 04/52] Input: atmel_mxt_ts - split large i2c transfers into blocks Jiada Wang
2020-03-19 14:59 ` [PATCH v8 05/52] Input: atmel_mxt_ts - output status from T48 Noise Supression Jiada Wang
2020-03-19 14:59 ` [PATCH v8 06/52] Input: atmel_mxt_ts - output status from T42 Touch Suppression Jiada Wang
2020-03-19 14:59 ` [PATCH v8 07/52] Input: atmel_mxt_ts - implement T9 vector/orientation support Jiada Wang
2020-03-19 14:59 ` [PATCH v8 08/52] Input: atmel_mxt_ts - implement T15 Key Array support Jiada Wang
2020-03-19 14:59 ` [PATCH v8 09/52] Input: atmel_mxt_ts - handle reports from T47 Stylus object Jiada Wang
2020-03-19 14:59 ` [PATCH v8 10/52] Input: atmel_mxt_ts - implement support for T107 active stylus Jiada Wang
2020-03-19 14:59 ` [PATCH v8 11/52] Input: atmel_mxt_ts - add debug for T92 gesture and T93 touch seq msgs Jiada Wang
2020-03-19 14:59 ` [PATCH v8 12/52] Input: atmel_mxt_ts - release touch state during suspend Jiada Wang
2020-03-19 14:59 ` [PATCH v8 13/52] Input: atmel_mxt_ts - add regulator control support Jiada Wang
2020-03-19 14:59 ` [PATCH v8 14/52] dt-bindings: input: atmel: add suspend mode support Jiada Wang
2020-03-19 14:59 ` [PATCH v8 15/52] Input: atmel_mxt_ts - report failures in suspend/resume Jiada Wang
2020-03-19 14:59 ` [PATCH v8 16/52] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
2020-03-19 14:59 ` [PATCH v8 17/52] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs Jiada Wang
2020-03-19 14:59 ` [PATCH v8 18/52] dt-bindings: input: atmel: provide name of configuration file Jiada Wang
2020-03-19 14:59 ` [PATCH v8 19/52] Input: atmel_mxt_ts - allow input name to be specified in platform data Jiada Wang
2020-03-19 14:59 ` [PATCH v8 20/52] dt-bindings: input: atmel: support to specify input name Jiada Wang
2020-03-19 14:59 ` [PATCH v8 21/52] Input: atmel_mxt_ts - add config checksum attribute to sysfs Jiada Wang
2020-03-19 14:59 ` [PATCH v8 22/52] Input: atmel_mxt_ts - refactor firmware flash to extract context into struct Jiada Wang
2020-03-19 14:59 ` [PATCH v8 23/52] Input: atmel_mxt_ts - refactor code to enter bootloader into separate func Jiada Wang
2020-03-19 14:59 ` [PATCH v8 24/52] Input: atmel_mxt_ts - combine bootloader version query with probe Jiada Wang
2020-03-19 14:59 ` [PATCH v8 25/52] Input: atmel_mxt_ts - improve bootloader state machine handling Jiada Wang
2020-03-19 14:59 ` [PATCH v8 26/52] Input: atmel_mxt_ts - rename bl_completion to chg_completion Jiada Wang
2020-03-19 14:59 ` [PATCH v8 27/52] Input: atmel_mxt_ts - make bootloader interrupt driven Jiada Wang
2020-03-19 14:59 ` [PATCH v8 28/52] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators Jiada Wang
2020-03-19 14:59 ` [PATCH v8 29/52] Input: atmel_mxt_ts - implement I2C retries Jiada Wang
2020-03-19 14:59 ` [PATCH v8 30/52] Input: atmel_mxt_ts - orientation is not present in hover Jiada Wang
2020-03-19 14:59 ` [PATCH v8 31/52] Input: atmel_mxt_ts - implement debug output for messages Jiada Wang
2020-03-19 14:59 ` [PATCH v8 32/52] Input: atmel_mxt_ts - implement improved debug message interface Jiada Wang
2020-03-19 14:59 ` [PATCH v8 33/52] Input: atmel_mxt_ts - eliminate data->raw_info_block Jiada Wang
2020-03-19 14:59 ` [PATCH v8 34/52] Input: atmel_mxt_ts - Change call-points of mxt_free_* functions Jiada Wang
2020-03-19 14:59 ` [PATCH v8 35/52] Input: atmel_mxt_ts - rely on calculated_crc rather than file config_crc Jiada Wang
2020-03-19 15:00 ` [PATCH v8 36/52] input: atmel_mxt_ts: export GPIO reset line via sysfs Jiada Wang
2020-03-19 15:00 ` [PATCH v8 37/52] input: atmel_mxt_ts: Add Missing Delay for reset handling of Atmel touch panel controller in detachable displays Jiada Wang
2020-03-19 15:00 ` Jiada Wang [this message]
2020-03-19 15:00 ` [PATCH v8 39/52] Input: atmel_mxt_ts: Limit the max bytes transferred in an i2c transaction Jiada Wang
2020-03-19 15:00 ` [PATCH v8 40/52] dt-bindings: input: atmel: support to set max bytes transferred Jiada Wang
2020-03-19 15:00 ` [PATCH v8 41/52] Input: atmel_mxt_ts: return error from mxt_process_messages_until_invalid() Jiada Wang
2020-03-19 15:00 ` [PATCH v8 42/52] Input: Atmel: improve error handling in mxt_start() Jiada Wang
2020-03-19 15:00 ` [PATCH v8 43/52] Input: Atmel: improve error handling in mxt_initialize() Jiada Wang
2020-03-19 15:00 ` [PATCH v8 44/52] Input: Atmel: improve error handling in mxt_update_cfg() Jiada Wang
2020-03-19 15:00 ` [PATCH v8 45/52] Input: Atmel: Improve error handling in mxt_initialize_input_device() Jiada Wang
2020-03-19 15:00 ` [PATCH v8 46/52] Input: Atmel: handle ReportID "0x00" while processing T5 messages Jiada Wang
2020-03-19 15:00 ` [PATCH v8 47/52] Input: Atmel: use T44 object to process " Jiada Wang
2020-03-19 15:00 ` [PATCH v8 48/52] Input: atmel_mxt_ts: use gpiod_set_value_cansleep for reset pin Jiada Wang
2020-03-19 15:00 ` [PATCH v8 49/52] input: touchscreen: atmel_mxt_ts: Added sysfs entry for touchscreen status Jiada Wang
2020-03-19 15:00 ` [PATCH v8 50/52] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Jiada Wang
2020-03-19 15:00 ` [PATCH v8 51/52] Input: atmel_mxt_ts: Implement synchronization during various operation Jiada Wang
2020-03-19 15:00 ` [PATCH v8 52/52] Input: atmel_mxt_ts - Fix compilation warning Jiada Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200319150016.61398-39-jiada_wang@mentor.com \
    --to=jiada_wang@mentor.com \
    --cc=Andrew_Gabbasov@mentor.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=bsz@semihalf.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=erosca@de.adit-jv.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nick@shmanahar.org \
    --cc=rydberg@bitmath.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Linux Input Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-input/0 linux-input/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-input linux-input/ https://lore.kernel.org/linux-input \
		linux-input@vger.kernel.org
	public-inbox-index linux-input

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-input


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git