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