From: Lothar Rubusch <l.rubusch@gmail.com>
To: lars@metafoo.de, Michael.Hennerich@analog.com, jic23@kernel.org
Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
eraretuya@gmail.com, l.rubusch@gmail.com
Subject: [PATCH v2 13/14] iio: accel: adxl345: add coupling detection for activity/inactivity
Date: Mon, 10 Feb 2025 11:01:18 +0000 [thread overview]
Message-ID: <20250210110119.260858-14-l.rubusch@gmail.com> (raw)
In-Reply-To: <20250210110119.260858-1-l.rubusch@gmail.com>
Add coupling activity/inactivity detection by the AC/DC bit. This is an
addititional enhancement for the detection of activity states and
completes the activity / inactivity feature of the ADXL345.
Signed-off-by: Lothar Rubusch <l.rubusch@gmail.com>
---
drivers/iio/accel/adxl345_core.c | 77 ++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c
index 7de869fac799..411ae7bf6b97 100644
--- a/drivers/iio/accel/adxl345_core.c
+++ b/drivers/iio/accel/adxl345_core.c
@@ -36,7 +36,9 @@
#define ADXL345_REG_TAP_AXIS_MSK GENMASK(2, 0)
#define ADXL345_REG_TAP_SUPPRESS_MSK BIT(3)
#define ADXL345_REG_ACT_AXIS_MSK GENMASK(6, 4)
+#define ADXL345_REG_ACT_ACDC_MSK BIT(7)
#define ADXL345_REG_INACT_AXIS_MSK GENMASK(2, 0)
+#define ADXL345_REG_INACT_ACDC_MSK BIT(3)
#define ADXL345_POWER_CTL_INACT_MSK (ADXL345_POWER_CTL_AUTO_SLEEP | ADXL345_POWER_CTL_LINK)
enum adxl345_axis {
@@ -86,6 +88,11 @@ static const unsigned int adxl345_act_thresh_reg[2] = {
[ADXL345_INACTIVITY] = ADXL345_REG_THRESH_INACT,
};
+static const unsigned int adxl345_act_acdc_msk[2] = {
+ [ADXL345_ACTIVITY] = ADXL345_REG_ACT_ACDC_MSK,
+ [ADXL345_INACTIVITY] = ADXL345_REG_INACT_ACDC_MSK,
+};
+
static const unsigned int adxl345_act_axis_msk[2] = {
[ADXL345_ACTIVITY] = ADXL345_REG_ACT_AXIS_MSK,
[ADXL345_INACTIVITY] = ADXL345_REG_INACT_AXIS_MSK,
@@ -178,9 +185,11 @@ struct adxl345_state {
enum adxl345_range range;
u32 act_axis_ctrl;
+ bool act_ac;
u8 act_threshold;
u32 inact_axis_ctrl;
+ bool inact_ac;
u8 inact_threshold;
u8 inact_time_s;
@@ -237,6 +246,18 @@ static struct iio_event_spec adxl345_events[] = {
BIT(IIO_EV_INFO_VALUE) |
BIT(IIO_EV_INFO_PERIOD),
},
+ {
+ /* activity, activity - ac bit */
+ .type = IIO_EV_TYPE_MAG_REFERENCED,
+ .dir = IIO_EV_DIR_RISING,
+ .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE),
+ },
+ {
+ /* activity, inactivity - ac bit */
+ .type = IIO_EV_TYPE_MAG_REFERENCED,
+ .dir = IIO_EV_DIR_FALLING,
+ .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE),
+ },
};
#define ADXL345_CHANNEL(index, reg, axis) { \
@@ -334,6 +355,35 @@ static int adxl345_write_act_axis(struct adxl345_state *st,
return 0;
}
+static int adxl345_is_act_inact_ac(struct adxl345_state *st,
+ enum adxl345_activity_type type, bool *ac)
+{
+ if (type == ADXL345_ACTIVITY)
+ *ac = st->act_ac;
+ else
+ *ac = st->inact_ac;
+
+ return 0;
+}
+
+static int adxl345_set_act_inact_ac(struct adxl345_state *st,
+ enum adxl345_activity_type type, bool ac)
+{
+ int ret;
+
+ ret = regmap_update_bits(st->regmap, ADXL345_REG_ACT_INACT_CTRL,
+ adxl345_act_acdc_msk[type], ac);
+ if (ret)
+ return ret;
+
+ if (type == ADXL345_ACTIVITY)
+ st->act_ac = ac;
+ else
+ st->inact_ac = ac;
+
+ return 0;
+}
+
static int adxl345_is_act_inact_en(struct adxl345_state *st,
enum adxl345_activity_type type, bool *en)
{
@@ -959,6 +1009,21 @@ static int adxl345_read_event_config(struct iio_dev *indio_dev,
if (ret)
return ret;
return int_en;
+ case IIO_EV_TYPE_MAG_REFERENCED:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ ret = adxl345_is_act_inact_ac(st, ADXL345_ACTIVITY, &int_en);
+ if (ret)
+ return ret;
+ return int_en;
+ case IIO_EV_DIR_FALLING:
+ ret = adxl345_is_act_inact_ac(st, ADXL345_INACTIVITY, &int_en);
+ if (ret)
+ return ret;
+ return int_en;
+ default:
+ return -EINVAL;
+ }
default:
return -EINVAL;
}
@@ -1008,6 +1073,16 @@ static int adxl345_write_event_config(struct iio_dev *indio_dev,
}
case IIO_EV_TYPE_MAG:
return adxl345_set_ff_en(st, state);
+ case IIO_EV_TYPE_MAG_REFERENCED:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ return adxl345_set_act_inact_ac(st, ADXL345_ACTIVITY, state);
+ case IIO_EV_DIR_FALLING:
+ return adxl345_set_act_inact_ac(st, ADXL345_INACTIVITY, state);
+ default:
+ return -EINVAL;
+ }
+
default:
return -EINVAL;
}
@@ -1619,6 +1694,8 @@ int adxl345_core_probe(struct device *dev, struct regmap *regmap,
*/
st->act_axis_ctrl = ADXL345_REG_ACT_AXIS_MSK;
st->inact_axis_ctrl = ADXL345_REG_INACT_AXIS_MSK;
+ st->inact_ac = 0; /* 0 [dc] */
+ st->act_ac = 0;
st->int_map = 0x00; /* reset interrupts */
/* Init with reasonable values */
--
2.39.5
next prev parent reply other threads:[~2025-02-10 11:01 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 11:01 [PATCH v2 00/14] iio: accel: adxl345: add interrupt based sensor events Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 01/14] iio: accel: adxl345: reorganize measurement enable Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 02/14] iio: accel: adxl345: add debug register access Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 03/14] iio: accel: adxl345: reorganize irq handler Lothar Rubusch
2025-02-16 17:05 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 04/14] iio: accel: adxl345: refac set_interrupts and IRQ map Lothar Rubusch
2025-02-16 17:11 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 05/14] iio: accel: adxl345: add single tap feature Lothar Rubusch
2025-02-16 17:20 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 06/14] iio: accel: adxl345: add double " Lothar Rubusch
2025-02-16 17:23 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 07/14] iio: accel: adxl345: add double tap suppress bit Lothar Rubusch
2025-02-16 17:28 ` Jonathan Cameron
2025-02-18 22:29 ` Lothar Rubusch
2025-02-20 17:47 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 08/14] iio: accel: adxl345: add freefall feature Lothar Rubusch
2025-02-16 17:33 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 09/14] iio: accel: adxl345: extend sample frequency adjustments Lothar Rubusch
2025-02-16 17:38 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 10/14] iio: accel: adxl345: add g-range configuration Lothar Rubusch
2025-02-16 17:41 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 11/14] iio: accel: adxl345: add activity event feature Lothar Rubusch
2025-02-16 17:43 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 12/14] iio: accel: adxl345: add inactivity feature Lothar Rubusch
2025-02-16 17:47 ` Jonathan Cameron
2025-02-10 11:01 ` Lothar Rubusch [this message]
2025-02-16 17:54 ` [PATCH v2 13/14] iio: accel: adxl345: add coupling detection for activity/inactivity Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 14/14] docs: iio: add documentation for adxl345 driver Lothar Rubusch
2025-02-16 18:00 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250210110119.260858-14-l.rubusch@gmail.com \
--to=l.rubusch@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=eraretuya@gmail.com \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox