Skip to content

Commit

Permalink
soc: nordic: nrf54h20: restrict global hsfll freq
Browse files Browse the repository at this point in the history
Introduce feature which restricts the minimum global hsfll
frequency. This feature is selected by default to preserve the
behavior of the global hsfll before the clock control driver for
it was introduced, which configured it as a fixed clock at 320MHz.

Signed-off-by: Bjarki Arge Andreasen <[email protected]>
  • Loading branch information
bjarki-andreasen committed Nov 27, 2024
1 parent 7c19bf4 commit 6b3e913
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 12 deletions.
1 change: 1 addition & 0 deletions soc/nordic/nrf54h/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ if(CONFIG_ARM)
endif()

zephyr_library_sources_ifdef(CONFIG_PM_S2RAM pm_s2ram.c)
zephyr_library_sources_ifdef(CONFIG_SOC_NRF54H20_GLOBAL_HSFLL_RESTRICT_MIN_FREQ global_hsfll.c)

zephyr_include_directories(.)

Expand Down
20 changes: 20 additions & 0 deletions soc/nordic/nrf54h/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,23 @@ config SOC_NRF54H20_CPUFLPR
depends on RISCV_CORE_NORDIC_VPR

rsource "gpd/Kconfig"

config SOC_NRF54H20_GLOBAL_HSFLL_RESTRICT_MIN_FREQ
bool "Restrict minimum global HSFLL clock frequency"
select NRFS
select NRFS_GDFS_SERVICE_ENABLED
select CLOCK_CONTROL
default y if SOC_NRF54H20_CPUAPP

if SOC_NRF54H20_GLOBAL_HSFLL_RESTRICT_MIN_FREQ

config SOC_NRF54H20_GLOBAL_HSFLL_MIN_FREQ_HZ
int "Minimum global HSFLL clock frequency in Hertz"
range 64000000 320000000
default 320000000

config SOC_NRF54H20_GLOBAL_HSFLL_TIMEOUT_MS
int "Global HSFLL timeout in milliseconds"
default 1000

endif # SOC_NRF54H20_RESTRICT_GLOBAL_HSFLL_FREQ
41 changes: 29 additions & 12 deletions soc/nordic/nrf54h/global_hsfll.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,54 @@
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/kernel.h>
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <nrfs_backend_ipc_service.h>

LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);

#define GLOBAL_HSFLL_MIN_FREQ_HZ \
CONFIG_SOC_NRF54H20_GLOBAL_HSFLL_MIN_FREQ_HZ

#define NRFS_BACKEND_TIMEOUT \
K_MSEC(CONFIG_SOC_NRF54H20_GLOBAL_HSFLL_TIMEOUT_MS)

#define GLOBAL_HSFLL_REQUEST_TIMEOUT_MS \
CONFIG_SOC_NRF54H20_GLOBAL_HSFLL_TIMEOUT_MS

static struct onoff_client cli;
static const struct device *global_hsfll = DEVICE_DT_GET(DT_NODELABEL(hsfll120));
static const struct nrf_clock_spec spec = {
.frequency = CONFIG_SOC_NRF54H20_GDFS_MIN_FREQ,
.frequency = GLOBAL_HSFLL_MIN_FREQ_HZ,
};

static int nordicsemi_nrf54h_gdfs_init(void)
static int nordicsemi_nrf54h_global_hsfll_init(void)
{
int ret;
int res;
bool completed;

nrfs_backend_wait_for_connection(NRFS_BACKEND_TIMEOUT);

sys_notify_init_spinwait(&cli.notify);

ret = nrf_clock_control_request(clk_dev, clk_spec, &cli);
ret = nrf_clock_control_request(global_hsfll, &spec, &cli);
if (ret) {
return ret;
}

ret = WAIT_FOR(sys_notify_fetch_result(&cli.notify, &res) == 0,
2000,
k_msleep(1);
);
res = -EIO;
completed = WAIT_FOR(sys_notify_fetch_result(&cli.notify, &res) == 0,
GLOBAL_HSFLL_REQUEST_TIMEOUT_MS,
k_msleep(1));

if (ret) {
return ret;
if (!completed || res) {
LOG_ERR("Failed to restrict global HSFLL frequency");
return -EIO;
}

return res;
return 0;
}

SYS_INIT(nordicsemi_nrf54h_gdfs_init, POST_KERNEL, 99);
SYS_INIT(nordicsemi_nrf54h_global_hsfll_init, POST_KERNEL, 99);

0 comments on commit 6b3e913

Please sign in to comment.