Skip to content

Commit 8978f66

Browse files
decsnykartben
authored andcommitted
spi_nxp_lpspi: Save RAM by having driver data ptr
Make a pointer to data that is specific to a certain type of LPSPI driver, instead of having all of it in the struct whether it is used or not. Signed-off-by: Declan Snyder <[email protected]>
1 parent 31a2b4f commit 8978f66

File tree

4 files changed

+101
-65
lines changed

4 files changed

+101
-65
lines changed

drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi.c

+16-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,14 @@ LOG_MODULE_REGISTER(spi_mcux_lpspi, CONFIG_SPI_LOG_LEVEL);
1111

1212
#include "spi_nxp_lpspi_priv.h"
1313

14+
struct lpspi_driver_data {
15+
lpspi_master_handle_t handle;
16+
};
17+
1418
static int spi_mcux_transfer_next_packet(const struct device *dev)
1519
{
1620
struct spi_mcux_data *data = dev->data;
21+
struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data;
1722
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
1823
struct spi_context *ctx = &data->ctx;
1924
size_t max_chunk = spi_context_max_continuous_chunk(ctx);
@@ -33,7 +38,7 @@ static int spi_mcux_transfer_next_packet(const struct device *dev)
3338
transfer.rxData = (ctx->rx_len == 0 ? NULL : ctx->rx_buf);
3439
transfer.dataSize = max_chunk;
3540

36-
status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer);
41+
status = LPSPI_MasterTransferNonBlocking(base, &lpspi_data->handle, &transfer);
3742
if (status != kStatus_Success) {
3843
LOG_ERR("Transfer could not start on %s: %d", dev->name, status);
3944
return status == kStatus_LPSPI_Busy ? -EBUSY : -EINVAL;
@@ -45,9 +50,10 @@ static int spi_mcux_transfer_next_packet(const struct device *dev)
4550
static void lpspi_isr(const struct device *dev)
4651
{
4752
struct spi_mcux_data *data = dev->data;
53+
struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data;
4854
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
4955

50-
LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &data->handle);
56+
LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &lpspi_data->handle);
5157
}
5258

5359
static void spi_mcux_master_callback(LPSPI_Type *base, lpspi_master_handle_t *handle,
@@ -67,6 +73,7 @@ static int transceive(const struct device *dev, const struct spi_config *spi_cfg
6773
{
6874
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
6975
struct spi_mcux_data *data = dev->data;
76+
struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data;
7077
int ret;
7178

7279
spi_context_lock(&data->ctx, asynchronous, cb, userdata, spi_cfg);
@@ -76,7 +83,7 @@ static int transceive(const struct device *dev, const struct spi_config *spi_cfg
7683
goto out;
7784
}
7885

79-
LPSPI_MasterTransferCreateHandle(base, &data->handle, spi_mcux_master_callback, data);
86+
LPSPI_MasterTransferCreateHandle(base, &lpspi_data->handle, spi_mcux_master_callback, data);
8087

8188
spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, 1);
8289

@@ -138,7 +145,12 @@ static int spi_mcux_init(const struct device *dev)
138145
SPI_NXP_LPSPI_COMMON_INIT(n) \
139146
SPI_MCUX_LPSPI_CONFIG_INIT(n) \
140147
\
141-
static struct spi_mcux_data spi_mcux_data_##n = {SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \
148+
static struct lpspi_driver_data lpspi_##n##_driver_data; \
149+
\
150+
static struct spi_mcux_data spi_mcux_data_##n = { \
151+
SPI_NXP_LPSPI_COMMON_DATA_INIT(n) \
152+
.driver_data = &lpspi_##n##_driver_data, \
153+
}; \
142154
\
143155
SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_init, NULL, &spi_mcux_data_##n, \
144156
&spi_mcux_config_##n, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \

drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi_rtio.c

+34-15
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@ LOG_MODULE_REGISTER(spi_mcux_lpspi_rtio, CONFIG_SPI_LOG_LEVEL);
1212
#include <zephyr/drivers/spi/rtio.h>
1313
#include "spi_nxp_lpspi_priv.h"
1414

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+
1521
static int spi_mcux_transfer_next_packet(const struct device *dev)
1622
{
1723
struct spi_mcux_data *data = dev->data;
24+
struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data;
1825
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
1926
struct spi_context *ctx = &data->ctx;
2027
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)
2734
return 0;
2835
}
2936

30-
data->transfer_len = max_chunk;
37+
rtio_data->transfer_len = max_chunk;
3138

