@@ -100,35 +100,56 @@ static void hsfll_work_handler(struct k_work *work)
100
100
k_timer_start (& dev_data -> timer , NRFS_DVFS_TIMEOUT , K_NO_WAIT );
101
101
}
102
102
103
- static struct onoff_manager * hsfll_find_mgr (const struct device * dev ,
104
- const struct nrf_clock_spec * spec )
103
+ static int hsfll_resolve_spec_to_idx (const struct nrf_clock_spec * req_spec )
105
104
{
106
- struct hsfll_dev_data * dev_data = dev -> data ;
107
- uint32_t frequency ;
108
-
109
- if (!spec ) {
110
- return & dev_data -> clk_cfg .onoff [0 ].mgr ;
111
- }
105
+ uint32_t req_frequency ;
112
106
113
- if (spec -> accuracy || spec -> precision ) {
107
+ if (req_spec -> accuracy || req_spec -> precision ) {
114
108
LOG_ERR ("invalid specification of accuracy or precision" );
115
- return NULL ;
109
+ return - EINVAL ;
116
110
}
117
111
118
- frequency = spec -> frequency == NRF_CLOCK_CONTROL_FREQUENCY_MAX
119
- ? HSFLL_FREQ_HIGH
120
- : spec -> frequency ;
112
+ req_frequency = req_spec -> frequency == NRF_CLOCK_CONTROL_FREQUENCY_MAX
113
+ ? HSFLL_FREQ_HIGH
114
+ : req_spec -> frequency ;
121
115
122
116
for (int i = 0 ; i < ARRAY_SIZE (clock_options ); ++ i ) {
123
- if (frequency > clock_options [i ].frequency ) {
117
+ if (req_frequency > clock_options [i ].frequency ) {
124
118
continue ;
125
119
}
126
120
127
- return & dev_data -> clk_cfg . onoff [ i ]. mgr ;
121
+ return i ;
128
122
}
129
123
130
124
LOG_ERR ("invalid frequency" );
131
- return NULL ;
125
+ return - EINVAL ;
126
+ }
127
+
128
+ static void hsfll_get_spec_by_idx (uint8_t idx , struct nrf_clock_spec * spec )
129
+ {
130
+ spec -> frequency = clock_options [idx ].frequency ;
131
+ spec -> accuracy = 0 ;
132
+ spec -> precision = 0 ;
133
+ }
134
+
135
+ static struct onoff_manager * hsfll_get_mgr_by_idx (const struct device * dev , uint8_t idx )
136
+ {
137
+ struct hsfll_dev_data * dev_data = dev -> data ;
138
+
139
+ return & dev_data -> clk_cfg .onoff [idx ].mgr ;
140
+ }
141
+
142
+ static struct onoff_manager * hsfll_find_mgr_by_spec (const struct device * dev ,
143
+ const struct nrf_clock_spec * spec )
144
+ {
145
+ int idx ;
146
+
147
+ if (!spec ) {
148
+ return hsfll_get_mgr_by_idx (dev , 0 );
149
+ }
150
+
151
+ idx = hsfll_resolve_spec_to_idx (spec );
152
+ return idx < 0 ? NULL : hsfll_get_mgr_by_idx (dev , idx );
132
153
}
133
154
#endif /* CONFIG_NRFS_DVFS_LOCAL_DOMAIN */
134
155
@@ -137,7 +158,7 @@ static int api_request_hsfll(const struct device *dev,
137
158
struct onoff_client * cli )
138
159
{
139
160
#ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
140
- struct onoff_manager * mgr = hsfll_find_mgr (dev , spec );
161
+ struct onoff_manager * mgr = hsfll_find_mgr_by_spec (dev , spec );
141
162
142
163
if (mgr ) {
143
164
return clock_config_request (mgr , cli );
@@ -153,7 +174,7 @@ static int api_release_hsfll(const struct device *dev,
153
174
const struct nrf_clock_spec * spec )
154
175
{
155
176
#ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
156
- struct onoff_manager * mgr = hsfll_find_mgr (dev , spec );
177
+ struct onoff_manager * mgr = hsfll_find_mgr_by_spec (dev , spec );
157
178
158
179
if (mgr ) {
159
180
return onoff_release (mgr );
@@ -170,7 +191,7 @@ static int api_cancel_or_release_hsfll(const struct device *dev,
170
191
struct onoff_client * cli )
171
192
{
172
193
#ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
173
- struct onoff_manager * mgr = hsfll_find_mgr (dev , spec );
194
+ struct onoff_manager * mgr = hsfll_find_mgr_by_spec (dev , spec );
174
195
175
196
if (mgr ) {
176
197
return onoff_cancel_or_release (mgr , cli );
@@ -182,6 +203,25 @@ static int api_cancel_or_release_hsfll(const struct device *dev,
182
203
#endif
183
204
}
184
205
206
+ static int api_resolve_hsfll (const struct device * dev ,
207
+ const struct nrf_clock_spec * req_spec ,
208
+ struct nrf_clock_spec * res_spec )
209
+ {
210
+ #ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
211
+ int idx ;
212
+
213
+ idx = hsfll_resolve_spec_to_idx (req_spec );
214
+ if (idx < 0 ) {
215
+ return - EINVAL ;
216
+ }
217
+
218
+ hsfll_get_spec_by_idx (idx , res_spec );
219
+ return 0 ;
220
+ #else
221
+ return - ENOTSUP ;
222
+ #endif
223
+ }
224
+
185
225
static int hsfll_init (const struct device * dev )
186
226
{
187
227
#ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
@@ -212,6 +252,7 @@ static DEVICE_API(nrf_clock_control, hsfll_drv_api) = {
212
252
.request = api_request_hsfll ,
213
253
.release = api_release_hsfll ,
214
254
.cancel_or_release = api_cancel_or_release_hsfll ,
255
+ .resolve = api_resolve_hsfll ,
215
256
};
216
257
217
258
#ifdef CONFIG_NRFS_DVFS_LOCAL_DOMAIN
0 commit comments