Skip to content

Commit 2de7a70

Browse files
dlechnunojsa
authored andcommitted
iio: adc: ad7944: don't use storagebits for sizing
Replace use of storagebits with realbits for determining the number of bytes needed for SPI transfers. When adding SPI offload support, storagebits will always be 32 rather than 16 for 16-bit 16-bit chips so we can no longer rely on storagebits being the correct size expected by the SPI framework (it always uses 4 bytes for > 16-bit xfers and 2 bytes for > 8-bit xfers). Instead, derive the correct size from realbits since it will always be correct even when SPI offloading is used. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-vy: Nuno Sa <nuno.sa@analog.com> Signed-off-by: David Lechner <dlechner@baylibre.com> Link: https://patch.msgid.link/20250207-dlech-mainline-spi-engine-offload-2-v8-10-e48a489be48c@baylibre.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent a34c4ba commit 2de7a70

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

drivers/iio/adc/ad7944.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ struct ad7944_chip_info {
9898
const struct iio_chan_spec channels[2];
9999
};
100100

101+
/* get number of bytes for SPI xfer */
102+
#define AD7944_SPI_BYTES(scan_type) ((scan_type).realbits > 16 ? 4 : 2)
103+
101104
/*
102105
* AD7944_DEFINE_CHIP_INFO - Define a chip info structure for a specific chip
103106
* @_name: The name of the chip
@@ -164,7 +167,7 @@ static int ad7944_3wire_cs_mode_init_msg(struct device *dev, struct ad7944_adc *
164167

165168
/* Then we can read the data during the acquisition phase */
166169
xfers[2].rx_buf = &adc->sample.raw;
167-
xfers[2].len = BITS_TO_BYTES(chan->scan_type.storagebits);
170+
xfers[2].len = AD7944_SPI_BYTES(chan->scan_type);
168171
xfers[2].bits_per_word = chan->scan_type.realbits;
169172

170173
spi_message_init_with_transfers(&adc->msg, xfers, 3);
@@ -193,7 +196,7 @@ static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc
193196
xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS;
194197

195198
xfers[1].rx_buf = &adc->sample.raw;
196-
xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits);
199+
xfers[1].len = AD7944_SPI_BYTES(chan->scan_type);
197200
xfers[1].bits_per_word = chan->scan_type.realbits;
198201

199202
spi_message_init_with_transfers(&adc->msg, xfers, 2);
@@ -228,7 +231,7 @@ static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc
228231
xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS;
229232

230233
xfers[1].rx_buf = adc->chain_mode_buf;
231-
xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits) * n_chain_dev;
234+
xfers[1].len = AD7944_SPI_BYTES(chan->scan_type) * n_chain_dev;
232235
xfers[1].bits_per_word = chan->scan_type.realbits;
233236

234237
spi_message_init_with_transfers(&adc->msg, xfers, 2);
@@ -274,12 +277,12 @@ static int ad7944_single_conversion(struct ad7944_adc *adc,
274277
return ret;
275278

276279
if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) {
277-
if (chan->scan_type.storagebits > 16)
280+
if (chan->scan_type.realbits > 16)
278281
*val = ((u32 *)adc->chain_mode_buf)[chan->scan_index];
279282
else
280283
*val = ((u16 *)adc->chain_mode_buf)[chan->scan_index];
281284
} else {
282-
if (chan->scan_type.storagebits > 16)
285+
if (chan->scan_type.realbits > 16)
283286
*val = adc->sample.raw.u32;
284287
else
285288
*val = adc->sample.raw.u16;
@@ -409,8 +412,7 @@ static int ad7944_chain_mode_alloc(struct device *dev,
409412
/* 1 word for each voltage channel + aligned u64 for timestamp */
410413

411414
chain_mode_buf_size = ALIGN(n_chain_dev *
412-
BITS_TO_BYTES(chan[0].scan_type.storagebits), sizeof(u64))
413-
+ sizeof(u64);
415+
AD7944_SPI_BYTES(chan[0].scan_type), sizeof(u64)) + sizeof(u64);
414416
buf = devm_kzalloc(dev, chain_mode_buf_size, GFP_KERNEL);
415417
if (!buf)
416418
return -ENOMEM;

0 commit comments

Comments
 (0)