iio: accel: adxl372: add support for ADXL371

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>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Antoniu Miclaus
2026-03-21 12:04:59 +02:00
committed by Jonathan Cameron
parent 39df6dbfad
commit e7ecdcbc16
5 changed files with 75 additions and 18 deletions

View File

@@ -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.

View File

@@ -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.
*/
@@ -184,6 +184,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,
@@ -232,6 +241,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,
@@ -242,6 +282,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");
@@ -1262,10 +1303,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) {
@@ -1273,14 +1319,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");

View File

@@ -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,

View File

@@ -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");

View File

@@ -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");