From: Vasileios Amoiridis <vassilisamir@gmail.com>
To: Jonathan Cameron <jic23@kernel.org>
Cc: Vasileios Amoiridis <vassilisamir@gmail.com>,
lars@metafoo.de, ang.iglesiasg@gmail.com,
andriy.shevchenko@linux.intel.com, 579lpy@gmail.com,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] drivers: iio: pressure: Add SPI support for BMP38x and BMP390
Date: Fri, 16 Feb 2024 14:26:44 +0100 [thread overview]
Message-ID: <20240216132644.GA4236@vamoiridPC> (raw)
In-Reply-To: <20240216111834.73287ab0@jic23-huawei>
On Fri, Feb 16, 2024 at 11:18:34AM +0000, Jonathan Cameron wrote:
> On Thu, 15 Feb 2024 17:43:32 +0100
> Vasileios Amoiridis <vassilisamir@gmail.com> wrote:
>
> > According to the datasheet of BMP38x and BMP390 devices, in SPI
> > operation, the first byte that returns after a read operation is
> > garbage and it needs to be dropped and return the rest of the
> > bytes.
>
> Make it clear in the patch title that this is a fix and add a fixes tag.
>
The original support for SPI was added 8 years ago. Should I include that commit
of 8 years ago in the fixes tag or just use a the word "fixes" with the rest of the
title?
> >
> > Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> > ---
> > drivers/iio/pressure/bmp280-spi.c | 47 ++++++++++++++++++++++++++++++-
> > drivers/iio/pressure/bmp280.h | 2 ++
> > 2 files changed, 48 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/iio/pressure/bmp280-spi.c b/drivers/iio/pressure/bmp280-spi.c
> > index 433d6fac83c4..c4b4a5d67f94 100644
> > --- a/drivers/iio/pressure/bmp280-spi.c
> > +++ b/drivers/iio/pressure/bmp280-spi.c
> > @@ -35,6 +35,32 @@ static int bmp280_regmap_spi_read(void *context, const void *reg,
> > return spi_write_then_read(spi, reg, reg_size, val, val_size);
> > }
> >
> > +static int bmp380_regmap_spi_read(void *context, const void *reg,
> > + size_t reg_size, void *val, size_t val_size)
> > +{
> > + struct spi_device *spi = to_spi_device(context);
> > + u8 ret[BMP380_SPI_MAX_REG_COUNT_READ + 1];
>
> Given you rely on val_size < 3 you should check for that explcitly rather than
> potentially overflowing the buffer.
> ret is not a good naming choice for this variable as it's commonly used for
> integer return values. Call it read_buf or something like that.
>
Thanks for pointing this out it makes a lot of sense.
> > + ssize_t status;
> > + u8 buf;
> > +
> > + memcpy(&buf, reg, reg_size);
> > + buf |= 0x80;
>
> Can you use regmap_bus read_flag_mask for this? Seems to apply to
> all devices supported. + that's common for spi regmaps
>
Yes I noticed it yesterday in my tests that this was missing and it actually
applies to all the devices. So the read_flag_mask should be added to both
regmap_bus structs.
>
> Mind you I note the bmp280_regmap_spi_write() is masking the bit out which seems
> backwards - all the registers are defined with the bit set for that part
> but not the 380. Ah well - not part of this fix even if it's odd.
>
>
> > +
> > + /*
> > + * According to the BMP380, BMP388, BMP390 datasheets, for a basic
> > + * read operation, after the write is done, 2 bytes are received and
> > + * the first one has to be dropped. The 2nd one is the requested
> > + * value.
> > + */
> > + status = spi_write_then_read(spi, &buf, 1, ret, val_size + 1);
> > + if (status)
> > + return status;
> > +
> > + memcpy(val, ret + 1, val_size);
> > +
> > + return 0;
> > +}
> > +
> > static struct regmap_bus bmp280_regmap_bus = {
> > .write = bmp280_regmap_spi_write,
> > .read = bmp280_regmap_spi_read,
> > @@ -42,10 +68,18 @@ static struct regmap_bus bmp280_regmap_bus = {
> > .val_format_endian_default = REGMAP_ENDIAN_BIG,
> > };
> >
> > +static struct regmap_bus bmp380_regmap_bus = {
> > + .write = bmp280_regmap_spi_write,
> > + .read = bmp380_regmap_spi_read,
> > + .reg_format_endian_default = REGMAP_ENDIAN_BIG,
> > + .val_format_endian_default = REGMAP_ENDIAN_BIG,
> > +};
> > +
> > static int bmp280_spi_probe(struct spi_device *spi)
> > {
> > const struct spi_device_id *id = spi_get_device_id(spi);
> > const struct bmp280_chip_info *chip_info;
> > + struct regmap_bus *bmp_regmap_bus;
> > struct regmap *regmap;
> > int ret;
> >
> > @@ -58,8 +92,19 @@ static int bmp280_spi_probe(struct spi_device *spi)
> >
> > chip_info = spi_get_device_match_data(spi);
> >
> > + switch (chip_info->chip_id[0]) {
> > + case BMP380_CHIP_ID:
> > + case BMP390_CHIP_ID:
> > + bmp_regmap_bus = &bmp380_regmap_bus;
> > + break;
> > + default:
> > + bmp_regmap_bus = &bmp280_regmap_bus;
> > + break;
> > + }
> > +
> > +
> > regmap = devm_regmap_init(&spi->dev,
> > - &bmp280_regmap_bus,
> > + bmp_regmap_bus,
> > &spi->dev,
> > chip_info->regmap_config);
> > if (IS_ERR(regmap)) {
> > diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
> > index 4012387d7956..ca482b7e4295 100644
> > --- a/drivers/iio/pressure/bmp280.h
> > +++ b/drivers/iio/pressure/bmp280.h
> > @@ -191,6 +191,8 @@
> > #define BMP380_TEMP_SKIPPED 0x800000
> > #define BMP380_PRESS_SKIPPED 0x800000
> >
> > +#define BMP380_SPI_MAX_REG_COUNT_READ 3
> This doesn't seem useful as only used in one place.
Could this define be moved in the bmp280-spi.c file or to not even use a define?
> > +
> > /* BMP280 specific registers */
> > #define BMP280_REG_HUMIDITY_LSB 0xFE
> > #define BMP280_REG_HUMIDITY_MSB 0xFD
>
next prev parent reply other threads:[~2024-02-16 13:26 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-15 16:43 [PATCH] drivers: iio: pressure: Add SPI support for BMP38x and BMP390 Vasileios Amoiridis
2024-02-15 17:03 ` Andy Shevchenko
2024-02-16 11:05 ` Jonathan Cameron
2024-02-16 13:29 ` Vasileios Amoiridis
2024-02-15 17:20 ` Angel Iglesias
2024-02-16 11:18 ` Jonathan Cameron
2024-02-16 13:26 ` Vasileios Amoiridis [this message]
2024-02-16 15:47 ` Jonathan Cameron
2024-02-16 16:40 ` Vasileios Amoiridis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240216132644.GA4236@vamoiridPC \
--to=vassilisamir@gmail.com \
--cc=579lpy@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=ang.iglesiasg@gmail.com \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.