14931c6fbSPaweł Jarosz /* 24931c6fbSPaweł Jarosz * (C) Copyright 2016 Heiko Stuebner <heiko@sntech.de> 34931c6fbSPaweł Jarosz * 44931c6fbSPaweł Jarosz * SPDX-License-Identifier: GPL-2.0+ 54931c6fbSPaweł Jarosz */ 64931c6fbSPaweł Jarosz #ifndef _ASM_ARCH_CRU_RK3066_H 74931c6fbSPaweł Jarosz #define _ASM_ARCH_CRU_RK3066_H 84931c6fbSPaweł Jarosz 94931c6fbSPaweł Jarosz #define OSC_HZ (24 * 1000 * 1000) 104931c6fbSPaweł Jarosz 114931c6fbSPaweł Jarosz #define APLL_HZ (1416 * 1000000) 124931c6fbSPaweł Jarosz #define APLL_SAFE_HZ (600 * 1000000) 134931c6fbSPaweł Jarosz #define GPLL_HZ (594 * 1000000) 144931c6fbSPaweł Jarosz #define CPLL_HZ (384 * 1000000) 154931c6fbSPaweł Jarosz 164931c6fbSPaweł Jarosz /* The SRAM is clocked off aclk_cpu, so we want to max it out for boot speed */ 174931c6fbSPaweł Jarosz #define CPU_ACLK_HZ 297000000 184931c6fbSPaweł Jarosz #define CPU_HCLK_HZ 148500000 194931c6fbSPaweł Jarosz #define CPU_PCLK_HZ 74250000 204931c6fbSPaweł Jarosz #define CPU_H2P_HZ 74250000 214931c6fbSPaweł Jarosz 224931c6fbSPaweł Jarosz #define PERI_ACLK_HZ 148500000 234931c6fbSPaweł Jarosz #define PERI_HCLK_HZ 148500000 244931c6fbSPaweł Jarosz #define PERI_PCLK_HZ 74250000 254931c6fbSPaweł Jarosz 264931c6fbSPaweł Jarosz /* Private data for the clock driver - used by rockchip_get_cru() */ 274931c6fbSPaweł Jarosz struct rk3066_clk_priv { 284931c6fbSPaweł Jarosz struct rk3066_grf *grf; 294931c6fbSPaweł Jarosz struct rk3066_cru *cru; 304931c6fbSPaweł Jarosz ulong rate; 314931c6fbSPaweł Jarosz bool has_bwadj; 32*524f2646SElaine Zhang ulong armclk_hz; 33*524f2646SElaine Zhang ulong armclk_enter_hz; 34*524f2646SElaine Zhang ulong armclk_init_hz; 35*524f2646SElaine Zhang bool sync_kernel; 36*524f2646SElaine Zhang bool set_armclk_rate; 374931c6fbSPaweł Jarosz }; 384931c6fbSPaweł Jarosz 394931c6fbSPaweł Jarosz struct rk3066_cru { 404931c6fbSPaweł Jarosz struct rk3066_pll { 414931c6fbSPaweł Jarosz u32 con0; 424931c6fbSPaweł Jarosz u32 con1; 434931c6fbSPaweł Jarosz u32 con2; 444931c6fbSPaweł Jarosz u32 con3; 454931c6fbSPaweł Jarosz } pll[4]; 464931c6fbSPaweł Jarosz u32 cru_mode_con; 474931c6fbSPaweł Jarosz u32 cru_clksel_con[35]; 484931c6fbSPaweł Jarosz u32 cru_clkgate_con[10]; 494931c6fbSPaweł Jarosz u32 reserved1[2]; 504931c6fbSPaweł Jarosz u32 cru_glb_srst_fst_value; 514931c6fbSPaweł Jarosz u32 cru_glb_srst_snd_value; 524931c6fbSPaweł Jarosz u32 reserved2[2]; 534931c6fbSPaweł Jarosz u32 cru_softrst_con[9]; 544931c6fbSPaweł Jarosz u32 cru_misc_con; 554931c6fbSPaweł Jarosz u32 reserved3[2]; 564931c6fbSPaweł Jarosz u32 cru_glb_cnt_th; 574931c6fbSPaweł Jarosz }; 584931c6fbSPaweł Jarosz check_member(rk3066_cru, cru_glb_cnt_th, 0x0140); 594931c6fbSPaweł Jarosz 60*524f2646SElaine Zhang struct rk3066_clk_info { 61*524f2646SElaine Zhang unsigned long id; 62*524f2646SElaine Zhang char *name; 63*524f2646SElaine Zhang bool is_cru; 64*524f2646SElaine Zhang }; 65*524f2646SElaine Zhang 664931c6fbSPaweł Jarosz /* CRU_CLKSEL0_CON */ 674931c6fbSPaweł Jarosz enum { 684931c6fbSPaweł Jarosz /* a9_core_div: core = core_src / (a9_core_div + 1) */ 694931c6fbSPaweł Jarosz A9_CORE_DIV_SHIFT = 9, 704931c6fbSPaweł Jarosz A9_CORE_DIV_MASK = 0x1f << A9_CORE_DIV_SHIFT, 714931c6fbSPaweł Jarosz CORE_PLL_SHIFT = 8, 724931c6fbSPaweł Jarosz CORE_PLL_MASK = 1 << CORE_PLL_SHIFT, 734931c6fbSPaweł Jarosz CORE_PLL_SELECT_APLL = 0, 744931c6fbSPaweł Jarosz CORE_PLL_SELECT_GPLL, 754931c6fbSPaweł Jarosz 764931c6fbSPaweł Jarosz /* core peri div: core:core_peri = 2:1, 4:1, 8:1 or 16:1 */ 774931c6fbSPaweł Jarosz CORE_PERI_DIV_SHIFT = 6, 784931c6fbSPaweł Jarosz CORE_PERI_DIV_MASK = 3 << CORE_PERI_DIV_SHIFT, 794931c6fbSPaweł Jarosz 804931c6fbSPaweł Jarosz /* aclk_cpu pll selection */ 814931c6fbSPaweł Jarosz CPU_ACLK_PLL_SHIFT = 5, 824931c6fbSPaweł Jarosz CPU_ACLK_PLL_MASK = 1 << CPU_ACLK_PLL_SHIFT, 834931c6fbSPaweł Jarosz CPU_ACLK_PLL_SELECT_APLL = 0, 844931c6fbSPaweł Jarosz CPU_ACLK_PLL_SELECT_GPLL, 854931c6fbSPaweł Jarosz 864931c6fbSPaweł Jarosz /* a9_cpu_div: aclk_cpu = cpu_src / (a9_cpu_div + 1) */ 874931c6fbSPaweł Jarosz A9_CPU_DIV_SHIFT = 0, 884931c6fbSPaweł Jarosz A9_CPU_DIV_MASK = 0x1f << A9_CPU_DIV_SHIFT, 894931c6fbSPaweł Jarosz }; 904931c6fbSPaweł Jarosz 914931c6fbSPaweł Jarosz /* CRU_CLKSEL1_CON */ 924931c6fbSPaweł Jarosz enum { 934931c6fbSPaweł Jarosz /* ahb2apb_pclk_div: hclk_cpu:pclk_cpu = 1:1, 2:1 or 4:1 */ 944931c6fbSPaweł Jarosz AHB2APB_DIV_SHIFT = 14, 954931c6fbSPaweł Jarosz AHB2APB_DIV_MASK = 3 << AHB2APB_DIV_SHIFT, 964931c6fbSPaweł Jarosz 974931c6fbSPaweł Jarosz /* cpu_pclk_div: aclk_cpu:pclk_cpu = 1:1, 2:1, 4:1 or 8:1 */ 984931c6fbSPaweł Jarosz CPU_PCLK_DIV_SHIFT = 12, 994931c6fbSPaweł Jarosz CPU_PCLK_DIV_MASK = 3 << CPU_PCLK_DIV_SHIFT, 1004931c6fbSPaweł Jarosz 1014931c6fbSPaweł Jarosz /* cpu_hclk_div: aclk_cpu:hclk_cpu = 1:1, 2:1 or 4:1 */ 1024931c6fbSPaweł Jarosz CPU_HCLK_DIV_SHIFT = 8, 1034931c6fbSPaweł Jarosz CPU_HCLK_DIV_MASK = 3 << CPU_HCLK_DIV_SHIFT, 1044931c6fbSPaweł Jarosz 1054931c6fbSPaweł Jarosz /* core_aclk_div: cire:aclk_core = 1:1, 2:1, 3:1, 4:1 or 8:1 */ 1064931c6fbSPaweł Jarosz CORE_ACLK_DIV_SHIFT = 3, 1074931c6fbSPaweł Jarosz CORE_ACLK_DIV_MASK = 7 << CORE_ACLK_DIV_SHIFT, 1084931c6fbSPaweł Jarosz }; 1094931c6fbSPaweł Jarosz 1104931c6fbSPaweł Jarosz /* CRU_CLKSEL10_CON */ 1114931c6fbSPaweł Jarosz enum { 1124931c6fbSPaweł Jarosz PERI_SEL_PLL_SHIFT = 15, 1134931c6fbSPaweł Jarosz PERI_SEL_PLL_MASK = 1 << PERI_SEL_PLL_SHIFT, 1144931c6fbSPaweł Jarosz PERI_SEL_CPLL = 0, 1154931c6fbSPaweł Jarosz PERI_SEL_GPLL, 1164931c6fbSPaweł Jarosz 1174931c6fbSPaweł Jarosz /* peri pclk div: aclk_bus:pclk_bus = 1:1, 2:1, 4:1 or 8:1 */ 1184931c6fbSPaweł Jarosz PERI_PCLK_DIV_SHIFT = 12, 1194931c6fbSPaweł Jarosz PERI_PCLK_DIV_MASK = 3 << PERI_PCLK_DIV_SHIFT, 1204931c6fbSPaweł Jarosz 1214931c6fbSPaweł Jarosz /* peripheral bus hclk div:aclk_bus: hclk_bus = 1:1, 2:1 or 4:1 */ 1224931c6fbSPaweł Jarosz PERI_HCLK_DIV_SHIFT = 8, 1234931c6fbSPaweł Jarosz PERI_HCLK_DIV_MASK = 3 << PERI_HCLK_DIV_SHIFT, 1244931c6fbSPaweł Jarosz 1254931c6fbSPaweł Jarosz /* peri aclk div: aclk_peri = periph_src / (peri_aclk_div + 1) */ 1264931c6fbSPaweł Jarosz PERI_ACLK_DIV_SHIFT = 0, 1274931c6fbSPaweł Jarosz PERI_ACLK_DIV_MASK = 0x1f << PERI_ACLK_DIV_SHIFT, 1284931c6fbSPaweł Jarosz }; 1294931c6fbSPaweł Jarosz /* CRU_CLKSEL11_CON */ 1304931c6fbSPaweł Jarosz enum { 1314931c6fbSPaweł Jarosz MMC0_DIV_SHIFT = 0, 1324931c6fbSPaweł Jarosz MMC0_DIV_MASK = 0x3f << MMC0_DIV_SHIFT, 1334931c6fbSPaweł Jarosz }; 1344931c6fbSPaweł Jarosz 1354931c6fbSPaweł Jarosz /* CRU_CLKSEL12_CON */ 1364931c6fbSPaweł Jarosz enum { 1374931c6fbSPaweł Jarosz UART_PLL_SHIFT = 15, 1384931c6fbSPaweł Jarosz UART_PLL_MASK = 1 << UART_PLL_SHIFT, 1394931c6fbSPaweł Jarosz UART_PLL_SELECT_GENERAL = 0, 1404931c6fbSPaweł Jarosz UART_PLL_SELECT_CODEC, 1414931c6fbSPaweł Jarosz 1424931c6fbSPaweł Jarosz EMMC_DIV_SHIFT = 8, 1434931c6fbSPaweł Jarosz EMMC_DIV_MASK = 0x3f << EMMC_DIV_SHIFT, 1444931c6fbSPaweł Jarosz 1454931c6fbSPaweł Jarosz SDIO_DIV_SHIFT = 0, 1464931c6fbSPaweł Jarosz SDIO_DIV_MASK = 0x3f << SDIO_DIV_SHIFT, 1474931c6fbSPaweł Jarosz }; 1484931c6fbSPaweł Jarosz 1494931c6fbSPaweł Jarosz /* CRU_CLKSEL25_CON */ 1504931c6fbSPaweł Jarosz enum { 1514931c6fbSPaweł Jarosz SPI1_DIV_SHIFT = 8, 1524931c6fbSPaweł Jarosz SPI1_DIV_MASK = 0x7f << SPI1_DIV_SHIFT, 1534931c6fbSPaweł Jarosz 1544931c6fbSPaweł Jarosz SPI0_DIV_SHIFT = 0, 1554931c6fbSPaweł Jarosz SPI0_DIV_MASK = 0x7f << SPI0_DIV_SHIFT, 1564931c6fbSPaweł Jarosz }; 1574931c6fbSPaweł Jarosz 1584931c6fbSPaweł Jarosz /* CRU_MODE_CON */ 1594931c6fbSPaweł Jarosz enum { 1604931c6fbSPaweł Jarosz GPLL_MODE_SHIFT = 12, 1614931c6fbSPaweł Jarosz GPLL_MODE_MASK = 3 << GPLL_MODE_SHIFT, 1624931c6fbSPaweł Jarosz GPLL_MODE_SLOW = 0, 1634931c6fbSPaweł Jarosz GPLL_MODE_NORMAL, 1644931c6fbSPaweł Jarosz GPLL_MODE_DEEP, 1654931c6fbSPaweł Jarosz 1664931c6fbSPaweł Jarosz CPLL_MODE_SHIFT = 8, 1674931c6fbSPaweł Jarosz CPLL_MODE_MASK = 3 << CPLL_MODE_SHIFT, 1684931c6fbSPaweł Jarosz CPLL_MODE_SLOW = 0, 1694931c6fbSPaweł Jarosz CPLL_MODE_NORMAL, 1704931c6fbSPaweł Jarosz CPLL_MODE_DEEP, 1714931c6fbSPaweł Jarosz 1724931c6fbSPaweł Jarosz DPLL_MODE_SHIFT = 4, 1734931c6fbSPaweł Jarosz DPLL_MODE_MASK = 3 << DPLL_MODE_SHIFT, 1744931c6fbSPaweł Jarosz DPLL_MODE_SLOW = 0, 1754931c6fbSPaweł Jarosz DPLL_MODE_NORMAL, 1764931c6fbSPaweł Jarosz DPLL_MODE_DEEP, 1774931c6fbSPaweł Jarosz 1784931c6fbSPaweł Jarosz APLL_MODE_SHIFT = 0, 1794931c6fbSPaweł Jarosz APLL_MODE_MASK = 3 << APLL_MODE_SHIFT, 1804931c6fbSPaweł Jarosz APLL_MODE_SLOW = 0, 1814931c6fbSPaweł Jarosz APLL_MODE_NORMAL, 1824931c6fbSPaweł Jarosz APLL_MODE_DEEP, 1834931c6fbSPaweł Jarosz }; 1844931c6fbSPaweł Jarosz 1854931c6fbSPaweł Jarosz /* CRU_APLL_CON0 */ 1864931c6fbSPaweł Jarosz enum { 1874931c6fbSPaweł Jarosz CLKR_SHIFT = 8, 1884931c6fbSPaweł Jarosz CLKR_MASK = 0x3f << CLKR_SHIFT, 1894931c6fbSPaweł Jarosz 1904931c6fbSPaweł Jarosz CLKOD_SHIFT = 0, 1914931c6fbSPaweł Jarosz CLKOD_MASK = 0x3f << CLKOD_SHIFT, 1924931c6fbSPaweł Jarosz }; 1934931c6fbSPaweł Jarosz 1944931c6fbSPaweł Jarosz /* CRU_APLL_CON1 */ 1954931c6fbSPaweł Jarosz enum { 1964931c6fbSPaweł Jarosz CLKF_SHIFT = 0, 1974931c6fbSPaweł Jarosz CLKF_MASK = 0x1fff << CLKF_SHIFT, 1984931c6fbSPaweł Jarosz }; 1994931c6fbSPaweł Jarosz 2004931c6fbSPaweł Jarosz #endif 201