From 29c2aa329489eca44490a6445ef591d6c661b74e Mon Sep 17 00:00:00 2001 From: Vincent Palatin Date: Fri, 2 Mar 2018 08:55:51 +0100 Subject: [PATCH] stm32h7: enable the fast PLL on-demand Add a new module ID 'MODULE_FAST_CPU'. When it is enabled with clock_enable_module(MODULE_FAST_CPU, 1), switch the system clocking to the fast 400-Mhz PLL. For now, I consider that a single task/user is calling clock_enable_module(MODULE_FAST_CPU, x), so we don't need to count users (in a complicated atomic fashion). It's good enough for the current use-case and we can add the complexity later if we have a real need. BRANCH=none BUG=b:67081508 TEST=on ZerbleBarn, with follow-up CL setting clock_enable_module(MODULE_FAST_CPU,x) around the computation block, see that computations are fast and the clock goes back to HSI after. Change-Id: I2aef3ad673ddbffd6fc64c591c54297e94896fa6 Signed-off-by: Vincent Palatin Reviewed-on: https://chromium-review.googlesource.com/945688 Reviewed-by: Randall Spangler Reviewed-by: Nicolas Boichat --- chip/stm32/clock-stm32h7.c | 26 +++----------------------- include/module_id.h | 21 +++++++++++---------- 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/chip/stm32/clock-stm32h7.c b/chip/stm32/clock-stm32h7.c index edbbb6ea32..f0fcdf8f37 100644 --- a/chip/stm32/clock-stm32h7.c +++ b/chip/stm32/clock-stm32h7.c @@ -180,25 +180,9 @@ static void clock_set_osc(enum clock_osc osc) void clock_enable_module(enum module_id module, int enable) { - static uint32_t clock_mask; - int new_mask; - - if (enable) - new_mask = clock_mask | (1 << module); - else - new_mask = clock_mask & ~(1 << module); - - /* Only change clock if needed */ - if ((!!new_mask) != (!!clock_mask)) { - - /* Flush UART before switching clock speed */ - cflush(); -#if 0 /* Power management policy: TODO(b/67081508) not implemented for now */ - clock_set_osc(new_mask ? OSC_PLL : OSC_CSI); -#endif - } - - clock_mask = new_mask; + /* Assume we have a single task using MODULE_FAST_CPU */ + if (module == MODULE_FAST_CPU) + clock_set_osc(enable ? OSC_PLL : OSC_HSI); } void clock_init(void) @@ -224,10 +208,6 @@ void clock_init(void) /* Use more optimized flash latency settings for ACLK = HSI = 64 Mhz */ clock_flash_latency(FLASH_ACLK_64MHZ); - -#if 0 /* Keep default for now: HSI at 64 Mhz */ - clock_set_osc(OSC_PLL); -#endif } static int command_clock(int argc, char **argv) diff --git a/include/module_id.h b/include/module_id.h index aac2cb6186..e1e5a1d441 100644 --- a/include/module_id.h +++ b/include/module_id.h @@ -11,46 +11,47 @@ #include "common.h" enum module_id { - MODULE_ADC, /* 0 */ + MODULE_ADC, MODULE_CHARGER, MODULE_CHIPSET, MODULE_CLOCK, MODULE_COMMAND, - MODULE_DMA, /* 5 */ + MODULE_DMA, MODULE_EXTPOWER, + MODULE_FAST_CPU, MODULE_GPIO, MODULE_HOOK, MODULE_HOST_COMMAND, - MODULE_HOST_EVENT, /* 10 */ + MODULE_HOST_EVENT, MODULE_I2C, MODULE_KEYBOARD, MODULE_KEYBOARD_SCAN, MODULE_LIGHTBAR, - MODULE_LPC, /* 15 */ + MODULE_LPC, + MODULE_MCO, MODULE_PECI, MODULE_PMU, MODULE_PORT80, MODULE_POWER_LED, - MODULE_PWM, /* 20 */ + MODULE_PWM, MODULE_RDD, MODULE_RBOX, MODULE_SPI, MODULE_SPI_FLASH, - MODULE_SPI_MASTER, /* 25 */ + MODULE_SPI_MASTER, MODULE_SWITCH, MODULE_SYSTEM, MODULE_TASK, + MODULE_TFDP, MODULE_THERMAL, - MODULE_UART, /* 30 */ + MODULE_UART, MODULE_USART, MODULE_USB, MODULE_USB_DEBUG, MODULE_USB_PD, - MODULE_USB_PORT_POWER, /* 35 */ + MODULE_USB_PORT_POWER, MODULE_USB_SWITCH, MODULE_VBOOT, - MODULE_MCO, - MODULE_TFDP, MODULE_WOV, /* Module count; not an actual module */