diff options
Diffstat (limited to 'include/linux/hid.h')
-rw-r--r-- | include/linux/hid.h | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/include/linux/hid.h b/include/linux/hid.h index e14b465b1146..0c48991b0402 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -282,6 +282,7 @@ struct hid_item { | |||
282 | #define HID_QUIRK_BADPAD 0x00000020 | 282 | #define HID_QUIRK_BADPAD 0x00000020 |
283 | #define HID_QUIRK_MULTI_INPUT 0x00000040 | 283 | #define HID_QUIRK_MULTI_INPUT 0x00000040 |
284 | #define HID_QUIRK_HIDINPUT_FORCE 0x00000080 | 284 | #define HID_QUIRK_HIDINPUT_FORCE 0x00000080 |
285 | #define HID_QUIRK_NO_EMPTY_INPUT 0x00000100 | ||
285 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 | 286 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 |
286 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 | 287 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 |
287 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 | 288 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 |
@@ -456,7 +457,8 @@ struct hid_device { /* device report descriptor */ | |||
456 | unsigned country; /* HID country */ | 457 | unsigned country; /* HID country */ |
457 | struct hid_report_enum report_enum[HID_REPORT_TYPES]; | 458 | struct hid_report_enum report_enum[HID_REPORT_TYPES]; |
458 | 459 | ||
459 | struct semaphore driver_lock; /* protects the current driver */ | 460 | struct semaphore driver_lock; /* protects the current driver, except during input */ |
461 | struct semaphore driver_input_lock; /* protects the current driver */ | ||
460 | struct device dev; /* device */ | 462 | struct device dev; /* device */ |
461 | struct hid_driver *driver; | 463 | struct hid_driver *driver; |
462 | struct hid_ll_driver *ll_driver; | 464 | struct hid_ll_driver *ll_driver; |
@@ -477,6 +479,7 @@ struct hid_device { /* device report descriptor */ | |||
477 | unsigned int status; /* see STAT flags above */ | 479 | unsigned int status; /* see STAT flags above */ |
478 | unsigned claimed; /* Claimed by hidinput, hiddev? */ | 480 | unsigned claimed; /* Claimed by hidinput, hiddev? */ |
479 | unsigned quirks; /* Various quirks the device can pull on us */ | 481 | unsigned quirks; /* Various quirks the device can pull on us */ |
482 | bool io_started; /* Protected by driver_lock. If IO has started */ | ||
480 | 483 | ||
481 | struct list_head inputs; /* The list of inputs */ | 484 | struct list_head inputs; /* The list of inputs */ |
482 | void *hiddev; /* The hiddev structure */ | 485 | void *hiddev; /* The hiddev structure */ |
@@ -512,6 +515,7 @@ struct hid_device { /* device report descriptor */ | |||
512 | struct dentry *debug_rdesc; | 515 | struct dentry *debug_rdesc; |
513 | struct dentry *debug_events; | 516 | struct dentry *debug_events; |
514 | struct list_head debug_list; | 517 | struct list_head debug_list; |
518 | spinlock_t debug_list_lock; | ||
515 | wait_queue_head_t debug_wait; | 519 | wait_queue_head_t debug_wait; |
516 | }; | 520 | }; |
517 | 521 | ||
@@ -599,6 +603,10 @@ struct hid_usage_id { | |||
599 | * @resume: invoked on resume if device was not reset (NULL means nop) | 603 | * @resume: invoked on resume if device was not reset (NULL means nop) |
600 | * @reset_resume: invoked on resume if device was reset (NULL means nop) | 604 | * @reset_resume: invoked on resume if device was reset (NULL means nop) |
601 | * | 605 | * |
606 | * probe should return -errno on error, or 0 on success. During probe, | ||
607 | * input will not be passed to raw_event unless hid_device_io_start is | ||
608 | * called. | ||
609 | * | ||
602 | * raw_event and event should return 0 on no action performed, 1 when no | 610 | * raw_event and event should return 0 on no action performed, 1 when no |
603 | * further processing should be done and negative on error | 611 | * further processing should be done and negative on error |
604 | * | 612 | * |
@@ -662,6 +670,9 @@ struct hid_driver { | |||
662 | * @hidinput_input_event: event input event (e.g. ff or leds) | 670 | * @hidinput_input_event: event input event (e.g. ff or leds) |
663 | * @parse: this method is called only once to parse the device data, | 671 | * @parse: this method is called only once to parse the device data, |
664 | * shouldn't allocate anything to not leak memory | 672 | * shouldn't allocate anything to not leak memory |
673 | * @request: send report request to device (e.g. feature report) | ||
674 | * @wait: wait for buffered io to complete (send/recv reports) | ||
675 | * @idle: send idle request to device | ||
665 | */ | 676 | */ |
666 | struct hid_ll_driver { | 677 | struct hid_ll_driver { |
667 | int (*start)(struct hid_device *hdev); | 678 | int (*start)(struct hid_device *hdev); |
@@ -676,6 +687,13 @@ struct hid_ll_driver { | |||
676 | unsigned int code, int value); | 687 | unsigned int code, int value); |
677 | 688 | ||
678 | int (*parse)(struct hid_device *hdev); | 689 | int (*parse)(struct hid_device *hdev); |
690 | |||
691 | void (*request)(struct hid_device *hdev, | ||
692 | struct hid_report *report, int reqtype); | ||
693 | |||
694 | int (*wait)(struct hid_device *hdev); | ||
695 | int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype); | ||
696 | |||
679 | }; | 697 | }; |
680 | 698 | ||
681 | #define PM_HINT_FULLON 1<<5 | 699 | #define PM_HINT_FULLON 1<<5 |
@@ -738,6 +756,44 @@ const struct hid_device_id *hid_match_id(struct hid_device *hdev, | |||
738 | s32 hid_snto32(__u32 value, unsigned n); | 756 | s32 hid_snto32(__u32 value, unsigned n); |
739 | 757 | ||
740 | /** | 758 | /** |
759 | * hid_device_io_start - enable HID input during probe, remove | ||
760 | * | ||
761 | * @hid - the device | ||
762 | * | ||
763 | * This should only be called during probe or remove and only be | ||
764 | * called by the thread calling probe or remove. It will allow | ||
765 | * incoming packets to be delivered to the driver. | ||
766 | */ | ||
767 | static inline void hid_device_io_start(struct hid_device *hid) { | ||
768 | if (hid->io_started) { | ||
769 | dev_warn(&hid->dev, "io already started"); | ||
770 | return; | ||
771 | } | ||
772 | hid->io_started = true; | ||
773 | up(&hid->driver_input_lock); | ||
774 | } | ||
775 | |||
776 | /** | ||
777 | * hid_device_io_stop - disable HID input during probe, remove | ||
778 | * | ||
779 | * @hid - the device | ||
780 | * | ||
781 | * Should only be called after hid_device_io_start. It will prevent | ||
782 | * incoming packets from going to the driver for the duration of | ||
783 | * probe, remove. If called during probe, packets will still go to the | ||
784 | * driver after probe is complete. This function should only be called | ||
785 | * by the thread calling probe or remove. | ||
786 | */ | ||
787 | static inline void hid_device_io_stop(struct hid_device *hid) { | ||
788 | if (!hid->io_started) { | ||
789 | dev_warn(&hid->dev, "io already stopped"); | ||
790 | return; | ||
791 | } | ||
792 | hid->io_started = false; | ||
793 | down(&hid->driver_input_lock); | ||
794 | } | ||
795 | |||
796 | /** | ||
741 | * hid_map_usage - map usage input bits | 797 | * hid_map_usage - map usage input bits |
742 | * | 798 | * |
743 | * @hidinput: hidinput which we are interested in | 799 | * @hidinput: hidinput which we are interested in |
@@ -883,6 +939,49 @@ static inline int hid_hw_power(struct hid_device *hdev, int level) | |||
883 | return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0; | 939 | return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0; |
884 | } | 940 | } |
885 | 941 | ||
942 | |||
943 | /** | ||
944 | * hid_hw_request - send report request to device | ||
945 | * | ||
946 | * @hdev: hid device | ||
947 | * @report: report to send | ||
948 | * @reqtype: hid request type | ||
949 | */ | ||
950 | static inline void hid_hw_request(struct hid_device *hdev, | ||
951 | struct hid_report *report, int reqtype) | ||
952 | { | ||
953 | if (hdev->ll_driver->request) | ||
954 | hdev->ll_driver->request(hdev, report, reqtype); | ||
955 | } | ||
956 | |||
957 | /** | ||
958 | * hid_hw_idle - send idle request to device | ||
959 | * | ||
960 | * @hdev: hid device | ||
961 | * @report: report to control | ||
962 | * @idle: idle state | ||
963 | * @reqtype: hid request type | ||
964 | */ | ||
965 | static inline int hid_hw_idle(struct hid_device *hdev, int report, int idle, | ||
966 | int reqtype) | ||
967 | { | ||
968 | if (hdev->ll_driver->idle) | ||
969 | return hdev->ll_driver->idle(hdev, report, idle, reqtype); | ||
970 | |||
971 | return 0; | ||
972 | } | ||
973 | |||
974 | /** | ||
975 | * hid_hw_wait - wait for buffered io to complete | ||
976 | * | ||
977 | * @hdev: hid device | ||
978 | */ | ||
979 | static inline void hid_hw_wait(struct hid_device *hdev) | ||
980 | { | ||
981 | if (hdev->ll_driver->wait) | ||
982 | hdev->ll_driver->wait(hdev); | ||
983 | } | ||
984 | |||
886 | int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | 985 | int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, |
887 | int interrupt); | 986 | int interrupt); |
888 | 987 | ||