aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2013-02-25 05:31:44 -0500
committerJiri Kosina <jkosina@suse.cz>2013-02-25 07:26:39 -0500
commit3373443befa73ee60e4275e7699b26058b01455a (patch)
tree15d45696ffb58d756266a6a6134b1cb25a38f457
parente90a6df80dc45ab53d2f4f4db297434e48c0208e (diff)
HID: Extend the interface with wait io request
Some drivers need to wait for an io from the underlying device, creating an unwanted dependency on the underlying transport layer. This patch adds wait() to the interface, thereby removing usbhid from the lion share of the drivers. Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/usbhid/hid-core.c1
-rw-r--r--include/linux/hid.h14
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 366fd09d257d..99d95d3368b5 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1264,6 +1264,7 @@ static struct hid_ll_driver usb_hid_driver = {
1264 .power = usbhid_power, 1264 .power = usbhid_power,
1265 .hidinput_input_event = usb_hidinput_input_event, 1265 .hidinput_input_event = usb_hidinput_input_event,
1266 .request = usbhid_request, 1266 .request = usbhid_request,
1267 .wait = usbhid_wait_io,
1267}; 1268};
1268 1269
1269static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) 1270static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 261c713d4842..7071eb3d36c7 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -663,6 +663,7 @@ struct hid_driver {
663 * @parse: this method is called only once to parse the device data, 663 * @parse: this method is called only once to parse the device data,
664 * shouldn't allocate anything to not leak memory 664 * shouldn't allocate anything to not leak memory
665 * @request: send report request to device (e.g. feature report) 665 * @request: send report request to device (e.g. feature report)
666 * @wait: wait for buffered io to complete (send/recv reports)
666 */ 667 */
667struct hid_ll_driver { 668struct hid_ll_driver {
668 int (*start)(struct hid_device *hdev); 669 int (*start)(struct hid_device *hdev);
@@ -681,6 +682,8 @@ struct hid_ll_driver {
681 void (*request)(struct hid_device *hdev, 682 void (*request)(struct hid_device *hdev,
682 struct hid_report *report, int reqtype); 683 struct hid_report *report, int reqtype);
683 684
685 int (*wait)(struct hid_device *hdev);
686
684}; 687};
685 688
686#define PM_HINT_FULLON 1<<5 689#define PM_HINT_FULLON 1<<5
@@ -903,6 +906,17 @@ static inline void hid_hw_request(struct hid_device *hdev,
903 hdev->ll_driver->request(hdev, report, reqtype); 906 hdev->ll_driver->request(hdev, report, reqtype);
904} 907}
905 908
909/**
910 * hid_hw_wait - wait for buffered io to complete
911 *
912 * @hdev: hid device
913 */
914static inline void hid_hw_wait(struct hid_device *hdev)
915{
916 if (hdev->ll_driver->wait)
917 hdev->ll_driver->wait(hdev);
918}
919
906int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, 920int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
907 int interrupt); 921 int interrupt);
908 922