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>
@@ -300,6 +300,8 @@ struct ad7768_state {
300
300
struct mutex lock ;
301
301
struct clk * mclk ;
302
302
struct gpio_chip gpiochip ;
303
+ struct spi_transfer offload_xfer ;
304
+ struct spi_message offload_msg ;
303
305
unsigned int gpio_avail_map ;
304
306
unsigned int mclk_freq ;
305
307
unsigned int samp_freq ;
@@ -341,7 +343,7 @@ static int ad7768_spi_reg_read(struct ad7768_state *st, unsigned int addr,
341
343
unsigned char tx_data [4 ];
342
344
int ret ;
343
345
344
- tx_data [0 ] = AD7768_RD_FLAG_MSK (addr );
346
+ tx_data [len ] = AD7768_RD_FLAG_MSK (addr );
345
347
xfer .tx_buf = tx_data ;
346
348
ret = spi_sync_transfer (st -> spi , & xfer , 1 );
347
349
if (ret < 0 )
@@ -362,8 +364,8 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,
362
364
};
363
365
unsigned char tx_data [2 ];
364
366
365
- tx_data [0 ] = AD7768_WR_FLAG_MSK (addr );
366
- tx_data [1 ] = val & 0xFF ;
367
+ tx_data [1 ] = AD7768_WR_FLAG_MSK (addr );
368
+ tx_data [0 ] = val & 0xFF ;
367
369
xfer .tx_buf = tx_data ;
368
370
return spi_sync_transfer (st -> spi , & xfer , 1 );
369
371
}
@@ -1040,19 +1042,16 @@ static irqreturn_t ad7768_interrupt(int irq, void *dev_id)
1040
1042
static int ad7768_buffer_postenable (struct iio_dev * indio_dev )
1041
1043
{
1042
1044
struct ad7768_state * st = iio_priv (indio_dev );
1043
- struct spi_transfer xfer = {
1044
- .len = 1 ,
1045
- };
1046
1045
unsigned int rx_data [2 ];
1047
- struct spi_message msg ;
1048
1046
const struct iio_scan_type * scan_type ;
1049
1047
int ret ;
1050
1048
1051
1049
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1052
1050
if (IS_ERR (scan_type ))
1053
1051
return PTR_ERR (scan_type );
1054
1052
1055
- xfer .bits_per_word = scan_type -> realbits ;
1053
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1054
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1056
1055
1057
1056
/*
1058
1057
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1064,14 +1063,19 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1064
1063
return ret ;
1065
1064
1066
1065
if (st -> spi_is_dma_mapped ) {
1066
+ st -> offload_xfer .rx_buf = rx_data ;
1067
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1068
+
1069
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1070
+ if (ret < 0 )
1071
+ return ret ;
1072
+
1067
1073
spi_bus_lock (st -> spi -> master );
1068
1074
1069
- xfer .rx_buf = rx_data ;
1070
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1071
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1075
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1072
1076
if (ret < 0 )
1073
1077
return ret ;
1074
- spi_engine_offload_enable (st -> spi , true);
1078
+ spi_engine_ex_offload_enable (st -> spi , true);
1075
1079
}
1076
1080
1077
1081
return ret ;
@@ -1083,9 +1087,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1083
1087
unsigned int regval ;
1084
1088
1085
1089
if (st -> spi_is_dma_mapped ) {
1086
- spi_engine_offload_enable (st -> spi , false);
1090
+ spi_engine_ex_offload_enable (st -> spi , false);
1087
1091
spi_bus_unlock (st -> spi -> master );
1088
1092
}
1093
+ spi_unoptimize_message (& st -> offload_msg );
1089
1094
1090
1095
/*
1091
1096
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1219,7 +1224,7 @@ static int ad7768_probe(struct spi_device *spi)
1219
1224
return PTR_ERR (st -> mclk );
1220
1225
1221
1226
st -> mclk_freq = clk_get_rate (st -> mclk );
1222
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1227
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1223
1228
st -> irq = spi -> irq ;
1224
1229
1225
1230
mutex_init (& st -> lock );
0 commit comments