]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: imu: st_lsm6dsx: make event_settings more generic
authorFrancesco Lavra <flavra@baylibre.com>
Mon, 1 Dec 2025 10:00:11 +0000 (11:00 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 21 Dec 2025 11:10:26 +0000 (11:10 +0000)
The st_lsm6dsx_event_settings structure contains fields specific for one
event type (wakeup). In preparation for adding support for more event
types, introduce an event id enum and a generic event source structure, and
replace wakeup-specific data in struct st_lsm6dsx_event_settings with an
array of event source structures.

Signed-off-by: Francesco Lavra <flavra@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c

index 6405a5367d76add04ea364893b24f454c33efa18..bd2f25cebdf846bd7263705eba3ed2773403c03b 100644 (file)
@@ -260,14 +260,22 @@ struct st_lsm6dsx_shub_settings {
        u8 pause;
 };
 
+enum st_lsm6dsx_event_id {
+       ST_LSM6DSX_EVENT_WAKEUP,
+       ST_LSM6DSX_EVENT_MAX
+};
+
+struct st_lsm6dsx_event_src {
+       struct st_lsm6dsx_reg value;
+       struct st_lsm6dsx_reg status;
+       u8 status_x_mask;
+       u8 status_y_mask;
+       u8 status_z_mask;
+};
+
 struct st_lsm6dsx_event_settings {
        struct st_lsm6dsx_reg enable_reg;
-       struct st_lsm6dsx_reg wakeup_reg;
-       u8 wakeup_src_reg;
-       u8 wakeup_src_status_mask;
-       u8 wakeup_src_z_mask;
-       u8 wakeup_src_y_mask;
-       u8 wakeup_src_x_mask;
+       struct st_lsm6dsx_event_src sources[ST_LSM6DSX_EVENT_MAX];
 };
 
 enum st_lsm6dsx_sensor_id {
index 49ac17806e720dc9d80e34f979284854c419ffa4..1dc3d4b41b0b982ed0602d0421cc3099c0e66b84 100644 (file)
@@ -379,15 +379,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                        },
                },
                .event_settings = {
-                       .wakeup_reg = {
-                               .addr = 0x5B,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x1b,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x1b,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -545,15 +551,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                        },
                },
                .event_settings = {
-                       .wakeup_reg = {
-                               .addr = 0x5B,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x1b,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x1b,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -782,15 +794,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .addr = 0x58,
                                .mask = BIT(7),
                        },
-                       .wakeup_reg = {
-                               .addr = 0x5B,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x1b,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x1b,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -1021,15 +1039,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .addr = 0x58,
                                .mask = BIT(7),
                        },
-                       .wakeup_reg = {
-                               .addr = 0x5b,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x1b,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x1b,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -1204,15 +1228,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .addr = 0x58,
                                .mask = BIT(7),
                        },
-                       .wakeup_reg = {
-                               .addr = 0x5B,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x1b,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x1b,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -1412,15 +1442,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
                                .addr = 0x50,
                                .mask = BIT(7),
                        },
-                       .wakeup_reg = {
-                               .addr = 0x5b,
-                               .mask = GENMASK(5, 0),
+                       .sources = {
+                               [ST_LSM6DSX_EVENT_WAKEUP] = {
+                                       .value = {
+                                               .addr = 0x5b,
+                                               .mask = GENMASK(5, 0),
+                                       },
+                                       .status = {
+                                               .addr = 0x45,
+                                               .mask = BIT(3),
+                                       },
+                                       .status_z_mask = BIT(0),
+                                       .status_y_mask = BIT(1),
+                                       .status_x_mask = BIT(2),
+                               },
                        },
-                       .wakeup_src_reg = 0x45,
-                       .wakeup_src_status_mask = BIT(3),
-                       .wakeup_src_z_mask = BIT(0),
-                       .wakeup_src_y_mask = BIT(1),
-                       .wakeup_src_x_mask = BIT(2),
                },
        },
        {
@@ -1932,7 +1968,7 @@ st_lsm6dsx_write_event(struct iio_dev *iio_dev,
        if (val < 0 || val > 31)
                return -EINVAL;
 
-       reg = &hw->settings->event_settings.wakeup_reg;
+       reg = &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].value;
        data = ST_LSM6DSX_SHIFT_VAL(val, reg->mask);
        err = st_lsm6dsx_update_bits_locked(hw, reg->addr,
                                            reg->mask, data);
@@ -2410,6 +2446,7 @@ static bool
 st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw)
 {
        const struct st_lsm6dsx_event_settings *event_settings;
+       const struct st_lsm6dsx_event_src *src;
        int err, data;
        s64 timestamp;
 
@@ -2417,13 +2454,14 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw)
                return false;
 
        event_settings = &hw->settings->event_settings;
-       err = st_lsm6dsx_read_locked(hw, event_settings->wakeup_src_reg,
+       src = &event_settings->sources[ST_LSM6DSX_EVENT_WAKEUP];
+       err = st_lsm6dsx_read_locked(hw, src->status.addr,
                                     &data, sizeof(data));
        if (err < 0)
                return false;
 
        timestamp = iio_get_time_ns(hw->iio_devs[ST_LSM6DSX_ID_ACC]);
-       if ((data & hw->settings->event_settings.wakeup_src_z_mask) &&
+       if ((data & src->status_z_mask) &&
            (hw->enable_event & BIT(IIO_MOD_Z)))
                iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC],
                               IIO_MOD_EVENT_CODE(IIO_ACCEL,
@@ -2433,7 +2471,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw)
                                                  IIO_EV_DIR_EITHER),
                                                  timestamp);
 
-       if ((data & hw->settings->event_settings.wakeup_src_y_mask) &&
+       if ((data & src->status_y_mask) &&
            (hw->enable_event & BIT(IIO_MOD_Y)))
                iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC],
                               IIO_MOD_EVENT_CODE(IIO_ACCEL,
@@ -2443,7 +2481,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw)
                                                  IIO_EV_DIR_EITHER),
                                                  timestamp);
 
-       if ((data & hw->settings->event_settings.wakeup_src_x_mask) &&
+       if ((data & src->status_x_mask) &&
            (hw->enable_event & BIT(IIO_MOD_X)))
                iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC],
                               IIO_MOD_EVENT_CODE(IIO_ACCEL,
@@ -2453,7 +2491,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw)
                                                  IIO_EV_DIR_EITHER),
                                                  timestamp);
 
-       return data & event_settings->wakeup_src_status_mask;
+       return data & src->status.mask;
 }
 
 static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private)