iio: imu: inv_mpu6050: add WoM event as accel event
authorJean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Mon, 11 Mar 2024 16:05:55 +0000 (16:05 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 25 Mar 2024 20:10:13 +0000 (20:10 +0000)
Add WoM (roc rising) event as accel x_or_y_or_z event for all chips >=
MPU-6500. This requires to create new MPU-6500 channels as default and
MPU-6050 channels for older chips.

Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Link: https://lore.kernel.org/r/20240311160557.437337-3-inv.git-commit@tdk.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c

index 46607d404e591161bdb622a4266d8b28030beaba..eb341b87c8f3b29361d69ed8edd30a50a706dc74 100644 (file)
@@ -1348,6 +1348,15 @@ static const struct iio_chan_spec_ext_info inv_ext_info[] = {
        { }
 };
 
+static const struct iio_event_spec inv_wom_events[] = {
+       {
+               .type = IIO_EV_TYPE_ROC,
+               .dir = IIO_EV_DIR_RISING,
+               .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
+                                BIT(IIO_EV_INFO_VALUE),
+       },
+};
+
 #define INV_MPU6050_CHAN(_type, _channel2, _index)                    \
        {                                                             \
                .type = _type,                                        \
@@ -1383,7 +1392,17 @@ static const struct iio_chan_spec_ext_info inv_ext_info[] = {
                },                                              \
        }
 
-static const struct iio_chan_spec inv_mpu_channels[] = {
+#define INV_MPU6050_EVENT_CHAN(_type, _channel2, _events, _events_nb)  \
+{                                                                      \
+       .type = _type,                                                  \
+       .modified = 1,                                                  \
+       .channel2 = _channel2,                                          \
+       .event_spec = _events,                                          \
+       .num_event_specs = _events_nb,                                  \
+       .scan_index = -1,                                               \
+}
+
+static const struct iio_chan_spec inv_mpu6050_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(INV_MPU6050_SCAN_TIMESTAMP),
 
        INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
@@ -1397,6 +1416,23 @@ static const struct iio_chan_spec inv_mpu_channels[] = {
        INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
 };
 
+static const struct iio_chan_spec inv_mpu6500_channels[] = {
+       IIO_CHAN_SOFT_TIMESTAMP(INV_MPU6050_SCAN_TIMESTAMP),
+
+       INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
+
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
+
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_MPU6050_SCAN_ACCL_X),
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_MPU6050_SCAN_ACCL_Y),
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
+
+       INV_MPU6050_EVENT_CHAN(IIO_ACCEL, IIO_MOD_X_OR_Y_OR_Z,
+                              inv_wom_events, ARRAY_SIZE(inv_wom_events)),
+};
+
 #define INV_MPU6050_SCAN_MASK_3AXIS_ACCEL      \
        (BIT(INV_MPU6050_SCAN_ACCL_X)           \
        | BIT(INV_MPU6050_SCAN_ACCL_Y)          \
@@ -1876,6 +1912,12 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
                return result;
 
        switch (chip_type) {
+       case INV_MPU6000:
+       case INV_MPU6050:
+               indio_dev->channels = inv_mpu6050_channels;
+               indio_dev->num_channels = ARRAY_SIZE(inv_mpu6050_channels);
+               indio_dev->available_scan_masks = inv_mpu_scan_masks;
+               break;
        case INV_MPU9150:
                indio_dev->channels = inv_mpu9150_channels;
                indio_dev->num_channels = ARRAY_SIZE(inv_mpu9150_channels);
@@ -1889,13 +1931,13 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
                break;
        case INV_ICM20600:
        case INV_ICM20602:
-               indio_dev->channels = inv_mpu_channels;
-               indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
+               indio_dev->channels = inv_mpu6500_channels;
+               indio_dev->num_channels = ARRAY_SIZE(inv_mpu6500_channels);
                indio_dev->available_scan_masks = inv_icm20602_scan_masks;
                break;
        default:
-               indio_dev->channels = inv_mpu_channels;
-               indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
+               indio_dev->channels = inv_mpu6500_channels;
+               indio_dev->num_channels = ARRAY_SIZE(inv_mpu6500_channels);
                indio_dev->available_scan_masks = inv_mpu_scan_masks;
                break;
        }
@@ -1904,9 +1946,18 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
         * auxiliary device in use. Otherwise Going back to 6-axis only.
         */
        if (st->magn_disabled) {
-               indio_dev->channels = inv_mpu_channels;
-               indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
-               indio_dev->available_scan_masks = inv_mpu_scan_masks;
+               switch (chip_type) {
+               case INV_MPU9150:
+                       indio_dev->channels = inv_mpu6050_channels;
+                       indio_dev->num_channels = ARRAY_SIZE(inv_mpu6050_channels);
+                       indio_dev->available_scan_masks = inv_mpu_scan_masks;
+                       break;
+               default:
+                       indio_dev->channels = inv_mpu6500_channels;
+                       indio_dev->num_channels = ARRAY_SIZE(inv_mpu6500_channels);
+                       indio_dev->available_scan_masks = inv_mpu_scan_masks;
+                       break;
+               }
        }
 
        indio_dev->info = &mpu_info;