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

clk: tegra: move audio clk to common file

Move audio clocks and PLLA initialization to a common file so it can be used by
multiple Tegra SoCs. Also a new array tegra114_clks is introduced for Tegra114
which specifies which common clocks are available on Tegra114 and what their
DT IDs are.

Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com>

+402 -208
+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 + obj-y += clk-tegra-audio.o 9 10 10 11 obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += clk-tegra20.o 11 12 obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += clk-tegra30.o
+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 +
+182 -208
drivers/clk/tegra/clk-tegra114.c
··· 26 26 #include <dt-bindings/clock/tegra114-car.h> 27 27 28 28 #include "clk.h" 29 + #include "clk-id.h" 29 30 30 31 #define RST_DFLL_DVCO 0x2F4 31 32 #define CPU_FINETRIM_SELECT 0x4d4 /* override default prop dlys */ ··· 108 107 #define PLLM_OUT 0x94 109 108 #define PLLP_OUTA 0xa4 110 109 #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 110 122 111 #define PMC_CLK_OUT_CNTRL 0x1a8 123 112 #define PMC_DPD_PADS_ORIDE 0x1c ··· 263 272 static DEFINE_SPINLOCK(pll_u_lock); 264 273 static DEFINE_SPINLOCK(pll_div_lock); 265 274 static DEFINE_SPINLOCK(pll_re_lock); 266 - static DEFINE_SPINLOCK(clk_doubler_lock); 267 275 static DEFINE_SPINLOCK(clk_out_lock); 268 276 static DEFINE_SPINLOCK(sysrate_lock); 269 277 ··· 953 963 { .val = 0, .div = 0 }, 954 964 }; 955 965 966 + static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { 967 + [tegra_clk_rtc] = { .dt_id = TEGRA114_CLK_RTC, .present = true }, 968 + [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, 969 + [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, 970 + [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, 971 + [tegra_clk_sdmmc2] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, 972 + [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, 973 + [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, 974 + [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, 975 + [tegra_clk_sdmmc1] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, 976 + [tegra_clk_sdmmc4] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, 977 + [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, 978 + [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, 979 + [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, 980 + [tegra_clk_epp_8] = { .dt_id = TEGRA114_CLK_EPP, .present = true }, 981 + [tegra_clk_gr2d_8] = { .dt_id = TEGRA114_CLK_GR2D, .present = true }, 982 + [tegra_clk_usbd] = { .dt_id = TEGRA114_CLK_USBD, .present = true }, 983 + [tegra_clk_isp] = { .dt_id = TEGRA114_CLK_ISP, .present = true }, 984 + [tegra_clk_gr3d_8] = { .dt_id = TEGRA114_CLK_GR3D, .present = true }, 985 + [tegra_clk_disp2] = { .dt_id = TEGRA114_CLK_DISP2, .present = true }, 986 + [tegra_clk_disp1] = { .dt_id = TEGRA114_CLK_DISP1, .present = true }, 987 + [tegra_clk_host1x_8] = { .dt_id = TEGRA114_CLK_HOST1X, .present = true }, 988 + [tegra_clk_vcp] = { .dt_id = TEGRA114_CLK_VCP, .present = true }, 989 + [tegra_clk_apbdma] = { .dt_id = TEGRA114_CLK_APBDMA, .present = true }, 990 + [tegra_clk_kbc] = { .dt_id = TEGRA114_CLK_KBC, .present = true }, 991 + [tegra_clk_kfuse] = { .dt_id = TEGRA114_CLK_KFUSE, .present = true }, 992 + [tegra_clk_sbc1_8] = { .dt_id = TEGRA114_CLK_SBC1, .present = true }, 993 + [tegra_clk_nor] = { .dt_id = TEGRA114_CLK_NOR, .present = true }, 994 + [tegra_clk_sbc2_8] = { .dt_id = TEGRA114_CLK_SBC2, .present = true }, 995 + [tegra_clk_sbc3_8] = { .dt_id = TEGRA114_CLK_SBC3, .present = true }, 996 + [tegra_clk_i2c5] = { .dt_id = TEGRA114_CLK_I2C5, .present = true }, 997 + [tegra_clk_dsia] = { .dt_id = TEGRA114_CLK_DSIA, .present = true }, 998 + [tegra_clk_mipi] = { .dt_id = TEGRA114_CLK_MIPI, .present = true }, 999 + [tegra_clk_hdmi] = { .dt_id = TEGRA114_CLK_HDMI, .present = true }, 1000 + [tegra_clk_csi] = { .dt_id = TEGRA114_CLK_CSI, .present = true }, 1001 + [tegra_clk_i2c2] = { .dt_id = TEGRA114_CLK_I2C2, .present = true }, 1002 + [tegra_clk_uartc] = { .dt_id = TEGRA114_CLK_UARTC, .present = true }, 1003 + [tegra_clk_mipi_cal] = { .dt_id = TEGRA114_CLK_MIPI_CAL, .present = true }, 1004 + [tegra_clk_emc] = { .dt_id = TEGRA114_CLK_EMC, .present = true }, 1005 + [tegra_clk_usb2] = { .dt_id = TEGRA114_CLK_USB2, .present = true }, 1006 + [tegra_clk_usb3] = { .dt_id = TEGRA114_CLK_USB3, .present = true }, 1007 + [tegra_clk_vde_8] = { .dt_id = TEGRA114_CLK_VDE, .present = true }, 1008 + [tegra_clk_bsea] = { .dt_id = TEGRA114_CLK_BSEA, .present = true }, 1009 + [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, 1010 + [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, 1011 + [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, 1012 + [tegra_clk_sdmmc3] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, 1013 + [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, 1014 + [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, 1015 + [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, 1016 + [tegra_clk_trace] = { .dt_id = TEGRA114_CLK_TRACE, .present = true }, 1017 + [tegra_clk_soc_therm] = { .dt_id = TEGRA114_CLK_SOC_THERM, .present = true }, 1018 + [tegra_clk_dtv] = { .dt_id = TEGRA114_CLK_DTV, .present = true }, 1019 + [tegra_clk_ndspeed] = { .dt_id = TEGRA114_CLK_NDSPEED, .present = true }, 1020 + [tegra_clk_i2cslow] = { .dt_id = TEGRA114_CLK_I2CSLOW, .present = true }, 1021 + [tegra_clk_dsib] = { .dt_id = TEGRA114_CLK_DSIB, .present = true }, 1022 + [tegra_clk_tsec] = { .dt_id = TEGRA114_CLK_TSEC, .present = true }, 1023 + [tegra_clk_xusb_host] = { .dt_id = TEGRA114_CLK_XUSB_HOST, .present = true }, 1024 + [tegra_clk_msenc] = { .dt_id = TEGRA114_CLK_MSENC, .present = true }, 1025 + [tegra_clk_csus] = { .dt_id = TEGRA114_CLK_CSUS, .present = true }, 1026 + [tegra_clk_mselect] = { .dt_id = TEGRA114_CLK_MSELECT, .present = true }, 1027 + [tegra_clk_tsensor] = { .dt_id = TEGRA114_CLK_TSENSOR, .present = true }, 1028 + [tegra_clk_i2s3] = { .dt_id = TEGRA114_CLK_I2S3, .present = true }, 1029 + [tegra_clk_i2s4] = { .dt_id = TEGRA114_CLK_I2S4, .present = true }, 1030 + [tegra_clk_i2c4] = { .dt_id = TEGRA114_CLK_I2C4, .present = true }, 1031 + [tegra_clk_sbc5_8] = { .dt_id = TEGRA114_CLK_SBC5, .present = true }, 1032 + [tegra_clk_sbc6_8] = { .dt_id = TEGRA114_CLK_SBC6, .present = true }, 1033 + [tegra_clk_d_audio] = { .dt_id = TEGRA114_CLK_D_AUDIO, .present = true }, 1034 + [tegra_clk_apbif] = { .dt_id = TEGRA114_CLK_APBIF, .present = true }, 1035 + [tegra_clk_dam0] = { .dt_id = TEGRA114_CLK_DAM0, .present = true }, 1036 + [tegra_clk_dam1] = { .dt_id = TEGRA114_CLK_DAM1, .present = true }, 1037 + [tegra_clk_dam2] = { .dt_id = TEGRA114_CLK_DAM2, .present = true }, 1038 + [tegra_clk_hda2codec_2x] = { .dt_id = TEGRA114_CLK_HDA2CODEC_2X, .present = true }, 1039 + [tegra_clk_audio0_2x] = { .dt_id = TEGRA114_CLK_AUDIO0_2X, .present = true }, 1040 + [tegra_clk_audio1_2x] = { .dt_id = TEGRA114_CLK_AUDIO1_2X, .present = true }, 1041 + [tegra_clk_audio2_2x] = { .dt_id = TEGRA114_CLK_AUDIO2_2X, .present = true }, 1042 + [tegra_clk_audio3_2x] = { .dt_id = TEGRA114_CLK_AUDIO3_2X, .present = true }, 1043 + [tegra_clk_audio4_2x] = { .dt_id = TEGRA114_CLK_AUDIO4_2X, .present = true }, 1044 + [tegra_clk_spdif_2x] = { .dt_id = TEGRA114_CLK_SPDIF_2X, .present = true }, 1045 + [tegra_clk_actmon] = { .dt_id = TEGRA114_CLK_ACTMON, .present = true }, 1046 + [tegra_clk_extern1] = { .dt_id = TEGRA114_CLK_EXTERN1, .present = true }, 1047 + [tegra_clk_extern2] = { .dt_id = TEGRA114_CLK_EXTERN2, .present = true }, 1048 + [tegra_clk_extern3] = { .dt_id = TEGRA114_CLK_EXTERN3, .present = true }, 1049 + [tegra_clk_hda] = { .dt_id = TEGRA114_CLK_HDA, .present = true }, 1050 + [tegra_clk_se] = { .dt_id = TEGRA114_CLK_SE, .present = true }, 1051 + [tegra_clk_hda2hdmi] = { .dt_id = TEGRA114_CLK_HDA2HDMI, .present = true }, 1052 + [tegra_clk_cilab] = { .dt_id = TEGRA114_CLK_CILAB, .present = true }, 1053 + [tegra_clk_cilcd] = { .dt_id = TEGRA114_CLK_CILCD, .present = true }, 1054 + [tegra_clk_cile] = { .dt_id = TEGRA114_CLK_CILE, .present = true }, 1055 + [tegra_clk_dsialp] = { .dt_id = TEGRA114_CLK_DSIALP, .present = true }, 1056 + [tegra_clk_dsiblp] = { .dt_id = TEGRA114_CLK_DSIBLP, .present = true }, 1057 + [tegra_clk_dds] = { .dt_id = TEGRA114_CLK_DDS, .present = true }, 1058 + [tegra_clk_dp2] = { .dt_id = TEGRA114_CLK_DP2, .present = true }, 1059 + [tegra_clk_amx] = { .dt_id = TEGRA114_CLK_AMX, .present = true }, 1060 + [tegra_clk_adx] = { .dt_id = TEGRA114_CLK_ADX, .present = true }, 1061 + [tegra_clk_xusb_ss] = { .dt_id = TEGRA114_CLK_XUSB_SS, .present = true }, 1062 + [tegra_clk_uartb] = { .dt_id = TEGRA114_CLK_UARTB, .present = true }, 1063 + [tegra_clk_vfir] = { .dt_id = TEGRA114_CLK_VFIR, .present = true }, 1064 + [tegra_clk_spdif_in] = { .dt_id = TEGRA114_CLK_SPDIF_IN, .present = true }, 1065 + [tegra_clk_spdif_out] = { .dt_id = TEGRA114_CLK_SPDIF_OUT, .present = true }, 1066 + [tegra_clk_vi_8] = { .dt_id = TEGRA114_CLK_VI, .present = true }, 1067 + [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA114_CLK_VI_SENSOR, .present = true }, 1068 + [tegra_clk_fuse] = { .dt_id = TEGRA114_CLK_FUSE, .present = true }, 1069 + [tegra_clk_fuse_burn] = { .dt_id = TEGRA114_CLK_FUSE_BURN, .present = true }, 1070 + [tegra_clk_clk_32k] = { .dt_id = TEGRA114_CLK_CLK_32K, .present = true }, 1071 + [tegra_clk_clk_m] = { .dt_id = TEGRA114_CLK_CLK_M, .present = true }, 1072 + [tegra_clk_clk_m_div2] = { .dt_id = TEGRA114_CLK_CLK_M_DIV2, .present = true }, 1073 + [tegra_clk_clk_m_div4] = { .dt_id = TEGRA114_CLK_CLK_M_DIV4, .present = true }, 1074 + [tegra_clk_pll_ref] = { .dt_id = TEGRA114_CLK_PLL_REF, .present = true }, 1075 + [tegra_clk_pll_c] = { .dt_id = TEGRA114_CLK_PLL_C, .present = true }, 1076 + [tegra_clk_pll_c_out1] = { .dt_id = TEGRA114_CLK_PLL_C_OUT1, .present = true }, 1077 + [tegra_clk_pll_c2] = { .dt_id = TEGRA114_CLK_PLL_C2, .present = true }, 1078 + [tegra_clk_pll_c3] = { .dt_id = TEGRA114_CLK_PLL_C3, .present = true }, 1079 + [tegra_clk_pll_m] = { .dt_id = TEGRA114_CLK_PLL_M, .present = true }, 1080 + [tegra_clk_pll_m_out1] = { .dt_id = TEGRA114_CLK_PLL_M_OUT1, .present = true }, 1081 + [tegra_clk_pll_p] = { .dt_id = TEGRA114_CLK_PLL_P, .present = true }, 1082 + [tegra_clk_pll_p_out1] = { .dt_id = TEGRA114_CLK_PLL_P_OUT1, .present = true }, 1083 + [tegra_clk_pll_p_out2_int] = { .dt_id = TEGRA114_CLK_PLL_P_OUT2, .present = true }, 1084 + [tegra_clk_pll_p_out3] = { .dt_id = TEGRA114_CLK_PLL_P_OUT3, .present = true }, 1085 + [tegra_clk_pll_p_out4] = { .dt_id = TEGRA114_CLK_PLL_P_OUT4, .present = true }, 1086 + [tegra_clk_pll_a] = { .dt_id = TEGRA114_CLK_PLL_A, .present = true }, 1087 + [tegra_clk_pll_a_out0] = { .dt_id = TEGRA114_CLK_PLL_A_OUT0, .present = true }, 1088 + [tegra_clk_pll_d] = { .dt_id = TEGRA114_CLK_PLL_D, .present = true }, 1089 + [tegra_clk_pll_d_out0] = { .dt_id = TEGRA114_CLK_PLL_D_OUT0, .present = true }, 1090 + [tegra_clk_pll_d2] = { .dt_id = TEGRA114_CLK_PLL_D2, .present = true }, 1091 + [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA114_CLK_PLL_D2_OUT0, .present = true }, 1092 + [tegra_clk_pll_u] = { .dt_id = TEGRA114_CLK_PLL_U, .present = true }, 1093 + [tegra_clk_pll_u_480m] = { .dt_id = TEGRA114_CLK_PLL_U_480M, .present = true }, 1094 + [tegra_clk_pll_u_60m] = { .dt_id = TEGRA114_CLK_PLL_U_60M, .present = true }, 1095 + [tegra_clk_pll_u_48m] = { .dt_id = TEGRA114_CLK_PLL_U_48M, .present = true }, 1096 + [tegra_clk_pll_u_12m] = { .dt_id = TEGRA114_CLK_PLL_U_12M, .present = true }, 1097 + [tegra_clk_pll_x] = { .dt_id = TEGRA114_CLK_PLL_X, .present = true }, 1098 + [tegra_clk_pll_x_out0] = { .dt_id = TEGRA114_CLK_PLL_X_OUT0, .present = true }, 1099 + [tegra_clk_pll_re_vco] = { .dt_id = TEGRA114_CLK_PLL_RE_VCO, .present = true }, 1100 + [tegra_clk_pll_re_out] = { .dt_id = TEGRA114_CLK_PLL_RE_OUT, .present = true }, 1101 + [tegra_clk_pll_e_out0] = { .dt_id = TEGRA114_CLK_PLL_E_OUT0, .present = true }, 1102 + [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA114_CLK_SPDIF_IN_SYNC, .present = true }, 1103 + [tegra_clk_i2s0_sync] = { .dt_id = TEGRA114_CLK_I2S0_SYNC, .present = true }, 1104 + [tegra_clk_i2s1_sync] = { .dt_id = TEGRA114_CLK_I2S1_SYNC, .present = true }, 1105 + [tegra_clk_i2s2_sync] = { .dt_id = TEGRA114_CLK_I2S2_SYNC, .present = true }, 1106 + [tegra_clk_i2s3_sync] = { .dt_id = TEGRA114_CLK_I2S3_SYNC, .present = true }, 1107 + [tegra_clk_i2s4_sync] = { .dt_id = TEGRA114_CLK_I2S4_SYNC, .present = true }, 1108 + [tegra_clk_vimclk_sync] = { .dt_id = TEGRA114_CLK_VIMCLK_SYNC, .present = true }, 1109 + [tegra_clk_audio0] = { .dt_id = TEGRA114_CLK_AUDIO0, .present = true }, 1110 + [tegra_clk_audio1] = { .dt_id = TEGRA114_CLK_AUDIO1, .present = true }, 1111 + [tegra_clk_audio2] = { .dt_id = TEGRA114_CLK_AUDIO2, .present = true }, 1112 + [tegra_clk_audio3] = { .dt_id = TEGRA114_CLK_AUDIO3, .present = true }, 1113 + [tegra_clk_audio4] = { .dt_id = TEGRA114_CLK_AUDIO4, .present = true }, 1114 + [tegra_clk_spdif] = { .dt_id = TEGRA114_CLK_SPDIF, .present = true }, 1115 + [tegra_clk_clk_out_1] = { .dt_id = TEGRA114_CLK_CLK_OUT_1, .present = true }, 1116 + [tegra_clk_clk_out_2] = { .dt_id = TEGRA114_CLK_CLK_OUT_2, .present = true }, 1117 + [tegra_clk_clk_out_3] = { .dt_id = TEGRA114_CLK_CLK_OUT_3, .present = true }, 1118 + [tegra_clk_blink] = { .dt_id = TEGRA114_CLK_BLINK, .present = true }, 1119 + [tegra_clk_xusb_host_src] = { .dt_id = TEGRA114_CLK_XUSB_HOST_SRC, .present = true }, 1120 + [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true }, 1121 + [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true }, 1122 + [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA114_CLK_XUSB_SS_SRC, .present = true }, 1123 + [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA114_CLK_XUSB_DEV_SRC, .present = true }, 1124 + [tegra_clk_xusb_dev] = { .dt_id = TEGRA114_CLK_XUSB_DEV, .present = true }, 1125 + [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA114_CLK_XUSB_HS_SRC, .present = true }, 1126 + [tegra_clk_sclk] = { .dt_id = TEGRA114_CLK_SCLK, .present = true }, 1127 + [tegra_clk_hclk] = { .dt_id = TEGRA114_CLK_HCLK, .present = true }, 1128 + [tegra_clk_pclk] = { .dt_id = TEGRA114_CLK_PCLK, .present = true }, 1129 + [tegra_clk_cclk_g] = { .dt_id = TEGRA114_CLK_CCLK_G, .present = true }, 1130 + [tegra_clk_cclk_lp] = { .dt_id = TEGRA114_CLK_CCLK_LP, .present = true }, 1131 + [tegra_clk_dfll_ref] = { .dt_id = TEGRA114_CLK_DFLL_REF, .present = true }, 1132 + [tegra_clk_dfll_soc] = { .dt_id = TEGRA114_CLK_DFLL_SOC, .present = true }, 1133 + [tegra_clk_audio0_mux] = { .dt_id = TEGRA114_CLK_AUDIO0_MUX, .present = true }, 1134 + [tegra_clk_audio1_mux] = { .dt_id = TEGRA114_CLK_AUDIO1_MUX, .present = true }, 1135 + [tegra_clk_audio2_mux] = { .dt_id = TEGRA114_CLK_AUDIO2_MUX, .present = true }, 1136 + [tegra_clk_audio3_mux] = { .dt_id = TEGRA114_CLK_AUDIO3_MUX, .present = true }, 1137 + [tegra_clk_audio4_mux] = { .dt_id = TEGRA114_CLK_AUDIO4_MUX, .present = true }, 1138 + [tegra_clk_spdif_mux] = { .dt_id = TEGRA114_CLK_SPDIF_MUX, .present = true }, 1139 + [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_1_MUX, .present = true }, 1140 + [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_2_MUX, .present = true }, 1141 + [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_3_MUX, .present = true }, 1142 + [tegra_clk_dsia_mux] = { .dt_id = TEGRA114_CLK_DSIA_MUX, .present = true }, 1143 + [tegra_clk_dsib_mux] = { .dt_id = TEGRA114_CLK_DSIB_MUX, .present = true }, 1144 + }; 1145 + 956 1146 static struct tegra_devclk devclks[] __initdata = { 957 1147 { .con_id = "clk_m", .dt_id = TEGRA114_CLK_CLK_M }, 958 1148 { .con_id = "pll_ref", .dt_id = TEGRA114_CLK_PLL_REF }, ··· 1494 1324 CLK_SET_RATE_PARENT, 1, 2); 1495 1325 clks[TEGRA114_CLK_PLL_D2_OUT0] = clk; 1496 1326 1497 - /* PLLA */ 1498 - clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc, 0, 1499 - &pll_a_params, NULL); 1500 - clks[TEGRA114_CLK_PLL_A] = clk; 1501 - 1502 - /* PLLA_OUT0 */ 1503 - clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", 1504 - clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP, 1505 - 8, 8, 1, NULL); 1506 - clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", 1507 - clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED | 1508 - CLK_SET_RATE_PARENT, 0, NULL); 1509 - clks[TEGRA114_CLK_PLL_A_OUT0] = clk; 1510 - 1511 1327 /* PLLRE */ 1512 1328 clk = tegra_clk_register_pllre("pll_re_vco", "pll_ref", clk_base, pmc, 1513 1329 0, &pll_re_vco_params, &pll_re_lock, pll_ref_freq); ··· 1510 1354 clks[TEGRA114_CLK_PLL_E_OUT0] = clk; 1511 1355 } 1512 1356 1513 - static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync", 1514 - "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", 1515 - }; 1516 - 1517 1357 static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", 1518 1358 "clk_m_div4", "extern1", 1519 1359 }; ··· 1521 1369 static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", 1522 1370 "clk_m_div4", "extern3", 1523 1371 }; 1524 - 1525 - static void __init tegra114_audio_clk_init(void __iomem *clk_base) 1526 - { 1527 - struct clk *clk; 1528 - 1529 - /* spdif_in_sync */ 1530 - clk = tegra_clk_register_sync_source("spdif_in_sync", 24000000, 1531 - 24000000); 1532 - clks[TEGRA114_CLK_SPDIF_IN_SYNC] = clk; 1533 - 1534 - /* i2s0_sync */ 1535 - clk = tegra_clk_register_sync_source("i2s0_sync", 24000000, 24000000); 1536 - clks[TEGRA114_CLK_I2S0_SYNC] = clk; 1537 - 1538 - /* i2s1_sync */ 1539 - clk = tegra_clk_register_sync_source("i2s1_sync", 24000000, 24000000); 1540 - clks[TEGRA114_CLK_I2S1_SYNC] = clk; 1541 - 1542 - /* i2s2_sync */ 1543 - clk = tegra_clk_register_sync_source("i2s2_sync", 24000000, 24000000); 1544 - clks[TEGRA114_CLK_I2S2_SYNC] = clk; 1545 - 1546 - /* i2s3_sync */ 1547 - clk = tegra_clk_register_sync_source("i2s3_sync", 24000000, 24000000); 1548 - clks[TEGRA114_CLK_I2S3_SYNC] = clk; 1549 - 1550 - /* i2s4_sync */ 1551 - clk = tegra_clk_register_sync_source("i2s4_sync", 24000000, 24000000); 1552 - clks[TEGRA114_CLK_I2S4_SYNC] = clk; 1553 - 1554 - /* vimclk_sync */ 1555 - clk = tegra_clk_register_sync_source("vimclk_sync", 24000000, 24000000); 1556 - clks[TEGRA114_CLK_VIMCLK_SYNC] = clk; 1557 - 1558 - /* audio0 */ 1559 - clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, 1560 - ARRAY_SIZE(mux_audio_sync_clk), 1561 - CLK_SET_RATE_NO_REPARENT, 1562 - clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, 1563 - NULL); 1564 - clks[TEGRA114_CLK_AUDIO0_MUX] = clk; 1565 - clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, 1566 - clk_base + AUDIO_SYNC_CLK_I2S0, 4, 1567 - CLK_GATE_SET_TO_DISABLE, NULL); 1568 - clks[TEGRA114_CLK_AUDIO0] = clk; 1569 - 1570 - /* audio1 */ 1571 - clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, 1572 - ARRAY_SIZE(mux_audio_sync_clk), 1573 - CLK_SET_RATE_NO_REPARENT, 1574 - clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, 1575 - NULL); 1576 - clks[TEGRA114_CLK_AUDIO1_MUX] = clk; 1577 - clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, 1578 - clk_base + AUDIO_SYNC_CLK_I2S1, 4, 1579 - CLK_GATE_SET_TO_DISABLE, NULL); 1580 - clks[TEGRA114_CLK_AUDIO1] = clk; 1581 - 1582 - /* audio2 */ 1583 - clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, 1584 - ARRAY_SIZE(mux_audio_sync_clk), 1585 - CLK_SET_RATE_NO_REPARENT, 1586 - clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, 1587 - NULL); 1588 - clks[TEGRA114_CLK_AUDIO2_MUX] = clk; 1589 - clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, 1590 - clk_base + AUDIO_SYNC_CLK_I2S2, 4, 1591 - CLK_GATE_SET_TO_DISABLE, NULL); 1592 - clks[TEGRA114_CLK_AUDIO2] = clk; 1593 - 1594 - /* audio3 */ 1595 - clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, 1596 - ARRAY_SIZE(mux_audio_sync_clk), 1597 - CLK_SET_RATE_NO_REPARENT, 1598 - clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, 1599 - NULL); 1600 - clks[TEGRA114_CLK_AUDIO3_MUX] = clk; 1601 - clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, 1602 - clk_base + AUDIO_SYNC_CLK_I2S3, 4, 1603 - CLK_GATE_SET_TO_DISABLE, NULL); 1604 - clks[TEGRA114_CLK_AUDIO3] = clk; 1605 - 1606 - /* audio4 */ 1607 - clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, 1608 - ARRAY_SIZE(mux_audio_sync_clk), 1609 - CLK_SET_RATE_NO_REPARENT, 1610 - clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, 1611 - NULL); 1612 - clks[TEGRA114_CLK_AUDIO4_MUX] = clk; 1613 - clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, 1614 - clk_base + AUDIO_SYNC_CLK_I2S4, 4, 1615 - CLK_GATE_SET_TO_DISABLE, NULL); 1616 - clks[TEGRA114_CLK_AUDIO4] = clk; 1617 - 1618 - /* spdif */ 1619 - clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, 1620 - ARRAY_SIZE(mux_audio_sync_clk), 1621 - CLK_SET_RATE_NO_REPARENT, 1622 - clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, 1623 - NULL); 1624 - clks[TEGRA114_CLK_SPDIF_MUX] = clk; 1625 - clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, 1626 - clk_base + AUDIO_SYNC_CLK_SPDIF, 4, 1627 - CLK_GATE_SET_TO_DISABLE, NULL); 1628 - clks[TEGRA114_CLK_SPDIF] = clk; 1629 - 1630 - /* audio0_2x */ 1631 - clk = clk_register_fixed_factor(NULL, "audio0_doubler", "audio0", 1632 - CLK_SET_RATE_PARENT, 2, 1); 1633 - clk = tegra_clk_register_divider("audio0_div", "audio0_doubler", 1634 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 24, 1, 1635 - 0, &clk_doubler_lock); 1636 - clk = tegra_clk_register_periph_gate("audio0_2x", "audio0_div", 1637 - TEGRA_PERIPH_NO_RESET, clk_base, 1638 - CLK_SET_RATE_PARENT, 113, 1639 - periph_clk_enb_refcnt); 1640 - clks[TEGRA114_CLK_AUDIO0_2X] = clk; 1641 - 1642 - /* audio1_2x */ 1643 - clk = clk_register_fixed_factor(NULL, "audio1_doubler", "audio1", 1644 - CLK_SET_RATE_PARENT, 2, 1); 1645 - clk = tegra_clk_register_divider("audio1_div", "audio1_doubler", 1646 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 25, 1, 1647 - 0, &clk_doubler_lock); 1648 - clk = tegra_clk_register_periph_gate("audio1_2x", "audio1_div", 1649 - TEGRA_PERIPH_NO_RESET, clk_base, 1650 - CLK_SET_RATE_PARENT, 114, 1651 - periph_clk_enb_refcnt); 1652 - clks[TEGRA114_CLK_AUDIO1_2X] = clk; 1653 - 1654 - /* audio2_2x */ 1655 - clk = clk_register_fixed_factor(NULL, "audio2_doubler", "audio2", 1656 - CLK_SET_RATE_PARENT, 2, 1); 1657 - clk = tegra_clk_register_divider("audio2_div", "audio2_doubler", 1658 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 26, 1, 1659 - 0, &clk_doubler_lock); 1660 - clk = tegra_clk_register_periph_gate("audio2_2x", "audio2_div", 1661 - TEGRA_PERIPH_NO_RESET, clk_base, 1662 - CLK_SET_RATE_PARENT, 115, 1663 - periph_clk_enb_refcnt); 1664 - clks[TEGRA114_CLK_AUDIO2_2X] = clk; 1665 - 1666 - /* audio3_2x */ 1667 - clk = clk_register_fixed_factor(NULL, "audio3_doubler", "audio3", 1668 - CLK_SET_RATE_PARENT, 2, 1); 1669 - clk = tegra_clk_register_divider("audio3_div", "audio3_doubler", 1670 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 27, 1, 1671 - 0, &clk_doubler_lock); 1672 - clk = tegra_clk_register_periph_gate("audio3_2x", "audio3_div", 1673 - TEGRA_PERIPH_NO_RESET, clk_base, 1674 - CLK_SET_RATE_PARENT, 116, 1675 - periph_clk_enb_refcnt); 1676 - clks[TEGRA114_CLK_AUDIO3_2X] = clk; 1677 - 1678 - /* audio4_2x */ 1679 - clk = clk_register_fixed_factor(NULL, "audio4_doubler", "audio4", 1680 - CLK_SET_RATE_PARENT, 2, 1); 1681 - clk = tegra_clk_register_divider("audio4_div", "audio4_doubler", 1682 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 28, 1, 1683 - 0, &clk_doubler_lock); 1684 - clk = tegra_clk_register_periph_gate("audio4_2x", "audio4_div", 1685 - TEGRA_PERIPH_NO_RESET, clk_base, 1686 - CLK_SET_RATE_PARENT, 117, 1687 - periph_clk_enb_refcnt); 1688 - clks[TEGRA114_CLK_AUDIO4_2X] = clk; 1689 - 1690 - /* spdif_2x */ 1691 - clk = clk_register_fixed_factor(NULL, "spdif_doubler", "spdif", 1692 - CLK_SET_RATE_PARENT, 2, 1); 1693 - clk = tegra_clk_register_divider("spdif_div", "spdif_doubler", 1694 - clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 29, 1, 1695 - 0, &clk_doubler_lock); 1696 - clk = tegra_clk_register_periph_gate("spdif_2x", "spdif_div", 1697 - TEGRA_PERIPH_NO_RESET, clk_base, 1698 - CLK_SET_RATE_PARENT, 118, 1699 - periph_clk_enb_refcnt); 1700 - clks[TEGRA114_CLK_SPDIF_2X] = clk; 1701 - } 1702 1372 1703 1373 static void __init tegra114_pmc_clk_init(void __iomem *pmc_base) 1704 1374 { ··· 2168 2194 tegra114_fixed_clk_init(clk_base); 2169 2195 tegra114_pll_init(clk_base, pmc_base); 2170 2196 tegra114_periph_clk_init(clk_base); 2171 - tegra114_audio_clk_init(clk_base); 2197 + tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, &pll_a_params); 2172 2198 tegra114_pmc_clk_init(pmc_base); 2173 2199 tegra114_super_clk_init(clk_base); 2174 2200
+4
drivers/clk/tegra/clk.h
··· 593 593 void tegra_add_of_provider(struct device_node *np); 594 594 void tegra_register_devclks(struct tegra_devclk *dev_clks, int num); 595 595 596 + void tegra_audio_clk_init(void __iomem *clk_base, 597 + void __iomem *pmc_base, struct tegra_clk *tegra_clks, 598 + struct tegra_clk_pll_params *pll_params); 599 + 596 600 void tegra114_clock_tune_cpu_trimmers_high(void); 597 601 void tegra114_clock_tune_cpu_trimmers_low(void); 598 602 void tegra114_clock_tune_cpu_trimmers_init(void);