On Tue, 26 Mar 2024 21:59:34 +0100 Lothar Rubusch <l.rubusch@xxxxxxxxx> wrote: > On Mon, Mar 25, 2024 at 9:32 PM Jonathan Cameron <jic23@xxxxxxxxxx> wrote: > > > > On Mon, 25 Mar 2024 15:33:50 +0000 > > Lothar Rubusch <l.rubusch@xxxxxxxxx> wrote: > > > > > Replace write() data_format by regmap_update_bits(), because > > > bus specific pre-configuration may have happened before on > > > the same register. Changes then need to be masked. > > > > > > Remove the data_range field from the struct adxl345_data, > > > because it is not used anymore. > > > > > > Signed-off-by: Lothar Rubusch <l.rubusch@xxxxxxxxx> > > > --- > > > drivers/iio/accel/adxl345_core.c | 9 ++++----- > > > 1 file changed, 4 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c > > > index 8bd30a23e..be6758015 100644 > > > --- a/drivers/iio/accel/adxl345_core.c > > > +++ b/drivers/iio/accel/adxl345_core.c > > > @@ -42,13 +42,13 @@ > > > #define ADXL345_DATA_FORMAT_4G 1 > > > #define ADXL345_DATA_FORMAT_8G 2 > > > #define ADXL345_DATA_FORMAT_16G 3 > > > +#define ADXL345_DATA_FORMAT_MSK ~((u8) BIT(6)) /* ignore spi-3wire */ > > > > I'm not keen on seeing masking of a bit we don't yet > > handle done by value. Can we instead build this up by what we 'want' to > > write rather than don't. Will need a few more defines perhaps to cover > > the masks of SELF_TEST, INT_INVERT, FULL_RES, Justify and Range. > > > > Good point. Anyway, there is also an input driver implementation for > the adxl345, mainly dealing with the interrupt feature as input > device. Thus, for the iio implementation I would suggest to reduce the > mask just to cover SELF_TEST and FULL_RES and leave INT_INVERT out. Is > this ok? yes, that sounds fine > > > > > > > #define ADXL345_DEVID 0xE5 > > > > > > struct adxl345_data { > > > const struct adxl345_chip_info *info; > > > struct regmap *regmap; > > > - u8 data_range; > > > }; > > > > > > #define ADXL345_CHANNEL(index, axis) { \ > > > @@ -219,14 +219,13 @@ int adxl345_core_probe(struct device *dev, struct regmap *regmap) > > > data = iio_priv(indio_dev); > > > data->regmap = regmap; > > > /* Enable full-resolution mode */ > > > - data->data_range = ADXL345_DATA_FORMAT_FULL_RES; > > > data->info = device_get_match_data(dev); > > > if (!data->info) > > > return -ENODEV; > > > > > > - ret = regmap_write(data->regmap, ADXL345_REG_DATA_FORMAT, > > > - data->data_range); > > > - if (ret < 0) > > > + ret = regmap_update_bits(regmap, ADXL345_REG_DATA_FORMAT, > > > + ADXL345_DATA_FORMAT_MSK, ADXL345_DATA_FORMAT_FULL_RES); > > > + if (ret) > > > return dev_err_probe(dev, ret, "Failed to set data range\n"); > > > > > > indio_dev->name = data->info->name; > >