Link activity and inactivity to indicate the internal power-saving state. Add auto-sleep to be linked to inactivity. Signed-off-by: Lothar Rubusch <l.rubusch@xxxxxxxxx> --- drivers/iio/accel/adxl313.h | 3 +++ drivers/iio/accel/adxl313_core.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index 1398ac54d19b..eafdf8f57816 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -41,6 +41,9 @@ #define ADXL313_RATE_BASE 6 #define ADXL313_POWER_CTL_MSK BIT(3) +#define ADXL313_POWER_CTL_INACT_MSK GENMASK(5, 4) +#define ADXL313_POWER_CTL_LINK BIT(5) +#define ADXL313_POWER_CTL_AUTO_SLEEP BIT(4) #define ADXL313_MEASUREMENT_MODE BIT(3) #define ADXL313_MEASUREMENT_STANDBY 0x00 diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_core.c index 7356aacd8874..2b24e6b01f1f 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -390,6 +390,7 @@ static int adxl313_set_act_inact_en(struct adxl313_data *data, unsigned int axis_ctrl; unsigned int threshold; unsigned int inact_time_s; + int act_en, inact_en; bool en; int ret; @@ -418,9 +419,31 @@ static int adxl313_set_act_inact_en(struct adxl313_data *data, en = en && inact_time_s; } - return regmap_update_bits(data->regmap, ADXL313_REG_INT_ENABLE, - adxl313_act_int_reg[type], - en ? adxl313_act_int_reg[type] : 0); + ret = regmap_update_bits(data->regmap, ADXL313_REG_INT_ENABLE, + adxl313_act_int_reg[type], + en ? adxl313_act_int_reg[type] : 0); + if (ret) + return ret; + + /* + * Advanced power saving: Set sleep and link bit only when ACT and INACT + * are set. Check enable against regmap cached values. + */ + act_en = adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); + if (act_en < 0) + return act_en; + + inact_en = adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); + if (inact_en < 0) + return inact_en; + + en = en && act_en && inact_en; + + return regmap_update_bits(data->regmap, + ADXL313_REG_POWER_CTL, + ADXL313_POWER_CTL_INACT_MSK, + en ? + (ADXL313_POWER_CTL_AUTO_SLEEP | ADXL313_POWER_CTL_LINK) : 0); } static int adxl313_read_raw(struct iio_dev *indio_dev, -- 2.39.5