> + > + memset(st->tx_data, 0, ARRAY_SIZE(st->tx_data)); > + memcpy(st->tx_data, reg, reg_size); > + > + ret = spi_sync_transfer(st->spi, &xfer, 1); > + if (ret) > + return ret; > + > + memcpy(val, &st->rx_data.raw[reg_size], val_size); > + > + return ret; > +} > + [...] > + > +static int ad4030_get_chan_calibscale(struct iio_dev *indio_dev, > + struct iio_chan_spec const *chan, > + int *val, > + int *val2) > +{ > + struct ad4030_state *st = iio_priv(indio_dev); > + u16 gain; > + int ret; > + > + ret = regmap_bulk_read(st->regmap, AD4030_REG_GAIN_CHAN(chan->address), > + st->rx_data.raw, AD4030_REG_GAIN_BYTES_NB); > + if (ret) > + return ret; > + > + gain = get_unaligned_be16(st->rx_data.raw); My impression is that it is a bit odd to handle endianness after/before calling regmap_read/write(). Can you try set .val_format_endian_default = REGMAP_ENDIAN_BIG, in ad4030_regmap_bus? If that doesn't help, what about doing the get/set_unaligned stuff within the bus read/write calls? > + > + /* From datasheet: multiplied output = input × gain word/0x8000 */ > + *val = gain / 0x8000; Use a define to give a name to the gain constant? > + *val2 = mul_u64_u32_div(gain % 0x8000, NANO, 0x8000); > + > + return IIO_VAL_INT_PLUS_NANO; > +} > + [...]