summaryrefslogtreecommitdiff
path: root/drivers/iio/common/ssp_sensors/ssp_iio_sensor.h
blob: dda267c9bd2acb683c79e2672e64ab998602ee6c (plain)
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
#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	1000000ULL

#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 = do_div(*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 = integer_part * SSP_INVERTED_SCALING_FACTOR + fractional;
	if (value == 0)
		return 0;

	return div_u64(SSP_FACTOR_WITH_MS, value);
}
#endif /* __SSP_IIO_SENSOR_H__ */