Re: [PATCH v8 v8 06/11] iio: adc: hx711: introduce hx711_chip_info structure
From: Jonathan Cameron
Date: Tue May 12 2026 - 08:21:18 EST
On Mon, 11 May 2026 23:13:31 +0530
Piyush Patle <piyushpatle228@xxxxxxxxx> wrote:
> Add a per-variant static configuration structure and populate the IIO
> device fields from it at probe time.
>
> This is a preparatory change for adding support for more HX711-compatible
> hardware variants without duplicating the probe-time setup.
>
> No functional change for existing HX711 users.
>
> Signed-off-by: Piyush Patle <piyushpatle228@xxxxxxxxx>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxx>
Mostly for my reference when v8 sashiko comes in - there was feedback on this
in v7 but it was something we don't care about - in a driver that supports
multiple parts - if someone is using the legacy path to force a driver match
we can't do the right thing - guessing it is an hx711 is not appropriate.
Given it is vanishingly unlikely (famous last words) anyone is using that
path with a device like this one (who isn't a developer who can easily fix
that) let us merge this and see if anyone screams before trying to
deal with that case.
I'm going to hold off for now though as waiting on v8 sashiko review of the
rest of the series.
Jonathan
> ---
> drivers/iio/adc/hx711.c | 41 ++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 36 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
> index 86d2a70dd3de..10ccc69f209b 100644
> --- a/drivers/iio/adc/hx711.c
> +++ b/drivers/iio/adc/hx711.c
> @@ -4,6 +4,8 @@
> *
> * Copyright (c) 2016 Andreas Klinger <ak@xxxxxxxxxxxxx>
> */
> +#include <linux/array_size.h>
> +#include <linux/dev_printk.h>
> #include <linux/err.h>
> #include <linux/kernel.h>
> #include <linux/module.h>
> @@ -74,6 +76,20 @@ static int hx711_get_scale_to_gain(const int *gain_scale, int scale)
> return -EINVAL;
> }
>
> +/**
> + * struct hx711_chip_info - per-variant static configuration
> + * @name: IIO device name
> + * @channels: channel specification array
> + * @num_channels: number of entries in @channels
> + * @iio_info: IIO info ops for this variant
> + */
> +struct hx711_chip_info {
> + const char *name;
> + const struct iio_chan_spec *channels __counted_by_ptr(num_channels);
> + unsigned int num_channels;
> + const struct iio_info *iio_info;
> +};
> +
> struct hx711_data {
> struct device *dev;
> struct gpio_desc *gpiod_pd_sck;
> @@ -81,6 +97,7 @@ struct hx711_data {
> int gain_set; /* gain set on device */
> int gain_chan_a; /* gain for channel A */
> int gain_scale[HX711_GAIN_MAX];
> + const struct hx711_chip_info *chip_info;
> struct mutex lock;
> /*
> * triggered buffer
> @@ -456,8 +473,16 @@ static const struct iio_chan_spec hx711_chan_spec[] = {
> IIO_CHAN_SOFT_TIMESTAMP(2),
> };
>
> +static const struct hx711_chip_info hx711_chip = {
> + .name = "hx711",
> + .channels = hx711_chan_spec,
> + .iio_info = &hx711_iio_info,
> + .num_channels = ARRAY_SIZE(hx711_chan_spec),
> +};
> +
> static int hx711_probe(struct platform_device *pdev)
> {
> + const struct hx711_chip_info *chip_info;
> struct device *dev = &pdev->dev;
> struct hx711_data *hx711_data;
> struct iio_dev *indio_dev;
> @@ -473,6 +498,12 @@ static int hx711_probe(struct platform_device *pdev)
>
> mutex_init(&hx711_data->lock);
>
> + chip_info = device_get_match_data(dev);
> + if (!chip_info)
> + return dev_err_probe(dev, -ENODEV, "missing driver data\n");
> +
> + hx711_data->chip_info = chip_info;
> +
> /*
> * PD_SCK stands for power down and serial clock input of HX711
> * in the driver it is an output
> @@ -534,11 +565,11 @@ static int hx711_probe(struct platform_device *pdev)
> hx711_data->data_ready_delay_ns =
> 1000000000 / hx711_data->clock_frequency;
>
> - indio_dev->name = "hx711";
> - indio_dev->info = &hx711_iio_info;
> + indio_dev->name = chip_info->name;
> + indio_dev->info = chip_info->iio_info;
> indio_dev->modes = INDIO_DIRECT_MODE;
> - indio_dev->channels = hx711_chan_spec;
> - indio_dev->num_channels = ARRAY_SIZE(hx711_chan_spec);
> + indio_dev->channels = chip_info->channels;
> + indio_dev->num_channels = chip_info->num_channels;
>
> ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
> iio_pollfunc_store_time,
> @@ -555,7 +586,7 @@ static int hx711_probe(struct platform_device *pdev)
> }
>
> static const struct of_device_id of_hx711_match[] = {
> - { .compatible = "avia,hx711", },
> + { .compatible = "avia,hx711", .data = &hx711_chip },
> { }
> };
>