Re: IIO timestamp get skewed when suspending (st_lsm6dsx)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 29/05/2020 09.44, Lorenzo Bianconi wrote:
On May 29, Sean Nyekjaer wrote:


Could a solution, be to call st_lsm6dsx_reset_hw_ts() in st_lsm6dsx_resume()
?

yes, I think so. Could you please try to patch below? Thanks.


Hi Lorenzo,

I have tried your patch, and the timestamp seems to behave like before.

https://gist.github.com/sknsean/959d3421f66cb49144e7841a8a08a2be
Sorry NTP have been connected for a while :)

I will enable some more debug to trace what is happening.

/Sean

Hi Sean,

thx for testing. Is the FIFO enabled before the suspend (in other words, is
st_lsm6dsx_resume_fifo running in st_lsm6dsx_resume?) what is the value of
sensor->ts_ref after the resume?

I have applied this patch:
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c

index 7de10bd636ea..915829f89d31 100644

--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c

+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c

@@ -304,12 +304,28 @@ static int st_lsm6dsx_reset_hw_ts(struct st_lsm6dsx_hw *hw)



 int st_lsm6dsx_resume_fifo(struct st_lsm6dsx_hw *hw)

 {

-       int err;

+       int err, i;

+       struct st_lsm6dsx_sensor *sensor;



+       printk("st_lsm6dsx_resume_fifo\n");

+       for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {

+               if (!hw->iio_devs[i])

+                       continue;

+

+               sensor = iio_priv(hw->iio_devs[i]);

+               printk("Before[%d]: %lld\n", i, sensor->ts_ref);

+       }

        /* reset hw ts counter */

        err = st_lsm6dsx_reset_hw_ts(hw);

        if (err < 0)

                return err;

+       for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {

+               if (!hw->iio_devs[i])

+                       continue;

+

+               sensor = iio_priv(hw->iio_devs[i]);

+               printk("After[%d]: %lld\n", i, sensor->ts_ref);

+       }



        return st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_CONT);

 }

And dmesg:
[  949.295585] st_lsm6dsx_resume_fifo

[  949.295617] Before[0]: 0

[  949.295636] Before[1]: 0

[  949.296456] After[0]: 1590740890980204361

[  949.296476] After[1]: 1590740890980207987

[  953.380200] PM: suspend entry (deep)

[  953.790084] Filesystems sync: 0.409 seconds

[ 953.795329] Freezing user space processes ... (elapsed 0.002 seconds) done.

[  953.798124] OOM killer disabled.

[ 953.798140] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.

[ 953.800016] printk: Suspending console(s) (use no_console_suspend to debug)

[  953.869535] PM: suspend devices took 0.070 seconds

[  953.883280] Disabling non-boot CPUs ...

[  953.897700] st_lsm6dsx_resume_fifo

[  953.897732] Before[0]: 1590740890980204361

[  953.897752] Before[1]: 1590740890980207987

[  953.898572] After[0]: 1590740895583500924

[  953.898594] After[1]: 1590740895583504049

[  953.914484] PM: resume devices took 0.020 seconds

[  953.914533] OOM killer enabled.

[  953.914552] Restarting tasks ... done.

[  953.947170] PM: suspend exit

/Sean



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux