ssp_iio_sensor.h (1787B)
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 39int ssp_common_buffer_postenable(struct iio_dev *indio_dev); 40 41int ssp_common_buffer_postdisable(struct iio_dev *indio_dev); 42 43int 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 */ 47static 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 */ 62static 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__ */