On Fri, Apr 17, 2020 at 01:40:18PM +0200, Linus Walleij wrote: > The original AK8974 has 16 bits of actual value, while the > HSCDTD008A has 15 bits and the AMI305 and AMI306 has 12 bits. > Correct this by providing an extra parameter to the channel > macro and define a separate set of channels for each variant > of the chip. The resolution is the actual resolution of the > internal ADC of the chip. > > The values are stored in a S16 in 2's complement so all 16 > bits are used for storing (no shifting needed). > > The AMI305, AMI306 and HSCDTD008A valid bits are picked from > respective datasheet. > > My best educated guess is that AK8974 is also 12 bits. The > AK8973 is an 8 bit and earlier version, and the sibling > drivers AMI305 and AMI306 are 12 bits, so it makes sense > to assume that the AK8974 is also 12 bits. [...] > -#define AK8974_AXIS_CHANNEL(axis, index) \ > +#define AK8974_AXIS_CHANNEL(axis, index, bits) \ > { \ > .type = IIO_MAGN, \ > .modified = 1, \ > @@ -662,16 +662,42 @@ static const struct iio_chan_spec_ext_info ak8974_ext_info[] = { > .scan_index = index, \ > .scan_type = { \ > .sign = 's', \ > - .realbits = 16, \ > + .realbits = bits, \ > .storagebits = 16, \ > .endianness = IIO_LE \ > }, \ > } > > +/* > + * We have no datasheet for the AK8974 but we guess that its > + * ADC is 12 bits. > + */ > static const struct iio_chan_spec ak8974_channels[] = { > - AK8974_AXIS_CHANNEL(X, 0), > - AK8974_AXIS_CHANNEL(Y, 1), > - AK8974_AXIS_CHANNEL(Z, 2), > + AK8974_AXIS_CHANNEL(X, 0, 12), > + AK8974_AXIS_CHANNEL(Y, 1, 12), > + AK8974_AXIS_CHANNEL(Z, 2, 12), > + IIO_CHAN_SOFT_TIMESTAMP(3), > +}; > + > +/* > + * The AMI305 and AMI306 have 12 bit ADC resolution according to > + * datasheets. > + */ > +static const struct iio_chan_spec ami30x_channels[] = { > + AK8974_AXIS_CHANNEL(X, 0, 12), > + AK8974_AXIS_CHANNEL(Y, 1, 12), > + AK8974_AXIS_CHANNEL(Z, 2, 12), > + IIO_CHAN_SOFT_TIMESTAMP(3), > +}; Maybe call it channels_12bit[] and then you wouldn't need to make am exact duplicate for ak8974? Best Regards, Michał Mirosław