From: Jonathan Cameron <jic23@kernel.org>
To: Muhammad Abu Bakar <m.abubakar365@yahoo.com>
Cc: Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/2] iio: pressure: add Sensirion SDP31 driver
Date: Sun, 27 Sep 2026 18:35:46 +0100 [thread overview]
Message-ID: <20260927183546.0260dc19@jic23-hlaptop> (raw)
In-Reply-To: <20260926154118.5471-3-m.abubakar365@yahoo.com>
On Sat, 26 Sep 2026 20:41:18 +0500
Muhammad Abu Bakar <m.abubakar365@yahoo.com> wrote:
> Add an IIO driver for the Sensirion SDP31 differential pressure sensor.
> The device is accessed over I2C and reports differential pressure and
> temperature. Each measurement is validated using the sensor's CRC-8
> checksum.
>
> Tested on an SDP31 connected to a Raspberry Pi 4 I2C bus.
>
> Signed-off-by: Muhammad Abu Bakar <m.abubakar365@yahoo.com>
Hi.
Given you are going to probably need to changes stuff in the dt binding
and so do a v4, various comments inline. Mostly optimization suggestions.
Jonathan
> st_pressure-y := st_pressure_core.o
> diff --git a/drivers/iio/pressure/sdp31.c b/drivers/iio/pressure/sdp31.c
> new file mode 100644
> index 000000000..fd7cac027
> --- /dev/null
> +++ b/drivers/iio/pressure/sdp31.c
> +static int sdp31_measure(struct sdp31_data *data, struct sdp31_reading *out)
> +{
> + u8 rx[9];
> + int ret;
> +
> + guard(mutex)(&data->lock);
> +
> + ret = sdp31_send_cmd(data->client, SDP31_CMD_TRIG_DP);
> + if (ret)
> + return ret;
> +
> + msleep(SDP31_MEAS_DELAY_MS);
> +
> + ret = i2c_master_recv(data->client, rx, sizeof(rx));
Given there is only a one time read of scale and that i2c is a rather
slow bus, can we do a short read when we only want the temperature
and pressure? The datasheet mentions Nack + stop is
sufficient to stop the read out sequence and that is IIRC the
normal end of an i2c read sequence. So it 'should' be fine to just
read fewer bytes.
> + if (ret < 0)
> + return ret;
> + if (ret != sizeof(rx))
> + return -EIO;
> +
> + if (sdp31_check_crc(&rx[0]) ||
> + sdp31_check_crc(&rx[3]) ||
> + sdp31_check_crc(&rx[6]))
> + return -EIO;
> +
> + out->pressure = (s16)get_unaligned_be16(&rx[0]);
> + out->temp = (s16)get_unaligned_be16(&rx[3]);
> + out->scale = get_unaligned_be16(&rx[6]);
> +
> + return 0;
> +}
> +
> +static int sdp31_probe(struct i2c_client *client)
> +{
> + struct device *dev = &client->dev;
> + struct iio_dev *indio_dev;
> + struct sdp31_data *data;
> + struct sdp31_reading r;
> + int ret;
> +
> + ret = devm_regulator_get_enable(dev, "vdd");
> + if (ret)
> + return dev_err_probe(dev, ret, "failed to enable regulator\n");
> +
> + /* Wait for the sensor to be ready after power-up (datasheet t_PU). */
> + msleep(SDP31_POWERUP_TIME_MS);
> +
> + indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
> + if (!indio_dev)
> + return -ENOMEM;
> +
> + data = iio_priv(indio_dev);
> + data->client = client;
> +
> + ret = devm_mutex_init(dev, &data->lock);
> + if (ret)
> + return ret;
> +
> + /* The CRC table is shared by all instances; initialise it once. */
I would argue that is obvious, so no comment needed.
> + DO_ONCE(crc8_populate_msb, sdp31_crc8_table, SDP31_CRC8_POLY);
> +
> + /* Confirm the sensor is present and learn its scale factor. */
If you end up with with a specific call to get the scale factor this
comment will become excessive (see below).
> + ret = sdp31_measure(data, &r);
> + if (ret)
> + return dev_err_probe(dev, ret, "failed to read from sensor\n");
> + if (!r.scale)
> + return dev_err_probe(dev, -EINVAL, "invalid scale factor\n");
See above. This is the only time we actually read the scale - so perhaps
we can save some traffic on every other access. Most likely that would give
you a different command for this scale read back.
> + data->dp_scale = r.scale;
> +
> + indio_dev->name = "sdp31";
> + indio_dev->info = &sdp31_info;
> + indio_dev->modes = INDIO_DIRECT_MODE;
> + indio_dev->channels = sdp31_channels;
> + indio_dev->num_channels = ARRAY_SIZE(sdp31_channels);
> +
> + return devm_iio_device_register(dev, indio_dev);
> +}
prev parent reply other threads:[~2026-09-27 17:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20260926154118.5471-1-m.abubakar365.ref@yahoo.com>
2026-09-26 15:41 ` [PATCH v3 0/2] " Muhammad Abu Bakar
2026-09-26 15:41 ` [PATCH v3 1/2] dt-bindings: iio: pressure: add Sensirion SDP31 Muhammad Abu Bakar
2026-09-27 17:24 ` Jonathan Cameron
2026-09-26 15:41 ` [PATCH v3 2/2] iio: pressure: add Sensirion SDP31 driver Muhammad Abu Bakar
2026-09-27 17:35 ` Jonathan Cameron [this message]
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=20260927183546.0260dc19@jic23-hlaptop \
--to=jic23@kernel.org \
--cc=andy@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=krzk+dt@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m.abubakar365@yahoo.com \
--cc=nuno.sa@analog.com \
--cc=robh@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
all inboxes | Powered by JetHome®