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 36/48] Input: atmel_mxt_ts: Limit the max bytes transferred in an i2c transaction
Date: Wed, 12 Feb 2020 00:42:06 -0800 [thread overview]
Message-ID: <20200212084218.32344-37-jiada_wang@mentor.com> (raw)
In-Reply-To: <20200212084218.32344-1-jiada_wang@mentor.com>
From: Balasubramani Vivekanandan <balasubramani_vivekanandan@mentor.com>
In mxt_process_messages_until_invalid() function, driver tries to read
all possible reportid in a single i2c transaction. Number of bytes read
is limited by the max_reportid parameter.
If the max_reportid is a very large value, then a large chunk of bytes
will be requested from the controller in a single i2c transaction.
This transaction can fail due to timeout. This is visible when the
Atmel controller is connected to the SOC via a i2c mux hardware.
mxt_process_messages_t44() reads the T44 message which contains the
pending T5 message count. If the number of pending T5 messages returned
by T44 message is too high then there is a risk of i2c transaction
timeout while reading T5 messages in mxt_process_messages_t44().
New property 'atmel,mtu' is created. This property limits the maximum
number of bytes that can read/transferred in an i2c transcation
Signed-off-by: Balasubramani Vivekanandan <balasubramani_vivekanandan@mentor.com>
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
.../bindings/input/atmel,maxtouch.txt | 3 +
drivers/input/touchscreen/atmel_mxt_ts.c | 65 +++++++++++++++----
2 files changed, 54 insertions(+), 14 deletions(-)
diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
index d7db16920083..62c93d94bc5d 100644
--- a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
+++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
@@ -42,6 +42,8 @@ Optional properties for main touchpad device:
- atmel,input_name: Override name of input device from the default.
+- atmel,mtu: Maximum number of bytes that can read/transferred in an i2c transaction
+
Example:
touch@4b {
@@ -49,4 +51,5 @@ Example:
reg = <0x4b>;
interrupt-parent = <&gpio>;
interrupts = <TEGRA_GPIO(W, 3) IRQ_TYPE_LEVEL_LOW>;
+ atmel,mtu = <200>
};
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 1595b92b1190..865c207a0d72 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -417,6 +417,7 @@ struct mxt_data {
/* Indicates whether device is updating configuration */
bool updating_config;
+ unsigned int mtu;
bool t25_status;
};
@@ -1462,11 +1463,32 @@ static int mxt_read_and_process_messages(struct mxt_data *data, u8 count)
return num_valid;
}
+static u8 mxt_max_msg_read_count(struct mxt_data *data, u8 max_T5_msg_count)
+{
+ u8 T5_msg_count_limit = data->mtu / data->T5_msg_size;
+
+ if (!data->mtu)
+ return max_T5_msg_count;
+
+ if (data->mtu < data->T5_msg_size) {
+ WARN(1, "mtu set is lesser than the T5 message size\n");
+ /* Return count of 1, as fallback */
+ return 1;
+ }
+ /*
+ * Return maximum number of T5 messages in single i2c transaction
+ * based on "atmel,mtu" property.
+ */
+ return min(T5_msg_count_limit, max_T5_msg_count);
+}
+
static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
int ret;
- u8 count, num_left;
+ u8 T5_msg_count, total_pending;
+ u8 total_processed = 0;
+ u8 processed_valid = 0;
/* Read T44 and T5 together */
ret = __mxt_read_reg(data->client, data->T44_address,
@@ -1476,18 +1498,19 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
return IRQ_NONE;
}
- count = data->msg_buf[0];
+ T5_msg_count = data->msg_buf[0];
/*
* This condition may be caused by the CHG line being configured in
* Mode 0. It results in unnecessary I2C operations but it is benign.
*/
- if (count == 0)
+ if (!T5_msg_count)
return IRQ_NONE;
- if (count > data->max_reportid) {
- dev_warn(dev, "T44 count %d exceeded max report id\n", count);
- count = data->max_reportid;
+ if (T5_msg_count > data->max_reportid) {
+ dev_warn(dev, "T44 count %d exceeded max report id\n",
+ T5_msg_count);
+ T5_msg_count = data->max_reportid;
}
/* Process first message */
@@ -1497,16 +1520,25 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
return IRQ_NONE;
}
- num_left = count - 1;
+ total_pending = T5_msg_count - 1;
+ if (!total_pending)
+ goto end;
/* Process remaining messages if necessary */
- if (num_left) {
- ret = mxt_read_and_process_messages(data, num_left);
+ T5_msg_count = mxt_max_msg_read_count(data, total_pending);
+
+ do {
+ if ((total_pending - total_processed) < T5_msg_count)
+ T5_msg_count = total_pending - total_processed;
+ ret = mxt_read_and_process_messages(data, T5_msg_count);
if (ret < 0)
goto end;
- else if (ret != num_left)
- dev_warn(dev, "Unexpected invalid message\n");
- }
+ total_processed += T5_msg_count;
+ processed_valid += ret;
+ } while (total_processed < total_pending);
+
+ if (processed_valid != total_pending)
+ dev_warn(dev, "Unexpected invalid message\n");
end:
if (data->update_input) {
@@ -1521,9 +1553,10 @@ static int mxt_process_messages_until_invalid(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
int count, read;
- u8 tries = 2;
+ int tries;
- count = data->max_reportid;
+ count = mxt_max_msg_read_count(data, data->max_reportid);
+ tries = (data->max_reportid / count) + 1;
/* Read messages until we force an invalid */
do {
@@ -4109,6 +4142,10 @@ static int mxt_parse_device_properties(struct mxt_data *data)
}
device_property_read_u32(dev, "atmel,suspend-mode", &data->suspend_mode);
+ device_property_read_u32(dev, "atmel,mtu", &data->mtu);
+ if (data->mtu)
+ dev_dbg(dev, "mtu is set as %d\n", data->mtu);
+
return 0;
}
--
2.17.1
next prev parent reply other threads:[~2020-02-12 8:47 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 ` [PATCH v7 12/48] Input: atmel_mxt_ts - release touch state during suspend Jiada Wang
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 ` Jiada Wang [this message]
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-37-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 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).