Commit c13ab945 authored by Jonathan Cameron's avatar Jonathan Cameron
Browse files

staging:iio:cdc:ad7150: Timeout register covers both directions so both need updating



The timeout is treated as one single value, but the datasheet describes
it as two 4 bit values, one for each direction of event.
As such change the driver to support the separate directions.
Also add limit checking to ensure it fits within the 4 bits.

Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: default avatarAlexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20210314181511.531414-5-jic23@kernel.org
parent 0c4c4a86
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@
/* 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
@@ -59,7 +61,9 @@
 *	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.
@@ -191,7 +195,14 @@ static int ad7150_write_event_params(struct iio_dev *indio_dev,
		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);
@@ -365,6 +376,9 @@ static ssize_t ad7150_store_timeout(struct device *dev,
	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: