linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L
@ 2022-05-09 13:46 LI Qingwu
  2022-05-09 13:46 ` [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate LI Qingwu
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

Modified the unit after application of scale from 100*m/s^2 to m/s^2,
since the units in the ABI documents are m/s^2.
Add supports for BMI085 accelerometer.
Add supports for BMI090L accelerometer.
Make it possible to config scales.

LI Qingwu (5):
  iio: accel: bmi088: Modified the scale calculate
  iio: accel: bmi088: Add support for bmi085 accel.
  iio: accel: bmi088: Add support for bmi090l accel
  iio: accel: bmi088: Make it possible to config scales.
  iio: accel: bmi088: modifed the device name.

 drivers/iio/accel/bmi088-accel-core.c | 62 ++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 7 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate
  2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
@ 2022-05-09 13:46 ` LI Qingwu
  2022-05-10  6:01   ` Alexandru Ardelean
  2022-05-09 13:46 ` [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel LI Qingwu
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

The units after application of scale are 100*m/s^2,
The scale calculation is only for the device
with the range of 3, 6, 12, and 24g,
but some other chips have a range of 2, 4, 6, and 8g.

Modified the formula to a scale list.
The scales in the list are calculated by 1/sensitivity*9.8.
The new units after the application of scale are m/s^2.

Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
---
 drivers/iio/accel/bmi088-accel-core.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
index a06dae5c971d..0c58ffdd00e3 100644
--- a/drivers/iio/accel/bmi088-accel-core.c
+++ b/drivers/iio/accel/bmi088-accel-core.c
@@ -119,6 +119,7 @@ struct bmi088_accel_chip_info {
 	u8 chip_id;
 	const struct iio_chan_spec *channels;
 	int num_channels;
+	const int scale_table[4][2];
 };
 
 struct bmi088_accel_data {
@@ -280,6 +281,7 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
 	struct bmi088_accel_data *data = iio_priv(indio_dev);
 	struct device *dev = regmap_get_device(data->regmap);
 	int ret;
+	int reg;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
@@ -330,13 +332,12 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
 				return ret;
 
 			ret = regmap_read(data->regmap,
-					  BMI088_ACCEL_REG_ACC_RANGE, val);
+					  BMI088_ACCEL_REG_ACC_RANGE, &reg);
 			if (ret)
 				goto out_read_raw_pm_put;
-
-			*val2 = 15 - (*val & 0x3);
-			*val = 3 * 980;
-			ret = IIO_VAL_FRACTIONAL_LOG2;
+			*val = data->chip_info->scale_table[reg][0];
+			*val2 = data->chip_info->scale_table[reg][1];
+			ret = IIO_VAL_INT_PLUS_MICRO;
 
 			goto out_read_raw_pm_put;
 		default:
@@ -432,6 +433,7 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
 		.chip_id = 0x1E,
 		.channels = bmi088_accel_channels,
 		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
+		.scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},
 	},
 };
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel.
  2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
  2022-05-09 13:46 ` [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate LI Qingwu
@ 2022-05-09 13:46 ` LI Qingwu
  2022-05-10  6:04   ` Alexandru Ardelean
  2022-05-09 13:46 ` [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel LI Qingwu
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

Add supports for BMI085, an Inertial Measurement Unit,
with an accelerometer and gyroscope.
The commit adds the accelerometer driver for the SPI interface.
The gyroscope part is already supported by the BMG160 driver.
Different from BMI088, the BMI085 accelerometer has the range of
+/-2, 4, 6, and 8g.

Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
---
 drivers/iio/accel/bmi088-accel-core.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
index 0c58ffdd00e3..ac8acf6e2ff0 100644
--- a/drivers/iio/accel/bmi088-accel-core.c
+++ b/drivers/iio/accel/bmi088-accel-core.c
@@ -435,6 +435,13 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
 		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
 		.scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},
 	},
