From: sashiko-bot@kernel.org
To: "Piyush Patle" <piyushpatle228@gmail.com>
Cc: conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org
Subject: Re: [PATCH v9 11/11] iio: adc: hx711: add support for HX710B
Date: Mon, 18 May 2026 22:39:26 +0000 [thread overview]
Message-ID: <20260518223926.C2BEEC2BCB8@smtp.kernel.org> (raw)
In-Reply-To: <20260518220228.63322-12-piyushpatle228@gmail.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] The trigger handler incorrectly performs physical ADC reads for the software timestamp channel.
- [Medium] Missing `iio_device_claim_direct_mode()` protection in the newly added `hx710b_write_raw()`.
- [Low] Data race on `samp_freq` when handling `IIO_CHAN_INFO_SAMP_FREQ` reads.
--
commit 63c1473f6788341d410e6d9c03f632bdcaeaf6df
Author: Piyush Patle <piyushpatle228@gmail.com>
iio: adc: hx711: add support for HX710B
This commit adds support for the AVIA HX710B ADC to the existing hx711
driver. It handles the different trailing pulse requirements and fixed
gain scaling, while exposing both 10 and 40 SPS sample rates.
> diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
> index 8ec4dee1f451e..20ea667af7254 100644
> --- a/drivers/iio/adc/hx711.c
> +++ b/drivers/iio/adc/hx711.c
[ ... ]
> @@ -323,6 +378,9 @@ static int hx711_read_raw(struct iio_dev *indio_dev,
> if (*val < 0)
> return *val;
> return IIO_VAL_INT;
> + case IIO_CHAN_INFO_SAMP_FREQ:
> + *val = hx711_data->samp_freq;
> + return IIO_VAL_INT;
Is there a potential data race here?
In hx710b_write_raw(), hx711_data->samp_freq is updated while holding
hx711_data->lock. Should this read also be protected by the same mutex to
ensure state consistency?
[ ... ]
> @@ -400,20 +458,26 @@ static irqreturn_t hx711_trigger(int irq, void *p)
> struct iio_dev *indio_dev = pf->indio_dev;
> struct hx711_data *hx711_data = iio_priv(indio_dev);
> int i, j = 0;
> + int ret;
>
> mutex_lock(&hx711_data->lock);
>
> - memset(&hx711_data->buffer, 0, sizeof(hx711_data->buffer));
> + memset(hx711_data->buffer, 0, sizeof(hx711_data->buffer));
>
> iio_for_each_active_channel(indio_dev, i) {
> - hx711_data->buffer.channel[j] =
> - hx711_reset_read(hx711_data, &indio_dev->channels[i]);
> - j++;
> + ret = hx711_reset_read(hx711_data, &indio_dev->channels[i]);
Does this loop incorrectly perform a physical ADC read for the software
timestamp channel when userspace enables it?
When the timestamp channel is enabled, its bit is set in active_scan_mask.
The iio_for_each_active_channel() macro will iterate over it, causing
hx711_reset_read() to execute for the timestamp channel.
For the HX710B variant, chan->differential evaluates to 0 for the timestamp
channel, which causes hx710b_trailing_pulses() to return 2 trailing pulses,
performing an unintentional read over the supply monitor channel.
For the HX711 variant, the timestamp channel sets chan->channel = -1.
hx711_set_gain_for_channel() then falls into the else branch (since -1 != 0),
changing the hardware to channel B and performing a dummy physical read.
In both cases, this forces the driver to wait for the ADC to settle on every
trigger event, which can severely impact the sampling rate. Should this loop
skip the timestamp channel (for example, by checking if the channel type is
IIO_TIMESTAMP)?
[ ... ]
> +static int hx710b_write_raw(struct iio_dev *indio_dev,
> + struct iio_chan_spec const *chan,
> + int val, int val2, long mask)
> +{
> + struct hx711_data *hx711_data = iio_priv(indio_dev);
> +
> + switch (mask) {
> + case IIO_CHAN_INFO_SAMP_FREQ:
> + if (val != 10 && val != 40)
> + return -EINVAL;
> + mutex_lock(&hx711_data->lock);
> + hx711_data->samp_freq = val;
> + hx711_data->channel_set = 0;
> + mutex_unlock(&hx711_data->lock);
> + return 0;
Does this implementation need to use iio_device_claim_direct_mode() to
prevent concurrent hardware changes while a buffered capture is active?
If userspace modifies the sampling frequency during an active IIO triggered
buffer capture, it resets channel_set to 0. This could alter the hardware
configuration (changing the trailing pulses) out from under the IIO capture
thread, which violates IIO concurrency semantics.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260518220228.63322-1-piyushpatle228@gmail.com?part=11
prev parent reply other threads:[~2026-05-18 22:39 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-18 22:02 [PATCH v9 00/11] iio: adc: Add support for AVIA HX710B ADC Piyush Patle
2026-05-18 22:02 ` [PATCH v9 01/11] dt-bindings: iio: adc: hx711: clean up existing binding text Piyush Patle
2026-05-18 22:02 ` [PATCH v9 02/11] dt-bindings: iio: adc: hx711: add VSUP supply property Piyush Patle
2026-05-18 22:02 ` [PATCH v9 03/11] dt-bindings: iio: adc: hx711: add RATE GPIO property Piyush Patle
2026-05-18 22:02 ` [PATCH v9 04/11] dt-bindings: iio: adc: hx711: add HX710B support Piyush Patle
2026-05-18 22:10 ` sashiko-bot
2026-05-19 17:21 ` Conor Dooley
2026-05-18 22:02 ` [PATCH v9 05/11] iio: adc: hx711: move scale computation to per-device storage Piyush Patle
2026-05-18 22:02 ` [PATCH v9 06/11] iio: adc: hx711: introduce hx711_chip_info structure Piyush Patle
2026-05-18 22:30 ` sashiko-bot
2026-05-18 22:02 ` [PATCH v9 07/11] iio: adc: hx711: pass trailing pulse count into hx711_read Piyush Patle
2026-05-18 22:02 ` [PATCH v9 08/11] iio: adc: hx711: split variable assignments in hx711_read and hx711_reset Piyush Patle
2026-05-18 22:02 ` [PATCH v9 09/11] iio: adc: hx711: localize loop iterators in hx711_read Piyush Patle
2026-05-18 22:02 ` [PATCH v9 10/11] iio: adc: hx711: pass iio_chan_spec to hx711_reset_read Piyush Patle
2026-05-18 22:41 ` sashiko-bot
2026-05-18 22:02 ` [PATCH v9 11/11] iio: adc: hx711: add support for HX710B Piyush Patle
2026-05-18 22:39 ` sashiko-bot [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=20260518223926.C2BEEC2BCB8@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=piyushpatle228@gmail.com \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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