iio: hid-sensor-magn-3d: Add support for rotation from north
authorReyad Attiyat <reyad.attiyat@gmail.com>
Thu, 17 Jul 2014 18:18:00 +0000 (19:18 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sun, 20 Jul 2014 12:39:35 +0000 (13:39 +0100)
Add the HID usage attribute ID's and IIO channel info for rotation
from north support.

Signed-off-by: Reyad Attiyat <reyad.attiyat@gmail.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/magnetometer/hid-sensor-magn-3d.c

index c0a659cc671544082c8eb5e84f1d0838ed1972e2..ad83cf293b15504d7c6c33a7916c10c0bc99ff42 100644 (file)
@@ -35,6 +35,10 @@ enum magn_3d_channel {
        CHANNEL_SCAN_INDEX_X,
        CHANNEL_SCAN_INDEX_Y,
        CHANNEL_SCAN_INDEX_Z,
+       CHANNEL_SCAN_INDEX_NORTH_MAGN_TILT_COMP,
+       CHANNEL_SCAN_INDEX_NORTH_TRUE_TILT_COMP,
+       CHANNEL_SCAN_INDEX_NORTH_MAGN,
+       CHANNEL_SCAN_INDEX_NORTH_TRUE,
        MAGN_3D_CHANNEL_MAX,
 };
 
@@ -57,7 +61,11 @@ struct magn_3d_state {
 static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = {
        HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_X_AXIS,
        HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Y_AXIS,
-       HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Z_AXIS
+       HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_Z_AXIS,
+       HID_USAGE_SENSOR_ORIENT_COMP_MAGN_NORTH,
+       HID_USAGE_SENSOR_ORIENT_COMP_TRUE_NORTH,
+       HID_USAGE_SENSOR_ORIENT_MAGN_NORTH,
+       HID_USAGE_SENSOR_ORIENT_TRUE_NORTH,
 };
 
 /* Channel definitions */
@@ -89,6 +97,42 @@ static const struct iio_chan_spec magn_3d_channels[] = {
                BIT(IIO_CHAN_INFO_SCALE) |
                BIT(IIO_CHAN_INFO_SAMP_FREQ) |
                BIT(IIO_CHAN_INFO_HYSTERESIS),
+       }, {
+               .type = IIO_ROT,
+               .modified = 1,
+               .channel2 = IIO_MOD_NORTH_MAGN_TILT_COMP,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
+               BIT(IIO_CHAN_INFO_SCALE) |
+               BIT(IIO_CHAN_INFO_SAMP_FREQ) |
+               BIT(IIO_CHAN_INFO_HYSTERESIS),
+       }, {
+               .type = IIO_ROT,
+               .modified = 1,
+               .channel2 = IIO_MOD_NORTH_TRUE_TILT_COMP,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
+               BIT(IIO_CHAN_INFO_SCALE) |
+               BIT(IIO_CHAN_INFO_SAMP_FREQ) |
+               BIT(IIO_CHAN_INFO_HYSTERESIS),
+       }, {
+               .type = IIO_ROT,
+               .modified = 1,
+               .channel2 = IIO_MOD_NORTH_MAGN,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
+               BIT(IIO_CHAN_INFO_SCALE) |
+               BIT(IIO_CHAN_INFO_SAMP_FREQ) |
+               BIT(IIO_CHAN_INFO_HYSTERESIS),
+       }, {
+               .type = IIO_ROT,
+               .modified = 1,
+               .channel2 = IIO_MOD_NORTH_TRUE,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
+               BIT(IIO_CHAN_INFO_SCALE) |
+               BIT(IIO_CHAN_INFO_SAMP_FREQ) |
+               BIT(IIO_CHAN_INFO_HYSTERESIS),
        }
 };
 
@@ -248,6 +292,13 @@ static int magn_3d_capture_sample(struct hid_sensor_hub_device *hsdev,
                offset = (usage_id - HID_USAGE_SENSOR_ORIENT_MAGN_FLUX_X_AXIS)
                                + CHANNEL_SCAN_INDEX_X;
        break;
+       case HID_USAGE_SENSOR_ORIENT_COMP_MAGN_NORTH:
+       case HID_USAGE_SENSOR_ORIENT_COMP_TRUE_NORTH:
+       case HID_USAGE_SENSOR_ORIENT_MAGN_NORTH:
+       case HID_USAGE_SENSOR_ORIENT_TRUE_NORTH:
+               offset = (usage_id - HID_USAGE_SENSOR_ORIENT_COMP_MAGN_NORTH)
+                               + CHANNEL_SCAN_INDEX_NORTH_MAGN_TILT_COMP;
+       break;
        default:
                return -EINVAL;
        }