* [PATCH v2 1/4] dt-bindings: iio: pressure: add binding for mpl3115
2025-09-25 20:45 [PATCH v2 0/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
@ 2025-09-25 20:45 ` Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 2/4] iio: mpl3115: use guards from cleanup.h Antoni Pokusinski
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Antoni Pokusinski @ 2025-09-25 20:45 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt
Cc: linux-kernel, devicetree, linux-iio, linux, rodrigo.gobbi.7,
naresh.solanki, michal.simek, grantpeltier93, farouk.bouabid,
marcelo.schmitt1, Antoni Pokusinski
MPL3115 is an I2C pressure and temperature sensor. It features 2
interrupt lines which can be configured to indicate events such as data
ready or pressure/temperature threshold reached.
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
.../bindings/iio/pressure/fsl,mpl3115.yaml | 71 +++++++++++++++++++
.../devicetree/bindings/trivial-devices.yaml | 2 -
2 files changed, 71 insertions(+), 2 deletions(-)
create mode 100644 Documentation/devicetree/bindings/iio/pressure/fsl,mpl3115.yaml
diff --git a/Documentation/devicetree/bindings/iio/pressure/fsl,mpl3115.yaml b/Documentation/devicetree/bindings/iio/pressure/fsl,mpl3115.yaml
new file mode 100644
index 000000000000..2933c2e10695
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/pressure/fsl,mpl3115.yaml
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/pressure/fsl,mpl3115.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MPL3115 precision pressure sensor with altimetry
+
+maintainers:
+ - Antoni Pokusinski <apokusinski01@gmail.com>
+
+description: |
+ MPL3115 is a pressure/altitude and temperature sensor with I2C interface.
+ It features two programmable interrupt lines which indicate events such as
+ data ready or pressure/temperature threshold reached.
+ https://www.nxp.com/docs/en/data-sheet/MPL3115A2.pdf
+
+properties:
+ compatible:
+ const: fsl,mpl3115
+
+ reg:
+ maxItems: 1
+
+ vdd-supply: true
+
+ vddio-supply: true
+
+ interrupts:
+ minItems: 1
+ maxItems: 2
+
+ interrupt-names:
+ minItems: 1
+ maxItems: 2
+ items:
+ enum:
+ - INT1
+ - INT2
+
+ drive-open-drain:
+ type: boolean
+ description:
+ set if the specified interrupt pins should be configured as
+ open drain. If not set, defaults to push-pull.
+
+required:
+ - compatible
+ - reg
+ - vdd-supply
+ - vddio-supply
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ pressure@60 {
+ compatible = "fsl,mpl3115";
+ reg = <0x60>;
+ vdd-supply = <&vdd>;
+ vddio-supply = <&vddio>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
+ interrupt-names = "INT2";
+ };
+ };
diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
index f3dd18681aa6..918d4a12d61c 100644
--- a/Documentation/devicetree/bindings/trivial-devices.yaml
+++ b/Documentation/devicetree/bindings/trivial-devices.yaml
@@ -113,8 +113,6 @@ properties:
- fsl,mma7660
# MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
- fsl,mma8450
- # MPL3115: Absolute Digital Pressure Sensor
- - fsl,mpl3115
# MPR121: Proximity Capacitive Touch Sensor Controller
- fsl,mpr121
# Honeywell Humidicon HIH-6130 humidity/temperature sensor
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 2/4] iio: mpl3115: use guards from cleanup.h
2025-09-25 20:45 [PATCH v2 0/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 1/4] dt-bindings: iio: pressure: add binding for mpl3115 Antoni Pokusinski
@ 2025-09-25 20:45 ` Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 3/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency Antoni Pokusinski
3 siblings, 0 replies; 7+ messages in thread
From: Antoni Pokusinski @ 2025-09-25 20:45 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt
Cc: linux-kernel, devicetree, linux-iio, linux, rodrigo.gobbi.7,
naresh.solanki, michal.simek, grantpeltier93, farouk.bouabid,
marcelo.schmitt1, Antoni Pokusinski
Include linux/cleanup.h and use the scoped_guard() to simplify the code.
Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
drivers/iio/pressure/mpl3115.c | 42 +++++++++++++++-------------------
1 file changed, 19 insertions(+), 23 deletions(-)
diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
index 579da60ef441..80af672f65c6 100644
--- a/drivers/iio/pressure/mpl3115.c
+++ b/drivers/iio/pressure/mpl3115.c
@@ -10,14 +10,16 @@
* interrupts, user offset correction, raw mode
*/
-#include <linux/module.h>
+#include <linux/cleanup.h>
+#include <linux/delay.h>
#include <linux/i2c.h>
+#include <linux/module.h>
+
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/buffer.h>
#include <linux/iio/triggered_buffer.h>
-#include <linux/delay.h>
#define MPL3115_STATUS 0x00
#define MPL3115_OUT_PRESS 0x01 /* MSB first, 20 bit */
@@ -163,32 +165,26 @@ static irqreturn_t mpl3115_trigger_handler(int irq, void *p)
u8 buffer[16] __aligned(8) = { };
int ret, pos = 0;
- mutex_lock(&data->lock);
- ret = mpl3115_request(data);
- if (ret < 0) {
- mutex_unlock(&data->lock);
- goto done;
- }
-
- if (test_bit(0, indio_dev->active_scan_mask)) {
- ret = i2c_smbus_read_i2c_block_data(data->client,
- MPL3115_OUT_PRESS, 3, &buffer[pos]);
- if (ret < 0) {
- mutex_unlock(&data->lock);
+ scoped_guard(mutex, &data->lock) {
+ ret = mpl3115_request(data);
+ if (ret < 0)
goto done;
+
+ if (test_bit(0, indio_dev->active_scan_mask)) {
+ ret = i2c_smbus_read_i2c_block_data(data->client,
+ MPL3115_OUT_PRESS, 3, &buffer[pos]);
+ if (ret < 0)
+ goto done;
+ pos += 4;
}
- pos += 4;
- }
- if (test_bit(1, indio_dev->active_scan_mask)) {
- ret = i2c_smbus_read_i2c_block_data(data->client,
- MPL3115_OUT_TEMP, 2, &buffer[pos]);
- if (ret < 0) {
- mutex_unlock(&data->lock);
- goto done;
+ if (test_bit(1, indio_dev->active_scan_mask)) {
+ ret = i2c_smbus_read_i2c_block_data(data->client,
+ MPL3115_OUT_TEMP, 2, &buffer[pos]);
+ if (ret < 0)
+ goto done;
}
}
- mutex_unlock(&data->lock);
iio_push_to_buffers_with_ts(indio_dev, buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 3/4] iio: mpl3115: add support for DRDY interrupt
2025-09-25 20:45 [PATCH v2 0/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 1/4] dt-bindings: iio: pressure: add binding for mpl3115 Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 2/4] iio: mpl3115: use guards from cleanup.h Antoni Pokusinski
@ 2025-09-25 20:45 ` Antoni Pokusinski
2025-09-25 20:45 ` [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency Antoni Pokusinski
3 siblings, 0 replies; 7+ messages in thread
From: Antoni Pokusinski @ 2025-09-25 20:45 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt
Cc: linux-kernel, devicetree, linux-iio, linux, rodrigo.gobbi.7,
naresh.solanki, michal.simek, grantpeltier93, farouk.bouabid,
marcelo.schmitt1, Antoni Pokusinski
MPL3115 sensor features a "data ready" interrupt which indicates the
presence of new measurements.
Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
drivers/iio/pressure/mpl3115.c | 197 ++++++++++++++++++++++++++++++---
1 file changed, 184 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
index 80af672f65c6..13c8b338a15e 100644
--- a/drivers/iio/pressure/mpl3115.c
+++ b/drivers/iio/pressure/mpl3115.c
@@ -7,49 +7,77 @@
* (7-bit I2C slave address 0x60)
*
* TODO: FIFO buffer, altimeter mode, oversampling, continuous mode,
- * interrupts, user offset correction, raw mode
+ * user offset correction, raw mode
*/
#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/module.h>
+#include <linux/property.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/buffer.h>
#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger.h>
#define MPL3115_STATUS 0x00
#define MPL3115_OUT_PRESS 0x01 /* MSB first, 20 bit */
#define MPL3115_OUT_TEMP 0x04 /* MSB first, 12 bit */
#define MPL3115_WHO_AM_I 0x0c
+#define MPL3115_INT_SOURCE 0x12
+#define MPL3115_PT_DATA_CFG 0x13
#define MPL3115_CTRL_REG1 0x26
+#define MPL3115_CTRL_REG3 0x28
+#define MPL3115_CTRL_REG4 0x29
+#define MPL3115_CTRL_REG5 0x2a
#define MPL3115_DEVICE_ID 0xc4
#define MPL3115_STATUS_PRESS_RDY BIT(2)
#define MPL3115_STATUS_TEMP_RDY BIT(1)
-#define MPL3115_CTRL_RESET BIT(2) /* software reset */
-#define MPL3115_CTRL_OST BIT(1) /* initiate measurement */
-#define MPL3115_CTRL_ACTIVE BIT(0) /* continuous measurement */
-#define MPL3115_CTRL_OS_258MS (BIT(5) | BIT(4)) /* 64x oversampling */
+#define MPL3115_INT_SRC_DRDY BIT(7)
+
+#define MPL3115_PT_DATA_EVENT_ALL GENMASK(2, 0)
+
+#define MPL3115_CTRL1_RESET BIT(2) /* software reset */
+#define MPL3115_CTRL1_OST BIT(1) /* initiate measurement */
+#define MPL3115_CTRL1_ACTIVE BIT(0) /* continuous measurement */
+#define MPL3115_CTRL1_OS_258MS GENMASK(5, 4) /* 64x oversampling */
+
+#define MPL3115_CTRL3_IPOL1 BIT(5)
+#define MPL3115_CTRL3_IPOL2 BIT(1)
+
+#define MPL3115_CTRL4_INT_EN_DRDY BIT(7)
+
+#define MPL3115_CTRL5_INT_CFG_DRDY BIT(7)
+
+#define MPL3115_INT2 BIT(2) /* flag that indicates INT2 in use */
struct mpl3115_data {
struct i2c_client *client;
+ struct iio_trigger *drdy_trig;
struct mutex lock;
u8 ctrl_reg1;
};
+enum mpl3115_irq_type {
+ INT2_ACTIVE_LOW = MPL3115_INT2 | IRQF_TRIGGER_FALLING,
+ INT2_ACTIVE_HIGH = MPL3115_INT2 | IRQF_TRIGGER_RISING,
+ INT1_ACTIVE_LOW = (!MPL3115_INT2) | IRQF_TRIGGER_FALLING,
+ INT1_ACTIVE_HIGH = (!MPL3115_INT2) | IRQF_TRIGGER_RISING,
+};
+
static int mpl3115_request(struct mpl3115_data *data)
{
int ret, tries = 15;
/* trigger measurement */
ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG1,
- data->ctrl_reg1 | MPL3115_CTRL_OST);
+ data->ctrl_reg1 | MPL3115_CTRL1_OST);
if (ret < 0)
return ret;
@@ -58,7 +86,7 @@ static int mpl3115_request(struct mpl3115_data *data)
if (ret < 0)
return ret;
/* wait for data ready, i.e. OST cleared */
- if (!(ret & MPL3115_CTRL_OST))
+ if (!(ret & MPL3115_CTRL1_OST))
break;
msleep(20);
}
@@ -166,9 +194,11 @@ static irqreturn_t mpl3115_trigger_handler(int irq, void *p)
int ret, pos = 0;
scoped_guard(mutex, &data->lock) {
- ret = mpl3115_request(data);
- if (ret < 0)
- goto done;
+ if (!(data->ctrl_reg1 & MPL3115_CTRL1_ACTIVE)) {
+ ret = mpl3115_request(data);
+ if (ret < 0)
+ goto done;
+ }
if (test_bit(0, indio_dev->active_scan_mask)) {
ret = i2c_smbus_read_i2c_block_data(data->client,
@@ -224,10 +254,147 @@ static const struct iio_chan_spec mpl3115_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(2),
};
+static irqreturn_t mpl3115_interrupt_handler(int irq, void *private)
+{
+ struct iio_dev *indio_dev = private;
+ struct mpl3115_data *data = iio_priv(indio_dev);
+ int ret;
+
+ ret = i2c_smbus_read_byte_data(data->client, MPL3115_INT_SOURCE);
+ if (ret < 0)
+ return IRQ_HANDLED;
+
+ if (!(ret & MPL3115_INT_SRC_DRDY))
+ return IRQ_NONE;
+
+ iio_trigger_poll_nested(data->drdy_trig);
+
+ return IRQ_HANDLED;
+}
+
+static int mpl3115_set_trigger_state(struct iio_trigger *trig, bool state)
+{
+ struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
+ struct mpl3115_data *data = iio_priv(indio_dev);
+ int ret;
+ u8 ctrl_reg1 = data->ctrl_reg1;
+
+ if (state)
+ ctrl_reg1 |= MPL3115_CTRL1_ACTIVE;
+ else
+ ctrl_reg1 &= ~MPL3115_CTRL1_ACTIVE;
+
+ guard(mutex)(&data->lock);
+
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG1,
+ ctrl_reg1);
+ if (ret < 0)
+ return ret;
+
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG4,
+ state ? MPL3115_CTRL4_INT_EN_DRDY : 0);
+ if (ret < 0)
+ goto reg1_cleanup;
+
+ data->ctrl_reg1 = ctrl_reg1;
+
+ return 0;
+
+reg1_cleanup:
+ i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG1,
+ data->ctrl_reg1);
+ return ret;
+}
+
+static const struct iio_trigger_ops mpl3115_trigger_ops = {
+ .set_trigger_state = mpl3115_set_trigger_state,
+};
+
static const struct iio_info mpl3115_info = {
.read_raw = &mpl3115_read_raw,
};
+static int mpl3115_trigger_probe(struct mpl3115_data *data,
+ struct iio_dev *indio_dev)
+{
+ struct fwnode_handle *fwnode = dev_fwnode(&data->client->dev);
+ int ret, irq, irq_type, irq_cfg_flags = 0;
+
+ irq = fwnode_irq_get_byname(fwnode, "INT1");
+ if (irq < 0) {
+ irq = fwnode_irq_get_byname(fwnode, "INT2");
+ if (irq < 0)
+ return 0;
+
+ irq_cfg_flags |= MPL3115_INT2;
+ }
+
+ irq_type = irq_get_trigger_type(irq);
+ if (irq_type != IRQF_TRIGGER_RISING && irq_type != IRQF_TRIGGER_FALLING)
+ return -EINVAL;
+
+ irq_cfg_flags |= irq_type;
+
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_PT_DATA_CFG,
+ MPL3115_PT_DATA_EVENT_ALL);
+ if (ret < 0)
+ return ret;
+
+ switch (irq_cfg_flags) {
+ case INT2_ACTIVE_HIGH:
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG3,
+ MPL3115_CTRL3_IPOL2);
+ if (ret)
+ return ret;
+
+ break;
+ case INT2_ACTIVE_LOW:
+ break;
+ case INT1_ACTIVE_HIGH:
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG5,
+ MPL3115_CTRL5_INT_CFG_DRDY);
+ if (ret)
+ return ret;
+
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG3,
+ MPL3115_CTRL3_IPOL1);
+ if (ret)
+ return ret;
+
+ break;
+ case INT1_ACTIVE_LOW:
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG5,
+ MPL3115_CTRL5_INT_CFG_DRDY);
+ if (ret)
+ return ret;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ data->drdy_trig = devm_iio_trigger_alloc(&data->client->dev,
+ "%s-dev%d",
+ indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!data->drdy_trig)
+ return -ENOMEM;
+
+ data->drdy_trig->ops = &mpl3115_trigger_ops;
+ iio_trigger_set_drvdata(data->drdy_trig, indio_dev);
+ ret = devm_iio_trigger_register(&data->client->dev, data->drdy_trig);
+ if (ret)
+ return ret;
+
+ indio_dev->trig = iio_trigger_get(data->drdy_trig);
+
+ return devm_request_threaded_irq(&data->client->dev, irq,
+ NULL,
+ mpl3115_interrupt_handler,
+ IRQF_ONESHOT,
+ "mpl3115_irq",
+ indio_dev);
+}
+
static int mpl3115_probe(struct i2c_client *client)
{
const struct i2c_device_id *id = i2c_client_get_device_id(client);
@@ -258,15 +425,19 @@ static int mpl3115_probe(struct i2c_client *client)
/* software reset, I2C transfer is aborted (fails) */
i2c_smbus_write_byte_data(client, MPL3115_CTRL_REG1,
- MPL3115_CTRL_RESET);
+ MPL3115_CTRL1_RESET);
msleep(50);
- data->ctrl_reg1 = MPL3115_CTRL_OS_258MS;
+ data->ctrl_reg1 = MPL3115_CTRL1_OS_258MS;
ret = i2c_smbus_write_byte_data(client, MPL3115_CTRL_REG1,
data->ctrl_reg1);
if (ret < 0)
return ret;
+ ret = mpl3115_trigger_probe(data, indio_dev);
+ if (ret)
+ return ret;
+
ret = iio_triggered_buffer_setup(indio_dev, NULL,
mpl3115_trigger_handler, NULL);
if (ret < 0)
@@ -285,7 +456,7 @@ static int mpl3115_probe(struct i2c_client *client)
static int mpl3115_standby(struct mpl3115_data *data)
{
return i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG1,
- data->ctrl_reg1 & ~MPL3115_CTRL_ACTIVE);
+ data->ctrl_reg1 & ~MPL3115_CTRL1_ACTIVE);
}
static void mpl3115_remove(struct i2c_client *client)
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency
2025-09-25 20:45 [PATCH v2 0/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
` (2 preceding siblings ...)
2025-09-25 20:45 ` [PATCH v2 3/4] iio: mpl3115: add support for DRDY interrupt Antoni Pokusinski
@ 2025-09-25 20:45 ` Antoni Pokusinski
2025-09-26 12:43 ` kernel test robot
2025-09-26 14:57 ` Antoni Pokusinski
3 siblings, 2 replies; 7+ messages in thread
From: Antoni Pokusinski @ 2025-09-25 20:45 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt
Cc: linux-kernel, devicetree, linux-iio, linux, rodrigo.gobbi.7,
naresh.solanki, michal.simek, grantpeltier93, farouk.bouabid,
marcelo.schmitt1, Antoni Pokusinski
When the device is in ACTIVE mode the temperature and pressure measurements
are collected with a frequency determined by the ST[3:0] bits of CTRL_REG2
register.
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
---
drivers/iio/pressure/mpl3115.c | 81 ++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
index 13c8b338a15e..b854732e61cb 100644
--- a/drivers/iio/pressure/mpl3115.c
+++ b/drivers/iio/pressure/mpl3115.c
@@ -30,6 +30,7 @@
#define MPL3115_INT_SOURCE 0x12
#define MPL3115_PT_DATA_CFG 0x13
#define MPL3115_CTRL_REG1 0x26
+#define MPL3115_CTRL_REG2 0x27
#define MPL3115_CTRL_REG3 0x28
#define MPL3115_CTRL_REG4 0x29
#define MPL3115_CTRL_REG5 0x2a
@@ -48,6 +49,8 @@
#define MPL3115_CTRL1_ACTIVE BIT(0) /* continuous measurement */
#define MPL3115_CTRL1_OS_258MS GENMASK(5, 4) /* 64x oversampling */
+#define MPL3115_CTRL2_ST GENMASK(3, 0)
+
#define MPL3115_CTRL3_IPOL1 BIT(5)
#define MPL3115_CTRL3_IPOL2 BIT(1)
@@ -57,6 +60,25 @@
#define MPL3115_INT2 BIT(2) /* flag that indicates INT2 in use */
+static const unsigned int mpl3115_samp_freq_table[][2] = {
+ { 1, 0},
+ { 0, 500000},
+ { 0, 250000},
+ { 0, 125000},
+ { 0, 62500},
+ { 0, 31250},
+ { 0, 15625},
+ { 0, 7812},
+ { 0, 3906},
+ { 0, 1953},
+ { 0, 976},
+ { 0, 488},
+ { 0, 244},
+ { 0, 122},
+ { 0, 61},
+ { 0, 30},
+};
+
struct mpl3115_data {
struct i2c_client *client;
struct iio_trigger *drdy_trig;
@@ -174,10 +196,61 @@ static int mpl3115_read_raw(struct iio_dev *indio_dev,
default:
return -EINVAL;
}
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ ret = i2c_smbus_read_byte_data(data->client, MPL3115_CTRL_REG2);
+ if (ret < 0)
+ return ret;
+
+ ret = FIELD_GET(MPL3115_CTRL2_ST, ret);
+
+ *val = mpl3115_samp_freq_table[ret][0];
+ *val2 = mpl3115_samp_freq_table[ret][1];
+ return IIO_VAL_INT_PLUS_MICRO;
}
return -EINVAL;
}
+static int mpl3115_read_avail(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ const int **vals, int *type, int *length,
+ long mask)
+{
+ if (mask != IIO_CHAN_INFO_SAMP_FREQ)
+ return -EINVAL;
+
+ *type = IIO_VAL_INT_PLUS_MICRO;
+ *length = ARRAY_SIZE(mpl3115_samp_freq_table) * 2;
+ *vals = (int *)mpl3115_samp_freq_table;
+ return IIO_AVAIL_LIST;
+}
+
+static int mpl3115_write_raw(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ int val, int val2, long mask)
+{
+ struct mpl3115_data *data = iio_priv(indio_dev);
+ int i, ret;
+
+ if (mask != IIO_CHAN_INFO_SAMP_FREQ)
+ return -EINVAL;
+
+ for (i = 0; i < ARRAY_SIZE(mpl3115_samp_freq_table); i++)
+ if (val == mpl3115_samp_freq_table[i][0] &&
+ val2 == mpl3115_samp_freq_table[i][1])
+ break;
+
+ if (i == ARRAY_SIZE(mpl3115_samp_freq_table))
+ return -EINVAL;
+
+ if (!iio_device_claim_direct(indio_dev))
+ return -EBUSY;
+
+ ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG2,
+ FIELD_PREP(MPL3115_CTRL2_ST, i));
+ iio_device_release_direct(indio_dev);
+ return ret;
+}
+
static irqreturn_t mpl3115_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -229,6 +302,9 @@ static const struct iio_chan_spec mpl3115_channels[] = {
.type = IIO_PRESSURE,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+ .info_mask_shared_by_all_available =
+ BIT(IIO_CHAN_INFO_SAMP_FREQ),
.scan_index = 0,
.scan_type = {
.sign = 'u',
@@ -242,6 +318,9 @@ static const struct iio_chan_spec mpl3115_channels[] = {
.type = IIO_TEMP,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+ .info_mask_shared_by_all_available =
+ BIT(IIO_CHAN_INFO_SAMP_FREQ),
.scan_index = 1,
.scan_type = {
.sign = 's',
@@ -312,6 +391,8 @@ static const struct iio_trigger_ops mpl3115_trigger_ops = {
static const struct iio_info mpl3115_info = {
.read_raw = &mpl3115_read_raw,
+ .read_avail = &mpl3115_read_avail,
+ .write_raw = &mpl3115_write_raw,
};
static int mpl3115_trigger_probe(struct mpl3115_data *data,
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency
2025-09-25 20:45 ` [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency Antoni Pokusinski
@ 2025-09-26 12:43 ` kernel test robot
2025-09-26 14:57 ` Antoni Pokusinski
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2025-09-26 12:43 UTC (permalink / raw)
To: Antoni Pokusinski, jic23, dlechner, nuno.sa, andy, robh, krzk+dt,
conor+dt
Cc: llvm, oe-kbuild-all, linux-kernel, devicetree, linux-iio, linux,
rodrigo.gobbi.7, naresh.solanki, michal.simek, grantpeltier93,
farouk.bouabid, marcelo.schmitt1, Antoni Pokusinski
Hi Antoni,
kernel test robot noticed the following build errors:
[auto build test ERROR on jic23-iio/togreg]
[also build test ERROR on robh/for-next linus/master v6.17-rc7 next-20250925]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Antoni-Pokusinski/dt-bindings-iio-pressure-add-binding-for-mpl3115/20250926-044905
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link: https://lore.kernel.org/r/20250925204538.63723-5-apokusinski01%40gmail.com
patch subject: [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency
config: i386-buildonly-randconfig-001-20250926 (https://download.01.org/0day-ci/archive/20250926/202509262005.y59poUS9-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250926/202509262005.y59poUS9-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509262005.y59poUS9-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/iio/pressure/mpl3115.c:204:9: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
204 | ret = FIELD_GET(MPL3115_CTRL2_ST, ret);
| ^
>> drivers/iio/pressure/mpl3115.c:249:6: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
249 | FIELD_PREP(MPL3115_CTRL2_ST, i));
| ^
2 errors generated.
vim +/FIELD_GET +204 drivers/iio/pressure/mpl3115.c
169
170 static int mpl3115_read_raw(struct iio_dev *indio_dev,
171 struct iio_chan_spec const *chan,
172 int *val, int *val2, long mask)
173 {
174 struct mpl3115_data *data = iio_priv(indio_dev);
175 int ret;
176
177 switch (mask) {
178 case IIO_CHAN_INFO_RAW:
179 if (!iio_device_claim_direct(indio_dev))
180 return -EBUSY;
181
182 ret = mpl3115_read_info_raw(data, chan, val);
183 iio_device_release_direct(indio_dev);
184 return ret;
185
186 case IIO_CHAN_INFO_SCALE:
187 switch (chan->type) {
188 case IIO_PRESSURE:
189 *val = 0;
190 *val2 = 250; /* want kilopascal */
191 return IIO_VAL_INT_PLUS_MICRO;
192 case IIO_TEMP:
193 *val = 0;
194 *val2 = 62500;
195 return IIO_VAL_INT_PLUS_MICRO;
196 default:
197 return -EINVAL;
198 }
199 case IIO_CHAN_INFO_SAMP_FREQ:
200 ret = i2c_smbus_read_byte_data(data->client, MPL3115_CTRL_REG2);
201 if (ret < 0)
202 return ret;
203
> 204 ret = FIELD_GET(MPL3115_CTRL2_ST, ret);
205
206 *val = mpl3115_samp_freq_table[ret][0];
207 *val2 = mpl3115_samp_freq_table[ret][1];
208 return IIO_VAL_INT_PLUS_MICRO;
209 }
210 return -EINVAL;
211 }
212
213 static int mpl3115_read_avail(struct iio_dev *indio_dev,
214 struct iio_chan_spec const *chan,
215 const int **vals, int *type, int *length,
216 long mask)
217 {
218 if (mask != IIO_CHAN_INFO_SAMP_FREQ)
219 return -EINVAL;
220
221 *type = IIO_VAL_INT_PLUS_MICRO;
222 *length = ARRAY_SIZE(mpl3115_samp_freq_table) * 2;
223 *vals = (int *)mpl3115_samp_freq_table;
224 return IIO_AVAIL_LIST;
225 }
226
227 static int mpl3115_write_raw(struct iio_dev *indio_dev,
228 const struct iio_chan_spec *chan,
229 int val, int val2, long mask)
230 {
231 struct mpl3115_data *data = iio_priv(indio_dev);
232 int i, ret;
233
234 if (mask != IIO_CHAN_INFO_SAMP_FREQ)
235 return -EINVAL;
236
237 for (i = 0; i < ARRAY_SIZE(mpl3115_samp_freq_table); i++)
238 if (val == mpl3115_samp_freq_table[i][0] &&
239 val2 == mpl3115_samp_freq_table[i][1])
240 break;
241
242 if (i == ARRAY_SIZE(mpl3115_samp_freq_table))
243 return -EINVAL;
244
245 if (!iio_device_claim_direct(indio_dev))
246 return -EBUSY;
247
248 ret = i2c_smbus_write_byte_data(data->client, MPL3115_CTRL_REG2,
> 249 FIELD_PREP(MPL3115_CTRL2_ST, i));
250 iio_device_release_direct(indio_dev);
251 return ret;
252 }
253
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency
2025-09-25 20:45 ` [PATCH v2 4/4] iio: mpl3115: add support for sampling frequency Antoni Pokusinski
2025-09-26 12:43 ` kernel test robot
@ 2025-09-26 14:57 ` Antoni Pokusinski
1 sibling, 0 replies; 7+ messages in thread
From: Antoni Pokusinski @ 2025-09-26 14:57 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt
Cc: linux-kernel, devicetree, linux-iio, linux, rodrigo.gobbi.7,
naresh.solanki, michal.simek, grantpeltier93, farouk.bouabid,
marcelo.schmitt1
On Thu, Sep 25, 2025 at 10:45:38PM +0200, Antoni Pokusinski wrote:
> When the device is in ACTIVE mode the temperature and pressure measurements
> are collected with a frequency determined by the ST[3:0] bits of CTRL_REG2
> register.
>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Antoni Pokusinski <apokusinski01@gmail.com>
> ---
> drivers/iio/pressure/mpl3115.c | 81 ++++++++++++++++++++++++++++++++++
> 1 file changed, 81 insertions(+)
>
> diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
> index 13c8b338a15e..b854732e61cb 100644
> --- a/drivers/iio/pressure/mpl3115.c
> +++ b/drivers/iio/pressure/mpl3115.c
> @@ -30,6 +30,7 @@
The errors are due to missing include of bitfield.h, will add it in v3
> #define MPL3115_INT_SOURCE 0x12
> #define MPL3115_PT_DATA_CFG 0x13
> #define MPL3115_CTRL_REG1 0x26
> +#define MPL3115_CTRL_REG2 0x27
> #define MPL3115_CTRL_REG3 0x28
> #define MPL3115_CTRL_REG4 0x29
> #define MPL3115_CTRL_REG5 0x2a
> @@ -48,6 +49,8 @@
> 2.25.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread