mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq
@ 2024-09-08 17:21 Antoni Pokusinski
  2024-09-08 17:21 ` [PATCH v2 1/2] iio: temperature: tmp006: add triggered buffer support Antoni Pokusinski
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Antoni Pokusinski @ 2024-09-08 17:21 UTC (permalink / raw)
  To: jic23, lars, robh, krzk+dt
  Cc: pmeerw, linux-iio, devicetree, linux-kernel, Antoni Pokusinski

This patch series adds support for the data ready interrupt of tmp006
sensor. The interrupt line is pulled down once there is a measurement
available to be read. Hence, triggered buffers are used in order to
support continuous data capture for the sensor.

Changes since v1:
  * dt-binding: improve the commit message
  * tmp006_read_raw: use iio_device_claim_direct_scoped()
  * tmp006_channels[] : add trailing commas
  * tmp006_trigger_handler: use s32 to check return value of read_word_data()
  * tmp006_set_trigger_state: fix data alignment
  * tmp006_probe: check return value of devm_iio_triggered_buffer_setup()
  * tmp006_probe: remove IRQF_TRIGGER_FALLING from irqflags argument of
    devm_request_threaded_irq()
  * tmp006_probe: set avaliable_scan_masks to tmp006_scan_masks[]

Antoni Pokusinski (2):
  iio: temperature: tmp006: add triggered buffer support
  dt-bindings: iio: temperature: tmp006: document interrupt

 .../bindings/iio/temperature/ti,tmp006.yaml   |   6 +
 drivers/iio/temperature/Kconfig               |   2 +
 drivers/iio/temperature/tmp006.c              | 134 ++++++++++++++++--
 3 files changed, 129 insertions(+), 13 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] iio: temperature: tmp006: add triggered buffer support
  2024-09-08 17:21 [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Antoni Pokusinski
@ 2024-09-08 17:21 ` Antoni Pokusinski
  2024-09-08 17:21 ` [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt Antoni Pokusinski
  2024-09-14 11:49 ` [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Jonathan Cameron
  2 siblings, 0 replies; 5+ messages in thread
From: Antoni Pokusinski @ 2024-09-08 17:21 UTC (permalink / raw)
  To: jic23, lars, robh, krzk+dt
  Cc: pmeerw, linux-iio, devicetree, linux-kernel, Antoni Pokusinski

Add support for continuous data capture using triggered buffers for the
tmp006 sensor. The device features a "data ready" interrupt line which
is pulled down once a new measurement is ready to be read.

Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
 drivers/iio/temperature/Kconfig  |   2 +
 drivers/iio/temperature/tmp006.c | 134 ++++++++++++++++++++++++++++---
 2 files changed, 123 insertions(+), 13 deletions(-)

diff --git a/drivers/iio/temperature/Kconfig b/drivers/iio/temperature/Kconfig
index ed0e4963362f..1244d8e17d50 100644
--- a/drivers/iio/temperature/Kconfig
+++ b/drivers/iio/temperature/Kconfig
@@ -91,6 +91,8 @@ config MLX90635
 config TMP006
 	tristate "TMP006 infrared thermopile sensor"
 	depends on I2C
+	select IIO_BUFFER
+	select IIO_TRIGGERED_BUFFER
 	help
 	  If you say yes here you get support for the Texas Instruments
 	  TMP006 infrared thermopile sensor.
diff --git a/drivers/iio/temperature/tmp006.c b/drivers/iio/temperature/tmp006.c
index 6d8d661f0c82..0c844137d7aa 100644
--- a/drivers/iio/temperature/tmp006.c
+++ b/drivers/iio/temperature/tmp006.c
@@ -7,8 +7,6 @@
  * Driver for the Texas Instruments I2C 16-bit IR thermopile sensor
  *
  * (7-bit I2C slave address 0x40, changeable via ADR pins)
- *
- * TODO: data ready irq
  */
 
 #include <linux/err.h>
@@ -21,6 +19,9 @@
 
 #include <linux/iio/iio.h>
 #include <linux/iio/sysfs.h>
+#include <linux/iio/trigger.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger_consumer.h>
 
 #define TMP006_VOBJECT 0x00
 #define TMP006_TAMBIENT 0x01
@@ -45,6 +46,7 @@
 struct tmp006_data {
 	struct i2c_client *client;
 	u16 config;
+	struct iio_trigger *drdy_trig;
 };
 
 static int tmp006_read_measurement(struct tmp006_data *data, u8 reg)
@@ -83,15 +85,19 @@ static int tmp006_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_RAW:
 		if (channel->type == IIO_VOLTAGE) {
 			/* LSB is 156.25 nV */
-			ret = tmp006_read_measurement(data, TMP006_VOBJECT);
-			if (ret < 0)
-				return ret;
+			iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
+				ret = tmp006_read_measurement(data, TMP006_VOBJECT);
+				if (ret < 0)
+					return ret;
+			}
 			*val = sign_extend32(ret, 15);
 		} else if (channel->type == IIO_TEMP) {
 			/* LSB is 0.03125 degrees Celsius */
-			ret = tmp006_read_measurement(data, TMP006_TAMBIENT);
-			if (ret < 0)
-				return ret;
+			iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
+				ret = tmp006_read_measurement(data, TMP006_TAMBIENT);
+				if (ret < 0)
+					return ret;
+			}
 			*val = sign_extend32(ret, 15) >> TMP006_TAMBIENT_SHIFT;
 		} else {
 			break;
@@ -128,7 +134,7 @@ static int tmp006_write_raw(struct iio_dev *indio_dev,
 			    long mask)
 {
 	struct tmp006_data *data = iio_priv(indio_dev);
-	int i;
+	int ret, i;
 
 	if (mask != IIO_CHAN_INFO_SAMP_FREQ)
 		return -EINVAL;
@@ -136,13 +142,19 @@ static int tmp006_write_raw(struct iio_dev *indio_dev,
 	for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++)
 		if ((val == tmp006_freqs[i][0]) &&
 		    (val2 == tmp006_freqs[i][1])) {
+			ret = iio_device_claim_direct_mode(indio_dev);
+			if (ret)
+				return ret;
+
 			data->config &= ~TMP006_CONFIG_CR_MASK;
 			data->config |= i << TMP006_CONFIG_CR_SHIFT;
 
-			return i2c_smbus_write_word_swapped(data->client,
-							    TMP006_CONFIG,
-							    data->config);
+			ret = i2c_smbus_write_word_swapped(data->client,
+							   TMP006_CONFIG,
+							   data->config);
 
+			iio_device_release_direct_mode(indio_dev);
+			return ret;
 		}
 	return -EINVAL;
 }
@@ -164,13 +176,29 @@ static const struct iio_chan_spec tmp006_channels[] = {
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 			BIT(IIO_CHAN_INFO_SCALE),
 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+		.scan_index = 0,
+		.scan_type = {
+			.sign = 's',
+			.realbits = 16,
+			.storagebits = 16,
+			.endianness = IIO_BE,
+		}
 	},
 	{
 		.type = IIO_TEMP,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 			BIT(IIO_CHAN_INFO_SCALE),
 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
-	}
+		.scan_index = 1,
+		.scan_type = {
+			.sign = 's',
+			.realbits = 14,
+			.storagebits = 16,
+			.shift = TMP006_TAMBIENT_SHIFT,
+			.endianness = IIO_BE,
+		}
+	},
+	IIO_CHAN_SOFT_TIMESTAMP(2),
 };
 
 static const struct iio_info tmp006_info = {
@@ -213,6 +241,54 @@ static void tmp006_powerdown_cleanup(void *dev)
 	tmp006_power(dev, false);
 }
 
