summaryrefslogtreecommitdiff
path: root/drivers/hid/hid-gearvr.c
diff options
context:
space:
mode:
authorAndi Shyti <andi.shyti@samsung.com>2017-02-17 17:32:04 +0900
committerAndi Shyti <andi.shyti@samsung.com>2017-02-17 17:57:36 +0900
commit119844a75ed99e43cd9d0a87f7dfdf4dc438a50f (patch)
tree803ab6f7bcde98027a4facb348493324dab52836 /drivers/hid/hid-gearvr.c
parent8c7f0c0b101e9b9faf206c67cee29f6ec3755f8b (diff)
HID: gearvr: add support for Samsung Gear VRnext/vr-20170117
The Gear VR is a connected through USB to mobile phones and generates a hidraw device as interface to userspace. Change-Id: Ib7814fa6f86a034d5ab6fd59120efb8c2392f9bd Signed-off-by: Andi Shyti <andi.shyti@samsung.com>
Diffstat (limited to 'drivers/hid/hid-gearvr.c')
-rw-r--r--drivers/hid/hid-gearvr.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/drivers/hid/hid-gearvr.c b/drivers/hid/hid-gearvr.c
new file mode 100644
index 000000000000..09e6459b0c4f
--- /dev/null
+++ b/drivers/hid/hid-gearvr.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Author: Andi Shyti <andi.shyti@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Samsung Gear VR device driver
+ */
+
+#include <linux/hidraw.h>
+#include <linux/module.h>
+
+#include "hid-ids.h"
+
+static int gearvr_probe(struct hid_device *hdev, const struct hid_device_id *id)
+{
+ int err;
+
+ err = hid_parse(hdev);
+ if (err)
+ return err;
+
+ err = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+ if (err)
+ return err;
+
+ err = hid_hw_power(hdev, PM_HINT_FULLON);
+ if (err < 0)
+ goto fail_dev_stop;
+
+ err = hid_hw_open(hdev);
+ if (err < 0)
+ goto fail_power_off;
+
+ return 0;
+
+fail_power_off:
+ hid_hw_power(hdev, PM_HINT_NORMAL);
+fail_dev_stop:
+ hid_hw_stop(hdev);
+
+ return err;
+}
+
+static void gearvr_remove(struct hid_device *hdev)
+{
+ hid_hw_close(hdev);
+ hid_hw_power(hdev, PM_HINT_NORMAL);
+ hid_hw_stop(hdev);
+}
+
+static const struct hid_device_id gearvr_devices[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_GEARVR_R320) },
+ { }
+};
+
+MODULE_DEVICE_TABLE(hid, gearvr_devices);
+
+static struct hid_driver gearvr_driver = {
+ .name = "gearvr",
+ .id_table = gearvr_devices,
+ .probe = gearvr_probe,
+ .remove = gearvr_remove,
+};
+
+module_hid_driver(gearvr_driver);
+
+MODULE_AUTHOR("Andi Shyti <andi.shyti@samsung.com>");
+MODULE_DESCRIPTION("Samsung Gear VR device driver");
+MODULE_LICENSE("GPL v2");