linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiada Wang <jiada_wang@mentor.com>
To: <jikos@kernel.org>, <benjamin.tissoires@redhat.com>,
	<rydberg@bitmath.org>, <dmitry.torokhov@gmail.com>,
	<nick@shmanahar.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 v6 43/48] Input: Atmel: use T44 object to process T5 messages
Date: Fri, 22 Nov 2019 17:23:57 +0900	[thread overview]
Message-ID: <20191122082402.18173-44-jiada_wang@mentor.com> (raw)
In-Reply-To: <20191122082402.18173-1-jiada_wang@mentor.com>

From: Deepak Das <deepak_das@mentor.com>

T44 object returns the count of valid T5 messages in the buffer. According
to atmel, this count should be the main criteria to read the number of T5
messages.

Following is the statement from atmel confirming the same :-
"For the readout of messages we recommend to stop after the last message
is read out from the buffer. One way to identify the amount of new messages
is to read T44. The other way is to monitor the /CHG line which indicates
independent of mode 0 or mode 1 if there are still data in the buffer.
0xFF indicates that there is no message pending anymore, but it is not
recommended to use this as the main criteria to control the
data transfer."

This commit modifies the logic to readout the T5 messages on the basis
of T44 object.

Signed-off-by: Deepak Das <deepak_das@mentor.com>
Signed-off-by: Sanjeev Chugh <sanjeev_chugh@mentor.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 | 55 +++++++++++++++---------
 1 file changed, 35 insertions(+), 20 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 8d6478834fd8..0e4a870fafa5 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1489,7 +1489,7 @@ static u8 mxt_max_msg_read_count(struct mxt_data *data, u8 max_T5_msg_count)
 	return min(T5_msg_count_limit, max_T5_msg_count);
 }
 
-static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
+static int mxt_process_messages_t44(struct mxt_data *data)
 {
 	struct device *dev = &data->client->dev;
 	int ret;
@@ -1502,7 +1502,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
 		data->T5_msg_size + 1, data->msg_buf);
 	if (ret) {
 		dev_err(dev, "Failed to read T44 and T5 (%d)\n", ret);
-		return IRQ_NONE;
+		return ret;
 	}
 
 	T5_msg_count = data->msg_buf[0];
@@ -1512,7 +1512,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
 	 * Mode 0. It results in unnecessary I2C operations but it is benign.
 	 */
 	if (!T5_msg_count)
-		return IRQ_NONE;
+		return processed_valid;
 
 	if (T5_msg_count > data->max_reportid) {
 		dev_warn(dev, "T44 count %d exceeded max report id\n",
@@ -1524,12 +1524,14 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
 	ret = mxt_proc_message(data, data->msg_buf + 1);
 	if (ret < 0) {
 		dev_warn(dev, "Unexpected invalid message\n");
-		return IRQ_NONE;
+		return ret;
 	}
 
 	total_pending = T5_msg_count - 1;
-	if (!total_pending)
+	if (!total_pending) {
+		processed_valid = 1;
 		goto end;
+	}
 
 	/* Process remaining messages if necessary */
 	T5_msg_count = mxt_max_msg_read_count(data, total_pending);
@@ -1553,7 +1555,7 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
 		data->update_input = false;
 	}
 
-	return IRQ_HANDLED;
+	return processed_valid;
 }
 
 static int mxt_process_messages_until_invalid(struct mxt_data *data)
@@ -1583,7 +1585,7 @@ static int mxt_process_messages_until_invalid(struct mxt_data *data)
 	return -EBUSY;
 }
 
-static irqreturn_t mxt_process_messages(struct mxt_data *data)
+static int mxt_process_messages(struct mxt_data *data)
 {
 	int total_handled, num_handled;
 	u8 count = data->last_message_count;
@@ -1594,7 +1596,7 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
 	/* include final invalid message */
 	total_handled = mxt_read_and_process_messages(data, count + 1);
 	if (total_handled < 0)
-		return IRQ_NONE;
+		return total_handled;
 	/* if there were invalid messages, then we are done */
 	else if (total_handled <= count)
 		goto update_count;
@@ -1603,7 +1605,7 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
 	do {
 		num_handled = mxt_read_and_process_messages(data, 2);
 		if (num_handled < 0)
-			return IRQ_NONE;
+			return num_handled;
 
 		total_handled += num_handled;
 
@@ -1619,12 +1621,13 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
 		data->update_input = false;
 	}
 
-	return IRQ_HANDLED;
+	return total_handled;
 }
 
 static irqreturn_t mxt_interrupt(int irq, void *dev_id)
 {
 	struct mxt_data *data = dev_id;
+	int ret;
 
 	if (data->in_bootloader) {
 		complete(&data->chg_completion);
@@ -1632,17 +1635,22 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id)
 		if (data->flash)
 			cancel_delayed_work_sync(&data->flash->work);
 
-		return IRQ_RETVAL(mxt_check_bootloader(data));
+		ret = mxt_check_bootloader(data);
+		return IRQ_RETVAL(ret);
 	}
 
 	if (!data->object_table)
 		return IRQ_HANDLED;
 
