summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2013-02-25 11:31:44 +0100
committerJiri Kosina <jkosina@suse.cz>2013-02-25 13:26:39 +0100
commit3373443befa73ee60e4275e7699b26058b01455a (patch)
tree15d45696ffb58d756266a6a6134b1cb25a38f457 /include
parente90a6df80dc45ab53d2f4f4db297434e48c0208e (diff)
downloadlwn-3373443befa73ee60e4275e7699b26058b01455a.tar.gz
lwn-3373443befa73ee60e4275e7699b26058b01455a.zip
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>
Diffstat (limited to 'include')
-rw-r--r--include/linux/hid.h14
1 files changed, 14 insertions, 0 deletions
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 {
* @parse: this method is called only once to parse the device data,
* shouldn't allocate anything to not leak memory
* @request: send report request to device (e.g. feature report)
+ * @wait: wait for buffered io to complete (send/recv reports)
*/
struct hid_ll_driver {
int (*start)(struct hid_device *hdev);
@@ -681,6 +682,8 @@ struct hid_ll_driver {
void (*request)(struct hid_device *hdev,
struct hid_report *report, int reqtype);
+ int (*wait)(struct hid_device *hdev);
+
};
#define PM_HINT_FULLON 1<<5
@@ -903,6 +906,17 @@ static inline void hid_hw_request(struct hid_device *hdev,
hdev->ll_driver->request(hdev, report, reqtype);
}
+/**
+ * hid_hw_wait - wait for buffered io to complete
+ *
+ * @hdev: hid device
+ */
+static inline void hid_hw_wait(struct hid_device *hdev)
+{
+ if (hdev->ll_driver->wait)
+ hdev->ll_driver->wait(hdev);
+}
+
int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
int interrupt);