[PATCH v2 12/12] HID: wacom: do not use 'driver_data'
From: Pawel Zalewski (The Capable Hub)
Date: Wed Jun 10 2026 - 11:20:39 EST
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) <pzalewski@xxxxxxxxxxxxxxxxxxxx>
---
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 dd3ed1f8134b..1d5bdb4da29c 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -2561,7 +2561,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");
@@ -2833,9 +2833,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 */
@@ -2850,7 +2847,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