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