Input: allow matching device IDs on property bits

Let's allow matching input devices on their property bits, both in-kernel
and when generating module aliases.

Tested-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+15 -2
+2 -1
drivers/input/input.c
··· 960 !bitmap_subset(id->ledbit, dev->ledbit, LED_MAX) || 961 !bitmap_subset(id->sndbit, dev->sndbit, SND_MAX) || 962 !bitmap_subset(id->ffbit, dev->ffbit, FF_MAX) || 963 - !bitmap_subset(id->swbit, dev->swbit, SW_MAX)) { 964 return false; 965 } 966
··· 960 !bitmap_subset(id->ledbit, dev->ledbit, LED_MAX) || 961 !bitmap_subset(id->sndbit, dev->sndbit, SND_MAX) || 962 !bitmap_subset(id->ffbit, dev->ffbit, FF_MAX) || 963 + !bitmap_subset(id->swbit, dev->swbit, SW_MAX) || 964 + !bitmap_subset(id->propbit, dev->propbit, INPUT_PROP_MAX)) { 965 return false; 966 } 967
+4
include/linux/input.h
··· 234 #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match" 235 #endif 236 237 #define INPUT_DEVICE_ID_MATCH_DEVICE \ 238 (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) 239 #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \
··· 234 #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match" 235 #endif 236 237 + #if INPUT_PROP_MAX != INPUT_DEVICE_ID_PROP_MAX 238 + #error "INPUT_PROP_MAX and INPUT_DEVICE_ID_PROP_MAX do not match" 239 + #endif 240 + 241 #define INPUT_DEVICE_ID_MATCH_DEVICE \ 242 (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) 243 #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \
+3
include/linux/mod_devicetable.h
··· 293 #define INPUT_DEVICE_ID_SND_MAX 0x07 294 #define INPUT_DEVICE_ID_FF_MAX 0x7f 295 #define INPUT_DEVICE_ID_SW_MAX 0x0f 296 297 #define INPUT_DEVICE_ID_MATCH_BUS 1 298 #define INPUT_DEVICE_ID_MATCH_VENDOR 2 ··· 309 #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x0400 310 #define INPUT_DEVICE_ID_MATCH_FFBIT 0x0800 311 #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 312 313 struct input_device_id { 314 ··· 329 kernel_ulong_t sndbit[INPUT_DEVICE_ID_SND_MAX / BITS_PER_LONG + 1]; 330 kernel_ulong_t ffbit[INPUT_DEVICE_ID_FF_MAX / BITS_PER_LONG + 1]; 331 kernel_ulong_t swbit[INPUT_DEVICE_ID_SW_MAX / BITS_PER_LONG + 1]; 332 333 kernel_ulong_t driver_info; 334 };
··· 293 #define INPUT_DEVICE_ID_SND_MAX 0x07 294 #define INPUT_DEVICE_ID_FF_MAX 0x7f 295 #define INPUT_DEVICE_ID_SW_MAX 0x0f 296 + #define INPUT_DEVICE_ID_PROP_MAX 0x1f 297 298 #define INPUT_DEVICE_ID_MATCH_BUS 1 299 #define INPUT_DEVICE_ID_MATCH_VENDOR 2 ··· 308 #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x0400 309 #define INPUT_DEVICE_ID_MATCH_FFBIT 0x0800 310 #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 311 + #define INPUT_DEVICE_ID_MATCH_PROPBIT 0x2000 312 313 struct input_device_id { 314 ··· 327 kernel_ulong_t sndbit[INPUT_DEVICE_ID_SND_MAX / BITS_PER_LONG + 1]; 328 kernel_ulong_t ffbit[INPUT_DEVICE_ID_FF_MAX / BITS_PER_LONG + 1]; 329 kernel_ulong_t swbit[INPUT_DEVICE_ID_SW_MAX / BITS_PER_LONG + 1]; 330 + kernel_ulong_t propbit[INPUT_DEVICE_ID_PROP_MAX / BITS_PER_LONG + 1]; 331 332 kernel_ulong_t driver_info; 333 };
+1
scripts/mod/devicetable-offsets.c
··· 105 DEVID_FIELD(input_device_id, sndbit); 106 DEVID_FIELD(input_device_id, ffbit); 107 DEVID_FIELD(input_device_id, swbit); 108 109 DEVID(eisa_device_id); 110 DEVID_FIELD(eisa_device_id, sig);
··· 105 DEVID_FIELD(input_device_id, sndbit); 106 DEVID_FIELD(input_device_id, ffbit); 107 DEVID_FIELD(input_device_id, swbit); 108 + DEVID_FIELD(input_device_id, propbit); 109 110 DEVID(eisa_device_id); 111 DEVID_FIELD(eisa_device_id, sig);
+5 -1
scripts/mod/file2alias.c
··· 761 sprintf(alias + strlen(alias), "%X,*", i); 762 } 763 764 - /* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */ 765 static int do_input_entry(const char *filename, void *symval, 766 char *alias) 767 { ··· 779 DEF_FIELD_ADDR(symval, input_device_id, sndbit); 780 DEF_FIELD_ADDR(symval, input_device_id, ffbit); 781 DEF_FIELD_ADDR(symval, input_device_id, swbit); 782 783 sprintf(alias, "input:"); 784 ··· 817 sprintf(alias + strlen(alias), "w*"); 818 if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) 819 do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); 820 return 1; 821 } 822 ADD_TO_DEVTABLE("input", input_device_id, do_input_entry);
··· 761 sprintf(alias + strlen(alias), "%X,*", i); 762 } 763 764 + /* input:b0v0p0e0-eXkXrXaXmXlXsXfXwXprX where X is comma-separated %02X. */ 765 static int do_input_entry(const char *filename, void *symval, 766 char *alias) 767 { ··· 779 DEF_FIELD_ADDR(symval, input_device_id, sndbit); 780 DEF_FIELD_ADDR(symval, input_device_id, ffbit); 781 DEF_FIELD_ADDR(symval, input_device_id, swbit); 782 + DEF_FIELD_ADDR(symval, input_device_id, propbit); 783 784 sprintf(alias, "input:"); 785 ··· 816 sprintf(alias + strlen(alias), "w*"); 817 if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) 818 do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); 819 + sprintf(alias + strlen(alias), "pr*"); 820 + if (flags & INPUT_DEVICE_ID_MATCH_PROPBIT) 821 + do_input(alias, *propbit, 0, INPUT_DEVICE_ID_PROP_MAX); 822 return 1; 823 } 824 ADD_TO_DEVTABLE("input", input_device_id, do_input_entry);