Skip to content

Commit f35cddd

Browse files
adamkondraciuknordicjm
authored andcommitted
tests: drivers: grtc: Add clock control
Add clock resquest and release to GRTC clockout tests. Signed-off-by: Adam Kondraciuk <[email protected]>
1 parent 4651703 commit f35cddd

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
CONFIG_ZTEST=y
22
CONFIG_SPEED_OPTIMIZATIONS=y
3+
CONFIG_CLOCK_CONTROL=y

tests/drivers/grtc/grtc_clk_output/src/main.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <zephyr/kernel.h>
88
#include <zephyr/ztest.h>
99
#include <zephyr/drivers/gpio.h>
10+
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
1011

1112

1213
static volatile uint32_t count_clk;
@@ -15,6 +16,61 @@ static struct gpio_callback clk_cb_data;
1516
static const struct gpio_dt_spec gpio_clk_spec =
1617
GPIO_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), gpios, 0);
1718

19+
#define GRTC_NODE DT_NODELABEL(grtc)
20+
#if DT_NODE_HAS_PROP(GRTC_NODE, clkout_fast_frequency_hz)
21+
static struct onoff_client clk_cli;
22+
static volatile bool clock_requested;
23+
24+
/* Callback for clock request. */
25+
static void clock_started_callback(struct onoff_manager *mgr,
26+
struct onoff_client *cli,
27+
uint32_t state,
28+
int res)
29+
{
30+
(void)mgr;
31+
(void)cli;
32+
(void)state;
33+
(void)res;
34+
35+
clock_requested = true;
36+
}
37+
#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(fll16m))
38+
#define NODE_HFCLK DT_NODELABEL(fll16m)
39+
#define HFCLK_FREQUENCY DT_PROP_OR(NODE_HFCLK, frequency, 0)
40+
41+
static const struct device *fll16m = DEVICE_DT_GET(NODE_HFCLK);
42+
static const struct nrf_clock_spec hfclk_spec = {
43+
.frequency = HFCLK_FREQUENCY,
44+
};
45+
#elif defined(CONFIG_SOC_SERIES_NRF54LX)
46+
static struct onoff_manager *clk_mgr;
47+
#endif
48+
49+
static int hf_clock_request(void)
50+
{
51+
sys_notify_init_callback(&clk_cli.notify, clock_started_callback);
52+
#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(fll16m))
53+
return nrf_clock_control_request(fll16m, &hfclk_spec, &clk_cli);
54+
#elif defined(CONFIG_SOC_SERIES_NRF54LX)
55+
clock_control_subsys_t subsys = CLOCK_CONTROL_NRF_SUBSYS_HF;
56+
57+
clk_mgr = z_nrf_clock_control_get_onoff(subsys);
58+
return onoff_request(clk_mgr, &clk_cli);
59+
#endif
60+
return -ENOTSUP;
61+
}
62+
63+
static int hf_clock_release(void)
64+
{
65+
#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(fll16m))
66+
return nrf_clock_control_release(fll16m, &hfclk_spec);
67+
#elif defined(CONFIG_SOC_SERIES_NRF54LX)
68+
return onoff_release(clk_mgr);
69+
#endif
70+
return -ENOTSUP;
71+
}
72+
#endif /* DT_NODE_HAS_PROP(GRTC_NODE, clkout_fast_frequency_hz) */
73+
1874
/* ISR that counts rising edges on the CLK signal. */
1975
static void gpio_clk_isr(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
2076
{
@@ -37,10 +93,23 @@ ZTEST(drivers_grtc_clk_out, test_grtc_clk_output)
3793
TC_PRINT("Frequency = %u\n", CONFIG_TEST_GRTC_FREQUENCY);
3894
TC_PRINT("Tolerance = %u clock edges\n", CONFIG_TEST_GRTC_TOLERANCE);
3995

96+
#if DT_NODE_HAS_PROP(GRTC_NODE, clkout_fast_frequency_hz)
97+
int ret = hf_clock_request();
98+
99+
zassert_true(ret >= 0, "Failed to request clock.");
100+
k_msleep(20);
101+
zassert_true(clock_requested == true, "Failed to request clock.");
102+
#endif
103+
40104
count_clk = 0;
41105
k_msleep(1000);
42106
temp = count_clk;
43107

108+
#if DT_NODE_HAS_PROP(GRTC_NODE, clkout_fast_frequency_hz)
109+
ret = hf_clock_release();
110+
zassert_true(ret >= 0, "Failed to release clock.");
111+
#endif
112+
44113
/* Verify number of edges on CLK (with some tolerance) */
45114
zassert_true(temp >= min,
46115
"CLK has %u rising edges, while at least %u is expected.",

0 commit comments

Comments
 (0)