mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
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:
parent
0820dd9f51
commit
212234f7bf
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user