aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 12:37:55 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 12:37:55 -0400
commit19b344efa35dbc253e2d10403dafe6aafda73c56 (patch)
tree47c4ad25398642bcf1a93e186d77548ced3f7a2a /include
parent5d434fcb255dec99189f1c58a06e4f56e12bf77d (diff)
parentad1b890e06af049fb48d7ccb799d0e96c071c893 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID updates from Jiri Kosina: - hid driver transport cleanup, finalizing the long-desired decoupling of core from transport layers, by Benjamin Tissoires and Henrik Rydberg - support for hybrid finger/pen multitouch HID devices, by Benjamin Tissoires - fix for long-standing issue in Logitech unifying driver sometimes not inializing properly due to device specifics, by Andrew de los Reyes - Wii remote driver updates to support 2nd generation of devices, by David Herrmann - support for Apple IR remote - roccat driver now supports new devices (Roccat Kone Pure, IskuFX), by Stefan Achatz - debugfs locking fixes in hid debug interface, by Jiri Kosina * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (43 commits) HID: protect hid_debug_list HID: debug: break out hid_dump_report() into hid-debug HID: Add PID for Japanese version of NE4K keyboard HID: hid-lg4ff add support for new version of DFGT wheel HID: icade: u16 which never < 0 HID: clarify Magic Mouse Kconfig description HID: appleir: add support for Apple ir devices HID: roccat: added media key support for Kone HID: hid-lenovo-tpkbd: remove doubled hid_get_drvdata HID: i2c-hid: fix length for set/get report in i2c hid HID: wiimote: parse reduced status reports HID: wiimote: add 2nd generation Wii Remote IDs HID: wiimote: use unique battery names HID: hidraw: warn if userspace headers are outdated HID: multitouch: force BTN_STYLUS for pen devices HID: multitouch: append " Pen" to the name of the stylus input HID: multitouch: add handling for pen in dual-sensors device HID: multitouch: change touch sensor detection in mt_input_configured() HID: multitouch: do not map usage from non used reports HID: multitouch: breaks out touch handling in specific functions ...
Diffstat (limited to 'include')
-rw-r--r--include/linux/hid-debug.h6
-rw-r--r--include/linux/hid.h101
2 files changed, 104 insertions, 3 deletions
diff --git a/include/linux/hid-debug.h b/include/linux/hid-debug.h
index 53744fa1c8b7..8663f216c563 100644
--- a/include/linux/hid-debug.h
+++ b/include/linux/hid-debug.h
@@ -22,11 +22,12 @@
22 * 22 *
23 */ 23 */
24 24
25#define HID_DEBUG_BUFSIZE 512
26
27#ifdef CONFIG_DEBUG_FS 25#ifdef CONFIG_DEBUG_FS
28 26
27#define HID_DEBUG_BUFSIZE 512
28
29void hid_dump_input(struct hid_device *, struct hid_usage *, __s32); 29void hid_dump_input(struct hid_device *, struct hid_usage *, __s32);
30void hid_dump_report(struct hid_device *, int , u8 *, int);
30void hid_dump_device(struct hid_device *, struct seq_file *); 31void hid_dump_device(struct hid_device *, struct seq_file *);
31void hid_dump_field(struct hid_field *, int, struct seq_file *); 32void hid_dump_field(struct hid_field *, int, struct seq_file *);
32char *hid_resolv_usage(unsigned, struct seq_file *); 33char *hid_resolv_usage(unsigned, struct seq_file *);
@@ -50,6 +51,7 @@ struct hid_debug_list {
50#else 51#else
51 52
52#define hid_dump_input(a,b,c) do { } while (0) 53#define hid_dump_input(a,b,c) do { } while (0)
54#define hid_dump_report(a,b,c,d) do { } while (0)
53#define hid_dump_device(a,b) do { } while (0) 55#define hid_dump_device(a,b) do { } while (0)
54#define hid_dump_field(a,b,c) do { } while (0) 56#define hid_dump_field(a,b,c) do { } while (0)
55#define hid_resolv_usage(a,b) do { } while (0) 57#define hid_resolv_usage(a,b) do { } while (0)
diff --git a/include/linux/hid.h b/include/linux/hid.h
index e14b465b1146..af1b86d46f6e 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 struct mutex 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 */
666struct hid_ll_driver { 677struct 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,
738s32 hid_snto32(__u32 value, unsigned n); 756s32 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 */
767static 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 */
787static 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 */
950static 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 */
965static 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 */
979static inline void hid_hw_wait(struct hid_device *hdev)
980{
981 if (hdev->ll_driver->wait)
982 hdev->ll_driver->wait(hdev);
983}
984
886int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, 985int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
887 int interrupt); 986 int interrupt);
888 987