@@ -40,12 +40,17 @@ LOG_MODULE_REGISTER(memc_stm32_xspi_psram, CONFIG_MEMC_LOG_LEVEL);
40
40
#define DUMMY_CLK_CYCLES_READ 6U
41
41
#define DUMMY_CLK_CYCLES_WRITE 6U
42
42
43
+ #define STM32_XSPI_CLOCK_PRESCALER_MIN 0U
44
+ #define STM32_XSPI_CLOCK_PRESCALER_MAX 255U
45
+ #define STM32_XSPI_CLOCK_COMPUTE (bus_freq , prescaler ) ((bus_freq) / ((prescaler) + 1U))
46
+
43
47
struct memc_stm32_xspi_psram_config {
44
48
const struct pinctrl_dev_config * pcfg ;
45
49
const struct stm32_pclken pclken ;
46
50
const struct stm32_pclken pclken_ker ;
47
51
const struct stm32_pclken pclken_mgr ;
48
52
size_t memory_size ;
53
+ uint32_t max_frequency ;
49
54
};
50
55
51
56
struct memc_stm32_xspi_psram_data {
@@ -206,6 +211,7 @@ static int memc_stm32_xspi_psram_init(const struct device *dev)
206
211
XSPIM_CfgTypeDef cfg = {0 };
207
212
XSPI_RegularCmdTypeDef cmd = {0 };
208
213
XSPI_MemoryMappedTypeDef mem_mapped_cfg = {0 };
214
+ uint32_t prescaler = STM32_XSPI_CLOCK_PRESCALER_MIN ;
209
215
int ret ;
210
216
211
217
/* Signals configuration */
@@ -259,6 +265,20 @@ static int memc_stm32_xspi_psram_init(const struct device *dev)
259
265
}
260
266
#endif
261
267
268
+ for (; prescaler <= STM32_XSPI_CLOCK_PRESCALER_MAX ; prescaler ++ ) {
269
+ uint32_t clk = STM32_XSPI_CLOCK_COMPUTE (ahb_clock_freq , prescaler );
270
+
271
+ if (clk <= dev_cfg -> max_frequency ) {
272
+ break ;
273
+ }
274
+ }
275
+
276
+ if (prescaler > STM32_XSPI_CLOCK_PRESCALER_MAX ) {
277
+ LOG_ERR ("XSPI could not find valid prescaler value" );
278
+ return - EINVAL ;
279
+ }
280
+
281
+ hxspi .Init .ClockPrescaler = prescaler ;
262
282
hxspi .Init .MemorySize = find_msb_set (dev_cfg -> memory_size ) - 2 ;
263
283
264
284
if (HAL_XSPI_Init (& hxspi ) != HAL_OK ) {
@@ -339,6 +359,7 @@ static const struct memc_stm32_xspi_psram_config memc_stm32_xspi_cfg = {
339
359
.enr = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspi_mgr , bits )},
340
360
#endif
341
361
.memory_size = DT_INST_PROP (0 , size ) / 8 , /* In Bytes */
362
+ .max_frequency = DT_INST_PROP (0 , max_frequency ),
342
363
};
343
364
344
365
static struct memc_stm32_xspi_psram_data memc_stm32_xspi_data = {
@@ -354,7 +375,6 @@ static struct memc_stm32_xspi_psram_data memc_stm32_xspi_data = {
354
375
.FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE ,
355
376
.ClockMode = HAL_XSPI_CLOCK_MODE_0 ,
356
377
.WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED ,
357
- .ClockPrescaler = 3U ,
358
378
.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_NONE ,
359
379
.DelayHoldQuarterCycle = HAL_XSPI_DHQC_ENABLE ,
360
380
.ChipSelectBoundary = HAL_XSPI_BONDARYOF_16KB ,
0 commit comments