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 | ||
