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>
@@ -288,6 +288,8 @@ struct ad7768_state {
288
288
struct mutex lock ;
289
289
struct clk * mclk ;
290
290
struct gpio_chip gpiochip ;
291
+ struct spi_transfer offload_xfer ;
292
+ struct spi_message offload_msg ;
291
293
unsigned int gpio_avail_map ;
292
294
unsigned int mclk_freq ;
293
295
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
@@ -1145,18 +1147,15 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1145
1147
{
1146
1148
struct ad7768_state * st = iio_priv (indio_dev );
1147
1149
const struct iio_scan_type * scan_type ;
1148
- struct spi_transfer xfer = {
1149
- .len = 1 ,
1150
- };
1151
1150
unsigned int rx_data [2 ];
1152
- struct spi_message msg ;
1153
1151
int ret ;
1154
1152
1155
1153
scan_type = iio_get_current_scan_type (indio_dev , & indio_dev -> channels [0 ]);
1156
1154
if (IS_ERR (scan_type ))
1157
1155
return PTR_ERR (scan_type );
1158
1156
1159
- xfer .bits_per_word = scan_type -> realbits ;
1157
+ st -> offload_xfer .len = roundup_pow_of_two (BITS_TO_BYTES (scan_type -> realbits ));
1158
+ st -> offload_xfer .bits_per_word = scan_type -> realbits ;
1160
1159
1161
1160
/*
1162
1161
* Write a 1 to the LSB of the INTERFACE_FORMAT register to enter
@@ -1168,14 +1167,19 @@ static int ad7768_buffer_postenable(struct iio_dev *indio_dev)
1168
1167
return ret ;
1169
1168
1170
1169
if (st -> spi_is_dma_mapped ) {
1170
+ st -> offload_xfer .rx_buf = rx_data ;
1171
+ spi_message_init_with_transfers (& st -> offload_msg , & st -> offload_xfer , 1 );
1172
+
1173
+ ret = spi_optimize_message (st -> spi , & st -> offload_msg );
1174
+ if (ret < 0 )
1175
+ return ret ;
1176
+
1171
1177
spi_bus_lock (st -> spi -> master );
1172
1178
1173
- xfer .rx_buf = rx_data ;
1174
- spi_message_init_with_transfers (& msg , & xfer , 1 );
1175
- ret = spi_engine_offload_load_msg (st -> spi , & msg );
1179
+ ret = spi_engine_ex_offload_load_msg (st -> spi , & st -> offload_msg );
1176
1180
if (ret < 0 )
1177
1181
return ret ;
1178
- spi_engine_offload_enable (st -> spi , true);
1182
+ spi_engine_ex_offload_enable (st -> spi , true);
1179
1183
}
1180
1184
1181
1185
return ret ;
@@ -1187,9 +1191,10 @@ static int ad7768_buffer_predisable(struct iio_dev *indio_dev)
1187
1191
unsigned int regval ;
1188
1192
1189
1193
if (st -> spi_is_dma_mapped ) {
1190
- spi_engine_offload_enable (st -> spi , false);
1194
+ spi_engine_ex_offload_enable (st -> spi , false);
1191
1195
spi_bus_unlock (st -> spi -> master );
1192
1196
}
1197
+ spi_unoptimize_message (& st -> offload_msg );
1193
1198
1194
1199
/*
1195
1200
* To exit continuous read mode, perform a single read of the ADC_DATA
@@ -1323,7 +1328,7 @@ static int ad7768_probe(struct spi_device *spi)
1323
1328
return PTR_ERR (st -> mclk );
1324
1329
1325
1330
st -> mclk_freq = clk_get_rate (st -> mclk );
1326
- st -> spi_is_dma_mapped = spi_engine_offload_supported (spi );
1331
+ st -> spi_is_dma_mapped = spi_engine_ex_offload_supported (spi );
1327
1332
st -> irq = spi -> irq ;
1328
1333
1329
1334
mutex_init (& st -> lock );
0 commit comments