^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "clk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define PLL_BASE_BYPASS BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define PLL_BASE_ENABLE BIT(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define PLL_BASE_REF_ENABLE BIT(29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define PLL_BASE_OVERRIDE BIT(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define PLL_BASE_DIVP_SHIFT 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define PLL_BASE_DIVP_WIDTH 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define PLL_BASE_DIVN_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define PLL_BASE_DIVN_WIDTH 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define PLL_BASE_DIVM_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define PLL_BASE_DIVM_WIDTH 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define PLLU_POST_DIVP_MASK 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define PLL_MISC_DCCON_SHIFT 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define PLL_MISC_CPCON_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define PLL_MISC_CPCON_WIDTH 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define PLL_MISC_CPCON_MASK ((1 << PLL_MISC_CPCON_WIDTH) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define PLL_MISC_LFCON_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define PLL_MISC_LFCON_WIDTH 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define PLL_MISC_LFCON_MASK ((1 << PLL_MISC_LFCON_WIDTH) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define PLL_MISC_VCOCON_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define PLL_MISC_VCOCON_WIDTH 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define PLL_MISC_VCOCON_MASK ((1 << PLL_MISC_VCOCON_WIDTH) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define OUT_OF_TABLE_CPCON 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define PMC_PLLP_WB0_OVERRIDE 0xf8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define PLL_POST_LOCK_DELAY 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define PLLDU_LFCON_SET_DIVN 600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define PLLE_BASE_DIVCML_SHIFT 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define PLLE_BASE_DIVCML_MASK 0xf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define PLLE_BASE_DIVP_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define PLLE_BASE_DIVP_WIDTH 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define PLLE_BASE_DIVN_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define PLLE_BASE_DIVN_WIDTH 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define PLLE_BASE_DIVM_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define PLLE_BASE_DIVM_WIDTH 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define PLLE_BASE_ENABLE BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define PLLE_MISC_SETUP_BASE_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define PLLE_MISC_SETUP_BASE_MASK (0xffff << PLLE_MISC_SETUP_BASE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PLLE_MISC_LOCK_ENABLE BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define PLLE_MISC_READY BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define PLLE_MISC_SETUP_EX_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define PLLE_MISC_SETUP_EX_MASK (3 << PLLE_MISC_SETUP_EX_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define PLLE_MISC_SETUP_MASK (PLLE_MISC_SETUP_BASE_MASK | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) PLLE_MISC_SETUP_EX_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define PLLE_MISC_SETUP_VALUE (7 << PLLE_MISC_SETUP_BASE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define PLLE_SS_CTRL 0x68
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define PLLE_SS_CNTL_BYPASS_SS BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define PLLE_SS_CNTL_INTERP_RESET BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define PLLE_SS_CNTL_SSC_BYP BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define PLLE_SS_CNTL_CENTER BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define PLLE_SS_CNTL_INVERT BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define PLLE_SS_DISABLE (PLLE_SS_CNTL_BYPASS_SS | PLLE_SS_CNTL_INTERP_RESET |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) PLLE_SS_CNTL_SSC_BYP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define PLLE_SS_MAX_MASK 0x1ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define PLLE_SS_MAX_VAL_TEGRA114 0x25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define PLLE_SS_MAX_VAL_TEGRA210 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define PLLE_SS_INC_MASK (0xff << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define PLLE_SS_INC_VAL (0x1 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define PLLE_SS_INCINTRV_MASK (0x3f << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define PLLE_SS_INCINTRV_VAL_TEGRA114 (0x20 << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define PLLE_SS_INCINTRV_VAL_TEGRA210 (0x23 << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define PLLE_SS_COEFFICIENTS_MASK \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) (PLLE_SS_MAX_MASK | PLLE_SS_INC_MASK | PLLE_SS_INCINTRV_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define PLLE_SS_COEFFICIENTS_VAL_TEGRA114 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) (PLLE_SS_MAX_VAL_TEGRA114 | PLLE_SS_INC_VAL |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) PLLE_SS_INCINTRV_VAL_TEGRA114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define PLLE_SS_COEFFICIENTS_VAL_TEGRA210 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) (PLLE_SS_MAX_VAL_TEGRA210 | PLLE_SS_INC_VAL |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) PLLE_SS_INCINTRV_VAL_TEGRA210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define PLLE_AUX_PLLP_SEL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define PLLE_AUX_USE_LOCKDET BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define PLLE_AUX_ENABLE_SWCTL BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define PLLE_AUX_SS_SWCTL BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define PLLE_AUX_SEQ_ENABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define PLLE_AUX_SEQ_START_STATE BIT(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define PLLE_AUX_PLLRE_SEL BIT(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define PLLE_AUX_SS_SEQ_INCLUDE BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define XUSBIO_PLL_CFG0 0x51c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define XUSBIO_PLL_CFG0_SEQ_ENABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define XUSBIO_PLL_CFG0_SEQ_START_STATE BIT(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SATA_PLL_CFG0 0x490
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define SATA_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SATA_PLL_CFG0_PADPLL_USE_LOCKDET BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define SATA_PLL_CFG0_SEQ_ENABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SATA_PLL_CFG0_SEQ_START_STATE BIT(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define PLLE_MISC_PLLE_PTS BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define PLLE_MISC_IDDQ_SW_VALUE BIT(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define PLLE_MISC_IDDQ_SW_CTRL BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define PLLE_MISC_VREG_BG_CTRL_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define PLLE_MISC_VREG_BG_CTRL_MASK (3 << PLLE_MISC_VREG_BG_CTRL_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define PLLE_MISC_VREG_CTRL_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define PLLE_MISC_VREG_CTRL_MASK (2 << PLLE_MISC_VREG_CTRL_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define PLLCX_MISC_STROBE BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define PLLCX_MISC_RESET BIT(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define PLLCX_MISC_SDM_DIV_SHIFT 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define PLLCX_MISC_SDM_DIV_MASK (0x3 << PLLCX_MISC_SDM_DIV_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define PLLCX_MISC_FILT_DIV_SHIFT 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define PLLCX_MISC_FILT_DIV_MASK (0x3 << PLLCX_MISC_FILT_DIV_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define PLLCX_MISC_ALPHA_SHIFT 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define PLLCX_MISC_DIV_LOW_RANGE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ((0x1 << PLLCX_MISC_SDM_DIV_SHIFT) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) (0x1 << PLLCX_MISC_FILT_DIV_SHIFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define PLLCX_MISC_DIV_HIGH_RANGE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ((0x2 << PLLCX_MISC_SDM_DIV_SHIFT) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) (0x2 << PLLCX_MISC_FILT_DIV_SHIFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define PLLCX_MISC_COEF_LOW_RANGE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) ((0x14 << PLLCX_MISC_KA_SHIFT) | (0x38 << PLLCX_MISC_KB_SHIFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define PLLCX_MISC_KA_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define PLLCX_MISC_KB_SHIFT 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define PLLCX_MISC_DEFAULT (PLLCX_MISC_COEF_LOW_RANGE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) (0x19 << PLLCX_MISC_ALPHA_SHIFT) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) PLLCX_MISC_DIV_LOW_RANGE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) PLLCX_MISC_RESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define PLLCX_MISC1_DEFAULT 0x000d2308
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define PLLCX_MISC2_DEFAULT 0x30211200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define PLLCX_MISC3_DEFAULT 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define PMC_SATA_PWRGT 0x1ac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define PLLSS_MISC_KCP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define PLLSS_MISC_KVCO 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define PLLSS_MISC_SETUP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define PLLSS_EN_SDM 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define PLLSS_EN_SSC 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define PLLSS_EN_DITHER2 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define PLLSS_EN_DITHER 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define PLLSS_SDM_RESET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define PLLSS_CLAMP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define PLLSS_SDM_SSC_MAX 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define PLLSS_SDM_SSC_MIN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define PLLSS_SDM_SSC_STEP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define PLLSS_SDM_DIN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define PLLSS_MISC_DEFAULT ((PLLSS_MISC_KCP << 25) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) (PLLSS_MISC_KVCO << 24) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) PLLSS_MISC_SETUP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define PLLSS_CFG_DEFAULT ((PLLSS_EN_SDM << 31) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) (PLLSS_EN_SSC << 30) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (PLLSS_EN_DITHER2 << 29) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) (PLLSS_EN_DITHER << 28) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (PLLSS_SDM_RESET) << 27 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) (PLLSS_CLAMP << 22))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define PLLSS_CTRL1_DEFAULT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ((PLLSS_SDM_SSC_MAX << 16) | PLLSS_SDM_SSC_MIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define PLLSS_CTRL2_DEFAULT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ((PLLSS_SDM_SSC_STEP << 16) | PLLSS_SDM_DIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define PLLSS_LOCK_OVERRIDE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define PLLSS_REF_SRC_SEL_SHIFT 25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define PLLSS_REF_SRC_SEL_MASK (3 << PLLSS_REF_SRC_SEL_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define UTMIP_PLL_CFG1 0x484
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define UTMIP_PLL_CFG2 0x488
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xfff) << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERUP BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP BIT(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define UTMIP_PLL_CFG2_PHY_XTAL_CLOCKEN BIT(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define UTMIPLL_HW_PWRDN_CFG0 0x52c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define PLLU_HW_PWRDN_CFG0 0x530
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define PLLU_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define PLLU_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define XUSB_PLL_CFG0 0x534
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY 0x3ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define XUSB_PLL_CFG0_PLLU_LOCK_DLY (0x3ff << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #define PLLU_BASE_CLKENABLE_USB BIT(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define PLLU_BASE_OVERRIDE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define pll_readl(offset, p) readl_relaxed(p->clk_base + offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define pll_readl_base(p) pll_readl(p->params->base_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define pll_readl_misc(p) pll_readl(p->params->misc_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define pll_override_readl(offset, p) readl_relaxed(p->pmc + offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define pll_readl_sdm_din(p) pll_readl(p->params->sdm_din_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define pll_readl_sdm_ctrl(p) pll_readl(p->params->sdm_ctrl_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define pll_writel(val, offset, p) writel_relaxed(val, p->clk_base + offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define pll_writel_base(val, p) pll_writel(val, p->params->base_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define pll_writel_misc(val, p) pll_writel(val, p->params->misc_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define pll_override_writel(val, offset, p) writel(val, p->pmc + offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define pll_writel_sdm_din(val, p) pll_writel(val, p->params->sdm_din_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define pll_writel_sdm_ctrl(val, p) pll_writel(val, p->params->sdm_ctrl_reg, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define mask(w) ((1 << (w)) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define divm_mask(p) mask(p->params->div_nmp->divm_width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define divn_mask(p) mask(p->params->div_nmp->divn_width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) #define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) mask(p->params->div_nmp->divp_width))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define sdm_din_mask(p) p->params->sdm_din_mask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define sdm_en_mask(p) p->params->sdm_ctrl_en_mask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define divm_shift(p) (p)->params->div_nmp->divm_shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #define divn_shift(p) (p)->params->div_nmp->divn_shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define divp_shift(p) (p)->params->div_nmp->divp_shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define divm_mask_shifted(p) (divm_mask(p) << divm_shift(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define divn_mask_shifted(p) (divn_mask(p) << divn_shift(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define divp_mask_shifted(p) (divp_mask(p) << divp_shift(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) #define divm_max(p) (divm_mask(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #define divn_max(p) (divn_mask(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define divp_max(p) (1 << (divp_mask(p)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static struct div_nmp default_nmp = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .divn_shift = PLL_BASE_DIVN_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .divn_width = PLL_BASE_DIVN_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .divm_shift = PLL_BASE_DIVM_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .divm_width = PLL_BASE_DIVM_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .divp_shift = PLL_BASE_DIVP_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .divp_width = PLL_BASE_DIVP_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static void clk_pll_enable_lock(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (!(pll->params->flags & TEGRA_PLL_USE_LOCK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (!(pll->params->flags & TEGRA_PLL_HAS_LOCK_ENABLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) val |= BIT(pll->params->lock_enable_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) static int clk_pll_wait_for_lock(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) u32 val, lock_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) void __iomem *lock_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (!(pll->params->flags & TEGRA_PLL_USE_LOCK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) udelay(pll->params->lock_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) lock_addr = pll->clk_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (pll->params->flags & TEGRA_PLL_LOCK_MISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) lock_addr += pll->params->misc_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) lock_addr += pll->params->base_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) lock_mask = pll->params->lock_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) for (i = 0; i < pll->params->lock_delay; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) val = readl_relaxed(lock_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if ((val & lock_mask) == lock_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) udelay(PLL_POST_LOCK_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) udelay(2); /* timeout = 2 * lock time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) pr_err("%s: Timed out waiting for pll %s lock\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) clk_hw_get_name(&pll->hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) int tegra_pll_wait_for_lock(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) static bool pllm_clk_is_gated_by_pmc(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) u32 val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return (val & PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) !(val & PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) static int clk_pll_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) * Power Management Controller (PMC) can override the PLLM clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) * settings, including the enable-state. The PLLM is enabled when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * PLLM's CaR state is ON and when PLLM isn't gated by PMC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if ((pll->params->flags & TEGRA_PLLM) && pllm_clk_is_gated_by_pmc(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return val & PLL_BASE_ENABLE ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) static void _clk_pll_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (pll->params->iddq_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) val = pll_readl(pll->params->iddq_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) val &= ~BIT(pll->params->iddq_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) pll_writel(val, pll->params->iddq_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) udelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (pll->params->reset_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) val = pll_readl(pll->params->reset_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) val &= ~BIT(pll->params->reset_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) pll_writel(val, pll->params->reset_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) clk_pll_enable_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (pll->params->flags & TEGRA_PLL_BYPASS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) val &= ~PLL_BASE_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) val |= PLL_BASE_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (pll->params->flags & TEGRA_PLLM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) static void _clk_pll_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (pll->params->flags & TEGRA_PLL_BYPASS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) val &= ~PLL_BASE_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) val &= ~PLL_BASE_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (pll->params->flags & TEGRA_PLLM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (pll->params->reset_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) val = pll_readl(pll->params->reset_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) val |= BIT(pll->params->reset_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) pll_writel(val, pll->params->reset_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (pll->params->iddq_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) val = pll_readl(pll->params->iddq_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) val |= BIT(pll->params->iddq_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) pll_writel(val, pll->params->iddq_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) udelay(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) static void pll_clk_start_ss(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) val |= pll->params->ssc_ctrl_en_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) pll_writel(val, pll->params->ssc_ctrl_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) static void pll_clk_stop_ss(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) val &= ~pll->params->ssc_ctrl_en_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) pll_writel(val, pll->params->ssc_ctrl_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) static int clk_pll_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) pll_clk_start_ss(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static void clk_pll_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) pll_clk_stop_ss(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) _clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static int _p_div_to_hw(struct clk_hw *hw, u8 p_div)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) const struct pdiv_map *p_tohw = pll->params->pdiv_tohw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if (p_tohw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) while (p_tohw->pdiv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (p_div <= p_tohw->pdiv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return p_tohw->hw_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) p_tohw++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) int tegra_pll_p_div_to_hw(struct tegra_clk_pll *pll, u8 p_div)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) return _p_div_to_hw(&pll->hw, p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static int _hw_to_p_div(struct clk_hw *hw, u8 p_div_hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) const struct pdiv_map *p_tohw = pll->params->pdiv_tohw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (p_tohw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) while (p_tohw->pdiv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) if (p_div_hw == p_tohw->hw_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) return p_tohw->pdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) p_tohw++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) return 1 << p_div_hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) static int _get_table_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) unsigned long rate, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct tegra_clk_pll_freq_table *sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) int p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) for (sel = pll->params->freq_table; sel->input_rate != 0; sel++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (sel->input_rate == parent_rate &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) sel->output_rate == rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (sel->input_rate == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (pll->params->pdiv_tohw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) p = _p_div_to_hw(hw, sel->p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (p < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) p = ilog2(sel->p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) cfg->input_rate = sel->input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) cfg->output_rate = sel->output_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) cfg->m = sel->m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) cfg->n = sel->n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) cfg->p = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) cfg->cpcon = sel->cpcon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) cfg->sdm_data = sel->sdm_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) static int _calc_rate(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) unsigned long rate, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) unsigned long cfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) u32 p_div = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) switch (parent_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) case 12000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) case 26000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) case 13000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2600000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) case 16800000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) case 19200000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) cfreq = (rate <= 1200000 * 1000) ? 1200000 : 2400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) case 9600000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) case 28800000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) * PLL_P_OUT1 rate is not listed in PLLA table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) cfreq = parent_rate / (parent_rate / 1000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) pr_err("%s Unexpected reference rate %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) __func__, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) /* Raise VCO to guarantee 0.5% accuracy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) for (cfg->output_rate = rate; cfg->output_rate < 200 * cfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) cfg->output_rate <<= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) p_div++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) cfg->m = parent_rate / cfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) cfg->n = cfg->output_rate / cfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) cfg->cpcon = OUT_OF_TABLE_CPCON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (cfg->m == 0 || cfg->m > divm_max(pll) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) cfg->n > divn_max(pll) || (1 << p_div) > divp_max(pll) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) cfg->output_rate > pll->params->vco_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) cfg->output_rate = cfg->n * DIV_ROUND_UP(parent_rate, cfg->m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) cfg->output_rate >>= p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) if (pll->params->pdiv_tohw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) ret = _p_div_to_hw(hw, 1 << p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) cfg->p = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) cfg->p = p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * SDM (Sigma Delta Modulator) divisor is 16-bit 2's complement signed number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) * within (-2^12 ... 2^12-1) range. Represented in PLL data structure as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) * unsigned 16-bit value, with "0" divisor mapped to 0xFFFF. Data "0" is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * to indicate that SDM is disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) * Effective ndiv value when SDM is enabled: ndiv + 1/2 + sdm_din/2^13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) static void clk_pll_set_sdm_data(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct tegra_clk_pll_freq_table *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) bool enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (!pll->params->sdm_din_reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) if (cfg->sdm_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) val = pll_readl_sdm_din(pll) & (~sdm_din_mask(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) val |= sdin_data_to_din(cfg->sdm_data) & sdm_din_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) pll_writel_sdm_din(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) val = pll_readl_sdm_ctrl(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) enabled = (val & sdm_en_mask(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (cfg->sdm_data == 0 && enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) val &= ~pll->params->sdm_ctrl_en_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (cfg->sdm_data != 0 && !enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) val |= pll->params->sdm_ctrl_en_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) pll_writel_sdm_ctrl(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) static void _update_pll_mnp(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) struct tegra_clk_pll_freq_table *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) struct tegra_clk_pll_params *params = pll->params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) struct div_nmp *div_nmp = params->div_nmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) if ((params->flags & (TEGRA_PLLM | TEGRA_PLLMB)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) val = pll_override_readl(params->pmc_divp_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) val &= ~(divp_mask(pll) << div_nmp->override_divp_shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) val |= cfg->p << div_nmp->override_divp_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) pll_override_writel(val, params->pmc_divp_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) val = pll_override_readl(params->pmc_divnm_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) val &= ~((divm_mask(pll) << div_nmp->override_divm_shift) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) (divn_mask(pll) << div_nmp->override_divn_shift));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) val |= (cfg->m << div_nmp->override_divm_shift) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) (cfg->n << div_nmp->override_divn_shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) pll_override_writel(val, params->pmc_divnm_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) val &= ~(divm_mask_shifted(pll) | divn_mask_shifted(pll) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) divp_mask_shifted(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) val |= (cfg->m << divm_shift(pll)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) (cfg->n << divn_shift(pll)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) (cfg->p << divp_shift(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) clk_pll_set_sdm_data(&pll->hw, cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) static void _get_pll_mnp(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct tegra_clk_pll_freq_table *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct tegra_clk_pll_params *params = pll->params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) struct div_nmp *div_nmp = params->div_nmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) *cfg = (struct tegra_clk_pll_freq_table) { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) if ((params->flags & (TEGRA_PLLM | TEGRA_PLLMB)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) val = pll_override_readl(params->pmc_divp_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) cfg->p = (val >> div_nmp->override_divp_shift) & divp_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) val = pll_override_readl(params->pmc_divnm_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) cfg->m = (val >> div_nmp->override_divm_shift) & divm_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) cfg->n = (val >> div_nmp->override_divn_shift) & divn_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) cfg->m = (val >> div_nmp->divm_shift) & divm_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) cfg->n = (val >> div_nmp->divn_shift) & divn_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) cfg->p = (val >> div_nmp->divp_shift) & divp_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if (pll->params->sdm_din_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (sdm_en_mask(pll) & pll_readl_sdm_ctrl(pll)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) val = pll_readl_sdm_din(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) val &= sdm_din_mask(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) cfg->sdm_data = sdin_din_to_data(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) static void _update_pll_cpcon(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) unsigned long rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) val &= ~(PLL_MISC_CPCON_MASK << PLL_MISC_CPCON_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) val |= cfg->cpcon << PLL_MISC_CPCON_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) if (pll->params->flags & TEGRA_PLL_SET_LFCON) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) val &= ~(PLL_MISC_LFCON_MASK << PLL_MISC_LFCON_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (cfg->n >= PLLDU_LFCON_SET_DIVN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) val |= 1 << PLL_MISC_LFCON_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) } else if (pll->params->flags & TEGRA_PLL_SET_DCCON) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) val &= ~(1 << PLL_MISC_DCCON_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) if (rate >= (pll->params->vco_max >> 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) val |= 1 << PLL_MISC_DCCON_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) unsigned long rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) struct tegra_clk_pll_freq_table old_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int state, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) state = clk_pll_is_enabled(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if (state && pll->params->pre_rate_change) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) ret = pll->params->pre_rate_change();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (WARN_ON(ret))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) _get_pll_mnp(pll, &old_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (state && pll->params->defaults_set && pll->params->dyn_ramp &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) (cfg->m == old_cfg.m) && (cfg->p == old_cfg.p)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) ret = pll->params->dyn_ramp(pll, cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) if (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) pll_clk_stop_ss(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) _clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) if (!pll->params->defaults_set && pll->params->set_defaults)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) pll->params->set_defaults(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) _update_pll_mnp(pll, cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (pll->params->flags & TEGRA_PLL_HAS_CPCON)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) _update_pll_cpcon(pll, cfg, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) pll_clk_start_ss(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (state && pll->params->post_rate_change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) pll->params->post_rate_change();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) struct tegra_clk_pll_freq_table cfg, old_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) if (pll->params->flags & TEGRA_PLL_FIXED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) if (rate != pll->params->fixed_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) __func__, clk_hw_get_name(hw),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) pll->params->fixed_rate, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) if (_get_table_rate(hw, &cfg, rate, parent_rate) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) pll->params->calc_rate(hw, &cfg, rate, parent_rate)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) pr_err("%s: Failed to set %s rate %lu\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) clk_hw_get_name(hw), rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) _get_pll_mnp(pll, &old_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (pll->params->flags & TEGRA_PLL_VCO_OUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) cfg.p = old_cfg.p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) if (old_cfg.m != cfg.m || old_cfg.n != cfg.n || old_cfg.p != cfg.p ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) old_cfg.sdm_data != cfg.sdm_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) ret = _program_pll(hw, &cfg, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) static long clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) unsigned long *prate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) if (pll->params->flags & TEGRA_PLL_FIXED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) /* PLLM/MB are used for memory; we do not change rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (pll->params->flags & (TEGRA_PLLM | TEGRA_PLLMB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return clk_hw_get_rate(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) return pll->params->fixed_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (_get_table_rate(hw, &cfg, rate, *prate) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) pll->params->calc_rate(hw, &cfg, rate, *prate))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return cfg.output_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) u64 rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) int pdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) if ((pll->params->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) return parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) if ((pll->params->flags & TEGRA_PLL_FIXED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) !(pll->params->flags & (TEGRA_PLLM | TEGRA_PLLMB)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) !(val & PLL_BASE_OVERRIDE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) struct tegra_clk_pll_freq_table sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) if (_get_table_rate(hw, &sel, pll->params->fixed_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) parent_rate)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) pr_err("Clock %s has unknown fixed frequency\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) clk_hw_get_name(hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return pll->params->fixed_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) _get_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) if (pll->params->flags & TEGRA_PLL_VCO_OUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) pdiv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) pdiv = _hw_to_p_div(hw, cfg.p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) if (pdiv < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) WARN(1, "Clock %s has invalid pdiv value : 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) clk_hw_get_name(hw), cfg.p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) pdiv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) if (pll->params->set_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) pll->params->set_gain(&cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) cfg.m *= pdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) rate *= cfg.n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) do_div(rate, cfg.m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) static int clk_plle_training(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) if (!pll->pmc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * PLLE is already disabled, and setup cleared;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * create falling edge on PLLE IDDQ input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) val = readl(pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) val |= PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) writel(val, pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) val = readl(pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) val |= PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) writel(val, pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) val = readl(pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) val &= ~PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) writel(val, pll->pmc + PMC_SATA_PWRGT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) timeout = jiffies + msecs_to_jiffies(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) if (val & PLLE_MISC_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) pr_err("%s: timeout waiting for PLLE\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) udelay(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) static int clk_plle_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) struct tegra_clk_pll_freq_table sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) unsigned long input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) if (clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) val &= ~(PLLE_MISC_LOCK_ENABLE | PLLE_MISC_SETUP_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) if (!(val & PLLE_MISC_READY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) err = clk_plle_training(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) if (pll->params->flags & TEGRA_PLLE_CONFIGURE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) /* configure dividers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) val &= ~(divp_mask_shifted(pll) | divn_mask_shifted(pll) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) divm_mask_shifted(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) val |= sel.m << divm_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) val |= sel.n << divn_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) val |= sel.p << divp_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) val |= PLLE_MISC_SETUP_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) val |= PLLE_MISC_LOCK_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) val = readl(pll->clk_base + PLLE_SS_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) val &= ~PLLE_SS_COEFFICIENTS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) val |= PLLE_SS_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) writel(val, pll->clk_base + PLLE_SS_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) val |= (PLL_BASE_BYPASS | PLL_BASE_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) static unsigned long clk_plle_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) u32 val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) u32 divn = 0, divm = 0, divp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) u64 rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) divp = (val >> pll->params->div_nmp->divp_shift) & (divp_mask(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) divn = (val >> pll->params->div_nmp->divn_shift) & (divn_mask(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) divm = (val >> pll->params->div_nmp->divm_shift) & (divm_mask(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) divm *= divp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) rate *= divn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) do_div(rate, divm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) static void tegra_clk_pll_restore_context(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) struct clk_hw *parent = clk_hw_get_parent(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) unsigned long parent_rate = clk_hw_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) unsigned long rate = clk_hw_get_rate(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (pll->params->set_defaults)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) pll->params->set_defaults(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) clk_pll_set_rate(hw, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) if (!__clk_get_enable_count(hw->clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) const struct clk_ops tegra_clk_pll_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) .enable = clk_pll_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) .round_rate = clk_pll_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) .set_rate = clk_pll_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) .restore_context = tegra_clk_pll_restore_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) const struct clk_ops tegra_clk_plle_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) .recalc_rate = clk_plle_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) .enable = clk_plle_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) * Structure defining the fields for USB UTMI clocks Parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) struct utmi_clk_param {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) /* Oscillator Frequency in Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) u32 osc_frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) /* UTMIP PLL Enable Delay Count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) u8 enable_delay_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) /* UTMIP PLL Stable count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) u8 stable_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) /* UTMIP PLL Active delay count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) u8 active_delay_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) /* UTMIP PLL Xtal frequency count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) u8 xtal_freq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static const struct utmi_clk_param utmi_parameters[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) .osc_frequency = 13000000, .enable_delay_count = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) .stable_count = 0x33, .active_delay_count = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) .xtal_freq_count = 0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) .osc_frequency = 19200000, .enable_delay_count = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) .stable_count = 0x4b, .active_delay_count = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) .xtal_freq_count = 0xbb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) .osc_frequency = 12000000, .enable_delay_count = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) .stable_count = 0x2f, .active_delay_count = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) .xtal_freq_count = 0x76
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) .osc_frequency = 26000000, .enable_delay_count = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .stable_count = 0x66, .active_delay_count = 0x09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .xtal_freq_count = 0xfe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) .osc_frequency = 16800000, .enable_delay_count = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) .stable_count = 0x41, .active_delay_count = 0x0a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .xtal_freq_count = 0xa4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) .osc_frequency = 38400000, .enable_delay_count = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) .stable_count = 0x0, .active_delay_count = 0x6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) .xtal_freq_count = 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static int clk_pllu_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) struct clk_hw *pll_ref = clk_hw_get_parent(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct clk_hw *osc = clk_hw_get_parent(pll_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) const struct utmi_clk_param *params = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) unsigned long flags = 0, input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) if (!osc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) pr_err("%s: failed to get OSC clock\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) input_rate = clk_hw_get_rate(osc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) if (!clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (input_rate == utmi_parameters[i].osc_frequency) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) params = &utmi_parameters[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) if (!params) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) pr_err("%s: unexpected input rate %lu Hz\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) input_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) value = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) value &= ~PLLU_BASE_OVERRIDE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) pll_writel_base(value, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) /* Program UTMIP PLL stable and active counts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) value &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) value |= UTMIP_PLL_CFG2_STABLE_COUNT(params->stable_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) value &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) value |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(params->active_delay_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /* Remove power downs from UTMIP PLL control bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) /* Program UTMIP PLL delay and oscillator frequency counts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) value &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) value |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(params->enable_delay_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) value &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) value |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(params->xtal_freq_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) /* Remove power downs from UTMIP PLL control bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) static const struct clk_ops tegra_clk_pllu_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) .enable = clk_pllu_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) .round_rate = clk_pll_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) .set_rate = clk_pll_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) static int _pll_fixed_mdiv(struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) u16 mdiv = parent_rate / pll_params->cf_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (pll_params->flags & TEGRA_MDIV_NEW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) return (!pll_params->mdiv_default ? mdiv :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) min(mdiv, pll_params->mdiv_default));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) if (pll_params->mdiv_default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) return pll_params->mdiv_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) if (parent_rate > pll_params->cf_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) static int _calc_dynamic_ramp_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) unsigned long rate, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) unsigned int p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) int p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) if (!rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) p = DIV_ROUND_UP(pll->params->vco_min, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) cfg->m = _pll_fixed_mdiv(pll->params, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) cfg->output_rate = rate * p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) cfg->n = cfg->output_rate * cfg->m / parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) cfg->input_rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) p_div = _p_div_to_hw(hw, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) if (p_div < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) return p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) cfg->p = p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (cfg->n > divn_max(pll) || cfg->output_rate > pll->params->vco_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) #if defined(CONFIG_ARCH_TEGRA_114_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) defined(CONFIG_ARCH_TEGRA_124_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) defined(CONFIG_ARCH_TEGRA_132_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) defined(CONFIG_ARCH_TEGRA_210_SOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) u16 tegra_pll_get_fixed_mdiv(struct clk_hw *hw, unsigned long input_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) return (u16)_pll_fixed_mdiv(pll->params, input_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) static unsigned long _clip_vco_min(unsigned long vco_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return DIV_ROUND_UP(vco_min, parent_rate) * parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) static int _setup_dynamic_ramp(struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) void __iomem *clk_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) u32 step_a, step_b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) switch (parent_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) case 12000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) case 13000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) case 26000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) step_a = 0x2B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) step_b = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) case 16800000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) step_a = 0x1A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) step_b = 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) case 19200000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) step_a = 0x12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) step_b = 0x08;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) pr_err("%s: Unexpected reference rate %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) __func__, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) val = step_a << pll_params->stepa_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) val |= step_b << pll_params->stepb_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) writel_relaxed(val, clk_base + pll_params->dyn_ramp_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) static int _pll_ramp_calc_pll(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) unsigned long rate, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) err = _get_table_rate(hw, cfg, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) err = _calc_dynamic_ramp_rate(hw, cfg, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) if (cfg->m != _pll_fixed_mdiv(pll->params, parent_rate)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (cfg->p > pll->params->max_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) static int clk_pllxc_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) struct tegra_clk_pll_freq_table cfg, old_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) ret = _pll_ramp_calc_pll(hw, &cfg, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) _get_pll_mnp(pll, &old_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) if (pll->params->flags & TEGRA_PLL_VCO_OUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) cfg.p = old_cfg.p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) if (old_cfg.m != cfg.m || old_cfg.n != cfg.n || old_cfg.p != cfg.p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) ret = _program_pll(hw, &cfg, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) static long clk_pll_ramp_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) unsigned long *prate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) int ret, p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) u64 output_rate = *prate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) ret = _pll_ramp_calc_pll(hw, &cfg, rate, *prate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) p_div = _hw_to_p_div(hw, cfg.p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) if (p_div < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) return p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) if (pll->params->set_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) pll->params->set_gain(&cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) output_rate *= cfg.n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) do_div(output_rate, cfg.m * p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) return output_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) static void _pllcx_strobe(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) val |= PLLCX_MISC_STROBE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) udelay(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) val &= ~PLLCX_MISC_STROBE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) static int clk_pllc_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) udelay(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) val &= ~PLLCX_MISC_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) udelay(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) _pllcx_strobe(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) static void _clk_pllc_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) _clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) val |= PLLCX_MISC_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) udelay(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) static void clk_pllc_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) _clk_pllc_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) static int _pllcx_update_dynamic_coef(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) unsigned long input_rate, u32 n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) u32 val, n_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) switch (input_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) case 12000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) n_threshold = 70;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) case 13000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) case 26000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) n_threshold = 71;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) case 16800000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) n_threshold = 55;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) case 19200000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) n_threshold = 48;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) pr_err("%s: Unexpected reference rate %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) __func__, input_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) val &= ~(PLLCX_MISC_SDM_DIV_MASK | PLLCX_MISC_FILT_DIV_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) val |= n <= n_threshold ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) PLLCX_MISC_DIV_LOW_RANGE : PLLCX_MISC_DIV_HIGH_RANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) static int clk_pllc_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) struct tegra_clk_pll_freq_table cfg, old_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) int state, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) ret = _pll_ramp_calc_pll(hw, &cfg, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) _get_pll_mnp(pll, &old_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) if (cfg.m != old_cfg.m) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) if (old_cfg.n == cfg.n && old_cfg.p == cfg.p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) state = clk_pll_is_enabled(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) _clk_pllc_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) ret = _pllcx_update_dynamic_coef(pll, parent_rate, cfg.n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) _update_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) if (state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) ret = clk_pllc_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) static long _pllre_calc_rate(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) struct tegra_clk_pll_freq_table *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) unsigned long rate, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) u16 m, n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) u64 output_rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) m = _pll_fixed_mdiv(pll->params, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) n = rate * m / parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) output_rate *= n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) do_div(output_rate, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) if (cfg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) cfg->m = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) cfg->n = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) return output_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) static int clk_pllre_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) struct tegra_clk_pll_freq_table cfg, old_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) int state, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) _pllre_calc_rate(pll, &cfg, rate, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) _get_pll_mnp(pll, &old_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) cfg.p = old_cfg.p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) if (cfg.m != old_cfg.m || cfg.n != old_cfg.n) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) state = clk_pll_is_enabled(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) _clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) _update_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) if (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) static unsigned long clk_pllre_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) u64 rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) _get_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) rate *= cfg.n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) do_div(rate, cfg.m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) static long clk_pllre_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) unsigned long *prate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) return _pllre_calc_rate(pll, NULL, rate, *prate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) static int clk_plle_tegra114_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) struct tegra_clk_pll_freq_table sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) unsigned long input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) val &= ~BIT(29); /* Disable lock override */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) val |= PLLE_AUX_ENABLE_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) val &= ~PLLE_AUX_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) val |= PLLE_MISC_LOCK_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) val |= PLLE_MISC_IDDQ_SW_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) val &= ~PLLE_MISC_IDDQ_SW_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) val |= PLLE_MISC_PLLE_PTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) val &= ~(PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) udelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) val = pll_readl(PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) val |= PLLE_SS_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) val &= ~(divp_mask_shifted(pll) | divn_mask_shifted(pll) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) divm_mask_shifted(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) val |= sel.m << divm_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) val |= sel.n << divn_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) val = pll_readl(PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) val &= ~(PLLE_SS_CNTL_CENTER | PLLE_SS_CNTL_INVERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) val &= ~PLLE_SS_COEFFICIENTS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) val |= PLLE_SS_COEFFICIENTS_VAL_TEGRA114;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) val &= ~(PLLE_SS_CNTL_SSC_BYP | PLLE_SS_CNTL_BYPASS_SS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) val &= ~PLLE_SS_CNTL_INTERP_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) /* Enable HW control of XUSB brick PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) val &= ~PLLE_MISC_IDDQ_SW_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) val |= (PLLE_AUX_USE_LOCKDET | PLLE_AUX_SEQ_START_STATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) val &= ~(PLLE_AUX_ENABLE_SWCTL | PLLE_AUX_SS_SWCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) val |= PLLE_AUX_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) val = pll_readl(XUSBIO_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) val |= (XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) XUSBIO_PLL_CFG0_SEQ_START_STATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) val &= ~(XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) pll_writel(val, XUSBIO_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) val |= XUSBIO_PLL_CFG0_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) pll_writel(val, XUSBIO_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) /* Enable HW control of SATA PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) val = pll_readl(SATA_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) val &= ~SATA_PLL_CFG0_PADPLL_RESET_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) val |= SATA_PLL_CFG0_PADPLL_USE_LOCKDET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) val |= SATA_PLL_CFG0_SEQ_START_STATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) pll_writel(val, SATA_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) val = pll_readl(SATA_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) val |= SATA_PLL_CFG0_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) pll_writel(val, SATA_PLL_CFG0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) static void clk_plle_tegra114_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) _clk_pll_disable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) val |= PLLE_MISC_IDDQ_SW_CTRL | PLLE_MISC_IDDQ_SW_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) static int clk_pllu_tegra114_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) const struct utmi_clk_param *params = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) struct clk *osc = __clk_lookup("osc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) unsigned long flags = 0, input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) if (!osc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) pr_err("%s: failed to get OSC clock\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) input_rate = clk_hw_get_rate(__clk_get_hw(osc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) if (!clk_pll_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) _clk_pll_enable(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (input_rate == utmi_parameters[i].osc_frequency) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) params = &utmi_parameters[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) if (!params) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) pr_err("%s: unexpected input rate %lu Hz\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) input_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) value = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) value &= ~PLLU_BASE_OVERRIDE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) pll_writel_base(value, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) /* Program UTMIP PLL stable and active counts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) value &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) value |= UTMIP_PLL_CFG2_STABLE_COUNT(params->stable_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) value &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) value |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(params->active_delay_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) /* Remove power downs from UTMIP PLL control bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) /* Program UTMIP PLL delay and oscillator frequency counts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) value &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) value |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(params->enable_delay_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) value &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) value |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(params->xtal_freq_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) /* Remove power downs from UTMIP PLL control bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) /* Setup HW control of UTMIPLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) value |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) value &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) value |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) * Setup SW override of UTMIPLL assuming USB2.0 ports are assigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) * to USB2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) value |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) value &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) /* Enable HW control of UTMIPLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) value |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) static void _clk_plle_tegra_init_parent(struct tegra_clk_pll *pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) u32 val, val_aux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) /* ensure parent is set to pll_ref */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) val_aux = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) if (val & PLL_BASE_ENABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) if ((val_aux & PLLE_AUX_PLLRE_SEL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) (val_aux & PLLE_AUX_PLLP_SEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) WARN(1, "pll_e enabled with unsupported parent %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) "pll_re_vco");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) pll_writel(val_aux, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) fence_udelay(1, pll->clk_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) void __iomem *pmc, struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) pll = kzalloc(sizeof(*pll), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) if (!pll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) pll->clk_base = clk_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) pll->pmc = pmc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) pll->params = pll_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) pll->lock = lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) if (!pll_params->div_nmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) pll_params->div_nmp = &default_nmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) return pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) static struct clk *_tegra_clk_register_pll(struct tegra_clk_pll *pll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) const char *name, const char *parent_name, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) const struct clk_ops *ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) struct clk_init_data init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) init.name = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) init.ops = ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) init.flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) init.parent_names = (parent_name ? &parent_name : NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) init.num_parents = (parent_name ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) /* Default to _calc_rate if unspecified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (!pll->params->calc_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) if (pll->params->flags & TEGRA_PLLM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) pll->params->calc_rate = _calc_dynamic_ramp_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) pll->params->calc_rate = _calc_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) if (pll->params->set_defaults)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) pll->params->set_defaults(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) /* Data in .init is copied by clk_register(), so stack variable OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) pll->hw.init = &init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) return clk_register(NULL, &pll->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) unsigned long flags, struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) static struct div_nmp pll_e_nmp = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) .divn_shift = PLLE_BASE_DIVN_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) .divn_width = PLLE_BASE_DIVN_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) .divm_shift = PLLE_BASE_DIVM_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) .divm_width = PLLE_BASE_DIVM_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) .divp_shift = PLLE_BASE_DIVP_SHIFT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) .divp_width = PLLE_BASE_DIVP_WIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) unsigned long flags, struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) if (!pll_params->div_nmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) pll_params->div_nmp = &pll_e_nmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) &tegra_clk_plle_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) struct clk *tegra_clk_register_pllu(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) void __iomem *clk_base, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) struct tegra_clk_pll_params *pll_params, spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) pll_params->flags |= TEGRA_PLLU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) &tegra_clk_pllu_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) #if defined(CONFIG_ARCH_TEGRA_114_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) defined(CONFIG_ARCH_TEGRA_124_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) defined(CONFIG_ARCH_TEGRA_132_SOC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) defined(CONFIG_ARCH_TEGRA_210_SOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) static const struct clk_ops tegra_clk_pllxc_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) .enable = clk_pll_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) .round_rate = clk_pll_ramp_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) .set_rate = clk_pllxc_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) static const struct clk_ops tegra_clk_pllc_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) .enable = clk_pllc_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) .disable = clk_pllc_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) .round_rate = clk_pll_ramp_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) .set_rate = clk_pllc_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) static const struct clk_ops tegra_clk_pllre_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) .enable = clk_pll_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) .recalc_rate = clk_pllre_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) .round_rate = clk_pllre_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) .set_rate = clk_pllre_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) static const struct clk_ops tegra_clk_plle_tegra114_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) .enable = clk_plle_tegra114_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) .disable = clk_plle_tegra114_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) static const struct clk_ops tegra_clk_pllu_tegra114_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) .enable = clk_pllu_tegra114_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) struct clk *clk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) u32 val, val_iddq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) parent_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) if (!pll_params->pdiv_tohw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) * If the pll has a set_defaults callback, it will take care of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) * configuring dynamic ramping and setting IDDQ in that path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) if (!pll_params->set_defaults) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) err = _setup_dynamic_ramp(pll_params, clk_base, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) val = readl_relaxed(clk_base + pll_params->base_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) val_iddq = readl_relaxed(clk_base + pll_params->iddq_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) if (val & PLL_BASE_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) WARN_ON(val_iddq & BIT(pll_params->iddq_bit_idx));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) val_iddq |= BIT(pll_params->iddq_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) writel_relaxed(val_iddq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) clk_base + pll_params->iddq_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) &tegra_clk_pllxc_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) spinlock_t *lock, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) /* program minimum rate by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) if (val & PLL_BASE_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) WARN_ON(readl_relaxed(clk_base + pll_params->iddq_reg) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) BIT(pll_params->iddq_bit_idx));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) int m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) m = _pll_fixed_mdiv(pll_params, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) val = m << divm_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) val |= (pll_params->vco_min / parent_rate) << divn_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) /* disable lock override */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) val &= ~BIT(29);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) &tegra_clk_pllre_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) struct clk *clk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) if (!pll_params->pdiv_tohw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) parent_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) pll_params->flags |= TEGRA_PLLM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) struct clk *parent, *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) const struct pdiv_map *p_tohw = pll_params->pdiv_tohw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) if (!p_tohw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) parent_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) * Most of PLLC register fields are shadowed, and can not be read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) * directly from PLL h/w. Hence, actual PLLC boot state is unknown.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) * Initialize PLL to default state: disabled, reset; shadow registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) * loaded with default parameters; dividers are preset for half of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) * minimum VCO rate (the latter assured that shadowed divider settings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) * are within supported range).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) cfg.m = _pll_fixed_mdiv(pll_params, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) cfg.n = cfg.m * pll_params->vco_min / parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) while (p_tohw->pdiv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) if (p_tohw->pdiv == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) cfg.p = p_tohw->hw_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) p_tohw++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) if (!p_tohw->pdiv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) pll_writel_base(0, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) _update_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) pll_writel_misc(PLLCX_MISC_DEFAULT, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) pll_writel(PLLCX_MISC1_DEFAULT, pll_params->ext_misc_reg[0], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) pll_writel(PLLCX_MISC2_DEFAULT, pll_params->ext_misc_reg[1], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) pll_writel(PLLCX_MISC3_DEFAULT, pll_params->ext_misc_reg[2], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) _pllcx_update_dynamic_coef(pll, parent_rate, cfg.n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) &tegra_clk_pllc_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) struct clk *tegra_clk_register_plle_tegra114(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) void __iomem *clk_base, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) _clk_plle_tegra_init_parent(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) &tegra_clk_plle_tegra114_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) struct clk *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) tegra_clk_register_pllu_tegra114(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) void __iomem *clk_base, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) pll_params->flags |= TEGRA_PLLU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) &tegra_clk_pllu_tegra114_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) #if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC) || defined(CONFIG_ARCH_TEGRA_210_SOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) static const struct clk_ops tegra_clk_pllss_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) .is_enabled = clk_pll_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) .enable = clk_pll_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) .disable = clk_pll_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) .round_rate = clk_pll_ramp_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .set_rate = clk_pllxc_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) .restore_context = tegra_clk_pll_restore_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) void __iomem *clk_base, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) struct clk *clk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) struct tegra_clk_pll_freq_table cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) u32 val, val_iddq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) if (!pll_params->div_nmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) parent_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) val &= ~PLLSS_REF_SRC_SEL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) /* initialize PLL to minimum rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) cfg.m = _pll_fixed_mdiv(pll_params, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) cfg.n = cfg.m * pll_params->vco_min / parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) for (i = 0; pll_params->pdiv_tohw[i].pdiv; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) if (!i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) cfg.p = pll_params->pdiv_tohw[i-1].hw_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) _update_pll_mnp(pll, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) pll_writel_misc(PLLSS_MISC_DEFAULT, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) pll_writel(PLLSS_CFG_DEFAULT, pll_params->ext_misc_reg[0], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) pll_writel(PLLSS_CTRL1_DEFAULT, pll_params->ext_misc_reg[1], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) pll_writel(PLLSS_CTRL1_DEFAULT, pll_params->ext_misc_reg[2], pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) val_iddq = readl_relaxed(clk_base + pll_params->iddq_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) if (val & PLL_BASE_ENABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) if (val_iddq & BIT(pll_params->iddq_bit_idx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) WARN(1, "%s is on but IDDQ set\n", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) val_iddq |= BIT(pll_params->iddq_bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) writel_relaxed(val_iddq, clk_base + pll_params->iddq_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) val &= ~PLLSS_LOCK_OVERRIDE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) &tegra_clk_pllss_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) #if defined(CONFIG_ARCH_TEGRA_210_SOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) struct clk *tegra_clk_register_pllre_tegra210(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) const char *parent_name, void __iomem *clk_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) void __iomem *pmc, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) spinlock_t *lock, unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) static int clk_plle_tegra210_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) return val & PLLE_BASE_ENABLE ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) static int clk_plle_tegra210_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) struct tegra_clk_pll_freq_table sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) unsigned long input_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) if (clk_plle_tegra210_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) if (val & PLLE_AUX_SEQ_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) val &= ~BIT(30); /* Disable lock override */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) val |= PLLE_MISC_LOCK_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) val |= PLLE_MISC_IDDQ_SW_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) val &= ~PLLE_MISC_IDDQ_SW_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) val |= PLLE_MISC_PLLE_PTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) val &= ~(PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) udelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) val = pll_readl(PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) val |= PLLE_SS_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) val &= ~(divp_mask_shifted(pll) | divn_mask_shifted(pll) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) divm_mask_shifted(pll));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) val &= ~(PLLE_BASE_DIVCML_MASK << PLLE_BASE_DIVCML_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) val |= sel.m << divm_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) val |= sel.n << divn_shift(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) val |= PLLE_BASE_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) ret = clk_pll_wait_for_lock(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) val = pll_readl(PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) val &= ~(PLLE_SS_CNTL_CENTER | PLLE_SS_CNTL_INVERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) val &= ~PLLE_SS_COEFFICIENTS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) val |= PLLE_SS_COEFFICIENTS_VAL_TEGRA210;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) val &= ~(PLLE_SS_CNTL_SSC_BYP | PLLE_SS_CNTL_BYPASS_SS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) val &= ~PLLE_SS_CNTL_INTERP_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) pll_writel(val, PLLE_SS_CTRL, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) val &= ~PLLE_MISC_IDDQ_SW_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) val |= (PLLE_AUX_USE_LOCKDET | PLLE_AUX_SS_SEQ_INCLUDE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) val &= ~(PLLE_AUX_ENABLE_SWCTL | PLLE_AUX_SS_SWCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) val |= PLLE_AUX_SEQ_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) static void clk_plle_tegra210_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) unsigned long flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) spin_lock_irqsave(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) /* If PLLE HW sequencer is enabled, SW should not disable PLLE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) if (val & PLLE_AUX_SEQ_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) val = pll_readl_base(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) val &= ~PLLE_BASE_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) pll_writel_base(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) val = pll_readl(pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) val |= PLLE_AUX_ENABLE_SWCTL | PLLE_AUX_SS_SWCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) pll_writel(val, pll->params->aux_reg, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) val = pll_readl_misc(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) val |= PLLE_MISC_IDDQ_SW_CTRL | PLLE_MISC_IDDQ_SW_VALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) pll_writel_misc(val, pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) if (pll->lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) spin_unlock_irqrestore(pll->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) static void tegra_clk_plle_t210_restore_context(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) struct tegra_clk_pll *pll = to_clk_pll(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) _clk_plle_tegra_init_parent(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) static const struct clk_ops tegra_clk_plle_tegra210_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) .is_enabled = clk_plle_tegra210_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) .enable = clk_plle_tegra210_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) .disable = clk_plle_tegra210_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) .recalc_rate = clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) .restore_context = tegra_clk_plle_t210_restore_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) struct clk *tegra_clk_register_plle_tegra210(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) void __iomem *clk_base, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) _clk_plle_tegra_init_parent(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) &tegra_clk_plle_tegra210_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) struct clk *tegra_clk_register_pllc_tegra210(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) const char *parent_name, void __iomem *clk_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) void __iomem *pmc, unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) struct clk *parent, *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) const struct pdiv_map *p_tohw = pll_params->pdiv_tohw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) if (!p_tohw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) name, parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) struct clk *tegra_clk_register_pllss_tegra210(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) const char *parent_name, void __iomem *clk_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) struct clk *clk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) if (!pll_params->div_nmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) name, parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) val = readl_relaxed(clk_base + pll_params->base_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) if (val & PLLSS_REF_SRC_SEL_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) WARN(1, "not supported reference clock for %s\n", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) struct clk *tegra_clk_register_pllmb(const char *name, const char *parent_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) void __iomem *clk_base, void __iomem *pmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) unsigned long flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) struct tegra_clk_pll_params *pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) spinlock_t *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) struct tegra_clk_pll *pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) struct clk *clk, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) unsigned long parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) if (!pll_params->pdiv_tohw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) parent = __clk_lookup(parent_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) if (!parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) WARN(1, "parent clk %s of %s must be registered first\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) parent_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) parent_rate = clk_get_rate(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) if (pll_params->adjust_vco)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) pll_params->vco_min = pll_params->adjust_vco(pll_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) parent_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) pll_params->flags |= TEGRA_PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) pll_params->flags |= TEGRA_PLLMB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) if (IS_ERR(pll))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) return ERR_CAST(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) &tegra_clk_pll_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) if (IS_ERR(clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) kfree(pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) #endif