On Fri, 18 Oct 2024 13:42:10 +0300 Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx> wrote: > Add support for the AD485X a fully buffered, 8-channel simultaneous > sampling, 16/20-bit, 1 MSPS data acquisition system (DAS) with > differential, wide common-mode range inputs. > > Signed-off-by: Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx> A few minor things from me that I could fix whilst applying, but David gave a much more detailed review of v3, so I'll wait for his feedback on this. I haven't dug into datasheets much and may well have missed other things. > obj-$(CONFIG_AD7091R8) += ad7091r8.o > diff --git a/drivers/iio/adc/ad4851.c b/drivers/iio/adc/ad4851.c > new file mode 100644 > index 000000000000..65aa434b535f > --- /dev/null > +++ b/drivers/iio/adc/ad4851.c > @@ -0,0 +1,1155 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Analog Devices AD4851 DAS driver > + * > + * Copyright 2024 Analog Devices Inc. > + */ > + > +#include <linux/array_size.h> > +#include <linux/bitfield.h> > +#include <linux/bits.h> > +#include <linux/delay.h> > +#include <linux/device.h> > +#include <linux/err.h> > +#include <linux/minmax.h> > +#include <linux/mod_devicetable.h> > +#include <linux/module.h> > +#include <linux/mutex.h> > +#include <linux/pwm.h> > +#include <linux/regmap.h> > +#include <linux/regulator/consumer.h> > +#include <linux/spi/spi.h> > +#include <linux/types.h> > +#include <linux/units.h> > + > +#include <linux/iio/backend.h> > +#include <linux/iio/iio.h> > + > +#include <asm/unaligned.h> This moved. I can fix up whilst applying but it is now at linux/unaligned.h as of rc2. > +static int ad4851_get_calibscale(struct ad4851_state *st, int ch, int *val, int *val2) > +{ > + unsigned int reg_val; > + int gain; > + int ret; > + > + guard(mutex)(&st->lock); > + > + ret = regmap_read(st->regmap, AD4851_REG_CHX_GAIN_MSB(ch), > + ®_val); > + if (ret) > + return ret; > + > + gain = (reg_val & 0xFF) << 8; The register size is 8 bits, so I'm not sure what that masking is adding. gain = reg_val << 8; should be fine. Maybe the compiler or some static analysis is wrong? > + > + ret = regmap_read(st->regmap, AD4851_REG_CHX_GAIN_LSB(ch), > + ®_val); > + if (ret) > + return ret; > + > + gain |= reg_val & 0xFF; same here. > + > + *val = gain; > + *val2 = 32768; > + > + return IIO_VAL_FRACTIONAL; > +} > +