iio: imu: st_lsm6dsx: make event_settings more generic

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>
This commit is contained in:
Francesco Lavra 2025-12-01 11:00:11 +01:00 committed by Jonathan Cameron
parent 0820dd9f51
commit 212234f7bf
2 changed files with 106 additions and 60 deletions

View 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 {

View 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)