[PATCH v5 0/11] iio: adc: hx711: add HX710B support

Piyush Patle
2026-04-29T05:45:52Z

Add support for the AVIA HX710B ADC, a HX711-compatible converter with
the same GPIO interface but a different channel-selection model and a
fixed gain of 128.

Compared to v4, this series is split more finely to match the review
boundaries requested during review rather than because the feature
itself grew materially:

- the DT binding work is now split into cleanup of the existing HX711
binding, HX711-only VSUP documentation, HX711-only RATE GPIO
documentation, and the HX710B binding addition
- the driver refactoring is now split further so the trailing-pulse
parameterization, loop-iterator cleanup, and hx711_reset() declaration
cleanup all stand alone
- the Kconfig help text, file header, and MODULE_DESCRIPTION updates now
sit adjacent to the final HX710B support patch instead of appearing in
the middle of the refactor sequence

The resulting series is longer than v4, but each patch is narrower and
maps more directly to the requested review boundaries.

Tested on PocketBeagle2 with an HX710B breakout module. The device
probed successfully, all three channels returned stable raw readings,
and alternating reads confirmed channel switching between the
differential input and the DVDD-AVDD supply monitor path.

Build-tested with:
- make -s W=1 drivers/iio/adc/hx711.o
- make -s dt_binding_check \
DT_SCHEMA_FILES=Documentation/devicetree/bindings/iio/adc/avia-hx711.yaml
- pahole -C hx711_chip_info drivers/iio/adc/hx711.o

pahole reports hx711_chip_info as 40 bytes with no internal holes. The
remaining 7 bytes are tail padding from 8-byte pointer alignment.

Changes in v5:
- Split the old combined DT binding patch into four patches as requested
by Jonathan Cameron:
existing HX711 text cleanup, VSUP, RATE GPIO, and HX710B support.
- Keep the HX710B binding patch limited to the new variant-specific
properties and constraints.
- Require explicit vref-supply for HX710B nodes and use a single
if/then/else schema block for the HX710B versus HX711 constraints.
- Split the trailing-pulse refactor from the hx711_read() loop-iterator
cleanup.
- Add a standalone preparatory hx711_reset() variable-assignment cleanup
patch as requested.
- Move linux/array_size.h and linux/dev_printk.h to the chip_info patch,
and move linux/types.h to the final HX710B support patch where it is
first needed.
- Fold the Kconfig help text, file header, and MODULE_DESCRIPTION
updates into the final HX710B support patch so they stay adjacent to
the new hardware support change.
- Keep patch 10 as a standalone preparatory cleanup because Andy
Shevchenko explicitly asked for the hx711_reset() declaration and
assignment split before the later HX710B change adds another local
variable there.
- Add the preparatory rationale to the hx711_chip_info commit message
and use "missing driver data" for the NULL match-data guard.
- Do not carry the earlier DT Reviewed-by tag because the binding
changed materially again in v5.

Changes in v4:
- Fix the pre-existing global scale mutation bug (new patch 2 in v4,
now patch 5).
- Split the v3 driver refactor into smaller independent patches as
requested during review.
- Keep hx711_chip_info fields in their final order from introduction so
the HX710B patch only appends new fields without reordering existing
ones.
- Add vref-supply binding and driver support for the HX710B VREF pin.
- Add a third HX710B channel (27 pulses, differential 40 SPS) from
Table 3 of the datasheet.
- Use .channel = 2 for the supply monitor to avoid clashing with
.channel2 = 1 of the differential pair.
- Remove dvdd-supply from the HX710B forbidden list in the binding.
- Add the NULL guard on device_get_match_data().
- Fix checkpatch alignment in multi-line hx711_read() calls.

Changes in v3:
- Split the hx711_chip_info refactor from the HX710B feature patch.
- Fix signedness and update channel_set only after successful channel
switching.
- Keep HX710B scale based on the documented fixed gain of 128.
- Add direct ARRAY_SIZE/types includes where needed and use pahole to
verify hx711_chip_info layout.
- Rework Kconfig/header/module description wording for compatible ADCs.
- DT binding: restore the example node name to weight, drop the extra
HX710B example used earlier, and avoid repeating the clock-frequency
default text.

Changes in v2:
- DT binding: add dvdd-supply, vsup-supply, and rate-gpios; clarify
clock-frequency as SCK bit-bang timing; remove the dead vendor URL.
- Driver: fix the HX710B pulse-count bug ({25,26}->{1,2} trailing
pulses), move pulse counts to chan->address, add fixed-gain support,
and pass iio_chan_spec * directly where needed.

Piyush Patle (11):
dt-bindings: iio: adc: hx711: clean up existing binding text
dt-bindings: iio: adc: hx711: add VSUP supply property
dt-bindings: iio: adc: hx711: add RATE GPIO property
dt-bindings: iio: adc: hx711: add HX710B support
iio: adc: hx711: move scale computation to per-device storage
iio: adc: hx711: introduce hx711_chip_info structure
iio: adc: hx711: pass trailing pulse count into hx711_read
iio: adc: hx711: localize loop iterators in hx711_read
iio: adc: hx711: pass iio_chan_spec to hx711_reset_read
iio: adc: hx711: split hx711_reset variable assignment
iio: adc: hx711: add support for HX710B

.../bindings/iio/adc/avia-hx711.yaml | 77 ++++-
drivers/iio/adc/Kconfig | 8 +-
drivers/iio/adc/hx711.c | 296 ++++++++++++++----
3 files changed, 305 insertions(+), 76 deletions(-)

--
2.43.0