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 ;
@@ -343,7 +345,7 @@ static int ad7768_spi_reg_read(struct ad7768_state *st, unsigned int addr,
343
345
unsigned char tx_data [4 ];
344
346
int ret ;
345
347
346
- tx_data [0 ] = AD7768_RD_FLAG_MSK (addr );
348
+ tx_data [len ] = AD7768_RD_FLAG_MSK (addr );
347
349
xfer .tx_buf = tx_data ;
348
350
ret = spi_sync_transfer (st -> spi , & xfer , 1 );
349
351
if (ret < 0 )
@@ -364,8 +366,8 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,
364
366
};
365
367
unsigned char tx_data [2 ];
366
368
367
- tx_data [0 ] = AD7768_WR_FLAG_MSK (addr );
368
- tx_data [1 ] = val & 0xFF ;
369
+ tx_data [1 ] = AD7768_WR_FLAG_MSK (addr );
370
+ tx_data [0 ] = val & 0xFF ;
369
371
xfer .tx_buf = tx_data ;
370
372
return spi_sync_transfer (st -> spi , & xfer , 1 );
371
373
}
@@ -1067,14 +1069,14 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1067
1069
.len = 1 ,
1068
1070
};
1069
1071
unsigned int rx_data [2 ];
1070
- struct spi_message msg ;
1071
1072
int ret ;
1072
1073
1073
1074
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1074
1075
if (IS_ERR (scan_type ))
1075
1076
return PTR_ERR (scan_type );
1076
1077
1077
- xfer .bits_per_word = scan_type -> realbits ;
1078
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1079
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1078
1080
1079
1081
/*
1080
1082
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1086,14 +1088,19 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1086
1088
return ret ;
1087
1089
1088
1090
if (st -> spi_is_dma_mapped ) {
1091
+ st -> offload_xfer .rx_buf = rx_data ;
1092
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1093
+
1094
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1095
+ if (ret < 0 )
1096
+ return ret ;
1097
+
1089
1098
spi_bus_lock (st -> spi -> master );
1090
1099
1091
- xfer .rx_buf = rx_data ;
1092
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1093
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1100
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1094
1101
if (ret < 0 )
1095
1102
return ret ;
1096
- spi_engine_offload_enable (st -> spi , true);
1103
+ spi_engine_ex_offload_enable (st -> spi , true);
1097
1104
}
1098
1105
1099
1106
return ret ;
@@ -1105,9 +1112,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1105
1112
unsigned int regval ;
1106
1113
1107
1114
if (st -> spi_is_dma_mapped ) {
1108
- spi_engine_offload_enable (st -> spi , false);
1115
+ spi_engine_ex_offload_enable (st -> spi , false);
1109
1116
spi_bus_unlock (st -> spi -> master );
1110
1117
}
1118
+ spi_unoptimize_message (& st -> offload_msg );
1111
1119
1112
1120
/*
1113
1121
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1241,7 +1249,7 @@ static int ad7768_probe(struct spi_device *spi)
1241
1249
return PTR_ERR (st -> mclk );
1242
1250
1243
1251
st -> mclk_freq = clk_get_rate (st -> mclk );
1244
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1252
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1245
1253
st -> irq = spi -> irq ;
1246
1254
1247
1255
mutex_init (& st -> lock );
0 commit comments