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