inv_icm42600_timestamp.h (2362B)
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (C) 2020 Invensense, Inc. 4 */ 5 6#ifndef INV_ICM42600_TIMESTAMP_H_ 7#define INV_ICM42600_TIMESTAMP_H_ 8 9#include <linux/kernel.h> 10 11struct inv_icm42600_state; 12 13/** 14 * struct inv_icm42600_timestamp_interval - timestamps interval 15 * @lo: interval lower bound 16 * @up: interval upper bound 17 */ 18struct inv_icm42600_timestamp_interval { 19 int64_t lo; 20 int64_t up; 21}; 22 23/** 24 * struct inv_icm42600_timestamp_acc - accumulator for computing an estimation 25 * @val: current estimation of the value, the mean of all values 26 * @idx: current index of the next free place in values table 27 * @values: table of all measured values, use for computing the mean 28 */ 29struct inv_icm42600_timestamp_acc { 30 uint32_t val; 31 size_t idx; 32 uint32_t values[32]; 33}; 34 35/** 36 * struct inv_icm42600_timestamp - timestamp management states 37 * @it: interrupts interval timestamps 38 * @timestamp: store last timestamp for computing next data timestamp 39 * @mult: current internal period multiplier 40 * @new_mult: new set internal period multiplier (not yet effective) 41 * @period: measured current period of the sensor 42 * @chip_period: accumulator for computing internal chip period 43 */ 44struct inv_icm42600_timestamp { 45 struct inv_icm42600_timestamp_interval it; 46 int64_t timestamp; 47 uint32_t mult; 48 uint32_t new_mult; 49 uint32_t period; 50 struct inv_icm42600_timestamp_acc chip_period; 51}; 52 53void inv_icm42600_timestamp_init(struct inv_icm42600_timestamp *ts, 54 uint32_t period); 55 56int inv_icm42600_timestamp_setup(struct inv_icm42600_state *st); 57 58int inv_icm42600_timestamp_update_odr(struct inv_icm42600_timestamp *ts, 59 uint32_t period, bool fifo); 60 61void inv_icm42600_timestamp_interrupt(struct inv_icm42600_timestamp *ts, 62 uint32_t fifo_period, size_t fifo_nb, 63 size_t sensor_nb, int64_t timestamp); 64 65static inline int64_t 66inv_icm42600_timestamp_pop(struct inv_icm42600_timestamp *ts) 67{ 68 ts->timestamp += ts->period; 69 return ts->timestamp; 70} 71 72void inv_icm42600_timestamp_apply_odr(struct inv_icm42600_timestamp *ts, 73 uint32_t fifo_period, size_t fifo_nb, 74 unsigned int fifo_no); 75 76static inline void 77inv_icm42600_timestamp_reset(struct inv_icm42600_timestamp *ts) 78{ 79 const struct inv_icm42600_timestamp_interval interval_init = {0LL, 0LL}; 80 81 ts->it = interval_init; 82 ts->timestamp = 0; 83} 84 85#endif