@@ -62,43 +62,69 @@ static uint32_t global_hsfll_get_max_clock_frequency(const struct device *dev)
62
62
return dev_config -> clock_frequencies [ARRAY_SIZE (dev_config -> clock_frequencies ) - 1 ];
63
63
}
64
64
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 )
67
67
{
68
- struct global_hsfll_dev_data * dev_data = dev -> data ;
69
68
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 ;
75
70
76
- if (spec -> accuracy || spec -> precision ) {
71
+ if (req_spec -> accuracy || req_spec -> precision ) {
77
72
LOG_ERR ("invalid specification of accuracy or precision" );
78
- return NULL ;
73
+ return - EINVAL ;
79
74
}
80
75
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 ;
84
79
85
80
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 ) {
87
82
continue ;
88
83
}
89
84
90
- return & dev_data -> clk_cfg . onoff [ i ]. mgr ;
85
+ return i ;
91
86
}
92
87
93
88
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 );
95
121
}
96
122
97
123
static int api_request_global_hsfll (const struct device * dev ,
98
124
const struct nrf_clock_spec * spec ,
99
125
struct onoff_client * cli )
100
126
{
101
- struct onoff_manager * mgr = global_hsfll_find_mgr (dev , spec );
127
+ struct onoff_manager * mgr = global_hsfll_find_mgr_by_spec (dev , spec );
102
128
103
129
if (mgr ) {
104
130
return clock_config_request (mgr , cli );
@@ -110,7 +136,7 @@ static int api_request_global_hsfll(const struct device *dev,
110
136
static int api_release_global_hsfll (const struct device * dev ,
111
137
const struct nrf_clock_spec * spec )
112
138
{
113
- struct onoff_manager * mgr = global_hsfll_find_mgr (dev , spec );
139
+ struct onoff_manager * mgr = global_hsfll_find_mgr_by_spec (dev , spec );
114
140
115
141
if (mgr ) {
116
142
return onoff_release (mgr );
@@ -123,7 +149,7 @@ static int api_cancel_or_release_global_hsfll(const struct device *dev,
123
149
const struct nrf_clock_spec * spec ,
124
150
struct onoff_client * cli )
125
151
{
126
- struct onoff_manager * mgr = global_hsfll_find_mgr (dev , spec );
152
+ struct onoff_manager * mgr = global_hsfll_find_mgr_by_spec (dev , spec );
127
153
128
154
if (mgr ) {
129
155
return onoff_cancel_or_release (mgr , cli );
@@ -132,6 +158,21 @@ static int api_cancel_or_release_global_hsfll(const struct device *dev,
132
158
return - EINVAL ;
133
159
}
134
160
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
+
135
176
static DEVICE_API (nrf_clock_control , driver_api ) = {
136
177
.std_api = {
137
178
.on = api_nosys_on_off ,
@@ -140,6 +181,7 @@ static DEVICE_API(nrf_clock_control, driver_api) = {
140
181
.request = api_request_global_hsfll ,
141
182
.release = api_release_global_hsfll ,
142
183
.cancel_or_release = api_cancel_or_release_global_hsfll ,
184
+ .resolve = api_resolve_global_hsfll ,
143
185
};
144
186
145
187
static enum gdfs_frequency_setting global_hsfll_freq_idx_to_nrfs_freq (const struct device * dev ,
0 commit comments