mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
iio: imu: inv_icm42600: add buffer hwfifo watermark attributes
Add hwfifo_watermark/min/max/enabled buffer attributes. Hardware FIFO is always enabled and used. Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
53cea40388
commit
9f16490c4e
|
|
@ -356,6 +356,8 @@ struct inv_icm42600_sensor_state {
|
|||
cpu_to_le16((_wm) & GENMASK(11, 0))
|
||||
/* FIFO is 2048 bytes, let 12 samples for reading latency */
|
||||
#define INV_ICM42600_FIFO_WATERMARK_MAX (2048 - 12 * 16)
|
||||
/* INV_ICM42600_FIFO_WATERMARK_MAX / 8 = 232 */
|
||||
#define INV_ICM42600_FIFO_WATERMARK_MAX_SAMPLES 232
|
||||
|
||||
#define INV_ICM42600_REG_INT_CONFIG1 0x0064
|
||||
#define INV_ICM42600_INT_CONFIG1_TPULSE_DURATION BIT(6)
|
||||
|
|
|
|||
|
|
@ -1187,8 +1187,9 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
|
|||
indio_dev->num_channels = ARRAY_SIZE(inv_icm42600_accel_channels);
|
||||
indio_dev->available_scan_masks = inv_icm42600_accel_scan_masks;
|
||||
|
||||
ret = devm_iio_kfifo_buffer_setup(dev, indio_dev,
|
||||
&inv_icm42600_buffer_ops);
|
||||
ret = devm_iio_kfifo_buffer_setup_ext(dev, indio_dev,
|
||||
&inv_icm42600_buffer_ops,
|
||||
inv_icm42600_buffer_attrs);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,11 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include <linux/iio/buffer.h>
|
||||
#include <linux/iio/iio.h>
|
||||
#include <linux/iio/sysfs.h>
|
||||
|
||||
#include <linux/iio/common/inv_sensors_timestamp.h>
|
||||
|
||||
|
|
@ -438,6 +440,40 @@ const struct iio_buffer_setup_ops inv_icm42600_buffer_ops = {
|
|||
.postdisable = inv_icm42600_buffer_postdisable,
|
||||
};
|
||||
|
||||
static ssize_t hwfifo_watermark_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
||||
struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
|
||||
unsigned int wm;
|
||||
|
||||
guard(mutex)(&st->lock);
|
||||
|
||||
if (indio_dev == st->indio_accel)
|
||||
wm = st->fifo.watermark.eff_accel;
|
||||
else if (indio_dev == st->indio_gyro)
|
||||
wm = st->fifo.watermark.eff_gyro;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return sysfs_emit(buf, "%u\n", wm);
|
||||
}
|
||||
|
||||
IIO_STATIC_CONST_DEVICE_ATTR(hwfifo_watermark_min, "1");
|
||||
IIO_STATIC_CONST_DEVICE_ATTR(hwfifo_watermark_max,
|
||||
__stringify(INV_ICM42600_FIFO_WATERMARK_MAX_SAMPLES));
|
||||
static IIO_DEVICE_ATTR_RO(hwfifo_watermark, 0);
|
||||
IIO_STATIC_CONST_DEVICE_ATTR(hwfifo_enabled, "1");
|
||||
|
||||
const struct iio_dev_attr *inv_icm42600_buffer_attrs[] = {
|
||||
&iio_dev_attr_hwfifo_watermark_min,
|
||||
&iio_dev_attr_hwfifo_watermark_max,
|
||||
&iio_dev_attr_hwfifo_watermark,
|
||||
&iio_dev_attr_hwfifo_enabled,
|
||||
NULL
|
||||
};
|
||||
|
||||
int inv_icm42600_buffer_fifo_read(struct inv_icm42600_state *st,
|
||||
unsigned int max)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ ssize_t inv_icm42600_fifo_decode_packet(const void *packet, const void **accel,
|
|||
const void **timestamp, unsigned int *odr);
|
||||
|
||||
extern const struct iio_buffer_setup_ops inv_icm42600_buffer_ops;
|
||||
extern const struct iio_dev_attr *inv_icm42600_buffer_attrs[];
|
||||
|
||||
int inv_icm42600_buffer_init(struct inv_icm42600_state *st);
|
||||
|
||||
|
|
|
|||
|
|
@ -773,8 +773,9 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
|
|||
indio_dev->available_scan_masks = inv_icm42600_gyro_scan_masks;
|
||||
indio_dev->setup_ops = &inv_icm42600_buffer_ops;
|
||||
|
||||
ret = devm_iio_kfifo_buffer_setup(dev, indio_dev,
|
||||
&inv_icm42600_buffer_ops);
|
||||
ret = devm_iio_kfifo_buffer_setup_ext(dev, indio_dev,
|
||||
&inv_icm42600_buffer_ops,
|
||||
inv_icm42600_buffer_attrs);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user