All of lore.kernel.org
 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>, <bsz@semihalf.com>
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 v7 12/48] Input: atmel_mxt_ts - release touch state during suspend
Date: Wed, 12 Feb 2020 00:41:42 -0800	[thread overview]
Message-ID: <20200212084218.32344-13-jiada_wang@mentor.com> (raw)
In-Reply-To: <20200212084218.32344-1-jiada_wang@mentor.com>

From: Nick Dyer <nick.dyer@itdev.co.uk>

If fingers are down as the MXT chip goes into suspend it does not send a
lift message. In addition, it may not complete its final measurement cycle
immediately, which means touch messages may be received by the interrupt
handler after mxt_stop() has completed.

So:
- disable irq during suspend
- flush any messages created after suspend
- tell app layer that slots were released at suspend

Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Benson Leung <bleung@chromium.org>
Acked-by: Yufeng Shen <miletus@chromium.org>
(cherry picked from ndyer/linux/for-upstream commit 26794433086dbc7dea18d2f6a1c8d61ab25bcfda)
[gdavis: Resolve forward port conflicts due to applying upstream
	 commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
	 data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
[gdavis: Squash fix from Dirk Behme:
	 - Input: atmel_mxt_ts - remove superfluous data->suspended]
Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
---
 drivers/input/touchscreen/atmel_mxt_ts.c | 52 ++++++++++++++++++++++--
 1 file changed, 49 insertions(+), 3 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index b6286b1f4a1a..2bc34c14dbbf 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -372,6 +372,9 @@ struct mxt_data {
 	unsigned int t19_num_keys;
 
 	enum mxt_suspend_mode suspend_mode;
+
+	/* Indicates whether device is in suspend */
+	bool suspended;
 };
 
 struct mxt_vb2_buffer {
@@ -1151,10 +1154,10 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message)
 		mxt_proc_t42_messages(data, message);
 	} else if (report_id == data->T48_reportid) {
 		mxt_proc_t48_messages(data, message);
-	} else if (!data->input_dev) {
+	} else if (!data->input_dev || data->suspended) {
 		/*
-		 * Do not report events if input device
-		 * is not yet registered.
+		 * Do not report events if input device is not
+		 * yet registered or returning from suspend
 		 */
 		mxt_dump_message(data, message);
 	} else if (report_id >= data->T9_reportid_min &&
@@ -3135,6 +3138,11 @@ static int mxt_load_fw(struct device *dev, const char *fn)
 	if (ret)
 		goto release_firmware;
 
+	if (data->suspended) {
+		enable_irq(data->irq);
+		data->suspended = false;
+	}
+
 	if (!data->in_bootloader) {
 		/* Change to the bootloader mode */
 		data->in_bootloader = true;
@@ -3306,8 +3314,27 @@ static void mxt_sysfs_remove(struct mxt_data *data)
 	sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
 }
 
+static void mxt_reset_slots(struct mxt_data *data)
+{
+	struct input_dev *input_dev = data->input_dev;
+	int id;
+
+	if (!input_dev)
+		return;
+
+	for (id = 0; id < data->num_touchids; id++) {
+		input_mt_slot(input_dev, id);
+		input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 0);
+	}
+
+	mxt_input_sync(data);
+}
+
 static void mxt_start(struct mxt_data *data)
 {
+	if (!data->suspended || data->in_bootloader)
+		return;
+
 	switch (data->suspend_mode) {
 	case MXT_SUSPEND_T9_CTRL:
 		mxt_soft_reset(data);
@@ -3320,16 +3347,29 @@ static void mxt_start(struct mxt_data *data)
 
 	case MXT_SUSPEND_DEEP_SLEEP:
 	default:
+		/*
+		 * Discard any touch messages still in message buffer
+		 * from before chip went to sleep
+		 */
+		mxt_process_messages_until_invalid(data);
+
 		mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
 
 		/* Recalibrate since chip has been in deep sleep */
 		mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false);
+
+		mxt_acquire_irq(data);
 		break;
 	}
+
+	data->suspended = false;
 }
 
 static void mxt_stop(struct mxt_data *data)
 {
+	if (data->suspended || data->in_bootloader)
+		return;
+
 	switch (data->suspend_mode) {
 	case MXT_SUSPEND_T9_CTRL:
 		/* Touch disable */
@@ -3339,9 +3379,15 @@ static void mxt_stop(struct mxt_data *data)
 
 	case MXT_SUSPEND_DEEP_SLEEP:
 	default:
+		disable_irq(data->irq);
+
 		mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP);
+
+		mxt_reset_slots(data);
 		break;
 	}
+
+	data->suspended = true;
 }
 
 static int mxt_input_open(struct input_dev *dev)
-- 
2.17.1


  parent reply	other threads:[~2020-02-12  8:51 UTC|newest]

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

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=20200212084218.32344-13-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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.