drivers: clock_control: stm32: clock_control_on

Make clock_control_on for STM32 behave the same as the HAL,
delaying after enabling peripheral clocks. Otherwise it may return
before the clock is actually enabled, causing subsequent writes to
peripheral registers to be silently ignored.

Signed-off-by: Kevin ORourke <kevin.orourke@ferroamp.se>
This commit is contained in:
Kevin ORourke 2024-03-21 09:09:24 +01:00 committed by Alberto Escolar
parent a02da6f2dd
commit 9bf0a24f2e
5 changed files with 25 additions and 0 deletions

View file

@ -200,6 +200,7 @@ static inline int stm32_clock_control_on(const struct device *dev,
clock_control_subsys_t sub_system)
{
struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system);
volatile int temp;
ARG_UNUSED(dev);
@ -210,6 +211,11 @@ static inline int stm32_clock_control_on(const struct device *dev,
sys_set_bits(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus,
pclken->enr);
/* Delay after enabling the clock, to allow it to become active.
* See (for example) RM0440 7.2.17
*/
temp = sys_read32(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus);
UNUSED(temp);
return 0;
}

View file

@ -145,6 +145,7 @@ static inline int stm32_clock_control_on(const struct device *dev,
clock_control_subsys_t sub_system)
{
struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system);
volatile int temp;
ARG_UNUSED(dev);
@ -155,6 +156,9 @@ static inline int stm32_clock_control_on(const struct device *dev,
sys_set_bits(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus,
pclken->enr);
/* Delay after enabling the clock, to allow it to become active */
temp = sys_read32(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus);
UNUSED(temp);
return 0;
}

View file

@ -360,6 +360,7 @@ static inline int stm32_clock_control_on(const struct device *dev,
clock_control_subsys_t sub_system)
{
struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system);
volatile int temp;
ARG_UNUSED(dev);
@ -371,6 +372,11 @@ static inline int stm32_clock_control_on(const struct device *dev,
z_stm32_hsem_lock(CFG_HW_RCC_SEMID, HSEM_LOCK_DEFAULT_RETRY);
sys_set_bits(STM32H7_BUS_CLK_REG + pclken->bus, pclken->enr);
/* Delay after enabling the clock, to allow it to become active.
* See RM0433 8.5.10 "Clock enabling delays"
*/
temp = sys_read32(STM32H7_BUS_CLK_REG + pclken->bus);
UNUSED(temp);
z_stm32_hsem_unlock(CFG_HW_RCC_SEMID);

View file

@ -149,6 +149,7 @@ static inline int stm32_clock_control_on(const struct device *dev,
clock_control_subsys_t sub_system)
{
struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system);
volatile int temp;
ARG_UNUSED(dev);
@ -159,6 +160,9 @@ static inline int stm32_clock_control_on(const struct device *dev,
sys_set_bits(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus,
pclken->enr);
/* Delay after enabling the clock, to allow it to become active */
temp = sys_read32(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus);
UNUSED(temp);
return 0;
}

View file

@ -62,6 +62,7 @@ static inline int stm32_clock_control_on(const struct device *dev,
clock_control_subsys_t sub_system)
{
struct stm32_pclken *pclken = (struct stm32_pclken *)(sub_system);
volatile int temp;
ARG_UNUSED(dev);
@ -72,6 +73,10 @@ static inline int stm32_clock_control_on(const struct device *dev,
sys_set_bits(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus,
pclken->enr);
/* Delay after enabling the clock, to allow it to become active */
temp = sys_read32(DT_REG_ADDR(DT_NODELABEL(rcc)) + pclken->bus);
UNUSED(temp);
return 0;
}