@@ -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
97123static 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,
110136static 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+
135176static 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
145187static enum gdfs_frequency_setting global_hsfll_freq_idx_to_nrfs_freq (const struct device * dev ,
0 commit comments