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
@@ -1137,18 +1139,15 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1137
1139
{
1138
1140
struct ad7768_state * st = iio_priv (indio_dev );
1139
1141
const struct iio_scan_type * scan_type ;
1140
- struct spi_transfer xfer = {
1141
- .len = 1 ,
1142
- };
1143
1142
unsigned int rx_data [2 ];
1144
- struct spi_message msg ;
1145
1143
int ret ;
1146
1144
1147
1145
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1148
1146
if (IS_ERR (scan_type ))
1149
1147
return PTR_ERR (scan_type );
1150
1148
1151
- xfer .bits_per_word = scan_type -> realbits ;
1149
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1150
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1152
1151
1153
1152
/*
1154
1153
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1160,14 +1159,19 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1160
1159
return ret ;
1161
1160
1162
1161
if (st -> spi_is_dma_mapped ) {
1162
+ st -> offload_xfer .rx_buf = rx_data ;
1163
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1164
+
1165
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1166
+ if (ret < 0 )
1167
+ return ret ;
1168
+
1163
1169
spi_bus_lock (st -> spi -> master );
1164
1170
1165
- xfer .rx_buf = rx_data ;
1166
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1167
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1171
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1168
1172
if (ret < 0 )
1169
1173
return ret ;
1170
- spi_engine_offload_enable (st -> spi , true);
1174
+ spi_engine_ex_offload_enable (st -> spi , true);
1171
1175
}
1172
1176
1173
1177
return ret ;
@@ -1179,9 +1183,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1179
1183
unsigned int regval ;
1180
1184
1181
1185
if (st -> spi_is_dma_mapped ) {
1182
- spi_engine_offload_enable (st -> spi , false);
1186
+ spi_engine_ex_offload_enable (st -> spi , false);
1183
1187
spi_bus_unlock (st -> spi -> master );
1184
1188
}
1189
+ spi_unoptimize_message (& st -> offload_msg );
1185
1190
1186
1191
/*
1187
1192
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1315,7 +1320,7 @@ static int ad7768_probe(struct spi_device *spi)
1315
1320
return PTR_ERR (st -> mclk );
1316
1321
1317
1322
st -> mclk_freq = clk_get_rate (st -> mclk );
1318
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1323
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1319
1324
st -> irq = spi -> irq ;
1320
1325
1321
1326
mutex_init (& st -> lock );
0 commit comments