-	if (data->T44_address) {
-		return mxt_process_messages_t44(data);
-	} else {
-		return mxt_process_messages(data);
-	}
+	if (data->T44_address)
+		ret = mxt_process_messages_t44(data);
+	else
+		ret = mxt_process_messages(data);
+
+	if (ret <= 0)
+		return IRQ_NONE;
+	else
+		return IRQ_HANDLED;
 }
 
 static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset,
@@ -1777,8 +1785,11 @@ static int mxt_acquire_irq(struct mxt_data *data)
 	}
 
 	if (data->object_table && data->use_retrigen_workaround) {
-		error = mxt_process_messages_until_invalid(data);
-		if (error)
+		if (data->T44_address)
+			error = mxt_process_messages_t44(data);
+		else
+			error = mxt_process_messages_until_invalid(data);
+		if (error < 0)
 			return error;
 	}
 
@@ -4032,8 +4043,12 @@ static int mxt_start(struct mxt_data *data)
 		 * Discard any touch messages still in message buffer
 		 * from before chip went to sleep
 		 */
-		ret = mxt_process_messages_until_invalid(data);
-		if (ret)
+
+		if (data->T44_address)
+			ret = mxt_process_messages_t44(data);
+		else
+			ret = mxt_process_messages_until_invalid(data);
+		if (ret < 0)
 			break;
 
 		ret = mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
