[PATCH v3 8/8] HID: wacom: do not use 'driver_data'
From: Pawel Zalewski (The Capable Hub) <hidden>
Date: 2026-07-27 14:55:44
Also in:
lkml
Subsystem:
hid core layer, hid wacom driver, the rest · Maintainers:
Jiri Kosina, Benjamin Tissoires, Ping Cheng, Jason Gerecke, Linus Torvalds
The driver data field is used to match the product with a 'wacom_features' struct via a remapped enum - since we already have to look it up at runtime and validate, we can just remove the remapping and look up the 'wacom_features' directly by the product id. This makes the code easier to edit and maintain. It also reduces the complexity of macro magic and keeps macros local to the module. Signed-off-by: Pawel Zalewski (The Capable Hub) <redacted> --- drivers/hid/wacom.h | 178 +------------------------------------------ drivers/hid/wacom_sys.c | 7 +- drivers/hid/wacom_wac.c | 197 +++++++++++++++++++++++++++++++++++++++++++----- drivers/hid/wacom_wac.h | 5 ++ 4 files changed, 186 insertions(+), 201 deletions(-)
diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h
index 115d0eb23277..80a1a5d09e55 100644
--- a/drivers/hid/wacom.h
+++ b/drivers/hid/wacom.h@@ -228,182 +228,6 @@ static inline u32 wacom_rescale(u32 value, u32 in_max, u32 out_max) extern const struct hid_device_id wacom_ids[]; -/* This table lists all unique product IDs that are matched with - * a corresponging wacom_features_##prod struct. So any new product - * should be added to this table. - */ -#define HID_WACOM_PRODUCT_TABLE() \ - table_entry(0x00) \ - table_entry(0x03) \ - table_entry(0x10) \ - table_entry(0x11) \ - table_entry(0x12) \ - table_entry(0x13) \ - table_entry(0x14) \ - table_entry(0x15) \ - table_entry(0x16) \ - table_entry(0x17) \ - table_entry(0x18) \ - table_entry(0x19) \ - table_entry(0x20) \ - table_entry(0x21) \ - table_entry(0x22) \ - table_entry(0x23) \ - table_entry(0x24) \ - table_entry(0x26) \ - table_entry(0x27) \ - table_entry(0x28) \ - table_entry(0x29) \ - table_entry(0x2A) \ - table_entry(0x30) \ - table_entry(0x31) \ - table_entry(0x32) \ - table_entry(0x33) \ - table_entry(0x34) \ - table_entry(0x35) \ - table_entry(0x37) \ - table_entry(0x38) \ - table_entry(0x39) \ - table_entry(0x3F) \ - table_entry(0x41) \ - table_entry(0x42) \ - table_entry(0x43) \ - table_entry(0x44) \ - table_entry(0x45) \ - table_entry(0x47) \ - table_entry(0x57) \ - table_entry(0x59) \ - table_entry(0x5B) \ - table_entry(0x5D) \ - table_entry(0x5E) \ - table_entry(0x60) \ - table_entry(0x61) \ - table_entry(0x62) \ - table_entry(0x63) \ - table_entry(0x64) \ - table_entry(0x65) \ - table_entry(0x69) \ - table_entry(0x6A) \ - table_entry(0x6B) \ - table_entry(0x81) \ - table_entry(0x84) \ - table_entry(0x90) \ - table_entry(0x93) \ - table_entry(0x94) \ - table_entry(0x97) \ - table_entry(0x9A) \ - table_entry(0x9F) \ - table_entry(0xB0) \ - table_entry(0xB1) \ - table_entry(0xB2) \ - table_entry(0xB3) \ - table_entry(0xB4) \ - table_entry(0xB5) \ - table_entry(0xB7) \ - table_entry(0xB8) \ - table_entry(0xB9) \ - table_entry(0xBA) \ - table_entry(0xBB) \ - table_entry(0xBC) \ - table_entry(0xBD) \ - table_entry(0xC0) \ - table_entry(0xC2) \ - table_entry(0xC4) \ - table_entry(0xC5) \ - table_entry(0xC6) \ - table_entry(0xC7) \ - table_entry(0xCC) \ - table_entry(0xCE) \ - table_entry(0xD0) \ - table_entry(0xD1) \ - table_entry(0xD2) \ - table_entry(0xD3) \ - table_entry(0xD4) \ - table_entry(0xD5) \ - table_entry(0xD6) \ - table_entry(0xD7) \ - table_entry(0xD8) \ - table_entry(0xDA) \ - table_entry(0xDB) \ - table_entry(0xDD) \ - table_entry(0xDE) \ - table_entry(0xDF) \ - table_entry(0xE2) \ - table_entry(0xE3) \ - table_entry(0xE5) \ - table_entry(0xE6) \ - table_entry(0xEC) \ - table_entry(0xED) \ - table_entry(0xEF) \ - table_entry(0xF0) \ - table_entry(0xF4) \ - table_entry(0xF6) \ - table_entry(0xF8) \ - table_entry(0xFA) \ - table_entry(0xFB) \ - table_entry(0x100) \ - table_entry(0x101) \ - table_entry(0x10D) \ - table_entry(0x10E) \ - table_entry(0x10F) \ - table_entry(0x116) \ - table_entry(0x12C) \ - table_entry(0x300) \ - table_entry(0x301) \ - table_entry(0x302) \ - table_entry(0x303) \ - table_entry(0x304) \ - table_entry(0x307) \ - table_entry(0x309) \ - table_entry(0x30A) \ - table_entry(0x30C) \ - table_entry(0x30E) \ - table_entry(0x314) \ - table_entry(0x315) \ - table_entry(0x317) \ - table_entry(0x318) \ - table_entry(0x319) \ - table_entry(0x323) \ - table_entry(0x325) \ - table_entry(0x326) \ - table_entry(0x32A) \ - table_entry(0x32B) \ - table_entry(0x32C) \ - table_entry(0x32F) \ - table_entry(0x331) \ - table_entry(0x333) \ - table_entry(0x335) \ - table_entry(0x336) \ - table_entry(0x33B) \ - table_entry(0x33C) \ - table_entry(0x33D) \ - table_entry(0x33E) \ - table_entry(0x343) \ - table_entry(0x360) \ - table_entry(0x361) \ - table_entry(0x377) \ - table_entry(0x379) \ - table_entry(0x37A) \ - table_entry(0x37B) \ - table_entry(0x393) \ - table_entry(0x3c6) \ - table_entry(0x3c8) \ - table_entry(0x3dd) \ - table_entry(0x4001) \ - table_entry(0x4004) \ - table_entry(0x5000) \ - table_entry(0x5002) \ - table_entry(0x6004) \ - table_entry(HID_ANY_ID) \ - -enum wacom_features_table_index { -#define table_entry(product) \ - WACOM_FEATURE_TABLE_##product, - HID_WACOM_PRODUCT_TABLE() - NUM_OF_WACOM_FEATURES_IN_TABLE -#undef table_entry -}; - void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); void wacom_setup_device_quirks(struct wacom *wacom); int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
@@ -425,5 +249,5 @@ struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur); int wacom_equivalent_usage(int usage); int wacom_initialize_leds(struct wacom *wacom); void wacom_idleprox_timeout(struct timer_list *list); -const struct wacom_features *get_wacom_features(enum wacom_features_table_index index); +const struct wacom_features *get_wacom_features(u32 product); #endif
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 834519751a5c..4514b2762cc3 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c@@ -2559,7 +2559,7 @@ static void wacom_wireless_work(struct work_struct *work) } /* Stylus interface */ - const struct wacom_features *features = get_wacom_features(id->driver_data); + const struct wacom_features *features = get_wacom_features(id->product); if (!features) { hid_err(wacom->hdev, "could not get wacom features.\n");
@@ -2831,9 +2831,6 @@ static int wacom_probe(struct hid_device *hdev, struct wacom_features *features; int error; - if (!id->driver_data) - return -EINVAL; - hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; /* hid-core sets this quirk for the boot interface */
@@ -2848,7 +2845,7 @@ static int wacom_probe(struct hid_device *hdev, wacom_wac = &wacom->wacom_wac; - const struct wacom_features *id_features = get_wacom_features(id->driver_data); + const struct wacom_features *id_features = get_wacom_features(id->product); if (!id_features) { hid_err(wacom->hdev, "could not get wacom id_features.\n");
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index d0a864d52509..e066aa334837 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c@@ -4945,40 +4945,199 @@ static const struct wacom_features wacom_features_HID_ANY_ID = static const struct wacom_features wacom_features_0x94 = { "Wacom Bootloader", .type = BOOTLOADER }; -static const struct wacom_features *wacom_features_table[] = { -#define table_entry(product) \ - [WACOM_FEATURE_TABLE_##product] = &wacom_features_##product, - HID_WACOM_PRODUCT_TABLE() -#undef table_entry +#define WACOM_FEATURE_TABLE_ENTRY(product_id) \ + {.product = product_id, .wacom_features_ptr = &wacom_features_##product_id} + +static const struct wacom_features_table_item wacom_features_table[] = { + WACOM_FEATURE_TABLE_ENTRY(0x00), + WACOM_FEATURE_TABLE_ENTRY(0x03), + WACOM_FEATURE_TABLE_ENTRY(0x10), + WACOM_FEATURE_TABLE_ENTRY(0x11), + WACOM_FEATURE_TABLE_ENTRY(0x12), + WACOM_FEATURE_TABLE_ENTRY(0x13), + WACOM_FEATURE_TABLE_ENTRY(0x14), + WACOM_FEATURE_TABLE_ENTRY(0x15), + WACOM_FEATURE_TABLE_ENTRY(0x16), + WACOM_FEATURE_TABLE_ENTRY(0x17), + WACOM_FEATURE_TABLE_ENTRY(0x18), + WACOM_FEATURE_TABLE_ENTRY(0x19), + WACOM_FEATURE_TABLE_ENTRY(0x20), + WACOM_FEATURE_TABLE_ENTRY(0x21), + WACOM_FEATURE_TABLE_ENTRY(0x22), + WACOM_FEATURE_TABLE_ENTRY(0x23), + WACOM_FEATURE_TABLE_ENTRY(0x24), + WACOM_FEATURE_TABLE_ENTRY(0x26), + WACOM_FEATURE_TABLE_ENTRY(0x27), + WACOM_FEATURE_TABLE_ENTRY(0x28), + WACOM_FEATURE_TABLE_ENTRY(0x29), + WACOM_FEATURE_TABLE_ENTRY(0x2A), + WACOM_FEATURE_TABLE_ENTRY(0x30), + WACOM_FEATURE_TABLE_ENTRY(0x31), + WACOM_FEATURE_TABLE_ENTRY(0x32), + WACOM_FEATURE_TABLE_ENTRY(0x33), + WACOM_FEATURE_TABLE_ENTRY(0x34), + WACOM_FEATURE_TABLE_ENTRY(0x35), + WACOM_FEATURE_TABLE_ENTRY(0x37), + WACOM_FEATURE_TABLE_ENTRY(0x38), + WACOM_FEATURE_TABLE_ENTRY(0x39), + WACOM_FEATURE_TABLE_ENTRY(0x3F), + WACOM_FEATURE_TABLE_ENTRY(0x41), + WACOM_FEATURE_TABLE_ENTRY(0x42), + WACOM_FEATURE_TABLE_ENTRY(0x43), + WACOM_FEATURE_TABLE_ENTRY(0x44), + WACOM_FEATURE_TABLE_ENTRY(0x45), + WACOM_FEATURE_TABLE_ENTRY(0x47), + WACOM_FEATURE_TABLE_ENTRY(0x57), + WACOM_FEATURE_TABLE_ENTRY(0x59), + WACOM_FEATURE_TABLE_ENTRY(0x5B), + WACOM_FEATURE_TABLE_ENTRY(0x5D), + WACOM_FEATURE_TABLE_ENTRY(0x5E), + WACOM_FEATURE_TABLE_ENTRY(0x60), + WACOM_FEATURE_TABLE_ENTRY(0x61), + WACOM_FEATURE_TABLE_ENTRY(0x62), + WACOM_FEATURE_TABLE_ENTRY(0x63), + WACOM_FEATURE_TABLE_ENTRY(0x64), + WACOM_FEATURE_TABLE_ENTRY(0x65), + WACOM_FEATURE_TABLE_ENTRY(0x69), + WACOM_FEATURE_TABLE_ENTRY(0x6A), + WACOM_FEATURE_TABLE_ENTRY(0x6B), + WACOM_FEATURE_TABLE_ENTRY(0x81), + WACOM_FEATURE_TABLE_ENTRY(0x84), + WACOM_FEATURE_TABLE_ENTRY(0x90), + WACOM_FEATURE_TABLE_ENTRY(0x93), + WACOM_FEATURE_TABLE_ENTRY(0x94), + WACOM_FEATURE_TABLE_ENTRY(0x97), + WACOM_FEATURE_TABLE_ENTRY(0x9A), + WACOM_FEATURE_TABLE_ENTRY(0x9F), + WACOM_FEATURE_TABLE_ENTRY(0xB0), + WACOM_FEATURE_TABLE_ENTRY(0xB1), + WACOM_FEATURE_TABLE_ENTRY(0xB2), + WACOM_FEATURE_TABLE_ENTRY(0xB3), + WACOM_FEATURE_TABLE_ENTRY(0xB4), + WACOM_FEATURE_TABLE_ENTRY(0xB5), + WACOM_FEATURE_TABLE_ENTRY(0xB7), + WACOM_FEATURE_TABLE_ENTRY(0xB8), + WACOM_FEATURE_TABLE_ENTRY(0xB9), + WACOM_FEATURE_TABLE_ENTRY(0xBA), + WACOM_FEATURE_TABLE_ENTRY(0xBB), + WACOM_FEATURE_TABLE_ENTRY(0xBC), + WACOM_FEATURE_TABLE_ENTRY(0xBD), + WACOM_FEATURE_TABLE_ENTRY(0xC0), + WACOM_FEATURE_TABLE_ENTRY(0xC2), + WACOM_FEATURE_TABLE_ENTRY(0xC4), + WACOM_FEATURE_TABLE_ENTRY(0xC5), + WACOM_FEATURE_TABLE_ENTRY(0xC6), + WACOM_FEATURE_TABLE_ENTRY(0xC7), + WACOM_FEATURE_TABLE_ENTRY(0xCC), + WACOM_FEATURE_TABLE_ENTRY(0xCE), + WACOM_FEATURE_TABLE_ENTRY(0xD0), + WACOM_FEATURE_TABLE_ENTRY(0xD1), + WACOM_FEATURE_TABLE_ENTRY(0xD2), + WACOM_FEATURE_TABLE_ENTRY(0xD3), + WACOM_FEATURE_TABLE_ENTRY(0xD4), + WACOM_FEATURE_TABLE_ENTRY(0xD5), + WACOM_FEATURE_TABLE_ENTRY(0xD6), + WACOM_FEATURE_TABLE_ENTRY(0xD7), + WACOM_FEATURE_TABLE_ENTRY(0xD8), + WACOM_FEATURE_TABLE_ENTRY(0xDA), + WACOM_FEATURE_TABLE_ENTRY(0xDB), + WACOM_FEATURE_TABLE_ENTRY(0xDD), + WACOM_FEATURE_TABLE_ENTRY(0xDE), + WACOM_FEATURE_TABLE_ENTRY(0xDF), + WACOM_FEATURE_TABLE_ENTRY(0xE2), + WACOM_FEATURE_TABLE_ENTRY(0xE3), + WACOM_FEATURE_TABLE_ENTRY(0xE5), + WACOM_FEATURE_TABLE_ENTRY(0xE6), + WACOM_FEATURE_TABLE_ENTRY(0xEC), + WACOM_FEATURE_TABLE_ENTRY(0xED), + WACOM_FEATURE_TABLE_ENTRY(0xEF), + WACOM_FEATURE_TABLE_ENTRY(0xF0), + WACOM_FEATURE_TABLE_ENTRY(0xF4), + WACOM_FEATURE_TABLE_ENTRY(0xF6), + WACOM_FEATURE_TABLE_ENTRY(0xF8), + WACOM_FEATURE_TABLE_ENTRY(0xFA), + WACOM_FEATURE_TABLE_ENTRY(0xFB), + WACOM_FEATURE_TABLE_ENTRY(0x100), + WACOM_FEATURE_TABLE_ENTRY(0x101), + WACOM_FEATURE_TABLE_ENTRY(0x10D), + WACOM_FEATURE_TABLE_ENTRY(0x10E), + WACOM_FEATURE_TABLE_ENTRY(0x10F), + WACOM_FEATURE_TABLE_ENTRY(0x116), + WACOM_FEATURE_TABLE_ENTRY(0x12C), + WACOM_FEATURE_TABLE_ENTRY(0x300), + WACOM_FEATURE_TABLE_ENTRY(0x301), + WACOM_FEATURE_TABLE_ENTRY(0x302), + WACOM_FEATURE_TABLE_ENTRY(0x303), + WACOM_FEATURE_TABLE_ENTRY(0x304), + WACOM_FEATURE_TABLE_ENTRY(0x307), + WACOM_FEATURE_TABLE_ENTRY(0x309), + WACOM_FEATURE_TABLE_ENTRY(0x30A), + WACOM_FEATURE_TABLE_ENTRY(0x30C), + WACOM_FEATURE_TABLE_ENTRY(0x30E), + WACOM_FEATURE_TABLE_ENTRY(0x314), + WACOM_FEATURE_TABLE_ENTRY(0x315), + WACOM_FEATURE_TABLE_ENTRY(0x317), + WACOM_FEATURE_TABLE_ENTRY(0x318), + WACOM_FEATURE_TABLE_ENTRY(0x319), + WACOM_FEATURE_TABLE_ENTRY(0x323), + WACOM_FEATURE_TABLE_ENTRY(0x325), + WACOM_FEATURE_TABLE_ENTRY(0x326), + WACOM_FEATURE_TABLE_ENTRY(0x32A), + WACOM_FEATURE_TABLE_ENTRY(0x32B), + WACOM_FEATURE_TABLE_ENTRY(0x32C), + WACOM_FEATURE_TABLE_ENTRY(0x32F), + WACOM_FEATURE_TABLE_ENTRY(0x331), + WACOM_FEATURE_TABLE_ENTRY(0x333), + WACOM_FEATURE_TABLE_ENTRY(0x335), + WACOM_FEATURE_TABLE_ENTRY(0x336), + WACOM_FEATURE_TABLE_ENTRY(0x33B), + WACOM_FEATURE_TABLE_ENTRY(0x33C), + WACOM_FEATURE_TABLE_ENTRY(0x33D), + WACOM_FEATURE_TABLE_ENTRY(0x33E), + WACOM_FEATURE_TABLE_ENTRY(0x343), + WACOM_FEATURE_TABLE_ENTRY(0x360), + WACOM_FEATURE_TABLE_ENTRY(0x361), + WACOM_FEATURE_TABLE_ENTRY(0x377), + WACOM_FEATURE_TABLE_ENTRY(0x379), + WACOM_FEATURE_TABLE_ENTRY(0x37A), + WACOM_FEATURE_TABLE_ENTRY(0x37B), + WACOM_FEATURE_TABLE_ENTRY(0x393), + WACOM_FEATURE_TABLE_ENTRY(0x3c6), + WACOM_FEATURE_TABLE_ENTRY(0x3c8), + WACOM_FEATURE_TABLE_ENTRY(0x3dd), + WACOM_FEATURE_TABLE_ENTRY(0x4001), + WACOM_FEATURE_TABLE_ENTRY(0x4004), + WACOM_FEATURE_TABLE_ENTRY(0x5000), + WACOM_FEATURE_TABLE_ENTRY(0x5002), + WACOM_FEATURE_TABLE_ENTRY(0x6004), + WACOM_FEATURE_TABLE_ENTRY(HID_ANY_ID), }; -const struct wacom_features *get_wacom_features(enum wacom_features_table_index index) +const struct wacom_features *get_wacom_features(u32 product) { - if (index >= NUM_OF_WACOM_FEATURES_IN_TABLE) - return NULL; + int i; - return wacom_features_table[index]; + for (i = 0; i < ARRAY_SIZE(wacom_features_table); i++) + if (wacom_features_table[i].product == product) + return wacom_features_table[i].wacom_features_ptr; + + return NULL; } #define USB_DEVICE_WACOM(prod) \ - HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ - .driver_data = WACOM_FEATURE_TABLE_##prod + HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod) #define BT_DEVICE_WACOM(prod) \ - HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ - .driver_data = WACOM_FEATURE_TABLE_##prod + HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod) #define I2C_DEVICE_WACOM(prod) \ - HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ - .driver_data = WACOM_FEATURE_TABLE_##prod + HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod) #define PCI_DEVICE_WACOM(prod) \ - HID_DEVICE(BUS_PCI, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ - .driver_data = WACOM_FEATURE_TABLE_##prod + HID_DEVICE(BUS_PCI, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod) #define USB_DEVICE_LENOVO(prod) \ - HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \ - .driver_data = WACOM_FEATURE_TABLE_##prod + HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod) const struct hid_device_id wacom_ids[] = { { USB_DEVICE_WACOM(0x00) },
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 126bec6e5c0c..ecb85c459d9a 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h@@ -279,6 +279,11 @@ struct wacom_features { int hid_type; }; +struct wacom_features_table_item { + u32 product; + const struct wacom_features *wacom_features_ptr; +}; + struct wacom_shared { bool stylus_in_proximity; bool touch_down;
--
2.43.0