Thread (13 messages) 13 messages, 2 authors, 1d ago
WARM1d

[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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help