aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2012-04-22 08:21:40 -0400
committerJiri Kosina <jkosina@suse.cz>2012-05-01 06:54:53 -0400
commita7197c2e4120ce40e7e3f5580336b9a1dc791220 (patch)
tree1f508022a41558ea29dc87baddcf8c2132f9bdd3 /include
parent2a039bf5a6caa6b41c3839c1e3a19b20fb38270b (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.h14
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;
467struct hid_ll_driver; 467struct hid_ll_driver;
468 468
469struct hid_device { /* device report descriptor */ 469struct 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);
735struct hid_device *hid_allocate_device(void); 737struct hid_device *hid_allocate_device(void);
736struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); 738struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id);
737int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); 739int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size);
740int hid_open_report(struct hid_device *device);
738int hid_check_keys_pressed(struct hid_device *hid); 741int hid_check_keys_pressed(struct hid_device *hid);
739int hid_connect(struct hid_device *hid, unsigned int connect_mask); 742int hid_connect(struct hid_device *hid, unsigned int connect_mask);
740void hid_disconnect(struct hid_device *hid); 743void hid_disconnect(struct hid_device *hid);
@@ -805,16 +808,7 @@ static inline void hid_map_usage_clear(struct hid_input *hidinput,
805 */ 808 */
806static inline int __must_check hid_parse(struct hid_device *hdev) 809static 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/**