Re: [PATCH v7 2/2] iio: adc: add MAX40080 current-sense amplifier driver
Jonathan Cameron <[email protected]>
| Newsgroups | org.kernel.vger.linux-devicetree,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260818173809.76a05ac4@jic23-huawei> |
On Tue, 18 Aug 2026 17:29:28 +0300 Stefan Popa <[email protected]> wrote: > The MAX40080 is a bidirectional current-sense amplifier with an > integrated 12-bit ADC and an I2C/SMBus interface. It measures the > voltage across an external shunt resistor and the input bus voltage, > storing the results in an internal FIFO. > > Add a direct-mode IIO driver exposing the current and voltage channels > with raw, scale and hardware-gain attributes, a configurable > oversampling (digital averaging) ratio, and PEC-protected register > access. The current scale is derived from the shunt resistor value > described in the device tree. > > The driver operates in single-measurement mode: each raw read triggers > an on-demand conversion via SMBus Quick Command and returns a matched > current/voltage pair. This avoids the latency and complexity of the > continuous FIFO mode while ensuring each read reflects the current > state. The two selectable current-sense ranges are exposed through > scale/scale_available. > > Continuous FIFO buffering, threshold events and the alert interrupt are > intentionally left out of this initial submission and may be added > later. https://sashiko.dev/#/patchset/20260818142928.8244-1-stefan.popa%40analog.com The copy being optimized out is likely complier optimization so I think sashiko is correct that you need READ_ONCE() (and probably the WRITE_ONCE() as well) > > Co-developed-by: Ciprian Hegbeli <[email protected]> > Signed-off-by: Ciprian Hegbeli <[email protected]> > Signed-off-by: Stefan Popa <[email protected]> Otherwise, just trivial stuff from me. Andy caught a lot more than me! Given this seems to be coming to a point where it is ready to be applied (hopefully v8) feel free to send a new version out in a day or two rather than waiting a week. Thanks Jonathan > diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile > index 7cc8f9a12f763..9245a337dd935 100644 > --- a/drivers/iio/adc/Makefile > +++ b/drivers/iio/adc/Makefile > @@ -166,3 +166,4 @@ obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o > obj-$(CONFIG_XILINX_AMS) += xilinx-ams.o > xilinx-xadc-y := xilinx-xadc-core.o xilinx-xadc-events.o > obj-$(CONFIG_XILINX_XADC) += xilinx-xadc.o > +obj-$(CONFIG_MAX40080) += max40080.o > diff --git a/drivers/iio/adc/max40080.c b/drivers/iio/adc/max40080.c > new file mode 100644 > index 0000000000000..4b397bcd145b2 > --- /dev/null > +++ b/drivers/iio/adc/max40080.c > +/* > + * Configure the device from the cached state. The device powers up in standby > + * with PEC enabled (CFG POR = 0x0060), so PEC is kept enabled throughout. > + */ > +static int max40080_init(struct max40080_state *st) > +{ > + u16 fifo_cfg, cfg; > + int ret, filter; > + > + filter = max40080_oversampling_to_filter(st->oversampling_ratio); > + if (filter < 0) > + return filter; > + > + /* > + * Put the device in standby before (re)configuring the FIFO: the FIFO > + * configuration register can only be written while the device is not > + * converting. > + */ > + cfg = FIELD_PREP(MAX40080_CFG_MODE_MSK, MAX40080_CFG_MODE_STDBY) | > + FIELD_PREP(MAX40080_CFG_PEC_EN_MSK, 1); > + As below. > + ret = i2c_smbus_write_word_data(st->client, MAX40080_REG_CFG, cfg); > + if (ret) > + return ret; > + > + /* Store a matched current+voltage pair per conversion. */ > + fifo_cfg = FIELD_PREP(MAX40080_FIFO_CFG_STORE_IV_MSK, MAX40080_FIFO_CFG_STORE_IV); > + Where you have pairs like this of setting local and using it, drop the blank line. We want those to be visually closely coupled. > + ret = i2c_smbus_write_word_data(st->client, MAX40080_REG_FIFO_CFG, > + fifo_cfg); > + if (ret) > + return ret;