4 * Peng Fan <peng.fan@nxp.com>
6 * SPDX-License-Identifier: GPL-2.0+
9 #ifndef _ASM_ARCH_IMX8M_CLOCK_H
10 #define _ASM_ARCH_IMX8M_CLOCK_H
12 #include <linux/bitops.h>
42 GPU_CORE_CLK_ROOT = 3,
43 GPU_SHADER_CLK_ROOT = 4,
44 MAIN_AXI_CLK_ROOT = 16,
45 ENET_AXI_CLK_ROOT = 17,
46 NAND_USDHC_BUS_CLK_ROOT = 18,
47 VPU_BUS_CLK_ROOT = 19,
48 DISPLAY_AXI_CLK_ROOT = 20,
49 DISPLAY_APB_CLK_ROOT = 21,
50 DISPLAY_RTRM_CLK_ROOT = 22,
51 USB_BUS_CLK_ROOT = 23,
52 GPU_AXI_CLK_ROOT = 24,
53 GPU_AHB_CLK_ROOT = 25,
55 NOC_APB_CLK_ROOT = 27,
59 AUDIO_AHB_CLK_ROOT = 34,
60 MIPI_DSI_ESC_RX_CLK_ROOT = 36,
63 DRAM_ALT_CLK_ROOT = 64,
64 DRAM_APB_CLK_ROOT = 65,
67 DISPLAY_DTRC_CLK_ROOT = 68,
68 DISPLAY_DC8000_CLK_ROOT = 69,
69 PCIE1_CTRL_CLK_ROOT = 70,
70 PCIE1_PHY_CLK_ROOT = 71,
71 PCIE1_AUX_CLK_ROOT = 72,
72 DC_PIXEL_CLK_ROOT = 73,
73 LCDIF_PIXEL_CLK_ROOT = 74,
82 ENET_REF_CLK_ROOT = 83,
83 ENET_TIMER_CLK_ROOT = 84,
84 ENET_PHY_REF_CLK_ROOT = 85,
100 USB_CORE_REF_CLK_ROOT = 98,
101 USB_PHY_REF_CLK_ROOT = 99,
103 ECSPI1_CLK_ROOT = 101,
104 ECSPI2_CLK_ROOT = 102,
115 TRACE_CLK_ROOT = 113,
117 WRCLK_CLK_ROOT = 115,
120 MIPI_DSI_CORE_CLK_ROOT = 118,
121 MIPI_DSI_PHY_REF_CLK_ROOT = 119,
122 MIPI_DSI_DBI_CLK_ROOT = 120,
123 OLD_MIPI_DSI_ESC_CLK_ROOT = 121,
124 MIPI_CSI1_CORE_CLK_ROOT = 122,
125 MIPI_CSI1_PHY_REF_CLK_ROOT = 123,
126 MIPI_CSI1_ESC_CLK_ROOT = 124,
127 MIPI_CSI2_CORE_CLK_ROOT = 125,
128 MIPI_CSI2_PHY_REF_CLK_ROOT = 126,
129 MIPI_CSI2_ESC_CLK_ROOT = 127,
130 PCIE2_CTRL_CLK_ROOT = 128,
131 PCIE2_PHY_CLK_ROOT = 129,
132 PCIE2_AUX_CLK_ROOT = 130,
133 ECSPI3_CLK_ROOT = 131,
134 OLD_MIPI_DSI_ESC_RX_ROOT = 132,
135 DISPLAY_HDMI_CLK_ROOT = 133,
146 SYSTEM_PLL1_800M_CLK,
147 SYSTEM_PLL1_400M_CLK,
148 SYSTEM_PLL1_266M_CLK,
149 SYSTEM_PLL1_200M_CLK,
150 SYSTEM_PLL1_160M_CLK,
151 SYSTEM_PLL1_133M_CLK,
152 SYSTEM_PLL1_100M_CLK,
155 SYSTEM_PLL2_1000M_CLK,
156 SYSTEM_PLL2_500M_CLK,
157 SYSTEM_PLL2_333M_CLK,
158 SYSTEM_PLL2_250M_CLK,
159 SYSTEM_PLL2_200M_CLK,
160 SYSTEM_PLL2_166M_CLK,
161 SYSTEM_PLL2_125M_CLK,
162 SYSTEM_PLL2_100M_CLK,
177 enum clk_ccgr_index {
183 CCGR_DRAM2_OBSOLETE = 6,
240 CCGR_SIM_DISPLAY = 63,
245 CCGR_SIM_WAKEUP = 68,
268 CCGR_HEVC_INTER = 91,
278 CCGR_MIPI_CSI1 = 101,
279 CCGR_MIPI_CSI2 = 102,
285 CLK_SRC_CKIL_SYNC_REQ = 0,
286 CLK_SRC_ARM_PLL_EN = 1,
287 CLK_SRC_GPU_PLL_EN = 2,
288 CLK_SRC_VPU_PLL_EN = 3,
289 CLK_SRC_DRAM_PLL_EN = 4,
290 CLK_SRC_SYSTEM_PLL1_EN = 5,
291 CLK_SRC_SYSTEM_PLL2_EN = 6,
292 CLK_SRC_SYSTEM_PLL3_EN = 7,
293 CLK_SRC_AUDIO_PLL1_EN = 8,
294 CLK_SRC_AUDIO_PLL2_EN = 9,
295 CLK_SRC_VIDEO_PLL1_EN = 10,
296 CLK_SRC_VIDEO_PLL2_EN = 11,
297 CLK_SRC_ARM_PLL = 12,
298 CLK_SRC_GPU_PLL = 13,
299 CLK_SRC_VPU_PLL = 14,
300 CLK_SRC_DRAM_PLL = 15,
301 CLK_SRC_SYSTEM_PLL1_800M = 16,
302 CLK_SRC_SYSTEM_PLL1_400M = 17,
303 CLK_SRC_SYSTEM_PLL1_266M = 18,
304 CLK_SRC_SYSTEM_PLL1_200M = 19,
305 CLK_SRC_SYSTEM_PLL1_160M = 20,
306 CLK_SRC_SYSTEM_PLL1_133M = 21,
307 CLK_SRC_SYSTEM_PLL1_100M = 22,
308 CLK_SRC_SYSTEM_PLL1_80M = 23,
309 CLK_SRC_SYSTEM_PLL1_40M = 24,
310 CLK_SRC_SYSTEM_PLL2_1000M = 25,
311 CLK_SRC_SYSTEM_PLL2_500M = 26,
312 CLK_SRC_SYSTEM_PLL2_333M = 27,
313 CLK_SRC_SYSTEM_PLL2_250M = 28,
314 CLK_SRC_SYSTEM_PLL2_200M = 29,
315 CLK_SRC_SYSTEM_PLL2_166M = 30,
316 CLK_SRC_SYSTEM_PLL2_125M = 31,
317 CLK_SRC_SYSTEM_PLL2_100M = 32,
318 CLK_SRC_SYSTEM_PLL2_50M = 33,
319 CLK_SRC_SYSTEM_PLL3 = 34,
320 CLK_SRC_AUDIO_PLL1 = 35,
321 CLK_SRC_AUDIO_PLL2 = 36,
322 CLK_SRC_VIDEO_PLL1 = 37,
323 CLK_SRC_VIDEO_PLL2 = 38,
324 CLK_SRC_OSC_25M = 39,
325 CLK_SRC_OSC_27M = 40,
329 CLK_ROOT_PRE_DIV1 = 0,
340 CLK_ROOT_POST_DIV1 = 0,
406 struct clk_root_map {
407 enum clk_root_index entry;
408 enum clk_slice_type slice_type;
430 u32 nm_post_root_set;
431 u32 nm_post_root_clr;
432 u32 nm_post_root_tog;
438 u32 db_post_root_set;
439 u32 db_post_root_clr;
440 u32 db_post_root_tog;
447 u32 access_ctrl_root_set;
448 u32 access_ctrl_root_clr;
449 u32 access_ctrl_root_tog;
453 u32 reserved_0[4096];
454 struct ccm_ccgr ccgr_array[192];
455 u32 reserved_1[3328];
456 struct ccm_root core_root[5];
458 struct ccm_root bus_root[12];
460 struct ccm_root ahb_ipg_root[4];
462 struct ccm_root dram_sel;
463 struct ccm_root core_sel;
465 struct ccm_root ip_root[78];
468 #define CCGR_CLK_ON_MASK 0x03
469 #define CLK_SRC_ON_MASK 0x03
471 #define CLK_ROOT_ON BIT(28)
472 #define CLK_ROOT_OFF (0 << 28)
473 #define CLK_ROOT_ENABLE_MASK BIT(28)
474 #define CLK_ROOT_ENABLE_SHIFT 28
475 #define CLK_ROOT_SOURCE_SEL(n) (((n) & 0x7) << 24)
477 /* For SEL, only use 1 bit */
478 #define CLK_ROOT_SRC_MUX_MASK 0x07000000
479 #define CLK_ROOT_SRC_MUX_SHIFT 24
480 #define CLK_ROOT_SRC_0 0x00000000
481 #define CLK_ROOT_SRC_1 0x01000000
482 #define CLK_ROOT_SRC_2 0x02000000
483 #define CLK_ROOT_SRC_3 0x03000000
484 #define CLK_ROOT_SRC_4 0x04000000
485 #define CLK_ROOT_SRC_5 0x05000000
486 #define CLK_ROOT_SRC_6 0x06000000
487 #define CLK_ROOT_SRC_7 0x07000000
489 #define CLK_ROOT_PRE_DIV_MASK (0x00070000)
490 #define CLK_ROOT_PRE_DIV_SHIFT 16
491 #define CLK_ROOT_PRE_DIV(n) (((n) << 16) & 0x00070000)
493 #define CLK_ROOT_AUDO_SLOW_EN 0x1000
495 #define CLK_ROOT_AUDO_DIV_MASK 0x700
496 #define CLK_ROOT_AUDO_DIV_SHIFT 0x8
497 #define CLK_ROOT_AUDO_DIV(n) (((n) << 8) & 0x700)
499 /* For CORE: mask is 0x7; For IPG: mask is 0x3 */
500 #define CLK_ROOT_POST_DIV_MASK 0x3f
501 #define CLK_ROOT_CORE_POST_DIV_MASK 0x7
502 #define CLK_ROOT_IPG_POST_DIV_MASK 0x3
503 #define CLK_ROOT_POST_DIV_SHIFT 0
504 #define CLK_ROOT_POST_DIV(n) ((n) & 0x3f)
506 /* AUDIO PLL1/2 VIDEO PLL1 GPU PLL VPU PLL ARM PLL*/
507 #define FRAC_PLL_LOCK_MASK BIT(31)
508 #define FRAC_PLL_CLKE_MASK BIT(21)
509 #define FRAC_PLL_PD_MASK BIT(19)
510 #define FRAC_PLL_REFCLK_SEL_MASK BIT(16)
511 #define FRAC_PLL_LOCK_SEL_MASK BIT(15)
512 #define FRAC_PLL_BYPASS_MASK BIT(14)
513 #define FRAC_PLL_COUNTCLK_SEL_MASK BIT(13)
514 #define FRAC_PLL_NEWDIV_VAL_MASK BIT(12)
515 #define FRAC_PLL_NEWDIV_ACK_MASK BIT(11)
516 #define FRAC_PLL_REFCLK_DIV_VAL(n) (((n) << 5) & (0x3f << 5))
517 #define FRAC_PLL_REFCLK_DIV_VAL_MASK (0x3f << 5)
518 #define FRAC_PLL_REFCLK_DIV_VAL_SHIFT 5
519 #define FRAC_PLL_OUTPUT_DIV_VAL_MASK 0x1f
520 #define FRAC_PLL_OUTPUT_DIV_VAL(n) ((n) & 0x1f)
522 #define FRAC_PLL_REFCLK_SEL_OSC_25M (0 << 16)
523 #define FRAC_PLL_REFCLK_SEL_OSC_27M BIT(16)
524 #define FRAC_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
525 #define FRAC_PLL_REFCLK_SEL_CLK_PN (3 << 16)
527 #define FRAC_PLL_FRAC_DIV_CTL_MASK (0x1ffffff << 7)
528 #define FRAC_PLL_FRAC_DIV_CTL_SHIFT 7
529 #define FRAC_PLL_INT_DIV_CTL_MASK 0x7f
530 #define FRAC_PLL_INT_DIV_CTL_VAL(n) ((n) & 0x7f)
532 /* SYS PLL1/2/3 VIDEO PLL2 DRAM PLL */
533 #define SSCG_PLL_LOCK_MASK BIT(31)
534 #define SSCG_PLL_CLKE_MASK BIT(25)
535 #define SSCG_PLL_DIV2_CLKE_MASK BIT(23)
536 #define SSCG_PLL_DIV3_CLKE_MASK BIT(21)
537 #define SSCG_PLL_DIV4_CLKE_MASK BIT(19)
538 #define SSCG_PLL_DIV5_CLKE_MASK BIT(17)
539 #define SSCG_PLL_DIV6_CLKE_MASK BIT(15)
540 #define SSCG_PLL_DIV8_CLKE_MASK BIT(13)
541 #define SSCG_PLL_DIV10_CLKE_MASK BIT(11)
542 #define SSCG_PLL_DIV20_CLKE_MASK BIT(9)
543 #define SSCG_PLL_VIDEO_PLL2_CLKE_MASK BIT(9)
544 #define SSCG_PLL_DRAM_PLL_CLKE_MASK BIT(9)
545 #define SSCG_PLL_PLL3_CLKE_MASK BIT(9)
546 #define SSCG_PLL_PD_MASK BIT(7)
547 #define SSCG_PLL_BYPASS1_MASK BIT(5)
548 #define SSCG_PLL_BYPASS2_MASK BIT(4)
549 #define SSCG_PLL_LOCK_SEL_MASK BIT(3)
550 #define SSCG_PLL_COUNTCLK_SEL_MASK BIT(2)
551 #define SSCG_PLL_REFCLK_SEL_MASK 0x3
552 #define SSCG_PLL_REFCLK_SEL_OSC_25M (0 << 16)
553 #define SSCG_PLL_REFCLK_SEL_OSC_27M BIT(16)
554 #define SSCG_PLL_REFCLK_SEL_HDMI_PHY_27M (2 << 16)
555 #define SSCG_PLL_REFCLK_SEL_CLK_PN (3 << 16)
557 #define SSCG_PLL_SSDS_MASK BIT(8)
558 #define SSCG_PLL_SSMD_MASK (0x7 << 5)
559 #define SSCG_PLL_SSMF_MASK (0xf << 1)
560 #define SSCG_PLL_SSE_MASK 0x1
562 #define SSCG_PLL_REF_DIVR1_MASK (0x7 << 25)
563 #define SSCG_PLL_REF_DIVR1_SHIFT 25
564 #define SSCG_PLL_REF_DIVR1_VAL(n) (((n) << 25) & SSCG_PLL_REF_DIVR1_MASK)
565 #define SSCG_PLL_REF_DIVR2_MASK (0x3f << 19)
566 #define SSCG_PLL_REF_DIVR2_SHIFT 19
567 #define SSCG_PLL_REF_DIVR2_VAL(n) (((n) << 19) & SSCG_PLL_REF_DIVR2_MASK)
568 #define SSCG_PLL_FEEDBACK_DIV_F1_MASK (0x3f << 13)
569 #define SSCG_PLL_FEEDBACK_DIV_F1_SHIFT 13
570 #define SSCG_PLL_FEEDBACK_DIV_F1_VAL(n) (((n) << 13) & \
571 SSCG_PLL_FEEDBACK_DIV_F1_MASK)
572 #define SSCG_PLL_FEEDBACK_DIV_F2_MASK (0x3f << 7)
573 #define SSCG_PLL_FEEDBACK_DIV_F2_SHIFT 7
574 #define SSCG_PLL_FEEDBACK_DIV_F2_VAL(n) (((n) << 7) & \
575 SSCG_PLL_FEEDBACK_DIV_F2_MASK)
576 #define SSCG_PLL_OUTPUT_DIV_VAL_MASK (0x3f << 1)
577 #define SSCG_PLL_OUTPUT_DIV_VAL_SHIFT 1
578 #define SSCG_PLL_OUTPUT_DIV_VAL(n) (((n) << 1) & \
579 SSCG_PLL_OUTPUT_DIV_VAL_MASK)
580 #define SSCG_PLL_FILTER_RANGE_MASK 0x1
582 #define HW_DIGPROG_MAJOR_UPPER_MASK (0xff << 16)
583 #define HW_DIGPROG_MAJOR_LOWER_MASK (0xff << 8)
584 #define HW_DIGPROG_MINOR_MASK 0xff
586 #define HW_OSC_27M_CLKE_MASK BIT(4)
587 #define HW_OSC_25M_CLKE_MASK BIT(2)
588 #define HW_OSC_32K_SEL_MASK 0x1
589 #define HW_OSC_32K_SEL_RTC 0x1
590 #define HW_OSC_32K_SEL_25M_DIV800 0x0
592 #define HW_FRAC_ARM_PLL_DIV_MASK (0x7 << 20)
593 #define HW_FRAC_ARM_PLL_DIV_SHIFT 20
594 #define HW_FRAC_VPU_PLL_DIV_MASK (0x7 << 16)
595 #define HW_FRAC_VPU_PLL_DIV_SHIFT 16
596 #define HW_FRAC_GPU_PLL_DIV_MASK (0x7 << 12)
597 #define HW_FRAC_GPU_PLL_DIV_SHIFT 12
598 #define HW_FRAC_VIDEO_PLL1_DIV_MASK (0x7 << 10)
599 #define HW_FRAC_VIDEO_PLL1_DIV_SHIFT 10
600 #define HW_FRAC_AUDIO_PLL2_DIV_MASK (0x7 << 4)
601 #define HW_FRAC_AUDIO_PLL2_DIV_SHIFT 4
602 #define HW_FRAC_AUDIO_PLL1_DIV_MASK 0x7
603 #define HW_FRAC_AUDIO_PLL1_DIV_SHIFT 0
605 #define HW_SSCG_VIDEO_PLL2_DIV_MASK (0x7 << 16)
606 #define HW_SSCG_VIDEO_PLL2_DIV_SHIFT 16
607 #define HW_SSCG_DRAM_PLL_DIV_MASK (0x7 << 14)
608 #define HW_SSCG_DRAM_PLL_DIV_SHIFT 14
609 #define HW_SSCG_SYSTEM_PLL3_DIV_MASK (0x7 << 8)
610 #define HW_SSCG_SYSTEM_PLL3_DIV_SHIFT 8
611 #define HW_SSCG_SYSTEM_PLL2_DIV_MASK (0x7 << 4)
612 #define HW_SSCG_SYSTEM_PLL2_DIV_SHIFT 4
613 #define HW_SSCG_SYSTEM_PLL1_DIV_MASK 0x7
614 #define HW_SSCG_SYSTEM_PLL1_DIV_SHIFT 0
616 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK 0x01000000
617 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK 0x02000000
618 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK 0x03000000
619 #define ENET_AXI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK 0x07000000
620 #define ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M 0x01000000
621 #define ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK 0x01000000
622 #define ENET_PHY_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK 0x01000000
630 enum frac_pll_out_val {
635 u32 imx_get_fecclk(void);
636 u32 imx_get_uartclk(void);
637 int clock_init(void);
638 void init_clk_usdhc(u32 index);
639 void init_uart_clk(u32 index);
640 void init_wdog_clk(void);
641 unsigned int mxc_get_clock(enum clk_root_index clk);
642 int clock_enable(enum clk_ccgr_index index, bool enable);
643 int clock_root_enabled(enum clk_root_index clock_id);
644 int clock_root_cfg(enum clk_root_index clock_id, enum root_pre_div pre_div,
645 enum root_post_div post_div, enum clk_root_src clock_src);
646 int clock_set_target_val(enum clk_root_index clock_id, u32 val);
647 int clock_get_target_val(enum clk_root_index clock_id, u32 *val);
648 int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div);
649 int clock_get_postdiv(enum clk_root_index clock_id,
650 enum root_post_div *post_div);
651 int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src);
652 void mxs_set_lcdclk(u32 base_addr, u32 freq);
653 int set_clk_qspi(void);
654 void enable_ocotp_clk(unsigned char enable);
655 int enable_i2c_clk(unsigned char enable, unsigned int i2c_num);
656 int set_clk_enet(enum enet_freq type);