]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
HID: hid-cypress: clean up usage of 'driver_data'
authorPawel Zalewski (The Capable Hub) <pzalewski@thegoodpenguin.co.uk>
Mon, 18 May 2026 16:06:25 +0000 (17:06 +0100)
committerBenjamin Tissoires <bentiss@kernel.org>
Mon, 1 Jun 2026 16:28:41 +0000 (18:28 +0200)
The module is storing an integer inside the drvdata pointer, which is
confusing - furthermore this integer is mutable. When its value is
changed it is set again using the 'hid_set_drvdata' API within
the 'cp_event' function.

Let's fix this, create and allocate the 'cp_device' struct that is then
set as the drvdata and then simply use its integer 'quirks' field for
storing the quirks, which shall make the code cleaner, type-safe,
consistent and more readable.

This makes the cast to (void *) during storage unnecessary and the cast
to (unsigned long) during retrieval is also removed.

Signed-off-by: Pawel Zalewski (The Capable Hub) <pzalewski@thegoodpenguin.co.uk>
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/hid/hid-cypress.c

index 98548201feec072b4fc16080f97abbc81edbe1ae..f18fddc176d013613624438bcffe48edc2488a80 100644 (file)
 
 #define VA_INVAL_LOGICAL_BOUNDARY      0x08
 
+struct cp_device {
+       unsigned long quirks;
+};
+
 /*
  * Some USB barcode readers from cypress have usage min and usage max in
  * the wrong order
@@ -70,7 +74,8 @@ static __u8 *va_logical_boundary_fixup(struct hid_device *hdev, __u8 *rdesc,
 static const __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
                unsigned int *rsize)
 {
-       unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+       const struct cp_device *cp_device = hid_get_drvdata(hdev);
+       unsigned long quirks = cp_device->quirks;
 
        if (quirks & CP_RDESC_SWAPPED_MIN_MAX)
                rdesc = cp_rdesc_fixup(hdev, rdesc, rsize);
@@ -84,7 +89,8 @@ static int cp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
                struct hid_field *field, struct hid_usage *usage,
                unsigned long **bit, int *max)
 {
-       unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+       const struct cp_device *cp_device = hid_get_drvdata(hdev);
+       unsigned long quirks = cp_device->quirks;
 
        if (!(quirks & CP_2WHEEL_MOUSE_HACK))
                return 0;
@@ -100,22 +106,21 @@ static int cp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
 static int cp_event(struct hid_device *hdev, struct hid_field *field,
                struct hid_usage *usage, __s32 value)
 {
-       unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+       struct cp_device *cp_device = hid_get_drvdata(hdev);
 
        if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput ||
-                       !usage->type || !(quirks & CP_2WHEEL_MOUSE_HACK))
+                       !usage->type || !(cp_device->quirks & CP_2WHEEL_MOUSE_HACK))
                return 0;
 
        if (usage->hid == 0x00090005) {
                if (value)
-                       quirks |=  CP_2WHEEL_MOUSE_HACK_ON;
+                       cp_device->quirks |= CP_2WHEEL_MOUSE_HACK_ON;
                else
-                       quirks &= ~CP_2WHEEL_MOUSE_HACK_ON;
-               hid_set_drvdata(hdev, (void *)quirks);
+                       cp_device->quirks &= ~CP_2WHEEL_MOUSE_HACK_ON;
                return 1;
        }
 
-       if (usage->code == REL_WHEEL && (quirks & CP_2WHEEL_MOUSE_HACK_ON)) {
+       if (usage->code == REL_WHEEL && (cp_device->quirks & CP_2WHEEL_MOUSE_HACK_ON)) {
                struct input_dev *input = field->hidinput->input;
 
                input_event(input, usage->type, REL_HWHEEL, value);
@@ -127,10 +132,17 @@ static int cp_event(struct hid_device *hdev, struct hid_field *field,
 
 static int cp_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
-       unsigned long quirks = id->driver_data;
        int ret;
+       struct cp_device *cp_device;
+
+       cp_device = devm_kzalloc(&hdev->dev, sizeof(*cp_device), GFP_KERNEL);
+
+       if (!cp_device)
+               return -ENOMEM;
+
+       cp_device->quirks = id->driver_data;
 
-       hid_set_drvdata(hdev, (void *)quirks);
+       hid_set_drvdata(hdev, cp_device);
 
        ret = hid_parse(hdev);
        if (ret) {