linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Jean-Baptiste Maneyrol <JManeyrol@invensense.com>
Cc: "linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>
Subject: Re: [PATCH v2 09/13] iio: imu: inv_mpu6050: fix data polling interface
Date: Fri, 21 Feb 2020 15:29:31 +0000	[thread overview]
Message-ID: <20200221152931.161a0217@archlinux> (raw)
In-Reply-To: <CH2PR12MB418170EDD66763FDF8A2DB65C4120@CH2PR12MB4181.namprd12.prod.outlook.com>

On Fri, 21 Feb 2020 14:03:39 +0000
Jean-Baptiste Maneyrol <JManeyrol@invensense.com> wrote:

> Hi Jonathan,
> 
> this is not something we want to backport. Mainly because it is heavly dependant on the rework of the power and sensor engines.
> 
> And polling interface without pm_runtime autosuspend is not really relevent.

Fair enough. I'll add a note to try and prevent it getting automatically
picked up as a fix.

Thanks,

Jonathan

> 
> Thanks,
> JB
> 
> 
> From: linux-iio-owner@vger.kernel.org <linux-iio-owner@vger.kernel.org> on behalf of Jonathan Cameron <jic23@kernel.org>
> 
> Sent: Friday, February 21, 2020 12:34
> 
> To: Jean-Baptiste Maneyrol <JManeyrol@invensense.com>
> 
> Cc: linux-iio@vger.kernel.org <linux-iio@vger.kernel.org>
> 
> Subject: Re: [PATCH v2 09/13] iio: imu: inv_mpu6050: fix data polling interface
> 
>  
> 
> 
>  CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe.
> 
> 
> 
> On Wed, 19 Feb 2020 15:39:54 +0100
> 
> Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> wrote:
> 
> 
> 
> > When reading data with the polling interface, we need to wait  
> 
> > at 1 sampling period to have a sample.  
> 
> > For gyroscope and magnetometer, we need to wait for 2 periods  
> 
> > before having a correct sample.  
> 
> >   
> 
> > Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>  
> 
> 
> 
> I should have raised this before, but is this something we might want to
> 
> backport? I don't really want this whole cleanup series getting backported,
> 
> so is there a more minimal change for older kernels? (probably just sleep too
> 
> long in all cases!)
> 
> 
> 
> Applied,
> 
> 
> 
> Jonathan
> 
> 
> 
> > ---  
> 
> >  drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 36 ++++++++++++++++++++--  
> 
> >  drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c | 21 -------------  
> 
> >  drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h |  3 ++  
> 
> >  3 files changed, 37 insertions(+), 23 deletions(-)  
> 
> >   
> 
> > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c  
> 
> > index a51efc4c941b..aeee39696d3a 100644  
> 
> > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c  
> 
> > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c  
> 
> > @@ -563,9 +563,14 @@ static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,  
> 
> >                                         int *val)  
> 
> >  {  
> 
> >        struct inv_mpu6050_state *st = iio_priv(indio_dev);  
> 
> > +     unsigned int freq_hz, period_us, min_sleep_us, max_sleep_us;  
> 
> >        int result;  
> 
> >        int ret;  
> 
> >    
> 
> > +     /* compute sample period */  
> 
> > +     freq_hz = INV_MPU6050_DIVIDER_TO_FIFO_RATE(st->chip_config.divider);  
> 
> > +     period_us = 1000000 / freq_hz;  
> 
> > +  
> 
> >        result = inv_mpu6050_set_power_itg(st, true);  
> 
> >        if (result)  
> 
> >                return result;  
> 
> > @@ -576,6 +581,10 @@ static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,  
> 
> >                                INV_MPU6050_SENSOR_GYRO);  
> 
> >                if (result)  
> 
> >                        goto error_power_off;  
> 
> > +             /* need to wait 2 periods to have first valid sample */  
> 
> > +             min_sleep_us = 2 * period_us;  
> 
> > +             max_sleep_us = 2 * (period_us + period_us / 2);  
> 
> > +             usleep_range(min_sleep_us, max_sleep_us);  
> 
> >                ret = inv_mpu6050_sensor_show(st, st->reg->raw_gyro,  
> 
> >                                              chan->channel2, val);  
> 
> >                result = inv_mpu6050_switch_engine(st, false,  
> 
> > @@ -588,6 +597,10 @@ static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,  
> 
> >                                INV_MPU6050_SENSOR_ACCL);  
> 
> >                if (result)  
> 
> >                        goto error_power_off;  
> 
> > +             /* wait 1 period for first sample availability */  
> 
> > +             min_sleep_us = period_us;  
> 
> > +             max_sleep_us = period_us + period_us / 2;  
> 
> > +             usleep_range(min_sleep_us, max_sleep_us);  
> 
> >                ret = inv_mpu6050_sensor_show(st, st->reg->raw_accl,  
> 
> >                                              chan->channel2, val);  
> 
> >                result = inv_mpu6050_switch_engine(st, false,  
> 
> > @@ -600,8 +613,10 @@ static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,  
> 
> >                                INV_MPU6050_SENSOR_TEMP);  
> 
> >                if (result)  
> 
> >                        goto error_power_off;  
> 
> > -             /* wait for stablization */  
> 
> > -             msleep(INV_MPU6050_TEMP_UP_TIME);  
> 
> > +             /* wait 1 period for first sample availability */  
> 
> > +             min_sleep_us = period_us;  
> 
> > +             max_sleep_us = period_us + period_us / 2;  
> 
> > +             usleep_range(min_sleep_us, max_sleep_us);  
> 
> >                ret = inv_mpu6050_sensor_show(st, st->reg->temperature,  
> 
> >                                              IIO_MOD_X, val);  
> 
> >                result = inv_mpu6050_switch_engine(st, false,  
> 
> > @@ -610,7 +625,24 @@ static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,  
> 
> >                        goto error_power_off;  
> 
> >                break;  
> 
> >        case IIO_MAGN:  
> 
> > +             result = inv_mpu6050_switch_engine(st, true,  
> 
> > +                             INV_MPU6050_SENSOR_MAGN);  
> 
> > +             if (result)  
> 
> > +                     goto error_power_off;  
> 
> > +             /* frequency is limited for magnetometer */  
> 
> > +             if (freq_hz > INV_MPU_MAGN_FREQ_HZ_MAX) {  
> 
> > +                     freq_hz = INV_MPU_MAGN_FREQ_HZ_MAX;  
> 
> > +                     period_us = 1000000 / freq_hz;  
> 
> > +             }  
> 
> > +             /* need to wait 2 periods to have first valid sample */  
> 
> > +             min_sleep_us = 2 * period_us;  
> 
> > +             max_sleep_us = 2 * (period_us + period_us / 2);  
> 
> > +             usleep_range(min_sleep_us, max_sleep_us);  
> 
> >                ret = inv_mpu_magn_read(st, chan->channel2, val);  
> 
> > +             result = inv_mpu6050_switch_engine(st, false,  
> 
> > +                             INV_MPU6050_SENSOR_MAGN);  
> 
> > +             if (result)  
> 
> > +                     goto error_power_off;  
> 
> >                break;  
> 
> >        default:  
> 
> >                ret = -EINVAL;  
> 
> > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c  
> 
> > index 3f402fa56d95..f282e9cc34c5 100644  
> 
> > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c  
> 
> > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c  
> 
> > @@ -44,9 +44,6 @@  
> 
> >  #define INV_MPU_MAGN_REG_ASAY                0x11  
> 
> >  #define INV_MPU_MAGN_REG_ASAZ                0x12  
> 
> >    
> 
> > -/* Magnetometer maximum frequency */  
> 
> > -#define INV_MPU_MAGN_FREQ_HZ_MAX     50  
> 
> > -  
> 
> >  static bool inv_magn_supported(const struct inv_mpu6050_state *st)  
> 
> >  {  
> 
> >        switch (st->chip_type) {  
> 
> > @@ -321,7 +318,6 @@ int inv_mpu_magn_read(struct inv_mpu6050_state *st, int axis, int *val)  
> 
> >        unsigned int status;  
> 
> >        __be16 data;  
> 
> >        uint8_t addr;  
> 
> > -     unsigned int freq_hz, period_ms;  
> 
> >        int ret;  
> 
> >    
> 
> >        /* quit if chip is not supported */  
> 
> > @@ -344,23 +340,6 @@ int inv_mpu_magn_read(struct inv_mpu6050_state *st, int axis, int *val)  
> 
> >        }  
> 
> >        addr += INV_MPU6050_REG_EXT_SENS_DATA;  
> 
> >    
> 
> > -     /* compute period depending on current sampling rate */  
> 
> > -     freq_hz = INV_MPU6050_DIVIDER_TO_FIFO_RATE(st->chip_config.divider);  
> 
> > -     if (freq_hz > INV_MPU_MAGN_FREQ_HZ_MAX)  
> 
> > -             freq_hz = INV_MPU_MAGN_FREQ_HZ_MAX;  
> 
> > -     period_ms = 1000 / freq_hz;  
> 
> > -  
> 
> > -     ret = inv_mpu6050_switch_engine(st, true, INV_MPU6050_SENSOR_MAGN);  
> 
> > -     if (ret)  
> 
> > -             return ret;  
> 
> > -  
> 
> > -     /* need to wait 2 periods + half-period margin */  
> 
> > -     msleep(period_ms * 2 + period_ms / 2);  
> 
> > -  
> 
> > -     ret = inv_mpu6050_switch_engine(st, false, INV_MPU6050_SENSOR_MAGN);  
> 
> > -     if (ret)  
> 
> > -             return ret;  
> 
> > -  
> 
> >        /* check i2c status and read raw data */  
> 
> >        ret = regmap_read(st->map, INV_MPU6050_REG_I2C_MST_STATUS, &status);  
> 
> >        if (ret)  
> 
> > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h  
> 
> > index f7ad50ca6c1b..185c000c697c 100644  
> 
> > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h  
> 
> > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h  
> 
> > @@ -10,6 +10,9 @@  
> 
> >    
> 
> >  #include "inv_mpu_iio.h"  
> 
> >    
> 
> > +/* Magnetometer maximum frequency */  
> 
> > +#define INV_MPU_MAGN_FREQ_HZ_MAX     50  
> 
> > +  
> 
> >  int inv_mpu_magn_probe(struct inv_mpu6050_state *st);  
> 
> >    
> 
> >  /**  
> 
> 
> 


  reply	other threads:[~2020-02-21 15:29 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-19 14:39 [PATCH v2 00/13] Rework sensors engines and power management Jean-Baptiste Maneyrol
2020-02-19 14:39 ` [PATCH v2 01/13] iio: imu: inv_mpu6050: enable i2c aux mux bypass only once Jean-Baptiste Maneyrol
2020-02-21 11:17   ` Jonathan Cameron
2020-02-21 17:01     ` Peter Rosin
2020-02-19 14:39 ` [PATCH v2 02/13] iio: imu: inv_mpu6050: delete useless check Jean-Baptiste Maneyrol
2020-02-21 11:19   ` Jonathan Cameron
2020-02-19 14:39 ` [PATCH v2 03/13] iio: imu: inv_mpu6050: set power on/off only once during all init Jean-Baptiste Maneyrol
2020-02-19 14:39 ` [PATCH v2 04/13] iio: imu: inv_mpu6050: simplify polling magnetometer Jean-Baptiste Maneyrol
2020-02-19 14:39 ` [PATCH v2 05/13] iio: imu: inv_mpu6050: early init of chip_config for use at setup Jean-Baptiste Maneyrol
2020-02-19 14:39 ` [PATCH v2 06/13] iio: imu: inv_mpu6050: add all signal path resets at init Jean-Baptiste Maneyrol
2020-02-19 14:39 ` [PATCH v2 07/13] iio: imu: inv_mpu6050: fix sleep time when turning regulators on Jean-Baptiste Maneyrol
2020-02-21 11:29   ` Jonathan Cameron
2020-02-19 14:39 ` [PATCH v2 08/13] iio: imu: inv_mpu6050: rewrite power and engine management Jean-Baptiste Maneyrol
2020-02-21 11:31   ` Jonathan Cameron
2020-02-19 14:39 ` [PATCH v2 09/13] iio: imu: inv_mpu6050: fix data polling interface Jean-Baptiste Maneyrol
2020-02-21 11:34   ` Jonathan Cameron
2020-02-21 14:03     ` Jean-Baptiste Maneyrol
2020-02-21 15:29       ` Jonathan Cameron [this message]
2020-02-19 14:39 ` [PATCH v2 10/13] iio: imu: inv_mpu6050: factorize fifo enable/disable Jean-Baptiste Maneyrol
2020-02-21 11:37   ` Jonathan Cameron
2020-02-19 14:39 ` [PATCH v2 11/13] iio: imu: inv_mpu6050: dynamic sampling rate change Jean-Baptiste Maneyrol
2020-02-21 11:38   ` Jonathan Cameron
2020-02-19 14:39 ` [PATCH v2 12/13] iio: imu: inv_mpu6050: use runtime pm with autosuspend Jean-Baptiste Maneyrol
2020-02-21 11:54   ` Jonathan Cameron
2020-02-21 14:04     ` Jean-Baptiste Maneyrol
2020-03-24 21:24   ` Dmitry Osipenko
2020-03-25 19:21     ` Jean-Baptiste Maneyrol
2020-03-25 19:49       ` Dmitry Osipenko
2020-02-19 14:39 ` [PATCH v2 13/13] iio: imu: inv_mpu6050: temperature only work with accel/gyro Jean-Baptiste Maneyrol
2020-02-21 11:56   ` Jonathan Cameron

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=20200221152931.161a0217@archlinux \
    --to=jic23@kernel.org \
    --cc=JManeyrol@invensense.com \
    --cc=linux-iio@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 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).