[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220203143226.4023622-7-benjamin.tissoires@redhat.com>
Date: Thu, 3 Feb 2022 15:32:20 +0100
From: Benjamin Tissoires <benjamin.tissoires@...hat.com>
To: Jiri Kosina <jikos@...nel.org>,
Dmitry Torokhov <dmitry.torokhov@...il.com>,
Jonathan Corbet <corbet@....net>,
Ahelenia ZiemiaĆska
<nabijaczleweli@...ijaczleweli.xyz>,
Ping Cheng <pinglinux@...il.com>,
Aaron Armstrong Skomra <skomra@...il.com>,
Jason Gerecke <killertofu@...il.com>,
Peter Hutterer <peter.hutterer@...-t.net>
Cc: linux-input@...r.kernel.org, linux-doc@...r.kernel.org,
linux-kernel@...r.kernel.org,
Benjamin Tissoires <benjamin.tissoires@...hat.com>
Subject: [PATCH v2 06/12] HID: input: move up out-of-range processing of input values
It actually makes sense to clamp the value to its boundaries before
doing further processing.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@...hat.com>
---
drivers/hid/hid-input.c | 48 ++++++++++++++++++++---------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 54b3e9c5ccc4..8770d9a2b2af 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -1364,6 +1364,30 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
return;
}
+ /*
+ * Ignore out-of-range values as per HID specification,
+ * section 5.10 and 6.2.25, when NULL state bit is present.
+ * When it's not, clamp the value to match Microsoft's input
+ * driver as mentioned in "Required HID usages for digitizers":
+ * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp
+ *
+ * The logical_minimum < logical_maximum check is done so that we
+ * don't unintentionally discard values sent by devices which
+ * don't specify logical min and max.
+ */
+ if ((field->flags & HID_MAIN_ITEM_VARIABLE) &&
+ field->logical_minimum < field->logical_maximum) {
+ if (field->flags & HID_MAIN_ITEM_NULL_STATE &&
+ (value < field->logical_minimum ||
+ value > field->logical_maximum)) {
+ dbg_hid("Ignoring out-of-range value %x\n", value);
+ return;
+ }
+ value = clamp(value,
+ field->logical_minimum,
+ field->logical_maximum);
+ }
+
switch (usage->hid) {
case HID_DG_INVERT:
*quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
@@ -1431,30 +1455,6 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
break;
}
- /*
- * Ignore out-of-range values as per HID specification,
- * section 5.10 and 6.2.25, when NULL state bit is present.
- * When it's not, clamp the value to match Microsoft's input
- * driver as mentioned in "Required HID usages for digitizers":
- * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp
- *
- * The logical_minimum < logical_maximum check is done so that we
- * don't unintentionally discard values sent by devices which
- * don't specify logical min and max.
- */
- if ((field->flags & HID_MAIN_ITEM_VARIABLE) &&
- (field->logical_minimum < field->logical_maximum)) {
- if (field->flags & HID_MAIN_ITEM_NULL_STATE &&
- (value < field->logical_minimum ||
- value > field->logical_maximum)) {
- dbg_hid("Ignoring out-of-range value %x\n", value);
- return;
- }
- value = clamp(value,
- field->logical_minimum,
- field->logical_maximum);
- }
-
/*
* Ignore reports for absolute data if the data didn't change. This is
* not only an optimization but also fixes 'dead' key reports. Some
--
2.33.1
Powered by blists - more mailing lists