diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2012-04-22 08:21:40 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2012-05-01 06:54:53 -0400 |
commit | a7197c2e4120ce40e7e3f5580336b9a1dc791220 (patch) | |
tree | 1f508022a41558ea29dc87baddcf8c2132f9bdd3 /include | |
parent | 2a039bf5a6caa6b41c3839c1e3a19b20fb38270b (diff) |
HID: Handle driver-specific device descriptor in core
The low-level driver can read the report descriptor, but it cannot
determine driver-specific changes to it. The hid core can fixup
and parse the report descriptor during driver attach, but does
not have direct access to the descriptor when doing so.
To be able to handle attach/detach of hid drivers properly,
a semantic change to hid_parse_report() is needed. This function has
been used in two ways, both as descriptor reader in the ll drivers and
as a parsor in the probe of the drivers. This patch splits the usage
by introducing hid_open_report(), and modifies the hid_parse() macro
to call hid_open_report() instead. The only usage of hid_parse_report()
is then to read and store the device descriptor. As a consequence, we
can handle the report fixups automatically inside the hid core.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Tested-by: Nikolai Kondrashov <spbnick@gmail.com>
Tested-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/hid.h | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/include/linux/hid.h b/include/linux/hid.h index 3a95da60fd3e..d8e7cc7f894f 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -467,6 +467,8 @@ struct hid_driver; | |||
467 | struct hid_ll_driver; | 467 | struct hid_ll_driver; |
468 | 468 | ||
469 | struct hid_device { /* device report descriptor */ | 469 | struct hid_device { /* device report descriptor */ |
470 | __u8 *dev_rdesc; | ||
471 | unsigned dev_rsize; | ||
470 | __u8 *rdesc; | 472 | __u8 *rdesc; |
471 | unsigned rsize; | 473 | unsigned rsize; |
472 | struct hid_collection *collection; /* List of HID collections */ | 474 | struct hid_collection *collection; /* List of HID collections */ |
@@ -735,6 +737,7 @@ void hid_output_report(struct hid_report *report, __u8 *data); | |||
735 | struct hid_device *hid_allocate_device(void); | 737 | struct hid_device *hid_allocate_device(void); |
736 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); | 738 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); |
737 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); | 739 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); |
740 | int hid_open_report(struct hid_device *device); | ||
738 | int hid_check_keys_pressed(struct hid_device *hid); | 741 | int hid_check_keys_pressed(struct hid_device *hid); |
739 | int hid_connect(struct hid_device *hid, unsigned int connect_mask); | 742 | int hid_connect(struct hid_device *hid, unsigned int connect_mask); |
740 | void hid_disconnect(struct hid_device *hid); | 743 | void hid_disconnect(struct hid_device *hid); |
@@ -805,16 +808,7 @@ static inline void hid_map_usage_clear(struct hid_input *hidinput, | |||
805 | */ | 808 | */ |
806 | static inline int __must_check hid_parse(struct hid_device *hdev) | 809 | static inline int __must_check hid_parse(struct hid_device *hdev) |
807 | { | 810 | { |
808 | int ret; | 811 | return hid_open_report(hdev); |
809 | |||
810 | if (hdev->status & HID_STAT_PARSED) | ||
811 | return 0; | ||
812 | |||
813 | ret = hdev->ll_driver->parse(hdev); | ||
814 | if (!ret) | ||
815 | hdev->status |= HID_STAT_PARSED; | ||
816 | |||
817 | return ret; | ||
818 | } | 812 | } |
819 | 813 | ||
820 | /** | 814 | /** |