@@ -2055,53 +2055,44 @@ static int flash_stm32_xspi_init(const struct device *dev)
2055
2055
return ret ;
2056
2056
}
2057
2057
2058
- if (dev_cfg -> pclk_len > 3 ) {
2059
- /* Max 3 domain clock are expected */
2060
- LOG_ERR ("Could not select %d XSPI domain clock" , dev_cfg -> pclk_len );
2061
- return - EIO ;
2062
- }
2063
-
2064
2058
/* Clock configuration */
2065
2059
if (clock_control_on (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2066
- (clock_control_subsys_t ) & dev_cfg -> pclken [ 0 ] ) != 0 ) {
2060
+ (clock_control_subsys_t ) & dev_cfg -> pclken ) != 0 ) {
2067
2061
LOG_ERR ("Could not enable XSPI clock" );
2068
2062
return - EIO ;
2069
2063
}
2070
2064
if (clock_control_get_rate (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2071
- (clock_control_subsys_t ) & dev_cfg -> pclken [ 0 ] ,
2065
+ (clock_control_subsys_t ) & dev_cfg -> pclken ,
2072
2066
& ahb_clock_freq ) < 0 ) {
2073
2067
LOG_ERR ("Failed call clock_control_get_rate(pclken)" );
2074
2068
return - EIO ;
2075
2069
}
2076
- /* Alternate clock config for peripheral if any */
2077
- if (IS_ENABLED (STM32_XSPI_DOMAIN_CLOCK_SUPPORT ) && (dev_cfg -> pclk_len > 1 )) {
2078
- if (clock_control_configure (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2079
- (clock_control_subsys_t ) & dev_cfg -> pclken [1 ],
2080
- NULL ) != 0 ) {
2081
- LOG_ERR ("Could not select XSPI domain clock" );
2082
- return - EIO ;
2083
- }
2084
- /*
2085
- * Get the clock rate from this one (update ahb_clock_freq)
2086
- * TODO: retrieve index in the clocks property where clocks has "xspi-ker"
2087
- * Assuming index is 1
2088
- */
2089
- if (clock_control_get_rate (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2090
- (clock_control_subsys_t ) & dev_cfg -> pclken [1 ],
2091
- & ahb_clock_freq ) < 0 ) {
2092
- LOG_ERR ("Failed call clock_control_get_rate(pclken)" );
2093
- return - EIO ;
2094
- }
2070
+
2071
+ #if DT_CLOCKS_HAS_NAME (STM32_XSPI_NODE , xspi_ker )
2072
+ /* Kernel clock config for peripheral if any */
2073
+ if (clock_control_configure (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2074
+ (clock_control_subsys_t ) & dev_cfg -> pclken_ker ,
2075
+ NULL ) != 0 ) {
2076
+ LOG_ERR ("Could not select XSPI domain clock" );
2077
+ return - EIO ;
2095
2078
}
2079
+
2080
+ if (clock_control_get_rate (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2081
+ (clock_control_subsys_t ) & dev_cfg -> pclken_ker ,
2082
+ & ahb_clock_freq ) < 0 ) {
2083
+ LOG_ERR ("Failed call clock_control_get_rate(pclken_ker)" );
2084
+ return - EIO ;
2085
+ }
2086
+ #endif /* xspi_ker */
2087
+
2088
+ #if DT_CLOCKS_HAS_NAME (STM32_XSPI_NODE , xspi_mgr )
2096
2089
/* Clock domain corresponding to the IO-Mgr (XSPIM) */
2097
- if (IS_ENABLED (STM32_XSPI_DOMAIN_CLOCK_SUPPORT ) && (dev_cfg -> pclk_len > 2 )) {
2098
- if (clock_control_on (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2099
- (clock_control_subsys_t ) & dev_cfg -> pclken [2 ]) != 0 ) {
2100
- LOG_ERR ("Could not enable XSPI Manager clock" );
2101
- return - EIO ;
2102
- }
2103
- /* Do NOT Get the clock rate from this one */
2090
+ if (clock_control_on (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
2091
+ (clock_control_subsys_t ) & dev_cfg -> pclken_mgr ) != 0 ) {
2092
+ LOG_ERR ("Could not enable XSPI Manager clock" );
2093
+ return - EIO ;
2104
2094
}
2095
+ #endif /* xspi_mgr */
2105
2096
2106
2097
for (; prescaler <= STM32_XSPI_CLOCK_PRESCALER_MAX ; prescaler ++ ) {
2107
2098
uint32_t clk = STM32_XSPI_CLOCK_COMPUTE (ahb_clock_freq , prescaler );
@@ -2405,13 +2396,25 @@ static int flash_stm32_xspi_init(const struct device *dev)
2405
2396
2406
2397
static void flash_stm32_xspi_irq_config_func (const struct device * dev );
2407
2398
2408
- static const struct stm32_pclken pclken [] = STM32_DT_CLOCKS (STM32_XSPI_NODE );
2409
-
2410
2399
PINCTRL_DT_DEFINE (STM32_XSPI_NODE );
2411
2400
2412
2401
static const struct flash_stm32_xspi_config flash_stm32_xspi_cfg = {
2413
- .pclken = pclken ,
2414
- .pclk_len = DT_NUM_CLOCKS (STM32_XSPI_NODE ),
2402
+ .pclken = {
2403
+ .bus = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspix , bus ),
2404
+ .enr = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspix , bits )
2405
+ },
2406
+ #if DT_CLOCKS_HAS_NAME (STM32_XSPI_NODE , xspi_ker )
2407
+ .pclken_ker = {
2408
+ .bus = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspi_ker , bus ),
2409
+ .enr = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspi_ker , bits )
2410
+ },
2411
+ #endif /* xspi_ker */
2412
+ #if DT_CLOCKS_HAS_NAME (STM32_XSPI_NODE , xspi_mgr )
2413
+ .pclken_mgr = {
2414
+ .bus = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspi_mgr , bus ),
2415
+ .enr = DT_CLOCKS_CELL_BY_NAME (STM32_XSPI_NODE , xspi_mgr , bits )
2416
+ },
2417
+ #endif /* xspi_mgr */
2415
2418
.irq_config = flash_stm32_xspi_irq_config_func ,
2416
2419
.flash_size = DT_INST_PROP (0 , size ) / 8 , /* In Bytes */
2417
2420
.max_frequency = DT_INST_PROP (0 , ospi_max_frequency ),
0 commit comments