Skip to content

Commit 077ff2b

Browse files
bjarki-andreasenkartben
authored andcommitted
drivers: clock_control: nrf2_global_hsfll: impl resolve
Implement nrf_clock_control_resolve() API. Signed-off-by: Bjarki Arge Andreasen <[email protected]>
1 parent c950c56 commit 077ff2b

File tree

1 file changed

+61
-19
lines changed

1 file changed

+61
-19
lines changed

drivers/clock_control/clock_control_nrf2_global_hsfll.c

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,43 +62,69 @@ static uint32_t global_hsfll_get_max_clock_frequency(const struct device *dev)
6262
return dev_config->clock_frequencies[ARRAY_SIZE(dev_config->clock_frequencies) - 1];
6363
}
6464

65-
static struct onoff_manager *global_hsfll_find_mgr(const struct device *dev,
66-
const struct nrf_clock_spec *spec)
65+
static int global_hsfll_resolve_spec_to_idx(const struct device *dev,
66+
const struct nrf_clock_spec *req_spec)
6767
{
68-
struct global_hsfll_dev_data *dev_data = dev->data;
6968
const struct global_hsfll_dev_config *dev_config = dev->config;
70-
uint32_t frequency;
71-
72-
if (!spec) {
73-
return &dev_data->clk_cfg.onoff[0].mgr;
74-
}
69+
uint32_t req_frequency;
7570

76-
if (spec->accuracy || spec->precision) {
71+
if (req_spec->accuracy || req_spec->precision) {
7772
LOG_ERR("invalid specification of accuracy or precision");
78-
return NULL;
73+
return -EINVAL;
7974
}
8075

81-
frequency = spec->frequency == NRF_CLOCK_CONTROL_FREQUENCY_MAX
82-
? global_hsfll_get_max_clock_frequency(dev)
83-
: spec->frequency;
76+
req_frequency = req_spec->frequency == NRF_CLOCK_CONTROL_FREQUENCY_MAX
77+
? global_hsfll_get_max_clock_frequency(dev)
78+
: req_spec->frequency;
8479

8580
for (uint8_t i = 0; i < ARRAY_SIZE(dev_config->clock_frequencies); i++) {
86-
if (dev_config->clock_frequencies[i] < frequency) {
81+
if (dev_config->clock_frequencies[i] < req_frequency) {
8782
continue;
8883
}
8984

90-
return &dev_data->clk_cfg.onoff[i].mgr;
85+
return i;
9186
}
9287

9388
LOG_ERR("invalid frequency");
94-
return NULL;
89+
return -EINVAL;
90+
}
91+
92+
static void global_hsfll_get_spec_by_idx(const struct device *dev,
93+
uint8_t idx,
94+
struct nrf_clock_spec *spec)
95+
{
96+
const struct global_hsfll_dev_config *dev_config = dev->config;
97+
98+
spec->frequency = dev_config->clock_frequencies[idx];
99+
spec->accuracy = 0;
100+
spec->precision = 0;
101+
}
102+
103+
static struct onoff_manager *global_hsfll_get_mgr_by_idx(const struct device *dev, uint8_t idx)
104+
{
105+
struct global_hsfll_dev_data *dev_data = dev->data;
106+
107+
return &dev_data->clk_cfg.onoff[idx].mgr;
108+
}
109+
110+
static struct onoff_manager *global_hsfll_find_mgr_by_spec(const struct device *dev,
111+
const struct nrf_clock_spec *spec)
112+
{
113+
int idx;
114+
115+
if (!spec) {
116+
return global_hsfll_get_mgr_by_idx(dev, 0);
117+
}
118+
119+
idx = global_hsfll_resolve_spec_to_idx(dev, spec);
120+
return idx < 0 ? NULL : global_hsfll_get_mgr_by_idx(dev, idx);
95121
}
96122

97123
static int api_request_global_hsfll(const struct device *dev,
98124
const struct nrf_clock_spec *spec,
99125
struct onoff_client *cli)
100126
{
101-
struct onoff_manager *mgr = global_hsfll_find_mgr(dev, spec);
127+
struct onoff_manager *mgr = global_hsfll_find_mgr_by_spec(dev, spec);
102128

103129
if (mgr) {
104130
return clock_config_request(mgr, cli);
@@ -110,7 +136,7 @@ static int api_request_global_hsfll(const struct device *dev,
110136
static int api_release_global_hsfll(const struct device *dev,
111137
const struct nrf_clock_spec *spec)
112138
{
113-
struct onoff_manager *mgr = global_hsfll_find_mgr(dev, spec);
139+
struct onoff_manager *mgr = global_hsfll_find_mgr_by_spec(dev, spec);
114140

115141
if (mgr) {
116142
return onoff_release(mgr);
@@ -123,7 +149,7 @@ static int api_cancel_or_release_global_hsfll(const struct device *dev,
123149
const struct nrf_clock_spec *spec,
124150
struct onoff_client *cli)
125151
{
126-
struct onoff_manager *mgr = global_hsfll_find_mgr(dev, spec);
152+
struct onoff_manager *mgr = global_hsfll_find_mgr_by_spec(dev, spec);
127153

128154
if (mgr) {
129155
return onoff_cancel_or_release(mgr, cli);
@@ -132,6 +158,21 @@ static int api_cancel_or_release_global_hsfll(const struct device *dev,
132158
return -EINVAL;
133159
}
134160

161+
static int api_resolve_global_hsfll(const struct device *dev,
162+
const struct nrf_clock_spec *req_spec,
163+
struct nrf_clock_spec *res_spec)
164+
{
165+
int idx;
166+
167+
idx = global_hsfll_resolve_spec_to_idx(dev, req_spec);
168+
if (idx < 0) {
169+
return -EINVAL;
170+
}
171+
172+
global_hsfll_get_spec_by_idx(dev, idx, res_spec);
173+
return 0;
174+
}
175+
135176
static DEVICE_API(nrf_clock_control, driver_api) = {
136177
.std_api = {
137178
.on = api_nosys_on_off,
@@ -140,6 +181,7 @@ static DEVICE_API(nrf_clock_control, driver_api) = {
140181
.request = api_request_global_hsfll,
141182
.release = api_release_global_hsfll,
142183
.cancel_or_release = api_cancel_or_release_global_hsfll,
184+
.resolve = api_resolve_global_hsfll,
143185
};
144186

145187
static enum gdfs_frequency_setting global_hsfll_freq_idx_to_nrfs_freq(const struct device *dev,

0 commit comments

Comments
 (0)