1 /******************************************************************************
2 * @file  clock_update.c
3 *******************************************************************************
4 * # License
5 * <b>Copyright 2024 Silicon Laboratories Inc. www.silabs.com</b>
6 *******************************************************************************
7 *
8 * SPDX-License-Identifier: Zlib
9 *
10 * The licensor of this software is Silicon Laboratories Inc.
11 *
12 * This software is provided 'as-is', without any express or implied
13 * warranty. In no event will the authors be held liable for any damages
14 * arising from the use of this software.
15 *
16 * Permission is granted to anyone to use this software for any purpose,
17 * including commercial applications, and to alter it and redistribute it
18 * freely, subject to the following restrictions:
19 *
20 * 1. The origin of this software must not be misrepresented; you must not
21 *    claim that you wrote the original software. If you use this software
22 *    in a product, an acknowledgment in the product documentation would be
23 *    appreciated but is not required.
24 * 2. Altered source versions must be plainly marked as such, and must not be
25 *    misrepresented as being the original software.
26 * 3. This notice may not be removed or altered from any source distribution.
27 *
28 ******************************************************************************/
29 
30 // Include Files
31 
32 #include "clock_update.h"
33 #include "rsi_pll.h"
34 #include "rsi_power_save.h"
35 #include "rsi_ulpss_clk.h"
36 
37 #ifdef __SYSTICK
38 volatile uint32_t _dwTickCount = 0;
39 
40 /** @addtogroup SOC2
41 * @{
42 */
43 /*==============================================*/
44 /**
45  * @fn         void SysTick_Handler(void)
46  * @brief      Systic handler use for generation delay for XTAL clock enable
47  * @return     None
48  */
SysTick_Handler(void)49 void SysTick_Handler(void)
50 {
51   _dwTickCount++;
52 }
53 
54 /*==============================================*/
55 /**
56  * @fn         uint32_t GetTickCount(void)
57  * @brief      Get tick count.
58  * @return     return the count of tick.
59  */
GetTickCount(void)60 uint32_t GetTickCount(void)
61 {
62   /*gets the tick count from systic ISR */
63   return _dwTickCount;
64 }
65 
66 /*==============================================*/
67 /**
68  * @fn      void rsi_delay_ms(uint32_t val)
69  * @brief   This callback function for generation delay for XTAL clock.
70  * @param[in]   Number of delay in us.
71  * @return  None.
72  */
rsi_delay_ms(uint32_t val)73 void rsi_delay_ms(uint32_t val)
74 {
75   uint32_t start = 0;
76 
77   start = GetTickCount();
78   do {
79   } while (GetTickCount() - start < val);
80 
81   return;
82 }
83 #endif
84 // It will gets the clock of each peripheral
85 
86 /*==============================================*/
87 /**
88  * @fn          uint32_t RSI_CLK_GetBaseClock(PERI_CLKS_T peri_src)
89  * @brief       gets the clock of each peripheral
90  * @param[in]   peri_src
91  * @return      src_clk
92  */
RSI_CLK_GetBaseClock(PERI_CLKS_T peri_src)93 uint32_t RSI_CLK_GetBaseClock(PERI_CLKS_T peri_src)
94 {
95   uint32_t src_clk_mux = 0;
96   uint32_t src_clk     = 0;
97   uint32_t div_fac     = 0;
98   uint32_t swallow_val = 0;
99   uint32_t odd_div     = 0;
100   switch (peri_src) {
101     case M4_USART0:
102       // Read the ULP UART clock mux
103       src_clk_mux = M4CLK->CLK_CONFIG_REG2_b.USART1_SCLK_SEL;
104       switch (src_clk_mux) {
105         case USART_ULPREFCLK:
106           switch (system_clocks.m4_ref_clock_source) {
107             case ULPSS_REF_BYP_CLK:
108               src_clk = system_clocks.byp_rc_ref_clock;
109               break;
110             case ULPSS_ULP_MHZ_RC_CLK:
111               src_clk = system_clocks.rc_mhz_clock;
112               break;
113             case ULPSS_40MHZ_CLK:
114               src_clk = system_clocks.rf_ref_clock;
115               break;
116             case ULPSS_MEMS_REF_CLK:
117               src_clk = system_clocks.rc_mhz_clock;
118               break;
119             case ULPSS_ULP_20MHZ_RINGOSC_CLK:
120               src_clk = system_clocks.ro_20mhz_clock;
121               break;
122             case ULPSS_ULP_DOUBLER_CLK:
123               src_clk = system_clocks.doubler_clock;
124               break;
125             default:
126               break;
127           }
128           break;
129         case USART_MODELPLLCLK2:
130           src_clk = system_clocks.modem_pll_clock2;
131           break;
132         case USART_INTFPLLCLK:
133           src_clk = system_clocks.intf_pll_clock;
134           break;
135         case USART_SOCPLLCLK:
136           src_clk = system_clocks.soc_pll_clock;
137           break;
138         case M4_SOCCLKFOROTHERCLOCKS:
139           src_clk = system_clocks.soc_clock;
140           break;
141         default:
142           break;
143       }
144       div_fac     = M4CLK->CLK_CONFIG_REG2_b.USART1_SCLK_DIV_FAC;
145       swallow_val = M4CLK->CLK_CONFIG_REG2_b.USART1_SCLK_FRAC_SEL;
146       if (swallow_val) {
147         if (div_fac == 0) {
148           break; // Clock is gated
149         } else {
150           src_clk = (uint32_t)(src_clk / (div_fac + 0.5));
151         }
152       } else {
153         if (div_fac == 0) {
154           return src_clk; //divider bypassed
155         } else {
156           src_clk = src_clk / div_fac;
157         }
158       }
159       break;
160 
161     case M4_UART1:
162       src_clk_mux = M4CLK->CLK_CONFIG_REG2_b.USART2_SCLK_SEL;
163       switch (src_clk_mux) {
164         case USART_ULPREFCLK:
165           switch (system_clocks.m4_ref_clock_source) {
166             case ULPSS_REF_BYP_CLK:
167               src_clk = system_clocks.byp_rc_ref_clock;
168               break;
169             case ULPSS_ULP_MHZ_RC_CLK:
170               src_clk = system_clocks.rc_mhz_clock;
171               break;
172             case ULPSS_40MHZ_CLK:
173               src_clk = system_clocks.rf_ref_clock;
174               break;
175             case ULPSS_MEMS_REF_CLK:
176               src_clk = system_clocks.rc_mhz_clock;
177               break;
178             case ULPSS_ULP_20MHZ_RINGOSC_CLK:
179               src_clk = system_clocks.ro_20mhz_clock;
180               break;
181             case ULPSS_ULP_DOUBLER_CLK:
182               src_clk = system_clocks.doubler_clock;
183               break;
184             default:
185               break;
186           }
187           break;
188         case USART_MODELPLLCLK2:
189           src_clk = system_clocks.modem_pll_clock2;
190           break;
191         case USART_INTFPLLCLK:
192           src_clk = system_clocks.intf_pll_clock;
193           break;
194         case USART_SOCPLLCLK:
195           src_clk = system_clocks.soc_pll_clock;
196           break;
197         case M4_SOCCLKFOROTHERCLOCKS:
198           src_clk = system_clocks.soc_clock;
199           break;
200         default:
201           break;
202       }
203       div_fac     = M4CLK->CLK_CONFIG_REG2_b.USART2_SCLK_DIV_FAC;
204       swallow_val = M4CLK->CLK_CONFIG_REG2_b.USART2_SCLK_FRAC_SEL;
205       if (swallow_val) {
206         if (div_fac == 0) {
207           break; // Clock is gated
208         } else {
209           src_clk = (uint32_t)(src_clk / (div_fac + 0.5));
210         }
211       } else {
212         if (div_fac == 0) {
213           return src_clk; //divider bypassed
214         } else {
215           src_clk = src_clk / div_fac;
216         }
217       }
218       break;
219 
220     case M4_SSI_MST:
221       src_clk_mux = M4CLK->CLK_CONFIG_REG1_b.SSI_MST_SCLK_SEL;
222       switch (src_clk_mux) {
223         case SSI_ULPREFCLK:
224           switch (system_clocks.m4_ref_clock_source) {
225             case ULPSS_REF_BYP_CLK:
226               src_clk = system_clocks.byp_rc_ref_clock;
227               break;
228             case ULPSS_ULP_MHZ_RC_CLK:
229               src_clk = system_clocks.rc_mhz_clock;
230               break;
231             case ULPSS_40MHZ_CLK:
232               src_clk = system_clocks.rf_ref_clock;
233               break;
234             case ULPSS_MEMS_REF_CLK:
235               src_clk = system_clocks.rc_mhz_clock;
236               break;
237             case ULPSS_ULP_20MHZ_RINGOSC_CLK:
238               src_clk = system_clocks.ro_20mhz_clock;
239               break;
240             case ULPSS_ULP_DOUBLER_CLK:
241               src_clk = system_clocks.doubler_clock;
242               break;
243             default:
244               break;
245           }
246           break;
247         case SSI_SOCPLLCLK:
248           src_clk = system_clocks.soc_pll_clock;
249           break;
250         case SSI_MODEMPLLCLK1:
251           src_clk = system_clocks.modem_pll_clock;
252           break;
253         case SSI_INTFPLLCLK:
254           src_clk = system_clocks.intf_pll_clock;
255           break;
256         case SSI_MODELPLLCLK2:
257           src_clk = system_clocks.modem_pll_clock2;
258           break;
259         case M4_SOCCLKFOROTHERCLKS:
260           src_clk = system_clocks.soc_clock;
261           break;
262         default:
263           break;
264       }
265       div_fac = (M4CLK->CLK_CONFIG_REG1_b.SSI_MST_SCLK_DIV_FAC);
266       if (div_fac == 0) {
267         return src_clk;
268       } else {
269         src_clk = (src_clk / div_fac);
270       }
271       break;
272 
273     case M4_CT:
274       src_clk_mux = M4CLK->CLK_CONFIG_REG5_b.CT_CLK_SEL;
275       switch (src_clk_mux) {
276         case CT_ULPREFCLK:
277           switch (system_clocks.m4_ref_clock_source) {
278             case ULPSS_REF_BYP_CLK:
279               src_clk = system_clocks.byp_rc_ref_clock;
280               break;
281             case ULPSS_ULP_MHZ_RC_CLK:
282               src_clk = system_clocks.rc_mhz_clock;
283               break;
284             case ULPSS_40MHZ_CLK:
285               src_clk = system_clocks.rf_ref_clock;
286               break;
287             case ULPSS_MEMS_REF_CLK:
288               src_clk = system_clocks.rc_mhz_clock;
289               break;
290             case ULPSS_ULP_20MHZ_RINGOSC_CLK:
291               src_clk = system_clocks.ro_20mhz_clock;
292               break;
293             case ULPSS_ULP_DOUBLER_CLK:
294               src_clk = system_clocks.doubler_clock;
295               break;
296             default:
297               break;
298           }
299           break;
300         case CT_INTFPLLCLK:
301           src_clk = system_clocks.intf_pll_clock;
302           break;
303         case CT_SOCPLLCLK:
304           src_clk = system_clocks.soc_pll_clock;
305           break;
306         case M4_SOCCLKFOROTHERCLKSCT:
307           src_clk = system_clocks.soc_clock;
308           break;
309         default:
310           break;
311       }
312       div_fac = (M4CLK->CLK_CONFIG_REG5_b.CT_CLK_DIV_FAC);
313       if (div_fac == 0) {
314         return src_clk;
315       } else {
316         src_clk = (src_clk / (2 * div_fac));
317       }
318       break;
319 #if !defined(SLI_SI917) && !defined(SLI_SI915)
320     case M4_SD_MEM:
321       src_clk_mux = M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_SEL;
322       switch (src_clk_mux) {
323         case SDMEM_SOCPLLCLK:
324           src_clk = system_clocks.soc_pll_clock;
325           break;
326         case SDMEM_MODEMPLLCLK1:
327           src_clk = system_clocks.modem_pll_clock2;
328           break;
329         case SDMEM_INTFPLLCLK:
330           src_clk = system_clocks.intf_pll_clock;
331           break;
332         case M4_SOCCLKFOROTHERCLKSSDMEM:
333           src_clk = system_clocks.soc_clock;
334           break;
335         default:
336           break;
337       }
338       swallow_val = M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_SWALLOW_SEL;
339       div_fac     = (M4CLK->SD_MEM_CLOCK_REG_b.SD_MEM_INTF_CLK_DIV_FAC);
340       if (swallow_val) {
341         if (div_fac == 0) {
342           return src_clk;
343         } else {
344           src_clk = (src_clk / div_fac);
345         }
346       } else {
347         if (div_fac == 0) {
348           src_clk = (src_clk / 2); //divider bypassed
349         } else {
350           src_clk = (src_clk / (2 * div_fac));
351         }
352       }
353       break;
354 
355     case M4_CCI:
356       src_clk_mux = M4CLK->CLK_CONFIG_REG4_b.CCI_CLK_SEL;
357       switch (src_clk_mux) {
358         case CCI_M4_SOC_CLK_FOR_OTHER_CLKS:
359           src_clk = system_clocks.soc_clock;
360           break;
361         case CCI_INTF_PLL_CLK:
362           src_clk = system_clocks.intf_pll_clock;
363           break;
364         default:
365           break;
366       }
367       div_fac = (M4CLK->CLK_CONFIG_REG2_b.CCI_CLK_DIV_FAC);
368       if (div_fac == 0) {
369         return src_clk;
370       } else {
371         src_clk = (src_clk / (2 * div_fac));
372       }
373       break;
374 #endif
375     case M4_QSPI:
376       src_clk_mux = M4CLK->CLK_CONFIG_REG1_b.QSPI_CLK_SEL;
377       switch (src_clk_mux) {
378         case QSPI_ULPREFCLK:
379           src_clk = system_clocks.rc_mhz_clock;
380           break;
381         case QSPI_MODELPLLCLK2:
382           src_clk = system_clocks.modem_pll_clock2;
383           break;
384         case QSPI_INTFPLLCLK:
385           src_clk = system_clocks.intf_pll_clock;
386           break;
387         case QSPI_SOCPLLCLK:
388           src_clk = system_clocks.soc_pll_clock;
389           break;
390         case M4_SOCCLKNOSWLSYNCCLKTREEGATED:
391           break;
392         default:
393           break;
394       }
395       swallow_val = (M4CLK->CLK_CONFIG_REG1_b.QSPI_CLK_SWALLOW_SEL);
396       div_fac     = (M4CLK->CLK_CONFIG_REG1_b.QSPI_CLK_DIV_FAC);
397       odd_div     = (M4CLK->CLK_CONFIG_REG2_b.QSPI_ODD_DIV_SEL);
398       if (swallow_val) {
399         if (odd_div == 0) {
400           if (div_fac == 0) {
401             return src_clk;
402           } else {
403             src_clk = (src_clk / div_fac);
404           }
405         } else {
406           if ((div_fac % 2 != 0) && (div_fac >= 3)) {
407             src_clk = (src_clk / div_fac);
408           } else {
409             break; //clock gated
410           }
411         }
412       } else {
413         if (odd_div == 0) {
414           if (div_fac == 0) {
415             src_clk = (src_clk / 2);
416           } else {
417             src_clk = (src_clk / (2 * div_fac));
418           }
419         } else {
420           if ((div_fac % 2 != 0) && (div_fac >= 3)) {
421             src_clk = (src_clk / div_fac);
422           } else {
423             break; //clock gated
424           }
425         }
426       }
427       break;
428 
429     case M4_QSPI2:
430       src_clk_mux = M4CLK->CLK_CONFIG_REG6_b.QSPI_2_CLK_SEL;
431       switch (src_clk_mux) {
432         case QSPI_ULPREFCLK:
433           src_clk = system_clocks.rc_mhz_clock;
434           break;
435         case QSPI_MODELPLLCLK2:
436           src_clk = system_clocks.modem_pll_clock2;
437           break;
438         case QSPI_INTFPLLCLK:
439           src_clk = system_clocks.intf_pll_clock;
440           break;
441         case QSPI_SOCPLLCLK:
442           src_clk = system_clocks.soc_pll_clock;
443           break;
444         case M4_SOCCLKNOSWLSYNCCLKTREEGATED:
445           break;
446         default:
447           break;
448       }
449       swallow_val = (M4CLK->CLK_CONFIG_REG1_b.QSPI_CLK_SWALLOW_SEL);
450       div_fac     = (M4CLK->CLK_CONFIG_REG1_b.QSPI_CLK_DIV_FAC);
451       odd_div     = (M4CLK->CLK_CONFIG_REG2_b.QSPI_ODD_DIV_SEL);
452       if (swallow_val) {
453         if (odd_div == 0) {
454           if (div_fac == 0) {
455             return src_clk;
456           } else {
457             src_clk = (src_clk / div_fac);
458           }
459         } else {
460           if ((div_fac % 2 != 0) && (div_fac >= 3)) {
461             src_clk = (src_clk / div_fac);
462           } else {
463             break; //clock gated
464           }
465         }
466       } else {
467         if (odd_div == 0) {
468           if (div_fac == 0) {
469             src_clk = (src_clk / 2);
470           } else {
471             src_clk = (src_clk / (2 * div_fac));
472           }
473         } else {
474           if ((div_fac % 2 != 0) && (div_fac >= 3)) {
475             src_clk = (src_clk / div_fac);
476           } else {
477             break; //clock gated
478           }
479         }
480       }
481       break;
482 
483     case M4_GSPI:
484       src_clk_mux = M4CLK->CLK_CONFIG_REG1_b.GEN_SPI_MST1_SCLK_SEL;
485       switch (src_clk_mux) {
486         case GSPI_M4_SOC_CLK_FOR_OTHER_CLKS:
487           src_clk = system_clocks.soc_clock;
488           break;
489         case GSPI_ULP_REF_CLK:
490           switch (system_clocks.m4_ref_clock_source) {
491             case ULPSS_REF_BYP_CLK:
492               src_clk = system_clocks.byp_rc_ref_clock;
493               break;
494             case ULPSS_ULP_MHZ_RC_CLK:
495               src_clk = system_clocks.rc_mhz_clock;
496               break;
497             case ULPSS_40MHZ_CLK:
498               src_clk = system_clocks.rf_ref_clock;
499               break;
500             case ULPSS_MEMS_REF_CLK:
501               src_clk = system_clocks.rc_mhz_clock;
502               break;
503             case ULPSS_ULP_20MHZ_RINGOSC_CLK:
504               src_clk = system_clocks.ro_20mhz_clock;
505               break;
506             case ULPSS_ULP_DOUBLER_CLK:
507               src_clk = system_clocks.doubler_clock;
508               break;
509             default:
510               break;
511           }
512           break;
513         case GSPI_SOC_PLL_CLK:
514           src_clk = system_clocks.soc_pll_clock;
515           break;
516         case GSPI_MODEM_PLL_CLK2:
517           src_clk = system_clocks.modem_pll_clock2;
518           break;
519         case GSPI_INTF_PLL_CLK:
520           src_clk = system_clocks.intf_pll_clock;
521           break;
522         default:
523           break;
524       }
525       break;
526 
527     case M4_ETHERNET:
528       src_clk_mux = M4CLK->CLK_CONFIG_REG1_b.PLL_INTF_CLK_SEL;
529       switch (src_clk_mux) {
530         case ETH_INTF_PLL_CLK:
531           src_clk = system_clocks.intf_pll_clock;
532           break;
533         case ETH_SOC_PLL_CLK:
534           src_clk = system_clocks.soc_pll_clock;
535           break;
536         default:
537           break;
538       }
539 
540       div_fac     = (M4CLK->CLK_CONFIG_REG1_b.PLL_INTF_CLK_DIV_FAC);
541       swallow_val = (M4CLK->CLK_CONFIG_REG1_b.PLL_INTF_CLK_SWALLOW_SEL);
542       if (swallow_val) {
543         if (div_fac == 0) {
544           return src_clk;
545         } else {
546           src_clk = (src_clk / div_fac);
547         }
548       } else {
549         if (div_fac == 0) {
550           src_clk = (src_clk / 2); //divider bypassed
551         } else {
552           src_clk = (src_clk / (2 * div_fac));
553         }
554       }
555       break;
556 
557     case M4_I2SM:
558       src_clk_mux = M4CLK->CLK_CONFIG_REG5_b.I2S_CLK_SEL;
559       switch (src_clk_mux) {
560         case I2S_PLLCLK:
561           src_clk = system_clocks.i2s_pll_clock;
562           break;
563         case I2S_M4SOCCLKFOROTHERS:
564           src_clk = system_clocks.soc_clock;
565           break;
566         default:
567           break;
568       }
569       div_fac = (M4CLK->CLK_CONFIG_REG5_b.I2S_CLK_DIV_FAC);
570       if (div_fac == 0) {
571         return src_clk;
572       } else {
573         src_clk = (src_clk / (2 * div_fac));
574       }
575       break;
576 
577     case ULPSS_SSI:
578       src_clk_mux = ULPCLK->ULP_I2C_SSI_CLK_GEN_REG_b.ULP_SSI_CLK_SEL;
579       switch (src_clk_mux) {
580         case ULP_SSI_REF_CLK:
581           src_clk = system_clocks.ulpss_ref_clk;
582           break;
583         case ULP_SSI_ULP_32KHZ_RO_CLK:
584           src_clk = system_clocks.ro_32khz_clock;
585           break;
586         case ULP_SSI_ULP_32KHZ_RC_CLK:
587           src_clk = system_clocks.rc_32khz_clock;
588           break;
589         case ULP_SSI_ULP_32KHZ_XTAL_CLK:
590           src_clk = system_clocks.xtal_32khz_clock;
591           break;
592         case ULP_SSI_ULP_MHZ_RC_CLK:
593           src_clk = system_clocks.rc_mhz_clock;
594           break;
595         case ULP_SSI_ULP_20MHZ_RO_CLK:
596           src_clk = system_clocks.ro_20mhz_clock;
597           break;
598         case ULP_SSI_SOC_CLK:
599           src_clk = system_clocks.soc_clock;
600           break;
601         default:
602           break;
603       }
604       div_fac = (ULPCLK->ULP_I2C_SSI_CLK_GEN_REG_b.ULP_SSI_CLK_DIV_FACTOR);
605       if (div_fac == 0) {
606         return src_clk;
607       } else {
608         src_clk = (src_clk / div_fac);
609       }
610       break;
611 
612     case ULPSS_I2S:
613       src_clk_mux = ULPCLK->ULP_I2S_CLK_GEN_REG_b.ULP_I2S_CLK_SEL_b;
614       switch (src_clk_mux) {
615         case ULP_I2S_REF_CLK:
616           src_clk = system_clocks.ulpss_ref_clk;
617           break;
618         case ULP_I2S_ULP_32KHZ_RO_CLK:
619           src_clk = system_clocks.ro_32khz_clock;
620           break;
621         case ULP_I2S_ULP_32KHZ_RC_CLK:
622           src_clk = system_clocks.rc_32khz_clock;
623           break;
624         case ULP_I2S_ULP_32KHZ_XTAL_CLK:
625           src_clk = system_clocks.xtal_32khz_clock;
626           break;
627         case ULP_I2S_ULP_MHZ_RC_CLK:
628           src_clk = system_clocks.rc_mhz_clock;
629           break;
630         case ULP_I2S_ULP_20MHZ_RO_CLK:
631           src_clk = system_clocks.ro_20mhz_clock;
632           break;
633         default:
634           break;
635       }
636       div_fac = (ULPCLK->ULP_I2S_CLK_GEN_REG_b.ULP_I2S_CLKDIV_FACTOR);
637       if (div_fac == 0) {
638         return src_clk;
639       } else {
640         src_clk = (src_clk / (2 * div_fac));
641       }
642       break;
643 
644     case ULPSS_UART:
645       src_clk_mux = ULPCLK->ULP_UART_CLK_GEN_REG_b.ULP_UART_CLK_SEL;
646       switch (src_clk_mux) {
647         case ULP_UART_REF_CLK:
648           src_clk = system_clocks.ulpss_ref_clk;
649           break;
650         case ULP_UART_ULP_32KHZ_RO_CLK:
651           src_clk = system_clocks.ro_32khz_clock;
652           break;
653         case ULP_UART_ULP_32KHZ_RC_CLK:
654           src_clk = system_clocks.rc_32khz_clock;
655           break;
656         case ULP_UART_ULP_32KHZ_XTAL_CLK:
657           src_clk = system_clocks.xtal_32khz_clock;
658           break;
659         case ULP_UART_ULP_MHZ_RC_CLK:
660           src_clk = system_clocks.rc_mhz_clock;
661           break;
662         case ULP_UART_ULP_20MHZ_RO_CLK:
663           src_clk = system_clocks.ro_20mhz_clock;
664           break;
665         case ULP_UART_SOC_CLK:
666           src_clk = system_clocks.soc_clock;
667           break;
668         case ULP_UART_ULP_DOUBLER_CLK:
669           src_clk = system_clocks.doubler_clock;
670           break;
671         default:
672           break;
673       }
674       div_fac = (ULPCLK->ULP_UART_CLK_GEN_REG_b.ULP_UART_CLKDIV_FACTOR);
675       if (div_fac == 0) {
676         return src_clk;
677       } else {
678         src_clk = (src_clk / div_fac);
679       }
680       break;
681 
682     case ULPSS_TIMER:
683       src_clk_mux = ULPCLK->ULP_TIMER_CLK_GEN_REG_b.ULP_TIMER_CLK_SEL;
684       switch (src_clk_mux) {
685         case ULP_TIMER_REF_CLK:
686           src_clk = system_clocks.ulpss_ref_clk;
687           break;
688         case ULP_TIMER_32KHZ_RO_CLK:
689           src_clk = system_clocks.ro_32khz_clock;
690           break;
691         case ULP_TIMER_32KHZ_RC_CLK:
692           src_clk = system_clocks.rc_32khz_clock;
693           break;
694         case ULP_TIMER_32KHZ_XTAL_CLK:
695           src_clk = system_clocks.xtal_32khz_clock;
696           break;
697         case ULP_TIMER_MHZ_RC_CLK:
698           src_clk = system_clocks.rc_mhz_clock;
699           break;
700         case ULP_TIMER_20MHZ_RO_CLK:
701           src_clk = system_clocks.ro_20mhz_clock;
702           break;
703         case ULP_TIMER_ULP_SOC_CLK:
704           src_clk = system_clocks.soc_clock;
705           break;
706         default:
707           break;
708       }
709       //no division factor
710       break;
711 
712     case ULPSS_AUX:
713       src_clk_mux = ULPCLK->ULP_AUXADC_CLK_GEN_REG_b.ULP_AUX_CLK_SEL;
714       switch (src_clk_mux) {
715         case ULP_AUX_REF_CLK:
716           src_clk = system_clocks.ulpss_ref_clk;
717           break;
718         case ULP_AUX_32KHZ_RO_CLK:
719           src_clk = system_clocks.ro_32khz_clock;
720           break;
721         case ULP_AUX_32KHZ_RC_CLK:
722           src_clk = system_clocks.rc_32khz_clock;
723           break;
724         case ULP_AUX_32KHZ_XTAL_CLK:
725           src_clk = system_clocks.xtal_32khz_clock;
726           break;
727         case ULP_AUX_MHZ_RC_CLK:
728           src_clk = system_clocks.rc_mhz_clock;
729           break;
730         case ULP_AUX_20MHZ_RO_CLK:
731           src_clk = system_clocks.ro_20mhz_clock;
732           break;
733         case ULP_AUX_ULP_SOC_CLK:
734           src_clk = system_clocks.soc_clock;
735           break;
736         case ULP_AUX_ULP_DOUBLER_CLK:
737           src_clk = system_clocks.doubler_clock;
738           break;
739         case ULP_AUX_I2S_PLL_CLK:
740           src_clk = system_clocks.i2s_pll_clock;
741           break;
742         default:
743           break;
744       }
745       //no division factor
746       break;
747 
748     case ULPSS_TOUCH:
749       src_clk_mux = ULPCLK->ULP_TOUCH_CLK_GEN_REG_b.ULP_TOUCH_CLK_SEL;
750       switch (src_clk_mux) {
751         case ULP_TOUCH_REF_CLK:
752           src_clk = system_clocks.ulpss_ref_clk;
753           break;
754         case ULP_TOUCH_32KHZ_RO_CLK:
755           src_clk = system_clocks.ro_32khz_clock;
756           break;
757         case ULP_TOUCH_32KHZ_RC_CLK:
758           src_clk = system_clocks.rc_32khz_clock;
759           break;
760         case ULP_TOUCH_32KHZ_XTAL_CLK:
761           src_clk = system_clocks.xtal_32khz_clock;
762           break;
763         case ULP_TOUCH_MHZ_RC_CLK:
764           src_clk = system_clocks.rc_mhz_clock;
765           break;
766         case ULP_TOUCH_20MHZ_RO_CLK:
767           src_clk = system_clocks.ro_20mhz_clock;
768           break;
769         case ULP_TOUCH_ULP_SOC_CLK:
770           src_clk = system_clocks.soc_clock;
771           break;
772         default:
773           break;
774       }
775       div_fac = (ULPCLK->ULP_TOUCH_CLK_GEN_REG_b.ULP_TOUCH_CLKDIV_FACTOR);
776       if (div_fac == 0) {
777         return src_clk;
778       } else {
779         src_clk = (src_clk / div_fac);
780       }
781       break;
782   }
783   return src_clk;
784 }
785 /** @} */
786