16c43f6c8STom Warren /* 26c43f6c8STom Warren * (C) Copyright 2013-2015 36c43f6c8STom Warren * NVIDIA Corporation <www.nvidia.com> 46c43f6c8STom Warren * 56c43f6c8STom Warren * SPDX-License-Identifier: GPL-2.0+ 66c43f6c8STom Warren */ 76c43f6c8STom Warren 86c43f6c8STom Warren /* Tegra210 Clock control functions */ 96c43f6c8STom Warren 106c43f6c8STom Warren #include <common.h> 11dfa551e4SStephen Warren #include <errno.h> 126c43f6c8STom Warren #include <asm/io.h> 136c43f6c8STom Warren #include <asm/arch/clock.h> 146c43f6c8STom Warren #include <asm/arch/sysctr.h> 156c43f6c8STom Warren #include <asm/arch/tegra.h> 166c43f6c8STom Warren #include <asm/arch-tegra/clk_rst.h> 176c43f6c8STom Warren #include <asm/arch-tegra/timer.h> 186c43f6c8STom Warren #include <div64.h> 196c43f6c8STom Warren #include <fdtdec.h> 206c43f6c8STom Warren 216c43f6c8STom Warren /* 226c43f6c8STom Warren * Clock types that we can use as a source. The Tegra210 has muxes for the 236c43f6c8STom Warren * peripheral clocks, and in most cases there are four options for the clock 246c43f6c8STom Warren * source. This gives us a clock 'type' and exploits what commonality exists 256c43f6c8STom Warren * in the device. 266c43f6c8STom Warren * 276c43f6c8STom Warren * Letters are obvious, except for T which means CLK_M, and S which means the 286c43f6c8STom Warren * clock derived from 32KHz. Beware that CLK_M (also called OSC in the 296c43f6c8STom Warren * datasheet) and PLL_M are different things. The former is the basic 306c43f6c8STom Warren * clock supplied to the SOC from an external oscillator. The latter is the 316c43f6c8STom Warren * memory clock PLL. 326c43f6c8STom Warren * 336c43f6c8STom Warren * See definitions in clock_id in the header file. 346c43f6c8STom Warren */ 356c43f6c8STom Warren enum clock_type_id { 366c43f6c8STom Warren CLOCK_TYPE_AXPT, /* PLL_A, PLL_X, PLL_P, CLK_M */ 376c43f6c8STom Warren CLOCK_TYPE_MCPA, /* and so on */ 386c43f6c8STom Warren CLOCK_TYPE_MCPT, 396c43f6c8STom Warren CLOCK_TYPE_PCM, 406c43f6c8STom Warren CLOCK_TYPE_PCMT, 416c43f6c8STom Warren CLOCK_TYPE_PDCT, 426c43f6c8STom Warren CLOCK_TYPE_ACPT, 436c43f6c8STom Warren CLOCK_TYPE_ASPTE, 446c43f6c8STom Warren CLOCK_TYPE_PMDACD2T, 456c43f6c8STom Warren CLOCK_TYPE_PCST, 465a30cee5SSimon Glass CLOCK_TYPE_DP, 476c43f6c8STom Warren 486c43f6c8STom Warren CLOCK_TYPE_PC2CC3M, 496c43f6c8STom Warren CLOCK_TYPE_PC2CC3S_T, 506c43f6c8STom Warren CLOCK_TYPE_PC2CC3M_T, 516c43f6c8STom Warren CLOCK_TYPE_PC2CC3M_T16, /* PC2CC3M_T, but w/16-bit divisor (I2C) */ 526c43f6c8STom Warren CLOCK_TYPE_MC2CC3P_A, 536c43f6c8STom Warren CLOCK_TYPE_M, 546c43f6c8STom Warren CLOCK_TYPE_MCPTM2C2C3, 556c43f6c8STom Warren CLOCK_TYPE_PC2CC3T_S, 566c43f6c8STom Warren CLOCK_TYPE_AC2CC3P_TS2, 576c43f6c8STom Warren CLOCK_TYPE_PC01C00_C42C41TC40, 586c43f6c8STom Warren 596c43f6c8STom Warren CLOCK_TYPE_COUNT, 606c43f6c8STom Warren CLOCK_TYPE_NONE = -1, /* invalid clock type */ 616c43f6c8STom Warren }; 626c43f6c8STom Warren 636c43f6c8STom Warren enum { 646c43f6c8STom Warren CLOCK_MAX_MUX = 8 /* number of source options for each clock */ 656c43f6c8STom Warren }; 666c43f6c8STom Warren 676c43f6c8STom Warren /* 686c43f6c8STom Warren * Clock source mux for each clock type. This just converts our enum into 696c43f6c8STom Warren * a list of mux sources for use by the code. 706c43f6c8STom Warren * 716c43f6c8STom Warren * Note: 726c43f6c8STom Warren * The extra column in each clock source array is used to store the mask 736c43f6c8STom Warren * bits in its register for the source. 746c43f6c8STom Warren */ 756c43f6c8STom Warren #define CLK(x) CLOCK_ID_ ## x 766c43f6c8STom Warren static enum clock_id clock_source[CLOCK_TYPE_COUNT][CLOCK_MAX_MUX+1] = { 776c43f6c8STom Warren { CLK(AUDIO), CLK(XCPU), CLK(PERIPH), CLK(OSC), 786c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 796c43f6c8STom Warren MASK_BITS_31_30}, 806c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(AUDIO), 816c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 826c43f6c8STom Warren MASK_BITS_31_30}, 836c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 846c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 856c43f6c8STom Warren MASK_BITS_31_30}, 866c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(NONE), 876c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 886c43f6c8STom Warren MASK_BITS_31_30}, 896c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), 906c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 916c43f6c8STom Warren MASK_BITS_31_30}, 926c43f6c8STom Warren { CLK(PERIPH), CLK(DISPLAY), CLK(CGENERAL), CLK(OSC), 936c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 946c43f6c8STom Warren MASK_BITS_31_30}, 956c43f6c8STom Warren { CLK(AUDIO), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 966c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 976c43f6c8STom Warren MASK_BITS_31_30}, 986c43f6c8STom Warren { CLK(AUDIO), CLK(SFROM32KHZ), CLK(PERIPH), CLK(OSC), 996c43f6c8STom Warren CLK(EPCI), CLK(NONE), CLK(NONE), CLK(NONE), 1006c43f6c8STom Warren MASK_BITS_31_29}, 1016c43f6c8STom Warren { CLK(PERIPH), CLK(MEMORY), CLK(DISPLAY), CLK(AUDIO), 1026c43f6c8STom Warren CLK(CGENERAL), CLK(DISPLAY2), CLK(OSC), CLK(NONE), 1036c43f6c8STom Warren MASK_BITS_31_29}, 1046c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(SFROM32KHZ), CLK(OSC), 1056c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 1066c43f6c8STom Warren MASK_BITS_31_28}, 1075a30cee5SSimon Glass /* CLOCK_TYPE_DP */ 1085a30cee5SSimon Glass { CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 1095a30cee5SSimon Glass CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 1105a30cee5SSimon Glass MASK_BITS_31_28}, 1116c43f6c8STom Warren 1126c43f6c8STom Warren /* Additional clock types on Tegra114+ */ 1136c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M */ 1146c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1156c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(NONE), CLK(NONE), 1166c43f6c8STom Warren MASK_BITS_31_29}, 1176c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3S_T */ 1186c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1196c43f6c8STom Warren CLK(SFROM32KHZ), CLK(NONE), CLK(OSC), CLK(NONE), 1206c43f6c8STom Warren MASK_BITS_31_29}, 1216c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M_T */ 1226c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1236c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(OSC), CLK(NONE), 1246c43f6c8STom Warren MASK_BITS_31_29}, 1256c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M_T, w/16-bit divisor (I2C) */ 1266c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1276c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(OSC), CLK(NONE), 1286c43f6c8STom Warren MASK_BITS_31_29}, 1296c43f6c8STom Warren /* CLOCK_TYPE_MC2CC3P_A */ 1306c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1316c43f6c8STom Warren CLK(PERIPH), CLK(NONE), CLK(AUDIO), CLK(NONE), 1326c43f6c8STom Warren MASK_BITS_31_29}, 1336c43f6c8STom Warren /* CLOCK_TYPE_M */ 1346c43f6c8STom Warren { CLK(MEMORY), CLK(NONE), CLK(NONE), CLK(NONE), 1356c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 1366c43f6c8STom Warren MASK_BITS_31_30}, 1376c43f6c8STom Warren /* CLOCK_TYPE_MCPTM2C2C3 */ 1386c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 1396c43f6c8STom Warren CLK(MEMORY2), CLK(CGENERAL2), CLK(CGENERAL3), CLK(NONE), 1406c43f6c8STom Warren MASK_BITS_31_29}, 1416c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3T_S */ 1426c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1436c43f6c8STom Warren CLK(OSC), CLK(NONE), CLK(SFROM32KHZ), CLK(NONE), 1446c43f6c8STom Warren MASK_BITS_31_29}, 1456c43f6c8STom Warren /* CLOCK_TYPE_AC2CC3P_TS2 */ 1466c43f6c8STom Warren { CLK(AUDIO), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 1476c43f6c8STom Warren CLK(PERIPH), CLK(NONE), CLK(OSC), CLK(SRC2), 1486c43f6c8STom Warren MASK_BITS_31_29}, 1496c43f6c8STom Warren /* CLOCK_TYPE_PC01C00_C42C41TC40 */ 1506c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL_1), CLK(CGENERAL_0), CLK(NONE), 1516c43f6c8STom Warren CLK(CGENERAL4_2), CLK(CGENERAL4_1), CLK(OSC), CLK(CGENERAL4_0), 1526c43f6c8STom Warren MASK_BITS_31_29}, 1536c43f6c8STom Warren }; 1546c43f6c8STom Warren 1556c43f6c8STom Warren /* 1566c43f6c8STom Warren * Clock type for each peripheral clock source. We put the name in each 1576c43f6c8STom Warren * record just so it is easy to match things up 1586c43f6c8STom Warren */ 1596c43f6c8STom Warren #define TYPE(name, type) type 1606c43f6c8STom Warren static enum clock_type_id clock_periph_type[PERIPHC_COUNT] = { 1616c43f6c8STom Warren /* 0x00 */ 1626c43f6c8STom Warren TYPE(PERIPHC_I2S2, CLOCK_TYPE_AXPT), 1636c43f6c8STom Warren TYPE(PERIPHC_I2S3, CLOCK_TYPE_AXPT), 1646c43f6c8STom Warren TYPE(PERIPHC_SPDIF_OUT, CLOCK_TYPE_AXPT), 1656c43f6c8STom Warren TYPE(PERIPHC_SPDIF_IN, CLOCK_TYPE_PC2CC3M), 1666c43f6c8STom Warren TYPE(PERIPHC_PWM, CLOCK_TYPE_PC2CC3S_T), 1676c43f6c8STom Warren TYPE(PERIPHC_05h, CLOCK_TYPE_NONE), 1686c43f6c8STom Warren TYPE(PERIPHC_SBC2, CLOCK_TYPE_PC2CC3M_T), 1696c43f6c8STom Warren TYPE(PERIPHC_SBC3, CLOCK_TYPE_PC2CC3M_T), 1706c43f6c8STom Warren 1716c43f6c8STom Warren /* 0x08 */ 1726c43f6c8STom Warren TYPE(PERIPHC_08h, CLOCK_TYPE_NONE), 1736c43f6c8STom Warren TYPE(PERIPHC_I2C1, CLOCK_TYPE_PC2CC3M_T16), 1746c43f6c8STom Warren TYPE(PERIPHC_I2C5, CLOCK_TYPE_PC2CC3M_T16), 1756c43f6c8STom Warren TYPE(PERIPHC_0bh, CLOCK_TYPE_NONE), 1766c43f6c8STom Warren TYPE(PERIPHC_0ch, CLOCK_TYPE_NONE), 1776c43f6c8STom Warren TYPE(PERIPHC_SBC1, CLOCK_TYPE_PC2CC3M_T), 1786c43f6c8STom Warren TYPE(PERIPHC_DISP1, CLOCK_TYPE_PMDACD2T), 1796c43f6c8STom Warren TYPE(PERIPHC_DISP2, CLOCK_TYPE_PMDACD2T), 1806c43f6c8STom Warren 1816c43f6c8STom Warren /* 0x10 */ 1826c43f6c8STom Warren TYPE(PERIPHC_10h, CLOCK_TYPE_NONE), 1836c43f6c8STom Warren TYPE(PERIPHC_11h, CLOCK_TYPE_NONE), 1846c43f6c8STom Warren TYPE(PERIPHC_VI, CLOCK_TYPE_MC2CC3P_A), 1856c43f6c8STom Warren TYPE(PERIPHC_13h, CLOCK_TYPE_NONE), 1866c43f6c8STom Warren TYPE(PERIPHC_SDMMC1, CLOCK_TYPE_PC2CC3M_T), 1876c43f6c8STom Warren TYPE(PERIPHC_SDMMC2, CLOCK_TYPE_PC2CC3M_T), 1886c43f6c8STom Warren TYPE(PERIPHC_16h, CLOCK_TYPE_NONE), 1896c43f6c8STom Warren TYPE(PERIPHC_17h, CLOCK_TYPE_NONE), 1906c43f6c8STom Warren 1916c43f6c8STom Warren /* 0x18 */ 1926c43f6c8STom Warren TYPE(PERIPHC_18h, CLOCK_TYPE_NONE), 1936c43f6c8STom Warren TYPE(PERIPHC_SDMMC4, CLOCK_TYPE_PC2CC3M_T), 1946c43f6c8STom Warren TYPE(PERIPHC_VFIR, CLOCK_TYPE_PC2CC3M_T), 1956c43f6c8STom Warren TYPE(PERIPHC_1Bh, CLOCK_TYPE_NONE), 1966c43f6c8STom Warren TYPE(PERIPHC_1Ch, CLOCK_TYPE_NONE), 1976c43f6c8STom Warren TYPE(PERIPHC_HSI, CLOCK_TYPE_PC2CC3M_T), 1986c43f6c8STom Warren TYPE(PERIPHC_UART1, CLOCK_TYPE_PC2CC3M_T), 1996c43f6c8STom Warren TYPE(PERIPHC_UART2, CLOCK_TYPE_PC2CC3M_T), 2006c43f6c8STom Warren 2016c43f6c8STom Warren /* 0x20 */ 2026c43f6c8STom Warren TYPE(PERIPHC_HOST1X, CLOCK_TYPE_MC2CC3P_A), 2036c43f6c8STom Warren TYPE(PERIPHC_21h, CLOCK_TYPE_NONE), 2046c43f6c8STom Warren TYPE(PERIPHC_22h, CLOCK_TYPE_NONE), 2056c43f6c8STom Warren TYPE(PERIPHC_23h, CLOCK_TYPE_NONE), 2066c43f6c8STom Warren TYPE(PERIPHC_24h, CLOCK_TYPE_NONE), 2076c43f6c8STom Warren TYPE(PERIPHC_25h, CLOCK_TYPE_NONE), 2086c43f6c8STom Warren TYPE(PERIPHC_I2C2, CLOCK_TYPE_PC2CC3M_T16), 2096c43f6c8STom Warren TYPE(PERIPHC_EMC, CLOCK_TYPE_MCPTM2C2C3), 2106c43f6c8STom Warren 2116c43f6c8STom Warren /* 0x28 */ 2126c43f6c8STom Warren TYPE(PERIPHC_UART3, CLOCK_TYPE_PC2CC3M_T), 2136c43f6c8STom Warren TYPE(PERIPHC_29h, CLOCK_TYPE_NONE), 2146c43f6c8STom Warren TYPE(PERIPHC_VI_SENSOR, CLOCK_TYPE_MC2CC3P_A), 2156c43f6c8STom Warren TYPE(PERIPHC_2bh, CLOCK_TYPE_NONE), 2166c43f6c8STom Warren TYPE(PERIPHC_2ch, CLOCK_TYPE_NONE), 2176c43f6c8STom Warren TYPE(PERIPHC_SBC4, CLOCK_TYPE_PC2CC3M_T), 2186c43f6c8STom Warren TYPE(PERIPHC_I2C3, CLOCK_TYPE_PC2CC3M_T16), 2196c43f6c8STom Warren TYPE(PERIPHC_SDMMC3, CLOCK_TYPE_PC2CC3M_T), 2206c43f6c8STom Warren 2216c43f6c8STom Warren /* 0x30 */ 2226c43f6c8STom Warren TYPE(PERIPHC_UART4, CLOCK_TYPE_PC2CC3M_T), 2236c43f6c8STom Warren TYPE(PERIPHC_UART5, CLOCK_TYPE_PC2CC3M_T), 2246c43f6c8STom Warren TYPE(PERIPHC_VDE, CLOCK_TYPE_PC2CC3M_T), 2256c43f6c8STom Warren TYPE(PERIPHC_OWR, CLOCK_TYPE_PC2CC3M_T), 2266c43f6c8STom Warren TYPE(PERIPHC_NOR, CLOCK_TYPE_PC2CC3M_T), 2276c43f6c8STom Warren TYPE(PERIPHC_CSITE, CLOCK_TYPE_PC2CC3M_T), 2286c43f6c8STom Warren TYPE(PERIPHC_I2S1, CLOCK_TYPE_AXPT), 2296c43f6c8STom Warren TYPE(PERIPHC_DTV, CLOCK_TYPE_NONE), 2306c43f6c8STom Warren 2316c43f6c8STom Warren /* 0x38 */ 2326c43f6c8STom Warren TYPE(PERIPHC_38h, CLOCK_TYPE_NONE), 2336c43f6c8STom Warren TYPE(PERIPHC_39h, CLOCK_TYPE_NONE), 2346c43f6c8STom Warren TYPE(PERIPHC_3ah, CLOCK_TYPE_NONE), 2356c43f6c8STom Warren TYPE(PERIPHC_3bh, CLOCK_TYPE_NONE), 2366c43f6c8STom Warren TYPE(PERIPHC_MSENC, CLOCK_TYPE_MC2CC3P_A), 2376c43f6c8STom Warren TYPE(PERIPHC_TSEC, CLOCK_TYPE_PC2CC3M_T), 2386c43f6c8STom Warren TYPE(PERIPHC_3eh, CLOCK_TYPE_NONE), 2396c43f6c8STom Warren TYPE(PERIPHC_OSC, CLOCK_TYPE_NONE), 2406c43f6c8STom Warren 2416c43f6c8STom Warren /* 0x40 */ 2426c43f6c8STom Warren TYPE(PERIPHC_40h, CLOCK_TYPE_NONE), /* start with 0x3b0 */ 2436c43f6c8STom Warren TYPE(PERIPHC_MSELECT, CLOCK_TYPE_PC2CC3M_T), 2446c43f6c8STom Warren TYPE(PERIPHC_TSENSOR, CLOCK_TYPE_PC2CC3T_S), 2456c43f6c8STom Warren TYPE(PERIPHC_I2S4, CLOCK_TYPE_AXPT), 2466c43f6c8STom Warren TYPE(PERIPHC_I2S5, CLOCK_TYPE_AXPT), 2476c43f6c8STom Warren TYPE(PERIPHC_I2C4, CLOCK_TYPE_PC2CC3M_T16), 2486c43f6c8STom Warren TYPE(PERIPHC_SBC5, CLOCK_TYPE_PC2CC3M_T), 2496c43f6c8STom Warren TYPE(PERIPHC_SBC6, CLOCK_TYPE_PC2CC3M_T), 2506c43f6c8STom Warren 2516c43f6c8STom Warren /* 0x48 */ 2526c43f6c8STom Warren TYPE(PERIPHC_AUDIO, CLOCK_TYPE_AC2CC3P_TS2), 2536c43f6c8STom Warren TYPE(PERIPHC_49h, CLOCK_TYPE_NONE), 2546c43f6c8STom Warren TYPE(PERIPHC_4ah, CLOCK_TYPE_NONE), 2556c43f6c8STom Warren TYPE(PERIPHC_4bh, CLOCK_TYPE_NONE), 2566c43f6c8STom Warren TYPE(PERIPHC_4ch, CLOCK_TYPE_NONE), 2576c43f6c8STom Warren TYPE(PERIPHC_HDA2CODEC2X, CLOCK_TYPE_PC2CC3M_T), 2586c43f6c8STom Warren TYPE(PERIPHC_ACTMON, CLOCK_TYPE_PC2CC3S_T), 2596c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH1, CLOCK_TYPE_ASPTE), 2606c43f6c8STom Warren 2616c43f6c8STom Warren /* 0x50 */ 2626c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH2, CLOCK_TYPE_ASPTE), 2636c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH3, CLOCK_TYPE_ASPTE), 2646c43f6c8STom Warren TYPE(PERIPHC_52h, CLOCK_TYPE_NONE), 2656c43f6c8STom Warren TYPE(PERIPHC_I2CSLOW, CLOCK_TYPE_PC2CC3S_T), 2666c43f6c8STom Warren TYPE(PERIPHC_SYS, CLOCK_TYPE_NONE), 2676c43f6c8STom Warren TYPE(PERIPHC_55h, CLOCK_TYPE_NONE), 2686c43f6c8STom Warren TYPE(PERIPHC_56h, CLOCK_TYPE_NONE), 2696c43f6c8STom Warren TYPE(PERIPHC_57h, CLOCK_TYPE_NONE), 2706c43f6c8STom Warren 2716c43f6c8STom Warren /* 0x58 */ 2726c43f6c8STom Warren TYPE(PERIPHC_58h, CLOCK_TYPE_NONE), 2736c43f6c8STom Warren TYPE(PERIPHC_59h, CLOCK_TYPE_NONE), 2746c43f6c8STom Warren TYPE(PERIPHC_5ah, CLOCK_TYPE_NONE), 2756c43f6c8STom Warren TYPE(PERIPHC_5bh, CLOCK_TYPE_NONE), 2766c43f6c8STom Warren TYPE(PERIPHC_SATAOOB, CLOCK_TYPE_PCMT), 2776c43f6c8STom Warren TYPE(PERIPHC_SATA, CLOCK_TYPE_PCMT), 2786c43f6c8STom Warren TYPE(PERIPHC_HDA, CLOCK_TYPE_PC2CC3M_T), 2796c43f6c8STom Warren TYPE(PERIPHC_5fh, CLOCK_TYPE_NONE), 2806c43f6c8STom Warren 2816c43f6c8STom Warren /* 0x60 */ 2826c43f6c8STom Warren TYPE(PERIPHC_XUSB_CORE_HOST, CLOCK_TYPE_NONE), 2836c43f6c8STom Warren TYPE(PERIPHC_XUSB_FALCON, CLOCK_TYPE_NONE), 2846c43f6c8STom Warren TYPE(PERIPHC_XUSB_FS, CLOCK_TYPE_NONE), 2856c43f6c8STom Warren TYPE(PERIPHC_XUSB_CORE_DEV, CLOCK_TYPE_NONE), 2866c43f6c8STom Warren TYPE(PERIPHC_XUSB_SS, CLOCK_TYPE_NONE), 2876c43f6c8STom Warren TYPE(PERIPHC_CILAB, CLOCK_TYPE_NONE), 2886c43f6c8STom Warren TYPE(PERIPHC_CILCD, CLOCK_TYPE_NONE), 2896c43f6c8STom Warren TYPE(PERIPHC_CILE, CLOCK_TYPE_NONE), 2906c43f6c8STom Warren 2916c43f6c8STom Warren /* 0x68 */ 2926c43f6c8STom Warren TYPE(PERIPHC_DSIA_LP, CLOCK_TYPE_NONE), 2936c43f6c8STom Warren TYPE(PERIPHC_DSIB_LP, CLOCK_TYPE_NONE), 2946c43f6c8STom Warren TYPE(PERIPHC_ENTROPY, CLOCK_TYPE_NONE), 2956c43f6c8STom Warren TYPE(PERIPHC_DVFS_REF, CLOCK_TYPE_NONE), 2966c43f6c8STom Warren TYPE(PERIPHC_DVFS_SOC, CLOCK_TYPE_NONE), 2976c43f6c8STom Warren TYPE(PERIPHC_TRACECLKIN, CLOCK_TYPE_NONE), 2986c43f6c8STom Warren TYPE(PERIPHC_6eh, CLOCK_TYPE_NONE), 2996c43f6c8STom Warren TYPE(PERIPHC_6fh, CLOCK_TYPE_NONE), 3006c43f6c8STom Warren 3016c43f6c8STom Warren /* 0x70 */ 3026c43f6c8STom Warren TYPE(PERIPHC_EMC_LATENCY, CLOCK_TYPE_NONE), 3036c43f6c8STom Warren TYPE(PERIPHC_SOC_THERM, CLOCK_TYPE_NONE), 3046c43f6c8STom Warren TYPE(PERIPHC_72h, CLOCK_TYPE_NONE), 3056c43f6c8STom Warren TYPE(PERIPHC_73h, CLOCK_TYPE_NONE), 3066c43f6c8STom Warren TYPE(PERIPHC_74h, CLOCK_TYPE_NONE), 3076c43f6c8STom Warren TYPE(PERIPHC_75h, CLOCK_TYPE_NONE), 3086c43f6c8STom Warren TYPE(PERIPHC_VI_SENSOR2, CLOCK_TYPE_NONE), 3096c43f6c8STom Warren TYPE(PERIPHC_I2C6, CLOCK_TYPE_PC2CC3M_T16), 3106c43f6c8STom Warren 3116c43f6c8STom Warren /* 0x78 */ 3126c43f6c8STom Warren TYPE(PERIPHC_78h, CLOCK_TYPE_NONE), 3136c43f6c8STom Warren TYPE(PERIPHC_EMC_DLL, CLOCK_TYPE_MCPTM2C2C3), 3146c43f6c8STom Warren TYPE(PERIPHC_7ah, CLOCK_TYPE_NONE), 3156c43f6c8STom Warren TYPE(PERIPHC_CLK72MHZ, CLOCK_TYPE_NONE), 3166c43f6c8STom Warren TYPE(PERIPHC_7ch, CLOCK_TYPE_NONE), 3176c43f6c8STom Warren TYPE(PERIPHC_7dh, CLOCK_TYPE_NONE), 3186c43f6c8STom Warren TYPE(PERIPHC_VIC, CLOCK_TYPE_NONE), 3196c43f6c8STom Warren TYPE(PERIPHC_7Fh, CLOCK_TYPE_NONE), 3206c43f6c8STom Warren 3216c43f6c8STom Warren /* 0x80 */ 3226c43f6c8STom Warren TYPE(PERIPHC_SDMMC_LEGACY_TM, CLOCK_TYPE_NONE), 3236c43f6c8STom Warren TYPE(PERIPHC_NVDEC, CLOCK_TYPE_NONE), 3246c43f6c8STom Warren TYPE(PERIPHC_NVJPG, CLOCK_TYPE_NONE), 3256c43f6c8STom Warren TYPE(PERIPHC_NVENC, CLOCK_TYPE_NONE), 3266c43f6c8STom Warren TYPE(PERIPHC_84h, CLOCK_TYPE_NONE), 3276c43f6c8STom Warren TYPE(PERIPHC_85h, CLOCK_TYPE_NONE), 3286c43f6c8STom Warren TYPE(PERIPHC_86h, CLOCK_TYPE_NONE), 3296c43f6c8STom Warren TYPE(PERIPHC_87h, CLOCK_TYPE_NONE), 3306c43f6c8STom Warren 3316c43f6c8STom Warren /* 0x88 */ 3326c43f6c8STom Warren TYPE(PERIPHC_88h, CLOCK_TYPE_NONE), 3336c43f6c8STom Warren TYPE(PERIPHC_89h, CLOCK_TYPE_NONE), 3346c43f6c8STom Warren TYPE(PERIPHC_DMIC3, CLOCK_TYPE_NONE), 3356c43f6c8STom Warren TYPE(PERIPHC_APE, CLOCK_TYPE_NONE), 3366c43f6c8STom Warren TYPE(PERIPHC_QSPI, CLOCK_TYPE_PC01C00_C42C41TC40), 3376c43f6c8STom Warren TYPE(PERIPHC_VI_I2C, CLOCK_TYPE_NONE), 3386c43f6c8STom Warren TYPE(PERIPHC_USB2_HSIC_TRK, CLOCK_TYPE_NONE), 3396c43f6c8STom Warren TYPE(PERIPHC_PEX_SATA_USB_RX_BYP, CLOCK_TYPE_NONE), 3406c43f6c8STom Warren 3416c43f6c8STom Warren /* 0x90 */ 3426c43f6c8STom Warren TYPE(PERIPHC_MAUD, CLOCK_TYPE_NONE), 3436c43f6c8STom Warren TYPE(PERIPHC_TSECB, CLOCK_TYPE_NONE), 3446c43f6c8STom Warren }; 3456c43f6c8STom Warren 3466c43f6c8STom Warren /* 3476c43f6c8STom Warren * This array translates a periph_id to a periphc_internal_id 3486c43f6c8STom Warren * 3496c43f6c8STom Warren * Not present/matched up: 3506c43f6c8STom Warren * uint vi_sensor; _VI_SENSOR_0, 0x1A8 3516c43f6c8STom Warren * SPDIF - which is both 0x08 and 0x0c 3526c43f6c8STom Warren * 3536c43f6c8STom Warren */ 3546c43f6c8STom Warren #define NONE(name) (-1) 3556c43f6c8STom Warren #define OFFSET(name, value) PERIPHC_ ## name 3566c43f6c8STom Warren #define INTERNAL_ID(id) (id & 0x000000ff) 3576c43f6c8STom Warren static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = { 3586c43f6c8STom Warren /* Low word: 31:0 */ 3596c43f6c8STom Warren NONE(CPU), 3606c43f6c8STom Warren NONE(COP), 3616c43f6c8STom Warren NONE(TRIGSYS), 3626c43f6c8STom Warren NONE(ISPB), 3636c43f6c8STom Warren NONE(RESERVED4), 3646c43f6c8STom Warren NONE(TMR), 3656c43f6c8STom Warren PERIPHC_UART1, 3666c43f6c8STom Warren PERIPHC_UART2, /* and vfir 0x68 */ 3676c43f6c8STom Warren 3686c43f6c8STom Warren /* 8 */ 3696c43f6c8STom Warren NONE(GPIO), 3706c43f6c8STom Warren PERIPHC_SDMMC2, 3716c43f6c8STom Warren PERIPHC_SPDIF_IN, 3726c43f6c8STom Warren PERIPHC_I2S2, 3736c43f6c8STom Warren PERIPHC_I2C1, 3746c43f6c8STom Warren NONE(RESERVED13), 3756c43f6c8STom Warren PERIPHC_SDMMC1, 3766c43f6c8STom Warren PERIPHC_SDMMC4, 3776c43f6c8STom Warren 3786c43f6c8STom Warren /* 16 */ 3796c43f6c8STom Warren NONE(TCW), 3806c43f6c8STom Warren PERIPHC_PWM, 3816c43f6c8STom Warren PERIPHC_I2S3, 3826c43f6c8STom Warren NONE(RESERVED19), 3836c43f6c8STom Warren PERIPHC_VI, 3846c43f6c8STom Warren NONE(RESERVED21), 3856c43f6c8STom Warren NONE(USBD), 3866c43f6c8STom Warren NONE(ISP), 3876c43f6c8STom Warren 3886c43f6c8STom Warren /* 24 */ 3896c43f6c8STom Warren NONE(RESERVED24), 3906c43f6c8STom Warren NONE(RESERVED25), 3916c43f6c8STom Warren PERIPHC_DISP2, 3926c43f6c8STom Warren PERIPHC_DISP1, 3936c43f6c8STom Warren PERIPHC_HOST1X, 3946c43f6c8STom Warren NONE(VCP), 3956c43f6c8STom Warren PERIPHC_I2S1, 3966c43f6c8STom Warren NONE(CACHE2), 3976c43f6c8STom Warren 3986c43f6c8STom Warren /* Middle word: 63:32 */ 3996c43f6c8STom Warren NONE(MEM), 4006c43f6c8STom Warren NONE(AHBDMA), 4016c43f6c8STom Warren NONE(APBDMA), 4026c43f6c8STom Warren NONE(RESERVED35), 4036c43f6c8STom Warren NONE(RESERVED36), 4046c43f6c8STom Warren NONE(STAT_MON), 4056c43f6c8STom Warren NONE(RESERVED38), 4066c43f6c8STom Warren NONE(FUSE), 4076c43f6c8STom Warren 4086c43f6c8STom Warren /* 40 */ 4096c43f6c8STom Warren NONE(KFUSE), 4106c43f6c8STom Warren PERIPHC_SBC1, /* SBCx = SPIx */ 4116c43f6c8STom Warren PERIPHC_NOR, 4126c43f6c8STom Warren NONE(RESERVED43), 4136c43f6c8STom Warren PERIPHC_SBC2, 4146c43f6c8STom Warren NONE(XIO), 4156c43f6c8STom Warren PERIPHC_SBC3, 4166c43f6c8STom Warren PERIPHC_I2C5, 4176c43f6c8STom Warren 4186c43f6c8STom Warren /* 48 */ 4196c43f6c8STom Warren NONE(DSI), 4206c43f6c8STom Warren NONE(RESERVED49), 4216c43f6c8STom Warren PERIPHC_HSI, 4226c43f6c8STom Warren NONE(RESERVED51), 4236c43f6c8STom Warren NONE(CSI), 4246c43f6c8STom Warren NONE(RESERVED53), 4256c43f6c8STom Warren PERIPHC_I2C2, 4266c43f6c8STom Warren PERIPHC_UART3, 4276c43f6c8STom Warren 4286c43f6c8STom Warren /* 56 */ 4296c43f6c8STom Warren NONE(MIPI_CAL), 4306c43f6c8STom Warren PERIPHC_EMC, 4316c43f6c8STom Warren NONE(USB2), 4326c43f6c8STom Warren NONE(USB3), 4336c43f6c8STom Warren NONE(RESERVED60), 4346c43f6c8STom Warren PERIPHC_VDE, 4356c43f6c8STom Warren NONE(BSEA), 4366c43f6c8STom Warren NONE(BSEV), 4376c43f6c8STom Warren 4386c43f6c8STom Warren /* Upper word 95:64 */ 4396c43f6c8STom Warren NONE(RESERVED64), 4406c43f6c8STom Warren PERIPHC_UART4, 4416c43f6c8STom Warren PERIPHC_UART5, 4426c43f6c8STom Warren PERIPHC_I2C3, 4436c43f6c8STom Warren PERIPHC_SBC4, 4446c43f6c8STom Warren PERIPHC_SDMMC3, 4456c43f6c8STom Warren NONE(PCIE), 4466c43f6c8STom Warren PERIPHC_OWR, 4476c43f6c8STom Warren 4486c43f6c8STom Warren /* 72 */ 4496c43f6c8STom Warren NONE(AFI), 4506c43f6c8STom Warren PERIPHC_CSITE, 4516c43f6c8STom Warren NONE(PCIEXCLK), 4526c43f6c8STom Warren NONE(AVPUCQ), 4536c43f6c8STom Warren NONE(LA), 4546c43f6c8STom Warren NONE(TRACECLKIN), 4556c43f6c8STom Warren NONE(SOC_THERM), 4566c43f6c8STom Warren NONE(DTV), 4576c43f6c8STom Warren 4586c43f6c8STom Warren /* 80 */ 4596c43f6c8STom Warren NONE(RESERVED80), 4606c43f6c8STom Warren PERIPHC_I2CSLOW, 4616c43f6c8STom Warren NONE(DSIB), 4626c43f6c8STom Warren PERIPHC_TSEC, 4636c43f6c8STom Warren NONE(RESERVED84), 4646c43f6c8STom Warren NONE(RESERVED85), 4656c43f6c8STom Warren NONE(RESERVED86), 4666c43f6c8STom Warren NONE(EMUCIF), 4676c43f6c8STom Warren 4686c43f6c8STom Warren /* 88 */ 4696c43f6c8STom Warren NONE(RESERVED88), 4706c43f6c8STom Warren NONE(XUSB_HOST), 4716c43f6c8STom Warren NONE(RESERVED90), 4726c43f6c8STom Warren PERIPHC_MSENC, 4736c43f6c8STom Warren NONE(RESERVED92), 4746c43f6c8STom Warren NONE(RESERVED93), 4756c43f6c8STom Warren NONE(RESERVED94), 4766c43f6c8STom Warren NONE(XUSB_DEV), 4776c43f6c8STom Warren 4786c43f6c8STom Warren /* V word: 31:0 */ 4796c43f6c8STom Warren NONE(CPUG), 4806c43f6c8STom Warren NONE(CPULP), 4816c43f6c8STom Warren NONE(V_RESERVED2), 4826c43f6c8STom Warren PERIPHC_MSELECT, 4836c43f6c8STom Warren NONE(V_RESERVED4), 4846c43f6c8STom Warren PERIPHC_I2S4, 4856c43f6c8STom Warren PERIPHC_I2S5, 4866c43f6c8STom Warren PERIPHC_I2C4, 4876c43f6c8STom Warren 4886c43f6c8STom Warren /* 104 */ 4896c43f6c8STom Warren PERIPHC_SBC5, 4906c43f6c8STom Warren PERIPHC_SBC6, 4916c43f6c8STom Warren PERIPHC_AUDIO, 4926c43f6c8STom Warren NONE(APBIF), 4936c43f6c8STom Warren NONE(V_RESERVED12), 4946c43f6c8STom Warren NONE(V_RESERVED13), 4956c43f6c8STom Warren NONE(V_RESERVED14), 4966c43f6c8STom Warren PERIPHC_HDA2CODEC2X, 4976c43f6c8STom Warren 4986c43f6c8STom Warren /* 112 */ 4996c43f6c8STom Warren NONE(ATOMICS), 5006c43f6c8STom Warren NONE(V_RESERVED17), 5016c43f6c8STom Warren NONE(V_RESERVED18), 5026c43f6c8STom Warren NONE(V_RESERVED19), 5036c43f6c8STom Warren NONE(V_RESERVED20), 5046c43f6c8STom Warren NONE(V_RESERVED21), 5056c43f6c8STom Warren NONE(V_RESERVED22), 5066c43f6c8STom Warren PERIPHC_ACTMON, 5076c43f6c8STom Warren 5086c43f6c8STom Warren /* 120 */ 5096c43f6c8STom Warren NONE(EXTPERIPH1), 5106c43f6c8STom Warren NONE(EXTPERIPH2), 5116c43f6c8STom Warren NONE(EXTPERIPH3), 5126c43f6c8STom Warren NONE(OOB), 5136c43f6c8STom Warren PERIPHC_SATA, 5146c43f6c8STom Warren PERIPHC_HDA, 5156c43f6c8STom Warren NONE(TZRAM), 5166c43f6c8STom Warren NONE(SE), 5176c43f6c8STom Warren 5186c43f6c8STom Warren /* W word: 31:0 */ 5196c43f6c8STom Warren NONE(HDA2HDMICODEC), 5206c43f6c8STom Warren NONE(SATACOLD), 5216c43f6c8STom Warren NONE(W_RESERVED2), 5226c43f6c8STom Warren NONE(W_RESERVED3), 5236c43f6c8STom Warren NONE(W_RESERVED4), 5246c43f6c8STom Warren NONE(W_RESERVED5), 5256c43f6c8STom Warren NONE(W_RESERVED6), 5266c43f6c8STom Warren NONE(W_RESERVED7), 5276c43f6c8STom Warren 5286c43f6c8STom Warren /* 136 */ 5296c43f6c8STom Warren NONE(CEC), 5306c43f6c8STom Warren NONE(W_RESERVED9), 5316c43f6c8STom Warren NONE(W_RESERVED10), 5326c43f6c8STom Warren NONE(W_RESERVED11), 5336c43f6c8STom Warren NONE(W_RESERVED12), 5346c43f6c8STom Warren NONE(W_RESERVED13), 5356c43f6c8STom Warren NONE(XUSB_PADCTL), 5366c43f6c8STom Warren NONE(W_RESERVED15), 5376c43f6c8STom Warren 5386c43f6c8STom Warren /* 144 */ 5396c43f6c8STom Warren NONE(W_RESERVED16), 5406c43f6c8STom Warren NONE(W_RESERVED17), 5416c43f6c8STom Warren NONE(W_RESERVED18), 5426c43f6c8STom Warren NONE(W_RESERVED19), 5436c43f6c8STom Warren NONE(W_RESERVED20), 5446c43f6c8STom Warren NONE(ENTROPY), 5456c43f6c8STom Warren NONE(DDS), 5466c43f6c8STom Warren NONE(W_RESERVED23), 5476c43f6c8STom Warren 5486c43f6c8STom Warren /* 152 */ 5496c43f6c8STom Warren NONE(W_RESERVED24), 5506c43f6c8STom Warren NONE(W_RESERVED25), 5516c43f6c8STom Warren NONE(W_RESERVED26), 5526c43f6c8STom Warren NONE(DVFS), 5536c43f6c8STom Warren NONE(XUSB_SS), 5546c43f6c8STom Warren NONE(W_RESERVED29), 5556c43f6c8STom Warren NONE(W_RESERVED30), 5566c43f6c8STom Warren NONE(W_RESERVED31), 5576c43f6c8STom Warren 5586c43f6c8STom Warren /* X word: 31:0 */ 5596c43f6c8STom Warren NONE(SPARE), 5606c43f6c8STom Warren NONE(X_RESERVED1), 5616c43f6c8STom Warren NONE(X_RESERVED2), 5626c43f6c8STom Warren NONE(X_RESERVED3), 5636c43f6c8STom Warren NONE(CAM_MCLK), 5646c43f6c8STom Warren NONE(CAM_MCLK2), 5656c43f6c8STom Warren PERIPHC_I2C6, 5666c43f6c8STom Warren NONE(X_RESERVED7), 5676c43f6c8STom Warren 5686c43f6c8STom Warren /* 168 */ 5696c43f6c8STom Warren NONE(X_RESERVED8), 5706c43f6c8STom Warren NONE(X_RESERVED9), 5716c43f6c8STom Warren NONE(X_RESERVED10), 5726c43f6c8STom Warren NONE(VIM2_CLK), 5736c43f6c8STom Warren NONE(X_RESERVED12), 5746c43f6c8STom Warren NONE(X_RESERVED13), 5756c43f6c8STom Warren NONE(EMC_DLL), 5766c43f6c8STom Warren NONE(X_RESERVED15), 5776c43f6c8STom Warren 5786c43f6c8STom Warren /* 176 */ 5796c43f6c8STom Warren NONE(X_RESERVED16), 5806c43f6c8STom Warren NONE(CLK72MHZ), 5816c43f6c8STom Warren NONE(VIC), 5826c43f6c8STom Warren NONE(X_RESERVED19), 5836c43f6c8STom Warren NONE(X_RESERVED20), 5846c43f6c8STom Warren NONE(DPAUX), 5856c43f6c8STom Warren NONE(SOR0), 5866c43f6c8STom Warren NONE(X_RESERVED23), 5876c43f6c8STom Warren 5886c43f6c8STom Warren /* 184 */ 5896c43f6c8STom Warren NONE(GPU), 5906c43f6c8STom Warren NONE(X_RESERVED25), 5916c43f6c8STom Warren NONE(X_RESERVED26), 5926c43f6c8STom Warren NONE(X_RESERVED27), 5936c43f6c8STom Warren NONE(X_RESERVED28), 5946c43f6c8STom Warren NONE(X_RESERVED29), 5956c43f6c8STom Warren NONE(X_RESERVED30), 5966c43f6c8STom Warren NONE(X_RESERVED31), 5976c43f6c8STom Warren 5986c43f6c8STom Warren /* Y: 192 (192 - 223) */ 5996c43f6c8STom Warren NONE(Y_RESERVED0), 6006c43f6c8STom Warren PERIPHC_SDMMC_LEGACY_TM, 6016c43f6c8STom Warren PERIPHC_NVDEC, 6026c43f6c8STom Warren PERIPHC_NVJPG, 6036c43f6c8STom Warren NONE(Y_RESERVED4), 6046c43f6c8STom Warren PERIPHC_DMIC3, /* 197 */ 6056c43f6c8STom Warren PERIPHC_APE, /* 198 */ 6066c43f6c8STom Warren NONE(Y_RESERVED7), 6076c43f6c8STom Warren 6086c43f6c8STom Warren /* 200 */ 6096c43f6c8STom Warren NONE(Y_RESERVED8), 6106c43f6c8STom Warren NONE(Y_RESERVED9), 6116c43f6c8STom Warren NONE(Y_RESERVED10), 6126c43f6c8STom Warren NONE(Y_RESERVED11), 6136c43f6c8STom Warren NONE(Y_RESERVED12), 6146c43f6c8STom Warren NONE(Y_RESERVED13), 6156c43f6c8STom Warren NONE(Y_RESERVED14), 6166c43f6c8STom Warren NONE(Y_RESERVED15), 6176c43f6c8STom Warren 6186c43f6c8STom Warren /* 208 */ 6196c43f6c8STom Warren PERIPHC_VI_I2C, /* 208 */ 6206c43f6c8STom Warren NONE(Y_RESERVED17), 6216c43f6c8STom Warren NONE(Y_RESERVED18), 6226c43f6c8STom Warren PERIPHC_QSPI, /* 211 */ 6236c43f6c8STom Warren NONE(Y_RESERVED20), 6246c43f6c8STom Warren NONE(Y_RESERVED21), 6256c43f6c8STom Warren NONE(Y_RESERVED22), 6266c43f6c8STom Warren NONE(Y_RESERVED23), 6276c43f6c8STom Warren 6286c43f6c8STom Warren /* 216 */ 6296c43f6c8STom Warren NONE(Y_RESERVED24), 6306c43f6c8STom Warren NONE(Y_RESERVED25), 6316c43f6c8STom Warren NONE(Y_RESERVED26), 6326c43f6c8STom Warren PERIPHC_NVENC, /* 219 */ 6336c43f6c8STom Warren NONE(Y_RESERVED28), 6346c43f6c8STom Warren NONE(Y_RESERVED29), 6356c43f6c8STom Warren NONE(Y_RESERVED30), 6366c43f6c8STom Warren NONE(Y_RESERVED31), 6376c43f6c8STom Warren }; 6386c43f6c8STom Warren 6396c43f6c8STom Warren /* 640722e000cSTom Warren * PLL divider shift/mask tables for all PLL IDs. 641722e000cSTom Warren */ 642722e000cSTom Warren struct clk_pll_info tegra_pll_info_table[CLOCK_ID_PLL_COUNT] = { 643722e000cSTom Warren /* 644722e000cSTom Warren * NOTE: If kcp_mask/kvco_mask == 0, they're not used in that PLL (PLLC, etc.) 645722e000cSTom Warren * If lock_ena or lock_det are >31, they're not used in that PLL (PLLC, etc.) 646722e000cSTom Warren */ 647722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 10, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x1F, 648722e000cSTom Warren .lock_ena = 32, .lock_det = 27, .kcp_shift = 0, .kcp_mask = 0, .kvco_shift = 0, .kvco_mask = 0 }, /* PLLC */ 649722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x1F, 650722e000cSTom Warren .lock_ena = 4, .lock_det = 27, .kcp_shift = 1, .kcp_mask = 3, .kvco_shift = 0, .kvco_mask = 1 }, /* PLLM */ 651722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 10, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x1F, 652722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 0, .kcp_mask = 3, .kvco_shift = 2, .kvco_mask = 1 }, /* PLLP */ 653722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x1F, 654722e000cSTom Warren .lock_ena = 28, .lock_det = 27, .kcp_shift = 25, .kcp_mask = 3, .kvco_shift = 24, .kvco_mask = 1 }, /* PLLA */ 655722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 16, .p_mask = 0x1F, 656722e000cSTom Warren .lock_ena = 29, .lock_det = 27, .kcp_shift = 25, .kcp_mask = 3, .kvco_shift = 24, .kvco_mask = 1 }, /* PLLU */ 657722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 11, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x07, 658722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 23, .kcp_mask = 3, .kvco_shift = 22, .kvco_mask = 1 }, /* PLLD */ 659722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x1F, 660722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 1, .kcp_mask = 3, .kvco_shift = 0, .kvco_mask = 1 }, /* PLLX */ 661722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 0, .p_mask = 0, 662722e000cSTom Warren .lock_ena = 9, .lock_det = 11, .kcp_shift = 6, .kcp_mask = 3, .kvco_shift = 0, .kvco_mask = 1 }, /* PLLE */ 663722e000cSTom Warren { .m_shift = 0, .m_mask = 0, .n_shift = 0, .n_mask = 0, .p_shift = 0, .p_mask = 0, 664722e000cSTom Warren .lock_ena = 0, .lock_det = 0, .kcp_shift = 0, .kcp_mask = 0, .kvco_shift = 0, .kvco_mask = 0 }, /* PLLS (gone)*/ 6655a30cee5SSimon Glass { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 19, .p_mask = 0x1F, 6665a30cee5SSimon Glass .lock_ena = 30, .lock_det = 27, .kcp_shift = 25, .kcp_mask = 3, .kvco_shift = 24, .kvco_mask = 1 }, /* PLLDP */ 667722e000cSTom Warren }; 668722e000cSTom Warren 669722e000cSTom Warren /* 6706c43f6c8STom Warren * Get the oscillator frequency, from the corresponding hardware configuration 6716c43f6c8STom Warren * field. Note that Tegra30+ support 3 new higher freqs, but we map back 6726c43f6c8STom Warren * to the old T20 freqs. Support for the higher oscillators is TBD. 6736c43f6c8STom Warren */ 6746c43f6c8STom Warren enum clock_osc_freq clock_get_osc_freq(void) 6756c43f6c8STom Warren { 6766c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 6776c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 6786c43f6c8STom Warren u32 reg; 6796c43f6c8STom Warren 6806c43f6c8STom Warren reg = readl(&clkrst->crc_osc_ctrl); 6816c43f6c8STom Warren reg = (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT; 6826c43f6c8STom Warren /* 6836c43f6c8STom Warren * 0 = 13MHz, 1 = 16.8MHz, 4 = 19.2MHz, 5 = 38.4MHz, 6846c43f6c8STom Warren * 8 = 12MHz, 9 = 48MHz, 12 = 26MHz 6856c43f6c8STom Warren */ 6866c43f6c8STom Warren if (reg == 5) { 6876c43f6c8STom Warren debug("OSC_FREQ is 38.4MHz (%d) ...\n", reg); 6883e8650c0STom Warren /* Map it to the 5th CLOCK_OSC_ enum, i.e. 4 */ 6893e8650c0STom Warren return 4; 6906c43f6c8STom Warren } 6916c43f6c8STom Warren 6926c43f6c8STom Warren /* 6936c43f6c8STom Warren * Map to most common (T20) freqs (except 38.4, handled above): 6946c43f6c8STom Warren * 13/16.8 = 0, 19.2 = 1, 12/48 = 2, 26 = 3 6956c43f6c8STom Warren */ 6966c43f6c8STom Warren return reg >> 2; 6976c43f6c8STom Warren } 6986c43f6c8STom Warren 6996c43f6c8STom Warren /* Returns a pointer to the clock source register for a peripheral */ 7006c43f6c8STom Warren u32 *get_periph_source_reg(enum periph_id periph_id) 7016c43f6c8STom Warren { 7026c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 7036c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 7046c43f6c8STom Warren enum periphc_internal_id internal_id; 7056c43f6c8STom Warren 7066c43f6c8STom Warren /* Coresight is a special case */ 7076c43f6c8STom Warren if (periph_id == PERIPH_ID_CSI) 7086c43f6c8STom Warren return &clkrst->crc_clk_src[PERIPH_ID_CSI+1]; 7096c43f6c8STom Warren 7106c43f6c8STom Warren assert(periph_id >= PERIPH_ID_FIRST && periph_id < PERIPH_ID_COUNT); 7116c43f6c8STom Warren internal_id = INTERNAL_ID(periph_id_to_internal_id[periph_id]); 7126c43f6c8STom Warren assert(internal_id != -1); 7136c43f6c8STom Warren 7146c43f6c8STom Warren if (internal_id < PERIPHC_VW_FIRST) 7156c43f6c8STom Warren /* L, H, U */ 7166c43f6c8STom Warren return &clkrst->crc_clk_src[internal_id]; 7176c43f6c8STom Warren 7186c43f6c8STom Warren if (internal_id < PERIPHC_X_FIRST) { 7196c43f6c8STom Warren /* VW */ 7206c43f6c8STom Warren internal_id -= PERIPHC_VW_FIRST; 7216c43f6c8STom Warren return &clkrst->crc_clk_src_vw[internal_id]; 7226c43f6c8STom Warren } 7236c43f6c8STom Warren 7246c43f6c8STom Warren if (internal_id < PERIPHC_Y_FIRST) { 7256c43f6c8STom Warren /* X */ 7266c43f6c8STom Warren internal_id -= PERIPHC_X_FIRST; 7276c43f6c8STom Warren return &clkrst->crc_clk_src_x[internal_id]; 7286c43f6c8STom Warren } 7296c43f6c8STom Warren 7306c43f6c8STom Warren /* Y */ 7316c43f6c8STom Warren internal_id -= PERIPHC_Y_FIRST; 7326c43f6c8STom Warren return &clkrst->crc_clk_src_y[internal_id]; 7336c43f6c8STom Warren } 7346c43f6c8STom Warren 735*d0ad8a5cSStephen Warren int get_periph_clock_info(enum periph_id periph_id, int *mux_bits, 736*d0ad8a5cSStephen Warren int *divider_bits, int *type) 737*d0ad8a5cSStephen Warren { 738*d0ad8a5cSStephen Warren enum periphc_internal_id internal_id; 739*d0ad8a5cSStephen Warren 740*d0ad8a5cSStephen Warren if (!clock_periph_id_isvalid(periph_id)) 741*d0ad8a5cSStephen Warren return -1; 742*d0ad8a5cSStephen Warren 743*d0ad8a5cSStephen Warren internal_id = periph_id_to_internal_id[periph_id]; 744*d0ad8a5cSStephen Warren if (!periphc_internal_id_isvalid(internal_id)) 745*d0ad8a5cSStephen Warren return -1; 746*d0ad8a5cSStephen Warren 747*d0ad8a5cSStephen Warren *type = clock_periph_type[internal_id]; 748*d0ad8a5cSStephen Warren if (!clock_type_id_isvalid(*type)) 749*d0ad8a5cSStephen Warren return -1; 750*d0ad8a5cSStephen Warren 751*d0ad8a5cSStephen Warren *mux_bits = clock_source[*type][CLOCK_MAX_MUX]; 752*d0ad8a5cSStephen Warren 753*d0ad8a5cSStephen Warren if (*type == CLOCK_TYPE_PC2CC3M_T16) 754*d0ad8a5cSStephen Warren *divider_bits = 16; 755*d0ad8a5cSStephen Warren else 756*d0ad8a5cSStephen Warren *divider_bits = 8; 757*d0ad8a5cSStephen Warren 758*d0ad8a5cSStephen Warren return 0; 759*d0ad8a5cSStephen Warren } 760*d0ad8a5cSStephen Warren 761*d0ad8a5cSStephen Warren enum clock_id get_periph_clock_id(enum periph_id periph_id, int source) 762*d0ad8a5cSStephen Warren { 763*d0ad8a5cSStephen Warren enum periphc_internal_id internal_id; 764*d0ad8a5cSStephen Warren int type; 765*d0ad8a5cSStephen Warren 766*d0ad8a5cSStephen Warren if (!clock_periph_id_isvalid(periph_id)) 767*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 768*d0ad8a5cSStephen Warren 769*d0ad8a5cSStephen Warren internal_id = periph_id_to_internal_id[periph_id]; 770*d0ad8a5cSStephen Warren if (!periphc_internal_id_isvalid(internal_id)) 771*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 772*d0ad8a5cSStephen Warren 773*d0ad8a5cSStephen Warren type = clock_periph_type[internal_id]; 774*d0ad8a5cSStephen Warren if (!clock_type_id_isvalid(type)) 775*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 776*d0ad8a5cSStephen Warren 777*d0ad8a5cSStephen Warren return clock_source[type][source]; 778*d0ad8a5cSStephen Warren } 779*d0ad8a5cSStephen Warren 7806c43f6c8STom Warren /** 7816c43f6c8STom Warren * Given a peripheral ID and the required source clock, this returns which 7826c43f6c8STom Warren * value should be programmed into the source mux for that peripheral. 7836c43f6c8STom Warren * 7846c43f6c8STom Warren * There is special code here to handle the one source type with 5 sources. 7856c43f6c8STom Warren * 7866c43f6c8STom Warren * @param periph_id peripheral to start 7876c43f6c8STom Warren * @param source PLL id of required parent clock 7886c43f6c8STom Warren * @param mux_bits Set to number of bits in mux register: 2 or 4 7896c43f6c8STom Warren * @param divider_bits Set to number of divider bits (8 or 16) 7906c43f6c8STom Warren * @return mux value (0-4, or -1 if not found) 7916c43f6c8STom Warren */ 7926c43f6c8STom Warren int get_periph_clock_source(enum periph_id periph_id, 7936c43f6c8STom Warren enum clock_id parent, int *mux_bits, int *divider_bits) 7946c43f6c8STom Warren { 7956c43f6c8STom Warren enum clock_type_id type; 796*d0ad8a5cSStephen Warren int mux, err; 7976c43f6c8STom Warren 798*d0ad8a5cSStephen Warren err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type); 799*d0ad8a5cSStephen Warren assert(!err); 8006c43f6c8STom Warren 8016c43f6c8STom Warren for (mux = 0; mux < CLOCK_MAX_MUX; mux++) 8026c43f6c8STom Warren if (clock_source[type][mux] == parent) 8036c43f6c8STom Warren return mux; 8046c43f6c8STom Warren 8056c43f6c8STom Warren /* if we get here, either us or the caller has made a mistake */ 8066c43f6c8STom Warren printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, 8076c43f6c8STom Warren parent); 8086c43f6c8STom Warren return -1; 8096c43f6c8STom Warren } 8106c43f6c8STom Warren 8116c43f6c8STom Warren void clock_set_enable(enum periph_id periph_id, int enable) 8126c43f6c8STom Warren { 8136c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 8146c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 8156c43f6c8STom Warren u32 *clk; 8166c43f6c8STom Warren u32 reg; 8176c43f6c8STom Warren 8186c43f6c8STom Warren /* Enable/disable the clock to this peripheral */ 8196c43f6c8STom Warren assert(clock_periph_id_isvalid(periph_id)); 8206c43f6c8STom Warren if ((int)periph_id < (int)PERIPH_ID_VW_FIRST) 8216c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb[PERIPH_REG(periph_id)]; 8226c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_X_FIRST) 8236c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_vw[PERIPH_REG(periph_id)]; 8246c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_Y_FIRST) 8256c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_x; 8266c43f6c8STom Warren else 8276c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_y; 8286c43f6c8STom Warren 8296c43f6c8STom Warren reg = readl(clk); 8306c43f6c8STom Warren if (enable) 8316c43f6c8STom Warren reg |= PERIPH_MASK(periph_id); 8326c43f6c8STom Warren else 8336c43f6c8STom Warren reg &= ~PERIPH_MASK(periph_id); 8346c43f6c8STom Warren writel(reg, clk); 8356c43f6c8STom Warren } 8366c43f6c8STom Warren 8376c43f6c8STom Warren void reset_set_enable(enum periph_id periph_id, int enable) 8386c43f6c8STom Warren { 8396c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 8406c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 8416c43f6c8STom Warren u32 *reset; 8426c43f6c8STom Warren u32 reg; 8436c43f6c8STom Warren 8446c43f6c8STom Warren /* Enable/disable reset to the peripheral */ 8456c43f6c8STom Warren assert(clock_periph_id_isvalid(periph_id)); 8466c43f6c8STom Warren if (periph_id < PERIPH_ID_VW_FIRST) 8476c43f6c8STom Warren reset = &clkrst->crc_rst_dev[PERIPH_REG(periph_id)]; 8486c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_X_FIRST) 8496c43f6c8STom Warren reset = &clkrst->crc_rst_dev_vw[PERIPH_REG(periph_id)]; 8506c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_Y_FIRST) 8516c43f6c8STom Warren reset = &clkrst->crc_rst_devices_x; 8526c43f6c8STom Warren else 8536c43f6c8STom Warren reset = &clkrst->crc_rst_devices_y; 8546c43f6c8STom Warren 8556c43f6c8STom Warren reg = readl(reset); 8566c43f6c8STom Warren if (enable) 8576c43f6c8STom Warren reg |= PERIPH_MASK(periph_id); 8586c43f6c8STom Warren else 8596c43f6c8STom Warren reg &= ~PERIPH_MASK(periph_id); 8606c43f6c8STom Warren writel(reg, reset); 8616c43f6c8STom Warren } 8626c43f6c8STom Warren 8636c43f6c8STom Warren #ifdef CONFIG_OF_CONTROL 8646c43f6c8STom Warren /* 8656c43f6c8STom Warren * Convert a device tree clock ID to our peripheral ID. They are mostly 8666c43f6c8STom Warren * the same but we are very cautious so we check that a valid clock ID is 8676c43f6c8STom Warren * provided. 8686c43f6c8STom Warren * 8696c43f6c8STom Warren * @param clk_id Clock ID according to tegra210 device tree binding 8706c43f6c8STom Warren * @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid 8716c43f6c8STom Warren */ 8726c43f6c8STom Warren enum periph_id clk_id_to_periph_id(int clk_id) 8736c43f6c8STom Warren { 8746c43f6c8STom Warren if (clk_id > PERIPH_ID_COUNT) 8756c43f6c8STom Warren return PERIPH_ID_NONE; 8766c43f6c8STom Warren 8776c43f6c8STom Warren switch (clk_id) { 8786c43f6c8STom Warren case PERIPH_ID_RESERVED4: 8796c43f6c8STom Warren case PERIPH_ID_RESERVED25: 8806c43f6c8STom Warren case PERIPH_ID_RESERVED35: 8816c43f6c8STom Warren case PERIPH_ID_RESERVED36: 8826c43f6c8STom Warren case PERIPH_ID_RESERVED38: 8836c43f6c8STom Warren case PERIPH_ID_RESERVED43: 8846c43f6c8STom Warren case PERIPH_ID_RESERVED49: 8856c43f6c8STom Warren case PERIPH_ID_RESERVED53: 8866c43f6c8STom Warren case PERIPH_ID_RESERVED64: 8876c43f6c8STom Warren case PERIPH_ID_RESERVED84: 8886c43f6c8STom Warren case PERIPH_ID_RESERVED85: 8896c43f6c8STom Warren case PERIPH_ID_RESERVED86: 8906c43f6c8STom Warren case PERIPH_ID_RESERVED88: 8916c43f6c8STom Warren case PERIPH_ID_RESERVED90: 8926c43f6c8STom Warren case PERIPH_ID_RESERVED92: 8936c43f6c8STom Warren case PERIPH_ID_RESERVED93: 8946c43f6c8STom Warren case PERIPH_ID_RESERVED94: 8956c43f6c8STom Warren case PERIPH_ID_V_RESERVED2: 8966c43f6c8STom Warren case PERIPH_ID_V_RESERVED4: 8976c43f6c8STom Warren case PERIPH_ID_V_RESERVED17: 8986c43f6c8STom Warren case PERIPH_ID_V_RESERVED18: 8996c43f6c8STom Warren case PERIPH_ID_V_RESERVED19: 9006c43f6c8STom Warren case PERIPH_ID_V_RESERVED20: 9016c43f6c8STom Warren case PERIPH_ID_V_RESERVED21: 9026c43f6c8STom Warren case PERIPH_ID_V_RESERVED22: 9036c43f6c8STom Warren case PERIPH_ID_W_RESERVED2: 9046c43f6c8STom Warren case PERIPH_ID_W_RESERVED3: 9056c43f6c8STom Warren case PERIPH_ID_W_RESERVED4: 9066c43f6c8STom Warren case PERIPH_ID_W_RESERVED5: 9076c43f6c8STom Warren case PERIPH_ID_W_RESERVED6: 9086c43f6c8STom Warren case PERIPH_ID_W_RESERVED7: 9096c43f6c8STom Warren case PERIPH_ID_W_RESERVED9: 9106c43f6c8STom Warren case PERIPH_ID_W_RESERVED10: 9116c43f6c8STom Warren case PERIPH_ID_W_RESERVED11: 9126c43f6c8STom Warren case PERIPH_ID_W_RESERVED12: 9136c43f6c8STom Warren case PERIPH_ID_W_RESERVED13: 9146c43f6c8STom Warren case PERIPH_ID_W_RESERVED15: 9156c43f6c8STom Warren case PERIPH_ID_W_RESERVED16: 9166c43f6c8STom Warren case PERIPH_ID_W_RESERVED17: 9176c43f6c8STom Warren case PERIPH_ID_W_RESERVED18: 9186c43f6c8STom Warren case PERIPH_ID_W_RESERVED19: 9196c43f6c8STom Warren case PERIPH_ID_W_RESERVED20: 9206c43f6c8STom Warren case PERIPH_ID_W_RESERVED23: 9216c43f6c8STom Warren case PERIPH_ID_W_RESERVED29: 9226c43f6c8STom Warren case PERIPH_ID_W_RESERVED30: 9236c43f6c8STom Warren case PERIPH_ID_W_RESERVED31: 9246c43f6c8STom Warren return PERIPH_ID_NONE; 9256c43f6c8STom Warren default: 9266c43f6c8STom Warren return clk_id; 9276c43f6c8STom Warren } 9286c43f6c8STom Warren } 9296c43f6c8STom Warren #endif /* CONFIG_OF_CONTROL */ 9306c43f6c8STom Warren 9316c43f6c8STom Warren /* 9326c43f6c8STom Warren * T210 redefines PLLP_OUT2 as PLLP_VCO/DIVP, so do different OUT1-4 setup here. 9336c43f6c8STom Warren * PLLP_BASE/MISC/etc. is already set up for 408MHz in the BootROM. 9346c43f6c8STom Warren */ 9356c43f6c8STom Warren void tegra210_setup_pllp(void) 9366c43f6c8STom Warren { 9376c43f6c8STom Warren struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 9386c43f6c8STom Warren u32 reg; 9396c43f6c8STom Warren 9406c43f6c8STom Warren /* Set PLLP_OUT1, 3 & 4 freqs to 9.6, 102 & 204MHz */ 9416c43f6c8STom Warren 9426c43f6c8STom Warren /* OUT1 */ 9436c43f6c8STom Warren /* Assert RSTN before enable */ 9446c43f6c8STom Warren reg = PLLP_OUT1_RSTN_EN; 9456c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[0]); 9466c43f6c8STom Warren /* Set divisor and reenable */ 9476c43f6c8STom Warren reg = (IN_408_OUT_9_6_DIVISOR << PLLP_OUT1_RATIO) 9486c43f6c8STom Warren | PLLP_OUT1_OVR | PLLP_OUT1_CLKEN | PLLP_OUT1_RSTN_DIS; 9496c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[0]); 9506c43f6c8STom Warren 9516c43f6c8STom Warren /* OUT3, 4 */ 9526c43f6c8STom Warren /* Assert RSTN before enable */ 9536c43f6c8STom Warren reg = PLLP_OUT4_RSTN_EN | PLLP_OUT3_RSTN_EN; 9546c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[1]); 9556c43f6c8STom Warren /* Set divisor and reenable */ 9566c43f6c8STom Warren reg = (IN_408_OUT_204_DIVISOR << PLLP_OUT4_RATIO) 9576c43f6c8STom Warren | PLLP_OUT4_OVR | PLLP_OUT4_CLKEN | PLLP_OUT4_RSTN_DIS 9586c43f6c8STom Warren | (IN_408_OUT_102_DIVISOR << PLLP_OUT3_RATIO) 9596c43f6c8STom Warren | PLLP_OUT3_OVR | PLLP_OUT3_CLKEN | PLLP_OUT3_RSTN_DIS; 9606c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[1]); 9616c43f6c8STom Warren 9626c43f6c8STom Warren /* 9636c43f6c8STom Warren * NOTE: If you want to change PLLP_OUT2 away from 204MHz, 9646c43f6c8STom Warren * you can change PLLP_BASE DIVP here. Currently defaults 9656c43f6c8STom Warren * to 1, which is 2^1, or 2, so PLLP_OUT2 is 204MHz. 9666c43f6c8STom Warren * See Table 13 in section 5.1.4 in T210 TRM for more info. 9676c43f6c8STom Warren */ 9686c43f6c8STom Warren } 9696c43f6c8STom Warren 9706c43f6c8STom Warren void clock_early_init(void) 9716c43f6c8STom Warren { 9726c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 9736c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 974722e000cSTom Warren struct clk_pll_info *pllinfo = &tegra_pll_info_table[CLOCK_ID_DISPLAY]; 9756c43f6c8STom Warren u32 data; 9766c43f6c8STom Warren 9776c43f6c8STom Warren tegra210_setup_pllp(); 9786c43f6c8STom Warren 9796c43f6c8STom Warren /* 9806c43f6c8STom Warren * PLLC output frequency set to 600Mhz 9816c43f6c8STom Warren * PLLD output frequency set to 925Mhz 9826c43f6c8STom Warren */ 9836c43f6c8STom Warren switch (clock_get_osc_freq()) { 9846c43f6c8STom Warren case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */ 9856c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 12, 0, 8); 9866c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 12, 0, 12); 9876c43f6c8STom Warren break; 9886c43f6c8STom Warren 9896c43f6c8STom Warren case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */ 9906c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8); 9916c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 26, 0, 12); 9926c43f6c8STom Warren break; 9936c43f6c8STom Warren 9946c43f6c8STom Warren case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */ 9956c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8); 9966c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 13, 0, 12); 9976c43f6c8STom Warren break; 9986c43f6c8STom Warren case CLOCK_OSC_FREQ_19_2: 9996c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 125, 4, 0, 0); 10006c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 96, 2, 0, 12); 10016c43f6c8STom Warren break; 10023e8650c0STom Warren case CLOCK_OSC_FREQ_38_4: 10033e8650c0STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 125, 8, 0, 0); 10043e8650c0STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 96, 4, 0, 0); 10053e8650c0STom Warren break; 10066c43f6c8STom Warren default: 10076c43f6c8STom Warren /* 10086c43f6c8STom Warren * These are not supported. It is too early to print a 10096c43f6c8STom Warren * message and the UART likely won't work anyway due to the 10106c43f6c8STom Warren * oscillator being wrong. 10116c43f6c8STom Warren */ 10126c43f6c8STom Warren break; 10136c43f6c8STom Warren } 10146c43f6c8STom Warren 10156c43f6c8STom Warren /* PLLC_MISC1: Turn IDDQ off. NOTE: T210 PLLC_MISC_1 maps to pll_misc */ 10166c43f6c8STom Warren clrbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_misc, 10176c43f6c8STom Warren (1 << PLLC_IDDQ)); 10186c43f6c8STom Warren udelay(2); 10196c43f6c8STom Warren 10206c43f6c8STom Warren /* 10216c43f6c8STom Warren * PLLC_MISC: Take PLLC out of reset. NOTE: T210 PLLC_MISC maps 10226c43f6c8STom Warren * to pll_out[1] 10236c43f6c8STom Warren */ 10246c43f6c8STom Warren clrbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_out[1], 10256c43f6c8STom Warren (1 << PLLC_RESET)); 10266c43f6c8STom Warren udelay(2); 10276c43f6c8STom Warren 10286c43f6c8STom Warren /* PLLD_MISC: Set CLKENABLE and LOCK_DETECT bits */ 1029722e000cSTom Warren data = (1 << PLLD_ENABLE_CLK) | (1 << pllinfo->lock_ena); 10306c43f6c8STom Warren writel(data, &clkrst->crc_pll[CLOCK_ID_DISPLAY].pll_misc); 10316c43f6c8STom Warren udelay(2); 10326c43f6c8STom Warren } 10336c43f6c8STom Warren 1034c043c025SThierry Reding unsigned int clk_m_get_rate(unsigned parent_rate) 1035c043c025SThierry Reding { 1036c043c025SThierry Reding struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 1037c043c025SThierry Reding u32 value, div; 1038c043c025SThierry Reding 1039c043c025SThierry Reding value = readl(&clkrst->crc_spare_reg0); 1040c043c025SThierry Reding div = ((value >> 2) & 0x3) + 1; 1041c043c025SThierry Reding 1042c043c025SThierry Reding return parent_rate / div; 1043c043c025SThierry Reding } 1044c043c025SThierry Reding 10456c43f6c8STom Warren void arch_timer_init(void) 10466c43f6c8STom Warren { 10476c43f6c8STom Warren struct sysctr_ctlr *sysctr = (struct sysctr_ctlr *)NV_PA_TSC_BASE; 10486c43f6c8STom Warren u32 freq, val; 10496c43f6c8STom Warren 105097c02d87SThierry Reding freq = clock_get_rate(CLOCK_ID_CLK_M); 105197c02d87SThierry Reding debug("%s: clk_m freq is %dHz [0x%08X]\n", __func__, freq, freq); 10526c43f6c8STom Warren 105397c02d87SThierry Reding if (current_el() == 3) 105497c02d87SThierry Reding asm("msr cntfrq_el0, %0\n" : : "r" (freq)); 10556c43f6c8STom Warren 10566c43f6c8STom Warren /* Only Tegra114+ has the System Counter regs */ 10576c43f6c8STom Warren debug("%s: setting CNTFID0 to 0x%08X\n", __func__, freq); 10586c43f6c8STom Warren writel(freq, &sysctr->cntfid0); 10596c43f6c8STom Warren 10606c43f6c8STom Warren val = readl(&sysctr->cntcr); 10616c43f6c8STom Warren val |= TSC_CNTCR_ENABLE | TSC_CNTCR_HDBG; 10626c43f6c8STom Warren writel(val, &sysctr->cntcr); 10636c43f6c8STom Warren debug("%s: TSC CNTCR = 0x%08X\n", __func__, val); 10646c43f6c8STom Warren } 10656c43f6c8STom Warren 1066dfa551e4SStephen Warren #define PLLREFE_MISC 0x4c8 1067dfa551e4SStephen Warren #define PLLREFE_MISC_LOCK BIT(27) 1068dfa551e4SStephen Warren #define PLLREFE_MISC_IDDQ BIT(24) 1069dfa551e4SStephen Warren 1070dfa551e4SStephen Warren #define PLLREFE_BASE 0x4c4 1071dfa551e4SStephen Warren #define PLLREFE_BASE_BYPASS BIT(31) 1072dfa551e4SStephen Warren #define PLLREFE_BASE_ENABLE BIT(30) 1073dfa551e4SStephen Warren #define PLLREFE_BASE_REF_DIS BIT(29) 1074dfa551e4SStephen Warren #define PLLREFE_BASE_KCP(kcp) (((kcp) & 0x3) << 27) 1075dfa551e4SStephen Warren #define PLLREFE_BASE_KVCO BIT(26) 1076dfa551e4SStephen Warren #define PLLREFE_BASE_DIVP(p) (((p) & 0x1f) << 16) 1077dfa551e4SStephen Warren #define PLLREFE_BASE_DIVN(n) (((n) & 0xff) << 8) 1078dfa551e4SStephen Warren #define PLLREFE_BASE_DIVM(m) (((m) & 0xff) << 0) 1079dfa551e4SStephen Warren 1080dfa551e4SStephen Warren static int tegra_pllref_enable(void) 1081dfa551e4SStephen Warren { 1082dfa551e4SStephen Warren u32 value; 1083dfa551e4SStephen Warren unsigned long start; 1084dfa551e4SStephen Warren 1085dfa551e4SStephen Warren /* 1086dfa551e4SStephen Warren * This sequence comes from Tegra X1 TRM section "Cold Boot, with no 1087dfa551e4SStephen Warren * Recovery Mode or Boot from USB", sub-section "PLLREFE". 1088dfa551e4SStephen Warren */ 1089dfa551e4SStephen Warren 1090dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLREFE_MISC); 1091dfa551e4SStephen Warren value &= ~PLLREFE_MISC_IDDQ; 1092dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLREFE_MISC); 1093dfa551e4SStephen Warren 1094dfa551e4SStephen Warren udelay(5); 1095dfa551e4SStephen Warren 1096dfa551e4SStephen Warren value = PLLREFE_BASE_ENABLE | 1097dfa551e4SStephen Warren PLLREFE_BASE_KCP(0) | 1098dfa551e4SStephen Warren PLLREFE_BASE_DIVP(0) | 1099dfa551e4SStephen Warren PLLREFE_BASE_DIVN(0x41) | 1100dfa551e4SStephen Warren PLLREFE_BASE_DIVM(4); 1101dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLREFE_BASE); 1102dfa551e4SStephen Warren 1103dfa551e4SStephen Warren debug("waiting for pllrefe lock\n"); 1104dfa551e4SStephen Warren start = get_timer(0); 1105dfa551e4SStephen Warren while (get_timer(start) < 250) { 1106dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLREFE_MISC); 1107dfa551e4SStephen Warren if (value & PLLREFE_MISC_LOCK) 1108dfa551e4SStephen Warren break; 1109dfa551e4SStephen Warren } 1110dfa551e4SStephen Warren if (!(value & PLLREFE_MISC_LOCK)) { 1111dfa551e4SStephen Warren debug(" timeout\n"); 1112dfa551e4SStephen Warren return -ETIMEDOUT; 1113dfa551e4SStephen Warren } 1114dfa551e4SStephen Warren debug(" done\n"); 1115dfa551e4SStephen Warren 1116dfa551e4SStephen Warren return 0; 1117dfa551e4SStephen Warren } 1118dfa551e4SStephen Warren 11196c43f6c8STom Warren #define PLLE_SS_CNTL 0x68 11206c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINCINTR(x) (((x) & 0x3f) << 24) 11216c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINC(x) (((x) & 0xff) << 16) 11226c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINVERT (1 << 15) 11236c43f6c8STom Warren #define PLLE_SS_CNTL_SSCCENTER (1 << 14) 11246c43f6c8STom Warren #define PLLE_SS_CNTL_SSCBYP (1 << 12) 11256c43f6c8STom Warren #define PLLE_SS_CNTL_INTERP_RESET (1 << 11) 11266c43f6c8STom Warren #define PLLE_SS_CNTL_BYPASS_SS (1 << 10) 11276c43f6c8STom Warren #define PLLE_SS_CNTL_SSCMAX(x) (((x) & 0x1ff) << 0) 11286c43f6c8STom Warren 11296c43f6c8STom Warren #define PLLE_BASE 0x0e8 1130dfa551e4SStephen Warren #define PLLE_BASE_ENABLE (1 << 31) 1131dfa551e4SStephen Warren #define PLLE_BASE_PLDIV_CML(x) (((x) & 0x1f) << 24) 11326c43f6c8STom Warren #define PLLE_BASE_NDIV(x) (((x) & 0xff) << 8) 11336c43f6c8STom Warren #define PLLE_BASE_MDIV(x) (((x) & 0xff) << 0) 11346c43f6c8STom Warren 11356c43f6c8STom Warren #define PLLE_MISC 0x0ec 11366c43f6c8STom Warren #define PLLE_MISC_IDDQ_SWCTL (1 << 14) 1137dfa551e4SStephen Warren #define PLLE_MISC_IDDQ_OVERRIDE_VALUE (1 << 13) 1138dfa551e4SStephen Warren #define PLLE_MISC_LOCK (1 << 11) 11398f83759fSStephen Warren #define PLLE_PTS (1 << 8) 1140dfa551e4SStephen Warren #define PLLE_MISC_KCP(x) (((x) & 0x3) << 6) 11416c43f6c8STom Warren #define PLLE_MISC_VREG_CTRL(x) (((x) & 0x3) << 2) 1142dfa551e4SStephen Warren #define PLLE_MISC_KVCO (1 << 0) 11436c43f6c8STom Warren 11446c43f6c8STom Warren #define PLLE_AUX 0x48c 1145dfa551e4SStephen Warren #define PLLE_AUX_SS_SEQ_INCLUDE (1 << 31) 1146dfa551e4SStephen Warren #define PLLE_AUX_REF_SEL_PLLREFE (1 << 28) 11476c43f6c8STom Warren #define PLLE_AUX_SEQ_ENABLE (1 << 24) 1148dfa551e4SStephen Warren #define PLLE_AUX_SS_SWCTL (1 << 6) 11496c43f6c8STom Warren #define PLLE_AUX_ENABLE_SWCTL (1 << 4) 1150dfa551e4SStephen Warren #define PLLE_AUX_USE_LOCKDET (1 << 3) 11516c43f6c8STom Warren 11526c43f6c8STom Warren int tegra_plle_enable(void) 11536c43f6c8STom Warren { 11546c43f6c8STom Warren u32 value; 1155dfa551e4SStephen Warren unsigned long start; 11566c43f6c8STom Warren 1157dfa551e4SStephen Warren /* PLLREF feeds PLLE */ 1158dfa551e4SStephen Warren tegra_pllref_enable(); 1159dfa551e4SStephen Warren 1160dfa551e4SStephen Warren /* 1161dfa551e4SStephen Warren * This sequence comes from Tegra X1 TRM section "Cold Boot, with no 1162dfa551e4SStephen Warren * Recovery Mode or Boot from USB", sub-section "PLLEs". 1163dfa551e4SStephen Warren */ 1164dfa551e4SStephen Warren 1165dfa551e4SStephen Warren /* 1. Select XTAL as the source */ 11666c43f6c8STom Warren 11676c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_AUX); 1168dfa551e4SStephen Warren value &= ~PLLE_AUX_REF_SEL_PLLREFE; 11696c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX); 11706c43f6c8STom Warren 11716c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC); 1172dfa551e4SStephen Warren value &= ~PLLE_MISC_IDDQ_OVERRIDE_VALUE; 11736c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_MISC); 11746c43f6c8STom Warren 1175dfa551e4SStephen Warren /* 2. Wait 5 us */ 11766c43f6c8STom Warren udelay(5); 11776c43f6c8STom Warren 1178dfa551e4SStephen Warren /* 1179dfa551e4SStephen Warren * 3. Program the following registers to generate a low jitter 100MHz 1180dfa551e4SStephen Warren * clock. 1181dfa551e4SStephen Warren */ 11826c43f6c8STom Warren 11836c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_BASE); 1184dfa551e4SStephen Warren value &= ~PLLE_BASE_PLDIV_CML(0x1f); 11856c43f6c8STom Warren value &= ~PLLE_BASE_NDIV(0xff); 11866c43f6c8STom Warren value &= ~PLLE_BASE_MDIV(0xff); 1187dfa551e4SStephen Warren value |= PLLE_BASE_PLDIV_CML(0xe); 1188dfa551e4SStephen Warren value |= PLLE_BASE_NDIV(0x7d); 1189dfa551e4SStephen Warren value |= PLLE_BASE_MDIV(2); 11906c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_BASE); 11916c43f6c8STom Warren 1192dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC); 11938f83759fSStephen Warren value |= PLLE_PTS; 1194dfa551e4SStephen Warren value &= ~PLLE_MISC_KCP(3); 1195dfa551e4SStephen Warren value &= ~PLLE_MISC_VREG_CTRL(3); 1196dfa551e4SStephen Warren value &= ~PLLE_MISC_KVCO; 1197dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_MISC); 11986c43f6c8STom Warren 11996c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_BASE); 12006c43f6c8STom Warren value |= PLLE_BASE_ENABLE; 12016c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_BASE); 12026c43f6c8STom Warren 1203dfa551e4SStephen Warren /* 4. Wait for LOCK */ 1204dfa551e4SStephen Warren 1205dfa551e4SStephen Warren debug("waiting for plle lock\n"); 1206dfa551e4SStephen Warren start = get_timer(0); 1207dfa551e4SStephen Warren while (get_timer(start) < 250) { 1208dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC); 1209dfa551e4SStephen Warren if (value & PLLE_MISC_LOCK) 1210dfa551e4SStephen Warren break; 1211dfa551e4SStephen Warren } 1212dfa551e4SStephen Warren if (!(value & PLLE_MISC_LOCK)) { 1213dfa551e4SStephen Warren debug(" timeout\n"); 1214dfa551e4SStephen Warren return -ETIMEDOUT; 1215dfa551e4SStephen Warren } 1216dfa551e4SStephen Warren debug(" done\n"); 1217dfa551e4SStephen Warren 1218dfa551e4SStephen Warren /* 5. Enable SSA */ 12196c43f6c8STom Warren 12206c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1221dfa551e4SStephen Warren value &= ~PLLE_SS_CNTL_SSCINC(0xff); 1222dfa551e4SStephen Warren value |= PLLE_SS_CNTL_SSCINC(1); 1223dfa551e4SStephen Warren value &= ~PLLE_SS_CNTL_SSCINCINTR(0x3f); 1224dfa551e4SStephen Warren value |= PLLE_SS_CNTL_SSCINCINTR(0x23); 1225dfa551e4SStephen Warren value &= ~PLLE_SS_CNTL_SSCMAX(0x1fff); 1226dfa551e4SStephen Warren value |= PLLE_SS_CNTL_SSCMAX(0x21); 12276c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCINVERT; 12286c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCCENTER; 12296c43f6c8STom Warren value &= ~PLLE_SS_CNTL_BYPASS_SS; 1230dfa551e4SStephen Warren value &= ~PLLE_SS_CNTL_SSCBYP; 12316c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 12326c43f6c8STom Warren 1233dfa551e4SStephen Warren /* 6. Wait 300 ns */ 1234dfa551e4SStephen Warren 12356c43f6c8STom Warren udelay(1); 12366c43f6c8STom Warren value &= ~PLLE_SS_CNTL_INTERP_RESET; 12376c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 12386c43f6c8STom Warren 1239dfa551e4SStephen Warren /* 7. Enable HW power sequencer for PLLE */ 1240dfa551e4SStephen Warren 1241dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC); 1242dfa551e4SStephen Warren value &= ~PLLE_MISC_IDDQ_SWCTL; 1243dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_MISC); 1244dfa551e4SStephen Warren 1245dfa551e4SStephen Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_AUX); 1246dfa551e4SStephen Warren value &= ~PLLE_AUX_SS_SWCTL; 1247dfa551e4SStephen Warren value &= ~PLLE_AUX_ENABLE_SWCTL; 1248dfa551e4SStephen Warren value |= PLLE_AUX_SS_SEQ_INCLUDE; 1249dfa551e4SStephen Warren value |= PLLE_AUX_USE_LOCKDET; 1250dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX); 1251dfa551e4SStephen Warren 1252dfa551e4SStephen Warren /* 8. Wait 1 us */ 1253dfa551e4SStephen Warren 12546c43f6c8STom Warren udelay(1); 1255dfa551e4SStephen Warren value |= PLLE_AUX_SEQ_ENABLE; 1256dfa551e4SStephen Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX); 12576c43f6c8STom Warren 12586c43f6c8STom Warren return 0; 12596c43f6c8STom Warren } 12606dbcc962SStephen Warren 12616dbcc962SStephen Warren struct periph_clk_init periph_clk_init_table[] = { 12626dbcc962SStephen Warren { PERIPH_ID_SBC1, CLOCK_ID_PERIPH }, 12636dbcc962SStephen Warren { PERIPH_ID_SBC2, CLOCK_ID_PERIPH }, 12646dbcc962SStephen Warren { PERIPH_ID_SBC3, CLOCK_ID_PERIPH }, 12656dbcc962SStephen Warren { PERIPH_ID_SBC4, CLOCK_ID_PERIPH }, 12666dbcc962SStephen Warren { PERIPH_ID_SBC5, CLOCK_ID_PERIPH }, 12676dbcc962SStephen Warren { PERIPH_ID_SBC6, CLOCK_ID_PERIPH }, 12686dbcc962SStephen Warren { PERIPH_ID_HOST1X, CLOCK_ID_PERIPH }, 12696dbcc962SStephen Warren { PERIPH_ID_DISP1, CLOCK_ID_CGENERAL }, 12706dbcc962SStephen Warren { PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH }, 12716dbcc962SStephen Warren { PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH }, 12726dbcc962SStephen Warren { PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH }, 12736dbcc962SStephen Warren { PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH }, 12746dbcc962SStephen Warren { PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ }, 12756dbcc962SStephen Warren { PERIPH_ID_I2C1, CLOCK_ID_PERIPH }, 12766dbcc962SStephen Warren { PERIPH_ID_I2C2, CLOCK_ID_PERIPH }, 12776dbcc962SStephen Warren { PERIPH_ID_I2C3, CLOCK_ID_PERIPH }, 12786dbcc962SStephen Warren { PERIPH_ID_I2C4, CLOCK_ID_PERIPH }, 12796dbcc962SStephen Warren { PERIPH_ID_I2C5, CLOCK_ID_PERIPH }, 12806dbcc962SStephen Warren { PERIPH_ID_I2C6, CLOCK_ID_PERIPH }, 12816dbcc962SStephen Warren { -1, }, 12826dbcc962SStephen Warren }; 1283