/* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2021 Paweł Jarosz */ #ifndef _ASM_ARCH_CRU_RK3066_H #define _ASM_ARCH_CRU_RK3066_H #include #include #define REG(name, h, l) \ name##_MASK = GENMASK(h, l), \ name##_SHIFT = __bf_shf(name##_MASK) #define OSC_HZ (24 * 1000 * 1000) #define APLL_HZ (1416 * 1000000) #define APLL_SAFE_HZ (600 * 1000000) #define GPLL_HZ (594 * 1000000) #define CPLL_HZ (384 * 1000000) /* The SRAM is clocked off aclk_cpu, so we want to max it out for boot speed */ #define CPU_ACLK_HZ 297000000 #define CPU_HCLK_HZ 148500000 #define CPU_PCLK_HZ 74250000 #define CPU_H2P_HZ 74250000 #define PERI_ACLK_HZ 148500000 #define PERI_HCLK_HZ 148500000 #define PERI_PCLK_HZ 74250000 /* Private data for the clock driver - used by rockchip_get_cru() */ struct rk3066_clk_priv { struct rk3066_grf *grf; struct rk3066_cru *cru; ulong rate; bool has_bwadj; }; struct rk3066_cru { struct rk3066_pll { u32 con0; u32 con1; u32 con2; u32 con3; } pll[4]; u32 cru_mode_con; u32 cru_clksel_con[35]; u32 cru_clkgate_con[10]; u32 reserved1[2]; u32 cru_glb_srst_fst_value; u32 cru_glb_srst_snd_value; u32 reserved2[2]; u32 cru_softrst_con[9]; u32 cru_misc_con; u32 reserved3[2]; u32 cru_glb_cnt_th; }; check_member(rk3066_cru, cru_glb_cnt_th, 0x0140); /* CRU_CLKSEL0_CON */ enum { REG(CPU_ACLK_PLL, 8, 8), CPU_ACLK_PLL_SELECT_APLL = 0, CPU_ACLK_PLL_SELECT_GPLL, REG(CORE_PERI_DIV, 7, 6), REG(A9_CORE_DIV, 4, 0), }; /* CRU_CLKSEL1_CON */ enum { REG(AHB2APB_DIV, 15, 14), REG(CPU_PCLK_DIV, 13, 12), REG(CPU_HCLK_DIV, 9, 8), REG(CPU_ACLK_DIV, 2, 0), }; /* CRU_CLKSEL10_CON */ enum { REG(PERI_SEL_PLL, 15, 15), PERI_SEL_CPLL = 0, PERI_SEL_GPLL, REG(PERI_PCLK_DIV, 13, 12), REG(PERI_HCLK_DIV, 9, 8), REG(PERI_ACLK_DIV, 4, 0), }; /* CRU_CLKSEL11_CON */ enum { REG(MMC0_DIV, 5, 0), }; /* CRU_CLKSEL12_CON */ enum { REG(UART_PLL, 15, 15), UART_PLL_SELECT_GENERAL = 0, UART_PLL_SELECT_CODEC, REG(EMMC_DIV, 13, 8), REG(SDIO_DIV, 5, 0), }; /* CRU_CLKSEL24_CON */ enum { REG(SARADC_DIV, 15, 8), }; /* CRU_CLKSEL25_CON */ enum { REG(SPI1_DIV, 14, 8), REG(SPI0_DIV, 6, 0), }; /* CRU_CLKSEL34_CON */ enum { REG(TSADC_DIV, 15, 0), }; /* CRU_MODE_CON */ enum { REG(GPLL_MODE, 13, 12), REG(CPLL_MODE, 9, 8), REG(DPLL_MODE, 5, 4), REG(APLL_MODE, 1, 0), PLL_MODE_SLOW = 0, PLL_MODE_NORMAL, PLL_MODE_DEEP, }; /* CRU_APLL_CON0 */ enum { REG(CLKR, 13, 8), REG(CLKOD, 3, 0), }; /* CRU_APLL_CON1 */ enum { REG(CLKF, 12, 0), }; #endif