diff options
Diffstat (limited to 'drivers/iio/dac/ad5421.c')
| -rw-r--r-- | drivers/iio/dac/ad5421.c | 98 | 
1 files changed, 53 insertions, 45 deletions
diff --git a/drivers/iio/dac/ad5421.c b/drivers/iio/dac/ad5421.c index 1f78b14abb7..787ef1d859c 100644 --- a/drivers/iio/dac/ad5421.c +++ b/drivers/iio/dac/ad5421.c @@ -75,11 +75,34 @@ struct ad5421_state {  	 * transfer buffers to live in their own cache lines.  	 */  	union { -		u32 d32; +		__be32 d32;  		u8 d8[4];  	} data[2] ____cacheline_aligned;  }; +static const struct iio_event_spec ad5421_current_event[] = { +	{ +		.type = IIO_EV_TYPE_THRESH, +		.dir = IIO_EV_DIR_RISING, +		.mask_separate = BIT(IIO_EV_INFO_VALUE) | +			BIT(IIO_EV_INFO_ENABLE), +	}, { +		.type = IIO_EV_TYPE_THRESH, +		.dir = IIO_EV_DIR_FALLING, +		.mask_separate = BIT(IIO_EV_INFO_VALUE) | +			BIT(IIO_EV_INFO_ENABLE), +	}, +}; + +static const struct iio_event_spec ad5421_temp_event[] = { +	{ +		.type = IIO_EV_TYPE_THRESH, +		.dir = IIO_EV_DIR_RISING, +		.mask_separate = BIT(IIO_EV_INFO_VALUE) | +			BIT(IIO_EV_INFO_ENABLE), +	}, +}; +  static const struct iio_chan_spec ad5421_channels[] = {  	{  		.type = IIO_CURRENT, @@ -91,14 +114,19 @@ static const struct iio_chan_spec ad5421_channels[] = {  			BIT(IIO_CHAN_INFO_CALIBBIAS),  		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  			BIT(IIO_CHAN_INFO_OFFSET), -		.scan_type = IIO_ST('u', 16, 16, 0), -		.event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | -			IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), +		.scan_type = { +			.sign = 'u', +			.realbits = 16, +			.storagebits = 16, +		}, +		.event_spec = ad5421_current_event, +		.num_event_specs = ARRAY_SIZE(ad5421_current_event),  	},  	{  		.type = IIO_TEMP,  		.channel = -1, -		.event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), +		.event_spec = ad5421_temp_event, +		.num_event_specs = ARRAY_SIZE(ad5421_temp_event),  	},  }; @@ -281,18 +309,11 @@ static inline unsigned int ad5421_get_offset(struct ad5421_state *st)  	return (min * (1 << 16)) / (max - min);  } -static inline unsigned int ad5421_get_scale(struct ad5421_state *st) -{ -	unsigned int min, max; - -	ad5421_get_current_min_max(st, &min, &max); -	return ((max - min) * 1000) / (1 << 16); -} -  static int ad5421_read_raw(struct iio_dev *indio_dev,  	struct iio_chan_spec const *chan, int *val, int *val2, long m)  {  	struct ad5421_state *st = iio_priv(indio_dev); +	unsigned int min, max;  	int ret;  	if (chan->type != IIO_CURRENT) @@ -306,9 +327,10 @@ static int ad5421_read_raw(struct iio_dev *indio_dev,  		*val = ret;  		return IIO_VAL_INT;  	case IIO_CHAN_INFO_SCALE: -		*val = 0; -		*val2 = ad5421_get_scale(st); -		return IIO_VAL_INT_PLUS_MICRO; +		ad5421_get_current_min_max(st, &min, &max); +		*val = max - min; +		*val2 = (1 << 16) * 1000; +		return IIO_VAL_FRACTIONAL;  	case IIO_CHAN_INFO_OFFSET:  		*val = ad5421_get_offset(st);  		return IIO_VAL_INT; @@ -359,15 +381,15 @@ static int ad5421_write_raw(struct iio_dev *indio_dev,  }  static int ad5421_write_event_config(struct iio_dev *indio_dev, -	u64 event_code, int state) +	const struct iio_chan_spec *chan, enum iio_event_type type, +	enum iio_event_direction dir, int state)  {  	struct ad5421_state *st = iio_priv(indio_dev);  	unsigned int mask; -	switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { +	switch (chan->type) {  	case IIO_CURRENT: -		if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == -			IIO_EV_DIR_RISING) +		if (dir == IIO_EV_DIR_RISING)  			mask = AD5421_FAULT_OVER_CURRENT;  		else  			mask = AD5421_FAULT_UNDER_CURRENT; @@ -390,15 +412,15 @@ static int ad5421_write_event_config(struct iio_dev *indio_dev,  }  static int ad5421_read_event_config(struct iio_dev *indio_dev, -	u64 event_code) +	const struct iio_chan_spec *chan, enum iio_event_type type, +	enum iio_event_direction dir)  {  	struct ad5421_state *st = iio_priv(indio_dev);  	unsigned int mask; -	switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { +	switch (chan->type) {  	case IIO_CURRENT: -		if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == -			IIO_EV_DIR_RISING) +		if (dir == IIO_EV_DIR_RISING)  			mask = AD5421_FAULT_OVER_CURRENT;  		else  			mask = AD5421_FAULT_UNDER_CURRENT; @@ -413,12 +435,14 @@ static int ad5421_read_event_config(struct iio_dev *indio_dev,  	return (bool)(st->fault_mask & mask);  } -static int ad5421_read_event_value(struct iio_dev *indio_dev, u64 event_code, -	int *val) +static int ad5421_read_event_value(struct iio_dev *indio_dev, +	const struct iio_chan_spec *chan, enum iio_event_type type, +	enum iio_event_direction dir, enum iio_event_info info, int *val, +	int *val2)  {  	int ret; -	switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { +	switch (chan->type) {  	case IIO_CURRENT:  		ret = ad5421_read(indio_dev, AD5421_REG_DAC_DATA);  		if (ret < 0) @@ -432,7 +456,7 @@ static int ad5421_read_event_value(struct iio_dev *indio_dev, u64 event_code,  		return -EINVAL;  	} -	return 0; +	return IIO_VAL_INT;  }  static const struct iio_info ad5421_info = { @@ -494,22 +518,7 @@ static int ad5421_probe(struct spi_device *spi)  			return ret;  	} -	ret = iio_device_register(indio_dev); -	if (ret) { -		dev_err(&spi->dev, "Failed to register iio device: %d\n", ret); -		return ret; -	} - -	return 0; -} - -static int ad5421_remove(struct spi_device *spi) -{ -	struct iio_dev *indio_dev = spi_get_drvdata(spi); - -	iio_device_unregister(indio_dev); - -	return 0; +	return devm_iio_device_register(&spi->dev, indio_dev);  }  static struct spi_driver ad5421_driver = { @@ -518,7 +527,6 @@ static struct spi_driver ad5421_driver = {  		   .owner = THIS_MODULE,  	},  	.probe = ad5421_probe, -	.remove = ad5421_remove,  };  module_spi_driver(ad5421_driver);  | 
