On Wed, 17 Jan 2024 14:51:14 +0200 Dumitru Ceclan <mitrutzceclan@xxxxxxxxx> wrote: > This adds support for LTC6373 36 V Fully-Differential Programmable-Gain > Instrumentation Amplifier with 25 pA Input Bias Current. > The user can program the gain to one of seven available settings through > a 3-bit parallel interface (A2 to A0). > > Signed-off-by: Dumitru Ceclan <mitrutzceclan@xxxxxxxxx> Hi Dumitru, Some comments inline. I'd forgotten we have a rich set of DIV_xxx macros in math.h, DIV_ROUND_CLOSEST is I think the same as what you have coded up in here. > --- > drivers/iio/amplifiers/hmc425a.c | 118 +++++++++++++++++++++++++++++-- > 1 file changed, 114 insertions(+), 4 deletions(-) > > diff --git a/drivers/iio/amplifiers/hmc425a.c b/drivers/iio/amplifiers/hmc425a.c > index b116b54e4206..e7f425677fd3 100644 > --- a/drivers/iio/amplifiers/hmc425a.c > +++ b/drivers/iio/amplifiers/hmc425a.c > @@ -2,9 +2,10 @@ > /* > * HMC425A and similar Gain Amplifiers > * > - * Copyright 2020 Analog Devices Inc. > + * Copyright 2020, 2023 Analog Devices Inc. > */ > > +#include <linux/bits.h> > #include <linux/bitops.h> > #include <linux/device.h> > #include <linux/err.h> > @@ -20,10 +21,24 @@ > #include <linux/regulator/consumer.h> > #include <linux/sysfs.h> > > +/* > + * The LTC6373 amplifier supports configuring gain using GPIO's with the following > + * values (OUTPUT_V / INPUT_V): 0(shutdown), 0.25, 0.5, 1, 2, 4, 8, 16 > + * > + * Except for the shutdown value, all can be converted to dB using 20 * log10(x) > + * From here, it is observed that all values are multiples of the '2' gain setting, > + * with the correspondent of 6.020dB. > + */ > +#define LTC6373_CONVERSION_CONSTANT 6020 > +#define LTC6373_MIN_GAIN_CODE 0x6 > +#define LTC6373_CONVERSION_MASK GENMASK(2, 0) > +#define LTC6373_SHUTDOWN GENMASK(2, 0) > + > enum hmc425a_type { > ID_HMC425A, > ID_HMC540S, > - ID_ADRF5740 > + ID_ADRF5740, > + ID_LTC6373, > }; > > struct hmc425a_chip_info { > @@ -34,6 +49,8 @@ struct hmc425a_chip_info { > int gain_min; > int gain_max; > int default_gain; > + int powerdown_val; > + bool has_powerdown; > }; > > struct hmc425a_state { > @@ -42,6 +59,7 @@ struct hmc425a_state { > struct gpio_descs *gpios; > enum hmc425a_type type; > u32 gain; > + bool powerdown; > }; > > static int hmc425a_write(struct iio_dev *indio_dev, u32 value) > @@ -80,6 +98,17 @@ static int hmc425a_gain_dB_to_code(struct hmc425a_state *st, int val, int val2, > temp = (abs(gain) / 2000) & 0xF; > *code = temp & BIT(3) ? temp | BIT(2) : temp; > return 0; > + case ID_LTC6373: > + if (st->powerdown) > + return -EPERM; > + > + /* add half of the value for rounding */ > + temp = LTC6373_CONVERSION_CONSTANT / 2; As mentioned in review of earlier patch, I'd like this to be in a callback not based on st->type (which should be removed from the driver). > + if (val < 0) > + temp *= -1; > + *code = ~((gain + temp) / LTC6373_CONVERSION_CONSTANT + 3) I'd forgotten in previous reviews that we have DIV_ROUND_CLOSEST() that does pretty similar maths to your handling here. Better to use that than spin your own version. > + & LTC6373_CONVERSION_MASK; > + return 0; > default: > return -EINVAL; > } > @@ -101,6 +130,12 @@ static int hmc425a_code_to_gain_dB(struct hmc425a_state *st, int *val, int *val2 > code = code & BIT(3) ? code & ~BIT(2) : code; > gain = code * -2000; > break; > + case ID_LTC6373: > + if (st->powerdown) > + return -EPERM; > + gain = ((~code & LTC6373_CONVERSION_MASK) - 3) * > + LTC6373_CONVERSION_CONSTANT; > + break; > } > > *val = gain / 1000; > @@ -174,6 +209,48 @@ static const struct iio_info hmc425a_info = { > .write_raw_get_fmt = &hmc425a_write_raw_get_fmt, > }; > > + > +static const struct iio_chan_spec_ext_info ltc6373_ext_info[] = { > + { > + .name = "powerdown", > + .read = ltc6373_read_powerdown, > + .write = ltc6373_write_powerdown, > + .shared = IIO_SEPARATE, > + }, > + {}, No comma preferred after a terminator entry like this as nothing should ever come after it. Any new additions must be before this last entry. > +};