-- 
2.17.1


  parent reply	other threads:[~2019-11-22  8:27 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-22  8:23 [PATCH v6 00/48] atmel_mxt_ts misc Jiada Wang
2019-11-22  8:23 ` [PATCH v6 01/48] Input: introduce input_mt_report_slot_inactive Jiada Wang
2019-11-22  8:23 ` [PATCH v6 02/48] Input: atmel_mxt_ts - rework sysfs init/remove Jiada Wang
2019-11-22  8:23 ` [PATCH v6 03/48] Input: atmel_mxt_ts - only read messages in mxt_acquire_irq() when necessary Jiada Wang
2019-11-22  8:23 ` [PATCH v6 04/48] Input: atmel_mxt_ts - split large i2c transfers into blocks Jiada Wang
2019-11-22  8:23 ` [PATCH v6 05/48] Input: atmel_mxt_ts - output status from T48 Noise Supression Jiada Wang
2019-11-22  8:23 ` [PATCH v6 06/48] Input: atmel_mxt_ts - output status from T42 Touch Suppression Jiada Wang
2019-11-22  8:23 ` [PATCH v6 07/48] Input: atmel_mxt_ts - implement T9 vector/orientation support Jiada Wang
2019-11-22  8:23 ` [PATCH v6 08/48] Input: atmel_mxt_ts - implement T15 Key Array support Jiada Wang
2019-11-22  8:23 ` [PATCH v6 09/48] Input: atmel_mxt_ts - handle reports from T47 Stylus object Jiada Wang
2019-11-22  8:23 ` [PATCH v6 10/48] Input: atmel_mxt_ts - implement support for T107 active stylus Jiada Wang
2019-11-22  8:23 ` [PATCH v6 11/48] Input: atmel_mxt_ts - add debug for T92 gesture and T93 touch seq msgs Jiada Wang
2019-11-22  8:23 ` [PATCH v6 12/48] Input: atmel_mxt_ts - release touch state during suspend Jiada Wang
2019-11-22  8:23 ` [PATCH v6 13/48] Input: atmel_mxt_ts - add regulator control support Jiada Wang
2019-11-22  8:23 ` [PATCH v6 14/48] Input: atmel_mxt_ts - report failures in suspend/resume Jiada Wang
2019-11-22  8:23 ` [PATCH v6 15/48] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
2019-11-22  8:23 ` [PATCH v6 16/48] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs Jiada Wang
2019-11-22  8:23 ` [PATCH v6 17/48] Input: atmel_mxt_ts - allow input name to be specified in platform data Jiada Wang
2019-11-22  8:23 ` [PATCH v6 18/48] Input: atmel_mxt_ts - add config checksum attribute to sysfs Jiada Wang
2019-11-22  8:23 ` [PATCH v6 19/48] Input: atmel_mxt_ts - refactor firmware flash to extract context into struct Jiada Wang
2019-11-22  8:23 ` [PATCH v6 20/48] Input: atmel_mxt_ts - refactor code to enter bootloader into separate func Jiada Wang
2019-11-22  8:23 ` [PATCH v6 21/48] Input: atmel_mxt_ts - combine bootloader version query with probe Jiada Wang
2019-11-22  8:23 ` [PATCH v6 22/48] Input: atmel_mxt_ts - improve bootloader state machine handling Jiada Wang
2019-11-22  8:23 ` [PATCH v6 23/48] Input: atmel_mxt_ts - rename bl_completion to chg_completion Jiada Wang
2019-11-22  8:23 ` [PATCH v6 24/48] Input: atmel_mxt_ts - make bootloader interrupt driven Jiada Wang
2020-01-27 17:41   ` Bartosz Szczepanek
2020-01-29 11:52     ` Wang, Jiada (ESD)
2020-02-12  8:39     ` Wang, Jiada
2019-11-22  8:23 ` [PATCH v6 25/48] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators Jiada Wang
2019-11-22  8:23 ` [PATCH v6 26/48] Input: atmel_mxt_ts - implement I2C retries Jiada Wang
2019-11-22  8:23 ` [PATCH v6 27/48] Input: atmel_mxt_ts - orientation is not present in hover Jiada Wang
2019-11-22  8:23 ` [PATCH v6 28/48] Input: atmel_mxt_ts - implement debug output for messages Jiada Wang
2019-11-22  8:23 ` [PATCH v6 29/48] Input: atmel_mxt_ts - implement improved debug message interface Jiada Wang
2019-11-22  8:23 ` [PATCH v6 30/48] Input: atmel_mxt_ts - eliminate data->raw_info_block Jiada Wang
2019-11-22  8:23 ` [PATCH v6 31/48] Input: atmel_mxt_ts - Change call-points of mxt_free_* functions Jiada Wang
2019-11-22  8:23 ` [PATCH v6 32/48] Input: atmel_mxt_ts - rely on calculated_crc rather than file config_crc Jiada Wang
2019-11-22  8:23 ` [PATCH v6 33/48] input: atmel_mxt_ts: export GPIO reset line via sysfs Jiada Wang
2019-11-22  8:23 ` [PATCH v6 34/48] input: atmel_mxt_ts: Add Missing Delay for reset handling of Atmel touch panel controller in detachable displays Jiada Wang
2019-11-22  8:23 ` [PATCH v6 35/48] Input: atmel_mxt_ts: Add support for run self-test routine Jiada Wang
2019-11-22  8:23 ` [PATCH v6 36/48] Input: atmel_mxt_ts: Limit the max bytes transferred in an i2c transaction Jiada Wang
2019-11-22  8:23 ` [PATCH v6 37/48] Input: atmel_mxt_ts: return error from mxt_process_messages_until_invalid() Jiada Wang
2019-11-22  8:23 ` [PATCH v6 38/48] Input: Atmel: improve error handling in mxt_start() Jiada Wang
2019-11-22  8:23 ` [PATCH v6 39/48] Input: Atmel: improve error handling in mxt_initialize() Jiada Wang
2019-11-22  8:23 ` [PATCH v6 40/48] Input: Atmel: improve error handling in mxt_update_cfg() Jiada Wang
2019-11-22  8:23 ` [PATCH v6 41/48] Input: Atmel: Improve error handling in mxt_initialize_input_device() Jiada Wang
2019-11-22  8:23 ` [PATCH v6 42/48] Input: Atmel: handle ReportID "0x00" while processing T5 messages Jiada Wang
2019-11-22  8:23 ` Jiada Wang [this message]
2019-11-22  8:23 ` [PATCH v6 44/48] Input: atmel_mxt_ts: use gpiod_set_value_cansleep for reset pin Jiada Wang
2019-11-22  8:23 ` [PATCH v6 45/48] input: touchscreen: atmel_mxt_ts: Added sysfs entry for touchscreen status Jiada Wang
2019-11-22  8:24 ` [PATCH v6 46/48] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Jiada Wang
2019-11-22  8:24 ` [PATCH v6 47/48] Input: atmel_mxt_ts: Implement synchronization during various operation Jiada Wang
2019-11-22  8:24 ` [PATCH v6 48/48] Input: atmel_mxt_ts - Fix compilation warning Jiada Wang
2020-01-10 12:04 ` [PATCH v6 00/48] atmel_mxt_ts misc 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=20191122082402.18173-44-jiada_wang@mentor.com \
    --to=jiada_wang@mentor.com \
    --cc=Andrew_Gabbasov@mentor.com \
    --cc=benjamin.tissoires@redhat.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).