+static irqreturn_t tmp006_trigger_handler(int irq, void *p)
+{
+	struct iio_poll_func *pf = p;
+	struct iio_dev *indio_dev = pf->indio_dev;
+	struct tmp006_data *data = iio_priv(indio_dev);
+	struct {
+		s16 channels[2];
+		s64 ts __aligned(8);
+	} scan;
+	s32 ret;
+
+	ret = i2c_smbus_read_word_data(data->client, TMP006_VOBJECT);
+	if (ret < 0)
+		goto err;
+	scan.channels[0] = ret;
+
+	ret = i2c_smbus_read_word_data(data->client, TMP006_TAMBIENT);
+	if (ret < 0)
+		goto err;
+	scan.channels[1] = ret;
+
+	iio_push_to_buffers_with_timestamp(indio_dev, &scan,
+					   iio_get_time_ns(indio_dev));
+err:
+	iio_trigger_notify_done(indio_dev->trig);
+	return IRQ_HANDLED;
+}
+
+static int tmp006_set_trigger_state(struct iio_trigger *trig, bool state)
+{
+	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
+	struct tmp006_data *data = iio_priv(indio_dev);
+
+	if (state)
+		data->config |= TMP006_CONFIG_DRDY_EN;
+	else
+		data->config &= ~TMP006_CONFIG_DRDY_EN;
+
+	return i2c_smbus_write_word_swapped(data->client, TMP006_CONFIG,
+					    data->config);
+}
+
+static const struct iio_trigger_ops tmp006_trigger_ops = {
+	.set_trigger_state = tmp006_set_trigger_state,
+};
+
+static const unsigned long tmp006_scan_masks[] = { 0x3, 0 };
+
 static int tmp006_probe(struct i2c_client *client)
 {
 	struct iio_dev *indio_dev;
@@ -241,6 +317,7 @@ static int tmp006_probe(struct i2c_client *client)
 
 	indio_dev->channels = tmp006_channels;
 	indio_dev->num_channels = ARRAY_SIZE(tmp006_channels);
+	indio_dev->available_scan_masks = tmp006_scan_masks;
 
 	ret = i2c_smbus_read_word_swapped(data->client, TMP006_CONFIG);
 	if (ret < 0)
@@ -258,6 +335,37 @@ static int tmp006_probe(struct i2c_client *client)
 	if (ret < 0)
 		return ret;
 
+	if (client->irq > 0) {
+		data->drdy_trig = devm_iio_trigger_alloc(&client->dev,
+							 "%s-dev%d",
+							 indio_dev->name,
+							 iio_device_id(indio_dev));
+		if (!data->drdy_trig)
+			return -ENOMEM;
+
+		data->drdy_trig->ops = &tmp006_trigger_ops;
+		iio_trigger_set_drvdata(data->drdy_trig, indio_dev);
+		ret = iio_trigger_register(data->drdy_trig);
+		if (ret)
+			return ret;
+
+		indio_dev->trig = iio_trigger_get(data->drdy_trig);
+
+		ret = devm_request_threaded_irq(&client->dev, client->irq,
+						iio_trigger_generic_data_rdy_poll,
+						NULL,
+						IRQF_ONESHOT,
+						"tmp006_irq",
+						data->drdy_trig);
+		if (ret < 0)
+			return ret;
+	}
+
+	ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL,
+					      tmp006_trigger_handler, NULL);
+	if (ret < 0)
+		return ret;
+
 	return devm_iio_device_register(&client->dev, indio_dev);
 }
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt
  2024-09-08 17:21 [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Antoni Pokusinski
  2024-09-08 17:21 ` [PATCH v2 1/2] iio: temperature: tmp006: add triggered buffer support Antoni Pokusinski
@ 2024-09-08 17:21 ` Antoni Pokusinski
  2024-09-09  6:28   ` Krzysztof Kozlowski
  2024-09-14 11:49 ` [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Jonathan Cameron
  2 siblings, 1 reply; 5+ messages in thread
From: Antoni Pokusinski @ 2024-09-08 17:21 UTC (permalink / raw)
  To: jic23, lars, robh, krzk+dt
  Cc: pmeerw, linux-iio, devicetree, linux-kernel, Antoni Pokusinski

TMP006 sensor has a DRDY (data ready) active-low interrupt which
indicates that a new measurement is ready to be read.

Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
 .../devicetree/bindings/iio/temperature/ti,tmp006.yaml      | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/iio/temperature/ti,tmp006.yaml b/Documentation/devicetree/bindings/iio/temperature/ti,tmp006.yaml
index d43002b9bfdc..590f50ba3a31 100644
--- a/Documentation/devicetree/bindings/iio/temperature/ti,tmp006.yaml
+++ b/Documentation/devicetree/bindings/iio/temperature/ti,tmp006.yaml
@@ -23,6 +23,9 @@ properties:
   vdd-supply:
     description: provide VDD power to the sensor.
 
+  interrupts:
+    maxItems: 1
+
 required:
   - compatible
   - reg
@@ -31,6 +34,7 @@ additionalProperties: false
 
 examples:
   - |
+    #include <dt-bindings/interrupt-controller/irq.h>
     i2c {
         #address-cells = <1>;
         #size-cells = <0>;
@@ -38,5 +42,7 @@ examples:
             compatible = "ti,tmp006";
             reg = <0x40>;
             vdd-supply = <&ldo4_reg>;
+            interrupt-parent = <&gpio1>;
+            interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
         };
     };
-- 
2.25.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt
  2024-09-08 17:21 ` [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt Antoni Pokusinski
@ 2024-09-09  6:28   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 5+ messages in thread
From: Krzysztof Kozlowski @ 2024-09-09  6:28 UTC (permalink / raw)
  To: Antoni Pokusinski
  Cc: jic23, lars, robh, krzk+dt, pmeerw, linux-iio, devicetree, linux-kernel

On Sun, Sep 08, 2024 at 07:21:55PM +0200, Antoni Pokusinski wrote:
> TMP006 sensor has a DRDY (data ready) active-low interrupt which
> indicates that a new measurement is ready to be read.
> 
> Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
> ---
>  .../devicetree/bindings/iio/temperature/ti,tmp006.yaml      | 6 ++++++
>  1 file changed, 6 insertions(+)

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

---

<form letter>
This is an automated instruction, just in case, because many review tags
are being ignored. If you know the process, you can skip it (please do
not feel offended by me posting it here - no bad intentions intended).
If you do not know the process, here is a short explanation:

Please add Acked-by/Reviewed-by/Tested-by tags when posting new
versions, under or above your Signed-off-by tag. Tag is "received", when
provided in a message replied to you on the mailing list. Tools like b4
can help here. However, there's no need to repost patches *only* to add
the tags. The upstream maintainer will do that for tags received on the
version they apply.

https://elixir.bootlin.com/linux/v6.5-rc3/source/Documentation/process/submitting-patches.rst#L577
</form letter>

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq
  2024-09-08 17:21 [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Antoni Pokusinski
  2024-09-08 17:21 ` [PATCH v2 1/2] iio: temperature: tmp006: add triggered buffer support Antoni Pokusinski
  2024-09-08 17:21 ` [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt Antoni Pokusinski
@ 2024-09-14 11:49 ` Jonathan Cameron
  2 siblings, 0 replies; 5+ messages in thread
From: Jonathan Cameron @ 2024-09-14 11:49 UTC (permalink / raw)
  To: Antoni Pokusinski
  Cc: lars, robh, krzk+dt, pmeerw, linux-iio, devicetree, linux-kernel

On Sun,  8 Sep 2024 19:21:51 +0200
Antoni Pokusinski <apokusinski01@gmail.com> wrote:

> This patch series adds support for the data ready interrupt of tmp006
> sensor. The interrupt line is pulled down once there is a measurement
> available to be read. Hence, triggered buffers are used in order to
> support continuous data capture for the sensor.
> 
Applied to the testing branch of iio.git.
I'll rebase that on rc1 once available and push this out as togreg
at which point linux-next will pick it up etc.

Thanks,

Jonathan

> Changes since v1:
>   * dt-binding: improve the commit message
>   * tmp006_read_raw: use iio_device_claim_direct_scoped()
>   * tmp006_channels[] : add trailing commas
>   * tmp006_trigger_handler: use s32 to check return value of read_word_data()
>   * tmp006_set_trigger_state: fix data alignment
>   * tmp006_probe: check return value of devm_iio_triggered_buffer_setup()
>   * tmp006_probe: remove IRQF_TRIGGER_FALLING from irqflags argument of
>     devm_request_threaded_irq()
>   * tmp006_probe: set avaliable_scan_masks to tmp006_scan_masks[]
> 
> Antoni Pokusinski (2):
>   iio: temperature: tmp006: add triggered buffer support
>   dt-bindings: iio: temperature: tmp006: document interrupt
> 
>  .../bindings/iio/temperature/ti,tmp006.yaml   |   6 +
>  drivers/iio/temperature/Kconfig               |   2 +
>  drivers/iio/temperature/tmp006.c              | 134 ++++++++++++++++--
>  3 files changed, 129 insertions(+), 13 deletions(-)
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-09-14 11:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-08 17:21 [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Antoni Pokusinski
2024-09-08 17:21 ` [PATCH v2 1/2] iio: temperature: tmp006: add triggered buffer support Antoni Pokusinski
2024-09-08 17:21 ` [PATCH v2 2/2] dt-bindings: iio: temperature: tmp006: document interrupt Antoni Pokusinski
2024-09-09  6:28   ` Krzysztof Kozlowski
2024-09-14 11:49 ` [PATCH v2 0/2] iio: temperature: tmp006: support for drdy irq Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®