public inbox for devicetree@vger.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: "Matti Vaittinen" <mazziesaccount@gmail.com>,
	"David Lechner" <dlechner@baylibre.com>,
	"Nuno Sá" <nuno.sa@analog.com>,
	"Andy Shevchenko" <andy@kernel.org>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org
Subject: Re: [PATCH v5 2/3] iio: adc: Support ROHM BD79112 ADC/GPIO
Date: Mon, 15 Sep 2025 21:13:21 +0100	[thread overview]
Message-ID: <20250915211321.47865d3d@jic23-huawei> (raw)
In-Reply-To: <aMge0jYwYCiY72Yb@smile.fi.intel.com>

On Mon, 15 Sep 2025 17:12:34 +0300
Andy Shevchenko <andriy.shevchenko@intel.com> wrote:

> On Mon, Sep 15, 2025 at 10:12:43AM +0300, Matti Vaittinen wrote:
> > The ROHM BD79112 is an ADC/GPIO with 32 channels. The channel inputs can
> > be used as ADC or GPIO. Using the GPIOs as IRQ sources isn't supported.
> > 
> > The ADC is 12-bit, supporting input voltages up to 5.7V, and separate I/O
> > voltage supply. Maximum SPI clock rate is 20 MHz (10 MHz with
> > daisy-chain configuration) and maximum sampling rate is 1MSPS.
> > 
> > The IC does also support CRC but it is not implemented in the driver.  
> 
> ...
> 
> > +static int bd79112_probe(struct spi_device *spi)
> > +{
> > +	struct bd79112_data *data;
> > +	struct iio_dev *iio_dev;
> > +	struct iio_chan_spec *cs;
> > +	struct device *dev = &spi->dev;
> > +	unsigned long gpio_pins, pin;
> > +	unsigned int i;
> > +	int ret;
> > +
> > +	iio_dev = devm_iio_device_alloc(dev, sizeof(*data));
> > +	if (!iio_dev)
> > +		return -ENOMEM;
> > +
> > +	data = iio_priv(iio_dev);
> > +	data->spi = spi;
> > +	data->dev = dev;
> > +	data->map = devm_regmap_init(dev, NULL, data, &bd79112_regmap);
> > +	if (IS_ERR(data->map))
> > +		return dev_err_probe(dev, PTR_ERR(data->map),
> > +				     "Failed to initialize Regmap\n");
> > +
> > +	ret = devm_regulator_get_enable_read_voltage(dev, "vdd");
> > +	if (ret < 0)
> > +		return dev_err_probe(dev, ret, "Failed to get the Vdd\n");  
> 
> > +	data->vref_mv = ret / 1000;  
> 
> I still think moving to _mV is the right thing to do.
> There is no 'mv' in the physics for Volts.

I'm not disagreeing with this review but I'm also not going to hold a
driver back for that given timing is pretty much such that I merge it
today or it sits a cycle and this one is very near...
I'll get fussier on this once we have written up some guidance and may
well send a patch to modify existing recent cases like this one!

> 
> > +	ret = devm_regulator_get_enable(dev, "iovdd");
> > +	if (ret < 0)
> > +		return dev_err_probe(dev, ret, "Failed to enable I/O voltage\n");
> > +
> > +	data->read_xfer[0].tx_buf = &data->read_tx[0];
> > +	data->read_xfer[0].len = sizeof(data->read_tx);
> > +	data->read_xfer[0].cs_change = 1;
> > +	data->read_xfer[1].rx_buf = &data->read_rx;
> > +	data->read_xfer[1].len = sizeof(data->read_rx);
> > +	spi_message_init_with_transfers(&data->read_msg, data->read_xfer, 2);  
> 
> > +	devm_spi_optimize_message(dev, spi, &data->read_msg);  
> 
> And if it fails?..
I've added the following and applied the series.

Note I'm cutting this fine so if we get any build issues or similar
it might well get pushed back to next cycle yet!

diff --git a/drivers/iio/adc/rohm-bd79112.c b/drivers/iio/adc/rohm-bd79112.c
index b406d4ee5411..d15e06c8b94d 100644
--- a/drivers/iio/adc/rohm-bd79112.c
+++ b/drivers/iio/adc/rohm-bd79112.c
@@ -454,12 +454,18 @@ static int bd79112_probe(struct spi_device *spi)
        data->read_xfer[1].rx_buf = &data->read_rx;
        data->read_xfer[1].len = sizeof(data->read_rx);
        spi_message_init_with_transfers(&data->read_msg, data->read_xfer, 2);
-       devm_spi_optimize_message(dev, spi, &data->read_msg);
+       ret = devm_spi_optimize_message(dev, spi, &data->read_msg);
+       if (ret < 0)
+               return dev_err_probe(dev, ret,
+                                    "Failed to optimize SPI read message\n");
 
        data->write_xfer.tx_buf = &data->reg_write_tx[0];
        data->write_xfer.len = sizeof(data->reg_write_tx);
        spi_message_init_with_transfers(&data->write_msg, &data->write_xfer, 1);
-       devm_spi_optimize_message(dev, spi, &data->write_msg);
+       ret = devm_spi_optimize_message(dev, spi, &data->write_msg);
+       if (ret < 0)
+               return dev_err_probe(dev, ret,
+                                    "Failed to optimize SPI write message\n");
 
        ret = devm_iio_adc_device_alloc_chaninfo_se(dev, &bd79112_chan_template,
                                                    BD79112_MAX_NUM_CHANNELS - 1,
> 
> > +	data->write_xfer.tx_buf = &data->reg_write_tx[0];
> > +	data->write_xfer.len = sizeof(data->reg_write_tx);
> > +	spi_message_init_with_transfers(&data->write_msg, &data->write_xfer, 1);
> > +	devm_spi_optimize_message(dev, spi, &data->write_msg);
> > +
> > +	ret = devm_iio_adc_device_alloc_chaninfo_se(dev, &bd79112_chan_template,
> > +						    BD79112_MAX_NUM_CHANNELS - 1,
> > +						    &cs);
> > +
> > +	/* Register all pins as GPIOs if there are no ADC channels */
> > +	if (ret == -ENOENT)
> > +		goto register_gpios;
> > +
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	iio_dev->num_channels = ret;
> > +	iio_dev->channels = cs;
> > +
> > +	for (i = 0; i < iio_dev->num_channels; i++)
> > +		cs[i].datasheet_name = bd79112_chan_names[cs[i].channel];
> > +
> > +	iio_dev->info = &bd79112_info;
> > +	iio_dev->name = "bd79112";
> > +	iio_dev->modes = INDIO_DIRECT_MODE;
> > +
> > +	/*
> > +	 * Ensure all channels are ADCs. This allows us to register the IIO
> > +	 * device early (before checking which pins are to be used for GPIO)
> > +	 * without having to worry about some pins being initially used for
> > +	 * GPIO.
> > +	 */
> > +	for (i = 0; i < BD79112_NUM_GPIO_EN_REGS; i++) {
> > +		ret = regmap_write(data->map, BD79112_FIRST_GPIO_EN_REG + i, 0);
> > +		if (ret)
> > +			return dev_err_probe(dev, ret,
> > +					     "Failed to initialize channels\n");
> > +	}
> > +
> > +	ret = devm_iio_device_register(data->dev, iio_dev);
> > +	if (ret)
> > +		return dev_err_probe(data->dev, ret, "Failed to register ADC\n");
> > +
> > +register_gpios:
> > +	gpio_pins = bd79112_get_gpio_pins(iio_dev->channels,
> > +					  iio_dev->num_channels);
> > +
> > +	/* If all channels are reserved for ADC, then we're done. */
> > +	if (!gpio_pins)
> > +		return 0;
> > +
> > +	/* Default all the GPIO pins to GPI */
> > +	for_each_set_bit(pin, &gpio_pins, BD79112_MAX_NUM_CHANNELS) {
> > +		ret = bd79112_gpio_dir_set(data, pin, GPIO_LINE_DIRECTION_IN);
> > +		if (ret)
> > +			return dev_err_probe(dev, ret,
> > +					     "Failed to mark pin as GPI\n");
> > +	}
> > +
> > +	data->gpio_valid_mask = gpio_pins;
> > +	data->gc = bd79112_gpio_chip;
> > +	data->gc.parent = dev;
> > +
> > +	return devm_gpiochip_add_data(dev, &data->gc, data);
> > +}  
> 


  reply	other threads:[~2025-09-15 20:13 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-15  7:11 [PATCH v5 0/3] Support ROHM BD79112 ADC Matti Vaittinen
2025-09-15  7:12 ` [PATCH v5 1/3] dt-bindings: iio: adc: ROHM BD79112 ADC/GPIO Matti Vaittinen
2025-09-15  7:12 ` [PATCH v5 2/3] iio: adc: Support " Matti Vaittinen
2025-09-15 14:12   ` Andy Shevchenko
2025-09-15 20:13     ` Jonathan Cameron [this message]
2025-09-16  4:52       ` Matti Vaittinen
2025-09-16  7:41         ` Andy Shevchenko
2025-09-16  8:02         ` Jonathan Cameron
2025-09-16  8:14           ` Matti Vaittinen
2025-09-16 15:08             ` David Lechner
2025-09-16  7:32       ` Andy Shevchenko
2025-09-16  4:48     ` Matti Vaittinen
2025-09-16  7:39       ` Andy Shevchenko
2025-09-16  8:04         ` Matti Vaittinen
2025-09-15  7:12 ` [PATCH v5 3/3] MAINTAINERS: Support ROHM BD79112 ADC Matti Vaittinen

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=20250915211321.47865d3d@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=andriy.shevchenko@intel.com \
    --cc=andy@kernel.org \
    --cc=brgl@bgdev.pl \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=krzk+dt@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mazziesaccount@gmail.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