/* 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__ */
|