1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2018-2019 NXP
5 * Peng Fan <peng.fan@nxp.com>
9 #include <asm/arch/clock.h>
10 #include <asm/arch/imx-regs.h>
11 #include <asm/arch/sys_proto.h>
12 #include <asm/global_data.h>
16 #include <linux/bitops.h>
17 #include <linux/delay.h>
20 DECLARE_GLOBAL_DATA_PTR
;
22 static struct anamix_pll
*ana_pll
= (struct anamix_pll
*)ANATOP_BASE_ADDR
;
24 static u32
get_root_clk(enum clk_root_index clock_id
);
27 void hab_caam_clock_enable(unsigned char enable
)
29 /* The CAAM clock is always on for iMX8M */
33 void enable_ocotp_clk(unsigned char enable
)
35 clock_enable(CCGR_OCOTP
, !!enable
);
38 int enable_i2c_clk(unsigned char enable
, unsigned i2c_num
)
41 CCGR_I2C1
, CCGR_I2C2
, CCGR_I2C3
, CCGR_I2C4
,
42 #if (IS_ENABLED(CONFIG_IMX8MP))
43 CCGR_I2C5_8MP
, CCGR_I2C6_8MP
47 if (i2c_num
>= ARRAY_SIZE(i2c_ccgr
))
50 clock_enable(i2c_ccgr
[i2c_num
], !!enable
);
55 #ifdef CONFIG_SPL_BUILD
56 static struct imx_int_pll_rate_table imx8mm_fracpll_tbl
[] = {
57 PLL_1443X_RATE(1000000000U, 250, 3, 1, 0),
58 PLL_1443X_RATE(933000000U, 311, 4, 1, 0),
59 PLL_1443X_RATE(800000000U, 300, 9, 0, 0),
60 PLL_1443X_RATE(750000000U, 250, 8, 0, 0),
61 PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
62 PLL_1443X_RATE(600000000U, 300, 3, 2, 0),
63 PLL_1443X_RATE(594000000U, 99, 1, 2, 0),
64 PLL_1443X_RATE(400000000U, 300, 9, 1, 0),
65 PLL_1443X_RATE(266000000U, 400, 9, 2, 0),
66 PLL_1443X_RATE(167000000U, 334, 3, 4, 0),
67 PLL_1443X_RATE(100000000U, 300, 9, 3, 0),
70 static int fracpll_configure(enum pll_clocks pll
, u32 freq
)
75 struct imx_int_pll_rate_table
*rate
;
77 for (i
= 0; i
< ARRAY_SIZE(imx8mm_fracpll_tbl
); i
++) {
78 if (freq
== imx8mm_fracpll_tbl
[i
].rate
)
82 if (i
== ARRAY_SIZE(imx8mm_fracpll_tbl
)) {
83 printf("%s: No matched freq table %u\n", __func__
, freq
);
87 rate
= &imx8mm_fracpll_tbl
[i
];
91 setbits_le32(GPC_BASE_ADDR
+ 0xEC, 1 << 7);
92 setbits_le32(GPC_BASE_ADDR
+ 0xF8, 1 << 5);
93 writel(SRC_DDR1_ENABLE_MASK
, SRC_BASE_ADDR
+ 0x1004);
95 pll_base
= &ana_pll
->dram_pll_gnrl_ctl
;
97 case ANATOP_VIDEO_PLL
:
98 pll_base
= &ana_pll
->video_pll1_gnrl_ctl
;
103 /* Bypass clock and set lock to pll output lock */
104 tmp
= readl(pll_base
);
106 writel(tmp
, pll_base
);
110 writel(tmp
, pll_base
);
112 div_val
= (rate
->mdiv
<< MDIV_SHIFT
) | (rate
->pdiv
<< PDIV_SHIFT
) |
113 (rate
->sdiv
<< SDIV_SHIFT
);
114 writel(div_val
, pll_base
+ 4);
115 writel(rate
->kdiv
<< KDIV_SHIFT
, pll_base
+ 8);
121 writel(tmp
, pll_base
);
124 while (!(readl(pll_base
) & LOCK_STATUS
))
129 writel(tmp
, pll_base
);
134 void dram_pll_init(ulong pll_val
)
136 fracpll_configure(ANATOP_DRAM_PLL
, pll_val
);
139 static struct dram_bypass_clk_setting imx8mm_dram_bypass_tbl
[] = {
140 DRAM_BYPASS_ROOT_CONFIG(MHZ(100), 2, CLK_ROOT_PRE_DIV1
, 2,
142 DRAM_BYPASS_ROOT_CONFIG(MHZ(250), 3, CLK_ROOT_PRE_DIV2
, 2,
144 DRAM_BYPASS_ROOT_CONFIG(MHZ(400), 1, CLK_ROOT_PRE_DIV2
, 3,
148 void dram_enable_bypass(ulong clk_val
)
151 struct dram_bypass_clk_setting
*config
;
153 for (i
= 0; i
< ARRAY_SIZE(imx8mm_dram_bypass_tbl
); i
++) {
154 if (clk_val
== imx8mm_dram_bypass_tbl
[i
].clk
)
158 if (i
== ARRAY_SIZE(imx8mm_dram_bypass_tbl
)) {
159 printf("%s: No matched freq table %lu\n", __func__
, clk_val
);
163 config
= &imx8mm_dram_bypass_tbl
[i
];
165 clock_set_target_val(DRAM_ALT_CLK_ROOT
, CLK_ROOT_ON
|
166 CLK_ROOT_SOURCE_SEL(config
->alt_root_sel
) |
167 CLK_ROOT_PRE_DIV(config
->alt_pre_div
));
168 clock_set_target_val(DRAM_APB_CLK_ROOT
, CLK_ROOT_ON
|
169 CLK_ROOT_SOURCE_SEL(config
->apb_root_sel
) |
170 CLK_ROOT_PRE_DIV(config
->apb_pre_div
));
171 clock_set_target_val(DRAM_SEL_CFG
, CLK_ROOT_ON
|
172 CLK_ROOT_SOURCE_SEL(1));
175 void dram_disable_bypass(void)
177 clock_set_target_val(DRAM_SEL_CFG
, CLK_ROOT_ON
|
178 CLK_ROOT_SOURCE_SEL(0));
179 clock_set_target_val(DRAM_APB_CLK_ROOT
, CLK_ROOT_ON
|
180 CLK_ROOT_SOURCE_SEL(4) |
181 CLK_ROOT_PRE_DIV(CLK_ROOT_PRE_DIV5
));
185 int intpll_configure(enum pll_clocks pll
, ulong freq
)
187 void __iomem
*pll_gnrl_ctl
, __iomem
*pll_div_ctl
;
188 u32 pll_div_ctl_val
, pll_clke_masks
;
191 case ANATOP_SYSTEM_PLL1
:
192 pll_gnrl_ctl
= &ana_pll
->sys_pll1_gnrl_ctl
;
193 pll_div_ctl
= &ana_pll
->sys_pll1_div_ctl
;
194 pll_clke_masks
= INTPLL_DIV20_CLKE_MASK
|
195 INTPLL_DIV10_CLKE_MASK
| INTPLL_DIV8_CLKE_MASK
|
196 INTPLL_DIV6_CLKE_MASK
| INTPLL_DIV5_CLKE_MASK
|
197 INTPLL_DIV4_CLKE_MASK
| INTPLL_DIV3_CLKE_MASK
|
198 INTPLL_DIV2_CLKE_MASK
| INTPLL_CLKE_MASK
;
200 case ANATOP_SYSTEM_PLL2
:
201 pll_gnrl_ctl
= &ana_pll
->sys_pll2_gnrl_ctl
;
202 pll_div_ctl
= &ana_pll
->sys_pll2_div_ctl
;
203 pll_clke_masks
= INTPLL_DIV20_CLKE_MASK
|
204 INTPLL_DIV10_CLKE_MASK
| INTPLL_DIV8_CLKE_MASK
|
205 INTPLL_DIV6_CLKE_MASK
| INTPLL_DIV5_CLKE_MASK
|
206 INTPLL_DIV4_CLKE_MASK
| INTPLL_DIV3_CLKE_MASK
|
207 INTPLL_DIV2_CLKE_MASK
| INTPLL_CLKE_MASK
;
209 case ANATOP_SYSTEM_PLL3
:
210 pll_gnrl_ctl
= &ana_pll
->sys_pll3_gnrl_ctl
;
211 pll_div_ctl
= &ana_pll
->sys_pll3_div_ctl
;
212 pll_clke_masks
= INTPLL_CLKE_MASK
;
215 pll_gnrl_ctl
= &ana_pll
->arm_pll_gnrl_ctl
;
216 pll_div_ctl
= &ana_pll
->arm_pll_div_ctl
;
217 pll_clke_masks
= INTPLL_CLKE_MASK
;
220 pll_gnrl_ctl
= &ana_pll
->gpu_pll_gnrl_ctl
;
221 pll_div_ctl
= &ana_pll
->gpu_pll_div_ctl
;
222 pll_clke_masks
= INTPLL_CLKE_MASK
;
225 pll_gnrl_ctl
= &ana_pll
->vpu_pll_gnrl_ctl
;
226 pll_div_ctl
= &ana_pll
->vpu_pll_div_ctl
;
227 pll_clke_masks
= INTPLL_CLKE_MASK
;
235 /* 24 * 0x12c / 3 / 2 ^ 2 */
236 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0x12c) |
237 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(2);
240 /* 24 * 0xfa / 2 / 2 ^ 2 */
241 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0xfa) |
242 INTPLL_PRE_DIV_VAL(2) | INTPLL_POST_DIV_VAL(2);
245 /* 24 * 0x190 / 3 / 2 ^ 2 */
246 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0x190) |
247 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(2);
250 /* 24 * 0xfa / 3 / 2 ^ 1 */
251 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0xfa) |
252 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(1);
255 /* 24 * 0x12c / 3 / 2 ^ 1 */
256 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0x12c) |
257 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(1);
260 /* 24 * 0x15e / 3 / 2 ^ 1 */
261 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0x15e) |
262 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(1);
265 /* 24 * 0x177 / 3 / 2 ^ 1 */
266 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0x177) |
267 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(1);
270 /* 24 * 0xc8 / 3 / 2 ^ 0 */
271 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0xc8) |
272 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(0);
275 /* 24 * 0xe1 / 3 / 2 ^ 0 */
276 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0xe1) |
277 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(0);
280 /* 24 * 0xfa / 3 / 2 ^ 0 */
281 pll_div_ctl_val
= INTPLL_MAIN_DIV_VAL(0xfa) |
282 INTPLL_PRE_DIV_VAL(3) | INTPLL_POST_DIV_VAL(0);
287 /* Bypass clock and set lock to pll output lock */
288 setbits_le32(pll_gnrl_ctl
, INTPLL_BYPASS_MASK
| INTPLL_LOCK_SEL_MASK
);
290 clrbits_le32(pll_gnrl_ctl
, INTPLL_RST_MASK
);
292 writel(pll_div_ctl_val
, pll_div_ctl
);
297 setbits_le32(pll_gnrl_ctl
, INTPLL_RST_MASK
);
299 while (!(readl(pll_gnrl_ctl
) & INTPLL_LOCK_MASK
))
302 clrbits_le32(pll_gnrl_ctl
, INTPLL_BYPASS_MASK
);
303 setbits_le32(pll_gnrl_ctl
, pll_clke_masks
);
308 void init_uart_clk(u32 index
)
311 * set uart clock root
316 clock_enable(CCGR_UART1
, 0);
317 clock_set_target_val(UART1_CLK_ROOT
, CLK_ROOT_ON
|
318 CLK_ROOT_SOURCE_SEL(0));
319 clock_enable(CCGR_UART1
, 1);
322 clock_enable(CCGR_UART2
, 0);
323 clock_set_target_val(UART2_CLK_ROOT
, CLK_ROOT_ON
|
324 CLK_ROOT_SOURCE_SEL(0));
325 clock_enable(CCGR_UART2
, 1);
328 clock_enable(CCGR_UART3
, 0);
329 clock_set_target_val(UART3_CLK_ROOT
, CLK_ROOT_ON
|
330 CLK_ROOT_SOURCE_SEL(0));
331 clock_enable(CCGR_UART3
, 1);
334 clock_enable(CCGR_UART4
, 0);
335 clock_set_target_val(UART4_CLK_ROOT
, CLK_ROOT_ON
|
336 CLK_ROOT_SOURCE_SEL(0));
337 clock_enable(CCGR_UART4
, 1);
340 printf("Invalid uart index\n");
345 void init_wdog_clk(void)
347 clock_enable(CCGR_WDOG1
, 0);
348 clock_enable(CCGR_WDOG2
, 0);
349 clock_enable(CCGR_WDOG3
, 0);
350 clock_set_target_val(WDOG_CLK_ROOT
, CLK_ROOT_ON
|
351 CLK_ROOT_SOURCE_SEL(0));
352 clock_enable(CCGR_WDOG1
, 1);
353 clock_enable(CCGR_WDOG2
, 1);
354 clock_enable(CCGR_WDOG3
, 1);
357 void init_clk_usdhc(u32 index
)
360 * set usdhc clock root
365 clock_enable(CCGR_USDHC1
, 0);
366 clock_set_target_val(USDHC1_CLK_ROOT
, CLK_ROOT_ON
|
367 CLK_ROOT_SOURCE_SEL(1));
368 clock_enable(CCGR_USDHC1
, 1);
371 clock_enable(CCGR_USDHC2
, 0);
372 clock_set_target_val(USDHC2_CLK_ROOT
, CLK_ROOT_ON
|
373 CLK_ROOT_SOURCE_SEL(1));
374 clock_enable(CCGR_USDHC2
, 1);
377 clock_enable(CCGR_USDHC3
, 0);
378 clock_set_target_val(USDHC3_CLK_ROOT
, CLK_ROOT_ON
|
379 CLK_ROOT_SOURCE_SEL(1));
380 clock_enable(CCGR_USDHC3
, 1);
383 printf("Invalid usdhc index\n");
388 void init_clk_ecspi(u32 index
)
392 clock_enable(CCGR_ECSPI1
, 0);
393 clock_set_target_val(ECSPI1_CLK_ROOT
, CLK_ROOT_ON
| CLK_ROOT_SOURCE_SEL(0));
394 clock_enable(CCGR_ECSPI1
, 1);
397 clock_enable(CCGR_ECSPI2
, 0);
398 clock_set_target_val(ECSPI2_CLK_ROOT
, CLK_ROOT_ON
| CLK_ROOT_SOURCE_SEL(0));
399 clock_enable(CCGR_ECSPI2
, 1);
402 clock_enable(CCGR_ECSPI3
, 0);
403 clock_set_target_val(ECSPI3_CLK_ROOT
, CLK_ROOT_ON
| CLK_ROOT_SOURCE_SEL(0));
404 clock_enable(CCGR_ECSPI3
, 1);
407 printf("Invalid ecspi index\n");
412 void init_nand_clk(void)
418 clock_enable(CCGR_RAWNAND
, 0);
419 clock_set_target_val(NAND_CLK_ROOT
, CLK_ROOT_ON
|
420 CLK_ROOT_SOURCE_SEL(3) | CLK_ROOT_POST_DIV(CLK_ROOT_POST_DIV4
)); /* 100M */
421 clock_enable(CCGR_RAWNAND
, 1);
429 * The gate is not exported to clk tree, so configure them here.
430 * According to ANAMIX SPEC
431 * sys pll1 fixed at 800MHz
432 * sys pll2 fixed at 1GHz
433 * Here we only enable the outputs.
435 val_cfg0
= readl(&ana_pll
->sys_pll1_gnrl_ctl
);
436 val_cfg0
|= INTPLL_CLKE_MASK
| INTPLL_DIV2_CLKE_MASK
|
437 INTPLL_DIV3_CLKE_MASK
| INTPLL_DIV4_CLKE_MASK
|
438 INTPLL_DIV5_CLKE_MASK
| INTPLL_DIV6_CLKE_MASK
|
439 INTPLL_DIV8_CLKE_MASK
| INTPLL_DIV10_CLKE_MASK
|
440 INTPLL_DIV20_CLKE_MASK
;
441 writel(val_cfg0
, &ana_pll
->sys_pll1_gnrl_ctl
);
443 val_cfg0
= readl(&ana_pll
->sys_pll2_gnrl_ctl
);
444 val_cfg0
|= INTPLL_CLKE_MASK
| INTPLL_DIV2_CLKE_MASK
|
445 INTPLL_DIV3_CLKE_MASK
| INTPLL_DIV4_CLKE_MASK
|
446 INTPLL_DIV5_CLKE_MASK
| INTPLL_DIV6_CLKE_MASK
|
447 INTPLL_DIV8_CLKE_MASK
| INTPLL_DIV10_CLKE_MASK
|
448 INTPLL_DIV20_CLKE_MASK
;
449 writel(val_cfg0
, &ana_pll
->sys_pll2_gnrl_ctl
);
451 /* Configure ARM at 1.2GHz */
452 clock_set_target_val(ARM_A53_CLK_ROOT
, CLK_ROOT_ON
|
453 CLK_ROOT_SOURCE_SEL(2));
455 intpll_configure(ANATOP_ARM_PLL
, MHZ(1200));
457 /* Bypass CCM A53 ROOT, Switch to ARM PLL -> MUX-> CPU */
458 clock_set_target_val(CORE_SEL_CFG
, CLK_ROOT_SOURCE_SEL(1));
460 if (is_imx8mn() || is_imx8mp())
461 intpll_configure(ANATOP_SYSTEM_PLL3
, MHZ(600));
463 intpll_configure(ANATOP_SYSTEM_PLL3
, MHZ(750));
466 /* 8MP ROM already set NOC to 800Mhz, only need to configure NOC_IO clk to 600Mhz */
467 /* 8MP ROM already set GIC to 400Mhz, system_pll1_800m with div = 2 */
468 clock_set_target_val(NOC_IO_CLK_ROOT
, CLK_ROOT_ON
| CLK_ROOT_SOURCE_SEL(2));
470 clock_set_target_val(NOC_CLK_ROOT
, CLK_ROOT_ON
| CLK_ROOT_SOURCE_SEL(2));
472 /* config GIC to sys_pll2_100m */
473 clock_enable(CCGR_GIC
, 0);
474 clock_set_target_val(GIC_CLK_ROOT
, CLK_ROOT_ON
|
475 CLK_ROOT_SOURCE_SEL(3));
476 clock_enable(CCGR_GIC
, 1);
479 clock_set_target_val(NAND_USDHC_BUS_CLK_ROOT
, CLK_ROOT_ON
|
480 CLK_ROOT_SOURCE_SEL(1));
482 clock_enable(CCGR_DDR1
, 0);
483 clock_set_target_val(DRAM_ALT_CLK_ROOT
, CLK_ROOT_ON
|
484 CLK_ROOT_SOURCE_SEL(1));
485 clock_set_target_val(DRAM_APB_CLK_ROOT
, CLK_ROOT_ON
|
486 CLK_ROOT_SOURCE_SEL(1));
487 clock_enable(CCGR_DDR1
, 1);
491 clock_enable(CCGR_TEMP_SENSOR
, 1);
493 clock_enable(CCGR_SEC_DEBUG
, 1);
498 u32
imx_get_uartclk(void)
503 static u32
decode_intpll(enum clk_root_src intpll
)
505 u32 pll_gnrl_ctl
, pll_div_ctl
, pll_clke_mask
;
506 u32 main_div
, pre_div
, post_div
, div
;
511 pll_gnrl_ctl
= readl(&ana_pll
->arm_pll_gnrl_ctl
);
512 pll_div_ctl
= readl(&ana_pll
->arm_pll_div_ctl
);
515 pll_gnrl_ctl
= readl(&ana_pll
->gpu_pll_gnrl_ctl
);
516 pll_div_ctl
= readl(&ana_pll
->gpu_pll_div_ctl
);
519 pll_gnrl_ctl
= readl(&ana_pll
->vpu_pll_gnrl_ctl
);
520 pll_div_ctl
= readl(&ana_pll
->vpu_pll_div_ctl
);
522 case SYSTEM_PLL1_800M_CLK
:
523 case SYSTEM_PLL1_400M_CLK
:
524 case SYSTEM_PLL1_266M_CLK
:
525 case SYSTEM_PLL1_200M_CLK
:
526 case SYSTEM_PLL1_160M_CLK
:
527 case SYSTEM_PLL1_133M_CLK
:
528 case SYSTEM_PLL1_100M_CLK
:
529 case SYSTEM_PLL1_80M_CLK
:
530 case SYSTEM_PLL1_40M_CLK
:
531 pll_gnrl_ctl
= readl(&ana_pll
->sys_pll1_gnrl_ctl
);
532 pll_div_ctl
= readl(&ana_pll
->sys_pll1_div_ctl
);
534 case SYSTEM_PLL2_1000M_CLK
:
535 case SYSTEM_PLL2_500M_CLK
:
536 case SYSTEM_PLL2_333M_CLK
:
537 case SYSTEM_PLL2_250M_CLK
:
538 case SYSTEM_PLL2_200M_CLK
:
539 case SYSTEM_PLL2_166M_CLK
:
540 case SYSTEM_PLL2_125M_CLK
:
541 case SYSTEM_PLL2_100M_CLK
:
542 case SYSTEM_PLL2_50M_CLK
:
543 pll_gnrl_ctl
= readl(&ana_pll
->sys_pll2_gnrl_ctl
);
544 pll_div_ctl
= readl(&ana_pll
->sys_pll2_div_ctl
);
546 case SYSTEM_PLL3_CLK
:
547 pll_gnrl_ctl
= readl(&ana_pll
->sys_pll3_gnrl_ctl
);
548 pll_div_ctl
= readl(&ana_pll
->sys_pll3_div_ctl
);
554 /* Only support SYS_XTAL 24M, PAD_CLK not take into consideration */
555 if ((pll_gnrl_ctl
& INTPLL_REF_CLK_SEL_MASK
) != 0)
558 if ((pll_gnrl_ctl
& INTPLL_RST_MASK
) == 0)
562 * When BYPASS is equal to 1, PLL enters the bypass mode
563 * regardless of the values of RESETB
565 if (pll_gnrl_ctl
& INTPLL_BYPASS_MASK
)
568 if (!(pll_gnrl_ctl
& INTPLL_LOCK_MASK
)) {
569 puts("pll not locked\n");
577 case SYSTEM_PLL3_CLK
:
578 case SYSTEM_PLL1_800M_CLK
:
579 case SYSTEM_PLL2_1000M_CLK
:
580 pll_clke_mask
= INTPLL_CLKE_MASK
;
584 case SYSTEM_PLL1_400M_CLK
:
585 case SYSTEM_PLL2_500M_CLK
:
586 pll_clke_mask
= INTPLL_DIV2_CLKE_MASK
;
590 case SYSTEM_PLL1_266M_CLK
:
591 case SYSTEM_PLL2_333M_CLK
:
592 pll_clke_mask
= INTPLL_DIV3_CLKE_MASK
;
596 case SYSTEM_PLL1_200M_CLK
:
597 case SYSTEM_PLL2_250M_CLK
:
598 pll_clke_mask
= INTPLL_DIV4_CLKE_MASK
;
602 case SYSTEM_PLL1_160M_CLK
:
603 case SYSTEM_PLL2_200M_CLK
:
604 pll_clke_mask
= INTPLL_DIV5_CLKE_MASK
;
608 case SYSTEM_PLL1_133M_CLK
:
609 case SYSTEM_PLL2_166M_CLK
:
610 pll_clke_mask
= INTPLL_DIV6_CLKE_MASK
;
614 case SYSTEM_PLL1_100M_CLK
:
615 case SYSTEM_PLL2_125M_CLK
:
616 pll_clke_mask
= INTPLL_DIV8_CLKE_MASK
;
620 case SYSTEM_PLL1_80M_CLK
:
621 case SYSTEM_PLL2_100M_CLK
:
622 pll_clke_mask
= INTPLL_DIV10_CLKE_MASK
;
626 case SYSTEM_PLL1_40M_CLK
:
627 case SYSTEM_PLL2_50M_CLK
:
628 pll_clke_mask
= INTPLL_DIV20_CLKE_MASK
;
635 if ((pll_gnrl_ctl
& pll_clke_mask
) == 0)
638 main_div
= (pll_div_ctl
& INTPLL_MAIN_DIV_MASK
) >>
639 INTPLL_MAIN_DIV_SHIFT
;
640 pre_div
= (pll_div_ctl
& INTPLL_PRE_DIV_MASK
) >>
641 INTPLL_PRE_DIV_SHIFT
;
642 post_div
= (pll_div_ctl
& INTPLL_POST_DIV_MASK
) >>
643 INTPLL_POST_DIV_SHIFT
;
645 /* FFVCO = (m * FFIN) / p, FFOUT = (m * FFIN) / (p * 2^s) */
646 freq
= 24000000ULL * main_div
;
647 return lldiv(freq
, pre_div
* (1 << post_div
) * div
);
650 static u32
decode_fracpll(enum clk_root_src frac_pll
)
652 u32 pll_gnrl_ctl
, pll_fdiv_ctl0
, pll_fdiv_ctl1
;
653 u32 main_div
, pre_div
, post_div
, k
;
657 pll_gnrl_ctl
= readl(&ana_pll
->dram_pll_gnrl_ctl
);
658 pll_fdiv_ctl0
= readl(&ana_pll
->dram_pll_fdiv_ctl0
);
659 pll_fdiv_ctl1
= readl(&ana_pll
->dram_pll_fdiv_ctl1
);
662 pll_gnrl_ctl
= readl(&ana_pll
->audio_pll1_gnrl_ctl
);
663 pll_fdiv_ctl0
= readl(&ana_pll
->audio_pll1_fdiv_ctl0
);
664 pll_fdiv_ctl1
= readl(&ana_pll
->audio_pll1_fdiv_ctl1
);
667 pll_gnrl_ctl
= readl(&ana_pll
->audio_pll2_gnrl_ctl
);
668 pll_fdiv_ctl0
= readl(&ana_pll
->audio_pll2_fdiv_ctl0
);
669 pll_fdiv_ctl1
= readl(&ana_pll
->audio_pll2_fdiv_ctl1
);
672 pll_gnrl_ctl
= readl(&ana_pll
->video_pll1_gnrl_ctl
);
673 pll_fdiv_ctl0
= readl(&ana_pll
->video_pll1_fdiv_ctl0
);
674 pll_fdiv_ctl1
= readl(&ana_pll
->video_pll1_fdiv_ctl1
);
677 printf("Unsupported clk_root_src %d\n", frac_pll
);
681 /* Only support SYS_XTAL 24M, PAD_CLK not take into consideration */
682 if ((pll_gnrl_ctl
& GENMASK(1, 0)) != 0)
685 if ((pll_gnrl_ctl
& RST_MASK
) == 0)
688 * When BYPASS is equal to 1, PLL enters the bypass mode
689 * regardless of the values of RESETB
691 if (pll_gnrl_ctl
& BYPASS_MASK
)
694 if (!(pll_gnrl_ctl
& LOCK_STATUS
)) {
695 puts("pll not locked\n");
699 if (!(pll_gnrl_ctl
& CLKE_MASK
))
702 main_div
= (pll_fdiv_ctl0
& MDIV_MASK
) >>
704 pre_div
= (pll_fdiv_ctl0
& PDIV_MASK
) >>
706 post_div
= (pll_fdiv_ctl0
& SDIV_MASK
) >>
709 k
= pll_fdiv_ctl1
& KDIV_MASK
;
711 return lldiv((main_div
* 65536 + k
) * 24000000ULL,
712 65536 * pre_div
* (1 << post_div
));
715 static u32
get_root_src_clk(enum clk_root_src root_src
)
727 case SYSTEM_PLL1_800M_CLK
:
728 case SYSTEM_PLL1_400M_CLK
:
729 case SYSTEM_PLL1_266M_CLK
:
730 case SYSTEM_PLL1_200M_CLK
:
731 case SYSTEM_PLL1_160M_CLK
:
732 case SYSTEM_PLL1_133M_CLK
:
733 case SYSTEM_PLL1_100M_CLK
:
734 case SYSTEM_PLL1_80M_CLK
:
735 case SYSTEM_PLL1_40M_CLK
:
736 case SYSTEM_PLL2_1000M_CLK
:
737 case SYSTEM_PLL2_500M_CLK
:
738 case SYSTEM_PLL2_333M_CLK
:
739 case SYSTEM_PLL2_250M_CLK
:
740 case SYSTEM_PLL2_200M_CLK
:
741 case SYSTEM_PLL2_166M_CLK
:
742 case SYSTEM_PLL2_125M_CLK
:
743 case SYSTEM_PLL2_100M_CLK
:
744 case SYSTEM_PLL2_50M_CLK
:
745 case SYSTEM_PLL3_CLK
:
746 return decode_intpll(root_src
);
751 return decode_fracpll(root_src
);
752 case ARM_A53_ALT_CLK
:
753 return get_root_clk(ARM_A53_CLK_ROOT
);
761 static u32
get_root_clk(enum clk_root_index clock_id
)
763 enum clk_root_src root_src
;
764 u32 post_podf
, pre_podf
, root_src_clk
;
766 if (clock_root_enabled(clock_id
) <= 0)
769 if (clock_get_prediv(clock_id
, &pre_podf
) < 0)
772 if (clock_get_postdiv(clock_id
, &post_podf
) < 0)
775 if (clock_get_src(clock_id
, &root_src
) < 0)
778 root_src_clk
= get_root_src_clk(root_src
);
780 return root_src_clk
/ (post_podf
+ 1) / (pre_podf
+ 1);
783 u32
get_arm_core_clk(void)
785 enum clk_root_src root_src
;
788 if (clock_get_src(CORE_SEL_CFG
, &root_src
) < 0)
791 root_src_clk
= get_root_src_clk(root_src
);
796 u32
mxc_get_clock(enum mxc_clock clk
)
802 return get_arm_core_clk();
804 clock_get_target_val(IPG_CLK_ROOT
, &val
);
806 return get_root_clk(AHB_CLK_ROOT
) / 2 / (val
+ 1);
808 return get_root_clk(ECSPI1_CLK_ROOT
);
810 return get_root_clk(USDHC1_CLK_ROOT
);
812 return get_root_clk(USDHC2_CLK_ROOT
);
814 return get_root_clk(USDHC3_CLK_ROOT
);
816 return get_root_clk(I2C1_CLK_ROOT
);
818 return get_root_clk(UART1_CLK_ROOT
);
820 return get_root_clk(QSPI_CLK_ROOT
);
822 printf("Unsupported mxc_clock %d\n", clk
);
829 #if defined(CONFIG_IMX8MP) && defined(CONFIG_DWC_ETH_QOS)
830 static int imx8mp_eqos_interface_init(struct udevice
*dev
,
831 phy_interface_t interface_type
)
833 struct iomuxc_gpr_base_regs
*gpr
=
834 (struct iomuxc_gpr_base_regs
*)IOMUXC_GPR_BASE_ADDR
;
836 clrbits_le32(&gpr
->gpr
[1],
837 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK
|
838 IOMUXC_GPR_GPR1_GPR_ENET_QOS_RGMII_EN
|
839 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_TX_CLK_SEL
|
840 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN
);
842 switch (interface_type
) {
843 case PHY_INTERFACE_MODE_MII
:
844 setbits_le32(&gpr
->gpr
[1],
845 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN
|
846 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MII
);
848 case PHY_INTERFACE_MODE_RMII
:
849 setbits_le32(&gpr
->gpr
[1],
850 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_TX_CLK_SEL
|
851 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN
|
852 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RMII
);
854 case PHY_INTERFACE_MODE_RGMII
:
855 case PHY_INTERFACE_MODE_RGMII_ID
:
856 case PHY_INTERFACE_MODE_RGMII_RXID
:
857 case PHY_INTERFACE_MODE_RGMII_TXID
:
858 setbits_le32(&gpr
->gpr
[1],
859 IOMUXC_GPR_GPR1_GPR_ENET_QOS_RGMII_EN
|
860 IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN
|
861 IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RGMII
);
870 static int imx8mp_eqos_interface_init(struct udevice
*dev
,
871 phy_interface_t interface_type
)
877 #ifdef CONFIG_FEC_MXC
878 static int imx8mp_fec_interface_init(struct udevice
*dev
,
879 phy_interface_t interface_type
,
882 /* i.MX8MP has extra RGMII_EN bit in IOMUXC GPR1 register */
883 const u32 rgmii_en
= mx8mp
? IOMUXC_GPR_GPR1_GPR_ENET1_RGMII_EN
: 0;
884 struct iomuxc_gpr_base_regs
*gpr
=
885 (struct iomuxc_gpr_base_regs
*)IOMUXC_GPR_BASE_ADDR
;
887 clrbits_le32(&gpr
->gpr
[1],
889 IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL
);
891 switch (interface_type
) {
892 case PHY_INTERFACE_MODE_MII
:
893 case PHY_INTERFACE_MODE_RMII
:
894 setbits_le32(&gpr
->gpr
[1], IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL
);
896 case PHY_INTERFACE_MODE_RGMII
:
897 case PHY_INTERFACE_MODE_RGMII_ID
:
898 case PHY_INTERFACE_MODE_RGMII_RXID
:
899 case PHY_INTERFACE_MODE_RGMII_TXID
:
900 setbits_le32(&gpr
->gpr
[1], rgmii_en
);
910 int board_interface_eth_init(struct udevice
*dev
, phy_interface_t interface_type
)
912 if (IS_ENABLED(CONFIG_IMX8MM
) &&
913 IS_ENABLED(CONFIG_FEC_MXC
) &&
914 device_is_compatible(dev
, "fsl,imx8mm-fec"))
915 return imx8mp_fec_interface_init(dev
, interface_type
, false);
917 if (IS_ENABLED(CONFIG_IMX8MN
) &&
918 IS_ENABLED(CONFIG_FEC_MXC
) &&
919 device_is_compatible(dev
, "fsl,imx8mn-fec"))
920 return imx8mp_fec_interface_init(dev
, interface_type
, false);
922 if (IS_ENABLED(CONFIG_IMX8MP
) &&
923 IS_ENABLED(CONFIG_FEC_MXC
) &&
924 device_is_compatible(dev
, "fsl,imx8mp-fec"))
925 return imx8mp_fec_interface_init(dev
, interface_type
, true);
927 if (IS_ENABLED(CONFIG_IMX8MP
) &&
928 IS_ENABLED(CONFIG_DWC_ETH_QOS
) &&
929 device_is_compatible(dev
, "nxp,imx8mp-dwmac-eqos"))
930 return imx8mp_eqos_interface_init(dev
, interface_type
);