* [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability
@ 2022-12-28 9:39 carlos.song
2022-12-28 9:39 ` [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback carlos.song
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: carlos.song @ 2022-12-28 9:39 UTC (permalink / raw)
To: jic23, lars
Cc: rjones, Jonathan.Cameron, haibo.chen, carlos.song, linux-imx,
linux-iio
From: Carlos Song <carlos.song@nxp.com>
Thanks, Jonathan. I have to admit that this has bothered me about how to
modify it reasonably but at the same time make it have the ideal format.
In patch V4, I use ODR_MSK in the first place that I merged the first two
patches in V3 into the first patch in V4. There is no change on other
patches. And sorry about forgetting to add the dividing line above the
changes in V3, I have added it for every patch this time.
Carlos Song (4):
iio: imu: fxos8700: fix incorrect ODR mode readback
iio: imu: fxos8700: fix failed initialization ODR mode assignment
iio: imu: fxos8700: remove definition FXOS8700_CTRL_ODR_MIN
iio: imu: fxos8700: fix MAGN sensor scale and unit
drivers/iio/imu/fxos8700_core.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback
2022-12-28 9:39 [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability carlos.song
@ 2022-12-28 9:39 ` carlos.song
2022-12-31 14:51 ` Jonathan Cameron
2022-12-28 9:39 ` [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment carlos.song
` (2 subsequent siblings)
3 siblings, 1 reply; 11+ messages in thread
From: carlos.song @ 2022-12-28 9:39 UTC (permalink / raw)
To: jic23, lars
Cc: rjones, Jonathan.Cameron, haibo.chen, carlos.song, linux-imx,
linux-iio
From: Carlos Song <carlos.song@nxp.com>
The absence of a correct offset leads an incorrect ODR mode
readback after use a hexadecimal number to mark the value from
FXOS8700_CTRL_REG1.
Get ODR mode by field mask and FIELD_GET clearly and conveniently.
And attach other additional fix for keeping the original code logic
and a good readability.
Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
---
Changes for V4:
- Use ODR_MSK in the first place that merged the first two patches
in V3 into this patch.
- Rework commit log
Changes for V3:
- Remove FXOS8700_CTRL_ODR_GENMSK and set FXOS8700_CTRL_ODR_MSK a
field mask
- Legal use of filed mask and FIELD_PREP() to select ODR mode
- Rework commit log
---
drivers/iio/imu/fxos8700_core.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
index 773f62203bf0..a1af5d0fde5d 100644
--- a/drivers/iio/imu/fxos8700_core.c
+++ b/drivers/iio/imu/fxos8700_core.c
@@ -10,6 +10,7 @@
#include <linux/regmap.h>
#include <linux/acpi.h>
#include <linux/bitops.h>
+#include <linux/bitfield.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
@@ -144,9 +145,9 @@
#define FXOS8700_NVM_DATA_BNK0 0xa7
/* Bit definitions for FXOS8700_CTRL_REG1 */
-#define FXOS8700_CTRL_ODR_MSK 0x38
#define FXOS8700_CTRL_ODR_MAX 0x00
#define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
+#define FXOS8700_CTRL_ODR_MSK GENMASK(5, 3)
/* Bit definitions for FXOS8700_M_CTRL_REG1 */
#define FXOS8700_HMS_MASK GENMASK(1, 0)
@@ -508,10 +509,8 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
if (i >= odr_num)
return -EINVAL;
- return regmap_update_bits(data->regmap,
- FXOS8700_CTRL_REG1,
- FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
- fxos8700_odr[i].bits << 3 | active_mode);
+ val = val | FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) | active_mode;
+ return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
}
static int fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
@@ -524,7 +523,7 @@ static int fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
if (ret)
return ret;
- val &= FXOS8700_CTRL_ODR_MSK;
+ val = FIELD_GET(FXOS8700_CTRL_ODR_MSK, val);
for (i = 0; i < odr_num; i++)
if (val == fxos8700_odr[i].bits)
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment
2022-12-28 9:39 [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability carlos.song
2022-12-28 9:39 ` [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback carlos.song
@ 2022-12-28 9:39 ` carlos.song
2022-12-31 14:54 ` Jonathan Cameron
2022-12-28 9:39 ` [PATCH v4 3/4] iio: imu: fxos8700: remove definition FXOS8700_CTRL_ODR_MIN carlos.song
2022-12-28 9:39 ` [PATCH v4 4/4] iio: imu: fxos8700: fix MAGN sensor scale and unit carlos.song
3 siblings, 1 reply; 11+ messages in thread
From: carlos.song @ 2022-12-28 9:39 UTC (permalink / raw)
To: jic23, lars
Cc: rjones, Jonathan.Cameron, haibo.chen, carlos.song, linux-imx,
linux-iio
From: Carlos Song <carlos.song@nxp.com>
The absence of correct offset leads a failed initialization ODR mode
assignment.
Select MAX ODR mode as the initialization ODR mode by field mask and
FIELD_PREP.
Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
---
Changes for V4:
- None
Changes for V3:
- Legal use of FIELD_PREP() and field mask to select initialization
ODR mode
- Rework commit log
---
drivers/iio/imu/fxos8700_core.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
index a1af5d0fde5d..de4ced979226 100644
--- a/drivers/iio/imu/fxos8700_core.c
+++ b/drivers/iio/imu/fxos8700_core.c
@@ -611,6 +611,7 @@ static const struct iio_info fxos8700_info = {
static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
{
int ret;
+ int reg;
unsigned int val;
struct device *dev = regmap_get_device(data->regmap);
@@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
return ret;
/* Max ODR (800Hz individual or 400Hz hybrid), active mode */
- return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
- FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
+ ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
+ if (ret)
+ return ret;
+ reg = reg | FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
+ return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
}
static void fxos8700_chip_uninit(void *data)
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 3/4] iio: imu: fxos8700: remove definition FXOS8700_CTRL_ODR_MIN
2022-12-28 9:39 [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability carlos.song
2022-12-28 9:39 ` [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback carlos.song
2022-12-28 9:39 ` [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment carlos.song
@ 2022-12-28 9:39 ` carlos.song
2022-12-28 9:39 ` [PATCH v4 4/4] iio: imu: fxos8700: fix MAGN sensor scale and unit carlos.song
3 siblings, 0 replies; 11+ messages in thread
From: carlos.song @ 2022-12-28 9:39 UTC (permalink / raw)
To: jic23, lars
Cc: rjones, Jonathan.Cameron, haibo.chen, carlos.song, linux-imx,
linux-iio
From: Carlos Song <carlos.song@nxp.com>
FXOS8700_CTRL_ODR_MIN is not used but value is probably wrong.
Remove it for a good readability.
Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
---
Changes for V4:
- None
Changes for V3:
- Proposed a separate clean fix
---
drivers/iio/imu/fxos8700_core.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
index de4ced979226..7b370bd643a1 100644
--- a/drivers/iio/imu/fxos8700_core.c
+++ b/drivers/iio/imu/fxos8700_core.c
@@ -146,7 +146,6 @@
/* Bit definitions for FXOS8700_CTRL_REG1 */
#define FXOS8700_CTRL_ODR_MAX 0x00
-#define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
#define FXOS8700_CTRL_ODR_MSK GENMASK(5, 3)
/* Bit definitions for FXOS8700_M_CTRL_REG1 */
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 4/4] iio: imu: fxos8700: fix MAGN sensor scale and unit
2022-12-28 9:39 [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability carlos.song
` (2 preceding siblings ...)
2022-12-28 9:39 ` [PATCH v4 3/4] iio: imu: fxos8700: remove definition FXOS8700_CTRL_ODR_MIN carlos.song
@ 2022-12-28 9:39 ` carlos.song
3 siblings, 0 replies; 11+ messages in thread
From: carlos.song @ 2022-12-28 9:39 UTC (permalink / raw)
To: jic23, lars
Cc: rjones, Jonathan.Cameron, haibo.chen, carlos.song, linux-imx,
linux-iio
From: Carlos Song <carlos.song@nxp.com>
+/-1200uT is a MAGN sensor full measurement range. Magnetometer scale
is the magnetic sensitivity parameter. It is referenced as 0.1uT
according to datasheet and magnetometer channel unit is Gauss in
sysfs-bus-iio documentation. Gauss and uTesla unit conversion
relationship as follows: 0.1uT = 0.001Gs.
Set magnetometer scale and available magnetometer scale as fixed 0.001Gs.
Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
---
Changes for V4:
- None
Changes for V3:
- Modify the magnetometer sensitivity unit "g" to standard unit "Gs"
- Check and confirm uscale value is correct. The readback of
MAGN scale is 0.001 Gs
- Rework commit log
Changes for V2:
- Modify the magnetometer sensitivity unit to be consistent with the
documentation as 0.001g
- Rework commit log
---
drivers/iio/imu/fxos8700_core.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
index 7b370bd643a1..8320a3b6f942 100644
--- a/drivers/iio/imu/fxos8700_core.c
+++ b/drivers/iio/imu/fxos8700_core.c
@@ -351,7 +351,7 @@ static int fxos8700_set_scale(struct fxos8700_data *data,
struct device *dev = regmap_get_device(data->regmap);
if (t == FXOS8700_MAGN) {
- dev_err(dev, "Magnetometer scale is locked at 1200uT\n");
+ dev_err(dev, "Magnetometer scale is locked at 0.001Gs\n");
return -EINVAL;
}
@@ -396,7 +396,7 @@ static int fxos8700_get_scale(struct fxos8700_data *data,
static const int scale_num = ARRAY_SIZE(fxos8700_accel_scale);
if (t == FXOS8700_MAGN) {
- *uscale = 1200; /* Magnetometer is locked at 1200uT */
+ *uscale = 1000; /* Magnetometer is locked at 0.001Gs */
return 0;
}
@@ -587,7 +587,7 @@ static IIO_CONST_ATTR(in_accel_sampling_frequency_available,
static IIO_CONST_ATTR(in_magn_sampling_frequency_available,
"1.5625 6.25 12.5 50 100 200 400 800");
static IIO_CONST_ATTR(in_accel_scale_available, "0.000244 0.000488 0.000976");
-static IIO_CONST_ATTR(in_magn_scale_available, "0.000001200");
+static IIO_CONST_ATTR(in_magn_scale_available, "0.001000");
static struct attribute *fxos8700_attrs[] = {
&iio_const_attr_in_accel_sampling_frequency_available.dev_attr.attr,
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback
2022-12-28 9:39 ` [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback carlos.song
@ 2022-12-31 14:51 ` Jonathan Cameron
2023-01-10 7:44 ` [EXT] " Carlos Song
0 siblings, 1 reply; 11+ messages in thread
From: Jonathan Cameron @ 2022-12-31 14:51 UTC (permalink / raw)
To: carlos.song
Cc: lars, rjones, Jonathan.Cameron, haibo.chen, linux-imx, linux-iio
On Wed, 28 Dec 2022 17:39:38 +0800
carlos.song@nxp.com wrote:
> From: Carlos Song <carlos.song@nxp.com>
>
> The absence of a correct offset leads an incorrect ODR mode
> readback after use a hexadecimal number to mark the value from
> FXOS8700_CTRL_REG1.
>
> Get ODR mode by field mask and FIELD_GET clearly and conveniently.
> And attach other additional fix for keeping the original code logic
> and a good readability.
>
> Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> Signed-off-by: Carlos Song <carlos.song@nxp.com>
Hi Carlos,
I'm fairly sure the new code doesn't quite work correctly. See inline.
Jonathan
> ---
> Changes for V4:
> - Use ODR_MSK in the first place that merged the first two patches
> in V3 into this patch.
> - Rework commit log
> Changes for V3:
> - Remove FXOS8700_CTRL_ODR_GENMSK and set FXOS8700_CTRL_ODR_MSK a
> field mask
> - Legal use of filed mask and FIELD_PREP() to select ODR mode
> - Rework commit log
> ---
> drivers/iio/imu/fxos8700_core.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
> index 773f62203bf0..a1af5d0fde5d 100644
> --- a/drivers/iio/imu/fxos8700_core.c
> +++ b/drivers/iio/imu/fxos8700_core.c
> @@ -10,6 +10,7 @@
> #include <linux/regmap.h>
> #include <linux/acpi.h>
> #include <linux/bitops.h>
> +#include <linux/bitfield.h>
>
> #include <linux/iio/iio.h>
> #include <linux/iio/sysfs.h>
> @@ -144,9 +145,9 @@
> #define FXOS8700_NVM_DATA_BNK0 0xa7
>
> /* Bit definitions for FXOS8700_CTRL_REG1 */
> -#define FXOS8700_CTRL_ODR_MSK 0x38
> #define FXOS8700_CTRL_ODR_MAX 0x00
> #define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
> +#define FXOS8700_CTRL_ODR_MSK GENMASK(5, 3)
>
> /* Bit definitions for FXOS8700_M_CTRL_REG1 */
> #define FXOS8700_HMS_MASK GENMASK(1, 0)
> @@ -508,10 +509,8 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> if (i >= odr_num)
> return -EINVAL;
>
> - return regmap_update_bits(data->regmap,
> - FXOS8700_CTRL_REG1,
> - FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
> - fxos8700_odr[i].bits << 3 | active_mode);
> + val = val | FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) | active_mode;
val |= would be neater.
Also, if I read the existing code correctly, val hasn't been masked, so if active_mode was
set in val, it still will be, hence no need to or it in again.
You also haven't masked out _CTRL_ODR_MSK so as a result of this call you will get the
bitwise or of whatever ODR value you are trying to set and whatever it was set to before.
> + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
> }
>
> static int fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> @@ -524,7 +523,7 @@ static int fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> if (ret)
> return ret;
>
> - val &= FXOS8700_CTRL_ODR_MSK;
> + val = FIELD_GET(FXOS8700_CTRL_ODR_MSK, val);
>
> for (i = 0; i < odr_num; i++)
> if (val == fxos8700_odr[i].bits)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment
2022-12-28 9:39 ` [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment carlos.song
@ 2022-12-31 14:54 ` Jonathan Cameron
2023-01-10 7:44 ` [EXT] " Carlos Song
0 siblings, 1 reply; 11+ messages in thread
From: Jonathan Cameron @ 2022-12-31 14:54 UTC (permalink / raw)
To: carlos.song
Cc: lars, rjones, Jonathan.Cameron, haibo.chen, linux-imx, linux-iio
On Wed, 28 Dec 2022 17:39:39 +0800
carlos.song@nxp.com wrote:
> From: Carlos Song <carlos.song@nxp.com>
>
> The absence of correct offset leads a failed initialization ODR mode
> assignment.
>
> Select MAX ODR mode as the initialization ODR mode by field mask and
> FIELD_PREP.
>
> Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> Signed-off-by: Carlos Song <carlos.song@nxp.com>
> ---
> Changes for V4:
> - None
> Changes for V3:
> - Legal use of FIELD_PREP() and field mask to select initialization
> ODR mode
> - Rework commit log
> ---
> drivers/iio/imu/fxos8700_core.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/imu/fxos8700_core.c b/drivers/iio/imu/fxos8700_core.c
> index a1af5d0fde5d..de4ced979226 100644
> --- a/drivers/iio/imu/fxos8700_core.c
> +++ b/drivers/iio/imu/fxos8700_core.c
> @@ -611,6 +611,7 @@ static const struct iio_info fxos8700_info = {
> static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
> {
> int ret;
> + int reg;
> unsigned int val;
> struct device *dev = regmap_get_device(data->regmap);
>
> @@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
> return ret;
>
> /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> - return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> - FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
> + ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
> + if (ret)
> + return ret;
> + reg = reg | FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
reg |= will work here. However, like in previous patch I'd expect to see the
_CTRL_ODR_MSK used in
reg &= ~FXOS8700_CTRL_ODR_MASK;
reg |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
This is a good place to use regmap_update_bits() as there is no need to see what the previous
values were (unlike in previous patch).
> + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
> }
>
> static void fxos8700_chip_uninit(void *data)
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [EXT] Re: [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback
2022-12-31 14:51 ` Jonathan Cameron
@ 2023-01-10 7:44 ` Carlos Song
2023-01-14 17:34 ` Jonathan Cameron
0 siblings, 1 reply; 11+ messages in thread
From: Carlos Song @ 2023-01-10 7:44 UTC (permalink / raw)
To: Jonathan Cameron
Cc: lars@metafoo.de, rjones@gateworks.com,
Jonathan.Cameron@huawei.com, Bough Chen, dl-linux-imx,
linux-iio@vger.kernel.org
Hi, Jonathan. I have some doubts about how to use regmap_write() and regmap_updata_bits() appropriately
and faced difficult decisions. I propose different modifications as follows and I would like to get some suggestions
from you. Thanks!
> -----Original Message-----
> From: Jonathan Cameron <jic23@kernel.org>
> Sent: Saturday, December 31, 2022 10:51 PM
> To: Carlos Song <carlos.song@nxp.com>
> Cc: lars@metafoo.de; rjones@gateworks.com;
> Jonathan.Cameron@huawei.com; Bough Chen <haibo.chen@nxp.com>;
> dl-linux-imx <linux-imx@nxp.com>; linux-iio@vger.kernel.org
> Subject: [EXT] Re: [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode
> readback
>
> Caution: EXT Email
>
> On Wed, 28 Dec 2022 17:39:38 +0800
> carlos.song@nxp.com wrote:
>
> > From: Carlos Song <carlos.song@nxp.com>
> >
> > The absence of a correct offset leads an incorrect ODR mode readback
> > after use a hexadecimal number to mark the value from
> > FXOS8700_CTRL_REG1.
> >
> > Get ODR mode by field mask and FIELD_GET clearly and conveniently.
> > And attach other additional fix for keeping the original code logic
> > and a good readability.
> >
> > Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> > Signed-off-by: Carlos Song <carlos.song@nxp.com>
> Hi Carlos,
>
> I'm fairly sure the new code doesn't quite work correctly. See inline.
>
> Jonathan
>
> > ---
> > Changes for V4:
> > - Use ODR_MSK in the first place that merged the first two patches
> > in V3 into this patch.
> > - Rework commit log
> > Changes for V3:
> > - Remove FXOS8700_CTRL_ODR_GENMSK and set
> FXOS8700_CTRL_ODR_MSK a
> > field mask
> > - Legal use of filed mask and FIELD_PREP() to select ODR mode
> > - Rework commit log
> > ---
> > drivers/iio/imu/fxos8700_core.c | 11 +++++------
> > 1 file changed, 5 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/iio/imu/fxos8700_core.c
> > b/drivers/iio/imu/fxos8700_core.c index 773f62203bf0..a1af5d0fde5d
> > 100644
> > --- a/drivers/iio/imu/fxos8700_core.c
> > +++ b/drivers/iio/imu/fxos8700_core.c
> > @@ -10,6 +10,7 @@
> > #include <linux/regmap.h>
> > #include <linux/acpi.h>
> > #include <linux/bitops.h>
> > +#include <linux/bitfield.h>
> >
> > #include <linux/iio/iio.h>
> > #include <linux/iio/sysfs.h>
> > @@ -144,9 +145,9 @@
> > #define FXOS8700_NVM_DATA_BNK0 0xa7
> >
> > /* Bit definitions for FXOS8700_CTRL_REG1 */
> > -#define FXOS8700_CTRL_ODR_MSK 0x38
> > #define FXOS8700_CTRL_ODR_MAX 0x00
> > #define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
> > +#define FXOS8700_CTRL_ODR_MSK GENMASK(5, 3)
> >
> > /* Bit definitions for FXOS8700_M_CTRL_REG1 */
> > #define FXOS8700_HMS_MASK GENMASK(1, 0)
> > @@ -508,10 +509,8 @@ static int fxos8700_set_odr(struct fxos8700_data
> *data, enum fxos8700_sensor t,
> > if (i >= odr_num)
> > return -EINVAL;
> >
> > - return regmap_update_bits(data->regmap,
> > - FXOS8700_CTRL_REG1,
> > - FXOS8700_CTRL_ODR_MSK +
> FXOS8700_ACTIVE,
> > - fxos8700_odr[i].bits << 3 |
> active_mode);
> > + val = val | FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> > + fxos8700_odr[i].bits) | active_mode;
>
> val |= would be neater.
>
> Also, if I read the existing code correctly, val hasn't been masked, so if
> active_mode was set in val, it still will be, hence no need to or it in again.
> You also haven't masked out _CTRL_ODR_MSK so as a result of this call you will
> get the bitwise or of whatever ODR value you are trying to set and whatever it
> was set to before.
>
>
> > + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
> > }
> >
I am so sorry that I don't use the FIELD_PREP correctly due to my rustiness.
Firstly I fix the issue I haven't masked out _CTRL_ODR_MSK. But activating the device
is required after that so I or FXOS8700_ACTIVE instead or active_mode. Then I want to
discuss about the appropriate usage scenarios about regmap_write and regmap_update_bits.
In source code, regmap_write use _regmap_write only while regmap_update_bits encapsulates
_regmap_read, modify mask bits and _regmap write. So when need to see what the previous values
or the value has been already got before and is used at other place, it is better to use regmap_write.
We just renew the value and use regmap_write to write it to the register. If we just need modify
the register bits but there is no need to see what the previous values were, it is better to use
regmap_update_bits. It is a simple and direct means and can avoid using regmap_read to get a value
and perform bit operations.
To sum up, if the value of the register has been read by regmap_read or other methods, then use
regmap_write correspondingly to renew the value. If no value has been obtained from the register,
modifying the register using regmap_update_bits is the preferred method. I'm not sure if that's the
right understanding.
So based on it, there are two reasons that I choose regmap_write to replace regmap_update_bits:
1. There is a val which has been get by regmap_read and is used, so just use regmap_write and FIELD_PREP
to renew the val.
2. The code block used regmap_read and regmap_write to renew the value, uniform use of regmap_write
can have a good readability.
So I think the using regmap_write than regmap_update_bits is more reasonable.
@@ -508,10 +509,9 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
if (i >= odr_num)
return -EINVAL;
- return regmap_update_bits(data->regmap,
- FXOS8700_CTRL_REG1,
- FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
- fxos8700_odr[i].bits << 3 | active_mode);
+ val &= ~FXOS8700_CTRL_ODR_MSK;
+ val |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) | FXOS8700_ACTIVE;
+ return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
}
However there is a minimal fix, the patch looks more graceful:
@@ -511,7 +512,8 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
return regmap_update_bits(data->regmap,
FXOS8700_CTRL_REG1,
FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
- fxos8700_odr[i].bits << 3 | active_mode);
+ FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) |
+ FXOS8700_ACTIVE);
}
Which is better? In next patch I also faced a difficult decision about it.
> > static int fxos8700_get_odr(struct fxos8700_data *data, enum
> > fxos8700_sensor t, @@ -524,7 +523,7 @@ static int
> fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> > if (ret)
> > return ret;
> >
> > - val &= FXOS8700_CTRL_ODR_MSK;
> > + val = FIELD_GET(FXOS8700_CTRL_ODR_MSK, val);
> >
> > for (i = 0; i < odr_num; i++)
> > if (val == fxos8700_odr[i].bits)
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [EXT] Re: [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment
2022-12-31 14:54 ` Jonathan Cameron
@ 2023-01-10 7:44 ` Carlos Song
2023-01-14 17:35 ` Jonathan Cameron
0 siblings, 1 reply; 11+ messages in thread
From: Carlos Song @ 2023-01-10 7:44 UTC (permalink / raw)
To: Jonathan Cameron
Cc: lars@metafoo.de, rjones@gateworks.com,
Jonathan.Cameron@huawei.com, Bough Chen, dl-linux-imx,
linux-iio@vger.kernel.org
> -----Original Message-----
> From: Jonathan Cameron <jic23@kernel.org>
> Sent: Saturday, December 31, 2022 10:55 PM
> To: Carlos Song <carlos.song@nxp.com>
> Cc: lars@metafoo.de; rjones@gateworks.com;
> Jonathan.Cameron@huawei.com; Bough Chen <haibo.chen@nxp.com>;
> dl-linux-imx <linux-imx@nxp.com>; linux-iio@vger.kernel.org
> Subject: [EXT] Re: [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization
> ODR mode assignment
>
> Caution: EXT Email
>
> On Wed, 28 Dec 2022 17:39:39 +0800
> carlos.song@nxp.com wrote:
>
> > From: Carlos Song <carlos.song@nxp.com>
> >
> > The absence of correct offset leads a failed initialization ODR mode
> > assignment.
> >
> > Select MAX ODR mode as the initialization ODR mode by field mask and
> > FIELD_PREP.
> >
> > Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> > Signed-off-by: Carlos Song <carlos.song@nxp.com>
> > ---
> > Changes for V4:
> > - None
> > Changes for V3:
> > - Legal use of FIELD_PREP() and field mask to select initialization
> > ODR mode
> > - Rework commit log
> > ---
> > drivers/iio/imu/fxos8700_core.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/iio/imu/fxos8700_core.c
> > b/drivers/iio/imu/fxos8700_core.c index a1af5d0fde5d..de4ced979226
> > 100644
> > --- a/drivers/iio/imu/fxos8700_core.c
> > +++ b/drivers/iio/imu/fxos8700_core.c
> > @@ -611,6 +611,7 @@ static const struct iio_info fxos8700_info = {
> > static int fxos8700_chip_init(struct fxos8700_data *data, bool
> > use_spi) {
> > int ret;
> > + int reg;
> > unsigned int val;
> > struct device *dev = regmap_get_device(data->regmap);
> >
> > @@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data
> *data, bool use_spi)
> > return ret;
> >
> > /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> > - return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> > - FXOS8700_CTRL_ODR_MAX |
> FXOS8700_ACTIVE);
> > + ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
> > + if (ret)
> > + return ret;
> > + reg = reg | FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> > + FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
> reg |= will work here. However, like in previous patch I'd expect to see the
> _CTRL_ODR_MSK used in
> reg &= ~FXOS8700_CTRL_ODR_MASK;
> reg |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
>
> This is a good place to use regmap_update_bits() as there is no need to see
> what the previous values were (unlike in previous patch).
>
> > + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
> > }
> >
> > static void fxos8700_chip_uninit(void *data)
This is a good place to use regmap_update_bits(), because I don't need using the regmap_read to
get the value and perform bit operations:
@@ -666,8 +666,10 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
return ret;
/* Max ODR (800Hz individual or 400Hz hybrid), active mode */
- return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
- FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
+ return regmap_update_bits(data->regmap, FXOS8700_CTRL_REG1,
+ FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
+ FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) |
+ FXOS8700_ACTIVE);
}
static void fxos8700_chip_uninit(void *data)
Here I also faced a difficult decision:
most code block of the entire driver code uses regmap_read and regmap_write to modify registers,
only my two patches use regmap_update_bits. I admit that this is indeed a good place to
use regmap_update_bits, but do I need to consider the uniformity of the entire driver code
style when proposing a patch? When using regmap_read and regmap_write, although the
patch is a bit lengthy and jumbled, it is very uniform in terms of the overall code style.
Like this:
@@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
return ret;
/* Max ODR (800Hz individual or 400Hz hybrid), active mode */
- return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
- FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
+ ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
+ if (ret)
+ return ret;
+ reg &= ~FXOS8700_CTRL_ODR_MASK;
+ reg |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) |
+ FXOS8700_ACTIVE;
+ return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
}
static void fxos8700_chip_uninit(void *data)
How should I weigh them?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [EXT] Re: [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback
2023-01-10 7:44 ` [EXT] " Carlos Song
@ 2023-01-14 17:34 ` Jonathan Cameron
0 siblings, 0 replies; 11+ messages in thread
From: Jonathan Cameron @ 2023-01-14 17:34 UTC (permalink / raw)
To: Carlos Song
Cc: lars@metafoo.de, rjones@gateworks.com,
Jonathan.Cameron@huawei.com, Bough Chen, dl-linux-imx,
linux-iio@vger.kernel.org
On Tue, 10 Jan 2023 07:44:20 +0000
Carlos Song <carlos.song@nxp.com> wrote:
> Hi, Jonathan. I have some doubts about how to use regmap_write() and regmap_updata_bits() appropriately
> and faced difficult decisions. I propose different modifications as follows and I would like to get some suggestions
> from you. Thanks!
>
> > -----Original Message-----
> > From: Jonathan Cameron <jic23@kernel.org>
> > Sent: Saturday, December 31, 2022 10:51 PM
> > To: Carlos Song <carlos.song@nxp.com>
> > Cc: lars@metafoo.de; rjones@gateworks.com;
> > Jonathan.Cameron@huawei.com; Bough Chen <haibo.chen@nxp.com>;
> > dl-linux-imx <linux-imx@nxp.com>; linux-iio@vger.kernel.org
> > Subject: [EXT] Re: [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode
> > readback
> >
> > Caution: EXT Email
> >
> > On Wed, 28 Dec 2022 17:39:38 +0800
> > carlos.song@nxp.com wrote:
> >
> > > From: Carlos Song <carlos.song@nxp.com>
> > >
> > > The absence of a correct offset leads an incorrect ODR mode readback
> > > after use a hexadecimal number to mark the value from
> > > FXOS8700_CTRL_REG1.
> > >
> > > Get ODR mode by field mask and FIELD_GET clearly and conveniently.
> > > And attach other additional fix for keeping the original code logic
> > > and a good readability.
> > >
> > > Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> > > Signed-off-by: Carlos Song <carlos.song@nxp.com>
> > Hi Carlos,
> >
> > I'm fairly sure the new code doesn't quite work correctly. See inline.
> >
> > Jonathan
> >
> > > ---
> > > Changes for V4:
> > > - Use ODR_MSK in the first place that merged the first two patches
> > > in V3 into this patch.
> > > - Rework commit log
> > > Changes for V3:
> > > - Remove FXOS8700_CTRL_ODR_GENMSK and set
> > FXOS8700_CTRL_ODR_MSK a
> > > field mask
> > > - Legal use of filed mask and FIELD_PREP() to select ODR mode
> > > - Rework commit log
> > > ---
> > > drivers/iio/imu/fxos8700_core.c | 11 +++++------
> > > 1 file changed, 5 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/iio/imu/fxos8700_core.c
> > > b/drivers/iio/imu/fxos8700_core.c index 773f62203bf0..a1af5d0fde5d
> > > 100644
> > > --- a/drivers/iio/imu/fxos8700_core.c
> > > +++ b/drivers/iio/imu/fxos8700_core.c
> > > @@ -10,6 +10,7 @@
> > > #include <linux/regmap.h>
> > > #include <linux/acpi.h>
> > > #include <linux/bitops.h>
> > > +#include <linux/bitfield.h>
> > >
> > > #include <linux/iio/iio.h>
> > > #include <linux/iio/sysfs.h>
> > > @@ -144,9 +145,9 @@
> > > #define FXOS8700_NVM_DATA_BNK0 0xa7
> > >
> > > /* Bit definitions for FXOS8700_CTRL_REG1 */
> > > -#define FXOS8700_CTRL_ODR_MSK 0x38
> > > #define FXOS8700_CTRL_ODR_MAX 0x00
> > > #define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
> > > +#define FXOS8700_CTRL_ODR_MSK GENMASK(5, 3)
> > >
> > > /* Bit definitions for FXOS8700_M_CTRL_REG1 */
> > > #define FXOS8700_HMS_MASK GENMASK(1, 0)
> > > @@ -508,10 +509,8 @@ static int fxos8700_set_odr(struct fxos8700_data
> > *data, enum fxos8700_sensor t,
> > > if (i >= odr_num)
> > > return -EINVAL;
> > >
> > > - return regmap_update_bits(data->regmap,
> > > - FXOS8700_CTRL_REG1,
> > > - FXOS8700_CTRL_ODR_MSK +
> > FXOS8700_ACTIVE,
> > > - fxos8700_odr[i].bits << 3 |
> > active_mode);
> > > + val = val | FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> > > + fxos8700_odr[i].bits) | active_mode;
> >
> > val |= would be neater.
> >
> > Also, if I read the existing code correctly, val hasn't been masked, so if
> > active_mode was set in val, it still will be, hence no need to or it in again.
> > You also haven't masked out _CTRL_ODR_MSK so as a result of this call you will
> > get the bitwise or of whatever ODR value you are trying to set and whatever it
> > was set to before.
> >
> >
> > > + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
> > > }
> > >
>
> I am so sorry that I don't use the FIELD_PREP correctly due to my rustiness.
> Firstly I fix the issue I haven't masked out _CTRL_ODR_MSK. But activating the device
> is required after that so I or FXOS8700_ACTIVE instead or active_mode. Then I want to
> discuss about the appropriate usage scenarios about regmap_write and regmap_update_bits.
>
> In source code, regmap_write use _regmap_write only while regmap_update_bits encapsulates
> _regmap_read, modify mask bits and _regmap write. So when need to see what the previous values
> or the value has been already got before and is used at other place, it is better to use regmap_write.
> We just renew the value and use regmap_write to write it to the register. If we just need modify
> the register bits but there is no need to see what the previous values were, it is better to use
> regmap_update_bits. It is a simple and direct means and can avoid using regmap_read to get a value
> and perform bit operations.
> To sum up, if the value of the register has been read by regmap_read or other methods, then use
> regmap_write correspondingly to renew the value. If no value has been obtained from the register,
> modifying the register using regmap_update_bits is the preferred method. I'm not sure if that's the
> right understanding.
>
> So based on it, there are two reasons that I choose regmap_write to replace regmap_update_bits:
> 1. There is a val which has been get by regmap_read and is used, so just use regmap_write and FIELD_PREP
> to renew the val.
> 2. The code block used regmap_read and regmap_write to renew the value, uniform use of regmap_write
> can have a good readability.
>
> So I think the using regmap_write than regmap_update_bits is more reasonable.
> @@ -508,10 +509,9 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> if (i >= odr_num)
> return -EINVAL;
>
> - return regmap_update_bits(data->regmap,
> - FXOS8700_CTRL_REG1,
> - FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
> - fxos8700_odr[i].bits << 3 | active_mode);
> + val &= ~FXOS8700_CTRL_ODR_MSK;
> + val |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) | FXOS8700_ACTIVE;
> + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, val);
> }
>
> However there is a minimal fix, the patch looks more graceful:
> @@ -511,7 +512,8 @@ static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> return regmap_update_bits(data->regmap,
> FXOS8700_CTRL_REG1,
> FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
| not + for combining masks.
> - fxos8700_odr[i].bits << 3 | active_mode);
> + FIELD_PREP(FXOS8700_CTRL_ODR_MSK, fxos8700_odr[i].bits) |
> + FXOS8700_ACTIVE);
> }
>
> Which is better? In next patch I also faced a difficult decision about it.
I would go with the regmap_write() choice - though in cases like this I think
most important concern is readability. Sometimes that means regmap_update_bits()
is a better choice even if we already have the read value available.
I think that's not true here so regmap_write() is better option.
> > > static int fxos8700_get_odr(struct fxos8700_data *data, enum
> > > fxos8700_sensor t, @@ -524,7 +523,7 @@ static int
> > fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
> > > if (ret)
> > > return ret;
> > >
> > > - val &= FXOS8700_CTRL_ODR_MSK;
> > > + val = FIELD_GET(FXOS8700_CTRL_ODR_MSK, val);
> > >
> > > for (i = 0; i < odr_num; i++)
> > > if (val == fxos8700_odr[i].bits)
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [EXT] Re: [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment
2023-01-10 7:44 ` [EXT] " Carlos Song
@ 2023-01-14 17:35 ` Jonathan Cameron
0 siblings, 0 replies; 11+ messages in thread
From: Jonathan Cameron @ 2023-01-14 17:35 UTC (permalink / raw)
To: Carlos Song
Cc: lars@metafoo.de, rjones@gateworks.com,
Jonathan.Cameron@huawei.com, Bough Chen, dl-linux-imx,
linux-iio@vger.kernel.org
On Tue, 10 Jan 2023 07:44:23 +0000
Carlos Song <carlos.song@nxp.com> wrote:
> > -----Original Message-----
> > From: Jonathan Cameron <jic23@kernel.org>
> > Sent: Saturday, December 31, 2022 10:55 PM
> > To: Carlos Song <carlos.song@nxp.com>
> > Cc: lars@metafoo.de; rjones@gateworks.com;
> > Jonathan.Cameron@huawei.com; Bough Chen <haibo.chen@nxp.com>;
> > dl-linux-imx <linux-imx@nxp.com>; linux-iio@vger.kernel.org
> > Subject: [EXT] Re: [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization
> > ODR mode assignment
> >
> > Caution: EXT Email
> >
> > On Wed, 28 Dec 2022 17:39:39 +0800
> > carlos.song@nxp.com wrote:
> >
> > > From: Carlos Song <carlos.song@nxp.com>
> > >
> > > The absence of correct offset leads a failed initialization ODR mode
> > > assignment.
> > >
> > > Select MAX ODR mode as the initialization ODR mode by field mask and
> > > FIELD_PREP.
> > >
> > > Fixes: 84e5ddd5c46e ("iio: imu: Add support for the FXOS8700 IMU")
> > > Signed-off-by: Carlos Song <carlos.song@nxp.com>
> > > ---
> > > Changes for V4:
> > > - None
> > > Changes for V3:
> > > - Legal use of FIELD_PREP() and field mask to select initialization
> > > ODR mode
> > > - Rework commit log
> > > ---
> > > drivers/iio/imu/fxos8700_core.c | 8 ++++++--
> > > 1 file changed, 6 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/iio/imu/fxos8700_core.c
> > > b/drivers/iio/imu/fxos8700_core.c index a1af5d0fde5d..de4ced979226
> > > 100644
> > > --- a/drivers/iio/imu/fxos8700_core.c
> > > +++ b/drivers/iio/imu/fxos8700_core.c
> > > @@ -611,6 +611,7 @@ static const struct iio_info fxos8700_info = {
> > > static int fxos8700_chip_init(struct fxos8700_data *data, bool
> > > use_spi) {
> > > int ret;
> > > + int reg;
> > > unsigned int val;
> > > struct device *dev = regmap_get_device(data->regmap);
> > >
> > > @@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data
> > *data, bool use_spi)
> > > return ret;
> > >
> > > /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> > > - return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> > > - FXOS8700_CTRL_ODR_MAX |
> > FXOS8700_ACTIVE);
> > > + ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
> > > + if (ret)
> > > + return ret;
> > > + reg = reg | FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> > > + FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
> > reg |= will work here. However, like in previous patch I'd expect to see the
> > _CTRL_ODR_MSK used in
> > reg &= ~FXOS8700_CTRL_ODR_MASK;
> > reg |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK,
> > FXOS8700_CTRL_ODR_MAX) | FXOS8700_ACTIVE;
> >
> > This is a good place to use regmap_update_bits() as there is no need to see
> > what the previous values were (unlike in previous patch).
> >
> > > + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
> > > }
> > >
> > > static void fxos8700_chip_uninit(void *data)
>
> This is a good place to use regmap_update_bits(), because I don't need using the regmap_read to
> get the value and perform bit operations:
> @@ -666,8 +666,10 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
> return ret;
>
> /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> - return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> - FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
> + return regmap_update_bits(data->regmap, FXOS8700_CTRL_REG1,
> + FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
> + FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) |
> + FXOS8700_ACTIVE);
> }
>
>
> static void fxos8700_chip_uninit(void *data)
>
> Here I also faced a difficult decision:
> most code block of the entire driver code uses regmap_read and regmap_write to modify registers,
> only my two patches use regmap_update_bits. I admit that this is indeed a good place to
> use regmap_update_bits, but do I need to consider the uniformity of the entire driver code
> style when proposing a patch? When using regmap_read and regmap_write, although the
> patch is a bit lengthy and jumbled, it is very uniform in terms of the overall code style.
> Like this:
>
> @@ -663,8 +664,11 @@ static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
> return ret;
>
> /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> - return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> - FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
> + ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, ®);
> + if (ret)
> + return ret;
> + reg &= ~FXOS8700_CTRL_ODR_MASK;
> + reg |= FIELD_PREP(FXOS8700_CTRL_ODR_MSK, FXOS8700_CTRL_ODR_MAX) |
> + FXOS8700_ACTIVE;
> + return regmap_write(data->regmap, FXOS8700_CTRL_REG1, reg);
> }
>
> static void fxos8700_chip_uninit(void *data)
>
> How should I weigh them?
If code is simpler / more readable with regmap_update_bits() then that is the better
option. If there are other places in the driver where it is appropriate to change
to this function then it would be great to make that improvement as well (I haven't
looked!)
Jonathan
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-01-14 17:22 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-28 9:39 [PATCH v4 0/4] iio: imu: fxos8700: fix bugs about ODR and changes for a good readability carlos.song
2022-12-28 9:39 ` [PATCH v4 1/4] iio: imu: fxos8700: fix incorrect ODR mode readback carlos.song
2022-12-31 14:51 ` Jonathan Cameron
2023-01-10 7:44 ` [EXT] " Carlos Song
2023-01-14 17:34 ` Jonathan Cameron
2022-12-28 9:39 ` [PATCH v4 2/4] iio: imu: fxos8700: fix failed initialization ODR mode assignment carlos.song
2022-12-31 14:54 ` Jonathan Cameron
2023-01-10 7:44 ` [EXT] " Carlos Song
2023-01-14 17:35 ` Jonathan Cameron
2022-12-28 9:39 ` [PATCH v4 3/4] iio: imu: fxos8700: remove definition FXOS8700_CTRL_ODR_MIN carlos.song
2022-12-28 9:39 ` [PATCH v4 4/4] iio: imu: fxos8700: fix MAGN sensor scale and unit carlos.song
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).