+	[1] = {
+		.name = "bmi085-accel",
+		.chip_id = 0x1F,
+		.channels = bmi088_accel_channels,
+		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
+		.scale_table = {{0, 598}, {0, 1196}, {0, 2393}, {0, 4785}},
+	},
 };
 
 static const struct iio_info bmi088_accel_info = {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel
  2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
  2022-05-09 13:46 ` [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate LI Qingwu
  2022-05-09 13:46 ` [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel LI Qingwu
@ 2022-05-09 13:46 ` LI Qingwu
  2022-05-10  6:05   ` Alexandru Ardelean
  2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
  2022-05-09 13:46 ` [PATCH V1 5/5] iio: accel: bmi088: modifed the device name LI Qingwu
  4 siblings, 1 reply; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

Add supports for BMI090L, it's a high-performance Inertial
Measurement Unit, with an accelerometer and gyroscope.
The commit adds the accelerometer driver for the SPI interface.
The gyroscope part is already supported by the BMG160 driver.
Same as BMI088, BMI090L have the range of +/-3, 6, 12, and 24g.

Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
---
 drivers/iio/accel/bmi088-accel-core.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
index ac8acf6e2ff0..44cbe098c093 100644
--- a/drivers/iio/accel/bmi088-accel-core.c
+++ b/drivers/iio/accel/bmi088-accel-core.c
@@ -442,6 +442,13 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
 		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
 		.scale_table = {{0, 598}, {0, 1196}, {0, 2393}, {0, 4785}},
 	},
+	[2] = {
+		.name = "bmi090l-accel",
+		.chip_id = 0x1A,
+		.channels = bmi088_accel_channels,
+		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
+		.scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},
+	},
 };
 
 static const struct iio_info bmi088_accel_info = {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.
  2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
                   ` (2 preceding siblings ...)
  2022-05-09 13:46 ` [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel LI Qingwu
@ 2022-05-09 13:46 ` LI Qingwu
  2022-05-09 17:24   ` kernel test robot
                     ` (2 more replies)
  2022-05-09 13:46 ` [PATCH V1 5/5] iio: accel: bmi088: modifed the device name LI Qingwu
  4 siblings, 3 replies; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

All the sensors can set the scales by writing the range register 0x41,
The current driver has no interface to configure it.
The commit adds the interface for config the scales.

Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
---
 drivers/iio/accel/bmi088-accel-core.c | 32 +++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
index 44cbe098c093..7c78cfb321ee 100644
--- a/drivers/iio/accel/bmi088-accel-core.c
+++ b/drivers/iio/accel/bmi088-accel-core.c
@@ -237,6 +237,23 @@ static int bmi088_accel_set_sample_freq(struct bmi088_accel_data *data, int val)
 				  BMI088_ACCEL_MODE_ODR_MASK, regval);
 }
 
+static int bmi088_accel_set_scale(struct bmi088_accel_data *data, int val, int val2)
+{
+	unsigned int i;
+	int ret;
+	int reg;
+
+	for (i = 0; i < 4; i++)
+		if (val == data->chip_info->scale_table[i][0] &&
+		    val2 == data->chip_info->scale_table[i][1])
+			break;
+
+	if (i >= 4)
+		return -EINVAL;
+
+	return regmap_write(data->regmap, BMI088_ACCEL_REG_ACC_RANGE, i);
+}
+
 static int bmi088_accel_get_temp(struct bmi088_accel_data *data, int *val)
 {
 	int ret;
@@ -368,7 +385,13 @@ static int bmi088_accel_read_avail(struct iio_dev *indio_dev,
 			     const int **vals, int *type, int *length,
 			     long mask)
 {
+	struct bmi088_accel_data *data = iio_priv(indio_dev);
 	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		*vals = (const int *)data->chip_info->scale_table;
+		*length = 8;
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		return IIO_AVAIL_LIST;
 	case IIO_CHAN_INFO_SAMP_FREQ:
 		*type = IIO_VAL_INT_PLUS_MICRO;
 		*vals = bmi088_sample_freqs;
@@ -388,6 +411,14 @@ static int bmi088_accel_write_raw(struct iio_dev *indio_dev,
 	int ret;
 
 	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		ret = pm_runtime_resume_and_get(dev);
+		if (ret)
+			return ret;
+		ret = bmi088_accel_set_scale(data, val, val2);
+		pm_runtime_mark_last_busy(dev);
+		pm_runtime_put_autosuspend(dev);
+		return ret;
 	case IIO_CHAN_INFO_SAMP_FREQ:
 		ret = pm_runtime_resume_and_get(dev);
 		if (ret)
@@ -410,6 +441,7 @@ static int bmi088_accel_write_raw(struct iio_dev *indio_dev,
 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
 				BIT(IIO_CHAN_INFO_SAMP_FREQ), \
 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
+				BIT(IIO_CHAN_INFO_SCALE ), \
 	.scan_index = AXIS_##_axis, \
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V1 5/5] iio: accel: bmi088: modifed the device name.
  2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
                   ` (3 preceding siblings ...)
  2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
@ 2022-05-09 13:46 ` LI Qingwu
  2022-05-10  7:35   ` Alexandru Ardelean
  4 siblings, 1 reply; 14+ messages in thread
From: LI Qingwu @ 2022-05-09 13:46 UTC (permalink / raw)
  To: jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel, Qing-wu.Li

It is possible to have multiple sensors connected on the same platform,
The commit makes it possible to obtain the device name for
the different chips according to the connected chip ID.

To be compatible with previous versions, renambmi088a to bmi088-accel.

Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
---
 drivers/iio/accel/bmi088-accel-core.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
index 7c78cfb321ee..8f6920dc2ad9 100644
--- a/drivers/iio/accel/bmi088-accel-core.c
+++ b/drivers/iio/accel/bmi088-accel-core.c
@@ -461,7 +461,7 @@ static const struct iio_chan_spec bmi088_accel_channels[] = {
 
 static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
 	[0] = {
-		.name = "bmi088a",
+		.name = "bmi088-accel",
 		.chip_id = 0x1E,
 		.channels = bmi088_accel_channels,
 		.num_channels = ARRAY_SIZE(bmi088_accel_channels),
@@ -561,7 +561,7 @@ int bmi088_accel_core_probe(struct device *dev, struct regmap *regmap,
 
 	indio_dev->channels = data->chip_info->channels;
 	indio_dev->num_channels = data->chip_info->num_channels;
-	indio_dev->name = name ? name : data->chip_info->name;
+	indio_dev->name = data->chip_info->name;
 	indio_dev->available_scan_masks = bmi088_accel_scan_masks;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 	indio_dev->info = &bmi088_accel_info;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.
  2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
@ 2022-05-09 17:24   ` kernel test robot
  2022-05-09 18:50   ` kernel test robot
  2022-05-10  7:01   ` Alexandru Ardelean
  2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2022-05-09 17:24 UTC (permalink / raw)
  To: LI Qingwu, jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel
  Cc: kbuild-all

Hi LI,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on v5.18-rc6 next-20220509]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/LI-Qingwu/iio-accel-bmi088-support-BMI085-BMI090L/20220509-215750
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: i386-randconfig-r013-20220509 (https://download.01.org/0day-ci/archive/20220510/202205100100.6k4OJbjS-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.2.0-20) 11.2.0
reproduce (this is a W=1 build):
        # https://github.com/intel-lab-lkp/linux/commit/70883e96ff4d7433fa8974815aba932f8bb2e8e7
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review LI-Qingwu/iio-accel-bmi088-support-BMI085-BMI090L/20220509-215750
        git checkout 70883e96ff4d7433fa8974815aba932f8bb2e8e7
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/iio/accel/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/iio/accel/bmi088-accel-core.c: In function 'bmi088_accel_set_scale':
>> drivers/iio/accel/bmi088-accel-core.c:244:13: warning: unused variable 'reg' [-Wunused-variable]
     244 |         int reg;
         |             ^~~
>> drivers/iio/accel/bmi088-accel-core.c:243:13: warning: unused variable 'ret' [-Wunused-variable]
     243 |         int ret;
         |             ^~~


vim +/reg +244 drivers/iio/accel/bmi088-accel-core.c

   239	
   240	static int bmi088_accel_set_scale(struct bmi088_accel_data *data, int val, int val2)
   241	{
   242		unsigned int i;
 > 243		int ret;
 > 244		int reg;
   245	
   246		for (i = 0; i < 4; i++)
   247			if (val == data->chip_info->scale_table[i][0] &&
   248			    val2 == data->chip_info->scale_table[i][1])
   249				break;
   250	
   251		if (i >= 4)
   252			return -EINVAL;
   253	
   254		return regmap_write(data->regmap, BMI088_ACCEL_REG_ACC_RANGE, i);
   255	}
   256	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.
  2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
  2022-05-09 17:24   ` kernel test robot
@ 2022-05-09 18:50   ` kernel test robot
  2022-05-10  7:01   ` Alexandru Ardelean
  2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2022-05-09 18:50 UTC (permalink / raw)
  To: LI Qingwu, jic23, lars, mchehab+huawei, ardeleanalex, linux-iio,
	linux-kernel
  Cc: llvm, kbuild-all

Hi LI,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on v5.18-rc6 next-20220509]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/LI-Qingwu/iio-accel-bmi088-support-BMI085-BMI090L/20220509-215750
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: x86_64-randconfig-a003-20220509 (https://download.01.org/0day-ci/archive/20220510/202205100238.ZzT44bv1-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a385645b470e2d3a1534aae618ea56b31177639f)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/70883e96ff4d7433fa8974815aba932f8bb2e8e7
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review LI-Qingwu/iio-accel-bmi088-support-BMI085-BMI090L/20220509-215750
        git checkout 70883e96ff4d7433fa8974815aba932f8bb2e8e7
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/iio/accel/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/iio/accel/bmi088-accel-core.c:243:6: warning: unused variable 'ret' [-Wunused-variable]
           int ret;
               ^
>> drivers/iio/accel/bmi088-accel-core.c:244:6: warning: unused variable 'reg' [-Wunused-variable]
           int reg;
               ^
   2 warnings generated.


vim +/ret +243 drivers/iio/accel/bmi088-accel-core.c

   239	
   240	static int bmi088_accel_set_scale(struct bmi088_accel_data *data, int val, int val2)
   241	{
   242		unsigned int i;
 > 243		int ret;
 > 244		int reg;
   245	
   246		for (i = 0; i < 4; i++)
   247			if (val == data->chip_info->scale_table[i][0] &&
   248			    val2 == data->chip_info->scale_table[i][1])
   249				break;
   250	
   251		if (i >= 4)
   252			return -EINVAL;
   253	
   254		return regmap_write(data->regmap, BMI088_ACCEL_REG_ACC_RANGE, i);
   255	}
   256	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate
  2022-05-09 13:46 ` [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate LI Qingwu
@ 2022-05-10  6:01   ` Alexandru Ardelean
  2022-05-14 15:14     ` Jonathan Cameron
  0 siblings, 1 reply; 14+ messages in thread
From: Alexandru Ardelean @ 2022-05-10  6:01 UTC (permalink / raw)
  To: LI Qingwu
  Cc: Jonathan Cameron, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<Qing-wu.Li@leica-geosystems.com.cn> wrote:
>
> The units after application of scale are 100*m/s^2,
> The scale calculation is only for the device
> with the range of 3, 6, 12, and 24g,
> but some other chips have a range of 2, 4, 6, and 8g.
>
> Modified the formula to a scale list.
> The scales in the list are calculated by 1/sensitivity*9.8.
> The new units after the application of scale are m/s^2.
>
> Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> ---
>  drivers/iio/accel/bmi088-accel-core.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> index a06dae5c971d..0c58ffdd00e3 100644
> --- a/drivers/iio/accel/bmi088-accel-core.c
> +++ b/drivers/iio/accel/bmi088-accel-core.c
> @@ -119,6 +119,7 @@ struct bmi088_accel_chip_info {
>         u8 chip_id;
>         const struct iio_chan_spec *channels;
>         int num_channels;
> +       const int scale_table[4][2];
>  };
>
>  struct bmi088_accel_data {
> @@ -280,6 +281,7 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
>         struct bmi088_accel_data *data = iio_priv(indio_dev);
>         struct device *dev = regmap_get_device(data->regmap);
>         int ret;
> +       int reg;
>
>         switch (mask) {
>         case IIO_CHAN_INFO_RAW:
> @@ -330,13 +332,12 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
>                                 return ret;
>
>                         ret = regmap_read(data->regmap,
> -                                         BMI088_ACCEL_REG_ACC_RANGE, val);
> +                                         BMI088_ACCEL_REG_ACC_RANGE, &reg);

Curios: do we need to validate the value of `reg` here?
If it goes outside of the 0...3 range, I can see a bit of access
violation (kernel panic) happening.

>                         if (ret)
>                                 goto out_read_raw_pm_put;
> -
> -                       *val2 = 15 - (*val & 0x3);
> -                       *val = 3 * 980;
> -                       ret = IIO_VAL_FRACTIONAL_LOG2;

Not sure what the policy is about changing this now.
I'll leave this to Jonathan.

> +                       *val = data->chip_info->scale_table[reg][0];
> +                       *val2 = data->chip_info->scale_table[reg][1];
> +                       ret = IIO_VAL_INT_PLUS_MICRO;
>
>                         goto out_read_raw_pm_put;
>                 default:
> @@ -432,6 +433,7 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
>                 .chip_id = 0x1E,
>                 .channels = bmi088_accel_channels,
>                 .num_channels = ARRAY_SIZE(bmi088_accel_channels),
> +               .scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},

I like the idea of this scale_table.
It makes things easier to see (what's happening) without looking into
the datasheet much.

>         },
>  };
>
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel.
  2022-05-09 13:46 ` [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel LI Qingwu
@ 2022-05-10  6:04   ` Alexandru Ardelean
  0 siblings, 0 replies; 14+ messages in thread
From: Alexandru Ardelean @ 2022-05-10  6:04 UTC (permalink / raw)
  To: LI Qingwu
  Cc: Jonathan Cameron, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<Qing-wu.Li@leica-geosystems.com.cn> wrote:
>
> Add supports for BMI085, an Inertial Measurement Unit,
> with an accelerometer and gyroscope.
> The commit adds the accelerometer driver for the SPI interface.
> The gyroscope part is already supported by the BMG160 driver.
> Different from BMI088, the BMI085 accelerometer has the range of
> +/-2, 4, 6, and 8g.
>

Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>

> Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> ---
>  drivers/iio/accel/bmi088-accel-core.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> index 0c58ffdd00e3..ac8acf6e2ff0 100644
> --- a/drivers/iio/accel/bmi088-accel-core.c
> +++ b/drivers/iio/accel/bmi088-accel-core.c
> @@ -435,6 +435,13 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
>                 .num_channels = ARRAY_SIZE(bmi088_accel_channels),
>                 .scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},
>         },
> +       [1] = {
> +               .name = "bmi085-accel",
> +               .chip_id = 0x1F,
> +               .channels = bmi088_accel_channels,
> +               .num_channels = ARRAY_SIZE(bmi088_accel_channels),
> +               .scale_table = {{0, 598}, {0, 1196}, {0, 2393}, {0, 4785}},
> +       },
>  };
>
>  static const struct iio_info bmi088_accel_info = {
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel
  2022-05-09 13:46 ` [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel LI Qingwu
@ 2022-05-10  6:05   ` Alexandru Ardelean
  0 siblings, 0 replies; 14+ messages in thread
From: Alexandru Ardelean @ 2022-05-10  6:05 UTC (permalink / raw)
  To: LI Qingwu
  Cc: Jonathan Cameron, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<Qing-wu.Li@leica-geosystems.com.cn> wrote:
>
> Add supports for BMI090L, it's a high-performance Inertial
> Measurement Unit, with an accelerometer and gyroscope.
> The commit adds the accelerometer driver for the SPI interface.
> The gyroscope part is already supported by the BMG160 driver.
> Same as BMI088, BMI090L have the range of +/-3, 6, 12, and 24g.
>

Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>

> Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> ---
>  drivers/iio/accel/bmi088-accel-core.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> index ac8acf6e2ff0..44cbe098c093 100644
> --- a/drivers/iio/accel/bmi088-accel-core.c
> +++ b/drivers/iio/accel/bmi088-accel-core.c
> @@ -442,6 +442,13 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
>                 .num_channels = ARRAY_SIZE(bmi088_accel_channels),
>                 .scale_table = {{0, 598}, {0, 1196}, {0, 2393}, {0, 4785}},
>         },
> +       [2] = {
> +               .name = "bmi090l-accel",
> +               .chip_id = 0x1A,
> +               .channels = bmi088_accel_channels,
> +               .num_channels = ARRAY_SIZE(bmi088_accel_channels),
> +               .scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},
> +       },
>  };
>
>  static const struct iio_info bmi088_accel_info = {
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.
  2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
  2022-05-09 17:24   ` kernel test robot
  2022-05-09 18:50   ` kernel test robot
@ 2022-05-10  7:01   ` Alexandru Ardelean
  2 siblings, 0 replies; 14+ messages in thread
From: Alexandru Ardelean @ 2022-05-10  7:01 UTC (permalink / raw)
  To: LI Qingwu
  Cc: Jonathan Cameron, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<Qing-wu.Li@leica-geosystems.com.cn> wrote:
>
> All the sensors can set the scales by writing the range register 0x41,
> The current driver has no interface to configure it.
> The commit adds the interface for config the scales.

With the warnings fixed:


Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>


>
> Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> ---
>  drivers/iio/accel/bmi088-accel-core.c | 32 +++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
>
> diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> index 44cbe098c093..7c78cfb321ee 100644
> --- a/drivers/iio/accel/bmi088-accel-core.c
> +++ b/drivers/iio/accel/bmi088-accel-core.c
> @@ -237,6 +237,23 @@ static int bmi088_accel_set_sample_freq(struct bmi088_accel_data *data, int val)
>                                   BMI088_ACCEL_MODE_ODR_MASK, regval);
>  }
>
> +static int bmi088_accel_set_scale(struct bmi088_accel_data *data, int val, int val2)
> +{
> +       unsigned int i;
> +       int ret;
> +       int reg;
> +
> +       for (i = 0; i < 4; i++)
> +               if (val == data->chip_info->scale_table[i][0] &&
> +                   val2 == data->chip_info->scale_table[i][1])
> +                       break;
> +
> +       if (i >= 4)
> +               return -EINVAL;
> +
> +       return regmap_write(data->regmap, BMI088_ACCEL_REG_ACC_RANGE, i);
> +}
> +
>  static int bmi088_accel_get_temp(struct bmi088_accel_data *data, int *val)
>  {
>         int ret;
> @@ -368,7 +385,13 @@ static int bmi088_accel_read_avail(struct iio_dev *indio_dev,
>                              const int **vals, int *type, int *length,
>                              long mask)
>  {
> +       struct bmi088_accel_data *data = iio_priv(indio_dev);
>         switch (mask) {
> +       case IIO_CHAN_INFO_SCALE:
> +               *vals = (const int *)data->chip_info->scale_table;
> +               *length = 8;
> +               *type = IIO_VAL_INT_PLUS_MICRO;
> +               return IIO_AVAIL_LIST;
>         case IIO_CHAN_INFO_SAMP_FREQ:
>                 *type = IIO_VAL_INT_PLUS_MICRO;
>                 *vals = bmi088_sample_freqs;
> @@ -388,6 +411,14 @@ static int bmi088_accel_write_raw(struct iio_dev *indio_dev,
>         int ret;
>
>         switch (mask) {
> +       case IIO_CHAN_INFO_SCALE:
> +               ret = pm_runtime_resume_and_get(dev);
> +               if (ret)
> +                       return ret;
> +               ret = bmi088_accel_set_scale(data, val, val2);
> +               pm_runtime_mark_last_busy(dev);
> +               pm_runtime_put_autosuspend(dev);
> +               return ret;
>         case IIO_CHAN_INFO_SAMP_FREQ:
>                 ret = pm_runtime_resume_and_get(dev);
>                 if (ret)
> @@ -410,6 +441,7 @@ static int bmi088_accel_write_raw(struct iio_dev *indio_dev,
>         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
>                                 BIT(IIO_CHAN_INFO_SAMP_FREQ), \
>         .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
> +                               BIT(IIO_CHAN_INFO_SCALE ), \
>         .scan_index = AXIS_##_axis, \
>  }
>
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 5/5] iio: accel: bmi088: modifed the device name.
  2022-05-09 13:46 ` [PATCH V1 5/5] iio: accel: bmi088: modifed the device name LI Qingwu
@ 2022-05-10  7:35   ` Alexandru Ardelean
  0 siblings, 0 replies; 14+ messages in thread
From: Alexandru Ardelean @ 2022-05-10  7:35 UTC (permalink / raw)
  To: LI Qingwu
  Cc: Jonathan Cameron, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<Qing-wu.Li@leica-geosystems.com.cn> wrote:
>
> It is possible to have multiple sensors connected on the same platform,
> The commit makes it possible to obtain the device name for
> the different chips according to the connected chip ID.
>
> To be compatible with previous versions, renambmi088a to bmi088-accel.
>
> Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> ---
>  drivers/iio/accel/bmi088-accel-core.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> index 7c78cfb321ee..8f6920dc2ad9 100644
> --- a/drivers/iio/accel/bmi088-accel-core.c
> +++ b/drivers/iio/accel/bmi088-accel-core.c
> @@ -461,7 +461,7 @@ static const struct iio_chan_spec bmi088_accel_channels[] = {
>
>  static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
>         [0] = {
> -               .name = "bmi088a",
> +               .name = "bmi088-accel",
>                 .chip_id = 0x1E,
>                 .channels = bmi088_accel_channels,
>                 .num_channels = ARRAY_SIZE(bmi088_accel_channels),
> @@ -561,7 +561,7 @@ int bmi088_accel_core_probe(struct device *dev, struct regmap *regmap,
>
>         indio_dev->channels = data->chip_info->channels;
>         indio_dev->num_channels = data->chip_info->num_channels;
> -       indio_dev->name = name ? name : data->chip_info->name;

This makes the 'name' parameter unused now.
Which begs the question if it should be removed.

One other detail is that the device-tree will need to set a compatible
string to 'bmi088-accel' and this will work (for SPI devices) for all
chip-types (including the new ones).

This raises the question of whether we should update the new chips in
the DT yaml doc here?

Documentation/devicetree/bindings/iio/accel/bosch,bmi088.yaml

properties:
  compatible:
    enum:
      - bosch,bmi088-accel

If yes, then the 'drivers/iio/accel/bmi088-accel-spi.c' file also
requires an update with the new device-names.

> +       indio_dev->name = data->chip_info->name;
>         indio_dev->available_scan_masks = bmi088_accel_scan_masks;
>         indio_dev->modes = INDIO_DIRECT_MODE;
>         indio_dev->info = &bmi088_accel_info;
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate
  2022-05-10  6:01   ` Alexandru Ardelean
@ 2022-05-14 15:14     ` Jonathan Cameron
  0 siblings, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2022-05-14 15:14 UTC (permalink / raw)
  To: Alexandru Ardelean
  Cc: LI Qingwu, Lars-Peter Clausen, mchehab+huawei, linux-iio, LKML

On Tue, 10 May 2022 09:01:20 +0300
Alexandru Ardelean <ardeleanalex@gmail.com> wrote:

> On Mon, May 9, 2022 at 4:46 PM LI Qingwu
> <Qing-wu.Li@leica-geosystems.com.cn> wrote:
> >
> > The units after application of scale are 100*m/s^2,
> > The scale calculation is only for the device
> > with the range of 3, 6, 12, and 24g,
> > but some other chips have a range of 2, 4, 6, and 8g.
> >
> > Modified the formula to a scale list.
> > The scales in the list are calculated by 1/sensitivity*9.8.
> > The new units after the application of scale are m/s^2.
> >
> > Signed-off-by: LI Qingwu <Qing-wu.Li@leica-geosystems.com.cn>
> > ---
> >  drivers/iio/accel/bmi088-accel-core.c | 12 +++++++-----
> >  1 file changed, 7 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c
> > index a06dae5c971d..0c58ffdd00e3 100644
> > --- a/drivers/iio/accel/bmi088-accel-core.c
> > +++ b/drivers/iio/accel/bmi088-accel-core.c
> > @@ -119,6 +119,7 @@ struct bmi088_accel_chip_info {
> >         u8 chip_id;
> >         const struct iio_chan_spec *channels;
> >         int num_channels;
> > +       const int scale_table[4][2];
> >  };
> >
> >  struct bmi088_accel_data {
> > @@ -280,6 +281,7 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
> >         struct bmi088_accel_data *data = iio_priv(indio_dev);
> >         struct device *dev = regmap_get_device(data->regmap);
> >         int ret;
> > +       int reg;
> >
> >         switch (mask) {
> >         case IIO_CHAN_INFO_RAW:
> > @@ -330,13 +332,12 @@ static int bmi088_accel_read_raw(struct iio_dev *indio_dev,
> >                                 return ret;
> >
> >                         ret = regmap_read(data->regmap,
> > -                                         BMI088_ACCEL_REG_ACC_RANGE, val);
> > +                                         BMI088_ACCEL_REG_ACC_RANGE, &reg);  
> 
> Curios: do we need to validate the value of `reg` here?
> If it goes outside of the 0...3 range, I can see a bit of access
> violation (kernel panic) happening.
> 
> >                         if (ret)
> >                                 goto out_read_raw_pm_put;
> > -
> > -                       *val2 = 15 - (*val & 0x3);
> > -                       *val = 3 * 980;
> > -                       ret = IIO_VAL_FRACTIONAL_LOG2;  
> 
> Not sure what the policy is about changing this now.
> I'll leave this to Jonathan.

It shouldn't be a problem as userspace ABI is a decimal string either way.
Only impact might be on precision and those tend to be minor.

> 
> > +                       *val = data->chip_info->scale_table[reg][0];
> > +                       *val2 = data->chip_info->scale_table[reg][1];
> > +                       ret = IIO_VAL_INT_PLUS_MICRO;
> >
> >                         goto out_read_raw_pm_put;
> >                 default:
> > @@ -432,6 +433,7 @@ static const struct bmi088_accel_chip_info bmi088_accel_chip_info_tbl[] = {
> >                 .chip_id = 0x1E,
> >                 .channels = bmi088_accel_channels,
> >                 .num_channels = ARRAY_SIZE(bmi088_accel_channels),
> > +               .scale_table = {{0, 897}, {0, 1795}, {0, 3590}, {0, 7179}},  
> 
> I like the idea of this scale_table.
> It makes things easier to see (what's happening) without looking into
> the datasheet much.
> 
> >         },
> >  };
> >
> > --
> > 2.25.1
> >  


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-05-14 15:06 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09 13:46 [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L LI Qingwu
2022-05-09 13:46 ` [PATCH V1 1/5] iio: accel: bmi088: Modified the scale calculate LI Qingwu
2022-05-10  6:01   ` Alexandru Ardelean
2022-05-14 15:14     ` Jonathan Cameron
2022-05-09 13:46 ` [PATCH V1 2/5] iio: accel: bmi088: Add support for bmi085 accel LI Qingwu
2022-05-10  6:04   ` Alexandru Ardelean
2022-05-09 13:46 ` [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel LI Qingwu
2022-05-10  6:05   ` Alexandru Ardelean
2022-05-09 13:46 ` [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales LI Qingwu
2022-05-09 17:24   ` kernel test robot
2022-05-09 18:50   ` kernel test robot
2022-05-10  7:01   ` Alexandru Ardelean
2022-05-09 13:46 ` [PATCH V1 5/5] iio: accel: bmi088: modifed the device name LI Qingwu
2022-05-10  7:35   ` Alexandru Ardelean

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).