iio: hid-sensor-rotation: Add relative orientation sensor hid support
authorSong Hongyan <hongyan.song@intel.com>
Sun, 7 May 2017 10:24:24 +0000 (18:24 +0800)
committerJonathan Cameron <jic23@kernel.org>
Sun, 7 May 2017 11:22:27 +0000 (12:22 +0100)
Relative orientation(AG) sensor is a 6dof orientation sensor,
it depends on acceleration and gyroscope sensor data. It gives
a quaternion describing the orientation of the device relative
to an initial orientation. It is a standard HID sensor.

More information can be found in:
http://www.usb.org/developers/hidpage/HUTRR59_-_Usages_for_Wearables.pdf

Relative orientation(AG) sensor and dev rotation sensor have same
channels and share channel usage id. So the most of the code for
relative orientation sensor can be reused.

Signed-off-by: Song Hongyan <hongyan.song@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Reviewed-by: Xu Even <even.xu@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/orientation/hid-sensor-rotation.c
include/linux/hid-sensor-ids.h

index a97e802ca523138227e9930a585357fd2f873e94..4d953c26325f5f2a20503c6dc51f9916afef6163 100644 (file)
@@ -218,7 +218,7 @@ static int dev_rot_parse_report(struct platform_device *pdev,
 static int hid_dev_rot_probe(struct platform_device *pdev)
 {
        int ret;
-       static char *name = "dev_rotation";
+       static char *name;
        struct iio_dev *indio_dev;
        struct dev_rot_state *rot_state;
        struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
@@ -234,8 +234,18 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
        rot_state->common_attributes.hsdev = hsdev;
        rot_state->common_attributes.pdev = pdev;
 
-       ret = hid_sensor_parse_common_attributes(hsdev,
-                               HID_USAGE_SENSOR_DEVICE_ORIENTATION,
+       switch (hsdev->usage) {
+       case HID_USAGE_SENSOR_DEVICE_ORIENTATION:
+               name = "dev_rotation";
+               break;
+       case HID_USAGE_SENSOR_RELATIVE_ORIENTATION:
+               name = "relative_orientation";
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage,
                                &rot_state->common_attributes);
        if (ret) {
                dev_err(&pdev->dev, "failed to setup common attributes\n");
@@ -252,8 +262,7 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
 
        ret = dev_rot_parse_report(pdev, hsdev,
                                   (struct iio_chan_spec *)indio_dev->channels,
-                                  HID_USAGE_SENSOR_DEVICE_ORIENTATION,
-                                  rot_state);
+                                       hsdev->usage, rot_state);
        if (ret) {
                dev_err(&pdev->dev, "failed to setup attributes\n");
                return ret;
@@ -288,8 +297,7 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
        rot_state->callbacks.send_event = dev_rot_proc_event;
        rot_state->callbacks.capture_sample = dev_rot_capture_sample;
        rot_state->callbacks.pdev = pdev;
-       ret = sensor_hub_register_callback(hsdev,
-                                       HID_USAGE_SENSOR_DEVICE_ORIENTATION,
+       ret = sensor_hub_register_callback(hsdev, hsdev->usage,
                                        &rot_state->callbacks);
        if (ret) {
                dev_err(&pdev->dev, "callback reg failed\n");
@@ -314,7 +322,7 @@ static int hid_dev_rot_remove(struct platform_device *pdev)
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
        struct dev_rot_state *rot_state = iio_priv(indio_dev);
 
-       sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_DEVICE_ORIENTATION);
+       sensor_hub_remove_callback(hsdev, hsdev->usage);
        iio_device_unregister(indio_dev);
        hid_sensor_remove_trigger(&rot_state->common_attributes);
        iio_triggered_buffer_cleanup(indio_dev);
@@ -327,6 +335,10 @@ static const struct platform_device_id hid_dev_rot_ids[] = {
                /* Format: HID-SENSOR-usage_id_in_hex_lowercase */
                .name = "HID-SENSOR-20008a",
        },
+       {
+               /* Relative orientation(AG) sensor */
+               .name = "HID-SENSOR-20008e",
+       },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(platform, hid_dev_rot_ids);
index 761f86242473609ed94cee70672e9e639e32e818..b5469e878e99afacd74c64761531aa7f6cd42782 100644 (file)
@@ -90,6 +90,7 @@
 #define HID_USAGE_SENSOR_ORIENT_TILT_Z                         0x200481
 
 #define HID_USAGE_SENSOR_DEVICE_ORIENTATION                    0x20008A
+#define HID_USAGE_SENSOR_RELATIVE_ORIENTATION                  0x20008E
 #define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX                        0x200482
 #define HID_USAGE_SENSOR_ORIENT_QUATERNION                     0x200483
 #define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX                      0x200484