hid: rkvr: add remove sync process, add sync ioctl to sync with nanoc before trasmitting
authorlanshh <lsh@rock-chips.com>
Fri, 9 Sep 2016 02:35:00 +0000 (10:35 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 14 Sep 2016 01:03:52 +0000 (09:03 +0800)
Change-Id: I46c8577b2a9c8dd9b66597fba3775966f030ecfd
Signed-off-by: lanshh <lsh@rock-chips.com>
drivers/hid/hid-rkvr.c
drivers/hid/hid-rkvr.h

index 1087d90209536d2de62409d6fc0746bac1ac5086..63d7fc00a53c5135f1b3988b1461fb5999627ebe 100644 (file)
@@ -1062,6 +1062,25 @@ static long rkvr_hidraw_ioctl(struct file *file, unsigned int cmd, unsigned long
                                break;
                        }
 
+                       if (_IOC_NR(cmd) == _IOC_NR(HIDRKVRHANDSHAKE(0))) {
+                               int len = _IOC_SIZE(cmd);
+                               char *buf;
+
+                               buf = kzalloc(len + 1, GFP_KERNEL);
+                               if (!buf) {
+                                       ret = -ENOMEM;
+                                       break;
+                               }
+                               if (copy_from_user(buf, user_arg, len)) {
+                                       ret = -EFAULT;
+                                       kfree(buf);
+                                       break;
+                               }
+                               ret = hid_report_sync(&hid->dev, buf, len);
+                               kfree(buf);
+                               break;
+                       }
+
                        /* Begin Read-only ioctls. */
                        if (_IOC_DIR(cmd) != _IOC_READ) {
                                ret = -EINVAL;
@@ -1120,41 +1139,6 @@ int rkvr_sensor_register_callback(int (*callback)(char *, size_t, void *), void
 }
 EXPORT_SYMBOL_GPL(rkvr_sensor_register_callback);
 
-static int rkvr_sync_exec(const char *p, size_t c)
-{
-       int minor;
-       int ret = c;
-       int exist = 0;
-
-       mutex_lock(&minors_lock);
-       pr_info("rkvr_sync_exec %s\n", p);
-       for (minor = 0; minor < RKVR_HIDRAW_MAX_DEVICES; minor++) {
-               if (!rkvr_hidraw_table[minor] || !rkvr_hidraw_table[minor]->exist)
-                       continue;
-               if (hid_report_sync(&rkvr_hidraw_table[minor]->hid->dev, p, c)) {
-                       hid_err(rkvr_hidraw_table[minor]->hid, "hid_report_sync failed\n");
-                       ret = -EIO;
-                       goto exit;
-               }
-               exist++;
-       }
-       if (!exist)
-               ret = -ENODEV;
-exit:
-       mutex_unlock(&minors_lock);
-
-       return ret;
-}
-
-int rkvr_sensor_sync_inv(const char *p, size_t c)
-{
-       snprintf(sync_string, sizeof(sync_string), "%s", p);
-
-       return rkvr_sync_exec(sync_string, strlen(sync_string));
-}
-
-EXPORT_SYMBOL_GPL(rkvr_sensor_sync_inv);
-
 static int rkvr_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
        int retval;
index ff1cd9fd4c69f1b2e85995b7cf55d28f6f43ec94..309bc37cb550970a3fac5dd6b843d792b183ea8b 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef __HID_RKVR_H
 #define __HID_RKVR_H
 
-#define HIDRKVRHANDSHAKE(len)  _IOC(_IOC_WRITE, 'H', 0x07, len)
+#define HIDRKVRHANDSHAKE(len)  _IOC(_IOC_WRITE, 'H', 0x1A, len)
 #define HID_REPORT_ID_R        4
 #define HID_REPORT_ID_W        5
 #define HID_REPORT_ID_CRYP     6
@@ -31,7 +31,6 @@ enum tracker_message_type {
 #define DYNAMIC_LOAD_MPU6500 0
 
 int rkvr_sensor_register_callback(int (*callback)(char *, size_t, void *), void *priv);
-int rkvr_sensor_sync_inv(const char *p, size_t c);
 
 struct rkvr_iio_hw_device {
        struct device *dev;