blob: 602c79e68f057cb44aadbef716529e114d50097e [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2012
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * pll_gen95.c
40 *
41 * Project:
42 * --------
43 * UMOLYA
44 *
45 * Description:
46 * ------------
47 * PLL Related Functions
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 * ==========================================================================
54 * $Log$
55 *
56 * 08 22 2018 jun-ying.huang
57 * [MOLY00347832] [DFR][Gen95] Assertion Remove
58 * .
59 *
60 * 07 26 2018 jun-ying.huang
61 * [MOLY00342533] [DFR][Gen95] Assertion Review-Change ASSERT to DEBUG_ASSERT
62 * .
63 *
64 * 07 25 2018 jun-ying.huang
65 * [MOLY00342276] [MT6779]Add MT6779 macro for LATIFE
66 * .
67 *
68 * 06 26 2018 jun-ying.huang
69 * [MOLY00335159] [Gen95] MCU PLL Change DVFS Config To 95B
70 * Apply 95B PLL init for Eiger.
71 *
72 * 05 16 2018 jun-ying.huang
73 * [MOLY00325066] [MT3967][PLL]Update PLL golden setting
74 * Update 26M settle time and remove redundant function.
75 *
76 * 05 10 2018 jun-ying.huang
77 * [MOLY00325066] [MT3967][PLL]Update PLL golden setting
78 * Update Init MDVDSPPLL 850M->1000M, MDBRPPLL 600M->745M. Request by Kevin-KH Liu
79 *
80 * 05 09 2018 jun-ying.huang
81 * [MOLY00325066] [MT3967][PLL]Update PLL golden setting
82 * Update 26M settle time
83 *
84 * 03 12 2018 jun-ying.huang
85 * [MOLY00312896] [Eiger][PLL]Update 26M settle time
86 * Update PLL golden setting and update 26M settle time to 143T
87 *
88 * 02 13 2018 jun-ying.huang
89 * [MOLY00308378] [MT3967][PLL]Corrent MDPLL setting by DE
90 * .
91 *
92 * 01 17 2018 jun-ying.huang
93 * [MOLY00302798] [MT3967][PLL]Update ABBPLL_SETTLE_26M to 29us
94 * .
95 *
96 * 01 04 2018 jun-ying.huang
97 * [MOLY00299837] [MT3967][PLL]Update 26M settle time
98 * .
99 *
100 * 12 11 2017 jun-ying.huang
101 * [MOLY00295410] [PLL][MT3967] Add Macro for MT3967
102 * .
103 *
104 * 09 26 2017 jun-ying.huang
105 * [MOLY00261263] [MT6295M]Update PLL driver
106 * Update PLL init for 95B
107 *
108 *
109 ****************************************************************************/
110
111#ifdef __MTK_TARGET__ /* should NOT be compiled on MODIS */
112
113/*******************************************************************************
114 * Locally Used Options
115 *******************************************************************************/
116
117/*******************************************************************************
118 * Include header files
119 *******************************************************************************/
120
121#include "pll.h"
122#include "kal_public_api.h"
123#include "sync_data.h"
124#include "us_timer.h"
125
126#define PLL_FM_WIMDOW (0x1FF)
127
128/* Below for debugging */
129const char PLL_FM_clock[PLL_FM_NUM][32] =
130{
131 "MDBPI_PLL_D4", /* 0 */
132 "MDBPI_PLL_D6",
133 "MDSYS_MML2_CLOCK",
134 "FESYS_RXAGC_CLOCK",
135 "MDRXSYS_DFESYNC_CLOCK",
136 "FESYS_F208M_CLOCK", /* 5 */
137 "TRACE_MON_CLOCK",
138 "MDSYS_208M_CLOCK",
139 "MDRXSYS_RAKE_CLOCK",
140 "MDRXSYS_BRP_CLOCK",
141 "MDRXSYS_VDSP_CLOCK", /* 10 */
142 "MDTOP_LOG_ATB_CLOCK",
143 "FESYS_CSYS_CLOCK",
144 "FESYS_BSI_CLOCK",
145 "MDSYS_MDCORE_CLOCK",
146 "MDSYS_BUS2X_NODCM_CLOCK", /* 15 */
147 "MDSYS_BUS2X_CLOCK",
148 "MDTOP_DBG_CLOCK",
149 "AD_MDBPI_PLL_D7",
150 "AD_MDBPI_PLL_D5",
151 "AD_MDBPI_PLL_D4", /* 20 */
152 "AD_MDBPI_PLL_D3",
153 "AD_MDBPI_PLL_D2",
154 "AD_MDBRP_PLL",
155 "AD_MDVDSP_PLL",
156 "AD_MDMCU_PLL", /* 25 */
157/* below no use */
158 "null_26",
159 "null_27",
160 "null_28",
161 "null_29"
162};
163
164PLL_CLK_INFO g_pll_info = {0};
165
166/* Above for debugging */
167
168/**
169 * This function is used to detect ASIC or FPGA version of Palladium
170 */
171__PLL_CODE_IN_BOOT__ kal_bool PLL_FPGA_IS_ASIC(void)
172{
173#if defined(__FPGA__)
174 kal_uint32 asic_flag = *((volatile kal_uint32 *)(0xA0000018)) & (0x1 << 7);
175
176 if (asic_flag == 0)
177 return KAL_TRUE;
178 else
179 return KAL_FALSE;
180#else
181 return KAL_TRUE;
182#endif
183}
184
185__PLL_CODE_IN_BOOT__ void INT_SetPLL_Gen95(void)
186{
187#if defined(MT6295M) || defined(MT3967) || defined(MT6779) /* FPGA & EIGER & LAFITE */
188
189 // Default md_srclkena_ack settle time = 154T 32K
190 *REG_MDTOP_PLLMIXED_DCXO_PLL_SETTLE_CTL = 0x02021C9A;
191
192 //Change ABBPLL_SETTLE_26M to 0x2F2==>29us
193 *REG_MDTOP_PLLMIXED_PLL_SETTLE_26M_CTL = 0x17920803;
194
195 // set mdmcupll/mdvdsppll/mdbrppll posdiv to 0
196 *REG_MDTOP_PLLMIXED_MDMCUPLL_CTL1 &= (0x2 ^ 0xFFFFFFFF);
197 *REG_MDTOP_PLLMIXED_MDVDSPPLL_CTL1 &= (0x2 ^ 0xFFFFFFFF);
198 *REG_MDTOP_PLLMIXED_MDBRPPLL_CTL1 &= (0x101 ^ 0xFFFFFFFF);
199 // set pll srouce from AP clock divider
200 *REG_MDTOP_PLLMIXED_PLL_SRC_SEL = 0x0;
201 // set pll clock enable in AP clock divider
202 *REG_MDTOP_PLLMIXED_PLL_DIV_EN |= 0x080202;
203
204 *REG_MDTOP_PLLMIXED_MDBPIPLL_CTL0 = 0x80114EC5; // Fixed Fvco = 1800Mhz. (/2)900M, (/3)600M, (/4)450M, (/5)360M, (/7)257M
205 *REG_MDTOP_PLLMIXED_MDBRPPLL_CTL0 = 0x8023D200; // Fvco = 3725Mhz. 3725/5 = 745Mhz
206 *REG_MDTOP_PLLMIXED_MDVDSPPLL_CTL0 = 0x801CD800; // Fvco = 3000Mhz. 3000/3 = 1000Mhz
207 *REG_MDTOP_PLLMIXED_MDMCUPLL_CTL0 = 0x801CD800; // Fvco = 3000Mhz. 3000/3 = 1000Mhz
208
209#else
210 #error "Unsupported Chip Target in PLL Module"
211#endif
212
213 MO_Sync();
214
215 *REG_MDTOP_CLKSW_LOG_ATB_FLEXCKGEN_SEL = 0x02; // LOG_ATB = 100Mhz (mdbpipll_d3_div2_ck/3)
216 *REG_MDTOP_CLKSW_MML2_DFS_FLEXCKGEN_SEL = 0x10; // MML2_DFS_PLLSEL=MDBPIPLL_D4 ; MML2_DFS_DIVSEL=divided-by 1
217
218 MO_Sync();
219
220 /*
221 * Polling until MDMCUPLL complete frequency adjustment
222 * Once MDMCUPLL complete, other PLL should complete too
223 */
224 while ((*REG_MDTOP_PLLMIXED_MDMCUPLL_STS >> 14)&0x1);
225
226 /* PLL ON controlled by HW */
227 *REG_MDTOP_PLLMIXED_PLL_ON_CTL = 0x0;
228
229 /* Update ABB MDPLL control register default value */
230 *REG_MDTOP_PLLMIXED_MDPLL_CTL1 = 0x04C63200;
231
232 MO_Sync();
233
234 #if defined(__PALLADIUM__)
235 if (PLL_FPGA_IS_ASIC() == KAL_TRUE) {
236 while ((*REG_MDTOP_CLKSW_MDSYS_BUS_FLEXCKGEN_STS & 0x8000) != 0x8000);
237 }
238 #else // Not PALLADIUM
239 #if !defined(__FPGA__)
240 /*
241 * Wait MD bus clock ready
242 * Once MD bus ready, other clock should be ready too
243 * In FPGA, the following status checking must be removed since there is no flex ck gen in FPGA.
244 */
245 while ((*REG_MDTOP_CLKSW_MDSYS_BUS_FLEXCKGEN_STS & 0x8000) != 0x8000);
246 #endif // __FPGA__
247 #endif // __PALLADIUM__
248
249 /* Switch clock source to PLL */
250 *REG_MDTOP_CLKSW_CLKSEL_CTL |= 0x3; //switch MDMCU & MD BUS clock to PLL frequency
251 MO_Sync();
252 *REG_MDTOP_CLKSW_CLKSEL_CTL |= 0x31811F5C; //switch all clock to PLL frequency
253 MO_Sync();
254 *REG_MDTOP_CLKSW_CLKON_CTL = 0x1; //Turn off all SW clock request, except ATB
255 MO_Sync();
256 *REG_MDTOP_CLKSW_SDF_CK_CTL |= 0x11; // switch SDF clock to PLL frequency
257 MO_Sync();
258
259 // Clear PLL ADJ RDY IRQ fired by initial period adjustment
260 *REG_MDTOP_PLLMIXED_PLL_HP_RDY_IRQ = 0xFFFF;
261 MO_Sync();
262
263 // Mask all PLL ADJ RDY IRQ
264 *REG_MDTOP_PLLMIXED_PLL_HP_RDY_IRQ_MASK = 0xFFFF;
265 MO_Sync();
266
267 // Make a record that means MD pll has been initialized.
268 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_NUM;
269 MO_Sync();
270
271}
272
273__PLL_CODE_IN_BOOT__ kal_uint8 pll_get_current_vpe_id(void)
274{
275 unsigned int vpe_id = 0;
276
277 __asm__ __volatile__(
278 "mfc0 %0, $15, 1" \
279 : "=r" (vpe_id) \
280 :);
281
282 return (vpe_id & 0xF);
283}
284
285/*************************************************************************
286 * FUNCTION
287 * INT_SetPLL
288 *
289 * DESCRIPTION
290 * This function dedicates for PLL setting.
291 *
292 * PARAMETERS
293 * Init mode of PLL
294 *
295 * RETURNS
296 * Note : This function would only call by MD.
297 *************************************************************************/
298__PLL_CODE_IN_BOOT__ void INT_SetPLL(void)
299{
300#if !defined(__COSIM_BYPASS__) && !defined(__ESL_MASE__)
301 if ((pll_get_current_vpe_id() == 0))
302 {
303 if (*REG_MDTOP_PLLMIXED_PLL_DUMMY != MD_PLL_MAGIC_NUM)
304 {/* PLL didn't init by BootRom */
305 PLL_MD_Pll_Init();
306
307 // Make a record that means MD pll has init by MD.
308 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_MD;
309 }
310 }
311#endif // __COSIM_BYPASS__
312}
313
314/*************************************************************************
315 * FUNCTION
316 * PLL_MD_Pll_Init
317 *
318 * DESCRIPTION
319 * This function dedicates for PLL setting.
320 *
321 * PARAMETERS
322 * Init mode of PLL
323 *
324 * RETURNS
325 * Note : This function would call by BootRom and MD!!
326 *************************************************************************/
327__PLL_CODE_IN_BOOT__ void PLL_MD_Pll_Init(void)
328{
329#if !defined(__COSIM_BYPASS__) && !defined(__ESL_MASE__)
330 INT_SetPLL_Gen95();
331#endif // __COSIM_BYPASS__
332}
333
334 /*------------------------------------------------------------------------
335 * void PLL_Set_CLK_To_26M
336 * Purpose: Re-configure all the module clocks from PLL to 26M.
337 * Parameters:
338 * Input: None.
339 *
340 * Output: None.
341 *
342 * returns : void.
343 * Note : This function would call by BootRom!!
344 *
345 *------------------------------------------------------------------------
346 */
347__PLL_CODE_IN_BOOT__ void PLL_Set_CLK_To_26M(void)
348{
349 // set mdmcupll/mdvdsppll/mdbrppll posdiv to 0
350 *REG_MDTOP_CLKSW_CLKSEL_CTL = 0x2A000000; //switch all clock to XTAL frequency
351 *REG_MDTOP_CLKSW_SDF_CK_CTL = 0x201; // switch SDF clock to XTAL frequency
352
353 // Make a record that means MD pll has been changed to 26M.
354 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_26M;
355}
356
357 /*------------------------------------------------------------------------
358 * void PLL_FrequencyMeter_GetFreq
359 * Purpose: Get specified PLL/module's clock(Mhz).
360 * Parameters:
361 * Input: PLL_FM_SOURCE index: The module you want to measure.
362 *
363 * Output: None.
364 *
365 * returns : The PLL/module's clock(Mhz).
366 * Note : This function would spend at least 20us to measure the clock.
367 *
368 *------------------------------------------------------------------------
369 */
370kal_uint32 PLL_FrequencyMeter_GetFreq(PLL_FM_SOURCE index)
371{
372 kal_uint32 count = 2000, output = 0;
373
374 if ((index < PLL_FM_SOURCE_START) || (index > PLL_FM_SOURCE_END))
375 return 0;
376
377 *REG_MDTOP_CLKSW_CKMON_CTL = PLL_FM_MDSYS_MDCORE_CLOCK; //select source to a valid clock to let reset success.
378
379 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 0; //reset frequency meter
380
381 MO_Sync();
382 ust_us_busyloop(2);//let Frequency Meter reset done
383
384 *REG_MDTOP_CLKSW_CKMON_CTL = 0x300 | index; //divided by 8 and select source
385 *REG_MDTOP_CLKSW_FREQ_METER_XTAL_CNT = PLL_FM_WIMDOW;
386 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 1; //enable frequency meter
387 MO_Sync();
388
389 // wait measure done or timeout
390 while (((*REG_MDTOP_CLKSW_FREQ_METER_CTL) & (1 << 1)) == 0)
391 {
392 count--;
393 if (count == 0)
394 break;
395 }
396
397 if (count == 0)
398 return 0;
399
400 output = *REG_MDTOP_CLKSW_FREQ_METER_CKMON_CNT * 26 * 8 / (PLL_FM_WIMDOW+3);
401
402 *REG_MDTOP_CLKSW_CKMON_CTL = 0; //select source to NULL to save power in flip-flop, save about 0.07mA in 6293
403
404 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 0; //reset frequency meter
405
406 return output;
407}
408
409void PLL_exception_dump(void)
410{
411 g_pll_info.MDBPI_PLL_D4 = PLL_FrequencyMeter_GetFreq(PLL_FM_MDBPI_PLL_D4);
412 g_pll_info.MDBPI_PLL_D6 = PLL_FrequencyMeter_GetFreq(PLL_FM_MDBPI_PLL_D6);
413 g_pll_info.MDSYS_MML2_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_MML2_CLOCK);
414 g_pll_info.FESYS_RXAGC_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_RXAGC_CLOCK);
415 g_pll_info.MDRXSYS_DFESYNC_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_DFESYNC_CLOCK);
416 g_pll_info.FESYS_F208M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_F208M_CLOCK);
417 g_pll_info.TRACE_MON_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TRACE_MON_CLOCK);
418 g_pll_info.MDSYS_208M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_208M_CLOCK);
419 g_pll_info.MDRXSYS_RAKE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_RAKE_CLOCK);
420 g_pll_info.MDRXSYS_BRP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_BRP_CLOCK);
421 g_pll_info.MDRXSYS_VDSP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_VDSP_CLOCK);
422 g_pll_info.MDTOP_LOG_ATB_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_LOG_ATB_CLOCK);
423 g_pll_info.FESYS_CSYS_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_CSYS_CLOCK);
424 g_pll_info.FESYS_BSI_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_BSI_CLOCK);
425 g_pll_info.MDSYS_MDCORE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_MDCORE_CLOCK);
426 g_pll_info.MDSYS_BUS2X_NODCM_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_BUS2X_NODCM_CLOCK);
427 g_pll_info.MDSYS_BUS2X_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_BUS2X_CLOCK);
428 g_pll_info.MDTOP_DBG_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_DBG_CLOCK);
429
430 g_pll_info.AD_MDBPI_PLL_D7 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D7);
431 g_pll_info.AD_MDBPI_PLL_D5 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D5);
432 g_pll_info.AD_MDBPI_PLL_D4 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D4);
433 g_pll_info.AD_MDBPI_PLL_D3 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D3);
434 g_pll_info.AD_MDBPI_PLL_D2 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D2);
435 g_pll_info.AD_MDBRP_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBRP_PLL);
436 g_pll_info.AD_MDVDSP_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDVDSP_PLL);
437 g_pll_info.AD_MDMCU_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDMCU_PLL);
438}
439
440/****************************************************************
441 Function for SDF module. (SIB)
442****************************************************************/
443 /*------------------------------------------------------------------------
444 * void PLL_CLKSW_SDF_SRC_CKSEL_Get
445 * Purpose: Get the selection of SDF source clock.
446 * Parameters:
447 * Input: None.
448 *
449 * Output: None.
450 *
451 * returns : The selection of SDF source clock
452 *
453 * Note : Porting from LR12's PLL_SDF_SRC_CKSEL_GET().
454 *
455 *------------------------------------------------------------------------
456 */
457kal_uint32 PLL_CLKSW_SDF_SRC_CKSEL_Get()
458{
459 if((*REG_MDTOP_CLKSW_SDF_CK_CTL&(1<<4))==0)
460 {
461 return CLKSW_SDF_SRC_26M;
462 }
463 else
464 {
465 return (((*REG_MDTOP_CLKSW_SDF_CK_CTL) & 0x00000700) >> 8);
466 }
467}
468
469 /*------------------------------------------------------------------------
470 * void PLL_CLKSW_SDF_SRC_CKSEL_Set
471 * Purpose: Set the selection of SDF source clock.
472 * Parameters:
473 * Input: PLL_CLKSW_SDF_SRC src_ck: CLKSW_SDF_SRC_xxx in "Pll_genxx.h", src_clk index.
474 *
475 * Output: None.
476 *
477 * returns : KAL_TRUE/KAL_FALSE
478 *
479 * Note : Porting from LR12's PLL_SDF_SRC_CKSEL_SET().
480 *
481 *------------------------------------------------------------------------
482 */
483kal_bool PLL_CLKSW_SDF_SRC_CKSEL_Set(PLL_CLKSW_SDF_SRC src_clk)
484{
485 //kal_uint32 caller_LR;
486 //GET_RETURN_ADDRESS(caller_LR);
487
488 if (src_clk >= CLKSW_SDF_SRC_END)
489 {
490 //EXT_ASSERT(0, caller_LR, src_clk, 0);
491 return KAL_FALSE;
492 }
493
494 if(src_clk == CLKSW_SDF_SRC_26M)
495 {/* Restore to default setting */
496
497 // SDF clock switch to 26Mhz
498 *REG_MDTOP_CLKSW_SDF_CK_CTL &= ~(1<<4);
499
500 //restore SDF clock source
501 *REG_MDTOP_CLKSW_SDF_CK_CTL = ((*REG_MDTOP_CLKSW_SDF_CK_CTL) & 0xFFFFF8FF) | (CLKSW_SDF_SRC_BPIPLL<<8);
502 }
503 else
504 {
505 // SDF clock switch to 26Mhz
506 *REG_MDTOP_CLKSW_SDF_CK_CTL &= ~(1<<4);
507
508 //set SDF clock source
509 *REG_MDTOP_CLKSW_SDF_CK_CTL = ((*REG_MDTOP_CLKSW_SDF_CK_CTL) & 0xFFFFF8FF) | (src_clk<<8);
510
511 // SDF clock switch to full speed
512 *REG_MDTOP_CLKSW_SDF_CK_CTL |= (1<<4);
513 }
514
515 MO_Sync();
516
517 return KAL_TRUE;
518}
519
520#endif /* should NOT be compiled on MODIS */