21
21
#include <linux/sysfs.h>
22
22
#include "linux/util_macros.h"
23
23
#include <linux/spi/spi.h>
24
- #include <linux/spi/spi-engine.h>
24
+ #include <linux/spi/spi-engine-ex .h>
25
25
26
26
#include <linux/iio/buffer.h>
27
27
#include <linux/iio/buffer-dma.h>
@@ -294,6 +294,8 @@ struct ad7768_state {
294
294
struct mutex lock ;
295
295
struct clk * mclk ;
296
296
struct gpio_chip gpiochip ;
297
+ struct spi_transfer offload_xfer ;
298
+ struct spi_message offload_msg ;
297
299
unsigned int gpio_avail_map ;
298
300
unsigned int mclk_freq ;
299
301
unsigned int mclk_div ;
@@ -335,11 +337,11 @@ static int ad7768_spi_reg_read(struct ad7768_state *st, unsigned int addr,
335
337
.len = len + 1 ,
336
338
.bits_per_word = (len == 3 ? 32 : 16 ),
337
339
};
338
- unsigned char tx_data [ 4 ] ;
340
+ u32 tx_data ;
339
341
int ret ;
340
342
341
- tx_data [ 0 ] = AD7768_RD_FLAG_MSK (addr );
342
- xfer .tx_buf = tx_data ;
343
+ tx_data = AD7768_RD_FLAG_MSK (addr ) << ( len * 8 );
344
+ xfer .tx_buf = & tx_data ;
343
345
ret = spi_sync_transfer (st -> spi , & xfer , 1 );
344
346
if (ret < 0 )
345
347
return ret ;
@@ -357,11 +359,11 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,
357
359
.len = 2 ,
358
360
.bits_per_word = 16 ,
359
361
};
360
- unsigned char tx_data [ 2 ] ;
362
+ u16 tx_data ;
361
363
362
- tx_data [ 0 ] = AD7768_WR_FLAG_MSK (addr );
363
- tx_data [ 1 ] = val & 0xFF ;
364
- xfer .tx_buf = tx_data ;
364
+ tx_data = AD7768_WR_FLAG_MSK (addr ) << 8 ;
365
+ tx_data | = val & 0xFF ;
366
+ xfer .tx_buf = & tx_data ;
365
367
return spi_sync_transfer (st -> spi , & xfer , 1 );
366
368
}
367
369
@@ -1155,18 +1157,15 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1155
1157
{
1156
1158
struct ad7768_state * st = iio_priv (indio_dev );
1157
1159
const struct iio_scan_type * scan_type ;
1158
- struct spi_transfer xfer = {
1159
- .len = 1 ,
1160
- };
1161
1160
unsigned int rx_data [2 ];
1162
- struct spi_message msg ;
1163
1161
int ret ;
1164
1162
1165
1163
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1166
1164
if (IS_ERR (scan_type ))
1167
1165
return PTR_ERR (scan_type );
1168
1166
1169
- xfer .bits_per_word = scan_type -> realbits ;
1167
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1168
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1170
1169
1171
1170
/*
1172
1171
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1178,14 +1177,19 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1178
1177
return ret ;
1179
1178
1180
1179
if (st -> spi_is_dma_mapped ) {
1180
+ st -> offload_xfer .rx_buf = rx_data ;
1181
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1182
+
1183
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1184
+ if (ret < 0 )
1185
+ return ret ;
1186
+
1181
1187
spi_bus_lock (st -> spi -> master );
1182
1188
1183
- xfer .rx_buf = rx_data ;
1184
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1185
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1189
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1186
1190
if (ret < 0 )
1187
1191
return ret ;
1188
- spi_engine_offload_enable (st -> spi , true);
1192
+ spi_engine_ex_offload_enable (st -> spi , true);
1189
1193
}
1190
1194
1191
1195
return ret ;
@@ -1197,9 +1201,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1197
1201
unsigned int regval ;
1198
1202
1199
1203
if (st -> spi_is_dma_mapped ) {
1200
- spi_engine_offload_enable (st -> spi , false);
1204
+ spi_engine_ex_offload_enable (st -> spi , false);
1201
1205
spi_bus_unlock (st -> spi -> master );
1202
1206
}
1207
+ spi_unoptimize_message (& st -> offload_msg );
1203
1208
1204
1209
/*
1205
1210
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1333,7 +1338,7 @@ static int ad7768_probe(struct spi_device *spi)
1333
1338
return PTR_ERR (st -> mclk );
1334
1339
1335
1340
st -> mclk_freq = clk_get_rate (st -> mclk );
1336
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1341
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1337
1342
st -> irq = spi -> irq ;
1338
1343
1339
1344
mutex_init (& st -> lock );
0 commit comments