2022-05-09 13:59:19

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V1 0/5] iio: accel: bmi088: support BMI085 BMI090L

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



2022-05-09 13:59:28

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.

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 <[email protected]>
---
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


2022-05-09 13:59:30

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel

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 <[email protected]>
---
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


2022-05-09 13:59:38

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V1 5/5] iio: accel: bmi088: modifed the device name.

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 <[email protected]>
---
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


2022-05-09 17:30:26

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.

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/[email protected]/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 <[email protected]>

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

2022-05-09 18:59:51

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.

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/[email protected]/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 <[email protected]>

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

2022-05-10 10:49:54

by Alexandru Ardelean

[permalink] [raw]
Subject: Re: [PATCH V1 5/5] iio: accel: bmi088: modifed the device name.

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<[email protected]> 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 <[email protected]>
> ---
> 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
>

2022-05-10 13:35:28

by Alexandru Ardelean

[permalink] [raw]
Subject: Re: [PATCH V1 3/5] iio: accel: bmi088: Add support for bmi090l accel

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<[email protected]> 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 <[email protected]>

> Signed-off-by: LI Qingwu <[email protected]>
> ---
> 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
>

2022-05-10 13:51:24

by Alexandru Ardelean

[permalink] [raw]
Subject: Re: [PATCH V1 4/5] iio: accel: bmi088: Make it possible to config scales.

On Mon, May 9, 2022 at 4:46 PM LI Qingwu
<[email protected]> 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 <[email protected]>


>
> Signed-off-by: LI Qingwu <[email protected]>
> ---
> 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
>