Message ID | 20240325153356.46112-2-l.rubusch@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | iio: accel: adxl345: Add spi-3wire feature | expand |
On Mon, 25 Mar 2024 15:33:50 +0000 Lothar Rubusch <l.rubusch@gmail.com> 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@gmail.com> > --- > 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. > > #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;
On Mon, Mar 25, 2024 at 9:32 PM Jonathan Cameron <jic23@kernel.org> wrote: > > On Mon, 25 Mar 2024 15:33:50 +0000 > Lothar Rubusch <l.rubusch@gmail.com> 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@gmail.com> > > --- > > 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; >
On Tue, 26 Mar 2024 21:59:34 +0100 Lothar Rubusch <l.rubusch@gmail.com> wrote: > On Mon, Mar 25, 2024 at 9:32 PM Jonathan Cameron <jic23@kernel.org> wrote: > > > > On Mon, 25 Mar 2024 15:33:50 +0000 > > Lothar Rubusch <l.rubusch@gmail.com> 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@gmail.com> > > > --- > > > 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; > >
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 */ #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;
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@gmail.com> --- drivers/iio/accel/adxl345_core.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)