1 /******************************************************************************
\r
3 * Copyright 2013 Altera Corporation. All Rights Reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions are met:
\r
8 * 1. Redistributions of source code must retain the above copyright notice,
\r
9 * this list of conditions and the following disclaimer.
\r
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
\r
12 * this list of conditions and the following disclaimer in the documentation
\r
13 * and/or other materials provided with the distribution.
\r
15 * 3. The name of the author may not be used to endorse or promote products
\r
16 * derived from this software without specific prior written permission.
\r
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR
\r
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\r
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO
\r
21 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
\r
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
\r
23 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
\r
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
\r
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
\r
26 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
\r
29 ******************************************************************************/
\r
33 #include <stdbool.h>
\r
36 #include "socal/hps.h"
\r
37 #include "socal/socal.h"
\r
38 #include "socal/alt_sysmgr.h"
\r
40 #include "alt_clock_manager.h"
\r
41 #include "alt_mpu_registers.h"
\r
43 #define UINT12_MAX (4096)
\r
45 #define printf( ... )
\r
47 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
48 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Useful Structures ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
49 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
52 /* General structure used to hold parameters of various clock entities, */
\r
53 typedef struct ALT_CLK_PARAMS_s
\r
55 alt_freq_t freqcur; // current frequency of the clock
\r
56 alt_freq_t freqmin; // minimum allowed frequency for this clock
\r
57 alt_freq_t freqmax; // maximum allowed frequency for this clock
\r
58 uint32_t guardband : 7; // guardband percentage (0-100) if this clock
\r
59 // is a PLL, ignored otherwise
\r
60 uint32_t active : 1; // current state of activity of this clock
\r
64 typedef struct ALT_EXT_CLK_PARAMBLOK_s
\r
66 ALT_CLK_PARAMS_t clkosc1; // ALT_CLK_OSC1
\r
67 ALT_CLK_PARAMS_t clkosc2; // ALT_CLK_OSC2
\r
68 ALT_CLK_PARAMS_t periph; // ALT_CLK_F2H_PERIPH_REF
\r
69 ALT_CLK_PARAMS_t sdram; // ALT_CLK_F2H_SDRAM_REF
\r
70 } ALT_EXT_CLK_PARAMBLOK_t;
\r
73 /* Initializes the External Clock Frequency Limits block */
\r
74 /* The first field is the current external clock frequency, and can be set by */
\r
75 /* alt_clk_ext_clk_freq_set(), the second and third fields are the minimum and */
\r
76 /* maximum frequencies, the fourth field is ignored, and the fifth field */
\r
77 /* contains the current activity state of the clock, 1=active, 0=inactive. */
\r
78 /* Values taken from Section 2.3 and Section 2.7.1 of the HHP HPS-Clocking */
\r
79 /* NPP specification. */
\r
80 static ALT_EXT_CLK_PARAMBLOK_t alt_ext_clk_paramblok =
\r
82 { 25000000, 10000000, 50000000, 0, 1 },
\r
83 { 25000000, 10000000, 50000000, 0, 1 },
\r
84 { 0, 10000000, 50000000, 0, 1 },
\r
85 { 0, 10000000, 50000000, 0, 1 }
\r
89 /* PLL frequency limits */
\r
90 typedef struct ALT_PLL_CLK_PARAMBLOK_s
\r
92 ALT_CLK_PARAMS_t MainPLL_600; // Main PLL values for 600 MHz SoC
\r
93 ALT_CLK_PARAMS_t PeriphPLL_600; // Peripheral PLL values for 600 MHz SoC
\r
94 ALT_CLK_PARAMS_t SDRAMPLL_600; // SDRAM PLL values for 600 MHz SoC
\r
95 ALT_CLK_PARAMS_t MainPLL_800; // Main PLL values for 800 MHz SoC
\r
96 ALT_CLK_PARAMS_t PeriphPLL_800; // Peripheral PLL values for 800 MHz SoC
\r
97 ALT_CLK_PARAMS_t SDRAMPLL_800; // SDRAM PLL values for 800 MHz SoC
\r
98 } ALT_PLL_CLK_PARAMBLOK_t;
\r
101 /* Initializes the PLL frequency limits block */
\r
102 /* The first field is the current frequency, the second and third fields */
\r
103 /* are the design limits of the PLLs as listed in Section 3.2.1.2 of the */
\r
104 /* HHP HPS-Clocking NPP document. The fourth field of each line is the */
\r
105 /* guardband percentage, and the fifth field of each line is the current */
\r
106 /* state of the PLL, 1=active, 0=inactive. */
\r
107 #define ALT_ORIGINAL_GUARDBAND_VAL 20
\r
108 #define ALT_GUARDBAND_LIMIT 20
\r
110 static ALT_PLL_CLK_PARAMBLOK_t alt_pll_clk_paramblok =
\r
112 { 0, 320000000, 1200000000, ALT_ORIGINAL_GUARDBAND_VAL, 0 },
\r
113 { 0, 320000000, 900000000, ALT_ORIGINAL_GUARDBAND_VAL, 0 },
\r
114 { 0, 320000000, 800000000, ALT_ORIGINAL_GUARDBAND_VAL, 0 },
\r
115 { 0, 320000000, 1600000000, ALT_ORIGINAL_GUARDBAND_VAL, 1 },
\r
116 { 0, 320000000, 1250000000, ALT_ORIGINAL_GUARDBAND_VAL, 1 },
\r
117 { 0, 320000000, 1066000000, ALT_ORIGINAL_GUARDBAND_VAL, 1 }
\r
121 /* PLL counter frequency limits */
\r
122 typedef struct ALT_PLL_CNTR_FREQMAX_s
\r
124 alt_freq_t MainPLL_C0; // Main PLL Counter 0 parameter block
\r
125 alt_freq_t MainPLL_C1; // Main PLL Counter 1 parameter block
\r
126 alt_freq_t MainPLL_C2; // Main PLL Counter 2 parameter block
\r
127 alt_freq_t MainPLL_C3; // Main PLL Counter 3 parameter block
\r
128 alt_freq_t MainPLL_C4; // Main PLL Counter 4 parameter block
\r
129 alt_freq_t MainPLL_C5; // Main PLL Counter 5 parameter block
\r
130 alt_freq_t PeriphPLL_C0; // Peripheral PLL Counter 0 parameter block
\r
131 alt_freq_t PeriphPLL_C1; // Peripheral PLL Counter 1 parameter block
\r
132 alt_freq_t PeriphPLL_C2; // Peripheral PLL Counter 2 parameter block
\r
133 alt_freq_t PeriphPLL_C3; // Peripheral PLL Counter 3 parameter block
\r
134 alt_freq_t PeriphPLL_C4; // Peripheral PLL Counter 4 parameter block
\r
135 alt_freq_t PeriphPLL_C5; // Peripheral PLL Counter 5 parameter block
\r
136 alt_freq_t SDRAMPLL_C0; // SDRAM PLL Counter 0 parameter block
\r
137 alt_freq_t SDRAMPLL_C1; // SDRAM PLL Counter 1 parameter block
\r
138 alt_freq_t SDRAMPLL_C2; // SDRAM PLL Counter 2 parameter block
\r
139 alt_freq_t SDRAMPLL_C5; // SDRAM PLL Counter 5 parameter block
\r
140 } ALT_PLL_CNTR_FREQMAX_t;
\r
143 // The following pll max frequency array statically defined must be recalculated each time
\r
144 // when powering up, by calling alt_clk_clkmgr_init()
\r
146 // for 14.1 uboot preloader, the following values are calculated dynamically.
\r
149 // alt_pll_cntr_maxfreq.MainPLL_C0 = 1050000000
\r
150 // alt_pll_cntr_maxfreq.MainPLL_C1 = 350000000
\r
151 // alt_pll_cntr_maxfreq.MainPLL_C2 = 262500000
\r
152 // alt_pll_cntr_maxfreq.MainPLL_C3 = 350000000
\r
153 // alt_pll_cntr_maxfreq.MainPLL_C4 = 2050781
\r
154 // alt_pll_cntr_maxfreq.MainPLL_C5 = 116666666
\r
155 // alt_pll_cntr_maxfreq.PeriphPLL_C0 = 1953125
\r
156 // alt_pll_cntr_maxfreq.PeriphPLL_C1 = 250000000
\r
157 // alt_pll_cntr_maxfreq.PeriphPLL_C2 = 1953125
\r
158 // alt_pll_cntr_maxfreq.PeriphPLL_C3 = 200000000
\r
159 // alt_pll_cntr_maxfreq.PeriphPLL_C4 = 200000000
\r
160 // alt_pll_cntr_maxfreq.PeriphPLL_C5 = 1953125
\r
161 // alt_pll_cntr_maxfreq.SDRAMPLL_C0 = 533333333
\r
162 // alt_pll_cntr_maxfreq.SDRAMPLL_C1 = 1066666666
\r
163 // alt_pll_cntr_maxfreq.SDRAMPLL_C2 = 533333333
\r
164 // alt_pll_cntr_maxfreq.SDRAMPLL_C5 = 177777777
\r
167 // alt_pll_cntr_maxfreq.MainPLL_C0 = 925000000
\r
168 // alt_pll_cntr_maxfreq.MainPLL_C1 = 370000000
\r
169 // alt_pll_cntr_maxfreq.MainPLL_C2 = 462500000
\r
170 // alt_pll_cntr_maxfreq.MainPLL_C3 = 370000000
\r
171 // alt_pll_cntr_maxfreq.MainPLL_C4 = 3613281
\r
172 // alt_pll_cntr_maxfreq.MainPLL_C5 = 123333333
\r
173 // alt_pll_cntr_maxfreq.PeriphPLL_C0 = 1953125
\r
174 // alt_pll_cntr_maxfreq.PeriphPLL_C1 = 250000000
\r
175 // alt_pll_cntr_maxfreq.PeriphPLL_C2 = 1953125
\r
176 // alt_pll_cntr_maxfreq.PeriphPLL_C3 = 200000000
\r
177 // alt_pll_cntr_maxfreq.PeriphPLL_C4 = 200000000
\r
178 // alt_pll_cntr_maxfreq.PeriphPLL_C5 = 1953125
\r
179 // alt_pll_cntr_maxfreq.SDRAMPLL_C0 = 400000000
\r
180 // alt_pll_cntr_maxfreq.SDRAMPLL_C1 = 800000000
\r
181 // alt_pll_cntr_maxfreq.SDRAMPLL_C2 = 400000000
\r
182 // alt_pll_cntr_maxfreq.SDRAMPLL_C5 = 133333333
\r
185 /* Initializes the PLL Counter output maximum frequency block */
\r
186 static ALT_PLL_CNTR_FREQMAX_t alt_pll_cntr_maxfreq =
\r
188 800000000, /* Main PLL Outputs */
\r
194 250000000, /* Peripheral PLL Outputs */
\r
199 100000000, /* SDRAM PLL Outputs */
\r
208 /* Maximum multiply, divide, and counter divisor values for each PLL */
\r
209 #define ALT_CLK_PLL_MULT_MAX 4095
\r
210 #define ALT_CLK_PLL_DIV_MAX 63
\r
211 #define ALT_CLK_PLL_CNTR_MAX 511
\r
214 /* Definitions for the reset request and reset acknowledge bits */
\r
215 /* for each of the output counters for each of the PLLS */
\r
216 #define ALT_CLK_PLL_RST_BIT_C0 0x00000001
\r
217 #define ALT_CLK_PLL_RST_BIT_C1 0x00000002
\r
218 #define ALT_CLK_PLL_RST_BIT_C2 0x00000004
\r
219 #define ALT_CLK_PLL_RST_BIT_C3 0x00000008
\r
220 #define ALT_CLK_PLL_RST_BIT_C4 0x00000010
\r
221 #define ALT_CLK_PLL_RST_BIT_C5 0x00000020
\r
224 /* These are the bits that deal with PLL lock and this macro */
\r
225 /* defines a mask to test for bits outside of these */
\r
226 #define ALT_CLK_MGR_PLL_LOCK_BITS (ALT_CLKMGR_INTREN_MAINPLLACHIEVED_CLR_MSK \
\r
227 & ALT_CLKMGR_INTREN_PERPLLACHIEVED_CLR_MSK \
\r
228 & ALT_CLKMGR_INTREN_SDRPLLACHIEVED_CLR_MSK \
\r
229 & ALT_CLKMGR_INTREN_MAINPLLLOST_CLR_MSK \
\r
230 & ALT_CLKMGR_INTREN_PERPLLLOST_CLR_MSK \
\r
231 & ALT_CLKMGR_INTREN_SDRPLLLOST_CLR_MSK)
\r
234 // Undocumented register which determines clock dividers for main PLL C0, C1, and C2. These should be considered RO.
\r
235 #define ALT_CLKMGR_ALTERA_OFST 0xe0
\r
236 #define ALT_CLKMGR_ALTERA_MPUCLK_OFST 0x0
\r
237 #define ALT_CLKMGR_ALTERA_MAINCLK_OFST 0x4
\r
238 #define ALT_CLKMGR_ALTERA_DBGATCLK_OFST 0x8
\r
239 #define ALT_CLKMGR_ALTERA_ADDR ALT_CAST(void *, (ALT_CAST(char *, ALT_CLKMGR_ADDR) + ALT_CLKMGR_ALTERA_OFST))
\r
240 #define ALT_CLKMGR_ALTERA_MPUCLK_ADDR ALT_CAST(void *, (ALT_CAST(char *, ALT_CLKMGR_ALTERA_ADDR) + ALT_CLKMGR_ALTERA_MPUCLK_OFST))
\r
241 #define ALT_CLKMGR_ALTERA_MAINCLK_ADDR ALT_CAST(void *, (ALT_CAST(char *, ALT_CLKMGR_ALTERA_ADDR) + ALT_CLKMGR_ALTERA_MAINCLK_OFST))
\r
242 #define ALT_CLKMGR_ALTERA_DBGATCLK_ADDR ALT_CAST(void *, (ALT_CAST(char *, ALT_CLKMGR_ALTERA_ADDR) + ALT_CLKMGR_ALTERA_DBGATCLK_OFST))
\r
243 #define ALT_CLKMGR_ALTERA_MPUCLK_CNT_GET(value) (((value) & 0x000001ff) >> 0)
\r
244 #define ALT_CLKMGR_ALTERA_MAINCLK_CNT_GET(value) (((value) & 0x000001ff) >> 0)
\r
245 #define ALT_CLKMGR_ALTERA_DBGATCLK_CNT_GET(value) (((value) & 0x000001ff) >> 0)
\r
247 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
248 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Utility functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
249 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
252 /****************************************************************************************/
\r
253 /* alt_clk_mgr_wait() introduces a delay, not very exact, but very light in */
\r
254 /* implementation. Depending upon the optinization level, it will wait at least the */
\r
255 /* number of clock cycles specified in the cnt parameter, sometimes many more. The */
\r
256 /* reg parameter is set to a register or a memory location that was recently used (so */
\r
257 /* as to avoid accidently evicting a register and a recently-used cache line in favor */
\r
258 /* of one whose values are not actually needed.). The cnt parameter sets the number of */
\r
259 /* repeated volatile memory reads and so sets a minimum time delay measured in */
\r
260 /* mpu_clk cycles. If mpu_clk = osc1 clock (as in bypass mode), then this gives a */
\r
261 /* minimum osc1 clock cycle delay. */
\r
262 /****************************************************************************************/
\r
264 inline static void alt_clk_mgr_wait(void* reg, uint32_t cnt)
\r
266 for (; cnt ; cnt--)
\r
268 (void) alt_read_word(reg);
\r
272 /* Wait time constants */
\r
273 /* These values came from Section 4.9.4 of the HHP HPS-Clocking NPP document */
\r
274 #define ALT_SW_MANAGED_CLK_WAIT_CTRDIV 30 /* 30 or more MPU clock cycles */
\r
275 #define ALT_SW_MANAGED_CLK_WAIT_HWCTRDIV 40
\r
276 #define ALT_SW_MANAGED_CLK_WAIT_BYPASS 30
\r
277 #define ALT_SW_MANAGED_CLK_WAIT_SAFEREQ 30
\r
278 #define ALT_SW_MANAGED_CLK_WAIT_SAFEEXIT 30
\r
279 #define ALT_SW_MANAGED_CLK_WAIT_NANDCLK 8 /* 8 or more MPU clock cycles */
\r
282 #define ALT_BYPASS_TIMEOUT_CNT 50
\r
283 // arbitrary number until i find more info
\r
284 #define ALT_TIMEOUT_PHASE_SYNC 300
\r
285 // how many loops to wait for the SDRAM clock to come around
\r
286 // to zero and allow for writing a new divisor ratio to it
\r
288 ALT_STATUS_CODE alt_clk_plls_settle_wait(void)
\r
290 int32_t i = ALT_BYPASS_TIMEOUT_CNT;
\r
295 nofini = alt_read_word(ALT_CLKMGR_STAT_ADDR) & ALT_CLKMGR_STAT_BUSY_SET_MSK;
\r
296 } while (nofini && i--);
\r
297 // wait until clocks finish transitioning and become stable again
\r
298 return (i > 0) ? ALT_E_SUCCESS : ALT_E_ERROR;
\r
301 static ALT_STATUS_CODE alt_clk_pll_lock_wait(ALT_CLK_t pll, uint32_t timeout)
\r
303 uint32_t locked_mask = 0;
\r
305 if (pll == ALT_CLK_MAIN_PLL) { locked_mask = ALT_CLKMGR_INTER_MAINPLLLOCKED_SET_MSK; }
\r
306 else if (pll == ALT_CLK_PERIPHERAL_PLL) { locked_mask = ALT_CLKMGR_INTER_PERPLLLOCKED_SET_MSK; }
\r
307 else if (pll == ALT_CLK_SDRAM_PLL) { locked_mask = ALT_CLKMGR_INTER_SDRPLLLOCKED_SET_MSK; }
\r
310 return ALT_E_BAD_ARG;
\r
315 uint32_t int_status = alt_read_word(ALT_CLKMGR_INTER_ADDR);
\r
316 if (int_status & locked_mask)
\r
318 return ALT_E_SUCCESS;
\r
321 } while (timeout--);
\r
326 /* Useful utility macro for checking if two values */
\r
327 /* are within a certain percentage of each other */
\r
328 #define alt_within_delta(ref, neu, prcnt) (((((neu) * 100)/(ref)) < (100 + (prcnt))) \
\r
329 && ((((neu) * 100)/(ref)) > (100 - (prcnt))))
\r
332 /* Flags to include or omit code sections */
\r
333 // There are four cases where there is a small possibility of producing clock
\r
334 // glitches. Code has been added from an abundance of caution to prevent
\r
335 // these glitches. If further testing shows that this extra code is not necessary
\r
336 // under any conditions, it may be easily eliminated by clearing these flags.
\r
338 #define ALT_PREVENT_GLITCH_BYP true
\r
339 // for PLL entering or leaving bypass
\r
340 #define ALT_PREVENT_GLITCH_EXSAFE true
\r
341 // for PLL exiting safe mode
\r
342 #define ALT_PREVENT_GLITCH_CNTRRST true
\r
343 // resets counter phase
\r
344 #define ALT_PREVENT_GLITCH_CHGC1 true
\r
345 // for changing Main PLL C1 counter
\r
349 /****************************************************************************************/
\r
350 /* Bare-bones utility function used to make the somewhat complex writes to the PLL */
\r
351 /* counter registers (the clock dividers) easier. No parameter-checking or */
\r
352 /* error-checking, this is a static to this file and invisible to Doxygen. */
\r
353 /****************************************************************************************/
\r
355 static void alt_clk_pllcounter_write(void* vcoaddr, void* stataddr, void* cntraddr,
\r
356 uint32_t val, uint32_t msk, uint32_t shift)
\r
358 #if ALT_PREVENT_GLITCH_CNTRRST
\r
359 // this is here from an abundance of caution and it may not be necessary
\r
360 // to put the counter in reset for this write
\r
361 volatile uint32_t temp;
\r
363 alt_setbits_word(vcoaddr, msk << shift); // put the counter in reset
\r
366 temp = alt_read_word(stataddr);
\r
367 } while (!(temp & msk));
\r
369 alt_write_word(cntraddr, val);
\r
370 alt_clrbits_word(vcoaddr, msk << shift); // release counter reset
\r
372 #else // should we find out that resetting the counters as above is unnecessary
\r
373 alt_write_word(cntraddr, val);
\r
378 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
379 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Main Functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
380 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
\r
383 /****************************************************************************************/
\r
384 /* alt_clk_lock_status_clear() clears assertions of one or more of the PLL lock status */
\r
386 /****************************************************************************************/
\r
388 ALT_STATUS_CODE alt_clk_lock_status_clear(ALT_CLK_PLL_LOCK_STATUS_t lock_stat_mask)
\r
390 if (lock_stat_mask & ( ALT_CLKMGR_INTER_MAINPLLACHIEVED_CLR_MSK
\r
391 & ALT_CLKMGR_INTER_PERPLLACHIEVED_CLR_MSK
\r
392 & ALT_CLKMGR_INTER_SDRPLLACHIEVED_CLR_MSK
\r
393 & ALT_CLKMGR_INTER_MAINPLLLOST_CLR_MSK
\r
394 & ALT_CLKMGR_INTER_PERPLLLOST_CLR_MSK
\r
395 & ALT_CLKMGR_INTER_SDRPLLLOST_CLR_MSK)
\r
398 return ALT_E_BAD_ARG;
\r
402 alt_setbits_word(ALT_CLKMGR_INTER_ADDR, lock_stat_mask);
\r
403 return ALT_E_SUCCESS;
\r
408 /****************************************************************************************/
\r
409 /* alt_clk_lock_status_get() returns the value of the PLL lock status conditions. */
\r
410 /****************************************************************************************/
\r
412 uint32_t alt_clk_lock_status_get(void)
\r
414 return alt_read_word(ALT_CLKMGR_INTER_ADDR) & ( ALT_CLKMGR_INTER_MAINPLLACHIEVED_SET_MSK
\r
415 | ALT_CLKMGR_INTER_PERPLLACHIEVED_SET_MSK
\r
416 | ALT_CLKMGR_INTER_SDRPLLACHIEVED_SET_MSK
\r
417 | ALT_CLKMGR_INTER_MAINPLLLOST_SET_MSK
\r
418 | ALT_CLKMGR_INTER_PERPLLLOST_SET_MSK
\r
419 | ALT_CLKMGR_INTER_SDRPLLLOST_SET_MSK
\r
420 | ALT_CLKMGR_INTER_MAINPLLLOCKED_SET_MSK
\r
421 | ALT_CLKMGR_INTER_PERPLLLOCKED_SET_MSK
\r
422 | ALT_CLKMGR_INTER_SDRPLLLOCKED_SET_MSK );
\r
426 /****************************************************************************************/
\r
427 /* alt_clk_pll_is_locked() returns ALT_E_TRUE if the designated PLL is currently */
\r
428 /* locked and ALT_E_FALSE if not. */
\r
429 /****************************************************************************************/
\r
431 ALT_STATUS_CODE alt_clk_pll_is_locked(ALT_CLK_t pll)
\r
433 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
435 if (pll == ALT_CLK_MAIN_PLL)
\r
437 status = (alt_read_word(ALT_CLKMGR_INTER_ADDR) & ALT_CLKMGR_INTER_MAINPLLLOCKED_SET_MSK)
\r
438 ? ALT_E_TRUE : ALT_E_FALSE;
\r
440 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
442 status = (alt_read_word(ALT_CLKMGR_INTER_ADDR) & ALT_CLKMGR_INTER_PERPLLLOCKED_SET_MSK)
\r
443 ? ALT_E_TRUE : ALT_E_FALSE;
\r
445 else if (pll == ALT_CLK_SDRAM_PLL)
\r
447 status = (alt_read_word(ALT_CLKMGR_INTER_ADDR) & ALT_CLKMGR_INTER_SDRPLLLOCKED_SET_MSK)
\r
448 ? ALT_E_TRUE : ALT_E_FALSE;
\r
454 /****************************************************************************************/
\r
455 /* alt_clk_safe_mode_clear() clears the safe mode status of the Clock Manager following */
\r
457 /****************************************************************************************/
\r
459 ALT_STATUS_CODE alt_clk_safe_mode_clear(void)
\r
461 ALT_STATUS_CODE status = ALT_E_ERROR;
\r
462 #if ALT_PREVENT_GLITCH_EXSAFE
\r
465 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
466 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp &
\r
467 (ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK));
\r
468 // gate off l4MP and L4SP clocks (no matter their source)
\r
470 alt_setbits_word(ALT_CLKMGR_CTL_ADDR, ALT_CLKMGR_CTL_SAFEMOD_SET_MSK);
\r
471 // clear safe mode bit
\r
472 status = alt_clk_plls_settle_wait();
\r
473 alt_replbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR,
\r
474 ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK | ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK,
\r
476 // gate l4MP and L4SP clocks back on if they were on previously
\r
479 alt_setbits_word(ALT_CLKMGR_CTL_ADDR, ALT_CLKMGR_CTL_SAFEMOD_SET_MSK);
\r
480 // clear safe mode bit
\r
481 status = alt_clk_plls_settle_wait();
\r
488 /****************************************************************************************/
\r
489 /* alt_clk_is_in_safe_mode() returns whether the specified safe mode clock domain is in */
\r
490 /* safe mode or not. */
\r
491 /****************************************************************************************/
\r
493 bool alt_clk_is_in_safe_mode(ALT_CLK_SAFE_DOMAIN_t clk_domain)
\r
498 if (clk_domain == ALT_CLK_DOMAIN_NORMAL)
\r
500 ret = alt_read_word(ALT_CLKMGR_CTL_ADDR) & ALT_CLKMGR_CTL_SAFEMOD_SET_MSK;
\r
501 // is the main clock domain in safe mode?
\r
503 else if (clk_domain == ALT_CLK_DOMAIN_DEBUG)
\r
505 temp = alt_read_word(ALT_CLKMGR_DBCTL_ADDR);
\r
506 if (temp & ALT_CLKMGR_DBCTL_STAYOSC1_SET_MSK)
\r
508 ret = true; // is the debug clock domain in safe mode?
\r
510 else if (temp & ALT_CLKMGR_DBCTL_ENSFMDWR_SET_MSK)
\r
512 ret = alt_read_word(ALT_CLKMGR_CTL_ADDR) & ALT_CLKMGR_CTL_SAFEMOD_SET_MSK;
\r
513 // is the debug clock domain following the main clock domain
\r
514 // AND is the main clock domain in safe mode?
\r
520 /****************************************************************************************/
\r
521 /* alt_clk_pll_bypass_disable() disables bypass mode for the specified PLL, removing */
\r
522 /* it from bypass mode and allowing it to provide the output of the PLL to drive the */
\r
523 /* six main clocks. */
\r
524 /****************************************************************************************/
\r
526 ALT_STATUS_CODE alt_clk_pll_bypass_disable(ALT_CLK_t pll)
\r
528 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
530 #if ALT_PREVENT_GLITCH_BYP
\r
532 bool restore_0 = false;
\r
533 bool restore_1 = false;
\r
536 // this function should only be called after the selected PLL is locked
\r
537 if (alt_clk_pll_is_locked(pll) == ALT_E_TRUE)
\r
539 if (pll == ALT_CLK_MAIN_PLL)
\r
541 #if ALT_PREVENT_GLITCH_BYP
\r
542 // if L4MP or L4SP source is set to Main PLL C1, gate it off before changing
\r
543 // bypass state, then gate clock back on. FogBugz #63778
\r
544 temp = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
545 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
547 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK)))
\r
551 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK)))
\r
556 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
557 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
558 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); }
\r
561 // assert outresetall of main PLL
\r
562 temp = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
563 alt_write_word(ALT_CLKMGR_MAINPLL_VCO_ADDR, temp | ALT_CLKMGR_MAINPLL_VCO_OUTRSTALL_SET_MSK);
\r
565 // deassert outresetall of main PLL
\r
566 alt_write_word(ALT_CLKMGR_MAINPLL_VCO_ADDR, temp & ALT_CLKMGR_MAINPLL_VCO_OUTRSTALL_CLR_MSK);
\r
568 alt_clk_plls_settle_wait();
\r
571 alt_clrbits_word(ALT_CLKMGR_BYPASS_ADDR, ALT_CLKMGR_BYPASS_MAINPLL_SET_MSK);
\r
572 status = alt_clk_plls_settle_wait();
\r
574 #if ALT_PREVENT_GLITCH_BYP
\r
575 if (restore_0 || restore_1)
\r
577 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
578 // wait a bit more before reenabling the L4MP and L4SP clocks
\r
579 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp1);
\r
584 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
586 #if ALT_PREVENT_GLITCH_BYP
\r
587 // if L4MP or L4SP source is set to Main PLL C1, gate it off before changing
\r
588 // bypass state, then gate clock back on. FogBugz #63778
\r
589 temp = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
590 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
592 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK) && (temp & ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK))
\r
596 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK) && (temp & ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK))
\r
601 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
602 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
603 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); }
\r
606 // assert outresetall of Peripheral PLL
\r
607 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
608 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp | ALT_CLKMGR_PERPLL_VCO_OUTRSTALL_SET_MSK);
\r
609 alt_clk_plls_settle_wait();
\r
611 // deassert outresetall of main PLL
\r
612 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp & ALT_CLKMGR_PERPLL_VCO_OUTRSTALL_CLR_MSK);
\r
614 // remove bypass - don't think that there's any need to touch the bypass clock source
\r
615 alt_clrbits_word(ALT_CLKMGR_BYPASS_ADDR, ALT_CLKMGR_BYPASS_PERPLL_SET_MSK);
\r
616 status = alt_clk_plls_settle_wait();
\r
618 #if ALT_PREVENT_GLITCH_BYP
\r
619 if (restore_0 || restore_1)
\r
621 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
622 // wait a bit more before reenabling the L4MP and L4SP clocks
\r
623 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp1);
\r
628 else if (pll == ALT_CLK_SDRAM_PLL)
\r
630 // assert outresetall of SDRAM PLL
\r
631 temp = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
632 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp | ALT_CLKMGR_SDRPLL_VCO_OUTRSTALL_SET_MSK);
\r
634 // deassert outresetall of main PLL
\r
635 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp & ALT_CLKMGR_SDRPLL_VCO_OUTRSTALL_CLR_MSK);
\r
636 alt_clk_plls_settle_wait();
\r
638 // remove bypass - don't think that there's any need to touch the bypass clock source
\r
639 alt_clrbits_word(ALT_CLKMGR_BYPASS_ADDR, ALT_CLKMGR_BYPASS_SDRPLLSRC_SET_MSK);
\r
640 status = alt_clk_plls_settle_wait();
\r
645 status = ALT_E_ERROR;
\r
652 /****************************************************************************************/
\r
653 /* alt_clk_pll_bypass_enable() enable bypass mode for the specified PLL. */
\r
654 /****************************************************************************************/
\r
656 ALT_STATUS_CODE alt_clk_pll_bypass_enable(ALT_CLK_t pll, bool use_input_mux)
\r
658 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
660 #ifdef ALT_PREVENT_GLITCH_BYP
\r
662 bool restore_0 = false;
\r
663 bool restore_1 = false;
\r
666 if (pll == ALT_CLK_MAIN_PLL)
\r
668 if (!use_input_mux)
\r
670 #ifdef ALT_PREVENT_GLITCH_BYP
\r
671 // if L4MP or L4SP source is set to Main PLL C1, gate it off before changing
\r
672 // bypass state, then gate clock back on. FogBugz #63778
\r
673 temp = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
674 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
676 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK)))
\r
680 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK)))
\r
685 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
686 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
687 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); }
\r
689 alt_setbits_word(ALT_CLKMGR_BYPASS_ADDR, ALT_CLKMGR_BYPASS_MAINPLL_SET_MSK);
\r
690 // no input mux select on main PLL
\r
692 status = alt_clk_plls_settle_wait();
\r
693 // wait before reenabling the L4MP and L4SP clocks
\r
694 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp1); }
\r
697 alt_setbits_word(ALT_CLKMGR_BYPASS_ADDR, ALT_CLKMGR_BYPASS_MAINPLL_SET_MSK);
\r
698 // no input mux select on main PLL
\r
699 status = alt_clk_plls_settle_wait();
\r
702 status = ALT_E_SUCCESS;
\r
706 status = ALT_E_BAD_ARG;
\r
709 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
711 #ifdef ALT_PREVENT_GLITCH_BYP
\r
712 // if L4MP or L4SP source is set to Peripheral PLL C1, gate it off before changing
\r
713 // bypass state, then gate clock back on. FogBugz #63778
\r
714 temp = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
715 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
717 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK) && (temp & ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK))
\r
721 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK) && (temp & ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK))
\r
726 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
727 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
728 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); }
\r
730 temp = alt_read_word(ALT_CLKMGR_BYPASS_ADDR) &
\r
731 (ALT_CLKMGR_BYPASS_PERPLL_CLR_MSK & ALT_CLKMGR_BYPASS_PERPLLSRC_CLR_MSK);
\r
732 temp |= (use_input_mux) ? ALT_CLKMGR_BYPASS_PERPLL_SET_MSK |
\r
733 ALT_CLKMGR_BYPASS_PERPLLSRC_SET_MSK : ALT_CLKMGR_BYPASS_PERPLL_SET_MSK;
\r
734 // set bypass bit and optionally the source select bit
\r
736 alt_write_word(ALT_CLKMGR_BYPASS_ADDR, temp);
\r
737 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
738 // wait a bit before reenabling the L4MP and L4SP clocks
\r
739 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp1); }
\r
742 temp = alt_read_word(ALT_CLKMGR_BYPASS_ADDR) &
\r
743 (ALT_CLKMGR_BYPASS_PERPLL_CLR_MSK & ALT_CLKMGR_BYPASS_PERPLLSRC_CLR_MSK);
\r
744 temp |= (use_input_mux) ? ALT_CLKMGR_BYPASS_PERPLL_SET_MSK |
\r
745 ALT_CLKMGR_BYPASS_PERPLLSRC_SET_MSK : ALT_CLKMGR_BYPASS_PERPLL_SET_MSK;
\r
746 // set bypass bit and optionally the source select bit
\r
748 status = ALT_E_SUCCESS;
\r
751 else if (pll == ALT_CLK_SDRAM_PLL)
\r
753 temp = alt_read_word(ALT_CLKMGR_BYPASS_ADDR) &
\r
754 (ALT_CLKMGR_BYPASS_SDRPLL_CLR_MSK & ALT_CLKMGR_BYPASS_SDRPLLSRC_CLR_MSK);
\r
755 temp |= (use_input_mux) ? ALT_CLKMGR_BYPASS_SDRPLL_SET_MSK |
\r
756 ALT_CLKMGR_BYPASS_SDRPLLSRC_SET_MSK : ALT_CLKMGR_BYPASS_SDRPLL_SET_MSK;
\r
757 // set bypass bit and optionally the source select bit
\r
758 alt_write_word(ALT_CLKMGR_BYPASS_ADDR, temp);
\r
759 status = ALT_E_SUCCESS;
\r
765 /****************************************************************************************/
\r
766 /* alt_clk_pll_is_bypassed() returns whether the specified PLL is in bypass or not. */
\r
767 /* Bypass is a special state where the PLL VCO and the C0-C5 counters are bypassed */
\r
768 /* and not in the circuit. Either the Osc1 clock input or the input chosen by the */
\r
769 /* input mux may be selected to be operational in the bypass state. All changes to */
\r
770 /* the PLL VCO must be made in bypass mode to avoid the potential of producing clock */
\r
771 /* glitches which may affect downstream clock dividers and peripherals. */
\r
772 /****************************************************************************************/
\r
774 ALT_STATUS_CODE alt_clk_pll_is_bypassed(ALT_CLK_t pll)
\r
776 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
778 if (pll == ALT_CLK_MAIN_PLL)
\r
780 status = (ALT_CLKMGR_CTL_SAFEMOD_GET(alt_read_word(ALT_CLKMGR_CTL_ADDR))
\r
781 || ALT_CLKMGR_BYPASS_MAINPLL_GET(alt_read_word(ALT_CLKMGR_BYPASS_ADDR)))
\r
782 ? ALT_E_TRUE : ALT_E_FALSE;
\r
784 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
786 status = (ALT_CLKMGR_CTL_SAFEMOD_GET(alt_read_word(ALT_CLKMGR_CTL_ADDR))
\r
787 || ALT_CLKMGR_BYPASS_PERPLL_GET(alt_read_word(ALT_CLKMGR_BYPASS_ADDR)))
\r
788 ? ALT_E_TRUE : ALT_E_FALSE;
\r
790 else if (pll == ALT_CLK_SDRAM_PLL)
\r
792 status = (ALT_CLKMGR_CTL_SAFEMOD_GET(alt_read_word(ALT_CLKMGR_CTL_ADDR))
\r
793 || ALT_CLKMGR_BYPASS_SDRPLL_GET(alt_read_word(ALT_CLKMGR_BYPASS_ADDR)))
\r
794 ? ALT_E_TRUE : ALT_E_FALSE;
\r
800 /****************************************************************************************/
\r
801 /* alt_clk_pll_source_get() returns the current input of the specified PLL. */
\r
802 /****************************************************************************************/
\r
804 ALT_CLK_t alt_clk_pll_source_get(ALT_CLK_t pll)
\r
806 ALT_CLK_t ret = ALT_CLK_UNKNOWN;
\r
810 if (pll == ALT_CLK_MAIN_PLL)
\r
812 ret = ALT_CLK_IN_PIN_OSC1;
\r
814 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
816 // three possible clock sources for the peripheral PLL
\r
817 temp = ALT_CLKMGR_PERPLL_VCO_PSRC_GET(alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR));
\r
818 if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1)
\r
820 ret = ALT_CLK_IN_PIN_OSC1;
\r
822 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2)
\r
824 ret = ALT_CLK_IN_PIN_OSC2;
\r
826 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF)
\r
828 ret = ALT_CLK_F2H_PERIPH_REF;
\r
831 else if (pll == ALT_CLK_SDRAM_PLL)
\r
833 // three possible clock sources for the SDRAM PLL
\r
834 temp = ALT_CLKMGR_SDRPLL_VCO_SSRC_GET(alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR));
\r
835 if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1)
\r
837 ret = ALT_CLK_IN_PIN_OSC1;
\r
839 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2)
\r
841 ret = ALT_CLK_IN_PIN_OSC2;
\r
843 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF)
\r
845 ret = ALT_CLK_F2H_SDRAM_REF;
\r
852 // alt_clk_clock_disable() disables the specified clock. Once the clock is disabled,
\r
853 // its clock signal does not propagate to its clocked elements.
\r
855 ALT_STATUS_CODE alt_clk_clock_disable(ALT_CLK_t clk)
\r
857 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
861 // For PLLs, put them in bypass mode.
\r
862 case ALT_CLK_MAIN_PLL:
\r
863 case ALT_CLK_PERIPHERAL_PLL:
\r
864 case ALT_CLK_SDRAM_PLL:
\r
865 status = alt_clk_pll_bypass_enable(clk, false);
\r
868 // Clocks that originate at the Main PLL.
\r
869 case ALT_CLK_L4_MAIN:
\r
870 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4MAINCLK_SET_MSK);
\r
872 case ALT_CLK_L3_MP:
\r
873 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L3MPCLK_SET_MSK);
\r
875 case ALT_CLK_L4_MP:
\r
876 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK);
\r
878 case ALT_CLK_L4_SP:
\r
879 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK);
\r
881 case ALT_CLK_DBG_AT:
\r
882 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGATCLK_SET_MSK);
\r
885 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGCLK_SET_MSK);
\r
887 case ALT_CLK_DBG_TRACE:
\r
888 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGTRACECLK_SET_MSK);
\r
890 case ALT_CLK_DBG_TIMER:
\r
891 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGTMRCLK_SET_MSK);
\r
894 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_CFGCLK_SET_MSK);
\r
896 case ALT_CLK_H2F_USER0:
\r
897 alt_clrbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_S2FUSER0CLK_SET_MSK);
\r
900 // Clocks that originate at the Peripheral PLL.
\r
901 case ALT_CLK_EMAC0:
\r
902 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_EMAC0CLK_SET_MSK);
\r
904 case ALT_CLK_EMAC1:
\r
905 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_EMAC1CLK_SET_MSK);
\r
907 case ALT_CLK_USB_MP:
\r
908 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_USBCLK_SET_MSK);
\r
910 case ALT_CLK_SPI_M:
\r
911 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_SPIMCLK_SET_MSK);
\r
914 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_CAN0CLK_SET_MSK);
\r
917 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_CAN1CLK_SET_MSK);
\r
919 case ALT_CLK_GPIO_DB:
\r
920 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_GPIOCLK_SET_MSK);
\r
922 case ALT_CLK_H2F_USER1:
\r
923 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_S2FUSER1CLK_SET_MSK);
\r
925 case ALT_CLK_SDMMC:
\r
926 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_SDMMCCLK_SET_MSK);
\r
928 case ALT_CLK_NAND_X:
\r
929 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDCLK_SET_MSK);
\r
930 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
931 // gate nand_clk off before nand_x_clk.
\r
932 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDXCLK_SET_MSK);
\r
935 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDCLK_SET_MSK);
\r
938 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
941 // Clocks that originate at the SDRAM PLL.
\r
942 case ALT_CLK_DDR_DQS:
\r
943 alt_clrbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDRDQSCLK_SET_MSK);
\r
945 case ALT_CLK_DDR_2X_DQS:
\r
946 alt_clrbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDR2XDQSCLK_SET_MSK);
\r
948 case ALT_CLK_DDR_DQ:
\r
949 alt_clrbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDRDQCLK_SET_MSK);
\r
951 case ALT_CLK_H2F_USER2:
\r
952 alt_clrbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_S2FUSER2CLK_SET_MSK);
\r
956 status = ALT_E_BAD_ARG;
\r
965 // alt_clk_clock_enable() enables the specified clock. Once the clock is enabled, its
\r
966 // clock signal propagates to its elements.
\r
968 ALT_STATUS_CODE alt_clk_clock_enable(ALT_CLK_t clk)
\r
970 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
974 // For PLLs, take them out of bypass mode.
\r
975 case ALT_CLK_MAIN_PLL:
\r
976 case ALT_CLK_PERIPHERAL_PLL:
\r
977 case ALT_CLK_SDRAM_PLL:
\r
978 status = alt_clk_pll_bypass_disable(clk);
\r
981 // Clocks that originate at the Main PLL.
\r
982 case ALT_CLK_L4_MAIN:
\r
983 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4MAINCLK_SET_MSK);
\r
985 case ALT_CLK_L3_MP:
\r
986 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L3MPCLK_SET_MSK);
\r
988 case ALT_CLK_L4_MP:
\r
989 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK);
\r
991 case ALT_CLK_L4_SP:
\r
992 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK);
\r
994 case ALT_CLK_DBG_AT:
\r
995 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGATCLK_SET_MSK);
\r
998 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGCLK_SET_MSK);
\r
1000 case ALT_CLK_DBG_TRACE:
\r
1001 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGTRACECLK_SET_MSK);
\r
1003 case ALT_CLK_DBG_TIMER:
\r
1004 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_DBGTMRCLK_SET_MSK);
\r
1007 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_CFGCLK_SET_MSK);
\r
1009 case ALT_CLK_H2F_USER0:
\r
1010 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_CLKMGR_MAINPLL_EN_S2FUSER0CLK_SET_MSK);
\r
1013 // Clocks that originate at the Peripheral PLL.
\r
1014 case ALT_CLK_EMAC0:
\r
1015 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_EMAC0CLK_SET_MSK);
\r
1017 case ALT_CLK_EMAC1:
\r
1018 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_EMAC1CLK_SET_MSK);
\r
1020 case ALT_CLK_USB_MP:
\r
1021 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_USBCLK_SET_MSK);
\r
1023 case ALT_CLK_SPI_M:
\r
1024 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_SPIMCLK_SET_MSK);
\r
1026 case ALT_CLK_CAN0:
\r
1027 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_CAN0CLK_SET_MSK);
\r
1029 case ALT_CLK_CAN1:
\r
1030 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_CAN1CLK_SET_MSK);
\r
1032 case ALT_CLK_GPIO_DB:
\r
1033 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_GPIOCLK_SET_MSK);
\r
1035 case ALT_CLK_H2F_USER1:
\r
1036 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_S2FUSER1CLK_SET_MSK);
\r
1038 case ALT_CLK_SDMMC:
\r
1039 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_SDMMCCLK_SET_MSK);
\r
1041 case ALT_CLK_NAND_X:
\r
1042 // implementation detail - should ALK_CLK_NAND be gated off here before enabling ALT_CLK_NAND_X?
\r
1043 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDXCLK_SET_MSK);
\r
1044 // implementation detail - should this wait be enforced here?
\r
1045 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
1047 case ALT_CLK_NAND:
\r
1048 // enabling ALT_CLK_NAND always implies enabling ALT_CLK_NAND_X first
\r
1049 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDXCLK_SET_MSK);
\r
1050 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
1051 // gate nand_x_clk on at least 8 MCU clocks before nand_clk
\r
1052 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_NANDCLK_SET_MSK);
\r
1054 case ALT_CLK_QSPI:
\r
1055 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
1058 // Clocks that originate at the SDRAM PLL.
\r
1059 case ALT_CLK_DDR_DQS:
\r
1060 alt_setbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDRDQSCLK_SET_MSK);
\r
1062 case ALT_CLK_DDR_2X_DQS:
\r
1063 alt_setbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDR2XDQSCLK_SET_MSK);
\r
1065 case ALT_CLK_DDR_DQ:
\r
1066 alt_setbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_DDRDQCLK_SET_MSK);
\r
1068 case ALT_CLK_H2F_USER2:
\r
1069 alt_setbits_word(ALT_CLKMGR_SDRPLL_EN_ADDR, ALT_CLKMGR_SDRPLL_EN_S2FUSER2CLK_SET_MSK);
\r
1073 status = ALT_E_BAD_ARG;
\r
1081 // alt_clk_is_enabled() returns whether the specified clock is enabled or not.
\r
1083 ALT_STATUS_CODE alt_clk_is_enabled(ALT_CLK_t clk)
\r
1085 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
1089 // For PLLs, this function checks if the PLL is bypassed or not.
\r
1090 case ALT_CLK_MAIN_PLL:
\r
1091 case ALT_CLK_PERIPHERAL_PLL:
\r
1092 case ALT_CLK_SDRAM_PLL:
\r
1093 status = (alt_clk_pll_is_bypassed(clk) != ALT_E_TRUE);
\r
1096 // These clocks are not gated, so must return a ALT_E_BAD_ARG type error.
\r
1097 case ALT_CLK_MAIN_PLL_C0:
\r
1098 case ALT_CLK_MAIN_PLL_C1:
\r
1099 case ALT_CLK_MAIN_PLL_C2:
\r
1100 case ALT_CLK_MAIN_PLL_C3:
\r
1101 case ALT_CLK_MAIN_PLL_C4:
\r
1102 case ALT_CLK_MAIN_PLL_C5:
\r
1104 case ALT_CLK_MPU_L2_RAM:
\r
1105 case ALT_CLK_MPU_PERIPH:
\r
1106 case ALT_CLK_L3_MAIN:
\r
1107 case ALT_CLK_L3_SP:
\r
1108 case ALT_CLK_DBG_BASE:
\r
1109 case ALT_CLK_MAIN_QSPI:
\r
1110 case ALT_CLK_MAIN_NAND_SDMMC:
\r
1111 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
1112 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
1113 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
1114 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
1115 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
1116 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
1117 case ALT_CLK_SDRAM_PLL_C0:
\r
1118 case ALT_CLK_SDRAM_PLL_C1:
\r
1119 case ALT_CLK_SDRAM_PLL_C2:
\r
1120 case ALT_CLK_SDRAM_PLL_C5:
\r
1121 status = ALT_E_BAD_ARG;
\r
1124 // Clocks that originate at the Main PLL.
\r
1125 case ALT_CLK_L4_MAIN:
\r
1126 status = (ALT_CLKMGR_MAINPLL_EN_L4MAINCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1127 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1129 case ALT_CLK_L3_MP:
\r
1130 status = (ALT_CLKMGR_MAINPLL_EN_L3MPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1131 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1133 case ALT_CLK_L4_MP:
\r
1134 status = (ALT_CLKMGR_MAINPLL_EN_L4MPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1135 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1137 case ALT_CLK_L4_SP:
\r
1138 status = (ALT_CLKMGR_MAINPLL_EN_L4SPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1139 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1141 case ALT_CLK_DBG_AT:
\r
1142 status = (ALT_CLKMGR_MAINPLL_EN_DBGATCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1143 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1146 status = (ALT_CLKMGR_MAINPLL_EN_DBGCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1147 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1149 case ALT_CLK_DBG_TRACE:
\r
1150 status = (ALT_CLKMGR_MAINPLL_EN_DBGTRACECLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1151 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1153 case ALT_CLK_DBG_TIMER:
\r
1154 status = (ALT_CLKMGR_MAINPLL_EN_DBGTMRCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1155 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1158 status = (ALT_CLKMGR_MAINPLL_EN_CFGCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1159 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1161 case ALT_CLK_H2F_USER0:
\r
1162 status = (ALT_CLKMGR_MAINPLL_EN_S2FUSER0CLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR)))
\r
1163 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1166 // Clocks that originate at the Peripheral PLL.
\r
1167 case ALT_CLK_EMAC0:
\r
1168 status = (ALT_CLKMGR_PERPLL_EN_EMAC0CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1169 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1171 case ALT_CLK_EMAC1:
\r
1172 status = (ALT_CLKMGR_PERPLL_EN_EMAC1CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1173 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1175 case ALT_CLK_USB_MP:
\r
1176 status = (ALT_CLKMGR_PERPLL_EN_USBCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1177 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1179 case ALT_CLK_SPI_M:
\r
1180 status = (ALT_CLKMGR_PERPLL_EN_SPIMCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1181 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1183 case ALT_CLK_CAN0:
\r
1184 status = (ALT_CLKMGR_PERPLL_EN_CAN0CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1185 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1187 case ALT_CLK_CAN1:
\r
1188 status = (ALT_CLKMGR_PERPLL_EN_CAN1CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1189 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1191 case ALT_CLK_GPIO_DB:
\r
1192 status = (ALT_CLKMGR_PERPLL_EN_GPIOCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1193 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1195 case ALT_CLK_H2F_USER1:
\r
1196 status = (ALT_CLKMGR_PERPLL_EN_S2FUSER1CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1197 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1200 // Clocks that may originate at the Main PLL, the Peripheral PLL, or the FPGA.
\r
1201 case ALT_CLK_SDMMC:
\r
1202 status = (ALT_CLKMGR_PERPLL_EN_SDMMCCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1203 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1205 case ALT_CLK_NAND_X:
\r
1206 status = (ALT_CLKMGR_PERPLL_EN_NANDXCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1207 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1209 case ALT_CLK_NAND:
\r
1210 status = (ALT_CLKMGR_PERPLL_EN_NANDCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1211 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1213 case ALT_CLK_QSPI:
\r
1214 status = (ALT_CLKMGR_PERPLL_EN_QSPICLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)))
\r
1215 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1218 // Clocks that originate at the SDRAM PLL.
\r
1219 case ALT_CLK_DDR_DQS:
\r
1220 status = (ALT_CLKMGR_SDRPLL_EN_DDRDQSCLK_GET(alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR)))
\r
1221 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1223 case ALT_CLK_DDR_2X_DQS:
\r
1224 status = (ALT_CLKMGR_SDRPLL_EN_DDR2XDQSCLK_GET(alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR)))
\r
1225 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1227 case ALT_CLK_DDR_DQ:
\r
1228 status = (ALT_CLKMGR_SDRPLL_EN_DDRDQCLK_GET(alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR)))
\r
1229 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1231 case ALT_CLK_H2F_USER2:
\r
1232 status = (ALT_CLKMGR_SDRPLL_EN_S2FUSER2CLK_GET(alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR)))
\r
1233 ? ALT_E_TRUE : ALT_E_FALSE;
\r
1237 status = ALT_E_BAD_ARG;
\r
1246 // alt_clk_source_get() gets the input reference clock source selection value for the
\r
1247 // specified clock or PLL.
\r
1249 ALT_CLK_t alt_clk_source_get(ALT_CLK_t clk)
\r
1251 ALT_CLK_t ret = ALT_CLK_UNKNOWN;
\r
1256 // Potential external clock sources.
\r
1257 // these clock entities are their own source
\r
1258 case ALT_CLK_IN_PIN_OSC1:
\r
1259 case ALT_CLK_IN_PIN_OSC2:
\r
1260 case ALT_CLK_F2H_PERIPH_REF:
\r
1261 case ALT_CLK_F2H_SDRAM_REF:
\r
1262 case ALT_CLK_IN_PIN_JTAG:
\r
1263 case ALT_CLK_IN_PIN_ULPI0:
\r
1264 case ALT_CLK_IN_PIN_ULPI1:
\r
1265 case ALT_CLK_IN_PIN_EMAC0_RX:
\r
1266 case ALT_CLK_IN_PIN_EMAC1_RX:
\r
1270 // Phase-Locked Loops.
\r
1271 case ALT_CLK_MAIN_PLL:
\r
1272 case ALT_CLK_OSC1:
\r
1273 ret = ALT_CLK_IN_PIN_OSC1;
\r
1275 case ALT_CLK_PERIPHERAL_PLL:
\r
1276 ret = alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL);
\r
1278 case ALT_CLK_SDRAM_PLL:
\r
1279 ret = alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL);
\r
1282 // Main Clock Group.
\r
1283 case ALT_CLK_MAIN_PLL_C0:
\r
1284 case ALT_CLK_MAIN_PLL_C1:
\r
1285 case ALT_CLK_MAIN_PLL_C2:
\r
1286 case ALT_CLK_MAIN_PLL_C3:
\r
1287 case ALT_CLK_MAIN_PLL_C4:
\r
1288 case ALT_CLK_MAIN_PLL_C5:
\r
1289 // check bypass, return either osc1 or PLL ID
\r
1290 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1291 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL;
\r
1294 case ALT_CLK_MPU_PERIPH:
\r
1295 case ALT_CLK_MPU_L2_RAM:
\r
1297 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1298 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C0;
\r
1301 case ALT_CLK_L4_MAIN:
\r
1302 case ALT_CLK_L3_MAIN:
\r
1303 case ALT_CLK_L3_MP:
\r
1304 case ALT_CLK_L3_SP:
\r
1305 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1306 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C1;
\r
1309 case ALT_CLK_L4_MP:
\r
1310 // read the state of the L4_mp source bit
\r
1311 if ((ALT_CLKMGR_MAINPLL_L4SRC_L4MP_GET(alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR)))
\r
1312 == ALT_CLKMGR_MAINPLL_L4SRC_L4MP_E_MAINPLL)
\r
1314 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1315 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C1;
\r
1319 // if the clock comes from periph_base_clk
\r
1320 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1321 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C4;
\r
1325 case ALT_CLK_L4_SP:
\r
1326 // read the state of the source bit
\r
1327 if ((ALT_CLKMGR_MAINPLL_L4SRC_L4SP_GET(alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR)))
\r
1328 == ALT_CLKMGR_MAINPLL_L4SRC_L4SP_E_MAINPLL)
\r
1330 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1331 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C1;
\r
1335 // if the clock comes from periph_base_clk
\r
1336 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1337 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C4;
\r
1341 case ALT_CLK_DBG_BASE:
\r
1342 case ALT_CLK_DBG_AT:
\r
1343 case ALT_CLK_DBG_TRACE:
\r
1344 case ALT_CLK_DBG_TIMER:
\r
1346 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1347 ALT_CLK_OSC1 : ALT_CLK_MAIN_PLL_C2;
\r
1349 case ALT_CLK_MAIN_QSPI:
\r
1350 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1351 ALT_CLK_OSC1 : ALT_CLK_MAIN_PLL_C3;
\r
1353 case ALT_CLK_MAIN_NAND_SDMMC:
\r
1354 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1355 ALT_CLK_OSC1 : ALT_CLK_MAIN_PLL_C4;
\r
1358 case ALT_CLK_H2F_USER0:
\r
1359 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1360 ALT_CLK_OSC1 : ALT_CLK_MAIN_PLL_C5;
\r
1363 // Peripherals Clock Group
\r
1364 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
1365 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
1366 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
1367 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
1368 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
1369 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
1370 // if the clock comes from periph_base_clk
\r
1371 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1372 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL;
\r
1375 case ALT_CLK_EMAC0:
\r
1376 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1377 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C0;
\r
1380 case ALT_CLK_EMAC1:
\r
1381 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1382 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C1;
\r
1385 case ALT_CLK_USB_MP:
\r
1386 case ALT_CLK_SPI_M:
\r
1387 case ALT_CLK_CAN0:
\r
1388 case ALT_CLK_CAN1:
\r
1389 case ALT_CLK_GPIO_DB:
\r
1390 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1391 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C4;
\r
1394 case ALT_CLK_H2F_USER1:
\r
1395 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1396 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C5;
\r
1399 case ALT_CLK_SDMMC:
\r
1400 temp = ALT_CLKMGR_PERPLL_SRC_SDMMC_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
1401 if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_F2S_PERIPH_REF_CLK)
\r
1403 ret = ALT_CLK_F2H_PERIPH_REF;
\r
1405 else if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_MAIN_NAND_CLK)
\r
1407 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1408 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C4;
\r
1410 else if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_PERIPH_NAND_CLK)
\r
1412 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1413 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C3;
\r
1417 case ALT_CLK_NAND_X:
\r
1418 case ALT_CLK_NAND:
\r
1419 temp = ALT_CLKMGR_PERPLL_SRC_NAND_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
1420 if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_F2S_PERIPH_REF_CLK)
\r
1422 ret = ALT_CLK_F2H_PERIPH_REF;
\r
1424 else if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_MAIN_NAND_CLK)
\r
1426 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1427 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C4;
\r
1429 else if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_PERIPH_NAND_CLK)
\r
1431 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1432 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C3;
\r
1436 case ALT_CLK_QSPI:
\r
1437 temp = ALT_CLKMGR_PERPLL_SRC_QSPI_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
1438 if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_F2S_PERIPH_REF_CLK)
\r
1440 ret = ALT_CLK_F2H_PERIPH_REF;
\r
1442 else if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_MAIN_QSPI_CLK)
\r
1444 ret = (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE) ?
\r
1445 ALT_CLK_IN_PIN_OSC1 : ALT_CLK_MAIN_PLL_C3;
\r
1447 else if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_PERIPH_QSPI_CLK)
\r
1449 ret = (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE) ?
\r
1450 alt_clk_pll_source_get(ALT_CLK_PERIPHERAL_PLL) : ALT_CLK_PERIPHERAL_PLL_C2;
\r
1454 // SDRAM Clock Group
\r
1455 case ALT_CLK_SDRAM_PLL_C0:
\r
1456 case ALT_CLK_SDRAM_PLL_C1:
\r
1457 case ALT_CLK_SDRAM_PLL_C2:
\r
1458 case ALT_CLK_SDRAM_PLL_C3:
\r
1459 case ALT_CLK_SDRAM_PLL_C4:
\r
1460 case ALT_CLK_SDRAM_PLL_C5:
\r
1461 ret = (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE) ?
\r
1462 alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL) : ALT_CLK_SDRAM_PLL;
\r
1464 case ALT_CLK_DDR_DQS:
\r
1465 ret = (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE) ?
\r
1466 alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL) : ALT_CLK_SDRAM_PLL_C0;
\r
1468 case ALT_CLK_DDR_2X_DQS:
\r
1469 ret = (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE) ?
\r
1470 alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL) : ALT_CLK_SDRAM_PLL_C1;
\r
1472 case ALT_CLK_DDR_DQ:
\r
1473 ret = (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE) ?
\r
1474 alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL) : ALT_CLK_SDRAM_PLL_C2;
\r
1476 case ALT_CLK_H2F_USER2:
\r
1477 ret = (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE) ?
\r
1478 alt_clk_pll_source_get(ALT_CLK_SDRAM_PLL) : ALT_CLK_SDRAM_PLL_C5;
\r
1481 // Clock Output Pins
\r
1482 case ALT_CLK_OUT_PIN_EMAC0_TX:
\r
1483 case ALT_CLK_OUT_PIN_EMAC1_TX:
\r
1484 case ALT_CLK_OUT_PIN_SDMMC:
\r
1485 case ALT_CLK_OUT_PIN_I2C0_SCL:
\r
1486 case ALT_CLK_OUT_PIN_I2C1_SCL:
\r
1487 case ALT_CLK_OUT_PIN_I2C2_SCL:
\r
1488 case ALT_CLK_OUT_PIN_I2C3_SCL:
\r
1489 case ALT_CLK_OUT_PIN_SPIM0:
\r
1490 case ALT_CLK_OUT_PIN_SPIM1:
\r
1491 case ALT_CLK_OUT_PIN_QSPI:
\r
1492 ret = ALT_CLK_UNKNOWN;
\r
1496 ret = ALT_CLK_UNKNOWN;
\r
1504 // alt_clk_source_set() sets the specified clock's input reference clock source
\r
1505 // selection to the specified input. It does not handle gating the specified clock
\r
1506 // off and back on, those are covered in other functions in this API, but it does
\r
1507 // verify that the clock is off before changing the divider or PLL. Note that the PLL
\r
1508 // must have regained phase-lock before being the bypass is disabled.
\r
1510 ALT_STATUS_CODE alt_clk_source_set(ALT_CLK_t clk, ALT_CLK_t ref_clk)
\r
1512 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
1515 if (ALT_CLK_MAIN_PLL == clk)
\r
1517 if ((ref_clk == ALT_CLK_IN_PIN_OSC1) || (ref_clk == ALT_CLK_OSC1))
\r
1519 // ret = ALT_E_SUCCESS;
\r
1523 status = ALT_E_BAD_ARG;
\r
1526 else if (ALT_CLK_PERIPHERAL_PLL == clk)
\r
1528 // the PLL must be bypassed before getting here
\r
1529 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
1530 temp &= ALT_CLKMGR_PERPLL_VCO_PSRC_CLR_MSK;
\r
1532 if ((ref_clk == ALT_CLK_IN_PIN_OSC1) || (ref_clk == ALT_CLK_OSC1))
\r
1534 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1);
\r
1535 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp);
\r
1537 else if (ref_clk == ALT_CLK_IN_PIN_OSC2)
\r
1539 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2);
\r
1540 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp);
\r
1542 else if (ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
1544 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF);
\r
1545 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp);
\r
1549 status = ALT_E_INV_OPTION;
\r
1552 else if (ALT_CLK_SDRAM_PLL == clk)
\r
1554 temp = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
1555 temp &= ALT_CLKMGR_SDRPLL_VCO_SSRC_CLR_MSK;
\r
1557 if ((ref_clk == ALT_CLK_IN_PIN_OSC1) || (ref_clk == ALT_CLK_OSC1))
\r
1559 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1);
\r
1560 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp);
\r
1562 else if (ref_clk == ALT_CLK_IN_PIN_OSC2)
\r
1564 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2);
\r
1565 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp);
\r
1567 else if (ref_clk == ALT_CLK_F2H_SDRAM_REF)
\r
1569 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF);
\r
1570 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp);
\r
1574 status = ALT_E_INV_OPTION;
\r
1577 else if ( ALT_CLK_L4_MP == clk)
\r
1579 // clock is gated off
\r
1580 if (ref_clk == ALT_CLK_MAIN_PLL_C1)
\r
1582 alt_clrbits_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR, ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK);
\r
1584 else if (ref_clk == ALT_CLK_PERIPHERAL_PLL_C4)
\r
1586 alt_setbits_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR, ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK);
\r
1590 status = ALT_E_INV_OPTION;
\r
1593 else if ( ALT_CLK_L4_SP == clk)
\r
1595 if (ref_clk == ALT_CLK_MAIN_PLL_C1)
\r
1597 alt_clrbits_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR, ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK);
\r
1599 else if (ref_clk == ALT_CLK_PERIPHERAL_PLL_C4)
\r
1601 alt_setbits_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR, ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK);
\r
1605 status = ALT_E_INV_OPTION;
\r
1608 else if (ALT_CLK_SDMMC == clk)
\r
1610 temp = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
1611 temp &= ALT_CLKMGR_PERPLL_SRC_SDMMC_CLR_MSK;
\r
1613 if (ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
1615 temp |= ALT_CLKMGR_PERPLL_SRC_SDMMC_SET(ALT_CLKMGR_PERPLL_SRC_SDMMC_E_F2S_PERIPH_REF_CLK);
\r
1616 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1618 else if ((ref_clk == ALT_CLK_MAIN_PLL_C4) || (ref_clk == ALT_CLK_MAIN_NAND_SDMMC))
\r
1620 temp |= ALT_CLKMGR_PERPLL_SRC_SDMMC_SET(ALT_CLKMGR_PERPLL_SRC_SDMMC_E_MAIN_NAND_CLK);
\r
1621 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1623 else if (ref_clk == ALT_CLK_PERIPHERAL_PLL_C3)
\r
1625 temp |= ALT_CLKMGR_PERPLL_SRC_SDMMC_SET(ALT_CLKMGR_PERPLL_SRC_SDMMC_E_PERIPH_NAND_CLK);
\r
1626 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1630 status = ALT_E_INV_OPTION;
\r
1633 else if ((ALT_CLK_NAND_X == clk) || ( ALT_CLK_NAND == clk))
\r
1635 temp = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
1636 temp &= ALT_CLKMGR_PERPLL_SRC_NAND_CLR_MSK;
\r
1638 if (ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
1640 temp |= ALT_CLKMGR_PERPLL_SRC_NAND_SET(ALT_CLKMGR_PERPLL_SRC_NAND_E_F2S_PERIPH_REF_CLK);
\r
1641 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1643 else if ((ref_clk == ALT_CLK_MAIN_PLL_C4) || (ref_clk == ALT_CLK_MAIN_NAND_SDMMC))
\r
1645 temp |= ALT_CLKMGR_PERPLL_SRC_NAND_SET(ALT_CLKMGR_PERPLL_SRC_NAND_E_MAIN_NAND_CLK);
\r
1646 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1648 else if (ref_clk == ALT_CLK_PERIPHERAL_PLL_C3)
\r
1650 temp |= ALT_CLKMGR_PERPLL_SRC_NAND_SET(ALT_CLKMGR_PERPLL_SRC_NAND_E_PERIPH_NAND_CLK);
\r
1651 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1655 status = ALT_E_INV_OPTION;
\r
1658 else if (ALT_CLK_QSPI == clk)
\r
1660 temp = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
1661 temp &= ALT_CLKMGR_PERPLL_SRC_QSPI_CLR_MSK;
\r
1663 if (ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
1665 temp |= ALT_CLKMGR_PERPLL_SRC_QSPI_SET(ALT_CLKMGR_PERPLL_SRC_QSPI_E_F2S_PERIPH_REF_CLK);
\r
1666 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1668 else if ((ref_clk == ALT_CLK_MAIN_PLL_C3) || (ref_clk == ALT_CLK_MAIN_QSPI))
\r
1670 temp |= ALT_CLKMGR_PERPLL_SRC_QSPI_SET(ALT_CLKMGR_PERPLL_SRC_QSPI_E_MAIN_QSPI_CLK);
\r
1671 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1673 else if (ref_clk == ALT_CLK_PERIPHERAL_PLL_C2)
\r
1675 temp |= ALT_CLKMGR_PERPLL_SRC_QSPI_SET(ALT_CLKMGR_PERPLL_SRC_QSPI_E_PERIPH_QSPI_CLK);
\r
1676 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, temp);
\r
1680 status = ALT_E_INV_OPTION;
\r
1688 // alt_clk_ext_clk_freq_set() specifies the frequency of the external clock source as
\r
1689 // a measure of Hz. This value is stored in a static array and used for calculations.
\r
1690 // The supplied frequency should be within the Fmin and Fmax values allowed for the
\r
1691 // external clock source.
\r
1693 ALT_STATUS_CODE alt_clk_ext_clk_freq_set(ALT_CLK_t clk, alt_freq_t freq)
\r
1695 ALT_STATUS_CODE status = ALT_E_BAD_ARG;
\r
1697 if ((clk == ALT_CLK_IN_PIN_OSC1) || (clk == ALT_CLK_OSC1)) // two names for one input
\r
1699 if ((freq >= alt_ext_clk_paramblok.clkosc1.freqmin) && (freq <= alt_ext_clk_paramblok.clkosc1.freqmax))
\r
1701 alt_ext_clk_paramblok.clkosc1.freqcur = freq;
\r
1702 status = ALT_E_SUCCESS;
\r
1706 status = ALT_E_ARG_RANGE;
\r
1709 else if (clk == ALT_CLK_IN_PIN_OSC2) // the other clock input pin
\r
1711 if ((freq >= alt_ext_clk_paramblok.clkosc2.freqmin) && (freq <= alt_ext_clk_paramblok.clkosc2.freqmax))
\r
1713 alt_ext_clk_paramblok.clkosc2.freqcur = freq;
\r
1714 status = ALT_E_SUCCESS;
\r
1718 status = ALT_E_ARG_RANGE;
\r
1721 else if (clk == ALT_CLK_F2H_PERIPH_REF) // clock from the FPGA
\r
1723 if ((freq >= alt_ext_clk_paramblok.periph.freqmin) && (freq <= alt_ext_clk_paramblok.periph.freqmax))
\r
1725 alt_ext_clk_paramblok.periph.freqcur = freq;
\r
1726 status = ALT_E_SUCCESS;
\r
1730 status = ALT_E_ARG_RANGE;
\r
1733 else if (clk == ALT_CLK_F2H_SDRAM_REF) // clock from the FPGA SDRAM
\r
1735 if ((freq >= alt_ext_clk_paramblok.sdram.freqmin) && (freq <= alt_ext_clk_paramblok.sdram.freqmax))
\r
1737 alt_ext_clk_paramblok.sdram.freqcur = freq;
\r
1738 status = ALT_E_SUCCESS;
\r
1742 status = ALT_E_ARG_RANGE;
\r
1747 status = ALT_E_BAD_ARG;
\r
1755 // alt_clk_ext_clk_freq_get returns the frequency of the external clock source as
\r
1756 // a measure of Hz. This value is stored in a static array.
\r
1758 alt_freq_t alt_clk_ext_clk_freq_get(ALT_CLK_t clk)
\r
1762 if ((clk == ALT_CLK_IN_PIN_OSC1) || (clk == ALT_CLK_OSC1)) // two names for one input
\r
1764 ret = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
1766 else if (clk == ALT_CLK_IN_PIN_OSC2)
\r
1768 ret = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
1770 else if (clk == ALT_CLK_F2H_PERIPH_REF) // clock from the FPGA
\r
1772 ret = alt_ext_clk_paramblok.periph.freqcur;
\r
1774 else if (clk == ALT_CLK_F2H_SDRAM_REF) // clock from the FPGA
\r
1776 ret = alt_ext_clk_paramblok.sdram.freqcur;
\r
1783 // alt_clk_pll_cfg_get() returns the current PLL configuration.
\r
1785 ALT_STATUS_CODE alt_clk_pll_cfg_get(ALT_CLK_t pll, ALT_CLK_PLL_CFG_t * pll_cfg)
\r
1787 ALT_STATUS_CODE ret = ALT_E_ERROR; // return value
\r
1788 uint32_t temp; // temp variable
\r
1790 if (pll_cfg == NULL)
\r
1792 ret = ALT_E_BAD_ARG;
\r
1796 if (pll == ALT_CLK_MAIN_PLL)
\r
1798 temp = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
1799 pll_cfg->ref_clk = ALT_CLK_IN_PIN_OSC1;
\r
1800 pll_cfg->mult = ALT_CLKMGR_MAINPLL_VCO_NUMER_GET(temp);
\r
1801 pll_cfg->div = ALT_CLKMGR_MAINPLL_VCO_DENOM_GET(temp);
\r
1803 // Get the C0-C5 divider values:
\r
1804 pll_cfg->cntrs[0] = ALT_CLKMGR_MAINPLL_MPUCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MPUCLK_ADDR));
\r
1807 pll_cfg->cntrs[1] = ALT_CLKMGR_MAINPLL_MAINCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MAINCLK_ADDR));
\r
1810 pll_cfg->cntrs[2] = ALT_CLKMGR_MAINPLL_DBGATCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR));
\r
1811 // C2 - dbg_base_clk
\r
1813 pll_cfg->cntrs[3] = ALT_CLKMGR_MAINPLL_MAINQSPICLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR));
\r
1814 // C3 - main_qspi_clk
\r
1816 pll_cfg->cntrs[4] = ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR));
\r
1817 // C4 - main_nand_sdmmc_clk
\r
1819 pll_cfg->cntrs[5] = ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR));
\r
1820 // C5 - cfg_s2f_user0_clk aka cfg_h2f_user0_clk
\r
1822 // The Main PLL C0-C5 outputs have no phase shift capabilities :
\r
1823 pll_cfg->pshift[0] = pll_cfg->pshift[1] = pll_cfg->pshift[2] =
\r
1824 pll_cfg->pshift[3] = pll_cfg->pshift[4] = pll_cfg->pshift[5] = 0;
\r
1825 ret = ALT_E_SUCCESS;
\r
1827 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
1829 temp = ALT_CLKMGR_PERPLL_VCO_PSRC_GET(alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR));
\r
1832 if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1)
\r
1834 pll_cfg->ref_clk = ALT_CLK_IN_PIN_OSC1;
\r
1836 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2)
\r
1838 pll_cfg->ref_clk = ALT_CLK_IN_PIN_OSC2;
\r
1840 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF)
\r
1842 pll_cfg->ref_clk = ALT_CLK_F2H_PERIPH_REF;
\r
1845 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
1846 pll_cfg->mult = ALT_CLKMGR_PERPLL_VCO_NUMER_GET(temp);
\r
1847 pll_cfg->div = ALT_CLKMGR_PERPLL_VCO_DENOM_GET(temp);
\r
1849 // Get the C0-C5 divider values:
\r
1850 pll_cfg->cntrs[0] = ALT_CLKMGR_PERPLL_EMAC0CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR));
\r
1853 pll_cfg->cntrs[1] = ALT_CLKMGR_PERPLL_EMAC1CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR));
\r
1856 pll_cfg->cntrs[2] = ALT_CLKMGR_PERPLL_PERQSPICLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR));
\r
1857 // C2 - periph_qspi_clk
\r
1859 pll_cfg->cntrs[3] = ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR));
\r
1860 // C3 - periph_nand_sdmmc_clk
\r
1862 pll_cfg->cntrs[4] = ALT_CLKMGR_PERPLL_PERBASECLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR));
\r
1863 // C4 - periph_base_clk
\r
1865 pll_cfg->cntrs[5] = ALT_CLKMGR_PERPLL_S2FUSER1CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR));
\r
1866 // C5 - s2f_user1_clk
\r
1868 // The Peripheral PLL C0-C5 outputs have no phase shift capabilities :
\r
1869 pll_cfg->pshift[0] = pll_cfg->pshift[1] = pll_cfg->pshift[2] =
\r
1870 pll_cfg->pshift[3] = pll_cfg->pshift[4] = pll_cfg->pshift[5] = 0;
\r
1871 ret = ALT_E_SUCCESS;
\r
1874 else if (pll == ALT_CLK_SDRAM_PLL)
\r
1876 temp = ALT_CLKMGR_SDRPLL_VCO_SSRC_GET(alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR));
\r
1879 if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1)
\r
1881 pll_cfg->ref_clk = ALT_CLK_IN_PIN_OSC1;
\r
1883 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2)
\r
1885 pll_cfg->ref_clk = ALT_CLK_IN_PIN_OSC2;
\r
1887 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF)
\r
1889 pll_cfg->ref_clk = ALT_CLK_F2H_SDRAM_REF;
\r
1892 pll_cfg->mult = ALT_CLKMGR_SDRPLL_VCO_NUMER_GET(alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR));
\r
1893 pll_cfg->div = ALT_CLKMGR_SDRPLL_VCO_DENOM_GET(alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR));
\r
1895 // Get the C0-C5 divider values:
\r
1896 pll_cfg->cntrs[0] = ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR));
\r
1897 pll_cfg->pshift[0] = ALT_CLKMGR_SDRPLL_DDRDQSCLK_PHASE_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR));
\r
1898 // C0 - ddr_dqs_clk
\r
1900 pll_cfg->cntrs[1] = ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR));
\r
1901 pll_cfg->pshift[1] = ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_PHASE_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR));
\r
1902 // C1 - ddr_2x_dqs_clk
\r
1904 pll_cfg->cntrs[2] = ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR));
\r
1905 pll_cfg->pshift[2] = ALT_CLKMGR_SDRPLL_DDRDQCLK_PHASE_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR));
\r
1906 // C2 - ddr_dq_clk
\r
1908 pll_cfg->cntrs[3] = pll_cfg->cntrs[4] = pll_cfg->pshift[3] = pll_cfg->pshift[4] = 0;
\r
1909 // C3 & C4 outputs don't exist on the SDRAM PLL
\r
1911 pll_cfg->cntrs[5] = ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR));
\r
1912 pll_cfg->pshift[5] = ALT_CLKMGR_SDRPLL_S2FUSER2CLK_PHASE_GET(alt_read_word(ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR));
\r
1913 // C5 - s2f_user2_clk or h2f_user2_clk
\r
1915 ret = ALT_E_SUCCESS;
\r
1924 // alt_clk_pll_cfg_set() sets the PLL configuration using the configuration parameters
\r
1925 // specified in pll_cfg.
\r
1927 ALT_STATUS_CODE alt_clk_pll_cfg_set(ALT_CLK_t pll, const ALT_CLK_PLL_CFG_t * pll_cfg)
\r
1929 if (pll_cfg == NULL)
\r
1931 return ALT_E_BAD_ARG;
\r
1934 if (alt_clk_pll_is_bypassed(pll) != ALT_E_TRUE) // safe to write the PLL registers?
\r
1936 return ALT_E_ERROR;
\r
1939 ALT_STATUS_CODE ret = ALT_E_ERROR;
\r
1942 if (pll == ALT_CLK_MAIN_PLL)
\r
1944 temp = (ALT_CLKMGR_MAINPLL_VCO_NUMER_CLR_MSK & ALT_CLKMGR_MAINPLL_VCO_DENOM_CLR_MSK)
\r
1945 & alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
1946 temp |= ALT_CLKMGR_MAINPLL_VCO_NUMER_SET(pll_cfg->mult) |
\r
1947 ALT_CLKMGR_MAINPLL_VCO_DENOM_SET(pll_cfg->div);
\r
1949 alt_write_word(ALT_CLKMGR_MAINPLL_VCO_ADDR, temp);
\r
1950 alt_write_word(ALT_CLKMGR_ALTERA_MPUCLK_ADDR, pll_cfg->cntrs[0]);
\r
1951 alt_write_word(ALT_CLKMGR_ALTERA_MAINCLK_ADDR, pll_cfg->cntrs[1]);
\r
1952 alt_write_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR, pll_cfg->cntrs[2]);
\r
1953 alt_write_word(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR, pll_cfg->cntrs[3]);
\r
1954 alt_write_word(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR, pll_cfg->cntrs[4]);
\r
1955 alt_write_word(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR, pll_cfg->cntrs[5]);
\r
1956 ret = ALT_E_SUCCESS;
\r
1958 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
1960 temp = ALT_CLKMGR_PERPLL_VCO_NUMER_CLR_MSK & ALT_CLKMGR_PERPLL_VCO_DENOM_CLR_MSK
\r
1961 & ALT_CLKMGR_PERPLL_VCO_PSRC_CLR_MSK;
\r
1962 temp &= alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
1963 temp |= ALT_CLKMGR_PERPLL_VCO_NUMER_SET(pll_cfg->mult)
\r
1964 | ALT_CLKMGR_PERPLL_VCO_DENOM_SET(pll_cfg->div);
\r
1966 if ((pll_cfg->ref_clk == ALT_CLK_IN_PIN_OSC1) || (pll_cfg->ref_clk == ALT_CLK_OSC1))
\r
1968 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1);
\r
1970 else if (pll_cfg->ref_clk == ALT_CLK_IN_PIN_OSC2)
\r
1972 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2);
\r
1974 else if (pll_cfg->ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
1976 temp |= ALT_CLKMGR_PERPLL_VCO_PSRC_SET(ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF);
\r
1983 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, temp);
\r
1984 alt_write_word(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR, pll_cfg->cntrs[0]);
\r
1985 alt_write_word(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR, pll_cfg->cntrs[1]);
\r
1986 alt_write_word(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR, pll_cfg->cntrs[2]);
\r
1987 alt_write_word(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR, pll_cfg->cntrs[3]);
\r
1988 alt_write_word(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR, pll_cfg->cntrs[4]);
\r
1989 alt_write_word(ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR, pll_cfg->cntrs[5]);
\r
1990 ret = ALT_E_SUCCESS;
\r
1992 else if (pll == ALT_CLK_SDRAM_PLL)
\r
1994 // write the SDRAM PLL VCO Counter -----------------------------
\r
1995 temp = ALT_CLKMGR_SDRPLL_VCO_NUMER_CLR_MSK & ALT_CLKMGR_SDRPLL_VCO_DENOM_CLR_MSK
\r
1996 & ALT_CLKMGR_SDRPLL_VCO_SSRC_CLR_MSK; // make a mask
\r
1997 temp &= alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
1998 temp |= ALT_CLKMGR_SDRPLL_VCO_NUMER_SET(pll_cfg->mult)
\r
1999 | ALT_CLKMGR_SDRPLL_VCO_DENOM_SET(pll_cfg->div)
\r
2000 | ALT_CLKMGR_SDRPLL_VCO_OUTRSTALL_SET_MSK;
\r
2001 // setting this bit aligns the output phase of the counters and prevents
\r
2002 // glitches and too-short clock periods when restarting.
\r
2003 // this bit is cleared at the end of this routine
\r
2005 if ((pll_cfg->ref_clk == ALT_CLK_IN_PIN_OSC1) || (pll_cfg->ref_clk == ALT_CLK_OSC1))
\r
2007 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1);
\r
2009 else if (pll_cfg->ref_clk == ALT_CLK_IN_PIN_OSC2)
\r
2011 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2);
\r
2013 else if (pll_cfg->ref_clk == ALT_CLK_F2H_PERIPH_REF)
\r
2015 temp |= ALT_CLKMGR_SDRPLL_VCO_SSRC_SET(ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF);
\r
2022 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, temp);
\r
2024 // write the SDRAM PLL C0 Divide Counter -----------------------------
\r
2025 temp = ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_SET(pll_cfg->cntrs[0])
\r
2026 | ALT_CLKMGR_SDRPLL_DDRDQSCLK_PHASE_SET(pll_cfg->pshift[0]);
\r
2028 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR, ALT_CLKMGR_STAT_ADDR,
\r
2029 ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR, temp,
\r
2030 ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_SET_MSK | ALT_CLKMGR_SDRPLL_DDRDQSCLK_PHASE_SET_MSK,
\r
2031 ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_LSB);
\r
2033 // write the SDRAM PLL C1 Divide Counter -----------------------------
\r
2034 if (ret == ALT_E_SUCCESS)
\r
2036 temp = ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_SET(pll_cfg->cntrs[1])
\r
2037 | ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_PHASE_SET(pll_cfg->pshift[1]);
\r
2038 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR, ALT_CLKMGR_STAT_ADDR,
\r
2039 ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR, temp,
\r
2040 ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_SET_MSK | ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_PHASE_SET_MSK,
\r
2041 ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_LSB);
\r
2044 // write the SDRAM PLL C2 Divide Counter -----------------------------
\r
2045 if (ret == ALT_E_SUCCESS)
\r
2047 temp = ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_SET(pll_cfg->cntrs[2])
\r
2048 | ALT_CLKMGR_SDRPLL_DDRDQCLK_PHASE_SET(pll_cfg->pshift[2]);
\r
2049 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR, ALT_CLKMGR_STAT_ADDR,
\r
2050 ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR, temp,
\r
2051 ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_SET_MSK | ALT_CLKMGR_SDRPLL_DDRDQCLK_PHASE_SET_MSK,
\r
2052 ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_LSB);
\r
2055 // write the SDRAM PLL C5 Divide Counter -----------------------------
\r
2056 if (ret == ALT_E_SUCCESS)
\r
2058 temp = ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_SET(pll_cfg->cntrs[2])
\r
2059 | ALT_CLKMGR_SDRPLL_S2FUSER2CLK_PHASE_SET(pll_cfg->pshift[2]);
\r
2060 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR, ALT_CLKMGR_STAT_ADDR,
\r
2061 ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR, temp,
\r
2062 ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_SET_MSK | ALT_CLKMGR_SDRPLL_S2FUSER2CLK_PHASE_SET_MSK,
\r
2063 ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_LSB);
\r
2066 if (ret == ALT_E_SUCCESS)
\r
2068 alt_clrbits_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, ALT_CLKMGR_SDRPLL_VCO_OUTRSTALL_SET_MSK);
\r
2069 // allow the phase multiplexer and output counter to leave reset
\r
2078 // alt_clk_pll_vco_cfg_get() returns the current PLL VCO frequency configuration.
\r
2080 ALT_STATUS_CODE alt_clk_pll_vco_cfg_get(ALT_CLK_t pll, uint32_t * mult, uint32_t * div)
\r
2082 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
2085 if ( (mult == NULL) || (div == NULL) )
\r
2087 return ALT_E_BAD_ARG;
\r
2090 if (pll == ALT_CLK_MAIN_PLL)
\r
2092 temp = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
2093 *mult = ALT_CLKMGR_MAINPLL_VCO_NUMER_GET(temp) + 1;
\r
2094 *div = ALT_CLKMGR_MAINPLL_VCO_DENOM_GET(temp) + 1;
\r
2096 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2098 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
2099 *mult = ALT_CLKMGR_PERPLL_VCO_NUMER_GET(temp) + 1;
\r
2100 *div = ALT_CLKMGR_PERPLL_VCO_DENOM_GET(temp) + 1;
\r
2102 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2104 temp = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
2105 *mult = ALT_CLKMGR_SDRPLL_VCO_NUMER_GET(temp) + 1;
\r
2106 *div = ALT_CLKMGR_SDRPLL_VCO_DENOM_GET(temp) + 1;
\r
2110 status = ALT_E_ERROR;
\r
2117 /****************************************************************************************/
\r
2118 /* This enum enumerates a set of possible change methods that are available for use by */
\r
2119 /* alt_clk_pll_vco_cfg_set() to change VCO parameter settings. */
\r
2120 /****************************************************************************************/
\r
2122 typedef enum ALT_CLK_PLL_VCO_CHG_METHOD_e
\r
2124 ALT_VCO_CHG_NONE_VALID = 0, /* No valid method to change PLL
\r
2125 * VCO was found */
\r
2126 ALT_VCO_CHG_NOCHANGE = 0x00000001, /* Proposed new VCO values are the
\r
2127 * same as the old values */
\r
2128 ALT_VCO_CHG_NUM = 0x00000002, /* Can change the VCO multiplier
\r
2130 ALT_VCO_CHG_NUM_BYP = 0x00000004, /* A VCO multiplier-only change will
\r
2131 * require putting the PLL in bypass */
\r
2132 ALT_VCO_CHG_DENOM = 0x00000008, /* Can change the VCO divider
\r
2134 ALT_VCO_CHG_DENOM_BYP = 0x00000010, /* A VCO divider-only change will
\r
2135 * require putting the PLL in bypass */
\r
2136 ALT_VCO_CHG_NUM_DENOM = 0x00000020, /* Can change the clock multiplier
\r
2137 * first. then the clock divider */
\r
2138 ALT_VCO_CHG_NUM_DENOM_BYP = 0x00000040, /* Changing the clock multiplier first.
\r
2139 * then the clock divider will
\r
2140 * require putting the PLL in bypass */
\r
2141 ALT_VCO_CHG_DENOM_NUM = 0x00000080, /* Can change the clock divider first.
\r
2142 * then the clock multiplier */
\r
2143 ALT_VCO_CHG_DENOM_NUM_BYP = 0x00000100 /* Changing the clock divider first.
\r
2144 * then the clock multiplier will
\r
2145 * require putting the PLL in bypass */
\r
2146 } ALT_CLK_PLL_VCO_CHG_METHOD_t;
\r
2150 /****************************************************************************************/
\r
2151 /* alt_clk_pll_vco_chg_methods_get() determines which possible methods to change the */
\r
2152 /* VCO are allowed within the limits set by the maximum PLL multiplier and divider */
\r
2153 /* values and by the upper and lower frequency limits of the PLL, and also determines */
\r
2154 /* whether each of these changes can be made without the PLL losing lock, which */
\r
2155 /* requires the PLL to be bypassed before making changes, and removed from bypass state */
\r
2157 /****************************************************************************************/
\r
2160 #define ALT_CLK_PLL_VCO_CHG_METHOD_TEST_MODE false
\r
2161 // used for testing writes to the PLL VCOs
\r
2165 static ALT_CLK_PLL_VCO_CHG_METHOD_t alt_clk_pll_vco_chg_methods_get(ALT_CLK_t pll,
\r
2166 uint32_t mult, uint32_t div )
\r
2168 #if ALT_CLK_PLL_VCO_CHG_METHOD_TEST_MODE
\r
2170 // used for testing
\r
2171 return ALT_VCO_CHG_NOCHANGE;
\r
2175 // check PLL max value limits
\r
2176 if ( (mult == 0) || (mult > ALT_CLK_PLL_MULT_MAX)
\r
2177 || (div == 0) || (div > ALT_CLK_PLL_DIV_MAX)
\r
2180 return ALT_VCO_CHG_NONE_VALID;
\r
2183 ALT_CLK_PLL_VCO_CHG_METHOD_t ret = ALT_VCO_CHG_NONE_VALID;
\r
2189 uint32_t inputfreq;
\r
2190 uint32_t guardband;
\r
2191 bool numerchg = false;
\r
2192 bool denomchg = false;
\r
2195 // gather data values according to PLL
\r
2196 if (pll == ALT_CLK_MAIN_PLL)
\r
2198 temp = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
2200 numer = ALT_CLKMGR_MAINPLL_VCO_NUMER_GET(temp);
\r
2201 denom = ALT_CLKMGR_MAINPLL_VCO_DENOM_GET(temp);
\r
2203 freqmax = alt_pll_clk_paramblok.MainPLL_800.freqmax;
\r
2204 freqmin = alt_pll_clk_paramblok.MainPLL_800.freqmin;
\r
2205 guardband = alt_pll_clk_paramblok.MainPLL_800.guardband;
\r
2207 inputfreq = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2210 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2212 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
2214 numer = ALT_CLKMGR_PERPLL_VCO_NUMER_GET(temp);
\r
2215 denom = ALT_CLKMGR_PERPLL_VCO_DENOM_GET(temp);
\r
2217 freqmax = alt_pll_clk_paramblok.PeriphPLL_800.freqmax;
\r
2218 freqmin = alt_pll_clk_paramblok.PeriphPLL_800.freqmin;
\r
2219 guardband = alt_pll_clk_paramblok.PeriphPLL_800.guardband;
\r
2221 temp = ALT_CLKMGR_PERPLL_VCO_PSRC_GET(temp);
\r
2222 if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1)
\r
2224 inputfreq = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2226 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2)
\r
2228 inputfreq = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
2230 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF)
\r
2232 inputfreq = alt_ext_clk_paramblok.periph.freqcur;
\r
2240 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2242 temp = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
2244 numer = ALT_CLKMGR_SDRPLL_VCO_NUMER_GET(temp);
\r
2245 denom = ALT_CLKMGR_SDRPLL_VCO_DENOM_GET(temp);
\r
2247 freqmax = alt_pll_clk_paramblok.SDRAMPLL_800.freqmax;
\r
2248 freqmin = alt_pll_clk_paramblok.SDRAMPLL_800.freqmin;
\r
2249 guardband = alt_pll_clk_paramblok.SDRAMPLL_800.guardband;
\r
2251 temp = ALT_CLKMGR_SDRPLL_VCO_SSRC_GET(temp);
\r
2252 if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1)
\r
2254 inputfreq = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2256 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2)
\r
2258 inputfreq = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
2260 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF)
\r
2262 inputfreq = alt_ext_clk_paramblok.sdram.freqcur;
\r
2274 temp = mult * (inputfreq / div);
\r
2275 if ((temp <= freqmax) && (temp >= freqmin)) // are the final values within frequency limits?
\r
2279 numerchg = (mult != numer);
\r
2280 denomchg = (div != denom);
\r
2282 if (!numerchg && !denomchg)
\r
2284 ret = ALT_VCO_CHG_NOCHANGE;
\r
2286 else if (numerchg && !denomchg)
\r
2288 within_gb = alt_within_delta(numer, mult, guardband);
\r
2289 // check if change is within the guardband limits
\r
2290 temp = mult * (inputfreq / denom);
\r
2291 if ((temp <= freqmax) && (temp >= freqmin))
\r
2293 ret = ALT_VCO_CHG_NUM;
\r
2294 if (!within_gb) ret |= ALT_VCO_CHG_NUM_BYP;
\r
2297 else if (!numerchg && denomchg)
\r
2299 within_gb = alt_within_delta(denom, div, guardband);
\r
2300 temp = numer * (inputfreq / div);
\r
2301 if ((temp <= freqmax) && (temp >= freqmin))
\r
2303 ret = ALT_VCO_CHG_DENOM;
\r
2306 ret |= ALT_VCO_CHG_DENOM_BYP;
\r
2310 else //numerchg && denomchg
\r
2312 within_gb = alt_within_delta(numer, mult, guardband);
\r
2313 temp = mult * (inputfreq / denom);
\r
2314 if ((temp <= freqmax) && (temp >= freqmin))
\r
2316 ret = ALT_VCO_CHG_NUM_DENOM;
\r
2319 ret |= ALT_VCO_CHG_NUM_DENOM_BYP;
\r
2322 within_gb = alt_within_delta(denom, div, guardband);
\r
2323 temp = numer * (inputfreq / div);
\r
2324 if ((temp <= freqmax) && (temp >= freqmin))
\r
2326 ret = ALT_VCO_CHG_DENOM_NUM;
\r
2329 ret |= ALT_VCO_CHG_DENOM_NUM_BYP;
\r
2340 /****************************************************************************************/
\r
2341 /* alt_clk_pll_vco_cfg_set() sets the PLL VCO frequency configuration using the */
\r
2342 /* supplied multiplier and divider arguments. alt_clk_pll_vco_chg_methods_get() */
\r
2343 /* determines which methods are allowed by the limits set by the maximum multiplier */
\r
2344 /* and divider values and by the upper and lower frequency limits of the PLL, and also */
\r
2345 /* determines whether these changes can be made without requiring the PLL to be */
\r
2346 /* bypassed. alt_clk_pll_vco_cfg_set() then carries out the actions required to effect */
\r
2347 /* the method chosen to change the VCO settings. */
\r
2348 /****************************************************************************************/
\r
2350 ALT_STATUS_CODE alt_clk_pll_vco_cfg_set(ALT_CLK_t pll, uint32_t mult, uint32_t div)
\r
2352 ALT_STATUS_CODE ret = ALT_E_ERROR;
\r
2353 ALT_CLK_PLL_VCO_CHG_METHOD_t method;
\r
2356 uint32_t numermask, denommask;
\r
2357 uint32_t numershift, denomshift;
\r
2360 method = alt_clk_pll_vco_chg_methods_get(pll, mult, div);
\r
2362 if (method == ALT_VCO_CHG_NONE_VALID)
\r
2364 ret = ALT_E_BAD_CLK;
\r
2366 else if (method == ALT_VCO_CHG_NOCHANGE)
\r
2368 ret = ALT_E_INV_OPTION;
\r
2372 if (pll == ALT_CLK_MAIN_PLL)
\r
2374 vaddr = ALT_CLKMGR_MAINPLL_VCO_ADDR;
\r
2375 numermask = ALT_CLKMGR_MAINPLL_VCO_NUMER_SET_MSK;
\r
2376 denommask = ALT_CLKMGR_MAINPLL_VCO_DENOM_SET_MSK;
\r
2377 numershift = ALT_CLKMGR_MAINPLL_VCO_NUMER_LSB;
\r
2378 denomshift = ALT_CLKMGR_MAINPLL_VCO_DENOM_LSB;
\r
2380 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2382 vaddr = ALT_CLKMGR_PERPLL_VCO_ADDR;
\r
2383 numermask = ALT_CLKMGR_PERPLL_VCO_NUMER_SET_MSK;
\r
2384 denommask = ALT_CLKMGR_PERPLL_VCO_DENOM_SET_MSK;
\r
2385 numershift = ALT_CLKMGR_PERPLL_VCO_NUMER_LSB;
\r
2386 denomshift = ALT_CLKMGR_PERPLL_VCO_DENOM_LSB;
\r
2388 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2390 vaddr = ALT_CLKMGR_SDRPLL_VCO_ADDR;
\r
2391 numermask = ALT_CLKMGR_SDRPLL_VCO_NUMER_SET_MSK;
\r
2392 denommask = ALT_CLKMGR_SDRPLL_VCO_DENOM_SET_MSK;
\r
2393 numershift = ALT_CLKMGR_SDRPLL_VCO_NUMER_LSB;
\r
2394 denomshift = ALT_CLKMGR_SDRPLL_VCO_DENOM_LSB;
\r
2396 else { return ALT_E_BAD_ARG; }
\r
2401 if (method & ALT_VCO_CHG_NUM)
\r
2403 if (method & ALT_VCO_CHG_NUM_BYP)
\r
2405 alt_clk_pll_bypass_enable(pll, 0);
\r
2407 alt_clk_mgr_wait(vaddr, ALT_SW_MANAGED_CLK_WAIT_BYPASS);
\r
2409 alt_replbits_word(vaddr, numermask, mult << numershift);
\r
2412 else if (method & ALT_VCO_CHG_DENOM)
\r
2414 if (method & ALT_VCO_CHG_DENOM_BYP)
\r
2416 alt_clk_pll_bypass_enable(pll, 0);
\r
2419 alt_replbits_word(vaddr, denommask, div << denomshift);
\r
2422 else if (method & ALT_VCO_CHG_NUM_DENOM)
\r
2424 if (method & ALT_VCO_CHG_NUM_DENOM_BYP)
\r
2426 alt_clk_pll_bypass_enable(pll, 0);
\r
2429 alt_replbits_word(vaddr, numermask, mult << numershift);
\r
2430 if (!byp) // if PLL is not bypassed
\r
2432 ret = alt_clk_pll_lock_wait(ALT_CLK_MAIN_PLL, 1000);
\r
2433 // verify PLL is still locked or wait for it to lock again
\r
2435 alt_replbits_word(vaddr, denommask, div << denomshift);
\r
2438 else if (method & ALT_VCO_CHG_DENOM_NUM)
\r
2440 if (method & ALT_VCO_CHG_DENOM_NUM_BYP)
\r
2442 alt_clk_pll_bypass_enable(pll, 0);
\r
2445 alt_replbits_word(vaddr, numermask, mult << numershift);
\r
2446 if (!byp) // if PLL is not bypassed
\r
2448 ret = alt_clk_pll_lock_wait(ALT_CLK_MAIN_PLL, 1000);
\r
2449 // verify PLL is still locked or wait for it to lock again
\r
2451 alt_replbits_word(vaddr, denommask, div << denomshift);
\r
2454 ret = alt_clk_pll_lock_wait(ALT_CLK_MAIN_PLL, 1000);
\r
2455 // verify PLL is still locked or wait for it to lock again
\r
2458 alt_clk_pll_bypass_disable(pll);
\r
2459 alt_clk_mgr_wait(vaddr, ALT_SW_MANAGED_CLK_WAIT_BYPASS);
\r
2460 // wait for PLL to come out of bypass mode completely
\r
2468 // alt_clk_pll_vco_freq_get() gets the VCO frequency of the specified PLL.
\r
2469 // Note that since there is at present no known way for software to obtain the speed
\r
2470 // bin of the SoC or MPU that it is running on, the function below only deals with the
\r
2471 // 800 MHz part. This may need to be revised in the future.
\r
2473 ALT_STATUS_CODE alt_clk_pll_vco_freq_get(ALT_CLK_t pll, alt_freq_t * freq)
\r
2475 uint64_t temp1 = 0;
\r
2479 ALT_STATUS_CODE ret = ALT_E_BAD_ARG;
\r
2486 if (pll == ALT_CLK_MAIN_PLL)
\r
2488 temp = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
2489 numer = ALT_CLKMGR_MAINPLL_VCO_NUMER_GET(temp);
\r
2490 denom = ALT_CLKMGR_MAINPLL_VCO_DENOM_GET(temp);
\r
2491 temp1 = (uint64_t) alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2492 temp1 *= (numer + 1);
\r
2493 temp1 /= (denom + 1);
\r
2495 if (temp1 <= UINT32_MAX)
\r
2497 temp = (alt_freq_t) temp1;
\r
2498 alt_pll_clk_paramblok.MainPLL_800.freqcur = temp;
\r
2499 // store this value in the parameter block table
\r
2501 // should NOT check value against PLL frequency limits
\r
2502 ret = ALT_E_SUCCESS;
\r
2506 ret = ALT_E_ERROR;
\r
2509 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2511 temp = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
2512 numer = ALT_CLKMGR_PERPLL_VCO_NUMER_GET(temp);
\r
2513 denom = ALT_CLKMGR_PERPLL_VCO_DENOM_GET(temp);
\r
2514 temp = ALT_CLKMGR_PERPLL_VCO_PSRC_GET(temp);
\r
2515 if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1)
\r
2517 temp1 = (uint64_t) alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2519 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2)
\r
2521 temp1 = (uint64_t) alt_ext_clk_paramblok.clkosc2.freqcur;
\r
2523 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF)
\r
2525 temp1 = (uint64_t) alt_ext_clk_paramblok.periph.freqcur;
\r
2530 temp1 *= (numer + 1);
\r
2531 temp1 /= (denom + 1);
\r
2532 if (temp1 <= UINT32_MAX)
\r
2534 temp = (alt_freq_t) temp1;
\r
2535 alt_pll_clk_paramblok.PeriphPLL_800.freqcur = temp;
\r
2536 // store this value in the parameter block table
\r
2539 ret = ALT_E_SUCCESS;
\r
2543 ret = ALT_E_ERROR;
\r
2545 } // this returns ALT_BAD_ARG if the source isn't known
\r
2547 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2549 temp = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
2550 numer = ALT_CLKMGR_SDRPLL_VCO_NUMER_GET(temp);
\r
2551 denom = ALT_CLKMGR_SDRPLL_VCO_DENOM_GET(temp);
\r
2552 temp = ALT_CLKMGR_SDRPLL_VCO_SSRC_GET(temp);
\r
2553 if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1)
\r
2555 temp1 = (uint64_t) alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2557 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2)
\r
2559 temp1 = (uint64_t) alt_ext_clk_paramblok.clkosc2.freqcur;
\r
2561 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF)
\r
2563 temp1 = (uint64_t) alt_ext_clk_paramblok.sdram.freqcur;
\r
2568 temp1 *= (numer + 1);
\r
2569 temp1 /= (denom + 1);
\r
2570 if (temp1 <= UINT32_MAX)
\r
2572 temp = (alt_freq_t) temp1;
\r
2573 alt_pll_clk_paramblok.SDRAMPLL_800.freqcur = temp;
\r
2574 // store this value in the parameter block table
\r
2577 ret = ALT_E_SUCCESS;
\r
2581 ret = ALT_E_ERROR;
\r
2584 } // which returns ALT_BAD_ARG if the source isn't known
\r
2590 // Returns the current guard band range in effect for the PLL.
\r
2592 uint32_t alt_clk_pll_guard_band_get(ALT_CLK_t pll)
\r
2596 if (pll == ALT_CLK_MAIN_PLL)
\r
2598 ret = alt_pll_clk_paramblok.MainPLL_800.guardband;
\r
2600 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2602 ret = alt_pll_clk_paramblok.PeriphPLL_800.guardband;
\r
2604 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2606 ret = alt_pll_clk_paramblok.SDRAMPLL_800.guardband;
\r
2612 // clk_mgr_pll_guard_band_set() changes the guard band from its current value to permit
\r
2613 // a more lenient or stringent policy to be in effect for the implementation of the
\r
2614 // functions configuring PLL VCO frequency.
\r
2616 ALT_STATUS_CODE alt_clk_pll_guard_band_set(ALT_CLK_t pll, uint32_t guard_band)
\r
2618 if ( (guard_band > UINT12_MAX) || (guard_band <= 0)
\r
2619 || (guard_band > ALT_GUARDBAND_LIMIT)
\r
2622 return ALT_E_ARG_RANGE;
\r
2625 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
2627 if (pll == ALT_CLK_MAIN_PLL)
\r
2629 alt_pll_clk_paramblok.MainPLL_800.guardband = guard_band;
\r
2630 //alt_pll_clk_paramblok.MainPLL_600.guardband = guard_band;
\r
2631 // ??? Don't know how to check the MPU speed bin yet, so only 800 MHz struct is used
\r
2633 else if (pll == ALT_CLK_PERIPHERAL_PLL)
\r
2635 alt_pll_clk_paramblok.PeriphPLL_800.guardband = guard_band;
\r
2636 //alt_pll_clk_paramblok.PeriphPLL_600.guardband = guard_band;
\r
2638 else if (pll == ALT_CLK_SDRAM_PLL)
\r
2640 alt_pll_clk_paramblok.SDRAMPLL_800.guardband = guard_band;
\r
2641 //alt_pll_clk_paramblok.SDRAMPLL_600.guardband = guard_band;
\r
2645 status = ALT_E_ERROR;
\r
2652 // alt_clk_divider_get() gets configured divider value for the specified clock.
\r
2654 ALT_STATUS_CODE alt_clk_divider_get(ALT_CLK_t clk, uint32_t * div)
\r
2656 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
2661 return ALT_E_BAD_ARG;
\r
2666 // Main PLL outputs
\r
2667 case ALT_CLK_MAIN_PLL_C0:
\r
2669 *div = (ALT_CLKMGR_MAINPLL_MPUCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MPUCLK_ADDR)) + 1) *
\r
2670 (ALT_CLKMGR_ALTERA_MPUCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MPUCLK_ADDR)) + 1);
\r
2673 case ALT_CLK_MAIN_PLL_C1:
\r
2674 case ALT_CLK_L4_MAIN:
\r
2675 case ALT_CLK_L3_MAIN:
\r
2676 *div = (ALT_CLKMGR_MAINPLL_MAINCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINCLK_ADDR)) + 1) *
\r
2677 (ALT_CLKMGR_ALTERA_MAINCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MAINCLK_ADDR)) + 1);
\r
2680 case ALT_CLK_MAIN_PLL_C2:
\r
2681 case ALT_CLK_DBG_BASE:
\r
2682 case ALT_CLK_DBG_TIMER:
\r
2683 *div = (ALT_CLKMGR_MAINPLL_DBGATCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR)) + 1) *
\r
2684 (ALT_CLKMGR_ALTERA_DBGATCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_DBGATCLK_ADDR)) + 1);
\r
2687 case ALT_CLK_MAIN_PLL_C3:
\r
2688 case ALT_CLK_MAIN_QSPI:
\r
2689 *div = (ALT_CLKMGR_MAINPLL_MAINQSPICLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR))) + 1;
\r
2692 case ALT_CLK_MAIN_PLL_C4:
\r
2693 case ALT_CLK_MAIN_NAND_SDMMC:
\r
2694 *div = (ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR))) + 1;
\r
2697 case ALT_CLK_MAIN_PLL_C5:
\r
2699 case ALT_CLK_H2F_USER0:
\r
2700 *div = (ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_CNT_GET(alt_read_word(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR))) + 1;
\r
2705 // Peripheral PLL outputs
\r
2706 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
2707 case ALT_CLK_EMAC0:
\r
2708 *div = (ALT_CLKMGR_PERPLL_EMAC0CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR))) + 1;
\r
2711 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
2712 case ALT_CLK_EMAC1:
\r
2713 *div = (ALT_CLKMGR_PERPLL_EMAC1CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR))) + 1;
\r
2716 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
2717 *div = (ALT_CLKMGR_PERPLL_PERQSPICLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR))) + 1;
\r
2720 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
2721 *div = (ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR))) + 1;
\r
2724 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
2725 *div = (ALT_CLKMGR_PERPLL_PERBASECLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR))) + 1;
\r
2728 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
2729 case ALT_CLK_H2F_USER1:
\r
2730 *div = (ALT_CLKMGR_PERPLL_S2FUSER1CLK_CNT_GET(alt_read_word(ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR))) + 1;
\r
2735 // SDRAM PLL outputs
\r
2736 case ALT_CLK_SDRAM_PLL_C0:
\r
2737 case ALT_CLK_DDR_DQS:
\r
2738 *div = (ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR))) + 1;
\r
2741 case ALT_CLK_SDRAM_PLL_C1:
\r
2742 case ALT_CLK_DDR_2X_DQS:
\r
2743 *div = (ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR))) + 1;
\r
2746 case ALT_CLK_SDRAM_PLL_C2:
\r
2747 case ALT_CLK_DDR_DQ:
\r
2748 *div = (ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR))) + 1;
\r
2751 case ALT_CLK_SDRAM_PLL_C5:
\r
2752 case ALT_CLK_H2F_USER2:
\r
2753 *div = (ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_GET(alt_read_word(ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR))) + 1;
\r
2758 // Other clock dividers
\r
2759 case ALT_CLK_L3_MP:
\r
2760 temp = ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR));
\r
2761 if (temp <= ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_E_DIV2)
\r
2767 status = ALT_E_ERROR;
\r
2771 case ALT_CLK_L3_SP:
\r
2772 temp = ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR));
\r
2773 if (temp <= ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_E_DIV2)
\r
2779 status = ALT_E_ERROR;
\r
2781 // note that this value does not include the additional effect
\r
2782 // of the L3_MP divider that is upchain from this one
\r
2785 case ALT_CLK_L4_MP:
\r
2786 temp = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR));
\r
2787 if (temp <= ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV16)
\r
2793 status = ALT_E_ERROR;
\r
2797 case ALT_CLK_L4_SP:
\r
2798 temp = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR));
\r
2799 if (temp <= ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV16)
\r
2805 status = ALT_E_ERROR;
\r
2809 case ALT_CLK_DBG_AT:
\r
2810 temp = ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR));
\r
2811 if (temp <= ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_E_DIV4)
\r
2817 status = ALT_E_ERROR;
\r
2822 temp = ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR));
\r
2823 if (temp <= ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_E_DIV4)
\r
2829 status = ALT_E_ERROR;
\r
2831 // note that this value does not include the value of the upstream dbg_at_clk divder
\r
2834 case ALT_CLK_DBG_TRACE:
\r
2835 temp = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_GET(alt_read_word(ALT_CLKMGR_MAINPLL_TRACEDIV_ADDR));
\r
2836 if (temp <= ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV16)
\r
2842 status = ALT_E_ERROR;
\r
2846 case ALT_CLK_USB_MP:
\r
2847 temp = ALT_CLKMGR_PERPLL_DIV_USBCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_DIV_ADDR));
\r
2848 if (temp <= ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV16)
\r
2854 status = ALT_E_ERROR;
\r
2858 case ALT_CLK_SPI_M:
\r
2859 temp = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_DIV_ADDR));
\r
2860 if (temp <= ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV16)
\r
2866 status = ALT_E_ERROR;
\r
2870 case ALT_CLK_CAN0:
\r
2871 temp = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_DIV_ADDR));
\r
2872 if (temp <= ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV16)
\r
2878 status = ALT_E_ERROR;
\r
2882 case ALT_CLK_CAN1:
\r
2883 temp = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_DIV_ADDR));
\r
2884 if (temp <= ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV16)
\r
2890 status = ALT_E_ERROR;
\r
2894 case ALT_CLK_GPIO_DB:
\r
2895 temp = ALT_CLKMGR_PERPLL_GPIODIV_GPIODBCLK_GET(alt_read_word(ALT_CLKMGR_PERPLL_GPIODIV_ADDR));
\r
2899 case ALT_CLK_MPU_PERIPH:
\r
2900 *div = 4; // set by hardware
\r
2903 case ALT_CLK_MPU_L2_RAM:
\r
2904 *div = 2; // set by hardware
\r
2907 case ALT_CLK_NAND:
\r
2908 *div = 4; // set by hardware
\r
2912 status = ALT_E_BAD_ARG;
\r
2921 #define ALT_CLK_WITHIN_FREQ_LIMITS_TEST_MODE false
\r
2922 // used for testing writes to the the full range of counters without
\r
2923 // regard to the usual output frequency upper and lower limits
\r
2926 static ALT_STATUS_CODE alt_clk_within_freq_limits(ALT_CLK_t clk, uint32_t div)
\r
2928 #if ALT_CLK_WITHIN_FREQ_LIMITS_TEST_MODE
\r
2929 return ALT_E_TRUE;
\r
2934 return ALT_E_BAD_ARG;
\r
2937 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
2938 uint32_t numer = 0;
\r
2944 // Counters of the Main PLL
\r
2945 case ALT_CLK_MAIN_PLL_C0:
\r
2946 hilimit = alt_pll_cntr_maxfreq.MainPLL_C0;
\r
2947 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2948 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2950 case ALT_CLK_MAIN_PLL_C1:
\r
2951 hilimit = alt_pll_cntr_maxfreq.MainPLL_C1;
\r
2952 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2953 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2955 case ALT_CLK_MAIN_PLL_C2:
\r
2956 hilimit = alt_pll_cntr_maxfreq.MainPLL_C2;
\r
2957 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2958 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2960 case ALT_CLK_MAIN_PLL_C3:
\r
2961 hilimit = alt_pll_cntr_maxfreq.MainPLL_C3;
\r
2963 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2965 case ALT_CLK_MAIN_PLL_C4:
\r
2966 hilimit = alt_pll_cntr_maxfreq.MainPLL_C4;
\r
2967 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2968 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2970 case ALT_CLK_MAIN_PLL_C5:
\r
2971 hilimit = alt_pll_cntr_maxfreq.MainPLL_C5;
\r
2972 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
2973 status = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &numer);
\r
2976 // Counters of the Peripheral PLL
\r
2977 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
2978 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C0;
\r
2980 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
2982 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
2983 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C1;
\r
2985 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
2987 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
2988 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C2;
\r
2990 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
2992 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
2993 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C3;
\r
2995 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
2997 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
2998 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C4;
\r
3000 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
3002 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
3003 hilimit = alt_pll_cntr_maxfreq.PeriphPLL_C5;
\r
3004 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
3005 status = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &numer);
\r
3008 // Counters of the SDRAM PLL
\r
3009 case ALT_CLK_SDRAM_PLL_C0:
\r
3010 hilimit = alt_pll_cntr_maxfreq.SDRAMPLL_C0;
\r
3012 status = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &numer);
\r
3014 case ALT_CLK_SDRAM_PLL_C1:
\r
3015 hilimit = alt_pll_cntr_maxfreq.SDRAMPLL_C1;
\r
3017 status = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &numer);
\r
3019 case ALT_CLK_SDRAM_PLL_C2:
\r
3020 hilimit = alt_pll_cntr_maxfreq.SDRAMPLL_C2;
\r
3022 status = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &numer);
\r
3024 case ALT_CLK_SDRAM_PLL_C5:
\r
3025 hilimit = alt_pll_cntr_maxfreq.SDRAMPLL_C5;
\r
3026 lolimit = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
3027 status = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &numer);
\r
3031 status = ALT_E_BAD_ARG;
\r
3035 if (status == ALT_E_SUCCESS)
\r
3037 numer = numer / div;
\r
3038 if ((numer <= hilimit) && (numer >= lolimit))
\r
3040 status = ALT_E_TRUE;
\r
3044 status = ALT_E_FALSE;
\r
3052 static bool alt_clkmgr_is_val_modulo_n(uint32_t div, uint32_t mod)
\r
3058 else if (mod == 2)
\r
3060 return (div & 0x1) == 0;
\r
3062 else if (mod == 4)
\r
3064 return (div & 0x3) == 0;
\r
3068 return (div % mod) == 0;
\r
3073 // alt_clk_divider_set() sets the divider value for the specified clock.
\r
3075 // See pages 38, 44, 45, and 46 of the HPS-Clocking NPP for a map of the
\r
3076 // HPS clocking architecture and hierarchy of connections.
\r
3078 ALT_STATUS_CODE alt_clk_divider_set(ALT_CLK_t clk, uint32_t div)
\r
3080 ALT_STATUS_CODE ret = ALT_E_BAD_ARG;
\r
3081 volatile uint32_t temp, temp1;
\r
3082 uint32_t wrval = UINT32_MAX; // value to be written
\r
3083 bool restore_0 = false;
\r
3084 bool restore_1 = false;
\r
3085 bool restore_2 = false;
\r
3089 // Main PLL outputs
\r
3090 case ALT_CLK_MAIN_PLL_C0:
\r
3093 uint32_t prediv = (ALT_CLKMGR_ALTERA_MPUCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MPUCLK_ADDR)) + 1);
\r
3095 if ( (div <= ((ALT_CLKMGR_MAINPLL_MPUCLK_CNT_SET_MSK + 1) * prediv))
\r
3096 && alt_clkmgr_is_val_modulo_n(div, prediv)
\r
3097 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C0, div) == ALT_E_TRUE) )
\r
3099 wrval = (div / prediv) - 1;
\r
3101 // HW managed clock, change by writing to the external counter, no need to gate clock
\r
3102 // or match phase or wait for transistion time. No other field in the register to mask off either.
\r
3103 alt_write_word(ALT_CLKMGR_MAINPLL_MPUCLK_ADDR, wrval);
\r
3104 ret = ALT_E_SUCCESS;
\r
3108 ret = ALT_E_ARG_RANGE;
\r
3113 case ALT_CLK_MAIN_PLL_C1:
\r
3114 case ALT_CLK_L3_MAIN:
\r
3116 uint32_t prediv = (ALT_CLKMGR_ALTERA_MAINCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_MAINCLK_ADDR)) + 1);
\r
3118 if ( (div <= ((ALT_CLKMGR_MAINPLL_MAINCLK_CNT_SET_MSK + 1) * prediv))
\r
3119 && alt_clkmgr_is_val_modulo_n(div, prediv)
\r
3120 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C1, div) == ALT_E_TRUE) )
\r
3122 // HW managed clock, change by writing to the external counter, no need to gate clock
\r
3123 // or match phase or wait for transistion time. No other field in the register to mask off either.
\r
3125 wrval = (div / prediv) - 1;
\r
3127 #if ALT_PREVENT_GLITCH_CHGC1
\r
3128 // if L4MP or L4SP source is set to Main PLL C1, gate it off before changing
\r
3129 // bypass state, then gate clock back on. FogBugz #63778
\r
3130 temp = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
3131 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3133 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4MP_SET_MSK)))
\r
3137 if ((temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK) && (!(temp & ALT_CLKMGR_MAINPLL_L4SRC_L4SP_SET_MSK)))
\r
3142 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
3143 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
3144 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); }
\r
3146 alt_write_word(ALT_CLKMGR_MAINPLL_MAINCLK_ADDR, wrval);
\r
3148 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3149 // wait a bit before reenabling the L4MP and L4SP clocks
\r
3150 if (restore_0 || restore_1) { alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp1); }
\r
3152 alt_write_word(ALT_CLKMGR_MAINPLL_MAINCLK_ADDR, wrval);
\r
3154 ret = ALT_E_SUCCESS;
\r
3158 ret = ALT_E_ARG_RANGE;
\r
3163 case ALT_CLK_MAIN_PLL_C2:
\r
3164 case ALT_CLK_DBG_BASE:
\r
3166 uint32_t prediv = (ALT_CLKMGR_ALTERA_DBGATCLK_CNT_GET(alt_read_word(ALT_CLKMGR_ALTERA_DBGATCLK_ADDR)) + 1);
\r
3168 if ( (div <= ((ALT_CLKMGR_MAINPLL_DBGATCLK_CNT_SET_MSK + 1) * prediv))
\r
3169 && alt_clkmgr_is_val_modulo_n(div, prediv)
\r
3170 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C2, div) == ALT_E_TRUE) )
\r
3172 wrval = (div / prediv) - 1;
\r
3173 // HW managed clock, change by writing to the external counter, no need to gate clock
\r
3174 // or match phase or wait for transistion time. No other field in the register to mask off either.
\r
3175 alt_write_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR, wrval);
\r
3177 ret = ALT_E_SUCCESS;
\r
3181 ret = ALT_E_ARG_RANGE;
\r
3186 case ALT_CLK_MAIN_PLL_C3:
\r
3187 // The rest of the PLL outputs do not have external counters, but
\r
3188 // their internal counters are programmable rather than fixed
\r
3189 if ( (div <= (ALT_CLKMGR_MAINPLL_MAINQSPICLK_CNT_SET_MSK + 1))
\r
3190 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C3, div) == ALT_E_TRUE) )
\r
3192 // if the main_qspi_clk input is selected for the qspi_clk
\r
3193 if (ALT_CLKMGR_PERPLL_SRC_QSPI_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR)) ==
\r
3194 ALT_CLKMGR_PERPLL_SRC_QSPI_E_MAIN_QSPI_CLK)
\r
3196 restore_0 = (temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR)) & ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK;
\r
3197 if (restore_0) // AND if the QSPI clock is currently enabled
\r
3199 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_QSPICLK_CLR_MSK);
\r
3200 // gate off the QSPI clock
\r
3204 // the rest are software-managed clocks and require a reset sequence to write to
\r
3205 alt_clk_pllcounter_write(ALT_CLKMGR_MAINPLL_VCO_ADDR,
\r
3206 ALT_CLKMGR_MAINPLL_STAT_ADDR,
\r
3207 ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR,
\r
3209 ALT_CLK_PLL_RST_BIT_C3,
\r
3210 ALT_CLKMGR_MAINPLL_VCO_OUTRST_LSB);
\r
3212 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3215 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3216 // if the QSPI clock was gated on (enabled) before, return it to that state
\r
3218 ret = ALT_E_SUCCESS;
\r
3223 ret = ALT_E_ARG_RANGE;
\r
3227 case ALT_CLK_MAIN_PLL_C4:
\r
3228 case ALT_CLK_MAIN_NAND_SDMMC:
\r
3229 if ( (div <= (ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_CNT_SET_MSK + 1))
\r
3230 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C4, div) == ALT_E_TRUE) )
\r
3232 temp = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
3233 temp1 = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3235 // do we need to gate off the SDMMC clock ?
\r
3236 if (ALT_CLKMGR_PERPLL_SRC_SDMMC_GET(temp) == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_MAIN_NAND_CLK)
\r
3238 if (temp1 & ALT_CLKMGR_PERPLL_EN_SDMMCCLK_SET_MSK) { restore_0 = true; }
\r
3241 // do we need to gate off the NAND clock and/or the NANDX clock?
\r
3242 if (ALT_CLKMGR_PERPLL_SRC_NAND_GET(temp) == ALT_CLKMGR_PERPLL_SRC_NAND_E_MAIN_NAND_CLK)
\r
3244 if (temp1 & ALT_CLKMGR_PERPLL_EN_NANDXCLK_SET_MSK) { restore_1 = true; }
\r
3245 if (temp1 & ALT_CLKMGR_PERPLL_EN_NANDCLK_SET_MSK) { restore_2 = true; }
\r
3249 if (restore_1 && restore_2)
\r
3251 temp &= ALT_CLKMGR_PERPLL_EN_NANDCLK_CLR_MSK;
\r
3252 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3253 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
3254 // gate nand_clk off at least 8 MPU clock cycles before before nand_x_clk
\r
3257 if (restore_0 || restore_1)
\r
3259 if (restore_0) { temp &= ALT_CLKMGR_PERPLL_EN_SDMMCCLK_CLR_MSK; }
\r
3260 if (restore_1) { temp &= ALT_CLKMGR_PERPLL_EN_NANDXCLK_CLR_MSK; }
\r
3261 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3262 // gate off sdmmc_clk and/or nand_x_clk
\r
3265 // now write the new divisor ratio
\r
3267 alt_clk_pllcounter_write(ALT_CLKMGR_MAINPLL_VCO_ADDR,
\r
3268 ALT_CLKMGR_MAINPLL_STAT_ADDR,
\r
3269 ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR,
\r
3271 ALT_CLK_PLL_RST_BIT_C4,
\r
3272 ALT_CLKMGR_MAINPLL_VCO_OUTRST_LSB);
\r
3273 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3275 if (restore_0 || restore_1)
\r
3277 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1 & ALT_CLKMGR_PERPLL_EN_NANDCLK_CLR_MSK);
\r
3278 // if the NANDX and/or SDMMC clock was gated on (enabled) before, return it to that state
\r
3279 if (restore_1 && restore_2)
\r
3281 // wait at least 8 clock cycles to turn the nand_clk on
\r
3282 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
3283 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1);
\r
3286 ret = ALT_E_SUCCESS;
\r
3290 ret = ALT_E_ARG_RANGE;
\r
3294 case ALT_CLK_MAIN_PLL_C5:
\r
3296 case ALT_CLK_H2F_USER0:
\r
3297 if ( (div <= (ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_CNT_SET_MSK + 1))
\r
3298 && (alt_clk_within_freq_limits(ALT_CLK_MAIN_PLL_C5, div) == ALT_E_TRUE) )
\r
3300 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3301 restore_0 = ((temp & ALT_CLKMGR_MAINPLL_EN_CFGCLK_SET_MSK) ||
\r
3302 (temp & ALT_CLKMGR_MAINPLL_EN_S2FUSER0CLK_SET_MSK));
\r
3305 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & (ALT_CLKMGR_MAINPLL_EN_CFGCLK_CLR_MSK &
\r
3306 ALT_CLKMGR_MAINPLL_EN_S2FUSER0CLK_CLR_MSK)); // clear both
\r
3309 // now write the new divisor ratio
\r
3311 alt_clk_pllcounter_write(ALT_CLKMGR_MAINPLL_VCO_ADDR,
\r
3312 ALT_CLKMGR_MAINPLL_STAT_ADDR,
\r
3313 ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR,
\r
3315 ALT_CLK_PLL_RST_BIT_C5,
\r
3316 ALT_CLKMGR_MAINPLL_VCO_OUTRST_LSB);
\r
3318 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3322 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3324 ret = ALT_E_SUCCESS;
\r
3328 ret = ALT_E_ARG_RANGE;
\r
3334 // Peripheral PLL outputs
\r
3335 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
3336 case ALT_CLK_EMAC0:
\r
3337 if ( (div <= (ALT_CLKMGR_PERPLL_EMAC0CLK_CNT_SET_MSK + 1))
\r
3338 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C0, div) == ALT_E_TRUE) )
\r
3340 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3341 restore_0 = temp & ALT_CLKMGR_PERPLL_EN_EMAC0CLK_SET_MSK;
\r
3345 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_EMAC0CLK_CLR_MSK);
\r
3348 // now write the new divisor ratio
\r
3350 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3351 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3352 ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR,
\r
3354 ALT_CLK_PLL_RST_BIT_C0,
\r
3355 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3357 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3360 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3362 ret = ALT_E_SUCCESS;
\r
3366 ret = ALT_E_ARG_RANGE;
\r
3370 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
3371 case ALT_CLK_EMAC1:
\r
3372 if ( (div <= (ALT_CLKMGR_PERPLL_EMAC1CLK_CNT_SET_MSK + 1))
\r
3373 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C1, div) == ALT_E_TRUE) )
\r
3375 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3376 restore_0 = temp & ALT_CLKMGR_PERPLL_EN_EMAC1CLK_SET_MSK;
\r
3380 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_EMAC1CLK_CLR_MSK);
\r
3382 // now write the new divisor ratio
\r
3384 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3385 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3386 ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR,
\r
3388 ALT_CLK_PLL_RST_BIT_C1,
\r
3389 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3391 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3394 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3396 ret = ALT_E_SUCCESS;
\r
3400 ret = ALT_E_ARG_RANGE;
\r
3404 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
3405 if ( (div <= (ALT_CLKMGR_PERPLL_PERQSPICLK_CNT_SET_MSK + 1))
\r
3406 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C2, div) == ALT_E_TRUE) )
\r
3408 temp = ALT_CLKMGR_PERPLL_SRC_QSPI_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
3409 if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_PERIPH_QSPI_CLK)
\r
3411 // if qspi source is set to Peripheral PLL C2
\r
3412 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3413 // and if qspi_clk is enabled
\r
3414 restore_0 = temp & ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK;
\r
3417 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_QSPICLK_CLR_MSK);
\r
3422 // now write the new divisor ratio
\r
3424 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3425 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3426 ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR,
\r
3428 ALT_CLK_PLL_RST_BIT_C2,
\r
3429 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3431 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3434 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3435 // if the clock was gated on (enabled) before, return it to that state
\r
3437 ret = ALT_E_SUCCESS;
\r
3441 ret = ALT_E_ARG_RANGE;
\r
3445 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
3446 if ( (div <= (ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_CNT_SET_MSK + 1))
\r
3447 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C3, div) == ALT_E_TRUE) )
\r
3449 // first, are the clock MUX input selections currently set to use the clock we want to change?
\r
3450 temp = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
3451 restore_0 = (ALT_CLKMGR_PERPLL_SRC_SDMMC_GET(temp) == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_PERIPH_NAND_CLK);
\r
3452 restore_1 = restore_2 = (ALT_CLKMGR_PERPLL_SRC_NAND_GET(temp) == ALT_CLKMGR_PERPLL_SRC_NAND_E_PERIPH_NAND_CLK);
\r
3454 // now AND those with the current state of the three gate enables
\r
3455 // to get the clocks which must be gated off and then back on
\r
3456 temp1 = temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3457 restore_0 = restore_0 && (temp & ALT_CLKMGR_PERPLL_EN_SDMMCCLK_SET_MSK);
\r
3458 restore_1 = restore_1 && (temp & ALT_CLKMGR_PERPLL_EN_NANDXCLK_SET_MSK);
\r
3459 restore_2 = restore_2 && (temp & ALT_CLKMGR_PERPLL_EN_NANDCLK_SET_MSK);
\r
3461 // gate off the clocks that depend on the clock divider that we want to change
\r
3462 if (restore_2) { temp &= ALT_CLKMGR_PERPLL_EN_NANDCLK_CLR_MSK; }
\r
3463 if (restore_0) { temp &= ALT_CLKMGR_PERPLL_EN_SDMMCCLK_CLR_MSK; }
\r
3464 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3466 // the NAND clock must be gated off before the NANDX clock,
\r
3469 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK);
\r
3470 temp &= ALT_CLKMGR_PERPLL_EN_NANDXCLK_CLR_MSK;
\r
3471 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3474 // now write the new divisor ratio
\r
3476 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3477 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3478 ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR,
\r
3480 ALT_CLK_PLL_RST_BIT_C3,
\r
3481 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3483 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV );
\r
3485 // NAND clock and NAND_X clock cannot be written together, must be a set sequence with a delay
\r
3486 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1 & ALT_CLKMGR_PERPLL_EN_NANDCLK_CLR_MSK);
\r
3489 // the NANDX clock must be gated on before the NAND clock.
\r
3490 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_NANDCLK );
\r
3491 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1);
\r
3493 ret = ALT_E_SUCCESS;
\r
3497 ret = ALT_E_ARG_RANGE;
\r
3501 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
3502 if ( (div <= (ALT_CLKMGR_PERPLL_PERBASECLK_CNT_SET_MSK + 1))
\r
3503 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C4, div) == ALT_E_TRUE) )
\r
3505 // look at the L4 set of clock gates first
\r
3506 temp1 = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
3507 restore_0 = (ALT_CLKMGR_MAINPLL_L4SRC_L4MP_GET(temp1) == ALT_CLKMGR_MAINPLL_L4SRC_L4MP_E_PERIPHPLL);
\r
3508 restore_1 = (ALT_CLKMGR_MAINPLL_L4SRC_L4SP_GET(temp1) == ALT_CLKMGR_MAINPLL_L4SRC_L4SP_E_PERIPHPLL);
\r
3509 temp1 = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3510 restore_0 = restore_0 && (temp1 & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK);
\r
3511 restore_1 = restore_1 && (temp1 & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK);
\r
3513 // if the l4_sp and l4_mp clocks are not set to use the periph_base_clk
\r
3514 // from the Peripheral PLL C4 clock divider output, or if they are
\r
3515 // not currently gated on, don't change their gates
\r
3516 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3517 if (restore_0) { temp &= ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK; }
\r
3518 if (restore_1) { temp &= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK; }
\r
3519 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3521 // now look at the C4 direct set of clock gates
\r
3522 // first, create a mask of the C4 direct set of clock gate enables
\r
3523 temp = ( ALT_CLKMGR_PERPLL_EN_USBCLK_SET_MSK
\r
3524 | ALT_CLKMGR_PERPLL_EN_SPIMCLK_SET_MSK
\r
3525 | ALT_CLKMGR_PERPLL_EN_CAN0CLK_SET_MSK
\r
3526 | ALT_CLKMGR_PERPLL_EN_CAN1CLK_SET_MSK
\r
3527 | ALT_CLKMGR_PERPLL_EN_GPIOCLK_SET_MSK );
\r
3529 // gate off all the C4 Direct set of clocks
\r
3530 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1 & ~temp);
\r
3532 // change the clock divider ratio - the reason we're here
\r
3534 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3535 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3536 ALT_CLKMGR_PERPLL_PERBASECLK_ADDR,
\r
3538 ALT_CLK_PLL_RST_BIT_C4,
\r
3539 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3541 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV );
\r
3543 // gate the affected clocks that were on before back on - both sets of gates
\r
3544 temp = (restore_0) ? ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK : 0;
\r
3545 if (restore_1) { temp |= ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK; }
\r
3546 alt_setbits_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3547 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp1);
\r
3548 ret = ALT_E_SUCCESS;
\r
3552 ret = ALT_E_ARG_RANGE;
\r
3556 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
3557 case ALT_CLK_H2F_USER1:
\r
3558 if ( (div <= (ALT_CLKMGR_PERPLL_S2FUSER1CLK_CNT_SET_MSK + 1))
\r
3559 && (alt_clk_within_freq_limits(ALT_CLK_PERIPHERAL_PLL_C5, div) == ALT_E_TRUE) )
\r
3561 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3562 restore_0 = temp & ALT_CLKMGR_PERPLL_EN_S2FUSER1CLK_SET_MSK;
\r
3565 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_S2FUSER1CLK_CLR_MSK);
\r
3568 // now write the new divisor ratio
\r
3570 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
3571 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
3572 ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR,
\r
3574 ALT_CLK_PLL_RST_BIT_C5,
\r
3575 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
3577 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV );
\r
3578 if (restore_0) { alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp); }
\r
3579 ret = ALT_E_SUCCESS;
\r
3583 ret = ALT_E_ARG_RANGE;
\r
3589 // SDRAM PLL outputs
\r
3590 case ALT_CLK_SDRAM_PLL_C0:
\r
3591 case ALT_CLK_DDR_DQS:
\r
3592 if ( (div <= (ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_SET_MSK + 1))
\r
3593 && (alt_clk_within_freq_limits(ALT_CLK_SDRAM_PLL_C0, div) == ALT_E_TRUE) )
\r
3596 temp = alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR);
\r
3597 if (temp & ALT_CLKMGR_SDRPLL_EN_DDRDQSCLK_SET_MSK)
\r
3599 // if clock is currently on, gate it off
\r
3600 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp & ALT_CLKMGR_SDRPLL_EN_DDRDQSCLK_CLR_MSK);
\r
3604 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR,
\r
3605 ALT_CLKMGR_SDRPLL_STAT_ADDR,
\r
3606 ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR,
\r
3608 ALT_CLK_PLL_RST_BIT_C0,
\r
3609 ALT_CLKMGR_SDRPLL_DDRDQSCLK_CNT_LSB);
\r
3612 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp); // which has the enable bit set
\r
3614 ret = ALT_E_SUCCESS;
\r
3618 ret = ALT_E_ARG_RANGE;
\r
3622 case ALT_CLK_SDRAM_PLL_C1:
\r
3623 case ALT_CLK_DDR_2X_DQS:
\r
3624 if ( (div <= (ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_CNT_SET_MSK + 1))
\r
3625 && (alt_clk_within_freq_limits(ALT_CLK_SDRAM_PLL_C1, div) == ALT_E_TRUE) )
\r
3628 temp = alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR);
\r
3629 if (temp & ALT_CLKMGR_SDRPLL_EN_DDR2XDQSCLK_SET_MSK)
\r
3631 // if clock is currently on, gate it off
\r
3632 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp & ALT_CLKMGR_SDRPLL_EN_DDR2XDQSCLK_CLR_MSK);
\r
3636 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR,
\r
3637 ALT_CLKMGR_SDRPLL_STAT_ADDR,
\r
3638 ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR,
\r
3640 ALT_CLK_PLL_RST_BIT_C1,
\r
3641 ALT_CLKMGR_SDRPLL_VCO_OUTRST_LSB);
\r
3644 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp); // which has the enable bit set
\r
3646 ret = ALT_E_SUCCESS;
\r
3650 ret = ALT_E_ARG_RANGE;
\r
3654 case ALT_CLK_SDRAM_PLL_C2:
\r
3655 case ALT_CLK_DDR_DQ:
\r
3656 if ( (div <= (ALT_CLKMGR_SDRPLL_DDRDQCLK_CNT_SET_MSK + 1))
\r
3657 && (alt_clk_within_freq_limits(ALT_CLK_SDRAM_PLL_C2, div) == ALT_E_TRUE) )
\r
3660 temp = alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR);
\r
3661 if (temp & ALT_CLKMGR_SDRPLL_EN_DDRDQCLK_SET_MSK)
\r
3663 // if clock is currently on, gate it off
\r
3664 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp & ALT_CLKMGR_SDRPLL_EN_DDRDQCLK_CLR_MSK);
\r
3668 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR,
\r
3669 ALT_CLKMGR_SDRPLL_STAT_ADDR,
\r
3670 ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR,
\r
3672 ALT_CLK_PLL_RST_BIT_C2,
\r
3673 ALT_CLKMGR_SDRPLL_VCO_OUTRST_LSB);
\r
3676 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp); // which has the enable bit set
\r
3678 ret = ALT_E_SUCCESS;
\r
3682 ret = ALT_E_ARG_RANGE;
\r
3686 case ALT_CLK_SDRAM_PLL_C5:
\r
3687 case ALT_CLK_H2F_USER2:
\r
3688 if ( (div <= (ALT_CLKMGR_SDRPLL_S2FUSER2CLK_CNT_SET_MSK + 1))
\r
3689 && (alt_clk_within_freq_limits(ALT_CLK_SDRAM_PLL_C5, div) == ALT_E_TRUE) )
\r
3692 temp = alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR);
\r
3693 if (temp & ALT_CLKMGR_SDRPLL_EN_S2FUSER2CLK_SET_MSK)
\r
3695 // if clock is currently on, gate it off
\r
3696 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp & ALT_CLKMGR_SDRPLL_EN_S2FUSER2CLK_CLR_MSK);
\r
3700 alt_clk_pllcounter_write(ALT_CLKMGR_SDRPLL_VCO_ADDR,
\r
3701 ALT_CLKMGR_SDRPLL_STAT_ADDR,
\r
3702 ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR,
\r
3704 ALT_CLK_PLL_RST_BIT_C5,
\r
3705 ALT_CLKMGR_SDRPLL_VCO_OUTRST_LSB);
\r
3708 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, temp); // which has the enable bit set
\r
3710 ret = ALT_E_SUCCESS;
\r
3714 ret = ALT_E_ARG_RANGE;
\r
3720 // Other clock dividers
\r
3721 case ALT_CLK_L3_MP:
\r
3722 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_E_DIV1; }
\r
3723 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_E_DIV2; }
\r
3725 if (wrval != UINT32_MAX)
\r
3727 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3728 if (temp & ALT_CLKMGR_MAINPLL_EN_L3MPCLK_SET_MSK)
\r
3730 // if clock is currently on, gate it off
\r
3731 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_L3MPCLK_CLR_MSK);
\r
3734 alt_replbits_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_SET_MSK,
\r
3735 wrval << ALT_CLKMGR_MAINPLL_MAINDIV_L3MPCLK_LSB);
\r
3736 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_EN_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV );
\r
3739 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); // which has the enable bit set
\r
3741 ret = ALT_E_SUCCESS;
\r
3745 ret = ALT_E_ARG_RANGE;
\r
3749 case ALT_CLK_L3_SP:
\r
3750 // note that the L3MP divider is upstream from the L3SP divider
\r
3751 // and any changes to the former will affect the output of both
\r
3752 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_E_DIV1; }
\r
3753 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_E_DIV2; }
\r
3755 if (wrval != UINT32_MAX)
\r
3757 alt_replbits_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_SET_MSK,
\r
3758 wrval << ALT_CLKMGR_MAINPLL_MAINDIV_L3SPCLK_LSB);
\r
3759 // no clock gate to close and reopen
\r
3760 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV );
\r
3761 ret = ALT_E_SUCCESS;
\r
3765 ret = ALT_E_ARG_RANGE;
\r
3769 case ALT_CLK_L4_MP:
\r
3770 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV1; }
\r
3771 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV2; }
\r
3772 else if (div == 4) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV4; }
\r
3773 else if (div == 8) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV8; }
\r
3774 else if (div == 16) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_E_DIV16; }
\r
3776 if (wrval != UINT32_MAX)
\r
3778 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3779 if (temp & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_SET_MSK)
\r
3781 // if clock is currently on, gate it off
\r
3782 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_L4MPCLK_CLR_MSK);
\r
3785 alt_replbits_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_SET_MSK,
\r
3786 wrval << ALT_CLKMGR_MAINPLL_MAINDIV_L4MPCLK_LSB);
\r
3787 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3790 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp); // which has the enable bit set
\r
3792 ret = ALT_E_SUCCESS;
\r
3796 ret = ALT_E_ARG_RANGE;
\r
3800 case ALT_CLK_L4_SP:
\r
3801 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV1; }
\r
3802 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV2; }
\r
3803 else if (div == 4) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV4; }
\r
3804 else if (div == 8) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV8; }
\r
3805 else if (div == 16) { wrval = ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_E_DIV16; }
\r
3807 if (wrval != UINT32_MAX)
\r
3809 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3810 if (temp & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_SET_MSK)
\r
3812 // if clock is currently on, gate it off
\r
3813 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_L4SPCLK_CLR_MSK);
\r
3816 alt_replbits_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_SET_MSK,
\r
3817 wrval << ALT_CLKMGR_MAINPLL_MAINDIV_L4SPCLK_LSB);
\r
3818 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3821 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3823 ret = ALT_E_SUCCESS;
\r
3827 ret = ALT_E_ARG_RANGE;
\r
3831 case ALT_CLK_DBG_AT:
\r
3832 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_E_DIV1; }
\r
3833 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_E_DIV2; }
\r
3834 else if (div == 4) { wrval = ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_E_DIV4; }
\r
3836 if (wrval != UINT32_MAX)
\r
3838 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3839 if (temp & ALT_CLKMGR_MAINPLL_EN_DBGATCLK_SET_MSK)
\r
3841 // if clock is currently on, gate it off
\r
3842 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_DBGATCLK_CLR_MSK);
\r
3845 alt_replbits_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR, ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_SET_MSK,
\r
3846 wrval << ALT_CLKMGR_MAINPLL_DBGDIV_DBGATCLK_LSB);
\r
3847 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3850 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3852 ret = ALT_E_SUCCESS;
\r
3856 ret = ALT_E_ARG_RANGE;
\r
3861 if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_E_DIV2; }
\r
3862 else if (div == 4) { wrval = ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_E_DIV4; }
\r
3864 if (wrval != UINT32_MAX)
\r
3866 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3867 if (temp & ALT_CLKMGR_MAINPLL_EN_DBGCLK_SET_MSK)
\r
3869 // if clock is currently on, gate it off
\r
3870 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_DBGCLK_CLR_MSK);
\r
3873 alt_replbits_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR, ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_SET_MSK,
\r
3874 wrval << (ALT_CLKMGR_MAINPLL_DBGDIV_DBGCLK_LSB - 1));
\r
3875 // account for the fact that the divisor ratios are 2x the value
\r
3876 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3879 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3881 ret = ALT_E_SUCCESS;
\r
3885 ret = ALT_E_ARG_RANGE;
\r
3889 case ALT_CLK_DBG_TRACE:
\r
3890 if (div == 1) { wrval = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV1; }
\r
3891 else if (div == 2) { wrval = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV2; }
\r
3892 else if (div == 4) { wrval = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV4; }
\r
3893 else if (div == 8) { wrval = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV8; }
\r
3894 else if (div == 16) { wrval = ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_E_DIV16; }
\r
3896 if (wrval != UINT32_MAX)
\r
3898 temp = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
3899 if (temp & ALT_CLKMGR_MAINPLL_EN_DBGTRACECLK_SET_MSK)
\r
3901 // if clock is currently on, gate it off
\r
3902 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp & ALT_CLKMGR_MAINPLL_EN_DBGTRACECLK_CLR_MSK);
\r
3905 alt_replbits_word(ALT_CLKMGR_MAINPLL_TRACEDIV_ADDR, ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_SET_MSK,
\r
3906 wrval << ALT_CLKMGR_MAINPLL_TRACEDIV_TRACECLK_LSB);
\r
3907 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_TRACEDIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3910 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, temp);
\r
3912 ret = ALT_E_SUCCESS;
\r
3916 ret = ALT_E_ARG_RANGE;
\r
3920 case ALT_CLK_USB_MP:
\r
3921 if (div == 1) { wrval = ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV1; }
\r
3922 else if (div == 2) { wrval = ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV2; }
\r
3923 else if (div == 4) { wrval = ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV4; }
\r
3924 else if (div == 8) { wrval = ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV8; }
\r
3925 else if (div == 16) { wrval = ALT_CLKMGR_PERPLL_DIV_USBCLK_E_DIV16; }
\r
3927 if (wrval != UINT32_MAX)
\r
3929 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3930 if (temp & ALT_CLKMGR_PERPLL_EN_USBCLK_SET_MSK)
\r
3932 // if clock is currently on, gate it off
\r
3933 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_USBCLK_CLR_MSK);
\r
3936 alt_replbits_word(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_CLKMGR_PERPLL_DIV_USBCLK_SET_MSK,
\r
3937 wrval << ALT_CLKMGR_PERPLL_DIV_USBCLK_LSB);
\r
3938 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3941 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3943 ret = ALT_E_SUCCESS;
\r
3947 ret = ALT_E_ARG_RANGE;
\r
3951 case ALT_CLK_SPI_M:
\r
3952 if (div == 1) { wrval = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV1; }
\r
3953 else if (div == 2) { wrval = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV2; }
\r
3954 else if (div == 4) { wrval = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV4; }
\r
3955 else if (div == 8) { wrval = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV8; }
\r
3956 else if (div == 16) { wrval = ALT_CLKMGR_PERPLL_DIV_SPIMCLK_E_DIV16; }
\r
3958 if (wrval != UINT32_MAX)
\r
3960 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3961 if (temp & ALT_CLKMGR_PERPLL_EN_SPIMCLK_SET_MSK)
\r
3963 // if clock is currently on, gate it off
\r
3964 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_SPIMCLK_CLR_MSK);
\r
3967 alt_replbits_word(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_CLKMGR_PERPLL_DIV_SPIMCLK_SET_MSK,
\r
3968 wrval << ALT_CLKMGR_PERPLL_DIV_SPIMCLK_LSB);
\r
3969 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
3972 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
3974 ret = ALT_E_SUCCESS;
\r
3978 ret = ALT_E_ARG_RANGE;
\r
3982 case ALT_CLK_CAN0:
\r
3983 if (div == 1) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV1; }
\r
3984 else if (div == 2) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV2; }
\r
3985 else if (div == 4) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV4; }
\r
3986 else if (div == 8) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV8; }
\r
3987 else if (div == 16) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN0CLK_E_DIV16; }
\r
3989 if (wrval != UINT32_MAX)
\r
3991 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
3992 if (temp & ALT_CLKMGR_PERPLL_EN_CAN0CLK_SET_MSK)
\r
3994 // if clock is currently on, gate it off
\r
3995 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_CAN0CLK_CLR_MSK);
\r
3998 alt_replbits_word(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_CLKMGR_PERPLL_DIV_CAN0CLK_SET_MSK,
\r
3999 wrval << ALT_CLKMGR_PERPLL_DIV_CAN0CLK_LSB);
\r
4000 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
4003 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
4005 ret = ALT_E_SUCCESS;
\r
4009 ret = ALT_E_ARG_RANGE;
\r
4013 case ALT_CLK_CAN1:
\r
4014 if (div == 1) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV1; }
\r
4015 else if (div == 2) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV2; }
\r
4016 else if (div == 4) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV4; }
\r
4017 else if (div == 8) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV8; }
\r
4018 else if (div == 16) { wrval = ALT_CLKMGR_PERPLL_DIV_CAN1CLK_E_DIV16; }
\r
4020 if (wrval != UINT32_MAX)
\r
4022 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
4023 if (temp & ALT_CLKMGR_PERPLL_EN_CAN1CLK_SET_MSK)
\r
4025 // if clock is currently on, gate it off
\r
4026 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_CAN1CLK_CLR_MSK);
\r
4029 alt_replbits_word(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_CLKMGR_PERPLL_DIV_CAN1CLK_SET_MSK,
\r
4030 wrval << ALT_CLKMGR_PERPLL_DIV_CAN1CLK_LSB);
\r
4031 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_DIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
4034 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
4036 ret = ALT_E_SUCCESS;
\r
4040 ret = ALT_E_ARG_RANGE;
\r
4044 case ALT_CLK_GPIO_DB: // GPIO debounce clock
\r
4045 if (div <= ALT_CLKMGR_PERPLL_GPIODIV_GPIODBCLK_SET_MSK)
\r
4047 temp = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
4048 if (temp & ALT_CLKMGR_PERPLL_EN_GPIOCLK_SET_MSK)
\r
4050 // if clock is currently on, gate it off
\r
4051 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp & ALT_CLKMGR_PERPLL_EN_GPIOCLK_CLR_MSK);
\r
4055 alt_replbits_word(ALT_CLKMGR_PERPLL_GPIODIV_ADDR, ALT_CLKMGR_PERPLL_GPIODIV_GPIODBCLK_SET_MSK,
\r
4056 wrval << ALT_CLKMGR_PERPLL_GPIODIV_GPIODBCLK_LSB);
\r
4057 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_GPIODIV_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
4060 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, temp);
\r
4062 ret = ALT_E_SUCCESS;
\r
4066 ret = ALT_E_ARG_RANGE;
\r
4070 case ALT_CLK_MAIN_QSPI:
\r
4071 temp = ALT_CLKMGR_PERPLL_SRC_QSPI_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
4072 // get the QSPI clock source
\r
4073 restore_0 = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR) & ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK;
\r
4074 // and the current enable state
\r
4077 if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_MAIN_QSPI_CLK)
\r
4078 { // if the main_qspi_clk (Main PLL C3 Ouput) input is selected
\r
4079 if (div <= ALT_CLKMGR_MAINPLL_MAINQSPICLK_CNT_SET_MSK)
\r
4083 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
4084 } // gate off the QSPI clock
\r
4086 alt_clk_pllcounter_write(ALT_CLKMGR_MAINPLL_VCO_ADDR,
\r
4087 ALT_CLKMGR_MAINPLL_STAT_ADDR,
\r
4088 ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR,
\r
4090 ALT_CLK_PLL_RST_BIT_C3,
\r
4091 ALT_CLKMGR_MAINPLL_VCO_OUTRST_LSB);
\r
4093 alt_clk_mgr_wait(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
4096 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
4097 // if the QSPI clock was gated on (enabled) before, return it to that state
\r
4099 ret = ALT_E_SUCCESS;
\r
4103 ret = ALT_E_ARG_RANGE;
\r
4106 else if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_PERIPH_QSPI_CLK)
\r
4108 if (div <= ALT_CLKMGR_PERPLL_PERQSPICLK_CNT_SET_MSK)
\r
4112 alt_clrbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
4113 } // gate off the QSPI clock
\r
4115 alt_clk_pllcounter_write(ALT_CLKMGR_PERPLL_VCO_ADDR,
\r
4116 ALT_CLKMGR_PERPLL_STAT_ADDR,
\r
4117 ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR,
\r
4119 ALT_CLK_PLL_RST_BIT_C2,
\r
4120 ALT_CLKMGR_PERPLL_VCO_OUTRST_LSB);
\r
4122 alt_clk_mgr_wait(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR, ALT_SW_MANAGED_CLK_WAIT_CTRDIV);
\r
4125 alt_setbits_word(ALT_CLKMGR_PERPLL_EN_ADDR, ALT_CLKMGR_PERPLL_EN_QSPICLK_SET_MSK);
\r
4126 // if the QSPI clock was gated on (enabled) before, return it to that state
\r
4128 ret = ALT_E_SUCCESS;
\r
4132 ret = ALT_E_ARG_RANGE;
\r
4140 ret = ALT_E_BAD_ARG;
\r
4148 // alt_clk_freq_get() returns the output frequency of the specified clock.
\r
4150 ALT_STATUS_CODE alt_clk_freq_get(ALT_CLK_t clk, alt_freq_t* freq)
\r
4152 ALT_STATUS_CODE ret = ALT_E_BAD_ARG;
\r
4153 uint32_t temp = 0;
\r
4154 uint64_t numer = 0;
\r
4155 uint64_t denom = 1;
\r
4164 // External Inputs
\r
4165 case ALT_CLK_IN_PIN_OSC1:
\r
4166 case ALT_CLK_OSC1:
\r
4167 numer = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
4168 // denom = 1 by default
\r
4169 ret = ALT_E_SUCCESS;
\r
4172 case ALT_CLK_IN_PIN_OSC2:
\r
4173 numer = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
4174 // denom = 1 by default
\r
4175 ret = ALT_E_SUCCESS;
\r
4178 case ALT_CLK_F2H_PERIPH_REF:
\r
4179 numer = alt_ext_clk_paramblok.periph.freqcur;
\r
4180 // denom = 1 by default
\r
4181 ret = ALT_E_SUCCESS;
\r
4184 case ALT_CLK_F2H_SDRAM_REF:
\r
4185 numer = alt_ext_clk_paramblok.sdram.freqcur;
\r
4186 // denom = 1 by default
\r
4187 ret = ALT_E_SUCCESS;
\r
4193 case ALT_CLK_MAIN_PLL:
\r
4194 if (alt_clk_pll_is_bypassed(ALT_CLK_MAIN_PLL) == ALT_E_TRUE)
\r
4196 temp = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
4197 ret = ALT_E_SUCCESS;
\r
4201 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4203 numer = (uint64_t) temp;
\r
4204 // denom = 1 by default
\r
4207 case ALT_CLK_PERIPHERAL_PLL:
\r
4208 if (alt_clk_pll_is_bypassed(ALT_CLK_PERIPHERAL_PLL) == ALT_E_TRUE)
\r
4210 temp = ALT_CLKMGR_PERPLL_VCO_PSRC_GET(alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR));
\r
4211 if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC1)
\r
4213 temp = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
4214 ret = ALT_E_SUCCESS;
\r
4216 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_EOSC2)
\r
4218 temp = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
4219 ret = ALT_E_SUCCESS;
\r
4221 else if (temp == ALT_CLKMGR_PERPLL_VCO_PSRC_E_F2S_PERIPH_REF)
\r
4223 temp = alt_ext_clk_paramblok.periph.freqcur;
\r
4224 ret = ALT_E_SUCCESS;
\r
4228 ret = ALT_E_ERROR;
\r
4233 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4235 numer = (uint64_t) temp;
\r
4236 // denom = 1 by default
\r
4239 case ALT_CLK_SDRAM_PLL:
\r
4240 if (alt_clk_pll_is_bypassed(ALT_CLK_SDRAM_PLL) == ALT_E_TRUE)
\r
4242 temp = ALT_CLKMGR_SDRPLL_VCO_SSRC_GET(alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR));
\r
4243 if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC1)
\r
4245 temp = alt_ext_clk_paramblok.clkosc1.freqcur;
\r
4246 ret = ALT_E_SUCCESS;
\r
4248 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_EOSC2)
\r
4250 temp = alt_ext_clk_paramblok.clkosc2.freqcur;
\r
4251 ret = ALT_E_SUCCESS;
\r
4253 else if (temp == ALT_CLKMGR_SDRPLL_VCO_SSRC_E_F2S_SDRAM_REF)
\r
4255 temp = alt_ext_clk_paramblok.sdram.freqcur;
\r
4256 ret = ALT_E_SUCCESS;
\r
4260 ret = ALT_E_ERROR;
\r
4265 ret = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &temp);
\r
4267 numer = (uint64_t) temp;
\r
4268 // denom = 1 by default
\r
4273 // Main Clock Group
\r
4274 case ALT_CLK_MAIN_PLL_C0:
\r
4275 case ALT_CLK_MAIN_PLL_C1:
\r
4276 case ALT_CLK_MAIN_PLL_C2:
\r
4277 case ALT_CLK_MAIN_PLL_C3:
\r
4278 case ALT_CLK_MAIN_PLL_C4:
\r
4279 case ALT_CLK_MAIN_PLL_C5:
\r
4280 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4281 if (ret == ALT_E_SUCCESS)
\r
4283 numer = (uint64_t) temp;
\r
4284 ret = alt_clk_divider_get(clk, &temp);
\r
4285 denom = (uint64_t) temp;
\r
4290 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4291 if (ret == ALT_E_SUCCESS)
\r
4293 numer = (uint64_t) temp;
\r
4294 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C0, &temp);
\r
4295 denom = (uint64_t) temp;
\r
4299 case ALT_CLK_MPU_PERIPH:
\r
4300 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4301 if (ret == ALT_E_SUCCESS)
\r
4303 numer = (uint64_t) temp;
\r
4304 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C0, &temp);
\r
4306 if (ret == ALT_E_SUCCESS)
\r
4308 denom = (uint64_t) temp;
\r
4309 ret = alt_clk_divider_get(ALT_CLK_MPU_PERIPH, &temp);
\r
4310 denom = denom * (uint64_t) temp;
\r
4314 case ALT_CLK_MPU_L2_RAM:
\r
4315 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4316 if (ret == ALT_E_SUCCESS)
\r
4318 numer = (uint64_t) temp;
\r
4319 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C0, &temp);
\r
4321 if (ret == ALT_E_SUCCESS)
\r
4323 denom = (uint64_t) temp;
\r
4324 ret = alt_clk_divider_get(ALT_CLK_MPU_L2_RAM, &temp);
\r
4325 denom = denom * (uint64_t) temp;
\r
4329 case ALT_CLK_L4_MAIN:
\r
4330 case ALT_CLK_L3_MAIN:
\r
4331 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4332 if (ret == ALT_E_SUCCESS)
\r
4334 numer = (uint64_t) temp;
\r
4335 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C1, &temp);
\r
4336 denom = (uint64_t) temp;
\r
4340 case ALT_CLK_L3_MP:
\r
4341 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4342 if (ret == ALT_E_SUCCESS)
\r
4344 numer = (uint64_t) temp;
\r
4345 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C1, &temp);
\r
4347 if (ret == ALT_E_SUCCESS)
\r
4349 denom = (uint64_t) temp;
\r
4350 ret = alt_clk_divider_get(ALT_CLK_L3_MP, &temp);
\r
4351 denom = denom * (uint64_t) temp;
\r
4355 case ALT_CLK_L3_SP:
\r
4356 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4357 if (ret == ALT_E_SUCCESS)
\r
4359 numer = (uint64_t) temp;
\r
4360 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C1, &temp);
\r
4362 if (ret == ALT_E_SUCCESS)
\r
4364 denom = (uint64_t) temp;
\r
4365 ret = alt_clk_divider_get(ALT_CLK_L3_MP, &temp);
\r
4367 if (ret == ALT_E_SUCCESS)
\r
4369 denom = denom * (uint64_t) temp;
\r
4370 ret = alt_clk_divider_get(ALT_CLK_L3_SP, &temp);
\r
4371 denom = denom * (uint64_t) temp;
\r
4375 case ALT_CLK_L4_MP:
\r
4376 ret = alt_clk_divider_get(ALT_CLK_L4_MP, &temp);
\r
4377 if (ret == ALT_E_SUCCESS)
\r
4379 denom = (uint64_t) temp;
\r
4380 temp = ALT_CLKMGR_MAINPLL_L4SRC_L4MP_GET(alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR));
\r
4381 if (temp == ALT_CLKMGR_MAINPLL_L4SRC_L4MP_E_MAINPLL)
\r
4383 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4384 if (ret == ALT_E_SUCCESS)
\r
4386 numer = (uint64_t) temp;
\r
4387 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C1, &temp);
\r
4388 denom = denom * (uint64_t) temp; // no real harm if temp is garbage data
\r
4391 else if (temp == ALT_CLKMGR_MAINPLL_L4SRC_L4MP_E_PERIPHPLL)
\r
4393 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4394 if (ret == ALT_E_SUCCESS)
\r
4396 numer = (uint64_t) temp;
\r
4397 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4398 denom = denom * (uint64_t) temp;
\r
4404 case ALT_CLK_L4_SP:
\r
4405 ret = alt_clk_divider_get(ALT_CLK_L4_SP, &temp);
\r
4406 if (ret == ALT_E_SUCCESS)
\r
4408 denom = (uint64_t) temp;
\r
4409 temp = ALT_CLKMGR_MAINPLL_L4SRC_L4SP_GET(alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR));
\r
4410 if (temp == ALT_CLKMGR_MAINPLL_L4SRC_L4SP_E_MAINPLL)
\r
4412 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4413 if (ret == ALT_E_SUCCESS)
\r
4415 numer = (uint64_t) temp;
\r
4416 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C1, &temp);
\r
4417 denom = denom * (uint64_t) temp;
\r
4420 else if (temp == ALT_CLKMGR_MAINPLL_L4SRC_L4SP_E_PERIPHPLL) // periph_base_clk
\r
4422 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4423 if (ret == ALT_E_SUCCESS)
\r
4425 numer = (uint64_t) temp;
\r
4426 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4427 denom = denom * (uint64_t) temp;
\r
4433 case ALT_CLK_DBG_BASE:
\r
4434 case ALT_CLK_DBG_TIMER:
\r
4435 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4436 if (ret == ALT_E_SUCCESS)
\r
4438 numer = (uint64_t) temp;
\r
4439 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C2, &temp);
\r
4440 denom = (uint64_t) temp;
\r
4444 case ALT_CLK_DBG_AT:
\r
4445 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4446 if (ret == ALT_E_SUCCESS)
\r
4448 numer = (uint64_t) temp;
\r
4449 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C2, &temp);
\r
4451 if (ret == ALT_E_SUCCESS)
\r
4453 denom = (uint64_t) temp;
\r
4454 ret = alt_clk_divider_get(ALT_CLK_DBG_AT, &temp);
\r
4455 denom = denom * (uint64_t) temp;
\r
4460 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4461 if (ret == ALT_E_SUCCESS)
\r
4463 numer = (uint64_t) temp;
\r
4464 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C2, &temp);
\r
4466 if (ret == ALT_E_SUCCESS)
\r
4468 denom = (uint64_t) temp;
\r
4469 ret = alt_clk_divider_get(ALT_CLK_DBG_AT, &temp);
\r
4471 if (ret == ALT_E_SUCCESS)
\r
4473 denom = denom * (uint64_t) temp;
\r
4474 ret = alt_clk_divider_get(ALT_CLK_DBG, &temp);
\r
4475 denom = denom * (uint64_t) temp;
\r
4479 case ALT_CLK_DBG_TRACE:
\r
4480 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4481 if (ret == ALT_E_SUCCESS)
\r
4483 numer = (uint64_t) temp;
\r
4484 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C2, &temp);
\r
4486 if (ret == ALT_E_SUCCESS)
\r
4488 denom = (uint64_t) temp;
\r
4489 ret = alt_clk_divider_get(ALT_CLK_DBG_TRACE, &temp);
\r
4490 denom = denom * (uint64_t) temp;
\r
4494 case ALT_CLK_MAIN_QSPI:
\r
4495 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4496 if (ret == ALT_E_SUCCESS)
\r
4498 numer = (uint64_t) temp;
\r
4499 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C3, &temp);
\r
4500 denom = (uint64_t) temp;
\r
4504 case ALT_CLK_MAIN_NAND_SDMMC:
\r
4505 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4506 if (ret == ALT_E_SUCCESS)
\r
4508 numer = (uint64_t) temp;
\r
4509 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C4, &temp);
\r
4510 denom = (uint64_t) temp;
\r
4515 case ALT_CLK_H2F_USER0:
\r
4516 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4517 if (ret == ALT_E_SUCCESS)
\r
4519 numer = (uint64_t) temp;
\r
4520 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C5, &temp);
\r
4521 denom = (uint64_t) temp;
\r
4527 // Peripheral Clock Group
\r
4528 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
4529 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
4530 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
4531 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
4532 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
4533 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
4534 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4535 if (ret == ALT_E_SUCCESS)
\r
4537 numer = (uint64_t) temp;
\r
4538 ret = alt_clk_divider_get(clk, &temp);
\r
4539 denom = (uint64_t) temp;
\r
4543 case ALT_CLK_EMAC0:
\r
4544 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4545 if (ret == ALT_E_SUCCESS)
\r
4547 numer = (uint64_t) temp;
\r
4548 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C0, &temp);
\r
4549 denom = (uint64_t) temp;
\r
4553 case ALT_CLK_EMAC1:
\r
4554 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4555 if (ret == ALT_E_SUCCESS)
\r
4557 numer = (uint64_t) temp;
\r
4558 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C1, &temp);
\r
4559 denom = (uint64_t) temp;
\r
4563 case ALT_CLK_USB_MP:
\r
4564 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4565 if (ret == ALT_E_SUCCESS)
\r
4567 numer = (uint64_t) temp;
\r
4568 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4569 if (ret == ALT_E_SUCCESS)
\r
4571 denom = (uint64_t) temp;
\r
4572 ret = alt_clk_divider_get(ALT_CLK_USB_MP, &temp);
\r
4573 denom = denom * (uint64_t) temp;
\r
4578 case ALT_CLK_SPI_M:
\r
4579 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4580 if (ret == ALT_E_SUCCESS)
\r
4582 numer = (uint64_t) temp;
\r
4583 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4585 if (ret == ALT_E_SUCCESS)
\r
4587 denom = (uint64_t) temp;
\r
4588 ret = alt_clk_divider_get(ALT_CLK_SPI_M, &temp);
\r
4589 denom = denom * (uint64_t) temp;
\r
4593 case ALT_CLK_CAN0:
\r
4594 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4595 if (ret == ALT_E_SUCCESS)
\r
4597 numer = (uint64_t) temp;
\r
4598 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4600 if (ret == ALT_E_SUCCESS)
\r
4602 denom = (uint64_t) temp;
\r
4603 ret = alt_clk_divider_get(ALT_CLK_CAN0, &temp);
\r
4604 denom = denom * (uint64_t) temp;
\r
4608 case ALT_CLK_CAN1:
\r
4609 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4610 if (ret == ALT_E_SUCCESS)
\r
4612 numer = (uint64_t) temp;
\r
4613 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4615 if (ret == ALT_E_SUCCESS)
\r
4617 denom = (uint64_t) temp;
\r
4618 ret = alt_clk_divider_get(ALT_CLK_CAN1, &temp);
\r
4619 denom = denom * (uint64_t) temp;
\r
4623 case ALT_CLK_GPIO_DB:
\r
4624 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4625 if (ret == ALT_E_SUCCESS)
\r
4627 numer = (uint64_t) temp;
\r
4628 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C4, &temp);
\r
4630 if (ret == ALT_E_SUCCESS)
\r
4632 denom = (uint64_t) temp;
\r
4633 ret = alt_clk_divider_get(ALT_CLK_GPIO_DB, &temp);
\r
4634 denom = denom * (uint64_t) temp;
\r
4638 case ALT_CLK_H2F_USER1:
\r
4639 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4640 if (ret == ALT_E_SUCCESS)
\r
4642 numer = (uint64_t) temp;
\r
4643 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C5, &temp);
\r
4644 denom = (uint64_t) temp;
\r
4648 /* Clocks That Can Switch Between Different Clock Groups */
\r
4649 case ALT_CLK_SDMMC:
\r
4650 temp = ALT_CLKMGR_PERPLL_SRC_SDMMC_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
4651 if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_F2S_PERIPH_REF_CLK)
\r
4653 numer = (uint64_t) alt_ext_clk_paramblok.periph.freqcur;
\r
4654 // denom = 1 by default
\r
4655 ret = ALT_E_SUCCESS;
\r
4657 else if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_MAIN_NAND_CLK)
\r
4659 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4660 if (ret == ALT_E_SUCCESS)
\r
4662 numer = (uint64_t) temp;
\r
4663 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C4, &temp);
\r
4664 denom = (uint64_t) temp;
\r
4667 else if (temp == ALT_CLKMGR_PERPLL_SRC_SDMMC_E_PERIPH_NAND_CLK)
\r
4669 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4670 if (ret == ALT_E_SUCCESS)
\r
4672 numer = (uint64_t) temp;
\r
4673 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C3, &temp);
\r
4674 denom = (uint64_t) temp;
\r
4679 ret = ALT_E_ERROR;
\r
4683 case ALT_CLK_NAND:
\r
4685 // the absence of a break statement here is not a mistake
\r
4686 case ALT_CLK_NAND_X:
\r
4687 temp = ALT_CLKMGR_PERPLL_SRC_NAND_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
4688 if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_F2S_PERIPH_REF_CLK)
\r
4690 numer = (uint64_t) alt_ext_clk_paramblok.periph.freqcur;
\r
4691 // denom = 1 or 4 by default;
\r
4692 ret = ALT_E_SUCCESS;
\r
4694 else if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_MAIN_NAND_CLK)
\r
4696 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4697 if (ret == ALT_E_SUCCESS)
\r
4699 numer = (uint64_t) temp;
\r
4700 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C4, &temp);
\r
4701 denom = denom * (uint64_t) temp;
\r
4704 else if (temp == ALT_CLKMGR_PERPLL_SRC_NAND_E_PERIPH_NAND_CLK)
\r
4706 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4707 if (ret == ALT_E_SUCCESS)
\r
4709 numer = (uint64_t) temp;
\r
4710 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C3, &temp);
\r
4711 denom = denom * (uint64_t) temp;
\r
4716 ret = ALT_E_ERROR;
\r
4720 case ALT_CLK_QSPI:
\r
4721 temp = ALT_CLKMGR_PERPLL_SRC_QSPI_GET(alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR));
\r
4722 if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_F2S_PERIPH_REF_CLK)
\r
4724 numer = (uint64_t) alt_ext_clk_paramblok.periph.freqcur;
\r
4725 // denom = 1 by default;
\r
4726 ret = ALT_E_SUCCESS;
\r
4728 else if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_MAIN_QSPI_CLK)
\r
4730 ret = alt_clk_pll_vco_freq_get(ALT_CLK_MAIN_PLL, &temp);
\r
4731 if (ret == ALT_E_SUCCESS)
\r
4733 numer = (uint64_t) temp;
\r
4734 ret = alt_clk_divider_get(ALT_CLK_MAIN_PLL_C3, &temp);
\r
4735 denom = (uint64_t) temp;
\r
4738 else if (temp == ALT_CLKMGR_PERPLL_SRC_QSPI_E_PERIPH_QSPI_CLK)
\r
4740 ret = alt_clk_pll_vco_freq_get(ALT_CLK_PERIPHERAL_PLL, &temp);
\r
4741 if (ret == ALT_E_SUCCESS)
\r
4743 numer = (uint64_t) temp;
\r
4744 ret = alt_clk_divider_get(ALT_CLK_PERIPHERAL_PLL_C2, &temp);
\r
4745 denom = (uint64_t) temp;
\r
4750 ret = ALT_E_ERROR;
\r
4756 // SDRAM Clock Group
\r
4757 case ALT_CLK_SDRAM_PLL_C0:
\r
4758 case ALT_CLK_DDR_DQS:
\r
4759 ret = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &temp);
\r
4760 if (ret == ALT_E_SUCCESS)
\r
4762 numer = (uint64_t) temp;
\r
4763 ret = alt_clk_divider_get(ALT_CLK_SDRAM_PLL_C0, &temp);
\r
4764 denom = (uint64_t) temp;
\r
4768 case ALT_CLK_SDRAM_PLL_C1:
\r
4769 case ALT_CLK_DDR_2X_DQS:
\r
4770 ret = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &temp);
\r
4771 if (ret == ALT_E_SUCCESS)
\r
4773 numer = (uint64_t) temp;
\r
4774 ret = alt_clk_divider_get(ALT_CLK_SDRAM_PLL_C1, &temp);
\r
4775 denom = (uint64_t) temp;
\r
4779 case ALT_CLK_SDRAM_PLL_C2:
\r
4780 case ALT_CLK_DDR_DQ:
\r
4781 ret = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &temp);
\r
4782 if (ret == ALT_E_SUCCESS)
\r
4784 numer = (uint64_t) temp;
\r
4785 ret = alt_clk_divider_get(ALT_CLK_SDRAM_PLL_C2, &temp);
\r
4786 denom = (uint64_t) temp;
\r
4790 case ALT_CLK_SDRAM_PLL_C5:
\r
4791 case ALT_CLK_H2F_USER2:
\r
4792 ret = alt_clk_pll_vco_freq_get(ALT_CLK_SDRAM_PLL, &temp);
\r
4793 if (ret == ALT_E_SUCCESS)
\r
4795 numer = (uint64_t) temp;
\r
4796 ret = alt_clk_divider_get(ALT_CLK_SDRAM_PLL_C5, &temp);
\r
4797 denom = (uint64_t) temp;
\r
4802 ret = ALT_E_BAD_ARG;
\r
4805 } // end of switch-case construct
\r
4807 if (ret == ALT_E_SUCCESS)
\r
4809 // will not get here if none of above cases match
\r
4813 if (numer <= UINT32_MAX)
\r
4815 *freq = (uint32_t) numer;
\r
4819 ret = ALT_E_ERROR;
\r
4824 ret = ALT_E_ERROR;
\r
4832 // alt_clk_irq_disable() disables one or more of the lock status conditions as
\r
4833 // contributors to the clkmgr_IRQ interrupt signal state.
\r
4835 ALT_STATUS_CODE alt_clk_irq_disable(ALT_CLK_PLL_LOCK_STATUS_t lock_stat_mask)
\r
4837 if (!(lock_stat_mask & ALT_CLK_MGR_PLL_LOCK_BITS))
\r
4839 alt_clrbits_word(ALT_CLKMGR_INTREN_ADDR, lock_stat_mask);
\r
4840 return ALT_E_SUCCESS;
\r
4844 return ALT_E_BAD_ARG;
\r
4849 // alt_clk_irq_enable() enables one or more of the lock status conditions as
\r
4850 // contributors to the clkmgr_IRQ interrupt signal state.
\r
4852 ALT_STATUS_CODE alt_clk_irq_enable(ALT_CLK_PLL_LOCK_STATUS_t lock_stat_mask)
\r
4854 if (!(lock_stat_mask & ALT_CLK_MGR_PLL_LOCK_BITS))
\r
4856 alt_setbits_word(ALT_CLKMGR_INTREN_ADDR, lock_stat_mask);
\r
4857 return ALT_E_SUCCESS;
\r
4861 return ALT_E_BAD_ARG;
\r
4868 // alt_clk_group_cfg_raw_get() gets the raw configuration state of the designated
\r
4871 ALT_STATUS_CODE alt_clk_group_cfg_raw_get(ALT_CLK_GRP_t clk_group,
\r
4872 ALT_CLK_GROUP_RAW_CFG_t * clk_group_raw_cfg)
\r
4874 clk_group_raw_cfg->verid = alt_read_word(ALT_SYSMGR_SILICONID1_ADDR);
\r
4875 clk_group_raw_cfg->siliid2 = alt_read_word(ALT_SYSMGR_SILICONID2_ADDR);
\r
4876 clk_group_raw_cfg->clkgrpsel = clk_group;
\r
4878 if (clk_group == ALT_MAIN_PLL_CLK_GRP)
\r
4880 // Main PLL VCO register
\r
4881 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.vco = alt_read_word(ALT_CLKMGR_MAINPLL_VCO_ADDR);
\r
4883 // Main PLL Misc register
\r
4884 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.misc = alt_read_word(ALT_CLKMGR_MAINPLL_MISC_ADDR);
\r
4886 // Main PLL C0-C5 Counter registers
\r
4887 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mpuclk = alt_read_word(ALT_CLKMGR_MAINPLL_MPUCLK_ADDR);
\r
4888 // doing these as 32-bit reads and writes avoids unnecessary masking operations
\r
4890 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainclk = alt_read_word(ALT_CLKMGR_MAINPLL_MAINCLK_ADDR);
\r
4891 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.dbgatclk = alt_read_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR);
\r
4892 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainqspiclk = alt_read_word(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR);
\r
4893 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainnandsdmmcclk = alt_read_word(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR);
\r
4894 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.cfgs2fuser0clk = alt_read_word(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR);
\r
4896 // Main PLL Enable register
\r
4897 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.en = alt_read_word(ALT_CLKMGR_MAINPLL_EN_ADDR);
\r
4899 // Main PLL Maindiv register
\r
4900 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.maindiv = alt_read_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR);
\r
4902 // Main PLL Debugdiv register
\r
4903 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.dbgdiv = alt_read_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR);
\r
4905 // Main PLL Tracediv register
\r
4906 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.tracediv = alt_read_word(ALT_CLKMGR_MAINPLL_TRACEDIV_ADDR);
\r
4908 // Main PLL L4 Source register
\r
4909 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.l4src = alt_read_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR);
\r
4911 // Main PLL Status register
\r
4912 clk_group_raw_cfg->clkgrp.mainpllgrp.raw.stat = alt_read_word(ALT_CLKMGR_MAINPLL_STAT_ADDR);
\r
4913 // clkgrp.mainpllgrp.stat.outresetack is defined in the ALT_CLKMGR_MAINPLL_STAT_s declaration
\r
4914 // as a const but alt_indwrite_word() overrides that restriction.
\r
4917 clk_group_raw_cfg->clkgrp.mainpllgrp.raw._pad_0x38_0x40[0] = 0;
\r
4918 clk_group_raw_cfg->clkgrp.mainpllgrp.raw._pad_0x38_0x40[1] = 0;
\r
4920 return ALT_E_SUCCESS;
\r
4922 else if (clk_group == ALT_PERIPH_PLL_CLK_GRP)
\r
4924 // Peripheral PLL VCO register
\r
4925 clk_group_raw_cfg->clkgrp.perpllgrp.raw.vco = alt_read_word(ALT_CLKMGR_PERPLL_VCO_ADDR);
\r
4927 // Peripheral PLL Misc register
\r
4928 clk_group_raw_cfg->clkgrp.perpllgrp.raw.misc = alt_read_word(ALT_CLKMGR_PERPLL_MISC_ADDR);
\r
4930 // Peripheral PLL C0-C5 Counters
\r
4931 clk_group_raw_cfg->clkgrp.perpllgrp.raw.emac0clk = alt_read_word(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR);
\r
4932 // doing these as 32-bit reads and writes avoids unnecessary masking operations
\r
4934 clk_group_raw_cfg->clkgrp.perpllgrp.raw.emac1clk = alt_read_word(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR);
\r
4935 clk_group_raw_cfg->clkgrp.perpllgrp.raw.perqspiclk = alt_read_word(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR);
\r
4936 clk_group_raw_cfg->clkgrp.perpllgrp.raw.pernandsdmmcclk = alt_read_word(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR);
\r
4937 clk_group_raw_cfg->clkgrp.perpllgrp.raw.perbaseclk = alt_read_word(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR);
\r
4938 clk_group_raw_cfg->clkgrp.perpllgrp.raw.s2fuser1clk = alt_read_word(ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR);
\r
4940 // Peripheral PLL Enable register
\r
4941 clk_group_raw_cfg->clkgrp.perpllgrp.raw.en = alt_read_word(ALT_CLKMGR_PERPLL_EN_ADDR);
\r
4943 // Peripheral PLL Divider register
\r
4944 clk_group_raw_cfg->clkgrp.perpllgrp.raw.div = alt_read_word(ALT_CLKMGR_PERPLL_DIV_ADDR);
\r
4946 // Peripheral PLL GPIO Divider register
\r
4947 clk_group_raw_cfg->clkgrp.perpllgrp.raw.gpiodiv = alt_read_word(ALT_CLKMGR_PERPLL_GPIODIV_ADDR);
\r
4949 // Peripheral PLL Source register
\r
4950 clk_group_raw_cfg->clkgrp.perpllgrp.raw.src = alt_read_word(ALT_CLKMGR_PERPLL_SRC_ADDR);
\r
4952 // Peripheral PLL Status register
\r
4953 clk_group_raw_cfg->clkgrp.perpllgrp.raw.stat = alt_read_word(ALT_CLKMGR_PERPLL_STAT_ADDR);
\r
4956 clk_group_raw_cfg->clkgrp.perpllgrp.raw._pad_0x34_0x40[0] = 0;
\r
4957 clk_group_raw_cfg->clkgrp.perpllgrp.raw._pad_0x34_0x40[1] = 0;
\r
4958 clk_group_raw_cfg->clkgrp.perpllgrp.raw._pad_0x34_0x40[2] = 0;
\r
4960 return ALT_E_SUCCESS;
\r
4962 else if (clk_group == ALT_SDRAM_PLL_CLK_GRP)
\r
4964 // SDRAM PLL VCO register
\r
4965 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.vco = alt_read_word(ALT_CLKMGR_SDRPLL_VCO_ADDR);
\r
4967 // SDRAM PLL Control register
\r
4968 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ctrl = alt_read_word(ALT_CLKMGR_SDRPLL_CTL_ADDR);
\r
4970 // SDRAM PLL C0-C2 & C5 Counters
\r
4971 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddrdqsclk = alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR);
\r
4972 // doing these as 32-bit reads and writes avoids unnecessary masking operations
\r
4974 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddr2xdqsclk = alt_read_word(ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR);
\r
4975 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddrdqclk = alt_read_word(ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR);
\r
4976 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.s2fuser2clk = alt_read_word(ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR);
\r
4978 // SDRAM PLL Enable register
\r
4979 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.en = alt_read_word(ALT_CLKMGR_SDRPLL_EN_ADDR);
\r
4981 // SDRAM PLL Status register
\r
4982 clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.stat = alt_read_word(ALT_CLKMGR_SDRPLL_STAT_ADDR);
\r
4984 return ALT_E_SUCCESS;
\r
4988 return ALT_E_BAD_ARG;
\r
4993 // alt_clk_group_cfg_raw_set() sets the clock group configuration.
\r
4995 ALT_STATUS_CODE alt_clk_group_cfg_raw_set(const ALT_CLK_GROUP_RAW_CFG_t * clk_group_raw_cfg)
\r
4997 // test for matching silicon ID, but not for matching silicon revision number
\r
4998 if (ALT_SYSMGR_SILICONID1_ID_GET(alt_read_word(ALT_SYSMGR_SILICONID1_ADDR)) !=
\r
4999 ALT_SYSMGR_SILICONID1_ID_GET(clk_group_raw_cfg->verid))
\r
5001 return ALT_E_BAD_VERSION;
\r
5005 ALT_CLK_GRP_t clk_group = clk_group_raw_cfg->clkgrpsel;
\r
5008 if (clk_group == ALT_MAIN_PLL_CLK_GRP) { pll = ALT_CLK_MAIN_PLL; }
\r
5009 else if (clk_group == ALT_PERIPH_PLL_CLK_GRP) { pll = ALT_CLK_PERIPHERAL_PLL; }
\r
5010 else if (clk_group == ALT_SDRAM_PLL_CLK_GRP) { pll = ALT_CLK_SDRAM_PLL; }
\r
5013 return ALT_E_ERROR;
\r
5016 ALT_STATUS_CODE status = ALT_E_SUCCESS;
\r
5018 // if the PLL isn't in bypass mode, put it in bypass mode
\r
5020 if (alt_clk_pll_is_bypassed(pll) == ALT_E_FALSE)
\r
5022 status = alt_clk_pll_bypass_enable(pll, false);
\r
5023 if (status != ALT_E_SUCCESS)
\r
5031 // now write the values in the ALT_CLK_GROUP_RAW_CFG_t structure to the registers
\r
5032 if (clk_group == ALT_MAIN_PLL_CLK_GRP)
\r
5034 // Main PLL VCO register
\r
5035 alt_write_word(ALT_CLKMGR_MAINPLL_VCO_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.vco &
\r
5036 ALT_CLKMGR_MAINPLL_VCO_OUTRSTALL_CLR_MSK & ALT_CLKMGR_MAINPLL_VCO_OUTRST_CLR_MSK);
\r
5037 // the outreset and outresetall bits were probably clear when the
\r
5038 // state was saved, but make sure they're clear now
\r
5040 // Main PLL Misc register
\r
5041 alt_write_word(ALT_CLKMGR_MAINPLL_MISC_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.misc);
\r
5043 // Main PLL C0-C5 Counter registers
\r
5044 alt_write_word(ALT_CLKMGR_MAINPLL_MPUCLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mpuclk);
\r
5045 alt_write_word(ALT_CLKMGR_MAINPLL_MAINCLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainclk);
\r
5046 alt_write_word(ALT_CLKMGR_MAINPLL_DBGATCLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.dbgatclk);
\r
5047 alt_write_word(ALT_CLKMGR_MAINPLL_MAINQSPICLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainqspiclk);
\r
5048 alt_write_word(ALT_CLKMGR_MAINPLL_MAINNANDSDMMCCLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.mainnandsdmmcclk);
\r
5049 alt_write_word(ALT_CLKMGR_MAINPLL_CFGS2FUSER0CLK_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.cfgs2fuser0clk);
\r
5051 // Main PLL Counter Enable register
\r
5052 alt_write_word(ALT_CLKMGR_MAINPLL_EN_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.en);
\r
5054 // Main PLL Maindiv register
\r
5055 alt_write_word(ALT_CLKMGR_MAINPLL_MAINDIV_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.maindiv);
\r
5057 // Main PLL Debugdiv register
\r
5058 alt_write_word(ALT_CLKMGR_MAINPLL_DBGDIV_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.dbgdiv);
\r
5060 // Main PLL Tracediv register
\r
5061 alt_write_word(ALT_CLKMGR_MAINPLL_TRACEDIV_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.tracediv);
\r
5063 // Main PLL L4 Source register
\r
5064 alt_write_word(ALT_CLKMGR_MAINPLL_L4SRC_ADDR, clk_group_raw_cfg->clkgrp.mainpllgrp.raw.l4src);
\r
5066 else if (clk_group == ALT_PERIPH_PLL_CLK_GRP)
\r
5068 // Peripheral PLL VCO register
\r
5069 alt_write_word(ALT_CLKMGR_PERPLL_VCO_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.vco &
\r
5070 ALT_CLKMGR_PERPLL_VCO_OUTRST_CLR_MSK & ALT_CLKMGR_PERPLL_VCO_OUTRSTALL_CLR_MSK);
\r
5071 // the outreset and outresetall bits were probably clear when the
\r
5072 // state was saved, but make sure they're clear now
\r
5074 // Peripheral PLL Misc register
\r
5075 alt_write_word(ALT_CLKMGR_PERPLL_MISC_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.misc);
\r
5077 // Peripheral PLL C0-C5 Counters
\r
5078 alt_write_word(ALT_CLKMGR_PERPLL_EMAC0CLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.emac0clk);
\r
5079 alt_write_word(ALT_CLKMGR_PERPLL_EMAC1CLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.emac1clk);
\r
5080 alt_write_word(ALT_CLKMGR_PERPLL_PERQSPICLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.perqspiclk);
\r
5081 alt_write_word(ALT_CLKMGR_PERPLL_PERNANDSDMMCCLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.pernandsdmmcclk);
\r
5082 alt_write_word(ALT_CLKMGR_PERPLL_PERBASECLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.perbaseclk);
\r
5083 alt_write_word(ALT_CLKMGR_PERPLL_S2FUSER1CLK_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.s2fuser1clk);
\r
5085 // Peripheral PLL Counter Enable register
\r
5086 alt_write_word(ALT_CLKMGR_PERPLL_EN_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.en);
\r
5088 // Peripheral PLL Divider register
\r
5089 alt_write_word(ALT_CLKMGR_PERPLL_DIV_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.div);
\r
5091 // Peripheral PLL GPIO Divider register
\r
5092 alt_write_word(ALT_CLKMGR_PERPLL_GPIODIV_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.gpiodiv);
\r
5094 // Peripheral PLL Source register
\r
5095 alt_write_word(ALT_CLKMGR_PERPLL_SRC_ADDR, clk_group_raw_cfg->clkgrp.perpllgrp.raw.src);
\r
5097 else if (clk_group == ALT_SDRAM_PLL_CLK_GRP)
\r
5099 // SDRAM PLL VCO register
\r
5100 alt_write_word(ALT_CLKMGR_SDRPLL_VCO_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.vco &
\r
5101 ALT_CLKMGR_SDRPLL_VCO_OUTRST_CLR_MSK & ALT_CLKMGR_SDRPLL_VCO_OUTRSTALL_CLR_MSK);
\r
5102 // the outreset and outresetall bits were probably clear when the
\r
5103 // state was saved, but make sure they're clear now
\r
5105 // SDRAM PLL Control register
\r
5106 alt_write_word(ALT_CLKMGR_SDRPLL_CTL_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ctrl);
\r
5108 // SDRAM PLL C0-C2 & C5 Counters
\r
5109 alt_write_word(ALT_CLKMGR_SDRPLL_DDRDQSCLK_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddrdqsclk);
\r
5110 alt_write_word(ALT_CLKMGR_SDRPLL_DDR2XDQSCLK_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddr2xdqsclk);
\r
5111 alt_write_word(ALT_CLKMGR_SDRPLL_DDRDQCLK_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.ddrdqclk);
\r
5112 alt_write_word(ALT_CLKMGR_SDRPLL_S2FUSER2CLK_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.s2fuser2clk);
\r
5114 // SDRAM PLL Counter Enable register
\r
5115 alt_write_word(ALT_CLKMGR_SDRPLL_EN_ADDR, clk_group_raw_cfg->clkgrp.sdrpllgrp.raw.en);
\r
5118 // if PLL was not bypassed before, restore that state
\r
5121 status = alt_clk_pll_bypass_disable(pll);
\r
5128 // alt_clk_id_to_string() converts a clock ID to a text string.
\r
5130 ALT_STATUS_CODE alt_clk_id_to_string(ALT_CLK_t clk_id, char * output, size_t size)
\r
5132 char * name = NULL;
\r
5136 case ALT_CLK_IN_PIN_OSC1:
\r
5137 name = "IN_PIN_OSC1";
\r
5139 case ALT_CLK_IN_PIN_OSC2:
\r
5140 name = "IN_PIN_OSC2";
\r
5143 // FPGA Clock Sources External to HPS
\r
5144 case ALT_CLK_F2H_PERIPH_REF:
\r
5145 name = "F2H_PERIPH_REF";
\r
5147 case ALT_CLK_F2H_SDRAM_REF:
\r
5148 name = "F2H_SDRAM_REF";
\r
5151 // Other Clock Sources External to HPS
\r
5152 case ALT_CLK_IN_PIN_JTAG:
\r
5153 name = "IN_PIN_JTAG";
\r
5155 case ALT_CLK_IN_PIN_ULPI0:
\r
5156 name = "IN_PIN_ULPI0";
\r
5158 case ALT_CLK_IN_PIN_ULPI1:
\r
5159 name = "IN_PIN_ULPI1";
\r
5161 case ALT_CLK_IN_PIN_EMAC0_RX:
\r
5162 name = "IN_PIN_EMAC0_RX";
\r
5164 case ALT_CLK_IN_PIN_EMAC1_RX:
\r
5165 name = "IN_PIN_EMAC1_RX";
\r
5169 case ALT_CLK_MAIN_PLL:
\r
5170 name = "MAIN_PLL";
\r
5172 case ALT_CLK_PERIPHERAL_PLL:
\r
5173 name = "PERIPHERAL_PLL";
\r
5175 case ALT_CLK_SDRAM_PLL:
\r
5176 name = "SDRAM_PLL";
\r
5179 // OSC1 Clock Group - The OSC1 clock group contains those clocks which are derived
\r
5180 // directly from the osc_clk_1_HPS pin
\r
5181 case ALT_CLK_OSC1:
\r
5185 // Main Clock Group - The following clocks are derived from the Main PLL.
\r
5186 case ALT_CLK_MAIN_PLL_C0:
\r
5187 name = "MAIN_PLL_C0";
\r
5189 case ALT_CLK_MAIN_PLL_C1:
\r
5190 name = "MAIN_PLL_C1";
\r
5192 case ALT_CLK_MAIN_PLL_C2:
\r
5193 name = "MAIN_PLL_C2";
\r
5195 case ALT_CLK_MAIN_PLL_C3:
\r
5196 name = "MAIN_PLL_C3";
\r
5198 case ALT_CLK_MAIN_PLL_C4:
\r
5199 name = "MAIN_PLL_C4";
\r
5201 case ALT_CLK_MAIN_PLL_C5:
\r
5202 name = "MAIN_PLL_C5";
\r
5207 case ALT_CLK_MPU_L2_RAM:
\r
5208 name = "MPU_L2_RAM";
\r
5210 case ALT_CLK_MPU_PERIPH:
\r
5211 name = "MPU_PERIPH";
\r
5213 case ALT_CLK_L3_MAIN:
\r
5216 case ALT_CLK_L3_MP:
\r
5219 case ALT_CLK_L3_SP:
\r
5222 case ALT_CLK_L4_MAIN:
\r
5225 case ALT_CLK_L4_MP:
\r
5228 case ALT_CLK_L4_SP:
\r
5231 case ALT_CLK_DBG_BASE:
\r
5232 name = "DBG_BASE";
\r
5234 case ALT_CLK_DBG_AT:
\r
5237 case ALT_CLK_DBG_TRACE:
\r
5238 name = "DBG_TRACE";
\r
5240 case ALT_CLK_DBG_TIMER:
\r
5241 name = "DBG_TIMER";
\r
5246 case ALT_CLK_MAIN_QSPI:
\r
5247 name = "MAIN_QSPI";
\r
5249 case ALT_CLK_MAIN_NAND_SDMMC:
\r
5250 name = "MAIN_NAND_SDMMC";
\r
5255 case ALT_CLK_H2F_USER0:
\r
5256 name = "H2F_USER0";
\r
5259 // Peripherals Clock Group - The following clocks are derived from the Peripheral PLL.
\r
5260 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
5261 name = "PERIPHERAL_PLL_C0";
\r
5263 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
5264 name = "PERIPHERAL_PLL_C1";
\r
5266 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
5267 name = "PERIPHERAL_PLL_C2";
\r
5269 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
5270 name = "PERIPHERAL_PLL_C3";
\r
5272 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
5273 name = "PERIPHERAL_PLL_C4";
\r
5275 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
5276 name = "PERIPHERAL_PLL_C5";
\r
5278 case ALT_CLK_USB_MP:
\r
5281 case ALT_CLK_SPI_M:
\r
5284 case ALT_CLK_QSPI:
\r
5287 case ALT_CLK_NAND_X:
\r
5290 case ALT_CLK_NAND:
\r
5293 case ALT_CLK_SDMMC:
\r
5296 case ALT_CLK_EMAC0:
\r
5299 case ALT_CLK_EMAC1:
\r
5302 case ALT_CLK_CAN0:
\r
5305 case ALT_CLK_CAN1:
\r
5308 case ALT_CLK_GPIO_DB:
\r
5311 case ALT_CLK_H2F_USER1:
\r
5312 name = "H2F_USER1";
\r
5315 // SDRAM Clock Group - The following clocks are derived from the SDRAM PLL.
\r
5316 case ALT_CLK_SDRAM_PLL_C0:
\r
5317 name = "SDRAM_PLL_C0";
\r
5319 case ALT_CLK_SDRAM_PLL_C1:
\r
5320 name = "SDRAM_PLL_C1";
\r
5322 case ALT_CLK_SDRAM_PLL_C2:
\r
5323 name = "SDRAM_PLL_C2";
\r
5325 case ALT_CLK_SDRAM_PLL_C3:
\r
5326 name = "SDRAM_PLL_C3";
\r
5328 case ALT_CLK_SDRAM_PLL_C4:
\r
5329 name = "SDRAM_PLL_C4";
\r
5331 case ALT_CLK_SDRAM_PLL_C5:
\r
5332 name = "SDRAM_PLL_C5";
\r
5334 case ALT_CLK_DDR_DQS:
\r
5337 case ALT_CLK_DDR_2X_DQS:
\r
5338 name = "DDR_2X_DQS";
\r
5340 case ALT_CLK_DDR_DQ:
\r
5343 case ALT_CLK_H2F_USER2:
\r
5344 name = "H2F_USER2";
\r
5347 // Clock Output Pins
\r
5348 case ALT_CLK_OUT_PIN_EMAC0_TX:
\r
5349 name = "OUT_PIN_EMAC0_TX";
\r
5351 case ALT_CLK_OUT_PIN_EMAC1_TX:
\r
5352 name = "OUT_PIN_EMAC1_TX";
\r
5354 case ALT_CLK_OUT_PIN_SDMMC:
\r
5355 name = "OUT_PIN_SDMMC";
\r
5357 case ALT_CLK_OUT_PIN_I2C0_SCL:
\r
5358 name = "OUT_PIN_I2C0_SCL";
\r
5360 case ALT_CLK_OUT_PIN_I2C1_SCL:
\r
5361 name = "OUT_PIN_I2C1_SCL";
\r
5363 case ALT_CLK_OUT_PIN_I2C2_SCL:
\r
5364 name = "OUT_PIN_I2C2_SCL";
\r
5366 case ALT_CLK_OUT_PIN_I2C3_SCL:
\r
5367 name = "OUT_PIN_I2C3_SCL";
\r
5369 case ALT_CLK_OUT_PIN_SPIM0:
\r
5370 name = "OUT_PIN_SPIM0";
\r
5372 case ALT_CLK_OUT_PIN_SPIM1:
\r
5373 name = "OUT_PIN_SPIM1";
\r
5375 case ALT_CLK_OUT_PIN_QSPI:
\r
5376 name = "OUT_PIN_QSPI";
\r
5378 case ALT_CLK_UNKNOWN:
\r
5382 // do *not* put a 'default' statement here. Then the compiler will throw
\r
5383 // an error if another clock id enum is added if the corresponding
\r
5384 // string is not added to this function.
\r
5389 snprintf(output, size, "ALT_CLK_%s", name);
\r
5390 return ALT_E_SUCCESS;
\r
5394 return ALT_E_BAD_ARG;
\r
5400 // alt_clk_pll_cntr_maxfreq_recalc() recalculate the maxmum frequency of the specified clock.
\r
5402 ALT_STATUS_CODE alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_t clk, ALT_PLL_CNTR_FREQMAX_t * maxfreq)
\r
5404 ALT_STATUS_CODE ret = ALT_E_BAD_ARG;
\r
5407 ret = alt_clk_freq_get(clk, &freq);
\r
5409 if (ret == ALT_E_SUCCESS)
\r
5414 // Main Clock Group
\r
5415 case ALT_CLK_MAIN_PLL_C0:
\r
5416 maxfreq->MainPLL_C0 = freq;
\r
5417 printf("alt_pll_cntr_maxfreq.MainPLL_C0 = %10d\n", (unsigned int)freq);
\r
5419 case ALT_CLK_MAIN_PLL_C1:
\r
5420 maxfreq->MainPLL_C1 = freq;
\r
5421 printf("alt_pll_cntr_maxfreq.MainPLL_C1 = %10d\n", (unsigned int)freq);
\r
5423 case ALT_CLK_MAIN_PLL_C2:
\r
5424 maxfreq->MainPLL_C2 = freq;
\r
5425 printf("alt_pll_cntr_maxfreq.MainPLL_C2 = %10d\n", (unsigned int)freq);
\r
5427 case ALT_CLK_MAIN_PLL_C3:
\r
5428 maxfreq->MainPLL_C3 = freq;
\r
5429 printf("alt_pll_cntr_maxfreq.MainPLL_C3 = %10d\n", (unsigned int)freq);
\r
5431 case ALT_CLK_MAIN_PLL_C4:
\r
5432 maxfreq->MainPLL_C4 = freq;
\r
5433 printf("alt_pll_cntr_maxfreq.MainPLL_C4 = %10d\n", (unsigned int)freq);
\r
5435 case ALT_CLK_MAIN_PLL_C5:
\r
5436 maxfreq->MainPLL_C5 = freq;
\r
5437 printf("alt_pll_cntr_maxfreq.MainPLL_C5 = %10d\n", (unsigned int)freq);
\r
5440 // Peripheral Clock Group
\r
5441 case ALT_CLK_PERIPHERAL_PLL_C0:
\r
5442 maxfreq->PeriphPLL_C0 = freq;
\r
5443 printf("alt_pll_cntr_maxfreq.PeriphPLL_C0 = %10d\n", (unsigned int)freq);
\r
5445 case ALT_CLK_PERIPHERAL_PLL_C1:
\r
5446 maxfreq->PeriphPLL_C1 = freq;
\r
5447 printf("alt_pll_cntr_maxfreq.PeriphPLL_C1 = %10d\n", (unsigned int)freq);
\r
5449 case ALT_CLK_PERIPHERAL_PLL_C2:
\r
5450 maxfreq->PeriphPLL_C2 = freq;
\r
5451 printf("alt_pll_cntr_maxfreq.PeriphPLL_C2 = %10d\n", (unsigned int)freq);
\r
5453 case ALT_CLK_PERIPHERAL_PLL_C3:
\r
5454 maxfreq->PeriphPLL_C3 = freq;
\r
5455 printf("alt_pll_cntr_maxfreq.PeriphPLL_C3 = %10d\n", (unsigned int)freq);
\r
5457 case ALT_CLK_PERIPHERAL_PLL_C4:
\r
5458 maxfreq->PeriphPLL_C4 = freq;
\r
5459 printf("alt_pll_cntr_maxfreq.PeriphPLL_C4 = %10d\n", (unsigned int)freq);
\r
5461 case ALT_CLK_PERIPHERAL_PLL_C5:
\r
5462 maxfreq->PeriphPLL_C5 = freq;
\r
5463 printf("alt_pll_cntr_maxfreq.PeriphPLL_C5 = %10d\n", (unsigned int)freq);
\r
5466 // SDRAM Clock Group
\r
5467 case ALT_CLK_SDRAM_PLL_C0:
\r
5468 maxfreq->SDRAMPLL_C0 = freq;
\r
5469 printf("alt_pll_cntr_maxfreq.SDRAMPLL_C0 = %10d\n", (unsigned int)freq);
\r
5471 case ALT_CLK_SDRAM_PLL_C1:
\r
5472 maxfreq->SDRAMPLL_C1 = freq;
\r
5473 printf("alt_pll_cntr_maxfreq.SDRAMPLL_C1 = %10d\n", (unsigned int)freq);
\r
5475 case ALT_CLK_SDRAM_PLL_C2:
\r
5476 maxfreq->SDRAMPLL_C2 = freq;
\r
5477 printf("alt_pll_cntr_maxfreq.SDRAMPLL_C2 = %10d\n", (unsigned int)freq);
\r
5479 case ALT_CLK_SDRAM_PLL_C5:
\r
5480 maxfreq->SDRAMPLL_C5 = freq;
\r
5481 printf("alt_pll_cntr_maxfreq.SDRAMPLL_C5 = %10d\n", (unsigned int)freq);
\r
5484 ret = ALT_E_BAD_ARG;
\r
5485 printf("bad max frequency parameter\n");
\r
5487 } // end of switch-case construct
\r
5494 // u-boot preloader actually initialize clock manager circuitry
\r
5496 // alt_clk_clkmgr_init() attempt to fix the pll counter max frequencies, since
\r
5497 // thses frequencies are not known in advance until u-boot programmed clock manager.
\r
5499 ALT_STATUS_CODE alt_clk_clkmgr_init(void)
\r
5501 ALT_STATUS_CODE ret = ALT_E_SUCCESS;
\r
5502 ALT_STATUS_CODE status ;
\r
5504 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C0,&alt_pll_cntr_maxfreq );
\r
5505 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5507 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C1,&alt_pll_cntr_maxfreq );
\r
5508 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5510 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C2,&alt_pll_cntr_maxfreq );
\r
5511 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5513 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C3,&alt_pll_cntr_maxfreq );
\r
5514 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5516 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C4,&alt_pll_cntr_maxfreq );
\r
5517 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5519 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_MAIN_PLL_C5,&alt_pll_cntr_maxfreq );
\r
5520 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5522 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C0,&alt_pll_cntr_maxfreq );
\r
5523 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5525 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C1,&alt_pll_cntr_maxfreq );
\r
5526 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5528 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C2,&alt_pll_cntr_maxfreq );
\r
5529 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5531 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C3,&alt_pll_cntr_maxfreq );
\r
5532 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5534 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C4,&alt_pll_cntr_maxfreq );
\r
5535 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5537 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_PERIPHERAL_PLL_C5,&alt_pll_cntr_maxfreq );
\r
5538 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5541 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_SDRAM_PLL_C0,&alt_pll_cntr_maxfreq );
\r
5542 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5544 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_SDRAM_PLL_C1,&alt_pll_cntr_maxfreq );
\r
5545 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5547 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_SDRAM_PLL_C2,&alt_pll_cntr_maxfreq );
\r
5548 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r
5550 status = alt_clk_pll_cntr_maxfreq_recalc(ALT_CLK_SDRAM_PLL_C5,&alt_pll_cntr_maxfreq );
\r
5551 if (status != ALT_E_SUCCESS) ret = ALT_E_ERROR;
\r