diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2017-10-09 15:01:14 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2017-10-19 19:54:49 -0400 |
commit | 8724ecb072293f109a6f5dc93be8a98bf61fe14f (patch) | |
tree | f63e205ecb0af4420d175b29832992db8fcfc1d3 | |
parent | 55dfce873dca46df00304c44a568d7933bffff89 (diff) |
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>
-rw-r--r-- | drivers/input/input.c | 3 | ||||
-rw-r--r-- | include/linux/input.h | 4 | ||||
-rw-r--r-- | include/linux/mod_devicetable.h | 3 | ||||
-rw-r--r-- | scripts/mod/devicetable-offsets.c | 1 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 6 |
5 files changed, 15 insertions, 2 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 02e6ea7955fe..762bfb9487dc 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -960,7 +960,8 @@ bool input_match_device_id(const struct input_dev *dev, | |||
960 | !bitmap_subset(id->ledbit, dev->ledbit, LED_MAX) || | 960 | !bitmap_subset(id->ledbit, dev->ledbit, LED_MAX) || |
961 | !bitmap_subset(id->sndbit, dev->sndbit, SND_MAX) || | 961 | !bitmap_subset(id->sndbit, dev->sndbit, SND_MAX) || |
962 | !bitmap_subset(id->ffbit, dev->ffbit, FF_MAX) || | 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 | return false; | 965 | return false; |
965 | } | 966 | } |
966 | 967 | ||
diff --git a/include/linux/input.h b/include/linux/input.h index 2a44650e449d..7c7516eb7d76 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -234,6 +234,10 @@ struct input_dev { | |||
234 | #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match" | 234 | #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match" |
235 | #endif | 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 | #define INPUT_DEVICE_ID_MATCH_DEVICE \ | 241 | #define INPUT_DEVICE_ID_MATCH_DEVICE \ |
238 | (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) | 242 | (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) |
239 | #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ | 243 | #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 3f74ef2281e8..72f0b7f19c59 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -293,6 +293,7 @@ struct pcmcia_device_id { | |||
293 | #define INPUT_DEVICE_ID_SND_MAX 0x07 | 293 | #define INPUT_DEVICE_ID_SND_MAX 0x07 |
294 | #define INPUT_DEVICE_ID_FF_MAX 0x7f | 294 | #define INPUT_DEVICE_ID_FF_MAX 0x7f |
295 | #define INPUT_DEVICE_ID_SW_MAX 0x0f | 295 | #define INPUT_DEVICE_ID_SW_MAX 0x0f |
296 | #define INPUT_DEVICE_ID_PROP_MAX 0x1f | ||
296 | 297 | ||
297 | #define INPUT_DEVICE_ID_MATCH_BUS 1 | 298 | #define INPUT_DEVICE_ID_MATCH_BUS 1 |
298 | #define INPUT_DEVICE_ID_MATCH_VENDOR 2 | 299 | #define INPUT_DEVICE_ID_MATCH_VENDOR 2 |
@@ -308,6 +309,7 @@ struct pcmcia_device_id { | |||
308 | #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x0400 | 309 | #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x0400 |
309 | #define INPUT_DEVICE_ID_MATCH_FFBIT 0x0800 | 310 | #define INPUT_DEVICE_ID_MATCH_FFBIT 0x0800 |
310 | #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 | 311 | #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 |
312 | #define INPUT_DEVICE_ID_MATCH_PROPBIT 0x2000 | ||
311 | 313 | ||
312 | struct input_device_id { | 314 | struct input_device_id { |
313 | 315 | ||
@@ -327,6 +329,7 @@ struct input_device_id { | |||
327 | kernel_ulong_t sndbit[INPUT_DEVICE_ID_SND_MAX / BITS_PER_LONG + 1]; | 329 | 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]; | 330 | 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]; | 331 | kernel_ulong_t swbit[INPUT_DEVICE_ID_SW_MAX / BITS_PER_LONG + 1]; |
332 | kernel_ulong_t propbit[INPUT_DEVICE_ID_PROP_MAX / BITS_PER_LONG + 1]; | ||
330 | 333 | ||
331 | kernel_ulong_t driver_info; | 334 | kernel_ulong_t driver_info; |
332 | }; | 335 | }; |
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index e4d90e50f6fe..812657ab5aa3 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c | |||
@@ -105,6 +105,7 @@ int main(void) | |||
105 | DEVID_FIELD(input_device_id, sndbit); | 105 | DEVID_FIELD(input_device_id, sndbit); |
106 | DEVID_FIELD(input_device_id, ffbit); | 106 | DEVID_FIELD(input_device_id, ffbit); |
107 | DEVID_FIELD(input_device_id, swbit); | 107 | DEVID_FIELD(input_device_id, swbit); |
108 | DEVID_FIELD(input_device_id, propbit); | ||
108 | 109 | ||
109 | DEVID(eisa_device_id); | 110 | DEVID(eisa_device_id); |
110 | DEVID_FIELD(eisa_device_id, sig); | 111 | DEVID_FIELD(eisa_device_id, sig); |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 29d6699d5a06..bc25898f6df0 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -761,7 +761,7 @@ static void do_input(char *alias, | |||
761 | sprintf(alias + strlen(alias), "%X,*", i); | 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 | static int do_input_entry(const char *filename, void *symval, | 765 | static int do_input_entry(const char *filename, void *symval, |
766 | char *alias) | 766 | char *alias) |
767 | { | 767 | { |
@@ -779,6 +779,7 @@ static int do_input_entry(const char *filename, void *symval, | |||
779 | DEF_FIELD_ADDR(symval, input_device_id, sndbit); | 779 | DEF_FIELD_ADDR(symval, input_device_id, sndbit); |
780 | DEF_FIELD_ADDR(symval, input_device_id, ffbit); | 780 | DEF_FIELD_ADDR(symval, input_device_id, ffbit); |
781 | DEF_FIELD_ADDR(symval, input_device_id, swbit); | 781 | DEF_FIELD_ADDR(symval, input_device_id, swbit); |
782 | DEF_FIELD_ADDR(symval, input_device_id, propbit); | ||
782 | 783 | ||
783 | sprintf(alias, "input:"); | 784 | sprintf(alias, "input:"); |
784 | 785 | ||
@@ -816,6 +817,9 @@ static int do_input_entry(const char *filename, void *symval, | |||
816 | sprintf(alias + strlen(alias), "w*"); | 817 | sprintf(alias + strlen(alias), "w*"); |
817 | if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) | 818 | if (flags & INPUT_DEVICE_ID_MATCH_SWBIT) |
818 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); | 819 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); |
820 | sprintf(alias + strlen(alias), "pr*"); | ||
821 | if (flags & INPUT_DEVICE_ID_MATCH_PROPBIT) | ||
822 | do_input(alias, *propbit, 0, INPUT_DEVICE_ID_PROP_MAX); | ||
819 | return 1; | 823 | return 1; |
820 | } | 824 | } |
821 | ADD_TO_DEVTABLE("input", input_device_id, do_input_entry); | 825 | ADD_TO_DEVTABLE("input", input_device_id, do_input_entry); |