0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __AD_SIGMA_DELTA_H__
0009 #define __AD_SIGMA_DELTA_H__
0010
0011 enum ad_sigma_delta_mode {
0012 AD_SD_MODE_CONTINUOUS = 0,
0013 AD_SD_MODE_SINGLE = 1,
0014 AD_SD_MODE_IDLE = 2,
0015 AD_SD_MODE_POWERDOWN = 3,
0016 };
0017
0018
0019
0020
0021
0022
0023 struct ad_sd_calib_data {
0024 unsigned int mode;
0025 unsigned int channel;
0026 };
0027
0028 struct ad_sigma_delta;
0029 struct device;
0030 struct iio_dev;
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 struct ad_sigma_delta_info {
0051 int (*set_channel)(struct ad_sigma_delta *, unsigned int channel);
0052 int (*append_status)(struct ad_sigma_delta *, bool append);
0053 int (*set_mode)(struct ad_sigma_delta *, enum ad_sigma_delta_mode mode);
0054 int (*disable_all)(struct ad_sigma_delta *);
0055 int (*postprocess_sample)(struct ad_sigma_delta *, unsigned int raw_sample);
0056 bool has_registers;
0057 unsigned int addr_shift;
0058 unsigned int read_mask;
0059 unsigned int status_ch_mask;
0060 unsigned int data_reg;
0061 unsigned long irq_flags;
0062 unsigned int num_slots;
0063 };
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 struct ad_sigma_delta {
0074 struct spi_device *spi;
0075 struct iio_trigger *trig;
0076
0077
0078 struct completion completion;
0079 bool irq_dis;
0080
0081 bool bus_locked;
0082 bool keep_cs_asserted;
0083
0084 uint8_t comm;
0085
0086 const struct ad_sigma_delta_info *info;
0087 unsigned int active_slots;
0088 unsigned int current_slot;
0089 unsigned int num_slots;
0090 bool status_appended;
0091
0092 unsigned int *slots;
0093 uint8_t *samples_buf;
0094
0095
0096
0097
0098
0099
0100
0101
0102 uint8_t tx_buf[4] ____cacheline_aligned;
0103 uint8_t rx_buf[16] __aligned(8);
0104 };
0105
0106 static inline int ad_sigma_delta_set_channel(struct ad_sigma_delta *sd,
0107 unsigned int channel)
0108 {
0109 if (sd->info->set_channel)
0110 return sd->info->set_channel(sd, channel);
0111
0112 return 0;
0113 }
0114
0115 static inline int ad_sigma_delta_append_status(struct ad_sigma_delta *sd, bool append)
0116 {
0117 int ret;
0118
0119 if (sd->info->append_status) {
0120 ret = sd->info->append_status(sd, append);
0121 if (ret < 0)
0122 return ret;
0123
0124 sd->status_appended = append;
0125 }
0126
0127 return 0;
0128 }
0129
0130 static inline int ad_sigma_delta_disable_all(struct ad_sigma_delta *sd)
0131 {
0132 if (sd->info->disable_all)
0133 return sd->info->disable_all(sd);
0134
0135 return 0;
0136 }
0137
0138 static inline int ad_sigma_delta_set_mode(struct ad_sigma_delta *sd,
0139 unsigned int mode)
0140 {
0141 if (sd->info->set_mode)
0142 return sd->info->set_mode(sd, mode);
0143
0144 return 0;
0145 }
0146
0147 static inline int ad_sigma_delta_postprocess_sample(struct ad_sigma_delta *sd,
0148 unsigned int raw_sample)
0149 {
0150 if (sd->info->postprocess_sample)
0151 return sd->info->postprocess_sample(sd, raw_sample);
0152
0153 return 0;
0154 }
0155
0156 void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm);
0157 int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
0158 unsigned int size, unsigned int val);
0159 int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
0160 unsigned int size, unsigned int *val);
0161
0162 int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
0163 unsigned int reset_length);
0164
0165 int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
0166 const struct iio_chan_spec *chan, int *val);
0167 int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
0168 unsigned int mode, unsigned int channel);
0169 int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
0170 const struct ad_sd_calib_data *cd, unsigned int n);
0171 int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev,
0172 struct spi_device *spi, const struct ad_sigma_delta_info *info);
0173
0174 int devm_ad_sd_setup_buffer_and_trigger(struct device *dev, struct iio_dev *indio_dev);
0175
0176 int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig);
0177
0178 #endif