Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modules: hal_nordic: use CLOCK_CONTROL_NRF2 for HFCLK request/release… #83698

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@

#include <compiler_abstraction.h>
#include <zephyr/kernel.h>
#if defined(CONFIG_CLOCK_CONTROL_NRF)
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
Copy link
Member

@anangl anangl Jan 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nrf_clock_control.h is all you actually need to include here. You could get rid of these conditional directives.

#include <zephyr/drivers/clock_control.h>
#elif !defined(NRF54H_SERIES)
#error No implementation to start or stop HFCLK due to missing clock_control.
#endif

static bool hfclk_is_running;

Expand All @@ -35,7 +30,6 @@ bool nrf_802154_clock_hfclk_is_running(void)
return hfclk_is_running;
}

#if defined(CONFIG_CLOCK_CONTROL_NRF)

static struct onoff_client hfclk_cli;

Expand All @@ -48,6 +42,7 @@ static void hfclk_on_callback(struct onoff_manager *mgr,
nrf_802154_clock_hfclk_ready();
}

#if defined(CONFIG_CLOCK_CONTROL_NRF)
void nrf_802154_clock_hfclk_start(void)
{
int ret;
Expand Down Expand Up @@ -75,40 +70,22 @@ void nrf_802154_clock_hfclk_stop(void)
hfclk_is_running = false;
}

#elif defined(NRF54H_SERIES)

#define NRF_LRCCONF_RADIO_PD NRF_LRCCONF010
/* HF clock time to ramp-up. */
#define MAX_HFXO_RAMP_UP_TIME_US 550

static void hfclk_started_timer_handler(struct k_timer *dummy)
{
hfclk_is_running = true;
nrf_802154_clock_hfclk_ready();
}

K_TIMER_DEFINE(hfclk_started_timer, hfclk_started_timer_handler, NULL);
#elif defined(CONFIG_CLOCK_CONTROL_NRF2)

void nrf_802154_clock_hfclk_start(void)
{
/* Use register directly, there is no support for that task in nrf_lrcconf_task_trigger.
* This code might cause troubles if there are other HFXO users in this CPU.
*/
NRF_LRCCONF_RADIO_PD->EVENTS_HFXOSTARTED = 0x0;
NRF_LRCCONF_RADIO_PD->TASKS_REQHFXO = 0x1;
sys_notify_init_callback(&hfclk_cli.notify, hfclk_on_callback);
ankuns marked this conversation as resolved.
Show resolved Hide resolved
int ret = nrf_clock_control_request(DEVICE_DT_GET(DT_NODELABEL(hfxo)), NULL, &hfclk_cli);

k_timer_start(&hfclk_started_timer, K_USEC(MAX_HFXO_RAMP_UP_TIME_US), K_NO_WAIT);
__ASSERT_NO_MSG(ret >= 0);
}

void nrf_802154_clock_hfclk_stop(void)
{
/* Use register directly, there is no support for that task in nrf_lrcconf_task_trigger.
* This code might cause troubles if there are other HFXO users in this CPU.
*/
NRF_LRCCONF_RADIO_PD->TASKS_STOPREQHFXO = 0x1;
NRF_LRCCONF_RADIO_PD->EVENTS_HFXOSTARTED = 0x0;
int ret = nrf_clock_control_cancel_or_release(DEVICE_DT_GET(DT_NODELABEL(hfxo)),
NULL, &hfclk_cli);

hfclk_is_running = false;
__ASSERT_NO_MSG(ret >= 0);
}

#endif
Loading