Motion detection functionalities (such as activity and inactivity
detection) are only available when the chip is in a low-power mode; this
affects the available sampling frequency values.
In preparation for adding support for a new frequency value, introduce a
helper function that checks whether activity/inactivity detection is
currently enabled; this function will be reused in a future commit to
determine what frequency values are available at any given time.
No functional changes.
Signed-off-by: Francesco Lavra <flavra@baylibre.com>
---
drivers/iio/accel/adxl380.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/iio/accel/adxl380.c b/drivers/iio/accel/adxl380.c
index bbf1f88ca781..b99458a5eae3 100644
--- a/drivers/iio/accel/adxl380.c
+++ b/drivers/iio/accel/adxl380.c
@@ -232,14 +232,33 @@ bool adxl380_readable_noinc_reg(struct device *dev, unsigned int reg)
}
EXPORT_SYMBOL_NS_GPL(adxl380_readable_noinc_reg, "IIO_ADXL380");
+static int adxl380_act_inact_enabled(struct adxl380_state *st, bool *enabled)
+{
+ unsigned int act_inact_ctl;
+ int ret;
+
+ if (!st->chip_info->has_low_power) {
+ *enabled = false;
+ return 0;
+ }
+
+ ret = regmap_read(st->regmap, ADXL380_ACT_INACT_CTL_REG, &act_inact_ctl);
+ if (!ret)
+ *enabled = FIELD_GET(ADXL380_ACT_EN_MSK, act_inact_ctl) ||
+ FIELD_GET(ADXL380_INACT_EN_MSK, act_inact_ctl);
+
+ return ret;
+}
+
static int adxl380_set_measure_en(struct adxl380_state *st, bool en)
{
int ret;
- unsigned int act_inact_ctl;
u8 op_mode = ADXL380_OP_MODE_STANDBY;
if (en) {
- ret = regmap_read(st->regmap, ADXL380_ACT_INACT_CTL_REG, &act_inact_ctl);
+ bool act_inact_enabled;
+
+ ret = adxl380_act_inact_enabled(st, &act_inact_enabled);
if (ret)
return ret;
@@ -248,9 +267,7 @@ static int adxl380_set_measure_en(struct adxl380_state *st, bool en)
* mode and for devices that support low power modes. Otherwise
* go straight to measure mode (same bits as ADXL380_OP_MODE_HP).
*/
- if (st->chip_info->has_low_power &&
- (FIELD_GET(ADXL380_ACT_EN_MSK, act_inact_ctl) ||
- FIELD_GET(ADXL380_INACT_EN_MSK, act_inact_ctl)))
+ if (act_inact_enabled)
op_mode = ADXL380_OP_MODE_VLP;
else
op_mode = ADXL380_OP_MODE_HP;
--
2.39.5
On Thu, Jan 15, 2026 at 06:53:49PM +0100, Francesco Lavra wrote:
> Motion detection functionalities (such as activity and inactivity
> detection) are only available when the chip is in a low-power mode; this
> affects the available sampling frequency values.
> In preparation for adding support for a new frequency value, introduce a
> helper function that checks whether activity/inactivity detection is
> currently enabled; this function will be reused in a future commit to
> determine what frequency values are available at any given time.
> No functional changes.
...
> +static int adxl380_act_inact_enabled(struct adxl380_state *st, bool *enabled)
> +{
> + unsigned int act_inact_ctl;
> + int ret;
> +
> + if (!st->chip_info->has_low_power) {
> + *enabled = false;
> + return 0;
> + }
> +
> + ret = regmap_read(st->regmap, ADXL380_ACT_INACT_CTL_REG, &act_inact_ctl);
> + if (!ret)
What's wrong with the standard pattern?
if (ret)
return ret;
> + *enabled = FIELD_GET(ADXL380_ACT_EN_MSK, act_inact_ctl) ||
> + FIELD_GET(ADXL380_INACT_EN_MSK, act_inact_ctl);
> +
> + return ret;
return 0;
> +}
--
With Best Regards,
Andy Shevchenko
On Thu, 15 Jan 2026 22:28:05 +0200
Andy Shevchenko <andriy.shevchenko@intel.com> wrote:
> On Thu, Jan 15, 2026 at 06:53:49PM +0100, Francesco Lavra wrote:
> > Motion detection functionalities (such as activity and inactivity
> > detection) are only available when the chip is in a low-power mode; this
> > affects the available sampling frequency values.
> > In preparation for adding support for a new frequency value, introduce a
> > helper function that checks whether activity/inactivity detection is
> > currently enabled; this function will be reused in a future commit to
> > determine what frequency values are available at any given time.
> > No functional changes.
>
> ...
>
> > +static int adxl380_act_inact_enabled(struct adxl380_state *st, bool *enabled)
> > +{
> > + unsigned int act_inact_ctl;
> > + int ret;
> > +
> > + if (!st->chip_info->has_low_power) {
> > + *enabled = false;
> > + return 0;
> > + }
> > +
> > + ret = regmap_read(st->regmap, ADXL380_ACT_INACT_CTL_REG, &act_inact_ctl);
>
> > + if (!ret)
>
> What's wrong with the standard pattern?
>
> if (ret)
> return ret;
>
> > + *enabled = FIELD_GET(ADXL380_ACT_EN_MSK, act_inact_ctl) ||
> > + FIELD_GET(ADXL380_INACT_EN_MSK, act_inact_ctl);
> > +
> > + return ret;
>
> return 0;
>
Fully agreed. Whilst it's a tiny bit longer, it is a lot more consistent
to always handle errors out of line and good flow inline.
Jonathan
> > +}
>
>
© 2016 - 2026 Red Hat, Inc.