diff options
Diffstat (limited to 'drivers/iio/adc/ad7266.c')
| -rw-r--r-- | drivers/iio/adc/ad7266.c | 65 | 
1 files changed, 28 insertions, 37 deletions
diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c index 371731df163..70f78c3062a 100644 --- a/drivers/iio/adc/ad7266.c +++ b/drivers/iio/adc/ad7266.c @@ -27,7 +27,7 @@  struct ad7266_state {  	struct spi_device	*spi;  	struct regulator	*reg; -	unsigned long		vref_uv; +	unsigned long		vref_mv;  	struct spi_transfer	single_xfer[3];  	struct spi_message	single_msg; @@ -43,35 +43,28 @@ struct ad7266_state {  	 * The buffer needs to be large enough to hold two samples (4 bytes) and  	 * the naturally aligned timestamp (8 bytes).  	 */ -	uint8_t data[ALIGN(4, sizeof(s64)) + sizeof(s64)] ____cacheline_aligned; +	struct { +		__be16 sample[2]; +		s64 timestamp; +	} data ____cacheline_aligned;  };  static int ad7266_wakeup(struct ad7266_state *st)  {  	/* Any read with >= 2 bytes will wake the device */ -	return spi_read(st->spi, st->data, 2); +	return spi_read(st->spi, &st->data.sample[0], 2);  }  static int ad7266_powerdown(struct ad7266_state *st)  {  	/* Any read with < 2 bytes will powerdown the device */ -	return spi_read(st->spi, st->data, 1); +	return spi_read(st->spi, &st->data.sample[0], 1);  }  static int ad7266_preenable(struct iio_dev *indio_dev)  {  	struct ad7266_state *st = iio_priv(indio_dev); -	int ret; - -	ret = ad7266_wakeup(st); -	if (ret) -		return ret; - -	ret = iio_sw_buffer_preenable(indio_dev); -	if (ret) -		ad7266_powerdown(st); - -	return ret; +	return ad7266_wakeup(st);  }  static int ad7266_postdisable(struct iio_dev *indio_dev) @@ -94,11 +87,10 @@ static irqreturn_t ad7266_trigger_handler(int irq, void *p)  	struct ad7266_state *st = iio_priv(indio_dev);  	int ret; -	ret = spi_read(st->spi, st->data, 4); +	ret = spi_read(st->spi, st->data.sample, 4);  	if (ret == 0) { -		if (indio_dev->scan_timestamp) -			((s64 *)st->data)[1] = pf->timestamp; -		iio_push_to_buffers(indio_dev, (u8 *)st->data); +		iio_push_to_buffers_with_timestamp(indio_dev, &st->data, +			    pf->timestamp);  	}  	iio_trigger_notify_done(indio_dev->trig); @@ -148,7 +140,7 @@ static int ad7266_read_single(struct ad7266_state *st, int *val,  	ad7266_select_input(st, address);  	ret = spi_sync(st->spi, &st->single_msg); -	*val = be16_to_cpu(st->data[address % 2]); +	*val = be16_to_cpu(st->data.sample[address % 2]);  	return ret;  } @@ -157,7 +149,7 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,  	struct iio_chan_spec const *chan, int *val, int *val2, long m)  {  	struct ad7266_state *st = iio_priv(indio_dev); -	unsigned long scale_uv; +	unsigned long scale_mv;  	int ret;  	switch (m) { @@ -175,16 +167,15 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,  		return IIO_VAL_INT;  	case IIO_CHAN_INFO_SCALE: -		scale_uv = (st->vref_uv * 100); +		scale_mv = st->vref_mv;  		if (st->mode == AD7266_MODE_DIFF) -			scale_uv *= 2; +			scale_mv *= 2;  		if (st->range == AD7266_RANGE_2VREF) -			scale_uv *= 2; +			scale_mv *= 2; -		scale_uv >>= chan->scan_type.realbits; -		*val =  scale_uv / 100000; -		*val2 = (scale_uv % 100000) * 10; -		return IIO_VAL_INT_PLUS_MICRO; +		*val = scale_mv; +		*val2 = chan->scan_type.realbits; +		return IIO_VAL_FRACTIONAL_LOG2;  	case IIO_CHAN_INFO_OFFSET:  		if (st->range == AD7266_RANGE_2VREF &&  			st->mode != AD7266_MODE_DIFF) @@ -293,7 +284,7 @@ static const struct iio_info ad7266_info = {  	.driver_module = THIS_MODULE,  }; -static unsigned long ad7266_available_scan_masks[] = { +static const unsigned long ad7266_available_scan_masks[] = {  	0x003,  	0x00c,  	0x030, @@ -303,14 +294,14 @@ static unsigned long ad7266_available_scan_masks[] = {  	0x000,  }; -static unsigned long ad7266_available_scan_masks_diff[] = { +static const unsigned long ad7266_available_scan_masks_diff[] = {  	0x003,  	0x00c,  	0x030,  	0x000,  }; -static unsigned long ad7266_available_scan_masks_fixed[] = { +static const unsigned long ad7266_available_scan_masks_fixed[] = {  	0x003,  	0x000,  }; @@ -318,7 +309,7 @@ static unsigned long ad7266_available_scan_masks_fixed[] = {  struct ad7266_chan_info {  	const struct iio_chan_spec *channels;  	unsigned int num_channels; -	unsigned long *scan_masks; +	const unsigned long *scan_masks;  };  #define AD7266_CHAN_INFO_INDEX(_differential, _signed, _fixed) \ @@ -415,10 +406,10 @@ static int ad7266_probe(struct spi_device *spi)  		if (ret < 0)  			goto error_disable_reg; -		st->vref_uv = ret; +		st->vref_mv = ret / 1000;  	} else {  		/* Use internal reference */ -		st->vref_uv = 2500000; +		st->vref_mv = 2500;  	}  	if (pdata) { @@ -454,15 +445,15 @@ static int ad7266_probe(struct spi_device *spi)  	ad7266_init_channels(indio_dev);  	/* wakeup */ -	st->single_xfer[0].rx_buf = &st->data; +	st->single_xfer[0].rx_buf = &st->data.sample[0];  	st->single_xfer[0].len = 2;  	st->single_xfer[0].cs_change = 1;  	/* conversion */ -	st->single_xfer[1].rx_buf = &st->data; +	st->single_xfer[1].rx_buf = st->data.sample;  	st->single_xfer[1].len = 4;  	st->single_xfer[1].cs_change = 1;  	/* powerdown */ -	st->single_xfer[2].tx_buf = &st->data; +	st->single_xfer[2].tx_buf = &st->data.sample[0];  	st->single_xfer[2].len = 1;  	spi_message_init(&st->single_msg);  | 
