1*6c43f6c8STom Warren /* 2*6c43f6c8STom Warren * (C) Copyright 2013-2015 3*6c43f6c8STom Warren * NVIDIA Corporation <www.nvidia.com> 4*6c43f6c8STom Warren * 5*6c43f6c8STom Warren * SPDX-License-Identifier: GPL-2.0+ 6*6c43f6c8STom Warren */ 7*6c43f6c8STom Warren 8*6c43f6c8STom Warren /* Tegra210 Clock control functions */ 9*6c43f6c8STom Warren 10*6c43f6c8STom Warren #include <common.h> 11*6c43f6c8STom Warren #include <asm/io.h> 12*6c43f6c8STom Warren #include <asm/arch/clock.h> 13*6c43f6c8STom Warren #include <asm/arch/sysctr.h> 14*6c43f6c8STom Warren #include <asm/arch/tegra.h> 15*6c43f6c8STom Warren #include <asm/arch-tegra/clk_rst.h> 16*6c43f6c8STom Warren #include <asm/arch-tegra/timer.h> 17*6c43f6c8STom Warren #include <div64.h> 18*6c43f6c8STom Warren #include <fdtdec.h> 19*6c43f6c8STom Warren 20*6c43f6c8STom Warren /* 21*6c43f6c8STom Warren * Clock types that we can use as a source. The Tegra210 has muxes for the 22*6c43f6c8STom Warren * peripheral clocks, and in most cases there are four options for the clock 23*6c43f6c8STom Warren * source. This gives us a clock 'type' and exploits what commonality exists 24*6c43f6c8STom Warren * in the device. 25*6c43f6c8STom Warren * 26*6c43f6c8STom Warren * Letters are obvious, except for T which means CLK_M, and S which means the 27*6c43f6c8STom Warren * clock derived from 32KHz. Beware that CLK_M (also called OSC in the 28*6c43f6c8STom Warren * datasheet) and PLL_M are different things. The former is the basic 29*6c43f6c8STom Warren * clock supplied to the SOC from an external oscillator. The latter is the 30*6c43f6c8STom Warren * memory clock PLL. 31*6c43f6c8STom Warren * 32*6c43f6c8STom Warren * See definitions in clock_id in the header file. 33*6c43f6c8STom Warren */ 34*6c43f6c8STom Warren enum clock_type_id { 35*6c43f6c8STom Warren CLOCK_TYPE_AXPT, /* PLL_A, PLL_X, PLL_P, CLK_M */ 36*6c43f6c8STom Warren CLOCK_TYPE_MCPA, /* and so on */ 37*6c43f6c8STom Warren CLOCK_TYPE_MCPT, 38*6c43f6c8STom Warren CLOCK_TYPE_PCM, 39*6c43f6c8STom Warren CLOCK_TYPE_PCMT, 40*6c43f6c8STom Warren CLOCK_TYPE_PDCT, 41*6c43f6c8STom Warren CLOCK_TYPE_ACPT, 42*6c43f6c8STom Warren CLOCK_TYPE_ASPTE, 43*6c43f6c8STom Warren CLOCK_TYPE_PMDACD2T, 44*6c43f6c8STom Warren CLOCK_TYPE_PCST, 45*6c43f6c8STom Warren 46*6c43f6c8STom Warren CLOCK_TYPE_PC2CC3M, 47*6c43f6c8STom Warren CLOCK_TYPE_PC2CC3S_T, 48*6c43f6c8STom Warren CLOCK_TYPE_PC2CC3M_T, 49*6c43f6c8STom Warren CLOCK_TYPE_PC2CC3M_T16, /* PC2CC3M_T, but w/16-bit divisor (I2C) */ 50*6c43f6c8STom Warren CLOCK_TYPE_MC2CC3P_A, 51*6c43f6c8STom Warren CLOCK_TYPE_M, 52*6c43f6c8STom Warren CLOCK_TYPE_MCPTM2C2C3, 53*6c43f6c8STom Warren CLOCK_TYPE_PC2CC3T_S, 54*6c43f6c8STom Warren CLOCK_TYPE_AC2CC3P_TS2, 55*6c43f6c8STom Warren CLOCK_TYPE_PC01C00_C42C41TC40, 56*6c43f6c8STom Warren 57*6c43f6c8STom Warren CLOCK_TYPE_COUNT, 58*6c43f6c8STom Warren CLOCK_TYPE_NONE = -1, /* invalid clock type */ 59*6c43f6c8STom Warren }; 60*6c43f6c8STom Warren 61*6c43f6c8STom Warren enum { 62*6c43f6c8STom Warren CLOCK_MAX_MUX = 8 /* number of source options for each clock */ 63*6c43f6c8STom Warren }; 64*6c43f6c8STom Warren 65*6c43f6c8STom Warren /* 66*6c43f6c8STom Warren * Clock source mux for each clock type. This just converts our enum into 67*6c43f6c8STom Warren * a list of mux sources for use by the code. 68*6c43f6c8STom Warren * 69*6c43f6c8STom Warren * Note: 70*6c43f6c8STom Warren * The extra column in each clock source array is used to store the mask 71*6c43f6c8STom Warren * bits in its register for the source. 72*6c43f6c8STom Warren */ 73*6c43f6c8STom Warren #define CLK(x) CLOCK_ID_ ## x 74*6c43f6c8STom Warren static enum clock_id clock_source[CLOCK_TYPE_COUNT][CLOCK_MAX_MUX+1] = { 75*6c43f6c8STom Warren { CLK(AUDIO), CLK(XCPU), CLK(PERIPH), CLK(OSC), 76*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 77*6c43f6c8STom Warren MASK_BITS_31_30}, 78*6c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(AUDIO), 79*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 80*6c43f6c8STom Warren MASK_BITS_31_30}, 81*6c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 82*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 83*6c43f6c8STom Warren MASK_BITS_31_30}, 84*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(NONE), 85*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 86*6c43f6c8STom Warren MASK_BITS_31_30}, 87*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), 88*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 89*6c43f6c8STom Warren MASK_BITS_31_30}, 90*6c43f6c8STom Warren { CLK(PERIPH), CLK(DISPLAY), CLK(CGENERAL), CLK(OSC), 91*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 92*6c43f6c8STom Warren MASK_BITS_31_30}, 93*6c43f6c8STom Warren { CLK(AUDIO), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 94*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 95*6c43f6c8STom Warren MASK_BITS_31_30}, 96*6c43f6c8STom Warren { CLK(AUDIO), CLK(SFROM32KHZ), CLK(PERIPH), CLK(OSC), 97*6c43f6c8STom Warren CLK(EPCI), CLK(NONE), CLK(NONE), CLK(NONE), 98*6c43f6c8STom Warren MASK_BITS_31_29}, 99*6c43f6c8STom Warren { CLK(PERIPH), CLK(MEMORY), CLK(DISPLAY), CLK(AUDIO), 100*6c43f6c8STom Warren CLK(CGENERAL), CLK(DISPLAY2), CLK(OSC), CLK(NONE), 101*6c43f6c8STom Warren MASK_BITS_31_29}, 102*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL), CLK(SFROM32KHZ), CLK(OSC), 103*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 104*6c43f6c8STom Warren MASK_BITS_31_28}, 105*6c43f6c8STom Warren 106*6c43f6c8STom Warren /* Additional clock types on Tegra114+ */ 107*6c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M */ 108*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 109*6c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(NONE), CLK(NONE), 110*6c43f6c8STom Warren MASK_BITS_31_29}, 111*6c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3S_T */ 112*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 113*6c43f6c8STom Warren CLK(SFROM32KHZ), CLK(NONE), CLK(OSC), CLK(NONE), 114*6c43f6c8STom Warren MASK_BITS_31_29}, 115*6c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M_T */ 116*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 117*6c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(OSC), CLK(NONE), 118*6c43f6c8STom Warren MASK_BITS_31_29}, 119*6c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3M_T, w/16-bit divisor (I2C) */ 120*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 121*6c43f6c8STom Warren CLK(MEMORY), CLK(NONE), CLK(OSC), CLK(NONE), 122*6c43f6c8STom Warren MASK_BITS_31_29}, 123*6c43f6c8STom Warren /* CLOCK_TYPE_MC2CC3P_A */ 124*6c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 125*6c43f6c8STom Warren CLK(PERIPH), CLK(NONE), CLK(AUDIO), CLK(NONE), 126*6c43f6c8STom Warren MASK_BITS_31_29}, 127*6c43f6c8STom Warren /* CLOCK_TYPE_M */ 128*6c43f6c8STom Warren { CLK(MEMORY), CLK(NONE), CLK(NONE), CLK(NONE), 129*6c43f6c8STom Warren CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 130*6c43f6c8STom Warren MASK_BITS_31_30}, 131*6c43f6c8STom Warren /* CLOCK_TYPE_MCPTM2C2C3 */ 132*6c43f6c8STom Warren { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 133*6c43f6c8STom Warren CLK(MEMORY2), CLK(CGENERAL2), CLK(CGENERAL3), CLK(NONE), 134*6c43f6c8STom Warren MASK_BITS_31_29}, 135*6c43f6c8STom Warren /* CLOCK_TYPE_PC2CC3T_S */ 136*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 137*6c43f6c8STom Warren CLK(OSC), CLK(NONE), CLK(SFROM32KHZ), CLK(NONE), 138*6c43f6c8STom Warren MASK_BITS_31_29}, 139*6c43f6c8STom Warren /* CLOCK_TYPE_AC2CC3P_TS2 */ 140*6c43f6c8STom Warren { CLK(AUDIO), CLK(CGENERAL2), CLK(CGENERAL), CLK(CGENERAL3), 141*6c43f6c8STom Warren CLK(PERIPH), CLK(NONE), CLK(OSC), CLK(SRC2), 142*6c43f6c8STom Warren MASK_BITS_31_29}, 143*6c43f6c8STom Warren /* CLOCK_TYPE_PC01C00_C42C41TC40 */ 144*6c43f6c8STom Warren { CLK(PERIPH), CLK(CGENERAL_1), CLK(CGENERAL_0), CLK(NONE), 145*6c43f6c8STom Warren CLK(CGENERAL4_2), CLK(CGENERAL4_1), CLK(OSC), CLK(CGENERAL4_0), 146*6c43f6c8STom Warren MASK_BITS_31_29}, 147*6c43f6c8STom Warren }; 148*6c43f6c8STom Warren 149*6c43f6c8STom Warren /* 150*6c43f6c8STom Warren * Clock type for each peripheral clock source. We put the name in each 151*6c43f6c8STom Warren * record just so it is easy to match things up 152*6c43f6c8STom Warren */ 153*6c43f6c8STom Warren #define TYPE(name, type) type 154*6c43f6c8STom Warren static enum clock_type_id clock_periph_type[PERIPHC_COUNT] = { 155*6c43f6c8STom Warren /* 0x00 */ 156*6c43f6c8STom Warren TYPE(PERIPHC_I2S2, CLOCK_TYPE_AXPT), 157*6c43f6c8STom Warren TYPE(PERIPHC_I2S3, CLOCK_TYPE_AXPT), 158*6c43f6c8STom Warren TYPE(PERIPHC_SPDIF_OUT, CLOCK_TYPE_AXPT), 159*6c43f6c8STom Warren TYPE(PERIPHC_SPDIF_IN, CLOCK_TYPE_PC2CC3M), 160*6c43f6c8STom Warren TYPE(PERIPHC_PWM, CLOCK_TYPE_PC2CC3S_T), 161*6c43f6c8STom Warren TYPE(PERIPHC_05h, CLOCK_TYPE_NONE), 162*6c43f6c8STom Warren TYPE(PERIPHC_SBC2, CLOCK_TYPE_PC2CC3M_T), 163*6c43f6c8STom Warren TYPE(PERIPHC_SBC3, CLOCK_TYPE_PC2CC3M_T), 164*6c43f6c8STom Warren 165*6c43f6c8STom Warren /* 0x08 */ 166*6c43f6c8STom Warren TYPE(PERIPHC_08h, CLOCK_TYPE_NONE), 167*6c43f6c8STom Warren TYPE(PERIPHC_I2C1, CLOCK_TYPE_PC2CC3M_T16), 168*6c43f6c8STom Warren TYPE(PERIPHC_I2C5, CLOCK_TYPE_PC2CC3M_T16), 169*6c43f6c8STom Warren TYPE(PERIPHC_0bh, CLOCK_TYPE_NONE), 170*6c43f6c8STom Warren TYPE(PERIPHC_0ch, CLOCK_TYPE_NONE), 171*6c43f6c8STom Warren TYPE(PERIPHC_SBC1, CLOCK_TYPE_PC2CC3M_T), 172*6c43f6c8STom Warren TYPE(PERIPHC_DISP1, CLOCK_TYPE_PMDACD2T), 173*6c43f6c8STom Warren TYPE(PERIPHC_DISP2, CLOCK_TYPE_PMDACD2T), 174*6c43f6c8STom Warren 175*6c43f6c8STom Warren /* 0x10 */ 176*6c43f6c8STom Warren TYPE(PERIPHC_10h, CLOCK_TYPE_NONE), 177*6c43f6c8STom Warren TYPE(PERIPHC_11h, CLOCK_TYPE_NONE), 178*6c43f6c8STom Warren TYPE(PERIPHC_VI, CLOCK_TYPE_MC2CC3P_A), 179*6c43f6c8STom Warren TYPE(PERIPHC_13h, CLOCK_TYPE_NONE), 180*6c43f6c8STom Warren TYPE(PERIPHC_SDMMC1, CLOCK_TYPE_PC2CC3M_T), 181*6c43f6c8STom Warren TYPE(PERIPHC_SDMMC2, CLOCK_TYPE_PC2CC3M_T), 182*6c43f6c8STom Warren TYPE(PERIPHC_16h, CLOCK_TYPE_NONE), 183*6c43f6c8STom Warren TYPE(PERIPHC_17h, CLOCK_TYPE_NONE), 184*6c43f6c8STom Warren 185*6c43f6c8STom Warren /* 0x18 */ 186*6c43f6c8STom Warren TYPE(PERIPHC_18h, CLOCK_TYPE_NONE), 187*6c43f6c8STom Warren TYPE(PERIPHC_SDMMC4, CLOCK_TYPE_PC2CC3M_T), 188*6c43f6c8STom Warren TYPE(PERIPHC_VFIR, CLOCK_TYPE_PC2CC3M_T), 189*6c43f6c8STom Warren TYPE(PERIPHC_1Bh, CLOCK_TYPE_NONE), 190*6c43f6c8STom Warren TYPE(PERIPHC_1Ch, CLOCK_TYPE_NONE), 191*6c43f6c8STom Warren TYPE(PERIPHC_HSI, CLOCK_TYPE_PC2CC3M_T), 192*6c43f6c8STom Warren TYPE(PERIPHC_UART1, CLOCK_TYPE_PC2CC3M_T), 193*6c43f6c8STom Warren TYPE(PERIPHC_UART2, CLOCK_TYPE_PC2CC3M_T), 194*6c43f6c8STom Warren 195*6c43f6c8STom Warren /* 0x20 */ 196*6c43f6c8STom Warren TYPE(PERIPHC_HOST1X, CLOCK_TYPE_MC2CC3P_A), 197*6c43f6c8STom Warren TYPE(PERIPHC_21h, CLOCK_TYPE_NONE), 198*6c43f6c8STom Warren TYPE(PERIPHC_22h, CLOCK_TYPE_NONE), 199*6c43f6c8STom Warren TYPE(PERIPHC_23h, CLOCK_TYPE_NONE), 200*6c43f6c8STom Warren TYPE(PERIPHC_24h, CLOCK_TYPE_NONE), 201*6c43f6c8STom Warren TYPE(PERIPHC_25h, CLOCK_TYPE_NONE), 202*6c43f6c8STom Warren TYPE(PERIPHC_I2C2, CLOCK_TYPE_PC2CC3M_T16), 203*6c43f6c8STom Warren TYPE(PERIPHC_EMC, CLOCK_TYPE_MCPTM2C2C3), 204*6c43f6c8STom Warren 205*6c43f6c8STom Warren /* 0x28 */ 206*6c43f6c8STom Warren TYPE(PERIPHC_UART3, CLOCK_TYPE_PC2CC3M_T), 207*6c43f6c8STom Warren TYPE(PERIPHC_29h, CLOCK_TYPE_NONE), 208*6c43f6c8STom Warren TYPE(PERIPHC_VI_SENSOR, CLOCK_TYPE_MC2CC3P_A), 209*6c43f6c8STom Warren TYPE(PERIPHC_2bh, CLOCK_TYPE_NONE), 210*6c43f6c8STom Warren TYPE(PERIPHC_2ch, CLOCK_TYPE_NONE), 211*6c43f6c8STom Warren TYPE(PERIPHC_SBC4, CLOCK_TYPE_PC2CC3M_T), 212*6c43f6c8STom Warren TYPE(PERIPHC_I2C3, CLOCK_TYPE_PC2CC3M_T16), 213*6c43f6c8STom Warren TYPE(PERIPHC_SDMMC3, CLOCK_TYPE_PC2CC3M_T), 214*6c43f6c8STom Warren 215*6c43f6c8STom Warren /* 0x30 */ 216*6c43f6c8STom Warren TYPE(PERIPHC_UART4, CLOCK_TYPE_PC2CC3M_T), 217*6c43f6c8STom Warren TYPE(PERIPHC_UART5, CLOCK_TYPE_PC2CC3M_T), 218*6c43f6c8STom Warren TYPE(PERIPHC_VDE, CLOCK_TYPE_PC2CC3M_T), 219*6c43f6c8STom Warren TYPE(PERIPHC_OWR, CLOCK_TYPE_PC2CC3M_T), 220*6c43f6c8STom Warren TYPE(PERIPHC_NOR, CLOCK_TYPE_PC2CC3M_T), 221*6c43f6c8STom Warren TYPE(PERIPHC_CSITE, CLOCK_TYPE_PC2CC3M_T), 222*6c43f6c8STom Warren TYPE(PERIPHC_I2S1, CLOCK_TYPE_AXPT), 223*6c43f6c8STom Warren TYPE(PERIPHC_DTV, CLOCK_TYPE_NONE), 224*6c43f6c8STom Warren 225*6c43f6c8STom Warren /* 0x38 */ 226*6c43f6c8STom Warren TYPE(PERIPHC_38h, CLOCK_TYPE_NONE), 227*6c43f6c8STom Warren TYPE(PERIPHC_39h, CLOCK_TYPE_NONE), 228*6c43f6c8STom Warren TYPE(PERIPHC_3ah, CLOCK_TYPE_NONE), 229*6c43f6c8STom Warren TYPE(PERIPHC_3bh, CLOCK_TYPE_NONE), 230*6c43f6c8STom Warren TYPE(PERIPHC_MSENC, CLOCK_TYPE_MC2CC3P_A), 231*6c43f6c8STom Warren TYPE(PERIPHC_TSEC, CLOCK_TYPE_PC2CC3M_T), 232*6c43f6c8STom Warren TYPE(PERIPHC_3eh, CLOCK_TYPE_NONE), 233*6c43f6c8STom Warren TYPE(PERIPHC_OSC, CLOCK_TYPE_NONE), 234*6c43f6c8STom Warren 235*6c43f6c8STom Warren /* 0x40 */ 236*6c43f6c8STom Warren TYPE(PERIPHC_40h, CLOCK_TYPE_NONE), /* start with 0x3b0 */ 237*6c43f6c8STom Warren TYPE(PERIPHC_MSELECT, CLOCK_TYPE_PC2CC3M_T), 238*6c43f6c8STom Warren TYPE(PERIPHC_TSENSOR, CLOCK_TYPE_PC2CC3T_S), 239*6c43f6c8STom Warren TYPE(PERIPHC_I2S4, CLOCK_TYPE_AXPT), 240*6c43f6c8STom Warren TYPE(PERIPHC_I2S5, CLOCK_TYPE_AXPT), 241*6c43f6c8STom Warren TYPE(PERIPHC_I2C4, CLOCK_TYPE_PC2CC3M_T16), 242*6c43f6c8STom Warren TYPE(PERIPHC_SBC5, CLOCK_TYPE_PC2CC3M_T), 243*6c43f6c8STom Warren TYPE(PERIPHC_SBC6, CLOCK_TYPE_PC2CC3M_T), 244*6c43f6c8STom Warren 245*6c43f6c8STom Warren /* 0x48 */ 246*6c43f6c8STom Warren TYPE(PERIPHC_AUDIO, CLOCK_TYPE_AC2CC3P_TS2), 247*6c43f6c8STom Warren TYPE(PERIPHC_49h, CLOCK_TYPE_NONE), 248*6c43f6c8STom Warren TYPE(PERIPHC_4ah, CLOCK_TYPE_NONE), 249*6c43f6c8STom Warren TYPE(PERIPHC_4bh, CLOCK_TYPE_NONE), 250*6c43f6c8STom Warren TYPE(PERIPHC_4ch, CLOCK_TYPE_NONE), 251*6c43f6c8STom Warren TYPE(PERIPHC_HDA2CODEC2X, CLOCK_TYPE_PC2CC3M_T), 252*6c43f6c8STom Warren TYPE(PERIPHC_ACTMON, CLOCK_TYPE_PC2CC3S_T), 253*6c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH1, CLOCK_TYPE_ASPTE), 254*6c43f6c8STom Warren 255*6c43f6c8STom Warren /* 0x50 */ 256*6c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH2, CLOCK_TYPE_ASPTE), 257*6c43f6c8STom Warren TYPE(PERIPHC_EXTPERIPH3, CLOCK_TYPE_ASPTE), 258*6c43f6c8STom Warren TYPE(PERIPHC_52h, CLOCK_TYPE_NONE), 259*6c43f6c8STom Warren TYPE(PERIPHC_I2CSLOW, CLOCK_TYPE_PC2CC3S_T), 260*6c43f6c8STom Warren TYPE(PERIPHC_SYS, CLOCK_TYPE_NONE), 261*6c43f6c8STom Warren TYPE(PERIPHC_55h, CLOCK_TYPE_NONE), 262*6c43f6c8STom Warren TYPE(PERIPHC_56h, CLOCK_TYPE_NONE), 263*6c43f6c8STom Warren TYPE(PERIPHC_57h, CLOCK_TYPE_NONE), 264*6c43f6c8STom Warren 265*6c43f6c8STom Warren /* 0x58 */ 266*6c43f6c8STom Warren TYPE(PERIPHC_58h, CLOCK_TYPE_NONE), 267*6c43f6c8STom Warren TYPE(PERIPHC_59h, CLOCK_TYPE_NONE), 268*6c43f6c8STom Warren TYPE(PERIPHC_5ah, CLOCK_TYPE_NONE), 269*6c43f6c8STom Warren TYPE(PERIPHC_5bh, CLOCK_TYPE_NONE), 270*6c43f6c8STom Warren TYPE(PERIPHC_SATAOOB, CLOCK_TYPE_PCMT), 271*6c43f6c8STom Warren TYPE(PERIPHC_SATA, CLOCK_TYPE_PCMT), 272*6c43f6c8STom Warren TYPE(PERIPHC_HDA, CLOCK_TYPE_PC2CC3M_T), 273*6c43f6c8STom Warren TYPE(PERIPHC_5fh, CLOCK_TYPE_NONE), 274*6c43f6c8STom Warren 275*6c43f6c8STom Warren /* 0x60 */ 276*6c43f6c8STom Warren TYPE(PERIPHC_XUSB_CORE_HOST, CLOCK_TYPE_NONE), 277*6c43f6c8STom Warren TYPE(PERIPHC_XUSB_FALCON, CLOCK_TYPE_NONE), 278*6c43f6c8STom Warren TYPE(PERIPHC_XUSB_FS, CLOCK_TYPE_NONE), 279*6c43f6c8STom Warren TYPE(PERIPHC_XUSB_CORE_DEV, CLOCK_TYPE_NONE), 280*6c43f6c8STom Warren TYPE(PERIPHC_XUSB_SS, CLOCK_TYPE_NONE), 281*6c43f6c8STom Warren TYPE(PERIPHC_CILAB, CLOCK_TYPE_NONE), 282*6c43f6c8STom Warren TYPE(PERIPHC_CILCD, CLOCK_TYPE_NONE), 283*6c43f6c8STom Warren TYPE(PERIPHC_CILE, CLOCK_TYPE_NONE), 284*6c43f6c8STom Warren 285*6c43f6c8STom Warren /* 0x68 */ 286*6c43f6c8STom Warren TYPE(PERIPHC_DSIA_LP, CLOCK_TYPE_NONE), 287*6c43f6c8STom Warren TYPE(PERIPHC_DSIB_LP, CLOCK_TYPE_NONE), 288*6c43f6c8STom Warren TYPE(PERIPHC_ENTROPY, CLOCK_TYPE_NONE), 289*6c43f6c8STom Warren TYPE(PERIPHC_DVFS_REF, CLOCK_TYPE_NONE), 290*6c43f6c8STom Warren TYPE(PERIPHC_DVFS_SOC, CLOCK_TYPE_NONE), 291*6c43f6c8STom Warren TYPE(PERIPHC_TRACECLKIN, CLOCK_TYPE_NONE), 292*6c43f6c8STom Warren TYPE(PERIPHC_6eh, CLOCK_TYPE_NONE), 293*6c43f6c8STom Warren TYPE(PERIPHC_6fh, CLOCK_TYPE_NONE), 294*6c43f6c8STom Warren 295*6c43f6c8STom Warren /* 0x70 */ 296*6c43f6c8STom Warren TYPE(PERIPHC_EMC_LATENCY, CLOCK_TYPE_NONE), 297*6c43f6c8STom Warren TYPE(PERIPHC_SOC_THERM, CLOCK_TYPE_NONE), 298*6c43f6c8STom Warren TYPE(PERIPHC_72h, CLOCK_TYPE_NONE), 299*6c43f6c8STom Warren TYPE(PERIPHC_73h, CLOCK_TYPE_NONE), 300*6c43f6c8STom Warren TYPE(PERIPHC_74h, CLOCK_TYPE_NONE), 301*6c43f6c8STom Warren TYPE(PERIPHC_75h, CLOCK_TYPE_NONE), 302*6c43f6c8STom Warren TYPE(PERIPHC_VI_SENSOR2, CLOCK_TYPE_NONE), 303*6c43f6c8STom Warren TYPE(PERIPHC_I2C6, CLOCK_TYPE_PC2CC3M_T16), 304*6c43f6c8STom Warren 305*6c43f6c8STom Warren /* 0x78 */ 306*6c43f6c8STom Warren TYPE(PERIPHC_78h, CLOCK_TYPE_NONE), 307*6c43f6c8STom Warren TYPE(PERIPHC_EMC_DLL, CLOCK_TYPE_MCPTM2C2C3), 308*6c43f6c8STom Warren TYPE(PERIPHC_7ah, CLOCK_TYPE_NONE), 309*6c43f6c8STom Warren TYPE(PERIPHC_CLK72MHZ, CLOCK_TYPE_NONE), 310*6c43f6c8STom Warren TYPE(PERIPHC_7ch, CLOCK_TYPE_NONE), 311*6c43f6c8STom Warren TYPE(PERIPHC_7dh, CLOCK_TYPE_NONE), 312*6c43f6c8STom Warren TYPE(PERIPHC_VIC, CLOCK_TYPE_NONE), 313*6c43f6c8STom Warren TYPE(PERIPHC_7Fh, CLOCK_TYPE_NONE), 314*6c43f6c8STom Warren 315*6c43f6c8STom Warren /* 0x80 */ 316*6c43f6c8STom Warren TYPE(PERIPHC_SDMMC_LEGACY_TM, CLOCK_TYPE_NONE), 317*6c43f6c8STom Warren TYPE(PERIPHC_NVDEC, CLOCK_TYPE_NONE), 318*6c43f6c8STom Warren TYPE(PERIPHC_NVJPG, CLOCK_TYPE_NONE), 319*6c43f6c8STom Warren TYPE(PERIPHC_NVENC, CLOCK_TYPE_NONE), 320*6c43f6c8STom Warren TYPE(PERIPHC_84h, CLOCK_TYPE_NONE), 321*6c43f6c8STom Warren TYPE(PERIPHC_85h, CLOCK_TYPE_NONE), 322*6c43f6c8STom Warren TYPE(PERIPHC_86h, CLOCK_TYPE_NONE), 323*6c43f6c8STom Warren TYPE(PERIPHC_87h, CLOCK_TYPE_NONE), 324*6c43f6c8STom Warren 325*6c43f6c8STom Warren /* 0x88 */ 326*6c43f6c8STom Warren TYPE(PERIPHC_88h, CLOCK_TYPE_NONE), 327*6c43f6c8STom Warren TYPE(PERIPHC_89h, CLOCK_TYPE_NONE), 328*6c43f6c8STom Warren TYPE(PERIPHC_DMIC3, CLOCK_TYPE_NONE), 329*6c43f6c8STom Warren TYPE(PERIPHC_APE, CLOCK_TYPE_NONE), 330*6c43f6c8STom Warren TYPE(PERIPHC_QSPI, CLOCK_TYPE_PC01C00_C42C41TC40), 331*6c43f6c8STom Warren TYPE(PERIPHC_VI_I2C, CLOCK_TYPE_NONE), 332*6c43f6c8STom Warren TYPE(PERIPHC_USB2_HSIC_TRK, CLOCK_TYPE_NONE), 333*6c43f6c8STom Warren TYPE(PERIPHC_PEX_SATA_USB_RX_BYP, CLOCK_TYPE_NONE), 334*6c43f6c8STom Warren 335*6c43f6c8STom Warren /* 0x90 */ 336*6c43f6c8STom Warren TYPE(PERIPHC_MAUD, CLOCK_TYPE_NONE), 337*6c43f6c8STom Warren TYPE(PERIPHC_TSECB, CLOCK_TYPE_NONE), 338*6c43f6c8STom Warren }; 339*6c43f6c8STom Warren 340*6c43f6c8STom Warren /* 341*6c43f6c8STom Warren * This array translates a periph_id to a periphc_internal_id 342*6c43f6c8STom Warren * 343*6c43f6c8STom Warren * Not present/matched up: 344*6c43f6c8STom Warren * uint vi_sensor; _VI_SENSOR_0, 0x1A8 345*6c43f6c8STom Warren * SPDIF - which is both 0x08 and 0x0c 346*6c43f6c8STom Warren * 347*6c43f6c8STom Warren */ 348*6c43f6c8STom Warren #define NONE(name) (-1) 349*6c43f6c8STom Warren #define OFFSET(name, value) PERIPHC_ ## name 350*6c43f6c8STom Warren #define INTERNAL_ID(id) (id & 0x000000ff) 351*6c43f6c8STom Warren static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = { 352*6c43f6c8STom Warren /* Low word: 31:0 */ 353*6c43f6c8STom Warren NONE(CPU), 354*6c43f6c8STom Warren NONE(COP), 355*6c43f6c8STom Warren NONE(TRIGSYS), 356*6c43f6c8STom Warren NONE(ISPB), 357*6c43f6c8STom Warren NONE(RESERVED4), 358*6c43f6c8STom Warren NONE(TMR), 359*6c43f6c8STom Warren PERIPHC_UART1, 360*6c43f6c8STom Warren PERIPHC_UART2, /* and vfir 0x68 */ 361*6c43f6c8STom Warren 362*6c43f6c8STom Warren /* 8 */ 363*6c43f6c8STom Warren NONE(GPIO), 364*6c43f6c8STom Warren PERIPHC_SDMMC2, 365*6c43f6c8STom Warren PERIPHC_SPDIF_IN, 366*6c43f6c8STom Warren PERIPHC_I2S2, 367*6c43f6c8STom Warren PERIPHC_I2C1, 368*6c43f6c8STom Warren NONE(RESERVED13), 369*6c43f6c8STom Warren PERIPHC_SDMMC1, 370*6c43f6c8STom Warren PERIPHC_SDMMC4, 371*6c43f6c8STom Warren 372*6c43f6c8STom Warren /* 16 */ 373*6c43f6c8STom Warren NONE(TCW), 374*6c43f6c8STom Warren PERIPHC_PWM, 375*6c43f6c8STom Warren PERIPHC_I2S3, 376*6c43f6c8STom Warren NONE(RESERVED19), 377*6c43f6c8STom Warren PERIPHC_VI, 378*6c43f6c8STom Warren NONE(RESERVED21), 379*6c43f6c8STom Warren NONE(USBD), 380*6c43f6c8STom Warren NONE(ISP), 381*6c43f6c8STom Warren 382*6c43f6c8STom Warren /* 24 */ 383*6c43f6c8STom Warren NONE(RESERVED24), 384*6c43f6c8STom Warren NONE(RESERVED25), 385*6c43f6c8STom Warren PERIPHC_DISP2, 386*6c43f6c8STom Warren PERIPHC_DISP1, 387*6c43f6c8STom Warren PERIPHC_HOST1X, 388*6c43f6c8STom Warren NONE(VCP), 389*6c43f6c8STom Warren PERIPHC_I2S1, 390*6c43f6c8STom Warren NONE(CACHE2), 391*6c43f6c8STom Warren 392*6c43f6c8STom Warren /* Middle word: 63:32 */ 393*6c43f6c8STom Warren NONE(MEM), 394*6c43f6c8STom Warren NONE(AHBDMA), 395*6c43f6c8STom Warren NONE(APBDMA), 396*6c43f6c8STom Warren NONE(RESERVED35), 397*6c43f6c8STom Warren NONE(RESERVED36), 398*6c43f6c8STom Warren NONE(STAT_MON), 399*6c43f6c8STom Warren NONE(RESERVED38), 400*6c43f6c8STom Warren NONE(FUSE), 401*6c43f6c8STom Warren 402*6c43f6c8STom Warren /* 40 */ 403*6c43f6c8STom Warren NONE(KFUSE), 404*6c43f6c8STom Warren PERIPHC_SBC1, /* SBCx = SPIx */ 405*6c43f6c8STom Warren PERIPHC_NOR, 406*6c43f6c8STom Warren NONE(RESERVED43), 407*6c43f6c8STom Warren PERIPHC_SBC2, 408*6c43f6c8STom Warren NONE(XIO), 409*6c43f6c8STom Warren PERIPHC_SBC3, 410*6c43f6c8STom Warren PERIPHC_I2C5, 411*6c43f6c8STom Warren 412*6c43f6c8STom Warren /* 48 */ 413*6c43f6c8STom Warren NONE(DSI), 414*6c43f6c8STom Warren NONE(RESERVED49), 415*6c43f6c8STom Warren PERIPHC_HSI, 416*6c43f6c8STom Warren NONE(RESERVED51), 417*6c43f6c8STom Warren NONE(CSI), 418*6c43f6c8STom Warren NONE(RESERVED53), 419*6c43f6c8STom Warren PERIPHC_I2C2, 420*6c43f6c8STom Warren PERIPHC_UART3, 421*6c43f6c8STom Warren 422*6c43f6c8STom Warren /* 56 */ 423*6c43f6c8STom Warren NONE(MIPI_CAL), 424*6c43f6c8STom Warren PERIPHC_EMC, 425*6c43f6c8STom Warren NONE(USB2), 426*6c43f6c8STom Warren NONE(USB3), 427*6c43f6c8STom Warren NONE(RESERVED60), 428*6c43f6c8STom Warren PERIPHC_VDE, 429*6c43f6c8STom Warren NONE(BSEA), 430*6c43f6c8STom Warren NONE(BSEV), 431*6c43f6c8STom Warren 432*6c43f6c8STom Warren /* Upper word 95:64 */ 433*6c43f6c8STom Warren NONE(RESERVED64), 434*6c43f6c8STom Warren PERIPHC_UART4, 435*6c43f6c8STom Warren PERIPHC_UART5, 436*6c43f6c8STom Warren PERIPHC_I2C3, 437*6c43f6c8STom Warren PERIPHC_SBC4, 438*6c43f6c8STom Warren PERIPHC_SDMMC3, 439*6c43f6c8STom Warren NONE(PCIE), 440*6c43f6c8STom Warren PERIPHC_OWR, 441*6c43f6c8STom Warren 442*6c43f6c8STom Warren /* 72 */ 443*6c43f6c8STom Warren NONE(AFI), 444*6c43f6c8STom Warren PERIPHC_CSITE, 445*6c43f6c8STom Warren NONE(PCIEXCLK), 446*6c43f6c8STom Warren NONE(AVPUCQ), 447*6c43f6c8STom Warren NONE(LA), 448*6c43f6c8STom Warren NONE(TRACECLKIN), 449*6c43f6c8STom Warren NONE(SOC_THERM), 450*6c43f6c8STom Warren NONE(DTV), 451*6c43f6c8STom Warren 452*6c43f6c8STom Warren /* 80 */ 453*6c43f6c8STom Warren NONE(RESERVED80), 454*6c43f6c8STom Warren PERIPHC_I2CSLOW, 455*6c43f6c8STom Warren NONE(DSIB), 456*6c43f6c8STom Warren PERIPHC_TSEC, 457*6c43f6c8STom Warren NONE(RESERVED84), 458*6c43f6c8STom Warren NONE(RESERVED85), 459*6c43f6c8STom Warren NONE(RESERVED86), 460*6c43f6c8STom Warren NONE(EMUCIF), 461*6c43f6c8STom Warren 462*6c43f6c8STom Warren /* 88 */ 463*6c43f6c8STom Warren NONE(RESERVED88), 464*6c43f6c8STom Warren NONE(XUSB_HOST), 465*6c43f6c8STom Warren NONE(RESERVED90), 466*6c43f6c8STom Warren PERIPHC_MSENC, 467*6c43f6c8STom Warren NONE(RESERVED92), 468*6c43f6c8STom Warren NONE(RESERVED93), 469*6c43f6c8STom Warren NONE(RESERVED94), 470*6c43f6c8STom Warren NONE(XUSB_DEV), 471*6c43f6c8STom Warren 472*6c43f6c8STom Warren /* V word: 31:0 */ 473*6c43f6c8STom Warren NONE(CPUG), 474*6c43f6c8STom Warren NONE(CPULP), 475*6c43f6c8STom Warren NONE(V_RESERVED2), 476*6c43f6c8STom Warren PERIPHC_MSELECT, 477*6c43f6c8STom Warren NONE(V_RESERVED4), 478*6c43f6c8STom Warren PERIPHC_I2S4, 479*6c43f6c8STom Warren PERIPHC_I2S5, 480*6c43f6c8STom Warren PERIPHC_I2C4, 481*6c43f6c8STom Warren 482*6c43f6c8STom Warren /* 104 */ 483*6c43f6c8STom Warren PERIPHC_SBC5, 484*6c43f6c8STom Warren PERIPHC_SBC6, 485*6c43f6c8STom Warren PERIPHC_AUDIO, 486*6c43f6c8STom Warren NONE(APBIF), 487*6c43f6c8STom Warren NONE(V_RESERVED12), 488*6c43f6c8STom Warren NONE(V_RESERVED13), 489*6c43f6c8STom Warren NONE(V_RESERVED14), 490*6c43f6c8STom Warren PERIPHC_HDA2CODEC2X, 491*6c43f6c8STom Warren 492*6c43f6c8STom Warren /* 112 */ 493*6c43f6c8STom Warren NONE(ATOMICS), 494*6c43f6c8STom Warren NONE(V_RESERVED17), 495*6c43f6c8STom Warren NONE(V_RESERVED18), 496*6c43f6c8STom Warren NONE(V_RESERVED19), 497*6c43f6c8STom Warren NONE(V_RESERVED20), 498*6c43f6c8STom Warren NONE(V_RESERVED21), 499*6c43f6c8STom Warren NONE(V_RESERVED22), 500*6c43f6c8STom Warren PERIPHC_ACTMON, 501*6c43f6c8STom Warren 502*6c43f6c8STom Warren /* 120 */ 503*6c43f6c8STom Warren NONE(EXTPERIPH1), 504*6c43f6c8STom Warren NONE(EXTPERIPH2), 505*6c43f6c8STom Warren NONE(EXTPERIPH3), 506*6c43f6c8STom Warren NONE(OOB), 507*6c43f6c8STom Warren PERIPHC_SATA, 508*6c43f6c8STom Warren PERIPHC_HDA, 509*6c43f6c8STom Warren NONE(TZRAM), 510*6c43f6c8STom Warren NONE(SE), 511*6c43f6c8STom Warren 512*6c43f6c8STom Warren /* W word: 31:0 */ 513*6c43f6c8STom Warren NONE(HDA2HDMICODEC), 514*6c43f6c8STom Warren NONE(SATACOLD), 515*6c43f6c8STom Warren NONE(W_RESERVED2), 516*6c43f6c8STom Warren NONE(W_RESERVED3), 517*6c43f6c8STom Warren NONE(W_RESERVED4), 518*6c43f6c8STom Warren NONE(W_RESERVED5), 519*6c43f6c8STom Warren NONE(W_RESERVED6), 520*6c43f6c8STom Warren NONE(W_RESERVED7), 521*6c43f6c8STom Warren 522*6c43f6c8STom Warren /* 136 */ 523*6c43f6c8STom Warren NONE(CEC), 524*6c43f6c8STom Warren NONE(W_RESERVED9), 525*6c43f6c8STom Warren NONE(W_RESERVED10), 526*6c43f6c8STom Warren NONE(W_RESERVED11), 527*6c43f6c8STom Warren NONE(W_RESERVED12), 528*6c43f6c8STom Warren NONE(W_RESERVED13), 529*6c43f6c8STom Warren NONE(XUSB_PADCTL), 530*6c43f6c8STom Warren NONE(W_RESERVED15), 531*6c43f6c8STom Warren 532*6c43f6c8STom Warren /* 144 */ 533*6c43f6c8STom Warren NONE(W_RESERVED16), 534*6c43f6c8STom Warren NONE(W_RESERVED17), 535*6c43f6c8STom Warren NONE(W_RESERVED18), 536*6c43f6c8STom Warren NONE(W_RESERVED19), 537*6c43f6c8STom Warren NONE(W_RESERVED20), 538*6c43f6c8STom Warren NONE(ENTROPY), 539*6c43f6c8STom Warren NONE(DDS), 540*6c43f6c8STom Warren NONE(W_RESERVED23), 541*6c43f6c8STom Warren 542*6c43f6c8STom Warren /* 152 */ 543*6c43f6c8STom Warren NONE(W_RESERVED24), 544*6c43f6c8STom Warren NONE(W_RESERVED25), 545*6c43f6c8STom Warren NONE(W_RESERVED26), 546*6c43f6c8STom Warren NONE(DVFS), 547*6c43f6c8STom Warren NONE(XUSB_SS), 548*6c43f6c8STom Warren NONE(W_RESERVED29), 549*6c43f6c8STom Warren NONE(W_RESERVED30), 550*6c43f6c8STom Warren NONE(W_RESERVED31), 551*6c43f6c8STom Warren 552*6c43f6c8STom Warren /* X word: 31:0 */ 553*6c43f6c8STom Warren NONE(SPARE), 554*6c43f6c8STom Warren NONE(X_RESERVED1), 555*6c43f6c8STom Warren NONE(X_RESERVED2), 556*6c43f6c8STom Warren NONE(X_RESERVED3), 557*6c43f6c8STom Warren NONE(CAM_MCLK), 558*6c43f6c8STom Warren NONE(CAM_MCLK2), 559*6c43f6c8STom Warren PERIPHC_I2C6, 560*6c43f6c8STom Warren NONE(X_RESERVED7), 561*6c43f6c8STom Warren 562*6c43f6c8STom Warren /* 168 */ 563*6c43f6c8STom Warren NONE(X_RESERVED8), 564*6c43f6c8STom Warren NONE(X_RESERVED9), 565*6c43f6c8STom Warren NONE(X_RESERVED10), 566*6c43f6c8STom Warren NONE(VIM2_CLK), 567*6c43f6c8STom Warren NONE(X_RESERVED12), 568*6c43f6c8STom Warren NONE(X_RESERVED13), 569*6c43f6c8STom Warren NONE(EMC_DLL), 570*6c43f6c8STom Warren NONE(X_RESERVED15), 571*6c43f6c8STom Warren 572*6c43f6c8STom Warren /* 176 */ 573*6c43f6c8STom Warren NONE(X_RESERVED16), 574*6c43f6c8STom Warren NONE(CLK72MHZ), 575*6c43f6c8STom Warren NONE(VIC), 576*6c43f6c8STom Warren NONE(X_RESERVED19), 577*6c43f6c8STom Warren NONE(X_RESERVED20), 578*6c43f6c8STom Warren NONE(DPAUX), 579*6c43f6c8STom Warren NONE(SOR0), 580*6c43f6c8STom Warren NONE(X_RESERVED23), 581*6c43f6c8STom Warren 582*6c43f6c8STom Warren /* 184 */ 583*6c43f6c8STom Warren NONE(GPU), 584*6c43f6c8STom Warren NONE(X_RESERVED25), 585*6c43f6c8STom Warren NONE(X_RESERVED26), 586*6c43f6c8STom Warren NONE(X_RESERVED27), 587*6c43f6c8STom Warren NONE(X_RESERVED28), 588*6c43f6c8STom Warren NONE(X_RESERVED29), 589*6c43f6c8STom Warren NONE(X_RESERVED30), 590*6c43f6c8STom Warren NONE(X_RESERVED31), 591*6c43f6c8STom Warren 592*6c43f6c8STom Warren /* Y: 192 (192 - 223) */ 593*6c43f6c8STom Warren NONE(Y_RESERVED0), 594*6c43f6c8STom Warren PERIPHC_SDMMC_LEGACY_TM, 595*6c43f6c8STom Warren PERIPHC_NVDEC, 596*6c43f6c8STom Warren PERIPHC_NVJPG, 597*6c43f6c8STom Warren NONE(Y_RESERVED4), 598*6c43f6c8STom Warren PERIPHC_DMIC3, /* 197 */ 599*6c43f6c8STom Warren PERIPHC_APE, /* 198 */ 600*6c43f6c8STom Warren NONE(Y_RESERVED7), 601*6c43f6c8STom Warren 602*6c43f6c8STom Warren /* 200 */ 603*6c43f6c8STom Warren NONE(Y_RESERVED8), 604*6c43f6c8STom Warren NONE(Y_RESERVED9), 605*6c43f6c8STom Warren NONE(Y_RESERVED10), 606*6c43f6c8STom Warren NONE(Y_RESERVED11), 607*6c43f6c8STom Warren NONE(Y_RESERVED12), 608*6c43f6c8STom Warren NONE(Y_RESERVED13), 609*6c43f6c8STom Warren NONE(Y_RESERVED14), 610*6c43f6c8STom Warren NONE(Y_RESERVED15), 611*6c43f6c8STom Warren 612*6c43f6c8STom Warren /* 208 */ 613*6c43f6c8STom Warren PERIPHC_VI_I2C, /* 208 */ 614*6c43f6c8STom Warren NONE(Y_RESERVED17), 615*6c43f6c8STom Warren NONE(Y_RESERVED18), 616*6c43f6c8STom Warren PERIPHC_QSPI, /* 211 */ 617*6c43f6c8STom Warren NONE(Y_RESERVED20), 618*6c43f6c8STom Warren NONE(Y_RESERVED21), 619*6c43f6c8STom Warren NONE(Y_RESERVED22), 620*6c43f6c8STom Warren NONE(Y_RESERVED23), 621*6c43f6c8STom Warren 622*6c43f6c8STom Warren /* 216 */ 623*6c43f6c8STom Warren NONE(Y_RESERVED24), 624*6c43f6c8STom Warren NONE(Y_RESERVED25), 625*6c43f6c8STom Warren NONE(Y_RESERVED26), 626*6c43f6c8STom Warren PERIPHC_NVENC, /* 219 */ 627*6c43f6c8STom Warren NONE(Y_RESERVED28), 628*6c43f6c8STom Warren NONE(Y_RESERVED29), 629*6c43f6c8STom Warren NONE(Y_RESERVED30), 630*6c43f6c8STom Warren NONE(Y_RESERVED31), 631*6c43f6c8STom Warren }; 632*6c43f6c8STom Warren 633*6c43f6c8STom Warren /* 634*6c43f6c8STom Warren * Get the oscillator frequency, from the corresponding hardware configuration 635*6c43f6c8STom Warren * field. Note that Tegra30+ support 3 new higher freqs, but we map back 636*6c43f6c8STom Warren * to the old T20 freqs. Support for the higher oscillators is TBD. 637*6c43f6c8STom Warren */ 638*6c43f6c8STom Warren enum clock_osc_freq clock_get_osc_freq(void) 639*6c43f6c8STom Warren { 640*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 641*6c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 642*6c43f6c8STom Warren u32 reg; 643*6c43f6c8STom Warren 644*6c43f6c8STom Warren reg = readl(&clkrst->crc_osc_ctrl); 645*6c43f6c8STom Warren reg = (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT; 646*6c43f6c8STom Warren /* 647*6c43f6c8STom Warren * 0 = 13MHz, 1 = 16.8MHz, 4 = 19.2MHz, 5 = 38.4MHz, 648*6c43f6c8STom Warren * 8 = 12MHz, 9 = 48MHz, 12 = 26MHz 649*6c43f6c8STom Warren */ 650*6c43f6c8STom Warren if (reg == 5) { 651*6c43f6c8STom Warren debug("OSC_FREQ is 38.4MHz (%d) ...\n", reg); 652*6c43f6c8STom Warren /* Map it to 19.2MHz for now. 38.4MHz OSC support TBD */ 653*6c43f6c8STom Warren return 1; 654*6c43f6c8STom Warren } 655*6c43f6c8STom Warren 656*6c43f6c8STom Warren /* 657*6c43f6c8STom Warren * Map to most common (T20) freqs (except 38.4, handled above): 658*6c43f6c8STom Warren * 13/16.8 = 0, 19.2 = 1, 12/48 = 2, 26 = 3 659*6c43f6c8STom Warren */ 660*6c43f6c8STom Warren return reg >> 2; 661*6c43f6c8STom Warren } 662*6c43f6c8STom Warren 663*6c43f6c8STom Warren /* Returns a pointer to the clock source register for a peripheral */ 664*6c43f6c8STom Warren u32 *get_periph_source_reg(enum periph_id periph_id) 665*6c43f6c8STom Warren { 666*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 667*6c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 668*6c43f6c8STom Warren enum periphc_internal_id internal_id; 669*6c43f6c8STom Warren 670*6c43f6c8STom Warren /* Coresight is a special case */ 671*6c43f6c8STom Warren if (periph_id == PERIPH_ID_CSI) 672*6c43f6c8STom Warren return &clkrst->crc_clk_src[PERIPH_ID_CSI+1]; 673*6c43f6c8STom Warren 674*6c43f6c8STom Warren assert(periph_id >= PERIPH_ID_FIRST && periph_id < PERIPH_ID_COUNT); 675*6c43f6c8STom Warren internal_id = INTERNAL_ID(periph_id_to_internal_id[periph_id]); 676*6c43f6c8STom Warren assert(internal_id != -1); 677*6c43f6c8STom Warren 678*6c43f6c8STom Warren if (internal_id < PERIPHC_VW_FIRST) 679*6c43f6c8STom Warren /* L, H, U */ 680*6c43f6c8STom Warren return &clkrst->crc_clk_src[internal_id]; 681*6c43f6c8STom Warren 682*6c43f6c8STom Warren if (internal_id < PERIPHC_X_FIRST) { 683*6c43f6c8STom Warren /* VW */ 684*6c43f6c8STom Warren internal_id -= PERIPHC_VW_FIRST; 685*6c43f6c8STom Warren return &clkrst->crc_clk_src_vw[internal_id]; 686*6c43f6c8STom Warren } 687*6c43f6c8STom Warren 688*6c43f6c8STom Warren if (internal_id < PERIPHC_Y_FIRST) { 689*6c43f6c8STom Warren /* X */ 690*6c43f6c8STom Warren internal_id -= PERIPHC_X_FIRST; 691*6c43f6c8STom Warren return &clkrst->crc_clk_src_x[internal_id]; 692*6c43f6c8STom Warren } 693*6c43f6c8STom Warren 694*6c43f6c8STom Warren /* Y */ 695*6c43f6c8STom Warren internal_id -= PERIPHC_Y_FIRST; 696*6c43f6c8STom Warren return &clkrst->crc_clk_src_y[internal_id]; 697*6c43f6c8STom Warren } 698*6c43f6c8STom Warren 699*6c43f6c8STom Warren /** 700*6c43f6c8STom Warren * Given a peripheral ID and the required source clock, this returns which 701*6c43f6c8STom Warren * value should be programmed into the source mux for that peripheral. 702*6c43f6c8STom Warren * 703*6c43f6c8STom Warren * There is special code here to handle the one source type with 5 sources. 704*6c43f6c8STom Warren * 705*6c43f6c8STom Warren * @param periph_id peripheral to start 706*6c43f6c8STom Warren * @param source PLL id of required parent clock 707*6c43f6c8STom Warren * @param mux_bits Set to number of bits in mux register: 2 or 4 708*6c43f6c8STom Warren * @param divider_bits Set to number of divider bits (8 or 16) 709*6c43f6c8STom Warren * @return mux value (0-4, or -1 if not found) 710*6c43f6c8STom Warren */ 711*6c43f6c8STom Warren int get_periph_clock_source(enum periph_id periph_id, 712*6c43f6c8STom Warren enum clock_id parent, int *mux_bits, int *divider_bits) 713*6c43f6c8STom Warren { 714*6c43f6c8STom Warren enum clock_type_id type; 715*6c43f6c8STom Warren enum periphc_internal_id internal_id; 716*6c43f6c8STom Warren int mux; 717*6c43f6c8STom Warren 718*6c43f6c8STom Warren assert(clock_periph_id_isvalid(periph_id)); 719*6c43f6c8STom Warren 720*6c43f6c8STom Warren internal_id = INTERNAL_ID(periph_id_to_internal_id[periph_id]); 721*6c43f6c8STom Warren assert(periphc_internal_id_isvalid(internal_id)); 722*6c43f6c8STom Warren 723*6c43f6c8STom Warren type = clock_periph_type[internal_id]; 724*6c43f6c8STom Warren assert(clock_type_id_isvalid(type)); 725*6c43f6c8STom Warren 726*6c43f6c8STom Warren *mux_bits = clock_source[type][CLOCK_MAX_MUX]; 727*6c43f6c8STom Warren 728*6c43f6c8STom Warren if (type == CLOCK_TYPE_PC2CC3M_T16) 729*6c43f6c8STom Warren *divider_bits = 16; 730*6c43f6c8STom Warren else 731*6c43f6c8STom Warren *divider_bits = 8; 732*6c43f6c8STom Warren 733*6c43f6c8STom Warren for (mux = 0; mux < CLOCK_MAX_MUX; mux++) 734*6c43f6c8STom Warren if (clock_source[type][mux] == parent) 735*6c43f6c8STom Warren return mux; 736*6c43f6c8STom Warren 737*6c43f6c8STom Warren /* if we get here, either us or the caller has made a mistake */ 738*6c43f6c8STom Warren printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, 739*6c43f6c8STom Warren parent); 740*6c43f6c8STom Warren return -1; 741*6c43f6c8STom Warren } 742*6c43f6c8STom Warren 743*6c43f6c8STom Warren void clock_set_enable(enum periph_id periph_id, int enable) 744*6c43f6c8STom Warren { 745*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 746*6c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 747*6c43f6c8STom Warren u32 *clk; 748*6c43f6c8STom Warren u32 reg; 749*6c43f6c8STom Warren 750*6c43f6c8STom Warren /* Enable/disable the clock to this peripheral */ 751*6c43f6c8STom Warren assert(clock_periph_id_isvalid(periph_id)); 752*6c43f6c8STom Warren if ((int)periph_id < (int)PERIPH_ID_VW_FIRST) 753*6c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb[PERIPH_REG(periph_id)]; 754*6c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_X_FIRST) 755*6c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_vw[PERIPH_REG(periph_id)]; 756*6c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_Y_FIRST) 757*6c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_x; 758*6c43f6c8STom Warren else 759*6c43f6c8STom Warren clk = &clkrst->crc_clk_out_enb_y; 760*6c43f6c8STom Warren 761*6c43f6c8STom Warren reg = readl(clk); 762*6c43f6c8STom Warren if (enable) 763*6c43f6c8STom Warren reg |= PERIPH_MASK(periph_id); 764*6c43f6c8STom Warren else 765*6c43f6c8STom Warren reg &= ~PERIPH_MASK(periph_id); 766*6c43f6c8STom Warren writel(reg, clk); 767*6c43f6c8STom Warren } 768*6c43f6c8STom Warren 769*6c43f6c8STom Warren void reset_set_enable(enum periph_id periph_id, int enable) 770*6c43f6c8STom Warren { 771*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 772*6c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 773*6c43f6c8STom Warren u32 *reset; 774*6c43f6c8STom Warren u32 reg; 775*6c43f6c8STom Warren 776*6c43f6c8STom Warren /* Enable/disable reset to the peripheral */ 777*6c43f6c8STom Warren assert(clock_periph_id_isvalid(periph_id)); 778*6c43f6c8STom Warren if (periph_id < PERIPH_ID_VW_FIRST) 779*6c43f6c8STom Warren reset = &clkrst->crc_rst_dev[PERIPH_REG(periph_id)]; 780*6c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_X_FIRST) 781*6c43f6c8STom Warren reset = &clkrst->crc_rst_dev_vw[PERIPH_REG(periph_id)]; 782*6c43f6c8STom Warren else if ((int)periph_id < (int)PERIPH_ID_Y_FIRST) 783*6c43f6c8STom Warren reset = &clkrst->crc_rst_devices_x; 784*6c43f6c8STom Warren else 785*6c43f6c8STom Warren reset = &clkrst->crc_rst_devices_y; 786*6c43f6c8STom Warren 787*6c43f6c8STom Warren reg = readl(reset); 788*6c43f6c8STom Warren if (enable) 789*6c43f6c8STom Warren reg |= PERIPH_MASK(periph_id); 790*6c43f6c8STom Warren else 791*6c43f6c8STom Warren reg &= ~PERIPH_MASK(periph_id); 792*6c43f6c8STom Warren writel(reg, reset); 793*6c43f6c8STom Warren } 794*6c43f6c8STom Warren 795*6c43f6c8STom Warren #ifdef CONFIG_OF_CONTROL 796*6c43f6c8STom Warren /* 797*6c43f6c8STom Warren * Convert a device tree clock ID to our peripheral ID. They are mostly 798*6c43f6c8STom Warren * the same but we are very cautious so we check that a valid clock ID is 799*6c43f6c8STom Warren * provided. 800*6c43f6c8STom Warren * 801*6c43f6c8STom Warren * @param clk_id Clock ID according to tegra210 device tree binding 802*6c43f6c8STom Warren * @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid 803*6c43f6c8STom Warren */ 804*6c43f6c8STom Warren enum periph_id clk_id_to_periph_id(int clk_id) 805*6c43f6c8STom Warren { 806*6c43f6c8STom Warren if (clk_id > PERIPH_ID_COUNT) 807*6c43f6c8STom Warren return PERIPH_ID_NONE; 808*6c43f6c8STom Warren 809*6c43f6c8STom Warren switch (clk_id) { 810*6c43f6c8STom Warren case PERIPH_ID_RESERVED4: 811*6c43f6c8STom Warren case PERIPH_ID_RESERVED25: 812*6c43f6c8STom Warren case PERIPH_ID_RESERVED35: 813*6c43f6c8STom Warren case PERIPH_ID_RESERVED36: 814*6c43f6c8STom Warren case PERIPH_ID_RESERVED38: 815*6c43f6c8STom Warren case PERIPH_ID_RESERVED43: 816*6c43f6c8STom Warren case PERIPH_ID_RESERVED49: 817*6c43f6c8STom Warren case PERIPH_ID_RESERVED53: 818*6c43f6c8STom Warren case PERIPH_ID_RESERVED64: 819*6c43f6c8STom Warren case PERIPH_ID_RESERVED84: 820*6c43f6c8STom Warren case PERIPH_ID_RESERVED85: 821*6c43f6c8STom Warren case PERIPH_ID_RESERVED86: 822*6c43f6c8STom Warren case PERIPH_ID_RESERVED88: 823*6c43f6c8STom Warren case PERIPH_ID_RESERVED90: 824*6c43f6c8STom Warren case PERIPH_ID_RESERVED92: 825*6c43f6c8STom Warren case PERIPH_ID_RESERVED93: 826*6c43f6c8STom Warren case PERIPH_ID_RESERVED94: 827*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED2: 828*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED4: 829*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED17: 830*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED18: 831*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED19: 832*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED20: 833*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED21: 834*6c43f6c8STom Warren case PERIPH_ID_V_RESERVED22: 835*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED2: 836*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED3: 837*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED4: 838*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED5: 839*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED6: 840*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED7: 841*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED9: 842*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED10: 843*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED11: 844*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED12: 845*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED13: 846*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED15: 847*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED16: 848*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED17: 849*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED18: 850*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED19: 851*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED20: 852*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED23: 853*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED29: 854*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED30: 855*6c43f6c8STom Warren case PERIPH_ID_W_RESERVED31: 856*6c43f6c8STom Warren return PERIPH_ID_NONE; 857*6c43f6c8STom Warren default: 858*6c43f6c8STom Warren return clk_id; 859*6c43f6c8STom Warren } 860*6c43f6c8STom Warren } 861*6c43f6c8STom Warren #endif /* CONFIG_OF_CONTROL */ 862*6c43f6c8STom Warren 863*6c43f6c8STom Warren /* 864*6c43f6c8STom Warren * T210 redefines PLLP_OUT2 as PLLP_VCO/DIVP, so do different OUT1-4 setup here. 865*6c43f6c8STom Warren * PLLP_BASE/MISC/etc. is already set up for 408MHz in the BootROM. 866*6c43f6c8STom Warren */ 867*6c43f6c8STom Warren void tegra210_setup_pllp(void) 868*6c43f6c8STom Warren { 869*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 870*6c43f6c8STom Warren u32 reg; 871*6c43f6c8STom Warren 872*6c43f6c8STom Warren /* Set PLLP_OUT1, 3 & 4 freqs to 9.6, 102 & 204MHz */ 873*6c43f6c8STom Warren 874*6c43f6c8STom Warren /* OUT1 */ 875*6c43f6c8STom Warren /* Assert RSTN before enable */ 876*6c43f6c8STom Warren reg = PLLP_OUT1_RSTN_EN; 877*6c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[0]); 878*6c43f6c8STom Warren /* Set divisor and reenable */ 879*6c43f6c8STom Warren reg = (IN_408_OUT_9_6_DIVISOR << PLLP_OUT1_RATIO) 880*6c43f6c8STom Warren | PLLP_OUT1_OVR | PLLP_OUT1_CLKEN | PLLP_OUT1_RSTN_DIS; 881*6c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[0]); 882*6c43f6c8STom Warren 883*6c43f6c8STom Warren /* OUT3, 4 */ 884*6c43f6c8STom Warren /* Assert RSTN before enable */ 885*6c43f6c8STom Warren reg = PLLP_OUT4_RSTN_EN | PLLP_OUT3_RSTN_EN; 886*6c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[1]); 887*6c43f6c8STom Warren /* Set divisor and reenable */ 888*6c43f6c8STom Warren reg = (IN_408_OUT_204_DIVISOR << PLLP_OUT4_RATIO) 889*6c43f6c8STom Warren | PLLP_OUT4_OVR | PLLP_OUT4_CLKEN | PLLP_OUT4_RSTN_DIS 890*6c43f6c8STom Warren | (IN_408_OUT_102_DIVISOR << PLLP_OUT3_RATIO) 891*6c43f6c8STom Warren | PLLP_OUT3_OVR | PLLP_OUT3_CLKEN | PLLP_OUT3_RSTN_DIS; 892*6c43f6c8STom Warren writel(reg, &clkrst->crc_pll[CLOCK_ID_PERIPH].pll_out[1]); 893*6c43f6c8STom Warren 894*6c43f6c8STom Warren /* 895*6c43f6c8STom Warren * NOTE: If you want to change PLLP_OUT2 away from 204MHz, 896*6c43f6c8STom Warren * you can change PLLP_BASE DIVP here. Currently defaults 897*6c43f6c8STom Warren * to 1, which is 2^1, or 2, so PLLP_OUT2 is 204MHz. 898*6c43f6c8STom Warren * See Table 13 in section 5.1.4 in T210 TRM for more info. 899*6c43f6c8STom Warren */ 900*6c43f6c8STom Warren } 901*6c43f6c8STom Warren 902*6c43f6c8STom Warren void clock_early_init(void) 903*6c43f6c8STom Warren { 904*6c43f6c8STom Warren struct clk_rst_ctlr *clkrst = 905*6c43f6c8STom Warren (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 906*6c43f6c8STom Warren u32 data; 907*6c43f6c8STom Warren 908*6c43f6c8STom Warren tegra210_setup_pllp(); 909*6c43f6c8STom Warren 910*6c43f6c8STom Warren /* 911*6c43f6c8STom Warren * PLLC output frequency set to 600Mhz 912*6c43f6c8STom Warren * PLLD output frequency set to 925Mhz 913*6c43f6c8STom Warren */ 914*6c43f6c8STom Warren switch (clock_get_osc_freq()) { 915*6c43f6c8STom Warren case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */ 916*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 12, 0, 8); 917*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 12, 0, 12); 918*6c43f6c8STom Warren break; 919*6c43f6c8STom Warren 920*6c43f6c8STom Warren case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */ 921*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8); 922*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 26, 0, 12); 923*6c43f6c8STom Warren break; 924*6c43f6c8STom Warren 925*6c43f6c8STom Warren case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */ 926*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8); 927*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 925, 13, 0, 12); 928*6c43f6c8STom Warren break; 929*6c43f6c8STom Warren case CLOCK_OSC_FREQ_19_2: 930*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_CGENERAL, 125, 4, 0, 0); 931*6c43f6c8STom Warren clock_set_rate(CLOCK_ID_DISPLAY, 96, 2, 0, 12); 932*6c43f6c8STom Warren break; 933*6c43f6c8STom Warren default: 934*6c43f6c8STom Warren /* 935*6c43f6c8STom Warren * These are not supported. It is too early to print a 936*6c43f6c8STom Warren * message and the UART likely won't work anyway due to the 937*6c43f6c8STom Warren * oscillator being wrong. 938*6c43f6c8STom Warren */ 939*6c43f6c8STom Warren break; 940*6c43f6c8STom Warren } 941*6c43f6c8STom Warren 942*6c43f6c8STom Warren /* PLLC_MISC1: Turn IDDQ off. NOTE: T210 PLLC_MISC_1 maps to pll_misc */ 943*6c43f6c8STom Warren clrbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_misc, 944*6c43f6c8STom Warren (1 << PLLC_IDDQ)); 945*6c43f6c8STom Warren udelay(2); 946*6c43f6c8STom Warren 947*6c43f6c8STom Warren /* 948*6c43f6c8STom Warren * PLLC_MISC: Take PLLC out of reset. NOTE: T210 PLLC_MISC maps 949*6c43f6c8STom Warren * to pll_out[1] 950*6c43f6c8STom Warren */ 951*6c43f6c8STom Warren clrbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_out[1], 952*6c43f6c8STom Warren (1 << PLLC_RESET)); 953*6c43f6c8STom Warren udelay(2); 954*6c43f6c8STom Warren 955*6c43f6c8STom Warren /* PLLD_MISC: Set CLKENABLE and LOCK_DETECT bits */ 956*6c43f6c8STom Warren data = (1 << PLLD_ENABLE_CLK) | (1 << PLLD_EN_LCKDET); 957*6c43f6c8STom Warren writel(data, &clkrst->crc_pll[CLOCK_ID_DISPLAY].pll_misc); 958*6c43f6c8STom Warren udelay(2); 959*6c43f6c8STom Warren } 960*6c43f6c8STom Warren 961*6c43f6c8STom Warren void arch_timer_init(void) 962*6c43f6c8STom Warren { 963*6c43f6c8STom Warren struct sysctr_ctlr *sysctr = (struct sysctr_ctlr *)NV_PA_TSC_BASE; 964*6c43f6c8STom Warren u32 freq, val; 965*6c43f6c8STom Warren 966*6c43f6c8STom Warren freq = clock_get_rate(CLOCK_ID_OSC); 967*6c43f6c8STom Warren debug("%s: osc freq is %dHz [0x%08X]\n", __func__, freq, freq); 968*6c43f6c8STom Warren 969*6c43f6c8STom Warren /* ARM CNTFRQ */ 970*6c43f6c8STom Warren #ifndef CONFIG_ARM64 971*6c43f6c8STom Warren asm("mcr p15, 0, %0, c14, c0, 0\n" : : "r" (freq)); 972*6c43f6c8STom Warren #endif 973*6c43f6c8STom Warren 974*6c43f6c8STom Warren /* Only Tegra114+ has the System Counter regs */ 975*6c43f6c8STom Warren debug("%s: setting CNTFID0 to 0x%08X\n", __func__, freq); 976*6c43f6c8STom Warren writel(freq, &sysctr->cntfid0); 977*6c43f6c8STom Warren 978*6c43f6c8STom Warren val = readl(&sysctr->cntcr); 979*6c43f6c8STom Warren val |= TSC_CNTCR_ENABLE | TSC_CNTCR_HDBG; 980*6c43f6c8STom Warren writel(val, &sysctr->cntcr); 981*6c43f6c8STom Warren debug("%s: TSC CNTCR = 0x%08X\n", __func__, val); 982*6c43f6c8STom Warren } 983*6c43f6c8STom Warren 984*6c43f6c8STom Warren #define PLLE_SS_CNTL 0x68 985*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINCINTR(x) (((x) & 0x3f) << 24) 986*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINC(x) (((x) & 0xff) << 16) 987*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCINVERT (1 << 15) 988*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCCENTER (1 << 14) 989*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCBYP (1 << 12) 990*6c43f6c8STom Warren #define PLLE_SS_CNTL_INTERP_RESET (1 << 11) 991*6c43f6c8STom Warren #define PLLE_SS_CNTL_BYPASS_SS (1 << 10) 992*6c43f6c8STom Warren #define PLLE_SS_CNTL_SSCMAX(x) (((x) & 0x1ff) << 0) 993*6c43f6c8STom Warren 994*6c43f6c8STom Warren #define PLLE_BASE 0x0e8 995*6c43f6c8STom Warren #define PLLE_BASE_ENABLE (1 << 30) 996*6c43f6c8STom Warren #define PLLE_BASE_LOCK_OVERRIDE (1 << 29) 997*6c43f6c8STom Warren #define PLLE_BASE_PLDIV_CML(x) (((x) & 0xf) << 24) 998*6c43f6c8STom Warren #define PLLE_BASE_NDIV(x) (((x) & 0xff) << 8) 999*6c43f6c8STom Warren #define PLLE_BASE_MDIV(x) (((x) & 0xff) << 0) 1000*6c43f6c8STom Warren 1001*6c43f6c8STom Warren #define PLLE_MISC 0x0ec 1002*6c43f6c8STom Warren #define PLLE_MISC_IDDQ_SWCTL (1 << 14) 1003*6c43f6c8STom Warren #define PLLE_MISC_IDDQ_OVERRIDE (1 << 13) 1004*6c43f6c8STom Warren #define PLLE_MISC_LOCK_ENABLE (1 << 9) 1005*6c43f6c8STom Warren #define PLLE_MISC_PTS (1 << 8) 1006*6c43f6c8STom Warren #define PLLE_MISC_VREG_BG_CTRL(x) (((x) & 0x3) << 4) 1007*6c43f6c8STom Warren #define PLLE_MISC_VREG_CTRL(x) (((x) & 0x3) << 2) 1008*6c43f6c8STom Warren 1009*6c43f6c8STom Warren #define PLLE_AUX 0x48c 1010*6c43f6c8STom Warren #define PLLE_AUX_SEQ_ENABLE (1 << 24) 1011*6c43f6c8STom Warren #define PLLE_AUX_ENABLE_SWCTL (1 << 4) 1012*6c43f6c8STom Warren 1013*6c43f6c8STom Warren int tegra_plle_enable(void) 1014*6c43f6c8STom Warren { 1015*6c43f6c8STom Warren unsigned int m = 1, n = 200, cpcon = 13; 1016*6c43f6c8STom Warren u32 value; 1017*6c43f6c8STom Warren 1018*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_BASE); 1019*6c43f6c8STom Warren value &= ~PLLE_BASE_LOCK_OVERRIDE; 1020*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_BASE); 1021*6c43f6c8STom Warren 1022*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_AUX); 1023*6c43f6c8STom Warren value |= PLLE_AUX_ENABLE_SWCTL; 1024*6c43f6c8STom Warren value &= ~PLLE_AUX_SEQ_ENABLE; 1025*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX); 1026*6c43f6c8STom Warren 1027*6c43f6c8STom Warren udelay(1); 1028*6c43f6c8STom Warren 1029*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC); 1030*6c43f6c8STom Warren value |= PLLE_MISC_IDDQ_SWCTL; 1031*6c43f6c8STom Warren value &= ~PLLE_MISC_IDDQ_OVERRIDE; 1032*6c43f6c8STom Warren value |= PLLE_MISC_LOCK_ENABLE; 1033*6c43f6c8STom Warren value |= PLLE_MISC_PTS; 1034*6c43f6c8STom Warren value |= PLLE_MISC_VREG_BG_CTRL(3); 1035*6c43f6c8STom Warren value |= PLLE_MISC_VREG_CTRL(2); 1036*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_MISC); 1037*6c43f6c8STom Warren 1038*6c43f6c8STom Warren udelay(5); 1039*6c43f6c8STom Warren 1040*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1041*6c43f6c8STom Warren value |= PLLE_SS_CNTL_SSCBYP | PLLE_SS_CNTL_INTERP_RESET | 1042*6c43f6c8STom Warren PLLE_SS_CNTL_BYPASS_SS; 1043*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1044*6c43f6c8STom Warren 1045*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_BASE); 1046*6c43f6c8STom Warren value &= ~PLLE_BASE_PLDIV_CML(0xf); 1047*6c43f6c8STom Warren value &= ~PLLE_BASE_NDIV(0xff); 1048*6c43f6c8STom Warren value &= ~PLLE_BASE_MDIV(0xff); 1049*6c43f6c8STom Warren value |= PLLE_BASE_PLDIV_CML(cpcon); 1050*6c43f6c8STom Warren value |= PLLE_BASE_NDIV(n); 1051*6c43f6c8STom Warren value |= PLLE_BASE_MDIV(m); 1052*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_BASE); 1053*6c43f6c8STom Warren 1054*6c43f6c8STom Warren udelay(1); 1055*6c43f6c8STom Warren 1056*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_BASE); 1057*6c43f6c8STom Warren value |= PLLE_BASE_ENABLE; 1058*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_BASE); 1059*6c43f6c8STom Warren 1060*6c43f6c8STom Warren /* wait for lock */ 1061*6c43f6c8STom Warren udelay(300); 1062*6c43f6c8STom Warren 1063*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1064*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCINVERT; 1065*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCCENTER; 1066*6c43f6c8STom Warren 1067*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCINCINTR(0x3f); 1068*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCINC(0xff); 1069*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCMAX(0x1ff); 1070*6c43f6c8STom Warren 1071*6c43f6c8STom Warren value |= PLLE_SS_CNTL_SSCINCINTR(0x20); 1072*6c43f6c8STom Warren value |= PLLE_SS_CNTL_SSCINC(0x01); 1073*6c43f6c8STom Warren value |= PLLE_SS_CNTL_SSCMAX(0x25); 1074*6c43f6c8STom Warren 1075*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1076*6c43f6c8STom Warren 1077*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1078*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_SSCBYP; 1079*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_BYPASS_SS; 1080*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1081*6c43f6c8STom Warren 1082*6c43f6c8STom Warren udelay(1); 1083*6c43f6c8STom Warren 1084*6c43f6c8STom Warren value = readl(NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1085*6c43f6c8STom Warren value &= ~PLLE_SS_CNTL_INTERP_RESET; 1086*6c43f6c8STom Warren writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL); 1087*6c43f6c8STom Warren 1088*6c43f6c8STom Warren udelay(1); 1089*6c43f6c8STom Warren 1090*6c43f6c8STom Warren return 0; 1091*6c43f6c8STom Warren } 1092