From 1844165d5b92f1ef61a210e7ed206fd3bb2dacdd Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Sat, 29 Oct 2022 23:15:08 +0200 Subject: [PATCH 338/389] iio: af8133j: Add support for buffer This allows better way to capture all channels at once and deliver data to userspace. Signed-off-by: Ondrej Jirman --- drivers/iio/magnetometer/af8133j.c | 39 ++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/drivers/iio/magnetometer/af8133j.c b/drivers/iio/magnetometer/af8133j.c index ef74b4c7ae4e..7a0e16fa0ea4 100644 --- a/drivers/iio/magnetometer/af8133j.c +++ b/drivers/iio/magnetometer/af8133j.c @@ -16,6 +16,8 @@ #include #include +#include +#include #define AF8133J_DRV_NAME "af8133j" @@ -77,20 +79,29 @@ static const struct iio_chan_spec_ext_info af8133j_ext_info[] = { { } }; +// .info_mask_shared_by_type = , \ + #define AF8133J_CHANNEL(_axis) { \ .type = IIO_MAGN, \ .modified = 1, \ .channel2 = IIO_MOD_ ## _axis, \ .address = AXIS_ ## _axis, \ - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ - .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), \ .ext_info = af8133j_ext_info, \ + .scan_index = AXIS_ ## _axis, \ + .scan_type = { \ + .sign = 's', \ + .realbits = 16, \ + .storagebits = 16, \ + .endianness = IIO_LE, \ + }, \ } static const struct iio_chan_spec af8133j_channels[] = { AF8133J_CHANNEL(X), AF8133J_CHANNEL(Y), AF8133J_CHANNEL(Z), + IIO_CHAN_SOFT_TIMESTAMP(3), }; static int af8133j_power_up(struct af8133j_data *data) @@ -252,6 +263,25 @@ static const struct iio_info af8133j_info = { .read_raw = af8133j_read_raw, }; +irqreturn_t af8133j_trigger_handler(int irq, void *p) +{ + struct iio_poll_func *pf = p; + struct iio_dev *indio_dev = pf->indio_dev; + struct af8133j_data *sdata = iio_priv(indio_dev); + s64 timestamp = iio_get_time_ns(indio_dev); + u8 buf[2 * 3 + 8]; + int ret; + + ret = af8133j_read_measurement(sdata, (__le16*)buf); + if (ret < 0) + return ret; + + iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp); + iio_trigger_notify_done(indio_dev->trig); + + return IRQ_HANDLED; +} + static const struct regmap_config af8133j_regmap_config = { .name = "af8133j_regmap", @@ -317,6 +347,11 @@ static int af8133j_probe(struct i2c_client *client, indio_dev->num_channels = ARRAY_SIZE(af8133j_channels); indio_dev->modes = INDIO_DIRECT_MODE; + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, + NULL, &af8133j_trigger_handler, NULL); + if (ret < 0) + return ret; + ret = devm_iio_device_register(dev, indio_dev); if (ret) return dev_err_probe(dev, ret, -- 2.35.3