3239
transfer.configFlags = LPSPI_MASTER_XFER_CFG_FLAGS(ctx->config->slave);
3340
transfer.txData = (ctx->tx_len == 0 ? NULL : ctx->tx_buf);
3441
transfer.rxData = (ctx->rx_len == 0 ? NULL : ctx->rx_buf);
3542
transfer.dataSize = max_chunk;
3643

37-
status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer);
44+
status = LPSPI_MasterTransferNonBlocking(base, &rtio_data->handle, &transfer);
3845
if (status != kStatus_Success) {
3946
LOG_ERR("Transfer could not start on %s: %d", dev->name, status);
4047
return status == kStatus_LPSPI_Busy ? -EBUSY : -EINVAL;
@@ -49,23 +56,25 @@ static void spi_mcux_master_rtio_callback(LPSPI_Type *base, lpspi_master_handle_
4956
status_t status, void *userData)
5057
{
5158
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;
5361

5462
if (rtio_ctx->txn_head != NULL) {
5563
spi_mcux_iodev_complete(data->dev, status);
5664
return;
5765
}
5866

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);
6169

6270
spi_mcux_transfer_next_packet(data->dev);
6371
}
6472

6573
static void spi_mcux_iodev_start(const struct device *dev)
6674
{
6775
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;
6978
struct rtio_sqe *sqe = &rtio_ctx->txn_curr->sqe;
7079
struct spi_dt_spec *spi_dt_spec = sqe->iodev->data;
7180
struct spi_config *spi_cfg = &spi_dt_spec->config;
@@ -79,7 +88,8 @@ static void spi_mcux_iodev_start(const struct device *dev)
7988
return;
8089
}
8190

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);
8393

8494
transfer.configFlags = LPSPI_MASTER_XFER_CFG_FLAGS(spi_cfg->slave);
8595

@@ -110,11 +120,11 @@ static void spi_mcux_iodev_start(const struct device *dev)
110120
return;
111121
}
112122

113-
data->transfer_len = transfer.dataSize;
123+
rtio_data->transfer_len = transfer.dataSize;
114124

115125
spi_context_cs_control(&data->ctx, true);
116126

117-
status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer);
127+
status = LPSPI_MasterTransferNonBlocking(base, &rtio_data->handle, &transfer);
118128
if (status != kStatus_Success) {
119129
LOG_ERR("Transfer could not start on %s: %d", dev->name, status);
120130
spi_mcux_iodev_complete(dev, -EIO);
@@ -124,7 +134,8 @@ static void spi_mcux_iodev_start(const struct device *dev)
124134
static void spi_mcux_iodev_complete(const struct device *dev, int status)
125135
{
126136
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;
128139

129140
if (!status && rtio_ctx->txn_curr->sqe.flags & RTIO_SQE_TRANSACTION) {
130141
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)
143154
static void spi_mcux_iodev_submit(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe)
144155
{
145156
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;
147159

148160
if (spi_rtio_submit(rtio_ctx, iodev_sqe)) {
149161
spi_mcux_iodev_start(dev);
@@ -154,7 +166,8 @@ static int transceive_rtio(const struct device *dev, const struct spi_config *sp
154166
const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs)
155167
{
156168
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;
158171
int ret;
159172

160173
spi_context_lock(&data->ctx, false, NULL, NULL, spi_cfg);
@@ -195,14 +208,15 @@ static DEVICE_API(spi, spi_mcux_rtio_driver_api) = {
195208
static int spi_mcux_rtio_init(const struct device *dev)
196209
{
197210
struct spi_mcux_data *data = dev->data;
211+
struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data;
198212
int err = 0;
199213

200214
err = spi_nxp_init_common(dev);
201215
if (err) {
202216
return err;
203217
}
204218

205-
spi_rtio_init(data->rtio_ctx, dev);
219+
spi_rtio_init(rtio_data->rtio_ctx, dev);
206220

207221
spi_context_unlock_unconditionally(&data->ctx);
208222

@@ -212,9 +226,10 @@ static int spi_mcux_rtio_init(const struct device *dev)
212226
static void lpspi_isr(const struct device *dev)
213227
{
214228
struct spi_mcux_data *data = dev->data;
229+
struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data;
215230
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
216231

217-
LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &data->handle);
232+
LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &rtio_data->handle);
218233
}
219234

220235
#define SPI_MCUX_RTIO_DEFINE(n) \
@@ -226,7 +241,11 @@ static void lpspi_isr(const struct device *dev)
226241
SPI_NXP_LPSPI_COMMON_INIT(n) \
227242
SPI_MCUX_LPSPI_CONFIG_INIT(n) \
228243
\
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, \
230249
SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \
231250
\
232251
SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_rtio_init, NULL, &spi_mcux_data_##n, \

0 commit comments

Comments
 (0)