blob: 1d14c53984e4f7ac13b5bf499cce74c55e2f82e5 [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_gen97.c
40 *
41 * Project:
42 * --------
43 * UMOLYE
44 *
45 * Description:
46 * ------------
47 * PLL Related Functions
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 * ==========================================================================
54 * $Log$
55 *
56 * 11 24 2020 e-lin.ho
57 * [MOLY00593429] [Gen97] Check-in debug code to get high precision MDPLL frequency in exception flow
58 *
59 * [Gen97] Check-in debug code to get high precision MDPLL frequency in exception flow
60 *
61 * 07 29 2020 e-lin.ho
62 * [MOLY00521672] [Gen97] Colgin SB Branch & Call for Check-in
63 *
64 * .
65 *
66 * 07 15 2020 e-lin.ho
67 * [MOLY00546221] [Palmer call for check-in] Add Macro for MT6833
68 *
69 * [Palmer call for check-in] Add Macro for MT6833
70 *
71 * 06 17 2020 jun-ying.huang
72 * [MOLY00535069] [MMRFD][UCNT] Read D die PLL CNT at exception flow
73 * Add PLL related function
74 *
75 * 03 20 2020 jun-ying.huang
76 * [MOLY00505554] [VMOLY][Mouton]Sync/Update Mouton Bring up code
77 * .
78 *
79 * 01 16 2020 jun-ying.huang
80 * [MOLY00474985] [MOUTON call for check-in] Add Macro for MT6853
81 * .
82 *
83 * 11 05 2019 jun-ying.huang
84 * [MOLY00457260] [MARGAUX call for check-in]Update related driver for MARGAUX
85 * .
86 *
87 * 09 23 2019 jun-ying.huang
88 * [MOLY00442314] [MARGAUX call for check-in] Add Macro for MT6873
89 * .
90 *
91 * 09 03 2019 jun-ying.huang
92 * [MOLY00431611] [VMOLY][Petrus]Update related driver for Petrus.
93 * Update AMIF&PLL driver
94 *
95 * 08 20 2019 jun-ying.huang
96 * [MOLY00431611] [VMOLY][Petrus]Update related driver for Petrus.
97 * Update DCM and PLL driver
98 *
99 * 06 26 2019 jun-ying.huang
100 * [MOLY00416732] [APOLLO][VMOLY]Update PLL setting
101 * Change NR_TXBSRP clock from 624 to 450Mhz due to TXBSRP issue
102 *
103 * 06 11 2019 jun-ying.huang
104 * [MOLY00406229] [VMOLY][MT6885]Update PLL init setting
105 * Update MDMCUPLL
106 *
107 * 05 14 2019 jun-ying.huang
108 * [MOLY00406229] [VMOLY][MT6885]Update PLL init setting
109 * Update PLL setting for Petrus
110 *
111 * 12 21 2018 jun-ying.huang
112 * [MOLY00370736] [MT6885]Update PLL for MT6885
113 * PLL init setting change for APOLLO request
114 *
115 * 12 05 2018 jun-ying.huang
116 * [MOLY00370736] [MT6885]Update PLL for MT6885
117 * .
118 *
119 * 11 29 2018 jun-ying.huang
120 * [MOLY00368816] [MT6297][APOLLO]Update PLL driver
121 * Bus fix for frequency meter
122 *
123 * 11 01 2018 jun-ying.huang
124 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
125 * Update PLL init
126 *
127 * 09 11 2018 jun-ying.huang
128 * [MOLY00351556] [MT6297]Remove 26M status check in BASIC/MD only load
129 * .
130 *
131 * 08 17 2018 jun-ying.huang
132 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
133 * .
134 *
135 * 08 09 2018 jun-ying.huang
136 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
137 * .
138 *
139 * 07 30 2018 jun-ying.huang
140 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
141 * .
142 *
143 * 07 13 2018 jun-ying.huang
144 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
145 * .
146 *
147 * 07 06 2018 jun-ying.huang
148 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
149 * .
150 *
151 * 06 06 2018 jun-ying.huang
152 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
153 * 1st version of PLL driver
154 *
155 * 06 06 2018 jun-ying.huang
156 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
157 * .
158 *
159 * 05 30 2018 jun-ying.huang
160 * [MOLY00329887] [MT6297][APOLLO]Update PLL driver for Gen97
161 * draft version
162 *
163 *
164 *
165 ****************************************************************************/
166
167#ifdef __MTK_TARGET__ /* should NOT be compiled on MODIS */
168
169/*******************************************************************************
170 * Locally Used Options
171 *******************************************************************************/
172
173/*******************************************************************************
174 * Include header files
175 *******************************************************************************/
176
177#include "pll.h"
178#include "kal_public_api.h"
179#include "sync_data.h"
180#include "us_timer.h"
181#include "sleepdrv_common.h"
182#include "ex_public.h"
183
184/*******************************************************************************
185 * external functions
186 *******************************************************************************/
187extern void PLL_SEC_SW_VERSION_ENHANCE();
188
189/* Below for debugging */
190const char PLL_FM_clock[PLL_FM_NUM][32] =
191{
192 "AD_MDNRPLL5", /* 0 */
193 "AD_MDNRPLL4_1",
194 "AD_MDNRPLL4_0",
195 "AD_MDNRPLL3",
196 "AD_MDNRPLL2",
197 "AD_MDNRPLL1", /* 5 */
198 "AD_MDNRPLL0",
199 "MDSYS_NRL2_CLOCK",
200 "MDRXSYS_DFESYNC_CLOCK",
201 #if defined(MT6297)/* APOLLO */
202 "MDTOP_F208M_CLOCK",
203 "TRACE_MON_CLOCK", /* 10 */
204 "MDSYS_208M_CLOCK",
205 #else/* PETRUS and later */
206 "MDTOP_F216P7M_CLOCK",
207 "TRACE_MON_CLOCK", /* 10 */
208 "MDSYS_216P7M_CLOCK",
209 #endif
210 "MDRXSYS_RAKE_CLOCK",
211 "MDRXSYS_BRP_CLOCK",
212 "MDRXSYS_VDSP_CLOCK",
213 "MDTOP_LOG_ATB_CLOCK", /* 15 */
214 "FESYS_CSYS_CLOCK",
215 "MDSYS_SHAOLIN_CLOCK",
216 "FESYS_BSI_CLOCK",
217 "MDSYS_MDCORE_CLOCK",
218 "MDSYS_BUS2X_NODCM_CLOCK",/* 20 */
219 "MDSYS_BUS4X_CLOCK",
220 "MDTOP_DBG_CLOCK",
221 "AD_MDBPI_PLL_D7",
222 "AD_MDBPI_PLL_D5",
223 "AD_MDBPI_PLL_D4", /* 25 */
224 "AD_MDBPI_PLL_D3",
225 "AD_MDBPI_PLL_D2",
226 "AD_MDBRP_PLL",
227 "AD_MDVDSP_PLL",
228 "AD_MDMCU_PLL", /* 30 */
229 #if defined(MT6297)/* APOLLO */
230 "MDTOP_BUS4X_CLOCK",
231 "RXCPC_CPC_CLOCK",
232 "RXDDMBRP_RXCSI_CLOCK",
233 "RXDDMBRP_RXDBRP_CLOCK",
234 "RXDDMBRP_RXDDM_CLOCK", /* 35 */
235 "MCORE_MCORE_CLOCK",
236 "VCOREHRAM_VCORE_CLOCK",
237 "VCOREHRAM_HRAM_CLOCK",
238 "FESYS_TXBSRP_CLOCK",
239 "FESYS_MDPLL_CLOCK", /* 40 */
240 "TX_CS_NR_RXT2F_NR_CLOCK",
241 "TX_CS_NR_TXBSRP_NR_CLOCK",
242 "TX_CS_NR_CM_NR_CLOCK",
243 "TX_CS_NR_CS_NR_CLOCK",
244/* below no use */
245 "null_45", /* 45 */
246 "null_46",
247 "null_47"
248 #else/* PETRUS and later */
249 "DFESYS_RXDFE_BB_CORE_CLOCK",
250 "AD_MDNRPLL4_2",
251 "MDTOP_BUS4X_FIXED_CLOCK",
252 "DA_DRF_26M_CLOCK",
253 "MDTOP_BUS4X_CLOCK", /* 35 */
254 "RXCPC_CPC_CLOCK",
255 "RXDDMBRP_RXDBRP_CLOCK",
256 "RXDDMBRP_RXDDM_CLOCK",
257 "MCORE_MCORE_CLOCK",
258 "VCOREHRAM_VCORE_CLOCK", /* 40 */
259 "VCOREHRAM_HRAM_CLOCK",
260 "FESYS_TXBSRP_CLOCK",
261 "FESYS_MDPLL_CLOCK",
262 "TX_CS_NR_RXT2F_NR_CLOCK",
263 "TX_CS_NR_TXBSRP_NR_CLOCK",/* 45 */
264 "TX_CS_NR_CM_NR_CLOCK",
265 "TX_CS_NR_CS_NR_CLOCK"
266 /* we couldn't add more PLL here... */
267 #endif
268};
269
270PLL_CLK_INFO g_pll_info = {0};
271
272/* Above for debugging */
273
274/**
275 * This function is used to detect ASIC or FPGA version of Palladium
276 */
277__PLL_CODE_IN_BOOT__ kal_bool PLL_FPGA_IS_ASIC(void)
278{
279#if defined(__FPGA__)
280 kal_uint32 asic_flag = *((volatile kal_uint32 *)(0xA0000018)) & (0x1 << 7);
281
282 if (asic_flag == 0)
283 return KAL_TRUE;
284 else
285 return KAL_FALSE;
286#else
287 return KAL_TRUE;
288#endif
289}
290
291__PLL_CODE_IN_BOOT__ void INT_SetPLL_Gen97(void)
292{
293#if defined(MT6297)/* APOLLO */
294 // Default md_srclkena_ack settle time = 150T 32K
295 *REG_MDTOP_PLLMIXED_DCXO_PLL_SETTLE_CTL = (0x02021C00|SYS_CLK_SETTLE);
296
297 //Change ABBPLL_SETTLE_26M to 0x2F2==>29us
298 *REG_MDTOP_PLLMIXED_PLL_SETTLE_26M_CTL = 0x17920803;
299
300 // Set HRAM to 800Mhz for initial
301 *REG_MDTOP_CLKSW_NR_TXBSRP_DFS_FLEXCKGEN_SEL = 0x21;
302 *REG_MDTOP_CLKSW_IA_DFS_FLEXCKGEN_SEL = 0x0;
303 *REG_MDTOP_CLKSW_HRAM_DFS_FLEXCKGEN_SEL = 0x30; // to NRPLL4_1_CK 800Mhz
304 *REG_MDTOP_CLKSW_DFESYNC_FLEXCKGEN_SEL = 0x11; // to BPIPLL
305 *REG_MDTOP_CLKSW_SHAOLIN_DFS_FLEXCKGEN_SEL = 0x10; // to NRPLL1
306 *REG_MDTOP_CLKSW_MML2_DFS_FLEXCKGEN_SEL = 0x21; // NRL2 spec to 450Mhz
307 *REG_MDTOP_CLKSW_MCORE_DFS_FLEXCKGEN_SEL = 0x10; // MCORE spec to 900Mhz
308 *REG_MDTOP_CLKSW_VCORE_DFS_FLEXCKGEN_SEL = 0x10; // VCORE spec to 900Mhz
309
310 *REG_MDTOP_CLKSW_CLK_DUMMY = 0x00F7FFFF; // NR0/1/2/4/5 PLL turn on
311
312 *REG_MDTOP_PLLMIXED_MDNRPLL3_CTL1 &= 0xFFFEFFFF; // set FBKSEL=0
313 *REG_MDTOP_PLLMIXED_MDNRPLL4_CTL1 &= 0xFFFEFFFF; // set FBKSEL=0
314
315 *REG_MDTOP_PLLMIXED_MDBPIPLL_CTL0 = 0x80117B13; // Fixed Fvco = 1818Mhz (for HRAM to 910Mhz). (/2)909M, (/3)606M, (/4)454M, (/5)363M, (/6)303M, (/7)259M
316 *REG_MDTOP_PLLMIXED_MDBRPPLL_CTL0 = 0x8023D800; // Fvco = 3728Mhz. 3728/4 = 932Mhz
317 *REG_MDTOP_PLLMIXED_MDVDSPPLL_CTL0 = 0x80229E00; // Fvco = 3600Mhz. 3600/4 = 900Mhz
318 *REG_MDTOP_PLLMIXED_MDMCUPLL_CTL0 = 0x8019F626; // Fvco = 2700Mhz. 2700/3 = 900Mhz
319
320 *REG_MDTOP_PLLMIXED_MDPLL_CTL0 = 0x80180000; // Fvco = 2496Mhz. 2496/4 = 624Mhz
321 *REG_MDTOP_PLLMIXED_MDPLL_CTL1 = 0x12;
322
323 *REG_MDTOP_PLLMIXED_MDNRPLL0_CTL0 = 0x80133C00; // Fvco = 2000Mhz. 2000/2 = 1000Mhz
324 *REG_MDTOP_PLLMIXED_MDNRPLL1_CTL0 = 0x80171400; // Fvco = 2400Mhz. 2400/2 = 1200Mhz
325 *REG_MDTOP_PLLMIXED_MDNRPLL2_CTL0 = 0x801AEC00; // Fvco = 2800Mhz. 2800/2 = 1400Mhz
326 *REG_MDTOP_PLLMIXED_MDNRPLL3_CTL0 = 0x80180000; // Fvco = 2496Mhz. 2496/4 = 624Mhz
327 *REG_MDTOP_PLLMIXED_MDNRPLL4_CTL0 = 0x800F6200; // Fvco = 1600Mhz. 1600/1 = 1600Mhz
328 *REG_MDTOP_PLLMIXED_MDNRPLL5_CTL0 = 0x801CD800; // Fvco = 3000Mhz. 3000/2 = 1500Mhz
329
330 //#if defined(MT6297_IA)/* 97 IA */
331 // *REG_MDTOP_PLLMIXED_PLL_ON_CTL = 0xDC00DC0; // force NR0/1/2/4/5 PLL turn on
332 //#else/* 97 SHAOLIN */
333 // *REG_MDTOP_PLLMIXED_PLL_ON_CTL = 0x5C005C0; // force NR0/1/2/4 PLL turn on
334 //#endif
335
336#else /* PETRUS, MARGAUX, MOUTON, COLGIN, Palmer */
337 // Default md_srclkena_ack settle time = SYS_CLK_SETTLE T 32K in sleepdrv_common.h
338 *REG_MDTOP_PLLMIXED_DCXO_PLL_SETTLE_CTL = (0x02021C00|SYS_CLK_SETTLE);
339
340 //Change ABBPLL_SETTLE_26M to 0x2F2==>29us
341 *REG_MDTOP_PLLMIXED_PLL_SETTLE_26M_CTL = 0x17920803;
342
343 #if defined(MT6297) || defined(MT6885) || defined(MT6873) /* APOLLO or PETRUS or MARGAUX */
344 /* keep default value */
345 #else /* COLGIN, MOUTON and later... */
346 *REG_MDTOP_PLLMIXED_MDPLLGP_RESERVE = 0x0;
347 #endif
348 *REG_MDTOP_CLKSW_CLK_DUMMY = 0x00DFFFFF;
349 *REG_MDTOP_PLLMIXED_PLL_SRC_SEL = 0x0;
350
351 *REG_MDTOP_CLKSW_SHAOLIN_DFS_FLEXCKGEN_SEL = 0x10; // to NRPLL1
352 *REG_MDTOP_CLKSW_DFESYNC_FLEXCKGEN_SEL = 0x11; // to BPIPLL
353 *REG_MDTOP_CLKSW_HRAM_DFS_FLEXCKGEN_SEL = 0x30; // to NRPLL4_1_CK 800Mhz
354 *REG_MDTOP_CLKSW_NR_RXT2F_DFS_FLEXCKGEN_SEL=0x01;
355 *REG_MDTOP_CLKSW_NR_CS_DFS_FLEXCKGEN_SEL=0x00;
356 *REG_MDTOP_CLKSW_NR_CM_DFS_FLEXCKGEN_SEL=0x00;
357 *REG_MDTOP_CLKSW_NR_TXBSRP_DFS_FLEXCKGEN_SEL=0x00;
358
359 *REG_MDTOP_PLLMIXED_PLL_DIV_EN0 = 0x2F020202;
360 *REG_MDTOP_PLLMIXED_PLL_DIV_EN3 = 0x00000003;
361
362 *REG_MDTOP_PLLMIXED_MDBPIPLL_CTL0 = 0x80114EC5; // Fixed Fvco = 1800Mhz
363 #if defined(MT6833) /* Palmer */
364 *REG_MDTOP_PLLMIXED_MDBRPPLL_CTL0 = 0x80143140; // Fvco = 2100Mhz. 2100/3 = 700Mhz more setting in PLL_SEC_SW_VERSION_ENHANCE()
365 #else
366 *REG_MDTOP_PLLMIXED_MDBRPPLL_CTL0 = 0x801FBB13; // Fvco = 3300Mhz. 3300/3 = 1100Mhz more setting in PLL_SEC_SW_VERSION_ENHANCE()
367 #endif
368 *REG_MDTOP_PLLMIXED_MDVDSPPLL_CTL0 = 0x801D2276; // Fvco = 3030Mhz. 3030/3 = 1010Mhz
369 #if defined(MT6885)/* PETRUS *//* Only for PETRUS */
370 *REG_MDTOP_PLLMIXED_MDMCUPLL_CTL0 = 0x801F189E; // Fvco = 3234Mhz. 3234/3 = 1078Mhz
371 #else/* MARGAUX and later... */
372 *REG_MDTOP_PLLMIXED_MDMCUPLL_CTL0 = 0x801FBB13; // Fvco = 3300Mhz. 3300/3 = 1100Mhz
373 #endif
374
375 *REG_MDTOP_PLLMIXED_MDPLL_CTL0 = 0x80190000; // Fvco = 2600Mhz. 2600/4 = 650Mhz
376 *REG_MDTOP_PLLMIXED_MDPLL_CTL1 = 0x12;
377
378 *REG_MDTOP_PLLMIXED_MDNRPLL2_CTL1 = 0x12;
379 *REG_MDTOP_PLLMIXED_MDNRPLL3_CTL1 = 0x12;
380
381 *REG_MDTOP_PLLMIXED_MDNRPLL0_CTL0 = 0x80133B13; // Fvco = 2000Mhz. 2000/2 = 1000Mhz
382 *REG_MDTOP_PLLMIXED_MDNRPLL1_CTL0 = 0x801713B1; // Fvco = 2400Mhz. 2400/2 = 1200Mhz
383 *REG_MDTOP_PLLMIXED_MDNRPLL2_CTL0 = 0x801AEC4E; // Fvco = 2800Mhz. 2800/4 = 700Mhz
384 *REG_MDTOP_PLLMIXED_MDNRPLL3_CTL0 = 0x80180000; // Fvco = 2496Mhz. 2496/4 = 624Mhz
385 *REG_MDTOP_PLLMIXED_MDNRPLL4_CTL0 = 0x800F6276; // Fvco = 1600Mhz. 1600/1 = 1600Mhz
386 *REG_MDTOP_PLLMIXED_MDNRPLL5_CTL0 = 0x801CD890; // Fvco = 3000Mhz. 3000/2 = 1500Mhz
387#endif
388
389 *REG_MDTOP_PLLMIXED_PLL_ON_CTL = 0x0;
390
391 MO_Sync();
392
393 /*
394 * Polling until MDMCUPLL complete frequency adjustment
395 * Once MDMCUPLL complete, other PLL should complete too
396 */
397 while ((*REG_MDTOP_PLLMIXED_MDMCUPLL_STS >> 14)&0x1);
398
399 #if defined(__PALLADIUM__)
400 if (PLL_FPGA_IS_ASIC() == KAL_TRUE) {
401 while ((*REG_MDTOP_CLKSW_MDSYS_BUS_FLEXCKGEN_STS & 0x8000) != 0x8000);
402 }
403 #else // Not PALLADIUM
404 #if !defined(__FPGA__)
405 /*
406 * Wait MD bus clock ready
407 * Once MD bus ready, other clock should be ready too
408 * In FPGA, the following status checking must be removed since there is no flex ck gen in FPGA.
409 */
410 while ((*REG_MDTOP_CLKSW_MDSYS_BUS_FLEXCKGEN_STS & 0x8000) != 0x8000);
411 #endif // __FPGA__
412 #endif // __PALLADIUM__
413
414 /* Switch clock source to PLL */
415 *REG_MDTOP_CLKSW_CLKSEL_CTL |= 0x3; //switch MDMCU & MD BUS clock to PLL frequency
416
417 *REG_MDTOP_CLKSW_CLKSEL_CTL |= 0xFFFFFFFC; //switch all clock to PLL frequency
418 *REG_MDTOP_CLKSW_CLKSEL_CTL_2 |= 0x4;
419
420 *REG_MDTOP_CLKSW_CLKON_CTL = 0x3; //Turn off all SW clock request
421
422#if defined(MT6297)/* APOLLO */
423 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL |= 0x1100011; // switch SDF clock to PLL frequency
424#else /* PETRUS and later */
425 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL |= 0x1104011; // switch SDF clock to PLL frequency
426#endif
427 MO_Sync();
428
429 // Clear PLL ADJ RDY IRQ fired by initial period adjustment
430 *REG_MDTOP_PLLMIXED_PLL_HP_RDY_IRQ = 0xFFFF;
431
432 // Mask all PLL ADJ RDY IRQ
433 *REG_MDTOP_PLLMIXED_PLL_HP_RDY_IRQ_MASK = 0xFFFF;
434 MO_Sync();
435
436 // Make a record that means MD pll has been initialized.
437 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_NUM;
438 MO_Sync();
439}
440
441__PLL_CODE_IN_BOOT__ kal_uint8 pll_get_current_vpe_id(void)
442{
443 unsigned int vpe_id = 0;
444
445 __asm__ __volatile__(
446 "mfc0 %0, $15, 1" \
447 : "=r" (vpe_id) \
448 :);
449
450 return (vpe_id & 0xF);
451}
452
453/*************************************************************************
454 * FUNCTION
455 * INT_SetPLL
456 *
457 * DESCRIPTION
458 * This function dedicates for PLL setting.
459 *
460 * PARAMETERS
461 * Init mode of PLL
462 *
463 * RETURNS
464 * Note : This function would only call by MD.
465 *************************************************************************/
466void INT_SetPLL(void)
467{
468#if !defined(__COSIM_BYPASS__) && !defined(__ESL_MASE__)
469 if ((pll_get_current_vpe_id() == 0))
470 {
471 if (*REG_MDTOP_PLLMIXED_PLL_DUMMY != MD_PLL_MAGIC_NUM)
472 {/* PLL didn't init by BootRom */
473 PLL_MD_Pll_Init();
474
475 // Make a record that means MD pll has init by MD.
476 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_MD;
477 }
478
479 //Clear 26M ACK Status(There would be false alarm at MD boot up..) here due to BootRom didn't init FRC.
480 PLL_Clear_26M_ACK_Status();
481
482 PLL_SEC_SW_VERSION_ENHANCE();
483 }
484#endif // __COSIM_BYPASS__
485}
486
487/*************************************************************************
488 * FUNCTION
489 * PLL_MD_Pll_Init
490 *
491 * DESCRIPTION
492 * This function dedicates for PLL setting.
493 *
494 * PARAMETERS
495 * Init mode of PLL
496 *
497 * RETURNS
498 * Note : This function would call by BootRom and MD!!
499 *************************************************************************/
500__PLL_CODE_IN_BOOT__ void PLL_MD_Pll_Init(void)
501{
502#if !defined(__COSIM_BYPASS__) && !defined(__ESL_MASE__)
503 INT_SetPLL_Gen97();
504#endif // __COSIM_BYPASS__
505}
506
507 /*------------------------------------------------------------------------
508 * void PLL_Check_26M_ACK_Status
509 * Purpose: Check 26M ACK Status to know 26M is ready.
510 * Parameters:
511 * Input: kal_uint32 identifier: Any value to let us confirm the caller.
512 *
513 * Output: None.
514 *
515 * returns : void.
516 * Note : This function would call by Idle_Service_Handler()
517 *
518 *------------------------------------------------------------------------
519 */
520void PLL_Check_26M_ACK_Status(kal_uint32 identifier)
521{
522 #if defined(__PRODUCTION_RELEASE__) || defined(__MAUI_BASIC__) || defined(__MODEM_ONLY__)
523 /* Do nothing. */
524 #else
525/* under construction !*/
526 #endif
527}
528
529 /*------------------------------------------------------------------------
530 * void PLL_Clear_26M_ACK_Status
531 * Purpose: Clear 26M ACK Status.
532 * Parameters:
533 * Input: None.
534 *
535 * Output: None.
536 *
537 * returns : void.
538 * Note : This function could not call by BootRom due to BootRom didn't init FRC.
539 *
540 *------------------------------------------------------------------------
541 */
542void PLL_Clear_26M_ACK_Status(void)
543{
544 *REG_MDTOP_PLLMIXED_DCXO_RDY_WO_ACK = 0x80;
545 MO_Sync();
546 ust_us_busyloop(35);//need wait at least 1T 32K
547 *REG_MDTOP_PLLMIXED_DCXO_RDY_WO_ACK = 0x0;
548}
549
550 /*------------------------------------------------------------------------
551 * void PLL_Set_CLK_To_26M
552 * Purpose: Re-configure all the module clocks from PLL to 26M.
553 * Parameters:
554 * Input: None.
555 *
556 * Output: None.
557 *
558 * returns : void.
559 * Note : This function would call by BootRom!!
560 *
561 *------------------------------------------------------------------------
562 */
563__PLL_CODE_IN_BOOT__ void PLL_Set_CLK_To_26M(void)
564{
565 *REG_MDTOP_CLKSW_CLKON_CTL = 0x10001; // set to default value
566 *REG_MDTOP_CLKSW_CLKSEL_CTL = 0x14000; //switch all clock to XTAL frequency
567 *REG_MDTOP_CLKSW_CLKSEL_CTL_2 = 0x0; //switch all clock to XTAL frequency
568 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL = 0x100001; // switch SDF clock to XTAL frequency
569
570 MO_Sync();
571 // Make a record that means MD pll has been changed to 26M.
572 *REG_MDTOP_PLLMIXED_PLL_DUMMY = MD_PLL_MAGIC_26M;
573}
574
575 /*------------------------------------------------------------------------
576 * void PLL_FrequencyMeter_GetFreq
577 * Purpose: Get specified PLL/module's clock(Mhz).
578 * Parameters:
579 * Input: PLL_FM_SOURCE index: The module you want to measure.
580 *
581 * Output: None.
582 *
583 * returns : The PLL/module's clock(Mhz).
584 * Note : This function would spend at least 23us to measure the clock.
585 *
586 *------------------------------------------------------------------------
587 */
588kal_uint32 PLL_FM_FESYS_MDPLL_CNT;
589kal_uint32 PLL_FrequencyMeter_GetFreq(PLL_FM_SOURCE index)
590{
591 kal_uint32 count = 5000, output = 0;
592
593 if (index > PLL_FM_SOURCE_END)
594 return 0;
595
596 #if defined(MT6297)/* APOLLO */
597 /* Only need on APOLLO */
598 if(index == PLL_FM_MDSYS_IA_CLOCK)
599 {/* Use MUX to measure IA's clock */
600 *REG_MDTOP_CLKSW_CLK_DUMMY = *REG_MDTOP_CLKSW_CLK_DUMMY | 0x80000000;
601 index = PLL_FM_MDSYS_SHAOLIN_CLOCK;
602 }
603 else if(index == PLL_FM_MDSYS_SHAOLIN_CLOCK)
604 {/* Use MUX to measure SHAOLIN's clock */
605 *REG_MDTOP_CLKSW_CLK_DUMMY = *REG_MDTOP_CLKSW_CLK_DUMMY & 0x7FFFFFFF;
606 }
607 #endif
608
609 *REG_MDTOP_CLKSW_CKMON_CTL = PLL_FM_MDSYS_BUS4X_CLOCK; //select source to a valid clock to let reset success.
610
611 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 0; //reset frequency meter
612
613 MO_Sync();
614 ust_us_busyloop(2);//let Frequency Meter reset done
615
616 *REG_MDTOP_CLKSW_CKMON_CTL = index;
617
618 // Get high precise MDPLL frequency in exception flow
619 if(INT_QueryExceptionStatus()==KAL_TRUE && index== PLL_FM_FESYS_MDPLL_CLOCK) {
620 *REG_MDTOP_CLKSW_FREQ_METER_XTAL_CNT = PLL_FM_WIMDOW_EX_MDPLL;
621 count = 5000000;
622 }
623 else {
624 *REG_MDTOP_CLKSW_FREQ_METER_XTAL_CNT = PLL_FM_WIMDOW;
625 }
626
627 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 1; //enable frequency meter
628 MO_Sync();
629
630 // wait measure done or timeout
631 while (((*REG_MDTOP_CLKSW_FREQ_METER_CTL) & (1 << 1)) == 0)
632 {
633 count--;
634 if (count == 0)
635 break;
636 }
637
638 if (count == 0)
639 return 0;
640
641 // Get MDPLL CLMON_CNT in exception flow
642 if(INT_QueryExceptionStatus()==KAL_TRUE && index== PLL_FM_FESYS_MDPLL_CLOCK) {
643 PLL_FM_FESYS_MDPLL_CNT = *REG_MDTOP_CLKSW_FREQ_METER_CKMON_CNT;
644 output = *REG_MDTOP_CLKSW_FREQ_METER_CKMON_CNT * 26 / (PLL_FM_WIMDOW_EX_MDPLL+3);
645 }
646 else {
647 output = *REG_MDTOP_CLKSW_FREQ_METER_CKMON_CNT * 26 / (PLL_FM_WIMDOW+3);
648 }
649
650 *REG_MDTOP_CLKSW_CKMON_CTL = PLL_FM_NULL; //select source to NULL to save power in flip-flop, save about 0.07mA in 6293
651
652 *REG_MDTOP_CLKSW_FREQ_METER_CTL = 0; //reset frequency meter
653
654 return output;
655}
656
657 /*------------------------------------------------------------------------
658 * void PLL_FrequencyMeter_GetCKMON_CNT
659 * Purpose: Get specified PLL/module's CKMON_CNT & clock(Mhz).
660 * Parameters:
661 * Input: PLL_FM_SOURCE index: The module you want to measure.
662 * kal_uint32 xta_cnt: 26M CNT. Suggest use PLL_FM_WIMDOW directly. (invalid parameter in Gen97)
663 *
664 * Output: kal_uint32 *ckmon_cnt: specified PLL/module's CKMON_CNT.
665 *
666 * returns : The PLL/module's clock(Mhz) or PLL_FM_SOURCE_OCCUPIED.
667 * Note : This function would spend 23 us to measure the clock.
668 * This function could only call in EE flow to avoid race condition.
669 * Request by YW Lee, Yinyan Lin.
670 *------------------------------------------------------------------------
671 */
672kal_uint32 PLL_FrequencyMeter_GetCKMON_CNT(PLL_FM_SOURCE index, kal_uint32 xta_cnt, kal_uint32 *ckmon_cnt)
673{
674 kal_uint32 output = 0;
675
676 if(INT_QueryExceptionStatus()!=KAL_TRUE)
677 {//not in EE flow
678 return PLL_FM_SOURCE_OCCUPIED;
679 }
680
681 output = PLL_FrequencyMeter_GetFreq(index);
682
683 *ckmon_cnt = *REG_MDTOP_CLKSW_FREQ_METER_CKMON_CNT;
684
685 return output;
686}
687
688void PLL_exception_dump(void)
689{
690 g_pll_info.AD_MDNRPLL5 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL5);
691 g_pll_info.AD_MDNRPLL4_1 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL4_1);
692 g_pll_info.AD_MDNRPLL4_0 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL4_0);
693 g_pll_info.AD_MDNRPLL3 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL3);
694 g_pll_info.AD_MDNRPLL2 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL2);
695 g_pll_info.AD_MDNRPLL1 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL1);
696 g_pll_info.AD_MDNRPLL0 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL0);
697 g_pll_info.MDSYS_NRL2_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_NRL2_CLOCK);
698 g_pll_info.MDRXSYS_DFESYNC_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_DFESYNC_CLOCK);
699#if defined(MT6297)/* APOLLO */
700 g_pll_info.MDTOP_F208M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_F208M_CLOCK);
701 g_pll_info.TRACE_MON_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TRACE_MON_CLOCK);
702 g_pll_info.MDSYS_208M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_208M_CLOCK);
703#else/* PETRUS and later */
704 g_pll_info.MDTOP_F216P7M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_F216P7M_CLOCK);
705 g_pll_info.TRACE_MON_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TRACE_MON_CLOCK);
706 g_pll_info.MDSYS_216P7M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_216P7M_CLOCK);
707#endif
708 g_pll_info.MDRXSYS_RAKE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_RAKE_CLOCK);
709 g_pll_info.MDRXSYS_BRP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_BRP_CLOCK);
710 g_pll_info.MDRXSYS_VDSP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDRXSYS_VDSP_CLOCK);
711 g_pll_info.MDTOP_LOG_ATB_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_LOG_ATB_CLOCK);
712 g_pll_info.FESYS_CSYS_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_CSYS_CLOCK);
713 g_pll_info.MDSYS_SHAOLIN_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_SHAOLIN_CLOCK);
714 g_pll_info.FESYS_BSI_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_BSI_CLOCK);
715 g_pll_info.MDSYS_MDCORE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_MDCORE_CLOCK);
716 g_pll_info.MDSYS_BUS2X_NODCM_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_BUS2X_NODCM_CLOCK);
717 g_pll_info.MDSYS_BUS4X_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDSYS_BUS4X_CLOCK);
718 g_pll_info.MDTOP_DBG_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_DBG_CLOCK);
719 g_pll_info.AD_MDBPI_PLL_D7 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D7);
720 g_pll_info.AD_MDBPI_PLL_D5 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D5);
721 g_pll_info.AD_MDBPI_PLL_D4 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D4);
722 g_pll_info.AD_MDBPI_PLL_D3 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D3);
723 g_pll_info.AD_MDBPI_PLL_D2 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBPI_PLL_D2);
724 g_pll_info.AD_MDBRP_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDBRP_PLL);
725 g_pll_info.AD_MDVDSP_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDVDSP_PLL);
726 g_pll_info.AD_MDMCU_PLL = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDMCU_PLL);
727
728#if defined(MT6297)/* APOLLO */
729/* APOLLO didn't support */
730#else/* PETRUS and later */
731 g_pll_info.DFESYS_RXDFE_BB_CORE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_DFESYS_RXDFE_BB_CORE_CLOCK);
732 g_pll_info.AD_MDNRPLL4_2 = PLL_FrequencyMeter_GetFreq(PLL_FM_AD_MDNRPLL4_2);
733 g_pll_info.MDTOP_BUS4X_FIXED_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_BUS4X_FIXED_CLOCK);
734 g_pll_info.DA_DRF_26M_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_DA_DRF_26M_CLOCK);
735#endif
736
737 g_pll_info.MDTOP_BUS4X_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MDTOP_BUS4X_CLOCK);
738 g_pll_info.RXCPC_CPC_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_RXCPC_CPC_CLOCK);
739
740#if defined(MT6297)/* Only APOLLO support. */
741 g_pll_info.RXDDMBRP_RXCSI_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_RXDDMBRP_RXCSI_CLOCK);
742#endif
743 g_pll_info.RXDDMBRP_RXDBRP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_RXDDMBRP_RXDBRP_CLOCK);
744 g_pll_info.RXDDMBRP_RXDDM_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_RXDDMBRP_RXDDM_CLOCK);
745 g_pll_info.MCORE_MCORE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_MCORE_MCORE_CLOCK);
746 g_pll_info.VCOREHRAM_VCORE_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_VCOREHRAM_VCORE_CLOCK);
747 g_pll_info.VCOREHRAM_HRAM_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_VCOREHRAM_HRAM_CLOCK);
748 g_pll_info.FESYS_TXBSRP_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_TXBSRP_CLOCK);
749 g_pll_info.FESYS_MDPLL_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_FESYS_MDPLL_CLOCK);
750 g_pll_info.TX_CS_NR_RXT2F_NR_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TX_CS_NR_RXT2F_NR_CLOCK);
751 g_pll_info.TX_CS_NR_TXBSRP_NR_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TX_CS_NR_TXBSRP_NR_CLOCK);
752 g_pll_info.TX_CS_NR_CM_NR_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TX_CS_NR_CM_NR_CLOCK);
753 g_pll_info.TX_CS_NR_CS_NR_CLOCK = PLL_FrequencyMeter_GetFreq(PLL_FM_TX_CS_NR_CS_NR_CLOCK);
754
755}
756
757
758/****************************************************************
759 Function for SDF module. (SIB)
760****************************************************************/
761 /*------------------------------------------------------------------------
762 * void PLL_CLKSW_SDF_SRC_CKSEL_Get
763 * Purpose: Get the selection of SDF source clock.
764 * Parameters:
765 * Input: None.
766 *
767 * Output: None.
768 *
769 * returns : The selection of SDF source clock.
770 *
771 * Note :
772 *
773 *------------------------------------------------------------------------
774 */
775kal_uint32 PLL_CLKSW_SDF_SRC_CKSEL_Get()
776{
777 if((*REG_MDTOP_CLKSW_SDF_ATB_CK_CTL&(1<<4))==0)
778 {
779 return CLKSW_SDF_SRC_26M;
780 }
781 else
782 {
783 return (((*REG_MDTOP_CLKSW_SDF_ATB_CK_CTL) & 0x00000180) >> 7);
784 }
785}
786
787 /*------------------------------------------------------------------------
788 * void PLL_CLKSW_SDF_SRC_CKSEL_Div_Get
789 * Purpose: Get the selection of SDF source clock Div.
790 * Parameters:
791 * Input: None.
792 *
793 * Output: None.
794 *
795 * returns : The selection of SDF source clock Div
796 *
797 * Note :
798 *
799 *------------------------------------------------------------------------
800 */
801kal_uint32 PLL_CLKSW_SDF_SRC_CKSEL_Div_Get()
802{
803 return (((*REG_MDTOP_CLKSW_SDF_ATB_CK_CTL) & 0x00000060) >> 5);
804}
805
806 /*------------------------------------------------------------------------
807 * void PLL_CLKSW_SDF_SRC_CKSEL_Set
808 * Purpose: Set the selection of SDF source clock.
809 * Parameters:
810 * Input: PLL_CLKSW_SDF_SRC src_ck: CLKSW_SDF_SRC_xxx in "Pll_gen97.h", src_clk index.
811 * PLL_CLKSW_SDF_SRC_DIV src_div: CLKSW_SDF_SRC_xxx in "Pll_gen97.h", src_div index.
812 * Output: None.
813 *
814 * returns : KAL_TRUE/KAL_FALSE
815 *
816 * Note : Porting from LR12's PLL_SDF_SRC_CKSEL_SET().
817 *
818 *------------------------------------------------------------------------
819 */
820kal_bool PLL_CLKSW_SDF_SRC_CKSEL_Set(PLL_CLKSW_SDF_SRC src_clk, PLL_CLKSW_SDF_SRC_DIV src_div)
821{
822 kal_uint32 /*caller_LR, */tmp = 0;
823 //GET_RETURN_ADDRESS(caller_LR);
824
825 if (src_clk >= CLKSW_SDF_SRC_END)
826 {
827 //EXT_ASSERT(0, caller_LR, src_clk, 0);
828 return KAL_FALSE;
829 }
830
831 if(src_clk == CLKSW_SDF_SRC_26M)
832 {/* Restore to default setting */
833
834 // SDF clock switch to 26Mhz
835 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL &= ~(1<<4);
836
837 //restore SDF clock source
838 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL = ((*REG_MDTOP_CLKSW_SDF_ATB_CK_CTL) & 0xFFFFFC1F);
839 }
840 else
841 {
842 // SDF clock switch to 26Mhz
843 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL &= ~(1<<4);
844
845 //set SDF clock source
846 tmp = (src_clk<<7) | (src_div<<5);
847 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL = ((*REG_MDTOP_CLKSW_SDF_ATB_CK_CTL) & 0xFFFFFC1F) | (tmp);
848
849 // SDF clock switch to full speed
850 *REG_MDTOP_CLKSW_SDF_ATB_CK_CTL |= (1<<4);
851 }
852
853 MO_Sync();
854
855 return KAL_TRUE;
856}
857
858#endif /* should NOT be compiled on MODIS */