* [PATCH v4 1/4] iio: accel: adxl372: introduce chip_info structure
2026-03-21 10:04 [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Antoniu Miclaus
@ 2026-03-21 10:04 ` Antoniu Miclaus
2026-03-21 11:13 ` Jonathan Cameron
2026-03-21 10:04 ` [PATCH v4 2/4] dt-bindings: iio: accel: adi,adxl372: add ADXL371 compatible Antoniu Miclaus
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Antoniu Miclaus @ 2026-03-21 10:04 UTC (permalink / raw)
To: Michael Hennerich, Marcelo Schmitt, Nuno Sá, Antoniu Miclaus,
Lars-Peter Clausen, Jonathan Cameron, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
Introduce a chip_info structure to parameterize device-specific
properties such as ODR/bandwidth frequency tables, activity/inactivity
timer scale factors, and the maximum ODR value. This refactors the
driver to use chip_info lookups instead of hardcoded values, preparing
the driver to support multiple device variants.
The sampling_frequency and filter_low_pass_3db_frequency available
attributes are switched from custom sysfs callbacks to read_avail()
based handling via info_mask_shared_by_type_available. This enforces
consistent formatting through the IIO framework and makes the values
accessible to in-kernel consumers.
The SPI/I2C probe functions are updated to pass a chip_info pointer
instead of a device name string.
No functional change intended.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
Changes in v4:
- Reformat info_mask_shared_by_type to use consistent multi-line
style matching info_mask_shared_by_type_available.
- Drop trailing comma from ADXL372_ODR_NUM enum terminator.
- Drop redundant NULL checks for chip_info in SPI/I2C probe
functions since match data is always provided.
drivers/iio/accel/adxl372.c | 151 ++++++++++++++++++--------------
drivers/iio/accel/adxl372.h | 16 +++-
drivers/iio/accel/adxl372_i2c.c | 10 ++-
drivers/iio/accel/adxl372_spi.c | 10 ++-
4 files changed, 112 insertions(+), 75 deletions(-)
diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c
index 28a8793a53b6..b34b91cae753 100644
--- a/drivers/iio/accel/adxl372.c
+++ b/drivers/iio/accel/adxl372.c
@@ -180,6 +180,7 @@ enum adxl372_odr {
ADXL372_ODR_1600HZ,
ADXL372_ODR_3200HZ,
ADXL372_ODR_6400HZ,
+ ADXL372_ODR_NUM
};
enum adxl372_bandwidth {
@@ -214,14 +215,35 @@ enum adxl372_fifo_mode {
ADXL372_FIFO_OLD_SAVED
};
-static const int adxl372_samp_freq_tbl[5] = {
- 400, 800, 1600, 3200, 6400,
+static const int adxl372_samp_freq_tbl[ADXL372_ODR_NUM] = {
+ [ADXL372_ODR_400HZ] = 400,
+ [ADXL372_ODR_800HZ] = 800,
+ [ADXL372_ODR_1600HZ] = 1600,
+ [ADXL372_ODR_3200HZ] = 3200,
+ [ADXL372_ODR_6400HZ] = 6400,
};
-static const int adxl372_bw_freq_tbl[5] = {
- 200, 400, 800, 1600, 3200,
+static const int adxl372_bw_freq_tbl[ADXL372_ODR_NUM] = {
+ [ADXL372_BW_200HZ] = 200,
+ [ADXL372_BW_400HZ] = 400,
+ [ADXL372_BW_800HZ] = 800,
+ [ADXL372_BW_1600HZ] = 1600,
+ [ADXL372_BW_3200HZ] = 3200,
};
+const struct adxl372_chip_info adxl372_chip_info = {
+ .name = "adxl372",
+ .samp_freq_tbl = adxl372_samp_freq_tbl,
+ .bw_freq_tbl = adxl372_bw_freq_tbl,
+ .num_freqs = ARRAY_SIZE(adxl372_samp_freq_tbl),
+ .act_time_scale_us = 3300,
+ .act_time_scale_low_us = 6600,
+ .inact_time_scale_ms = 13,
+ .inact_time_scale_low_ms = 26,
+ .max_odr = ADXL372_ODR_6400HZ,
+};
+EXPORT_SYMBOL_NS_GPL(adxl372_chip_info, "IIO_ADXL372");
+
struct adxl372_axis_lookup {
unsigned int bits;
enum adxl372_fifo_format fifo_format;
@@ -257,8 +279,12 @@ static const struct iio_event_spec adxl372_events[] = {
.modified = 1, \
.channel2 = IIO_MOD_##axis, \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
- BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
+ .info_mask_shared_by_type = \
+ BIT(IIO_CHAN_INFO_SCALE) | \
+ BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
+ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
+ .info_mask_shared_by_type_available = \
+ BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
.scan_index = index, \
.scan_type = { \
@@ -279,6 +305,7 @@ static const struct iio_chan_spec adxl372_channels[] = {
};
struct adxl372_state {
+ const struct adxl372_chip_info *chip_info;
int irq;
struct device *dev;
struct regmap *regmap;
@@ -471,13 +498,14 @@ static int adxl372_set_activity_time_ms(struct adxl372_state *st,
int ret;
/*
- * 3.3 ms per code is the scale factor of the TIME_ACT register for
- * ODR = 6400 Hz. It is 6.6 ms per code for ODR = 3200 Hz and below.
+ * The scale factor of the TIME_ACT register depends on the ODR.
+ * A higher scale factor is used at the maximum ODR and a lower
+ * one at all other rates.
*/
- if (st->odr == ADXL372_ODR_6400HZ)
- scale_factor = 3300;
+ if (st->odr == st->chip_info->max_odr)
+ scale_factor = st->chip_info->act_time_scale_us;
else
- scale_factor = 6600;
+ scale_factor = st->chip_info->act_time_scale_low_us;
reg_val = DIV_ROUND_CLOSEST(act_time_ms * 1000, scale_factor);
@@ -501,13 +529,14 @@ static int adxl372_set_inactivity_time_ms(struct adxl372_state *st,
int ret;
/*
- * 13 ms per code is the scale factor of the TIME_INACT register for
- * ODR = 6400 Hz. It is 26 ms per code for ODR = 3200 Hz and below.
+ * The scale factor of the TIME_INACT register depends on the ODR.
+ * A higher scale factor is used at the maximum ODR and a lower
+ * one at all other rates.
*/
- if (st->odr == ADXL372_ODR_6400HZ)
- scale_factor = 13;
+ if (st->odr == st->chip_info->max_odr)
+ scale_factor = st->chip_info->inact_time_scale_ms;
else
- scale_factor = 26;
+ scale_factor = st->chip_info->inact_time_scale_low_ms;
res = DIV_ROUND_CLOSEST(inact_time_ms, scale_factor);
reg_val_h = (res >> 8) & 0xFF;
@@ -717,7 +746,7 @@ static int adxl372_setup(struct adxl372_state *st)
if (ret < 0)
return ret;
- ret = adxl372_set_odr(st, ADXL372_ODR_6400HZ);
+ ret = adxl372_set_odr(st, st->chip_info->max_odr);
if (ret < 0)
return ret;
@@ -777,10 +806,10 @@ static int adxl372_read_raw(struct iio_dev *indio_dev,
*val2 = ADXL372_USCALE;
return IIO_VAL_INT_PLUS_MICRO;
case IIO_CHAN_INFO_SAMP_FREQ:
- *val = adxl372_samp_freq_tbl[st->odr];
+ *val = st->chip_info->samp_freq_tbl[st->odr];
return IIO_VAL_INT;
case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
- *val = adxl372_bw_freq_tbl[st->bw];
+ *val = st->chip_info->bw_freq_tbl[st->bw];
return IIO_VAL_INT;
}
@@ -796,23 +825,17 @@ static int adxl372_write_raw(struct iio_dev *indio_dev,
switch (info) {
case IIO_CHAN_INFO_SAMP_FREQ:
- odr_index = adxl372_find_closest_match(adxl372_samp_freq_tbl,
- ARRAY_SIZE(adxl372_samp_freq_tbl),
- val);
+ odr_index = adxl372_find_closest_match(st->chip_info->samp_freq_tbl,
+ st->chip_info->num_freqs,
+ val);
ret = adxl372_set_odr(st, odr_index);
if (ret < 0)
return ret;
- /*
- * The timer period depends on the ODR selected.
- * At 3200 Hz and below, it is 6.6 ms; at 6400 Hz, it is 3.3 ms
- */
+ /* Recalculate activity time as the timer period depends on ODR */
ret = adxl372_set_activity_time_ms(st, st->act_time_ms);
if (ret < 0)
return ret;
- /*
- * The timer period depends on the ODR selected.
- * At 3200 Hz and below, it is 26 ms; at 6400 Hz, it is 13 ms
- */
+ /* Recalculate inactivity time as the timer period depends on ODR */
ret = adxl372_set_inactivity_time_ms(st, st->inact_time_ms);
if (ret < 0)
return ret;
@@ -825,9 +848,9 @@ static int adxl372_write_raw(struct iio_dev *indio_dev,
return ret;
case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
- bw_index = adxl372_find_closest_match(adxl372_bw_freq_tbl,
- ARRAY_SIZE(adxl372_bw_freq_tbl),
- val);
+ bw_index = adxl372_find_closest_match(st->chip_info->bw_freq_tbl,
+ st->chip_info->num_freqs,
+ val);
return adxl372_set_bandwidth(st, bw_index);
default:
return -EINVAL;
@@ -957,24 +980,6 @@ static int adxl372_write_event_config(struct iio_dev *indio_dev, const struct ii
return adxl372_set_interrupts(st, st->int1_bitmask, 0);
}
-static ssize_t adxl372_show_filter_freq_avail(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct adxl372_state *st = iio_priv(indio_dev);
- int i;
- size_t len = 0;
-
- for (i = 0; i <= st->odr; i++)
- len += scnprintf(buf + len, PAGE_SIZE - len,
- "%d ", adxl372_bw_freq_tbl[i]);
-
- buf[len - 1] = '\n';
-
- return len;
-}
-
static ssize_t adxl372_get_fifo_enabled(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -1142,25 +1147,38 @@ static const struct iio_trigger_ops adxl372_peak_data_trigger_ops = {
.set_trigger_state = adxl372_peak_dready_trig_set_state,
};
-static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("400 800 1600 3200 6400");
-static IIO_DEVICE_ATTR(in_accel_filter_low_pass_3db_frequency_available,
- 0444, adxl372_show_filter_freq_avail, NULL, 0);
-
-static struct attribute *adxl372_attributes[] = {
- &iio_const_attr_sampling_frequency_available.dev_attr.attr,
- &iio_dev_attr_in_accel_filter_low_pass_3db_frequency_available.dev_attr.attr,
- NULL,
-};
+static int adxl372_read_avail(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ const int **vals, int *type, int *length,
+ long mask)
+{
+ struct adxl372_state *st = iio_priv(indio_dev);
-static const struct attribute_group adxl372_attrs_group = {
- .attrs = adxl372_attributes,
-};
+ switch (mask) {
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ *vals = st->chip_info->samp_freq_tbl;
+ *type = IIO_VAL_INT;
+ *length = st->chip_info->num_freqs;
+ return IIO_AVAIL_LIST;
+ case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
+ *vals = st->chip_info->bw_freq_tbl;
+ *type = IIO_VAL_INT;
+ /*
+ * Bandwidth cannot exceed half the sampling frequency
+ * (Nyquist), so limit available values based on current ODR.
+ */
+ *length = st->odr + 1;
+ return IIO_AVAIL_LIST;
+ default:
+ return -EINVAL;
+ }
+}
static const struct iio_info adxl372_info = {
.validate_trigger = &adxl372_validate_trigger,
- .attrs = &adxl372_attrs_group,
.read_raw = adxl372_read_raw,
.write_raw = adxl372_write_raw,
+ .read_avail = adxl372_read_avail,
.read_event_config = adxl372_read_event_config,
.write_event_config = adxl372_write_event_config,
.read_event_value = adxl372_read_event_value,
@@ -1176,7 +1194,7 @@ bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, "IIO_ADXL372");
int adxl372_probe(struct device *dev, struct regmap *regmap,
- int irq, const char *name)
+ int irq, const struct adxl372_chip_info *chip_info)
{
struct iio_dev *indio_dev;
struct adxl372_state *st;
@@ -1192,13 +1210,14 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,
st->dev = dev;
st->regmap = regmap;
st->irq = irq;
+ st->chip_info = chip_info;
mutex_init(&st->threshold_m);
indio_dev->channels = adxl372_channels;
indio_dev->num_channels = ARRAY_SIZE(adxl372_channels);
indio_dev->available_scan_masks = adxl372_channel_masks;
- indio_dev->name = name;
+ indio_dev->name = chip_info->name;
indio_dev->info = &adxl372_info;
indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
diff --git a/drivers/iio/accel/adxl372.h b/drivers/iio/accel/adxl372.h
index 80a0aa9714fc..3ce06609446c 100644
--- a/drivers/iio/accel/adxl372.h
+++ b/drivers/iio/accel/adxl372.h
@@ -10,8 +10,22 @@
#define ADXL372_REVID 0x03
+struct adxl372_chip_info {
+ const char *name;
+ const int *samp_freq_tbl;
+ const int *bw_freq_tbl;
+ unsigned int num_freqs;
+ unsigned int act_time_scale_us;
+ unsigned int act_time_scale_low_us;
+ unsigned int inact_time_scale_ms;
+ unsigned int inact_time_scale_low_ms;
+ unsigned int max_odr;
+};
+
+extern const struct adxl372_chip_info adxl372_chip_info;
+
int adxl372_probe(struct device *dev, struct regmap *regmap,
- int irq, const char *name);
+ int irq, const struct adxl372_chip_info *chip_info);
bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg);
#endif /* _ADXL372_H_ */
diff --git a/drivers/iio/accel/adxl372_i2c.c b/drivers/iio/accel/adxl372_i2c.c
index 186d4fe9a556..5d135b1150c8 100644
--- a/drivers/iio/accel/adxl372_i2c.c
+++ b/drivers/iio/accel/adxl372_i2c.c
@@ -20,11 +20,13 @@ static const struct regmap_config adxl372_regmap_config = {
static int adxl372_i2c_probe(struct i2c_client *client)
{
- const struct i2c_device_id *id = i2c_client_get_device_id(client);
+ const struct adxl372_chip_info *chip_info;
struct regmap *regmap;
unsigned int regval;
int ret;
+ chip_info = i2c_get_match_data(client);
+
regmap = devm_regmap_init_i2c(client, &adxl372_regmap_config);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
@@ -38,17 +40,17 @@ static int adxl372_i2c_probe(struct i2c_client *client)
dev_warn(&client->dev,
"I2C might not work properly with other devices on the bus");
- return adxl372_probe(&client->dev, regmap, client->irq, id->name);
+ return adxl372_probe(&client->dev, regmap, client->irq, chip_info);
}
static const struct i2c_device_id adxl372_i2c_id[] = {
- { "adxl372" },
+ { "adxl372", (kernel_ulong_t)&adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(i2c, adxl372_i2c_id);
static const struct of_device_id adxl372_of_match[] = {
- { .compatible = "adi,adxl372" },
+ { .compatible = "adi,adxl372", .data = &adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(of, adxl372_of_match);
diff --git a/drivers/iio/accel/adxl372_spi.c b/drivers/iio/accel/adxl372_spi.c
index 39941b519c3b..e96a355bfe67 100644
--- a/drivers/iio/accel/adxl372_spi.c
+++ b/drivers/iio/accel/adxl372_spi.c
@@ -22,24 +22,26 @@ static const struct regmap_config adxl372_spi_regmap_config = {
static int adxl372_spi_probe(struct spi_device *spi)
{
- const struct spi_device_id *id = spi_get_device_id(spi);
+ const struct adxl372_chip_info *chip_info;
struct regmap *regmap;
+ chip_info = spi_get_device_match_data(spi);
+
regmap = devm_regmap_init_spi(spi, &adxl372_spi_regmap_config);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
- return adxl372_probe(&spi->dev, regmap, spi->irq, id->name);
+ return adxl372_probe(&spi->dev, regmap, spi->irq, chip_info);
}
static const struct spi_device_id adxl372_spi_id[] = {
- { "adxl372", 0 },
+ { "adxl372", (kernel_ulong_t)&adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(spi, adxl372_spi_id);
static const struct of_device_id adxl372_of_match[] = {
- { .compatible = "adi,adxl372" },
+ { .compatible = "adi,adxl372", .data = &adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(of, adxl372_of_match);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v4 1/4] iio: accel: adxl372: introduce chip_info structure
2026-03-21 10:04 ` [PATCH v4 1/4] iio: accel: adxl372: introduce chip_info structure Antoniu Miclaus
@ 2026-03-21 11:13 ` Jonathan Cameron
0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2026-03-21 11:13 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: Michael Hennerich, Marcelo Schmitt, Nuno Sá,
Lars-Peter Clausen, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
On Sat, 21 Mar 2026 12:04:56 +0200
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> Introduce a chip_info structure to parameterize device-specific
> properties such as ODR/bandwidth frequency tables, activity/inactivity
> timer scale factors, and the maximum ODR value. This refactors the
> driver to use chip_info lookups instead of hardcoded values, preparing
> the driver to support multiple device variants.
>
> The sampling_frequency and filter_low_pass_3db_frequency available
> attributes are switched from custom sysfs callbacks to read_avail()
> based handling via info_mask_shared_by_type_available. This enforces
> consistent formatting through the IIO framework and makes the values
> accessible to in-kernel consumers.
I'd slightly have preferred that as a precursor patch, but never mind
it's not too bad in here. So this is more of a comment for 'next
time' than anything to bother fixing for this series.
>
> The SPI/I2C probe functions are updated to pass a chip_info pointer
> instead of a device name string.
>
> No functional change intended.
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 2/4] dt-bindings: iio: accel: adi,adxl372: add ADXL371 compatible
2026-03-21 10:04 [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Antoniu Miclaus
2026-03-21 10:04 ` [PATCH v4 1/4] iio: accel: adxl372: introduce chip_info structure Antoniu Miclaus
@ 2026-03-21 10:04 ` Antoniu Miclaus
2026-03-21 10:04 ` [PATCH v4 3/4] iio: accel: adxl372: factor out buffer and trigger setup Antoniu Miclaus
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Antoniu Miclaus @ 2026-03-21 10:04 UTC (permalink / raw)
To: Michael Hennerich, Marcelo Schmitt, Nuno Sá, Antoniu Miclaus,
Lars-Peter Clausen, Jonathan Cameron, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
Cc: Conor Dooley
Add the adi,adxl371 compatible string to the ADXL372 binding. The
ADXL371 is a +-200g 3-axis MEMS accelerometer nearly identical to
the ADXL372 in register layout, differing only in ODR/bandwidth
values, timer scale factors, and a silicon anomaly affecting FIFO
operation.
Update the title and description to reflect both devices.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
Changes in v4:
- None.
.../devicetree/bindings/iio/accel/adi,adxl372.yaml | 9 ++++++---
MAINTAINERS | 5 ++++-
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml b/Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
index 0ba0df46c3a9..02e734946f44 100644
--- a/Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
+++ b/Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
@@ -4,20 +4,23 @@
$id: http://devicetree.org/schemas/iio/accel/adi,adxl372.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
-title: Analog Devices ADXL372 3-Axis, +/-(200g) Digital Accelerometer
+title: Analog Devices ADXL371/ADXL372 3-Axis, +/-(200g) Digital Accelerometer
maintainers:
- Marcelo Schmitt <marcelo.schmitt@analog.com>
- Nuno Sá <nuno.sa@analog.com>
+ - Antoniu Miclaus <antoniu.miclaus@analog.com>
description: |
- Analog Devices ADXL372 3-Axis, +/-(200g) Digital Accelerometer that supports
- both I2C & SPI interfaces
+ Analog Devices ADXL371/ADXL372 3-Axis, +/-(200g) Digital Accelerometer that
+ supports both I2C & SPI interfaces
+ https://www.analog.com/en/products/adxl371.html
https://www.analog.com/en/products/adxl372.html
properties:
compatible:
enum:
+ - adi,adxl371
- adi,adxl372
reg:
diff --git a/MAINTAINERS b/MAINTAINERS
index dc82a6bd1a61..34a1e1386b66 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -651,8 +651,11 @@ W: https://ez.analog.com/linux-software-drivers
F: Documentation/devicetree/bindings/iio/accel/adi,adxl367.yaml
F: drivers/iio/accel/adxl367*
-ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
+ADXL371/ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
M: Michael Hennerich <michael.hennerich@analog.com>
+M: Marcelo Schmitt <marcelo.schmitt@analog.com>
+M: Nuno Sá <nuno.sa@analog.com>
+M: Antoniu Miclaus <antoniu.miclaus@analog.com>
S: Supported
W: https://ez.analog.com/linux-software-drivers
F: Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 3/4] iio: accel: adxl372: factor out buffer and trigger setup
2026-03-21 10:04 [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Antoniu Miclaus
2026-03-21 10:04 ` [PATCH v4 1/4] iio: accel: adxl372: introduce chip_info structure Antoniu Miclaus
2026-03-21 10:04 ` [PATCH v4 2/4] dt-bindings: iio: accel: adi,adxl372: add ADXL371 compatible Antoniu Miclaus
@ 2026-03-21 10:04 ` Antoniu Miclaus
2026-03-21 11:18 ` Jonathan Cameron
2026-03-21 10:04 ` [PATCH v4 4/4] iio: accel: adxl372: add support for ADXL371 Antoniu Miclaus
2026-03-21 11:25 ` [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Jonathan Cameron
4 siblings, 1 reply; 8+ messages in thread
From: Antoniu Miclaus @ 2026-03-21 10:04 UTC (permalink / raw)
To: Michael Hennerich, Marcelo Schmitt, Nuno Sá, Antoniu Miclaus,
Lars-Peter Clausen, Jonathan Cameron, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
Extract the triggered buffer, trigger allocation, and IRQ request
logic from adxl372_probe() into a dedicated adxl372_buffer_setup()
helper. This reduces the probe function complexity and prepares for
conditionally disabling buffer support on device variants with
known FIFO issues.
No functional change intended.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
Changes in v4:
- Use 'if (ret)' instead of 'if (ret < 0)' for
devm_iio_trigger_register() and devm_iio_triggered_buffer_setup_ext()
return checks in adxl372_buffer_setup().
drivers/iio/accel/adxl372.c | 94 ++++++++++++++++++++-----------------
1 file changed, 51 insertions(+), 43 deletions(-)
diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c
index b34b91cae753..6fd4fe0ec1d9 100644
--- a/drivers/iio/accel/adxl372.c
+++ b/drivers/iio/accel/adxl372.c
@@ -1193,6 +1193,56 @@ bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
}
EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, "IIO_ADXL372");
+static int adxl372_buffer_setup(struct iio_dev *indio_dev)
+{
+ struct adxl372_state *st = iio_priv(indio_dev);
+ struct device *dev = st->dev;
+ int ret;
+
+ ret = devm_iio_triggered_buffer_setup_ext(dev,
+ indio_dev, NULL,
+ adxl372_trigger_handler,
+ IIO_BUFFER_DIRECTION_IN,
+ &adxl372_buffer_ops,
+ adxl372_fifo_attributes);
+ if (ret)
+ return ret;
+
+ if (!st->irq)
+ return 0;
+
+ st->dready_trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
+ indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!st->dready_trig)
+ return -ENOMEM;
+
+ st->peak_datardy_trig = devm_iio_trigger_alloc(dev, "%s-dev%d-peak",
+ indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!st->peak_datardy_trig)
+ return -ENOMEM;
+
+ st->dready_trig->ops = &adxl372_trigger_ops;
+ st->peak_datardy_trig->ops = &adxl372_peak_data_trigger_ops;
+ iio_trigger_set_drvdata(st->dready_trig, indio_dev);
+ iio_trigger_set_drvdata(st->peak_datardy_trig, indio_dev);
+ ret = devm_iio_trigger_register(dev, st->dready_trig);
+ if (ret)
+ return ret;
+
+ ret = devm_iio_trigger_register(dev, st->peak_datardy_trig);
+ if (ret)
+ return ret;
+
+ indio_dev->trig = iio_trigger_get(st->dready_trig);
+
+ return devm_request_irq(dev, st->irq,
+ iio_trigger_generic_data_rdy_poll,
+ IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
+ indio_dev->name, st->dready_trig);
+}
+
int adxl372_probe(struct device *dev, struct regmap *regmap,
int irq, const struct adxl372_chip_info *chip_info)
{
@@ -1227,52 +1277,10 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,
return ret;
}
- ret = devm_iio_triggered_buffer_setup_ext(dev,
- indio_dev, NULL,
- adxl372_trigger_handler,
- IIO_BUFFER_DIRECTION_IN,
- &adxl372_buffer_ops,
- adxl372_fifo_attributes);
+ ret = adxl372_buffer_setup(indio_dev);
if (ret < 0)
return ret;
- if (st->irq) {
- st->dready_trig = devm_iio_trigger_alloc(dev,
- "%s-dev%d",
- indio_dev->name,
- iio_device_id(indio_dev));
- if (st->dready_trig == NULL)
- return -ENOMEM;
-
- st->peak_datardy_trig = devm_iio_trigger_alloc(dev,
- "%s-dev%d-peak",
- indio_dev->name,
- iio_device_id(indio_dev));
- if (!st->peak_datardy_trig)
- return -ENOMEM;
-
- st->dready_trig->ops = &adxl372_trigger_ops;
- st->peak_datardy_trig->ops = &adxl372_peak_data_trigger_ops;
- iio_trigger_set_drvdata(st->dready_trig, indio_dev);
- iio_trigger_set_drvdata(st->peak_datardy_trig, indio_dev);
- ret = devm_iio_trigger_register(dev, st->dready_trig);
- if (ret < 0)
- return ret;
-
- ret = devm_iio_trigger_register(dev, st->peak_datardy_trig);
- if (ret < 0)
- return ret;
-
- indio_dev->trig = iio_trigger_get(st->dready_trig);
-
- ret = devm_request_irq(dev, st->irq,
- iio_trigger_generic_data_rdy_poll,
- IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
- indio_dev->name, st->dready_trig);
- if (ret < 0)
- return ret;
- }
-
return devm_iio_device_register(dev, indio_dev);
}
EXPORT_SYMBOL_NS_GPL(adxl372_probe, "IIO_ADXL372");
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v4 3/4] iio: accel: adxl372: factor out buffer and trigger setup
2026-03-21 10:04 ` [PATCH v4 3/4] iio: accel: adxl372: factor out buffer and trigger setup Antoniu Miclaus
@ 2026-03-21 11:18 ` Jonathan Cameron
0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2026-03-21 11:18 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: Michael Hennerich, Marcelo Schmitt, Nuno Sá,
Lars-Peter Clausen, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
On Sat, 21 Mar 2026 12:04:58 +0200
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> Extract the triggered buffer, trigger allocation, and IRQ request
> logic from adxl372_probe() into a dedicated adxl372_buffer_setup()
> helper. This reduces the probe function complexity and prepares for
> conditionally disabling buffer support on device variants with
> known FIFO issues.
>
> No functional change intended.
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
A couple of comments, but all about stuff you've simply moved, so not
asking for changes (though if you respin for other reasons, good
to tidy up the line wrap).
Jonathan
> ---
> Changes in v4:
> - Use 'if (ret)' instead of 'if (ret < 0)' for
> devm_iio_trigger_register() and devm_iio_triggered_buffer_setup_ext()
> return checks in adxl372_buffer_setup().
>
> drivers/iio/accel/adxl372.c | 94 ++++++++++++++++++++-----------------
> 1 file changed, 51 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c
> index b34b91cae753..6fd4fe0ec1d9 100644
> --- a/drivers/iio/accel/adxl372.c
> +++ b/drivers/iio/accel/adxl372.c
> @@ -1193,6 +1193,56 @@ bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
> }
> EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, "IIO_ADXL372");
>
> +static int adxl372_buffer_setup(struct iio_dev *indio_dev)
> +{
> + struct adxl372_state *st = iio_priv(indio_dev);
> + struct device *dev = st->dev;
> + int ret;
> +
> + ret = devm_iio_triggered_buffer_setup_ext(dev,
> + indio_dev, NULL,
Not sure why this wrapping (was in original code too)
I might move these two up a line whilst applying.
> + adxl372_trigger_handler,
> + IIO_BUFFER_DIRECTION_IN,
> + &adxl372_buffer_ops,
> + adxl372_fifo_attributes);
> + if (ret)
> + return ret;
> +
> + if (!st->irq)
> + return 0;
> +
> + st->dready_trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
> + indio_dev->name,
> + iio_device_id(indio_dev));
> + if (!st->dready_trig)
> + return -ENOMEM;
> +
> + st->peak_datardy_trig = devm_iio_trigger_alloc(dev, "%s-dev%d-peak",
> + indio_dev->name,
> + iio_device_id(indio_dev));
> + if (!st->peak_datardy_trig)
> + return -ENOMEM;
> +
> + st->dready_trig->ops = &adxl372_trigger_ops;
> + st->peak_datardy_trig->ops = &adxl372_peak_data_trigger_ops;
In original code so not something to fix in this patch, but odd mix
of dready and datardy naming. I think they are both related to data
being ready. Either form is fine, but having both used in adjacent
lines of code not so much! If you have time to make that consistent
in a follow up series that would be good.
> + iio_trigger_set_drvdata(st->dready_trig, indio_dev);
> + iio_trigger_set_drvdata(st->peak_datardy_trig, indio_dev);
> + ret = devm_iio_trigger_register(dev, st->dready_trig);
> + if (ret)
> + return ret;
> +
> + ret = devm_iio_trigger_register(dev, st->peak_datardy_trig);
> + if (ret)
> + return ret;
> +
> + indio_dev->trig = iio_trigger_get(st->dready_trig);
> +
> + return devm_request_irq(dev, st->irq,
> + iio_trigger_generic_data_rdy_poll,
> + IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
> + indio_dev->name, st->dready_trig);
> +}
> +
> int adxl372_probe(struct device *dev, struct regmap *regmap,
> int irq, const struct adxl372_chip_info *chip_info)
> {
> @@ -1227,52 +1277,10 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,
> return ret;
> }
>
> - ret = devm_iio_triggered_buffer_setup_ext(dev,
> - indio_dev, NULL,
> - adxl372_trigger_handler,
> - IIO_BUFFER_DIRECTION_IN,
> - &adxl372_buffer_ops,
> - adxl372_fifo_attributes);
> + ret = adxl372_buffer_setup(indio_dev);
> if (ret < 0)
> return ret;
>
> - if (st->irq) {
> - st->dready_trig = devm_iio_trigger_alloc(dev,
> - "%s-dev%d",
> - indio_dev->name,
> - iio_device_id(indio_dev));
> - if (st->dready_trig == NULL)
> - return -ENOMEM;
> -
> - st->peak_datardy_trig = devm_iio_trigger_alloc(dev,
> - "%s-dev%d-peak",
> - indio_dev->name,
> - iio_device_id(indio_dev));
> - if (!st->peak_datardy_trig)
> - return -ENOMEM;
> -
> - st->dready_trig->ops = &adxl372_trigger_ops;
> - st->peak_datardy_trig->ops = &adxl372_peak_data_trigger_ops;
> - iio_trigger_set_drvdata(st->dready_trig, indio_dev);
> - iio_trigger_set_drvdata(st->peak_datardy_trig, indio_dev);
> - ret = devm_iio_trigger_register(dev, st->dready_trig);
> - if (ret < 0)
> - return ret;
> -
> - ret = devm_iio_trigger_register(dev, st->peak_datardy_trig);
> - if (ret < 0)
> - return ret;
> -
> - indio_dev->trig = iio_trigger_get(st->dready_trig);
> -
> - ret = devm_request_irq(dev, st->irq,
> - iio_trigger_generic_data_rdy_poll,
> - IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
> - indio_dev->name, st->dready_trig);
> - if (ret < 0)
> - return ret;
> - }
> -
> return devm_iio_device_register(dev, indio_dev);
> }
> EXPORT_SYMBOL_NS_GPL(adxl372_probe, "IIO_ADXL372");
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 4/4] iio: accel: adxl372: add support for ADXL371
2026-03-21 10:04 [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Antoniu Miclaus
` (2 preceding siblings ...)
2026-03-21 10:04 ` [PATCH v4 3/4] iio: accel: adxl372: factor out buffer and trigger setup Antoniu Miclaus
@ 2026-03-21 10:04 ` Antoniu Miclaus
2026-03-21 11:25 ` [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Jonathan Cameron
4 siblings, 0 replies; 8+ messages in thread
From: Antoniu Miclaus @ 2026-03-21 10:04 UTC (permalink / raw)
To: Michael Hennerich, Marcelo Schmitt, Nuno Sá, Antoniu Miclaus,
Lars-Peter Clausen, Jonathan Cameron, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
Add support for the Analog Devices ADXL371, a +-200g 3-axis MEMS
accelerometer sharing the same register map as the ADXL372 but with
different ODR values (320/640/1280/2560/5120 Hz vs 400/800/1600/3200/
6400 Hz), different bandwidth values, and different timer scale
factors for activity/inactivity detection.
Due to a silicon anomaly (er001) causing FIFO data misalignment on
all current ADXL371 silicon, FIFO and triggered buffer support is
disabled for the ADXL371 - only direct mode reads are supported.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
Changes in v4:
- Drop trailing comma from ADXL371_ODR_NUM enum terminator.
drivers/iio/accel/Kconfig | 12 +++----
drivers/iio/accel/adxl372.c | 63 +++++++++++++++++++++++++++++----
drivers/iio/accel/adxl372.h | 4 ++-
drivers/iio/accel/adxl372_i2c.c | 7 ++--
drivers/iio/accel/adxl372_spi.c | 7 ++--
5 files changed, 75 insertions(+), 18 deletions(-)
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 3d3f8d8673dd..4094299e2ed8 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -158,24 +158,24 @@ config ADXL372
select IIO_TRIGGERED_BUFFER
config ADXL372_SPI
- tristate "Analog Devices ADXL372 3-Axis Accelerometer SPI Driver"
+ tristate "Analog Devices ADXL371/ADXL372 3-Axis Accelerometer SPI Driver"
depends on SPI
select ADXL372
select REGMAP_SPI
help
- Say yes here to add support for the Analog Devices ADXL372 triaxial
- acceleration sensor.
+ Say yes here to add support for the Analog Devices ADXL371/ADXL372
+ triaxial acceleration sensor.
To compile this driver as a module, choose M here: the
module will be called adxl372_spi.
config ADXL372_I2C
- tristate "Analog Devices ADXL372 3-Axis Accelerometer I2C Driver"
+ tristate "Analog Devices ADXL371/ADXL372 3-Axis Accelerometer I2C Driver"
depends on I2C
select ADXL372
select REGMAP_I2C
help
- Say yes here to add support for the Analog Devices ADXL372 triaxial
- acceleration sensor.
+ Say yes here to add support for the Analog Devices ADXL371/ADXL372
+ triaxial acceleration sensor.
To compile this driver as a module, choose M here: the
module will be called adxl372_i2c.
diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c
index 6fd4fe0ec1d9..478ae68f0553 100644
--- a/drivers/iio/accel/adxl372.c
+++ b/drivers/iio/accel/adxl372.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
- * ADXL372 3-Axis Digital Accelerometer core driver
+ * ADXL371/ADXL372 3-Axis Digital Accelerometer core driver
*
* Copyright 2018 Analog Devices Inc.
*/
@@ -183,6 +183,15 @@ enum adxl372_odr {
ADXL372_ODR_NUM
};
+enum adxl371_odr {
+ ADXL371_ODR_320HZ,
+ ADXL371_ODR_640HZ,
+ ADXL371_ODR_1280HZ,
+ ADXL371_ODR_2560HZ,
+ ADXL371_ODR_5120HZ,
+ ADXL371_ODR_NUM
+};
+
enum adxl372_bandwidth {
ADXL372_BW_200HZ,
ADXL372_BW_400HZ,
@@ -231,6 +240,37 @@ static const int adxl372_bw_freq_tbl[ADXL372_ODR_NUM] = {
[ADXL372_BW_3200HZ] = 3200,
};
+static const int adxl371_samp_freq_tbl[ADXL371_ODR_NUM] = {
+ [ADXL371_ODR_320HZ] = 320,
+ [ADXL371_ODR_640HZ] = 640,
+ [ADXL371_ODR_1280HZ] = 1280,
+ [ADXL371_ODR_2560HZ] = 2560,
+ [ADXL371_ODR_5120HZ] = 5120,
+};
+
+static const int adxl371_bw_freq_tbl[ADXL371_ODR_NUM] = {
+ [ADXL371_ODR_320HZ] = 160,
+ [ADXL371_ODR_640HZ] = 320,
+ [ADXL371_ODR_1280HZ] = 640,
+ [ADXL371_ODR_2560HZ] = 1280,
+ [ADXL371_ODR_5120HZ] = 2560,
+};
+
+const struct adxl372_chip_info adxl371_chip_info = {
+ .name = "adxl371",
+ .samp_freq_tbl = adxl371_samp_freq_tbl,
+ .bw_freq_tbl = adxl371_bw_freq_tbl,
+ .num_freqs = ARRAY_SIZE(adxl371_samp_freq_tbl),
+ .act_time_scale_us = 4125,
+ .act_time_scale_low_us = 8250,
+ .inact_time_scale_ms = 16,
+ .inact_time_scale_low_ms = 32,
+ .max_odr = ADXL371_ODR_5120HZ,
+ /* Silicon erratum (er001) causes FIFO data misalignment on ADXL371 */
+ .fifo_supported = false,
+};
+EXPORT_SYMBOL_NS_GPL(adxl371_chip_info, "IIO_ADXL372");
+
const struct adxl372_chip_info adxl372_chip_info = {
.name = "adxl372",
.samp_freq_tbl = adxl372_samp_freq_tbl,
@@ -241,6 +281,7 @@ const struct adxl372_chip_info adxl372_chip_info = {
.inact_time_scale_ms = 13,
.inact_time_scale_low_ms = 26,
.max_odr = ADXL372_ODR_6400HZ,
+ .fifo_supported = true,
};
EXPORT_SYMBOL_NS_GPL(adxl372_chip_info, "IIO_ADXL372");
@@ -1266,10 +1307,15 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,
indio_dev->channels = adxl372_channels;
indio_dev->num_channels = ARRAY_SIZE(adxl372_channels);
- indio_dev->available_scan_masks = adxl372_channel_masks;
indio_dev->name = chip_info->name;
indio_dev->info = &adxl372_info;
- indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
+
+ if (chip_info->fifo_supported) {
+ indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
+ indio_dev->available_scan_masks = adxl372_channel_masks;
+ } else {
+ indio_dev->modes = INDIO_DIRECT_MODE;
+ }
ret = adxl372_setup(st);
if (ret < 0) {
@@ -1277,14 +1323,17 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,
return ret;
}
- ret = adxl372_buffer_setup(indio_dev);
- if (ret < 0)
- return ret;
+ if (chip_info->fifo_supported) {
+ ret = adxl372_buffer_setup(indio_dev);
+ if (ret < 0)
+ return ret;
+ }
return devm_iio_device_register(dev, indio_dev);
}
EXPORT_SYMBOL_NS_GPL(adxl372_probe, "IIO_ADXL372");
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
-MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver");
+MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
+MODULE_DESCRIPTION("Analog Devices ADXL371/ADXL372 3-axis accelerometer driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/iio/accel/adxl372.h b/drivers/iio/accel/adxl372.h
index 3ce06609446c..353a8b3a9d76 100644
--- a/drivers/iio/accel/adxl372.h
+++ b/drivers/iio/accel/adxl372.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
- * ADXL372 3-Axis Digital Accelerometer
+ * ADXL371/ADXL372 3-Axis Digital Accelerometer
*
* Copyright 2018 Analog Devices Inc.
*/
@@ -20,8 +20,10 @@ struct adxl372_chip_info {
unsigned int inact_time_scale_ms;
unsigned int inact_time_scale_low_ms;
unsigned int max_odr;
+ bool fifo_supported;
};
+extern const struct adxl372_chip_info adxl371_chip_info;
extern const struct adxl372_chip_info adxl372_chip_info;
int adxl372_probe(struct device *dev, struct regmap *regmap,
diff --git a/drivers/iio/accel/adxl372_i2c.c b/drivers/iio/accel/adxl372_i2c.c
index 5d135b1150c8..ca2cabf24938 100644
--- a/drivers/iio/accel/adxl372_i2c.c
+++ b/drivers/iio/accel/adxl372_i2c.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
- * ADXL372 3-Axis Digital Accelerometer I2C driver
+ * ADXL371/ADXL372 3-Axis Digital Accelerometer I2C driver
*
* Copyright 2018 Analog Devices Inc.
*/
@@ -44,12 +44,14 @@ static int adxl372_i2c_probe(struct i2c_client *client)
}
static const struct i2c_device_id adxl372_i2c_id[] = {
+ { "adxl371", (kernel_ulong_t)&adxl371_chip_info },
{ "adxl372", (kernel_ulong_t)&adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(i2c, adxl372_i2c_id);
static const struct of_device_id adxl372_of_match[] = {
+ { .compatible = "adi,adxl371", .data = &adxl371_chip_info },
{ .compatible = "adi,adxl372", .data = &adxl372_chip_info },
{ }
};
@@ -67,6 +69,7 @@ static struct i2c_driver adxl372_i2c_driver = {
module_i2c_driver(adxl372_i2c_driver);
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
-MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer I2C driver");
+MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
+MODULE_DESCRIPTION("Analog Devices ADXL371/ADXL372 3-axis accelerometer I2C driver");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("IIO_ADXL372");
diff --git a/drivers/iio/accel/adxl372_spi.c b/drivers/iio/accel/adxl372_spi.c
index e96a355bfe67..1f9c1544e547 100644
--- a/drivers/iio/accel/adxl372_spi.c
+++ b/drivers/iio/accel/adxl372_spi.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
- * ADXL372 3-Axis Digital Accelerometer SPI driver
+ * ADXL371/ADXL372 3-Axis Digital Accelerometer SPI driver
*
* Copyright 2018 Analog Devices Inc.
*/
@@ -35,12 +35,14 @@ static int adxl372_spi_probe(struct spi_device *spi)
}
static const struct spi_device_id adxl372_spi_id[] = {
+ { "adxl371", (kernel_ulong_t)&adxl371_chip_info },
{ "adxl372", (kernel_ulong_t)&adxl372_chip_info },
{ }
};
MODULE_DEVICE_TABLE(spi, adxl372_spi_id);
static const struct of_device_id adxl372_of_match[] = {
+ { .compatible = "adi,adxl371", .data = &adxl371_chip_info },
{ .compatible = "adi,adxl372", .data = &adxl372_chip_info },
{ }
};
@@ -58,6 +60,7 @@ static struct spi_driver adxl372_spi_driver = {
module_spi_driver(adxl372_spi_driver);
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
-MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer SPI driver");
+MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
+MODULE_DESCRIPTION("Analog Devices ADXL371/ADXL372 3-axis accelerometer SPI driver");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("IIO_ADXL372");
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support
2026-03-21 10:04 [PATCH v4 0/4] iio: accel: adxl372: add ADXL371 support Antoniu Miclaus
` (3 preceding siblings ...)
2026-03-21 10:04 ` [PATCH v4 4/4] iio: accel: adxl372: add support for ADXL371 Antoniu Miclaus
@ 2026-03-21 11:25 ` Jonathan Cameron
4 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2026-03-21 11:25 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: Michael Hennerich, Marcelo Schmitt, Nuno Sá,
Lars-Peter Clausen, David Lechner, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Petre Rodan, Jorge Marques,
linux-iio, devicetree, linux-kernel
On Sat, 21 Mar 2026 12:04:55 +0200
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> Add support for the Analog Devices ADXL371 3-axis, +-200g MEMS
> accelerometer to the existing ADXL372 IIO driver. The ADXL371 shares
> the same register map as the ADXL372 but differs in ODR/bandwidth
> values, timer scale factors, and has a known silicon anomaly (er001)
> that prevents reliable FIFO operation.
Applied with minor line break tweak in patch 3.
Looks to me like you've addressed Andy's comments and there was nothing
else outstanding. I'm applying this without waiting to see if Andy
has any last feedback mostly to make life a bit easier but cutting down
the number of series in flight!
For now pushed out as testing, as such (for now) I'm fine tweaking, dropping
or adding tags if more feedback does come in.
Thanks,
Jonathan
>
> Changes in v4:
> - [Patch 1/4] Reformat info_mask_shared_by_type to use consistent
> multi-line style matching info_mask_shared_by_type_available.
> - [Patch 1/4] Drop trailing comma from ADXL372_ODR_NUM enum
> terminator.
> - [Patch 1/4] Drop redundant NULL checks for chip_info in SPI/I2C
> probe functions since match data is always provided.
> - [Patch 3/4] Use 'if (ret)' instead of 'if (ret < 0)' for
> devm_iio_trigger_register() and devm_iio_triggered_buffer_setup_ext()
> return checks in adxl372_buffer_setup().
> - [Patch 4/4] Drop trailing comma from ADXL371_ODR_NUM enum
> terminator.
>
> Antoniu Miclaus (4):
> iio: accel: adxl372: introduce chip_info structure
> dt-bindings: iio: accel: adi,adxl372: add ADXL371 compatible
> iio: accel: adxl372: factor out buffer and trigger setup
> iio: accel: adxl372: add support for ADXL371
>
> .../bindings/iio/accel/adi,adxl372.yaml | 9 +-
> MAINTAINERS | 5 +-
> drivers/iio/accel/Kconfig | 12 +-
> drivers/iio/accel/adxl372.c | 300 +++++++++++-------
> drivers/iio/accel/adxl372.h | 20 +-
> drivers/iio/accel/adxl372_i2c.c | 17 +-
> drivers/iio/accel/adxl372_spi.c | 17 +-
> 7 files changed, 244 insertions(+), 136 deletions(-)
>
^ permalink raw reply [flat|nested] 8+ messages in thread