]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - include/linux/hid.h
percpu: add preemption checks to __this_cpu ops
[karo-tx-linux.git] / include / linux / hid.h
index 31b9d299ef6ca25bf3d5bfd753860d7d3294be68..720e3a10608cec94c02c94a6a1053789a567bae5 100644 (file)
@@ -201,6 +201,7 @@ struct hid_item {
 #define HID_GD_VBRZ            0x00010045
 #define HID_GD_VNO             0x00010046
 #define HID_GD_FEATURE         0x00010047
+#define HID_GD_SYSTEM_CONTROL  0x00010080
 #define HID_GD_UP              0x00010090
 #define HID_GD_DOWN            0x00010091
 #define HID_GD_RIGHT           0x00010092
@@ -208,6 +209,8 @@ struct hid_item {
 
 #define HID_DC_BATTERYSTRENGTH 0x00060020
 
+#define HID_CP_CONSUMER_CONTROL        0x000c0001
+
 #define HID_DG_DIGITIZER       0x000d0001
 #define HID_DG_PEN             0x000d0002
 #define HID_DG_LIGHTPEN                0x000d0003
@@ -287,6 +290,8 @@ struct hid_item {
 #define HID_QUIRK_NO_EMPTY_INPUT               0x00000100
 #define HID_QUIRK_NO_INIT_INPUT_REPORTS                0x00000200
 #define HID_QUIRK_SKIP_OUTPUT_REPORTS          0x00010000
+#define HID_QUIRK_SKIP_OUTPUT_REPORT_ID                0x00020000
+#define HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP 0x00040000
 #define HID_QUIRK_FULLSPEED_INTERVAL           0x10000000
 #define HID_QUIRK_NO_INIT_REPORTS              0x20000000
 #define HID_QUIRK_NO_IGNORE                    0x40000000
@@ -508,12 +513,6 @@ struct hid_device {                                                        /* device report descriptor */
                                  struct hid_usage *, __s32);
        void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
 
-       /* handler for raw input (Get_Report) data, used by hidraw */
-       int (*hid_get_raw_report) (struct hid_device *, unsigned char, __u8 *, size_t, unsigned char);
-
-       /* handler for raw output data, used by hidraw */
-       int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char);
-
        /* debugging support via debugfs */
        unsigned short debug;
        struct dentry *debug_dir;
@@ -675,11 +674,12 @@ struct hid_driver {
  * @stop: called on remove
  * @open: called by input layer on open
  * @close: called by input layer on close
- * @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)
+ * @raw_request: send raw report request to device (e.g. feature report)
+ * @output_report: send output report to device
  * @idle: send idle request to device
  */
 struct hid_ll_driver {
@@ -691,17 +691,20 @@ struct hid_ll_driver {
 
        int (*power)(struct hid_device *hdev, int level);
 
-       int (*hidinput_input_event) (struct input_dev *idev, unsigned int type,
-                       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);
 
+       int (*raw_request) (struct hid_device *hdev, unsigned char reportnum,
+                           __u8 *buf, size_t len, unsigned char rtype,
+                           int reqtype);
+
+       int (*output_report) (struct hid_device *hdev, __u8 *buf, size_t len);
+
+       int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype);
 };
 
 #define        PM_HINT_FULLON  1<<5
@@ -752,6 +755,7 @@ struct hid_field *hidinput_get_led_field(struct hid_device *hid);
 unsigned int hidinput_count_leds(struct hid_device *hid);
 __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code);
 void hid_output_report(struct hid_report *report, __u8 *data);
+void __hid_request(struct hid_device *hid, struct hid_report *rep, int reqtype);
 u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags);
 struct hid_device *hid_allocate_device(void);
 struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id);
@@ -964,7 +968,55 @@ 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);
+               return hdev->ll_driver->request(hdev, report, reqtype);
+
+       __hid_request(hdev, report, reqtype);
+}
+
+/**
+ * hid_hw_raw_request - send report request to device
+ *
+ * @hdev: hid device
+ * @reportnum: report ID
+ * @buf: in/out data to transfer
+ * @len: length of buf
+ * @rtype: HID report type
+ * @reqtype: HID_REQ_GET_REPORT or HID_REQ_SET_REPORT
+ *
+ * @return: count of data transfered, negative if error
+ *
+ * Same behavior as hid_hw_request, but with raw buffers instead.
+ */
+static inline int hid_hw_raw_request(struct hid_device *hdev,
+                                 unsigned char reportnum, __u8 *buf,
+                                 size_t len, unsigned char rtype, int reqtype)
+{
+       if (len < 1 || len > HID_MAX_BUFFER_SIZE || !buf)
+               return -EINVAL;
+
+       return hdev->ll_driver->raw_request(hdev, reportnum, buf, len,
+                                                   rtype, reqtype);
+}
+
+/**
+ * hid_hw_output_report - send output report to device
+ *
+ * @hdev: hid device
+ * @buf: raw data to transfer
+ * @len: length of buf
+ *
+ * @return: count of data transfered, negative if error
+ */
+static inline int hid_hw_output_report(struct hid_device *hdev, __u8 *buf,
+                                       size_t len)
+{
+       if (len < 1 || len > HID_MAX_BUFFER_SIZE || !buf)
+               return -EINVAL;
+
+       if (hdev->ll_driver->output_report)
+               return hdev->ll_driver->output_report(hdev, buf, len);
+
+       return -ENOSYS;
 }
 
 /**