summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2013-02-25 11:31:43 +0100
committerPeter Kim <pekim@nvidia.com>2014-06-12 21:57:18 -0700
commit2a698014d1e170b736237ad7f7caf046295c413b (patch)
tree5beb942729fb87a7c5ae62868c3408d505ee4d94 /include
parent44f8a9e1b9cb6ef709735ac247a2460a79624a80 (diff)
HID: Extend the interface with report requests
Some drivers send reports directly to underlying device, creating an unwanted dependency on the underlying transport layer. This patch adds hid_hw_request() to the interface, thereby removing usbhid from the lion share of the drivers. Bug 1466757 Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz> (cherry picked from commit e90a6df80dc45ab53d2f4f4db297434e48c0208e) Change-Id: I1c18daaf177c116e0665e16280199595f9b26dbd Signed-off-by: Kenneth Kwak <kkwak@nvidia.com> Reviewed-on: http://git-master/r/411358 Signed-off-by: Kenneth Kwak <kkwak@nvidia.com> Reviewed-on: http://git-master/r/417528 Reviewed-by: Peter Kim <pekim@nvidia.com> Tested-by: Peter Kim <pekim@nvidia.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/hid.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 7af7acf65726..f1d71d5ce106 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -688,6 +688,7 @@ struct hid_driver {
* @hidinput_input_event: event input event (e.g. ff or leds)
* @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)
*/
struct hid_ll_driver {
int (*start)(struct hid_device *hdev);
@@ -702,6 +703,10 @@ struct hid_ll_driver {
unsigned int code, int value);
int (*parse)(struct hid_device *hdev);
+
+ void (*request)(struct hid_device *hdev,
+ struct hid_report *report, int reqtype);
+
};
#define PM_HINT_FULLON 1<<5
@@ -895,6 +900,20 @@ static inline int hid_hw_power(struct hid_device *hdev, int level)
return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0;
}
+/**
+ * hid_hw_request - send report request to device
+ *
+ * @hdev: hid device
+ * @report: report to send
+ * @reqtype: hid request type
+ */
+static inline void hid_hw_request(struct hid_device *hdev,
+ struct hid_report *report, int reqtype)
+{
+ if (hdev->ll_driver->request)
+ hdev->ll_driver->request(hdev, report, reqtype);
+}
+
void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
int interrupt);