/* AD7150 masks */
#define AD7150_THRESHTYPE_MSK GENMASK(6, 5)
+#define AD7150_CH_TIMEOUT_RECEDING GENMASK(3, 0)
+#define AD7150_CH_TIMEOUT_APPROACHING GENMASK(7, 4)
/**
* struct ad7150_chip_info - instance specific chip data
* @client: i2c client for this device
* from 'average' value.
* @thresh_timeout: a timeout, in samples from the moment an
* adaptive threshold event occurs to when the average
- * value jumps to current value.
+ * value jumps to current value. Note made up of two fields,
+ * 3:0 are for timeout receding - applies if below lower threshold
+ * 7:4 are for timeout approaching - applies if above upper threshold
* @old_state: store state from previous event, allowing confirmation
* of new condition.
* @conversion_mode: the current conversion mode.
if (ret)
return ret;
- timeout = chip->thresh_timeout[rising][chan];
+ /*
+ * Single timeout register contains timeouts for both
+ * directions.
+ */
+ timeout = FIELD_PREP(AD7150_CH_TIMEOUT_APPROACHING,
+ chip->thresh_timeout[1][chan]);
+ timeout |= FIELD_PREP(AD7150_CH_TIMEOUT_RECEDING,
+ chip->thresh_timeout[0][chan]);
return i2c_smbus_write_byte_data(chip->client,
ad7150_addresses[chan][5],
timeout);
if (ret < 0)
return ret;
+ if (data > GENMASK(3, 0))
+ return -EINVAL;
+
mutex_lock(&chip->state_lock);
switch (type) {
case IIO_EV_TYPE_THRESH_ADAPTIVE: