From: Vincent Whitchurch <vincent.whitchurch@axis.com>
To: <jic23@kernel.org>
Cc: <kernel@axis.com>, <lars@metafoo.de>, <axel.jonsson@axis.com>,
Vincent Whitchurch <vincent.whitchurch@axis.com>,
<linux-iio@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH 2/2] iio: adc: mcp320x: add triggered buffer support
Date: Wed, 24 Aug 2022 12:40:02 +0200 [thread overview]
Message-ID: <20220824104002.2749075-3-vincent.whitchurch@axis.com> (raw)
In-Reply-To: <20220824104002.2749075-1-vincent.whitchurch@axis.com>
From: Axel Jonsson <axel.jonsson@axis.com>
Add support for triggered buffers. Just read the channels in a loop to
keep things simple.
Signed-off-by: Axel Jonsson <axel.jonsson@axis.com>
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
drivers/iio/adc/Kconfig | 2 +
drivers/iio/adc/mcp320x.c | 130 ++++++++++++++++++++++++++++----------
2 files changed, 99 insertions(+), 33 deletions(-)
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 48ace7412874..9f2628120885 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -696,6 +696,8 @@ config MAX9611
config MCP320X
tristate "Microchip Technology MCP3x01/02/04/08 and MCP3550/1/3"
depends on SPI
+ select IIO_BUFFER
+ select IIO_TRIGGERED_BUFFER
help
Say yes here to build support for Microchip Technology's
MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204,
diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c
index 28398f34628a..9782cbd37728 100644
--- a/drivers/iio/adc/mcp320x.c
+++ b/drivers/iio/adc/mcp320x.c
@@ -43,6 +43,10 @@
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/iio/iio.h>
+#include <linux/interrupt.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger_consumer.h>
#include <linux/regulator/consumer.h>
enum {
@@ -231,37 +235,51 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,
return ret;
}
-#define MCP320X_VOLTAGE_CHANNEL(num) \
- { \
- .type = IIO_VOLTAGE, \
- .indexed = 1, \
- .channel = (num), \
- .address = (num), \
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
+#define MCP320X_VOLTAGE_CHANNEL(num) \
+ { \
+ .type = IIO_VOLTAGE, \
+ .indexed = 1, \
+ .channel = (num), \
+ .address = (num), \
+ .scan_index = (num), \
+ .scan_type = { \
+ .sign = 's', \
+ .realbits = 32, \
+ .storagebits = 32, \
+ .endianness = IIO_CPU, \
+ }, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
}
-#define MCP320X_VOLTAGE_CHANNEL_DIFF(chan1, chan2) \
- { \
- .type = IIO_VOLTAGE, \
- .indexed = 1, \
- .channel = (chan1), \
- .channel2 = (chan2), \
- .address = (chan1), \
- .differential = 1, \
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
+#define MCP320X_VOLTAGE_CHANNEL_DIFF(chan1, chan2, diffoff) \
+ { \
+ .type = IIO_VOLTAGE, \
+ .indexed = 1, \
+ .channel = (chan1), \
+ .channel2 = (chan2), \
+ .address = (chan1), \
+ .scan_index = (chan1 + diffoff), \
+ .scan_type = { \
+ .sign = 's', \
+ .realbits = 32, \
+ .storagebits = 32, \
+ .endianness = IIO_CPU, \
+ }, \
+ .differential = 1, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
}
static const struct iio_chan_spec mcp3201_channels[] = {
- MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1, 1),
};
static const struct iio_chan_spec mcp3202_channels[] = {
MCP320X_VOLTAGE_CHANNEL(0),
MCP320X_VOLTAGE_CHANNEL(1),
- MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
- MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1, 2),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0, 2),
};
static const struct iio_chan_spec mcp3204_channels[] = {
@@ -269,10 +287,10 @@ static const struct iio_chan_spec mcp3204_channels[] = {
MCP320X_VOLTAGE_CHANNEL(1),
MCP320X_VOLTAGE_CHANNEL(2),
MCP320X_VOLTAGE_CHANNEL(3),
- MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
- MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
- MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3),
- MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1, 4),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0, 4),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3, 4),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2, 4),
};
static const struct iio_chan_spec mcp3208_channels[] = {
@@ -284,14 +302,14 @@ static const struct iio_chan_spec mcp3208_channels[] = {
MCP320X_VOLTAGE_CHANNEL(5),
MCP320X_VOLTAGE_CHANNEL(6),
MCP320X_VOLTAGE_CHANNEL(7),
- MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
- MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
- MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3),
- MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2),
- MCP320X_VOLTAGE_CHANNEL_DIFF(4, 5),
- MCP320X_VOLTAGE_CHANNEL_DIFF(5, 4),
- MCP320X_VOLTAGE_CHANNEL_DIFF(6, 7),
- MCP320X_VOLTAGE_CHANNEL_DIFF(7, 6),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(4, 5, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(5, 4, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(6, 7, 8),
+ MCP320X_VOLTAGE_CHANNEL_DIFF(7, 6, 8),
};
static const struct iio_info mcp320x_info = {
@@ -371,6 +389,46 @@ static const struct mcp320x_chip_info mcp320x_chip_infos[] = {
},
};
+static irqreturn_t mcp320x_buffer_trigger_handler(int irq, void *pollfunc)
+{
+ struct iio_poll_func *pf = pollfunc;
+ struct iio_dev *indio_dev = pf->indio_dev;
+ struct mcp320x *adc = iio_priv(indio_dev);
+ s32 data[ARRAY_SIZE(mcp3208_channels)];
+ int device_index;
+ int i = 0;
+ int chan;
+
+ device_index = spi_get_device_id(adc->spi)->driver_data;
+
+ mutex_lock(&adc->lock);
+
+ for_each_set_bit(chan, indio_dev->active_scan_mask, indio_dev->masklength) {
+ const struct iio_chan_spec *spec = &indio_dev->channels[chan];
+ int ret, val;
+
+ ret = mcp320x_adc_conversion(adc, spec->address,
+ spec->differential, device_index,
+ &val);
+ if (ret < 0) {
+ dev_err_ratelimited(&adc->spi->dev, "Failed to read data: %d\n",
+ ret);
+ goto out;
+ }
+
+ data[i++] = val;
+ }
+
+ iio_push_to_buffers(indio_dev, data);
+
+out:
+ mutex_unlock(&adc->lock);
+
+ iio_trigger_notify_done(indio_dev->trig);
+
+ return IRQ_HANDLED;
+}
+
static void mcp320x_reg_disable(void *reg)
{
regulator_disable(reg);
@@ -456,6 +514,12 @@ static int mcp320x_probe(struct spi_device *spi)
mutex_init(&adc->lock);
+ ret = devm_iio_triggered_buffer_setup(&spi->dev, indio_dev, NULL,
+ mcp320x_buffer_trigger_handler,
+ NULL);
+ if (ret)
+ return ret;
+
return devm_iio_device_register(&spi->dev, indio_dev);
}
--
2.34.1
next prev parent reply other threads:[~2022-08-24 10:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-24 10:40 [PATCH 0/2] iio: adc: mcp320x: Add triggered buffer support Vincent Whitchurch
2022-08-24 10:40 ` [PATCH 1/2] iio: adc: mcp320x: use device managed functions Vincent Whitchurch
2022-08-25 20:01 ` Andy Shevchenko
2022-08-26 11:38 ` Vincent Whitchurch
[not found] ` <CAHp75VffYzNTfrki4+o8JJayUGo1n91bP0hSzB-fR=RfcFq-fw@mail.gmail.com>
2022-08-28 17:06 ` Jonathan Cameron
2022-08-29 8:16 ` Andy Shevchenko
2022-08-24 10:40 ` Vincent Whitchurch [this message]
2022-08-25 20:06 ` [PATCH 2/2] iio: adc: mcp320x: add triggered buffer support Andy Shevchenko
2022-08-28 17:15 ` Jonathan Cameron
2022-08-28 17:24 ` Jonathan Cameron
2022-08-31 7:47 ` Vincent Whitchurch
2022-09-04 16:29 ` 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=20220824104002.2749075-3-vincent.whitchurch@axis.com \
--to=vincent.whitchurch@axis.com \
--cc=axel.jonsson@axis.com \
--cc=jic23@kernel.org \
--cc=kernel@axis.com \
--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