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? > > > > #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; >