109f455dcSMasahiro Yamada /* 2722e000cSTom Warren * (C) Copyright 2010-2015 3722e000cSTom Warren * NVIDIA Corporation <www.nvidia.com> 409f455dcSMasahiro Yamada * 5722e000cSTom Warren * SPDX-License-Identifier: GPL-2.0+ 609f455dcSMasahiro Yamada */ 709f455dcSMasahiro Yamada 809f455dcSMasahiro Yamada /* Tegra114 Clock control functions */ 909f455dcSMasahiro Yamada 1009f455dcSMasahiro Yamada #include <common.h> 1109f455dcSMasahiro Yamada #include <asm/io.h> 1209f455dcSMasahiro Yamada #include <asm/arch/clock.h> 1309f455dcSMasahiro Yamada #include <asm/arch/sysctr.h> 1409f455dcSMasahiro Yamada #include <asm/arch/tegra.h> 1509f455dcSMasahiro Yamada #include <asm/arch-tegra/clk_rst.h> 1609f455dcSMasahiro Yamada #include <asm/arch-tegra/timer.h> 1709f455dcSMasahiro Yamada #include <div64.h> 1809f455dcSMasahiro Yamada #include <fdtdec.h> 1909f455dcSMasahiro Yamada 2009f455dcSMasahiro Yamada /* 2109f455dcSMasahiro Yamada * Clock types that we can use as a source. The Tegra114 has muxes for the 2209f455dcSMasahiro Yamada * peripheral clocks, and in most cases there are four options for the clock 2309f455dcSMasahiro Yamada * source. This gives us a clock 'type' and exploits what commonality exists 2409f455dcSMasahiro Yamada * in the device. 2509f455dcSMasahiro Yamada * 2609f455dcSMasahiro Yamada * Letters are obvious, except for T which means CLK_M, and S which means the 2709f455dcSMasahiro Yamada * clock derived from 32KHz. Beware that CLK_M (also called OSC in the 2809f455dcSMasahiro Yamada * datasheet) and PLL_M are different things. The former is the basic 2909f455dcSMasahiro Yamada * clock supplied to the SOC from an external oscillator. The latter is the 3009f455dcSMasahiro Yamada * memory clock PLL. 3109f455dcSMasahiro Yamada * 3209f455dcSMasahiro Yamada * See definitions in clock_id in the header file. 3309f455dcSMasahiro Yamada */ 3409f455dcSMasahiro Yamada enum clock_type_id { 3509f455dcSMasahiro Yamada CLOCK_TYPE_AXPT, /* PLL_A, PLL_X, PLL_P, CLK_M */ 3609f455dcSMasahiro Yamada CLOCK_TYPE_MCPA, /* and so on */ 3709f455dcSMasahiro Yamada CLOCK_TYPE_MCPT, 3809f455dcSMasahiro Yamada CLOCK_TYPE_PCM, 3909f455dcSMasahiro Yamada CLOCK_TYPE_PCMT, 4009f455dcSMasahiro Yamada CLOCK_TYPE_PCMT16, 4109f455dcSMasahiro Yamada CLOCK_TYPE_PDCT, 4209f455dcSMasahiro Yamada CLOCK_TYPE_ACPT, 4309f455dcSMasahiro Yamada CLOCK_TYPE_ASPTE, 4409f455dcSMasahiro Yamada CLOCK_TYPE_PMDACD2T, 4509f455dcSMasahiro Yamada CLOCK_TYPE_PCST, 4609f455dcSMasahiro Yamada 4709f455dcSMasahiro Yamada CLOCK_TYPE_COUNT, 4809f455dcSMasahiro Yamada CLOCK_TYPE_NONE = -1, /* invalid clock type */ 4909f455dcSMasahiro Yamada }; 5009f455dcSMasahiro Yamada 5109f455dcSMasahiro Yamada enum { 5209f455dcSMasahiro Yamada CLOCK_MAX_MUX = 8 /* number of source options for each clock */ 5309f455dcSMasahiro Yamada }; 5409f455dcSMasahiro Yamada 5509f455dcSMasahiro Yamada /* 5609f455dcSMasahiro Yamada * Clock source mux for each clock type. This just converts our enum into 5709f455dcSMasahiro Yamada * a list of mux sources for use by the code. 5809f455dcSMasahiro Yamada * 5909f455dcSMasahiro Yamada * Note: 6009f455dcSMasahiro Yamada * The extra column in each clock source array is used to store the mask 6109f455dcSMasahiro Yamada * bits in its register for the source. 6209f455dcSMasahiro Yamada */ 6309f455dcSMasahiro Yamada #define CLK(x) CLOCK_ID_ ## x 6409f455dcSMasahiro Yamada static enum clock_id clock_source[CLOCK_TYPE_COUNT][CLOCK_MAX_MUX+1] = { 6509f455dcSMasahiro Yamada { CLK(AUDIO), CLK(XCPU), CLK(PERIPH), CLK(OSC), 6609f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 6709f455dcSMasahiro Yamada MASK_BITS_31_30}, 6809f455dcSMasahiro Yamada { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(AUDIO), 6909f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 7009f455dcSMasahiro Yamada MASK_BITS_31_30}, 7109f455dcSMasahiro Yamada { CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 7209f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 7309f455dcSMasahiro Yamada MASK_BITS_31_30}, 7409f455dcSMasahiro Yamada { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(NONE), 7509f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 7609f455dcSMasahiro Yamada MASK_BITS_31_30}, 7709f455dcSMasahiro Yamada { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), 7809f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 7909f455dcSMasahiro Yamada MASK_BITS_31_30}, 8009f455dcSMasahiro Yamada { CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), 8109f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 8209f455dcSMasahiro Yamada MASK_BITS_31_30}, 8309f455dcSMasahiro Yamada { CLK(PERIPH), CLK(DISPLAY), CLK(CGENERAL), CLK(OSC), 8409f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 8509f455dcSMasahiro Yamada MASK_BITS_31_30}, 8609f455dcSMasahiro Yamada { CLK(AUDIO), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), 8709f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 8809f455dcSMasahiro Yamada MASK_BITS_31_30}, 8909f455dcSMasahiro Yamada { CLK(AUDIO), CLK(SFROM32KHZ), CLK(PERIPH), CLK(OSC), 9009f455dcSMasahiro Yamada CLK(EPCI), CLK(NONE), CLK(NONE), CLK(NONE), 9109f455dcSMasahiro Yamada MASK_BITS_31_29}, 9209f455dcSMasahiro Yamada { CLK(PERIPH), CLK(MEMORY), CLK(DISPLAY), CLK(AUDIO), 9309f455dcSMasahiro Yamada CLK(CGENERAL), CLK(DISPLAY2), CLK(OSC), CLK(NONE), 9409f455dcSMasahiro Yamada MASK_BITS_31_29}, 9509f455dcSMasahiro Yamada { CLK(PERIPH), CLK(CGENERAL), CLK(SFROM32KHZ), CLK(OSC), 9609f455dcSMasahiro Yamada CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), 9709f455dcSMasahiro Yamada MASK_BITS_31_28} 9809f455dcSMasahiro Yamada }; 9909f455dcSMasahiro Yamada 10009f455dcSMasahiro Yamada /* 10109f455dcSMasahiro Yamada * Clock type for each peripheral clock source. We put the name in each 10209f455dcSMasahiro Yamada * record just so it is easy to match things up 10309f455dcSMasahiro Yamada */ 10409f455dcSMasahiro Yamada #define TYPE(name, type) type 10509f455dcSMasahiro Yamada static enum clock_type_id clock_periph_type[PERIPHC_COUNT] = { 10609f455dcSMasahiro Yamada /* 0x00 */ 10709f455dcSMasahiro Yamada TYPE(PERIPHC_I2S1, CLOCK_TYPE_AXPT), 10809f455dcSMasahiro Yamada TYPE(PERIPHC_I2S2, CLOCK_TYPE_AXPT), 10909f455dcSMasahiro Yamada TYPE(PERIPHC_SPDIF_OUT, CLOCK_TYPE_AXPT), 11009f455dcSMasahiro Yamada TYPE(PERIPHC_SPDIF_IN, CLOCK_TYPE_PCM), 11109f455dcSMasahiro Yamada TYPE(PERIPHC_PWM, CLOCK_TYPE_PCST), /* only PWM uses b29:28 */ 11209f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 11309f455dcSMasahiro Yamada TYPE(PERIPHC_SBC2, CLOCK_TYPE_PCMT), 11409f455dcSMasahiro Yamada TYPE(PERIPHC_SBC3, CLOCK_TYPE_PCMT), 11509f455dcSMasahiro Yamada 11609f455dcSMasahiro Yamada /* 0x08 */ 11709f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 11809f455dcSMasahiro Yamada TYPE(PERIPHC_I2C1, CLOCK_TYPE_PCMT16), 11909f455dcSMasahiro Yamada TYPE(PERIPHC_I2C5, CLOCK_TYPE_PCMT16), 12009f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 12109f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 12209f455dcSMasahiro Yamada TYPE(PERIPHC_SBC1, CLOCK_TYPE_PCMT), 12309f455dcSMasahiro Yamada TYPE(PERIPHC_DISP1, CLOCK_TYPE_PMDACD2T), 12409f455dcSMasahiro Yamada TYPE(PERIPHC_DISP2, CLOCK_TYPE_PMDACD2T), 12509f455dcSMasahiro Yamada 12609f455dcSMasahiro Yamada /* 0x10 */ 12709f455dcSMasahiro Yamada TYPE(PERIPHC_CVE, CLOCK_TYPE_PDCT), 12809f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 12909f455dcSMasahiro Yamada TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), 13009f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 13109f455dcSMasahiro Yamada TYPE(PERIPHC_SDMMC1, CLOCK_TYPE_PCMT), 13209f455dcSMasahiro Yamada TYPE(PERIPHC_SDMMC2, CLOCK_TYPE_PCMT), 13309f455dcSMasahiro Yamada TYPE(PERIPHC_G3D, CLOCK_TYPE_MCPA), 13409f455dcSMasahiro Yamada TYPE(PERIPHC_G2D, CLOCK_TYPE_MCPA), 13509f455dcSMasahiro Yamada 13609f455dcSMasahiro Yamada /* 0x18 */ 13709f455dcSMasahiro Yamada TYPE(PERIPHC_NDFLASH, CLOCK_TYPE_PCMT), 13809f455dcSMasahiro Yamada TYPE(PERIPHC_SDMMC4, CLOCK_TYPE_PCMT), 13909f455dcSMasahiro Yamada TYPE(PERIPHC_VFIR, CLOCK_TYPE_PCMT), 14009f455dcSMasahiro Yamada TYPE(PERIPHC_EPP, CLOCK_TYPE_MCPA), 14109f455dcSMasahiro Yamada TYPE(PERIPHC_MPE, CLOCK_TYPE_MCPA), 14209f455dcSMasahiro Yamada TYPE(PERIPHC_MIPI, CLOCK_TYPE_PCMT), /* MIPI base-band HSI */ 14309f455dcSMasahiro Yamada TYPE(PERIPHC_UART1, CLOCK_TYPE_PCMT), 14409f455dcSMasahiro Yamada TYPE(PERIPHC_UART2, CLOCK_TYPE_PCMT), 14509f455dcSMasahiro Yamada 14609f455dcSMasahiro Yamada /* 0x20 */ 14709f455dcSMasahiro Yamada TYPE(PERIPHC_HOST1X, CLOCK_TYPE_MCPA), 14809f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 14909f455dcSMasahiro Yamada TYPE(PERIPHC_TVO, CLOCK_TYPE_PDCT), 15009f455dcSMasahiro Yamada TYPE(PERIPHC_HDMI, CLOCK_TYPE_PMDACD2T), 15109f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 15209f455dcSMasahiro Yamada TYPE(PERIPHC_TVDAC, CLOCK_TYPE_PDCT), 15309f455dcSMasahiro Yamada TYPE(PERIPHC_I2C2, CLOCK_TYPE_PCMT16), 15409f455dcSMasahiro Yamada TYPE(PERIPHC_EMC, CLOCK_TYPE_MCPT), 15509f455dcSMasahiro Yamada 15609f455dcSMasahiro Yamada /* 0x28 */ 15709f455dcSMasahiro Yamada TYPE(PERIPHC_UART3, CLOCK_TYPE_PCMT), 15809f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 15909f455dcSMasahiro Yamada TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), 16009f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 16109f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 16209f455dcSMasahiro Yamada TYPE(PERIPHC_SBC4, CLOCK_TYPE_PCMT), 16309f455dcSMasahiro Yamada TYPE(PERIPHC_I2C3, CLOCK_TYPE_PCMT16), 16409f455dcSMasahiro Yamada TYPE(PERIPHC_SDMMC3, CLOCK_TYPE_PCMT), 16509f455dcSMasahiro Yamada 16609f455dcSMasahiro Yamada /* 0x30 */ 16709f455dcSMasahiro Yamada TYPE(PERIPHC_UART4, CLOCK_TYPE_PCMT), 16809f455dcSMasahiro Yamada TYPE(PERIPHC_UART5, CLOCK_TYPE_PCMT), 16909f455dcSMasahiro Yamada TYPE(PERIPHC_VDE, CLOCK_TYPE_PCMT), 17009f455dcSMasahiro Yamada TYPE(PERIPHC_OWR, CLOCK_TYPE_PCMT), 17109f455dcSMasahiro Yamada TYPE(PERIPHC_NOR, CLOCK_TYPE_PCMT), 17209f455dcSMasahiro Yamada TYPE(PERIPHC_CSITE, CLOCK_TYPE_PCMT), 17309f455dcSMasahiro Yamada TYPE(PERIPHC_I2S0, CLOCK_TYPE_AXPT), 17409f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 17509f455dcSMasahiro Yamada 17609f455dcSMasahiro Yamada /* 0x38h */ /* Jumps to reg offset 0x3B0h */ 17709f455dcSMasahiro Yamada TYPE(PERIPHC_G3D2, CLOCK_TYPE_MCPA), 17809f455dcSMasahiro Yamada TYPE(PERIPHC_MSELECT, CLOCK_TYPE_PCMT), 17909f455dcSMasahiro Yamada TYPE(PERIPHC_TSENSOR, CLOCK_TYPE_PCST), /* s/b PCTS */ 18009f455dcSMasahiro Yamada TYPE(PERIPHC_I2S3, CLOCK_TYPE_AXPT), 18109f455dcSMasahiro Yamada TYPE(PERIPHC_I2S4, CLOCK_TYPE_AXPT), 18209f455dcSMasahiro Yamada TYPE(PERIPHC_I2C4, CLOCK_TYPE_PCMT16), 18309f455dcSMasahiro Yamada TYPE(PERIPHC_SBC5, CLOCK_TYPE_PCMT), 18409f455dcSMasahiro Yamada TYPE(PERIPHC_SBC6, CLOCK_TYPE_PCMT), 18509f455dcSMasahiro Yamada 18609f455dcSMasahiro Yamada /* 0x40 */ 18709f455dcSMasahiro Yamada TYPE(PERIPHC_AUDIO, CLOCK_TYPE_ACPT), 18809f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 18909f455dcSMasahiro Yamada TYPE(PERIPHC_DAM0, CLOCK_TYPE_ACPT), 19009f455dcSMasahiro Yamada TYPE(PERIPHC_DAM1, CLOCK_TYPE_ACPT), 19109f455dcSMasahiro Yamada TYPE(PERIPHC_DAM2, CLOCK_TYPE_ACPT), 19209f455dcSMasahiro Yamada TYPE(PERIPHC_HDA2CODEC2X, CLOCK_TYPE_PCMT), 19309f455dcSMasahiro Yamada TYPE(PERIPHC_ACTMON, CLOCK_TYPE_PCST), /* MASK 31:30 */ 19409f455dcSMasahiro Yamada TYPE(PERIPHC_EXTPERIPH1, CLOCK_TYPE_ASPTE), 19509f455dcSMasahiro Yamada 19609f455dcSMasahiro Yamada /* 0x48 */ 19709f455dcSMasahiro Yamada TYPE(PERIPHC_EXTPERIPH2, CLOCK_TYPE_ASPTE), 19809f455dcSMasahiro Yamada TYPE(PERIPHC_EXTPERIPH3, CLOCK_TYPE_ASPTE), 19909f455dcSMasahiro Yamada TYPE(PERIPHC_NANDSPEED, CLOCK_TYPE_PCMT), 20009f455dcSMasahiro Yamada TYPE(PERIPHC_I2CSLOW, CLOCK_TYPE_PCST), /* MASK 31:30 */ 20109f455dcSMasahiro Yamada TYPE(PERIPHC_SYS, CLOCK_TYPE_NONE), 20209f455dcSMasahiro Yamada TYPE(PERIPHC_SPEEDO, CLOCK_TYPE_PCMT), 20309f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 20409f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 20509f455dcSMasahiro Yamada 20609f455dcSMasahiro Yamada /* 0x50 */ 20709f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 20809f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 20909f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 21009f455dcSMasahiro Yamada TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), 21109f455dcSMasahiro Yamada TYPE(PERIPHC_SATAOOB, CLOCK_TYPE_PCMT), /* offset 0x420h */ 21209f455dcSMasahiro Yamada TYPE(PERIPHC_SATA, CLOCK_TYPE_PCMT), 21309f455dcSMasahiro Yamada TYPE(PERIPHC_HDA, CLOCK_TYPE_PCMT), 21409f455dcSMasahiro Yamada }; 21509f455dcSMasahiro Yamada 21609f455dcSMasahiro Yamada /* 21709f455dcSMasahiro Yamada * This array translates a periph_id to a periphc_internal_id 21809f455dcSMasahiro Yamada * 21909f455dcSMasahiro Yamada * Not present/matched up: 22009f455dcSMasahiro Yamada * uint vi_sensor; _VI_SENSOR_0, 0x1A8 22109f455dcSMasahiro Yamada * SPDIF - which is both 0x08 and 0x0c 22209f455dcSMasahiro Yamada * 22309f455dcSMasahiro Yamada */ 22409f455dcSMasahiro Yamada #define NONE(name) (-1) 22509f455dcSMasahiro Yamada #define OFFSET(name, value) PERIPHC_ ## name 22609f455dcSMasahiro Yamada static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = { 22709f455dcSMasahiro Yamada /* Low word: 31:0 */ 22809f455dcSMasahiro Yamada NONE(CPU), 22909f455dcSMasahiro Yamada NONE(COP), 23009f455dcSMasahiro Yamada NONE(TRIGSYS), 23109f455dcSMasahiro Yamada NONE(RESERVED3), 23209f455dcSMasahiro Yamada NONE(RTC), 23309f455dcSMasahiro Yamada NONE(TMR), 23409f455dcSMasahiro Yamada PERIPHC_UART1, 23509f455dcSMasahiro Yamada PERIPHC_UART2, /* and vfir 0x68 */ 23609f455dcSMasahiro Yamada 23709f455dcSMasahiro Yamada /* 8 */ 23809f455dcSMasahiro Yamada NONE(GPIO), 23909f455dcSMasahiro Yamada PERIPHC_SDMMC2, 24009f455dcSMasahiro Yamada NONE(SPDIF), /* 0x08 and 0x0c, unclear which to use */ 24109f455dcSMasahiro Yamada PERIPHC_I2S1, 24209f455dcSMasahiro Yamada PERIPHC_I2C1, 24309f455dcSMasahiro Yamada PERIPHC_NDFLASH, 24409f455dcSMasahiro Yamada PERIPHC_SDMMC1, 24509f455dcSMasahiro Yamada PERIPHC_SDMMC4, 24609f455dcSMasahiro Yamada 24709f455dcSMasahiro Yamada /* 16 */ 24809f455dcSMasahiro Yamada NONE(RESERVED16), 24909f455dcSMasahiro Yamada PERIPHC_PWM, 25009f455dcSMasahiro Yamada PERIPHC_I2S2, 25109f455dcSMasahiro Yamada PERIPHC_EPP, 25209f455dcSMasahiro Yamada PERIPHC_VI, 25309f455dcSMasahiro Yamada PERIPHC_G2D, 25409f455dcSMasahiro Yamada NONE(USBD), 25509f455dcSMasahiro Yamada NONE(ISP), 25609f455dcSMasahiro Yamada 25709f455dcSMasahiro Yamada /* 24 */ 25809f455dcSMasahiro Yamada PERIPHC_G3D, 25909f455dcSMasahiro Yamada NONE(RESERVED25), 26009f455dcSMasahiro Yamada PERIPHC_DISP2, 26109f455dcSMasahiro Yamada PERIPHC_DISP1, 26209f455dcSMasahiro Yamada PERIPHC_HOST1X, 26309f455dcSMasahiro Yamada NONE(VCP), 26409f455dcSMasahiro Yamada PERIPHC_I2S0, 26509f455dcSMasahiro Yamada NONE(CACHE2), 26609f455dcSMasahiro Yamada 26709f455dcSMasahiro Yamada /* Middle word: 63:32 */ 26809f455dcSMasahiro Yamada NONE(MEM), 26909f455dcSMasahiro Yamada NONE(AHBDMA), 27009f455dcSMasahiro Yamada NONE(APBDMA), 27109f455dcSMasahiro Yamada NONE(RESERVED35), 27209f455dcSMasahiro Yamada NONE(RESERVED36), 27309f455dcSMasahiro Yamada NONE(STAT_MON), 27409f455dcSMasahiro Yamada NONE(RESERVED38), 27509f455dcSMasahiro Yamada NONE(RESERVED39), 27609f455dcSMasahiro Yamada 27709f455dcSMasahiro Yamada /* 40 */ 27809f455dcSMasahiro Yamada NONE(KFUSE), 27909f455dcSMasahiro Yamada NONE(SBC1), /* SBC1, 0x34, is this SPI1? */ 28009f455dcSMasahiro Yamada PERIPHC_NOR, 28109f455dcSMasahiro Yamada NONE(RESERVED43), 28209f455dcSMasahiro Yamada PERIPHC_SBC2, 28309f455dcSMasahiro Yamada NONE(RESERVED45), 28409f455dcSMasahiro Yamada PERIPHC_SBC3, 28509f455dcSMasahiro Yamada PERIPHC_I2C5, 28609f455dcSMasahiro Yamada 28709f455dcSMasahiro Yamada /* 48 */ 28809f455dcSMasahiro Yamada NONE(DSI), 28909f455dcSMasahiro Yamada PERIPHC_TVO, /* also CVE 0x40 */ 29009f455dcSMasahiro Yamada PERIPHC_MIPI, 29109f455dcSMasahiro Yamada PERIPHC_HDMI, 29209f455dcSMasahiro Yamada NONE(CSI), 29309f455dcSMasahiro Yamada PERIPHC_TVDAC, 29409f455dcSMasahiro Yamada PERIPHC_I2C2, 29509f455dcSMasahiro Yamada PERIPHC_UART3, 29609f455dcSMasahiro Yamada 29709f455dcSMasahiro Yamada /* 56 */ 29809f455dcSMasahiro Yamada NONE(RESERVED56), 29909f455dcSMasahiro Yamada PERIPHC_EMC, 30009f455dcSMasahiro Yamada NONE(USB2), 30109f455dcSMasahiro Yamada NONE(USB3), 30209f455dcSMasahiro Yamada PERIPHC_MPE, 30309f455dcSMasahiro Yamada PERIPHC_VDE, 30409f455dcSMasahiro Yamada NONE(BSEA), 30509f455dcSMasahiro Yamada NONE(BSEV), 30609f455dcSMasahiro Yamada 30709f455dcSMasahiro Yamada /* Upper word 95:64 */ 30809f455dcSMasahiro Yamada PERIPHC_SPEEDO, 30909f455dcSMasahiro Yamada PERIPHC_UART4, 31009f455dcSMasahiro Yamada PERIPHC_UART5, 31109f455dcSMasahiro Yamada PERIPHC_I2C3, 31209f455dcSMasahiro Yamada PERIPHC_SBC4, 31309f455dcSMasahiro Yamada PERIPHC_SDMMC3, 31409f455dcSMasahiro Yamada NONE(PCIE), 31509f455dcSMasahiro Yamada PERIPHC_OWR, 31609f455dcSMasahiro Yamada 31709f455dcSMasahiro Yamada /* 72 */ 31809f455dcSMasahiro Yamada NONE(AFI), 31909f455dcSMasahiro Yamada PERIPHC_CSITE, 32009f455dcSMasahiro Yamada NONE(PCIEXCLK), 32109f455dcSMasahiro Yamada NONE(AVPUCQ), 32209f455dcSMasahiro Yamada NONE(RESERVED76), 32309f455dcSMasahiro Yamada NONE(RESERVED77), 32409f455dcSMasahiro Yamada NONE(RESERVED78), 32509f455dcSMasahiro Yamada NONE(DTV), 32609f455dcSMasahiro Yamada 32709f455dcSMasahiro Yamada /* 80 */ 32809f455dcSMasahiro Yamada PERIPHC_NANDSPEED, 32909f455dcSMasahiro Yamada PERIPHC_I2CSLOW, 33009f455dcSMasahiro Yamada NONE(DSIB), 33109f455dcSMasahiro Yamada NONE(RESERVED83), 33209f455dcSMasahiro Yamada NONE(IRAMA), 33309f455dcSMasahiro Yamada NONE(IRAMB), 33409f455dcSMasahiro Yamada NONE(IRAMC), 33509f455dcSMasahiro Yamada NONE(IRAMD), 33609f455dcSMasahiro Yamada 33709f455dcSMasahiro Yamada /* 88 */ 33809f455dcSMasahiro Yamada NONE(CRAM2), 33909f455dcSMasahiro Yamada NONE(RESERVED89), 34009f455dcSMasahiro Yamada NONE(MDOUBLER), 34109f455dcSMasahiro Yamada NONE(RESERVED91), 34209f455dcSMasahiro Yamada NONE(SUSOUT), 34309f455dcSMasahiro Yamada NONE(RESERVED93), 34409f455dcSMasahiro Yamada NONE(RESERVED94), 34509f455dcSMasahiro Yamada NONE(RESERVED95), 34609f455dcSMasahiro Yamada 34709f455dcSMasahiro Yamada /* V word: 31:0 */ 34809f455dcSMasahiro Yamada NONE(CPUG), 34909f455dcSMasahiro Yamada NONE(CPULP), 35009f455dcSMasahiro Yamada PERIPHC_G3D2, 35109f455dcSMasahiro Yamada PERIPHC_MSELECT, 35209f455dcSMasahiro Yamada PERIPHC_TSENSOR, 35309f455dcSMasahiro Yamada PERIPHC_I2S3, 35409f455dcSMasahiro Yamada PERIPHC_I2S4, 35509f455dcSMasahiro Yamada PERIPHC_I2C4, 35609f455dcSMasahiro Yamada 35709f455dcSMasahiro Yamada /* 08 */ 35809f455dcSMasahiro Yamada PERIPHC_SBC5, 35909f455dcSMasahiro Yamada PERIPHC_SBC6, 36009f455dcSMasahiro Yamada PERIPHC_AUDIO, 36109f455dcSMasahiro Yamada NONE(APBIF), 36209f455dcSMasahiro Yamada PERIPHC_DAM0, 36309f455dcSMasahiro Yamada PERIPHC_DAM1, 36409f455dcSMasahiro Yamada PERIPHC_DAM2, 36509f455dcSMasahiro Yamada PERIPHC_HDA2CODEC2X, 36609f455dcSMasahiro Yamada 36709f455dcSMasahiro Yamada /* 16 */ 36809f455dcSMasahiro Yamada NONE(ATOMICS), 36909f455dcSMasahiro Yamada NONE(RESERVED17), 37009f455dcSMasahiro Yamada NONE(RESERVED18), 37109f455dcSMasahiro Yamada NONE(RESERVED19), 37209f455dcSMasahiro Yamada NONE(RESERVED20), 37309f455dcSMasahiro Yamada NONE(RESERVED21), 37409f455dcSMasahiro Yamada NONE(RESERVED22), 37509f455dcSMasahiro Yamada PERIPHC_ACTMON, 37609f455dcSMasahiro Yamada 37709f455dcSMasahiro Yamada /* 24 */ 37809f455dcSMasahiro Yamada NONE(RESERVED24), 37909f455dcSMasahiro Yamada NONE(RESERVED25), 38009f455dcSMasahiro Yamada NONE(RESERVED26), 38109f455dcSMasahiro Yamada NONE(RESERVED27), 38209f455dcSMasahiro Yamada PERIPHC_SATA, 38309f455dcSMasahiro Yamada PERIPHC_HDA, 38409f455dcSMasahiro Yamada NONE(RESERVED30), 38509f455dcSMasahiro Yamada NONE(RESERVED31), 38609f455dcSMasahiro Yamada 38709f455dcSMasahiro Yamada /* W word: 31:0 */ 38809f455dcSMasahiro Yamada NONE(HDA2HDMICODEC), 38909f455dcSMasahiro Yamada NONE(RESERVED1_SATACOLD), 39009f455dcSMasahiro Yamada NONE(RESERVED2_PCIERX0), 39109f455dcSMasahiro Yamada NONE(RESERVED3_PCIERX1), 39209f455dcSMasahiro Yamada NONE(RESERVED4_PCIERX2), 39309f455dcSMasahiro Yamada NONE(RESERVED5_PCIERX3), 39409f455dcSMasahiro Yamada NONE(RESERVED6_PCIERX4), 39509f455dcSMasahiro Yamada NONE(RESERVED7_PCIERX5), 39609f455dcSMasahiro Yamada 39709f455dcSMasahiro Yamada /* 40 */ 39809f455dcSMasahiro Yamada NONE(CEC), 39909f455dcSMasahiro Yamada NONE(PCIE2_IOBIST), 40009f455dcSMasahiro Yamada NONE(EMC_IOBIST), 40109f455dcSMasahiro Yamada NONE(HDMI_IOBIST), 40209f455dcSMasahiro Yamada NONE(SATA_IOBIST), 40309f455dcSMasahiro Yamada NONE(MIPI_IOBIST), 40409f455dcSMasahiro Yamada NONE(EMC1_IOBIST), 40509f455dcSMasahiro Yamada NONE(XUSB), 40609f455dcSMasahiro Yamada 40709f455dcSMasahiro Yamada /* 48 */ 40809f455dcSMasahiro Yamada NONE(CILAB), 40909f455dcSMasahiro Yamada NONE(CILCD), 41009f455dcSMasahiro Yamada NONE(CILE), 41109f455dcSMasahiro Yamada NONE(DSIA_LP), 41209f455dcSMasahiro Yamada NONE(DSIB_LP), 41309f455dcSMasahiro Yamada NONE(RESERVED21_ENTROPY), 41409f455dcSMasahiro Yamada NONE(RESERVED22_W), 41509f455dcSMasahiro Yamada NONE(RESERVED23_W), 41609f455dcSMasahiro Yamada 41709f455dcSMasahiro Yamada /* 56 */ 41809f455dcSMasahiro Yamada NONE(RESERVED24_W), 41909f455dcSMasahiro Yamada NONE(AMX0), 42009f455dcSMasahiro Yamada NONE(ADX0), 42109f455dcSMasahiro Yamada NONE(DVFS), 42209f455dcSMasahiro Yamada NONE(XUSB_SS), 42309f455dcSMasahiro Yamada NONE(EMC_DLL), 42409f455dcSMasahiro Yamada NONE(MC1), 42509f455dcSMasahiro Yamada NONE(EMC1), 42609f455dcSMasahiro Yamada }; 42709f455dcSMasahiro Yamada 42809f455dcSMasahiro Yamada /* 429722e000cSTom Warren * PLL divider shift/mask tables for all PLL IDs. 430722e000cSTom Warren */ 431722e000cSTom Warren struct clk_pll_info tegra_pll_info_table[CLOCK_ID_PLL_COUNT] = { 432722e000cSTom Warren /* 433722e000cSTom Warren * T114: some deviations from T2x/T30. 434722e000cSTom Warren * NOTE: If kcp_mask/kvco_mask == 0, they're not used in that PLL (PLLX, etc.) 435722e000cSTom Warren * If lock_ena or lock_det are >31, they're not used in that PLL. 436722e000cSTom Warren */ 437722e000cSTom Warren 438722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x0F, 439722e000cSTom Warren .lock_ena = 24, .lock_det = 27, .kcp_shift = 28, .kcp_mask = 3, .kvco_shift = 27, .kvco_mask = 1 }, /* PLLC */ 440722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 0, .p_mask = 0, 441722e000cSTom Warren .lock_ena = 0, .lock_det = 27, .kcp_shift = 1, .kcp_mask = 3, .kvco_shift = 0, .kvco_mask = 1 }, /* PLLM */ 442722e000cSTom Warren { .m_shift = 0, .m_mask = 0x1F, .n_shift = 8, .n_mask = 0x3FF, .p_shift = 20, .p_mask = 0x07, 443722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 8, .kcp_mask = 0xF, .kvco_shift = 4, .kvco_mask = 0xF }, /* PLLP */ 444722e000cSTom Warren { .m_shift = 0, .m_mask = 0x1F, .n_shift = 8, .n_mask = 0x3FF, .p_shift = 20, .p_mask = 0x07, 445722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 8, .kcp_mask = 0xF, .kvco_shift = 4, .kvco_mask = 0xF }, /* PLLA */ 446722e000cSTom Warren { .m_shift = 0, .m_mask = 0x1F, .n_shift = 8, .n_mask = 0x3FF, .p_shift = 20, .p_mask = 0x01, 447722e000cSTom Warren .lock_ena = 22, .lock_det = 27, .kcp_shift = 8, .kcp_mask = 0xF, .kvco_shift = 4, .kvco_mask = 0xF }, /* PLLU */ 448722e000cSTom Warren { .m_shift = 0, .m_mask = 0x1F, .n_shift = 8, .n_mask = 0x3FF, .p_shift = 20, .p_mask = 0x07, 449722e000cSTom Warren .lock_ena = 22, .lock_det = 27, .kcp_shift = 8, .kcp_mask = 0xF, .kvco_shift = 4, .kvco_mask = 0xF }, /* PLLD */ 450722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 20, .p_mask = 0x0F, 451722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 0, .kcp_mask = 0, .kvco_shift = 0, .kvco_mask = 0 }, /* PLLX */ 452722e000cSTom Warren { .m_shift = 0, .m_mask = 0xFF, .n_shift = 8, .n_mask = 0xFF, .p_shift = 0, .p_mask = 0, 453722e000cSTom Warren .lock_ena = 9, .lock_det = 11, .kcp_shift = 6, .kcp_mask = 3, .kvco_shift = 0, .kvco_mask = 1 }, /* PLLE */ 454722e000cSTom Warren { .m_shift = 0, .m_mask = 0x0F, .n_shift = 8, .n_mask = 0x3FF, .p_shift = 20, .p_mask = 0x07, 455722e000cSTom Warren .lock_ena = 18, .lock_det = 27, .kcp_shift = 8, .kcp_mask = 0xF, .kvco_shift = 4, .kvco_mask = 0xF }, /* PLLS (RESERVED) */ 456722e000cSTom Warren }; 457722e000cSTom Warren 458722e000cSTom Warren /* 45909f455dcSMasahiro Yamada * Get the oscillator frequency, from the corresponding hardware configuration 46009f455dcSMasahiro Yamada * field. Note that T30/T114 support 3 new higher freqs, but we map back 46109f455dcSMasahiro Yamada * to the old T20 freqs. Support for the higher oscillators is TBD. 46209f455dcSMasahiro Yamada */ 46309f455dcSMasahiro Yamada enum clock_osc_freq clock_get_osc_freq(void) 46409f455dcSMasahiro Yamada { 46509f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 46609f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 46709f455dcSMasahiro Yamada u32 reg; 46809f455dcSMasahiro Yamada 46909f455dcSMasahiro Yamada reg = readl(&clkrst->crc_osc_ctrl); 47009f455dcSMasahiro Yamada reg = (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT; 47109f455dcSMasahiro Yamada 47209f455dcSMasahiro Yamada if (reg & 1) /* one of the newer freqs */ 47309f455dcSMasahiro Yamada printf("Warning: OSC_FREQ is unsupported! (%d)\n", reg); 47409f455dcSMasahiro Yamada 47509f455dcSMasahiro Yamada return reg >> 2; /* Map to most common (T20) freqs */ 47609f455dcSMasahiro Yamada } 47709f455dcSMasahiro Yamada 47809f455dcSMasahiro Yamada /* Returns a pointer to the clock source register for a peripheral */ 47909f455dcSMasahiro Yamada u32 *get_periph_source_reg(enum periph_id periph_id) 48009f455dcSMasahiro Yamada { 48109f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 48209f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 48309f455dcSMasahiro Yamada enum periphc_internal_id internal_id; 48409f455dcSMasahiro Yamada 48509f455dcSMasahiro Yamada /* Coresight is a special case */ 48609f455dcSMasahiro Yamada if (periph_id == PERIPH_ID_CSI) 48709f455dcSMasahiro Yamada return &clkrst->crc_clk_src[PERIPH_ID_CSI+1]; 48809f455dcSMasahiro Yamada 48909f455dcSMasahiro Yamada assert(periph_id >= PERIPH_ID_FIRST && periph_id < PERIPH_ID_COUNT); 49009f455dcSMasahiro Yamada internal_id = periph_id_to_internal_id[periph_id]; 49109f455dcSMasahiro Yamada assert(internal_id != -1); 49209f455dcSMasahiro Yamada if (internal_id >= PERIPHC_VW_FIRST) { 49309f455dcSMasahiro Yamada internal_id -= PERIPHC_VW_FIRST; 49409f455dcSMasahiro Yamada return &clkrst->crc_clk_src_vw[internal_id]; 49509f455dcSMasahiro Yamada } else 49609f455dcSMasahiro Yamada return &clkrst->crc_clk_src[internal_id]; 49709f455dcSMasahiro Yamada } 49809f455dcSMasahiro Yamada 499*d0ad8a5cSStephen Warren int get_periph_clock_info(enum periph_id periph_id, int *mux_bits, 500*d0ad8a5cSStephen Warren int *divider_bits, int *type) 501*d0ad8a5cSStephen Warren { 502*d0ad8a5cSStephen Warren enum periphc_internal_id internal_id; 503*d0ad8a5cSStephen Warren 504*d0ad8a5cSStephen Warren if (!clock_periph_id_isvalid(periph_id)) 505*d0ad8a5cSStephen Warren return -1; 506*d0ad8a5cSStephen Warren 507*d0ad8a5cSStephen Warren internal_id = periph_id_to_internal_id[periph_id]; 508*d0ad8a5cSStephen Warren if (!periphc_internal_id_isvalid(internal_id)) 509*d0ad8a5cSStephen Warren return -1; 510*d0ad8a5cSStephen Warren 511*d0ad8a5cSStephen Warren *type = clock_periph_type[internal_id]; 512*d0ad8a5cSStephen Warren if (!clock_type_id_isvalid(*type)) 513*d0ad8a5cSStephen Warren return -1; 514*d0ad8a5cSStephen Warren 515*d0ad8a5cSStephen Warren *mux_bits = clock_source[*type][CLOCK_MAX_MUX]; 516*d0ad8a5cSStephen Warren 517*d0ad8a5cSStephen Warren if (*type == CLOCK_TYPE_PCMT16) 518*d0ad8a5cSStephen Warren *divider_bits = 16; 519*d0ad8a5cSStephen Warren else 520*d0ad8a5cSStephen Warren *divider_bits = 8; 521*d0ad8a5cSStephen Warren 522*d0ad8a5cSStephen Warren return 0; 523*d0ad8a5cSStephen Warren } 524*d0ad8a5cSStephen Warren 525*d0ad8a5cSStephen Warren enum clock_id get_periph_clock_id(enum periph_id periph_id, int source) 526*d0ad8a5cSStephen Warren { 527*d0ad8a5cSStephen Warren enum periphc_internal_id internal_id; 528*d0ad8a5cSStephen Warren int type; 529*d0ad8a5cSStephen Warren 530*d0ad8a5cSStephen Warren if (!clock_periph_id_isvalid(periph_id)) 531*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 532*d0ad8a5cSStephen Warren 533*d0ad8a5cSStephen Warren internal_id = periph_id_to_internal_id[periph_id]; 534*d0ad8a5cSStephen Warren if (!periphc_internal_id_isvalid(internal_id)) 535*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 536*d0ad8a5cSStephen Warren 537*d0ad8a5cSStephen Warren type = clock_periph_type[internal_id]; 538*d0ad8a5cSStephen Warren if (!clock_type_id_isvalid(type)) 539*d0ad8a5cSStephen Warren return CLOCK_ID_NONE; 540*d0ad8a5cSStephen Warren 541*d0ad8a5cSStephen Warren return clock_source[type][source]; 542*d0ad8a5cSStephen Warren } 543*d0ad8a5cSStephen Warren 54409f455dcSMasahiro Yamada /** 54509f455dcSMasahiro Yamada * Given a peripheral ID and the required source clock, this returns which 54609f455dcSMasahiro Yamada * value should be programmed into the source mux for that peripheral. 54709f455dcSMasahiro Yamada * 54809f455dcSMasahiro Yamada * There is special code here to handle the one source type with 5 sources. 54909f455dcSMasahiro Yamada * 55009f455dcSMasahiro Yamada * @param periph_id peripheral to start 55109f455dcSMasahiro Yamada * @param source PLL id of required parent clock 55209f455dcSMasahiro Yamada * @param mux_bits Set to number of bits in mux register: 2 or 4 55309f455dcSMasahiro Yamada * @param divider_bits Set to number of divider bits (8 or 16) 55409f455dcSMasahiro Yamada * @return mux value (0-4, or -1 if not found) 55509f455dcSMasahiro Yamada */ 55609f455dcSMasahiro Yamada int get_periph_clock_source(enum periph_id periph_id, 55709f455dcSMasahiro Yamada enum clock_id parent, int *mux_bits, int *divider_bits) 55809f455dcSMasahiro Yamada { 55909f455dcSMasahiro Yamada enum clock_type_id type; 560*d0ad8a5cSStephen Warren int mux, err; 56109f455dcSMasahiro Yamada 562*d0ad8a5cSStephen Warren err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type); 563*d0ad8a5cSStephen Warren assert(!err); 56409f455dcSMasahiro Yamada 56509f455dcSMasahiro Yamada for (mux = 0; mux < CLOCK_MAX_MUX; mux++) 56609f455dcSMasahiro Yamada if (clock_source[type][mux] == parent) 56709f455dcSMasahiro Yamada return mux; 56809f455dcSMasahiro Yamada 56909f455dcSMasahiro Yamada /* if we get here, either us or the caller has made a mistake */ 57009f455dcSMasahiro Yamada printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, 57109f455dcSMasahiro Yamada parent); 57209f455dcSMasahiro Yamada return -1; 57309f455dcSMasahiro Yamada } 57409f455dcSMasahiro Yamada 57509f455dcSMasahiro Yamada void clock_set_enable(enum periph_id periph_id, int enable) 57609f455dcSMasahiro Yamada { 57709f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 57809f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 57909f455dcSMasahiro Yamada u32 *clk; 58009f455dcSMasahiro Yamada u32 reg; 58109f455dcSMasahiro Yamada 58209f455dcSMasahiro Yamada /* Enable/disable the clock to this peripheral */ 58309f455dcSMasahiro Yamada assert(clock_periph_id_isvalid(periph_id)); 58409f455dcSMasahiro Yamada if ((int)periph_id < (int)PERIPH_ID_VW_FIRST) 58509f455dcSMasahiro Yamada clk = &clkrst->crc_clk_out_enb[PERIPH_REG(periph_id)]; 58609f455dcSMasahiro Yamada else 58709f455dcSMasahiro Yamada clk = &clkrst->crc_clk_out_enb_vw[PERIPH_REG(periph_id)]; 58809f455dcSMasahiro Yamada reg = readl(clk); 58909f455dcSMasahiro Yamada if (enable) 59009f455dcSMasahiro Yamada reg |= PERIPH_MASK(periph_id); 59109f455dcSMasahiro Yamada else 59209f455dcSMasahiro Yamada reg &= ~PERIPH_MASK(periph_id); 59309f455dcSMasahiro Yamada writel(reg, clk); 59409f455dcSMasahiro Yamada } 59509f455dcSMasahiro Yamada 59609f455dcSMasahiro Yamada void reset_set_enable(enum periph_id periph_id, int enable) 59709f455dcSMasahiro Yamada { 59809f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 59909f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 60009f455dcSMasahiro Yamada u32 *reset; 60109f455dcSMasahiro Yamada u32 reg; 60209f455dcSMasahiro Yamada 60309f455dcSMasahiro Yamada /* Enable/disable reset to the peripheral */ 60409f455dcSMasahiro Yamada assert(clock_periph_id_isvalid(periph_id)); 60509f455dcSMasahiro Yamada if (periph_id < PERIPH_ID_VW_FIRST) 60609f455dcSMasahiro Yamada reset = &clkrst->crc_rst_dev[PERIPH_REG(periph_id)]; 60709f455dcSMasahiro Yamada else 60809f455dcSMasahiro Yamada reset = &clkrst->crc_rst_dev_vw[PERIPH_REG(periph_id)]; 60909f455dcSMasahiro Yamada reg = readl(reset); 61009f455dcSMasahiro Yamada if (enable) 61109f455dcSMasahiro Yamada reg |= PERIPH_MASK(periph_id); 61209f455dcSMasahiro Yamada else 61309f455dcSMasahiro Yamada reg &= ~PERIPH_MASK(periph_id); 61409f455dcSMasahiro Yamada writel(reg, reset); 61509f455dcSMasahiro Yamada } 61609f455dcSMasahiro Yamada 6170f925822SMasahiro Yamada #if CONFIG_IS_ENABLED(OF_CONTROL) 61809f455dcSMasahiro Yamada /* 61909f455dcSMasahiro Yamada * Convert a device tree clock ID to our peripheral ID. They are mostly 62009f455dcSMasahiro Yamada * the same but we are very cautious so we check that a valid clock ID is 62109f455dcSMasahiro Yamada * provided. 62209f455dcSMasahiro Yamada * 62309f455dcSMasahiro Yamada * @param clk_id Clock ID according to tegra114 device tree binding 62409f455dcSMasahiro Yamada * @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid 62509f455dcSMasahiro Yamada */ 62609f455dcSMasahiro Yamada enum periph_id clk_id_to_periph_id(int clk_id) 62709f455dcSMasahiro Yamada { 62809f455dcSMasahiro Yamada if (clk_id > PERIPH_ID_COUNT) 62909f455dcSMasahiro Yamada return PERIPH_ID_NONE; 63009f455dcSMasahiro Yamada 63109f455dcSMasahiro Yamada switch (clk_id) { 63209f455dcSMasahiro Yamada case PERIPH_ID_RESERVED3: 63309f455dcSMasahiro Yamada case PERIPH_ID_RESERVED16: 63409f455dcSMasahiro Yamada case PERIPH_ID_RESERVED24: 63509f455dcSMasahiro Yamada case PERIPH_ID_RESERVED35: 63609f455dcSMasahiro Yamada case PERIPH_ID_RESERVED43: 63709f455dcSMasahiro Yamada case PERIPH_ID_RESERVED45: 63809f455dcSMasahiro Yamada case PERIPH_ID_RESERVED56: 63909f455dcSMasahiro Yamada case PERIPH_ID_RESERVED76: 64009f455dcSMasahiro Yamada case PERIPH_ID_RESERVED77: 64109f455dcSMasahiro Yamada case PERIPH_ID_RESERVED78: 64209f455dcSMasahiro Yamada case PERIPH_ID_RESERVED83: 64309f455dcSMasahiro Yamada case PERIPH_ID_RESERVED89: 64409f455dcSMasahiro Yamada case PERIPH_ID_RESERVED91: 64509f455dcSMasahiro Yamada case PERIPH_ID_RESERVED93: 64609f455dcSMasahiro Yamada case PERIPH_ID_RESERVED94: 64709f455dcSMasahiro Yamada case PERIPH_ID_RESERVED95: 64809f455dcSMasahiro Yamada return PERIPH_ID_NONE; 64909f455dcSMasahiro Yamada default: 65009f455dcSMasahiro Yamada return clk_id; 65109f455dcSMasahiro Yamada } 65209f455dcSMasahiro Yamada } 6530f925822SMasahiro Yamada #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */ 65409f455dcSMasahiro Yamada 65509f455dcSMasahiro Yamada void clock_early_init(void) 65609f455dcSMasahiro Yamada { 65709f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 65809f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 659722e000cSTom Warren struct clk_pll_info *pllinfo; 660722e000cSTom Warren u32 data; 66109f455dcSMasahiro Yamada 66209f455dcSMasahiro Yamada tegra30_set_up_pllp(); 66309f455dcSMasahiro Yamada 6648e1601d9SThierry Reding /* clear IDDQ before accessing any other PLLC registers */ 6658e1601d9SThierry Reding pllinfo = &tegra_pll_info_table[CLOCK_ID_CGENERAL]; 6668e1601d9SThierry Reding clrbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_misc, PLLC_IDDQ); 6678e1601d9SThierry Reding udelay(2); 6688e1601d9SThierry Reding 66909f455dcSMasahiro Yamada /* 67009f455dcSMasahiro Yamada * PLLC output frequency set to 600Mhz 67109f455dcSMasahiro Yamada * PLLD output frequency set to 925Mhz 67209f455dcSMasahiro Yamada */ 67309f455dcSMasahiro Yamada switch (clock_get_osc_freq()) { 67409f455dcSMasahiro Yamada case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */ 67509f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_CGENERAL, 600, 12, 0, 8); 67609f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_DISPLAY, 925, 12, 0, 12); 67709f455dcSMasahiro Yamada break; 67809f455dcSMasahiro Yamada 67909f455dcSMasahiro Yamada case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */ 68009f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8); 68109f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_DISPLAY, 925, 26, 0, 12); 68209f455dcSMasahiro Yamada break; 68309f455dcSMasahiro Yamada 68409f455dcSMasahiro Yamada case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */ 68509f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8); 68609f455dcSMasahiro Yamada clock_set_rate(CLOCK_ID_DISPLAY, 925, 13, 0, 12); 68709f455dcSMasahiro Yamada break; 68809f455dcSMasahiro Yamada case CLOCK_OSC_FREQ_19_2: 68909f455dcSMasahiro Yamada default: 69009f455dcSMasahiro Yamada /* 69109f455dcSMasahiro Yamada * These are not supported. It is too early to print a 69209f455dcSMasahiro Yamada * message and the UART likely won't work anyway due to the 69309f455dcSMasahiro Yamada * oscillator being wrong. 69409f455dcSMasahiro Yamada */ 69509f455dcSMasahiro Yamada break; 69609f455dcSMasahiro Yamada } 69709f455dcSMasahiro Yamada 69809f455dcSMasahiro Yamada /* PLLC_MISC2: Set dynramp_stepA/B. MISC2 maps to pll_out[1] */ 69909f455dcSMasahiro Yamada writel(0x00561600, &clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_out[1]); 70009f455dcSMasahiro Yamada 70109f455dcSMasahiro Yamada /* PLLC_MISC: Set LOCK_ENABLE */ 702722e000cSTom Warren pllinfo = &tegra_pll_info_table[CLOCK_ID_CGENERAL]; 703722e000cSTom Warren setbits_le32(&clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_misc, (1 << pllinfo->lock_ena)); 70409f455dcSMasahiro Yamada udelay(2); 70509f455dcSMasahiro Yamada 706722e000cSTom Warren /* PLLD_MISC: Set CLKENABLE, CPCON 12, LFCON 1, and enable lock */ 707722e000cSTom Warren pllinfo = &tegra_pll_info_table[CLOCK_ID_DISPLAY]; 708722e000cSTom Warren data = (12 << pllinfo->kcp_shift) | (1 << pllinfo->kvco_shift); 709722e000cSTom Warren data |= (1 << PLLD_CLKENABLE) | (1 << pllinfo->lock_ena); 710722e000cSTom Warren writel(data, &clkrst->crc_pll[CLOCK_ID_DISPLAY].pll_misc); 71109f455dcSMasahiro Yamada udelay(2); 71209f455dcSMasahiro Yamada } 71309f455dcSMasahiro Yamada 71409f455dcSMasahiro Yamada void arch_timer_init(void) 71509f455dcSMasahiro Yamada { 71609f455dcSMasahiro Yamada struct sysctr_ctlr *sysctr = (struct sysctr_ctlr *)NV_PA_TSC_BASE; 71709f455dcSMasahiro Yamada u32 freq, val; 71809f455dcSMasahiro Yamada 71997c02d87SThierry Reding freq = clock_get_rate(CLOCK_ID_CLK_M); 72097c02d87SThierry Reding debug("%s: clk_m freq is %dHz [0x%08X]\n", __func__, freq, freq); 72109f455dcSMasahiro Yamada 72209f455dcSMasahiro Yamada /* ARM CNTFRQ */ 72309f455dcSMasahiro Yamada asm("mcr p15, 0, %0, c14, c0, 0\n" : : "r" (freq)); 72409f455dcSMasahiro Yamada 72509f455dcSMasahiro Yamada /* Only T114 has the System Counter regs */ 72609f455dcSMasahiro Yamada debug("%s: setting CNTFID0 to 0x%08X\n", __func__, freq); 72709f455dcSMasahiro Yamada writel(freq, &sysctr->cntfid0); 72809f455dcSMasahiro Yamada 72909f455dcSMasahiro Yamada val = readl(&sysctr->cntcr); 73009f455dcSMasahiro Yamada val |= TSC_CNTCR_ENABLE | TSC_CNTCR_HDBG; 73109f455dcSMasahiro Yamada writel(val, &sysctr->cntcr); 73209f455dcSMasahiro Yamada debug("%s: TSC CNTCR = 0x%08X\n", __func__, val); 73309f455dcSMasahiro Yamada } 7346dbcc962SStephen Warren 7356dbcc962SStephen Warren struct periph_clk_init periph_clk_init_table[] = { 7366dbcc962SStephen Warren { PERIPH_ID_SBC1, CLOCK_ID_PERIPH }, 7376dbcc962SStephen Warren { PERIPH_ID_SBC2, CLOCK_ID_PERIPH }, 7386dbcc962SStephen Warren { PERIPH_ID_SBC3, CLOCK_ID_PERIPH }, 7396dbcc962SStephen Warren { PERIPH_ID_SBC4, CLOCK_ID_PERIPH }, 7406dbcc962SStephen Warren { PERIPH_ID_SBC5, CLOCK_ID_PERIPH }, 7416dbcc962SStephen Warren { PERIPH_ID_SBC6, CLOCK_ID_PERIPH }, 7426dbcc962SStephen Warren { PERIPH_ID_HOST1X, CLOCK_ID_PERIPH }, 7436dbcc962SStephen Warren { PERIPH_ID_DISP1, CLOCK_ID_CGENERAL }, 7446dbcc962SStephen Warren { PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH }, 7456dbcc962SStephen Warren { PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH }, 7466dbcc962SStephen Warren { PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH }, 7476dbcc962SStephen Warren { PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH }, 7486dbcc962SStephen Warren { PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH }, 7496dbcc962SStephen Warren { PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ }, 7506dbcc962SStephen Warren { PERIPH_ID_I2C1, CLOCK_ID_PERIPH }, 7516dbcc962SStephen Warren { PERIPH_ID_I2C2, CLOCK_ID_PERIPH }, 7526dbcc962SStephen Warren { PERIPH_ID_I2C3, CLOCK_ID_PERIPH }, 7536dbcc962SStephen Warren { PERIPH_ID_I2C4, CLOCK_ID_PERIPH }, 7546dbcc962SStephen Warren { PERIPH_ID_I2C5, CLOCK_ID_PERIPH }, 7556dbcc962SStephen Warren { -1, }, 7566dbcc962SStephen Warren }; 757