Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'clk-tegra-next' of git://nv-tegra.nvidia.com/user/pdeschrijver/linux into clk-next-tegra

+5089 -3011
+59
Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt
··· 1 + NVIDIA Tegra124 Clock And Reset Controller 2 + 3 + This binding uses the common clock binding: 4 + Documentation/devicetree/bindings/clock/clock-bindings.txt 5 + 6 + The CAR (Clock And Reset) Controller on Tegra is the HW module responsible 7 + for muxing and gating Tegra's clocks, and setting their rates. 8 + 9 + Required properties : 10 + - compatible : Should be "nvidia,tegra124-car" 11 + - reg : Should contain CAR registers location and length 12 + - clocks : Should contain phandle and clock specifiers for two clocks: 13 + the 32 KHz "32k_in", and the board-specific oscillator "osc". 14 + - #clock-cells : Should be 1. 15 + In clock consumers, this cell represents the clock ID exposed by the 16 + CAR. The assignments may be found in header file 17 + <dt-bindings/clock/tegra124-car.h>. 18 + 19 + Example SoC include file: 20 + 21 + / { 22 + tegra_car: clock { 23 + compatible = "nvidia,tegra124-car"; 24 + reg = <0x60006000 0x1000>; 25 + #clock-cells = <1>; 26 + }; 27 + 28 + usb@c5004000 { 29 + clocks = <&tegra_car TEGRA124_CLK_USB2>; 30 + }; 31 + }; 32 + 33 + Example board file: 34 + 35 + / { 36 + clocks { 37 + compatible = "simple-bus"; 38 + #address-cells = <1>; 39 + #size-cells = <0>; 40 + 41 + osc: clock@0 { 42 + compatible = "fixed-clock"; 43 + reg = <0>; 44 + #clock-cells = <0>; 45 + clock-frequency = <112400000>; 46 + }; 47 + 48 + clk_32k: clock@1 { 49 + compatible = "fixed-clock"; 50 + reg = <1>; 51 + #clock-cells = <0>; 52 + clock-frequency = <32768>; 53 + }; 54 + }; 55 + 56 + &tegra_car { 57 + clocks = <&clk_32k> <&osc>; 58 + }; 59 + };
+6 -1
drivers/clk/tegra/Makefile
··· 6 6 obj-y += clk-pll.o 7 7 obj-y += clk-pll-out.o 8 8 obj-y += clk-super.o 9 - 9 + obj-y += clk-tegra-audio.o 10 + obj-y += clk-tegra-periph.o 11 + obj-y += clk-tegra-pmc.o 12 + obj-y += clk-tegra-fixed.o 13 + obj-y += clk-tegra-super-gen4.o 10 14 obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += clk-tegra20.o 11 15 obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += clk-tegra30.o 12 16 obj-$(CONFIG_ARCH_TEGRA_114_SOC) += clk-tegra114.o 17 + obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124.o
+235
drivers/clk/tegra/clk-id.h
··· 1 + /* 2 + * This header provides IDs for clocks common between several Tegra SoCs 3 + */ 4 + #ifndef _TEGRA_CLK_ID_H 5 + #define _TEGRA_CLK_ID_H 6 + 7 + enum clk_id { 8 + tegra_clk_actmon, 9 + tegra_clk_adx, 10 + tegra_clk_adx1, 11 + tegra_clk_afi, 12 + tegra_clk_amx, 13 + tegra_clk_amx1, 14 + tegra_clk_apbdma, 15 + tegra_clk_apbif, 16 + tegra_clk_audio0, 17 + tegra_clk_audio0_2x, 18 + tegra_clk_audio0_mux, 19 + tegra_clk_audio1, 20 + tegra_clk_audio1_2x, 21 + tegra_clk_audio1_mux, 22 + tegra_clk_audio2, 23 + tegra_clk_audio2_2x, 24 + tegra_clk_audio2_mux, 25 + tegra_clk_audio3, 26 + tegra_clk_audio3_2x, 27 + tegra_clk_audio3_mux, 28 + tegra_clk_audio4, 29 + tegra_clk_audio4_2x, 30 + tegra_clk_audio4_mux, 31 + tegra_clk_blink, 32 + tegra_clk_bsea, 33 + tegra_clk_bsev, 34 + tegra_clk_cclk_g, 35 + tegra_clk_cclk_lp, 36 + tegra_clk_cilab, 37 + tegra_clk_cilcd, 38 + tegra_clk_cile, 39 + tegra_clk_clk_32k, 40 + tegra_clk_clk72Mhz, 41 + tegra_clk_clk_m, 42 + tegra_clk_clk_m_div2, 43 + tegra_clk_clk_m_div4, 44 + tegra_clk_clk_out_1, 45 + tegra_clk_clk_out_1_mux, 46 + tegra_clk_clk_out_2, 47 + tegra_clk_clk_out_2_mux, 48 + tegra_clk_clk_out_3, 49 + tegra_clk_clk_out_3_mux, 50 + tegra_clk_cml0, 51 + tegra_clk_cml1, 52 + tegra_clk_csi, 53 + tegra_clk_csite, 54 + tegra_clk_csus, 55 + tegra_clk_cve, 56 + tegra_clk_dam0, 57 + tegra_clk_dam1, 58 + tegra_clk_dam2, 59 + tegra_clk_d_audio, 60 + tegra_clk_dds, 61 + tegra_clk_dfll_ref, 62 + tegra_clk_dfll_soc, 63 + tegra_clk_disp1, 64 + tegra_clk_disp2, 65 + tegra_clk_dp2, 66 + tegra_clk_dpaux, 67 + tegra_clk_dsia, 68 + tegra_clk_dsialp, 69 + tegra_clk_dsia_mux, 70 + tegra_clk_dsib, 71 + tegra_clk_dsiblp, 72 + tegra_clk_dsib_mux, 73 + tegra_clk_dtv, 74 + tegra_clk_emc, 75 + tegra_clk_entropy, 76 + tegra_clk_epp, 77 + tegra_clk_epp_8, 78 + tegra_clk_extern1, 79 + tegra_clk_extern2, 80 + tegra_clk_extern3, 81 + tegra_clk_fuse, 82 + tegra_clk_fuse_burn, 83 + tegra_clk_gpu, 84 + tegra_clk_gr2d, 85 + tegra_clk_gr2d_8, 86 + tegra_clk_gr3d, 87 + tegra_clk_gr3d_8, 88 + tegra_clk_hclk, 89 + tegra_clk_hda, 90 + tegra_clk_hda2codec_2x, 91 + tegra_clk_hda2hdmi, 92 + tegra_clk_hdmi, 93 + tegra_clk_hdmi_audio, 94 + tegra_clk_host1x, 95 + tegra_clk_host1x_8, 96 + tegra_clk_i2c1, 97 + tegra_clk_i2c2, 98 + tegra_clk_i2c3, 99 + tegra_clk_i2c4, 100 + tegra_clk_i2c5, 101 + tegra_clk_i2c6, 102 + tegra_clk_i2cslow, 103 + tegra_clk_i2s0, 104 + tegra_clk_i2s0_sync, 105 + tegra_clk_i2s1, 106 + tegra_clk_i2s1_sync, 107 + tegra_clk_i2s2, 108 + tegra_clk_i2s2_sync, 109 + tegra_clk_i2s3, 110 + tegra_clk_i2s3_sync, 111 + tegra_clk_i2s4, 112 + tegra_clk_i2s4_sync, 113 + tegra_clk_isp, 114 + tegra_clk_isp_8, 115 + tegra_clk_ispb, 116 + tegra_clk_kbc, 117 + tegra_clk_kfuse, 118 + tegra_clk_la, 119 + tegra_clk_mipi, 120 + tegra_clk_mipi_cal, 121 + tegra_clk_mpe, 122 + tegra_clk_mselect, 123 + tegra_clk_msenc, 124 + tegra_clk_ndflash, 125 + tegra_clk_ndflash_8, 126 + tegra_clk_ndspeed, 127 + tegra_clk_ndspeed_8, 128 + tegra_clk_nor, 129 + tegra_clk_owr, 130 + tegra_clk_pcie, 131 + tegra_clk_pclk, 132 + tegra_clk_pll_a, 133 + tegra_clk_pll_a_out0, 134 + tegra_clk_pll_c, 135 + tegra_clk_pll_c2, 136 + tegra_clk_pll_c3, 137 + tegra_clk_pll_c4, 138 + tegra_clk_pll_c_out1, 139 + tegra_clk_pll_d, 140 + tegra_clk_pll_d2, 141 + tegra_clk_pll_d2_out0, 142 + tegra_clk_pll_d_out0, 143 + tegra_clk_pll_dp, 144 + tegra_clk_pll_e_out0, 145 + tegra_clk_pll_m, 146 + tegra_clk_pll_m_out1, 147 + tegra_clk_pll_p, 148 + tegra_clk_pll_p_out1, 149 + tegra_clk_pll_p_out2, 150 + tegra_clk_pll_p_out2_int, 151 + tegra_clk_pll_p_out3, 152 + tegra_clk_pll_p_out4, 153 + tegra_clk_pll_p_out5, 154 + tegra_clk_pll_ref, 155 + tegra_clk_pll_re_out, 156 + tegra_clk_pll_re_vco, 157 + tegra_clk_pll_u, 158 + tegra_clk_pll_u_12m, 159 + tegra_clk_pll_u_480m, 160 + tegra_clk_pll_u_48m, 161 + tegra_clk_pll_u_60m, 162 + tegra_clk_pll_x, 163 + tegra_clk_pll_x_out0, 164 + tegra_clk_pwm, 165 + tegra_clk_rtc, 166 + tegra_clk_sata, 167 + tegra_clk_sata_cold, 168 + tegra_clk_sata_oob, 169 + tegra_clk_sbc1, 170 + tegra_clk_sbc1_8, 171 + tegra_clk_sbc2, 172 + tegra_clk_sbc2_8, 173 + tegra_clk_sbc3, 174 + tegra_clk_sbc3_8, 175 + tegra_clk_sbc4, 176 + tegra_clk_sbc4_8, 177 + tegra_clk_sbc5, 178 + tegra_clk_sbc5_8, 179 + tegra_clk_sbc6, 180 + tegra_clk_sbc6_8, 181 + tegra_clk_sclk, 182 + tegra_clk_sdmmc1, 183 + tegra_clk_sdmmc2, 184 + tegra_clk_sdmmc3, 185 + tegra_clk_sdmmc4, 186 + tegra_clk_se, 187 + tegra_clk_soc_therm, 188 + tegra_clk_sor0, 189 + tegra_clk_sor0_lvds, 190 + tegra_clk_spdif, 191 + tegra_clk_spdif_2x, 192 + tegra_clk_spdif_in, 193 + tegra_clk_spdif_in_sync, 194 + tegra_clk_spdif_mux, 195 + tegra_clk_spdif_out, 196 + tegra_clk_timer, 197 + tegra_clk_trace, 198 + tegra_clk_tsec, 199 + tegra_clk_tsensor, 200 + tegra_clk_tvdac, 201 + tegra_clk_tvo, 202 + tegra_clk_uarta, 203 + tegra_clk_uartb, 204 + tegra_clk_uartc, 205 + tegra_clk_uartd, 206 + tegra_clk_uarte, 207 + tegra_clk_usb2, 208 + tegra_clk_usb3, 209 + tegra_clk_usbd, 210 + tegra_clk_vcp, 211 + tegra_clk_vde, 212 + tegra_clk_vde_8, 213 + tegra_clk_vfir, 214 + tegra_clk_vi, 215 + tegra_clk_vi_8, 216 + tegra_clk_vi_9, 217 + tegra_clk_vic03, 218 + tegra_clk_vim2_clk, 219 + tegra_clk_vimclk_sync, 220 + tegra_clk_vi_sensor, 221 + tegra_clk_vi_sensor2, 222 + tegra_clk_vi_sensor_8, 223 + tegra_clk_xusb_dev, 224 + tegra_clk_xusb_dev_src, 225 + tegra_clk_xusb_falcon_src, 226 + tegra_clk_xusb_fs_src, 227 + tegra_clk_xusb_host, 228 + tegra_clk_xusb_host_src, 229 + tegra_clk_xusb_hs_src, 230 + tegra_clk_xusb_ss, 231 + tegra_clk_xusb_ss_src, 232 + tegra_clk_max, 233 + }; 234 + 235 + #endif /* _TEGRA_CLK_ID_H */
+6 -2
drivers/clk/tegra/clk-periph-gate.c
··· 151 151 152 152 struct clk *tegra_clk_register_periph_gate(const char *name, 153 153 const char *parent_name, u8 gate_flags, void __iomem *clk_base, 154 - unsigned long flags, int clk_num, 155 - struct tegra_clk_periph_regs *pregs, int *enable_refcnt) 154 + unsigned long flags, int clk_num, int *enable_refcnt) 156 155 { 157 156 struct tegra_clk_periph_gate *gate; 158 157 struct clk *clk; 159 158 struct clk_init_data init; 159 + struct tegra_clk_periph_regs *pregs; 160 + 161 + pregs = get_reg_bank(clk_num); 162 + if (!pregs) 163 + return ERR_PTR(-EINVAL); 160 164 161 165 gate = kzalloc(sizeof(*gate), GFP_KERNEL); 162 166 if (!gate) {
+28 -4
drivers/clk/tegra/clk-periph.c
··· 170 170 .disable = clk_periph_disable, 171 171 }; 172 172 173 + const struct clk_ops tegra_clk_periph_no_gate_ops = { 174 + .get_parent = clk_periph_get_parent, 175 + .set_parent = clk_periph_set_parent, 176 + .recalc_rate = clk_periph_recalc_rate, 177 + .round_rate = clk_periph_round_rate, 178 + .set_rate = clk_periph_set_rate, 179 + }; 180 + 173 181 static struct clk *_tegra_clk_register_periph(const char *name, 174 182 const char **parent_names, int num_parents, 175 183 struct tegra_clk_periph *periph, 176 - void __iomem *clk_base, u32 offset, bool div, 184 + void __iomem *clk_base, u32 offset, 177 185 unsigned long flags) 178 186 { 179 187 struct clk *clk; 180 188 struct clk_init_data init; 189 + struct tegra_clk_periph_regs *bank; 190 + bool div = !(periph->gate.flags & TEGRA_PERIPH_NO_DIV); 191 + 192 + if (periph->gate.flags & TEGRA_PERIPH_NO_DIV) { 193 + flags |= CLK_SET_RATE_PARENT; 194 + init.ops = &tegra_clk_periph_nodiv_ops; 195 + } else if (periph->gate.flags & TEGRA_PERIPH_NO_GATE) 196 + init.ops = &tegra_clk_periph_no_gate_ops; 197 + else 198 + init.ops = &tegra_clk_periph_ops; 181 199 182 200 init.name = name; 183 - init.ops = div ? &tegra_clk_periph_ops : &tegra_clk_periph_nodiv_ops; 184 201 init.flags = flags; 185 202 init.parent_names = parent_names; 186 203 init.num_parents = num_parents; 204 + 205 + bank = get_reg_bank(periph->gate.clk_num); 206 + if (!bank) 207 + return ERR_PTR(-EINVAL); 187 208 188 209 /* Data in .init is copied by clk_register(), so stack variable OK */ 189 210 periph->hw.init = &init; ··· 212 191 periph->mux.reg = clk_base + offset; 213 192 periph->divider.reg = div ? (clk_base + offset) : NULL; 214 193 periph->gate.clk_base = clk_base; 194 + periph->gate.regs = bank; 195 + periph->gate.enable_refcnt = periph_clk_enb_refcnt; 215 196 216 197 clk = clk_register(NULL, &periph->hw); 217 198 if (IS_ERR(clk)) ··· 232 209 u32 offset, unsigned long flags) 233 210 { 234 211 return _tegra_clk_register_periph(name, parent_names, num_parents, 235 - periph, clk_base, offset, true, flags); 212 + periph, clk_base, offset, flags); 236 213 } 237 214 238 215 struct clk *tegra_clk_register_periph_nodiv(const char *name, ··· 240 217 struct tegra_clk_periph *periph, void __iomem *clk_base, 241 218 u32 offset) 242 219 { 220 + periph->gate.flags |= TEGRA_PERIPH_NO_DIV; 243 221 return _tegra_clk_register_periph(name, parent_names, num_parents, 244 - periph, clk_base, offset, false, CLK_SET_RATE_PARENT); 222 + periph, clk_base, offset, CLK_SET_RATE_PARENT); 245 223 }
+311 -96
drivers/clk/tegra/clk-pll.c
··· 77 77 #define PLLE_MISC_SETUP_VALUE (7 << PLLE_MISC_SETUP_BASE_SHIFT) 78 78 79 79 #define PLLE_SS_CTRL 0x68 80 - #define PLLE_SS_DISABLE (7 << 10) 80 + #define PLLE_SS_CNTL_BYPASS_SS BIT(10) 81 + #define PLLE_SS_CNTL_INTERP_RESET BIT(11) 82 + #define PLLE_SS_CNTL_SSC_BYP BIT(12) 83 + #define PLLE_SS_CNTL_CENTER BIT(14) 84 + #define PLLE_SS_CNTL_INVERT BIT(15) 85 + #define PLLE_SS_DISABLE (PLLE_SS_CNTL_BYPASS_SS | PLLE_SS_CNTL_INTERP_RESET |\ 86 + PLLE_SS_CNTL_SSC_BYP) 87 + #define PLLE_SS_MAX_MASK 0x1ff 88 + #define PLLE_SS_MAX_VAL 0x25 89 + #define PLLE_SS_INC_MASK (0xff << 16) 90 + #define PLLE_SS_INC_VAL (0x1 << 16) 91 + #define PLLE_SS_INCINTRV_MASK (0x3f << 24) 92 + #define PLLE_SS_INCINTRV_VAL (0x20 << 24) 93 + #define PLLE_SS_COEFFICIENTS_MASK \ 94 + (PLLE_SS_MAX_MASK | PLLE_SS_INC_MASK | PLLE_SS_INCINTRV_MASK) 95 + #define PLLE_SS_COEFFICIENTS_VAL \ 96 + (PLLE_SS_MAX_VAL | PLLE_SS_INC_VAL | PLLE_SS_INCINTRV_VAL) 81 97 82 98 #define PLLE_AUX_PLLP_SEL BIT(2) 83 99 #define PLLE_AUX_ENABLE_SWCTL BIT(4) ··· 137 121 #define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE BIT(5) 138 122 #define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL BIT(4) 139 123 124 + #define PLLSS_MISC_KCP 0 125 + #define PLLSS_MISC_KVCO 0 126 + #define PLLSS_MISC_SETUP 0 127 + #define PLLSS_EN_SDM 0 128 + #define PLLSS_EN_SSC 0 129 + #define PLLSS_EN_DITHER2 0 130 + #define PLLSS_EN_DITHER 1 131 + #define PLLSS_SDM_RESET 0 132 + #define PLLSS_CLAMP 0 133 + #define PLLSS_SDM_SSC_MAX 0 134 + #define PLLSS_SDM_SSC_MIN 0 135 + #define PLLSS_SDM_SSC_STEP 0 136 + #define PLLSS_SDM_DIN 0 137 + #define PLLSS_MISC_DEFAULT ((PLLSS_MISC_KCP << 25) | \ 138 + (PLLSS_MISC_KVCO << 24) | \ 139 + PLLSS_MISC_SETUP) 140 + #define PLLSS_CFG_DEFAULT ((PLLSS_EN_SDM << 31) | \ 141 + (PLLSS_EN_SSC << 30) | \ 142 + (PLLSS_EN_DITHER2 << 29) | \ 143 + (PLLSS_EN_DITHER << 28) | \ 144 + (PLLSS_SDM_RESET) << 27 | \ 145 + (PLLSS_CLAMP << 22)) 146 + #define PLLSS_CTRL1_DEFAULT \ 147 + ((PLLSS_SDM_SSC_MAX << 16) | PLLSS_SDM_SSC_MIN) 148 + #define PLLSS_CTRL2_DEFAULT \ 149 + ((PLLSS_SDM_SSC_STEP << 16) | PLLSS_SDM_DIN) 150 + #define PLLSS_LOCK_OVERRIDE BIT(24) 151 + #define PLLSS_REF_SRC_SEL_SHIFT 25 152 + #define PLLSS_REF_SRC_SEL_MASK (3 << PLLSS_REF_SRC_SEL_SHIFT) 153 + 140 154 #define pll_readl(offset, p) readl_relaxed(p->clk_base + offset) 141 155 #define pll_readl_base(p) pll_readl(p->params->base_reg, p) 142 156 #define pll_readl_misc(p) pll_readl(p->params->misc_reg, p) ··· 180 134 #define mask(w) ((1 << (w)) - 1) 181 135 #define divm_mask(p) mask(p->params->div_nmp->divm_width) 182 136 #define divn_mask(p) mask(p->params->div_nmp->divn_width) 183 - #define divp_mask(p) (p->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK : \ 137 + #define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\ 184 138 mask(p->params->div_nmp->divp_width)) 185 139 186 140 #define divm_max(p) (divm_mask(p)) ··· 200 154 { 201 155 u32 val; 202 156 203 - if (!(pll->flags & TEGRA_PLL_USE_LOCK)) 157 + if (!(pll->params->flags & TEGRA_PLL_USE_LOCK)) 204 158 return; 205 159 206 - if (!(pll->flags & TEGRA_PLL_HAS_LOCK_ENABLE)) 160 + if (!(pll->params->flags & TEGRA_PLL_HAS_LOCK_ENABLE)) 207 161 return; 208 162 209 163 val = pll_readl_misc(pll); ··· 217 171 u32 val, lock_mask; 218 172 void __iomem *lock_addr; 219 173 220 - if (!(pll->flags & TEGRA_PLL_USE_LOCK)) { 174 + if (!(pll->params->flags & TEGRA_PLL_USE_LOCK)) { 221 175 udelay(pll->params->lock_delay); 222 176 return 0; 223 177 } 224 178 225 179 lock_addr = pll->clk_base; 226 - if (pll->flags & TEGRA_PLL_LOCK_MISC) 180 + if (pll->params->flags & TEGRA_PLL_LOCK_MISC) 227 181 lock_addr += pll->params->misc_reg; 228 182 else 229 183 lock_addr += pll->params->base_reg; ··· 250 204 struct tegra_clk_pll *pll = to_clk_pll(hw); 251 205 u32 val; 252 206 253 - if (pll->flags & TEGRA_PLLM) { 207 + if (pll->params->flags & TEGRA_PLLM) { 254 208 val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); 255 209 if (val & PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE) 256 210 return val & PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE ? 1 : 0; ··· 269 223 clk_pll_enable_lock(pll); 270 224 271 225 val = pll_readl_base(pll); 272 - if (pll->flags & TEGRA_PLL_BYPASS) 226 + if (pll->params->flags & TEGRA_PLL_BYPASS) 273 227 val &= ~PLL_BASE_BYPASS; 274 228 val |= PLL_BASE_ENABLE; 275 229 pll_writel_base(val, pll); 276 230 277 - if (pll->flags & TEGRA_PLLM) { 231 + if (pll->params->flags & TEGRA_PLLM) { 278 232 val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); 279 233 val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; 280 234 writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); ··· 287 241 u32 val; 288 242 289 243 val = pll_readl_base(pll); 290 - if (pll->flags & TEGRA_PLL_BYPASS) 244 + if (pll->params->flags & TEGRA_PLL_BYPASS) 291 245 val &= ~PLL_BASE_BYPASS; 292 246 val &= ~PLL_BASE_ENABLE; 293 247 pll_writel_base(val, pll); 294 248 295 - if (pll->flags & TEGRA_PLLM) { 249 + if (pll->params->flags & TEGRA_PLLM) { 296 250 val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE); 297 251 val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE; 298 252 writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE); ··· 372 326 struct tegra_clk_pll *pll = to_clk_pll(hw); 373 327 struct tegra_clk_pll_freq_table *sel; 374 328 375 - for (sel = pll->freq_table; sel->input_rate != 0; sel++) 329 + for (sel = pll->params->freq_table; sel->input_rate != 0; sel++) 376 330 if (sel->input_rate == parent_rate && 377 331 sel->output_rate == rate) 378 332 break; ··· 435 389 if (cfg->m > divm_max(pll) || cfg->n > divn_max(pll) || 436 390 (1 << p_div) > divp_max(pll) 437 391 || cfg->output_rate > pll->params->vco_max) { 438 - pr_err("%s: Failed to set %s rate %lu\n", 439 - __func__, __clk_get_name(hw->clk), rate); 440 - WARN_ON(1); 441 392 return -EINVAL; 442 393 } 394 + 395 + cfg->output_rate >>= p_div; 443 396 444 397 if (pll->params->pdiv_tohw) { 445 398 ret = _p_div_to_hw(hw, 1 << p_div); ··· 459 414 struct tegra_clk_pll_params *params = pll->params; 460 415 struct div_nmp *div_nmp = params->div_nmp; 461 416 462 - if ((pll->flags & TEGRA_PLLM) && 417 + if ((params->flags & TEGRA_PLLM) && 463 418 (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & 464 419 PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { 465 420 val = pll_override_readl(params->pmc_divp_reg, pll); ··· 495 450 struct tegra_clk_pll_params *params = pll->params; 496 451 struct div_nmp *div_nmp = params->div_nmp; 497 452 498 - if ((pll->flags & TEGRA_PLLM) && 453 + if ((params->flags & TEGRA_PLLM) && 499 454 (pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) & 500 455 PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) { 501 456 val = pll_override_readl(params->pmc_divp_reg, pll); ··· 524 479 val &= ~(PLL_MISC_CPCON_MASK << PLL_MISC_CPCON_SHIFT); 525 480 val |= cfg->cpcon << PLL_MISC_CPCON_SHIFT; 526 481 527 - if (pll->flags & TEGRA_PLL_SET_LFCON) { 482 + if (pll->params->flags & TEGRA_PLL_SET_LFCON) { 528 483 val &= ~(PLL_MISC_LFCON_MASK << PLL_MISC_LFCON_SHIFT); 529 484 if (cfg->n >= PLLDU_LFCON_SET_DIVN) 530 485 val |= 1 << PLL_MISC_LFCON_SHIFT; 531 - } else if (pll->flags & TEGRA_PLL_SET_DCCON) { 486 + } else if (pll->params->flags & TEGRA_PLL_SET_DCCON) { 532 487 val &= ~(1 << PLL_MISC_DCCON_SHIFT); 533 488 if (rate >= (pll->params->vco_max >> 1)) 534 489 val |= 1 << PLL_MISC_DCCON_SHIFT; ··· 550 505 551 506 _update_pll_mnp(pll, cfg); 552 507 553 - if (pll->flags & TEGRA_PLL_HAS_CPCON) 508 + if (pll->params->flags & TEGRA_PLL_HAS_CPCON) 554 509 _update_pll_cpcon(pll, cfg, rate); 555 510 556 511 if (state) { ··· 569 524 unsigned long flags = 0; 570 525 int ret = 0; 571 526 572 - if (pll->flags & TEGRA_PLL_FIXED) { 573 - if (rate != pll->fixed_rate) { 527 + if (pll->params->flags & TEGRA_PLL_FIXED) { 528 + if (rate != pll->params->fixed_rate) { 574 529 pr_err("%s: Can not change %s fixed rate %lu to %lu\n", 575 530 __func__, __clk_get_name(hw->clk), 576 - pll->fixed_rate, rate); 531 + pll->params->fixed_rate, rate); 577 532 return -EINVAL; 578 533 } 579 534 return 0; ··· 581 536 582 537 if (_get_table_rate(hw, &cfg, rate, parent_rate) && 583 538 _calc_rate(hw, &cfg, rate, parent_rate)) { 539 + pr_err("%s: Failed to set %s rate %lu\n", __func__, 540 + __clk_get_name(hw->clk), rate); 584 541 WARN_ON(1); 585 542 return -EINVAL; 586 543 } ··· 606 559 struct tegra_clk_pll *pll = to_clk_pll(hw); 607 560 struct tegra_clk_pll_freq_table cfg; 608 561 609 - if (pll->flags & TEGRA_PLL_FIXED) 610 - return pll->fixed_rate; 562 + if (pll->params->flags & TEGRA_PLL_FIXED) 563 + return pll->params->fixed_rate; 611 564 612 565 /* PLLM is used for memory; we do not change rate */ 613 - if (pll->flags & TEGRA_PLLM) 566 + if (pll->params->flags & TEGRA_PLLM) 614 567 return __clk_get_rate(hw->clk); 615 568 616 569 if (_get_table_rate(hw, &cfg, rate, *prate) && 617 - _calc_rate(hw, &cfg, rate, *prate)) { 618 - WARN_ON(1); 570 + _calc_rate(hw, &cfg, rate, *prate)) 619 571 return -EINVAL; 620 - } 621 572 622 573 return cfg.output_rate; 623 574 } ··· 631 586 632 587 val = pll_readl_base(pll); 633 588 634 - if ((pll->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS)) 589 + if ((pll->params->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS)) 635 590 return parent_rate; 636 591 637 - if ((pll->flags & TEGRA_PLL_FIXED) && !(val & PLL_BASE_OVERRIDE)) { 592 + if ((pll->params->flags & TEGRA_PLL_FIXED) && 593 + !(val & PLL_BASE_OVERRIDE)) { 638 594 struct tegra_clk_pll_freq_table sel; 639 - if (_get_table_rate(hw, &sel, pll->fixed_rate, parent_rate)) { 595 + if (_get_table_rate(hw, &sel, pll->params->fixed_rate, 596 + parent_rate)) { 640 597 pr_err("Clock %s has unknown fixed frequency\n", 641 598 __clk_get_name(hw->clk)); 642 599 BUG(); 643 600 } 644 - return pll->fixed_rate; 601 + return pll->params->fixed_rate; 645 602 } 646 603 647 604 _get_pll_mnp(pll, &cfg); ··· 711 664 u32 val; 712 665 int err; 713 666 714 - if (_get_table_rate(hw, &sel, pll->fixed_rate, input_rate)) 667 + if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate)) 715 668 return -EINVAL; 716 669 717 670 clk_pll_disable(hw); ··· 727 680 return err; 728 681 } 729 682 730 - if (pll->flags & TEGRA_PLLE_CONFIGURE) { 683 + if (pll->params->flags & TEGRA_PLLE_CONFIGURE) { 731 684 /* configure dividers */ 732 685 val = pll_readl_base(pll); 733 686 val &= ~(divm_mask(pll) | divn_mask(pll) | divp_mask(pll)); ··· 791 744 .enable = clk_plle_enable, 792 745 }; 793 746 794 - #ifdef CONFIG_ARCH_TEGRA_114_SOC 747 + #if defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC) 795 748 796 749 static int _pll_fixed_mdiv(struct tegra_clk_pll_params *pll_params, 797 750 unsigned long parent_rate) ··· 800 753 return 2; 801 754 else 802 755 return 1; 756 + } 757 + 758 + static unsigned long _clip_vco_min(unsigned long vco_min, 759 + unsigned long parent_rate) 760 + { 761 + return DIV_ROUND_UP(vco_min, parent_rate) * parent_rate; 762 + } 763 + 764 + static int _setup_dynamic_ramp(struct tegra_clk_pll_params *pll_params, 765 + void __iomem *clk_base, 766 + unsigned long parent_rate) 767 + { 768 + u32 val; 769 + u32 step_a, step_b; 770 + 771 + switch (parent_rate) { 772 + case 12000000: 773 + case 13000000: 774 + case 26000000: 775 + step_a = 0x2B; 776 + step_b = 0x0B; 777 + break; 778 + case 16800000: 779 + step_a = 0x1A; 780 + step_b = 0x09; 781 + break; 782 + case 19200000: 783 + step_a = 0x12; 784 + step_b = 0x08; 785 + break; 786 + default: 787 + pr_err("%s: Unexpected reference rate %lu\n", 788 + __func__, parent_rate); 789 + WARN_ON(1); 790 + return -EINVAL; 791 + } 792 + 793 + val = step_a << pll_params->stepa_shift; 794 + val |= step_b << pll_params->stepb_shift; 795 + writel_relaxed(val, clk_base + pll_params->dyn_ramp_reg); 796 + 797 + return 0; 803 798 } 804 799 805 800 static int clk_pll_iddq_enable(struct clk_hw *hw) ··· 1262 1173 unsigned long flags = 0; 1263 1174 unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk)); 1264 1175 1265 - if (_get_table_rate(hw, &sel, pll->fixed_rate, input_rate)) 1176 + if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate)) 1266 1177 return -EINVAL; 1267 1178 1268 1179 if (pll->lock) ··· 1306 1217 if (ret < 0) 1307 1218 goto out; 1308 1219 1220 + val = pll_readl(PLLE_SS_CTRL, pll); 1221 + val &= ~(PLLE_SS_CNTL_CENTER | PLLE_SS_CNTL_INVERT); 1222 + val &= ~PLLE_SS_COEFFICIENTS_MASK; 1223 + val |= PLLE_SS_COEFFICIENTS_VAL; 1224 + pll_writel(val, PLLE_SS_CTRL, pll); 1225 + val &= ~(PLLE_SS_CNTL_SSC_BYP | PLLE_SS_CNTL_BYPASS_SS); 1226 + pll_writel(val, PLLE_SS_CTRL, pll); 1227 + udelay(1); 1228 + val &= ~PLLE_SS_CNTL_INTERP_RESET; 1229 + pll_writel(val, PLLE_SS_CTRL, pll); 1230 + udelay(1); 1231 + 1309 1232 /* TODO: enable hw control of xusb brick pll */ 1310 1233 1311 1234 out: ··· 1349 1248 #endif 1350 1249 1351 1250 static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base, 1352 - void __iomem *pmc, unsigned long fixed_rate, 1353 - struct tegra_clk_pll_params *pll_params, u32 pll_flags, 1354 - struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) 1251 + void __iomem *pmc, struct tegra_clk_pll_params *pll_params, 1252 + spinlock_t *lock) 1355 1253 { 1356 1254 struct tegra_clk_pll *pll; 1357 1255 ··· 1361 1261 pll->clk_base = clk_base; 1362 1262 pll->pmc = pmc; 1363 1263 1364 - pll->freq_table = freq_table; 1365 1264 pll->params = pll_params; 1366 - pll->fixed_rate = fixed_rate; 1367 - pll->flags = pll_flags; 1368 1265 pll->lock = lock; 1369 1266 1370 1267 if (!pll_params->div_nmp) ··· 1390 1293 1391 1294 struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, 1392 1295 void __iomem *clk_base, void __iomem *pmc, 1393 - unsigned long flags, unsigned long fixed_rate, 1394 - struct tegra_clk_pll_params *pll_params, u32 pll_flags, 1395 - struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) 1296 + unsigned long flags, struct tegra_clk_pll_params *pll_params, 1297 + spinlock_t *lock) 1396 1298 { 1397 1299 struct tegra_clk_pll *pll; 1398 1300 struct clk *clk; 1399 1301 1400 - pll_flags |= TEGRA_PLL_BYPASS; 1401 - pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1402 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1403 - freq_table, lock); 1302 + pll_params->flags |= TEGRA_PLL_BYPASS; 1303 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1304 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1404 1305 if (IS_ERR(pll)) 1405 1306 return ERR_CAST(pll); 1406 1307 ··· 1412 1317 1413 1318 struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, 1414 1319 void __iomem *clk_base, void __iomem *pmc, 1415 - unsigned long flags, unsigned long fixed_rate, 1416 - struct tegra_clk_pll_params *pll_params, u32 pll_flags, 1417 - struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock) 1320 + unsigned long flags, struct tegra_clk_pll_params *pll_params, 1321 + spinlock_t *lock) 1418 1322 { 1419 1323 struct tegra_clk_pll *pll; 1420 1324 struct clk *clk; 1421 1325 1422 - pll_flags |= TEGRA_PLL_LOCK_MISC | TEGRA_PLL_BYPASS; 1423 - pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1424 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1425 - freq_table, lock); 1326 + pll_params->flags |= TEGRA_PLL_LOCK_MISC | TEGRA_PLL_BYPASS; 1327 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1328 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1426 1329 if (IS_ERR(pll)) 1427 1330 return ERR_CAST(pll); 1428 1331 ··· 1432 1339 return clk; 1433 1340 } 1434 1341 1435 - #ifdef CONFIG_ARCH_TEGRA_114_SOC 1342 + #if defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC) 1436 1343 const struct clk_ops tegra_clk_pllxc_ops = { 1437 1344 .is_enabled = clk_pll_is_enabled, 1438 1345 .enable = clk_pll_iddq_enable, ··· 1479 1386 1480 1387 struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, 1481 1388 void __iomem *clk_base, void __iomem *pmc, 1482 - unsigned long flags, unsigned long fixed_rate, 1389 + unsigned long flags, 1483 1390 struct tegra_clk_pll_params *pll_params, 1484 - u32 pll_flags, 1485 - struct tegra_clk_pll_freq_table *freq_table, 1486 1391 spinlock_t *lock) 1487 1392 { 1488 1393 struct tegra_clk_pll *pll; 1489 - struct clk *clk; 1394 + struct clk *clk, *parent; 1395 + unsigned long parent_rate; 1396 + int err; 1397 + u32 val, val_iddq; 1398 + 1399 + parent = __clk_lookup(parent_name); 1400 + if (!parent) { 1401 + WARN(1, "parent clk %s of %s must be registered first\n", 1402 + name, parent_name); 1403 + return ERR_PTR(-EINVAL); 1404 + } 1490 1405 1491 1406 if (!pll_params->pdiv_tohw) 1492 1407 return ERR_PTR(-EINVAL); 1493 1408 1494 - pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1495 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1496 - freq_table, lock); 1409 + parent_rate = __clk_get_rate(parent); 1410 + 1411 + pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); 1412 + 1413 + err = _setup_dynamic_ramp(pll_params, clk_base, parent_rate); 1414 + if (err) 1415 + return ERR_PTR(err); 1416 + 1417 + val = readl_relaxed(clk_base + pll_params->base_reg); 1418 + val_iddq = readl_relaxed(clk_base + pll_params->iddq_reg); 1419 + 1420 + if (val & PLL_BASE_ENABLE) 1421 + WARN_ON(val_iddq & BIT(pll_params->iddq_bit_idx)); 1422 + else { 1423 + val_iddq |= BIT(pll_params->iddq_bit_idx); 1424 + writel_relaxed(val_iddq, clk_base + pll_params->iddq_reg); 1425 + } 1426 + 1427 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1428 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1497 1429 if (IS_ERR(pll)) 1498 1430 return ERR_CAST(pll); 1499 1431 ··· 1532 1414 1533 1415 struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, 1534 1416 void __iomem *clk_base, void __iomem *pmc, 1535 - unsigned long flags, unsigned long fixed_rate, 1417 + unsigned long flags, 1536 1418 struct tegra_clk_pll_params *pll_params, 1537 - u32 pll_flags, 1538 - struct tegra_clk_pll_freq_table *freq_table, 1539 1419 spinlock_t *lock, unsigned long parent_rate) 1540 1420 { 1541 1421 u32 val; 1542 1422 struct tegra_clk_pll *pll; 1543 1423 struct clk *clk; 1544 1424 1545 - pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_LOCK_MISC; 1546 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1547 - freq_table, lock); 1425 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_LOCK_MISC; 1426 + 1427 + pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); 1428 + 1429 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1548 1430 if (IS_ERR(pll)) 1549 1431 return ERR_CAST(pll); 1550 1432 ··· 1579 1461 1580 1462 struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, 1581 1463 void __iomem *clk_base, void __iomem *pmc, 1582 - unsigned long flags, unsigned long fixed_rate, 1464 + unsigned long flags, 1583 1465 struct tegra_clk_pll_params *pll_params, 1584 - u32 pll_flags, 1585 - struct tegra_clk_pll_freq_table *freq_table, 1586 1466 spinlock_t *lock) 1587 1467 { 1588 1468 struct tegra_clk_pll *pll; 1589 - struct clk *clk; 1469 + struct clk *clk, *parent; 1470 + unsigned long parent_rate; 1590 1471 1591 1472 if (!pll_params->pdiv_tohw) 1592 1473 return ERR_PTR(-EINVAL); 1593 1474 1594 - pll_flags |= TEGRA_PLL_BYPASS; 1595 - pll_flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1596 - pll_flags |= TEGRA_PLLM; 1597 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1598 - freq_table, lock); 1475 + parent = __clk_lookup(parent_name); 1476 + if (!parent) { 1477 + WARN(1, "parent clk %s of %s must be registered first\n", 1478 + name, parent_name); 1479 + return ERR_PTR(-EINVAL); 1480 + } 1481 + 1482 + parent_rate = __clk_get_rate(parent); 1483 + 1484 + pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); 1485 + 1486 + pll_params->flags |= TEGRA_PLL_BYPASS; 1487 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1488 + pll_params->flags |= TEGRA_PLLM; 1489 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1599 1490 if (IS_ERR(pll)) 1600 1491 return ERR_CAST(pll); 1601 1492 ··· 1618 1491 1619 1492 struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, 1620 1493 void __iomem *clk_base, void __iomem *pmc, 1621 - unsigned long flags, unsigned long fixed_rate, 1494 + unsigned long flags, 1622 1495 struct tegra_clk_pll_params *pll_params, 1623 - u32 pll_flags, 1624 - struct tegra_clk_pll_freq_table *freq_table, 1625 1496 spinlock_t *lock) 1626 1497 { 1627 1498 struct clk *parent, *clk; ··· 1632 1507 return ERR_PTR(-EINVAL); 1633 1508 1634 1509 parent = __clk_lookup(parent_name); 1635 - if (IS_ERR(parent)) { 1510 + if (!parent) { 1636 1511 WARN(1, "parent clk %s of %s must be registered first\n", 1637 1512 name, parent_name); 1638 1513 return ERR_PTR(-EINVAL); 1639 1514 } 1640 1515 1641 - pll_flags |= TEGRA_PLL_BYPASS; 1642 - pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 1643 - freq_table, lock); 1516 + parent_rate = __clk_get_rate(parent); 1517 + 1518 + pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); 1519 + 1520 + pll_params->flags |= TEGRA_PLL_BYPASS; 1521 + pll = _tegra_init_pll(clk_base, pmc, pll_params, lock); 1644 1522 if (IS_ERR(pll)) 1645 1523 return ERR_CAST(pll); 1646 - 1647 - parent_rate = __clk_get_rate(parent); 1648 1524 1649 1525 /* 1650 1526 * Most of PLLC register fields are shadowed, and can not be read ··· 1693 1567 struct clk *tegra_clk_register_plle_tegra114(const char *name, 1694 1568 const char *parent_name, 1695 1569 void __iomem *clk_base, unsigned long flags, 1696 - unsigned long fixed_rate, 1697 1570 struct tegra_clk_pll_params *pll_params, 1698 - struct tegra_clk_pll_freq_table *freq_table, 1699 1571 spinlock_t *lock) 1700 1572 { 1701 1573 struct tegra_clk_pll *pll; 1702 1574 struct clk *clk; 1703 1575 u32 val, val_aux; 1704 1576 1705 - pll = _tegra_init_pll(clk_base, NULL, fixed_rate, pll_params, 1706 - TEGRA_PLL_HAS_LOCK_ENABLE, freq_table, lock); 1577 + pll_params->flags |= TEGRA_PLL_HAS_LOCK_ENABLE; 1578 + pll = _tegra_init_pll(clk_base, NULL, pll_params, lock); 1707 1579 if (IS_ERR(pll)) 1708 1580 return ERR_CAST(pll); 1709 1581 ··· 1711 1587 val_aux = pll_readl(pll_params->aux_reg, pll); 1712 1588 1713 1589 if (val & PLL_BASE_ENABLE) { 1714 - if (!(val_aux & PLLE_AUX_PLLRE_SEL)) 1590 + if ((val_aux & PLLE_AUX_PLLRE_SEL) || 1591 + (val_aux & PLLE_AUX_PLLP_SEL)) 1715 1592 WARN(1, "pll_e enabled with unsupported parent %s\n", 1716 - (val & PLLE_AUX_PLLP_SEL) ? "pllp_out0" : "pll_ref"); 1593 + (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" : 1594 + "pll_re_vco"); 1717 1595 } else { 1718 - val_aux |= PLLE_AUX_PLLRE_SEL; 1596 + val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL); 1719 1597 pll_writel(val, pll_params->aux_reg, pll); 1720 1598 } 1721 1599 1722 1600 clk = _tegra_clk_register_pll(pll, name, parent_name, flags, 1723 1601 &tegra_clk_plle_tegra114_ops); 1602 + if (IS_ERR(clk)) 1603 + kfree(pll); 1604 + 1605 + return clk; 1606 + } 1607 + #endif 1608 + 1609 + #ifdef CONFIG_ARCH_TEGRA_124_SOC 1610 + const struct clk_ops tegra_clk_pllss_ops = { 1611 + .is_enabled = clk_pll_is_enabled, 1612 + .enable = clk_pll_iddq_enable, 1613 + .disable = clk_pll_iddq_disable, 1614 + .recalc_rate = clk_pll_recalc_rate, 1615 + .round_rate = clk_pll_ramp_round_rate, 1616 + .set_rate = clk_pllxc_set_rate, 1617 + }; 1618 + 1619 + struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name, 1620 + void __iomem *clk_base, unsigned long flags, 1621 + struct tegra_clk_pll_params *pll_params, 1622 + spinlock_t *lock) 1623 + { 1624 + struct tegra_clk_pll *pll; 1625 + struct clk *clk, *parent; 1626 + struct tegra_clk_pll_freq_table cfg; 1627 + unsigned long parent_rate; 1628 + u32 val; 1629 + int i; 1630 + 1631 + if (!pll_params->div_nmp) 1632 + return ERR_PTR(-EINVAL); 1633 + 1634 + parent = __clk_lookup(parent_name); 1635 + if (!parent) { 1636 + WARN(1, "parent clk %s of %s must be registered first\n", 1637 + name, parent_name); 1638 + return ERR_PTR(-EINVAL); 1639 + } 1640 + 1641 + pll_params->flags = TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_USE_LOCK; 1642 + pll = _tegra_init_pll(clk_base, NULL, pll_params, lock); 1643 + if (IS_ERR(pll)) 1644 + return ERR_CAST(pll); 1645 + 1646 + val = pll_readl_base(pll); 1647 + val &= ~PLLSS_REF_SRC_SEL_MASK; 1648 + pll_writel_base(val, pll); 1649 + 1650 + parent_rate = __clk_get_rate(parent); 1651 + 1652 + pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate); 1653 + 1654 + /* initialize PLL to minimum rate */ 1655 + 1656 + cfg.m = _pll_fixed_mdiv(pll_params, parent_rate); 1657 + cfg.n = cfg.m * pll_params->vco_min / parent_rate; 1658 + 1659 + for (i = 0; pll_params->pdiv_tohw[i].pdiv; i++) 1660 + ; 1661 + if (!i) { 1662 + kfree(pll); 1663 + return ERR_PTR(-EINVAL); 1664 + } 1665 + 1666 + cfg.p = pll_params->pdiv_tohw[i-1].hw_val; 1667 + 1668 + _update_pll_mnp(pll, &cfg); 1669 + 1670 + pll_writel_misc(PLLSS_MISC_DEFAULT, pll); 1671 + pll_writel(PLLSS_CFG_DEFAULT, pll_params->ext_misc_reg[0], pll); 1672 + pll_writel(PLLSS_CTRL1_DEFAULT, pll_params->ext_misc_reg[1], pll); 1673 + pll_writel(PLLSS_CTRL1_DEFAULT, pll_params->ext_misc_reg[2], pll); 1674 + 1675 + val = pll_readl_base(pll); 1676 + if (val & PLL_BASE_ENABLE) { 1677 + if (val & BIT(pll_params->iddq_bit_idx)) { 1678 + WARN(1, "%s is on but IDDQ set\n", name); 1679 + kfree(pll); 1680 + return ERR_PTR(-EINVAL); 1681 + } 1682 + } else 1683 + val |= BIT(pll_params->iddq_bit_idx); 1684 + 1685 + val &= ~PLLSS_LOCK_OVERRIDE; 1686 + pll_writel_base(val, pll); 1687 + 1688 + clk = _tegra_clk_register_pll(pll, name, parent_name, flags, 1689 + &tegra_clk_pllss_ops); 1690 + 1724 1691 if (IS_ERR(clk)) 1725 1692 kfree(pll); 1726 1693
+215
drivers/clk/tegra/clk-tegra-audio.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/of.h> 21 + #include <linux/of_address.h> 22 + #include <linux/delay.h> 23 + #include <linux/export.h> 24 + #include <linux/clk/tegra.h> 25 + 26 + #include "clk.h" 27 + #include "clk-id.h" 28 + 29 + #define AUDIO_SYNC_CLK_I2S0 0x4a0 30 + #define AUDIO_SYNC_CLK_I2S1 0x4a4 31 + #define AUDIO_SYNC_CLK_I2S2 0x4a8 32 + #define AUDIO_SYNC_CLK_I2S3 0x4ac 33 + #define AUDIO_SYNC_CLK_I2S4 0x4b0 34 + #define AUDIO_SYNC_CLK_SPDIF 0x4b4 35 + 36 + #define AUDIO_SYNC_DOUBLER 0x49c 37 + 38 + #define PLLA_OUT 0xb4 39 + 40 + struct tegra_sync_source_initdata { 41 + char *name; 42 + unsigned long rate; 43 + unsigned long max_rate; 44 + int clk_id; 45 + }; 46 + 47 + #define SYNC(_name) \ 48 + {\ 49 + .name = #_name,\ 50 + .rate = 24000000,\ 51 + .max_rate = 24000000,\ 52 + .clk_id = tegra_clk_ ## _name,\ 53 + } 54 + 55 + struct tegra_audio_clk_initdata { 56 + char *gate_name; 57 + char *mux_name; 58 + u32 offset; 59 + int gate_clk_id; 60 + int mux_clk_id; 61 + }; 62 + 63 + #define AUDIO(_name, _offset) \ 64 + {\ 65 + .gate_name = #_name,\ 66 + .mux_name = #_name"_mux",\ 67 + .offset = _offset,\ 68 + .gate_clk_id = tegra_clk_ ## _name,\ 69 + .mux_clk_id = tegra_clk_ ## _name ## _mux,\ 70 + } 71 + 72 + struct tegra_audio2x_clk_initdata { 73 + char *parent; 74 + char *gate_name; 75 + char *name_2x; 76 + char *div_name; 77 + int clk_id; 78 + int clk_num; 79 + u8 div_offset; 80 + }; 81 + 82 + #define AUDIO2X(_name, _num, _offset) \ 83 + {\ 84 + .parent = #_name,\ 85 + .gate_name = #_name"_2x",\ 86 + .name_2x = #_name"_doubler",\ 87 + .div_name = #_name"_div",\ 88 + .clk_id = tegra_clk_ ## _name ## _2x,\ 89 + .clk_num = _num,\ 90 + .div_offset = _offset,\ 91 + } 92 + 93 + static DEFINE_SPINLOCK(clk_doubler_lock); 94 + 95 + static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync", 96 + "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", 97 + }; 98 + 99 + static struct tegra_sync_source_initdata sync_source_clks[] __initdata = { 100 + SYNC(spdif_in_sync), 101 + SYNC(i2s0_sync), 102 + SYNC(i2s1_sync), 103 + SYNC(i2s2_sync), 104 + SYNC(i2s3_sync), 105 + SYNC(i2s4_sync), 106 + SYNC(vimclk_sync), 107 + }; 108 + 109 + static struct tegra_audio_clk_initdata audio_clks[] = { 110 + AUDIO(audio0, AUDIO_SYNC_CLK_I2S0), 111 + AUDIO(audio1, AUDIO_SYNC_CLK_I2S1), 112 + AUDIO(audio2, AUDIO_SYNC_CLK_I2S2), 113 + AUDIO(audio3, AUDIO_SYNC_CLK_I2S3), 114 + AUDIO(audio4, AUDIO_SYNC_CLK_I2S4), 115 + AUDIO(spdif, AUDIO_SYNC_CLK_SPDIF), 116 + }; 117 + 118 + static struct tegra_audio2x_clk_initdata audio2x_clks[] = { 119 + AUDIO2X(audio0, 113, 24), 120 + AUDIO2X(audio1, 114, 25), 121 + AUDIO2X(audio2, 115, 26), 122 + AUDIO2X(audio3, 116, 27), 123 + AUDIO2X(audio4, 117, 28), 124 + AUDIO2X(spdif, 118, 29), 125 + }; 126 + 127 + void __init tegra_audio_clk_init(void __iomem *clk_base, 128 + void __iomem *pmc_base, struct tegra_clk *tegra_clks, 129 + struct tegra_clk_pll_params *pll_a_params) 130 + { 131 + struct clk *clk; 132 + struct clk **dt_clk; 133 + int i; 134 + 135 + /* PLLA */ 136 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_a, tegra_clks); 137 + if (dt_clk) { 138 + clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, 139 + pmc_base, 0, pll_a_params, NULL); 140 + *dt_clk = clk; 141 + } 142 + 143 + /* PLLA_OUT0 */ 144 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_a_out0, tegra_clks); 145 + if (dt_clk) { 146 + clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", 147 + clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 148 + 8, 8, 1, NULL); 149 + clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", 150 + clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED | 151 + CLK_SET_RATE_PARENT, 0, NULL); 152 + *dt_clk = clk; 153 + } 154 + 155 + for (i = 0; i < ARRAY_SIZE(sync_source_clks); i++) { 156 + struct tegra_sync_source_initdata *data; 157 + 158 + data = &sync_source_clks[i]; 159 + 160 + dt_clk = tegra_lookup_dt_id(data->clk_id, tegra_clks); 161 + if (!dt_clk) 162 + continue; 163 + 164 + clk = tegra_clk_register_sync_source(data->name, 165 + data->rate, data->max_rate); 166 + *dt_clk = clk; 167 + } 168 + 169 + for (i = 0; i < ARRAY_SIZE(audio_clks); i++) { 170 + struct tegra_audio_clk_initdata *data; 171 + 172 + data = &audio_clks[i]; 173 + dt_clk = tegra_lookup_dt_id(data->mux_clk_id, tegra_clks); 174 + 175 + if (!dt_clk) 176 + continue; 177 + clk = clk_register_mux(NULL, data->mux_name, mux_audio_sync_clk, 178 + ARRAY_SIZE(mux_audio_sync_clk), 179 + CLK_SET_RATE_NO_REPARENT, 180 + clk_base + data->offset, 0, 3, 0, 181 + NULL); 182 + *dt_clk = clk; 183 + 184 + dt_clk = tegra_lookup_dt_id(data->gate_clk_id, tegra_clks); 185 + if (!dt_clk) 186 + continue; 187 + 188 + clk = clk_register_gate(NULL, data->gate_name, data->mux_name, 189 + 0, clk_base + data->offset, 4, 190 + CLK_GATE_SET_TO_DISABLE, NULL); 191 + *dt_clk = clk; 192 + } 193 + 194 + for (i = 0; i < ARRAY_SIZE(audio2x_clks); i++) { 195 + struct tegra_audio2x_clk_initdata *data; 196 + 197 + data = &audio2x_clks[i]; 198 + dt_clk = tegra_lookup_dt_id(data->clk_id, tegra_clks); 199 + if (!dt_clk) 200 + continue; 201 + 202 + clk = clk_register_fixed_factor(NULL, data->name_2x, 203 + data->parent, CLK_SET_RATE_PARENT, 2, 1); 204 + clk = tegra_clk_register_divider(data->div_name, 205 + data->name_2x, clk_base + AUDIO_SYNC_DOUBLER, 206 + 0, 0, data->div_offset, 1, 0, 207 + &clk_doubler_lock); 208 + clk = tegra_clk_register_periph_gate(data->gate_name, 209 + data->div_name, TEGRA_PERIPH_NO_RESET, 210 + clk_base, CLK_SET_RATE_PARENT, data->clk_num, 211 + periph_clk_enb_refcnt); 212 + *dt_clk = clk; 213 + } 214 + } 215 +
+111
drivers/clk/tegra/clk-tegra-fixed.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/of.h> 21 + #include <linux/of_address.h> 22 + #include <linux/delay.h> 23 + #include <linux/export.h> 24 + #include <linux/clk/tegra.h> 25 + 26 + #include "clk.h" 27 + #include "clk-id.h" 28 + 29 + #define OSC_CTRL 0x50 30 + #define OSC_CTRL_OSC_FREQ_SHIFT 28 31 + #define OSC_CTRL_PLL_REF_DIV_SHIFT 26 32 + 33 + int __init tegra_osc_clk_init(void __iomem *clk_base, 34 + struct tegra_clk *tegra_clks, 35 + unsigned long *input_freqs, int num, 36 + unsigned long *osc_freq, 37 + unsigned long *pll_ref_freq) 38 + { 39 + struct clk *clk; 40 + struct clk **dt_clk; 41 + u32 val, pll_ref_div; 42 + unsigned osc_idx; 43 + 44 + val = readl_relaxed(clk_base + OSC_CTRL); 45 + osc_idx = val >> OSC_CTRL_OSC_FREQ_SHIFT; 46 + 47 + if (osc_idx < num) 48 + *osc_freq = input_freqs[osc_idx]; 49 + else 50 + *osc_freq = 0; 51 + 52 + if (!*osc_freq) { 53 + WARN_ON(1); 54 + return -EINVAL; 55 + } 56 + 57 + dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m, tegra_clks); 58 + if (!dt_clk) 59 + return 0; 60 + 61 + clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT, 62 + *osc_freq); 63 + *dt_clk = clk; 64 + 65 + /* pll_ref */ 66 + val = (val >> OSC_CTRL_PLL_REF_DIV_SHIFT) & 3; 67 + pll_ref_div = 1 << val; 68 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_ref, tegra_clks); 69 + if (!dt_clk) 70 + return 0; 71 + 72 + clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m", 73 + 0, 1, pll_ref_div); 74 + *dt_clk = clk; 75 + 76 + if (pll_ref_freq) 77 + *pll_ref_freq = *osc_freq / pll_ref_div; 78 + 79 + return 0; 80 + } 81 + 82 + void __init tegra_fixed_clk_init(struct tegra_clk *tegra_clks) 83 + { 84 + struct clk *clk; 85 + struct clk **dt_clk; 86 + 87 + /* clk_32k */ 88 + dt_clk = tegra_lookup_dt_id(tegra_clk_clk_32k, tegra_clks); 89 + if (dt_clk) { 90 + clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, 91 + CLK_IS_ROOT, 32768); 92 + *dt_clk = clk; 93 + } 94 + 95 + /* clk_m_div2 */ 96 + dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m_div2, tegra_clks); 97 + if (dt_clk) { 98 + clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m", 99 + CLK_SET_RATE_PARENT, 1, 2); 100 + *dt_clk = clk; 101 + } 102 + 103 + /* clk_m_div4 */ 104 + dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m_div4, tegra_clks); 105 + if (dt_clk) { 106 + clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m", 107 + CLK_SET_RATE_PARENT, 1, 4); 108 + *dt_clk = clk; 109 + } 110 + } 111 +
+674
drivers/clk/tegra/clk-tegra-periph.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/clkdev.h> 21 + #include <linux/of.h> 22 + #include <linux/of_address.h> 23 + #include <linux/delay.h> 24 + #include <linux/export.h> 25 + #include <linux/clk/tegra.h> 26 + 27 + #include "clk.h" 28 + #include "clk-id.h" 29 + 30 + #define CLK_SOURCE_I2S0 0x1d8 31 + #define CLK_SOURCE_I2S1 0x100 32 + #define CLK_SOURCE_I2S2 0x104 33 + #define CLK_SOURCE_NDFLASH 0x160 34 + #define CLK_SOURCE_I2S3 0x3bc 35 + #define CLK_SOURCE_I2S4 0x3c0 36 + #define CLK_SOURCE_SPDIF_OUT 0x108 37 + #define CLK_SOURCE_SPDIF_IN 0x10c 38 + #define CLK_SOURCE_PWM 0x110 39 + #define CLK_SOURCE_ADX 0x638 40 + #define CLK_SOURCE_ADX1 0x670 41 + #define CLK_SOURCE_AMX 0x63c 42 + #define CLK_SOURCE_AMX1 0x674 43 + #define CLK_SOURCE_HDA 0x428 44 + #define CLK_SOURCE_HDA2CODEC_2X 0x3e4 45 + #define CLK_SOURCE_SBC1 0x134 46 + #define CLK_SOURCE_SBC2 0x118 47 + #define CLK_SOURCE_SBC3 0x11c 48 + #define CLK_SOURCE_SBC4 0x1b4 49 + #define CLK_SOURCE_SBC5 0x3c8 50 + #define CLK_SOURCE_SBC6 0x3cc 51 + #define CLK_SOURCE_SATA_OOB 0x420 52 + #define CLK_SOURCE_SATA 0x424 53 + #define CLK_SOURCE_NDSPEED 0x3f8 54 + #define CLK_SOURCE_VFIR 0x168 55 + #define CLK_SOURCE_SDMMC1 0x150 56 + #define CLK_SOURCE_SDMMC2 0x154 57 + #define CLK_SOURCE_SDMMC3 0x1bc 58 + #define CLK_SOURCE_SDMMC4 0x164 59 + #define CLK_SOURCE_CVE 0x140 60 + #define CLK_SOURCE_TVO 0x188 61 + #define CLK_SOURCE_TVDAC 0x194 62 + #define CLK_SOURCE_VDE 0x1c8 63 + #define CLK_SOURCE_CSITE 0x1d4 64 + #define CLK_SOURCE_LA 0x1f8 65 + #define CLK_SOURCE_TRACE 0x634 66 + #define CLK_SOURCE_OWR 0x1cc 67 + #define CLK_SOURCE_NOR 0x1d0 68 + #define CLK_SOURCE_MIPI 0x174 69 + #define CLK_SOURCE_I2C1 0x124 70 + #define CLK_SOURCE_I2C2 0x198 71 + #define CLK_SOURCE_I2C3 0x1b8 72 + #define CLK_SOURCE_I2C4 0x3c4 73 + #define CLK_SOURCE_I2C5 0x128 74 + #define CLK_SOURCE_I2C6 0x65c 75 + #define CLK_SOURCE_UARTA 0x178 76 + #define CLK_SOURCE_UARTB 0x17c 77 + #define CLK_SOURCE_UARTC 0x1a0 78 + #define CLK_SOURCE_UARTD 0x1c0 79 + #define CLK_SOURCE_UARTE 0x1c4 80 + #define CLK_SOURCE_3D 0x158 81 + #define CLK_SOURCE_2D 0x15c 82 + #define CLK_SOURCE_MPE 0x170 83 + #define CLK_SOURCE_UARTE 0x1c4 84 + #define CLK_SOURCE_VI_SENSOR 0x1a8 85 + #define CLK_SOURCE_VI 0x148 86 + #define CLK_SOURCE_EPP 0x16c 87 + #define CLK_SOURCE_MSENC 0x1f0 88 + #define CLK_SOURCE_TSEC 0x1f4 89 + #define CLK_SOURCE_HOST1X 0x180 90 + #define CLK_SOURCE_HDMI 0x18c 91 + #define CLK_SOURCE_DISP1 0x138 92 + #define CLK_SOURCE_DISP2 0x13c 93 + #define CLK_SOURCE_CILAB 0x614 94 + #define CLK_SOURCE_CILCD 0x618 95 + #define CLK_SOURCE_CILE 0x61c 96 + #define CLK_SOURCE_DSIALP 0x620 97 + #define CLK_SOURCE_DSIBLP 0x624 98 + #define CLK_SOURCE_TSENSOR 0x3b8 99 + #define CLK_SOURCE_D_AUDIO 0x3d0 100 + #define CLK_SOURCE_DAM0 0x3d8 101 + #define CLK_SOURCE_DAM1 0x3dc 102 + #define CLK_SOURCE_DAM2 0x3e0 103 + #define CLK_SOURCE_ACTMON 0x3e8 104 + #define CLK_SOURCE_EXTERN1 0x3ec 105 + #define CLK_SOURCE_EXTERN2 0x3f0 106 + #define CLK_SOURCE_EXTERN3 0x3f4 107 + #define CLK_SOURCE_I2CSLOW 0x3fc 108 + #define CLK_SOURCE_SE 0x42c 109 + #define CLK_SOURCE_MSELECT 0x3b4 110 + #define CLK_SOURCE_DFLL_REF 0x62c 111 + #define CLK_SOURCE_DFLL_SOC 0x630 112 + #define CLK_SOURCE_SOC_THERM 0x644 113 + #define CLK_SOURCE_XUSB_HOST_SRC 0x600 114 + #define CLK_SOURCE_XUSB_FALCON_SRC 0x604 115 + #define CLK_SOURCE_XUSB_FS_SRC 0x608 116 + #define CLK_SOURCE_XUSB_SS_SRC 0x610 117 + #define CLK_SOURCE_XUSB_DEV_SRC 0x60c 118 + #define CLK_SOURCE_ISP 0x144 119 + #define CLK_SOURCE_SOR0 0x414 120 + #define CLK_SOURCE_DPAUX 0x418 121 + #define CLK_SOURCE_SATA_OOB 0x420 122 + #define CLK_SOURCE_SATA 0x424 123 + #define CLK_SOURCE_ENTROPY 0x628 124 + #define CLK_SOURCE_VI_SENSOR2 0x658 125 + #define CLK_SOURCE_HDMI_AUDIO 0x668 126 + #define CLK_SOURCE_VIC03 0x678 127 + #define CLK_SOURCE_CLK72MHZ 0x66c 128 + 129 + #define MASK(x) (BIT(x) - 1) 130 + 131 + #define MUX(_name, _parents, _offset, \ 132 + _clk_num, _gate_flags, _clk_id) \ 133 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 134 + 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \ 135 + _clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\ 136 + NULL) 137 + 138 + #define MUX_FLAGS(_name, _parents, _offset,\ 139 + _clk_num, _gate_flags, _clk_id, flags)\ 140 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 141 + 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\ 142 + _clk_num, _gate_flags, _clk_id, _parents##_idx, flags,\ 143 + NULL) 144 + 145 + #define MUX8(_name, _parents, _offset, \ 146 + _clk_num, _gate_flags, _clk_id) \ 147 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 148 + 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\ 149 + _clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\ 150 + NULL) 151 + 152 + #define MUX8_NOGATE_LOCK(_name, _parents, _offset, _clk_id, _lock) \ 153 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \ 154 + 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\ 155 + 0, TEGRA_PERIPH_NO_GATE, _clk_id,\ 156 + _parents##_idx, 0, _lock) 157 + 158 + #define INT(_name, _parents, _offset, \ 159 + _clk_num, _gate_flags, _clk_id) \ 160 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 161 + 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \ 162 + TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\ 163 + _clk_id, _parents##_idx, 0, NULL) 164 + 165 + #define INT_FLAGS(_name, _parents, _offset,\ 166 + _clk_num, _gate_flags, _clk_id, flags)\ 167 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 168 + 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \ 169 + TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\ 170 + _clk_id, _parents##_idx, flags, NULL) 171 + 172 + #define INT8(_name, _parents, _offset,\ 173 + _clk_num, _gate_flags, _clk_id) \ 174 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 175 + 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \ 176 + TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\ 177 + _clk_id, _parents##_idx, 0, NULL) 178 + 179 + #define UART(_name, _parents, _offset,\ 180 + _clk_num, _clk_id) \ 181 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 182 + 30, MASK(2), 0, 0, 16, 1, TEGRA_DIVIDER_UART| \ 183 + TEGRA_DIVIDER_ROUND_UP, _clk_num, 0, _clk_id,\ 184 + _parents##_idx, 0, NULL) 185 + 186 + #define I2C(_name, _parents, _offset,\ 187 + _clk_num, _clk_id) \ 188 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 189 + 30, MASK(2), 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP,\ 190 + _clk_num, 0, _clk_id, _parents##_idx, 0, NULL) 191 + 192 + #define XUSB(_name, _parents, _offset, \ 193 + _clk_num, _gate_flags, _clk_id) \ 194 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \ 195 + 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT| \ 196 + TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags,\ 197 + _clk_id, _parents##_idx, 0, NULL) 198 + 199 + #define AUDIO(_name, _offset, _clk_num,\ 200 + _gate_flags, _clk_id) \ 201 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, mux_d_audio_clk, \ 202 + _offset, 16, 0xE01F, 0, 0, 8, 1, \ 203 + TEGRA_DIVIDER_ROUND_UP, _clk_num, _gate_flags, \ 204 + _clk_id, mux_d_audio_clk_idx, 0, NULL) 205 + 206 + #define NODIV(_name, _parents, _offset, \ 207 + _mux_shift, _mux_mask, _clk_num, \ 208 + _gate_flags, _clk_id, _lock) \ 209 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 210 + _mux_shift, _mux_mask, 0, 0, 0, 0, 0,\ 211 + _clk_num, (_gate_flags) | TEGRA_PERIPH_NO_DIV,\ 212 + _clk_id, _parents##_idx, 0, _lock) 213 + 214 + #define GATE(_name, _parent_name, \ 215 + _clk_num, _gate_flags, _clk_id, _flags) \ 216 + { \ 217 + .name = _name, \ 218 + .clk_id = _clk_id, \ 219 + .p.parent_name = _parent_name, \ 220 + .periph = TEGRA_CLK_PERIPH(0, 0, 0, 0, 0, 0, 0, \ 221 + _clk_num, _gate_flags, 0, NULL), \ 222 + .flags = _flags \ 223 + } 224 + 225 + #define PLLP_BASE 0xa0 226 + #define PLLP_MISC 0xac 227 + #define PLLP_OUTA 0xa4 228 + #define PLLP_OUTB 0xa8 229 + #define PLLP_OUTC 0x67c 230 + 231 + #define PLL_BASE_LOCK BIT(27) 232 + #define PLL_MISC_LOCK_ENABLE 18 233 + 234 + static DEFINE_SPINLOCK(PLLP_OUTA_lock); 235 + static DEFINE_SPINLOCK(PLLP_OUTB_lock); 236 + static DEFINE_SPINLOCK(PLLP_OUTC_lock); 237 + static DEFINE_SPINLOCK(sor0_lock); 238 + 239 + #define MUX_I2S_SPDIF(_id) \ 240 + static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \ 241 + #_id, "pll_p",\ 242 + "clk_m"}; 243 + MUX_I2S_SPDIF(audio0) 244 + MUX_I2S_SPDIF(audio1) 245 + MUX_I2S_SPDIF(audio2) 246 + MUX_I2S_SPDIF(audio3) 247 + MUX_I2S_SPDIF(audio4) 248 + MUX_I2S_SPDIF(audio) 249 + 250 + #define mux_pllaout0_audio0_2x_pllp_clkm_idx NULL 251 + #define mux_pllaout0_audio1_2x_pllp_clkm_idx NULL 252 + #define mux_pllaout0_audio2_2x_pllp_clkm_idx NULL 253 + #define mux_pllaout0_audio3_2x_pllp_clkm_idx NULL 254 + #define mux_pllaout0_audio4_2x_pllp_clkm_idx NULL 255 + #define mux_pllaout0_audio_2x_pllp_clkm_idx NULL 256 + 257 + static const char *mux_pllp_pllc_pllm_clkm[] = { 258 + "pll_p", "pll_c", "pll_m", "clk_m" 259 + }; 260 + #define mux_pllp_pllc_pllm_clkm_idx NULL 261 + 262 + static const char *mux_pllp_pllc_pllm[] = { "pll_p", "pll_c", "pll_m" }; 263 + #define mux_pllp_pllc_pllm_idx NULL 264 + 265 + static const char *mux_pllp_pllc_clk32_clkm[] = { 266 + "pll_p", "pll_c", "clk_32k", "clk_m" 267 + }; 268 + #define mux_pllp_pllc_clk32_clkm_idx NULL 269 + 270 + static const char *mux_plla_pllc_pllp_clkm[] = { 271 + "pll_a_out0", "pll_c", "pll_p", "clk_m" 272 + }; 273 + #define mux_plla_pllc_pllp_clkm_idx mux_pllp_pllc_pllm_clkm_idx 274 + 275 + static const char *mux_pllp_pllc2_c_c3_pllm_clkm[] = { 276 + "pll_p", "pll_c2", "pll_c", "pll_c3", "pll_m", "clk_m" 277 + }; 278 + static u32 mux_pllp_pllc2_c_c3_pllm_clkm_idx[] = { 279 + [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, 280 + }; 281 + 282 + static const char *mux_pllp_clkm[] = { 283 + "pll_p", "clk_m" 284 + }; 285 + static u32 mux_pllp_clkm_idx[] = { 286 + [0] = 0, [1] = 3, 287 + }; 288 + 289 + static const char *mux_pllm_pllc2_c_c3_pllp_plla[] = { 290 + "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0" 291 + }; 292 + #define mux_pllm_pllc2_c_c3_pllp_plla_idx mux_pllp_pllc2_c_c3_pllm_clkm_idx 293 + 294 + static const char *mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = { 295 + "pll_p", "pll_m", "pll_d_out0", "pll_a_out0", "pll_c", 296 + "pll_d2_out0", "clk_m" 297 + }; 298 + #define mux_pllp_pllm_plld_plla_pllc_plld2_clkm_idx NULL 299 + 300 + static const char *mux_pllm_pllc_pllp_plla[] = { 301 + "pll_m", "pll_c", "pll_p", "pll_a_out0" 302 + }; 303 + #define mux_pllm_pllc_pllp_plla_idx mux_pllp_pllc_pllm_clkm_idx 304 + 305 + static const char *mux_pllp_pllc_clkm[] = { 306 + "pll_p", "pll_c", "pll_m" 307 + }; 308 + static u32 mux_pllp_pllc_clkm_idx[] = { 309 + [0] = 0, [1] = 1, [2] = 3, 310 + }; 311 + 312 + static const char *mux_pllp_pllc_clkm_clk32[] = { 313 + "pll_p", "pll_c", "clk_m", "clk_32k" 314 + }; 315 + #define mux_pllp_pllc_clkm_clk32_idx NULL 316 + 317 + static const char *mux_plla_clk32_pllp_clkm_plle[] = { 318 + "pll_a_out0", "clk_32k", "pll_p", "clk_m", "pll_e_out0" 319 + }; 320 + #define mux_plla_clk32_pllp_clkm_plle_idx NULL 321 + 322 + static const char *mux_clkm_pllp_pllc_pllre[] = { 323 + "clk_m", "pll_p", "pll_c", "pll_re_out" 324 + }; 325 + static u32 mux_clkm_pllp_pllc_pllre_idx[] = { 326 + [0] = 0, [1] = 1, [2] = 3, [3] = 5, 327 + }; 328 + 329 + static const char *mux_clkm_48M_pllp_480M[] = { 330 + "clk_m", "pll_u_48M", "pll_p", "pll_u_480M" 331 + }; 332 + #define mux_clkm_48M_pllp_480M_idx NULL 333 + 334 + static const char *mux_clkm_pllre_clk32_480M_pllc_ref[] = { 335 + "clk_m", "pll_re_out", "clk_32k", "pll_u_480M", "pll_c", "pll_ref" 336 + }; 337 + static u32 mux_clkm_pllre_clk32_480M_pllc_ref_idx[] = { 338 + [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 4, [5] = 7, 339 + }; 340 + 341 + static const char *mux_d_audio_clk[] = { 342 + "pll_a_out0", "pll_p", "clk_m", "spdif_in_sync", "i2s0_sync", 343 + "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", 344 + }; 345 + static u32 mux_d_audio_clk_idx[] = { 346 + [0] = 0, [1] = 0x8000, [2] = 0xc000, [3] = 0xE000, [4] = 0xE001, 347 + [5] = 0xE002, [6] = 0xE003, [7] = 0xE004, [8] = 0xE005, [9] = 0xE007, 348 + }; 349 + 350 + static const char *mux_pllp_plld_pllc_clkm[] = { 351 + "pll_p", "pll_d_out0", "pll_c", "clk_m" 352 + }; 353 + #define mux_pllp_plld_pllc_clkm_idx NULL 354 + static const char *mux_pllm_pllc_pllp_plla_clkm_pllc4[] = { 355 + "pll_m", "pll_c", "pll_p", "pll_a_out0", "clk_m", "pll_c4", 356 + }; 357 + static u32 mux_pllm_pllc_pllp_plla_clkm_pllc4_idx[] = { 358 + [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 6, [5] = 7, 359 + }; 360 + 361 + static const char *mux_pllp_clkm1[] = { 362 + "pll_p", "clk_m", 363 + }; 364 + #define mux_pllp_clkm1_idx NULL 365 + 366 + static const char *mux_pllp3_pllc_clkm[] = { 367 + "pll_p_out3", "pll_c", "pll_c2", "clk_m", 368 + }; 369 + #define mux_pllp3_pllc_clkm_idx NULL 370 + 371 + static const char *mux_pllm_pllc_pllp_plla_pllc2_c3_clkm[] = { 372 + "pll_m", "pll_c", "pll_p", "pll_a", "pll_c2", "pll_c3", "clk_m" 373 + }; 374 + static u32 mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx[] = { 375 + [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, 376 + }; 377 + 378 + static const char *mux_pllm_pllc2_c_c3_pllp_plla_pllc4[] = { 379 + "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0", "pll_c4", 380 + }; 381 + static u32 mux_pllm_pllc2_c_c3_pllp_plla_pllc4_idx[] = { 382 + [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, [6] = 7, 383 + }; 384 + 385 + static const char *mux_clkm_plldp_sor0lvds[] = { 386 + "clk_m", "pll_dp", "sor0_lvds", 387 + }; 388 + #define mux_clkm_plldp_sor0lvds_idx NULL 389 + 390 + static struct tegra_periph_init_data periph_clks[] = { 391 + AUDIO("d_audio", CLK_SOURCE_D_AUDIO, 106, TEGRA_PERIPH_ON_APB, tegra_clk_d_audio), 392 + AUDIO("dam0", CLK_SOURCE_DAM0, 108, TEGRA_PERIPH_ON_APB, tegra_clk_dam0), 393 + AUDIO("dam1", CLK_SOURCE_DAM1, 109, TEGRA_PERIPH_ON_APB, tegra_clk_dam1), 394 + AUDIO("dam2", CLK_SOURCE_DAM2, 110, TEGRA_PERIPH_ON_APB, tegra_clk_dam2), 395 + I2C("i2c1", mux_pllp_clkm, CLK_SOURCE_I2C1, 12, tegra_clk_i2c1), 396 + I2C("i2c2", mux_pllp_clkm, CLK_SOURCE_I2C2, 54, tegra_clk_i2c2), 397 + I2C("i2c3", mux_pllp_clkm, CLK_SOURCE_I2C3, 67, tegra_clk_i2c3), 398 + I2C("i2c4", mux_pllp_clkm, CLK_SOURCE_I2C4, 103, tegra_clk_i2c4), 399 + I2C("i2c5", mux_pllp_clkm, CLK_SOURCE_I2C5, 47, tegra_clk_i2c5), 400 + INT("vde", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_VDE, 61, 0, tegra_clk_vde), 401 + INT("vi", mux_pllm_pllc_pllp_plla, CLK_SOURCE_VI, 20, 0, tegra_clk_vi), 402 + INT("epp", mux_pllm_pllc_pllp_plla, CLK_SOURCE_EPP, 19, 0, tegra_clk_epp), 403 + INT("host1x", mux_pllm_pllc_pllp_plla, CLK_SOURCE_HOST1X, 28, 0, tegra_clk_host1x), 404 + INT("mpe", mux_pllm_pllc_pllp_plla, CLK_SOURCE_MPE, 60, 0, tegra_clk_mpe), 405 + INT("2d", mux_pllm_pllc_pllp_plla, CLK_SOURCE_2D, 21, 0, tegra_clk_gr2d), 406 + INT("3d", mux_pllm_pllc_pllp_plla, CLK_SOURCE_3D, 24, 0, tegra_clk_gr3d), 407 + INT8("vde", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_VDE, 61, 0, tegra_clk_vde_8), 408 + INT8("vi", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI, 20, 0, tegra_clk_vi_8), 409 + INT8("vi", mux_pllm_pllc2_c_c3_pllp_plla_pllc4, CLK_SOURCE_VI, 20, 0, tegra_clk_vi_9), 410 + INT8("epp", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_EPP, 19, 0, tegra_clk_epp_8), 411 + INT8("msenc", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_MSENC, 91, TEGRA_PERIPH_WAR_1005168, tegra_clk_msenc), 412 + INT8("tsec", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_TSEC, 83, 0, tegra_clk_tsec), 413 + INT8("host1x", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_HOST1X, 28, 0, tegra_clk_host1x_8), 414 + INT8("se", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SE, 127, TEGRA_PERIPH_ON_APB, tegra_clk_se), 415 + INT8("2d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_2D, 21, 0, tegra_clk_gr2d_8), 416 + INT8("3d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_3D, 24, 0, tegra_clk_gr3d_8), 417 + INT8("vic03", mux_pllm_pllc_pllp_plla_pllc2_c3_clkm, CLK_SOURCE_VIC03, 178, 0, tegra_clk_vic03), 418 + INT_FLAGS("mselect", mux_pllp_clkm, CLK_SOURCE_MSELECT, 99, 0, tegra_clk_mselect, CLK_IGNORE_UNUSED), 419 + MUX("i2s0", mux_pllaout0_audio0_2x_pllp_clkm, CLK_SOURCE_I2S0, 30, TEGRA_PERIPH_ON_APB, tegra_clk_i2s0), 420 + MUX("i2s1", mux_pllaout0_audio1_2x_pllp_clkm, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, tegra_clk_i2s1), 421 + MUX("i2s2", mux_pllaout0_audio2_2x_pllp_clkm, CLK_SOURCE_I2S2, 18, TEGRA_PERIPH_ON_APB, tegra_clk_i2s2), 422 + MUX("i2s3", mux_pllaout0_audio3_2x_pllp_clkm, CLK_SOURCE_I2S3, 101, TEGRA_PERIPH_ON_APB, tegra_clk_i2s3), 423 + MUX("i2s4", mux_pllaout0_audio4_2x_pllp_clkm, CLK_SOURCE_I2S4, 102, TEGRA_PERIPH_ON_APB, tegra_clk_i2s4), 424 + MUX("spdif_out", mux_pllaout0_audio_2x_pllp_clkm, CLK_SOURCE_SPDIF_OUT, 10, TEGRA_PERIPH_ON_APB, tegra_clk_spdif_out), 425 + MUX("spdif_in", mux_pllp_pllc_pllm, CLK_SOURCE_SPDIF_IN, 10, TEGRA_PERIPH_ON_APB, tegra_clk_spdif_in), 426 + MUX("pwm", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_PWM, 17, TEGRA_PERIPH_ON_APB, tegra_clk_pwm), 427 + MUX("adx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX, 154, TEGRA_PERIPH_ON_APB, tegra_clk_adx), 428 + MUX("amx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX, 153, TEGRA_PERIPH_ON_APB, tegra_clk_amx), 429 + MUX("hda", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA, 125, TEGRA_PERIPH_ON_APB, tegra_clk_hda), 430 + MUX("hda2codec_2x", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA2CODEC_2X, 111, TEGRA_PERIPH_ON_APB, tegra_clk_hda2codec_2x), 431 + MUX("vfir", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_VFIR, 7, TEGRA_PERIPH_ON_APB, tegra_clk_vfir), 432 + MUX("sdmmc1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC1, 14, 0, tegra_clk_sdmmc1), 433 + MUX("sdmmc2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC2, 9, 0, tegra_clk_sdmmc2), 434 + MUX("sdmmc3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC3, 69, 0, tegra_clk_sdmmc3), 435 + MUX("sdmmc4", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC4, 15, 0, tegra_clk_sdmmc4), 436 + MUX("la", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_LA, 76, TEGRA_PERIPH_ON_APB, tegra_clk_la), 437 + MUX("trace", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_TRACE, 77, TEGRA_PERIPH_ON_APB, tegra_clk_trace), 438 + MUX("owr", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_OWR, 71, TEGRA_PERIPH_ON_APB, tegra_clk_owr), 439 + MUX("nor", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_NOR, 42, 0, tegra_clk_nor), 440 + MUX("mipi", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_MIPI, 50, TEGRA_PERIPH_ON_APB, tegra_clk_mipi), 441 + MUX("vi_sensor", mux_pllm_pllc_pllp_plla, CLK_SOURCE_VI_SENSOR, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor), 442 + MUX("cilab", mux_pllp_pllc_clkm, CLK_SOURCE_CILAB, 144, 0, tegra_clk_cilab), 443 + MUX("cilcd", mux_pllp_pllc_clkm, CLK_SOURCE_CILCD, 145, 0, tegra_clk_cilcd), 444 + MUX("cile", mux_pllp_pllc_clkm, CLK_SOURCE_CILE, 146, 0, tegra_clk_cile), 445 + MUX("dsialp", mux_pllp_pllc_clkm, CLK_SOURCE_DSIALP, 147, 0, tegra_clk_dsialp), 446 + MUX("dsiblp", mux_pllp_pllc_clkm, CLK_SOURCE_DSIBLP, 148, 0, tegra_clk_dsiblp), 447 + MUX("tsensor", mux_pllp_pllc_clkm_clk32, CLK_SOURCE_TSENSOR, 100, TEGRA_PERIPH_ON_APB, tegra_clk_tsensor), 448 + MUX("actmon", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_ACTMON, 119, 0, tegra_clk_actmon), 449 + MUX("dfll_ref", mux_pllp_clkm, CLK_SOURCE_DFLL_REF, 155, TEGRA_PERIPH_ON_APB, tegra_clk_dfll_ref), 450 + MUX("dfll_soc", mux_pllp_clkm, CLK_SOURCE_DFLL_SOC, 155, TEGRA_PERIPH_ON_APB, tegra_clk_dfll_soc), 451 + MUX("i2cslow", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_I2CSLOW, 81, TEGRA_PERIPH_ON_APB, tegra_clk_i2cslow), 452 + MUX("sbc1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1), 453 + MUX("sbc2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2), 454 + MUX("sbc3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3), 455 + MUX("sbc4", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC4, 68, TEGRA_PERIPH_ON_APB, tegra_clk_sbc4), 456 + MUX("sbc5", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC5, 104, TEGRA_PERIPH_ON_APB, tegra_clk_sbc5), 457 + MUX("sbc6", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC6, 105, TEGRA_PERIPH_ON_APB, tegra_clk_sbc6), 458 + MUX("cve", mux_pllp_plld_pllc_clkm, CLK_SOURCE_CVE, 49, 0, tegra_clk_cve), 459 + MUX("tvo", mux_pllp_plld_pllc_clkm, CLK_SOURCE_TVO, 49, 0, tegra_clk_tvo), 460 + MUX("tvdac", mux_pllp_plld_pllc_clkm, CLK_SOURCE_TVDAC, 53, 0, tegra_clk_tvdac), 461 + MUX("ndflash", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_NDFLASH, 13, TEGRA_PERIPH_ON_APB, tegra_clk_ndflash), 462 + MUX("ndspeed", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_NDSPEED, 80, TEGRA_PERIPH_ON_APB, tegra_clk_ndspeed), 463 + MUX("sata_oob", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SATA_OOB, 123, TEGRA_PERIPH_ON_APB, tegra_clk_sata_oob), 464 + MUX("sata", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SATA, 124, TEGRA_PERIPH_ON_APB, tegra_clk_sata), 465 + MUX("adx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX1, 180, TEGRA_PERIPH_ON_APB, tegra_clk_adx1), 466 + MUX("amx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX1, 185, TEGRA_PERIPH_ON_APB, tegra_clk_amx1), 467 + MUX("vi_sensor2", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR2, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor2), 468 + MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1_8), 469 + MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2_8), 470 + MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3_8), 471 + MUX8("sbc4", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC4, 68, TEGRA_PERIPH_ON_APB, tegra_clk_sbc4_8), 472 + MUX8("sbc5", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC5, 104, TEGRA_PERIPH_ON_APB, tegra_clk_sbc5_8), 473 + MUX8("sbc6", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC6, 105, TEGRA_PERIPH_ON_APB, tegra_clk_sbc6_8), 474 + MUX8("ndflash", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDFLASH, 13, TEGRA_PERIPH_ON_APB, tegra_clk_ndflash_8), 475 + MUX8("ndspeed", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDSPEED, 80, TEGRA_PERIPH_ON_APB, tegra_clk_ndspeed_8), 476 + MUX8("hdmi", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_HDMI, 51, 0, tegra_clk_hdmi), 477 + MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, 0, tegra_clk_extern1), 478 + MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, 0, tegra_clk_extern2), 479 + MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, 0, tegra_clk_extern3), 480 + MUX8("soc_therm", mux_pllm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm), 481 + MUX8("vi_sensor", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor_8), 482 + MUX8("isp", mux_pllm_pllc_pllp_plla_clkm_pllc4, CLK_SOURCE_ISP, 23, TEGRA_PERIPH_ON_APB, tegra_clk_isp_8), 483 + MUX8("entropy", mux_pllp_clkm1, CLK_SOURCE_ENTROPY, 149, 0, tegra_clk_entropy), 484 + MUX8("hdmi_audio", mux_pllp3_pllc_clkm, CLK_SOURCE_HDMI_AUDIO, 176, TEGRA_PERIPH_NO_RESET, tegra_clk_hdmi_audio), 485 + MUX8("clk72mhz", mux_pllp3_pllc_clkm, CLK_SOURCE_CLK72MHZ, 177, TEGRA_PERIPH_NO_RESET, tegra_clk_clk72Mhz), 486 + MUX8_NOGATE_LOCK("sor0_lvds", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_SOR0, tegra_clk_sor0_lvds, &sor0_lock), 487 + MUX_FLAGS("csite", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_CSITE, 73, TEGRA_PERIPH_ON_APB, tegra_clk_csite, CLK_IGNORE_UNUSED), 488 + NODIV("disp1", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP1, 29, 7, 27, 0, tegra_clk_disp1, NULL), 489 + NODIV("disp2", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP2, 29, 7, 26, 0, tegra_clk_disp2, NULL), 490 + NODIV("sor0", mux_clkm_plldp_sor0lvds, CLK_SOURCE_SOR0, 14, 3, 182, 0, tegra_clk_sor0, &sor0_lock), 491 + UART("uarta", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTA, 6, tegra_clk_uarta), 492 + UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), 493 + UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc), 494 + UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, tegra_clk_uartd), 495 + UART("uarte", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTE, 65, tegra_clk_uarte), 496 + XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_host_src), 497 + XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), 498 + XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), 499 + XUSB("xusb_ss_src", mux_clkm_pllre_clk32_480M_pllc_ref, CLK_SOURCE_XUSB_SS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_ss_src), 500 + XUSB("xusb_dev_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_dev_src), 501 + }; 502 + 503 + static struct tegra_periph_init_data gate_clks[] = { 504 + GATE("rtc", "clk_32k", 4, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_rtc, 0), 505 + GATE("timer", "clk_m", 5, 0, tegra_clk_timer, 0), 506 + GATE("isp", "clk_m", 23, 0, tegra_clk_isp, 0), 507 + GATE("vcp", "clk_m", 29, 0, tegra_clk_vcp, 0), 508 + GATE("apbdma", "clk_m", 34, 0, tegra_clk_apbdma, 0), 509 + GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0), 510 + GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0), 511 + GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0), 512 + GATE("kfuse", "clk_m", 40, TEGRA_PERIPH_ON_APB, tegra_clk_kfuse, 0), 513 + GATE("apbif", "clk_m", 107, TEGRA_PERIPH_ON_APB, tegra_clk_apbif, 0), 514 + GATE("hda2hdmi", "clk_m", 128, TEGRA_PERIPH_ON_APB, tegra_clk_hda2hdmi, 0), 515 + GATE("bsea", "clk_m", 62, 0, tegra_clk_bsea, 0), 516 + GATE("bsev", "clk_m", 63, 0, tegra_clk_bsev, 0), 517 + GATE("mipi-cal", "clk_m", 56, 0, tegra_clk_mipi_cal, 0), 518 + GATE("usbd", "clk_m", 22, 0, tegra_clk_usbd, 0), 519 + GATE("usb2", "clk_m", 58, 0, tegra_clk_usb2, 0), 520 + GATE("usb3", "clk_m", 59, 0, tegra_clk_usb3, 0), 521 + GATE("csi", "pll_p_out3", 52, 0, tegra_clk_csi, 0), 522 + GATE("afi", "clk_m", 72, 0, tegra_clk_afi, 0), 523 + GATE("csus", "clk_m", 92, TEGRA_PERIPH_NO_RESET, tegra_clk_csus, 0), 524 + GATE("dds", "clk_m", 150, TEGRA_PERIPH_ON_APB, tegra_clk_dds, 0), 525 + GATE("dp2", "clk_m", 152, TEGRA_PERIPH_ON_APB, tegra_clk_dp2, 0), 526 + GATE("dtv", "clk_m", 79, TEGRA_PERIPH_ON_APB, tegra_clk_dtv, 0), 527 + GATE("xusb_host", "xusb_host_src", 89, 0, tegra_clk_xusb_host, 0), 528 + GATE("xusb_ss", "xusb_ss_src", 156, 0, tegra_clk_xusb_ss, 0), 529 + GATE("xusb_dev", "xusb_dev_src", 95, 0, tegra_clk_xusb_dev, 0), 530 + GATE("dsia", "dsia_mux", 48, 0, tegra_clk_dsia, 0), 531 + GATE("dsib", "dsib_mux", 82, 0, tegra_clk_dsib, 0), 532 + GATE("emc", "emc_mux", 57, 0, tegra_clk_emc, CLK_IGNORE_UNUSED), 533 + GATE("sata_cold", "clk_m", 129, TEGRA_PERIPH_ON_APB, tegra_clk_sata_cold, 0), 534 + GATE("ispb", "clk_m", 3, 0, tegra_clk_ispb, 0), 535 + GATE("vim2_clk", "clk_m", 11, 0, tegra_clk_vim2_clk, 0), 536 + GATE("pcie", "clk_m", 70, 0, tegra_clk_pcie, 0), 537 + GATE("dpaux", "clk_m", 181, 0, tegra_clk_dpaux, 0), 538 + GATE("gpu", "pll_ref", 184, 0, tegra_clk_gpu, 0), 539 + }; 540 + 541 + struct pll_out_data { 542 + char *div_name; 543 + char *pll_out_name; 544 + u32 offset; 545 + int clk_id; 546 + u8 div_shift; 547 + u8 div_flags; 548 + u8 rst_shift; 549 + spinlock_t *lock; 550 + }; 551 + 552 + #define PLL_OUT(_num, _offset, _div_shift, _div_flags, _rst_shift, _id) \ 553 + {\ 554 + .div_name = "pll_p_out" #_num "_div",\ 555 + .pll_out_name = "pll_p_out" #_num,\ 556 + .offset = _offset,\ 557 + .div_shift = _div_shift,\ 558 + .div_flags = _div_flags | TEGRA_DIVIDER_FIXED |\ 559 + TEGRA_DIVIDER_ROUND_UP,\ 560 + .rst_shift = _rst_shift,\ 561 + .clk_id = tegra_clk_ ## _id,\ 562 + .lock = &_offset ##_lock,\ 563 + } 564 + 565 + static struct pll_out_data pllp_out_clks[] = { 566 + PLL_OUT(1, PLLP_OUTA, 8, 0, 0, pll_p_out1), 567 + PLL_OUT(2, PLLP_OUTA, 24, 0, 16, pll_p_out2), 568 + PLL_OUT(2, PLLP_OUTA, 24, TEGRA_DIVIDER_INT, 16, pll_p_out2_int), 569 + PLL_OUT(3, PLLP_OUTB, 8, 0, 0, pll_p_out3), 570 + PLL_OUT(4, PLLP_OUTB, 24, 0, 16, pll_p_out4), 571 + PLL_OUT(5, PLLP_OUTC, 24, 0, 16, pll_p_out5), 572 + }; 573 + 574 + static void __init periph_clk_init(void __iomem *clk_base, 575 + struct tegra_clk *tegra_clks) 576 + { 577 + int i; 578 + struct clk *clk; 579 + struct clk **dt_clk; 580 + 581 + for (i = 0; i < ARRAY_SIZE(periph_clks); i++) { 582 + struct tegra_clk_periph_regs *bank; 583 + struct tegra_periph_init_data *data; 584 + 585 + data = periph_clks + i; 586 + 587 + dt_clk = tegra_lookup_dt_id(data->clk_id, tegra_clks); 588 + if (!dt_clk) 589 + continue; 590 + 591 + bank = get_reg_bank(data->periph.gate.clk_num); 592 + if (!bank) 593 + continue; 594 + 595 + data->periph.gate.regs = bank; 596 + clk = tegra_clk_register_periph(data->name, 597 + data->p.parent_names, data->num_parents, 598 + &data->periph, clk_base, data->offset, 599 + data->flags); 600 + *dt_clk = clk; 601 + } 602 + } 603 + 604 + static void __init gate_clk_init(void __iomem *clk_base, 605 + struct tegra_clk *tegra_clks) 606 + { 607 + int i; 608 + struct clk *clk; 609 + struct clk **dt_clk; 610 + 611 + for (i = 0; i < ARRAY_SIZE(gate_clks); i++) { 612 + struct tegra_periph_init_data *data; 613 + 614 + data = gate_clks + i; 615 + 616 + dt_clk = tegra_lookup_dt_id(data->clk_id, tegra_clks); 617 + if (!dt_clk) 618 + continue; 619 + 620 + clk = tegra_clk_register_periph_gate(data->name, 621 + data->p.parent_name, data->periph.gate.flags, 622 + clk_base, data->flags, 623 + data->periph.gate.clk_num, 624 + periph_clk_enb_refcnt); 625 + *dt_clk = clk; 626 + } 627 + } 628 + 629 + static void __init init_pllp(void __iomem *clk_base, void __iomem *pmc_base, 630 + struct tegra_clk *tegra_clks, 631 + struct tegra_clk_pll_params *pll_params) 632 + { 633 + struct clk *clk; 634 + struct clk **dt_clk; 635 + int i; 636 + 637 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_p, tegra_clks); 638 + if (dt_clk) { 639 + /* PLLP */ 640 + clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, 641 + pmc_base, 0, pll_params, NULL); 642 + clk_register_clkdev(clk, "pll_p", NULL); 643 + *dt_clk = clk; 644 + } 645 + 646 + for (i = 0; i < ARRAY_SIZE(pllp_out_clks); i++) { 647 + struct pll_out_data *data; 648 + 649 + data = pllp_out_clks + i; 650 + 651 + dt_clk = tegra_lookup_dt_id(data->clk_id, tegra_clks); 652 + if (!dt_clk) 653 + continue; 654 + 655 + clk = tegra_clk_register_divider(data->div_name, "pll_p", 656 + clk_base + data->offset, 0, data->div_flags, 657 + data->div_shift, 8, 1, data->lock); 658 + clk = tegra_clk_register_pll_out(data->pll_out_name, 659 + data->div_name, clk_base + data->offset, 660 + data->rst_shift + 1, data->rst_shift, 661 + CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 662 + data->lock); 663 + *dt_clk = clk; 664 + } 665 + } 666 + 667 + void __init tegra_periph_clk_init(void __iomem *clk_base, 668 + void __iomem *pmc_base, struct tegra_clk *tegra_clks, 669 + struct tegra_clk_pll_params *pll_params) 670 + { 671 + init_pllp(clk_base, pmc_base, tegra_clks, pll_params); 672 + periph_clk_init(clk_base, tegra_clks); 673 + gate_clk_init(clk_base, tegra_clks); 674 + }
+132
drivers/clk/tegra/clk-tegra-pmc.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/clkdev.h> 21 + #include <linux/of.h> 22 + #include <linux/of_address.h> 23 + #include <linux/delay.h> 24 + #include <linux/export.h> 25 + #include <linux/clk/tegra.h> 26 + 27 + #include "clk.h" 28 + #include "clk-id.h" 29 + 30 + #define PMC_CLK_OUT_CNTRL 0x1a8 31 + #define PMC_DPD_PADS_ORIDE 0x1c 32 + #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20 33 + #define PMC_CTRL 0 34 + #define PMC_CTRL_BLINK_ENB 7 35 + #define PMC_BLINK_TIMER 0x40 36 + 37 + struct pmc_clk_init_data { 38 + char *mux_name; 39 + char *gate_name; 40 + const char **parents; 41 + int num_parents; 42 + int mux_id; 43 + int gate_id; 44 + char *dev_name; 45 + u8 mux_shift; 46 + u8 gate_shift; 47 + }; 48 + 49 + #define PMC_CLK(_num, _mux_shift, _gate_shift)\ 50 + {\ 51 + .mux_name = "clk_out_" #_num "_mux",\ 52 + .gate_name = "clk_out_" #_num,\ 53 + .parents = clk_out ##_num ##_parents,\ 54 + .num_parents = ARRAY_SIZE(clk_out ##_num ##_parents),\ 55 + .mux_id = tegra_clk_clk_out_ ##_num ##_mux,\ 56 + .gate_id = tegra_clk_clk_out_ ##_num,\ 57 + .dev_name = "extern" #_num,\ 58 + .mux_shift = _mux_shift,\ 59 + .gate_shift = _gate_shift,\ 60 + } 61 + 62 + static DEFINE_SPINLOCK(clk_out_lock); 63 + 64 + static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", 65 + "clk_m_div4", "extern1", 66 + }; 67 + 68 + static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2", 69 + "clk_m_div4", "extern2", 70 + }; 71 + 72 + static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", 73 + "clk_m_div4", "extern3", 74 + }; 75 + 76 + static struct pmc_clk_init_data pmc_clks[] = { 77 + PMC_CLK(1, 6, 2), 78 + PMC_CLK(2, 14, 10), 79 + PMC_CLK(3, 22, 18), 80 + }; 81 + 82 + void __init tegra_pmc_clk_init(void __iomem *pmc_base, 83 + struct tegra_clk *tegra_clks) 84 + { 85 + struct clk *clk; 86 + struct clk **dt_clk; 87 + int i; 88 + 89 + for (i = 0; i < ARRAY_SIZE(pmc_clks); i++) { 90 + struct pmc_clk_init_data *data; 91 + 92 + data = pmc_clks + i; 93 + 94 + dt_clk = tegra_lookup_dt_id(data->mux_id, tegra_clks); 95 + if (!dt_clk) 96 + continue; 97 + 98 + clk = clk_register_mux(NULL, data->mux_name, data->parents, 99 + data->num_parents, CLK_SET_RATE_NO_REPARENT, 100 + pmc_base + PMC_CLK_OUT_CNTRL, data->mux_shift, 101 + 3, 0, &clk_out_lock); 102 + *dt_clk = clk; 103 + 104 + 105 + dt_clk = tegra_lookup_dt_id(data->gate_id, tegra_clks); 106 + if (!dt_clk) 107 + continue; 108 + 109 + clk = clk_register_gate(NULL, data->gate_name, data->mux_name, 110 + 0, pmc_base + PMC_CLK_OUT_CNTRL, 111 + data->gate_shift, 0, &clk_out_lock); 112 + *dt_clk = clk; 113 + clk_register_clkdev(clk, data->dev_name, data->gate_name); 114 + } 115 + 116 + /* blink */ 117 + writel_relaxed(0, pmc_base + PMC_BLINK_TIMER); 118 + clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0, 119 + pmc_base + PMC_DPD_PADS_ORIDE, 120 + PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL); 121 + 122 + dt_clk = tegra_lookup_dt_id(tegra_clk_blink, tegra_clks); 123 + if (!dt_clk) 124 + return; 125 + 126 + clk = clk_register_gate(NULL, "blink", "blink_override", 0, 127 + pmc_base + PMC_CTRL, 128 + PMC_CTRL_BLINK_ENB, 0, NULL); 129 + clk_register_clkdev(clk, "blink", NULL); 130 + *dt_clk = clk; 131 + } 132 +
+149
drivers/clk/tegra/clk-tegra-super-gen4.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/of.h> 21 + #include <linux/of_address.h> 22 + #include <linux/delay.h> 23 + #include <linux/export.h> 24 + #include <linux/clk/tegra.h> 25 + 26 + #include "clk.h" 27 + #include "clk-id.h" 28 + 29 + #define PLLX_BASE 0xe0 30 + #define PLLX_MISC 0xe4 31 + #define PLLX_MISC2 0x514 32 + #define PLLX_MISC3 0x518 33 + 34 + #define CCLKG_BURST_POLICY 0x368 35 + #define CCLKLP_BURST_POLICY 0x370 36 + #define SCLK_BURST_POLICY 0x028 37 + #define SYSTEM_CLK_RATE 0x030 38 + 39 + static DEFINE_SPINLOCK(sysrate_lock); 40 + 41 + static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4", 42 + "pll_p", "pll_p_out2", "unused", 43 + "clk_32k", "pll_m_out1" }; 44 + 45 + static const char *cclk_g_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", 46 + "pll_p", "pll_p_out4", "unused", 47 + "unused", "pll_x" }; 48 + 49 + static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", 50 + "pll_p", "pll_p_out4", "unused", 51 + "unused", "pll_x", "pll_x_out0" }; 52 + 53 + static void __init tegra_sclk_init(void __iomem *clk_base, 54 + struct tegra_clk *tegra_clks) 55 + { 56 + struct clk *clk; 57 + struct clk **dt_clk; 58 + 59 + /* SCLK */ 60 + dt_clk = tegra_lookup_dt_id(tegra_clk_sclk, tegra_clks); 61 + if (dt_clk) { 62 + clk = tegra_clk_register_super_mux("sclk", sclk_parents, 63 + ARRAY_SIZE(sclk_parents), 64 + CLK_SET_RATE_PARENT, 65 + clk_base + SCLK_BURST_POLICY, 66 + 0, 4, 0, 0, NULL); 67 + *dt_clk = clk; 68 + } 69 + 70 + /* HCLK */ 71 + dt_clk = tegra_lookup_dt_id(tegra_clk_hclk, tegra_clks); 72 + if (dt_clk) { 73 + clk = clk_register_divider(NULL, "hclk_div", "sclk", 0, 74 + clk_base + SYSTEM_CLK_RATE, 4, 2, 0, 75 + &sysrate_lock); 76 + clk = clk_register_gate(NULL, "hclk", "hclk_div", 77 + CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 78 + clk_base + SYSTEM_CLK_RATE, 79 + 7, CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 80 + *dt_clk = clk; 81 + } 82 + 83 + /* PCLK */ 84 + dt_clk = tegra_lookup_dt_id(tegra_clk_pclk, tegra_clks); 85 + if (!dt_clk) 86 + return; 87 + 88 + clk = clk_register_divider(NULL, "pclk_div", "hclk", 0, 89 + clk_base + SYSTEM_CLK_RATE, 0, 2, 0, 90 + &sysrate_lock); 91 + clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT | 92 + CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE, 93 + 3, CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 94 + *dt_clk = clk; 95 + } 96 + 97 + void __init tegra_super_clk_gen4_init(void __iomem *clk_base, 98 + void __iomem *pmc_base, 99 + struct tegra_clk *tegra_clks, 100 + struct tegra_clk_pll_params *params) 101 + { 102 + struct clk *clk; 103 + struct clk **dt_clk; 104 + 105 + /* CCLKG */ 106 + dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_g, tegra_clks); 107 + if (dt_clk) { 108 + clk = tegra_clk_register_super_mux("cclk_g", cclk_g_parents, 109 + ARRAY_SIZE(cclk_g_parents), 110 + CLK_SET_RATE_PARENT, 111 + clk_base + CCLKG_BURST_POLICY, 112 + 0, 4, 0, 0, NULL); 113 + *dt_clk = clk; 114 + } 115 + 116 + /* CCLKLP */ 117 + dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_lp, tegra_clks); 118 + if (dt_clk) { 119 + clk = tegra_clk_register_super_mux("cclk_lp", cclk_lp_parents, 120 + ARRAY_SIZE(cclk_lp_parents), 121 + CLK_SET_RATE_PARENT, 122 + clk_base + CCLKLP_BURST_POLICY, 123 + 0, 4, 8, 9, NULL); 124 + *dt_clk = clk; 125 + } 126 + 127 + tegra_sclk_init(clk_base, tegra_clks); 128 + 129 + #if defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC) 130 + /* PLLX */ 131 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_x, tegra_clks); 132 + if (!dt_clk) 133 + return; 134 + 135 + clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base, 136 + pmc_base, CLK_IGNORE_UNUSED, params, NULL); 137 + *dt_clk = clk; 138 + 139 + /* PLLX_OUT0 */ 140 + 141 + dt_clk = tegra_lookup_dt_id(tegra_clk_pll_x_out0, tegra_clks); 142 + if (!dt_clk) 143 + return; 144 + clk = clk_register_fixed_factor(NULL, "pll_x_out0", "pll_x", 145 + CLK_SET_RATE_PARENT, 1, 2); 146 + *dt_clk = clk; 147 + #endif 148 + } 149 +
+379 -1306
drivers/clk/tegra/clk-tegra114.c
··· 23 23 #include <linux/delay.h> 24 24 #include <linux/export.h> 25 25 #include <linux/clk/tegra.h> 26 + #include <dt-bindings/clock/tegra114-car.h> 26 27 27 28 #include "clk.h" 29 + #include "clk-id.h" 28 30 29 - #define RST_DEVICES_L 0x004 30 - #define RST_DEVICES_H 0x008 31 - #define RST_DEVICES_U 0x00C 32 31 #define RST_DFLL_DVCO 0x2F4 33 - #define RST_DEVICES_V 0x358 34 - #define RST_DEVICES_W 0x35C 35 - #define RST_DEVICES_X 0x28C 36 - #define RST_DEVICES_SET_L 0x300 37 - #define RST_DEVICES_CLR_L 0x304 38 - #define RST_DEVICES_SET_H 0x308 39 - #define RST_DEVICES_CLR_H 0x30c 40 - #define RST_DEVICES_SET_U 0x310 41 - #define RST_DEVICES_CLR_U 0x314 42 - #define RST_DEVICES_SET_V 0x430 43 - #define RST_DEVICES_CLR_V 0x434 44 - #define RST_DEVICES_SET_W 0x438 45 - #define RST_DEVICES_CLR_W 0x43c 46 32 #define CPU_FINETRIM_SELECT 0x4d4 /* override default prop dlys */ 47 33 #define CPU_FINETRIM_DR 0x4d8 /* rise->rise prop dly A */ 48 34 #define CPU_FINETRIM_R 0x4e4 /* rise->rise prop dly inc A */ 49 - #define RST_DEVICES_NUM 5 50 35 51 36 /* RST_DFLL_DVCO bitfields */ 52 37 #define DVFS_DFLL_RESET_SHIFT 0 ··· 58 73 #define CPU_FINETRIM_R_FCPU_6_SHIFT 10 /* ftop */ 59 74 #define CPU_FINETRIM_R_FCPU_6_MASK (0x3 << CPU_FINETRIM_R_FCPU_6_SHIFT) 60 75 61 - #define CLK_OUT_ENB_L 0x010 62 - #define CLK_OUT_ENB_H 0x014 63 - #define CLK_OUT_ENB_U 0x018 64 - #define CLK_OUT_ENB_V 0x360 65 - #define CLK_OUT_ENB_W 0x364 66 - #define CLK_OUT_ENB_X 0x280 67 - #define CLK_OUT_ENB_SET_L 0x320 68 - #define CLK_OUT_ENB_CLR_L 0x324 69 - #define CLK_OUT_ENB_SET_H 0x328 70 - #define CLK_OUT_ENB_CLR_H 0x32c 71 - #define CLK_OUT_ENB_SET_U 0x330 72 - #define CLK_OUT_ENB_CLR_U 0x334 73 - #define CLK_OUT_ENB_SET_V 0x440 74 - #define CLK_OUT_ENB_CLR_V 0x444 75 - #define CLK_OUT_ENB_SET_W 0x448 76 - #define CLK_OUT_ENB_CLR_W 0x44c 77 - #define CLK_OUT_ENB_SET_X 0x284 78 - #define CLK_OUT_ENB_CLR_X 0x288 79 - #define CLK_OUT_ENB_NUM 6 76 + #define TEGRA114_CLK_PERIPH_BANKS 5 80 77 81 78 #define PLLC_BASE 0x80 82 79 #define PLLC_MISC2 0x88 ··· 106 139 #define PLLE_AUX 0x48c 107 140 #define PLLC_OUT 0x84 108 141 #define PLLM_OUT 0x94 109 - #define PLLP_OUTA 0xa4 110 - #define PLLP_OUTB 0xa8 111 - #define PLLA_OUT 0xb4 112 - 113 - #define AUDIO_SYNC_CLK_I2S0 0x4a0 114 - #define AUDIO_SYNC_CLK_I2S1 0x4a4 115 - #define AUDIO_SYNC_CLK_I2S2 0x4a8 116 - #define AUDIO_SYNC_CLK_I2S3 0x4ac 117 - #define AUDIO_SYNC_CLK_I2S4 0x4b0 118 - #define AUDIO_SYNC_CLK_SPDIF 0x4b4 119 - 120 - #define AUDIO_SYNC_DOUBLER 0x49c 121 - 122 - #define PMC_CLK_OUT_CNTRL 0x1a8 123 - #define PMC_DPD_PADS_ORIDE 0x1c 124 - #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20 125 - #define PMC_CTRL 0 126 - #define PMC_CTRL_BLINK_ENB 7 127 - #define PMC_BLINK_TIMER 0x40 128 142 129 143 #define OSC_CTRL 0x50 130 144 #define OSC_CTRL_OSC_FREQ_SHIFT 28 ··· 114 166 #define PLLXC_SW_MAX_P 6 115 167 116 168 #define CCLKG_BURST_POLICY 0x368 117 - #define CCLKLP_BURST_POLICY 0x370 118 - #define SCLK_BURST_POLICY 0x028 119 - #define SYSTEM_CLK_RATE 0x030 120 169 121 170 #define UTMIP_PLL_CFG2 0x488 122 171 #define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6) ··· 141 196 #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1) 142 197 #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0) 143 198 144 - #define CLK_SOURCE_I2S0 0x1d8 145 - #define CLK_SOURCE_I2S1 0x100 146 - #define CLK_SOURCE_I2S2 0x104 147 - #define CLK_SOURCE_NDFLASH 0x160 148 - #define CLK_SOURCE_I2S3 0x3bc 149 - #define CLK_SOURCE_I2S4 0x3c0 150 - #define CLK_SOURCE_SPDIF_OUT 0x108 151 - #define CLK_SOURCE_SPDIF_IN 0x10c 152 - #define CLK_SOURCE_PWM 0x110 153 - #define CLK_SOURCE_ADX 0x638 154 - #define CLK_SOURCE_AMX 0x63c 155 - #define CLK_SOURCE_HDA 0x428 156 - #define CLK_SOURCE_HDA2CODEC_2X 0x3e4 157 - #define CLK_SOURCE_SBC1 0x134 158 - #define CLK_SOURCE_SBC2 0x118 159 - #define CLK_SOURCE_SBC3 0x11c 160 - #define CLK_SOURCE_SBC4 0x1b4 161 - #define CLK_SOURCE_SBC5 0x3c8 162 - #define CLK_SOURCE_SBC6 0x3cc 163 - #define CLK_SOURCE_SATA_OOB 0x420 164 - #define CLK_SOURCE_SATA 0x424 165 - #define CLK_SOURCE_NDSPEED 0x3f8 166 - #define CLK_SOURCE_VFIR 0x168 167 - #define CLK_SOURCE_SDMMC1 0x150 168 - #define CLK_SOURCE_SDMMC2 0x154 169 - #define CLK_SOURCE_SDMMC3 0x1bc 170 - #define CLK_SOURCE_SDMMC4 0x164 171 - #define CLK_SOURCE_VDE 0x1c8 172 199 #define CLK_SOURCE_CSITE 0x1d4 173 - #define CLK_SOURCE_LA 0x1f8 174 - #define CLK_SOURCE_TRACE 0x634 175 - #define CLK_SOURCE_OWR 0x1cc 176 - #define CLK_SOURCE_NOR 0x1d0 177 - #define CLK_SOURCE_MIPI 0x174 178 - #define CLK_SOURCE_I2C1 0x124 179 - #define CLK_SOURCE_I2C2 0x198 180 - #define CLK_SOURCE_I2C3 0x1b8 181 - #define CLK_SOURCE_I2C4 0x3c4 182 - #define CLK_SOURCE_I2C5 0x128 183 - #define CLK_SOURCE_UARTA 0x178 184 - #define CLK_SOURCE_UARTB 0x17c 185 - #define CLK_SOURCE_UARTC 0x1a0 186 - #define CLK_SOURCE_UARTD 0x1c0 187 - #define CLK_SOURCE_UARTE 0x1c4 188 - #define CLK_SOURCE_UARTA_DBG 0x178 189 - #define CLK_SOURCE_UARTB_DBG 0x17c 190 - #define CLK_SOURCE_UARTC_DBG 0x1a0 191 - #define CLK_SOURCE_UARTD_DBG 0x1c0 192 - #define CLK_SOURCE_UARTE_DBG 0x1c4 193 - #define CLK_SOURCE_3D 0x158 194 - #define CLK_SOURCE_2D 0x15c 195 - #define CLK_SOURCE_VI_SENSOR 0x1a8 196 - #define CLK_SOURCE_VI 0x148 197 - #define CLK_SOURCE_EPP 0x16c 198 - #define CLK_SOURCE_MSENC 0x1f0 199 - #define CLK_SOURCE_TSEC 0x1f4 200 - #define CLK_SOURCE_HOST1X 0x180 201 - #define CLK_SOURCE_HDMI 0x18c 202 - #define CLK_SOURCE_DISP1 0x138 203 - #define CLK_SOURCE_DISP2 0x13c 204 - #define CLK_SOURCE_CILAB 0x614 205 - #define CLK_SOURCE_CILCD 0x618 206 - #define CLK_SOURCE_CILE 0x61c 207 - #define CLK_SOURCE_DSIALP 0x620 208 - #define CLK_SOURCE_DSIBLP 0x624 209 - #define CLK_SOURCE_TSENSOR 0x3b8 210 - #define CLK_SOURCE_D_AUDIO 0x3d0 211 - #define CLK_SOURCE_DAM0 0x3d8 212 - #define CLK_SOURCE_DAM1 0x3dc 213 - #define CLK_SOURCE_DAM2 0x3e0 214 - #define CLK_SOURCE_ACTMON 0x3e8 215 - #define CLK_SOURCE_EXTERN1 0x3ec 216 - #define CLK_SOURCE_EXTERN2 0x3f0 217 - #define CLK_SOURCE_EXTERN3 0x3f4 218 - #define CLK_SOURCE_I2CSLOW 0x3fc 219 - #define CLK_SOURCE_SE 0x42c 220 - #define CLK_SOURCE_MSELECT 0x3b4 221 - #define CLK_SOURCE_DFLL_REF 0x62c 222 - #define CLK_SOURCE_DFLL_SOC 0x630 223 - #define CLK_SOURCE_SOC_THERM 0x644 224 - #define CLK_SOURCE_XUSB_HOST_SRC 0x600 225 - #define CLK_SOURCE_XUSB_FALCON_SRC 0x604 226 - #define CLK_SOURCE_XUSB_FS_SRC 0x608 227 200 #define CLK_SOURCE_XUSB_SS_SRC 0x610 228 - #define CLK_SOURCE_XUSB_DEV_SRC 0x60c 229 201 #define CLK_SOURCE_EMC 0x19c 230 202 231 203 /* PLLM override registers */ ··· 160 298 } tegra114_cpu_clk_sctx; 161 299 #endif 162 300 163 - static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32]; 164 - 165 301 static void __iomem *clk_base; 166 302 static void __iomem *pmc_base; 167 303 168 304 static DEFINE_SPINLOCK(pll_d_lock); 169 305 static DEFINE_SPINLOCK(pll_d2_lock); 170 306 static DEFINE_SPINLOCK(pll_u_lock); 171 - static DEFINE_SPINLOCK(pll_div_lock); 172 307 static DEFINE_SPINLOCK(pll_re_lock); 173 - static DEFINE_SPINLOCK(clk_doubler_lock); 174 - static DEFINE_SPINLOCK(clk_out_lock); 175 - static DEFINE_SPINLOCK(sysrate_lock); 176 308 177 309 static struct div_nmp pllxc_nmp = { 178 310 .divm_shift = 0, ··· 226 370 .stepb_shift = 9, 227 371 .pdiv_tohw = pllxc_p, 228 372 .div_nmp = &pllxc_nmp, 373 + .freq_table = pll_c_freq_table, 374 + .flags = TEGRA_PLL_USE_LOCK, 229 375 }; 230 376 231 377 static struct div_nmp pllcx_nmp = { ··· 275 417 .ext_misc_reg[0] = 0x4f0, 276 418 .ext_misc_reg[1] = 0x4f4, 277 419 .ext_misc_reg[2] = 0x4f8, 420 + .freq_table = pll_cx_freq_table, 421 + .flags = TEGRA_PLL_USE_LOCK, 278 422 }; 279 423 280 424 static struct tegra_clk_pll_params pll_c3_params = { ··· 297 437 .ext_misc_reg[0] = 0x504, 298 438 .ext_misc_reg[1] = 0x508, 299 439 .ext_misc_reg[2] = 0x50c, 440 + .freq_table = pll_cx_freq_table, 441 + .flags = TEGRA_PLL_USE_LOCK, 300 442 }; 301 443 302 444 static struct div_nmp pllm_nmp = { ··· 345 483 .div_nmp = &pllm_nmp, 346 484 .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, 347 485 .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2, 486 + .freq_table = pll_m_freq_table, 487 + .flags = TEGRA_PLL_USE_LOCK, 348 488 }; 349 489 350 490 static struct div_nmp pllp_nmp = { ··· 380 516 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 381 517 .lock_delay = 300, 382 518 .div_nmp = &pllp_nmp, 519 + .freq_table = pll_p_freq_table, 520 + .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, 521 + .fixed_rate = 408000000, 383 522 }; 384 523 385 524 static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { ··· 410 543 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 411 544 .lock_delay = 300, 412 545 .div_nmp = &pllp_nmp, 546 + .freq_table = pll_a_freq_table, 547 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 413 548 }; 414 549 415 550 static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { ··· 448 579 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 449 580 .lock_delay = 1000, 450 581 .div_nmp = &pllp_nmp, 582 + .freq_table = pll_d_freq_table, 583 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 584 + TEGRA_PLL_USE_LOCK, 451 585 }; 452 586 453 587 static struct tegra_clk_pll_params pll_d2_params = { ··· 466 594 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 467 595 .lock_delay = 1000, 468 596 .div_nmp = &pllp_nmp, 597 + .freq_table = pll_d_freq_table, 598 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 599 + TEGRA_PLL_USE_LOCK, 469 600 }; 470 601 471 602 static struct pdiv_map pllu_p[] = { ··· 509 634 .lock_delay = 1000, 510 635 .pdiv_tohw = pllu_p, 511 636 .div_nmp = &pllu_nmp, 637 + .freq_table = pll_u_freq_table, 638 + .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 639 + TEGRA_PLL_USE_LOCK, 512 640 }; 513 641 514 642 static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { ··· 545 667 .stepb_shift = 24, 546 668 .pdiv_tohw = pllxc_p, 547 669 .div_nmp = &pllxc_nmp, 670 + .freq_table = pll_x_freq_table, 671 + .flags = TEGRA_PLL_USE_LOCK, 548 672 }; 549 673 550 674 static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { 551 675 /* PLLE special case: use cpcon field to store cml divider value */ 552 676 {336000000, 100000000, 100, 21, 16, 11}, 553 677 {312000000, 100000000, 200, 26, 24, 13}, 678 + {12000000, 100000000, 200, 1, 24, 13}, 554 679 {0, 0, 0, 0, 0, 0}, 555 680 }; 556 681 ··· 580 699 .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, 581 700 .lock_delay = 300, 582 701 .div_nmp = &plle_nmp, 702 + .freq_table = pll_e_freq_table, 703 + .flags = TEGRA_PLL_FIXED, 704 + .fixed_rate = 100000000, 583 705 }; 584 706 585 707 static struct div_nmp pllre_nmp = { ··· 609 725 .iddq_reg = PLLRE_MISC, 610 726 .iddq_bit_idx = PLLRE_IDDQ_BIT, 611 727 .div_nmp = &pllre_nmp, 612 - }; 613 - 614 - /* Peripheral clock registers */ 615 - 616 - static struct tegra_clk_periph_regs periph_l_regs = { 617 - .enb_reg = CLK_OUT_ENB_L, 618 - .enb_set_reg = CLK_OUT_ENB_SET_L, 619 - .enb_clr_reg = CLK_OUT_ENB_CLR_L, 620 - .rst_reg = RST_DEVICES_L, 621 - .rst_set_reg = RST_DEVICES_SET_L, 622 - .rst_clr_reg = RST_DEVICES_CLR_L, 623 - }; 624 - 625 - static struct tegra_clk_periph_regs periph_h_regs = { 626 - .enb_reg = CLK_OUT_ENB_H, 627 - .enb_set_reg = CLK_OUT_ENB_SET_H, 628 - .enb_clr_reg = CLK_OUT_ENB_CLR_H, 629 - .rst_reg = RST_DEVICES_H, 630 - .rst_set_reg = RST_DEVICES_SET_H, 631 - .rst_clr_reg = RST_DEVICES_CLR_H, 632 - }; 633 - 634 - static struct tegra_clk_periph_regs periph_u_regs = { 635 - .enb_reg = CLK_OUT_ENB_U, 636 - .enb_set_reg = CLK_OUT_ENB_SET_U, 637 - .enb_clr_reg = CLK_OUT_ENB_CLR_U, 638 - .rst_reg = RST_DEVICES_U, 639 - .rst_set_reg = RST_DEVICES_SET_U, 640 - .rst_clr_reg = RST_DEVICES_CLR_U, 641 - }; 642 - 643 - static struct tegra_clk_periph_regs periph_v_regs = { 644 - .enb_reg = CLK_OUT_ENB_V, 645 - .enb_set_reg = CLK_OUT_ENB_SET_V, 646 - .enb_clr_reg = CLK_OUT_ENB_CLR_V, 647 - .rst_reg = RST_DEVICES_V, 648 - .rst_set_reg = RST_DEVICES_SET_V, 649 - .rst_clr_reg = RST_DEVICES_CLR_V, 650 - }; 651 - 652 - static struct tegra_clk_periph_regs periph_w_regs = { 653 - .enb_reg = CLK_OUT_ENB_W, 654 - .enb_set_reg = CLK_OUT_ENB_SET_W, 655 - .enb_clr_reg = CLK_OUT_ENB_CLR_W, 656 - .rst_reg = RST_DEVICES_W, 657 - .rst_set_reg = RST_DEVICES_SET_W, 658 - .rst_clr_reg = RST_DEVICES_CLR_W, 728 + .flags = TEGRA_PLL_USE_LOCK, 659 729 }; 660 730 661 731 /* possible OSC frequencies in Hz */ ··· 624 786 }; 625 787 626 788 #define MASK(x) (BIT(x) - 1) 627 - 628 - #define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \ 629 - _clk_num, _regs, _gate_flags, _clk_id) \ 630 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 631 - 30, MASK(2), 0, 0, 8, 1, 0, _regs, _clk_num, \ 632 - periph_clk_enb_refcnt, _gate_flags, _clk_id, \ 633 - _parents##_idx, 0) 634 - 635 - #define TEGRA_INIT_DATA_MUX_FLAGS(_name, _con_id, _dev_id, _parents, _offset,\ 636 - _clk_num, _regs, _gate_flags, _clk_id, flags)\ 637 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 638 - 30, MASK(2), 0, 0, 8, 1, 0, _regs, _clk_num, \ 639 - periph_clk_enb_refcnt, _gate_flags, _clk_id, \ 640 - _parents##_idx, flags) 641 - 642 - #define TEGRA_INIT_DATA_MUX8(_name, _con_id, _dev_id, _parents, _offset, \ 643 - _clk_num, _regs, _gate_flags, _clk_id) \ 644 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 645 - 29, MASK(3), 0, 0, 8, 1, 0, _regs, _clk_num, \ 646 - periph_clk_enb_refcnt, _gate_flags, _clk_id, \ 647 - _parents##_idx, 0) 648 - 649 - #define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \ 650 - _clk_num, _regs, _gate_flags, _clk_id) \ 651 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 652 - 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\ 653 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 654 - _clk_id, _parents##_idx, 0) 655 - 656 - #define TEGRA_INIT_DATA_INT_FLAGS(_name, _con_id, _dev_id, _parents, _offset,\ 657 - _clk_num, _regs, _gate_flags, _clk_id, flags)\ 658 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 659 - 30, MASK(2), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\ 660 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 661 - _clk_id, _parents##_idx, flags) 662 - 663 - #define TEGRA_INIT_DATA_INT8(_name, _con_id, _dev_id, _parents, _offset,\ 664 - _clk_num, _regs, _gate_flags, _clk_id) \ 665 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 666 - 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,\ 667 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 668 - _clk_id, _parents##_idx, 0) 669 - 670 - #define TEGRA_INIT_DATA_UART(_name, _con_id, _dev_id, _parents, _offset,\ 671 - _clk_num, _regs, _clk_id) \ 672 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 673 - 30, MASK(2), 0, 0, 16, 1, TEGRA_DIVIDER_UART, _regs,\ 674 - _clk_num, periph_clk_enb_refcnt, 0, _clk_id, \ 675 - _parents##_idx, 0) 676 - 677 - #define TEGRA_INIT_DATA_I2C(_name, _con_id, _dev_id, _parents, _offset,\ 678 - _clk_num, _regs, _clk_id) \ 679 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 680 - 30, MASK(2), 0, 0, 16, 0, 0, _regs, _clk_num, \ 681 - periph_clk_enb_refcnt, 0, _clk_id, _parents##_idx, 0) 682 - 683 - #define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \ 684 - _mux_shift, _mux_mask, _clk_num, _regs, \ 685 - _gate_flags, _clk_id) \ 686 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset,\ 687 - _mux_shift, _mux_mask, 0, 0, 0, 0, 0, _regs, \ 688 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 689 - _clk_id, _parents##_idx, 0) 690 - 691 - #define TEGRA_INIT_DATA_XUSB(_name, _con_id, _dev_id, _parents, _offset, \ 692 - _clk_num, _regs, _gate_flags, _clk_id) \ 693 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parents, _offset, \ 694 - 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \ 695 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 696 - _clk_id, _parents##_idx, 0) 697 - 698 - #define TEGRA_INIT_DATA_AUDIO(_name, _con_id, _dev_id, _offset, _clk_num,\ 699 - _regs, _gate_flags, _clk_id) \ 700 - TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, mux_d_audio_clk, \ 701 - _offset, 16, 0xE01F, 0, 0, 8, 1, 0, _regs, _clk_num, \ 702 - periph_clk_enb_refcnt, _gate_flags , _clk_id, \ 703 - mux_d_audio_clk_idx, 0) 704 - 705 - enum tegra114_clk { 706 - rtc = 4, timer = 5, uarta = 6, sdmmc2 = 9, i2s1 = 11, i2c1 = 12, 707 - ndflash = 13, sdmmc1 = 14, sdmmc4 = 15, pwm = 17, i2s2 = 18, epp = 19, 708 - gr_2d = 21, usbd = 22, isp = 23, gr_3d = 24, disp2 = 26, disp1 = 27, 709 - host1x = 28, vcp = 29, i2s0 = 30, apbdma = 34, kbc = 36, kfuse = 40, 710 - sbc1 = 41, nor = 42, sbc2 = 44, sbc3 = 46, i2c5 = 47, dsia = 48, 711 - mipi = 50, hdmi = 51, csi = 52, i2c2 = 54, uartc = 55, mipi_cal = 56, 712 - emc, usb2, usb3, vde = 61, bsea = 62, bsev = 63, uartd = 65, 713 - i2c3 = 67, sbc4 = 68, sdmmc3 = 69, owr = 71, csite = 73, 714 - la = 76, trace = 77, soc_therm = 78, dtv = 79, ndspeed = 80, 715 - i2cslow = 81, dsib = 82, tsec = 83, xusb_host = 89, msenc = 91, 716 - csus = 92, mselect = 99, tsensor = 100, i2s3 = 101, i2s4 = 102, 717 - i2c4 = 103, sbc5 = 104, sbc6 = 105, d_audio, apbif = 107, dam0, dam1, 718 - dam2, hda2codec_2x = 111, audio0_2x = 113, audio1_2x, audio2_2x, 719 - audio3_2x, audio4_2x, spdif_2x, actmon = 119, extern1 = 120, 720 - extern2 = 121, extern3 = 122, hda = 125, se = 127, hda2hdmi = 128, 721 - cilab = 144, cilcd = 145, cile = 146, dsialp = 147, dsiblp = 148, 722 - dds = 150, dp2 = 152, amx = 153, adx = 154, xusb_ss = 156, uartb = 192, 723 - vfir, spdif_in, spdif_out, vi, vi_sensor, fuse, fuse_burn, clk_32k, 724 - clk_m, clk_m_div2, clk_m_div4, pll_ref, pll_c, pll_c_out1, pll_c2, 725 - pll_c3, pll_m, pll_m_out1, pll_p, pll_p_out1, pll_p_out2, pll_p_out3, 726 - pll_p_out4, pll_a, pll_a_out0, pll_d, pll_d_out0, pll_d2, pll_d2_out0, 727 - pll_u, pll_u_480M, pll_u_60M, pll_u_48M, pll_u_12M, pll_x, pll_x_out0, 728 - pll_re_vco, pll_re_out, pll_e_out0, spdif_in_sync, i2s0_sync, 729 - i2s1_sync, i2s2_sync, i2s3_sync, i2s4_sync, vimclk_sync, audio0, 730 - audio1, audio2, audio3, audio4, spdif, clk_out_1, clk_out_2, clk_out_3, 731 - blink, xusb_host_src = 252, xusb_falcon_src, xusb_fs_src, xusb_ss_src, 732 - xusb_dev_src, xusb_dev, xusb_hs_src, sclk, hclk, pclk, cclk_g, cclk_lp, 733 - dfll_ref = 264, dfll_soc, 734 - 735 - /* Mux clocks */ 736 - 737 - audio0_mux = 300, audio1_mux, audio2_mux, audio3_mux, audio4_mux, 738 - spdif_mux, clk_out_1_mux, clk_out_2_mux, clk_out_3_mux, dsia_mux, 739 - dsib_mux, clk_max, 740 - }; 741 789 742 790 struct utmi_clk_param { 743 791 /* Oscillator Frequency in KHz */ ··· 658 934 659 935 /* peripheral mux definitions */ 660 936 661 - #define MUX_I2S_SPDIF(_id) \ 662 - static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \ 663 - #_id, "pll_p",\ 664 - "clk_m"}; 665 - MUX_I2S_SPDIF(audio0) 666 - MUX_I2S_SPDIF(audio1) 667 - MUX_I2S_SPDIF(audio2) 668 - MUX_I2S_SPDIF(audio3) 669 - MUX_I2S_SPDIF(audio4) 670 - MUX_I2S_SPDIF(audio) 671 - 672 - #define mux_pllaout0_audio0_2x_pllp_clkm_idx NULL 673 - #define mux_pllaout0_audio1_2x_pllp_clkm_idx NULL 674 - #define mux_pllaout0_audio2_2x_pllp_clkm_idx NULL 675 - #define mux_pllaout0_audio3_2x_pllp_clkm_idx NULL 676 - #define mux_pllaout0_audio4_2x_pllp_clkm_idx NULL 677 - #define mux_pllaout0_audio_2x_pllp_clkm_idx NULL 678 - 679 - static const char *mux_pllp_pllc_pllm_clkm[] = { 680 - "pll_p", "pll_c", "pll_m", "clk_m" 681 - }; 682 - #define mux_pllp_pllc_pllm_clkm_idx NULL 683 - 684 - static const char *mux_pllp_pllc_pllm[] = { "pll_p", "pll_c", "pll_m" }; 685 - #define mux_pllp_pllc_pllm_idx NULL 686 - 687 - static const char *mux_pllp_pllc_clk32_clkm[] = { 688 - "pll_p", "pll_c", "clk_32k", "clk_m" 689 - }; 690 - #define mux_pllp_pllc_clk32_clkm_idx NULL 691 - 692 - static const char *mux_plla_pllc_pllp_clkm[] = { 693 - "pll_a_out0", "pll_c", "pll_p", "clk_m" 694 - }; 695 - #define mux_plla_pllc_pllp_clkm_idx mux_pllp_pllc_pllm_clkm_idx 696 - 697 - static const char *mux_pllp_pllc2_c_c3_pllm_clkm[] = { 698 - "pll_p", "pll_c2", "pll_c", "pll_c3", "pll_m", "clk_m" 699 - }; 700 - static u32 mux_pllp_pllc2_c_c3_pllm_clkm_idx[] = { 701 - [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, 702 - }; 703 - 704 - static const char *mux_pllp_clkm[] = { 705 - "pll_p", "clk_m" 706 - }; 707 - static u32 mux_pllp_clkm_idx[] = { 708 - [0] = 0, [1] = 3, 709 - }; 710 - 711 - static const char *mux_pllm_pllc2_c_c3_pllp_plla[] = { 712 - "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0" 713 - }; 714 - #define mux_pllm_pllc2_c_c3_pllp_plla_idx mux_pllp_pllc2_c_c3_pllm_clkm_idx 715 - 716 - static const char *mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = { 717 - "pll_p", "pll_m", "pll_d_out0", "pll_a_out0", "pll_c", 718 - "pll_d2_out0", "clk_m" 719 - }; 720 - #define mux_pllp_pllm_plld_plla_pllc_plld2_clkm_idx NULL 721 - 722 - static const char *mux_pllm_pllc_pllp_plla[] = { 723 - "pll_m", "pll_c", "pll_p", "pll_a_out0" 724 - }; 725 - #define mux_pllm_pllc_pllp_plla_idx mux_pllp_pllc_pllm_clkm_idx 726 - 727 - static const char *mux_pllp_pllc_clkm[] = { 728 - "pll_p", "pll_c", "pll_m" 729 - }; 730 - static u32 mux_pllp_pllc_clkm_idx[] = { 731 - [0] = 0, [1] = 1, [2] = 3, 732 - }; 733 - 734 - static const char *mux_pllp_pllc_clkm_clk32[] = { 735 - "pll_p", "pll_c", "clk_m", "clk_32k" 736 - }; 737 - #define mux_pllp_pllc_clkm_clk32_idx NULL 738 - 739 - static const char *mux_plla_clk32_pllp_clkm_plle[] = { 740 - "pll_a_out0", "clk_32k", "pll_p", "clk_m", "pll_e_out0" 741 - }; 742 - #define mux_plla_clk32_pllp_clkm_plle_idx NULL 743 - 744 - static const char *mux_clkm_pllp_pllc_pllre[] = { 745 - "clk_m", "pll_p", "pll_c", "pll_re_out" 746 - }; 747 - static u32 mux_clkm_pllp_pllc_pllre_idx[] = { 748 - [0] = 0, [1] = 1, [2] = 3, [3] = 5, 749 - }; 750 - 751 - static const char *mux_clkm_48M_pllp_480M[] = { 752 - "clk_m", "pll_u_48M", "pll_p", "pll_u_480M" 753 - }; 754 - #define mux_clkm_48M_pllp_480M_idx NULL 755 - 756 - static const char *mux_clkm_pllre_clk32_480M_pllc_ref[] = { 757 - "clk_m", "pll_re_out", "clk_32k", "pll_u_480M", "pll_c", "pll_ref" 758 - }; 759 - static u32 mux_clkm_pllre_clk32_480M_pllc_ref_idx[] = { 760 - [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 4, [5] = 7, 761 - }; 762 - 763 937 static const char *mux_plld_out0_plld2_out0[] = { 764 938 "pll_d_out0", "pll_d2_out0", 765 939 }; 766 940 #define mux_plld_out0_plld2_out0_idx NULL 767 - 768 - static const char *mux_d_audio_clk[] = { 769 - "pll_a_out0", "pll_p", "clk_m", "spdif_in_sync", "i2s0_sync", 770 - "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", 771 - }; 772 - static u32 mux_d_audio_clk_idx[] = { 773 - [0] = 0, [1] = 0x8000, [2] = 0xc000, [3] = 0xE000, [4] = 0xE001, 774 - [5] = 0xE002, [6] = 0xE003, [7] = 0xE004, [8] = 0xE005, [9] = 0xE007, 775 - }; 776 941 777 942 static const char *mux_pllmcp_clkm[] = { 778 943 "pll_m_out0", "pll_c_out0", "pll_p_out0", "clk_m", "pll_m_ud", ··· 677 1064 { .val = 0, .div = 0 }, 678 1065 }; 679 1066 680 - static struct clk *clks[clk_max]; 681 - static struct clk_onecell_data clk_data; 1067 + static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { 1068 + [tegra_clk_rtc] = { .dt_id = TEGRA114_CLK_RTC, .present = true }, 1069 + [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, 1070 + [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, 1071 + [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, 1072 + [tegra_clk_sdmmc2] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, 1073 + [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, 1074 + [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, 1075 + [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, 1076 + [tegra_clk_sdmmc1] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, 1077 + [tegra_clk_sdmmc4] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, 1078 + [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, 1079 + [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, 1080 + [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, 1081 + [tegra_clk_epp_8] = { .dt_id = TEGRA114_CLK_EPP, .present = true }, 1082 + [tegra_clk_gr2d_8] = { .dt_id = TEGRA114_CLK_GR2D, .present = true }, 1083 + [tegra_clk_usbd] = { .dt_id = TEGRA114_CLK_USBD, .present = true }, 1084 + [tegra_clk_isp] = { .dt_id = TEGRA114_CLK_ISP, .present = true }, 1085 + [tegra_clk_gr3d_8] = { .dt_id = TEGRA114_CLK_GR3D, .present = true }, 1086 + [tegra_clk_disp2] = { .dt_id = TEGRA114_CLK_DISP2, .present = true }, 1087 + [tegra_clk_disp1] = { .dt_id = TEGRA114_CLK_DISP1, .present = true }, 1088 + [tegra_clk_host1x_8] = { .dt_id = TEGRA114_CLK_HOST1X, .present = true }, 1089 + [tegra_clk_vcp] = { .dt_id = TEGRA114_CLK_VCP, .present = true }, 1090 + [tegra_clk_apbdma] = { .dt_id = TEGRA114_CLK_APBDMA, .present = true }, 1091 + [tegra_clk_kbc] = { .dt_id = TEGRA114_CLK_KBC, .present = true }, 1092 + [tegra_clk_kfuse] = { .dt_id = TEGRA114_CLK_KFUSE, .present = true }, 1093 + [tegra_clk_sbc1_8] = { .dt_id = TEGRA114_CLK_SBC1, .present = true }, 1094 + [tegra_clk_nor] = { .dt_id = TEGRA114_CLK_NOR, .present = true }, 1095 + [tegra_clk_sbc2_8] = { .dt_id = TEGRA114_CLK_SBC2, .present = true }, 1096 + [tegra_clk_sbc3_8] = { .dt_id = TEGRA114_CLK_SBC3, .present = true }, 1097 + [tegra_clk_i2c5] = { .dt_id = TEGRA114_CLK_I2C5, .present = true }, 1098 + [tegra_clk_dsia] = { .dt_id = TEGRA114_CLK_DSIA, .present = true }, 1099 + [tegra_clk_mipi] = { .dt_id = TEGRA114_CLK_MIPI, .present = true }, 1100 + [tegra_clk_hdmi] = { .dt_id = TEGRA114_CLK_HDMI, .present = true }, 1101 + [tegra_clk_csi] = { .dt_id = TEGRA114_CLK_CSI, .present = true }, 1102 + [tegra_clk_i2c2] = { .dt_id = TEGRA114_CLK_I2C2, .present = true }, 1103 + [tegra_clk_uartc] = { .dt_id = TEGRA114_CLK_UARTC, .present = true }, 1104 + [tegra_clk_mipi_cal] = { .dt_id = TEGRA114_CLK_MIPI_CAL, .present = true }, 1105 + [tegra_clk_emc] = { .dt_id = TEGRA114_CLK_EMC, .present = true }, 1106 + [tegra_clk_usb2] = { .dt_id = TEGRA114_CLK_USB2, .present = true }, 1107 + [tegra_clk_usb3] = { .dt_id = TEGRA114_CLK_USB3, .present = true }, 1108 + [tegra_clk_vde_8] = { .dt_id = TEGRA114_CLK_VDE, .present = true }, 1109 + [tegra_clk_bsea] = { .dt_id = TEGRA114_CLK_BSEA, .present = true }, 1110 + [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, 1111 + [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, 1112 + [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, 1113 + [tegra_clk_sdmmc3] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, 1114 + [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, 1115 + [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, 1116 + [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, 1117 + [tegra_clk_trace] = { .dt_id = TEGRA114_CLK_TRACE, .present = true }, 1118 + [tegra_clk_soc_therm] = { .dt_id = TEGRA114_CLK_SOC_THERM, .present = true }, 1119 + [tegra_clk_dtv] = { .dt_id = TEGRA114_CLK_DTV, .present = true }, 1120 + [tegra_clk_ndspeed] = { .dt_id = TEGRA114_CLK_NDSPEED, .present = true }, 1121 + [tegra_clk_i2cslow] = { .dt_id = TEGRA114_CLK_I2CSLOW, .present = true }, 1122 + [tegra_clk_dsib] = { .dt_id = TEGRA114_CLK_DSIB, .present = true }, 1123 + [tegra_clk_tsec] = { .dt_id = TEGRA114_CLK_TSEC, .present = true }, 1124 + [tegra_clk_xusb_host] = { .dt_id = TEGRA114_CLK_XUSB_HOST, .present = true }, 1125 + [tegra_clk_msenc] = { .dt_id = TEGRA114_CLK_MSENC, .present = true }, 1126 + [tegra_clk_csus] = { .dt_id = TEGRA114_CLK_CSUS, .present = true }, 1127 + [tegra_clk_mselect] = { .dt_id = TEGRA114_CLK_MSELECT, .present = true }, 1128 + [tegra_clk_tsensor] = { .dt_id = TEGRA114_CLK_TSENSOR, .present = true }, 1129 + [tegra_clk_i2s3] = { .dt_id = TEGRA114_CLK_I2S3, .present = true }, 1130 + [tegra_clk_i2s4] = { .dt_id = TEGRA114_CLK_I2S4, .present = true }, 1131 + [tegra_clk_i2c4] = { .dt_id = TEGRA114_CLK_I2C4, .present = true }, 1132 + [tegra_clk_sbc5_8] = { .dt_id = TEGRA114_CLK_SBC5, .present = true }, 1133 + [tegra_clk_sbc6_8] = { .dt_id = TEGRA114_CLK_SBC6, .present = true }, 1134 + [tegra_clk_d_audio] = { .dt_id = TEGRA114_CLK_D_AUDIO, .present = true }, 1135 + [tegra_clk_apbif] = { .dt_id = TEGRA114_CLK_APBIF, .present = true }, 1136 + [tegra_clk_dam0] = { .dt_id = TEGRA114_CLK_DAM0, .present = true }, 1137 + [tegra_clk_dam1] = { .dt_id = TEGRA114_CLK_DAM1, .present = true }, 1138 + [tegra_clk_dam2] = { .dt_id = TEGRA114_CLK_DAM2, .present = true }, 1139 + [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA114_CLK_HDA2CODEC_2X, .present = true }, 1140 + [tegra_clk_audio0_2x] = { .dt_id = TEGRA114_CLK_AUDIO0_2X, .present = true }, 1141 + [tegra_clk_audio1_2x] = { .dt_id = TEGRA114_CLK_AUDIO1_2X, .present = true }, 1142 + [tegra_clk_audio2_2x] = { .dt_id = TEGRA114_CLK_AUDIO2_2X, .present = true }, 1143 + [tegra_clk_audio3_2x] = { .dt_id = TEGRA114_CLK_AUDIO3_2X, .present = true }, 1144 + [tegra_clk_audio4_2x] = { .dt_id = TEGRA114_CLK_AUDIO4_2X, .present = true }, 1145 + [tegra_clk_spdif_2x] = { .dt_id = TEGRA114_CLK_SPDIF_2X, .present = true }, 1146 + [tegra_clk_actmon] = { .dt_id = TEGRA114_CLK_ACTMON, .present = true }, 1147 + [tegra_clk_extern1] = { .dt_id = TEGRA114_CLK_EXTERN1, .present = true }, 1148 + [tegra_clk_extern2] = { .dt_id = TEGRA114_CLK_EXTERN2, .present = true }, 1149 + [tegra_clk_extern3] = { .dt_id = TEGRA114_CLK_EXTERN3, .present = true }, 1150 + [tegra_clk_hda] = { .dt_id = TEGRA114_CLK_HDA, .present = true }, 1151 + [tegra_clk_se] = { .dt_id = TEGRA114_CLK_SE, .present = true }, 1152 + [tegra_clk_hda2hdmi] = { .dt_id = TEGRA114_CLK_HDA2HDMI, .present = true }, 1153 + [tegra_clk_cilab] = { .dt_id = TEGRA114_CLK_CILAB, .present = true }, 1154 + [tegra_clk_cilcd] = { .dt_id = TEGRA114_CLK_CILCD, .present = true }, 1155 + [tegra_clk_cile] = { .dt_id = TEGRA114_CLK_CILE, .present = true }, 1156 + [tegra_clk_dsialp] = { .dt_id = TEGRA114_CLK_DSIALP, .present = true }, 1157 + [tegra_clk_dsiblp] = { .dt_id = TEGRA114_CLK_DSIBLP, .present = true }, 1158 + [tegra_clk_dds] = { .dt_id = TEGRA114_CLK_DDS, .present = true }, 1159 + [tegra_clk_dp2] = { .dt_id = TEGRA114_CLK_DP2, .present = true }, 1160 + [tegra_clk_amx] = { .dt_id = TEGRA114_CLK_AMX, .present = true }, 1161 + [tegra_clk_adx] = { .dt_id = TEGRA114_CLK_ADX, .present = true }, 1162 + [tegra_clk_xusb_ss] = { .dt_id = TEGRA114_CLK_XUSB_SS, .present = true }, 1163 + [tegra_clk_uartb] = { .dt_id = TEGRA114_CLK_UARTB, .present = true }, 1164 + [tegra_clk_vfir] = { .dt_id = TEGRA114_CLK_VFIR, .present = true }, 1165 + [tegra_clk_spdif_in] = { .dt_id = TEGRA114_CLK_SPDIF_IN, .present = true }, 1166 + [tegra_clk_spdif_out] = { .dt_id = TEGRA114_CLK_SPDIF_OUT, .present = true }, 1167 + [tegra_clk_vi_8] = { .dt_id = TEGRA114_CLK_VI, .present = true }, 1168 + [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA114_CLK_VI_SENSOR, .present = true }, 1169 + [tegra_clk_fuse] = { .dt_id = TEGRA114_CLK_FUSE, .present = true }, 1170 + [tegra_clk_fuse_burn] = { .dt_id = TEGRA114_CLK_FUSE_BURN, .present = true }, 1171 + [tegra_clk_clk_32k] = { .dt_id = TEGRA114_CLK_CLK_32K, .present = true }, 1172 + [tegra_clk_clk_m] = { .dt_id = TEGRA114_CLK_CLK_M, .present = true }, 1173 + [tegra_clk_clk_m_div2] = { .dt_id = TEGRA114_CLK_CLK_M_DIV2, .present = true }, 1174 + [tegra_clk_clk_m_div4] = { .dt_id = TEGRA114_CLK_CLK_M_DIV4, .present = true }, 1175 + [tegra_clk_pll_ref] = { .dt_id = TEGRA114_CLK_PLL_REF, .present = true }, 1176 + [tegra_clk_pll_c] = { .dt_id = TEGRA114_CLK_PLL_C, .present = true }, 1177 + [tegra_clk_pll_c_out1] = { .dt_id = TEGRA114_CLK_PLL_C_OUT1, .present = true }, 1178 + [tegra_clk_pll_c2] = { .dt_id = TEGRA114_CLK_PLL_C2, .present = true }, 1179 + [tegra_clk_pll_c3] = { .dt_id = TEGRA114_CLK_PLL_C3, .present = true }, 1180 + [tegra_clk_pll_m] = { .dt_id = TEGRA114_CLK_PLL_M, .present = true }, 1181 + [tegra_clk_pll_m_out1] = { .dt_id = TEGRA114_CLK_PLL_M_OUT1, .present = true }, 1182 + [tegra_clk_pll_p] = { .dt_id = TEGRA114_CLK_PLL_P, .present = true }, 1183 + [tegra_clk_pll_p_out1] = { .dt_id = TEGRA114_CLK_PLL_P_OUT1, .present = true }, 1184 + [tegra_clk_pll_p_out2_int] = { .dt_id = TEGRA114_CLK_PLL_P_OUT2, .present = true }, 1185 + [tegra_clk_pll_p_out3] = { .dt_id = TEGRA114_CLK_PLL_P_OUT3, .present = true }, 1186 + [tegra_clk_pll_p_out4] = { .dt_id = TEGRA114_CLK_PLL_P_OUT4, .present = true }, 1187 + [tegra_clk_pll_a] = { .dt_id = TEGRA114_CLK_PLL_A, .present = true }, 1188 + [tegra_clk_pll_a_out0] = { .dt_id = TEGRA114_CLK_PLL_A_OUT0, .present = true }, 1189 + [tegra_clk_pll_d] = { .dt_id = TEGRA114_CLK_PLL_D, .present = true }, 1190 + [tegra_clk_pll_d_out0] = { .dt_id = TEGRA114_CLK_PLL_D_OUT0, .present = true }, 1191 + [tegra_clk_pll_d2] = { .dt_id = TEGRA114_CLK_PLL_D2, .present = true }, 1192 + [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA114_CLK_PLL_D2_OUT0, .present = true }, 1193 + [tegra_clk_pll_u] = { .dt_id = TEGRA114_CLK_PLL_U, .present = true }, 1194 + [tegra_clk_pll_u_480m] = { .dt_id = TEGRA114_CLK_PLL_U_480M, .present = true }, 1195 + [tegra_clk_pll_u_60m] = { .dt_id = TEGRA114_CLK_PLL_U_60M, .present = true }, 1196 + [tegra_clk_pll_u_48m] = { .dt_id = TEGRA114_CLK_PLL_U_48M, .present = true }, 1197 + [tegra_clk_pll_u_12m] = { .dt_id = TEGRA114_CLK_PLL_U_12M, .present = true }, 1198 + [tegra_clk_pll_x] = { .dt_id = TEGRA114_CLK_PLL_X, .present = true }, 1199 + [tegra_clk_pll_x_out0] = { .dt_id = TEGRA114_CLK_PLL_X_OUT0, .present = true }, 1200 + [tegra_clk_pll_re_vco] = { .dt_id = TEGRA114_CLK_PLL_RE_VCO, .present = true }, 1201 + [tegra_clk_pll_re_out] = { .dt_id = TEGRA114_CLK_PLL_RE_OUT, .present = true }, 1202 + [tegra_clk_pll_e_out0] = { .dt_id = TEGRA114_CLK_PLL_E_OUT0, .present = true }, 1203 + [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA114_CLK_SPDIF_IN_SYNC, .present = true }, 1204 + [tegra_clk_i2s0_sync] = { .dt_id = TEGRA114_CLK_I2S0_SYNC, .present = true }, 1205 + [tegra_clk_i2s1_sync] = { .dt_id = TEGRA114_CLK_I2S1_SYNC, .present = true }, 1206 + [tegra_clk_i2s2_sync] = { .dt_id = TEGRA114_CLK_I2S2_SYNC, .present = true }, 1207 + [tegra_clk_i2s3_sync] = { .dt_id = TEGRA114_CLK_I2S3_SYNC, .present = true }, 1208 + [tegra_clk_i2s4_sync] = { .dt_id = TEGRA114_CLK_I2S4_SYNC, .present = true }, 1209 + [tegra_clk_vimclk_sync] = { .dt_id = TEGRA114_CLK_VIMCLK_SYNC, .present = true }, 1210 + [tegra_clk_audio0] = { .dt_id = TEGRA114_CLK_AUDIO0, .present = true }, 1211 + [tegra_clk_audio1] = { .dt_id = TEGRA114_CLK_AUDIO1, .present = true }, 1212 + [tegra_clk_audio2] = { .dt_id = TEGRA114_CLK_AUDIO2, .present = true }, 1213 + [tegra_clk_audio3] = { .dt_id = TEGRA114_CLK_AUDIO3, .present = true }, 1214 + [tegra_clk_audio4] = { .dt_id = TEGRA114_CLK_AUDIO4, .present = true }, 1215 + [tegra_clk_spdif] = { .dt_id = TEGRA114_CLK_SPDIF, .present = true }, 1216 + [tegra_clk_clk_out_1] = { .dt_id = TEGRA114_CLK_CLK_OUT_1, .present = true }, 1217 + [tegra_clk_clk_out_2] = { .dt_id = TEGRA114_CLK_CLK_OUT_2, .present = true }, 1218 + [tegra_clk_clk_out_3] = { .dt_id = TEGRA114_CLK_CLK_OUT_3, .present = true }, 1219 + [tegra_clk_blink] = { .dt_id = TEGRA114_CLK_BLINK, .present = true }, 1220 + [tegra_clk_xusb_host_src] = { .dt_id = TEGRA114_CLK_XUSB_HOST_SRC, .present = true }, 1221 + [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true }, 1222 + [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true }, 1223 + [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA114_CLK_XUSB_SS_SRC, .present = true }, 1224 + [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA114_CLK_XUSB_DEV_SRC, .present = true }, 1225 + [tegra_clk_xusb_dev] = { .dt_id = TEGRA114_CLK_XUSB_DEV, .present = true }, 1226 + [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA114_CLK_XUSB_HS_SRC, .present = true }, 1227 + [tegra_clk_sclk] = { .dt_id = TEGRA114_CLK_SCLK, .present = true }, 1228 + [tegra_clk_hclk] = { .dt_id = TEGRA114_CLK_HCLK, .present = true }, 1229 + [tegra_clk_pclk] = { .dt_id = TEGRA114_CLK_PCLK, .present = true }, 1230 + [tegra_clk_cclk_g] = { .dt_id = TEGRA114_CLK_CCLK_G, .present = true }, 1231 + [tegra_clk_cclk_lp] = { .dt_id = TEGRA114_CLK_CCLK_LP, .present = true }, 1232 + [tegra_clk_dfll_ref] = { .dt_id = TEGRA114_CLK_DFLL_REF, .present = true }, 1233 + [tegra_clk_dfll_soc] = { .dt_id = TEGRA114_CLK_DFLL_SOC, .present = true }, 1234 + [tegra_clk_audio0_mux] = { .dt_id = TEGRA114_CLK_AUDIO0_MUX, .present = true }, 1235 + [tegra_clk_audio1_mux] = { .dt_id = TEGRA114_CLK_AUDIO1_MUX, .present = true }, 1236 + [tegra_clk_audio2_mux] = { .dt_id = TEGRA114_CLK_AUDIO2_MUX, .present = true }, 1237 + [tegra_clk_audio3_mux] = { .dt_id = TEGRA114_CLK_AUDIO3_MUX, .present = true }, 1238 + [tegra_clk_audio4_mux] = { .dt_id = TEGRA114_CLK_AUDIO4_MUX, .present = true }, 1239 + [tegra_clk_spdif_mux] = { .dt_id = TEGRA114_CLK_SPDIF_MUX, .present = true }, 1240 + [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_1_MUX, .present = true }, 1241 + [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_2_MUX, .present = true }, 1242 + [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_3_MUX, .present = true }, 1243 + [tegra_clk_dsia_mux] = { .dt_id = TEGRA114_CLK_DSIA_MUX, .present = true }, 1244 + [tegra_clk_dsib_mux] = { .dt_id = TEGRA114_CLK_DSIB_MUX, .present = true }, 1245 + }; 1246 + 1247 + static struct tegra_devclk devclks[] __initdata = { 1248 + { .con_id = "clk_m", .dt_id = TEGRA114_CLK_CLK_M }, 1249 + { .con_id = "pll_ref", .dt_id = TEGRA114_CLK_PLL_REF }, 1250 + { .con_id = "clk_32k", .dt_id = TEGRA114_CLK_CLK_32K }, 1251 + { .con_id = "clk_m_div2", .dt_id = TEGRA114_CLK_CLK_M_DIV2 }, 1252 + { .con_id = "clk_m_div4", .dt_id = TEGRA114_CLK_CLK_M_DIV4 }, 1253 + { .con_id = "pll_c", .dt_id = TEGRA114_CLK_PLL_C }, 1254 + { .con_id = "pll_c_out1", .dt_id = TEGRA114_CLK_PLL_C_OUT1 }, 1255 + { .con_id = "pll_c2", .dt_id = TEGRA114_CLK_PLL_C2 }, 1256 + { .con_id = "pll_c3", .dt_id = TEGRA114_CLK_PLL_C3 }, 1257 + { .con_id = "pll_p", .dt_id = TEGRA114_CLK_PLL_P }, 1258 + { .con_id = "pll_p_out1", .dt_id = TEGRA114_CLK_PLL_P_OUT1 }, 1259 + { .con_id = "pll_p_out2", .dt_id = TEGRA114_CLK_PLL_P_OUT2 }, 1260 + { .con_id = "pll_p_out3", .dt_id = TEGRA114_CLK_PLL_P_OUT3 }, 1261 + { .con_id = "pll_p_out4", .dt_id = TEGRA114_CLK_PLL_P_OUT4 }, 1262 + { .con_id = "pll_m", .dt_id = TEGRA114_CLK_PLL_M }, 1263 + { .con_id = "pll_m_out1", .dt_id = TEGRA114_CLK_PLL_M_OUT1 }, 1264 + { .con_id = "pll_x", .dt_id = TEGRA114_CLK_PLL_X }, 1265 + { .con_id = "pll_x_out0", .dt_id = TEGRA114_CLK_PLL_X_OUT0 }, 1266 + { .con_id = "pll_u", .dt_id = TEGRA114_CLK_PLL_U }, 1267 + { .con_id = "pll_u_480M", .dt_id = TEGRA114_CLK_PLL_U_480M }, 1268 + { .con_id = "pll_u_60M", .dt_id = TEGRA114_CLK_PLL_U_60M }, 1269 + { .con_id = "pll_u_48M", .dt_id = TEGRA114_CLK_PLL_U_48M }, 1270 + { .con_id = "pll_u_12M", .dt_id = TEGRA114_CLK_PLL_U_12M }, 1271 + { .con_id = "pll_d", .dt_id = TEGRA114_CLK_PLL_D }, 1272 + { .con_id = "pll_d_out0", .dt_id = TEGRA114_CLK_PLL_D_OUT0 }, 1273 + { .con_id = "pll_d2", .dt_id = TEGRA114_CLK_PLL_D2 }, 1274 + { .con_id = "pll_d2_out0", .dt_id = TEGRA114_CLK_PLL_D2_OUT0 }, 1275 + { .con_id = "pll_a", .dt_id = TEGRA114_CLK_PLL_A }, 1276 + { .con_id = "pll_a_out0", .dt_id = TEGRA114_CLK_PLL_A_OUT0 }, 1277 + { .con_id = "pll_re_vco", .dt_id = TEGRA114_CLK_PLL_RE_VCO }, 1278 + { .con_id = "pll_re_out", .dt_id = TEGRA114_CLK_PLL_RE_OUT }, 1279 + { .con_id = "pll_e_out0", .dt_id = TEGRA114_CLK_PLL_E_OUT0 }, 1280 + { .con_id = "spdif_in_sync", .dt_id = TEGRA114_CLK_SPDIF_IN_SYNC }, 1281 + { .con_id = "i2s0_sync", .dt_id = TEGRA114_CLK_I2S0_SYNC }, 1282 + { .con_id = "i2s1_sync", .dt_id = TEGRA114_CLK_I2S1_SYNC }, 1283 + { .con_id = "i2s2_sync", .dt_id = TEGRA114_CLK_I2S2_SYNC }, 1284 + { .con_id = "i2s3_sync", .dt_id = TEGRA114_CLK_I2S3_SYNC }, 1285 + { .con_id = "i2s4_sync", .dt_id = TEGRA114_CLK_I2S4_SYNC }, 1286 + { .con_id = "vimclk_sync", .dt_id = TEGRA114_CLK_VIMCLK_SYNC }, 1287 + { .con_id = "audio0", .dt_id = TEGRA114_CLK_AUDIO0 }, 1288 + { .con_id = "audio1", .dt_id = TEGRA114_CLK_AUDIO1 }, 1289 + { .con_id = "audio2", .dt_id = TEGRA114_CLK_AUDIO2 }, 1290 + { .con_id = "audio3", .dt_id = TEGRA114_CLK_AUDIO3 }, 1291 + { .con_id = "audio4", .dt_id = TEGRA114_CLK_AUDIO4 }, 1292 + { .con_id = "spdif", .dt_id = TEGRA114_CLK_SPDIF }, 1293 + { .con_id = "audio0_2x", .dt_id = TEGRA114_CLK_AUDIO0_2X }, 1294 + { .con_id = "audio1_2x", .dt_id = TEGRA114_CLK_AUDIO1_2X }, 1295 + { .con_id = "audio2_2x", .dt_id = TEGRA114_CLK_AUDIO2_2X }, 1296 + { .con_id = "audio3_2x", .dt_id = TEGRA114_CLK_AUDIO3_2X }, 1297 + { .con_id = "audio4_2x", .dt_id = TEGRA114_CLK_AUDIO4_2X }, 1298 + { .con_id = "spdif_2x", .dt_id = TEGRA114_CLK_SPDIF_2X }, 1299 + { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA114_CLK_EXTERN1 }, 1300 + { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA114_CLK_EXTERN2 }, 1301 + { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA114_CLK_EXTERN3 }, 1302 + { .con_id = "blink", .dt_id = TEGRA114_CLK_BLINK }, 1303 + { .con_id = "cclk_g", .dt_id = TEGRA114_CLK_CCLK_G }, 1304 + { .con_id = "cclk_lp", .dt_id = TEGRA114_CLK_CCLK_LP }, 1305 + { .con_id = "sclk", .dt_id = TEGRA114_CLK_SCLK }, 1306 + { .con_id = "hclk", .dt_id = TEGRA114_CLK_HCLK }, 1307 + { .con_id = "pclk", .dt_id = TEGRA114_CLK_PCLK }, 1308 + { .con_id = "fuse", .dt_id = TEGRA114_CLK_FUSE }, 1309 + { .dev_id = "rtc-tegra", .dt_id = TEGRA114_CLK_RTC }, 1310 + { .dev_id = "timer", .dt_id = TEGRA114_CLK_TIMER }, 1311 + }; 1312 + 1313 + static struct clk **clks; 682 1314 683 1315 static unsigned long osc_freq; 684 1316 static unsigned long pll_ref_freq; ··· 944 1086 /* clk_m */ 945 1087 clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT, 946 1088 osc_freq); 947 - clk_register_clkdev(clk, "clk_m", NULL); 948 - clks[clk_m] = clk; 1089 + clks[TEGRA114_CLK_CLK_M] = clk; 949 1090 950 1091 /* pll_ref */ 951 1092 val = (val >> OSC_CTRL_PLL_REF_DIV_SHIFT) & 3; 952 1093 pll_ref_div = 1 << val; 953 1094 clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m", 954 1095 CLK_SET_RATE_PARENT, 1, pll_ref_div); 955 - clk_register_clkdev(clk, "pll_ref", NULL); 956 - clks[pll_ref] = clk; 1096 + clks[TEGRA114_CLK_PLL_REF] = clk; 957 1097 958 1098 pll_ref_freq = osc_freq / pll_ref_div; 959 1099 ··· 965 1109 /* clk_32k */ 966 1110 clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT, 967 1111 32768); 968 - clk_register_clkdev(clk, "clk_32k", NULL); 969 - clks[clk_32k] = clk; 1112 + clks[TEGRA114_CLK_CLK_32K] = clk; 970 1113 971 1114 /* clk_m_div2 */ 972 1115 clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m", 973 1116 CLK_SET_RATE_PARENT, 1, 2); 974 - clk_register_clkdev(clk, "clk_m_div2", NULL); 975 - clks[clk_m_div2] = clk; 1117 + clks[TEGRA114_CLK_CLK_M_DIV2] = clk; 976 1118 977 1119 /* clk_m_div4 */ 978 1120 clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m", 979 1121 CLK_SET_RATE_PARENT, 1, 4); 980 - clk_register_clkdev(clk, "clk_m_div4", NULL); 981 - clks[clk_m_div4] = clk; 1122 + clks[TEGRA114_CLK_CLK_M_DIV4] = clk; 982 1123 983 1124 } 984 1125 ··· 1061 1208 writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); 1062 1209 } 1063 1210 1064 - static void __init _clip_vco_min(struct tegra_clk_pll_params *pll_params) 1065 - { 1066 - pll_params->vco_min = 1067 - DIV_ROUND_UP(pll_params->vco_min, pll_ref_freq) * pll_ref_freq; 1068 - } 1069 - 1070 - static int __init _setup_dynamic_ramp(struct tegra_clk_pll_params *pll_params, 1071 - void __iomem *clk_base) 1072 - { 1073 - u32 val; 1074 - u32 step_a, step_b; 1075 - 1076 - switch (pll_ref_freq) { 1077 - case 12000000: 1078 - case 13000000: 1079 - case 26000000: 1080 - step_a = 0x2B; 1081 - step_b = 0x0B; 1082 - break; 1083 - case 16800000: 1084 - step_a = 0x1A; 1085 - step_b = 0x09; 1086 - break; 1087 - case 19200000: 1088 - step_a = 0x12; 1089 - step_b = 0x08; 1090 - break; 1091 - default: 1092 - pr_err("%s: Unexpected reference rate %lu\n", 1093 - __func__, pll_ref_freq); 1094 - WARN_ON(1); 1095 - return -EINVAL; 1096 - } 1097 - 1098 - val = step_a << pll_params->stepa_shift; 1099 - val |= step_b << pll_params->stepb_shift; 1100 - writel_relaxed(val, clk_base + pll_params->dyn_ramp_reg); 1101 - 1102 - return 0; 1103 - } 1104 - 1105 - static void __init _init_iddq(struct tegra_clk_pll_params *pll_params, 1106 - void __iomem *clk_base) 1107 - { 1108 - u32 val, val_iddq; 1109 - 1110 - val = readl_relaxed(clk_base + pll_params->base_reg); 1111 - val_iddq = readl_relaxed(clk_base + pll_params->iddq_reg); 1112 - 1113 - if (val & BIT(30)) 1114 - WARN_ON(val_iddq & BIT(pll_params->iddq_bit_idx)); 1115 - else { 1116 - val_iddq |= BIT(pll_params->iddq_bit_idx); 1117 - writel_relaxed(val_iddq, clk_base + pll_params->iddq_reg); 1118 - } 1119 - } 1120 - 1121 1211 static void __init tegra114_pll_init(void __iomem *clk_base, 1122 1212 void __iomem *pmc) 1123 1213 { ··· 1068 1272 struct clk *clk; 1069 1273 1070 1274 /* PLLC */ 1071 - _clip_vco_min(&pll_c_params); 1072 - if (_setup_dynamic_ramp(&pll_c_params, clk_base) >= 0) { 1073 - _init_iddq(&pll_c_params, clk_base); 1074 - clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base, 1075 - pmc, 0, 0, &pll_c_params, TEGRA_PLL_USE_LOCK, 1076 - pll_c_freq_table, NULL); 1077 - clk_register_clkdev(clk, "pll_c", NULL); 1078 - clks[pll_c] = clk; 1275 + clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base, 1276 + pmc, 0, &pll_c_params, NULL); 1277 + clks[TEGRA114_CLK_PLL_C] = clk; 1079 1278 1080 - /* PLLC_OUT1 */ 1081 - clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", 1082 - clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1083 - 8, 8, 1, NULL); 1084 - clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", 1085 - clk_base + PLLC_OUT, 1, 0, 1086 - CLK_SET_RATE_PARENT, 0, NULL); 1087 - clk_register_clkdev(clk, "pll_c_out1", NULL); 1088 - clks[pll_c_out1] = clk; 1089 - } 1279 + /* PLLC_OUT1 */ 1280 + clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", 1281 + clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1282 + 8, 8, 1, NULL); 1283 + clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", 1284 + clk_base + PLLC_OUT, 1, 0, 1285 + CLK_SET_RATE_PARENT, 0, NULL); 1286 + clks[TEGRA114_CLK_PLL_C_OUT1] = clk; 1090 1287 1091 1288 /* PLLC2 */ 1092 - _clip_vco_min(&pll_c2_params); 1093 - clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0, 0, 1094 - &pll_c2_params, TEGRA_PLL_USE_LOCK, 1095 - pll_cx_freq_table, NULL); 1096 - clk_register_clkdev(clk, "pll_c2", NULL); 1097 - clks[pll_c2] = clk; 1289 + clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0, 1290 + &pll_c2_params, NULL); 1291 + clks[TEGRA114_CLK_PLL_C2] = clk; 1098 1292 1099 1293 /* PLLC3 */ 1100 - _clip_vco_min(&pll_c3_params); 1101 - clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0, 0, 1102 - &pll_c3_params, TEGRA_PLL_USE_LOCK, 1103 - pll_cx_freq_table, NULL); 1104 - clk_register_clkdev(clk, "pll_c3", NULL); 1105 - clks[pll_c3] = clk; 1106 - 1107 - /* PLLP */ 1108 - clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc, 0, 1109 - 408000000, &pll_p_params, 1110 - TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, 1111 - pll_p_freq_table, NULL); 1112 - clk_register_clkdev(clk, "pll_p", NULL); 1113 - clks[pll_p] = clk; 1114 - 1115 - /* PLLP_OUT1 */ 1116 - clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p", 1117 - clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED | 1118 - TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, &pll_div_lock); 1119 - clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div", 1120 - clk_base + PLLP_OUTA, 1, 0, 1121 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 1122 - &pll_div_lock); 1123 - clk_register_clkdev(clk, "pll_p_out1", NULL); 1124 - clks[pll_p_out1] = clk; 1125 - 1126 - /* PLLP_OUT2 */ 1127 - clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p", 1128 - clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED | 1129 - TEGRA_DIVIDER_ROUND_UP | TEGRA_DIVIDER_INT, 24, 1130 - 8, 1, &pll_div_lock); 1131 - clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div", 1132 - clk_base + PLLP_OUTA, 17, 16, 1133 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 1134 - &pll_div_lock); 1135 - clk_register_clkdev(clk, "pll_p_out2", NULL); 1136 - clks[pll_p_out2] = clk; 1137 - 1138 - /* PLLP_OUT3 */ 1139 - clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p", 1140 - clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED | 1141 - TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, &pll_div_lock); 1142 - clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div", 1143 - clk_base + PLLP_OUTB, 1, 0, 1144 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 1145 - &pll_div_lock); 1146 - clk_register_clkdev(clk, "pll_p_out3", NULL); 1147 - clks[pll_p_out3] = clk; 1148 - 1149 - /* PLLP_OUT4 */ 1150 - clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p", 1151 - clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED | 1152 - TEGRA_DIVIDER_ROUND_UP, 24, 8, 1, 1153 - &pll_div_lock); 1154 - clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div", 1155 - clk_base + PLLP_OUTB, 17, 16, 1156 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 1157 - &pll_div_lock); 1158 - clk_register_clkdev(clk, "pll_p_out4", NULL); 1159 - clks[pll_p_out4] = clk; 1294 + clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0, 1295 + &pll_c3_params, NULL); 1296 + clks[TEGRA114_CLK_PLL_C3] = clk; 1160 1297 1161 1298 /* PLLM */ 1162 - _clip_vco_min(&pll_m_params); 1163 1299 clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc, 1164 - CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, 1165 - &pll_m_params, TEGRA_PLL_USE_LOCK, 1166 - pll_m_freq_table, NULL); 1167 - clk_register_clkdev(clk, "pll_m", NULL); 1168 - clks[pll_m] = clk; 1300 + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 1301 + &pll_m_params, NULL); 1302 + clks[TEGRA114_CLK_PLL_M] = clk; 1169 1303 1170 1304 /* PLLM_OUT1 */ 1171 1305 clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m", ··· 1104 1378 clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div", 1105 1379 clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED | 1106 1380 CLK_SET_RATE_PARENT, 0, NULL); 1107 - clk_register_clkdev(clk, "pll_m_out1", NULL); 1108 - clks[pll_m_out1] = clk; 1381 + clks[TEGRA114_CLK_PLL_M_OUT1] = clk; 1109 1382 1110 1383 /* PLLM_UD */ 1111 1384 clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m", 1112 1385 CLK_SET_RATE_PARENT, 1, 1); 1113 - 1114 - /* PLLX */ 1115 - _clip_vco_min(&pll_x_params); 1116 - if (_setup_dynamic_ramp(&pll_x_params, clk_base) >= 0) { 1117 - _init_iddq(&pll_x_params, clk_base); 1118 - clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base, 1119 - pmc, CLK_IGNORE_UNUSED, 0, &pll_x_params, 1120 - TEGRA_PLL_USE_LOCK, pll_x_freq_table, NULL); 1121 - clk_register_clkdev(clk, "pll_x", NULL); 1122 - clks[pll_x] = clk; 1123 - } 1124 - 1125 - /* PLLX_OUT0 */ 1126 - clk = clk_register_fixed_factor(NULL, "pll_x_out0", "pll_x", 1127 - CLK_SET_RATE_PARENT, 1, 2); 1128 - clk_register_clkdev(clk, "pll_x_out0", NULL); 1129 - clks[pll_x_out0] = clk; 1130 1386 1131 1387 /* PLLU */ 1132 1388 val = readl(clk_base + pll_u_params.base_reg); ··· 1116 1408 writel(val, clk_base + pll_u_params.base_reg); 1117 1409 1118 1410 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0, 1119 - 0, &pll_u_params, TEGRA_PLLU | 1120 - TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 1121 - TEGRA_PLL_USE_LOCK, pll_u_freq_table, &pll_u_lock); 1122 - clk_register_clkdev(clk, "pll_u", NULL); 1123 - clks[pll_u] = clk; 1411 + &pll_u_params, &pll_u_lock); 1412 + clks[TEGRA114_CLK_PLL_U] = clk; 1124 1413 1125 1414 tegra114_utmi_param_configure(clk_base); 1126 1415 ··· 1125 1420 clk = clk_register_gate(NULL, "pll_u_480M", "pll_u", 1126 1421 CLK_SET_RATE_PARENT, clk_base + PLLU_BASE, 1127 1422 22, 0, &pll_u_lock); 1128 - clk_register_clkdev(clk, "pll_u_480M", NULL); 1129 - clks[pll_u_480M] = clk; 1423 + clks[TEGRA114_CLK_PLL_U_480M] = clk; 1130 1424 1131 1425 /* PLLU_60M */ 1132 1426 clk = clk_register_fixed_factor(NULL, "pll_u_60M", "pll_u", 1133 1427 CLK_SET_RATE_PARENT, 1, 8); 1134 - clk_register_clkdev(clk, "pll_u_60M", NULL); 1135 - clks[pll_u_60M] = clk; 1428 + clks[TEGRA114_CLK_PLL_U_60M] = clk; 1136 1429 1137 1430 /* PLLU_48M */ 1138 1431 clk = clk_register_fixed_factor(NULL, "pll_u_48M", "pll_u", 1139 1432 CLK_SET_RATE_PARENT, 1, 10); 1140 - clk_register_clkdev(clk, "pll_u_48M", NULL); 1141 - clks[pll_u_48M] = clk; 1433 + clks[TEGRA114_CLK_PLL_U_48M] = clk; 1142 1434 1143 1435 /* PLLU_12M */ 1144 1436 clk = clk_register_fixed_factor(NULL, "pll_u_12M", "pll_u", 1145 1437 CLK_SET_RATE_PARENT, 1, 40); 1146 - clk_register_clkdev(clk, "pll_u_12M", NULL); 1147 - clks[pll_u_12M] = clk; 1438 + clks[TEGRA114_CLK_PLL_U_12M] = clk; 1148 1439 1149 1440 /* PLLD */ 1150 1441 clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0, 1151 - 0, &pll_d_params, 1152 - TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 1153 - TEGRA_PLL_USE_LOCK, pll_d_freq_table, &pll_d_lock); 1154 - clk_register_clkdev(clk, "pll_d", NULL); 1155 - clks[pll_d] = clk; 1442 + &pll_d_params, &pll_d_lock); 1443 + clks[TEGRA114_CLK_PLL_D] = clk; 1156 1444 1157 1445 /* PLLD_OUT0 */ 1158 1446 clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", 1159 1447 CLK_SET_RATE_PARENT, 1, 2); 1160 - clk_register_clkdev(clk, "pll_d_out0", NULL); 1161 - clks[pll_d_out0] = clk; 1448 + clks[TEGRA114_CLK_PLL_D_OUT0] = clk; 1162 1449 1163 1450 /* PLLD2 */ 1164 1451 clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc, 0, 1165 - 0, &pll_d2_params, 1166 - TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 1167 - TEGRA_PLL_USE_LOCK, pll_d_freq_table, &pll_d2_lock); 1168 - clk_register_clkdev(clk, "pll_d2", NULL); 1169 - clks[pll_d2] = clk; 1452 + &pll_d2_params, &pll_d2_lock); 1453 + clks[TEGRA114_CLK_PLL_D2] = clk; 1170 1454 1171 1455 /* PLLD2_OUT0 */ 1172 1456 clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", 1173 1457 CLK_SET_RATE_PARENT, 1, 2); 1174 - clk_register_clkdev(clk, "pll_d2_out0", NULL); 1175 - clks[pll_d2_out0] = clk; 1176 - 1177 - /* PLLA */ 1178 - clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc, 0, 1179 - 0, &pll_a_params, TEGRA_PLL_HAS_CPCON | 1180 - TEGRA_PLL_USE_LOCK, pll_a_freq_table, NULL); 1181 - clk_register_clkdev(clk, "pll_a", NULL); 1182 - clks[pll_a] = clk; 1183 - 1184 - /* PLLA_OUT0 */ 1185 - clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", 1186 - clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1187 - 8, 8, 1, NULL); 1188 - clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", 1189 - clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED | 1190 - CLK_SET_RATE_PARENT, 0, NULL); 1191 - clk_register_clkdev(clk, "pll_a_out0", NULL); 1192 - clks[pll_a_out0] = clk; 1458 + clks[TEGRA114_CLK_PLL_D2_OUT0] = clk; 1193 1459 1194 1460 /* PLLRE */ 1195 - _clip_vco_min(&pll_re_vco_params); 1196 1461 clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc, 1197 - 0, 0, &pll_re_vco_params, TEGRA_PLL_USE_LOCK, 1198 - NULL, &pll_re_lock, pll_ref_freq); 1199 - clk_register_clkdev(clk, "pll_re_vco", NULL); 1200 - clks[pll_re_vco] = clk; 1462 + 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq); 1463 + clks[TEGRA114_CLK_PLL_RE_VCO] = clk; 1201 1464 1202 1465 clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0, 1203 1466 clk_base + PLLRE_BASE, 16, 4, 0, 1204 1467 pll_re_div_table, &pll_re_lock); 1205 - clk_register_clkdev(clk, "pll_re_out", NULL); 1206 - clks[pll_re_out] = clk; 1468 + clks[TEGRA114_CLK_PLL_RE_OUT] = clk; 1207 1469 1208 1470 /* PLLE */ 1209 - clk = tegra_clk_register_plle_tegra114("pll_e_out0", "pll_re_vco", 1210 - clk_base, 0, 100000000, &pll_e_params, 1211 - pll_e_freq_table, NULL); 1212 - clk_register_clkdev(clk, "pll_e_out0", NULL); 1213 - clks[pll_e_out0] = clk; 1471 + clk = tegra_clk_register_plle_tegra114("pll_e_out0", "pll_ref", 1472 + clk_base, 0, &pll_e_params, NULL); 1473 + clks[TEGRA114_CLK_PLL_E_OUT0] = clk; 1214 1474 } 1215 1475 1216 - static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync", 1217 - "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", 1218 - }; 1219 - 1220 - static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", 1221 - "clk_m_div4", "extern1", 1222 - }; 1223 - 1224 - static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2", 1225 - "clk_m_div4", "extern2", 1226 - }; 1227 - 1228 - static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", 1229 - "clk_m_div4", "extern3", 1230 - }; 1231 - 1232 - static void __init tegra114_audio_clk_init(void __iomem *clk_base) 1476 + static __init void tegra114_periph_clk_init(void __iomem *clk_base, 1477 + void __iomem *pmc_base) 1233 1478 { 1234 1479 struct clk *clk; 1235 - 1236 - /* spdif_in_sync */ 1237 - clk = tegra_clk_register_sync_source("spdif_in_sync", 24000000, 1238 - 24000000); 1239 - clk_register_clkdev(clk, "spdif_in_sync", NULL); 1240 - clks[spdif_in_sync] = clk; 1241 - 1242 - /* i2s0_sync */ 1243 - clk = tegra_clk_register_sync_source("i2s0_sync", 24000000, 24000000); 1244 - clk_register_clkdev(clk, "i2s0_sync", NULL); 1245 - clks[i2s0_sync] = clk; 1246 - 1247 - /* i2s1_sync */ 1248 - clk = tegra_clk_register_sync_source("i2s1_sync", 24000000, 24000000); 1249 - clk_register_clkdev(clk, "i2s1_sync", NULL); 1250 - clks[i2s1_sync] = clk; 1251 - 1252 - /* i2s2_sync */ 1253 - clk = tegra_clk_register_sync_source("i2s2_sync", 24000000, 24000000); 1254 - clk_register_clkdev(clk, "i2s2_sync", NULL); 1255 - clks[i2s2_sync] = clk; 1256 - 1257 - /* i2s3_sync */ 1258 - clk = tegra_clk_register_sync_source("i2s3_sync", 24000000, 24000000); 1259 - clk_register_clkdev(clk, "i2s3_sync", NULL); 1260 - clks[i2s3_sync] = clk; 1261 - 1262 - /* i2s4_sync */ 1263 - clk = tegra_clk_register_sync_source("i2s4_sync", 24000000, 24000000); 1264 - clk_register_clkdev(clk, "i2s4_sync", NULL); 1265 - clks[i2s4_sync] = clk; 1266 - 1267 - /* vimclk_sync */ 1268 - clk = tegra_clk_register_sync_source("vimclk_sync", 24000000, 24000000); 1269 - clk_register_clkdev(clk, "vimclk_sync", NULL); 1270 - clks[vimclk_sync] = clk; 1271 - 1272 - /* audio0 */ 1273 - clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, 1274 - ARRAY_SIZE(mux_audio_sync_clk), 1275 - CLK_SET_RATE_NO_REPARENT, 1276 - clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, 1277 - NULL); 1278 - clks[audio0_mux] = clk; 1279 - clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, 1280 - clk_base + AUDIO_SYNC_CLK_I2S0, 4, 1281 - CLK_GATE_SET_TO_DISABLE, NULL); 1282 - clk_register_clkdev(clk, "audio0", NULL); 1283 - clks[audio0] = clk; 1284 - 1285 - /* audio1 */ 1286 - clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, 1287 - ARRAY_SIZE(mux_audio_sync_clk), 1288 - CLK_SET_RATE_NO_REPARENT, 1289 - clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, 1290 - NULL); 1291 - clks[audio1_mux] = clk; 1292 - clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, 1293 - clk_base + AUDIO_SYNC_CLK_I2S1, 4, 1294 - CLK_GATE_SET_TO_DISABLE, NULL); 1295 - clk_register_clkdev(clk, "audio1", NULL); 1296 - clks[audio1] = clk; 1297 - 1298 - /* audio2 */ 1299 - clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, 1300 - ARRAY_SIZE(mux_audio_sync_clk), 1301 - CLK_SET_RATE_NO_REPARENT, 1302 - clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, 1303 - NULL); 1304 - clks[audio2_mux] = clk; 1305 - clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, 1306 - clk_base + AUDIO_SYNC_CLK_I2S2, 4, 1307 - CLK_GATE_SET_TO_DISABLE, NULL); 1308 - clk_register_clkdev(clk, "audio2", NULL); 1309 - clks[audio2] = clk; 1310 - 1311 - /* audio3 */ 1312 - clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, 1313 - ARRAY_SIZE(mux_audio_sync_clk), 1314 - CLK_SET_RATE_NO_REPARENT, 1315 - clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, 1316 - NULL); 1317 - clks[audio3_mux] = clk; 1318 - clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, 1319 - clk_base + AUDIO_SYNC_CLK_I2S3, 4, 1320 - CLK_GATE_SET_TO_DISABLE, NULL); 1321 - clk_register_clkdev(clk, "audio3", NULL); 1322 - clks[audio3] = clk; 1323 - 1324 - /* audio4 */ 1325 - clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, 1326 - ARRAY_SIZE(mux_audio_sync_clk), 1327 - CLK_SET_RATE_NO_REPARENT, 1328 - clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, 1329 - NULL); 1330 - clks[audio4_mux] = clk; 1331 - clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, 1332 - clk_base + AUDIO_SYNC_CLK_I2S4, 4, 1333 - CLK_GATE_SET_TO_DISABLE, NULL); 1334 - clk_register_clkdev(clk, "audio4", NULL); 1335 - clks[audio4] = clk; 1336 - 1337 - /* spdif */ 1338 - clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, 1339 - ARRAY_SIZE(mux_audio_sync_clk), 1340 - CLK_SET_RATE_NO_REPARENT, 1341 - clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, 1342 - NULL); 1343 - clks[spdif_mux] = clk; 1344 - clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, 1345 - clk_base + AUDIO_SYNC_CLK_SPDIF, 4, 1346 - CLK_GATE_SET_TO_DISABLE, NULL); 1347 - clk_register_clkdev(clk, "spdif", NULL); 1348 - clks[spdif] = clk; 1349 - 1350 - /* audio0_2x */ 1351 - clk = clk_register_fixed_factor(NULL, "audio0_doubler", "audio0", 1352 - CLK_SET_RATE_PARENT, 2, 1); 1353 - clk = tegra_clk_register_divider("audio0_div", "audio0_doubler", 1354 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 24, 1, 1355 - 0, &clk_doubler_lock); 1356 - clk = tegra_clk_register_periph_gate("audio0_2x", "audio0_div", 1357 - TEGRA_PERIPH_NO_RESET, clk_base, 1358 - CLK_SET_RATE_PARENT, 113, &periph_v_regs, 1359 - periph_clk_enb_refcnt); 1360 - clk_register_clkdev(clk, "audio0_2x", NULL); 1361 - clks[audio0_2x] = clk; 1362 - 1363 - /* audio1_2x */ 1364 - clk = clk_register_fixed_factor(NULL, "audio1_doubler", "audio1", 1365 - CLK_SET_RATE_PARENT, 2, 1); 1366 - clk = tegra_clk_register_divider("audio1_div", "audio1_doubler", 1367 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 25, 1, 1368 - 0, &clk_doubler_lock); 1369 - clk = tegra_clk_register_periph_gate("audio1_2x", "audio1_div", 1370 - TEGRA_PERIPH_NO_RESET, clk_base, 1371 - CLK_SET_RATE_PARENT, 114, &periph_v_regs, 1372 - periph_clk_enb_refcnt); 1373 - clk_register_clkdev(clk, "audio1_2x", NULL); 1374 - clks[audio1_2x] = clk; 1375 - 1376 - /* audio2_2x */ 1377 - clk = clk_register_fixed_factor(NULL, "audio2_doubler", "audio2", 1378 - CLK_SET_RATE_PARENT, 2, 1); 1379 - clk = tegra_clk_register_divider("audio2_div", "audio2_doubler", 1380 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 26, 1, 1381 - 0, &clk_doubler_lock); 1382 - clk = tegra_clk_register_periph_gate("audio2_2x", "audio2_div", 1383 - TEGRA_PERIPH_NO_RESET, clk_base, 1384 - CLK_SET_RATE_PARENT, 115, &periph_v_regs, 1385 - periph_clk_enb_refcnt); 1386 - clk_register_clkdev(clk, "audio2_2x", NULL); 1387 - clks[audio2_2x] = clk; 1388 - 1389 - /* audio3_2x */ 1390 - clk = clk_register_fixed_factor(NULL, "audio3_doubler", "audio3", 1391 - CLK_SET_RATE_PARENT, 2, 1); 1392 - clk = tegra_clk_register_divider("audio3_div", "audio3_doubler", 1393 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 27, 1, 1394 - 0, &clk_doubler_lock); 1395 - clk = tegra_clk_register_periph_gate("audio3_2x", "audio3_div", 1396 - TEGRA_PERIPH_NO_RESET, clk_base, 1397 - CLK_SET_RATE_PARENT, 116, &periph_v_regs, 1398 - periph_clk_enb_refcnt); 1399 - clk_register_clkdev(clk, "audio3_2x", NULL); 1400 - clks[audio3_2x] = clk; 1401 - 1402 - /* audio4_2x */ 1403 - clk = clk_register_fixed_factor(NULL, "audio4_doubler", "audio4", 1404 - CLK_SET_RATE_PARENT, 2, 1); 1405 - clk = tegra_clk_register_divider("audio4_div", "audio4_doubler", 1406 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 28, 1, 1407 - 0, &clk_doubler_lock); 1408 - clk = tegra_clk_register_periph_gate("audio4_2x", "audio4_div", 1409 - TEGRA_PERIPH_NO_RESET, clk_base, 1410 - CLK_SET_RATE_PARENT, 117, &periph_v_regs, 1411 - periph_clk_enb_refcnt); 1412 - clk_register_clkdev(clk, "audio4_2x", NULL); 1413 - clks[audio4_2x] = clk; 1414 - 1415 - /* spdif_2x */ 1416 - clk = clk_register_fixed_factor(NULL, "spdif_doubler", "spdif", 1417 - CLK_SET_RATE_PARENT, 2, 1); 1418 - clk = tegra_clk_register_divider("spdif_div", "spdif_doubler", 1419 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 29, 1, 1420 - 0, &clk_doubler_lock); 1421 - clk = tegra_clk_register_periph_gate("spdif_2x", "spdif_div", 1422 - TEGRA_PERIPH_NO_RESET, clk_base, 1423 - CLK_SET_RATE_PARENT, 118, 1424 - &periph_v_regs, periph_clk_enb_refcnt); 1425 - clk_register_clkdev(clk, "spdif_2x", NULL); 1426 - clks[spdif_2x] = clk; 1427 - } 1428 - 1429 - static void __init tegra114_pmc_clk_init(void __iomem *pmc_base) 1430 - { 1431 - struct clk *clk; 1432 - 1433 - /* clk_out_1 */ 1434 - clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, 1435 - ARRAY_SIZE(clk_out1_parents), 1436 - CLK_SET_RATE_NO_REPARENT, 1437 - pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, 1438 - &clk_out_lock); 1439 - clks[clk_out_1_mux] = clk; 1440 - clk = clk_register_gate(NULL, "clk_out_1", "clk_out_1_mux", 0, 1441 - pmc_base + PMC_CLK_OUT_CNTRL, 2, 0, 1442 - &clk_out_lock); 1443 - clk_register_clkdev(clk, "extern1", "clk_out_1"); 1444 - clks[clk_out_1] = clk; 1445 - 1446 - /* clk_out_2 */ 1447 - clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, 1448 - ARRAY_SIZE(clk_out2_parents), 1449 - CLK_SET_RATE_NO_REPARENT, 1450 - pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, 1451 - &clk_out_lock); 1452 - clks[clk_out_2_mux] = clk; 1453 - clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0, 1454 - pmc_base + PMC_CLK_OUT_CNTRL, 10, 0, 1455 - &clk_out_lock); 1456 - clk_register_clkdev(clk, "extern2", "clk_out_2"); 1457 - clks[clk_out_2] = clk; 1458 - 1459 - /* clk_out_3 */ 1460 - clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, 1461 - ARRAY_SIZE(clk_out3_parents), 1462 - CLK_SET_RATE_NO_REPARENT, 1463 - pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, 1464 - &clk_out_lock); 1465 - clks[clk_out_3_mux] = clk; 1466 - clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0, 1467 - pmc_base + PMC_CLK_OUT_CNTRL, 18, 0, 1468 - &clk_out_lock); 1469 - clk_register_clkdev(clk, "extern3", "clk_out_3"); 1470 - clks[clk_out_3] = clk; 1471 - 1472 - /* blink */ 1473 - /* clear the blink timer register to directly output clk_32k */ 1474 - writel_relaxed(0, pmc_base + PMC_BLINK_TIMER); 1475 - clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0, 1476 - pmc_base + PMC_DPD_PADS_ORIDE, 1477 - PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL); 1478 - clk = clk_register_gate(NULL, "blink", "blink_override", 0, 1479 - pmc_base + PMC_CTRL, 1480 - PMC_CTRL_BLINK_ENB, 0, NULL); 1481 - clk_register_clkdev(clk, "blink", NULL); 1482 - clks[blink] = clk; 1483 - 1484 - } 1485 - 1486 - static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4", 1487 - "pll_p", "pll_p_out2", "unused", 1488 - "clk_32k", "pll_m_out1" }; 1489 - 1490 - static const char *cclk_g_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", 1491 - "pll_p", "pll_p_out4", "unused", 1492 - "unused", "pll_x" }; 1493 - 1494 - static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", 1495 - "pll_p", "pll_p_out4", "unused", 1496 - "unused", "pll_x", "pll_x_out0" }; 1497 - 1498 - static void __init tegra114_super_clk_init(void __iomem *clk_base) 1499 - { 1500 - struct clk *clk; 1501 - 1502 - /* CCLKG */ 1503 - clk = tegra_clk_register_super_mux("cclk_g", cclk_g_parents, 1504 - ARRAY_SIZE(cclk_g_parents), 1505 - CLK_SET_RATE_PARENT, 1506 - clk_base + CCLKG_BURST_POLICY, 1507 - 0, 4, 0, 0, NULL); 1508 - clk_register_clkdev(clk, "cclk_g", NULL); 1509 - clks[cclk_g] = clk; 1510 - 1511 - /* CCLKLP */ 1512 - clk = tegra_clk_register_super_mux("cclk_lp", cclk_lp_parents, 1513 - ARRAY_SIZE(cclk_lp_parents), 1514 - CLK_SET_RATE_PARENT, 1515 - clk_base + CCLKLP_BURST_POLICY, 1516 - 0, 4, 8, 9, NULL); 1517 - clk_register_clkdev(clk, "cclk_lp", NULL); 1518 - clks[cclk_lp] = clk; 1519 - 1520 - /* SCLK */ 1521 - clk = tegra_clk_register_super_mux("sclk", sclk_parents, 1522 - ARRAY_SIZE(sclk_parents), 1523 - CLK_SET_RATE_PARENT, 1524 - clk_base + SCLK_BURST_POLICY, 1525 - 0, 4, 0, 0, NULL); 1526 - clk_register_clkdev(clk, "sclk", NULL); 1527 - clks[sclk] = clk; 1528 - 1529 - /* HCLK */ 1530 - clk = clk_register_divider(NULL, "hclk_div", "sclk", 0, 1531 - clk_base + SYSTEM_CLK_RATE, 4, 2, 0, 1532 - &sysrate_lock); 1533 - clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT | 1534 - CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE, 1535 - 7, CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 1536 - clk_register_clkdev(clk, "hclk", NULL); 1537 - clks[hclk] = clk; 1538 - 1539 - /* PCLK */ 1540 - clk = clk_register_divider(NULL, "pclk_div", "hclk", 0, 1541 - clk_base + SYSTEM_CLK_RATE, 0, 2, 0, 1542 - &sysrate_lock); 1543 - clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT | 1544 - CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE, 1545 - 3, CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 1546 - clk_register_clkdev(clk, "pclk", NULL); 1547 - clks[pclk] = clk; 1548 - } 1549 - 1550 - static struct tegra_periph_init_data tegra_periph_clk_list[] = { 1551 - TEGRA_INIT_DATA_MUX("i2s0", NULL, "tegra30-i2s.0", mux_pllaout0_audio0_2x_pllp_clkm, CLK_SOURCE_I2S0, 30, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s0), 1552 - TEGRA_INIT_DATA_MUX("i2s1", NULL, "tegra30-i2s.1", mux_pllaout0_audio1_2x_pllp_clkm, CLK_SOURCE_I2S1, 11, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1), 1553 - TEGRA_INIT_DATA_MUX("i2s2", NULL, "tegra30-i2s.2", mux_pllaout0_audio2_2x_pllp_clkm, CLK_SOURCE_I2S2, 18, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2), 1554 - TEGRA_INIT_DATA_MUX("i2s3", NULL, "tegra30-i2s.3", mux_pllaout0_audio3_2x_pllp_clkm, CLK_SOURCE_I2S3, 101, &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s3), 1555 - TEGRA_INIT_DATA_MUX("i2s4", NULL, "tegra30-i2s.4", mux_pllaout0_audio4_2x_pllp_clkm, CLK_SOURCE_I2S4, 102, &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s4), 1556 - TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out", "tegra30-spdif", mux_pllaout0_audio_2x_pllp_clkm, CLK_SOURCE_SPDIF_OUT, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out), 1557 - TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in", "tegra30-spdif", mux_pllp_pllc_pllm, CLK_SOURCE_SPDIF_IN, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in), 1558 - TEGRA_INIT_DATA_MUX("pwm", NULL, "pwm", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_PWM, 17, &periph_l_regs, TEGRA_PERIPH_ON_APB, pwm), 1559 - TEGRA_INIT_DATA_MUX("adx", NULL, "adx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX, 154, &periph_w_regs, TEGRA_PERIPH_ON_APB, adx), 1560 - TEGRA_INIT_DATA_MUX("amx", NULL, "amx", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX, 153, &periph_w_regs, TEGRA_PERIPH_ON_APB, amx), 1561 - TEGRA_INIT_DATA_MUX("hda", "hda", "tegra30-hda", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA, 125, &periph_v_regs, TEGRA_PERIPH_ON_APB, hda), 1562 - TEGRA_INIT_DATA_MUX("hda2codec_2x", "hda2codec", "tegra30-hda", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_HDA2CODEC_2X, 111, &periph_v_regs, TEGRA_PERIPH_ON_APB, hda2codec_2x), 1563 - TEGRA_INIT_DATA_MUX("sbc1", NULL, "tegra11-spi.0", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC1, 41, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1), 1564 - TEGRA_INIT_DATA_MUX("sbc2", NULL, "tegra11-spi.1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC2, 44, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2), 1565 - TEGRA_INIT_DATA_MUX("sbc3", NULL, "tegra11-spi.2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC3, 46, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3), 1566 - TEGRA_INIT_DATA_MUX("sbc4", NULL, "tegra11-spi.3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC4, 68, &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4), 1567 - TEGRA_INIT_DATA_MUX("sbc5", NULL, "tegra11-spi.4", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC5, 104, &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc5), 1568 - TEGRA_INIT_DATA_MUX("sbc6", NULL, "tegra11-spi.5", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SBC6, 105, &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc6), 1569 - TEGRA_INIT_DATA_MUX8("ndflash", NULL, "tegra_nand", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDFLASH, 13, &periph_u_regs, TEGRA_PERIPH_ON_APB, ndspeed), 1570 - TEGRA_INIT_DATA_MUX8("ndspeed", NULL, "tegra_nand_speed", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDSPEED, 80, &periph_u_regs, TEGRA_PERIPH_ON_APB, ndspeed), 1571 - TEGRA_INIT_DATA_MUX("vfir", NULL, "vfir", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_VFIR, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir), 1572 - TEGRA_INIT_DATA_MUX("sdmmc1", NULL, "sdhci-tegra.0", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC1, 14, &periph_l_regs, 0, sdmmc1), 1573 - TEGRA_INIT_DATA_MUX("sdmmc2", NULL, "sdhci-tegra.1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC2, 9, &periph_l_regs, 0, sdmmc2), 1574 - TEGRA_INIT_DATA_MUX("sdmmc3", NULL, "sdhci-tegra.2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC3, 69, &periph_u_regs, 0, sdmmc3), 1575 - TEGRA_INIT_DATA_MUX("sdmmc4", NULL, "sdhci-tegra.3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_SDMMC4, 15, &periph_l_regs, 0, sdmmc4), 1576 - TEGRA_INIT_DATA_INT("vde", NULL, "vde", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_VDE, 61, &periph_h_regs, 0, vde), 1577 - TEGRA_INIT_DATA_MUX_FLAGS("csite", NULL, "csite", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_CSITE, 73, &periph_u_regs, TEGRA_PERIPH_ON_APB, csite, CLK_IGNORE_UNUSED), 1578 - TEGRA_INIT_DATA_MUX("la", NULL, "la", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_LA, 76, &periph_u_regs, TEGRA_PERIPH_ON_APB, la), 1579 - TEGRA_INIT_DATA_MUX("trace", NULL, "trace", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_TRACE, 77, &periph_u_regs, TEGRA_PERIPH_ON_APB, trace), 1580 - TEGRA_INIT_DATA_MUX("owr", NULL, "tegra_w1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_OWR, 71, &periph_u_regs, TEGRA_PERIPH_ON_APB, owr), 1581 - TEGRA_INIT_DATA_MUX("nor", NULL, "tegra-nor", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_NOR, 42, &periph_h_regs, 0, nor), 1582 - TEGRA_INIT_DATA_MUX("mipi", NULL, "mipi", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_MIPI, 50, &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi), 1583 - TEGRA_INIT_DATA_I2C("i2c1", "div-clk", "tegra11-i2c.0", mux_pllp_clkm, CLK_SOURCE_I2C1, 12, &periph_l_regs, i2c1), 1584 - TEGRA_INIT_DATA_I2C("i2c2", "div-clk", "tegra11-i2c.1", mux_pllp_clkm, CLK_SOURCE_I2C2, 54, &periph_h_regs, i2c2), 1585 - TEGRA_INIT_DATA_I2C("i2c3", "div-clk", "tegra11-i2c.2", mux_pllp_clkm, CLK_SOURCE_I2C3, 67, &periph_u_regs, i2c3), 1586 - TEGRA_INIT_DATA_I2C("i2c4", "div-clk", "tegra11-i2c.3", mux_pllp_clkm, CLK_SOURCE_I2C4, 103, &periph_v_regs, i2c4), 1587 - TEGRA_INIT_DATA_I2C("i2c5", "div-clk", "tegra11-i2c.4", mux_pllp_clkm, CLK_SOURCE_I2C5, 47, &periph_h_regs, i2c5), 1588 - TEGRA_INIT_DATA_UART("uarta", NULL, "tegra_uart.0", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTA, 6, &periph_l_regs, uarta), 1589 - TEGRA_INIT_DATA_UART("uartb", NULL, "tegra_uart.1", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, &periph_l_regs, uartb), 1590 - TEGRA_INIT_DATA_UART("uartc", NULL, "tegra_uart.2", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, &periph_h_regs, uartc), 1591 - TEGRA_INIT_DATA_UART("uartd", NULL, "tegra_uart.3", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, &periph_u_regs, uartd), 1592 - TEGRA_INIT_DATA_INT("3d", NULL, "3d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_3D, 24, &periph_l_regs, 0, gr_3d), 1593 - TEGRA_INIT_DATA_INT("2d", NULL, "2d", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_2D, 21, &periph_l_regs, 0, gr_2d), 1594 - TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor", "tegra_camera", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 20, &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor), 1595 - TEGRA_INIT_DATA_INT8("vi", "vi", "tegra_camera", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI, 20, &periph_l_regs, 0, vi), 1596 - TEGRA_INIT_DATA_INT8("epp", NULL, "epp", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_EPP, 19, &periph_l_regs, 0, epp), 1597 - TEGRA_INIT_DATA_INT8("msenc", NULL, "msenc", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_MSENC, 91, &periph_u_regs, TEGRA_PERIPH_WAR_1005168, msenc), 1598 - TEGRA_INIT_DATA_INT8("tsec", NULL, "tsec", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_TSEC, 83, &periph_u_regs, 0, tsec), 1599 - TEGRA_INIT_DATA_INT8("host1x", NULL, "host1x", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_HOST1X, 28, &periph_l_regs, 0, host1x), 1600 - TEGRA_INIT_DATA_MUX8("hdmi", NULL, "hdmi", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_HDMI, 51, &periph_h_regs, 0, hdmi), 1601 - TEGRA_INIT_DATA_MUX("cilab", "cilab", "tegra_camera", mux_pllp_pllc_clkm, CLK_SOURCE_CILAB, 144, &periph_w_regs, 0, cilab), 1602 - TEGRA_INIT_DATA_MUX("cilcd", "cilcd", "tegra_camera", mux_pllp_pllc_clkm, CLK_SOURCE_CILCD, 145, &periph_w_regs, 0, cilcd), 1603 - TEGRA_INIT_DATA_MUX("cile", "cile", "tegra_camera", mux_pllp_pllc_clkm, CLK_SOURCE_CILE, 146, &periph_w_regs, 0, cile), 1604 - TEGRA_INIT_DATA_MUX("dsialp", "dsialp", "tegradc.0", mux_pllp_pllc_clkm, CLK_SOURCE_DSIALP, 147, &periph_w_regs, 0, dsialp), 1605 - TEGRA_INIT_DATA_MUX("dsiblp", "dsiblp", "tegradc.1", mux_pllp_pllc_clkm, CLK_SOURCE_DSIBLP, 148, &periph_w_regs, 0, dsiblp), 1606 - TEGRA_INIT_DATA_MUX("tsensor", NULL, "tegra-tsensor", mux_pllp_pllc_clkm_clk32, CLK_SOURCE_TSENSOR, 100, &periph_v_regs, TEGRA_PERIPH_ON_APB, tsensor), 1607 - TEGRA_INIT_DATA_MUX("actmon", NULL, "actmon", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_ACTMON, 119, &periph_v_regs, 0, actmon), 1608 - TEGRA_INIT_DATA_MUX8("extern1", NULL, "extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, &periph_v_regs, 0, extern1), 1609 - TEGRA_INIT_DATA_MUX8("extern2", NULL, "extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, &periph_v_regs, 0, extern2), 1610 - TEGRA_INIT_DATA_MUX8("extern3", NULL, "extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, &periph_v_regs, 0, extern3), 1611 - TEGRA_INIT_DATA_MUX("i2cslow", NULL, "i2cslow", mux_pllp_pllc_clk32_clkm, CLK_SOURCE_I2CSLOW, 81, &periph_u_regs, TEGRA_PERIPH_ON_APB, i2cslow), 1612 - TEGRA_INIT_DATA_INT8("se", NULL, "se", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SE, 127, &periph_v_regs, TEGRA_PERIPH_ON_APB, se), 1613 - TEGRA_INIT_DATA_INT_FLAGS("mselect", NULL, "mselect", mux_pllp_clkm, CLK_SOURCE_MSELECT, 99, &periph_v_regs, 0, mselect, CLK_IGNORE_UNUSED), 1614 - TEGRA_INIT_DATA_MUX("dfll_ref", "ref", "t114_dfll", mux_pllp_clkm, CLK_SOURCE_DFLL_REF, 155, &periph_w_regs, TEGRA_PERIPH_ON_APB, dfll_ref), 1615 - TEGRA_INIT_DATA_MUX("dfll_soc", "soc", "t114_dfll", mux_pllp_clkm, CLK_SOURCE_DFLL_SOC, 155, &periph_w_regs, TEGRA_PERIPH_ON_APB, dfll_soc), 1616 - TEGRA_INIT_DATA_MUX8("soc_therm", NULL, "soc_therm", mux_pllm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, &periph_u_regs, TEGRA_PERIPH_ON_APB, soc_therm), 1617 - TEGRA_INIT_DATA_XUSB("xusb_host_src", "host_src", "tegra_xhci", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, &periph_w_regs, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, xusb_host_src), 1618 - TEGRA_INIT_DATA_XUSB("xusb_falcon_src", "falcon_src", "tegra_xhci", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, &periph_w_regs, TEGRA_PERIPH_NO_RESET, xusb_falcon_src), 1619 - TEGRA_INIT_DATA_XUSB("xusb_fs_src", "fs_src", "tegra_xhci", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, &periph_w_regs, TEGRA_PERIPH_NO_RESET, xusb_fs_src), 1620 - TEGRA_INIT_DATA_XUSB("xusb_ss_src", "ss_src", "tegra_xhci", mux_clkm_pllre_clk32_480M_pllc_ref, CLK_SOURCE_XUSB_SS_SRC, 143, &periph_w_regs, TEGRA_PERIPH_NO_RESET, xusb_ss_src), 1621 - TEGRA_INIT_DATA_XUSB("xusb_dev_src", "dev_src", "tegra_xhci", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, &periph_u_regs, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, xusb_dev_src), 1622 - TEGRA_INIT_DATA_AUDIO("d_audio", "d_audio", "tegra30-ahub", CLK_SOURCE_D_AUDIO, 106, &periph_v_regs, TEGRA_PERIPH_ON_APB, d_audio), 1623 - TEGRA_INIT_DATA_AUDIO("dam0", NULL, "tegra30-dam.0", CLK_SOURCE_DAM0, 108, &periph_v_regs, TEGRA_PERIPH_ON_APB, dam0), 1624 - TEGRA_INIT_DATA_AUDIO("dam1", NULL, "tegra30-dam.1", CLK_SOURCE_DAM1, 109, &periph_v_regs, TEGRA_PERIPH_ON_APB, dam1), 1625 - TEGRA_INIT_DATA_AUDIO("dam2", NULL, "tegra30-dam.2", CLK_SOURCE_DAM2, 110, &periph_v_regs, TEGRA_PERIPH_ON_APB, dam2), 1626 - }; 1627 - 1628 - static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = { 1629 - TEGRA_INIT_DATA_NODIV("disp1", NULL, "tegradc.0", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP1, 29, 7, 27, &periph_l_regs, 0, disp1), 1630 - TEGRA_INIT_DATA_NODIV("disp2", NULL, "tegradc.1", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP2, 29, 7, 26, &periph_l_regs, 0, disp2), 1631 - }; 1632 - 1633 - static __init void tegra114_periph_clk_init(void __iomem *clk_base) 1634 - { 1635 - struct tegra_periph_init_data *data; 1636 - struct clk *clk; 1637 - int i; 1638 1480 u32 val; 1639 - 1640 - /* apbdma */ 1641 - clk = tegra_clk_register_periph_gate("apbdma", "clk_m", 0, clk_base, 1642 - 0, 34, &periph_h_regs, 1643 - periph_clk_enb_refcnt); 1644 - clks[apbdma] = clk; 1645 - 1646 - /* rtc */ 1647 - clk = tegra_clk_register_periph_gate("rtc", "clk_32k", 1648 - TEGRA_PERIPH_ON_APB | 1649 - TEGRA_PERIPH_NO_RESET, clk_base, 1650 - 0, 4, &periph_l_regs, 1651 - periph_clk_enb_refcnt); 1652 - clk_register_clkdev(clk, NULL, "rtc-tegra"); 1653 - clks[rtc] = clk; 1654 - 1655 - /* kbc */ 1656 - clk = tegra_clk_register_periph_gate("kbc", "clk_32k", 1657 - TEGRA_PERIPH_ON_APB | 1658 - TEGRA_PERIPH_NO_RESET, clk_base, 1659 - 0, 36, &periph_h_regs, 1660 - periph_clk_enb_refcnt); 1661 - clks[kbc] = clk; 1662 - 1663 - /* timer */ 1664 - clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base, 1665 - 0, 5, &periph_l_regs, 1666 - periph_clk_enb_refcnt); 1667 - clk_register_clkdev(clk, NULL, "timer"); 1668 - clks[timer] = clk; 1669 - 1670 - /* kfuse */ 1671 - clk = tegra_clk_register_periph_gate("kfuse", "clk_m", 1672 - TEGRA_PERIPH_ON_APB, clk_base, 0, 40, 1673 - &periph_h_regs, periph_clk_enb_refcnt); 1674 - clks[kfuse] = clk; 1675 - 1676 - /* fuse */ 1677 - clk = tegra_clk_register_periph_gate("fuse", "clk_m", 1678 - TEGRA_PERIPH_ON_APB, clk_base, 0, 39, 1679 - &periph_h_regs, periph_clk_enb_refcnt); 1680 - clks[fuse] = clk; 1681 - 1682 - /* fuse_burn */ 1683 - clk = tegra_clk_register_periph_gate("fuse_burn", "clk_m", 1684 - TEGRA_PERIPH_ON_APB, clk_base, 0, 39, 1685 - &periph_h_regs, periph_clk_enb_refcnt); 1686 - clks[fuse_burn] = clk; 1687 - 1688 - /* apbif */ 1689 - clk = tegra_clk_register_periph_gate("apbif", "clk_m", 1690 - TEGRA_PERIPH_ON_APB, clk_base, 0, 107, 1691 - &periph_v_regs, periph_clk_enb_refcnt); 1692 - clks[apbif] = clk; 1693 - 1694 - /* hda2hdmi */ 1695 - clk = tegra_clk_register_periph_gate("hda2hdmi", "clk_m", 1696 - TEGRA_PERIPH_ON_APB, clk_base, 0, 128, 1697 - &periph_w_regs, periph_clk_enb_refcnt); 1698 - clks[hda2hdmi] = clk; 1699 - 1700 - /* vcp */ 1701 - clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0, clk_base, 0, 1702 - 29, &periph_l_regs, 1703 - periph_clk_enb_refcnt); 1704 - clks[vcp] = clk; 1705 - 1706 - /* bsea */ 1707 - clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0, clk_base, 1708 - 0, 62, &periph_h_regs, 1709 - periph_clk_enb_refcnt); 1710 - clks[bsea] = clk; 1711 - 1712 - /* bsev */ 1713 - clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0, clk_base, 1714 - 0, 63, &periph_h_regs, 1715 - periph_clk_enb_refcnt); 1716 - clks[bsev] = clk; 1717 - 1718 - /* mipi-cal */ 1719 - clk = tegra_clk_register_periph_gate("mipi-cal", "clk_m", 0, clk_base, 1720 - 0, 56, &periph_h_regs, 1721 - periph_clk_enb_refcnt); 1722 - clks[mipi_cal] = clk; 1723 - 1724 - /* usbd */ 1725 - clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 1726 - 0, 22, &periph_l_regs, 1727 - periph_clk_enb_refcnt); 1728 - clks[usbd] = clk; 1729 - 1730 - /* usb2 */ 1731 - clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 1732 - 0, 58, &periph_h_regs, 1733 - periph_clk_enb_refcnt); 1734 - clks[usb2] = clk; 1735 - 1736 - /* usb3 */ 1737 - clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 1738 - 0, 59, &periph_h_regs, 1739 - periph_clk_enb_refcnt); 1740 - clks[usb3] = clk; 1741 - 1742 - /* csi */ 1743 - clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base, 1744 - 0, 52, &periph_h_regs, 1745 - periph_clk_enb_refcnt); 1746 - clks[csi] = clk; 1747 - 1748 - /* isp */ 1749 - clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 1750 - 23, &periph_l_regs, 1751 - periph_clk_enb_refcnt); 1752 - clks[isp] = clk; 1753 - 1754 - /* csus */ 1755 - clk = tegra_clk_register_periph_gate("csus", "clk_m", 1756 - TEGRA_PERIPH_NO_RESET, clk_base, 0, 92, 1757 - &periph_u_regs, periph_clk_enb_refcnt); 1758 - clks[csus] = clk; 1759 - 1760 - /* dds */ 1761 - clk = tegra_clk_register_periph_gate("dds", "clk_m", 1762 - TEGRA_PERIPH_ON_APB, clk_base, 0, 150, 1763 - &periph_w_regs, periph_clk_enb_refcnt); 1764 - clks[dds] = clk; 1765 - 1766 - /* dp2 */ 1767 - clk = tegra_clk_register_periph_gate("dp2", "clk_m", 1768 - TEGRA_PERIPH_ON_APB, clk_base, 0, 152, 1769 - &periph_w_regs, periph_clk_enb_refcnt); 1770 - clks[dp2] = clk; 1771 - 1772 - /* dtv */ 1773 - clk = tegra_clk_register_periph_gate("dtv", "clk_m", 1774 - TEGRA_PERIPH_ON_APB, clk_base, 0, 79, 1775 - &periph_u_regs, periph_clk_enb_refcnt); 1776 - clks[dtv] = clk; 1777 - 1778 - /* dsia */ 1779 - clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, 1780 - ARRAY_SIZE(mux_plld_out0_plld2_out0), 1781 - CLK_SET_RATE_NO_REPARENT, 1782 - clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); 1783 - clks[dsia_mux] = clk; 1784 - clk = tegra_clk_register_periph_gate("dsia", "dsia_mux", 0, clk_base, 1785 - 0, 48, &periph_h_regs, 1786 - periph_clk_enb_refcnt); 1787 - clks[dsia] = clk; 1788 - 1789 - /* dsib */ 1790 - clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, 1791 - ARRAY_SIZE(mux_plld_out0_plld2_out0), 1792 - CLK_SET_RATE_NO_REPARENT, 1793 - clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); 1794 - clks[dsib_mux] = clk; 1795 - clk = tegra_clk_register_periph_gate("dsib", "dsib_mux", 0, clk_base, 1796 - 0, 82, &periph_u_regs, 1797 - periph_clk_enb_refcnt); 1798 - clks[dsib] = clk; 1799 1481 1800 1482 /* xusb_hs_src */ 1801 1483 val = readl(clk_base + CLK_SOURCE_XUSB_SS_SRC); ··· 1191 2099 1192 2100 clk = clk_register_fixed_factor(NULL, "xusb_hs_src", "pll_u_60M", 0, 1193 2101 1, 1); 1194 - clks[xusb_hs_src] = clk; 2102 + clks[TEGRA114_CLK_XUSB_HS_SRC] = clk; 1195 2103 1196 - /* xusb_host */ 1197 - clk = tegra_clk_register_periph_gate("xusb_host", "xusb_host_src", 0, 1198 - clk_base, 0, 89, &periph_u_regs, 1199 - periph_clk_enb_refcnt); 1200 - clks[xusb_host] = clk; 2104 + /* dsia mux */ 2105 + clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, 2106 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 2107 + CLK_SET_RATE_NO_REPARENT, 2108 + clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); 2109 + clks[TEGRA114_CLK_DSIA_MUX] = clk; 1201 2110 1202 - /* xusb_ss */ 1203 - clk = tegra_clk_register_periph_gate("xusb_ss", "xusb_ss_src", 0, 1204 - clk_base, 0, 156, &periph_w_regs, 1205 - periph_clk_enb_refcnt); 1206 - clks[xusb_host] = clk; 2111 + /* dsib mux */ 2112 + clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, 2113 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 2114 + CLK_SET_RATE_NO_REPARENT, 2115 + clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); 2116 + clks[TEGRA114_CLK_DSIB_MUX] = clk; 1207 2117 1208 - /* xusb_dev */ 1209 - clk = tegra_clk_register_periph_gate("xusb_dev", "xusb_dev_src", 0, 1210 - clk_base, 0, 95, &periph_u_regs, 1211 - periph_clk_enb_refcnt); 1212 - clks[xusb_dev] = clk; 1213 - 1214 - /* emc */ 2118 + /* emc mux */ 1215 2119 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 1216 2120 ARRAY_SIZE(mux_pllmcp_clkm), 1217 2121 CLK_SET_RATE_NO_REPARENT, 1218 2122 clk_base + CLK_SOURCE_EMC, 1219 2123 29, 3, 0, NULL); 1220 - clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 1221 - CLK_IGNORE_UNUSED, 57, &periph_h_regs, 1222 - periph_clk_enb_refcnt); 1223 - clks[emc] = clk; 1224 2124 1225 - for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { 1226 - data = &tegra_periph_clk_list[i]; 1227 - clk = tegra_clk_register_periph(data->name, data->parent_names, 1228 - data->num_parents, &data->periph, 1229 - clk_base, data->offset, data->flags); 1230 - clks[data->clk_id] = clk; 1231 - } 1232 - 1233 - for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) { 1234 - data = &tegra_periph_nodiv_clk_list[i]; 1235 - clk = tegra_clk_register_periph_nodiv(data->name, 1236 - data->parent_names, data->num_parents, 1237 - &data->periph, clk_base, data->offset); 1238 - clks[data->clk_id] = clk; 1239 - } 2125 + tegra_periph_clk_init(clk_base, pmc_base, tegra114_clks, 2126 + &pll_p_params); 1240 2127 } 1241 2128 1242 2129 /* Tegra114 CPU clock and reset control functions */ ··· 1278 2207 * breaks 1279 2208 */ 1280 2209 static struct tegra_clk_init_table init_table[] __initdata = { 1281 - {uarta, pll_p, 408000000, 0}, 1282 - {uartb, pll_p, 408000000, 0}, 1283 - {uartc, pll_p, 408000000, 0}, 1284 - {uartd, pll_p, 408000000, 0}, 1285 - {pll_a, clk_max, 564480000, 1}, 1286 - {pll_a_out0, clk_max, 11289600, 1}, 1287 - {extern1, pll_a_out0, 0, 1}, 1288 - {clk_out_1_mux, extern1, 0, 1}, 1289 - {clk_out_1, clk_max, 0, 1}, 1290 - {i2s0, pll_a_out0, 11289600, 0}, 1291 - {i2s1, pll_a_out0, 11289600, 0}, 1292 - {i2s2, pll_a_out0, 11289600, 0}, 1293 - {i2s3, pll_a_out0, 11289600, 0}, 1294 - {i2s4, pll_a_out0, 11289600, 0}, 1295 - {dfll_soc, pll_p, 51000000, 1}, 1296 - {dfll_ref, pll_p, 51000000, 1}, 1297 - {clk_max, clk_max, 0, 0}, /* This MUST be the last entry. */ 2210 + {TEGRA114_CLK_UARTA, TEGRA114_CLK_PLL_P, 408000000, 0}, 2211 + {TEGRA114_CLK_UARTB, TEGRA114_CLK_PLL_P, 408000000, 0}, 2212 + {TEGRA114_CLK_UARTC, TEGRA114_CLK_PLL_P, 408000000, 0}, 2213 + {TEGRA114_CLK_UARTD, TEGRA114_CLK_PLL_P, 408000000, 0}, 2214 + {TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 1}, 2215 + {TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 1}, 2216 + {TEGRA114_CLK_EXTERN1, TEGRA114_CLK_PLL_A_OUT0, 0, 1}, 2217 + {TEGRA114_CLK_CLK_OUT_1_MUX, TEGRA114_CLK_EXTERN1, 0, 1}, 2218 + {TEGRA114_CLK_CLK_OUT_1, TEGRA114_CLK_CLK_MAX, 0, 1}, 2219 + {TEGRA114_CLK_I2S0, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, 2220 + {TEGRA114_CLK_I2S1, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, 2221 + {TEGRA114_CLK_I2S2, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, 2222 + {TEGRA114_CLK_I2S3, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, 2223 + {TEGRA114_CLK_I2S4, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, 2224 + {TEGRA114_CLK_HOST1X, TEGRA114_CLK_PLL_P, 136000000, 0}, 2225 + {TEGRA114_CLK_DFLL_SOC, TEGRA114_CLK_PLL_P, 51000000, 1}, 2226 + {TEGRA114_CLK_DFLL_REF, TEGRA114_CLK_PLL_P, 51000000, 1}, 2227 + {TEGRA114_CLK_DISP1, TEGRA114_CLK_PLL_P, 0, 0}, 2228 + {TEGRA114_CLK_DISP2, TEGRA114_CLK_PLL_P, 0, 0}, 2229 + {TEGRA114_CLK_GR2D, TEGRA114_CLK_PLL_C2, 300000000, 0}, 2230 + {TEGRA114_CLK_GR3D, TEGRA114_CLK_PLL_C2, 300000000, 0}, 2231 + {TEGRA114_CLK_DSIALP, TEGRA114_CLK_PLL_P, 68000000, 0}, 2232 + {TEGRA114_CLK_DSIBLP, TEGRA114_CLK_PLL_P, 68000000, 0}, 2233 + 2234 + /* This MUST be the last entry. */ 2235 + {TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0}, 1298 2236 }; 1299 2237 1300 2238 static void __init tegra114_clock_apply_init_table(void) 1301 2239 { 1302 - tegra_init_from_table(init_table, clks, clk_max); 2240 + tegra_init_from_table(init_table, clks, TEGRA114_CLK_CLK_MAX); 1303 2241 } 1304 2242 1305 2243 ··· 1439 2359 static void __init tegra114_clock_init(struct device_node *np) 1440 2360 { 1441 2361 struct device_node *node; 1442 - int i; 1443 2362 1444 2363 clk_base = of_iomap(np, 0); 1445 2364 if (!clk_base) { ··· 1460 2381 return; 1461 2382 } 1462 2383 2384 + clks = tegra_clk_init(TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_PERIPH_BANKS); 2385 + if (!clks) 2386 + return; 2387 + 1463 2388 if (tegra114_osc_clk_init(clk_base) < 0) 1464 2389 return; 1465 2390 1466 2391 tegra114_fixed_clk_init(clk_base); 1467 2392 tegra114_pll_init(clk_base, pmc_base); 1468 - tegra114_periph_clk_init(clk_base); 1469 - tegra114_audio_clk_init(clk_base); 1470 - tegra114_pmc_clk_init(pmc_base); 1471 - tegra114_super_clk_init(clk_base); 2393 + tegra114_periph_clk_init(clk_base, pmc_base); 2394 + tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, &pll_a_params); 2395 + tegra_pmc_clk_init(pmc_base, tegra114_clks); 2396 + tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks, 2397 + &pll_x_params); 1472 2398 1473 - for (i = 0; i < ARRAY_SIZE(clks); i++) { 1474 - if (IS_ERR(clks[i])) { 1475 - pr_err 1476 - ("Tegra114 clk %d: register failed with %ld\n", 1477 - i, PTR_ERR(clks[i])); 1478 - } 1479 - if (!clks[i]) 1480 - clks[i] = ERR_PTR(-EINVAL); 1481 - } 1482 - 1483 - clk_data.clks = clks; 1484 - clk_data.clk_num = ARRAY_SIZE(clks); 1485 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 2399 + tegra_add_of_provider(np); 2400 + tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1486 2401 1487 2402 tegra_clk_apply_init_table = tegra114_clock_apply_init_table; 1488 2403
+1424
drivers/clk/tegra/clk-tegra124.c
··· 1 + /* 2 + * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify it 5 + * under the terms and conditions of the GNU General Public License, 6 + * version 2, as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope it will be useful, but WITHOUT 9 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 + * more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include <linux/io.h> 18 + #include <linux/clk.h> 19 + #include <linux/clk-provider.h> 20 + #include <linux/clkdev.h> 21 + #include <linux/of.h> 22 + #include <linux/of_address.h> 23 + #include <linux/delay.h> 24 + #include <linux/export.h> 25 + #include <linux/clk/tegra.h> 26 + #include <dt-bindings/clock/tegra124-car.h> 27 + 28 + #include "clk.h" 29 + #include "clk-id.h" 30 + 31 + #define CLK_SOURCE_CSITE 0x1d4 32 + #define CLK_SOURCE_EMC 0x19c 33 + #define CLK_SOURCE_XUSB_SS_SRC 0x610 34 + 35 + #define PLLC_BASE 0x80 36 + #define PLLC_OUT 0x84 37 + #define PLLC_MISC2 0x88 38 + #define PLLC_MISC 0x8c 39 + #define PLLC2_BASE 0x4e8 40 + #define PLLC2_MISC 0x4ec 41 + #define PLLC3_BASE 0x4fc 42 + #define PLLC3_MISC 0x500 43 + #define PLLM_BASE 0x90 44 + #define PLLM_OUT 0x94 45 + #define PLLM_MISC 0x9c 46 + #define PLLP_BASE 0xa0 47 + #define PLLP_MISC 0xac 48 + #define PLLA_BASE 0xb0 49 + #define PLLA_MISC 0xbc 50 + #define PLLD_BASE 0xd0 51 + #define PLLD_MISC 0xdc 52 + #define PLLU_BASE 0xc0 53 + #define PLLU_MISC 0xcc 54 + #define PLLX_BASE 0xe0 55 + #define PLLX_MISC 0xe4 56 + #define PLLX_MISC2 0x514 57 + #define PLLX_MISC3 0x518 58 + #define PLLE_BASE 0xe8 59 + #define PLLE_MISC 0xec 60 + #define PLLD2_BASE 0x4b8 61 + #define PLLD2_MISC 0x4bc 62 + #define PLLE_AUX 0x48c 63 + #define PLLRE_BASE 0x4c4 64 + #define PLLRE_MISC 0x4c8 65 + #define PLLDP_BASE 0x590 66 + #define PLLDP_MISC 0x594 67 + #define PLLC4_BASE 0x5a4 68 + #define PLLC4_MISC 0x5a8 69 + 70 + #define PLLC_IDDQ_BIT 26 71 + #define PLLRE_IDDQ_BIT 16 72 + #define PLLSS_IDDQ_BIT 19 73 + 74 + #define PLL_BASE_LOCK BIT(27) 75 + #define PLLE_MISC_LOCK BIT(11) 76 + #define PLLRE_MISC_LOCK BIT(24) 77 + 78 + #define PLL_MISC_LOCK_ENABLE 18 79 + #define PLLC_MISC_LOCK_ENABLE 24 80 + #define PLLDU_MISC_LOCK_ENABLE 22 81 + #define PLLE_MISC_LOCK_ENABLE 9 82 + #define PLLRE_MISC_LOCK_ENABLE 30 83 + #define PLLSS_MISC_LOCK_ENABLE 30 84 + 85 + #define PLLXC_SW_MAX_P 6 86 + 87 + #define PMC_PLLM_WB0_OVERRIDE 0x1dc 88 + #define PMC_PLLM_WB0_OVERRIDE_2 0x2b0 89 + 90 + #define UTMIP_PLL_CFG2 0x488 91 + #define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6) 92 + #define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18) 93 + #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0) 94 + #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2) 95 + #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4) 96 + 97 + #define UTMIP_PLL_CFG1 0x484 98 + #define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6) 99 + #define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0) 100 + #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17) 101 + #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16) 102 + #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15) 103 + #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14) 104 + #define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12) 105 + 106 + #define UTMIPLL_HW_PWRDN_CFG0 0x52c 107 + #define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25) 108 + #define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24) 109 + #define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6) 110 + #define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5) 111 + #define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4) 112 + #define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2) 113 + #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1) 114 + #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0) 115 + 116 + /* Tegra CPU clock and reset control regs */ 117 + #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470 118 + 119 + #ifdef CONFIG_PM_SLEEP 120 + static struct cpu_clk_suspend_context { 121 + u32 clk_csite_src; 122 + } tegra124_cpu_clk_sctx; 123 + #endif 124 + 125 + static void __iomem *clk_base; 126 + static void __iomem *pmc_base; 127 + 128 + static unsigned long osc_freq; 129 + static unsigned long pll_ref_freq; 130 + 131 + static DEFINE_SPINLOCK(pll_d_lock); 132 + static DEFINE_SPINLOCK(pll_d2_lock); 133 + static DEFINE_SPINLOCK(pll_e_lock); 134 + static DEFINE_SPINLOCK(pll_re_lock); 135 + static DEFINE_SPINLOCK(pll_u_lock); 136 + 137 + /* possible OSC frequencies in Hz */ 138 + static unsigned long tegra124_input_freq[] = { 139 + [0] = 13000000, 140 + [1] = 16800000, 141 + [4] = 19200000, 142 + [5] = 38400000, 143 + [8] = 12000000, 144 + [9] = 48000000, 145 + [12] = 260000000, 146 + }; 147 + 148 + static const char *mux_plld_out0_plld2_out0[] = { 149 + "pll_d_out0", "pll_d2_out0", 150 + }; 151 + #define mux_plld_out0_plld2_out0_idx NULL 152 + 153 + static const char *mux_pllmcp_clkm[] = { 154 + "pll_m", "pll_c", "pll_p", "clk_m", "pll_m_ud", "pll_c2", "pll_c3", 155 + }; 156 + #define mux_pllmcp_clkm_idx NULL 157 + 158 + static struct div_nmp pllxc_nmp = { 159 + .divm_shift = 0, 160 + .divm_width = 8, 161 + .divn_shift = 8, 162 + .divn_width = 8, 163 + .divp_shift = 20, 164 + .divp_width = 4, 165 + }; 166 + 167 + static struct pdiv_map pllxc_p[] = { 168 + { .pdiv = 1, .hw_val = 0 }, 169 + { .pdiv = 2, .hw_val = 1 }, 170 + { .pdiv = 3, .hw_val = 2 }, 171 + { .pdiv = 4, .hw_val = 3 }, 172 + { .pdiv = 5, .hw_val = 4 }, 173 + { .pdiv = 6, .hw_val = 5 }, 174 + { .pdiv = 8, .hw_val = 6 }, 175 + { .pdiv = 10, .hw_val = 7 }, 176 + { .pdiv = 12, .hw_val = 8 }, 177 + { .pdiv = 16, .hw_val = 9 }, 178 + { .pdiv = 12, .hw_val = 10 }, 179 + { .pdiv = 16, .hw_val = 11 }, 180 + { .pdiv = 20, .hw_val = 12 }, 181 + { .pdiv = 24, .hw_val = 13 }, 182 + { .pdiv = 32, .hw_val = 14 }, 183 + { .pdiv = 0, .hw_val = 0 }, 184 + }; 185 + 186 + static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { 187 + /* 1 GHz */ 188 + {12000000, 1000000000, 83, 0, 1}, /* actual: 996.0 MHz */ 189 + {13000000, 1000000000, 76, 0, 1}, /* actual: 988.0 MHz */ 190 + {16800000, 1000000000, 59, 0, 1}, /* actual: 991.2 MHz */ 191 + {19200000, 1000000000, 52, 0, 1}, /* actual: 998.4 MHz */ 192 + {26000000, 1000000000, 76, 1, 1}, /* actual: 988.0 MHz */ 193 + {0, 0, 0, 0, 0, 0}, 194 + }; 195 + 196 + static struct tegra_clk_pll_params pll_x_params = { 197 + .input_min = 12000000, 198 + .input_max = 800000000, 199 + .cf_min = 12000000, 200 + .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ 201 + .vco_min = 700000000, 202 + .vco_max = 3000000000UL, 203 + .base_reg = PLLX_BASE, 204 + .misc_reg = PLLX_MISC, 205 + .lock_mask = PLL_BASE_LOCK, 206 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 207 + .lock_delay = 300, 208 + .iddq_reg = PLLX_MISC3, 209 + .iddq_bit_idx = 3, 210 + .max_p = 6, 211 + .dyn_ramp_reg = PLLX_MISC2, 212 + .stepa_shift = 16, 213 + .stepb_shift = 24, 214 + .pdiv_tohw = pllxc_p, 215 + .div_nmp = &pllxc_nmp, 216 + .freq_table = pll_x_freq_table, 217 + .flags = TEGRA_PLL_USE_LOCK, 218 + }; 219 + 220 + static struct tegra_clk_pll_freq_table pll_c_freq_table[] = { 221 + { 12000000, 624000000, 104, 1, 2}, 222 + { 12000000, 600000000, 100, 1, 2}, 223 + { 13000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */ 224 + { 16800000, 600000000, 71, 1, 2}, /* actual: 596.4 MHz */ 225 + { 19200000, 600000000, 62, 1, 2}, /* actual: 595.2 MHz */ 226 + { 26000000, 600000000, 92, 2, 2}, /* actual: 598.0 MHz */ 227 + { 0, 0, 0, 0, 0, 0 }, 228 + }; 229 + 230 + static struct tegra_clk_pll_params pll_c_params = { 231 + .input_min = 12000000, 232 + .input_max = 800000000, 233 + .cf_min = 12000000, 234 + .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ 235 + .vco_min = 600000000, 236 + .vco_max = 1400000000, 237 + .base_reg = PLLC_BASE, 238 + .misc_reg = PLLC_MISC, 239 + .lock_mask = PLL_BASE_LOCK, 240 + .lock_enable_bit_idx = PLLC_MISC_LOCK_ENABLE, 241 + .lock_delay = 300, 242 + .iddq_reg = PLLC_MISC, 243 + .iddq_bit_idx = PLLC_IDDQ_BIT, 244 + .max_p = PLLXC_SW_MAX_P, 245 + .dyn_ramp_reg = PLLC_MISC2, 246 + .stepa_shift = 17, 247 + .stepb_shift = 9, 248 + .pdiv_tohw = pllxc_p, 249 + .div_nmp = &pllxc_nmp, 250 + .freq_table = pll_c_freq_table, 251 + .flags = TEGRA_PLL_USE_LOCK, 252 + }; 253 + 254 + static struct div_nmp pllcx_nmp = { 255 + .divm_shift = 0, 256 + .divm_width = 2, 257 + .divn_shift = 8, 258 + .divn_width = 8, 259 + .divp_shift = 20, 260 + .divp_width = 3, 261 + }; 262 + 263 + static struct pdiv_map pllc_p[] = { 264 + { .pdiv = 1, .hw_val = 0 }, 265 + { .pdiv = 2, .hw_val = 1 }, 266 + { .pdiv = 3, .hw_val = 2 }, 267 + { .pdiv = 4, .hw_val = 3 }, 268 + { .pdiv = 6, .hw_val = 4 }, 269 + { .pdiv = 8, .hw_val = 5 }, 270 + { .pdiv = 12, .hw_val = 6 }, 271 + { .pdiv = 16, .hw_val = 7 }, 272 + { .pdiv = 0, .hw_val = 0 }, 273 + }; 274 + 275 + static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = { 276 + {12000000, 600000000, 100, 1, 2}, 277 + {13000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */ 278 + {16800000, 600000000, 71, 1, 2}, /* actual: 596.4 MHz */ 279 + {19200000, 600000000, 62, 1, 2}, /* actual: 595.2 MHz */ 280 + {26000000, 600000000, 92, 2, 2}, /* actual: 598.0 MHz */ 281 + {0, 0, 0, 0, 0, 0}, 282 + }; 283 + 284 + static struct tegra_clk_pll_params pll_c2_params = { 285 + .input_min = 12000000, 286 + .input_max = 48000000, 287 + .cf_min = 12000000, 288 + .cf_max = 19200000, 289 + .vco_min = 600000000, 290 + .vco_max = 1200000000, 291 + .base_reg = PLLC2_BASE, 292 + .misc_reg = PLLC2_MISC, 293 + .lock_mask = PLL_BASE_LOCK, 294 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 295 + .lock_delay = 300, 296 + .pdiv_tohw = pllc_p, 297 + .div_nmp = &pllcx_nmp, 298 + .max_p = 7, 299 + .ext_misc_reg[0] = 0x4f0, 300 + .ext_misc_reg[1] = 0x4f4, 301 + .ext_misc_reg[2] = 0x4f8, 302 + .freq_table = pll_cx_freq_table, 303 + .flags = TEGRA_PLL_USE_LOCK, 304 + }; 305 + 306 + static struct tegra_clk_pll_params pll_c3_params = { 307 + .input_min = 12000000, 308 + .input_max = 48000000, 309 + .cf_min = 12000000, 310 + .cf_max = 19200000, 311 + .vco_min = 600000000, 312 + .vco_max = 1200000000, 313 + .base_reg = PLLC3_BASE, 314 + .misc_reg = PLLC3_MISC, 315 + .lock_mask = PLL_BASE_LOCK, 316 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 317 + .lock_delay = 300, 318 + .pdiv_tohw = pllc_p, 319 + .div_nmp = &pllcx_nmp, 320 + .max_p = 7, 321 + .ext_misc_reg[0] = 0x504, 322 + .ext_misc_reg[1] = 0x508, 323 + .ext_misc_reg[2] = 0x50c, 324 + .freq_table = pll_cx_freq_table, 325 + .flags = TEGRA_PLL_USE_LOCK, 326 + }; 327 + 328 + static struct div_nmp pllss_nmp = { 329 + .divm_shift = 0, 330 + .divm_width = 8, 331 + .divn_shift = 8, 332 + .divn_width = 8, 333 + .divp_shift = 20, 334 + .divp_width = 4, 335 + }; 336 + 337 + static struct pdiv_map pll12g_ssd_esd_p[] = { 338 + { .pdiv = 1, .hw_val = 0 }, 339 + { .pdiv = 2, .hw_val = 1 }, 340 + { .pdiv = 3, .hw_val = 2 }, 341 + { .pdiv = 4, .hw_val = 3 }, 342 + { .pdiv = 5, .hw_val = 4 }, 343 + { .pdiv = 6, .hw_val = 5 }, 344 + { .pdiv = 8, .hw_val = 6 }, 345 + { .pdiv = 10, .hw_val = 7 }, 346 + { .pdiv = 12, .hw_val = 8 }, 347 + { .pdiv = 16, .hw_val = 9 }, 348 + { .pdiv = 12, .hw_val = 10 }, 349 + { .pdiv = 16, .hw_val = 11 }, 350 + { .pdiv = 20, .hw_val = 12 }, 351 + { .pdiv = 24, .hw_val = 13 }, 352 + { .pdiv = 32, .hw_val = 14 }, 353 + { .pdiv = 0, .hw_val = 0 }, 354 + }; 355 + 356 + static struct tegra_clk_pll_freq_table pll_c4_freq_table[] = { 357 + { 12000000, 600000000, 100, 1, 1}, 358 + { 13000000, 600000000, 92, 1, 1}, /* actual: 598.0 MHz */ 359 + { 16800000, 600000000, 71, 1, 1}, /* actual: 596.4 MHz */ 360 + { 19200000, 600000000, 62, 1, 1}, /* actual: 595.2 MHz */ 361 + { 26000000, 600000000, 92, 2, 1}, /* actual: 598.0 MHz */ 362 + { 0, 0, 0, 0, 0, 0 }, 363 + }; 364 + 365 + static struct tegra_clk_pll_params pll_c4_params = { 366 + .input_min = 12000000, 367 + .input_max = 1000000000, 368 + .cf_min = 12000000, 369 + .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */ 370 + .vco_min = 600000000, 371 + .vco_max = 1200000000, 372 + .base_reg = PLLC4_BASE, 373 + .misc_reg = PLLC4_MISC, 374 + .lock_mask = PLL_BASE_LOCK, 375 + .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE, 376 + .lock_delay = 300, 377 + .iddq_reg = PLLC4_BASE, 378 + .iddq_bit_idx = PLLSS_IDDQ_BIT, 379 + .pdiv_tohw = pll12g_ssd_esd_p, 380 + .div_nmp = &pllss_nmp, 381 + .ext_misc_reg[0] = 0x5ac, 382 + .ext_misc_reg[1] = 0x5b0, 383 + .ext_misc_reg[2] = 0x5b4, 384 + .freq_table = pll_c4_freq_table, 385 + }; 386 + 387 + static struct pdiv_map pllm_p[] = { 388 + { .pdiv = 1, .hw_val = 0 }, 389 + { .pdiv = 2, .hw_val = 1 }, 390 + { .pdiv = 0, .hw_val = 0 }, 391 + }; 392 + 393 + static struct tegra_clk_pll_freq_table pll_m_freq_table[] = { 394 + {12000000, 800000000, 66, 1, 1}, /* actual: 792.0 MHz */ 395 + {13000000, 800000000, 61, 1, 1}, /* actual: 793.0 MHz */ 396 + {16800000, 800000000, 47, 1, 1}, /* actual: 789.6 MHz */ 397 + {19200000, 800000000, 41, 1, 1}, /* actual: 787.2 MHz */ 398 + {26000000, 800000000, 61, 2, 1}, /* actual: 793.0 MHz */ 399 + {0, 0, 0, 0, 0, 0}, 400 + }; 401 + 402 + static struct div_nmp pllm_nmp = { 403 + .divm_shift = 0, 404 + .divm_width = 8, 405 + .override_divm_shift = 0, 406 + .divn_shift = 8, 407 + .divn_width = 8, 408 + .override_divn_shift = 8, 409 + .divp_shift = 20, 410 + .divp_width = 1, 411 + .override_divp_shift = 27, 412 + }; 413 + 414 + static struct tegra_clk_pll_params pll_m_params = { 415 + .input_min = 12000000, 416 + .input_max = 500000000, 417 + .cf_min = 12000000, 418 + .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ 419 + .vco_min = 400000000, 420 + .vco_max = 1066000000, 421 + .base_reg = PLLM_BASE, 422 + .misc_reg = PLLM_MISC, 423 + .lock_mask = PLL_BASE_LOCK, 424 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 425 + .lock_delay = 300, 426 + .max_p = 2, 427 + .pdiv_tohw = pllm_p, 428 + .div_nmp = &pllm_nmp, 429 + .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, 430 + .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2, 431 + .freq_table = pll_m_freq_table, 432 + .flags = TEGRA_PLL_USE_LOCK, 433 + }; 434 + 435 + static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { 436 + /* PLLE special case: use cpcon field to store cml divider value */ 437 + {336000000, 100000000, 100, 21, 16, 11}, 438 + {312000000, 100000000, 200, 26, 24, 13}, 439 + {13000000, 100000000, 200, 1, 26, 13}, 440 + {12000000, 100000000, 200, 1, 24, 13}, 441 + {0, 0, 0, 0, 0, 0}, 442 + }; 443 + 444 + static struct div_nmp plle_nmp = { 445 + .divm_shift = 0, 446 + .divm_width = 8, 447 + .divn_shift = 8, 448 + .divn_width = 8, 449 + .divp_shift = 24, 450 + .divp_width = 4, 451 + }; 452 + 453 + static struct tegra_clk_pll_params pll_e_params = { 454 + .input_min = 12000000, 455 + .input_max = 1000000000, 456 + .cf_min = 12000000, 457 + .cf_max = 75000000, 458 + .vco_min = 1600000000, 459 + .vco_max = 2400000000U, 460 + .base_reg = PLLE_BASE, 461 + .misc_reg = PLLE_MISC, 462 + .aux_reg = PLLE_AUX, 463 + .lock_mask = PLLE_MISC_LOCK, 464 + .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, 465 + .lock_delay = 300, 466 + .div_nmp = &plle_nmp, 467 + .freq_table = pll_e_freq_table, 468 + .flags = TEGRA_PLL_FIXED, 469 + .fixed_rate = 100000000, 470 + }; 471 + 472 + static const struct clk_div_table pll_re_div_table[] = { 473 + { .val = 0, .div = 1 }, 474 + { .val = 1, .div = 2 }, 475 + { .val = 2, .div = 3 }, 476 + { .val = 3, .div = 4 }, 477 + { .val = 4, .div = 5 }, 478 + { .val = 5, .div = 6 }, 479 + { .val = 0, .div = 0 }, 480 + }; 481 + 482 + static struct div_nmp pllre_nmp = { 483 + .divm_shift = 0, 484 + .divm_width = 8, 485 + .divn_shift = 8, 486 + .divn_width = 8, 487 + .divp_shift = 16, 488 + .divp_width = 4, 489 + }; 490 + 491 + static struct tegra_clk_pll_params pll_re_vco_params = { 492 + .input_min = 12000000, 493 + .input_max = 1000000000, 494 + .cf_min = 12000000, 495 + .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */ 496 + .vco_min = 300000000, 497 + .vco_max = 600000000, 498 + .base_reg = PLLRE_BASE, 499 + .misc_reg = PLLRE_MISC, 500 + .lock_mask = PLLRE_MISC_LOCK, 501 + .lock_enable_bit_idx = PLLRE_MISC_LOCK_ENABLE, 502 + .lock_delay = 300, 503 + .iddq_reg = PLLRE_MISC, 504 + .iddq_bit_idx = PLLRE_IDDQ_BIT, 505 + .div_nmp = &pllre_nmp, 506 + .flags = TEGRA_PLL_USE_LOCK, 507 + }; 508 + 509 + static struct div_nmp pllp_nmp = { 510 + .divm_shift = 0, 511 + .divm_width = 5, 512 + .divn_shift = 8, 513 + .divn_width = 10, 514 + .divp_shift = 20, 515 + .divp_width = 3, 516 + }; 517 + 518 + static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { 519 + {12000000, 216000000, 432, 12, 1, 8}, 520 + {13000000, 216000000, 432, 13, 1, 8}, 521 + {16800000, 216000000, 360, 14, 1, 8}, 522 + {19200000, 216000000, 360, 16, 1, 8}, 523 + {26000000, 216000000, 432, 26, 1, 8}, 524 + {0, 0, 0, 0, 0, 0}, 525 + }; 526 + 527 + static struct tegra_clk_pll_params pll_p_params = { 528 + .input_min = 2000000, 529 + .input_max = 31000000, 530 + .cf_min = 1000000, 531 + .cf_max = 6000000, 532 + .vco_min = 200000000, 533 + .vco_max = 700000000, 534 + .base_reg = PLLP_BASE, 535 + .misc_reg = PLLP_MISC, 536 + .lock_mask = PLL_BASE_LOCK, 537 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 538 + .lock_delay = 300, 539 + .div_nmp = &pllp_nmp, 540 + .freq_table = pll_p_freq_table, 541 + .fixed_rate = 408000000, 542 + .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, 543 + }; 544 + 545 + static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { 546 + {9600000, 282240000, 147, 5, 0, 4}, 547 + {9600000, 368640000, 192, 5, 0, 4}, 548 + {9600000, 240000000, 200, 8, 0, 8}, 549 + 550 + {28800000, 282240000, 245, 25, 0, 8}, 551 + {28800000, 368640000, 320, 25, 0, 8}, 552 + {28800000, 240000000, 200, 24, 0, 8}, 553 + {0, 0, 0, 0, 0, 0}, 554 + }; 555 + 556 + static struct tegra_clk_pll_params pll_a_params = { 557 + .input_min = 2000000, 558 + .input_max = 31000000, 559 + .cf_min = 1000000, 560 + .cf_max = 6000000, 561 + .vco_min = 200000000, 562 + .vco_max = 700000000, 563 + .base_reg = PLLA_BASE, 564 + .misc_reg = PLLA_MISC, 565 + .lock_mask = PLL_BASE_LOCK, 566 + .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 567 + .lock_delay = 300, 568 + .div_nmp = &pllp_nmp, 569 + .freq_table = pll_a_freq_table, 570 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 571 + }; 572 + 573 + static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { 574 + {12000000, 216000000, 864, 12, 4, 12}, 575 + {13000000, 216000000, 864, 13, 4, 12}, 576 + {16800000, 216000000, 720, 14, 4, 12}, 577 + {19200000, 216000000, 720, 16, 4, 12}, 578 + {26000000, 216000000, 864, 26, 4, 12}, 579 + 580 + {12000000, 594000000, 594, 12, 1, 12}, 581 + {13000000, 594000000, 594, 13, 1, 12}, 582 + {16800000, 594000000, 495, 14, 1, 12}, 583 + {19200000, 594000000, 495, 16, 1, 12}, 584 + {26000000, 594000000, 594, 26, 1, 12}, 585 + 586 + {12000000, 1000000000, 1000, 12, 1, 12}, 587 + {13000000, 1000000000, 1000, 13, 1, 12}, 588 + {19200000, 1000000000, 625, 12, 1, 12}, 589 + {26000000, 1000000000, 1000, 26, 1, 12}, 590 + 591 + {0, 0, 0, 0, 0, 0}, 592 + }; 593 + 594 + static struct tegra_clk_pll_params pll_d_params = { 595 + .input_min = 2000000, 596 + .input_max = 40000000, 597 + .cf_min = 1000000, 598 + .cf_max = 6000000, 599 + .vco_min = 500000000, 600 + .vco_max = 1000000000, 601 + .base_reg = PLLD_BASE, 602 + .misc_reg = PLLD_MISC, 603 + .lock_mask = PLL_BASE_LOCK, 604 + .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 605 + .lock_delay = 1000, 606 + .div_nmp = &pllp_nmp, 607 + .freq_table = pll_d_freq_table, 608 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 609 + TEGRA_PLL_USE_LOCK, 610 + }; 611 + 612 + static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = { 613 + { 12000000, 148500000, 99, 1, 8}, 614 + { 12000000, 594000000, 99, 1, 1}, 615 + { 13000000, 594000000, 91, 1, 1}, /* actual: 591.5 MHz */ 616 + { 16800000, 594000000, 71, 1, 1}, /* actual: 596.4 MHz */ 617 + { 19200000, 594000000, 62, 1, 1}, /* actual: 595.2 MHz */ 618 + { 26000000, 594000000, 91, 2, 1}, /* actual: 591.5 MHz */ 619 + { 0, 0, 0, 0, 0, 0 }, 620 + }; 621 + 622 + static struct tegra_clk_pll_params tegra124_pll_d2_params = { 623 + .input_min = 12000000, 624 + .input_max = 1000000000, 625 + .cf_min = 12000000, 626 + .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */ 627 + .vco_min = 600000000, 628 + .vco_max = 1200000000, 629 + .base_reg = PLLD2_BASE, 630 + .misc_reg = PLLD2_MISC, 631 + .lock_mask = PLL_BASE_LOCK, 632 + .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE, 633 + .lock_delay = 300, 634 + .iddq_reg = PLLD2_BASE, 635 + .iddq_bit_idx = PLLSS_IDDQ_BIT, 636 + .pdiv_tohw = pll12g_ssd_esd_p, 637 + .div_nmp = &pllss_nmp, 638 + .ext_misc_reg[0] = 0x570, 639 + .ext_misc_reg[1] = 0x574, 640 + .ext_misc_reg[2] = 0x578, 641 + .max_p = 15, 642 + .freq_table = tegra124_pll_d2_freq_table, 643 + }; 644 + 645 + static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = { 646 + { 12000000, 600000000, 100, 1, 1}, 647 + { 13000000, 600000000, 92, 1, 1}, /* actual: 598.0 MHz */ 648 + { 16800000, 600000000, 71, 1, 1}, /* actual: 596.4 MHz */ 649 + { 19200000, 600000000, 62, 1, 1}, /* actual: 595.2 MHz */ 650 + { 26000000, 600000000, 92, 2, 1}, /* actual: 598.0 MHz */ 651 + { 0, 0, 0, 0, 0, 0 }, 652 + }; 653 + 654 + static struct tegra_clk_pll_params pll_dp_params = { 655 + .input_min = 12000000, 656 + .input_max = 1000000000, 657 + .cf_min = 12000000, 658 + .cf_max = 19200000, /* s/w policy, h/w capability 38 MHz */ 659 + .vco_min = 600000000, 660 + .vco_max = 1200000000, 661 + .base_reg = PLLDP_BASE, 662 + .misc_reg = PLLDP_MISC, 663 + .lock_mask = PLL_BASE_LOCK, 664 + .lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE, 665 + .lock_delay = 300, 666 + .iddq_reg = PLLDP_BASE, 667 + .iddq_bit_idx = PLLSS_IDDQ_BIT, 668 + .pdiv_tohw = pll12g_ssd_esd_p, 669 + .div_nmp = &pllss_nmp, 670 + .ext_misc_reg[0] = 0x598, 671 + .ext_misc_reg[1] = 0x59c, 672 + .ext_misc_reg[2] = 0x5a0, 673 + .max_p = 5, 674 + .freq_table = pll_dp_freq_table, 675 + }; 676 + 677 + static struct pdiv_map pllu_p[] = { 678 + { .pdiv = 1, .hw_val = 1 }, 679 + { .pdiv = 2, .hw_val = 0 }, 680 + { .pdiv = 0, .hw_val = 0 }, 681 + }; 682 + 683 + static struct div_nmp pllu_nmp = { 684 + .divm_shift = 0, 685 + .divm_width = 5, 686 + .divn_shift = 8, 687 + .divn_width = 10, 688 + .divp_shift = 20, 689 + .divp_width = 1, 690 + }; 691 + 692 + static struct tegra_clk_pll_freq_table pll_u_freq_table[] = { 693 + {12000000, 480000000, 960, 12, 2, 12}, 694 + {13000000, 480000000, 960, 13, 2, 12}, 695 + {16800000, 480000000, 400, 7, 2, 5}, 696 + {19200000, 480000000, 200, 4, 2, 3}, 697 + {26000000, 480000000, 960, 26, 2, 12}, 698 + {0, 0, 0, 0, 0, 0}, 699 + }; 700 + 701 + static struct tegra_clk_pll_params pll_u_params = { 702 + .input_min = 2000000, 703 + .input_max = 40000000, 704 + .cf_min = 1000000, 705 + .cf_max = 6000000, 706 + .vco_min = 480000000, 707 + .vco_max = 960000000, 708 + .base_reg = PLLU_BASE, 709 + .misc_reg = PLLU_MISC, 710 + .lock_mask = PLL_BASE_LOCK, 711 + .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 712 + .lock_delay = 1000, 713 + .pdiv_tohw = pllu_p, 714 + .div_nmp = &pllu_nmp, 715 + .freq_table = pll_u_freq_table, 716 + .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 717 + TEGRA_PLL_USE_LOCK, 718 + }; 719 + 720 + struct utmi_clk_param { 721 + /* Oscillator Frequency in KHz */ 722 + u32 osc_frequency; 723 + /* UTMIP PLL Enable Delay Count */ 724 + u8 enable_delay_count; 725 + /* UTMIP PLL Stable count */ 726 + u8 stable_count; 727 + /* UTMIP PLL Active delay count */ 728 + u8 active_delay_count; 729 + /* UTMIP PLL Xtal frequency count */ 730 + u8 xtal_freq_count; 731 + }; 732 + 733 + static const struct utmi_clk_param utmi_parameters[] = { 734 + {.osc_frequency = 13000000, .enable_delay_count = 0x02, 735 + .stable_count = 0x33, .active_delay_count = 0x05, 736 + .xtal_freq_count = 0x7F}, 737 + {.osc_frequency = 19200000, .enable_delay_count = 0x03, 738 + .stable_count = 0x4B, .active_delay_count = 0x06, 739 + .xtal_freq_count = 0xBB}, 740 + {.osc_frequency = 12000000, .enable_delay_count = 0x02, 741 + .stable_count = 0x2F, .active_delay_count = 0x04, 742 + .xtal_freq_count = 0x76}, 743 + {.osc_frequency = 26000000, .enable_delay_count = 0x04, 744 + .stable_count = 0x66, .active_delay_count = 0x09, 745 + .xtal_freq_count = 0xFE}, 746 + {.osc_frequency = 16800000, .enable_delay_count = 0x03, 747 + .stable_count = 0x41, .active_delay_count = 0x0A, 748 + .xtal_freq_count = 0xA4}, 749 + }; 750 + 751 + static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { 752 + [tegra_clk_ispb] = { .dt_id = TEGRA124_CLK_ISPB, .present = true }, 753 + [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true }, 754 + [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true }, 755 + [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true }, 756 + [tegra_clk_sdmmc2] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, 757 + [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, 758 + [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, 759 + [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, 760 + [tegra_clk_sdmmc1] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, 761 + [tegra_clk_sdmmc4] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, 762 + [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, 763 + [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true }, 764 + [tegra_clk_gr2d] = { .dt_id = TEGRA124_CLK_GR_2D, .present = true }, 765 + [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true }, 766 + [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true }, 767 + [tegra_clk_gr3d] = { .dt_id = TEGRA124_CLK_GR_3D, .present = true }, 768 + [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true }, 769 + [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true }, 770 + [tegra_clk_host1x] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true }, 771 + [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true }, 772 + [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true }, 773 + [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true }, 774 + [tegra_clk_kbc] = { .dt_id = TEGRA124_CLK_KBC, .present = true }, 775 + [tegra_clk_kfuse] = { .dt_id = TEGRA124_CLK_KFUSE, .present = true }, 776 + [tegra_clk_sbc1] = { .dt_id = TEGRA124_CLK_SBC1, .present = true }, 777 + [tegra_clk_nor] = { .dt_id = TEGRA124_CLK_NOR, .present = true }, 778 + [tegra_clk_sbc2] = { .dt_id = TEGRA124_CLK_SBC2, .present = true }, 779 + [tegra_clk_sbc3] = { .dt_id = TEGRA124_CLK_SBC3, .present = true }, 780 + [tegra_clk_i2c5] = { .dt_id = TEGRA124_CLK_I2C5, .present = true }, 781 + [tegra_clk_dsia] = { .dt_id = TEGRA124_CLK_DSIA, .present = true }, 782 + [tegra_clk_mipi] = { .dt_id = TEGRA124_CLK_MIPI, .present = true }, 783 + [tegra_clk_hdmi] = { .dt_id = TEGRA124_CLK_HDMI, .present = true }, 784 + [tegra_clk_csi] = { .dt_id = TEGRA124_CLK_CSI, .present = true }, 785 + [tegra_clk_i2c2] = { .dt_id = TEGRA124_CLK_I2C2, .present = true }, 786 + [tegra_clk_uartc] = { .dt_id = TEGRA124_CLK_UARTC, .present = true }, 787 + [tegra_clk_mipi_cal] = { .dt_id = TEGRA124_CLK_MIPI_CAL, .present = true }, 788 + [tegra_clk_emc] = { .dt_id = TEGRA124_CLK_EMC, .present = true }, 789 + [tegra_clk_usb2] = { .dt_id = TEGRA124_CLK_USB2, .present = true }, 790 + [tegra_clk_usb3] = { .dt_id = TEGRA124_CLK_USB3, .present = true }, 791 + [tegra_clk_vde_8] = { .dt_id = TEGRA124_CLK_VDE, .present = true }, 792 + [tegra_clk_bsea] = { .dt_id = TEGRA124_CLK_BSEA, .present = true }, 793 + [tegra_clk_bsev] = { .dt_id = TEGRA124_CLK_BSEV, .present = true }, 794 + [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true }, 795 + [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true }, 796 + [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true }, 797 + [tegra_clk_sdmmc3] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true }, 798 + [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true }, 799 + [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true }, 800 + [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true }, 801 + [tegra_clk_csite] = { .dt_id = TEGRA124_CLK_CSITE, .present = true }, 802 + [tegra_clk_la] = { .dt_id = TEGRA124_CLK_LA, .present = true }, 803 + [tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true }, 804 + [tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true }, 805 + [tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true }, 806 + [tegra_clk_ndspeed] = { .dt_id = TEGRA124_CLK_NDSPEED, .present = true }, 807 + [tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true }, 808 + [tegra_clk_dsib] = { .dt_id = TEGRA124_CLK_DSIB, .present = true }, 809 + [tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true }, 810 + [tegra_clk_xusb_host] = { .dt_id = TEGRA124_CLK_XUSB_HOST, .present = true }, 811 + [tegra_clk_msenc] = { .dt_id = TEGRA124_CLK_MSENC, .present = true }, 812 + [tegra_clk_csus] = { .dt_id = TEGRA124_CLK_CSUS, .present = true }, 813 + [tegra_clk_mselect] = { .dt_id = TEGRA124_CLK_MSELECT, .present = true }, 814 + [tegra_clk_tsensor] = { .dt_id = TEGRA124_CLK_TSENSOR, .present = true }, 815 + [tegra_clk_i2s3] = { .dt_id = TEGRA124_CLK_I2S3, .present = true }, 816 + [tegra_clk_i2s4] = { .dt_id = TEGRA124_CLK_I2S4, .present = true }, 817 + [tegra_clk_i2c4] = { .dt_id = TEGRA124_CLK_I2C4, .present = true }, 818 + [tegra_clk_sbc5] = { .dt_id = TEGRA124_CLK_SBC5, .present = true }, 819 + [tegra_clk_sbc6] = { .dt_id = TEGRA124_CLK_SBC6, .present = true }, 820 + [tegra_clk_d_audio] = { .dt_id = TEGRA124_CLK_D_AUDIO, .present = true }, 821 + [tegra_clk_apbif] = { .dt_id = TEGRA124_CLK_APBIF, .present = true }, 822 + [tegra_clk_dam0] = { .dt_id = TEGRA124_CLK_DAM0, .present = true }, 823 + [tegra_clk_dam1] = { .dt_id = TEGRA124_CLK_DAM1, .present = true }, 824 + [tegra_clk_dam2] = { .dt_id = TEGRA124_CLK_DAM2, .present = true }, 825 + [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA124_CLK_HDA2CODEC_2X, .present = true }, 826 + [tegra_clk_audio0_2x] = { .dt_id = TEGRA124_CLK_AUDIO0_2X, .present = true }, 827 + [tegra_clk_audio1_2x] = { .dt_id = TEGRA124_CLK_AUDIO1_2X, .present = true }, 828 + [tegra_clk_audio2_2x] = { .dt_id = TEGRA124_CLK_AUDIO2_2X, .present = true }, 829 + [tegra_clk_audio3_2x] = { .dt_id = TEGRA124_CLK_AUDIO3_2X, .present = true }, 830 + [tegra_clk_audio4_2x] = { .dt_id = TEGRA124_CLK_AUDIO4_2X, .present = true }, 831 + [tegra_clk_spdif_2x] = { .dt_id = TEGRA124_CLK_SPDIF_2X, .present = true }, 832 + [tegra_clk_actmon] = { .dt_id = TEGRA124_CLK_ACTMON, .present = true }, 833 + [tegra_clk_extern1] = { .dt_id = TEGRA124_CLK_EXTERN1, .present = true }, 834 + [tegra_clk_extern2] = { .dt_id = TEGRA124_CLK_EXTERN2, .present = true }, 835 + [tegra_clk_extern3] = { .dt_id = TEGRA124_CLK_EXTERN3, .present = true }, 836 + [tegra_clk_sata_oob] = { .dt_id = TEGRA124_CLK_SATA_OOB, .present = true }, 837 + [tegra_clk_sata] = { .dt_id = TEGRA124_CLK_SATA, .present = true }, 838 + [tegra_clk_hda] = { .dt_id = TEGRA124_CLK_HDA, .present = true }, 839 + [tegra_clk_se] = { .dt_id = TEGRA124_CLK_SE, .present = true }, 840 + [tegra_clk_hda2hdmi] = { .dt_id = TEGRA124_CLK_HDA2HDMI, .present = true }, 841 + [tegra_clk_sata_cold] = { .dt_id = TEGRA124_CLK_SATA_COLD, .present = true }, 842 + [tegra_clk_cilab] = { .dt_id = TEGRA124_CLK_CILAB, .present = true }, 843 + [tegra_clk_cilcd] = { .dt_id = TEGRA124_CLK_CILCD, .present = true }, 844 + [tegra_clk_cile] = { .dt_id = TEGRA124_CLK_CILE, .present = true }, 845 + [tegra_clk_dsialp] = { .dt_id = TEGRA124_CLK_DSIALP, .present = true }, 846 + [tegra_clk_dsiblp] = { .dt_id = TEGRA124_CLK_DSIBLP, .present = true }, 847 + [tegra_clk_entropy] = { .dt_id = TEGRA124_CLK_ENTROPY, .present = true }, 848 + [tegra_clk_dds] = { .dt_id = TEGRA124_CLK_DDS, .present = true }, 849 + [tegra_clk_dp2] = { .dt_id = TEGRA124_CLK_DP2, .present = true }, 850 + [tegra_clk_amx] = { .dt_id = TEGRA124_CLK_AMX, .present = true }, 851 + [tegra_clk_adx] = { .dt_id = TEGRA124_CLK_ADX, .present = true }, 852 + [tegra_clk_xusb_ss] = { .dt_id = TEGRA124_CLK_XUSB_SS, .present = true }, 853 + [tegra_clk_i2c6] = { .dt_id = TEGRA124_CLK_I2C6, .present = true }, 854 + [tegra_clk_vim2_clk] = { .dt_id = TEGRA124_CLK_VIM2_CLK, .present = true }, 855 + [tegra_clk_hdmi_audio] = { .dt_id = TEGRA124_CLK_HDMI_AUDIO, .present = true }, 856 + [tegra_clk_clk72Mhz] = { .dt_id = TEGRA124_CLK_CLK72MHZ, .present = true }, 857 + [tegra_clk_vic03] = { .dt_id = TEGRA124_CLK_VIC03, .present = true }, 858 + [tegra_clk_adx1] = { .dt_id = TEGRA124_CLK_ADX1, .present = true }, 859 + [tegra_clk_dpaux] = { .dt_id = TEGRA124_CLK_DPAUX, .present = true }, 860 + [tegra_clk_sor0] = { .dt_id = TEGRA124_CLK_SOR0, .present = true }, 861 + [tegra_clk_sor0_lvds] = { .dt_id = TEGRA124_CLK_SOR0_LVDS, .present = true }, 862 + [tegra_clk_gpu] = { .dt_id = TEGRA124_CLK_GPU, .present = true }, 863 + [tegra_clk_amx1] = { .dt_id = TEGRA124_CLK_AMX1, .present = true }, 864 + [tegra_clk_uartb] = { .dt_id = TEGRA124_CLK_UARTB, .present = true }, 865 + [tegra_clk_vfir] = { .dt_id = TEGRA124_CLK_VFIR, .present = true }, 866 + [tegra_clk_spdif_in] = { .dt_id = TEGRA124_CLK_SPDIF_IN, .present = true }, 867 + [tegra_clk_spdif_out] = { .dt_id = TEGRA124_CLK_SPDIF_OUT, .present = true }, 868 + [tegra_clk_vi_9] = { .dt_id = TEGRA124_CLK_VI, .present = true }, 869 + [tegra_clk_vi_sensor] = { .dt_id = TEGRA124_CLK_VI_SENSOR, .present = true }, 870 + [tegra_clk_fuse] = { .dt_id = TEGRA124_CLK_FUSE, .present = true }, 871 + [tegra_clk_fuse_burn] = { .dt_id = TEGRA124_CLK_FUSE_BURN, .present = true }, 872 + [tegra_clk_clk_32k] = { .dt_id = TEGRA124_CLK_CLK_32K, .present = true }, 873 + [tegra_clk_clk_m] = { .dt_id = TEGRA124_CLK_CLK_M, .present = true }, 874 + [tegra_clk_clk_m_div2] = { .dt_id = TEGRA124_CLK_CLK_M_DIV2, .present = true }, 875 + [tegra_clk_clk_m_div4] = { .dt_id = TEGRA124_CLK_CLK_M_DIV4, .present = true }, 876 + [tegra_clk_pll_ref] = { .dt_id = TEGRA124_CLK_PLL_REF, .present = true }, 877 + [tegra_clk_pll_c] = { .dt_id = TEGRA124_CLK_PLL_C, .present = true }, 878 + [tegra_clk_pll_c_out1] = { .dt_id = TEGRA124_CLK_PLL_C_OUT1, .present = true }, 879 + [tegra_clk_pll_c2] = { .dt_id = TEGRA124_CLK_PLL_C2, .present = true }, 880 + [tegra_clk_pll_c3] = { .dt_id = TEGRA124_CLK_PLL_C3, .present = true }, 881 + [tegra_clk_pll_m] = { .dt_id = TEGRA124_CLK_PLL_M, .present = true }, 882 + [tegra_clk_pll_m_out1] = { .dt_id = TEGRA124_CLK_PLL_M_OUT1, .present = true }, 883 + [tegra_clk_pll_p] = { .dt_id = TEGRA124_CLK_PLL_P, .present = true }, 884 + [tegra_clk_pll_p_out1] = { .dt_id = TEGRA124_CLK_PLL_P_OUT1, .present = true }, 885 + [tegra_clk_pll_p_out2] = { .dt_id = TEGRA124_CLK_PLL_P_OUT2, .present = true }, 886 + [tegra_clk_pll_p_out3] = { .dt_id = TEGRA124_CLK_PLL_P_OUT3, .present = true }, 887 + [tegra_clk_pll_p_out4] = { .dt_id = TEGRA124_CLK_PLL_P_OUT4, .present = true }, 888 + [tegra_clk_pll_a] = { .dt_id = TEGRA124_CLK_PLL_A, .present = true }, 889 + [tegra_clk_pll_a_out0] = { .dt_id = TEGRA124_CLK_PLL_A_OUT0, .present = true }, 890 + [tegra_clk_pll_d] = { .dt_id = TEGRA124_CLK_PLL_D, .present = true }, 891 + [tegra_clk_pll_d_out0] = { .dt_id = TEGRA124_CLK_PLL_D_OUT0, .present = true }, 892 + [tegra_clk_pll_d2] = { .dt_id = TEGRA124_CLK_PLL_D2, .present = true }, 893 + [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA124_CLK_PLL_D2_OUT0, .present = true }, 894 + [tegra_clk_pll_u] = { .dt_id = TEGRA124_CLK_PLL_U, .present = true }, 895 + [tegra_clk_pll_u_480m] = { .dt_id = TEGRA124_CLK_PLL_U_480M, .present = true }, 896 + [tegra_clk_pll_u_60m] = { .dt_id = TEGRA124_CLK_PLL_U_60M, .present = true }, 897 + [tegra_clk_pll_u_48m] = { .dt_id = TEGRA124_CLK_PLL_U_48M, .present = true }, 898 + [tegra_clk_pll_u_12m] = { .dt_id = TEGRA124_CLK_PLL_U_12M, .present = true }, 899 + [tegra_clk_pll_x] = { .dt_id = TEGRA124_CLK_PLL_X, .present = true }, 900 + [tegra_clk_pll_x_out0] = { .dt_id = TEGRA124_CLK_PLL_X_OUT0, .present = true }, 901 + [tegra_clk_pll_re_vco] = { .dt_id = TEGRA124_CLK_PLL_RE_VCO, .present = true }, 902 + [tegra_clk_pll_re_out] = { .dt_id = TEGRA124_CLK_PLL_RE_OUT, .present = true }, 903 + [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC, .present = true }, 904 + [tegra_clk_i2s0_sync] = { .dt_id = TEGRA124_CLK_I2S0_SYNC, .present = true }, 905 + [tegra_clk_i2s1_sync] = { .dt_id = TEGRA124_CLK_I2S1_SYNC, .present = true }, 906 + [tegra_clk_i2s2_sync] = { .dt_id = TEGRA124_CLK_I2S2_SYNC, .present = true }, 907 + [tegra_clk_i2s3_sync] = { .dt_id = TEGRA124_CLK_I2S3_SYNC, .present = true }, 908 + [tegra_clk_i2s4_sync] = { .dt_id = TEGRA124_CLK_I2S4_SYNC, .present = true }, 909 + [tegra_clk_vimclk_sync] = { .dt_id = TEGRA124_CLK_VIMCLK_SYNC, .present = true }, 910 + [tegra_clk_audio0] = { .dt_id = TEGRA124_CLK_AUDIO0, .present = true }, 911 + [tegra_clk_audio1] = { .dt_id = TEGRA124_CLK_AUDIO1, .present = true }, 912 + [tegra_clk_audio2] = { .dt_id = TEGRA124_CLK_AUDIO2, .present = true }, 913 + [tegra_clk_audio3] = { .dt_id = TEGRA124_CLK_AUDIO3, .present = true }, 914 + [tegra_clk_audio4] = { .dt_id = TEGRA124_CLK_AUDIO4, .present = true }, 915 + [tegra_clk_spdif] = { .dt_id = TEGRA124_CLK_SPDIF, .present = true }, 916 + [tegra_clk_clk_out_1] = { .dt_id = TEGRA124_CLK_CLK_OUT_1, .present = true }, 917 + [tegra_clk_clk_out_2] = { .dt_id = TEGRA124_CLK_CLK_OUT_2, .present = true }, 918 + [tegra_clk_clk_out_3] = { .dt_id = TEGRA124_CLK_CLK_OUT_3, .present = true }, 919 + [tegra_clk_blink] = { .dt_id = TEGRA124_CLK_BLINK, .present = true }, 920 + [tegra_clk_xusb_host_src] = { .dt_id = TEGRA124_CLK_XUSB_HOST_SRC, .present = true }, 921 + [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true }, 922 + [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true }, 923 + [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA124_CLK_XUSB_SS_SRC, .present = true }, 924 + [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA124_CLK_XUSB_DEV_SRC, .present = true }, 925 + [tegra_clk_xusb_dev] = { .dt_id = TEGRA124_CLK_XUSB_DEV, .present = true }, 926 + [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA124_CLK_XUSB_HS_SRC, .present = true }, 927 + [tegra_clk_sclk] = { .dt_id = TEGRA124_CLK_SCLK, .present = true }, 928 + [tegra_clk_hclk] = { .dt_id = TEGRA124_CLK_HCLK, .present = true }, 929 + [tegra_clk_pclk] = { .dt_id = TEGRA124_CLK_PCLK, .present = true }, 930 + [tegra_clk_cclk_g] = { .dt_id = TEGRA124_CLK_CCLK_G, .present = true }, 931 + [tegra_clk_cclk_lp] = { .dt_id = TEGRA124_CLK_CCLK_LP, .present = true }, 932 + [tegra_clk_dfll_ref] = { .dt_id = TEGRA124_CLK_DFLL_REF, .present = true }, 933 + [tegra_clk_dfll_soc] = { .dt_id = TEGRA124_CLK_DFLL_SOC, .present = true }, 934 + [tegra_clk_vi_sensor2] = { .dt_id = TEGRA124_CLK_VI_SENSOR2, .present = true }, 935 + [tegra_clk_pll_p_out5] = { .dt_id = TEGRA124_CLK_PLL_P_OUT5, .present = true }, 936 + [tegra_clk_pll_c4] = { .dt_id = TEGRA124_CLK_PLL_C4, .present = true }, 937 + [tegra_clk_pll_dp] = { .dt_id = TEGRA124_CLK_PLL_DP, .present = true }, 938 + [tegra_clk_audio0_mux] = { .dt_id = TEGRA124_CLK_AUDIO0_MUX, .present = true }, 939 + [tegra_clk_audio1_mux] = { .dt_id = TEGRA124_CLK_AUDIO1_MUX, .present = true }, 940 + [tegra_clk_audio2_mux] = { .dt_id = TEGRA124_CLK_AUDIO2_MUX, .present = true }, 941 + [tegra_clk_audio3_mux] = { .dt_id = TEGRA124_CLK_AUDIO3_MUX, .present = true }, 942 + [tegra_clk_audio4_mux] = { .dt_id = TEGRA124_CLK_AUDIO4_MUX, .present = true }, 943 + [tegra_clk_spdif_mux] = { .dt_id = TEGRA124_CLK_SPDIF_MUX, .present = true }, 944 + [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_1_MUX, .present = true }, 945 + [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_2_MUX, .present = true }, 946 + [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true }, 947 + [tegra_clk_dsia_mux] = { .dt_id = TEGRA124_CLK_DSIA_MUX, .present = true }, 948 + [tegra_clk_dsib_mux] = { .dt_id = TEGRA124_CLK_DSIB_MUX, .present = true }, 949 + [tegra_clk_uarte] = { .dt_id = TEGRA124_CLK_UARTE, .present = true }, 950 + }; 951 + 952 + static struct tegra_devclk devclks[] __initdata = { 953 + { .con_id = "clk_m", .dt_id = TEGRA124_CLK_CLK_M }, 954 + { .con_id = "pll_ref", .dt_id = TEGRA124_CLK_PLL_REF }, 955 + { .con_id = "clk_32k", .dt_id = TEGRA124_CLK_CLK_32K }, 956 + { .con_id = "clk_m_div2", .dt_id = TEGRA124_CLK_CLK_M_DIV2 }, 957 + { .con_id = "clk_m_div4", .dt_id = TEGRA124_CLK_CLK_M_DIV4 }, 958 + { .con_id = "pll_c", .dt_id = TEGRA124_CLK_PLL_C }, 959 + { .con_id = "pll_c_out1", .dt_id = TEGRA124_CLK_PLL_C_OUT1 }, 960 + { .con_id = "pll_c2", .dt_id = TEGRA124_CLK_PLL_C2 }, 961 + { .con_id = "pll_c3", .dt_id = TEGRA124_CLK_PLL_C3 }, 962 + { .con_id = "pll_p", .dt_id = TEGRA124_CLK_PLL_P }, 963 + { .con_id = "pll_p_out1", .dt_id = TEGRA124_CLK_PLL_P_OUT1 }, 964 + { .con_id = "pll_p_out2", .dt_id = TEGRA124_CLK_PLL_P_OUT2 }, 965 + { .con_id = "pll_p_out3", .dt_id = TEGRA124_CLK_PLL_P_OUT3 }, 966 + { .con_id = "pll_p_out4", .dt_id = TEGRA124_CLK_PLL_P_OUT4 }, 967 + { .con_id = "pll_m", .dt_id = TEGRA124_CLK_PLL_M }, 968 + { .con_id = "pll_m_out1", .dt_id = TEGRA124_CLK_PLL_M_OUT1 }, 969 + { .con_id = "pll_x", .dt_id = TEGRA124_CLK_PLL_X }, 970 + { .con_id = "pll_x_out0", .dt_id = TEGRA124_CLK_PLL_X_OUT0 }, 971 + { .con_id = "pll_u", .dt_id = TEGRA124_CLK_PLL_U }, 972 + { .con_id = "pll_u_480M", .dt_id = TEGRA124_CLK_PLL_U_480M }, 973 + { .con_id = "pll_u_60M", .dt_id = TEGRA124_CLK_PLL_U_60M }, 974 + { .con_id = "pll_u_48M", .dt_id = TEGRA124_CLK_PLL_U_48M }, 975 + { .con_id = "pll_u_12M", .dt_id = TEGRA124_CLK_PLL_U_12M }, 976 + { .con_id = "pll_d", .dt_id = TEGRA124_CLK_PLL_D }, 977 + { .con_id = "pll_d_out0", .dt_id = TEGRA124_CLK_PLL_D_OUT0 }, 978 + { .con_id = "pll_d2", .dt_id = TEGRA124_CLK_PLL_D2 }, 979 + { .con_id = "pll_d2_out0", .dt_id = TEGRA124_CLK_PLL_D2_OUT0 }, 980 + { .con_id = "pll_a", .dt_id = TEGRA124_CLK_PLL_A }, 981 + { .con_id = "pll_a_out0", .dt_id = TEGRA124_CLK_PLL_A_OUT0 }, 982 + { .con_id = "pll_re_vco", .dt_id = TEGRA124_CLK_PLL_RE_VCO }, 983 + { .con_id = "pll_re_out", .dt_id = TEGRA124_CLK_PLL_RE_OUT }, 984 + { .con_id = "spdif_in_sync", .dt_id = TEGRA124_CLK_SPDIF_IN_SYNC }, 985 + { .con_id = "i2s0_sync", .dt_id = TEGRA124_CLK_I2S0_SYNC }, 986 + { .con_id = "i2s1_sync", .dt_id = TEGRA124_CLK_I2S1_SYNC }, 987 + { .con_id = "i2s2_sync", .dt_id = TEGRA124_CLK_I2S2_SYNC }, 988 + { .con_id = "i2s3_sync", .dt_id = TEGRA124_CLK_I2S3_SYNC }, 989 + { .con_id = "i2s4_sync", .dt_id = TEGRA124_CLK_I2S4_SYNC }, 990 + { .con_id = "vimclk_sync", .dt_id = TEGRA124_CLK_VIMCLK_SYNC }, 991 + { .con_id = "audio0", .dt_id = TEGRA124_CLK_AUDIO0 }, 992 + { .con_id = "audio1", .dt_id = TEGRA124_CLK_AUDIO1 }, 993 + { .con_id = "audio2", .dt_id = TEGRA124_CLK_AUDIO2 }, 994 + { .con_id = "audio3", .dt_id = TEGRA124_CLK_AUDIO3 }, 995 + { .con_id = "audio4", .dt_id = TEGRA124_CLK_AUDIO4 }, 996 + { .con_id = "spdif", .dt_id = TEGRA124_CLK_SPDIF }, 997 + { .con_id = "audio0_2x", .dt_id = TEGRA124_CLK_AUDIO0_2X }, 998 + { .con_id = "audio1_2x", .dt_id = TEGRA124_CLK_AUDIO1_2X }, 999 + { .con_id = "audio2_2x", .dt_id = TEGRA124_CLK_AUDIO2_2X }, 1000 + { .con_id = "audio3_2x", .dt_id = TEGRA124_CLK_AUDIO3_2X }, 1001 + { .con_id = "audio4_2x", .dt_id = TEGRA124_CLK_AUDIO4_2X }, 1002 + { .con_id = "spdif_2x", .dt_id = TEGRA124_CLK_SPDIF_2X }, 1003 + { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA124_CLK_EXTERN1 }, 1004 + { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA124_CLK_EXTERN2 }, 1005 + { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA124_CLK_EXTERN3 }, 1006 + { .con_id = "blink", .dt_id = TEGRA124_CLK_BLINK }, 1007 + { .con_id = "cclk_g", .dt_id = TEGRA124_CLK_CCLK_G }, 1008 + { .con_id = "cclk_lp", .dt_id = TEGRA124_CLK_CCLK_LP }, 1009 + { .con_id = "sclk", .dt_id = TEGRA124_CLK_SCLK }, 1010 + { .con_id = "hclk", .dt_id = TEGRA124_CLK_HCLK }, 1011 + { .con_id = "pclk", .dt_id = TEGRA124_CLK_PCLK }, 1012 + { .con_id = "fuse", .dt_id = TEGRA124_CLK_FUSE }, 1013 + { .dev_id = "rtc-tegra", .dt_id = TEGRA124_CLK_RTC }, 1014 + { .dev_id = "timer", .dt_id = TEGRA124_CLK_TIMER }, 1015 + }; 1016 + 1017 + static struct clk **clks; 1018 + 1019 + static void tegra124_utmi_param_configure(void __iomem *clk_base) 1020 + { 1021 + u32 reg; 1022 + int i; 1023 + 1024 + for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) { 1025 + if (osc_freq == utmi_parameters[i].osc_frequency) 1026 + break; 1027 + } 1028 + 1029 + if (i >= ARRAY_SIZE(utmi_parameters)) { 1030 + pr_err("%s: Unexpected oscillator freq %lu\n", __func__, 1031 + osc_freq); 1032 + return; 1033 + } 1034 + 1035 + reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2); 1036 + 1037 + /* Program UTMIP PLL stable and active counts */ 1038 + /* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */ 1039 + reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0); 1040 + reg |= UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count); 1041 + 1042 + reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0); 1043 + 1044 + reg |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i]. 1045 + active_delay_count); 1046 + 1047 + /* Remove power downs from UTMIP PLL control bits */ 1048 + reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN; 1049 + reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN; 1050 + reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN; 1051 + 1052 + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2); 1053 + 1054 + /* Program UTMIP PLL delay and oscillator frequency counts */ 1055 + reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1); 1056 + reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0); 1057 + 1058 + reg |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i]. 1059 + enable_delay_count); 1060 + 1061 + reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0); 1062 + reg |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(utmi_parameters[i]. 1063 + xtal_freq_count); 1064 + 1065 + /* Remove power downs from UTMIP PLL control bits */ 1066 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN; 1067 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN; 1068 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP; 1069 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN; 1070 + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1); 1071 + 1072 + /* Setup HW control of UTMIPLL */ 1073 + reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); 1074 + reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET; 1075 + reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL; 1076 + reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE; 1077 + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); 1078 + 1079 + reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1); 1080 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP; 1081 + reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN; 1082 + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1); 1083 + 1084 + udelay(1); 1085 + 1086 + /* Setup SW override of UTMIPLL assuming USB2.0 1087 + ports are assigned to USB2 */ 1088 + reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); 1089 + reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL; 1090 + reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE; 1091 + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); 1092 + 1093 + udelay(1); 1094 + 1095 + /* Enable HW control UTMIPLL */ 1096 + reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); 1097 + reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE; 1098 + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); 1099 + } 1100 + 1101 + static __init void tegra124_periph_clk_init(void __iomem *clk_base, 1102 + void __iomem *pmc_base) 1103 + { 1104 + struct clk *clk; 1105 + u32 val; 1106 + 1107 + /* xusb_hs_src */ 1108 + val = readl(clk_base + CLK_SOURCE_XUSB_SS_SRC); 1109 + val |= BIT(25); /* always select PLLU_60M */ 1110 + writel(val, clk_base + CLK_SOURCE_XUSB_SS_SRC); 1111 + 1112 + clk = clk_register_fixed_factor(NULL, "xusb_hs_src", "pll_u_60M", 0, 1113 + 1, 1); 1114 + clks[TEGRA124_CLK_XUSB_HS_SRC] = clk; 1115 + 1116 + /* dsia mux */ 1117 + clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, 1118 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, 1119 + clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); 1120 + clks[TEGRA124_CLK_DSIA_MUX] = clk; 1121 + 1122 + /* dsib mux */ 1123 + clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, 1124 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, 1125 + clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); 1126 + clks[TEGRA124_CLK_DSIB_MUX] = clk; 1127 + 1128 + /* emc mux */ 1129 + clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 1130 + ARRAY_SIZE(mux_pllmcp_clkm), 0, 1131 + clk_base + CLK_SOURCE_EMC, 1132 + 29, 3, 0, NULL); 1133 + 1134 + /* cml0 */ 1135 + clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, 1136 + 0, 0, &pll_e_lock); 1137 + clk_register_clkdev(clk, "cml0", NULL); 1138 + clks[TEGRA124_CLK_CML0] = clk; 1139 + 1140 + /* cml1 */ 1141 + clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX, 1142 + 1, 0, &pll_e_lock); 1143 + clk_register_clkdev(clk, "cml1", NULL); 1144 + clks[TEGRA124_CLK_CML1] = clk; 1145 + 1146 + tegra_periph_clk_init(clk_base, pmc_base, tegra124_clks, &pll_p_params); 1147 + } 1148 + 1149 + static void __init tegra124_pll_init(void __iomem *clk_base, 1150 + void __iomem *pmc) 1151 + { 1152 + u32 val; 1153 + struct clk *clk; 1154 + 1155 + /* PLLC */ 1156 + clk = tegra_clk_register_pllxc("pll_c", "pll_ref", clk_base, 1157 + pmc, 0, &pll_c_params, NULL); 1158 + clk_register_clkdev(clk, "pll_c", NULL); 1159 + clks[TEGRA124_CLK_PLL_C] = clk; 1160 + 1161 + /* PLLC_OUT1 */ 1162 + clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", 1163 + clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1164 + 8, 8, 1, NULL); 1165 + clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", 1166 + clk_base + PLLC_OUT, 1, 0, 1167 + CLK_SET_RATE_PARENT, 0, NULL); 1168 + clk_register_clkdev(clk, "pll_c_out1", NULL); 1169 + clks[TEGRA124_CLK_PLL_C_OUT1] = clk; 1170 + 1171 + /* PLLC2 */ 1172 + clk = tegra_clk_register_pllc("pll_c2", "pll_ref", clk_base, pmc, 0, 1173 + &pll_c2_params, NULL); 1174 + clk_register_clkdev(clk, "pll_c2", NULL); 1175 + clks[TEGRA124_CLK_PLL_C2] = clk; 1176 + 1177 + /* PLLC3 */ 1178 + clk = tegra_clk_register_pllc("pll_c3", "pll_ref", clk_base, pmc, 0, 1179 + &pll_c3_params, NULL); 1180 + clk_register_clkdev(clk, "pll_c3", NULL); 1181 + clks[TEGRA124_CLK_PLL_C3] = clk; 1182 + 1183 + /* PLLM */ 1184 + clk = tegra_clk_register_pllm("pll_m", "pll_ref", clk_base, pmc, 1185 + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 1186 + &pll_m_params, NULL); 1187 + clk_register_clkdev(clk, "pll_m", NULL); 1188 + clks[TEGRA124_CLK_PLL_M] = clk; 1189 + 1190 + /* PLLM_OUT1 */ 1191 + clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m", 1192 + clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1193 + 8, 8, 1, NULL); 1194 + clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div", 1195 + clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED | 1196 + CLK_SET_RATE_PARENT, 0, NULL); 1197 + clk_register_clkdev(clk, "pll_m_out1", NULL); 1198 + clks[TEGRA124_CLK_PLL_M_OUT1] = clk; 1199 + 1200 + /* PLLM_UD */ 1201 + clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m", 1202 + CLK_SET_RATE_PARENT, 1, 1); 1203 + 1204 + /* PLLU */ 1205 + val = readl(clk_base + pll_u_params.base_reg); 1206 + val &= ~BIT(24); /* disable PLLU_OVERRIDE */ 1207 + writel(val, clk_base + pll_u_params.base_reg); 1208 + 1209 + clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0, 1210 + &pll_u_params, &pll_u_lock); 1211 + clk_register_clkdev(clk, "pll_u", NULL); 1212 + clks[TEGRA124_CLK_PLL_U] = clk; 1213 + 1214 + tegra124_utmi_param_configure(clk_base); 1215 + 1216 + /* PLLU_480M */ 1217 + clk = clk_register_gate(NULL, "pll_u_480M", "pll_u", 1218 + CLK_SET_RATE_PARENT, clk_base + PLLU_BASE, 1219 + 22, 0, &pll_u_lock); 1220 + clk_register_clkdev(clk, "pll_u_480M", NULL); 1221 + clks[TEGRA124_CLK_PLL_U_480M] = clk; 1222 + 1223 + /* PLLU_60M */ 1224 + clk = clk_register_fixed_factor(NULL, "pll_u_60M", "pll_u", 1225 + CLK_SET_RATE_PARENT, 1, 8); 1226 + clk_register_clkdev(clk, "pll_u_60M", NULL); 1227 + clks[TEGRA124_CLK_PLL_U_60M] = clk; 1228 + 1229 + /* PLLU_48M */ 1230 + clk = clk_register_fixed_factor(NULL, "pll_u_48M", "pll_u", 1231 + CLK_SET_RATE_PARENT, 1, 10); 1232 + clk_register_clkdev(clk, "pll_u_48M", NULL); 1233 + clks[TEGRA124_CLK_PLL_U_48M] = clk; 1234 + 1235 + /* PLLU_12M */ 1236 + clk = clk_register_fixed_factor(NULL, "pll_u_12M", "pll_u", 1237 + CLK_SET_RATE_PARENT, 1, 40); 1238 + clk_register_clkdev(clk, "pll_u_12M", NULL); 1239 + clks[TEGRA124_CLK_PLL_U_12M] = clk; 1240 + 1241 + /* PLLD */ 1242 + clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0, 1243 + &pll_d_params, &pll_d_lock); 1244 + clk_register_clkdev(clk, "pll_d", NULL); 1245 + clks[TEGRA124_CLK_PLL_D] = clk; 1246 + 1247 + /* PLLD_OUT0 */ 1248 + clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", 1249 + CLK_SET_RATE_PARENT, 1, 2); 1250 + clk_register_clkdev(clk, "pll_d_out0", NULL); 1251 + clks[TEGRA124_CLK_PLL_D_OUT0] = clk; 1252 + 1253 + /* PLLRE */ 1254 + clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc, 1255 + 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq); 1256 + clk_register_clkdev(clk, "pll_re_vco", NULL); 1257 + clks[TEGRA124_CLK_PLL_RE_VCO] = clk; 1258 + 1259 + clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0, 1260 + clk_base + PLLRE_BASE, 16, 4, 0, 1261 + pll_re_div_table, &pll_re_lock); 1262 + clk_register_clkdev(clk, "pll_re_out", NULL); 1263 + clks[TEGRA124_CLK_PLL_RE_OUT] = clk; 1264 + 1265 + /* PLLE */ 1266 + clk = tegra_clk_register_plle_tegra114("pll_e", "pll_ref", 1267 + clk_base, 0, &pll_e_params, NULL); 1268 + clk_register_clkdev(clk, "pll_e", NULL); 1269 + clks[TEGRA124_CLK_PLL_E] = clk; 1270 + 1271 + /* PLLC4 */ 1272 + clk = tegra_clk_register_pllss("pll_c4", "pll_ref", clk_base, 0, 1273 + &pll_c4_params, NULL); 1274 + clk_register_clkdev(clk, "pll_c4", NULL); 1275 + clks[TEGRA124_CLK_PLL_C4] = clk; 1276 + 1277 + /* PLLDP */ 1278 + clk = tegra_clk_register_pllss("pll_dp", "pll_ref", clk_base, 0, 1279 + &pll_dp_params, NULL); 1280 + clk_register_clkdev(clk, "pll_dp", NULL); 1281 + clks[TEGRA124_CLK_PLL_DP] = clk; 1282 + 1283 + /* PLLD2 */ 1284 + clk = tegra_clk_register_pllss("pll_d2", "pll_ref", clk_base, 0, 1285 + &tegra124_pll_d2_params, NULL); 1286 + clk_register_clkdev(clk, "pll_d2", NULL); 1287 + clks[TEGRA124_CLK_PLL_D2] = clk; 1288 + 1289 + /* PLLD2_OUT0 ?? */ 1290 + clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", 1291 + CLK_SET_RATE_PARENT, 1, 2); 1292 + clk_register_clkdev(clk, "pll_d2_out0", NULL); 1293 + clks[TEGRA124_CLK_PLL_D2_OUT0] = clk; 1294 + 1295 + } 1296 + 1297 + /* Tegra124 CPU clock and reset control functions */ 1298 + static void tegra124_wait_cpu_in_reset(u32 cpu) 1299 + { 1300 + unsigned int reg; 1301 + 1302 + do { 1303 + reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS); 1304 + cpu_relax(); 1305 + } while (!(reg & (1 << cpu))); /* check CPU been reset or not */ 1306 + } 1307 + 1308 + static void tegra124_disable_cpu_clock(u32 cpu) 1309 + { 1310 + /* flow controller would take care in the power sequence. */ 1311 + } 1312 + 1313 + #ifdef CONFIG_PM_SLEEP 1314 + static void tegra124_cpu_clock_suspend(void) 1315 + { 1316 + /* switch coresite to clk_m, save off original source */ 1317 + tegra124_cpu_clk_sctx.clk_csite_src = 1318 + readl(clk_base + CLK_SOURCE_CSITE); 1319 + writel(3 << 30, clk_base + CLK_SOURCE_CSITE); 1320 + } 1321 + 1322 + static void tegra124_cpu_clock_resume(void) 1323 + { 1324 + writel(tegra124_cpu_clk_sctx.clk_csite_src, 1325 + clk_base + CLK_SOURCE_CSITE); 1326 + } 1327 + #endif 1328 + 1329 + static struct tegra_cpu_car_ops tegra124_cpu_car_ops = { 1330 + .wait_for_reset = tegra124_wait_cpu_in_reset, 1331 + .disable_clock = tegra124_disable_cpu_clock, 1332 + #ifdef CONFIG_PM_SLEEP 1333 + .suspend = tegra124_cpu_clock_suspend, 1334 + .resume = tegra124_cpu_clock_resume, 1335 + #endif 1336 + }; 1337 + 1338 + static const struct of_device_id pmc_match[] __initconst = { 1339 + { .compatible = "nvidia,tegra124-pmc" }, 1340 + {}, 1341 + }; 1342 + 1343 + static struct tegra_clk_init_table init_table[] __initdata = { 1344 + {TEGRA124_CLK_UARTA, TEGRA124_CLK_PLL_P, 408000000, 0}, 1345 + {TEGRA124_CLK_UARTB, TEGRA124_CLK_PLL_P, 408000000, 0}, 1346 + {TEGRA124_CLK_UARTC, TEGRA124_CLK_PLL_P, 408000000, 0}, 1347 + {TEGRA124_CLK_UARTD, TEGRA124_CLK_PLL_P, 408000000, 0}, 1348 + {TEGRA124_CLK_PLL_A, TEGRA124_CLK_CLK_MAX, 564480000, 1}, 1349 + {TEGRA124_CLK_PLL_A_OUT0, TEGRA124_CLK_CLK_MAX, 11289600, 1}, 1350 + {TEGRA124_CLK_EXTERN1, TEGRA124_CLK_PLL_A_OUT0, 0, 1}, 1351 + {TEGRA124_CLK_CLK_OUT_1_MUX, TEGRA124_CLK_EXTERN1, 0, 1}, 1352 + {TEGRA124_CLK_CLK_OUT_1, TEGRA124_CLK_CLK_MAX, 0, 1}, 1353 + {TEGRA124_CLK_I2S0, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0}, 1354 + {TEGRA124_CLK_I2S1, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0}, 1355 + {TEGRA124_CLK_I2S2, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0}, 1356 + {TEGRA124_CLK_I2S3, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0}, 1357 + {TEGRA124_CLK_I2S4, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0}, 1358 + {TEGRA124_CLK_VDE, TEGRA124_CLK_PLL_P, 0, 0}, 1359 + {TEGRA124_CLK_HOST1X, TEGRA124_CLK_PLL_P, 136000000, 1}, 1360 + {TEGRA124_CLK_SCLK, TEGRA124_CLK_PLL_P_OUT2, 102000000, 1}, 1361 + {TEGRA124_CLK_DFLL_SOC, TEGRA124_CLK_PLL_P, 51000000, 1}, 1362 + {TEGRA124_CLK_DFLL_REF, TEGRA124_CLK_PLL_P, 51000000, 1}, 1363 + {TEGRA124_CLK_PLL_C, TEGRA124_CLK_CLK_MAX, 768000000, 0}, 1364 + {TEGRA124_CLK_PLL_C_OUT1, TEGRA124_CLK_CLK_MAX, 100000000, 0}, 1365 + {TEGRA124_CLK_SBC4, TEGRA124_CLK_PLL_P, 12000000, 1}, 1366 + {TEGRA124_CLK_TSEC, TEGRA124_CLK_PLL_C3, 0, 0}, 1367 + {TEGRA124_CLK_MSENC, TEGRA124_CLK_PLL_C3, 0, 0}, 1368 + /* This MUST be the last entry. */ 1369 + {TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0}, 1370 + }; 1371 + 1372 + static void __init tegra124_clock_apply_init_table(void) 1373 + { 1374 + tegra_init_from_table(init_table, clks, TEGRA124_CLK_CLK_MAX); 1375 + } 1376 + 1377 + static void __init tegra124_clock_init(struct device_node *np) 1378 + { 1379 + struct device_node *node; 1380 + 1381 + clk_base = of_iomap(np, 0); 1382 + if (!clk_base) { 1383 + pr_err("ioremap tegra124 CAR failed\n"); 1384 + return; 1385 + } 1386 + 1387 + node = of_find_matching_node(NULL, pmc_match); 1388 + if (!node) { 1389 + pr_err("Failed to find pmc node\n"); 1390 + WARN_ON(1); 1391 + return; 1392 + } 1393 + 1394 + pmc_base = of_iomap(node, 0); 1395 + if (!pmc_base) { 1396 + pr_err("Can't map pmc registers\n"); 1397 + WARN_ON(1); 1398 + return; 1399 + } 1400 + 1401 + clks = tegra_clk_init(TEGRA124_CLK_CLK_MAX, 6); 1402 + if (!clks) 1403 + return; 1404 + 1405 + if (tegra_osc_clk_init(clk_base, tegra124_clks, tegra124_input_freq, 1406 + ARRAY_SIZE(tegra124_input_freq), &osc_freq, &pll_ref_freq) < 0) 1407 + return; 1408 + 1409 + tegra_fixed_clk_init(tegra124_clks); 1410 + tegra124_pll_init(clk_base, pmc_base); 1411 + tegra124_periph_clk_init(clk_base, pmc_base); 1412 + tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks, &pll_a_params); 1413 + tegra_pmc_clk_init(pmc_base, tegra124_clks); 1414 + 1415 + tegra_super_clk_gen4_init(clk_base, pmc_base, tegra124_clks, 1416 + &pll_x_params); 1417 + tegra_add_of_provider(np); 1418 + tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1419 + 1420 + tegra_clk_apply_init_table = tegra124_clock_apply_init_table; 1421 + 1422 + tegra_cpu_car_ops = &tegra124_cpu_car_ops; 1423 + } 1424 + CLK_OF_DECLARE(tegra124, "nvidia,tegra124-car", tegra124_clock_init);
+304 -514
drivers/clk/tegra/clk-tegra20.c
··· 22 22 #include <linux/of_address.h> 23 23 #include <linux/clk/tegra.h> 24 24 #include <linux/delay.h> 25 + #include <dt-bindings/clock/tegra20-car.h> 25 26 26 27 #include "clk.h" 27 - 28 - #define RST_DEVICES_L 0x004 29 - #define RST_DEVICES_H 0x008 30 - #define RST_DEVICES_U 0x00c 31 - #define RST_DEVICES_SET_L 0x300 32 - #define RST_DEVICES_CLR_L 0x304 33 - #define RST_DEVICES_SET_H 0x308 34 - #define RST_DEVICES_CLR_H 0x30c 35 - #define RST_DEVICES_SET_U 0x310 36 - #define RST_DEVICES_CLR_U 0x314 37 - #define RST_DEVICES_NUM 3 38 - 39 - #define CLK_OUT_ENB_L 0x010 40 - #define CLK_OUT_ENB_H 0x014 41 - #define CLK_OUT_ENB_U 0x018 42 - #define CLK_OUT_ENB_SET_L 0x320 43 - #define CLK_OUT_ENB_CLR_L 0x324 44 - #define CLK_OUT_ENB_SET_H 0x328 45 - #define CLK_OUT_ENB_CLR_H 0x32c 46 - #define CLK_OUT_ENB_SET_U 0x330 47 - #define CLK_OUT_ENB_CLR_U 0x334 48 - #define CLK_OUT_ENB_NUM 3 28 + #include "clk-id.h" 49 29 50 30 #define OSC_CTRL 0x50 51 31 #define OSC_CTRL_OSC_FREQ_MASK (3<<30) ··· 46 66 #define OSC_FREQ_DET_STATUS 0x5c 47 67 #define OSC_FREQ_DET_BUSY (1<<31) 48 68 #define OSC_FREQ_DET_CNT_MASK 0xFFFF 69 + 70 + #define TEGRA20_CLK_PERIPH_BANKS 3 49 71 50 72 #define PLLS_BASE 0xf0 51 73 #define PLLS_MISC 0xf4 ··· 96 114 97 115 #define CLK_SOURCE_I2S1 0x100 98 116 #define CLK_SOURCE_I2S2 0x104 99 - #define CLK_SOURCE_SPDIF_OUT 0x108 100 - #define CLK_SOURCE_SPDIF_IN 0x10c 101 117 #define CLK_SOURCE_PWM 0x110 102 118 #define CLK_SOURCE_SPI 0x114 103 - #define CLK_SOURCE_SBC1 0x134 104 - #define CLK_SOURCE_SBC2 0x118 105 - #define CLK_SOURCE_SBC3 0x11c 106 - #define CLK_SOURCE_SBC4 0x1b4 107 119 #define CLK_SOURCE_XIO 0x120 108 120 #define CLK_SOURCE_TWC 0x12c 109 121 #define CLK_SOURCE_IDE 0x144 110 - #define CLK_SOURCE_NDFLASH 0x160 111 - #define CLK_SOURCE_VFIR 0x168 112 - #define CLK_SOURCE_SDMMC1 0x150 113 - #define CLK_SOURCE_SDMMC2 0x154 114 - #define CLK_SOURCE_SDMMC3 0x1bc 115 - #define CLK_SOURCE_SDMMC4 0x164 116 - #define CLK_SOURCE_CVE 0x140 117 - #define CLK_SOURCE_TVO 0x188 118 - #define CLK_SOURCE_TVDAC 0x194 119 122 #define CLK_SOURCE_HDMI 0x18c 120 123 #define CLK_SOURCE_DISP1 0x138 121 124 #define CLK_SOURCE_DISP2 0x13c 122 125 #define CLK_SOURCE_CSITE 0x1d4 123 - #define CLK_SOURCE_LA 0x1f8 124 - #define CLK_SOURCE_OWR 0x1cc 125 - #define CLK_SOURCE_NOR 0x1d0 126 - #define CLK_SOURCE_MIPI 0x174 127 126 #define CLK_SOURCE_I2C1 0x124 128 127 #define CLK_SOURCE_I2C2 0x198 129 128 #define CLK_SOURCE_I2C3 0x1b8 ··· 114 151 #define CLK_SOURCE_UARTC 0x1a0 115 152 #define CLK_SOURCE_UARTD 0x1c0 116 153 #define CLK_SOURCE_UARTE 0x1c4 117 - #define CLK_SOURCE_3D 0x158 118 - #define CLK_SOURCE_2D 0x15c 119 - #define CLK_SOURCE_MPE 0x170 120 - #define CLK_SOURCE_EPP 0x16c 121 - #define CLK_SOURCE_HOST1X 0x180 122 - #define CLK_SOURCE_VDE 0x1c8 123 - #define CLK_SOURCE_VI 0x148 124 - #define CLK_SOURCE_VI_SENSOR 0x1a8 125 154 #define CLK_SOURCE_EMC 0x19c 126 155 127 156 #define AUDIO_SYNC_CLK 0x38 128 - 129 - #define PMC_CTRL 0x0 130 - #define PMC_CTRL_BLINK_ENB 7 131 - #define PMC_DPD_PADS_ORIDE 0x1c 132 - #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20 133 - #define PMC_BLINK_TIMER 0x40 134 157 135 158 /* Tegra CPU clock and reset control regs */ 136 159 #define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX 0x4c ··· 137 188 } tegra20_cpu_clk_sctx; 138 189 #endif 139 190 140 - static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32]; 141 - 142 191 static void __iomem *clk_base; 143 192 static void __iomem *pmc_base; 144 193 145 - static DEFINE_SPINLOCK(pll_div_lock); 146 - static DEFINE_SPINLOCK(sysrate_lock); 147 - 148 - #define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \ 149 - _clk_num, _regs, _gate_flags, _clk_id) \ 150 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 194 + #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 195 + _clk_num, _gate_flags, _clk_id) \ 196 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 151 197 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \ 152 - _regs, _clk_num, periph_clk_enb_refcnt, \ 198 + _clk_num, \ 153 199 _gate_flags, _clk_id) 154 200 155 - #define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \ 156 - _clk_num, _regs, _gate_flags, _clk_id) \ 157 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 158 - 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \ 159 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 201 + #define TEGRA_INIT_DATA_DIV16(_name, _parents, _offset, \ 202 + _clk_num, _gate_flags, _clk_id) \ 203 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 204 + 30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, \ 205 + _clk_num, _gate_flags, \ 160 206 _clk_id) 161 207 162 - #define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \ 163 - _clk_num, _regs, _gate_flags, _clk_id) \ 164 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 165 - 30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, _regs, \ 166 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 167 - _clk_id) 168 - 169 - #define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \ 170 - _mux_shift, _mux_width, _clk_num, _regs, \ 208 + #define TEGRA_INIT_DATA_NODIV(_name, _parents, _offset, \ 209 + _mux_shift, _mux_width, _clk_num, \ 171 210 _gate_flags, _clk_id) \ 172 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 173 - _mux_shift, _mux_width, 0, 0, 0, 0, 0, _regs, \ 174 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 211 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 212 + _mux_shift, _mux_width, 0, 0, 0, 0, 0, \ 213 + _clk_num, _gate_flags, \ 175 214 _clk_id) 176 215 177 - /* IDs assigned here must be in sync with DT bindings definition 178 - * for Tegra20 clocks . 179 - */ 180 - enum tegra20_clk { 181 - cpu, ac97 = 3, rtc, timer, uarta, gpio = 8, sdmmc2, i2s1 = 11, i2c1, 182 - ndflash, sdmmc1, sdmmc4, twc, pwm, i2s2, epp, gr2d = 21, usbd, isp, 183 - gr3d, ide, disp2, disp1, host1x, vcp, cache2 = 31, mem, ahbdma, apbdma, 184 - kbc = 36, stat_mon, pmc, fuse, kfuse, sbc1, nor, spi, sbc2, xio, sbc3, 185 - dvc, dsi, mipi = 50, hdmi, csi, tvdac, i2c2, uartc, emc = 57, usb2, 186 - usb3, mpe, vde, bsea, bsev, speedo, uartd, uarte, i2c3, sbc4, sdmmc3, 187 - pex, owr, afi, csite, pcie_xclk, avpucq = 75, la, irama = 84, iramb, 188 - iramc, iramd, cram2, audio_2x, clk_d, csus = 92, cdev2, cdev1, 189 - uartb = 96, vfir, spdif_in, spdif_out, vi, vi_sensor, tvo, cve, 190 - osc, clk_32k, clk_m, sclk, cclk, hclk, pclk, blink, pll_a, pll_a_out0, 191 - pll_c, pll_c_out1, pll_d, pll_d_out0, pll_e, pll_m, pll_m_out1, 192 - pll_p, pll_p_out1, pll_p_out2, pll_p_out3, pll_p_out4, pll_s, pll_u, 193 - pll_x, cop, audio, pll_ref, twd, clk_max, 194 - }; 195 - 196 - static struct clk *clks[clk_max]; 197 - static struct clk_onecell_data clk_data; 216 + static struct clk **clks; 198 217 199 218 static struct tegra_clk_pll_freq_table pll_c_freq_table[] = { 200 219 { 12000000, 600000000, 600, 12, 0, 8 }, ··· 300 383 .lock_mask = PLL_BASE_LOCK, 301 384 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 302 385 .lock_delay = 300, 386 + .freq_table = pll_c_freq_table, 387 + .flags = TEGRA_PLL_HAS_CPCON, 303 388 }; 304 389 305 390 static struct tegra_clk_pll_params pll_m_params = { ··· 316 397 .lock_mask = PLL_BASE_LOCK, 317 398 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 318 399 .lock_delay = 300, 400 + .freq_table = pll_m_freq_table, 401 + .flags = TEGRA_PLL_HAS_CPCON, 319 402 }; 320 403 321 404 static struct tegra_clk_pll_params pll_p_params = { ··· 332 411 .lock_mask = PLL_BASE_LOCK, 333 412 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 334 413 .lock_delay = 300, 414 + .freq_table = pll_p_freq_table, 415 + .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON, 416 + .fixed_rate = 216000000, 335 417 }; 336 418 337 419 static struct tegra_clk_pll_params pll_a_params = { ··· 349 425 .lock_mask = PLL_BASE_LOCK, 350 426 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 351 427 .lock_delay = 300, 428 + .freq_table = pll_a_freq_table, 429 + .flags = TEGRA_PLL_HAS_CPCON, 352 430 }; 353 431 354 432 static struct tegra_clk_pll_params pll_d_params = { ··· 365 439 .lock_mask = PLL_BASE_LOCK, 366 440 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 367 441 .lock_delay = 1000, 442 + .freq_table = pll_d_freq_table, 443 + .flags = TEGRA_PLL_HAS_CPCON, 368 444 }; 369 445 370 446 static struct pdiv_map pllu_p[] = { ··· 388 460 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 389 461 .lock_delay = 1000, 390 462 .pdiv_tohw = pllu_p, 463 + .freq_table = pll_u_freq_table, 464 + .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON, 391 465 }; 392 466 393 467 static struct tegra_clk_pll_params pll_x_params = { ··· 404 474 .lock_mask = PLL_BASE_LOCK, 405 475 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 406 476 .lock_delay = 300, 477 + .freq_table = pll_x_freq_table, 478 + .flags = TEGRA_PLL_HAS_CPCON, 407 479 }; 408 480 409 481 static struct tegra_clk_pll_params pll_e_params = { ··· 420 488 .lock_mask = PLLE_MISC_LOCK, 421 489 .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, 422 490 .lock_delay = 0, 491 + .freq_table = pll_e_freq_table, 492 + .flags = TEGRA_PLL_FIXED, 493 + .fixed_rate = 100000000, 423 494 }; 424 495 425 - /* Peripheral clock registers */ 426 - static struct tegra_clk_periph_regs periph_l_regs = { 427 - .enb_reg = CLK_OUT_ENB_L, 428 - .enb_set_reg = CLK_OUT_ENB_SET_L, 429 - .enb_clr_reg = CLK_OUT_ENB_CLR_L, 430 - .rst_reg = RST_DEVICES_L, 431 - .rst_set_reg = RST_DEVICES_SET_L, 432 - .rst_clr_reg = RST_DEVICES_CLR_L, 496 + static struct tegra_devclk devclks[] __initdata = { 497 + { .con_id = "pll_c", .dt_id = TEGRA20_CLK_PLL_C }, 498 + { .con_id = "pll_c_out1", .dt_id = TEGRA20_CLK_PLL_C_OUT1 }, 499 + { .con_id = "pll_p", .dt_id = TEGRA20_CLK_PLL_P }, 500 + { .con_id = "pll_p_out1", .dt_id = TEGRA20_CLK_PLL_P_OUT1 }, 501 + { .con_id = "pll_p_out2", .dt_id = TEGRA20_CLK_PLL_P_OUT2 }, 502 + { .con_id = "pll_p_out3", .dt_id = TEGRA20_CLK_PLL_P_OUT3 }, 503 + { .con_id = "pll_p_out4", .dt_id = TEGRA20_CLK_PLL_P_OUT4 }, 504 + { .con_id = "pll_m", .dt_id = TEGRA20_CLK_PLL_M }, 505 + { .con_id = "pll_m_out1", .dt_id = TEGRA20_CLK_PLL_M_OUT1 }, 506 + { .con_id = "pll_x", .dt_id = TEGRA20_CLK_PLL_X }, 507 + { .con_id = "pll_u", .dt_id = TEGRA20_CLK_PLL_U }, 508 + { .con_id = "pll_d", .dt_id = TEGRA20_CLK_PLL_D }, 509 + { .con_id = "pll_d_out0", .dt_id = TEGRA20_CLK_PLL_D_OUT0 }, 510 + { .con_id = "pll_a", .dt_id = TEGRA20_CLK_PLL_A }, 511 + { .con_id = "pll_a_out0", .dt_id = TEGRA20_CLK_PLL_A_OUT0 }, 512 + { .con_id = "pll_e", .dt_id = TEGRA20_CLK_PLL_E }, 513 + { .con_id = "cclk", .dt_id = TEGRA20_CLK_CCLK }, 514 + { .con_id = "sclk", .dt_id = TEGRA20_CLK_SCLK }, 515 + { .con_id = "hclk", .dt_id = TEGRA20_CLK_HCLK }, 516 + { .con_id = "pclk", .dt_id = TEGRA20_CLK_PCLK }, 517 + { .con_id = "fuse", .dt_id = TEGRA20_CLK_FUSE }, 518 + { .con_id = "twd", .dt_id = TEGRA20_CLK_TWD }, 519 + { .con_id = "audio", .dt_id = TEGRA20_CLK_AUDIO }, 520 + { .con_id = "audio_2x", .dt_id = TEGRA20_CLK_AUDIO_2X }, 521 + { .dev_id = "tegra20-ac97", .dt_id = TEGRA20_CLK_AC97 }, 522 + { .dev_id = "tegra-apbdma", .dt_id = TEGRA20_CLK_APBDMA }, 523 + { .dev_id = "rtc-tegra", .dt_id = TEGRA20_CLK_RTC }, 524 + { .dev_id = "timer", .dt_id = TEGRA20_CLK_TIMER }, 525 + { .dev_id = "tegra-kbc", .dt_id = TEGRA20_CLK_KBC }, 526 + { .con_id = "csus", .dev_id = "tegra_camera", .dt_id = TEGRA20_CLK_CSUS }, 527 + { .con_id = "vcp", .dev_id = "tegra-avp", .dt_id = TEGRA20_CLK_VCP }, 528 + { .con_id = "bsea", .dev_id = "tegra-avp", .dt_id = TEGRA20_CLK_BSEA }, 529 + { .con_id = "bsev", .dev_id = "tegra-aes", .dt_id = TEGRA20_CLK_BSEV }, 530 + { .con_id = "emc", .dt_id = TEGRA20_CLK_EMC }, 531 + { .dev_id = "fsl-tegra-udc", .dt_id = TEGRA20_CLK_USBD }, 532 + { .dev_id = "tegra-ehci.1", .dt_id = TEGRA20_CLK_USB2 }, 533 + { .dev_id = "tegra-ehci.2", .dt_id = TEGRA20_CLK_USB3 }, 534 + { .dev_id = "dsi", .dt_id = TEGRA20_CLK_DSI }, 535 + { .con_id = "csi", .dev_id = "tegra_camera", .dt_id = TEGRA20_CLK_CSI }, 536 + { .con_id = "isp", .dev_id = "tegra_camera", .dt_id = TEGRA20_CLK_ISP }, 537 + { .con_id = "pex", .dt_id = TEGRA20_CLK_PEX }, 538 + { .con_id = "afi", .dt_id = TEGRA20_CLK_AFI }, 539 + { .con_id = "pcie_xclk", .dt_id = TEGRA20_CLK_PCIE_XCLK }, 540 + { .con_id = "cdev1", .dt_id = TEGRA20_CLK_CDEV1 }, 541 + { .con_id = "cdev2", .dt_id = TEGRA20_CLK_CDEV2 }, 542 + { .con_id = "clk_32k", .dt_id = TEGRA20_CLK_CLK_32K }, 543 + { .con_id = "blink", .dt_id = TEGRA20_CLK_BLINK }, 544 + { .con_id = "clk_m", .dt_id = TEGRA20_CLK_CLK_M }, 545 + { .con_id = "pll_ref", .dt_id = TEGRA20_CLK_PLL_REF }, 546 + { .dev_id = "tegra20-i2s.0", .dt_id = TEGRA20_CLK_I2S1 }, 547 + { .dev_id = "tegra20-i2s.1", .dt_id = TEGRA20_CLK_I2S2 }, 548 + { .con_id = "spdif_out", .dev_id = "tegra20-spdif", .dt_id = TEGRA20_CLK_SPDIF_OUT }, 549 + { .con_id = "spdif_in", .dev_id = "tegra20-spdif", .dt_id = TEGRA20_CLK_SPDIF_IN }, 550 + { .dev_id = "spi_tegra.0", .dt_id = TEGRA20_CLK_SBC1 }, 551 + { .dev_id = "spi_tegra.1", .dt_id = TEGRA20_CLK_SBC2 }, 552 + { .dev_id = "spi_tegra.2", .dt_id = TEGRA20_CLK_SBC3 }, 553 + { .dev_id = "spi_tegra.3", .dt_id = TEGRA20_CLK_SBC4 }, 554 + { .dev_id = "spi", .dt_id = TEGRA20_CLK_SPI }, 555 + { .dev_id = "xio", .dt_id = TEGRA20_CLK_XIO }, 556 + { .dev_id = "twc", .dt_id = TEGRA20_CLK_TWC }, 557 + { .dev_id = "ide", .dt_id = TEGRA20_CLK_IDE }, 558 + { .dev_id = "tegra_nand", .dt_id = TEGRA20_CLK_NDFLASH }, 559 + { .dev_id = "vfir", .dt_id = TEGRA20_CLK_VFIR }, 560 + { .dev_id = "csite", .dt_id = TEGRA20_CLK_CSITE }, 561 + { .dev_id = "la", .dt_id = TEGRA20_CLK_LA }, 562 + { .dev_id = "tegra_w1", .dt_id = TEGRA20_CLK_OWR }, 563 + { .dev_id = "mipi", .dt_id = TEGRA20_CLK_MIPI }, 564 + { .dev_id = "vde", .dt_id = TEGRA20_CLK_VDE }, 565 + { .con_id = "vi", .dev_id = "tegra_camera", .dt_id = TEGRA20_CLK_VI }, 566 + { .dev_id = "epp", .dt_id = TEGRA20_CLK_EPP }, 567 + { .dev_id = "mpe", .dt_id = TEGRA20_CLK_MPE }, 568 + { .dev_id = "host1x", .dt_id = TEGRA20_CLK_HOST1X }, 569 + { .dev_id = "3d", .dt_id = TEGRA20_CLK_GR3D }, 570 + { .dev_id = "2d", .dt_id = TEGRA20_CLK_GR2D }, 571 + { .dev_id = "tegra-nor", .dt_id = TEGRA20_CLK_NOR }, 572 + { .dev_id = "sdhci-tegra.0", .dt_id = TEGRA20_CLK_SDMMC1 }, 573 + { .dev_id = "sdhci-tegra.1", .dt_id = TEGRA20_CLK_SDMMC2 }, 574 + { .dev_id = "sdhci-tegra.2", .dt_id = TEGRA20_CLK_SDMMC3 }, 575 + { .dev_id = "sdhci-tegra.3", .dt_id = TEGRA20_CLK_SDMMC4 }, 576 + { .dev_id = "cve", .dt_id = TEGRA20_CLK_CVE }, 577 + { .dev_id = "tvo", .dt_id = TEGRA20_CLK_TVO }, 578 + { .dev_id = "tvdac", .dt_id = TEGRA20_CLK_TVDAC }, 579 + { .con_id = "vi_sensor", .dev_id = "tegra_camera", .dt_id = TEGRA20_CLK_VI_SENSOR }, 580 + { .dev_id = "hdmi", .dt_id = TEGRA20_CLK_HDMI }, 581 + { .con_id = "div-clk", .dev_id = "tegra-i2c.0", .dt_id = TEGRA20_CLK_I2C1 }, 582 + { .con_id = "div-clk", .dev_id = "tegra-i2c.1", .dt_id = TEGRA20_CLK_I2C2 }, 583 + { .con_id = "div-clk", .dev_id = "tegra-i2c.2", .dt_id = TEGRA20_CLK_I2C3 }, 584 + { .con_id = "div-clk", .dev_id = "tegra-i2c.3", .dt_id = TEGRA20_CLK_DVC }, 585 + { .dev_id = "tegra-pwm", .dt_id = TEGRA20_CLK_PWM }, 586 + { .dev_id = "tegra_uart.0", .dt_id = TEGRA20_CLK_UARTA }, 587 + { .dev_id = "tegra_uart.1", .dt_id = TEGRA20_CLK_UARTB }, 588 + { .dev_id = "tegra_uart.2", .dt_id = TEGRA20_CLK_UARTC }, 589 + { .dev_id = "tegra_uart.3", .dt_id = TEGRA20_CLK_UARTD }, 590 + { .dev_id = "tegra_uart.4", .dt_id = TEGRA20_CLK_UARTE }, 591 + { .dev_id = "tegradc.0", .dt_id = TEGRA20_CLK_DISP1 }, 592 + { .dev_id = "tegradc.1", .dt_id = TEGRA20_CLK_DISP2 }, 433 593 }; 434 594 435 - static struct tegra_clk_periph_regs periph_h_regs = { 436 - .enb_reg = CLK_OUT_ENB_H, 437 - .enb_set_reg = CLK_OUT_ENB_SET_H, 438 - .enb_clr_reg = CLK_OUT_ENB_CLR_H, 439 - .rst_reg = RST_DEVICES_H, 440 - .rst_set_reg = RST_DEVICES_SET_H, 441 - .rst_clr_reg = RST_DEVICES_CLR_H, 442 - }; 443 - 444 - static struct tegra_clk_periph_regs periph_u_regs = { 445 - .enb_reg = CLK_OUT_ENB_U, 446 - .enb_set_reg = CLK_OUT_ENB_SET_U, 447 - .enb_clr_reg = CLK_OUT_ENB_CLR_U, 448 - .rst_reg = RST_DEVICES_U, 449 - .rst_set_reg = RST_DEVICES_SET_U, 450 - .rst_clr_reg = RST_DEVICES_CLR_U, 595 + static struct tegra_clk tegra20_clks[tegra_clk_max] __initdata = { 596 + [tegra_clk_spdif_out] = { .dt_id = TEGRA20_CLK_SPDIF_OUT, .present = true }, 597 + [tegra_clk_spdif_in] = { .dt_id = TEGRA20_CLK_SPDIF_IN, .present = true }, 598 + [tegra_clk_sdmmc1] = { .dt_id = TEGRA20_CLK_SDMMC1, .present = true }, 599 + [tegra_clk_sdmmc2] = { .dt_id = TEGRA20_CLK_SDMMC2, .present = true }, 600 + [tegra_clk_sdmmc3] = { .dt_id = TEGRA20_CLK_SDMMC3, .present = true }, 601 + [tegra_clk_sdmmc4] = { .dt_id = TEGRA20_CLK_SDMMC4, .present = true }, 602 + [tegra_clk_la] = { .dt_id = TEGRA20_CLK_LA, .present = true }, 603 + [tegra_clk_csite] = { .dt_id = TEGRA20_CLK_CSITE, .present = true }, 604 + [tegra_clk_vfir] = { .dt_id = TEGRA20_CLK_VFIR, .present = true }, 605 + [tegra_clk_mipi] = { .dt_id = TEGRA20_CLK_MIPI, .present = true }, 606 + [tegra_clk_nor] = { .dt_id = TEGRA20_CLK_NOR, .present = true }, 607 + [tegra_clk_rtc] = { .dt_id = TEGRA20_CLK_RTC, .present = true }, 608 + [tegra_clk_timer] = { .dt_id = TEGRA20_CLK_TIMER, .present = true }, 609 + [tegra_clk_kbc] = { .dt_id = TEGRA20_CLK_KBC, .present = true }, 610 + [tegra_clk_csus] = { .dt_id = TEGRA20_CLK_CSUS, .present = true }, 611 + [tegra_clk_vcp] = { .dt_id = TEGRA20_CLK_VCP, .present = true }, 612 + [tegra_clk_bsea] = { .dt_id = TEGRA20_CLK_BSEA, .present = true }, 613 + [tegra_clk_bsev] = { .dt_id = TEGRA20_CLK_BSEV, .present = true }, 614 + [tegra_clk_usbd] = { .dt_id = TEGRA20_CLK_USBD, .present = true }, 615 + [tegra_clk_usb2] = { .dt_id = TEGRA20_CLK_USB2, .present = true }, 616 + [tegra_clk_usb3] = { .dt_id = TEGRA20_CLK_USB3, .present = true }, 617 + [tegra_clk_csi] = { .dt_id = TEGRA20_CLK_CSI, .present = true }, 618 + [tegra_clk_isp] = { .dt_id = TEGRA20_CLK_ISP, .present = true }, 619 + [tegra_clk_clk_32k] = { .dt_id = TEGRA20_CLK_CLK_32K, .present = true }, 620 + [tegra_clk_blink] = { .dt_id = TEGRA20_CLK_BLINK, .present = true }, 621 + [tegra_clk_hclk] = { .dt_id = TEGRA20_CLK_HCLK, .present = true }, 622 + [tegra_clk_pclk] = { .dt_id = TEGRA20_CLK_PCLK, .present = true }, 623 + [tegra_clk_pll_p_out1] = { .dt_id = TEGRA20_CLK_PLL_P_OUT1, .present = true }, 624 + [tegra_clk_pll_p_out2] = { .dt_id = TEGRA20_CLK_PLL_P_OUT2, .present = true }, 625 + [tegra_clk_pll_p_out3] = { .dt_id = TEGRA20_CLK_PLL_P_OUT3, .present = true }, 626 + [tegra_clk_pll_p_out4] = { .dt_id = TEGRA20_CLK_PLL_P_OUT4, .present = true }, 627 + [tegra_clk_pll_p] = { .dt_id = TEGRA20_CLK_PLL_P, .present = true }, 628 + [tegra_clk_owr] = { .dt_id = TEGRA20_CLK_OWR, .present = true }, 629 + [tegra_clk_sbc1] = { .dt_id = TEGRA20_CLK_SBC1, .present = true }, 630 + [tegra_clk_sbc2] = { .dt_id = TEGRA20_CLK_SBC2, .present = true }, 631 + [tegra_clk_sbc3] = { .dt_id = TEGRA20_CLK_SBC3, .present = true }, 632 + [tegra_clk_sbc4] = { .dt_id = TEGRA20_CLK_SBC4, .present = true }, 633 + [tegra_clk_vde] = { .dt_id = TEGRA20_CLK_VDE, .present = true }, 634 + [tegra_clk_vi] = { .dt_id = TEGRA20_CLK_VI, .present = true }, 635 + [tegra_clk_epp] = { .dt_id = TEGRA20_CLK_EPP, .present = true }, 636 + [tegra_clk_mpe] = { .dt_id = TEGRA20_CLK_MPE, .present = true }, 637 + [tegra_clk_host1x] = { .dt_id = TEGRA20_CLK_HOST1X, .present = true }, 638 + [tegra_clk_gr2d] = { .dt_id = TEGRA20_CLK_GR2D, .present = true }, 639 + [tegra_clk_gr3d] = { .dt_id = TEGRA20_CLK_GR3D, .present = true }, 640 + [tegra_clk_ndflash] = { .dt_id = TEGRA20_CLK_NDFLASH, .present = true }, 641 + [tegra_clk_cve] = { .dt_id = TEGRA20_CLK_CVE, .present = true }, 642 + [tegra_clk_tvo] = { .dt_id = TEGRA20_CLK_TVO, .present = true }, 643 + [tegra_clk_tvdac] = { .dt_id = TEGRA20_CLK_TVDAC, .present = true }, 644 + [tegra_clk_vi_sensor] = { .dt_id = TEGRA20_CLK_VI_SENSOR, .present = true }, 645 + [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, 451 646 }; 452 647 453 648 static unsigned long tegra20_clk_measure_input_freq(void) ··· 636 577 637 578 /* PLLC */ 638 579 clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0, 639 - 0, &pll_c_params, TEGRA_PLL_HAS_CPCON, 640 - pll_c_freq_table, NULL); 641 - clk_register_clkdev(clk, "pll_c", NULL); 642 - clks[pll_c] = clk; 580 + &pll_c_params, NULL); 581 + clks[TEGRA20_CLK_PLL_C] = clk; 643 582 644 583 /* PLLC_OUT1 */ 645 584 clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", ··· 646 589 clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", 647 590 clk_base + PLLC_OUT, 1, 0, CLK_SET_RATE_PARENT, 648 591 0, NULL); 649 - clk_register_clkdev(clk, "pll_c_out1", NULL); 650 - clks[pll_c_out1] = clk; 651 - 652 - /* PLLP */ 653 - clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, NULL, 0, 654 - 216000000, &pll_p_params, TEGRA_PLL_FIXED | 655 - TEGRA_PLL_HAS_CPCON, pll_p_freq_table, NULL); 656 - clk_register_clkdev(clk, "pll_p", NULL); 657 - clks[pll_p] = clk; 658 - 659 - /* PLLP_OUT1 */ 660 - clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p", 661 - clk_base + PLLP_OUTA, 0, 662 - TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP, 663 - 8, 8, 1, &pll_div_lock); 664 - clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div", 665 - clk_base + PLLP_OUTA, 1, 0, 666 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 667 - &pll_div_lock); 668 - clk_register_clkdev(clk, "pll_p_out1", NULL); 669 - clks[pll_p_out1] = clk; 670 - 671 - /* PLLP_OUT2 */ 672 - clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p", 673 - clk_base + PLLP_OUTA, 0, 674 - TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP, 675 - 24, 8, 1, &pll_div_lock); 676 - clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div", 677 - clk_base + PLLP_OUTA, 17, 16, 678 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 679 - &pll_div_lock); 680 - clk_register_clkdev(clk, "pll_p_out2", NULL); 681 - clks[pll_p_out2] = clk; 682 - 683 - /* PLLP_OUT3 */ 684 - clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p", 685 - clk_base + PLLP_OUTB, 0, 686 - TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP, 687 - 8, 8, 1, &pll_div_lock); 688 - clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div", 689 - clk_base + PLLP_OUTB, 1, 0, 690 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 691 - &pll_div_lock); 692 - clk_register_clkdev(clk, "pll_p_out3", NULL); 693 - clks[pll_p_out3] = clk; 694 - 695 - /* PLLP_OUT4 */ 696 - clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p", 697 - clk_base + PLLP_OUTB, 0, 698 - TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP, 699 - 24, 8, 1, &pll_div_lock); 700 - clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div", 701 - clk_base + PLLP_OUTB, 17, 16, 702 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 703 - &pll_div_lock); 704 - clk_register_clkdev(clk, "pll_p_out4", NULL); 705 - clks[pll_p_out4] = clk; 592 + clks[TEGRA20_CLK_PLL_C_OUT1] = clk; 706 593 707 594 /* PLLM */ 708 595 clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL, 709 - CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, 710 - &pll_m_params, TEGRA_PLL_HAS_CPCON, 711 - pll_m_freq_table, NULL); 712 - clk_register_clkdev(clk, "pll_m", NULL); 713 - clks[pll_m] = clk; 596 + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 597 + &pll_m_params, NULL); 598 + clks[TEGRA20_CLK_PLL_M] = clk; 714 599 715 600 /* PLLM_OUT1 */ 716 601 clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m", ··· 661 662 clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div", 662 663 clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED | 663 664 CLK_SET_RATE_PARENT, 0, NULL); 664 - clk_register_clkdev(clk, "pll_m_out1", NULL); 665 - clks[pll_m_out1] = clk; 665 + clks[TEGRA20_CLK_PLL_M_OUT1] = clk; 666 666 667 667 /* PLLX */ 668 668 clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0, 669 - 0, &pll_x_params, TEGRA_PLL_HAS_CPCON, 670 - pll_x_freq_table, NULL); 671 - clk_register_clkdev(clk, "pll_x", NULL); 672 - clks[pll_x] = clk; 669 + &pll_x_params, NULL); 670 + clks[TEGRA20_CLK_PLL_X] = clk; 673 671 674 672 /* PLLU */ 675 673 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0, 676 - 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON, 677 - pll_u_freq_table, NULL); 678 - clk_register_clkdev(clk, "pll_u", NULL); 679 - clks[pll_u] = clk; 674 + &pll_u_params, NULL); 675 + clks[TEGRA20_CLK_PLL_U] = clk; 680 676 681 677 /* PLLD */ 682 678 clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0, 683 - 0, &pll_d_params, TEGRA_PLL_HAS_CPCON, 684 - pll_d_freq_table, NULL); 685 - clk_register_clkdev(clk, "pll_d", NULL); 686 - clks[pll_d] = clk; 679 + &pll_d_params, NULL); 680 + clks[TEGRA20_CLK_PLL_D] = clk; 687 681 688 682 /* PLLD_OUT0 */ 689 683 clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", 690 684 CLK_SET_RATE_PARENT, 1, 2); 691 - clk_register_clkdev(clk, "pll_d_out0", NULL); 692 - clks[pll_d_out0] = clk; 685 + clks[TEGRA20_CLK_PLL_D_OUT0] = clk; 693 686 694 687 /* PLLA */ 695 688 clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0, 696 - 0, &pll_a_params, TEGRA_PLL_HAS_CPCON, 697 - pll_a_freq_table, NULL); 698 - clk_register_clkdev(clk, "pll_a", NULL); 699 - clks[pll_a] = clk; 689 + &pll_a_params, NULL); 690 + clks[TEGRA20_CLK_PLL_A] = clk; 700 691 701 692 /* PLLA_OUT0 */ 702 693 clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", ··· 695 706 clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", 696 707 clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED | 697 708 CLK_SET_RATE_PARENT, 0, NULL); 698 - clk_register_clkdev(clk, "pll_a_out0", NULL); 699 - clks[pll_a_out0] = clk; 709 + clks[TEGRA20_CLK_PLL_A_OUT0] = clk; 700 710 701 711 /* PLLE */ 702 712 clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, pmc_base, 703 - 0, 100000000, &pll_e_params, 704 - 0, pll_e_freq_table, NULL); 705 - clk_register_clkdev(clk, "pll_e", NULL); 706 - clks[pll_e] = clk; 713 + 0, &pll_e_params, NULL); 714 + clks[TEGRA20_CLK_PLL_E] = clk; 707 715 } 708 716 709 717 static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", ··· 718 732 clk = tegra_clk_register_super_mux("cclk", cclk_parents, 719 733 ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT, 720 734 clk_base + CCLK_BURST_POLICY, 0, 4, 0, 0, NULL); 721 - clk_register_clkdev(clk, "cclk", NULL); 722 - clks[cclk] = clk; 735 + clks[TEGRA20_CLK_CCLK] = clk; 723 736 724 737 /* SCLK */ 725 738 clk = tegra_clk_register_super_mux("sclk", sclk_parents, 726 739 ARRAY_SIZE(sclk_parents), CLK_SET_RATE_PARENT, 727 740 clk_base + SCLK_BURST_POLICY, 0, 4, 0, 0, NULL); 728 - clk_register_clkdev(clk, "sclk", NULL); 729 - clks[sclk] = clk; 730 - 731 - /* HCLK */ 732 - clk = clk_register_divider(NULL, "hclk_div", "sclk", 0, 733 - clk_base + CLK_SYSTEM_RATE, 4, 2, 0, 734 - &sysrate_lock); 735 - clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT, 736 - clk_base + CLK_SYSTEM_RATE, 7, 737 - CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 738 - clk_register_clkdev(clk, "hclk", NULL); 739 - clks[hclk] = clk; 740 - 741 - /* PCLK */ 742 - clk = clk_register_divider(NULL, "pclk_div", "hclk", 0, 743 - clk_base + CLK_SYSTEM_RATE, 0, 2, 0, 744 - &sysrate_lock); 745 - clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT, 746 - clk_base + CLK_SYSTEM_RATE, 3, 747 - CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 748 - clk_register_clkdev(clk, "pclk", NULL); 749 - clks[pclk] = clk; 741 + clks[TEGRA20_CLK_SCLK] = clk; 750 742 751 743 /* twd */ 752 744 clk = clk_register_fixed_factor(NULL, "twd", "cclk", 0, 1, 4); 753 - clk_register_clkdev(clk, "twd", NULL); 754 - clks[twd] = clk; 745 + clks[TEGRA20_CLK_TWD] = clk; 755 746 } 756 747 757 748 static const char *audio_parents[] = {"spdif_in", "i2s1", "i2s2", "unused", ··· 747 784 clk = clk_register_gate(NULL, "audio", "audio_mux", 0, 748 785 clk_base + AUDIO_SYNC_CLK, 4, 749 786 CLK_GATE_SET_TO_DISABLE, NULL); 750 - clk_register_clkdev(clk, "audio", NULL); 751 - clks[audio] = clk; 787 + clks[TEGRA20_CLK_AUDIO] = clk; 752 788 753 789 /* audio_2x */ 754 790 clk = clk_register_fixed_factor(NULL, "audio_doubler", "audio", 755 791 CLK_SET_RATE_PARENT, 2, 1); 756 792 clk = tegra_clk_register_periph_gate("audio_2x", "audio_doubler", 757 793 TEGRA_PERIPH_NO_RESET, clk_base, 758 - CLK_SET_RATE_PARENT, 89, &periph_u_regs, 794 + CLK_SET_RATE_PARENT, 89, 759 795 periph_clk_enb_refcnt); 760 - clk_register_clkdev(clk, "audio_2x", NULL); 761 - clks[audio_2x] = clk; 796 + clks[TEGRA20_CLK_AUDIO_2X] = clk; 762 797 763 798 } 764 799 ··· 764 803 "clk_m"}; 765 804 static const char *i2s2_parents[] = {"pll_a_out0", "audio_2x", "pll_p", 766 805 "clk_m"}; 767 - static const char *spdif_out_parents[] = {"pll_a_out0", "audio_2x", "pll_p", 768 - "clk_m"}; 769 - static const char *spdif_in_parents[] = {"pll_p", "pll_c", "pll_m"}; 770 806 static const char *pwm_parents[] = {"pll_p", "pll_c", "audio", "clk_m", 771 807 "clk_32k"}; 772 808 static const char *mux_pllpcm_clkm[] = {"pll_p", "pll_c", "pll_m", "clk_m"}; 773 - static const char *mux_pllmcpa[] = {"pll_m", "pll_c", "pll_c", "pll_a"}; 774 809 static const char *mux_pllpdc_clkm[] = {"pll_p", "pll_d_out0", "pll_c", 775 810 "clk_m"}; 776 811 static const char *mux_pllmcp_clkm[] = {"pll_m", "pll_c", "pll_p", "clk_m"}; 777 812 778 813 static struct tegra_periph_init_data tegra_periph_clk_list[] = { 779 - TEGRA_INIT_DATA_MUX("i2s1", NULL, "tegra20-i2s.0", i2s1_parents, CLK_SOURCE_I2S1, 11, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1), 780 - TEGRA_INIT_DATA_MUX("i2s2", NULL, "tegra20-i2s.1", i2s2_parents, CLK_SOURCE_I2S2, 18, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2), 781 - TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out", "tegra20-spdif", spdif_out_parents, CLK_SOURCE_SPDIF_OUT, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out), 782 - TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in", "tegra20-spdif", spdif_in_parents, CLK_SOURCE_SPDIF_IN, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in), 783 - TEGRA_INIT_DATA_MUX("sbc1", NULL, "spi_tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SBC1, 41, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1), 784 - TEGRA_INIT_DATA_MUX("sbc2", NULL, "spi_tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SBC2, 44, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2), 785 - TEGRA_INIT_DATA_MUX("sbc3", NULL, "spi_tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SBC3, 46, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3), 786 - TEGRA_INIT_DATA_MUX("sbc4", NULL, "spi_tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SBC4, 68, &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4), 787 - TEGRA_INIT_DATA_MUX("spi", NULL, "spi", mux_pllpcm_clkm, CLK_SOURCE_SPI, 43, &periph_h_regs, TEGRA_PERIPH_ON_APB, spi), 788 - TEGRA_INIT_DATA_MUX("xio", NULL, "xio", mux_pllpcm_clkm, CLK_SOURCE_XIO, 45, &periph_h_regs, 0, xio), 789 - TEGRA_INIT_DATA_MUX("twc", NULL, "twc", mux_pllpcm_clkm, CLK_SOURCE_TWC, 16, &periph_l_regs, TEGRA_PERIPH_ON_APB, twc), 790 - TEGRA_INIT_DATA_MUX("ide", NULL, "ide", mux_pllpcm_clkm, CLK_SOURCE_XIO, 25, &periph_l_regs, 0, ide), 791 - TEGRA_INIT_DATA_MUX("ndflash", NULL, "tegra_nand", mux_pllpcm_clkm, CLK_SOURCE_NDFLASH, 13, &periph_l_regs, 0, ndflash), 792 - TEGRA_INIT_DATA_MUX("vfir", NULL, "vfir", mux_pllpcm_clkm, CLK_SOURCE_VFIR, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir), 793 - TEGRA_INIT_DATA_MUX("csite", NULL, "csite", mux_pllpcm_clkm, CLK_SOURCE_CSITE, 73, &periph_u_regs, 0, csite), 794 - TEGRA_INIT_DATA_MUX("la", NULL, "la", mux_pllpcm_clkm, CLK_SOURCE_LA, 76, &periph_u_regs, 0, la), 795 - TEGRA_INIT_DATA_MUX("owr", NULL, "tegra_w1", mux_pllpcm_clkm, CLK_SOURCE_OWR, 71, &periph_u_regs, TEGRA_PERIPH_ON_APB, owr), 796 - TEGRA_INIT_DATA_MUX("mipi", NULL, "mipi", mux_pllpcm_clkm, CLK_SOURCE_MIPI, 50, &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi), 797 - TEGRA_INIT_DATA_MUX("vde", NULL, "vde", mux_pllpcm_clkm, CLK_SOURCE_VDE, 61, &periph_h_regs, 0, vde), 798 - TEGRA_INIT_DATA_MUX("vi", "vi", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI, 20, &periph_l_regs, 0, vi), 799 - TEGRA_INIT_DATA_MUX("epp", NULL, "epp", mux_pllmcpa, CLK_SOURCE_EPP, 19, &periph_l_regs, 0, epp), 800 - TEGRA_INIT_DATA_MUX("mpe", NULL, "mpe", mux_pllmcpa, CLK_SOURCE_MPE, 60, &periph_h_regs, 0, mpe), 801 - TEGRA_INIT_DATA_MUX("host1x", NULL, "host1x", mux_pllmcpa, CLK_SOURCE_HOST1X, 28, &periph_l_regs, 0, host1x), 802 - TEGRA_INIT_DATA_MUX("3d", NULL, "3d", mux_pllmcpa, CLK_SOURCE_3D, 24, &periph_l_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d), 803 - TEGRA_INIT_DATA_MUX("2d", NULL, "2d", mux_pllmcpa, CLK_SOURCE_2D, 21, &periph_l_regs, 0, gr2d), 804 - TEGRA_INIT_DATA_MUX("nor", NULL, "tegra-nor", mux_pllpcm_clkm, CLK_SOURCE_NOR, 42, &periph_h_regs, 0, nor), 805 - TEGRA_INIT_DATA_MUX("sdmmc1", NULL, "sdhci-tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SDMMC1, 14, &periph_l_regs, 0, sdmmc1), 806 - TEGRA_INIT_DATA_MUX("sdmmc2", NULL, "sdhci-tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SDMMC2, 9, &periph_l_regs, 0, sdmmc2), 807 - TEGRA_INIT_DATA_MUX("sdmmc3", NULL, "sdhci-tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SDMMC3, 69, &periph_u_regs, 0, sdmmc3), 808 - TEGRA_INIT_DATA_MUX("sdmmc4", NULL, "sdhci-tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SDMMC4, 15, &periph_l_regs, 0, sdmmc4), 809 - TEGRA_INIT_DATA_MUX("cve", NULL, "cve", mux_pllpdc_clkm, CLK_SOURCE_CVE, 49, &periph_h_regs, 0, cve), 810 - TEGRA_INIT_DATA_MUX("tvo", NULL, "tvo", mux_pllpdc_clkm, CLK_SOURCE_TVO, 49, &periph_h_regs, 0, tvo), 811 - TEGRA_INIT_DATA_MUX("tvdac", NULL, "tvdac", mux_pllpdc_clkm, CLK_SOURCE_TVDAC, 53, &periph_h_regs, 0, tvdac), 812 - TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI_SENSOR, 20, &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor), 813 - TEGRA_INIT_DATA_DIV16("i2c1", "div-clk", "tegra-i2c.0", mux_pllpcm_clkm, CLK_SOURCE_I2C1, 12, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2c1), 814 - TEGRA_INIT_DATA_DIV16("i2c2", "div-clk", "tegra-i2c.1", mux_pllpcm_clkm, CLK_SOURCE_I2C2, 54, &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c2), 815 - TEGRA_INIT_DATA_DIV16("i2c3", "div-clk", "tegra-i2c.2", mux_pllpcm_clkm, CLK_SOURCE_I2C3, 67, &periph_u_regs, TEGRA_PERIPH_ON_APB, i2c3), 816 - TEGRA_INIT_DATA_DIV16("dvc", "div-clk", "tegra-i2c.3", mux_pllpcm_clkm, CLK_SOURCE_DVC, 47, &periph_h_regs, TEGRA_PERIPH_ON_APB, dvc), 817 - TEGRA_INIT_DATA_MUX("hdmi", NULL, "hdmi", mux_pllpdc_clkm, CLK_SOURCE_HDMI, 51, &periph_h_regs, 0, hdmi), 818 - TEGRA_INIT_DATA("pwm", NULL, "tegra-pwm", pwm_parents, CLK_SOURCE_PWM, 28, 3, 0, 0, 8, 1, 0, &periph_l_regs, 17, periph_clk_enb_refcnt, TEGRA_PERIPH_ON_APB, pwm), 814 + TEGRA_INIT_DATA_MUX("i2s1", i2s1_parents, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2S1), 815 + TEGRA_INIT_DATA_MUX("i2s2", i2s2_parents, CLK_SOURCE_I2S2, 18, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2S2), 816 + TEGRA_INIT_DATA_MUX("spi", mux_pllpcm_clkm, CLK_SOURCE_SPI, 43, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_SPI), 817 + TEGRA_INIT_DATA_MUX("xio", mux_pllpcm_clkm, CLK_SOURCE_XIO, 45, 0, TEGRA20_CLK_XIO), 818 + TEGRA_INIT_DATA_MUX("twc", mux_pllpcm_clkm, CLK_SOURCE_TWC, 16, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_TWC), 819 + TEGRA_INIT_DATA_MUX("ide", mux_pllpcm_clkm, CLK_SOURCE_XIO, 25, 0, TEGRA20_CLK_IDE), 820 + TEGRA_INIT_DATA_DIV16("dvc", mux_pllpcm_clkm, CLK_SOURCE_DVC, 47, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_DVC), 821 + TEGRA_INIT_DATA_DIV16("i2c1", mux_pllpcm_clkm, CLK_SOURCE_I2C1, 12, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2C1), 822 + TEGRA_INIT_DATA_DIV16("i2c2", mux_pllpcm_clkm, CLK_SOURCE_I2C2, 54, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2C2), 823 + TEGRA_INIT_DATA_DIV16("i2c3", mux_pllpcm_clkm, CLK_SOURCE_I2C3, 67, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2C3), 824 + TEGRA_INIT_DATA_MUX("hdmi", mux_pllpdc_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA20_CLK_HDMI), 825 + TEGRA_INIT_DATA("pwm", NULL, NULL, pwm_parents, CLK_SOURCE_PWM, 28, 3, 0, 0, 8, 1, 0, 17, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_PWM), 819 826 }; 820 827 821 828 static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = { 822 - TEGRA_INIT_DATA_NODIV("uarta", NULL, "tegra_uart.0", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 30, 2, 6, &periph_l_regs, TEGRA_PERIPH_ON_APB, uarta), 823 - TEGRA_INIT_DATA_NODIV("uartb", NULL, "tegra_uart.1", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 30, 2, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, uartb), 824 - TEGRA_INIT_DATA_NODIV("uartc", NULL, "tegra_uart.2", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 30, 2, 55, &periph_h_regs, TEGRA_PERIPH_ON_APB, uartc), 825 - TEGRA_INIT_DATA_NODIV("uartd", NULL, "tegra_uart.3", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 30, 2, 65, &periph_u_regs, TEGRA_PERIPH_ON_APB, uartd), 826 - TEGRA_INIT_DATA_NODIV("uarte", NULL, "tegra_uart.4", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 30, 2, 66, &periph_u_regs, TEGRA_PERIPH_ON_APB, uarte), 827 - TEGRA_INIT_DATA_NODIV("disp1", NULL, "tegradc.0", mux_pllpdc_clkm, CLK_SOURCE_DISP1, 30, 2, 27, &periph_l_regs, 0, disp1), 828 - TEGRA_INIT_DATA_NODIV("disp2", NULL, "tegradc.1", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, &periph_l_regs, 0, disp2), 829 + TEGRA_INIT_DATA_NODIV("uarta", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 30, 2, 6, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_UARTA), 830 + TEGRA_INIT_DATA_NODIV("uartb", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 30, 2, 7, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_UARTB), 831 + TEGRA_INIT_DATA_NODIV("uartc", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 30, 2, 55, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_UARTC), 832 + TEGRA_INIT_DATA_NODIV("uartd", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 30, 2, 65, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_UARTD), 833 + TEGRA_INIT_DATA_NODIV("uarte", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 30, 2, 66, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_UARTE), 834 + TEGRA_INIT_DATA_NODIV("disp1", mux_pllpdc_clkm, CLK_SOURCE_DISP1, 30, 2, 27, 0, TEGRA20_CLK_DISP1), 835 + TEGRA_INIT_DATA_NODIV("disp2", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, 0, TEGRA20_CLK_DISP2), 829 836 }; 830 837 831 838 static void __init tegra20_periph_clk_init(void) ··· 805 876 /* ac97 */ 806 877 clk = tegra_clk_register_periph_gate("ac97", "pll_a_out0", 807 878 TEGRA_PERIPH_ON_APB, 808 - clk_base, 0, 3, &periph_l_regs, 809 - periph_clk_enb_refcnt); 810 - clk_register_clkdev(clk, NULL, "tegra20-ac97"); 811 - clks[ac97] = clk; 879 + clk_base, 0, 3, periph_clk_enb_refcnt); 880 + clks[TEGRA20_CLK_AC97] = clk; 812 881 813 882 /* apbdma */ 814 883 clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base, 815 - 0, 34, &periph_h_regs, 816 - periph_clk_enb_refcnt); 817 - clk_register_clkdev(clk, NULL, "tegra-apbdma"); 818 - clks[apbdma] = clk; 819 - 820 - /* rtc */ 821 - clk = tegra_clk_register_periph_gate("rtc", "clk_32k", 822 - TEGRA_PERIPH_NO_RESET, 823 - clk_base, 0, 4, &periph_l_regs, 824 - periph_clk_enb_refcnt); 825 - clk_register_clkdev(clk, NULL, "rtc-tegra"); 826 - clks[rtc] = clk; 827 - 828 - /* timer */ 829 - clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base, 830 - 0, 5, &periph_l_regs, 831 - periph_clk_enb_refcnt); 832 - clk_register_clkdev(clk, NULL, "timer"); 833 - clks[timer] = clk; 834 - 835 - /* kbc */ 836 - clk = tegra_clk_register_periph_gate("kbc", "clk_32k", 837 - TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB, 838 - clk_base, 0, 36, &periph_h_regs, 839 - periph_clk_enb_refcnt); 840 - clk_register_clkdev(clk, NULL, "tegra-kbc"); 841 - clks[kbc] = clk; 842 - 843 - /* csus */ 844 - clk = tegra_clk_register_periph_gate("csus", "clk_m", 845 - TEGRA_PERIPH_NO_RESET, 846 - clk_base, 0, 92, &periph_u_regs, 847 - periph_clk_enb_refcnt); 848 - clk_register_clkdev(clk, "csus", "tengra_camera"); 849 - clks[csus] = clk; 850 - 851 - /* vcp */ 852 - clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0, 853 - clk_base, 0, 29, &periph_l_regs, 854 - periph_clk_enb_refcnt); 855 - clk_register_clkdev(clk, "vcp", "tegra-avp"); 856 - clks[vcp] = clk; 857 - 858 - /* bsea */ 859 - clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0, 860 - clk_base, 0, 62, &periph_h_regs, 861 - periph_clk_enb_refcnt); 862 - clk_register_clkdev(clk, "bsea", "tegra-avp"); 863 - clks[bsea] = clk; 864 - 865 - /* bsev */ 866 - clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0, 867 - clk_base, 0, 63, &periph_h_regs, 868 - periph_clk_enb_refcnt); 869 - clk_register_clkdev(clk, "bsev", "tegra-aes"); 870 - clks[bsev] = clk; 884 + 0, 34, periph_clk_enb_refcnt); 885 + clks[TEGRA20_CLK_APBDMA] = clk; 871 886 872 887 /* emc */ 873 888 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, ··· 820 947 clk_base + CLK_SOURCE_EMC, 821 948 30, 2, 0, NULL); 822 949 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, 823 - 57, &periph_h_regs, periph_clk_enb_refcnt); 824 - clk_register_clkdev(clk, "emc", NULL); 825 - clks[emc] = clk; 826 - 827 - /* usbd */ 828 - clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 0, 829 - 22, &periph_l_regs, periph_clk_enb_refcnt); 830 - clk_register_clkdev(clk, NULL, "fsl-tegra-udc"); 831 - clks[usbd] = clk; 832 - 833 - /* usb2 */ 834 - clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 0, 835 - 58, &periph_h_regs, periph_clk_enb_refcnt); 836 - clk_register_clkdev(clk, NULL, "tegra-ehci.1"); 837 - clks[usb2] = clk; 838 - 839 - /* usb3 */ 840 - clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 0, 841 - 59, &periph_h_regs, periph_clk_enb_refcnt); 842 - clk_register_clkdev(clk, NULL, "tegra-ehci.2"); 843 - clks[usb3] = clk; 950 + 57, periph_clk_enb_refcnt); 951 + clks[TEGRA20_CLK_EMC] = clk; 844 952 845 953 /* dsi */ 846 954 clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, 847 - 48, &periph_h_regs, periph_clk_enb_refcnt); 955 + 48, periph_clk_enb_refcnt); 848 956 clk_register_clkdev(clk, NULL, "dsi"); 849 - clks[dsi] = clk; 850 - 851 - /* csi */ 852 - clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base, 853 - 0, 52, &periph_h_regs, 854 - periph_clk_enb_refcnt); 855 - clk_register_clkdev(clk, "csi", "tegra_camera"); 856 - clks[csi] = clk; 857 - 858 - /* isp */ 859 - clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 23, 860 - &periph_l_regs, periph_clk_enb_refcnt); 861 - clk_register_clkdev(clk, "isp", "tegra_camera"); 862 - clks[isp] = clk; 957 + clks[TEGRA20_CLK_DSI] = clk; 863 958 864 959 /* pex */ 865 960 clk = tegra_clk_register_periph_gate("pex", "clk_m", 0, clk_base, 0, 70, 866 - &periph_u_regs, periph_clk_enb_refcnt); 867 - clk_register_clkdev(clk, "pex", NULL); 868 - clks[pex] = clk; 869 - 870 - /* afi */ 871 - clk = tegra_clk_register_periph_gate("afi", "clk_m", 0, clk_base, 0, 72, 872 - &periph_u_regs, periph_clk_enb_refcnt); 873 - clk_register_clkdev(clk, "afi", NULL); 874 - clks[afi] = clk; 961 + periph_clk_enb_refcnt); 962 + clks[TEGRA20_CLK_PEX] = clk; 875 963 876 964 /* pcie_xclk */ 877 965 clk = tegra_clk_register_periph_gate("pcie_xclk", "clk_m", 0, clk_base, 878 - 0, 74, &periph_u_regs, 879 - periph_clk_enb_refcnt); 880 - clk_register_clkdev(clk, "pcie_xclk", NULL); 881 - clks[pcie_xclk] = clk; 966 + 0, 74, periph_clk_enb_refcnt); 967 + clks[TEGRA20_CLK_PCIE_XCLK] = clk; 882 968 883 969 /* cdev1 */ 884 970 clk = clk_register_fixed_rate(NULL, "cdev1_fixed", NULL, CLK_IS_ROOT, 885 971 26000000); 886 972 clk = tegra_clk_register_periph_gate("cdev1", "cdev1_fixed", 0, 887 - clk_base, 0, 94, &periph_u_regs, 888 - periph_clk_enb_refcnt); 889 - clk_register_clkdev(clk, "cdev1", NULL); 890 - clks[cdev1] = clk; 973 + clk_base, 0, 94, periph_clk_enb_refcnt); 974 + clks[TEGRA20_CLK_CDEV1] = clk; 891 975 892 976 /* cdev2 */ 893 977 clk = clk_register_fixed_rate(NULL, "cdev2_fixed", NULL, CLK_IS_ROOT, 894 978 26000000); 895 979 clk = tegra_clk_register_periph_gate("cdev2", "cdev2_fixed", 0, 896 - clk_base, 0, 93, &periph_u_regs, 897 - periph_clk_enb_refcnt); 898 - clk_register_clkdev(clk, "cdev2", NULL); 899 - clks[cdev2] = clk; 980 + clk_base, 0, 93, periph_clk_enb_refcnt); 981 + clks[TEGRA20_CLK_CDEV2] = clk; 900 982 901 983 for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { 902 984 data = &tegra_periph_clk_list[i]; 903 - clk = tegra_clk_register_periph(data->name, data->parent_names, 985 + clk = tegra_clk_register_periph(data->name, data->p.parent_names, 904 986 data->num_parents, &data->periph, 905 987 clk_base, data->offset, data->flags); 906 - clk_register_clkdev(clk, data->con_id, data->dev_id); 907 988 clks[data->clk_id] = clk; 908 989 } 909 990 910 991 for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) { 911 992 data = &tegra_periph_nodiv_clk_list[i]; 912 993 clk = tegra_clk_register_periph_nodiv(data->name, 913 - data->parent_names, 994 + data->p.parent_names, 914 995 data->num_parents, &data->periph, 915 996 clk_base, data->offset); 916 - clk_register_clkdev(clk, data->con_id, data->dev_id); 917 997 clks[data->clk_id] = clk; 918 998 } 919 - } 920 999 921 - 922 - static void __init tegra20_fixed_clk_init(void) 923 - { 924 - struct clk *clk; 925 - 926 - /* clk_32k */ 927 - clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT, 928 - 32768); 929 - clk_register_clkdev(clk, "clk_32k", NULL); 930 - clks[clk_32k] = clk; 931 - } 932 - 933 - static void __init tegra20_pmc_clk_init(void) 934 - { 935 - struct clk *clk; 936 - 937 - /* blink */ 938 - writel_relaxed(0, pmc_base + PMC_BLINK_TIMER); 939 - clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0, 940 - pmc_base + PMC_DPD_PADS_ORIDE, 941 - PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL); 942 - clk = clk_register_gate(NULL, "blink", "blink_override", 0, 943 - pmc_base + PMC_CTRL, 944 - PMC_CTRL_BLINK_ENB, 0, NULL); 945 - clk_register_clkdev(clk, "blink", NULL); 946 - clks[blink] = clk; 1000 + tegra_periph_clk_init(clk_base, pmc_base, tegra20_clks, &pll_p_params); 947 1001 } 948 1002 949 1003 static void __init tegra20_osc_clk_init(void) ··· 884 1084 /* clk_m */ 885 1085 clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT | 886 1086 CLK_IGNORE_UNUSED, input_freq); 887 - clk_register_clkdev(clk, "clk_m", NULL); 888 - clks[clk_m] = clk; 1087 + clks[TEGRA20_CLK_CLK_M] = clk; 889 1088 890 1089 /* pll_ref */ 891 1090 pll_ref_div = tegra20_get_pll_ref_div(); 892 1091 clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m", 893 1092 CLK_SET_RATE_PARENT, 1, pll_ref_div); 894 - clk_register_clkdev(clk, "pll_ref", NULL); 895 - clks[pll_ref] = clk; 1093 + clks[TEGRA20_CLK_PLL_REF] = clk; 896 1094 } 897 1095 898 1096 /* Tegra20 CPU clock and reset control functions */ ··· 1024 1226 }; 1025 1227 1026 1228 static struct tegra_clk_init_table init_table[] __initdata = { 1027 - {pll_p, clk_max, 216000000, 1}, 1028 - {pll_p_out1, clk_max, 28800000, 1}, 1029 - {pll_p_out2, clk_max, 48000000, 1}, 1030 - {pll_p_out3, clk_max, 72000000, 1}, 1031 - {pll_p_out4, clk_max, 24000000, 1}, 1032 - {pll_c, clk_max, 600000000, 1}, 1033 - {pll_c_out1, clk_max, 120000000, 1}, 1034 - {sclk, pll_c_out1, 0, 1}, 1035 - {hclk, clk_max, 0, 1}, 1036 - {pclk, clk_max, 60000000, 1}, 1037 - {csite, clk_max, 0, 1}, 1038 - {emc, clk_max, 0, 1}, 1039 - {cclk, clk_max, 0, 1}, 1040 - {uarta, pll_p, 0, 0}, 1041 - {uartb, pll_p, 0, 0}, 1042 - {uartc, pll_p, 0, 0}, 1043 - {uartd, pll_p, 0, 0}, 1044 - {uarte, pll_p, 0, 0}, 1045 - {pll_a, clk_max, 56448000, 1}, 1046 - {pll_a_out0, clk_max, 11289600, 1}, 1047 - {cdev1, clk_max, 0, 1}, 1048 - {blink, clk_max, 32768, 1}, 1049 - {i2s1, pll_a_out0, 11289600, 0}, 1050 - {i2s2, pll_a_out0, 11289600, 0}, 1051 - {sdmmc1, pll_p, 48000000, 0}, 1052 - {sdmmc3, pll_p, 48000000, 0}, 1053 - {sdmmc4, pll_p, 48000000, 0}, 1054 - {spi, pll_p, 20000000, 0}, 1055 - {sbc1, pll_p, 100000000, 0}, 1056 - {sbc2, pll_p, 100000000, 0}, 1057 - {sbc3, pll_p, 100000000, 0}, 1058 - {sbc4, pll_p, 100000000, 0}, 1059 - {host1x, pll_c, 150000000, 0}, 1060 - {disp1, pll_p, 600000000, 0}, 1061 - {disp2, pll_p, 600000000, 0}, 1062 - {gr2d, pll_c, 300000000, 0}, 1063 - {gr3d, pll_c, 300000000, 0}, 1064 - {clk_max, clk_max, 0, 0}, /* This MUST be the last entry */ 1229 + {TEGRA20_CLK_PLL_P, TEGRA20_CLK_CLK_MAX, 216000000, 1}, 1230 + {TEGRA20_CLK_PLL_P_OUT1, TEGRA20_CLK_CLK_MAX, 28800000, 1}, 1231 + {TEGRA20_CLK_PLL_P_OUT2, TEGRA20_CLK_CLK_MAX, 48000000, 1}, 1232 + {TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1}, 1233 + {TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1}, 1234 + {TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 1}, 1235 + {TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 1}, 1236 + {TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 0, 1}, 1237 + {TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 0, 1}, 1238 + {TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 1}, 1239 + {TEGRA20_CLK_CSITE, TEGRA20_CLK_CLK_MAX, 0, 1}, 1240 + {TEGRA20_CLK_EMC, TEGRA20_CLK_CLK_MAX, 0, 1}, 1241 + {TEGRA20_CLK_CCLK, TEGRA20_CLK_CLK_MAX, 0, 1}, 1242 + {TEGRA20_CLK_UARTA, TEGRA20_CLK_PLL_P, 0, 0}, 1243 + {TEGRA20_CLK_UARTB, TEGRA20_CLK_PLL_P, 0, 0}, 1244 + {TEGRA20_CLK_UARTC, TEGRA20_CLK_PLL_P, 0, 0}, 1245 + {TEGRA20_CLK_UARTD, TEGRA20_CLK_PLL_P, 0, 0}, 1246 + {TEGRA20_CLK_UARTE, TEGRA20_CLK_PLL_P, 0, 0}, 1247 + {TEGRA20_CLK_PLL_A, TEGRA20_CLK_CLK_MAX, 56448000, 1}, 1248 + {TEGRA20_CLK_PLL_A_OUT0, TEGRA20_CLK_CLK_MAX, 11289600, 1}, 1249 + {TEGRA20_CLK_CDEV1, TEGRA20_CLK_CLK_MAX, 0, 1}, 1250 + {TEGRA20_CLK_BLINK, TEGRA20_CLK_CLK_MAX, 32768, 1}, 1251 + {TEGRA20_CLK_I2S1, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0}, 1252 + {TEGRA20_CLK_I2S2, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0}, 1253 + {TEGRA20_CLK_SDMMC1, TEGRA20_CLK_PLL_P, 48000000, 0}, 1254 + {TEGRA20_CLK_SDMMC3, TEGRA20_CLK_PLL_P, 48000000, 0}, 1255 + {TEGRA20_CLK_SDMMC4, TEGRA20_CLK_PLL_P, 48000000, 0}, 1256 + {TEGRA20_CLK_SPI, TEGRA20_CLK_PLL_P, 20000000, 0}, 1257 + {TEGRA20_CLK_SBC1, TEGRA20_CLK_PLL_P, 100000000, 0}, 1258 + {TEGRA20_CLK_SBC2, TEGRA20_CLK_PLL_P, 100000000, 0}, 1259 + {TEGRA20_CLK_SBC3, TEGRA20_CLK_PLL_P, 100000000, 0}, 1260 + {TEGRA20_CLK_SBC4, TEGRA20_CLK_PLL_P, 100000000, 0}, 1261 + {TEGRA20_CLK_HOST1X, TEGRA20_CLK_PLL_C, 150000000, 0}, 1262 + {TEGRA20_CLK_DISP1, TEGRA20_CLK_PLL_P, 600000000, 0}, 1263 + {TEGRA20_CLK_DISP2, TEGRA20_CLK_PLL_P, 600000000, 0}, 1264 + {TEGRA20_CLK_GR2D, TEGRA20_CLK_PLL_C, 300000000, 0}, 1265 + {TEGRA20_CLK_GR3D, TEGRA20_CLK_PLL_C, 300000000, 0}, 1266 + {TEGRA20_CLK_CLK_MAX, TEGRA20_CLK_CLK_MAX, 0, 0}, /* This MUST be the last entry */ 1065 1267 }; 1066 1268 1067 1269 static void __init tegra20_clock_apply_init_table(void) 1068 1270 { 1069 - tegra_init_from_table(init_table, clks, clk_max); 1271 + tegra_init_from_table(init_table, clks, TEGRA20_CLK_CLK_MAX); 1070 1272 } 1071 1273 1072 1274 /* ··· 1075 1277 * table under two names. 1076 1278 */ 1077 1279 static struct tegra_clk_duplicate tegra_clk_duplicates[] = { 1078 - TEGRA_CLK_DUPLICATE(usbd, "utmip-pad", NULL), 1079 - TEGRA_CLK_DUPLICATE(usbd, "tegra-ehci.0", NULL), 1080 - TEGRA_CLK_DUPLICATE(usbd, "tegra-otg", NULL), 1081 - TEGRA_CLK_DUPLICATE(cclk, NULL, "cpu"), 1082 - TEGRA_CLK_DUPLICATE(clk_max, NULL, NULL), /* Must be the last entry */ 1280 + TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "utmip-pad", NULL), 1281 + TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-ehci.0", NULL), 1282 + TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-otg", NULL), 1283 + TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CCLK, NULL, "cpu"), 1284 + TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CLK_MAX, NULL, NULL), /* Must be the last entry */ 1083 1285 }; 1084 1286 1085 1287 static const struct of_device_id pmc_match[] __initconst = { ··· 1089 1291 1090 1292 static void __init tegra20_clock_init(struct device_node *np) 1091 1293 { 1092 - int i; 1093 1294 struct device_node *node; 1094 1295 1095 1296 clk_base = of_iomap(np, 0); ··· 1109 1312 BUG(); 1110 1313 } 1111 1314 1315 + clks = tegra_clk_init(TEGRA20_CLK_CLK_MAX, TEGRA20_CLK_PERIPH_BANKS); 1316 + if (!clks) 1317 + return; 1318 + 1112 1319 tegra20_osc_clk_init(); 1113 - tegra20_pmc_clk_init(); 1114 - tegra20_fixed_clk_init(); 1320 + tegra_fixed_clk_init(tegra20_clks); 1115 1321 tegra20_pll_init(); 1116 1322 tegra20_super_clk_init(); 1323 + tegra_super_clk_gen4_init(clk_base, pmc_base, tegra20_clks, NULL); 1117 1324 tegra20_periph_clk_init(); 1118 1325 tegra20_audio_clk_init(); 1326 + tegra_pmc_clk_init(pmc_base, tegra20_clks); 1119 1327 1328 + tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA20_CLK_CLK_MAX); 1120 1329 1121 - for (i = 0; i < ARRAY_SIZE(clks); i++) { 1122 - if (IS_ERR(clks[i])) { 1123 - pr_err("Tegra20 clk %d: register failed with %ld\n", 1124 - i, PTR_ERR(clks[i])); 1125 - BUG(); 1126 - } 1127 - if (!clks[i]) 1128 - clks[i] = ERR_PTR(-EINVAL); 1129 - } 1130 - 1131 - tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max); 1132 - 1133 - clk_data.clks = clks; 1134 - clk_data.clk_num = ARRAY_SIZE(clks); 1135 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 1330 + tegra_add_of_provider(np); 1331 + tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1136 1332 1137 1333 tegra_clk_apply_init_table = tegra20_clock_apply_init_table; 1138 1334
+461 -1043
drivers/clk/tegra/clk-tegra30.c
··· 23 23 #include <linux/of_address.h> 24 24 #include <linux/clk/tegra.h> 25 25 #include <linux/tegra-powergate.h> 26 - 26 + #include <dt-bindings/clock/tegra30-car.h> 27 27 #include "clk.h" 28 - 29 - #define RST_DEVICES_L 0x004 30 - #define RST_DEVICES_H 0x008 31 - #define RST_DEVICES_U 0x00c 32 - #define RST_DEVICES_V 0x358 33 - #define RST_DEVICES_W 0x35c 34 - #define RST_DEVICES_SET_L 0x300 35 - #define RST_DEVICES_CLR_L 0x304 36 - #define RST_DEVICES_SET_H 0x308 37 - #define RST_DEVICES_CLR_H 0x30c 38 - #define RST_DEVICES_SET_U 0x310 39 - #define RST_DEVICES_CLR_U 0x314 40 - #define RST_DEVICES_SET_V 0x430 41 - #define RST_DEVICES_CLR_V 0x434 42 - #define RST_DEVICES_SET_W 0x438 43 - #define RST_DEVICES_CLR_W 0x43c 44 - #define RST_DEVICES_NUM 5 45 - 46 - #define CLK_OUT_ENB_L 0x010 47 - #define CLK_OUT_ENB_H 0x014 48 - #define CLK_OUT_ENB_U 0x018 49 - #define CLK_OUT_ENB_V 0x360 50 - #define CLK_OUT_ENB_W 0x364 51 - #define CLK_OUT_ENB_SET_L 0x320 52 - #define CLK_OUT_ENB_CLR_L 0x324 53 - #define CLK_OUT_ENB_SET_H 0x328 54 - #define CLK_OUT_ENB_CLR_H 0x32c 55 - #define CLK_OUT_ENB_SET_U 0x330 56 - #define CLK_OUT_ENB_CLR_U 0x334 57 - #define CLK_OUT_ENB_SET_V 0x440 58 - #define CLK_OUT_ENB_CLR_V 0x444 59 - #define CLK_OUT_ENB_SET_W 0x448 60 - #define CLK_OUT_ENB_CLR_W 0x44c 61 - #define CLK_OUT_ENB_NUM 5 28 + #include "clk-id.h" 62 29 63 30 #define OSC_CTRL 0x50 64 31 #define OSC_CTRL_OSC_FREQ_MASK (0xF<<28) ··· 58 91 #define SUPER_SCLK_DIVIDER 0x02c 59 92 60 93 #define SYSTEM_CLK_RATE 0x030 94 + 95 + #define TEGRA30_CLK_PERIPH_BANKS 5 61 96 62 97 #define PLLC_BASE 0x80 63 98 #define PLLC_MISC 0x8c ··· 101 132 #define AUDIO_SYNC_CLK_I2S4 0x4b0 102 133 #define AUDIO_SYNC_CLK_SPDIF 0x4b4 103 134 104 - #define PMC_CLK_OUT_CNTRL 0x1a8 105 - 106 - #define CLK_SOURCE_I2S0 0x1d8 107 - #define CLK_SOURCE_I2S1 0x100 108 - #define CLK_SOURCE_I2S2 0x104 109 - #define CLK_SOURCE_I2S3 0x3bc 110 - #define CLK_SOURCE_I2S4 0x3c0 111 135 #define CLK_SOURCE_SPDIF_OUT 0x108 112 - #define CLK_SOURCE_SPDIF_IN 0x10c 113 136 #define CLK_SOURCE_PWM 0x110 114 137 #define CLK_SOURCE_D_AUDIO 0x3d0 115 138 #define CLK_SOURCE_DAM0 0x3d8 116 139 #define CLK_SOURCE_DAM1 0x3dc 117 140 #define CLK_SOURCE_DAM2 0x3e0 118 - #define CLK_SOURCE_HDA 0x428 119 - #define CLK_SOURCE_HDA2CODEC_2X 0x3e4 120 - #define CLK_SOURCE_SBC1 0x134 121 - #define CLK_SOURCE_SBC2 0x118 122 - #define CLK_SOURCE_SBC3 0x11c 123 - #define CLK_SOURCE_SBC4 0x1b4 124 - #define CLK_SOURCE_SBC5 0x3c8 125 - #define CLK_SOURCE_SBC6 0x3cc 126 - #define CLK_SOURCE_SATA_OOB 0x420 127 - #define CLK_SOURCE_SATA 0x424 128 - #define CLK_SOURCE_NDFLASH 0x160 129 - #define CLK_SOURCE_NDSPEED 0x3f8 130 - #define CLK_SOURCE_VFIR 0x168 131 - #define CLK_SOURCE_SDMMC1 0x150 132 - #define CLK_SOURCE_SDMMC2 0x154 133 - #define CLK_SOURCE_SDMMC3 0x1bc 134 - #define CLK_SOURCE_SDMMC4 0x164 135 - #define CLK_SOURCE_VDE 0x1c8 136 - #define CLK_SOURCE_CSITE 0x1d4 137 - #define CLK_SOURCE_LA 0x1f8 138 - #define CLK_SOURCE_OWR 0x1cc 139 - #define CLK_SOURCE_NOR 0x1d0 140 - #define CLK_SOURCE_MIPI 0x174 141 - #define CLK_SOURCE_I2C1 0x124 142 - #define CLK_SOURCE_I2C2 0x198 143 - #define CLK_SOURCE_I2C3 0x1b8 144 - #define CLK_SOURCE_I2C4 0x3c4 145 - #define CLK_SOURCE_I2C5 0x128 146 - #define CLK_SOURCE_UARTA 0x178 147 - #define CLK_SOURCE_UARTB 0x17c 148 - #define CLK_SOURCE_UARTC 0x1a0 149 - #define CLK_SOURCE_UARTD 0x1c0 150 - #define CLK_SOURCE_UARTE 0x1c4 151 - #define CLK_SOURCE_VI 0x148 152 - #define CLK_SOURCE_VI_SENSOR 0x1a8 153 - #define CLK_SOURCE_3D 0x158 154 141 #define CLK_SOURCE_3D2 0x3b0 155 142 #define CLK_SOURCE_2D 0x15c 156 - #define CLK_SOURCE_EPP 0x16c 157 - #define CLK_SOURCE_MPE 0x170 158 - #define CLK_SOURCE_HOST1X 0x180 159 - #define CLK_SOURCE_CVE 0x140 160 - #define CLK_SOURCE_TVO 0x188 161 - #define CLK_SOURCE_DTV 0x1dc 162 143 #define CLK_SOURCE_HDMI 0x18c 163 - #define CLK_SOURCE_TVDAC 0x194 164 - #define CLK_SOURCE_DISP1 0x138 165 - #define CLK_SOURCE_DISP2 0x13c 166 144 #define CLK_SOURCE_DSIB 0xd0 167 - #define CLK_SOURCE_TSENSOR 0x3b8 168 - #define CLK_SOURCE_ACTMON 0x3e8 169 - #define CLK_SOURCE_EXTERN1 0x3ec 170 - #define CLK_SOURCE_EXTERN2 0x3f0 171 - #define CLK_SOURCE_EXTERN3 0x3f4 172 - #define CLK_SOURCE_I2CSLOW 0x3fc 173 145 #define CLK_SOURCE_SE 0x42c 174 - #define CLK_SOURCE_MSELECT 0x3b4 175 146 #define CLK_SOURCE_EMC 0x19c 176 147 177 148 #define AUDIO_SYNC_DOUBLER 0x49c 178 - 179 - #define PMC_CTRL 0 180 - #define PMC_CTRL_BLINK_ENB 7 181 - 182 - #define PMC_DPD_PADS_ORIDE 0x1c 183 - #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20 184 - #define PMC_BLINK_TIMER 0x40 185 149 186 150 #define UTMIP_PLL_CFG2 0x488 187 151 #define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6) ··· 168 266 } tegra30_cpu_clk_sctx; 169 267 #endif 170 268 171 - static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32]; 172 - 173 269 static void __iomem *clk_base; 174 270 static void __iomem *pmc_base; 175 271 static unsigned long input_freq; 176 272 177 - static DEFINE_SPINLOCK(clk_doubler_lock); 178 - static DEFINE_SPINLOCK(clk_out_lock); 179 - static DEFINE_SPINLOCK(pll_div_lock); 180 273 static DEFINE_SPINLOCK(cml_lock); 181 274 static DEFINE_SPINLOCK(pll_d_lock); 182 - static DEFINE_SPINLOCK(sysrate_lock); 183 275 184 - #define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \ 185 - _clk_num, _regs, _gate_flags, _clk_id) \ 186 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 187 - 30, 2, 0, 0, 8, 1, 0, _regs, _clk_num, \ 188 - periph_clk_enb_refcnt, _gate_flags, _clk_id) 276 + #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 277 + _clk_num, _gate_flags, _clk_id) \ 278 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 279 + 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \ 280 + _clk_num, _gate_flags, _clk_id) 189 281 190 - #define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \ 191 - _clk_num, _regs, _gate_flags, _clk_id) \ 192 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 193 - 30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, \ 194 - _regs, _clk_num, periph_clk_enb_refcnt, \ 282 + #define TEGRA_INIT_DATA_MUX8(_name, _parents, _offset, \ 283 + _clk_num, _gate_flags, _clk_id) \ 284 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 285 + 29, 3, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \ 286 + _clk_num, _gate_flags, _clk_id) 287 + 288 + #define TEGRA_INIT_DATA_INT(_name, _parents, _offset, \ 289 + _clk_num, _gate_flags, _clk_id) \ 290 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 291 + 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT | \ 292 + TEGRA_DIVIDER_ROUND_UP, _clk_num, \ 195 293 _gate_flags, _clk_id) 196 294 197 - #define TEGRA_INIT_DATA_MUX8(_name, _con_id, _dev_id, _parents, _offset, \ 198 - _clk_num, _regs, _gate_flags, _clk_id) \ 199 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 200 - 29, 3, 0, 0, 8, 1, 0, _regs, _clk_num, \ 201 - periph_clk_enb_refcnt, _gate_flags, _clk_id) 202 - 203 - #define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \ 204 - _clk_num, _regs, _gate_flags, _clk_id) \ 205 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 206 - 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \ 207 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 208 - _clk_id) 209 - 210 - #define TEGRA_INIT_DATA_UART(_name, _con_id, _dev_id, _parents, _offset,\ 211 - _clk_num, _regs, _clk_id) \ 212 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 213 - 30, 2, 0, 0, 16, 1, TEGRA_DIVIDER_UART, _regs, \ 214 - _clk_num, periph_clk_enb_refcnt, 0, _clk_id) 215 - 216 - #define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \ 217 - _mux_shift, _mux_width, _clk_num, _regs, \ 295 + #define TEGRA_INIT_DATA_NODIV(_name, _parents, _offset, \ 296 + _mux_shift, _mux_width, _clk_num, \ 218 297 _gate_flags, _clk_id) \ 219 - TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \ 220 - _mux_shift, _mux_width, 0, 0, 0, 0, 0, _regs, \ 221 - _clk_num, periph_clk_enb_refcnt, _gate_flags, \ 298 + TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ 299 + _mux_shift, _mux_width, 0, 0, 0, 0, 0,\ 300 + _clk_num, _gate_flags, \ 222 301 _clk_id) 223 302 224 - /* 225 - * IDs assigned here must be in sync with DT bindings definition 226 - * for Tegra30 clocks. 227 - */ 228 - enum tegra30_clk { 229 - cpu, rtc = 4, timer, uarta, gpio = 8, sdmmc2, i2s1 = 11, i2c1, ndflash, 230 - sdmmc1, sdmmc4, pwm = 17, i2s2, epp, gr2d = 21, usbd, isp, gr3d, 231 - disp2 = 26, disp1, host1x, vcp, i2s0, cop_cache, mc, ahbdma, apbdma, 232 - kbc = 36, statmon, pmc, kfuse = 40, sbc1, nor, sbc2 = 44, sbc3 = 46, 233 - i2c5, dsia, mipi = 50, hdmi, csi, tvdac, i2c2, uartc, emc = 57, usb2, 234 - usb3, mpe, vde, bsea, bsev, speedo, uartd, uarte, i2c3, sbc4, sdmmc3, 235 - pcie, owr, afi, csite, pciex, avpucq, la, dtv = 79, ndspeed, i2cslow, 236 - dsib, irama = 84, iramb, iramc, iramd, cram2, audio_2x = 90, csus = 92, 237 - cdev2, cdev1, cpu_g = 96, cpu_lp, gr3d2, mselect, tsensor, i2s3, i2s4, 238 - i2c4, sbc5, sbc6, d_audio, apbif, dam0, dam1, dam2, hda2codec_2x, 239 - atomics, audio0_2x, audio1_2x, audio2_2x, audio3_2x, audio4_2x, 240 - spdif_2x, actmon, extern1, extern2, extern3, sata_oob, sata, hda, 241 - se = 127, hda2hdmi, sata_cold, uartb = 160, vfir, spdif_in, spdif_out, 242 - vi, vi_sensor, fuse, fuse_burn, cve, tvo, clk_32k, clk_m, clk_m_div2, 243 - clk_m_div4, pll_ref, pll_c, pll_c_out1, pll_m, pll_m_out1, pll_p, 244 - pll_p_out1, pll_p_out2, pll_p_out3, pll_p_out4, pll_a, pll_a_out0, 245 - pll_d, pll_d_out0, pll_d2, pll_d2_out0, pll_u, pll_x, pll_x_out0, pll_e, 246 - spdif_in_sync, i2s0_sync, i2s1_sync, i2s2_sync, i2s3_sync, i2s4_sync, 247 - vimclk_sync, audio0, audio1, audio2, audio3, audio4, spdif, clk_out_1, 248 - clk_out_2, clk_out_3, sclk, blink, cclk_g, cclk_lp, twd, cml0, cml1, 249 - hclk, pclk, clk_out_1_mux = 300, clk_max 250 - }; 251 - 252 - static struct clk *clks[clk_max]; 253 - static struct clk_onecell_data clk_data; 303 + static struct clk **clks; 254 304 255 305 /* 256 306 * Structure defining the fields for USB UTMI clocks Parameters. ··· 418 564 .lock_mask = PLL_BASE_LOCK, 419 565 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 420 566 .lock_delay = 300, 567 + .freq_table = pll_c_freq_table, 568 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 421 569 }; 422 570 423 571 static struct div_nmp pllm_nmp = { ··· 449 593 .div_nmp = &pllm_nmp, 450 594 .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, 451 595 .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE, 596 + .freq_table = pll_m_freq_table, 597 + .flags = TEGRA_PLLM | TEGRA_PLL_HAS_CPCON | 598 + TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, 452 599 }; 453 600 454 601 static struct tegra_clk_pll_params pll_p_params = { ··· 466 607 .lock_mask = PLL_BASE_LOCK, 467 608 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 468 609 .lock_delay = 300, 610 + .freq_table = pll_p_freq_table, 611 + .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 612 + .fixed_rate = 408000000, 469 613 }; 470 614 471 615 static struct tegra_clk_pll_params pll_a_params = { ··· 483 621 .lock_mask = PLL_BASE_LOCK, 484 622 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 485 623 .lock_delay = 300, 624 + .freq_table = pll_a_freq_table, 625 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 486 626 }; 487 627 488 628 static struct tegra_clk_pll_params pll_d_params = { ··· 499 635 .lock_mask = PLL_BASE_LOCK, 500 636 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 501 637 .lock_delay = 1000, 638 + .freq_table = pll_d_freq_table, 639 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 640 + TEGRA_PLL_USE_LOCK, 641 + 502 642 }; 503 643 504 644 static struct tegra_clk_pll_params pll_d2_params = { ··· 517 649 .lock_mask = PLL_BASE_LOCK, 518 650 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 519 651 .lock_delay = 1000, 652 + .freq_table = pll_d_freq_table, 653 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | 654 + TEGRA_PLL_USE_LOCK, 520 655 }; 521 656 522 657 static struct tegra_clk_pll_params pll_u_params = { ··· 535 664 .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, 536 665 .lock_delay = 1000, 537 666 .pdiv_tohw = pllu_p, 667 + .freq_table = pll_u_freq_table, 668 + .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON, 538 669 }; 539 670 540 671 static struct tegra_clk_pll_params pll_x_params = { ··· 551 678 .lock_mask = PLL_BASE_LOCK, 552 679 .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, 553 680 .lock_delay = 300, 681 + .freq_table = pll_x_freq_table, 682 + .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_DCCON | 683 + TEGRA_PLL_USE_LOCK, 554 684 }; 555 685 556 686 static struct tegra_clk_pll_params pll_e_params = { ··· 568 692 .lock_mask = PLLE_MISC_LOCK, 569 693 .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, 570 694 .lock_delay = 300, 695 + .freq_table = pll_e_freq_table, 696 + .flags = TEGRA_PLLE_CONFIGURE | TEGRA_PLL_FIXED, 697 + .fixed_rate = 100000000, 571 698 }; 572 699 573 - /* Peripheral clock registers */ 574 - static struct tegra_clk_periph_regs periph_l_regs = { 575 - .enb_reg = CLK_OUT_ENB_L, 576 - .enb_set_reg = CLK_OUT_ENB_SET_L, 577 - .enb_clr_reg = CLK_OUT_ENB_CLR_L, 578 - .rst_reg = RST_DEVICES_L, 579 - .rst_set_reg = RST_DEVICES_SET_L, 580 - .rst_clr_reg = RST_DEVICES_CLR_L, 700 + static unsigned long tegra30_input_freq[] = { 701 + [0] = 13000000, 702 + [1] = 16800000, 703 + [4] = 19200000, 704 + [5] = 38400000, 705 + [8] = 12000000, 706 + [9] = 48000000, 707 + [12] = 260000000, 581 708 }; 582 709 583 - static struct tegra_clk_periph_regs periph_h_regs = { 584 - .enb_reg = CLK_OUT_ENB_H, 585 - .enb_set_reg = CLK_OUT_ENB_SET_H, 586 - .enb_clr_reg = CLK_OUT_ENB_CLR_H, 587 - .rst_reg = RST_DEVICES_H, 588 - .rst_set_reg = RST_DEVICES_SET_H, 589 - .rst_clr_reg = RST_DEVICES_CLR_H, 710 + static struct tegra_devclk devclks[] __initdata = { 711 + { .con_id = "pll_c", .dt_id = TEGRA30_CLK_PLL_C }, 712 + { .con_id = "pll_c_out1", .dt_id = TEGRA30_CLK_PLL_C_OUT1 }, 713 + { .con_id = "pll_p", .dt_id = TEGRA30_CLK_PLL_P }, 714 + { .con_id = "pll_p_out1", .dt_id = TEGRA30_CLK_PLL_P_OUT1 }, 715 + { .con_id = "pll_p_out2", .dt_id = TEGRA30_CLK_PLL_P_OUT2 }, 716 + { .con_id = "pll_p_out3", .dt_id = TEGRA30_CLK_PLL_P_OUT3 }, 717 + { .con_id = "pll_p_out4", .dt_id = TEGRA30_CLK_PLL_P_OUT4 }, 718 + { .con_id = "pll_m", .dt_id = TEGRA30_CLK_PLL_M }, 719 + { .con_id = "pll_m_out1", .dt_id = TEGRA30_CLK_PLL_M_OUT1 }, 720 + { .con_id = "pll_x", .dt_id = TEGRA30_CLK_PLL_X }, 721 + { .con_id = "pll_x_out0", .dt_id = TEGRA30_CLK_PLL_X_OUT0 }, 722 + { .con_id = "pll_u", .dt_id = TEGRA30_CLK_PLL_U }, 723 + { .con_id = "pll_d", .dt_id = TEGRA30_CLK_PLL_D }, 724 + { .con_id = "pll_d_out0", .dt_id = TEGRA30_CLK_PLL_D_OUT0 }, 725 + { .con_id = "pll_d2", .dt_id = TEGRA30_CLK_PLL_D2 }, 726 + { .con_id = "pll_d2_out0", .dt_id = TEGRA30_CLK_PLL_D2_OUT0 }, 727 + { .con_id = "pll_a", .dt_id = TEGRA30_CLK_PLL_A }, 728 + { .con_id = "pll_a_out0", .dt_id = TEGRA30_CLK_PLL_A_OUT0 }, 729 + { .con_id = "pll_e", .dt_id = TEGRA30_CLK_PLL_E }, 730 + { .con_id = "spdif_in_sync", .dt_id = TEGRA30_CLK_SPDIF_IN_SYNC }, 731 + { .con_id = "i2s0_sync", .dt_id = TEGRA30_CLK_I2S0_SYNC }, 732 + { .con_id = "i2s1_sync", .dt_id = TEGRA30_CLK_I2S1_SYNC }, 733 + { .con_id = "i2s2_sync", .dt_id = TEGRA30_CLK_I2S2_SYNC }, 734 + { .con_id = "i2s3_sync", .dt_id = TEGRA30_CLK_I2S3_SYNC }, 735 + { .con_id = "i2s4_sync", .dt_id = TEGRA30_CLK_I2S4_SYNC }, 736 + { .con_id = "vimclk_sync", .dt_id = TEGRA30_CLK_VIMCLK_SYNC }, 737 + { .con_id = "audio0", .dt_id = TEGRA30_CLK_AUDIO0 }, 738 + { .con_id = "audio1", .dt_id = TEGRA30_CLK_AUDIO1 }, 739 + { .con_id = "audio2", .dt_id = TEGRA30_CLK_AUDIO2 }, 740 + { .con_id = "audio3", .dt_id = TEGRA30_CLK_AUDIO3 }, 741 + { .con_id = "audio4", .dt_id = TEGRA30_CLK_AUDIO4 }, 742 + { .con_id = "spdif", .dt_id = TEGRA30_CLK_SPDIF }, 743 + { .con_id = "audio0_2x", .dt_id = TEGRA30_CLK_AUDIO0_2X }, 744 + { .con_id = "audio1_2x", .dt_id = TEGRA30_CLK_AUDIO1_2X }, 745 + { .con_id = "audio2_2x", .dt_id = TEGRA30_CLK_AUDIO2_2X }, 746 + { .con_id = "audio3_2x", .dt_id = TEGRA30_CLK_AUDIO3_2X }, 747 + { .con_id = "audio4_2x", .dt_id = TEGRA30_CLK_AUDIO4_2X }, 748 + { .con_id = "spdif_2x", .dt_id = TEGRA30_CLK_SPDIF_2X }, 749 + { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA30_CLK_EXTERN1 }, 750 + { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA30_CLK_EXTERN2 }, 751 + { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA30_CLK_EXTERN3 }, 752 + { .con_id = "blink", .dt_id = TEGRA30_CLK_BLINK }, 753 + { .con_id = "cclk_g", .dt_id = TEGRA30_CLK_CCLK_G }, 754 + { .con_id = "cclk_lp", .dt_id = TEGRA30_CLK_CCLK_LP }, 755 + { .con_id = "sclk", .dt_id = TEGRA30_CLK_SCLK }, 756 + { .con_id = "hclk", .dt_id = TEGRA30_CLK_HCLK }, 757 + { .con_id = "pclk", .dt_id = TEGRA30_CLK_PCLK }, 758 + { .con_id = "twd", .dt_id = TEGRA30_CLK_TWD }, 759 + { .con_id = "emc", .dt_id = TEGRA30_CLK_EMC }, 760 + { .con_id = "clk_32k", .dt_id = TEGRA30_CLK_CLK_32K }, 761 + { .con_id = "clk_m_div2", .dt_id = TEGRA30_CLK_CLK_M_DIV2 }, 762 + { .con_id = "clk_m_div4", .dt_id = TEGRA30_CLK_CLK_M_DIV4 }, 763 + { .con_id = "cml0", .dt_id = TEGRA30_CLK_CML0 }, 764 + { .con_id = "cml1", .dt_id = TEGRA30_CLK_CML1 }, 765 + { .con_id = "clk_m", .dt_id = TEGRA30_CLK_CLK_M }, 766 + { .con_id = "pll_ref", .dt_id = TEGRA30_CLK_PLL_REF }, 767 + { .con_id = "csus", .dev_id = "tengra_camera", .dt_id = TEGRA30_CLK_CSUS }, 768 + { .con_id = "vcp", .dev_id = "tegra-avp", .dt_id = TEGRA30_CLK_VCP }, 769 + { .con_id = "bsea", .dev_id = "tegra-avp", .dt_id = TEGRA30_CLK_BSEA }, 770 + { .con_id = "bsev", .dev_id = "tegra-aes", .dt_id = TEGRA30_CLK_BSEV }, 771 + { .con_id = "dsia", .dev_id = "tegradc.0", .dt_id = TEGRA30_CLK_DSIA }, 772 + { .con_id = "csi", .dev_id = "tegra_camera", .dt_id = TEGRA30_CLK_CSI }, 773 + { .con_id = "isp", .dev_id = "tegra_camera", .dt_id = TEGRA30_CLK_ISP }, 774 + { .con_id = "pcie", .dev_id = "tegra-pcie", .dt_id = TEGRA30_CLK_PCIE }, 775 + { .con_id = "afi", .dev_id = "tegra-pcie", .dt_id = TEGRA30_CLK_AFI }, 776 + { .con_id = "pciex", .dev_id = "tegra-pcie", .dt_id = TEGRA30_CLK_PCIEX }, 777 + { .con_id = "fuse", .dt_id = TEGRA30_CLK_FUSE }, 778 + { .con_id = "fuse_burn", .dev_id = "fuse-tegra", .dt_id = TEGRA30_CLK_FUSE_BURN }, 779 + { .con_id = "apbif", .dev_id = "tegra30-ahub", .dt_id = TEGRA30_CLK_APBIF }, 780 + { .con_id = "hda2hdmi", .dev_id = "tegra30-hda", .dt_id = TEGRA30_CLK_HDA2HDMI }, 781 + { .dev_id = "tegra-apbdma", .dt_id = TEGRA30_CLK_APBDMA }, 782 + { .dev_id = "rtc-tegra", .dt_id = TEGRA30_CLK_RTC }, 783 + { .dev_id = "timer", .dt_id = TEGRA30_CLK_TIMER }, 784 + { .dev_id = "tegra-kbc", .dt_id = TEGRA30_CLK_KBC }, 785 + { .dev_id = "fsl-tegra-udc", .dt_id = TEGRA30_CLK_USBD }, 786 + { .dev_id = "tegra-ehci.1", .dt_id = TEGRA30_CLK_USB2 }, 787 + { .dev_id = "tegra-ehci.2", .dt_id = TEGRA30_CLK_USB2 }, 788 + { .dev_id = "kfuse-tegra", .dt_id = TEGRA30_CLK_KFUSE }, 789 + { .dev_id = "tegra_sata_cold", .dt_id = TEGRA30_CLK_SATA_COLD }, 790 + { .dev_id = "dtv", .dt_id = TEGRA30_CLK_DTV }, 791 + { .dev_id = "tegra30-i2s.0", .dt_id = TEGRA30_CLK_I2S0 }, 792 + { .dev_id = "tegra30-i2s.1", .dt_id = TEGRA30_CLK_I2S1 }, 793 + { .dev_id = "tegra30-i2s.2", .dt_id = TEGRA30_CLK_I2S2 }, 794 + { .dev_id = "tegra30-i2s.3", .dt_id = TEGRA30_CLK_I2S3 }, 795 + { .dev_id = "tegra30-i2s.4", .dt_id = TEGRA30_CLK_I2S4 }, 796 + { .con_id = "spdif_out", .dev_id = "tegra30-spdif", .dt_id = TEGRA30_CLK_SPDIF_OUT }, 797 + { .con_id = "spdif_in", .dev_id = "tegra30-spdif", .dt_id = TEGRA30_CLK_SPDIF_IN }, 798 + { .con_id = "d_audio", .dev_id = "tegra30-ahub", .dt_id = TEGRA30_CLK_D_AUDIO }, 799 + { .dev_id = "tegra30-dam.0", .dt_id = TEGRA30_CLK_DAM0 }, 800 + { .dev_id = "tegra30-dam.1", .dt_id = TEGRA30_CLK_DAM1 }, 801 + { .dev_id = "tegra30-dam.2", .dt_id = TEGRA30_CLK_DAM2 }, 802 + { .con_id = "hda", .dev_id = "tegra30-hda", .dt_id = TEGRA30_CLK_HDA }, 803 + { .con_id = "hda2codec", .dev_id = "tegra30-hda", .dt_id = TEGRA30_CLK_HDA2CODEC_2X }, 804 + { .dev_id = "spi_tegra.0", .dt_id = TEGRA30_CLK_SBC1 }, 805 + { .dev_id = "spi_tegra.1", .dt_id = TEGRA30_CLK_SBC2 }, 806 + { .dev_id = "spi_tegra.2", .dt_id = TEGRA30_CLK_SBC3 }, 807 + { .dev_id = "spi_tegra.3", .dt_id = TEGRA30_CLK_SBC4 }, 808 + { .dev_id = "spi_tegra.4", .dt_id = TEGRA30_CLK_SBC5 }, 809 + { .dev_id = "spi_tegra.5", .dt_id = TEGRA30_CLK_SBC6 }, 810 + { .dev_id = "tegra_sata_oob", .dt_id = TEGRA30_CLK_SATA_OOB }, 811 + { .dev_id = "tegra_sata", .dt_id = TEGRA30_CLK_SATA }, 812 + { .dev_id = "tegra_nand", .dt_id = TEGRA30_CLK_NDFLASH }, 813 + { .dev_id = "tegra_nand_speed", .dt_id = TEGRA30_CLK_NDSPEED }, 814 + { .dev_id = "vfir", .dt_id = TEGRA30_CLK_VFIR }, 815 + { .dev_id = "csite", .dt_id = TEGRA30_CLK_CSITE }, 816 + { .dev_id = "la", .dt_id = TEGRA30_CLK_LA }, 817 + { .dev_id = "tegra_w1", .dt_id = TEGRA30_CLK_OWR }, 818 + { .dev_id = "mipi", .dt_id = TEGRA30_CLK_MIPI }, 819 + { .dev_id = "tegra-tsensor", .dt_id = TEGRA30_CLK_TSENSOR }, 820 + { .dev_id = "i2cslow", .dt_id = TEGRA30_CLK_I2CSLOW }, 821 + { .dev_id = "vde", .dt_id = TEGRA30_CLK_VDE }, 822 + { .con_id = "vi", .dev_id = "tegra_camera", .dt_id = TEGRA30_CLK_VI }, 823 + { .dev_id = "epp", .dt_id = TEGRA30_CLK_EPP }, 824 + { .dev_id = "mpe", .dt_id = TEGRA30_CLK_MPE }, 825 + { .dev_id = "host1x", .dt_id = TEGRA30_CLK_HOST1X }, 826 + { .dev_id = "3d", .dt_id = TEGRA30_CLK_GR3D }, 827 + { .dev_id = "3d2", .dt_id = TEGRA30_CLK_GR3D2 }, 828 + { .dev_id = "2d", .dt_id = TEGRA30_CLK_GR2D }, 829 + { .dev_id = "se", .dt_id = TEGRA30_CLK_SE }, 830 + { .dev_id = "mselect", .dt_id = TEGRA30_CLK_MSELECT }, 831 + { .dev_id = "tegra-nor", .dt_id = TEGRA30_CLK_NOR }, 832 + { .dev_id = "sdhci-tegra.0", .dt_id = TEGRA30_CLK_SDMMC1 }, 833 + { .dev_id = "sdhci-tegra.1", .dt_id = TEGRA30_CLK_SDMMC2 }, 834 + { .dev_id = "sdhci-tegra.2", .dt_id = TEGRA30_CLK_SDMMC3 }, 835 + { .dev_id = "sdhci-tegra.3", .dt_id = TEGRA30_CLK_SDMMC4 }, 836 + { .dev_id = "cve", .dt_id = TEGRA30_CLK_CVE }, 837 + { .dev_id = "tvo", .dt_id = TEGRA30_CLK_TVO }, 838 + { .dev_id = "tvdac", .dt_id = TEGRA30_CLK_TVDAC }, 839 + { .dev_id = "actmon", .dt_id = TEGRA30_CLK_ACTMON }, 840 + { .con_id = "vi_sensor", .dev_id = "tegra_camera", .dt_id = TEGRA30_CLK_VI_SENSOR }, 841 + { .con_id = "div-clk", .dev_id = "tegra-i2c.0", .dt_id = TEGRA30_CLK_I2C1 }, 842 + { .con_id = "div-clk", .dev_id = "tegra-i2c.1", .dt_id = TEGRA30_CLK_I2C2 }, 843 + { .con_id = "div-clk", .dev_id = "tegra-i2c.2", .dt_id = TEGRA30_CLK_I2C3 }, 844 + { .con_id = "div-clk", .dev_id = "tegra-i2c.3", .dt_id = TEGRA30_CLK_I2C4 }, 845 + { .con_id = "div-clk", .dev_id = "tegra-i2c.4", .dt_id = TEGRA30_CLK_I2C5 }, 846 + { .dev_id = "tegra_uart.0", .dt_id = TEGRA30_CLK_UARTA }, 847 + { .dev_id = "tegra_uart.1", .dt_id = TEGRA30_CLK_UARTB }, 848 + { .dev_id = "tegra_uart.2", .dt_id = TEGRA30_CLK_UARTC }, 849 + { .dev_id = "tegra_uart.3", .dt_id = TEGRA30_CLK_UARTD }, 850 + { .dev_id = "tegra_uart.4", .dt_id = TEGRA30_CLK_UARTE }, 851 + { .dev_id = "hdmi", .dt_id = TEGRA30_CLK_HDMI }, 852 + { .dev_id = "extern1", .dt_id = TEGRA30_CLK_EXTERN1 }, 853 + { .dev_id = "extern2", .dt_id = TEGRA30_CLK_EXTERN2 }, 854 + { .dev_id = "extern3", .dt_id = TEGRA30_CLK_EXTERN3 }, 855 + { .dev_id = "pwm", .dt_id = TEGRA30_CLK_PWM }, 856 + { .dev_id = "tegradc.0", .dt_id = TEGRA30_CLK_DISP1 }, 857 + { .dev_id = "tegradc.1", .dt_id = TEGRA30_CLK_DISP2 }, 858 + { .dev_id = "tegradc.1", .dt_id = TEGRA30_CLK_DSIB }, 590 859 }; 591 860 592 - static struct tegra_clk_periph_regs periph_u_regs = { 593 - .enb_reg = CLK_OUT_ENB_U, 594 - .enb_set_reg = CLK_OUT_ENB_SET_U, 595 - .enb_clr_reg = CLK_OUT_ENB_CLR_U, 596 - .rst_reg = RST_DEVICES_U, 597 - .rst_set_reg = RST_DEVICES_SET_U, 598 - .rst_clr_reg = RST_DEVICES_CLR_U, 861 + static struct tegra_clk tegra30_clks[tegra_clk_max] __initdata = { 862 + [tegra_clk_clk_32k] = { .dt_id = TEGRA30_CLK_CLK_32K, .present = true }, 863 + [tegra_clk_clk_m] = { .dt_id = TEGRA30_CLK_CLK_M, .present = true }, 864 + [tegra_clk_clk_m_div2] = { .dt_id = TEGRA30_CLK_CLK_M_DIV2, .present = true }, 865 + [tegra_clk_clk_m_div4] = { .dt_id = TEGRA30_CLK_CLK_M_DIV4, .present = true }, 866 + [tegra_clk_pll_ref] = { .dt_id = TEGRA30_CLK_PLL_REF, .present = true }, 867 + [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA30_CLK_SPDIF_IN_SYNC, .present = true }, 868 + [tegra_clk_i2s0_sync] = { .dt_id = TEGRA30_CLK_I2S0_SYNC, .present = true }, 869 + [tegra_clk_i2s1_sync] = { .dt_id = TEGRA30_CLK_I2S1_SYNC, .present = true }, 870 + [tegra_clk_i2s2_sync] = { .dt_id = TEGRA30_CLK_I2S2_SYNC, .present = true }, 871 + [tegra_clk_i2s3_sync] = { .dt_id = TEGRA30_CLK_I2S3_SYNC, .present = true }, 872 + [tegra_clk_i2s4_sync] = { .dt_id = TEGRA30_CLK_I2S4_SYNC, .present = true }, 873 + [tegra_clk_vimclk_sync] = { .dt_id = TEGRA30_CLK_VIMCLK_SYNC, .present = true }, 874 + [tegra_clk_audio0] = { .dt_id = TEGRA30_CLK_AUDIO0, .present = true }, 875 + [tegra_clk_audio1] = { .dt_id = TEGRA30_CLK_AUDIO1, .present = true }, 876 + [tegra_clk_audio2] = { .dt_id = TEGRA30_CLK_AUDIO2, .present = true }, 877 + [tegra_clk_audio3] = { .dt_id = TEGRA30_CLK_AUDIO3, .present = true }, 878 + [tegra_clk_audio4] = { .dt_id = TEGRA30_CLK_AUDIO4, .present = true }, 879 + [tegra_clk_spdif] = { .dt_id = TEGRA30_CLK_SPDIF, .present = true }, 880 + [tegra_clk_audio0_mux] = { .dt_id = TEGRA30_CLK_AUDIO0_MUX, .present = true }, 881 + [tegra_clk_audio1_mux] = { .dt_id = TEGRA30_CLK_AUDIO1_MUX, .present = true }, 882 + [tegra_clk_audio2_mux] = { .dt_id = TEGRA30_CLK_AUDIO2_MUX, .present = true }, 883 + [tegra_clk_audio3_mux] = { .dt_id = TEGRA30_CLK_AUDIO3_MUX, .present = true }, 884 + [tegra_clk_audio4_mux] = { .dt_id = TEGRA30_CLK_AUDIO4_MUX, .present = true }, 885 + [tegra_clk_spdif_mux] = { .dt_id = TEGRA30_CLK_SPDIF_MUX, .present = true }, 886 + [tegra_clk_audio0_2x] = { .dt_id = TEGRA30_CLK_AUDIO0_2X, .present = true }, 887 + [tegra_clk_audio1_2x] = { .dt_id = TEGRA30_CLK_AUDIO1_2X, .present = true }, 888 + [tegra_clk_audio2_2x] = { .dt_id = TEGRA30_CLK_AUDIO2_2X, .present = true }, 889 + [tegra_clk_audio3_2x] = { .dt_id = TEGRA30_CLK_AUDIO3_2X, .present = true }, 890 + [tegra_clk_audio4_2x] = { .dt_id = TEGRA30_CLK_AUDIO4_2X, .present = true }, 891 + [tegra_clk_spdif_2x] = { .dt_id = TEGRA30_CLK_SPDIF_2X, .present = true }, 892 + [tegra_clk_clk_out_1] = { .dt_id = TEGRA30_CLK_CLK_OUT_1, .present = true }, 893 + [tegra_clk_clk_out_2] = { .dt_id = TEGRA30_CLK_CLK_OUT_2, .present = true }, 894 + [tegra_clk_clk_out_3] = { .dt_id = TEGRA30_CLK_CLK_OUT_3, .present = true }, 895 + [tegra_clk_blink] = { .dt_id = TEGRA30_CLK_BLINK, .present = true }, 896 + [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_1_MUX, .present = true }, 897 + [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_2_MUX, .present = true }, 898 + [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_3_MUX, .present = true }, 899 + [tegra_clk_hclk] = { .dt_id = TEGRA30_CLK_HCLK, .present = true }, 900 + [tegra_clk_pclk] = { .dt_id = TEGRA30_CLK_PCLK, .present = true }, 901 + [tegra_clk_i2s0] = { .dt_id = TEGRA30_CLK_I2S0, .present = true }, 902 + [tegra_clk_i2s1] = { .dt_id = TEGRA30_CLK_I2S1, .present = true }, 903 + [tegra_clk_i2s2] = { .dt_id = TEGRA30_CLK_I2S2, .present = true }, 904 + [tegra_clk_i2s3] = { .dt_id = TEGRA30_CLK_I2S3, .present = true }, 905 + [tegra_clk_i2s4] = { .dt_id = TEGRA30_CLK_I2S4, .present = true }, 906 + [tegra_clk_spdif_in] = { .dt_id = TEGRA30_CLK_SPDIF_IN, .present = true }, 907 + [tegra_clk_hda] = { .dt_id = TEGRA30_CLK_HDA, .present = true }, 908 + [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA30_CLK_HDA2CODEC_2X, .present = true }, 909 + [tegra_clk_sbc1] = { .dt_id = TEGRA30_CLK_SBC1, .present = true }, 910 + [tegra_clk_sbc2] = { .dt_id = TEGRA30_CLK_SBC2, .present = true }, 911 + [tegra_clk_sbc3] = { .dt_id = TEGRA30_CLK_SBC3, .present = true }, 912 + [tegra_clk_sbc4] = { .dt_id = TEGRA30_CLK_SBC4, .present = true }, 913 + [tegra_clk_sbc5] = { .dt_id = TEGRA30_CLK_SBC5, .present = true }, 914 + [tegra_clk_sbc6] = { .dt_id = TEGRA30_CLK_SBC6, .present = true }, 915 + [tegra_clk_ndflash] = { .dt_id = TEGRA30_CLK_NDFLASH, .present = true }, 916 + [tegra_clk_ndspeed] = { .dt_id = TEGRA30_CLK_NDSPEED, .present = true }, 917 + [tegra_clk_vfir] = { .dt_id = TEGRA30_CLK_VFIR, .present = true }, 918 + [tegra_clk_la] = { .dt_id = TEGRA30_CLK_LA, .present = true }, 919 + [tegra_clk_csite] = { .dt_id = TEGRA30_CLK_CSITE, .present = true }, 920 + [tegra_clk_owr] = { .dt_id = TEGRA30_CLK_OWR, .present = true }, 921 + [tegra_clk_mipi] = { .dt_id = TEGRA30_CLK_MIPI, .present = true }, 922 + [tegra_clk_tsensor] = { .dt_id = TEGRA30_CLK_TSENSOR, .present = true }, 923 + [tegra_clk_i2cslow] = { .dt_id = TEGRA30_CLK_I2CSLOW, .present = true }, 924 + [tegra_clk_vde] = { .dt_id = TEGRA30_CLK_VDE, .present = true }, 925 + [tegra_clk_vi] = { .dt_id = TEGRA30_CLK_VI, .present = true }, 926 + [tegra_clk_epp] = { .dt_id = TEGRA30_CLK_EPP, .present = true }, 927 + [tegra_clk_mpe] = { .dt_id = TEGRA30_CLK_MPE, .present = true }, 928 + [tegra_clk_host1x] = { .dt_id = TEGRA30_CLK_HOST1X, .present = true }, 929 + [tegra_clk_gr2d] = { .dt_id = TEGRA30_CLK_GR2D, .present = true }, 930 + [tegra_clk_gr3d] = { .dt_id = TEGRA30_CLK_GR3D, .present = true }, 931 + [tegra_clk_mselect] = { .dt_id = TEGRA30_CLK_MSELECT, .present = true }, 932 + [tegra_clk_nor] = { .dt_id = TEGRA30_CLK_NOR, .present = true }, 933 + [tegra_clk_sdmmc1] = { .dt_id = TEGRA30_CLK_SDMMC1, .present = true }, 934 + [tegra_clk_sdmmc2] = { .dt_id = TEGRA30_CLK_SDMMC2, .present = true }, 935 + [tegra_clk_sdmmc3] = { .dt_id = TEGRA30_CLK_SDMMC3, .present = true }, 936 + [tegra_clk_sdmmc4] = { .dt_id = TEGRA30_CLK_SDMMC4, .present = true }, 937 + [tegra_clk_cve] = { .dt_id = TEGRA30_CLK_CVE, .present = true }, 938 + [tegra_clk_tvo] = { .dt_id = TEGRA30_CLK_TVO, .present = true }, 939 + [tegra_clk_tvdac] = { .dt_id = TEGRA30_CLK_TVDAC, .present = true }, 940 + [tegra_clk_actmon] = { .dt_id = TEGRA30_CLK_ACTMON, .present = true }, 941 + [tegra_clk_vi_sensor] = { .dt_id = TEGRA30_CLK_VI_SENSOR, .present = true }, 942 + [tegra_clk_i2c1] = { .dt_id = TEGRA30_CLK_I2C1, .present = true }, 943 + [tegra_clk_i2c2] = { .dt_id = TEGRA30_CLK_I2C2, .present = true }, 944 + [tegra_clk_i2c3] = { .dt_id = TEGRA30_CLK_I2C3, .present = true }, 945 + [tegra_clk_i2c4] = { .dt_id = TEGRA30_CLK_I2C4, .present = true }, 946 + [tegra_clk_i2c5] = { .dt_id = TEGRA30_CLK_I2C5, .present = true }, 947 + [tegra_clk_uarta] = { .dt_id = TEGRA30_CLK_UARTA, .present = true }, 948 + [tegra_clk_uartb] = { .dt_id = TEGRA30_CLK_UARTB, .present = true }, 949 + [tegra_clk_uartc] = { .dt_id = TEGRA30_CLK_UARTC, .present = true }, 950 + [tegra_clk_uartd] = { .dt_id = TEGRA30_CLK_UARTD, .present = true }, 951 + [tegra_clk_uarte] = { .dt_id = TEGRA30_CLK_UARTE, .present = true }, 952 + [tegra_clk_extern1] = { .dt_id = TEGRA30_CLK_EXTERN1, .present = true }, 953 + [tegra_clk_extern2] = { .dt_id = TEGRA30_CLK_EXTERN2, .present = true }, 954 + [tegra_clk_extern3] = { .dt_id = TEGRA30_CLK_EXTERN3, .present = true }, 955 + [tegra_clk_disp1] = { .dt_id = TEGRA30_CLK_DISP1, .present = true }, 956 + [tegra_clk_disp2] = { .dt_id = TEGRA30_CLK_DISP2, .present = true }, 957 + [tegra_clk_apbdma] = { .dt_id = TEGRA30_CLK_APBDMA, .present = true }, 958 + [tegra_clk_rtc] = { .dt_id = TEGRA30_CLK_RTC, .present = true }, 959 + [tegra_clk_timer] = { .dt_id = TEGRA30_CLK_TIMER, .present = true }, 960 + [tegra_clk_kbc] = { .dt_id = TEGRA30_CLK_KBC, .present = true }, 961 + [tegra_clk_csus] = { .dt_id = TEGRA30_CLK_CSUS, .present = true }, 962 + [tegra_clk_vcp] = { .dt_id = TEGRA30_CLK_VCP, .present = true }, 963 + [tegra_clk_bsea] = { .dt_id = TEGRA30_CLK_BSEA, .present = true }, 964 + [tegra_clk_bsev] = { .dt_id = TEGRA30_CLK_BSEV, .present = true }, 965 + [tegra_clk_usbd] = { .dt_id = TEGRA30_CLK_USBD, .present = true }, 966 + [tegra_clk_usb2] = { .dt_id = TEGRA30_CLK_USB2, .present = true }, 967 + [tegra_clk_usb3] = { .dt_id = TEGRA30_CLK_USB3, .present = true }, 968 + [tegra_clk_csi] = { .dt_id = TEGRA30_CLK_CSI, .present = true }, 969 + [tegra_clk_isp] = { .dt_id = TEGRA30_CLK_ISP, .present = true }, 970 + [tegra_clk_kfuse] = { .dt_id = TEGRA30_CLK_KFUSE, .present = true }, 971 + [tegra_clk_fuse] = { .dt_id = TEGRA30_CLK_FUSE, .present = true }, 972 + [tegra_clk_fuse_burn] = { .dt_id = TEGRA30_CLK_FUSE_BURN, .present = true }, 973 + [tegra_clk_apbif] = { .dt_id = TEGRA30_CLK_APBIF, .present = true }, 974 + [tegra_clk_hda2hdmi] = { .dt_id = TEGRA30_CLK_HDA2HDMI, .present = true }, 975 + [tegra_clk_sata_cold] = { .dt_id = TEGRA30_CLK_SATA_COLD, .present = true }, 976 + [tegra_clk_sata_oob] = { .dt_id = TEGRA30_CLK_SATA_OOB, .present = true }, 977 + [tegra_clk_sata] = { .dt_id = TEGRA30_CLK_SATA, .present = true }, 978 + [tegra_clk_dtv] = { .dt_id = TEGRA30_CLK_DTV, .present = true }, 979 + [tegra_clk_pll_p] = { .dt_id = TEGRA30_CLK_PLL_P, .present = true }, 980 + [tegra_clk_pll_p_out1] = { .dt_id = TEGRA30_CLK_PLL_P_OUT1, .present = true }, 981 + [tegra_clk_pll_p_out2] = { .dt_id = TEGRA30_CLK_PLL_P_OUT2, .present = true }, 982 + [tegra_clk_pll_p_out3] = { .dt_id = TEGRA30_CLK_PLL_P_OUT3, .present = true }, 983 + [tegra_clk_pll_p_out4] = { .dt_id = TEGRA30_CLK_PLL_P_OUT4, .present = true }, 984 + [tegra_clk_pll_a] = { .dt_id = TEGRA30_CLK_PLL_A, .present = true }, 985 + [tegra_clk_pll_a_out0] = { .dt_id = TEGRA30_CLK_PLL_A_OUT0, .present = true }, 986 + 599 987 }; 600 - 601 - static struct tegra_clk_periph_regs periph_v_regs = { 602 - .enb_reg = CLK_OUT_ENB_V, 603 - .enb_set_reg = CLK_OUT_ENB_SET_V, 604 - .enb_clr_reg = CLK_OUT_ENB_CLR_V, 605 - .rst_reg = RST_DEVICES_V, 606 - .rst_set_reg = RST_DEVICES_SET_V, 607 - .rst_clr_reg = RST_DEVICES_CLR_V, 608 - }; 609 - 610 - static struct tegra_clk_periph_regs periph_w_regs = { 611 - .enb_reg = CLK_OUT_ENB_W, 612 - .enb_set_reg = CLK_OUT_ENB_SET_W, 613 - .enb_clr_reg = CLK_OUT_ENB_CLR_W, 614 - .rst_reg = RST_DEVICES_W, 615 - .rst_set_reg = RST_DEVICES_SET_W, 616 - .rst_clr_reg = RST_DEVICES_CLR_W, 617 - }; 618 - 619 - static void tegra30_clk_measure_input_freq(void) 620 - { 621 - u32 osc_ctrl = readl_relaxed(clk_base + OSC_CTRL); 622 - u32 auto_clk_control = osc_ctrl & OSC_CTRL_OSC_FREQ_MASK; 623 - u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK; 624 - 625 - switch (auto_clk_control) { 626 - case OSC_CTRL_OSC_FREQ_12MHZ: 627 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1); 628 - input_freq = 12000000; 629 - break; 630 - case OSC_CTRL_OSC_FREQ_13MHZ: 631 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1); 632 - input_freq = 13000000; 633 - break; 634 - case OSC_CTRL_OSC_FREQ_19_2MHZ: 635 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1); 636 - input_freq = 19200000; 637 - break; 638 - case OSC_CTRL_OSC_FREQ_26MHZ: 639 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1); 640 - input_freq = 26000000; 641 - break; 642 - case OSC_CTRL_OSC_FREQ_16_8MHZ: 643 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1); 644 - input_freq = 16800000; 645 - break; 646 - case OSC_CTRL_OSC_FREQ_38_4MHZ: 647 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_2); 648 - input_freq = 38400000; 649 - break; 650 - case OSC_CTRL_OSC_FREQ_48MHZ: 651 - BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_4); 652 - input_freq = 48000000; 653 - break; 654 - default: 655 - pr_err("Unexpected auto clock control value %d", 656 - auto_clk_control); 657 - BUG(); 658 - return; 659 - } 660 - } 661 - 662 - static unsigned int tegra30_get_pll_ref_div(void) 663 - { 664 - u32 pll_ref_div = readl_relaxed(clk_base + OSC_CTRL) & 665 - OSC_CTRL_PLL_REF_DIV_MASK; 666 - 667 - switch (pll_ref_div) { 668 - case OSC_CTRL_PLL_REF_DIV_1: 669 - return 1; 670 - case OSC_CTRL_PLL_REF_DIV_2: 671 - return 2; 672 - case OSC_CTRL_PLL_REF_DIV_4: 673 - return 4; 674 - default: 675 - pr_err("Invalid pll ref divider %d", pll_ref_div); 676 - BUG(); 677 - } 678 - return 0; 679 - } 680 988 681 989 static void tegra30_utmi_param_configure(void) 682 990 { ··· 923 863 924 864 /* PLLC */ 925 865 clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, pmc_base, 0, 926 - 0, &pll_c_params, 927 - TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, 928 - pll_c_freq_table, NULL); 929 - clk_register_clkdev(clk, "pll_c", NULL); 930 - clks[pll_c] = clk; 866 + &pll_c_params, NULL); 867 + clks[TEGRA30_CLK_PLL_C] = clk; 931 868 932 869 /* PLLC_OUT1 */ 933 870 clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", ··· 933 876 clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", 934 877 clk_base + PLLC_OUT, 1, 0, CLK_SET_RATE_PARENT, 935 878 0, NULL); 936 - clk_register_clkdev(clk, "pll_c_out1", NULL); 937 - clks[pll_c_out1] = clk; 938 - 939 - /* PLLP */ 940 - clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc_base, 0, 941 - 408000000, &pll_p_params, 942 - TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON | 943 - TEGRA_PLL_USE_LOCK, pll_p_freq_table, NULL); 944 - clk_register_clkdev(clk, "pll_p", NULL); 945 - clks[pll_p] = clk; 946 - 947 - /* PLLP_OUT1 */ 948 - clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p", 949 - clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED | 950 - TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, 951 - &pll_div_lock); 952 - clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div", 953 - clk_base + PLLP_OUTA, 1, 0, 954 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 955 - &pll_div_lock); 956 - clk_register_clkdev(clk, "pll_p_out1", NULL); 957 - clks[pll_p_out1] = clk; 958 - 959 - /* PLLP_OUT2 */ 960 - clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p", 961 - clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED | 962 - TEGRA_DIVIDER_ROUND_UP, 24, 8, 1, 963 - &pll_div_lock); 964 - clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div", 965 - clk_base + PLLP_OUTA, 17, 16, 966 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 967 - &pll_div_lock); 968 - clk_register_clkdev(clk, "pll_p_out2", NULL); 969 - clks[pll_p_out2] = clk; 970 - 971 - /* PLLP_OUT3 */ 972 - clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p", 973 - clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED | 974 - TEGRA_DIVIDER_ROUND_UP, 8, 8, 1, 975 - &pll_div_lock); 976 - clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div", 977 - clk_base + PLLP_OUTB, 1, 0, 978 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 979 - &pll_div_lock); 980 - clk_register_clkdev(clk, "pll_p_out3", NULL); 981 - clks[pll_p_out3] = clk; 982 - 983 - /* PLLP_OUT4 */ 984 - clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p", 985 - clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED | 986 - TEGRA_DIVIDER_ROUND_UP, 24, 8, 1, 987 - &pll_div_lock); 988 - clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div", 989 - clk_base + PLLP_OUTB, 17, 16, 990 - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0, 991 - &pll_div_lock); 992 - clk_register_clkdev(clk, "pll_p_out4", NULL); 993 - clks[pll_p_out4] = clk; 879 + clks[TEGRA30_CLK_PLL_C_OUT1] = clk; 994 880 995 881 /* PLLM */ 996 882 clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, pmc_base, 997 - CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0, 998 - &pll_m_params, TEGRA_PLLM | TEGRA_PLL_HAS_CPCON | 999 - TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, 1000 - pll_m_freq_table, NULL); 1001 - clk_register_clkdev(clk, "pll_m", NULL); 1002 - clks[pll_m] = clk; 883 + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 884 + &pll_m_params, NULL); 885 + clks[TEGRA30_CLK_PLL_M] = clk; 1003 886 1004 887 /* PLLM_OUT1 */ 1005 888 clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m", ··· 948 951 clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div", 949 952 clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED | 950 953 CLK_SET_RATE_PARENT, 0, NULL); 951 - clk_register_clkdev(clk, "pll_m_out1", NULL); 952 - clks[pll_m_out1] = clk; 954 + clks[TEGRA30_CLK_PLL_M_OUT1] = clk; 953 955 954 956 /* PLLX */ 955 957 clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, pmc_base, 0, 956 - 0, &pll_x_params, TEGRA_PLL_HAS_CPCON | 957 - TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK, 958 - pll_x_freq_table, NULL); 959 - clk_register_clkdev(clk, "pll_x", NULL); 960 - clks[pll_x] = clk; 958 + &pll_x_params, NULL); 959 + clks[TEGRA30_CLK_PLL_X] = clk; 961 960 962 961 /* PLLX_OUT0 */ 963 962 clk = clk_register_fixed_factor(NULL, "pll_x_out0", "pll_x", 964 963 CLK_SET_RATE_PARENT, 1, 2); 965 - clk_register_clkdev(clk, "pll_x_out0", NULL); 966 - clks[pll_x_out0] = clk; 964 + clks[TEGRA30_CLK_PLL_X_OUT0] = clk; 967 965 968 966 /* PLLU */ 969 967 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, 970 - 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | 971 - TEGRA_PLL_SET_LFCON, 972 - pll_u_freq_table, 973 - NULL); 974 - clk_register_clkdev(clk, "pll_u", NULL); 975 - clks[pll_u] = clk; 968 + &pll_u_params, NULL); 969 + clks[TEGRA30_CLK_PLL_U] = clk; 976 970 977 971 tegra30_utmi_param_configure(); 978 972 979 973 /* PLLD */ 980 974 clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc_base, 0, 981 - 0, &pll_d_params, TEGRA_PLL_HAS_CPCON | 982 - TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK, 983 - pll_d_freq_table, &pll_d_lock); 984 - clk_register_clkdev(clk, "pll_d", NULL); 985 - clks[pll_d] = clk; 975 + &pll_d_params, &pll_d_lock); 976 + clks[TEGRA30_CLK_PLL_D] = clk; 986 977 987 978 /* PLLD_OUT0 */ 988 979 clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", 989 980 CLK_SET_RATE_PARENT, 1, 2); 990 - clk_register_clkdev(clk, "pll_d_out0", NULL); 991 - clks[pll_d_out0] = clk; 981 + clks[TEGRA30_CLK_PLL_D_OUT0] = clk; 992 982 993 983 /* PLLD2 */ 994 984 clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc_base, 0, 995 - 0, &pll_d2_params, TEGRA_PLL_HAS_CPCON | 996 - TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK, 997 - pll_d_freq_table, NULL); 998 - clk_register_clkdev(clk, "pll_d2", NULL); 999 - clks[pll_d2] = clk; 985 + &pll_d2_params, NULL); 986 + clks[TEGRA30_CLK_PLL_D2] = clk; 1000 987 1001 988 /* PLLD2_OUT0 */ 1002 989 clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", 1003 990 CLK_SET_RATE_PARENT, 1, 2); 1004 - clk_register_clkdev(clk, "pll_d2_out0", NULL); 1005 - clks[pll_d2_out0] = clk; 1006 - 1007 - /* PLLA */ 1008 - clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc_base, 1009 - 0, 0, &pll_a_params, TEGRA_PLL_HAS_CPCON | 1010 - TEGRA_PLL_USE_LOCK, pll_a_freq_table, NULL); 1011 - clk_register_clkdev(clk, "pll_a", NULL); 1012 - clks[pll_a] = clk; 1013 - 1014 - /* PLLA_OUT0 */ 1015 - clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", 1016 - clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1017 - 8, 8, 1, NULL); 1018 - clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", 1019 - clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED | 1020 - CLK_SET_RATE_PARENT, 0, NULL); 1021 - clk_register_clkdev(clk, "pll_a_out0", NULL); 1022 - clks[pll_a_out0] = clk; 991 + clks[TEGRA30_CLK_PLL_D2_OUT0] = clk; 1023 992 1024 993 /* PLLE */ 1025 994 clk = clk_register_mux(NULL, "pll_e_mux", pll_e_parents, ··· 993 1030 CLK_SET_RATE_NO_REPARENT, 994 1031 clk_base + PLLE_AUX, 2, 1, 0, NULL); 995 1032 clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, 996 - CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params, 997 - TEGRA_PLLE_CONFIGURE, pll_e_freq_table, NULL); 998 - clk_register_clkdev(clk, "pll_e", NULL); 999 - clks[pll_e] = clk; 1000 - } 1001 - 1002 - static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync", 1003 - "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync",}; 1004 - static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", 1005 - "clk_m_div4", "extern1", }; 1006 - static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2", 1007 - "clk_m_div4", "extern2", }; 1008 - static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", 1009 - "clk_m_div4", "extern3", }; 1010 - 1011 - static void __init tegra30_audio_clk_init(void) 1012 - { 1013 - struct clk *clk; 1014 - 1015 - /* spdif_in_sync */ 1016 - clk = tegra_clk_register_sync_source("spdif_in_sync", 24000000, 1017 - 24000000); 1018 - clk_register_clkdev(clk, "spdif_in_sync", NULL); 1019 - clks[spdif_in_sync] = clk; 1020 - 1021 - /* i2s0_sync */ 1022 - clk = tegra_clk_register_sync_source("i2s0_sync", 24000000, 24000000); 1023 - clk_register_clkdev(clk, "i2s0_sync", NULL); 1024 - clks[i2s0_sync] = clk; 1025 - 1026 - /* i2s1_sync */ 1027 - clk = tegra_clk_register_sync_source("i2s1_sync", 24000000, 24000000); 1028 - clk_register_clkdev(clk, "i2s1_sync", NULL); 1029 - clks[i2s1_sync] = clk; 1030 - 1031 - /* i2s2_sync */ 1032 - clk = tegra_clk_register_sync_source("i2s2_sync", 24000000, 24000000); 1033 - clk_register_clkdev(clk, "i2s2_sync", NULL); 1034 - clks[i2s2_sync] = clk; 1035 - 1036 - /* i2s3_sync */ 1037 - clk = tegra_clk_register_sync_source("i2s3_sync", 24000000, 24000000); 1038 - clk_register_clkdev(clk, "i2s3_sync", NULL); 1039 - clks[i2s3_sync] = clk; 1040 - 1041 - /* i2s4_sync */ 1042 - clk = tegra_clk_register_sync_source("i2s4_sync", 24000000, 24000000); 1043 - clk_register_clkdev(clk, "i2s4_sync", NULL); 1044 - clks[i2s4_sync] = clk; 1045 - 1046 - /* vimclk_sync */ 1047 - clk = tegra_clk_register_sync_source("vimclk_sync", 24000000, 24000000); 1048 - clk_register_clkdev(clk, "vimclk_sync", NULL); 1049 - clks[vimclk_sync] = clk; 1050 - 1051 - /* audio0 */ 1052 - clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, 1053 - ARRAY_SIZE(mux_audio_sync_clk), 1054 - CLK_SET_RATE_NO_REPARENT, 1055 - clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, NULL); 1056 - clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, 1057 - clk_base + AUDIO_SYNC_CLK_I2S0, 4, 1058 - CLK_GATE_SET_TO_DISABLE, NULL); 1059 - clk_register_clkdev(clk, "audio0", NULL); 1060 - clks[audio0] = clk; 1061 - 1062 - /* audio1 */ 1063 - clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, 1064 - ARRAY_SIZE(mux_audio_sync_clk), 1065 - CLK_SET_RATE_NO_REPARENT, 1066 - clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, NULL); 1067 - clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, 1068 - clk_base + AUDIO_SYNC_CLK_I2S1, 4, 1069 - CLK_GATE_SET_TO_DISABLE, NULL); 1070 - clk_register_clkdev(clk, "audio1", NULL); 1071 - clks[audio1] = clk; 1072 - 1073 - /* audio2 */ 1074 - clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, 1075 - ARRAY_SIZE(mux_audio_sync_clk), 1076 - CLK_SET_RATE_NO_REPARENT, 1077 - clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, NULL); 1078 - clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, 1079 - clk_base + AUDIO_SYNC_CLK_I2S2, 4, 1080 - CLK_GATE_SET_TO_DISABLE, NULL); 1081 - clk_register_clkdev(clk, "audio2", NULL); 1082 - clks[audio2] = clk; 1083 - 1084 - /* audio3 */ 1085 - clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, 1086 - ARRAY_SIZE(mux_audio_sync_clk), 1087 - CLK_SET_RATE_NO_REPARENT, 1088 - clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, NULL); 1089 - clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, 1090 - clk_base + AUDIO_SYNC_CLK_I2S3, 4, 1091 - CLK_GATE_SET_TO_DISABLE, NULL); 1092 - clk_register_clkdev(clk, "audio3", NULL); 1093 - clks[audio3] = clk; 1094 - 1095 - /* audio4 */ 1096 - clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, 1097 - ARRAY_SIZE(mux_audio_sync_clk), 1098 - CLK_SET_RATE_NO_REPARENT, 1099 - clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, NULL); 1100 - clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, 1101 - clk_base + AUDIO_SYNC_CLK_I2S4, 4, 1102 - CLK_GATE_SET_TO_DISABLE, NULL); 1103 - clk_register_clkdev(clk, "audio4", NULL); 1104 - clks[audio4] = clk; 1105 - 1106 - /* spdif */ 1107 - clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, 1108 - ARRAY_SIZE(mux_audio_sync_clk), 1109 - CLK_SET_RATE_NO_REPARENT, 1110 - clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, NULL); 1111 - clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, 1112 - clk_base + AUDIO_SYNC_CLK_SPDIF, 4, 1113 - CLK_GATE_SET_TO_DISABLE, NULL); 1114 - clk_register_clkdev(clk, "spdif", NULL); 1115 - clks[spdif] = clk; 1116 - 1117 - /* audio0_2x */ 1118 - clk = clk_register_fixed_factor(NULL, "audio0_doubler", "audio0", 1119 - CLK_SET_RATE_PARENT, 2, 1); 1120 - clk = tegra_clk_register_divider("audio0_div", "audio0_doubler", 1121 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 24, 1, 0, 1122 - &clk_doubler_lock); 1123 - clk = tegra_clk_register_periph_gate("audio0_2x", "audio0_div", 1124 - TEGRA_PERIPH_NO_RESET, clk_base, 1125 - CLK_SET_RATE_PARENT, 113, &periph_v_regs, 1126 - periph_clk_enb_refcnt); 1127 - clk_register_clkdev(clk, "audio0_2x", NULL); 1128 - clks[audio0_2x] = clk; 1129 - 1130 - /* audio1_2x */ 1131 - clk = clk_register_fixed_factor(NULL, "audio1_doubler", "audio1", 1132 - CLK_SET_RATE_PARENT, 2, 1); 1133 - clk = tegra_clk_register_divider("audio1_div", "audio1_doubler", 1134 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 25, 1, 0, 1135 - &clk_doubler_lock); 1136 - clk = tegra_clk_register_periph_gate("audio1_2x", "audio1_div", 1137 - TEGRA_PERIPH_NO_RESET, clk_base, 1138 - CLK_SET_RATE_PARENT, 114, &periph_v_regs, 1139 - periph_clk_enb_refcnt); 1140 - clk_register_clkdev(clk, "audio1_2x", NULL); 1141 - clks[audio1_2x] = clk; 1142 - 1143 - /* audio2_2x */ 1144 - clk = clk_register_fixed_factor(NULL, "audio2_doubler", "audio2", 1145 - CLK_SET_RATE_PARENT, 2, 1); 1146 - clk = tegra_clk_register_divider("audio2_div", "audio2_doubler", 1147 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 26, 1, 0, 1148 - &clk_doubler_lock); 1149 - clk = tegra_clk_register_periph_gate("audio2_2x", "audio2_div", 1150 - TEGRA_PERIPH_NO_RESET, clk_base, 1151 - CLK_SET_RATE_PARENT, 115, &periph_v_regs, 1152 - periph_clk_enb_refcnt); 1153 - clk_register_clkdev(clk, "audio2_2x", NULL); 1154 - clks[audio2_2x] = clk; 1155 - 1156 - /* audio3_2x */ 1157 - clk = clk_register_fixed_factor(NULL, "audio3_doubler", "audio3", 1158 - CLK_SET_RATE_PARENT, 2, 1); 1159 - clk = tegra_clk_register_divider("audio3_div", "audio3_doubler", 1160 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 27, 1, 0, 1161 - &clk_doubler_lock); 1162 - clk = tegra_clk_register_periph_gate("audio3_2x", "audio3_div", 1163 - TEGRA_PERIPH_NO_RESET, clk_base, 1164 - CLK_SET_RATE_PARENT, 116, &periph_v_regs, 1165 - periph_clk_enb_refcnt); 1166 - clk_register_clkdev(clk, "audio3_2x", NULL); 1167 - clks[audio3_2x] = clk; 1168 - 1169 - /* audio4_2x */ 1170 - clk = clk_register_fixed_factor(NULL, "audio4_doubler", "audio4", 1171 - CLK_SET_RATE_PARENT, 2, 1); 1172 - clk = tegra_clk_register_divider("audio4_div", "audio4_doubler", 1173 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 28, 1, 0, 1174 - &clk_doubler_lock); 1175 - clk = tegra_clk_register_periph_gate("audio4_2x", "audio4_div", 1176 - TEGRA_PERIPH_NO_RESET, clk_base, 1177 - CLK_SET_RATE_PARENT, 117, &periph_v_regs, 1178 - periph_clk_enb_refcnt); 1179 - clk_register_clkdev(clk, "audio4_2x", NULL); 1180 - clks[audio4_2x] = clk; 1181 - 1182 - /* spdif_2x */ 1183 - clk = clk_register_fixed_factor(NULL, "spdif_doubler", "spdif", 1184 - CLK_SET_RATE_PARENT, 2, 1); 1185 - clk = tegra_clk_register_divider("spdif_div", "spdif_doubler", 1186 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 29, 1, 0, 1187 - &clk_doubler_lock); 1188 - clk = tegra_clk_register_periph_gate("spdif_2x", "spdif_div", 1189 - TEGRA_PERIPH_NO_RESET, clk_base, 1190 - CLK_SET_RATE_PARENT, 118, &periph_v_regs, 1191 - periph_clk_enb_refcnt); 1192 - clk_register_clkdev(clk, "spdif_2x", NULL); 1193 - clks[spdif_2x] = clk; 1194 - } 1195 - 1196 - static void __init tegra30_pmc_clk_init(void) 1197 - { 1198 - struct clk *clk; 1199 - 1200 - /* clk_out_1 */ 1201 - clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, 1202 - ARRAY_SIZE(clk_out1_parents), 1203 - CLK_SET_RATE_NO_REPARENT, 1204 - pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, 1205 - &clk_out_lock); 1206 - clks[clk_out_1_mux] = clk; 1207 - clk = clk_register_gate(NULL, "clk_out_1", "clk_out_1_mux", 0, 1208 - pmc_base + PMC_CLK_OUT_CNTRL, 2, 0, 1209 - &clk_out_lock); 1210 - clk_register_clkdev(clk, "extern1", "clk_out_1"); 1211 - clks[clk_out_1] = clk; 1212 - 1213 - /* clk_out_2 */ 1214 - clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, 1215 - ARRAY_SIZE(clk_out2_parents), 1216 - CLK_SET_RATE_NO_REPARENT, 1217 - pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, 1218 - &clk_out_lock); 1219 - clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0, 1220 - pmc_base + PMC_CLK_OUT_CNTRL, 10, 0, 1221 - &clk_out_lock); 1222 - clk_register_clkdev(clk, "extern2", "clk_out_2"); 1223 - clks[clk_out_2] = clk; 1224 - 1225 - /* clk_out_3 */ 1226 - clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, 1227 - ARRAY_SIZE(clk_out3_parents), 1228 - CLK_SET_RATE_NO_REPARENT, 1229 - pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, 1230 - &clk_out_lock); 1231 - clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0, 1232 - pmc_base + PMC_CLK_OUT_CNTRL, 18, 0, 1233 - &clk_out_lock); 1234 - clk_register_clkdev(clk, "extern3", "clk_out_3"); 1235 - clks[clk_out_3] = clk; 1236 - 1237 - /* blink */ 1238 - writel_relaxed(0, pmc_base + PMC_BLINK_TIMER); 1239 - clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0, 1240 - pmc_base + PMC_DPD_PADS_ORIDE, 1241 - PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL); 1242 - clk = clk_register_gate(NULL, "blink", "blink_override", 0, 1243 - pmc_base + PMC_CTRL, 1244 - PMC_CTRL_BLINK_ENB, 0, NULL); 1245 - clk_register_clkdev(clk, "blink", NULL); 1246 - clks[blink] = clk; 1247 - 1033 + CLK_GET_RATE_NOCACHE, &pll_e_params, NULL); 1034 + clks[TEGRA30_CLK_PLL_E] = clk; 1248 1035 } 1249 1036 1250 1037 static const char *cclk_g_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", ··· 1045 1332 CLK_SET_RATE_PARENT, 1046 1333 clk_base + CCLKG_BURST_POLICY, 1047 1334 0, 4, 0, 0, NULL); 1048 - clk_register_clkdev(clk, "cclk_g", NULL); 1049 - clks[cclk_g] = clk; 1335 + clks[TEGRA30_CLK_CCLK_G] = clk; 1050 1336 1051 1337 /* 1052 1338 * Clock input to cclk_lp divided from pll_p using ··· 1081 1369 clk_base + CCLKLP_BURST_POLICY, 1082 1370 TEGRA_DIVIDER_2, 4, 8, 9, 1083 1371 NULL); 1084 - clk_register_clkdev(clk, "cclk_lp", NULL); 1085 - clks[cclk_lp] = clk; 1372 + clks[TEGRA30_CLK_CCLK_LP] = clk; 1086 1373 1087 1374 /* SCLK */ 1088 1375 clk = tegra_clk_register_super_mux("sclk", sclk_parents, ··· 1089 1378 CLK_SET_RATE_PARENT, 1090 1379 clk_base + SCLK_BURST_POLICY, 1091 1380 0, 4, 0, 0, NULL); 1092 - clk_register_clkdev(clk, "sclk", NULL); 1093 - clks[sclk] = clk; 1094 - 1095 - /* HCLK */ 1096 - clk = clk_register_divider(NULL, "hclk_div", "sclk", 0, 1097 - clk_base + SYSTEM_CLK_RATE, 4, 2, 0, 1098 - &sysrate_lock); 1099 - clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT, 1100 - clk_base + SYSTEM_CLK_RATE, 7, 1101 - CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 1102 - clk_register_clkdev(clk, "hclk", NULL); 1103 - clks[hclk] = clk; 1104 - 1105 - /* PCLK */ 1106 - clk = clk_register_divider(NULL, "pclk_div", "hclk", 0, 1107 - clk_base + SYSTEM_CLK_RATE, 0, 2, 0, 1108 - &sysrate_lock); 1109 - clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT, 1110 - clk_base + SYSTEM_CLK_RATE, 3, 1111 - CLK_GATE_SET_TO_DISABLE, &sysrate_lock); 1112 - clk_register_clkdev(clk, "pclk", NULL); 1113 - clks[pclk] = clk; 1381 + clks[TEGRA30_CLK_SCLK] = clk; 1114 1382 1115 1383 /* twd */ 1116 1384 clk = clk_register_fixed_factor(NULL, "twd", "cclk_g", 1117 1385 CLK_SET_RATE_PARENT, 1, 2); 1118 - clk_register_clkdev(clk, "twd", NULL); 1119 - clks[twd] = clk; 1386 + clks[TEGRA30_CLK_TWD] = clk; 1387 + 1388 + tegra_super_clk_gen4_init(clk_base, pmc_base, tegra30_clks, NULL); 1120 1389 } 1121 1390 1122 1391 static const char *mux_pllacp_clkm[] = { "pll_a_out0", "unused", "pll_p", 1123 1392 "clk_m" }; 1124 1393 static const char *mux_pllpcm_clkm[] = { "pll_p", "pll_c", "pll_m", "clk_m" }; 1125 1394 static const char *mux_pllmcp_clkm[] = { "pll_m", "pll_c", "pll_p", "clk_m" }; 1126 - static const char *i2s0_parents[] = { "pll_a_out0", "audio0_2x", "pll_p", 1127 - "clk_m" }; 1128 - static const char *i2s1_parents[] = { "pll_a_out0", "audio1_2x", "pll_p", 1129 - "clk_m" }; 1130 - static const char *i2s2_parents[] = { "pll_a_out0", "audio2_2x", "pll_p", 1131 - "clk_m" }; 1132 - static const char *i2s3_parents[] = { "pll_a_out0", "audio3_2x", "pll_p", 1133 - "clk_m" }; 1134 - static const char *i2s4_parents[] = { "pll_a_out0", "audio4_2x", "pll_p", 1135 - "clk_m" }; 1136 1395 static const char *spdif_out_parents[] = { "pll_a_out0", "spdif_2x", "pll_p", 1137 1396 "clk_m" }; 1138 - static const char *spdif_in_parents[] = { "pll_p", "pll_c", "pll_m" }; 1139 - static const char *mux_pllpc_clk32k_clkm[] = { "pll_p", "pll_c", "clk_32k", 1140 - "clk_m" }; 1141 - static const char *mux_pllpc_clkm_clk32k[] = { "pll_p", "pll_c", "clk_m", 1142 - "clk_32k" }; 1143 1397 static const char *mux_pllmcpa[] = { "pll_m", "pll_c", "pll_p", "pll_a_out0" }; 1144 - static const char *mux_pllpdc_clkm[] = { "pll_p", "pll_d_out0", "pll_c", 1145 - "clk_m" }; 1146 - static const char *mux_pllp_clkm[] = { "pll_p", "unused", "unused", "clk_m" }; 1147 1398 static const char *mux_pllpmdacd2_clkm[] = { "pll_p", "pll_m", "pll_d_out0", 1148 1399 "pll_a_out0", "pll_c", 1149 1400 "pll_d2_out0", "clk_m" }; 1150 - static const char *mux_plla_clk32k_pllp_clkm_plle[] = { "pll_a_out0", 1151 - "clk_32k", "pll_p", 1152 - "clk_m", "pll_e" }; 1153 1401 static const char *mux_plld_out0_plld2_out0[] = { "pll_d_out0", 1154 1402 "pll_d2_out0" }; 1403 + static const char *pwm_parents[] = { "pll_p", "pll_c", "clk_32k", "clk_m" }; 1155 1404 1156 1405 static struct tegra_periph_init_data tegra_periph_clk_list[] = { 1157 - TEGRA_INIT_DATA_MUX("i2s0", NULL, "tegra30-i2s.0", i2s0_parents, CLK_SOURCE_I2S0, 30, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s0), 1158 - TEGRA_INIT_DATA_MUX("i2s1", NULL, "tegra30-i2s.1", i2s1_parents, CLK_SOURCE_I2S1, 11, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1), 1159 - TEGRA_INIT_DATA_MUX("i2s2", NULL, "tegra30-i2s.2", i2s2_parents, CLK_SOURCE_I2S2, 18, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2), 1160 - TEGRA_INIT_DATA_MUX("i2s3", NULL, "tegra30-i2s.3", i2s3_parents, CLK_SOURCE_I2S3, 101, &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s3), 1161 - TEGRA_INIT_DATA_MUX("i2s4", NULL, "tegra30-i2s.4", i2s4_parents, CLK_SOURCE_I2S4, 102, &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s4), 1162 - TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out", "tegra30-spdif", spdif_out_parents, CLK_SOURCE_SPDIF_OUT, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out), 1163 - TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in", "tegra30-spdif", spdif_in_parents, CLK_SOURCE_SPDIF_IN, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in), 1164 - TEGRA_INIT_DATA_MUX("d_audio", "d_audio", "tegra30-ahub", mux_pllacp_clkm, CLK_SOURCE_D_AUDIO, 106, &periph_v_regs, 0, d_audio), 1165 - TEGRA_INIT_DATA_MUX("dam0", NULL, "tegra30-dam.0", mux_pllacp_clkm, CLK_SOURCE_DAM0, 108, &periph_v_regs, 0, dam0), 1166 - TEGRA_INIT_DATA_MUX("dam1", NULL, "tegra30-dam.1", mux_pllacp_clkm, CLK_SOURCE_DAM1, 109, &periph_v_regs, 0, dam1), 1167 - TEGRA_INIT_DATA_MUX("dam2", NULL, "tegra30-dam.2", mux_pllacp_clkm, CLK_SOURCE_DAM2, 110, &periph_v_regs, 0, dam2), 1168 - TEGRA_INIT_DATA_MUX("hda", "hda", "tegra30-hda", mux_pllpcm_clkm, CLK_SOURCE_HDA, 125, &periph_v_regs, 0, hda), 1169 - TEGRA_INIT_DATA_MUX("hda2codec_2x", "hda2codec", "tegra30-hda", mux_pllpcm_clkm, CLK_SOURCE_HDA2CODEC_2X, 111, &periph_v_regs, 0, hda2codec_2x), 1170 - TEGRA_INIT_DATA_MUX("sbc1", NULL, "spi_tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SBC1, 41, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1), 1171 - TEGRA_INIT_DATA_MUX("sbc2", NULL, "spi_tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SBC2, 44, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2), 1172 - TEGRA_INIT_DATA_MUX("sbc3", NULL, "spi_tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SBC3, 46, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3), 1173 - TEGRA_INIT_DATA_MUX("sbc4", NULL, "spi_tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SBC4, 68, &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4), 1174 - TEGRA_INIT_DATA_MUX("sbc5", NULL, "spi_tegra.4", mux_pllpcm_clkm, CLK_SOURCE_SBC5, 104, &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc5), 1175 - TEGRA_INIT_DATA_MUX("sbc6", NULL, "spi_tegra.5", mux_pllpcm_clkm, CLK_SOURCE_SBC6, 105, &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc6), 1176 - TEGRA_INIT_DATA_MUX("sata_oob", NULL, "tegra_sata_oob", mux_pllpcm_clkm, CLK_SOURCE_SATA_OOB, 123, &periph_v_regs, TEGRA_PERIPH_ON_APB, sata_oob), 1177 - TEGRA_INIT_DATA_MUX("sata", NULL, "tegra_sata", mux_pllpcm_clkm, CLK_SOURCE_SATA, 124, &periph_v_regs, TEGRA_PERIPH_ON_APB, sata), 1178 - TEGRA_INIT_DATA_MUX("ndflash", NULL, "tegra_nand", mux_pllpcm_clkm, CLK_SOURCE_NDFLASH, 13, &periph_l_regs, TEGRA_PERIPH_ON_APB, ndflash), 1179 - TEGRA_INIT_DATA_MUX("ndspeed", NULL, "tegra_nand_speed", mux_pllpcm_clkm, CLK_SOURCE_NDSPEED, 80, &periph_u_regs, TEGRA_PERIPH_ON_APB, ndspeed), 1180 - TEGRA_INIT_DATA_MUX("vfir", NULL, "vfir", mux_pllpcm_clkm, CLK_SOURCE_VFIR, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir), 1181 - TEGRA_INIT_DATA_MUX("csite", NULL, "csite", mux_pllpcm_clkm, CLK_SOURCE_CSITE, 73, &periph_u_regs, TEGRA_PERIPH_ON_APB, csite), 1182 - TEGRA_INIT_DATA_MUX("la", NULL, "la", mux_pllpcm_clkm, CLK_SOURCE_LA, 76, &periph_u_regs, TEGRA_PERIPH_ON_APB, la), 1183 - TEGRA_INIT_DATA_MUX("owr", NULL, "tegra_w1", mux_pllpcm_clkm, CLK_SOURCE_OWR, 71, &periph_u_regs, TEGRA_PERIPH_ON_APB, owr), 1184 - TEGRA_INIT_DATA_MUX("mipi", NULL, "mipi", mux_pllpcm_clkm, CLK_SOURCE_MIPI, 50, &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi), 1185 - TEGRA_INIT_DATA_MUX("tsensor", NULL, "tegra-tsensor", mux_pllpc_clkm_clk32k, CLK_SOURCE_TSENSOR, 100, &periph_v_regs, TEGRA_PERIPH_ON_APB, tsensor), 1186 - TEGRA_INIT_DATA_MUX("i2cslow", NULL, "i2cslow", mux_pllpc_clk32k_clkm, CLK_SOURCE_I2CSLOW, 81, &periph_u_regs, TEGRA_PERIPH_ON_APB, i2cslow), 1187 - TEGRA_INIT_DATA_INT("vde", NULL, "vde", mux_pllpcm_clkm, CLK_SOURCE_VDE, 61, &periph_h_regs, 0, vde), 1188 - TEGRA_INIT_DATA_INT("vi", "vi", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI, 20, &periph_l_regs, 0, vi), 1189 - TEGRA_INIT_DATA_INT("epp", NULL, "epp", mux_pllmcpa, CLK_SOURCE_EPP, 19, &periph_l_regs, 0, epp), 1190 - TEGRA_INIT_DATA_INT("mpe", NULL, "mpe", mux_pllmcpa, CLK_SOURCE_MPE, 60, &periph_h_regs, 0, mpe), 1191 - TEGRA_INIT_DATA_INT("host1x", NULL, "host1x", mux_pllmcpa, CLK_SOURCE_HOST1X, 28, &periph_l_regs, 0, host1x), 1192 - TEGRA_INIT_DATA_INT("3d", NULL, "3d", mux_pllmcpa, CLK_SOURCE_3D, 24, &periph_l_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d), 1193 - TEGRA_INIT_DATA_INT("3d2", NULL, "3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, &periph_v_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d2), 1194 - TEGRA_INIT_DATA_INT("2d", NULL, "2d", mux_pllmcpa, CLK_SOURCE_2D, 21, &periph_l_regs, 0, gr2d), 1195 - TEGRA_INIT_DATA_INT("se", NULL, "se", mux_pllpcm_clkm, CLK_SOURCE_SE, 127, &periph_v_regs, 0, se), 1196 - TEGRA_INIT_DATA_MUX("mselect", NULL, "mselect", mux_pllp_clkm, CLK_SOURCE_MSELECT, 99, &periph_v_regs, 0, mselect), 1197 - TEGRA_INIT_DATA_MUX("nor", NULL, "tegra-nor", mux_pllpcm_clkm, CLK_SOURCE_NOR, 42, &periph_h_regs, 0, nor), 1198 - TEGRA_INIT_DATA_MUX("sdmmc1", NULL, "sdhci-tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SDMMC1, 14, &periph_l_regs, 0, sdmmc1), 1199 - TEGRA_INIT_DATA_MUX("sdmmc2", NULL, "sdhci-tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SDMMC2, 9, &periph_l_regs, 0, sdmmc2), 1200 - TEGRA_INIT_DATA_MUX("sdmmc3", NULL, "sdhci-tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SDMMC3, 69, &periph_u_regs, 0, sdmmc3), 1201 - TEGRA_INIT_DATA_MUX("sdmmc4", NULL, "sdhci-tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SDMMC4, 15, &periph_l_regs, 0, sdmmc4), 1202 - TEGRA_INIT_DATA_MUX("cve", NULL, "cve", mux_pllpdc_clkm, CLK_SOURCE_CVE, 49, &periph_h_regs, 0, cve), 1203 - TEGRA_INIT_DATA_MUX("tvo", NULL, "tvo", mux_pllpdc_clkm, CLK_SOURCE_TVO, 49, &periph_h_regs, 0, tvo), 1204 - TEGRA_INIT_DATA_MUX("tvdac", NULL, "tvdac", mux_pllpdc_clkm, CLK_SOURCE_TVDAC, 53, &periph_h_regs, 0, tvdac), 1205 - TEGRA_INIT_DATA_MUX("actmon", NULL, "actmon", mux_pllpc_clk32k_clkm, CLK_SOURCE_ACTMON, 119, &periph_v_regs, 0, actmon), 1206 - TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI_SENSOR, 20, &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor), 1207 - TEGRA_INIT_DATA_DIV16("i2c1", "div-clk", "tegra-i2c.0", mux_pllp_clkm, CLK_SOURCE_I2C1, 12, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2c1), 1208 - TEGRA_INIT_DATA_DIV16("i2c2", "div-clk", "tegra-i2c.1", mux_pllp_clkm, CLK_SOURCE_I2C2, 54, &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c2), 1209 - TEGRA_INIT_DATA_DIV16("i2c3", "div-clk", "tegra-i2c.2", mux_pllp_clkm, CLK_SOURCE_I2C3, 67, &periph_u_regs, TEGRA_PERIPH_ON_APB, i2c3), 1210 - TEGRA_INIT_DATA_DIV16("i2c4", "div-clk", "tegra-i2c.3", mux_pllp_clkm, CLK_SOURCE_I2C4, 103, &periph_v_regs, TEGRA_PERIPH_ON_APB, i2c4), 1211 - TEGRA_INIT_DATA_DIV16("i2c5", "div-clk", "tegra-i2c.4", mux_pllp_clkm, CLK_SOURCE_I2C5, 47, &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c5), 1212 - TEGRA_INIT_DATA_UART("uarta", NULL, "tegra_uart.0", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 6, &periph_l_regs, uarta), 1213 - TEGRA_INIT_DATA_UART("uartb", NULL, "tegra_uart.1", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 7, &periph_l_regs, uartb), 1214 - TEGRA_INIT_DATA_UART("uartc", NULL, "tegra_uart.2", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 55, &periph_h_regs, uartc), 1215 - TEGRA_INIT_DATA_UART("uartd", NULL, "tegra_uart.3", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 65, &periph_u_regs, uartd), 1216 - TEGRA_INIT_DATA_UART("uarte", NULL, "tegra_uart.4", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 66, &periph_u_regs, uarte), 1217 - TEGRA_INIT_DATA_MUX8("hdmi", NULL, "hdmi", mux_pllpmdacd2_clkm, CLK_SOURCE_HDMI, 51, &periph_h_regs, 0, hdmi), 1218 - TEGRA_INIT_DATA_MUX8("extern1", NULL, "extern1", mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, &periph_v_regs, 0, extern1), 1219 - TEGRA_INIT_DATA_MUX8("extern2", NULL, "extern2", mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, &periph_v_regs, 0, extern2), 1220 - TEGRA_INIT_DATA_MUX8("extern3", NULL, "extern3", mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, &periph_v_regs, 0, extern3), 1221 - TEGRA_INIT_DATA("pwm", NULL, "pwm", mux_pllpc_clk32k_clkm, CLK_SOURCE_PWM, 28, 2, 0, 0, 8, 1, 0, &periph_l_regs, 17, periph_clk_enb_refcnt, 0, pwm), 1406 + TEGRA_INIT_DATA_MUX("spdif_out", spdif_out_parents, CLK_SOURCE_SPDIF_OUT, 10, TEGRA_PERIPH_ON_APB, TEGRA30_CLK_SPDIF_OUT), 1407 + TEGRA_INIT_DATA_MUX("d_audio", mux_pllacp_clkm, CLK_SOURCE_D_AUDIO, 106, 0, TEGRA30_CLK_D_AUDIO), 1408 + TEGRA_INIT_DATA_MUX("dam0", mux_pllacp_clkm, CLK_SOURCE_DAM0, 108, 0, TEGRA30_CLK_DAM0), 1409 + TEGRA_INIT_DATA_MUX("dam1", mux_pllacp_clkm, CLK_SOURCE_DAM1, 109, 0, TEGRA30_CLK_DAM1), 1410 + TEGRA_INIT_DATA_MUX("dam2", mux_pllacp_clkm, CLK_SOURCE_DAM2, 110, 0, TEGRA30_CLK_DAM2), 1411 + TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, TEGRA_PERIPH_MANUAL_RESET, TEGRA30_CLK_GR3D2), 1412 + TEGRA_INIT_DATA_INT("se", mux_pllpcm_clkm, CLK_SOURCE_SE, 127, 0, TEGRA30_CLK_SE), 1413 + TEGRA_INIT_DATA_MUX8("hdmi", mux_pllpmdacd2_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA30_CLK_HDMI), 1414 + TEGRA_INIT_DATA("pwm", NULL, NULL, pwm_parents, CLK_SOURCE_PWM, 28, 2, 0, 0, 8, 1, 0, 17, TEGRA_PERIPH_ON_APB, TEGRA30_CLK_PWM), 1222 1415 }; 1223 1416 1224 1417 static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = { 1225 - TEGRA_INIT_DATA_NODIV("disp1", NULL, "tegradc.0", mux_pllpmdacd2_clkm, CLK_SOURCE_DISP1, 29, 3, 27, &periph_l_regs, 0, disp1), 1226 - TEGRA_INIT_DATA_NODIV("disp2", NULL, "tegradc.1", mux_pllpmdacd2_clkm, CLK_SOURCE_DISP2, 29, 3, 26, &periph_l_regs, 0, disp2), 1227 - TEGRA_INIT_DATA_NODIV("dsib", NULL, "tegradc.1", mux_plld_out0_plld2_out0, CLK_SOURCE_DSIB, 25, 1, 82, &periph_u_regs, 0, dsib), 1418 + TEGRA_INIT_DATA_NODIV("dsib", mux_plld_out0_plld2_out0, CLK_SOURCE_DSIB, 25, 1, 82, 0, TEGRA30_CLK_DSIB), 1228 1419 }; 1229 1420 1230 1421 static void __init tegra30_periph_clk_init(void) ··· 1135 1522 struct clk *clk; 1136 1523 int i; 1137 1524 1138 - /* apbdma */ 1139 - clk = tegra_clk_register_periph_gate("apbdma", "clk_m", 0, clk_base, 0, 34, 1140 - &periph_h_regs, periph_clk_enb_refcnt); 1141 - clk_register_clkdev(clk, NULL, "tegra-apbdma"); 1142 - clks[apbdma] = clk; 1143 - 1144 - /* rtc */ 1145 - clk = tegra_clk_register_periph_gate("rtc", "clk_32k", 1146 - TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB, 1147 - clk_base, 0, 4, &periph_l_regs, 1148 - periph_clk_enb_refcnt); 1149 - clk_register_clkdev(clk, NULL, "rtc-tegra"); 1150 - clks[rtc] = clk; 1151 - 1152 - /* timer */ 1153 - clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base, 0, 1154 - 5, &periph_l_regs, periph_clk_enb_refcnt); 1155 - clk_register_clkdev(clk, NULL, "timer"); 1156 - clks[timer] = clk; 1157 - 1158 - /* kbc */ 1159 - clk = tegra_clk_register_periph_gate("kbc", "clk_32k", 1160 - TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB, 1161 - clk_base, 0, 36, &periph_h_regs, 1162 - periph_clk_enb_refcnt); 1163 - clk_register_clkdev(clk, NULL, "tegra-kbc"); 1164 - clks[kbc] = clk; 1165 - 1166 - /* csus */ 1167 - clk = tegra_clk_register_periph_gate("csus", "clk_m", 1168 - TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB, 1169 - clk_base, 0, 92, &periph_u_regs, 1170 - periph_clk_enb_refcnt); 1171 - clk_register_clkdev(clk, "csus", "tengra_camera"); 1172 - clks[csus] = clk; 1173 - 1174 - /* vcp */ 1175 - clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0, clk_base, 0, 29, 1176 - &periph_l_regs, periph_clk_enb_refcnt); 1177 - clk_register_clkdev(clk, "vcp", "tegra-avp"); 1178 - clks[vcp] = clk; 1179 - 1180 - /* bsea */ 1181 - clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0, clk_base, 0, 1182 - 62, &periph_h_regs, periph_clk_enb_refcnt); 1183 - clk_register_clkdev(clk, "bsea", "tegra-avp"); 1184 - clks[bsea] = clk; 1185 - 1186 - /* bsev */ 1187 - clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0, clk_base, 0, 1188 - 63, &periph_h_regs, periph_clk_enb_refcnt); 1189 - clk_register_clkdev(clk, "bsev", "tegra-aes"); 1190 - clks[bsev] = clk; 1191 - 1192 - /* usbd */ 1193 - clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 0, 1194 - 22, &periph_l_regs, periph_clk_enb_refcnt); 1195 - clk_register_clkdev(clk, NULL, "fsl-tegra-udc"); 1196 - clks[usbd] = clk; 1197 - 1198 - /* usb2 */ 1199 - clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 0, 1200 - 58, &periph_h_regs, periph_clk_enb_refcnt); 1201 - clk_register_clkdev(clk, NULL, "tegra-ehci.1"); 1202 - clks[usb2] = clk; 1203 - 1204 - /* usb3 */ 1205 - clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 0, 1206 - 59, &periph_h_regs, periph_clk_enb_refcnt); 1207 - clk_register_clkdev(clk, NULL, "tegra-ehci.2"); 1208 - clks[usb3] = clk; 1209 - 1210 1525 /* dsia */ 1211 1526 clk = tegra_clk_register_periph_gate("dsia", "pll_d_out0", 0, clk_base, 1212 - 0, 48, &periph_h_regs, 1213 - periph_clk_enb_refcnt); 1214 - clk_register_clkdev(clk, "dsia", "tegradc.0"); 1215 - clks[dsia] = clk; 1216 - 1217 - /* csi */ 1218 - clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base, 1219 - 0, 52, &periph_h_regs, 1220 - periph_clk_enb_refcnt); 1221 - clk_register_clkdev(clk, "csi", "tegra_camera"); 1222 - clks[csi] = clk; 1223 - 1224 - /* isp */ 1225 - clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 23, 1226 - &periph_l_regs, periph_clk_enb_refcnt); 1227 - clk_register_clkdev(clk, "isp", "tegra_camera"); 1228 - clks[isp] = clk; 1527 + 0, 48, periph_clk_enb_refcnt); 1528 + clks[TEGRA30_CLK_DSIA] = clk; 1229 1529 1230 1530 /* pcie */ 1231 1531 clk = tegra_clk_register_periph_gate("pcie", "clk_m", 0, clk_base, 0, 1232 - 70, &periph_u_regs, periph_clk_enb_refcnt); 1233 - clk_register_clkdev(clk, "pcie", "tegra-pcie"); 1234 - clks[pcie] = clk; 1532 + 70, periph_clk_enb_refcnt); 1533 + clks[TEGRA30_CLK_PCIE] = clk; 1235 1534 1236 1535 /* afi */ 1237 1536 clk = tegra_clk_register_periph_gate("afi", "clk_m", 0, clk_base, 0, 72, 1238 - &periph_u_regs, periph_clk_enb_refcnt); 1239 - clk_register_clkdev(clk, "afi", "tegra-pcie"); 1240 - clks[afi] = clk; 1537 + periph_clk_enb_refcnt); 1538 + clks[TEGRA30_CLK_AFI] = clk; 1241 1539 1242 1540 /* pciex */ 1243 1541 clk = tegra_clk_register_periph_gate("pciex", "pll_e", 0, clk_base, 0, 1244 - 74, &periph_u_regs, periph_clk_enb_refcnt); 1245 - clk_register_clkdev(clk, "pciex", "tegra-pcie"); 1246 - clks[pciex] = clk; 1247 - 1248 - /* kfuse */ 1249 - clk = tegra_clk_register_periph_gate("kfuse", "clk_m", 1250 - TEGRA_PERIPH_ON_APB, 1251 - clk_base, 0, 40, &periph_h_regs, 1252 - periph_clk_enb_refcnt); 1253 - clk_register_clkdev(clk, NULL, "kfuse-tegra"); 1254 - clks[kfuse] = clk; 1255 - 1256 - /* fuse */ 1257 - clk = tegra_clk_register_periph_gate("fuse", "clk_m", 1258 - TEGRA_PERIPH_ON_APB, 1259 - clk_base, 0, 39, &periph_h_regs, 1260 - periph_clk_enb_refcnt); 1261 - clk_register_clkdev(clk, "fuse", "fuse-tegra"); 1262 - clks[fuse] = clk; 1263 - 1264 - /* fuse_burn */ 1265 - clk = tegra_clk_register_periph_gate("fuse_burn", "clk_m", 1266 - TEGRA_PERIPH_ON_APB, 1267 - clk_base, 0, 39, &periph_h_regs, 1268 - periph_clk_enb_refcnt); 1269 - clk_register_clkdev(clk, "fuse_burn", "fuse-tegra"); 1270 - clks[fuse_burn] = clk; 1271 - 1272 - /* apbif */ 1273 - clk = tegra_clk_register_periph_gate("apbif", "clk_m", 0, 1274 - clk_base, 0, 107, &periph_v_regs, 1275 - periph_clk_enb_refcnt); 1276 - clk_register_clkdev(clk, "apbif", "tegra30-ahub"); 1277 - clks[apbif] = clk; 1278 - 1279 - /* hda2hdmi */ 1280 - clk = tegra_clk_register_periph_gate("hda2hdmi", "clk_m", 1281 - TEGRA_PERIPH_ON_APB, 1282 - clk_base, 0, 128, &periph_w_regs, 1283 - periph_clk_enb_refcnt); 1284 - clk_register_clkdev(clk, "hda2hdmi", "tegra30-hda"); 1285 - clks[hda2hdmi] = clk; 1286 - 1287 - /* sata_cold */ 1288 - clk = tegra_clk_register_periph_gate("sata_cold", "clk_m", 1289 - TEGRA_PERIPH_ON_APB, 1290 - clk_base, 0, 129, &periph_w_regs, 1291 - periph_clk_enb_refcnt); 1292 - clk_register_clkdev(clk, NULL, "tegra_sata_cold"); 1293 - clks[sata_cold] = clk; 1294 - 1295 - /* dtv */ 1296 - clk = tegra_clk_register_periph_gate("dtv", "clk_m", 1297 - TEGRA_PERIPH_ON_APB, 1298 - clk_base, 0, 79, &periph_u_regs, 1299 - periph_clk_enb_refcnt); 1300 - clk_register_clkdev(clk, NULL, "dtv"); 1301 - clks[dtv] = clk; 1542 + 74, periph_clk_enb_refcnt); 1543 + clks[TEGRA30_CLK_PCIEX] = clk; 1302 1544 1303 1545 /* emc */ 1304 1546 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, ··· 1162 1694 clk_base + CLK_SOURCE_EMC, 1163 1695 30, 2, 0, NULL); 1164 1696 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, 1165 - 57, &periph_h_regs, periph_clk_enb_refcnt); 1166 - clk_register_clkdev(clk, "emc", NULL); 1167 - clks[emc] = clk; 1697 + 57, periph_clk_enb_refcnt); 1698 + clks[TEGRA30_CLK_EMC] = clk; 1699 + 1700 + /* cml0 */ 1701 + clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, 1702 + 0, 0, &cml_lock); 1703 + clks[TEGRA30_CLK_CML0] = clk; 1704 + 1705 + /* cml1 */ 1706 + clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX, 1707 + 1, 0, &cml_lock); 1708 + clks[TEGRA30_CLK_CML1] = clk; 1168 1709 1169 1710 for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) { 1170 1711 data = &tegra_periph_clk_list[i]; 1171 - clk = tegra_clk_register_periph(data->name, data->parent_names, 1712 + clk = tegra_clk_register_periph(data->name, data->p.parent_names, 1172 1713 data->num_parents, &data->periph, 1173 1714 clk_base, data->offset, data->flags); 1174 - clk_register_clkdev(clk, data->con_id, data->dev_id); 1175 1715 clks[data->clk_id] = clk; 1176 1716 } 1177 1717 1178 1718 for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) { 1179 1719 data = &tegra_periph_nodiv_clk_list[i]; 1180 1720 clk = tegra_clk_register_periph_nodiv(data->name, 1181 - data->parent_names, 1721 + data->p.parent_names, 1182 1722 data->num_parents, &data->periph, 1183 1723 clk_base, data->offset); 1184 - clk_register_clkdev(clk, data->con_id, data->dev_id); 1185 1724 clks[data->clk_id] = clk; 1186 1725 } 1187 - } 1188 1726 1189 - static void __init tegra30_fixed_clk_init(void) 1190 - { 1191 - struct clk *clk; 1192 - 1193 - /* clk_32k */ 1194 - clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT, 1195 - 32768); 1196 - clk_register_clkdev(clk, "clk_32k", NULL); 1197 - clks[clk_32k] = clk; 1198 - 1199 - /* clk_m_div2 */ 1200 - clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m", 1201 - CLK_SET_RATE_PARENT, 1, 2); 1202 - clk_register_clkdev(clk, "clk_m_div2", NULL); 1203 - clks[clk_m_div2] = clk; 1204 - 1205 - /* clk_m_div4 */ 1206 - clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m", 1207 - CLK_SET_RATE_PARENT, 1, 4); 1208 - clk_register_clkdev(clk, "clk_m_div4", NULL); 1209 - clks[clk_m_div4] = clk; 1210 - 1211 - /* cml0 */ 1212 - clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, 1213 - 0, 0, &cml_lock); 1214 - clk_register_clkdev(clk, "cml0", NULL); 1215 - clks[cml0] = clk; 1216 - 1217 - /* cml1 */ 1218 - clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX, 1219 - 1, 0, &cml_lock); 1220 - clk_register_clkdev(clk, "cml1", NULL); 1221 - clks[cml1] = clk; 1222 - } 1223 - 1224 - static void __init tegra30_osc_clk_init(void) 1225 - { 1226 - struct clk *clk; 1227 - unsigned int pll_ref_div; 1228 - 1229 - tegra30_clk_measure_input_freq(); 1230 - 1231 - /* clk_m */ 1232 - clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT, 1233 - input_freq); 1234 - clk_register_clkdev(clk, "clk_m", NULL); 1235 - clks[clk_m] = clk; 1236 - 1237 - /* pll_ref */ 1238 - pll_ref_div = tegra30_get_pll_ref_div(); 1239 - clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m", 1240 - CLK_SET_RATE_PARENT, 1, pll_ref_div); 1241 - clk_register_clkdev(clk, "pll_ref", NULL); 1242 - clks[pll_ref] = clk; 1727 + tegra_periph_clk_init(clk_base, pmc_base, tegra30_clks, &pll_p_params); 1243 1728 } 1244 1729 1245 1730 /* Tegra30 CPU clock and reset control functions */ ··· 1334 1913 }; 1335 1914 1336 1915 static struct tegra_clk_init_table init_table[] __initdata = { 1337 - {uarta, pll_p, 408000000, 0}, 1338 - {uartb, pll_p, 408000000, 0}, 1339 - {uartc, pll_p, 408000000, 0}, 1340 - {uartd, pll_p, 408000000, 0}, 1341 - {uarte, pll_p, 408000000, 0}, 1342 - {pll_a, clk_max, 564480000, 1}, 1343 - {pll_a_out0, clk_max, 11289600, 1}, 1344 - {extern1, pll_a_out0, 0, 1}, 1345 - {clk_out_1_mux, extern1, 0, 0}, 1346 - {clk_out_1, clk_max, 0, 1}, 1347 - {blink, clk_max, 0, 1}, 1348 - {i2s0, pll_a_out0, 11289600, 0}, 1349 - {i2s1, pll_a_out0, 11289600, 0}, 1350 - {i2s2, pll_a_out0, 11289600, 0}, 1351 - {i2s3, pll_a_out0, 11289600, 0}, 1352 - {i2s4, pll_a_out0, 11289600, 0}, 1353 - {sdmmc1, pll_p, 48000000, 0}, 1354 - {sdmmc2, pll_p, 48000000, 0}, 1355 - {sdmmc3, pll_p, 48000000, 0}, 1356 - {pll_m, clk_max, 0, 1}, 1357 - {pclk, clk_max, 0, 1}, 1358 - {csite, clk_max, 0, 1}, 1359 - {emc, clk_max, 0, 1}, 1360 - {mselect, clk_max, 0, 1}, 1361 - {sbc1, pll_p, 100000000, 0}, 1362 - {sbc2, pll_p, 100000000, 0}, 1363 - {sbc3, pll_p, 100000000, 0}, 1364 - {sbc4, pll_p, 100000000, 0}, 1365 - {sbc5, pll_p, 100000000, 0}, 1366 - {sbc6, pll_p, 100000000, 0}, 1367 - {host1x, pll_c, 150000000, 0}, 1368 - {disp1, pll_p, 600000000, 0}, 1369 - {disp2, pll_p, 600000000, 0}, 1370 - {twd, clk_max, 0, 1}, 1371 - {gr2d, pll_c, 300000000, 0}, 1372 - {gr3d, pll_c, 300000000, 0}, 1373 - {clk_max, clk_max, 0, 0}, /* This MUST be the last entry. */ 1916 + {TEGRA30_CLK_UARTA, TEGRA30_CLK_PLL_P, 408000000, 0}, 1917 + {TEGRA30_CLK_UARTB, TEGRA30_CLK_PLL_P, 408000000, 0}, 1918 + {TEGRA30_CLK_UARTC, TEGRA30_CLK_PLL_P, 408000000, 0}, 1919 + {TEGRA30_CLK_UARTD, TEGRA30_CLK_PLL_P, 408000000, 0}, 1920 + {TEGRA30_CLK_UARTE, TEGRA30_CLK_PLL_P, 408000000, 0}, 1921 + {TEGRA30_CLK_PLL_A, TEGRA30_CLK_CLK_MAX, 564480000, 1}, 1922 + {TEGRA30_CLK_PLL_A_OUT0, TEGRA30_CLK_CLK_MAX, 11289600, 1}, 1923 + {TEGRA30_CLK_EXTERN1, TEGRA30_CLK_PLL_A_OUT0, 0, 1}, 1924 + {TEGRA30_CLK_CLK_OUT_1_MUX, TEGRA30_CLK_EXTERN1, 0, 0}, 1925 + {TEGRA30_CLK_CLK_OUT_1, TEGRA30_CLK_CLK_MAX, 0, 1}, 1926 + {TEGRA30_CLK_BLINK, TEGRA30_CLK_CLK_MAX, 0, 1}, 1927 + {TEGRA30_CLK_I2S0, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0}, 1928 + {TEGRA30_CLK_I2S1, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0}, 1929 + {TEGRA30_CLK_I2S2, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0}, 1930 + {TEGRA30_CLK_I2S3, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0}, 1931 + {TEGRA30_CLK_I2S4, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0}, 1932 + {TEGRA30_CLK_SDMMC1, TEGRA30_CLK_PLL_P, 48000000, 0}, 1933 + {TEGRA30_CLK_SDMMC2, TEGRA30_CLK_PLL_P, 48000000, 0}, 1934 + {TEGRA30_CLK_SDMMC3, TEGRA30_CLK_PLL_P, 48000000, 0}, 1935 + {TEGRA30_CLK_PLL_M, TEGRA30_CLK_CLK_MAX, 0, 1}, 1936 + {TEGRA30_CLK_PCLK, TEGRA30_CLK_CLK_MAX, 0, 1}, 1937 + {TEGRA30_CLK_CSITE, TEGRA30_CLK_CLK_MAX, 0, 1}, 1938 + {TEGRA30_CLK_EMC, TEGRA30_CLK_CLK_MAX, 0, 1}, 1939 + {TEGRA30_CLK_MSELECT, TEGRA30_CLK_CLK_MAX, 0, 1}, 1940 + {TEGRA30_CLK_SBC1, TEGRA30_CLK_PLL_P, 100000000, 0}, 1941 + {TEGRA30_CLK_SBC2, TEGRA30_CLK_PLL_P, 100000000, 0}, 1942 + {TEGRA30_CLK_SBC3, TEGRA30_CLK_PLL_P, 100000000, 0}, 1943 + {TEGRA30_CLK_SBC4, TEGRA30_CLK_PLL_P, 100000000, 0}, 1944 + {TEGRA30_CLK_SBC5, TEGRA30_CLK_PLL_P, 100000000, 0}, 1945 + {TEGRA30_CLK_SBC6, TEGRA30_CLK_PLL_P, 100000000, 0}, 1946 + {TEGRA30_CLK_HOST1X, TEGRA30_CLK_PLL_C, 150000000, 0}, 1947 + {TEGRA30_CLK_DISP1, TEGRA30_CLK_PLL_P, 600000000, 0}, 1948 + {TEGRA30_CLK_DISP2, TEGRA30_CLK_PLL_P, 600000000, 0}, 1949 + {TEGRA30_CLK_TWD, TEGRA30_CLK_CLK_MAX, 0, 1}, 1950 + {TEGRA30_CLK_GR2D, TEGRA30_CLK_PLL_C, 300000000, 0}, 1951 + {TEGRA30_CLK_GR3D, TEGRA30_CLK_PLL_C, 300000000, 0}, 1952 + {TEGRA30_CLK_GR3D2, TEGRA30_CLK_PLL_C, 300000000, 0}, 1953 + {TEGRA30_CLK_CLK_MAX, TEGRA30_CLK_CLK_MAX, 0, 0}, /* This MUST be the last entry. */ 1374 1954 }; 1375 1955 1376 1956 static void __init tegra30_clock_apply_init_table(void) 1377 1957 { 1378 - tegra_init_from_table(init_table, clks, clk_max); 1958 + tegra_init_from_table(init_table, clks, TEGRA30_CLK_CLK_MAX); 1379 1959 } 1380 1960 1381 1961 /* ··· 1385 1963 * table under two names. 1386 1964 */ 1387 1965 static struct tegra_clk_duplicate tegra_clk_duplicates[] = { 1388 - TEGRA_CLK_DUPLICATE(usbd, "utmip-pad", NULL), 1389 - TEGRA_CLK_DUPLICATE(usbd, "tegra-ehci.0", NULL), 1390 - TEGRA_CLK_DUPLICATE(usbd, "tegra-otg", NULL), 1391 - TEGRA_CLK_DUPLICATE(bsev, "tegra-avp", "bsev"), 1392 - TEGRA_CLK_DUPLICATE(bsev, "nvavp", "bsev"), 1393 - TEGRA_CLK_DUPLICATE(vde, "tegra-aes", "vde"), 1394 - TEGRA_CLK_DUPLICATE(bsea, "tegra-aes", "bsea"), 1395 - TEGRA_CLK_DUPLICATE(bsea, "nvavp", "bsea"), 1396 - TEGRA_CLK_DUPLICATE(cml1, "tegra_sata_cml", NULL), 1397 - TEGRA_CLK_DUPLICATE(cml0, "tegra_pcie", "cml"), 1398 - TEGRA_CLK_DUPLICATE(pciex, "tegra_pcie", "pciex"), 1399 - TEGRA_CLK_DUPLICATE(vcp, "nvavp", "vcp"), 1400 - TEGRA_CLK_DUPLICATE(clk_max, NULL, NULL), /* MUST be the last entry */ 1966 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_USBD, "utmip-pad", NULL), 1967 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_USBD, "tegra-ehci.0", NULL), 1968 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_USBD, "tegra-otg", NULL), 1969 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_BSEV, "tegra-avp", "bsev"), 1970 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_BSEV, "nvavp", "bsev"), 1971 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_VDE, "tegra-aes", "vde"), 1972 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_BSEA, "tegra-aes", "bsea"), 1973 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_BSEA, "nvavp", "bsea"), 1974 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_CML1, "tegra_sata_cml", NULL), 1975 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_CML0, "tegra_pcie", "cml"), 1976 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_PCIEX, "tegra_pcie", "pciex"), 1977 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_VCP, "nvavp", "vcp"), 1978 + TEGRA_CLK_DUPLICATE(TEGRA30_CLK_CLK_MAX, NULL, NULL), /* MUST be the last entry */ 1401 1979 }; 1402 1980 1403 1981 static const struct of_device_id pmc_match[] __initconst = { ··· 1408 1986 static void __init tegra30_clock_init(struct device_node *np) 1409 1987 { 1410 1988 struct device_node *node; 1411 - int i; 1412 1989 1413 1990 clk_base = of_iomap(np, 0); 1414 1991 if (!clk_base) { ··· 1427 2006 BUG(); 1428 2007 } 1429 2008 1430 - tegra30_osc_clk_init(); 1431 - tegra30_fixed_clk_init(); 2009 + clks = tegra_clk_init(TEGRA30_CLK_CLK_MAX, TEGRA30_CLK_PERIPH_BANKS); 2010 + if (!clks) 2011 + return; 2012 + 2013 + if (tegra_osc_clk_init(clk_base, tegra30_clks, tegra30_input_freq, 2014 + ARRAY_SIZE(tegra30_input_freq), &input_freq, NULL) < 0) 2015 + return; 2016 + 2017 + 2018 + tegra_fixed_clk_init(tegra30_clks); 1432 2019 tegra30_pll_init(); 1433 2020 tegra30_super_clk_init(); 1434 2021 tegra30_periph_clk_init(); 1435 - tegra30_audio_clk_init(); 1436 - tegra30_pmc_clk_init(); 2022 + tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks, &pll_a_params); 2023 + tegra_pmc_clk_init(pmc_base, tegra30_clks); 1437 2024 1438 - for (i = 0; i < ARRAY_SIZE(clks); i++) { 1439 - if (IS_ERR(clks[i])) { 1440 - pr_err("Tegra30 clk %d: register failed with %ld\n", 1441 - i, PTR_ERR(clks[i])); 1442 - BUG(); 1443 - } 1444 - if (!clks[i]) 1445 - clks[i] = ERR_PTR(-EINVAL); 1446 - } 2025 + tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); 1447 2026 1448 - tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max); 1449 - 1450 - clk_data.clks = clks; 1451 - clk_data.clk_num = ARRAY_SIZE(clks); 1452 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 2027 + tegra_add_of_provider(np); 2028 + tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1453 2029 1454 2030 tegra_clk_apply_init_table = tegra30_clock_apply_init_table; 1455 2031
+166
drivers/clk/tegra/clk.c
··· 21 21 22 22 #include "clk.h" 23 23 24 + #define CLK_OUT_ENB_L 0x010 25 + #define CLK_OUT_ENB_H 0x014 26 + #define CLK_OUT_ENB_U 0x018 27 + #define CLK_OUT_ENB_V 0x360 28 + #define CLK_OUT_ENB_W 0x364 29 + #define CLK_OUT_ENB_X 0x280 30 + #define CLK_OUT_ENB_SET_L 0x320 31 + #define CLK_OUT_ENB_CLR_L 0x324 32 + #define CLK_OUT_ENB_SET_H 0x328 33 + #define CLK_OUT_ENB_CLR_H 0x32c 34 + #define CLK_OUT_ENB_SET_U 0x330 35 + #define CLK_OUT_ENB_CLR_U 0x334 36 + #define CLK_OUT_ENB_SET_V 0x440 37 + #define CLK_OUT_ENB_CLR_V 0x444 38 + #define CLK_OUT_ENB_SET_W 0x448 39 + #define CLK_OUT_ENB_CLR_W 0x44c 40 + #define CLK_OUT_ENB_SET_X 0x284 41 + #define CLK_OUT_ENB_CLR_X 0x288 42 + 43 + #define RST_DEVICES_L 0x004 44 + #define RST_DEVICES_H 0x008 45 + #define RST_DEVICES_U 0x00C 46 + #define RST_DFLL_DVCO 0x2F4 47 + #define RST_DEVICES_V 0x358 48 + #define RST_DEVICES_W 0x35C 49 + #define RST_DEVICES_X 0x28C 50 + #define RST_DEVICES_SET_L 0x300 51 + #define RST_DEVICES_CLR_L 0x304 52 + #define RST_DEVICES_SET_H 0x308 53 + #define RST_DEVICES_CLR_H 0x30c 54 + #define RST_DEVICES_SET_U 0x310 55 + #define RST_DEVICES_CLR_U 0x314 56 + #define RST_DEVICES_SET_V 0x430 57 + #define RST_DEVICES_CLR_V 0x434 58 + #define RST_DEVICES_SET_W 0x438 59 + #define RST_DEVICES_CLR_W 0x43c 60 + #define RST_DEVICES_SET_X 0x290 61 + #define RST_DEVICES_CLR_X 0x294 62 + 24 63 /* Global data of Tegra CPU CAR ops */ 25 64 static struct tegra_cpu_car_ops dummy_car_ops; 26 65 struct tegra_cpu_car_ops *tegra_cpu_car_ops = &dummy_car_ops; 66 + 67 + int *periph_clk_enb_refcnt; 68 + static int periph_banks; 69 + static struct clk **clks; 70 + static int clk_num; 71 + static struct clk_onecell_data clk_data; 72 + 73 + static struct tegra_clk_periph_regs periph_regs[] = { 74 + [0] = { 75 + .enb_reg = CLK_OUT_ENB_L, 76 + .enb_set_reg = CLK_OUT_ENB_SET_L, 77 + .enb_clr_reg = CLK_OUT_ENB_CLR_L, 78 + .rst_reg = RST_DEVICES_L, 79 + .rst_set_reg = RST_DEVICES_SET_L, 80 + .rst_clr_reg = RST_DEVICES_CLR_L, 81 + }, 82 + [1] = { 83 + .enb_reg = CLK_OUT_ENB_H, 84 + .enb_set_reg = CLK_OUT_ENB_SET_H, 85 + .enb_clr_reg = CLK_OUT_ENB_CLR_H, 86 + .rst_reg = RST_DEVICES_H, 87 + .rst_set_reg = RST_DEVICES_SET_H, 88 + .rst_clr_reg = RST_DEVICES_CLR_H, 89 + }, 90 + [2] = { 91 + .enb_reg = CLK_OUT_ENB_U, 92 + .enb_set_reg = CLK_OUT_ENB_SET_U, 93 + .enb_clr_reg = CLK_OUT_ENB_CLR_U, 94 + .rst_reg = RST_DEVICES_U, 95 + .rst_set_reg = RST_DEVICES_SET_U, 96 + .rst_clr_reg = RST_DEVICES_CLR_U, 97 + }, 98 + [3] = { 99 + .enb_reg = CLK_OUT_ENB_V, 100 + .enb_set_reg = CLK_OUT_ENB_SET_V, 101 + .enb_clr_reg = CLK_OUT_ENB_CLR_V, 102 + .rst_reg = RST_DEVICES_V, 103 + .rst_set_reg = RST_DEVICES_SET_V, 104 + .rst_clr_reg = RST_DEVICES_CLR_V, 105 + }, 106 + [4] = { 107 + .enb_reg = CLK_OUT_ENB_W, 108 + .enb_set_reg = CLK_OUT_ENB_SET_W, 109 + .enb_clr_reg = CLK_OUT_ENB_CLR_W, 110 + .rst_reg = RST_DEVICES_W, 111 + .rst_set_reg = RST_DEVICES_SET_W, 112 + .rst_clr_reg = RST_DEVICES_CLR_W, 113 + }, 114 + [5] = { 115 + .enb_reg = CLK_OUT_ENB_X, 116 + .enb_set_reg = CLK_OUT_ENB_SET_X, 117 + .enb_clr_reg = CLK_OUT_ENB_CLR_X, 118 + .rst_reg = RST_DEVICES_X, 119 + .rst_set_reg = RST_DEVICES_SET_X, 120 + .rst_clr_reg = RST_DEVICES_CLR_X, 121 + }, 122 + }; 123 + 124 + struct tegra_clk_periph_regs *get_reg_bank(int clkid) 125 + { 126 + int reg_bank = clkid / 32; 127 + 128 + if (reg_bank < periph_banks) 129 + return &periph_regs[reg_bank]; 130 + else { 131 + WARN_ON(1); 132 + return NULL; 133 + } 134 + } 135 + 136 + struct clk ** __init tegra_clk_init(int num, int banks) 137 + { 138 + if (WARN_ON(banks > ARRAY_SIZE(periph_regs))) 139 + return NULL; 140 + 141 + periph_clk_enb_refcnt = kzalloc(32 * banks * 142 + sizeof(*periph_clk_enb_refcnt), GFP_KERNEL); 143 + if (!periph_clk_enb_refcnt) 144 + return NULL; 145 + 146 + periph_banks = banks; 147 + 148 + clks = kzalloc(num * sizeof(struct clk *), GFP_KERNEL); 149 + if (!clks) 150 + kfree(periph_clk_enb_refcnt); 151 + 152 + clk_num = num; 153 + 154 + return clks; 155 + } 27 156 28 157 void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list, 29 158 struct clk *clks[], int clk_max) ··· 201 72 WARN_ON(1); 202 73 } 203 74 } 75 + } 76 + 77 + void __init tegra_add_of_provider(struct device_node *np) 78 + { 79 + int i; 80 + 81 + for (i = 0; i < clk_num; i++) { 82 + if (IS_ERR(clks[i])) { 83 + pr_err 84 + ("Tegra clk %d: register failed with %ld\n", 85 + i, PTR_ERR(clks[i])); 86 + } 87 + if (!clks[i]) 88 + clks[i] = ERR_PTR(-EINVAL); 89 + } 90 + 91 + clk_data.clks = clks; 92 + clk_data.clk_num = clk_num; 93 + of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 94 + } 95 + 96 + void __init tegra_register_devclks(struct tegra_devclk *dev_clks, int num) 97 + { 98 + int i; 99 + 100 + for (i = 0; i < num; i++, dev_clks++) 101 + clk_register_clkdev(clks[dev_clks->dt_id], dev_clks->con_id, 102 + dev_clks->dev_id); 103 + } 104 + 105 + struct clk ** __init tegra_lookup_dt_id(int clk_id, 106 + struct tegra_clk *tegra_clk) 107 + { 108 + if (tegra_clk[clk_id].present) 109 + return &clks[tegra_clk[clk_id].dt_id]; 110 + else 111 + return NULL; 204 112 } 205 113 206 114 tegra_clk_apply_init_table_func tegra_clk_apply_init_table;
+75 -40
drivers/clk/tegra/clk.h
··· 37 37 container_of(_hw, struct tegra_clk_sync_source, hw) 38 38 39 39 extern const struct clk_ops tegra_clk_sync_source_ops; 40 + extern int *periph_clk_enb_refcnt; 41 + 40 42 struct clk *tegra_clk_register_sync_source(const char *name, 41 43 unsigned long fixed_rate, unsigned long max_rate); 42 44 ··· 190 188 u32 ext_misc_reg[3]; 191 189 u32 pmc_divnm_reg; 192 190 u32 pmc_divp_reg; 191 + u32 flags; 193 192 int stepa_shift; 194 193 int stepb_shift; 195 194 int lock_delay; 196 195 int max_p; 197 196 struct pdiv_map *pdiv_tohw; 198 197 struct div_nmp *div_nmp; 198 + struct tegra_clk_pll_freq_table *freq_table; 199 + unsigned long fixed_rate; 199 200 }; 200 201 201 202 /** ··· 238 233 struct clk_hw hw; 239 234 void __iomem *clk_base; 240 235 void __iomem *pmc; 241 - u32 flags; 242 - unsigned long fixed_rate; 243 236 spinlock_t *lock; 244 - struct tegra_clk_pll_freq_table *freq_table; 245 237 struct tegra_clk_pll_params *params; 246 238 }; 247 239 ··· 260 258 extern const struct clk_ops tegra_clk_plle_ops; 261 259 struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, 262 260 void __iomem *clk_base, void __iomem *pmc, 263 - unsigned long flags, unsigned long fixed_rate, 264 - struct tegra_clk_pll_params *pll_params, u32 pll_flags, 265 - struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock); 261 + unsigned long flags, struct tegra_clk_pll_params *pll_params, 262 + spinlock_t *lock); 266 263 267 264 struct clk *tegra_clk_register_plle(const char *name, const char *parent_name, 268 265 void __iomem *clk_base, void __iomem *pmc, 269 - unsigned long flags, unsigned long fixed_rate, 270 - struct tegra_clk_pll_params *pll_params, u32 pll_flags, 271 - struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock); 266 + unsigned long flags, struct tegra_clk_pll_params *pll_params, 267 + spinlock_t *lock); 272 268 273 269 struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, 274 270 void __iomem *clk_base, void __iomem *pmc, 275 - unsigned long flags, unsigned long fixed_rate, 271 + unsigned long flags, 276 272 struct tegra_clk_pll_params *pll_params, 277 - u32 pll_flags, 278 - struct tegra_clk_pll_freq_table *freq_table, 279 273 spinlock_t *lock); 280 274 281 275 struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, 282 276 void __iomem *clk_base, void __iomem *pmc, 283 - unsigned long flags, unsigned long fixed_rate, 277 + unsigned long flags, 284 278 struct tegra_clk_pll_params *pll_params, 285 - u32 pll_flags, 286 - struct tegra_clk_pll_freq_table *freq_table, 287 279 spinlock_t *lock); 288 280 289 281 struct clk *tegra_clk_register_pllc(const char *name, const char *parent_name, 290 282 void __iomem *clk_base, void __iomem *pmc, 291 - unsigned long flags, unsigned long fixed_rate, 283 + unsigned long flags, 292 284 struct tegra_clk_pll_params *pll_params, 293 - u32 pll_flags, 294 - struct tegra_clk_pll_freq_table *freq_table, 295 285 spinlock_t *lock); 296 286 297 287 struct clk *tegra_clk_register_pllre(const char *name, const char *parent_name, 298 288 void __iomem *clk_base, void __iomem *pmc, 299 - unsigned long flags, unsigned long fixed_rate, 289 + unsigned long flags, 300 290 struct tegra_clk_pll_params *pll_params, 301 - u32 pll_flags, 302 - struct tegra_clk_pll_freq_table *freq_table, 303 291 spinlock_t *lock, unsigned long parent_rate); 304 292 305 293 struct clk *tegra_clk_register_plle_tegra114(const char *name, 306 294 const char *parent_name, 307 295 void __iomem *clk_base, unsigned long flags, 308 - unsigned long fixed_rate, 309 296 struct tegra_clk_pll_params *pll_params, 310 - struct tegra_clk_pll_freq_table *freq_table, 311 297 spinlock_t *lock); 298 + 299 + struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name, 300 + void __iomem *clk_base, unsigned long flags, 301 + struct tegra_clk_pll_params *pll_params, 302 + spinlock_t *lock); 312 303 313 304 /** 314 305 * struct tegra_clk_pll_out - PLL divider down clock ··· 390 395 #define TEGRA_PERIPH_MANUAL_RESET BIT(1) 391 396 #define TEGRA_PERIPH_ON_APB BIT(2) 392 397 #define TEGRA_PERIPH_WAR_1005168 BIT(3) 398 + #define TEGRA_PERIPH_NO_DIV BIT(4) 399 + #define TEGRA_PERIPH_NO_GATE BIT(5) 393 400 394 401 void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert); 395 402 extern const struct clk_ops tegra_clk_periph_gate_ops; 396 403 struct clk *tegra_clk_register_periph_gate(const char *name, 397 404 const char *parent_name, u8 gate_flags, void __iomem *clk_base, 398 - unsigned long flags, int clk_num, 399 - struct tegra_clk_periph_regs *pregs, int *enable_refcnt); 405 + unsigned long flags, int clk_num, int *enable_refcnt); 400 406 401 407 /** 402 408 * struct clk-periph - peripheral clock ··· 439 443 440 444 #define TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, _mux_flags, \ 441 445 _div_shift, _div_width, _div_frac_width, \ 442 - _div_flags, _clk_num, _enb_refcnt, _regs, \ 443 - _gate_flags, _table) \ 446 + _div_flags, _clk_num,\ 447 + _gate_flags, _table, _lock) \ 444 448 { \ 445 449 .mux = { \ 446 450 .flags = _mux_flags, \ 447 451 .shift = _mux_shift, \ 448 452 .mask = _mux_mask, \ 449 453 .table = _table, \ 454 + .lock = _lock, \ 450 455 }, \ 451 456 .divider = { \ 452 457 .flags = _div_flags, \ 453 458 .shift = _div_shift, \ 454 459 .width = _div_width, \ 455 460 .frac_width = _div_frac_width, \ 461 + .lock = _lock, \ 456 462 }, \ 457 463 .gate = { \ 458 464 .flags = _gate_flags, \ 459 465 .clk_num = _clk_num, \ 460 - .enable_refcnt = _enb_refcnt, \ 461 - .regs = _regs, \ 462 466 }, \ 463 467 .mux_ops = &clk_mux_ops, \ 464 468 .div_ops = &tegra_clk_frac_div_ops, \ ··· 468 472 struct tegra_periph_init_data { 469 473 const char *name; 470 474 int clk_id; 471 - const char **parent_names; 475 + union { 476 + const char **parent_names; 477 + const char *parent_name; 478 + } p; 472 479 int num_parents; 473 480 struct tegra_clk_periph periph; 474 481 u32 offset; ··· 482 483 483 484 #define TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\ 484 485 _mux_shift, _mux_mask, _mux_flags, _div_shift, \ 485 - _div_width, _div_frac_width, _div_flags, _regs, \ 486 - _clk_num, _enb_refcnt, _gate_flags, _clk_id, _table,\ 487 - _flags) \ 486 + _div_width, _div_frac_width, _div_flags, \ 487 + _clk_num, _gate_flags, _clk_id, _table, \ 488 + _flags, _lock) \ 488 489 { \ 489 490 .name = _name, \ 490 491 .clk_id = _clk_id, \ 491 - .parent_names = _parent_names, \ 492 + .p.parent_names = _parent_names, \ 492 493 .num_parents = ARRAY_SIZE(_parent_names), \ 493 494 .periph = TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, \ 494 495 _mux_flags, _div_shift, \ 495 496 _div_width, _div_frac_width, \ 496 497 _div_flags, _clk_num, \ 497 - _enb_refcnt, _regs, \ 498 - _gate_flags, _table), \ 498 + _gate_flags, _table, _lock), \ 499 499 .offset = _offset, \ 500 500 .con_id = _con_id, \ 501 501 .dev_id = _dev_id, \ ··· 503 505 504 506 #define TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parent_names, _offset,\ 505 507 _mux_shift, _mux_width, _mux_flags, _div_shift, \ 506 - _div_width, _div_frac_width, _div_flags, _regs, \ 507 - _clk_num, _enb_refcnt, _gate_flags, _clk_id) \ 508 + _div_width, _div_frac_width, _div_flags, \ 509 + _clk_num, _gate_flags, _clk_id) \ 508 510 TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\ 509 511 _mux_shift, BIT(_mux_width) - 1, _mux_flags, \ 510 512 _div_shift, _div_width, _div_frac_width, _div_flags, \ 511 - _regs, _clk_num, _enb_refcnt, _gate_flags, _clk_id,\ 512 - NULL, 0) 513 + _clk_num, _gate_flags, _clk_id,\ 514 + NULL, 0, NULL) 513 515 514 516 /** 515 517 * struct clk_super_mux - super clock ··· 579 581 }, \ 580 582 } 581 583 584 + struct tegra_clk { 585 + int dt_id; 586 + bool present; 587 + }; 588 + 589 + struct tegra_devclk { 590 + int dt_id; 591 + char *dev_id; 592 + char *con_id; 593 + }; 594 + 582 595 void tegra_init_from_table(struct tegra_clk_init_table *tbl, 583 596 struct clk *clks[], int clk_max); 584 597 585 598 void tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list, 586 599 struct clk *clks[], int clk_max); 600 + 601 + struct tegra_clk_periph_regs *get_reg_bank(int clkid); 602 + struct clk **tegra_clk_init(int num, int periph_banks); 603 + 604 + struct clk **tegra_lookup_dt_id(int clk_id, struct tegra_clk *tegra_clk); 605 + 606 + void tegra_add_of_provider(struct device_node *np); 607 + void tegra_register_devclks(struct tegra_devclk *dev_clks, int num); 608 + 609 + void tegra_audio_clk_init(void __iomem *clk_base, 610 + void __iomem *pmc_base, struct tegra_clk *tegra_clks, 611 + struct tegra_clk_pll_params *pll_params); 612 + 613 + void tegra_periph_clk_init(void __iomem *clk_base, void __iomem *pmc_base, 614 + struct tegra_clk *tegra_clks, 615 + struct tegra_clk_pll_params *pll_params); 616 + 617 + void tegra_pmc_clk_init(void __iomem *pmc_base, struct tegra_clk *tegra_clks); 618 + void tegra_fixed_clk_init(struct tegra_clk *tegra_clks); 619 + int tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *tegra_clks, 620 + unsigned long *input_freqs, int num, 621 + unsigned long *osc_freq, 622 + unsigned long *pll_ref_freq); 623 + void tegra_super_clk_gen4_init(void __iomem *clk_base, 624 + void __iomem *pmc_base, struct tegra_clk *tegra_clks, 625 + struct tegra_clk_pll_params *pll_params); 587 626 588 627 void tegra114_clock_tune_cpu_trimmers_high(void); 589 628 void tegra114_clock_tune_cpu_trimmers_low(void);
+4 -4
include/dt-bindings/clock/tegra114-car.h
··· 37 37 #define TEGRA114_CLK_I2S2 18 38 38 #define TEGRA114_CLK_EPP 19 39 39 /* 20 (register bit affects vi and vi_sensor) */ 40 - #define TEGRA114_CLK_GR_2D 21 40 + #define TEGRA114_CLK_GR2D 21 41 41 #define TEGRA114_CLK_USBD 22 42 42 #define TEGRA114_CLK_ISP 23 43 - #define TEGRA114_CLK_GR_3D 24 43 + #define TEGRA114_CLK_GR3D 24 44 44 /* 25 */ 45 45 #define TEGRA114_CLK_DISP2 26 46 46 #define TEGRA114_CLK_DISP1 27 ··· 289 289 #define TEGRA114_CLK_PCLK 261 290 290 #define TEGRA114_CLK_CCLK_G 262 291 291 #define TEGRA114_CLK_CCLK_LP 263 292 - /* 264 */ 293 - /* 265 */ 292 + #define TEGRA114_CLK_DFLL_REF 264 293 + #define TEGRA114_CLK_DFLL_SOC 265 294 294 /* 266 */ 295 295 /* 267 */ 296 296 /* 268 */
+341
include/dt-bindings/clock/tegra124-car.h
··· 1 + /* 2 + * This header provides constants for binding nvidia,tegra124-car. 3 + * 4 + * The first 192 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB 5 + * registers. These IDs often match those in the CAR's RST_DEVICES registers, 6 + * but not in all cases. Some bits in CLK_OUT_ENB affect multiple clocks. In 7 + * this case, those clocks are assigned IDs above 185 in order to highlight 8 + * this issue. Implementations that interpret these clock IDs as bit values 9 + * within the CLK_OUT_ENB or RST_DEVICES registers should be careful to 10 + * explicitly handle these special cases. 11 + * 12 + * The balance of the clocks controlled by the CAR are assigned IDs of 185 and 13 + * above. 14 + */ 15 + 16 + #ifndef _DT_BINDINGS_CLOCK_TEGRA124_CAR_H 17 + #define _DT_BINDINGS_CLOCK_TEGRA124_CAR_H 18 + 19 + /* 0 */ 20 + /* 1 */ 21 + /* 2 */ 22 + #define TEGRA124_CLK_ISPB 3 23 + #define TEGRA124_CLK_RTC 4 24 + #define TEGRA124_CLK_TIMER 5 25 + #define TEGRA124_CLK_UARTA 6 26 + /* 7 (register bit affects uartb and vfir) */ 27 + /* 8 */ 28 + #define TEGRA124_CLK_SDMMC2 9 29 + /* 10 (register bit affects spdif_in and spdif_out) */ 30 + #define TEGRA124_CLK_I2S1 11 31 + #define TEGRA124_CLK_I2C1 12 32 + #define TEGRA124_CLK_NDFLASH 13 33 + #define TEGRA124_CLK_SDMMC1 14 34 + #define TEGRA124_CLK_SDMMC4 15 35 + /* 16 */ 36 + #define TEGRA124_CLK_PWM 17 37 + #define TEGRA124_CLK_I2S2 18 38 + /* 20 (register bit affects vi and vi_sensor) */ 39 + #define TEGRA124_CLK_GR_2D 21 40 + #define TEGRA124_CLK_USBD 22 41 + #define TEGRA124_CLK_ISP 23 42 + #define TEGRA124_CLK_GR_3D 24 43 + /* 25 */ 44 + #define TEGRA124_CLK_DISP2 26 45 + #define TEGRA124_CLK_DISP1 27 46 + #define TEGRA124_CLK_HOST1X 28 47 + #define TEGRA124_CLK_VCP 29 48 + #define TEGRA124_CLK_I2S0 30 49 + /* 31 */ 50 + 51 + /* 32 */ 52 + /* 33 */ 53 + #define TEGRA124_CLK_APBDMA 34 54 + /* 35 */ 55 + #define TEGRA124_CLK_KBC 36 56 + /* 37 */ 57 + /* 38 */ 58 + /* 39 (register bit affects fuse and fuse_burn) */ 59 + #define TEGRA124_CLK_KFUSE 40 60 + #define TEGRA124_CLK_SBC1 41 61 + #define TEGRA124_CLK_NOR 42 62 + /* 43 */ 63 + #define TEGRA124_CLK_SBC2 44 64 + /* 45 */ 65 + #define TEGRA124_CLK_SBC3 46 66 + #define TEGRA124_CLK_I2C5 47 67 + #define TEGRA124_CLK_DSIA 48 68 + /* 49 */ 69 + #define TEGRA124_CLK_MIPI 50 70 + #define TEGRA124_CLK_HDMI 51 71 + #define TEGRA124_CLK_CSI 52 72 + /* 53 */ 73 + #define TEGRA124_CLK_I2C2 54 74 + #define TEGRA124_CLK_UARTC 55 75 + #define TEGRA124_CLK_MIPI_CAL 56 76 + #define TEGRA124_CLK_EMC 57 77 + #define TEGRA124_CLK_USB2 58 78 + #define TEGRA124_CLK_USB3 59 79 + /* 60 */ 80 + #define TEGRA124_CLK_VDE 61 81 + #define TEGRA124_CLK_BSEA 62 82 + #define TEGRA124_CLK_BSEV 63 83 + 84 + /* 64 */ 85 + #define TEGRA124_CLK_UARTD 65 86 + #define TEGRA124_CLK_UARTE 66 87 + #define TEGRA124_CLK_I2C3 67 88 + #define TEGRA124_CLK_SBC4 68 89 + #define TEGRA124_CLK_SDMMC3 69 90 + #define TEGRA124_CLK_PCIE 70 91 + #define TEGRA124_CLK_OWR 71 92 + #define TEGRA124_CLK_AFI 72 93 + #define TEGRA124_CLK_CSITE 73 94 + /* 74 */ 95 + /* 75 */ 96 + #define TEGRA124_CLK_LA 76 97 + #define TEGRA124_CLK_TRACE 77 98 + #define TEGRA124_CLK_SOC_THERM 78 99 + #define TEGRA124_CLK_DTV 79 100 + #define TEGRA124_CLK_NDSPEED 80 101 + #define TEGRA124_CLK_I2CSLOW 81 102 + #define TEGRA124_CLK_DSIB 82 103 + #define TEGRA124_CLK_TSEC 83 104 + /* 84 */ 105 + /* 85 */ 106 + /* 86 */ 107 + /* 87 */ 108 + /* 88 */ 109 + #define TEGRA124_CLK_XUSB_HOST 89 110 + /* 90 */ 111 + #define TEGRA124_CLK_MSENC 91 112 + #define TEGRA124_CLK_CSUS 92 113 + /* 93 */ 114 + /* 94 */ 115 + /* 95 (bit affects xusb_dev and xusb_dev_src) */ 116 + 117 + /* 96 */ 118 + /* 97 */ 119 + /* 98 */ 120 + #define TEGRA124_CLK_MSELECT 99 121 + #define TEGRA124_CLK_TSENSOR 100 122 + #define TEGRA124_CLK_I2S3 101 123 + #define TEGRA124_CLK_I2S4 102 124 + #define TEGRA124_CLK_I2C4 103 125 + #define TEGRA124_CLK_SBC5 104 126 + #define TEGRA124_CLK_SBC6 105 127 + #define TEGRA124_CLK_D_AUDIO 106 128 + #define TEGRA124_CLK_APBIF 107 129 + #define TEGRA124_CLK_DAM0 108 130 + #define TEGRA124_CLK_DAM1 109 131 + #define TEGRA124_CLK_DAM2 110 132 + #define TEGRA124_CLK_HDA2CODEC_2X 111 133 + /* 112 */ 134 + #define TEGRA124_CLK_AUDIO0_2X 113 135 + #define TEGRA124_CLK_AUDIO1_2X 114 136 + #define TEGRA124_CLK_AUDIO2_2X 115 137 + #define TEGRA124_CLK_AUDIO3_2X 116 138 + #define TEGRA124_CLK_AUDIO4_2X 117 139 + #define TEGRA124_CLK_SPDIF_2X 118 140 + #define TEGRA124_CLK_ACTMON 119 141 + #define TEGRA124_CLK_EXTERN1 120 142 + #define TEGRA124_CLK_EXTERN2 121 143 + #define TEGRA124_CLK_EXTERN3 122 144 + #define TEGRA124_CLK_SATA_OOB 123 145 + #define TEGRA124_CLK_SATA 124 146 + #define TEGRA124_CLK_HDA 125 147 + /* 126 */ 148 + #define TEGRA124_CLK_SE 127 149 + 150 + #define TEGRA124_CLK_HDA2HDMI 128 151 + #define TEGRA124_CLK_SATA_COLD 129 152 + /* 130 */ 153 + /* 131 */ 154 + /* 132 */ 155 + /* 133 */ 156 + /* 134 */ 157 + /* 135 */ 158 + /* 136 */ 159 + /* 137 */ 160 + /* 138 */ 161 + /* 139 */ 162 + /* 140 */ 163 + /* 141 */ 164 + /* 142 */ 165 + /* 143 (bit affects xusb_falcon_src, xusb_fs_src, */ 166 + /* xusb_host_src and xusb_ss_src) */ 167 + #define TEGRA124_CLK_CILAB 144 168 + #define TEGRA124_CLK_CILCD 145 169 + #define TEGRA124_CLK_CILE 146 170 + #define TEGRA124_CLK_DSIALP 147 171 + #define TEGRA124_CLK_DSIBLP 148 172 + #define TEGRA124_CLK_ENTROPY 149 173 + #define TEGRA124_CLK_DDS 150 174 + /* 151 */ 175 + #define TEGRA124_CLK_DP2 152 176 + #define TEGRA124_CLK_AMX 153 177 + #define TEGRA124_CLK_ADX 154 178 + /* 155 (bit affects dfll_ref and dfll_soc) */ 179 + #define TEGRA124_CLK_XUSB_SS 156 180 + /* 157 */ 181 + /* 158 */ 182 + /* 159 */ 183 + 184 + /* 160 */ 185 + /* 161 */ 186 + /* 162 */ 187 + /* 163 */ 188 + /* 164 */ 189 + /* 165 */ 190 + #define TEGRA124_CLK_I2C6 166 191 + /* 167 */ 192 + /* 168 */ 193 + /* 169 */ 194 + /* 170 */ 195 + #define TEGRA124_CLK_VIM2_CLK 171 196 + /* 172 */ 197 + /* 173 */ 198 + /* 174 */ 199 + /* 175 */ 200 + #define TEGRA124_CLK_HDMI_AUDIO 176 201 + #define TEGRA124_CLK_CLK72MHZ 177 202 + #define TEGRA124_CLK_VIC03 178 203 + /* 179 */ 204 + #define TEGRA124_CLK_ADX1 180 205 + #define TEGRA124_CLK_DPAUX 181 206 + #define TEGRA124_CLK_SOR0 182 207 + /* 183 */ 208 + #define TEGRA124_CLK_GPU 184 209 + #define TEGRA124_CLK_AMX1 185 210 + /* 186 */ 211 + /* 187 */ 212 + /* 188 */ 213 + /* 189 */ 214 + /* 190 */ 215 + /* 191 */ 216 + #define TEGRA124_CLK_UARTB 192 217 + #define TEGRA124_CLK_VFIR 193 218 + #define TEGRA124_CLK_SPDIF_IN 194 219 + #define TEGRA124_CLK_SPDIF_OUT 195 220 + #define TEGRA124_CLK_VI 196 221 + #define TEGRA124_CLK_VI_SENSOR 197 222 + #define TEGRA124_CLK_FUSE 198 223 + #define TEGRA124_CLK_FUSE_BURN 199 224 + #define TEGRA124_CLK_CLK_32K 200 225 + #define TEGRA124_CLK_CLK_M 201 226 + #define TEGRA124_CLK_CLK_M_DIV2 202 227 + #define TEGRA124_CLK_CLK_M_DIV4 203 228 + #define TEGRA124_CLK_PLL_REF 204 229 + #define TEGRA124_CLK_PLL_C 205 230 + #define TEGRA124_CLK_PLL_C_OUT1 206 231 + #define TEGRA124_CLK_PLL_C2 207 232 + #define TEGRA124_CLK_PLL_C3 208 233 + #define TEGRA124_CLK_PLL_M 209 234 + #define TEGRA124_CLK_PLL_M_OUT1 210 235 + #define TEGRA124_CLK_PLL_P 211 236 + #define TEGRA124_CLK_PLL_P_OUT1 212 237 + #define TEGRA124_CLK_PLL_P_OUT2 213 238 + #define TEGRA124_CLK_PLL_P_OUT3 214 239 + #define TEGRA124_CLK_PLL_P_OUT4 215 240 + #define TEGRA124_CLK_PLL_A 216 241 + #define TEGRA124_CLK_PLL_A_OUT0 217 242 + #define TEGRA124_CLK_PLL_D 218 243 + #define TEGRA124_CLK_PLL_D_OUT0 219 244 + #define TEGRA124_CLK_PLL_D2 220 245 + #define TEGRA124_CLK_PLL_D2_OUT0 221 246 + #define TEGRA124_CLK_PLL_U 222 247 + #define TEGRA124_CLK_PLL_U_480M 223 248 + 249 + #define TEGRA124_CLK_PLL_U_60M 224 250 + #define TEGRA124_CLK_PLL_U_48M 225 251 + #define TEGRA124_CLK_PLL_U_12M 226 252 + #define TEGRA124_CLK_PLL_X 227 253 + #define TEGRA124_CLK_PLL_X_OUT0 228 254 + #define TEGRA124_CLK_PLL_RE_VCO 229 255 + #define TEGRA124_CLK_PLL_RE_OUT 230 256 + #define TEGRA124_CLK_PLL_E 231 257 + #define TEGRA124_CLK_SPDIF_IN_SYNC 232 258 + #define TEGRA124_CLK_I2S0_SYNC 233 259 + #define TEGRA124_CLK_I2S1_SYNC 234 260 + #define TEGRA124_CLK_I2S2_SYNC 235 261 + #define TEGRA124_CLK_I2S3_SYNC 236 262 + #define TEGRA124_CLK_I2S4_SYNC 237 263 + #define TEGRA124_CLK_VIMCLK_SYNC 238 264 + #define TEGRA124_CLK_AUDIO0 239 265 + #define TEGRA124_CLK_AUDIO1 240 266 + #define TEGRA124_CLK_AUDIO2 241 267 + #define TEGRA124_CLK_AUDIO3 242 268 + #define TEGRA124_CLK_AUDIO4 243 269 + #define TEGRA124_CLK_SPDIF 244 270 + #define TEGRA124_CLK_CLK_OUT_1 245 271 + #define TEGRA124_CLK_CLK_OUT_2 246 272 + #define TEGRA124_CLK_CLK_OUT_3 247 273 + #define TEGRA124_CLK_BLINK 248 274 + /* 249 */ 275 + /* 250 */ 276 + /* 251 */ 277 + #define TEGRA124_CLK_XUSB_HOST_SRC 252 278 + #define TEGRA124_CLK_XUSB_FALCON_SRC 253 279 + #define TEGRA124_CLK_XUSB_FS_SRC 254 280 + #define TEGRA124_CLK_XUSB_SS_SRC 255 281 + 282 + #define TEGRA124_CLK_XUSB_DEV_SRC 256 283 + #define TEGRA124_CLK_XUSB_DEV 257 284 + #define TEGRA124_CLK_XUSB_HS_SRC 258 285 + #define TEGRA124_CLK_SCLK 259 286 + #define TEGRA124_CLK_HCLK 260 287 + #define TEGRA124_CLK_PCLK 261 288 + #define TEGRA124_CLK_CCLK_G 262 289 + #define TEGRA124_CLK_CCLK_LP 263 290 + #define TEGRA124_CLK_DFLL_REF 264 291 + #define TEGRA124_CLK_DFLL_SOC 265 292 + #define TEGRA124_CLK_VI_SENSOR2 266 293 + #define TEGRA124_CLK_PLL_P_OUT5 267 294 + #define TEGRA124_CLK_CML0 268 295 + #define TEGRA124_CLK_CML1 269 296 + #define TEGRA124_CLK_PLL_C4 270 297 + #define TEGRA124_CLK_PLL_DP 271 298 + #define TEGRA124_CLK_PLL_E_MUX 272 299 + /* 273 */ 300 + /* 274 */ 301 + /* 275 */ 302 + /* 276 */ 303 + /* 277 */ 304 + /* 278 */ 305 + /* 279 */ 306 + /* 280 */ 307 + /* 281 */ 308 + /* 282 */ 309 + /* 283 */ 310 + /* 284 */ 311 + /* 285 */ 312 + /* 286 */ 313 + /* 287 */ 314 + 315 + /* 288 */ 316 + /* 289 */ 317 + /* 290 */ 318 + /* 291 */ 319 + /* 292 */ 320 + /* 293 */ 321 + /* 294 */ 322 + /* 295 */ 323 + /* 296 */ 324 + /* 297 */ 325 + /* 298 */ 326 + /* 299 */ 327 + #define TEGRA124_CLK_AUDIO0_MUX 300 328 + #define TEGRA124_CLK_AUDIO1_MUX 301 329 + #define TEGRA124_CLK_AUDIO2_MUX 302 330 + #define TEGRA124_CLK_AUDIO3_MUX 303 331 + #define TEGRA124_CLK_AUDIO4_MUX 304 332 + #define TEGRA124_CLK_SPDIF_MUX 305 333 + #define TEGRA124_CLK_CLK_OUT_1_MUX 306 334 + #define TEGRA124_CLK_CLK_OUT_2_MUX 307 335 + #define TEGRA124_CLK_CLK_OUT_3_MUX 308 336 + #define TEGRA124_CLK_DSIA_MUX 309 337 + #define TEGRA124_CLK_DSIB_MUX 310 338 + #define TEGRA124_CLK_SOR0_LVDS 311 339 + #define TEGRA124_CLK_CLK_MAX 312 340 + 341 + #endif /* _DT_BINDINGS_CLOCK_TEGRA124_CAR_H */
+9 -1
include/dt-bindings/clock/tegra30-car.h
··· 260 260 /* 298 */ 261 261 /* 299 */ 262 262 #define TEGRA30_CLK_CLK_OUT_1_MUX 300 263 - #define TEGRA30_CLK_CLK_MAX 301 263 + #define TEGRA30_CLK_CLK_OUT_2_MUX 301 264 + #define TEGRA30_CLK_CLK_OUT_3_MUX 302 265 + #define TEGRA30_CLK_AUDIO0_MUX 303 266 + #define TEGRA30_CLK_AUDIO1_MUX 304 267 + #define TEGRA30_CLK_AUDIO2_MUX 305 268 + #define TEGRA30_CLK_AUDIO3_MUX 306 269 + #define TEGRA30_CLK_AUDIO4_MUX 307 270 + #define TEGRA30_CLK_SPDIF_MUX 308 271 + #define TEGRA30_CLK_CLK_MAX 309 264 272 265 273 #endif /* _DT_BINDINGS_CLOCK_TEGRA30_CAR_H */