hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __SSP_IIO_SENSOR_H__
#define __SSP_IIO_SENSOR_H__
 
#define SSP_CHANNEL_AG(_type, _mod, _index) \
{ \
       .type = _type,\
       .modified = 1,\
       .channel2 = _mod,\
       .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
       .scan_index = _index,\
       .scan_type = {\
           .sign = 's',\
           .realbits = 16,\
           .storagebits = 16,\
           .shift = 0,\
           .endianness = IIO_LE,\
       },\
}
 
/* It is defined here as it is a mixed timestamp */
#define SSP_CHAN_TIMESTAMP(_si) {                    \
   .type = IIO_TIMESTAMP,                        \
   .channel = -1,                            \
   .scan_index = _si,                        \
   .scan_type = {                            \
       .sign = 's',                        \
       .realbits = 64,                        \
       .storagebits = 64,                    \
       },                            \
}
 
#define SSP_MS_PER_S            1000
#define SSP_INVERTED_SCALING_FACTOR    1000000U
 
#define SSP_FACTOR_WITH_MS \
   (SSP_INVERTED_SCALING_FACTOR * SSP_MS_PER_S)
 
int ssp_common_buffer_postenable(struct iio_dev *indio_dev);
 
int ssp_common_buffer_postdisable(struct iio_dev *indio_dev);
 
int ssp_common_process_data(struct iio_dev *indio_dev, void *buf,
               unsigned int len, int64_t timestamp);
 
/* Converts time in ms to frequency */
static inline void ssp_convert_to_freq(u32 time, int *integer_part,
                      int *fractional)
{
   if (time == 0) {
       *fractional = 0;
       *integer_part = 0;
       return;
   }
 
   *integer_part = SSP_FACTOR_WITH_MS / time;
   *fractional = *integer_part % SSP_INVERTED_SCALING_FACTOR;
   *integer_part = *integer_part / SSP_INVERTED_SCALING_FACTOR;
}
 
/* Converts frequency to time in ms */
static inline int ssp_convert_to_time(int integer_part, int fractional)
{
   u64 value;
 
   value = (u64)integer_part * SSP_INVERTED_SCALING_FACTOR + fractional;
   if (value == 0)
       return 0;
 
   return div64_u64((u64)SSP_FACTOR_WITH_MS, value);
}
#endif /* __SSP_IIO_SENSOR_H__ */