1
1
/*
2
- * Copyright 2020 NXP
2
+ * Copyright 2020-2023 NXP
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*/
29
29
30
30
LOG_MODULE_REGISTER (memc_flexspi , CONFIG_MEMC_LOG_LEVEL );
31
31
32
+ struct memc_flexspi_buf_cfg {
33
+ uint16_t prefetch ;
34
+ uint16_t priority ;
35
+ uint16_t master_id ;
36
+ uint16_t buf_size ;
37
+ } __packed ;
38
+
32
39
/* flexspi device data should be stored in RAM to avoid read-while-write hazards */
33
40
struct memc_flexspi_data {
34
41
FLEXSPI_Type * base ;
@@ -45,6 +52,8 @@ struct memc_flexspi_data {
45
52
const struct pinctrl_dev_config * pincfg ;
46
53
#endif
47
54
size_t size [kFLEXSPI_PortCount ];
55
+ struct memc_flexspi_buf_cfg * buf_cfg ;
56
+ uint8_t buf_cfg_cnt ;
48
57
};
49
58
50
59
void memc_flexspi_wait_bus_idle (const struct device * dev )
@@ -170,6 +179,20 @@ static int memc_flexspi_init(const struct device *dev)
170
179
flexspi_config .enableSckBDiffOpt = data -> sck_differential_clock ;
171
180
flexspi_config .rxSampleClock = data -> rx_sample_clock ;
172
181
182
+ /* Configure AHB RX buffers, if any configuration settings are present */
183
+ __ASSERT (data -> buf_cfg_cnt < FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT ,
184
+ "Maximum RX buffer configuration count exceeded" );
185
+ for (uint8_t i = 0 ; i < data -> buf_cfg_cnt ; i ++ ) {
186
+ /* Should AHB prefetch up to buffer size? */
187
+ flexspi_config .ahbConfig .buffer [i ].enablePrefetch = data -> buf_cfg [i ].prefetch ;
188
+ /* AHB access priority (used for suspending control of AHB prefetching )*/
189
+ flexspi_config .ahbConfig .buffer [i ].priority = data -> buf_cfg [i ].priority ;
190
+ /* AHB master index, SOC specific */
191
+ flexspi_config .ahbConfig .buffer [i ].masterIndex = data -> buf_cfg [i ].master_id ;
192
+ /* RX buffer allocation (total available buffer space is instance/SOC specific) */
193
+ flexspi_config .ahbConfig .buffer [i ].bufferSize = data -> buf_cfg [i ].buf_size ;
194
+ }
195
+
173
196
FLEXSPI_Init (data -> base , & flexspi_config );
174
197
175
198
return 0 ;
@@ -226,6 +249,9 @@ static int memc_flexspi_pm_action(const struct device *dev, enum pm_device_actio
226
249
227
250
#define MEMC_FLEXSPI (n ) \
228
251
PINCTRL_DEFINE(n) \
252
+ static uint16_t buf_cfg_##n[] = \
253
+ DT_INST_PROP_OR(n, rx_buffer_config, {0}); \
254
+ \
229
255
static struct memc_flexspi_data \
230
256
memc_flexspi_data_##n = { \
231
257
.base = (FLEXSPI_Type *) DT_INST_REG_ADDR(n), \
@@ -238,6 +264,9 @@ static int memc_flexspi_pm_action(const struct device *dev, enum pm_device_actio
238
264
.combination_mode = DT_INST_PROP(n, combination_mode), \
239
265
.sck_differential_clock = DT_INST_PROP(n, sck_differential_clock), \
240
266
.rx_sample_clock = DT_INST_PROP(n, rx_clock_source), \
267
+ .buf_cfg = (struct memc_flexspi_buf_cfg *)buf_cfg_##n, \
268
+ .buf_cfg_cnt = sizeof(buf_cfg_##n) / \
269
+ sizeof(struct memc_flexspi_buf_cfg), \
241
270
PINCTRL_INIT(n) \
242
271
}; \
243
272
\
0 commit comments