22
22
#include <linux/sysfs.h>
23
23
#include "linux/util_macros.h"
24
24
#include <linux/spi/spi.h>
25
- #include <linux/spi/spi-engine.h>
25
+ #include <linux/spi/spi-engine-ex .h>
26
26
27
27
#include <linux/iio/buffer.h>
28
28
#include <linux/iio/buffer-dma.h>
@@ -289,6 +289,8 @@ struct ad7768_state {
289
289
struct mutex lock ;
290
290
struct clk * mclk ;
291
291
struct gpio_chip gpiochip ;
292
+ struct spi_transfer offload_xfer ;
293
+ struct spi_message offload_msg ;
292
294
unsigned int gpio_avail_map ;
293
295
unsigned int mclk_freq ;
294
296
unsigned int mclk_div ;
@@ -329,11 +331,11 @@ static int ad7768_spi_reg_read(struct ad7768_state *st, unsigned int addr,
329
331
.len = len + 1 ,
330
332
.bits_per_word = (len == 3 ? 32 : 16 ),
331
333
};
332
- unsigned char tx_data [ 4 ] ;
334
+ u32 tx_data ;
333
335
int ret ;
334
336
335
- tx_data [ 0 ] = AD7768_RD_FLAG_MSK (addr );
336
- xfer .tx_buf = tx_data ;
337
+ tx_data = AD7768_RD_FLAG_MSK (addr ) << ( len * 8 );
338
+ xfer .tx_buf = & tx_data ;
337
339
ret = spi_sync_transfer (st -> spi , & xfer , 1 );
338
340
if (ret < 0 )
339
341
return ret ;
@@ -351,11 +353,11 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,
351
353
.len = 2 ,
352
354
.bits_per_word = 16 ,
353
355
};
354
- unsigned char tx_data [ 2 ] ;
356
+ u16 tx_data ;
355
357
356
- tx_data [ 0 ] = AD7768_WR_FLAG_MSK (addr );
357
- tx_data [ 1 ] = val & 0xFF ;
358
- xfer .tx_buf = tx_data ;
358
+ tx_data = AD7768_WR_FLAG_MSK (addr ) << 8 ;
359
+ tx_data | = val & 0xFF ;
360
+ xfer .tx_buf = & tx_data ;
359
361
return spi_sync_transfer (st -> spi , & xfer , 1 );
360
362
}
361
363
@@ -1107,18 +1109,14 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1107
1109
{
1108
1110
struct ad7768_state * st = iio_priv (indio_dev );
1109
1111
const struct iio_scan_type * scan_type ;
1110
- struct spi_transfer xfer = {
1111
- .len = 1 ,
1112
- };
1113
- unsigned int rx_data [2 ];
1114
- struct spi_message msg ;
1115
1112
int ret ;
1116
1113
1117
1114
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1118
1115
if (IS_ERR (scan_type ))
1119
1116
return PTR_ERR (scan_type );
1120
1117
1121
- xfer .bits_per_word = scan_type -> realbits ;
1118
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1119
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1122
1120
1123
1121
/*
1124
1122
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1130,14 +1128,20 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1130
1128
return ret ;
1131
1129
1132
1130
if (st -> spi_is_dma_mapped ) {
1131
+ /* HACK: invalid pointer indicates read data from SPI offload DMA */
1132
+ st -> offload_xfer .rx_buf = (void * )(-1 );
1133
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1134
+
1135
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1136
+ if (ret < 0 )
1137
+ return ret ;
1138
+
1133
1139
spi_bus_lock (st -> spi -> master );
1134
1140
1135
- xfer .rx_buf = rx_data ;
1136
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1137
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1141
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1138
1142
if (ret < 0 )
1139
1143
return ret ;
1140
- spi_engine_offload_enable (st -> spi , true);
1144
+ spi_engine_ex_offload_enable (st -> spi , true);
1141
1145
}
1142
1146
1143
1147
return ret ;
@@ -1149,9 +1153,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1149
1153
unsigned int regval ;
1150
1154
1151
1155
if (st -> spi_is_dma_mapped ) {
1152
- spi_engine_offload_enable (st -> spi , false);
1156
+ spi_engine_ex_offload_enable (st -> spi , false);
1153
1157
spi_bus_unlock (st -> spi -> master );
1154
1158
}
1159
+ spi_unoptimize_message (& st -> offload_msg );
1155
1160
1156
1161
/*
1157
1162
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1285,7 +1290,7 @@ static int ad7768_probe(struct spi_device *spi)
1285
1290
return PTR_ERR (st -> mclk );
1286
1291
1287
1292
st -> mclk_freq = clk_get_rate (st -> mclk );
1288
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1293
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1289
1294
st -> irq = spi -> irq ;
1290
1295
1291
1296
mutex_init (& st -> lock );
0 commit comments