mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-17 22:06:41 +07:00
iio: imu: st_lsm6dsx: do not power-off accel if events are enabled
Do not power-off accel unconditionally if wake-up events are enabled
powering off the hw FIFO. At the same time do not power-off the accel
sensor if it is 'batched' in the hw FIFO disabling sensor events
Fixes: b5969abfa8
("iio: imu: st_lsm6dsx: add motion events")
Tested-by: Sean Nyekjaer <sean@geanix.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
c2686eb2ae
commit
bd41c445b7
@ -1447,8 +1447,9 @@ st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor *sensor, u32 req_odr)
|
||||
return st_lsm6dsx_update_bits_locked(hw, reg->addr, reg->mask, data);
|
||||
}
|
||||
|
||||
int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor,
|
||||
bool enable)
|
||||
static int
|
||||
__st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor,
|
||||
bool enable)
|
||||
{
|
||||
struct st_lsm6dsx_hw *hw = sensor->hw;
|
||||
u32 odr = enable ? sensor->odr : 0;
|
||||
@ -1466,6 +1467,26 @@ int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
st_lsm6dsx_check_events(struct st_lsm6dsx_sensor *sensor, bool enable)
|
||||
{
|
||||
struct st_lsm6dsx_hw *hw = sensor->hw;
|
||||
|
||||
if (sensor->id == ST_LSM6DSX_ID_GYRO || enable)
|
||||
return 0;
|
||||
|
||||
return hw->enable_event;
|
||||
}
|
||||
|
||||
int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor,
|
||||
bool enable)
|
||||
{
|
||||
if (st_lsm6dsx_check_events(sensor, enable))
|
||||
return 0;
|
||||
|
||||
return __st_lsm6dsx_sensor_set_enable(sensor, enable);
|
||||
}
|
||||
|
||||
static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx_sensor *sensor,
|
||||
u8 addr, int *val)
|
||||
{
|
||||
@ -1661,7 +1682,7 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_dev,
|
||||
struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
|
||||
struct st_lsm6dsx_hw *hw = sensor->hw;
|
||||
u8 enable_event;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
if (type != IIO_EV_TYPE_THRESH)
|
||||
return -EINVAL;
|
||||
@ -1689,7 +1710,8 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_dev,
|
||||
return err;
|
||||
|
||||
mutex_lock(&hw->conf_lock);
|
||||
err = st_lsm6dsx_sensor_set_enable(sensor, state);
|
||||
if (enable_event || !(hw->fifo_mask & BIT(sensor->id)))
|
||||
err = __st_lsm6dsx_sensor_set_enable(sensor, state);
|
||||
mutex_unlock(&hw->conf_lock);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user