]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - include/linux/hid.h
Merge branches 'for-4.13/multitouch', 'for-4.13/retrode', 'for-4.13/transport-open...
[karo-tx-linux.git] / include / linux / hid.h
index 5be325d890d96f9d823753e92296c379e3751076..5006f9b5d83701a77529988644cd9b018485bf7b 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/workqueue.h>
 #include <linux/input.h>
 #include <linux/semaphore.h>
+#include <linux/mutex.h>
 #include <linux/power_supply.h>
 #include <uapi/linux/hid.h>
 
@@ -182,6 +183,11 @@ struct hid_item {
 #define HID_GD_KEYBOARD                0x00010006
 #define HID_GD_KEYPAD          0x00010007
 #define HID_GD_MULTIAXIS       0x00010008
+/*
+ * Microsoft Win8 Wireless Radio Controls extensions CA, see:
+ * http://www.usb.org/developers/hidpage/HUTRR40RadioHIDUsagesFinal.pdf
+ */
+#define HID_GD_WIRELESS_RADIO_CTLS     0x0001000c
 #define HID_GD_X               0x00010030
 #define HID_GD_Y               0x00010031
 #define HID_GD_Z               0x00010032
@@ -210,6 +216,10 @@ struct hid_item {
 #define HID_GD_DOWN            0x00010091
 #define HID_GD_RIGHT           0x00010092
 #define HID_GD_LEFT            0x00010093
+/* Microsoft Win8 Wireless Radio Controls CA usage codes */
+#define HID_GD_RFKILL_BTN      0x000100c6
+#define HID_GD_RFKILL_LED      0x000100c7
+#define HID_GD_RFKILL_SWITCH   0x000100c8
 
 #define HID_DC_BATTERYSTRENGTH 0x00060020
 
@@ -520,7 +530,10 @@ struct hid_device {                                                        /* device report descriptor */
        struct semaphore driver_input_lock;                             /* protects the current driver */
        struct device dev;                                              /* device */
        struct hid_driver *driver;
+
        struct hid_ll_driver *ll_driver;
+       struct mutex ll_open_lock;
+       unsigned int ll_open_count;
 
 #ifdef CONFIG_HID_BATTERY_STRENGTH
        /*
@@ -544,7 +557,6 @@ struct hid_device {                                                 /* device report descriptor */
        void *hiddev;                                                   /* The hiddev structure */
        void *hidraw;
 
-       int open;                                                       /* is the device open by anyone? */
        char name[128];                                                 /* Device name */
        char phys[64];                                                  /* Device physical location */
        char uniq[64];                                                  /* Device unique identifier (serial #) */
@@ -937,69 +949,11 @@ static inline int __must_check hid_parse(struct hid_device *hdev)
        return hid_open_report(hdev);
 }
 
-/**
- * hid_hw_start - start underlaying HW
- *
- * @hdev: hid device
- * @connect_mask: which outputs to connect, see HID_CONNECT_*
- *
- * Call this in probe function *after* hid_parse. This will setup HW buffers
- * and start the device (if not deffered to device open). hid_hw_stop must be
- * called if this was successful.
- */
-static inline int __must_check hid_hw_start(struct hid_device *hdev,
-               unsigned int connect_mask)
-{
-       int ret = hdev->ll_driver->start(hdev);
-       if (ret || !connect_mask)
-               return ret;
-       ret = hid_connect(hdev, connect_mask);
-       if (ret)
-               hdev->ll_driver->stop(hdev);
-       return ret;
-}
-
-/**
- * hid_hw_stop - stop underlaying HW
- *
- * @hdev: hid device
- *
- * This is usually called from remove function or from probe when something
- * failed and hid_hw_start was called already.
- */
-static inline void hid_hw_stop(struct hid_device *hdev)
-{
-       hid_disconnect(hdev);
-       hdev->ll_driver->stop(hdev);
-}
-
-/**
- * hid_hw_open - signal underlaying HW to start delivering events
- *
- * @hdev: hid device
- *
- * Tell underlying HW to start delivering events from the device.
- * This function should be called sometime after successful call
- * to hid_hiw_start().
- */
-static inline int __must_check hid_hw_open(struct hid_device *hdev)
-{
-       return hdev->ll_driver->open(hdev);
-}
-
-/**
- * hid_hw_close - signal underlaying HW to stop delivering events
- *
- * @hdev: hid device
- *
- * This function indicates that we are not interested in the events
- * from this device anymore. Delivery of events may or may not stop,
- * depending on the number of users still outstanding.
- */
-static inline void hid_hw_close(struct hid_device *hdev)
-{
-       hdev->ll_driver->close(hdev);
-}
+int __must_check hid_hw_start(struct hid_device *hdev,
+                             unsigned int connect_mask);
+void hid_hw_stop(struct hid_device *hdev);
+int __must_check hid_hw_open(struct hid_device *hdev);
+void hid_hw_close(struct hid_device *hdev);
 
 /**
  * hid_hw_power - requests underlying HW to go into given power mode