@@ -12,9 +12,16 @@ LOG_MODULE_REGISTER(spi_mcux_lpspi_rtio, CONFIG_SPI_LOG_LEVEL);
12
12
#include <zephyr/drivers/spi/rtio.h>
13
13
#include "spi_nxp_lpspi_priv.h"
14
14
15
+ struct spi_mcux_rtio_data {
16
+ lpspi_master_handle_t handle ;
17
+ struct spi_rtio * rtio_ctx ;
18
+ size_t transfer_len ;
19
+ };
20
+
15
21
static int spi_mcux_transfer_next_packet (const struct device * dev )
16
22
{
17
23
struct spi_mcux_data * data = dev -> data ;
24
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
18
25
LPSPI_Type * base = (LPSPI_Type * )DEVICE_MMIO_NAMED_GET (dev , reg_base );
19
26
struct spi_context * ctx = & data -> ctx ;
20
27
size_t max_chunk = spi_context_max_continuous_chunk (ctx );
@@ -27,14 +34,14 @@ static int spi_mcux_transfer_next_packet(const struct device *dev)
27
34
return 0 ;
28
35
}
29
36
30
- data -> transfer_len = max_chunk ;
37
+ rtio_data -> transfer_len = max_chunk ;
31
38
32
39
transfer .configFlags = LPSPI_MASTER_XFER_CFG_FLAGS (ctx -> config -> slave );
33
40
transfer .txData = (ctx -> tx_len == 0 ? NULL : ctx -> tx_buf );
34
41
transfer .rxData = (ctx -> rx_len == 0 ? NULL : ctx -> rx_buf );
35
42
transfer .dataSize = max_chunk ;
36
43
37
- status = LPSPI_MasterTransferNonBlocking (base , & data -> handle , & transfer );
44
+ status = LPSPI_MasterTransferNonBlocking (base , & rtio_data -> handle , & transfer );
38
45
if (status != kStatus_Success ) {
39
46
LOG_ERR ("Transfer could not start on %s: %d" , dev -> name , status );
40
47
return status == kStatus_LPSPI_Busy ? - EBUSY : - EINVAL ;
@@ -49,23 +56,25 @@ static void spi_mcux_master_rtio_callback(LPSPI_Type *base, lpspi_master_handle_
49
56
status_t status , void * userData )
50
57
{
51
58
struct spi_mcux_data * data = userData ;
52
- struct spi_rtio * rtio_ctx = data -> rtio_ctx ;
59
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
60
+ struct spi_rtio * rtio_ctx = rtio_data -> rtio_ctx ;
53
61
54
62
if (rtio_ctx -> txn_head != NULL ) {
55
63
spi_mcux_iodev_complete (data -> dev , status );
56
64
return ;
57
65
}
58
66
59
- spi_context_update_tx (& data -> ctx , 1 , data -> transfer_len );
60
- spi_context_update_rx (& data -> ctx , 1 , data -> transfer_len );
67
+ spi_context_update_tx (& data -> ctx , 1 , rtio_data -> transfer_len );
68
+ spi_context_update_rx (& data -> ctx , 1 , rtio_data -> transfer_len );
61
69
62
70
spi_mcux_transfer_next_packet (data -> dev );
63
71
}
64
72
65
73
static void spi_mcux_iodev_start (const struct device * dev )
66
74
{
67
75
struct spi_mcux_data * data = dev -> data ;
68
- struct spi_rtio * rtio_ctx = data -> rtio_ctx ;
76
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
77
+ struct spi_rtio * rtio_ctx = rtio_data -> rtio_ctx ;
69
78
struct rtio_sqe * sqe = & rtio_ctx -> txn_curr -> sqe ;
70
79
struct spi_dt_spec * spi_dt_spec = sqe -> iodev -> data ;
71
80
struct spi_config * spi_cfg = & spi_dt_spec -> config ;
@@ -79,7 +88,8 @@ static void spi_mcux_iodev_start(const struct device *dev)
79
88
return ;
80
89
}
81
90
82
- LPSPI_MasterTransferCreateHandle (base , & data -> handle , spi_mcux_master_rtio_callback , data );
91
+ LPSPI_MasterTransferCreateHandle (base , & rtio_data -> handle , spi_mcux_master_rtio_callback ,
92
+ data );
83
93
84
94
transfer .configFlags = LPSPI_MASTER_XFER_CFG_FLAGS (spi_cfg -> slave );
85
95
@@ -110,11 +120,11 @@ static void spi_mcux_iodev_start(const struct device *dev)
110
120
return ;
111
121
}
112
122
113
- data -> transfer_len = transfer .dataSize ;
123
+ rtio_data -> transfer_len = transfer .dataSize ;
114
124
115
125
spi_context_cs_control (& data -> ctx , true);
116
126
117
- status = LPSPI_MasterTransferNonBlocking (base , & data -> handle , & transfer );
127
+ status = LPSPI_MasterTransferNonBlocking (base , & rtio_data -> handle , & transfer );
118
128
if (status != kStatus_Success ) {
119
129
LOG_ERR ("Transfer could not start on %s: %d" , dev -> name , status );
120
130
spi_mcux_iodev_complete (dev , - EIO );
@@ -124,7 +134,8 @@ static void spi_mcux_iodev_start(const struct device *dev)
124
134
static void spi_mcux_iodev_complete (const struct device * dev , int status )
125
135
{
126
136
struct spi_mcux_data * data = dev -> data ;
127
- struct spi_rtio * rtio_ctx = data -> rtio_ctx ;
137
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
138
+ struct spi_rtio * rtio_ctx = rtio_data -> rtio_ctx ;
128
139
129
140
if (!status && rtio_ctx -> txn_curr -> sqe .flags & RTIO_SQE_TRANSACTION ) {
130
141
rtio_ctx -> txn_curr = rtio_txn_next (rtio_ctx -> txn_curr );
@@ -143,7 +154,8 @@ static void spi_mcux_iodev_complete(const struct device *dev, int status)
143
154
static void spi_mcux_iodev_submit (const struct device * dev , struct rtio_iodev_sqe * iodev_sqe )
144
155
{
145
156
struct spi_mcux_data * data = dev -> data ;
146
- struct spi_rtio * rtio_ctx = data -> rtio_ctx ;
157
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
158
+ struct spi_rtio * rtio_ctx = rtio_data -> rtio_ctx ;
147
159
148
160
if (spi_rtio_submit (rtio_ctx , iodev_sqe )) {
149
161
spi_mcux_iodev_start (dev );
@@ -154,7 +166,8 @@ static int transceive_rtio(const struct device *dev, const struct spi_config *sp
154
166
const struct spi_buf_set * tx_bufs , const struct spi_buf_set * rx_bufs )
155
167
{
156
168
struct spi_mcux_data * data = dev -> data ;
157
- struct spi_rtio * rtio_ctx = data -> rtio_ctx ;
169
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
170
+ struct spi_rtio * rtio_ctx = rtio_data -> rtio_ctx ;
158
171
int ret ;
159
172
160
173
spi_context_lock (& data -> ctx , false, NULL , NULL , spi_cfg );
@@ -195,14 +208,15 @@ static DEVICE_API(spi, spi_mcux_rtio_driver_api) = {
195
208
static int spi_mcux_rtio_init (const struct device * dev )
196
209
{
197
210
struct spi_mcux_data * data = dev -> data ;
211
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
198
212
int err = 0 ;
199
213
200
214
err = spi_nxp_init_common (dev );
201
215
if (err ) {
202
216
return err ;
203
217
}
204
218
205
- spi_rtio_init (data -> rtio_ctx , dev );
219
+ spi_rtio_init (rtio_data -> rtio_ctx , dev );
206
220
207
221
spi_context_unlock_unconditionally (& data -> ctx );
208
222
@@ -212,9 +226,10 @@ static int spi_mcux_rtio_init(const struct device *dev)
212
226
static void lpspi_isr (const struct device * dev )
213
227
{
214
228
struct spi_mcux_data * data = dev -> data ;
229
+ struct spi_mcux_rtio_data * rtio_data = (struct spi_mcux_rtio_data * )data -> driver_data ;
215
230
LPSPI_Type * base = (LPSPI_Type * )DEVICE_MMIO_NAMED_GET (dev , reg_base );
216
231
217
- LPSPI_MasterTransferHandleIRQ (LPSPI_IRQ_HANDLE_ARG , & data -> handle );
232
+ LPSPI_MasterTransferHandleIRQ (LPSPI_IRQ_HANDLE_ARG , & rtio_data -> handle );
218
233
}
219
234
220
235
#define SPI_MCUX_RTIO_DEFINE (n ) \
@@ -226,7 +241,11 @@ static void lpspi_isr(const struct device *dev)
226
241
SPI_NXP_LPSPI_COMMON_INIT(n) \
227
242
SPI_MCUX_LPSPI_CONFIG_INIT(n) \
228
243
\
229
- static struct spi_mcux_data spi_mcux_data_##n = {.rtio_ctx = &spi_mcux_rtio_##n, \
244
+ static struct spi_mcux_rtio_data lpspi_rtio_data_##n = { \
245
+ .rtio_ctx = &spi_mcux_rtio_##n, \
246
+ }; \
247
+ \
248
+ static struct spi_mcux_data spi_mcux_data_##n = {.driver_data = &lpspi_rtio_data_##n, \
230
249
SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \
231
250
\
232
251
SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_rtio_init, NULL, &spi_mcux_data_##n, \
0 commit comments