All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bough Chen <haibo.chen@nxp.com>
To: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
Cc: "jic23@kernel.org" <jic23@kernel.org>,
	"lars@metafoo.de" <lars@metafoo.de>,
	"linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
	dl-linux-imx <linux-imx@nxp.com>
Subject: RE: [PATCH] iio: imu: fxos8700: few bug fix for fxos8700
Date: Thu, 24 Feb 2022 14:25:55 +0000	[thread overview]
Message-ID: <VI1PR04MB40164F502C239F681BFAC015903D9@VI1PR04MB4016.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <20220222165638.0000243a@Huawei.com>

[-- Attachment #1: Type: text/plain, Size: 8304 bytes --]

> -----Original Message-----
> From: Jonathan Cameron [mailto:Jonathan.Cameron@Huawei.com]
> Sent: 2022年2月23日 0:57
> To: Bough Chen <haibo.chen@nxp.com>
> Cc: jic23@kernel.org; lars@metafoo.de; linux-iio@vger.kernel.org;
> dl-linux-imx <linux-imx@nxp.com>
> Subject: Re: [PATCH] iio: imu: fxos8700: few bug fix for fxos8700
> 
> On Tue, 22 Feb 2022 12:07:02 +0800
> <haibo.chen@nxp.com> wrote:
> 
> > From: Haibo Chen <haibo.chen@nxp.com>
> >
> > 1, z raw data always 0, regmap_buk_read use the wrong length. fix it
> > and optmize read the only need data.
> > 2, use the correct register address when try to read raw data.
> > 3, before set scale, need to set the sensor to standby mode. otherwise
> > the scale set is not work.
> > 4, give the correct offset when config odr bit.
> 
> Sounds like 4 patches to me. Whenever you have a list of what a patch does
> you should probably split it up.  Would be a lot easier to review as one
> patch per issue.  For now I've just take a quick general look.
> 
> 
Hi Jonathan

Thanks for your suggestion, I will split few patches in the next version.

> >
> > Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> > Reviewed-by: Clark Wang <xiaoning.wang@nxp.com>
> > ---
> >  drivers/iio/imu/fxos8700_core.c | 66
> > +++++++++++++++++++++++----------
> >  1 file changed, 47 insertions(+), 19 deletions(-)
> >
> > diff --git a/drivers/iio/imu/fxos8700_core.c
> > b/drivers/iio/imu/fxos8700_core.c index ab288186f36e..1896d6db6d77
> > 100644
> > --- a/drivers/iio/imu/fxos8700_core.c
> > +++ b/drivers/iio/imu/fxos8700_core.c
> > @@ -162,12 +162,11 @@
> >
> >  #define FXOS8700_DEVICE_ID          0xC7
> >  #define FXOS8700_PRE_DEVICE_ID      0xC4
> > -#define FXOS8700_DATA_BUF_SIZE      3
> >
> >  struct fxos8700_data {
> >  	struct regmap *regmap;
> >  	struct iio_trigger *trig;
> > -	__be16 buf[FXOS8700_DATA_BUF_SIZE] ____cacheline_aligned;
> > +	__be16 buf ____cacheline_aligned;
> >  };
> >
> >  /* Regmap info */
> > @@ -345,7 +344,8 @@ static int fxos8700_set_active_mode(struct
> > fxos8700_data *data,  static int fxos8700_set_scale(struct
> fxos8700_data *data,
> >  			      enum fxos8700_sensor t, int uscale)  {
> > -	int i;
> > +	int i, ret, val;
> > +	bool active_mode;
> >  	static const int scale_num = ARRAY_SIZE(fxos8700_accel_scale);
> >  	struct device *dev = regmap_get_device(data->regmap);
> >
> > @@ -354,6 +354,23 @@ static int fxos8700_set_scale(struct
> fxos8700_data *data,
> >  		return -EINVAL;
> >  	}
> >
> > +	ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, &val);
> > +	if (ret)
> > +		return ret;
> > +
> > +	active_mode = val & FXOS8700_ACTIVE;
> > +
> > +	if (active_mode) {
> > +		/*
> > +		 * The device must be in standby mode to change any of the
> > +		 * other fields within CTRL_REG1
> > +		 */
> > +		ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> > +				   val & ~FXOS8700_ACTIVE);
> > +		if (ret)
> > +			return ret;
> > +	}
> > +
> >  	for (i = 0; i < scale_num; i++)
> >  		if (fxos8700_accel_scale[i].uscale == uscale)
> >  			break;
> > @@ -361,8 +378,12 @@ static int fxos8700_set_scale(struct
> fxos8700_data *data,
> >  	if (i == scale_num)
> >  		return -EINVAL;
> >
> > -	return regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG,
> > +	ret = regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG,
> >  			    fxos8700_accel_scale[i].bits);
> 
> Realign these parameters with the opening bracket.
> 
> > +	if (ret)
> > +		return ret;
> 
> blank line here.
> 
> > +	return regmap_update_bits(data->regmap, FXOS8700_CTRL_REG1,
> > +				  FXOS8700_ACTIVE, active_mode);
> >  }
> >
> >  static int fxos8700_get_scale(struct fxos8700_data *data, @@ -393,23
> > +414,29 @@ static int fxos8700_get_scale(struct fxos8700_data *data,
> > static int fxos8700_get_data(struct fxos8700_data *data, int chan_type,
> >  			     int axis, int *val)
> >  {
> > -	u8 base, reg;
> > -	int ret;
> > +	u8 base, offset;
> >  	enum fxos8700_sensor type = fxos8700_to_sensor(chan_type);
> > +	u8 tmp_data[2];
> We loop around this every now and then. It 'happens' to be the case that
> currently (or last time I checked) regmap_bulk_read always copied the data
> and hence uses a dma safe buffer internally. That is not guaranteed by the
> interface however so when we last asked Mark Brown he suggested we
> should assume that it requires the same level of dma buffer safety as the
bus
> subsystems being used.
> 
> Thus for any driver doing bulk accesses to SPI device, you need a DMA safe
> buffer.  Which is what the __cacheline_aligned buffer in iio_priv() is for
in
> this driver.

Thanks for your sharing, I will take care of this.

> 
> > +	u16 native_data;
> > +	int ret;
> >
> > -	base = type ? FXOS8700_OUT_X_MSB : FXOS8700_M_OUT_X_MSB;
> > +	base = type ? FXOS8700_M_OUT_X_MSB : FXOS8700_OUT_X_MSB;
> > +	offset = axis - IIO_MOD_X;
> >
> > -	/* Block read 6 bytes of device output registers to avoid data loss
*/
> > -	ret = regmap_bulk_read(data->regmap, base, data->buf,
> > -			       FXOS8700_DATA_BUF_SIZE);
> > +	ret = regmap_bulk_read(data->regmap, base + offset, &tmp_data[0],
> > +2);
> >  	if (ret)
> > -		return ret;
> > +		return -EIO;
> 
> Why eat the error return of the bulk_read and replace it with a
potentially
> less informative one?

My bad, will fix.

> 
> >
> > -	/* Convert axis to buffer index */
> > -	reg = axis - IIO_MOD_X;
> >
> > +	data->buf = ((tmp_data[1] << 8) & 0xff00) | tmp_data[0];
> 
> tmp_data[1] is a u8 so that masking isn't doing anything other than
possibly
> fixing some type conversion issues.

Oh, you are correct, I will fix that.
> 
> However, this is an endian operation, so express it as such
> get_unaligned_be16(tmp_data); or similar.  Maybe even just use a __be16
> and be16_to_cpu() directly on that.

I will re-do this code.

> 
> 
> >  	/* Convert to native endianness */
> > -	*val = sign_extend32(be16_to_cpu(data->buf[reg]), 15);
> > +	native_data = be16_to_cpu(data->buf);
> 
> This looks wrong.  You've already done a be to cpu conversion (via the
> shifts above) now y ou are doing it again. Why?

For this sensor, according to the RM
For the first register(address 01), we get data[13~6], and for the second
register(address 02), we get 8 bit data, the upper 6 bit is data[5~0],
Seems I made the logic complicated.

> 
> > +
> > +	/*accel raw data only has 14 bit */
> 
> /* Accel ...
> 
> > +	if (!type)
> > +		native_data = native_data >> 2;
> > +
> > +	*val = sign_extend32(native_data, 15);
> >
> >  	return 0;
> >  }
> > @@ -462,6 +489,7 @@ static int fxos8700_get_odr(struct fxos8700_data
> *data, enum fxos8700_sensor t,
> >  		return ret;
> >
> >  	val &= FXOS8700_CTRL_ODR_MSK;
> > +	val = val >> 3;
> 
> FIELD_GET() would be easier to read for this.
> 
> >
> >  	for (i = 0; i < odr_num; i++)
> >  		if (val == fxos8700_odr[i].bits)
> > @@ -592,14 +620,14 @@ static int fxos8700_chip_init(struct
> fxos8700_data *data, bool use_spi)
> >  	if (ret)
> >  		return ret;
> >
> > -	/* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> > -	ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> > -			   FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
> > +	/* Set for max full-scale range (+/-8G) */
> > +	ret = regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG,
> MODE_8G);
> >  	if (ret)
> >  		return ret;
> >
> > -	/* Set for max full-scale range (+/-8G) */
> > -	return regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG,
> MODE_8G);
> > +	/* Max ODR (800Hz individual or 400Hz hybrid), active mode */
> > +	return regmap_write(data->regmap, FXOS8700_CTRL_REG1,
> > +			   FXOS8700_CTRL_ODR_MAX << 3 | FXOS8700_ACTIVE);
> 
> Preference for FIELD_PREP() to make ti clear what you are shifting left
and
> why.
> Given you have FXOS8700_CTRL_ODR_MSK that is easy to add here.
> Mind you it's a noop as ODR_MAX == 0 anyway :)

Thanks for your suggestion, I just want to optimize that I config ODR_MAX,
but seems
It better only mentioned this in the comment, do not need add in the code.

Best Regards
Haibo Chen
> 
> 
> >  }
> >
> >  static void fxos8700_chip_uninit(void *data)


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 9551 bytes --]

      reply	other threads:[~2022-02-24 14:26 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-22  4:07 [PATCH] iio: imu: fxos8700: few bug fix for fxos8700 haibo.chen
2022-02-22 16:56 ` Jonathan Cameron
2022-02-24 14:25   ` Bough Chen [this message]

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=VI1PR04MB40164F502C239F681BFAC015903D9@VI1PR04MB4016.eurprd04.prod.outlook.com \
    --to=haibo.chen@nxp.com \
    --cc=Jonathan.Cameron@Huawei.com \
    --cc=jic23@kernel.org \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    /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.