Merge branches 'for-3.10/appleir', 'for-3.10/hid-debug', 'for-3.10/hid-driver-transpo...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / linux / hid.h
index 895b85639dec6a1f7d022df14024fe5ae56e6db1..31e7cb51b17d92787476603ff52f8520f2678784 100644 (file)
@@ -514,6 +514,7 @@ struct hid_device {                                                 /* device report descriptor */
        struct dentry *debug_rdesc;
        struct dentry *debug_events;
        struct list_head debug_list;
+       struct mutex debug_list_lock;
        wait_queue_head_t debug_wait;
 };
 
@@ -668,6 +669,9 @@ 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)
+ * @wait: wait for buffered io to complete (send/recv reports)
+ * @idle: send idle request to device
  */
 struct hid_ll_driver {
        int (*start)(struct hid_device *hdev);
@@ -682,6 +686,13 @@ 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);
+
+       int (*wait)(struct hid_device *hdev);
+       int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype);
+
 };
 
 #define        PM_HINT_FULLON  1<<5
@@ -927,6 +938,49 @@ 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);
+}
+
+/**
+ * hid_hw_idle - send idle request to device
+ *
+ * @hdev: hid device
+ * @report: report to control
+ * @idle: idle state
+ * @reqtype: hid request type
+ */
+static inline int hid_hw_idle(struct hid_device *hdev, int report, int idle,
+               int reqtype)
+{
+       if (hdev->ll_driver->idle)
+               return hdev->ll_driver->idle(hdev, report, idle, reqtype);
+
+       return 0;
+}
+
+/**
+ * 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);