0001
0002
0003
0004
0005
0006 #include <linux/clk-provider.h>
0007 #include <linux/err.h>
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010 #include <linux/of_device.h>
0011 #include <linux/of.h>
0012 #include <linux/regmap.h>
0013
0014 #include <dt-bindings/clock/qcom,gcc-sdx65.h>
0015
0016 #include "clk-alpha-pll.h"
0017 #include "clk-branch.h"
0018 #include "clk-rcg.h"
0019 #include "clk-regmap.h"
0020 #include "clk-regmap-divider.h"
0021 #include "clk-regmap-mux.h"
0022 #include "common.h"
0023 #include "gdsc.h"
0024 #include "reset.h"
0025
0026 enum {
0027 P_BI_TCXO,
0028 P_GPLL0_OUT_EVEN,
0029 P_GPLL0_OUT_MAIN,
0030 P_PCIE_PIPE_CLK,
0031 P_SLEEP_CLK,
0032 P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK,
0033 };
0034
0035 static struct clk_alpha_pll gpll0 = {
0036 .offset = 0x0,
0037 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
0038 .clkr = {
0039 .enable_reg = 0x6d000,
0040 .enable_mask = BIT(0),
0041 .hw.init = &(struct clk_init_data){
0042 .name = "gpll0",
0043 .parent_data = &(const struct clk_parent_data){
0044 .fw_name = "bi_tcxo",
0045 },
0046 .num_parents = 1,
0047 .ops = &clk_alpha_pll_fixed_lucid_evo_ops,
0048 },
0049 },
0050 };
0051
0052 static const struct clk_div_table post_div_table_gpll0_out_even[] = {
0053 { 0x1, 2 },
0054 { }
0055 };
0056
0057 static struct clk_alpha_pll_postdiv gpll0_out_even = {
0058 .offset = 0x0,
0059 .post_div_shift = 10,
0060 .post_div_table = post_div_table_gpll0_out_even,
0061 .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even),
0062 .width = 4,
0063 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
0064 .clkr.hw.init = &(struct clk_init_data){
0065 .name = "gpll0_out_even",
0066 .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
0067 .num_parents = 1,
0068 .ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
0069 },
0070 };
0071
0072 static const struct parent_map gcc_parent_map_0[] = {
0073 { P_BI_TCXO, 0 },
0074 { P_GPLL0_OUT_MAIN, 1 },
0075 { P_GPLL0_OUT_EVEN, 6 },
0076 };
0077
0078 static const struct clk_parent_data gcc_parent_data_0[] = {
0079 { .fw_name = "bi_tcxo" },
0080 { .hw = &gpll0.clkr.hw },
0081 { .hw = &gpll0_out_even.clkr.hw },
0082 };
0083
0084 static const struct clk_parent_data gcc_parent_data_0_ao[] = {
0085 { .fw_name = "bi_tcxo_ao" },
0086 { .hw = &gpll0.clkr.hw },
0087 { .hw = &gpll0_out_even.clkr.hw },
0088 };
0089
0090 static const struct parent_map gcc_parent_map_2[] = {
0091 { P_BI_TCXO, 0 },
0092 { P_GPLL0_OUT_MAIN, 1 },
0093 { P_SLEEP_CLK, 5 },
0094 { P_GPLL0_OUT_EVEN, 6 },
0095 };
0096
0097 static const struct clk_parent_data gcc_parent_data_2[] = {
0098 { .fw_name = "bi_tcxo" },
0099 { .hw = &gpll0.clkr.hw },
0100 { .fw_name = "sleep_clk" },
0101 { .hw = &gpll0_out_even.clkr.hw },
0102 };
0103
0104 static const struct parent_map gcc_parent_map_3[] = {
0105 { P_BI_TCXO, 0 },
0106 { P_SLEEP_CLK, 5 },
0107 };
0108
0109 static const struct clk_parent_data gcc_parent_data_3[] = {
0110 { .fw_name = "bi_tcxo" },
0111 { .fw_name = "sleep_clk" },
0112 };
0113
0114 static const struct parent_map gcc_parent_map_4[] = {
0115 { P_BI_TCXO, 2 },
0116 };
0117
0118 static const struct parent_map gcc_parent_map_5[] = {
0119 { P_PCIE_PIPE_CLK, 0 },
0120 { P_BI_TCXO, 2 },
0121 };
0122
0123 static const struct clk_parent_data gcc_parent_data_5[] = {
0124 { .fw_name = "pcie_pipe_clk"},
0125 { .fw_name = "bi_tcxo"},
0126 };
0127
0128 static const struct parent_map gcc_parent_map_6[] = {
0129 { P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 0 },
0130 { P_BI_TCXO, 2 },
0131 };
0132
0133 static const struct clk_parent_data gcc_parent_data_6[] = {
0134 { .fw_name = "usb3_phy_wrapper_gcc_usb30_pipe_clk"},
0135 { .fw_name = "bi_tcxo"},
0136 };
0137
0138 static struct clk_regmap_mux gcc_pcie_aux_clk_src = {
0139 .reg = 0x43060,
0140 .shift = 0,
0141 .width = 2,
0142 .parent_map = gcc_parent_map_4,
0143 .clkr = {
0144 .hw.init = &(struct clk_init_data){
0145 .name = "gcc_pcie_aux_clk_src",
0146 .parent_data = &(const struct clk_parent_data){
0147 .fw_name = "bi_tcxo",
0148 },
0149 .num_parents = 1,
0150 .ops = &clk_regmap_mux_closest_ops,
0151 },
0152 },
0153 };
0154
0155 static struct clk_regmap_mux gcc_pcie_pipe_clk_src = {
0156 .reg = 0x43044,
0157 .shift = 0,
0158 .width = 2,
0159 .parent_map = gcc_parent_map_5,
0160 .clkr = {
0161 .hw.init = &(struct clk_init_data){
0162 .name = "gcc_pcie_pipe_clk_src",
0163 .parent_data = gcc_parent_data_5,
0164 .num_parents = 2,
0165 .ops = &clk_regmap_mux_closest_ops,
0166 },
0167 },
0168 };
0169
0170 static struct clk_regmap_mux gcc_usb3_phy_pipe_clk_src = {
0171 .reg = 0x1706c,
0172 .shift = 0,
0173 .width = 2,
0174 .parent_map = gcc_parent_map_6,
0175 .clkr = {
0176 .hw.init = &(struct clk_init_data){
0177 .name = "gcc_usb3_phy_pipe_clk_src",
0178 .parent_data = gcc_parent_data_6,
0179 .num_parents = 2,
0180 .ops = &clk_regmap_mux_closest_ops,
0181 },
0182 },
0183 };
0184
0185 static const struct freq_tbl ftbl_gcc_blsp1_qup1_i2c_apps_clk_src[] = {
0186 F(9600000, P_BI_TCXO, 2, 0, 0),
0187 F(19200000, P_BI_TCXO, 1, 0, 0),
0188 F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
0189 { }
0190 };
0191
0192 static struct clk_rcg2 gcc_blsp1_qup1_i2c_apps_clk_src = {
0193 .cmd_rcgr = 0x1c024,
0194 .mnd_width = 8,
0195 .hid_width = 5,
0196 .parent_map = gcc_parent_map_0,
0197 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
0198 .clkr.hw.init = &(struct clk_init_data){
0199 .name = "gcc_blsp1_qup1_i2c_apps_clk_src",
0200 .parent_data = gcc_parent_data_0,
0201 .num_parents = 3,
0202 .flags = CLK_SET_RATE_PARENT,
0203 .ops = &clk_rcg2_ops,
0204 },
0205 };
0206
0207 static const struct freq_tbl ftbl_gcc_blsp1_qup1_spi_apps_clk_src[] = {
0208 F(960000, P_BI_TCXO, 10, 1, 2),
0209 F(4800000, P_BI_TCXO, 4, 0, 0),
0210 F(9600000, P_BI_TCXO, 2, 0, 0),
0211 F(15000000, P_GPLL0_OUT_EVEN, 5, 1, 4),
0212 F(19200000, P_BI_TCXO, 1, 0, 0),
0213 F(24000000, P_GPLL0_OUT_MAIN, 12.5, 1, 2),
0214 F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2),
0215 F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
0216 { }
0217 };
0218
0219 static struct clk_rcg2 gcc_blsp1_qup1_spi_apps_clk_src = {
0220 .cmd_rcgr = 0x1c00c,
0221 .mnd_width = 8,
0222 .hid_width = 5,
0223 .parent_map = gcc_parent_map_0,
0224 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
0225 .clkr.hw.init = &(struct clk_init_data){
0226 .name = "gcc_blsp1_qup1_spi_apps_clk_src",
0227 .parent_data = gcc_parent_data_0,
0228 .num_parents = 3,
0229 .flags = CLK_SET_RATE_PARENT,
0230 .ops = &clk_rcg2_ops,
0231 },
0232 };
0233
0234 static struct clk_rcg2 gcc_blsp1_qup2_i2c_apps_clk_src = {
0235 .cmd_rcgr = 0x1e024,
0236 .mnd_width = 8,
0237 .hid_width = 5,
0238 .parent_map = gcc_parent_map_0,
0239 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
0240 .clkr.hw.init = &(struct clk_init_data){
0241 .name = "gcc_blsp1_qup2_i2c_apps_clk_src",
0242 .parent_data = gcc_parent_data_0,
0243 .num_parents = 3,
0244 .flags = CLK_SET_RATE_PARENT,
0245 .ops = &clk_rcg2_ops,
0246 },
0247 };
0248
0249 static struct clk_rcg2 gcc_blsp1_qup2_spi_apps_clk_src = {
0250 .cmd_rcgr = 0x1e00c,
0251 .mnd_width = 8,
0252 .hid_width = 5,
0253 .parent_map = gcc_parent_map_0,
0254 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
0255 .clkr.hw.init = &(struct clk_init_data){
0256 .name = "gcc_blsp1_qup2_spi_apps_clk_src",
0257 .parent_data = gcc_parent_data_0,
0258 .num_parents = 3,
0259 .flags = CLK_SET_RATE_PARENT,
0260 .ops = &clk_rcg2_ops,
0261 },
0262 };
0263
0264 static struct clk_rcg2 gcc_blsp1_qup3_i2c_apps_clk_src = {
0265 .cmd_rcgr = 0x20024,
0266 .mnd_width = 8,
0267 .hid_width = 5,
0268 .parent_map = gcc_parent_map_0,
0269 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
0270 .clkr.hw.init = &(struct clk_init_data){
0271 .name = "gcc_blsp1_qup3_i2c_apps_clk_src",
0272 .parent_data = gcc_parent_data_0,
0273 .num_parents = 3,
0274 .flags = CLK_SET_RATE_PARENT,
0275 .ops = &clk_rcg2_ops,
0276 },
0277 };
0278
0279 static struct clk_rcg2 gcc_blsp1_qup3_spi_apps_clk_src = {
0280 .cmd_rcgr = 0x2000c,
0281 .mnd_width = 8,
0282 .hid_width = 5,
0283 .parent_map = gcc_parent_map_0,
0284 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
0285 .clkr.hw.init = &(struct clk_init_data){
0286 .name = "gcc_blsp1_qup3_spi_apps_clk_src",
0287 .parent_data = gcc_parent_data_0,
0288 .num_parents = 3,
0289 .flags = CLK_SET_RATE_PARENT,
0290 .ops = &clk_rcg2_ops,
0291 },
0292 };
0293
0294 static struct clk_rcg2 gcc_blsp1_qup4_i2c_apps_clk_src = {
0295 .cmd_rcgr = 0x22024,
0296 .mnd_width = 8,
0297 .hid_width = 5,
0298 .parent_map = gcc_parent_map_0,
0299 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
0300 .clkr.hw.init = &(struct clk_init_data){
0301 .name = "gcc_blsp1_qup4_i2c_apps_clk_src",
0302 .parent_data = gcc_parent_data_0,
0303 .num_parents = 3,
0304 .flags = CLK_SET_RATE_PARENT,
0305 .ops = &clk_rcg2_ops,
0306 },
0307 };
0308
0309 static struct clk_rcg2 gcc_blsp1_qup4_spi_apps_clk_src = {
0310 .cmd_rcgr = 0x2200c,
0311 .mnd_width = 8,
0312 .hid_width = 5,
0313 .parent_map = gcc_parent_map_0,
0314 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
0315 .clkr.hw.init = &(struct clk_init_data){
0316 .name = "gcc_blsp1_qup4_spi_apps_clk_src",
0317 .parent_data = gcc_parent_data_0,
0318 .num_parents = 3,
0319 .flags = CLK_SET_RATE_PARENT,
0320 .ops = &clk_rcg2_ops,
0321 },
0322 };
0323
0324 static const struct freq_tbl ftbl_gcc_blsp1_uart1_apps_clk_src[] = {
0325 F(3686400, P_GPLL0_OUT_EVEN, 1, 192, 15625),
0326 F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625),
0327 F(9600000, P_BI_TCXO, 2, 0, 0),
0328 F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625),
0329 F(16000000, P_GPLL0_OUT_EVEN, 1, 4, 75),
0330 F(19200000, P_BI_TCXO, 1, 0, 0),
0331 F(19354839, P_GPLL0_OUT_MAIN, 15.5, 1, 2),
0332 F(20000000, P_GPLL0_OUT_MAIN, 15, 1, 2),
0333 F(20689655, P_GPLL0_OUT_MAIN, 14.5, 1, 2),
0334 F(21428571, P_GPLL0_OUT_MAIN, 14, 1, 2),
0335 F(22222222, P_GPLL0_OUT_MAIN, 13.5, 1, 2),
0336 F(23076923, P_GPLL0_OUT_MAIN, 13, 1, 2),
0337 F(24000000, P_GPLL0_OUT_MAIN, 5, 1, 5),
0338 F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2),
0339 F(26086957, P_GPLL0_OUT_MAIN, 11.5, 1, 2),
0340 F(27272727, P_GPLL0_OUT_MAIN, 11, 1, 2),
0341 F(28571429, P_GPLL0_OUT_MAIN, 10.5, 1, 2),
0342 F(32000000, P_GPLL0_OUT_MAIN, 1, 4, 75),
0343 F(40000000, P_GPLL0_OUT_MAIN, 15, 0, 0),
0344 F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 375),
0345 F(48000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0),
0346 F(51200000, P_GPLL0_OUT_MAIN, 1, 32, 375),
0347 F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 75),
0348 F(58982400, P_GPLL0_OUT_MAIN, 1, 1536, 15625),
0349 F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
0350 F(63157895, P_GPLL0_OUT_MAIN, 9.5, 0, 0),
0351 { }
0352 };
0353
0354 static struct clk_rcg2 gcc_blsp1_uart1_apps_clk_src = {
0355 .cmd_rcgr = 0x1d00c,
0356 .mnd_width = 16,
0357 .hid_width = 5,
0358 .parent_map = gcc_parent_map_0,
0359 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
0360 .clkr.hw.init = &(struct clk_init_data){
0361 .name = "gcc_blsp1_uart1_apps_clk_src",
0362 .parent_data = gcc_parent_data_0,
0363 .num_parents = 3,
0364 .flags = CLK_SET_RATE_PARENT,
0365 .ops = &clk_rcg2_ops,
0366 },
0367 };
0368
0369 static struct clk_rcg2 gcc_blsp1_uart2_apps_clk_src = {
0370 .cmd_rcgr = 0x1f00c,
0371 .mnd_width = 16,
0372 .hid_width = 5,
0373 .parent_map = gcc_parent_map_0,
0374 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
0375 .clkr.hw.init = &(struct clk_init_data){
0376 .name = "gcc_blsp1_uart2_apps_clk_src",
0377 .parent_data = gcc_parent_data_0,
0378 .num_parents = 3,
0379 .flags = CLK_SET_RATE_PARENT,
0380 .ops = &clk_rcg2_ops,
0381 },
0382 };
0383
0384 static struct clk_rcg2 gcc_blsp1_uart3_apps_clk_src = {
0385 .cmd_rcgr = 0x2100c,
0386 .mnd_width = 16,
0387 .hid_width = 5,
0388 .parent_map = gcc_parent_map_0,
0389 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
0390 .clkr.hw.init = &(struct clk_init_data){
0391 .name = "gcc_blsp1_uart3_apps_clk_src",
0392 .parent_data = gcc_parent_data_0,
0393 .num_parents = 3,
0394 .flags = CLK_SET_RATE_PARENT,
0395 .ops = &clk_rcg2_ops,
0396 },
0397 };
0398
0399 static struct clk_rcg2 gcc_blsp1_uart4_apps_clk_src = {
0400 .cmd_rcgr = 0x2300c,
0401 .mnd_width = 16,
0402 .hid_width = 5,
0403 .parent_map = gcc_parent_map_0,
0404 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
0405 .clkr.hw.init = &(struct clk_init_data){
0406 .name = "gcc_blsp1_uart4_apps_clk_src",
0407 .parent_data = gcc_parent_data_0,
0408 .num_parents = 3,
0409 .flags = CLK_SET_RATE_PARENT,
0410 .ops = &clk_rcg2_ops,
0411 },
0412 };
0413
0414 static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
0415 F(19200000, P_BI_TCXO, 1, 0, 0),
0416 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
0417 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
0418 F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
0419 { }
0420 };
0421
0422 static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
0423 .cmd_rcgr = 0x3000c,
0424 .mnd_width = 0,
0425 .hid_width = 5,
0426 .parent_map = gcc_parent_map_0,
0427 .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
0428 .clkr.hw.init = &(struct clk_init_data){
0429 .name = "gcc_cpuss_ahb_clk_src",
0430 .parent_data = gcc_parent_data_0_ao,
0431 .num_parents = 3,
0432 .flags = CLK_SET_RATE_PARENT,
0433 .ops = &clk_rcg2_ops,
0434 },
0435 };
0436
0437 static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
0438 F(19200000, P_BI_TCXO, 1, 0, 0),
0439 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
0440 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
0441 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
0442 { }
0443 };
0444
0445 static struct clk_rcg2 gcc_gp1_clk_src = {
0446 .cmd_rcgr = 0x37004,
0447 .mnd_width = 16,
0448 .hid_width = 5,
0449 .parent_map = gcc_parent_map_2,
0450 .freq_tbl = ftbl_gcc_gp1_clk_src,
0451 .clkr.hw.init = &(struct clk_init_data){
0452 .name = "gcc_gp1_clk_src",
0453 .parent_data = gcc_parent_data_2,
0454 .num_parents = 4,
0455 .flags = CLK_SET_RATE_PARENT,
0456 .ops = &clk_rcg2_ops,
0457 },
0458 };
0459
0460 static struct clk_rcg2 gcc_gp2_clk_src = {
0461 .cmd_rcgr = 0x38004,
0462 .mnd_width = 16,
0463 .hid_width = 5,
0464 .parent_map = gcc_parent_map_2,
0465 .freq_tbl = ftbl_gcc_gp1_clk_src,
0466 .clkr.hw.init = &(struct clk_init_data){
0467 .name = "gcc_gp2_clk_src",
0468 .parent_data = gcc_parent_data_2,
0469 .num_parents = 4,
0470 .flags = CLK_SET_RATE_PARENT,
0471 .ops = &clk_rcg2_ops,
0472 },
0473 };
0474
0475 static struct clk_rcg2 gcc_gp3_clk_src = {
0476 .cmd_rcgr = 0x39004,
0477 .mnd_width = 16,
0478 .hid_width = 5,
0479 .parent_map = gcc_parent_map_2,
0480 .freq_tbl = ftbl_gcc_gp1_clk_src,
0481 .clkr.hw.init = &(struct clk_init_data){
0482 .name = "gcc_gp3_clk_src",
0483 .parent_data = gcc_parent_data_2,
0484 .num_parents = 4,
0485 .flags = CLK_SET_RATE_PARENT,
0486 .ops = &clk_rcg2_ops,
0487 },
0488 };
0489
0490 static const struct freq_tbl ftbl_gcc_pcie_aux_phy_clk_src[] = {
0491 F(19200000, P_BI_TCXO, 1, 0, 0),
0492 { }
0493 };
0494
0495 static struct clk_rcg2 gcc_pcie_aux_phy_clk_src = {
0496 .cmd_rcgr = 0x43048,
0497 .mnd_width = 16,
0498 .hid_width = 5,
0499 .parent_map = gcc_parent_map_3,
0500 .freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src,
0501 .clkr.hw.init = &(struct clk_init_data){
0502 .name = "gcc_pcie_aux_phy_clk_src",
0503 .parent_data = gcc_parent_data_3,
0504 .num_parents = 2,
0505 .flags = CLK_SET_RATE_PARENT,
0506 .ops = &clk_rcg2_ops,
0507 },
0508 };
0509
0510 static const struct freq_tbl ftbl_gcc_pcie_rchng_phy_clk_src[] = {
0511 F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
0512 { }
0513 };
0514
0515 static struct clk_rcg2 gcc_pcie_rchng_phy_clk_src = {
0516 .cmd_rcgr = 0x43064,
0517 .mnd_width = 0,
0518 .hid_width = 5,
0519 .parent_map = gcc_parent_map_2,
0520 .freq_tbl = ftbl_gcc_pcie_rchng_phy_clk_src,
0521 .clkr.hw.init = &(struct clk_init_data){
0522 .name = "gcc_pcie_rchng_phy_clk_src",
0523 .parent_data = gcc_parent_data_2,
0524 .num_parents = 4,
0525 .flags = CLK_SET_RATE_PARENT,
0526 .ops = &clk_rcg2_ops,
0527 },
0528 };
0529
0530 static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
0531 F(19200000, P_BI_TCXO, 1, 0, 0),
0532 F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
0533 { }
0534 };
0535
0536 static struct clk_rcg2 gcc_pdm2_clk_src = {
0537 .cmd_rcgr = 0x24010,
0538 .mnd_width = 0,
0539 .hid_width = 5,
0540 .parent_map = gcc_parent_map_0,
0541 .freq_tbl = ftbl_gcc_pdm2_clk_src,
0542 .clkr.hw.init = &(struct clk_init_data){
0543 .name = "gcc_pdm2_clk_src",
0544 .parent_data = gcc_parent_data_0,
0545 .num_parents = 3,
0546 .flags = CLK_SET_RATE_PARENT,
0547 .ops = &clk_rcg2_ops,
0548 },
0549 };
0550
0551 static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
0552 F(400000, P_BI_TCXO, 12, 1, 4),
0553 F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
0554 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
0555 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
0556 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
0557 { }
0558 };
0559
0560 static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
0561 .cmd_rcgr = 0x1a010,
0562 .mnd_width = 8,
0563 .hid_width = 5,
0564 .parent_map = gcc_parent_map_0,
0565 .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
0566 .clkr.hw.init = &(struct clk_init_data){
0567 .name = "gcc_sdcc1_apps_clk_src",
0568 .parent_data = gcc_parent_data_0,
0569 .num_parents = 3,
0570 .flags = CLK_SET_RATE_PARENT,
0571 .ops = &clk_rcg2_ops,
0572 },
0573 };
0574
0575 static const struct freq_tbl ftbl_gcc_usb30_master_clk_src[] = {
0576 F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0),
0577 { }
0578 };
0579
0580 static struct clk_rcg2 gcc_usb30_master_clk_src = {
0581 .cmd_rcgr = 0x17030,
0582 .mnd_width = 8,
0583 .hid_width = 5,
0584 .parent_map = gcc_parent_map_0,
0585 .freq_tbl = ftbl_gcc_usb30_master_clk_src,
0586 .clkr.hw.init = &(struct clk_init_data){
0587 .name = "gcc_usb30_master_clk_src",
0588 .parent_data = gcc_parent_data_0,
0589 .num_parents = 3,
0590 .flags = CLK_SET_RATE_PARENT,
0591 .ops = &clk_rcg2_ops,
0592 },
0593 };
0594
0595 static struct clk_rcg2 gcc_usb30_mock_utmi_clk_src = {
0596 .cmd_rcgr = 0x17048,
0597 .mnd_width = 0,
0598 .hid_width = 5,
0599 .parent_map = gcc_parent_map_0,
0600 .freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src,
0601 .clkr.hw.init = &(struct clk_init_data){
0602 .name = "gcc_usb30_mock_utmi_clk_src",
0603 .parent_data = gcc_parent_data_0,
0604 .num_parents = 3,
0605 .flags = CLK_SET_RATE_PARENT,
0606 .ops = &clk_rcg2_ops,
0607 },
0608 };
0609
0610 static const struct freq_tbl ftbl_gcc_usb3_phy_aux_clk_src[] = {
0611 F(1000000, P_BI_TCXO, 1, 5, 96),
0612 F(19200000, P_BI_TCXO, 1, 0, 0),
0613 { }
0614 };
0615
0616 static struct clk_rcg2 gcc_usb3_phy_aux_clk_src = {
0617 .cmd_rcgr = 0x17070,
0618 .mnd_width = 16,
0619 .hid_width = 5,
0620 .parent_map = gcc_parent_map_3,
0621 .freq_tbl = ftbl_gcc_usb3_phy_aux_clk_src,
0622 .clkr.hw.init = &(struct clk_init_data){
0623 .name = "gcc_usb3_phy_aux_clk_src",
0624 .parent_data = gcc_parent_data_3,
0625 .num_parents = 2,
0626 .flags = CLK_SET_RATE_PARENT,
0627 .ops = &clk_rcg2_ops,
0628 },
0629 };
0630
0631 static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = {
0632 .reg = 0x30024,
0633 .shift = 0,
0634 .width = 4,
0635 .clkr.hw.init = &(struct clk_init_data) {
0636 .name = "gcc_cpuss_ahb_postdiv_clk_src",
0637 .parent_data = &(const struct clk_parent_data){
0638 .hw = &gcc_cpuss_ahb_clk_src.clkr.hw,
0639 },
0640 .num_parents = 1,
0641 .flags = CLK_SET_RATE_PARENT,
0642 .ops = &clk_regmap_div_ro_ops,
0643 },
0644 };
0645
0646 static struct clk_regmap_div gcc_usb30_mock_utmi_postdiv_clk_src = {
0647 .reg = 0x17060,
0648 .shift = 0,
0649 .width = 4,
0650 .clkr.hw.init = &(struct clk_init_data) {
0651 .name = "gcc_usb30_mock_utmi_postdiv_clk_src",
0652 .parent_data = &(const struct clk_parent_data){
0653 .hw = &gcc_usb30_mock_utmi_clk_src.clkr.hw,
0654 },
0655 .num_parents = 1,
0656 .flags = CLK_SET_RATE_PARENT,
0657 .ops = &clk_regmap_div_ro_ops,
0658 },
0659 };
0660
0661 static struct clk_branch gcc_ahb_pcie_link_clk = {
0662 .halt_reg = 0x2e004,
0663 .halt_check = BRANCH_HALT,
0664 .clkr = {
0665 .enable_reg = 0x2e004,
0666 .enable_mask = BIT(0),
0667 .hw.init = &(struct clk_init_data){
0668 .name = "gcc_ahb_pcie_link_clk",
0669 .ops = &clk_branch2_ops,
0670 },
0671 },
0672 };
0673
0674 static struct clk_branch gcc_blsp1_ahb_clk = {
0675 .halt_reg = 0x1b004,
0676 .halt_check = BRANCH_HALT_VOTED,
0677 .clkr = {
0678 .enable_reg = 0x6d008,
0679 .enable_mask = BIT(14),
0680 .hw.init = &(struct clk_init_data){
0681 .name = "gcc_blsp1_ahb_clk",
0682 .ops = &clk_branch2_ops,
0683 },
0684 },
0685 };
0686
0687 static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
0688 .halt_reg = 0x1c008,
0689 .halt_check = BRANCH_HALT,
0690 .clkr = {
0691 .enable_reg = 0x1c008,
0692 .enable_mask = BIT(0),
0693 .hw.init = &(struct clk_init_data){
0694 .name = "gcc_blsp1_qup1_i2c_apps_clk",
0695 .parent_data = &(const struct clk_parent_data){
0696 .hw = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr.hw,
0697 },
0698 .num_parents = 1,
0699 .flags = CLK_SET_RATE_PARENT,
0700 .ops = &clk_branch2_ops,
0701 },
0702 },
0703 };
0704
0705 static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
0706 .halt_reg = 0x1c004,
0707 .halt_check = BRANCH_HALT,
0708 .clkr = {
0709 .enable_reg = 0x1c004,
0710 .enable_mask = BIT(0),
0711 .hw.init = &(struct clk_init_data){
0712 .name = "gcc_blsp1_qup1_spi_apps_clk",
0713 .parent_data = &(const struct clk_parent_data){
0714 .hw = &gcc_blsp1_qup1_spi_apps_clk_src.clkr.hw,
0715 },
0716 .num_parents = 1,
0717 .flags = CLK_SET_RATE_PARENT,
0718 .ops = &clk_branch2_ops,
0719 },
0720 },
0721 };
0722
0723 static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
0724 .halt_reg = 0x1e008,
0725 .halt_check = BRANCH_HALT,
0726 .clkr = {
0727 .enable_reg = 0x1e008,
0728 .enable_mask = BIT(0),
0729 .hw.init = &(struct clk_init_data){
0730 .name = "gcc_blsp1_qup2_i2c_apps_clk",
0731 .parent_data = &(const struct clk_parent_data){
0732 .hw = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr.hw,
0733 },
0734 .num_parents = 1,
0735 .flags = CLK_SET_RATE_PARENT,
0736 .ops = &clk_branch2_ops,
0737 },
0738 },
0739 };
0740
0741 static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
0742 .halt_reg = 0x1e004,
0743 .halt_check = BRANCH_HALT,
0744 .clkr = {
0745 .enable_reg = 0x1e004,
0746 .enable_mask = BIT(0),
0747 .hw.init = &(struct clk_init_data){
0748 .name = "gcc_blsp1_qup2_spi_apps_clk",
0749 .parent_data = &(const struct clk_parent_data){
0750 .hw = &gcc_blsp1_qup2_spi_apps_clk_src.clkr.hw,
0751 },
0752 .num_parents = 1,
0753 .flags = CLK_SET_RATE_PARENT,
0754 .ops = &clk_branch2_ops,
0755 },
0756 },
0757 };
0758
0759 static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
0760 .halt_reg = 0x20008,
0761 .halt_check = BRANCH_HALT,
0762 .clkr = {
0763 .enable_reg = 0x20008,
0764 .enable_mask = BIT(0),
0765 .hw.init = &(struct clk_init_data){
0766 .name = "gcc_blsp1_qup3_i2c_apps_clk",
0767 .parent_data = &(const struct clk_parent_data){
0768 .hw = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr.hw,
0769 },
0770 .num_parents = 1,
0771 .flags = CLK_SET_RATE_PARENT,
0772 .ops = &clk_branch2_ops,
0773 },
0774 },
0775 };
0776
0777 static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
0778 .halt_reg = 0x20004,
0779 .halt_check = BRANCH_HALT,
0780 .clkr = {
0781 .enable_reg = 0x20004,
0782 .enable_mask = BIT(0),
0783 .hw.init = &(struct clk_init_data){
0784 .name = "gcc_blsp1_qup3_spi_apps_clk",
0785 .parent_data = &(const struct clk_parent_data){
0786 .hw = &gcc_blsp1_qup3_spi_apps_clk_src.clkr.hw,
0787 },
0788 .num_parents = 1,
0789 .flags = CLK_SET_RATE_PARENT,
0790 .ops = &clk_branch2_ops,
0791 },
0792 },
0793 };
0794
0795 static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
0796 .halt_reg = 0x22008,
0797 .halt_check = BRANCH_HALT,
0798 .clkr = {
0799 .enable_reg = 0x22008,
0800 .enable_mask = BIT(0),
0801 .hw.init = &(struct clk_init_data){
0802 .name = "gcc_blsp1_qup4_i2c_apps_clk",
0803 .parent_data = &(const struct clk_parent_data){
0804 .hw = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr.hw,
0805 },
0806 .num_parents = 1,
0807 .flags = CLK_SET_RATE_PARENT,
0808 .ops = &clk_branch2_ops,
0809 },
0810 },
0811 };
0812
0813 static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
0814 .halt_reg = 0x22004,
0815 .halt_check = BRANCH_HALT,
0816 .clkr = {
0817 .enable_reg = 0x22004,
0818 .enable_mask = BIT(0),
0819 .hw.init = &(struct clk_init_data){
0820 .name = "gcc_blsp1_qup4_spi_apps_clk",
0821 .parent_data = &(const struct clk_parent_data){
0822 .hw = &gcc_blsp1_qup4_spi_apps_clk_src.clkr.hw,
0823 },
0824 .num_parents = 1,
0825 .flags = CLK_SET_RATE_PARENT,
0826 .ops = &clk_branch2_ops,
0827 },
0828 },
0829 };
0830
0831 static struct clk_branch gcc_blsp1_sleep_clk = {
0832 .halt_reg = 0x1b00c,
0833 .halt_check = BRANCH_HALT_VOTED,
0834 .clkr = {
0835 .enable_reg = 0x6d008,
0836 .enable_mask = BIT(15),
0837 .hw.init = &(struct clk_init_data){
0838 .name = "gcc_blsp1_sleep_clk",
0839 .ops = &clk_branch2_ops,
0840 },
0841 },
0842 };
0843
0844 static struct clk_branch gcc_blsp1_uart1_apps_clk = {
0845 .halt_reg = 0x1d004,
0846 .halt_check = BRANCH_HALT,
0847 .clkr = {
0848 .enable_reg = 0x1d004,
0849 .enable_mask = BIT(0),
0850 .hw.init = &(struct clk_init_data){
0851 .name = "gcc_blsp1_uart1_apps_clk",
0852 .parent_data = &(const struct clk_parent_data){
0853 .hw = &gcc_blsp1_uart1_apps_clk_src.clkr.hw,
0854 },
0855 .num_parents = 1,
0856 .flags = CLK_SET_RATE_PARENT,
0857 .ops = &clk_branch2_ops,
0858 },
0859 },
0860 };
0861
0862 static struct clk_branch gcc_blsp1_uart2_apps_clk = {
0863 .halt_reg = 0x1f004,
0864 .halt_check = BRANCH_HALT,
0865 .clkr = {
0866 .enable_reg = 0x1f004,
0867 .enable_mask = BIT(0),
0868 .hw.init = &(struct clk_init_data){
0869 .name = "gcc_blsp1_uart2_apps_clk",
0870 .parent_data = &(const struct clk_parent_data){
0871 .hw = &gcc_blsp1_uart2_apps_clk_src.clkr.hw,
0872 },
0873 .num_parents = 1,
0874 .flags = CLK_SET_RATE_PARENT,
0875 .ops = &clk_branch2_ops,
0876 },
0877 },
0878 };
0879
0880 static struct clk_branch gcc_blsp1_uart3_apps_clk = {
0881 .halt_reg = 0x21004,
0882 .halt_check = BRANCH_HALT,
0883 .clkr = {
0884 .enable_reg = 0x21004,
0885 .enable_mask = BIT(0),
0886 .hw.init = &(struct clk_init_data){
0887 .name = "gcc_blsp1_uart3_apps_clk",
0888 .parent_data = &(const struct clk_parent_data){
0889 .hw = &gcc_blsp1_uart3_apps_clk_src.clkr.hw,
0890 },
0891 .num_parents = 1,
0892 .flags = CLK_SET_RATE_PARENT,
0893 .ops = &clk_branch2_ops,
0894 },
0895 },
0896 };
0897
0898 static struct clk_branch gcc_blsp1_uart4_apps_clk = {
0899 .halt_reg = 0x23004,
0900 .halt_check = BRANCH_HALT,
0901 .clkr = {
0902 .enable_reg = 0x23004,
0903 .enable_mask = BIT(0),
0904 .hw.init = &(struct clk_init_data){
0905 .name = "gcc_blsp1_uart4_apps_clk",
0906 .parent_data = &(const struct clk_parent_data){
0907 .hw = &gcc_blsp1_uart4_apps_clk_src.clkr.hw,
0908 },
0909 .num_parents = 1,
0910 .flags = CLK_SET_RATE_PARENT,
0911 .ops = &clk_branch2_ops,
0912 },
0913 },
0914 };
0915
0916 static struct clk_branch gcc_boot_rom_ahb_clk = {
0917 .halt_reg = 0x27004,
0918 .halt_check = BRANCH_HALT_VOTED,
0919 .hwcg_reg = 0x27004,
0920 .hwcg_bit = 1,
0921 .clkr = {
0922 .enable_reg = 0x6d008,
0923 .enable_mask = BIT(10),
0924 .hw.init = &(struct clk_init_data){
0925 .name = "gcc_boot_rom_ahb_clk",
0926 .ops = &clk_branch2_ops,
0927 },
0928 },
0929 };
0930
0931 static struct clk_branch gcc_gp1_clk = {
0932 .halt_reg = 0x37000,
0933 .halt_check = BRANCH_HALT,
0934 .clkr = {
0935 .enable_reg = 0x37000,
0936 .enable_mask = BIT(0),
0937 .hw.init = &(struct clk_init_data){
0938 .name = "gcc_gp1_clk",
0939 .parent_data = &(const struct clk_parent_data){
0940 .hw = &gcc_gp1_clk_src.clkr.hw,
0941 },
0942 .num_parents = 1,
0943 .flags = CLK_SET_RATE_PARENT,
0944 .ops = &clk_branch2_ops,
0945 },
0946 },
0947 };
0948
0949 static struct clk_branch gcc_gp2_clk = {
0950 .halt_reg = 0x38000,
0951 .halt_check = BRANCH_HALT,
0952 .clkr = {
0953 .enable_reg = 0x38000,
0954 .enable_mask = BIT(0),
0955 .hw.init = &(struct clk_init_data){
0956 .name = "gcc_gp2_clk",
0957 .parent_data = &(const struct clk_parent_data){
0958 .hw = &gcc_gp2_clk_src.clkr.hw,
0959 },
0960 .num_parents = 1,
0961 .flags = CLK_SET_RATE_PARENT,
0962 .ops = &clk_branch2_ops,
0963 },
0964 },
0965 };
0966
0967 static struct clk_branch gcc_gp3_clk = {
0968 .halt_reg = 0x39000,
0969 .halt_check = BRANCH_HALT,
0970 .clkr = {
0971 .enable_reg = 0x39000,
0972 .enable_mask = BIT(0),
0973 .hw.init = &(struct clk_init_data){
0974 .name = "gcc_gp3_clk",
0975 .parent_data = &(const struct clk_parent_data){
0976 .hw = &gcc_gp3_clk_src.clkr.hw,
0977 },
0978 .num_parents = 1,
0979 .flags = CLK_SET_RATE_PARENT,
0980 .ops = &clk_branch2_ops,
0981 },
0982 },
0983 };
0984
0985 static struct clk_branch gcc_pcie_0_clkref_en = {
0986 .halt_reg = 0x88004,
0987
0988
0989
0990
0991
0992
0993 .halt_check = BRANCH_HALT_DELAY,
0994 .clkr = {
0995 .enable_reg = 0x88004,
0996 .enable_mask = BIT(0),
0997 .hw.init = &(struct clk_init_data){
0998 .name = "gcc_pcie_0_clkref_en",
0999 .ops = &clk_branch2_ops,
1000 },
1001 },
1002 };
1003
1004 static struct clk_branch gcc_pcie_aux_clk = {
1005 .halt_reg = 0x43034,
1006
1007
1008
1009
1010
1011
1012 .halt_check = BRANCH_HALT_DELAY,
1013 .hwcg_reg = 0x43034,
1014 .hwcg_bit = 1,
1015 .clkr = {
1016 .enable_reg = 0x6d010,
1017 .enable_mask = BIT(3),
1018 .hw.init = &(struct clk_init_data){
1019 .name = "gcc_pcie_aux_clk",
1020 .parent_data = &(const struct clk_parent_data){
1021 .hw = &gcc_pcie_aux_clk_src.clkr.hw,
1022 },
1023 .num_parents = 1,
1024 .flags = CLK_SET_RATE_PARENT,
1025 .ops = &clk_branch2_ops,
1026 },
1027 },
1028 };
1029
1030 static struct clk_branch gcc_pcie_cfg_ahb_clk = {
1031 .halt_reg = 0x4302c,
1032 .halt_check = BRANCH_HALT_VOTED,
1033 .hwcg_reg = 0x4302c,
1034 .hwcg_bit = 1,
1035 .clkr = {
1036 .enable_reg = 0x6d010,
1037 .enable_mask = BIT(2),
1038 .hw.init = &(struct clk_init_data){
1039 .name = "gcc_pcie_cfg_ahb_clk",
1040 .ops = &clk_branch2_ops,
1041 },
1042 },
1043 };
1044
1045 static struct clk_branch gcc_pcie_mstr_axi_clk = {
1046 .halt_reg = 0x43024,
1047 .halt_check = BRANCH_HALT_VOTED,
1048 .hwcg_reg = 0x43024,
1049 .hwcg_bit = 1,
1050 .clkr = {
1051 .enable_reg = 0x6d010,
1052 .enable_mask = BIT(1),
1053 .hw.init = &(struct clk_init_data){
1054 .name = "gcc_pcie_mstr_axi_clk",
1055 .ops = &clk_branch2_ops,
1056 },
1057 },
1058 };
1059
1060 static struct clk_branch gcc_pcie_pipe_clk = {
1061 .halt_reg = 0x4303c,
1062
1063
1064
1065
1066
1067
1068 .halt_check = BRANCH_HALT_DELAY,
1069 .hwcg_reg = 0x4303c,
1070 .hwcg_bit = 1,
1071 .clkr = {
1072 .enable_reg = 0x6d010,
1073 .enable_mask = BIT(4),
1074 .hw.init = &(struct clk_init_data){
1075 .name = "gcc_pcie_pipe_clk",
1076 .parent_data = &(const struct clk_parent_data){
1077 .hw = &gcc_pcie_pipe_clk_src.clkr.hw,
1078 },
1079 .num_parents = 1,
1080 .flags = CLK_SET_RATE_PARENT,
1081 .ops = &clk_branch2_ops,
1082 },
1083 },
1084 };
1085
1086 static struct clk_branch gcc_pcie_rchng_phy_clk = {
1087 .halt_reg = 0x43030,
1088 .halt_check = BRANCH_HALT_VOTED,
1089 .hwcg_reg = 0x43030,
1090 .hwcg_bit = 1,
1091 .clkr = {
1092 .enable_reg = 0x6d010,
1093 .enable_mask = BIT(7),
1094 .hw.init = &(struct clk_init_data){
1095 .name = "gcc_pcie_rchng_phy_clk",
1096 .parent_data = &(const struct clk_parent_data){
1097 .hw = &gcc_pcie_rchng_phy_clk_src.clkr.hw,
1098 },
1099 .num_parents = 1,
1100 .flags = CLK_SET_RATE_PARENT,
1101 .ops = &clk_branch2_ops,
1102 },
1103 },
1104 };
1105
1106 static struct clk_branch gcc_pcie_sleep_clk = {
1107 .halt_reg = 0x43038,
1108 .halt_check = BRANCH_HALT_VOTED,
1109 .hwcg_reg = 0x43038,
1110 .hwcg_bit = 1,
1111 .clkr = {
1112 .enable_reg = 0x6d010,
1113 .enable_mask = BIT(6),
1114 .hw.init = &(struct clk_init_data){
1115 .name = "gcc_pcie_sleep_clk",
1116 .parent_data = &(const struct clk_parent_data){
1117 .hw = &gcc_pcie_aux_phy_clk_src.clkr.hw,
1118 },
1119 .num_parents = 1,
1120 .flags = CLK_SET_RATE_PARENT,
1121 .ops = &clk_branch2_ops,
1122 },
1123 },
1124 };
1125
1126 static struct clk_branch gcc_pcie_slv_axi_clk = {
1127 .halt_reg = 0x4301c,
1128 .halt_check = BRANCH_HALT_VOTED,
1129 .hwcg_reg = 0x4301c,
1130 .hwcg_bit = 1,
1131 .clkr = {
1132 .enable_reg = 0x6d010,
1133 .enable_mask = BIT(0),
1134 .hw.init = &(struct clk_init_data){
1135 .name = "gcc_pcie_slv_axi_clk",
1136 .ops = &clk_branch2_ops,
1137 },
1138 },
1139 };
1140
1141 static struct clk_branch gcc_pcie_slv_q2a_axi_clk = {
1142 .halt_reg = 0x43018,
1143 .halt_check = BRANCH_HALT_VOTED,
1144 .hwcg_reg = 0x43018,
1145 .hwcg_bit = 1,
1146 .clkr = {
1147 .enable_reg = 0x6d010,
1148 .enable_mask = BIT(5),
1149 .hw.init = &(struct clk_init_data){
1150 .name = "gcc_pcie_slv_q2a_axi_clk",
1151 .ops = &clk_branch2_ops,
1152 },
1153 },
1154 };
1155
1156 static struct clk_branch gcc_pdm2_clk = {
1157 .halt_reg = 0x2400c,
1158 .halt_check = BRANCH_HALT,
1159 .clkr = {
1160 .enable_reg = 0x2400c,
1161 .enable_mask = BIT(0),
1162 .hw.init = &(struct clk_init_data){
1163 .name = "gcc_pdm2_clk",
1164 .parent_data = &(const struct clk_parent_data){
1165 .hw = &gcc_pdm2_clk_src.clkr.hw,
1166 },
1167 .num_parents = 1,
1168 .flags = CLK_SET_RATE_PARENT,
1169 .ops = &clk_branch2_ops,
1170 },
1171 },
1172 };
1173
1174 static struct clk_branch gcc_pdm_ahb_clk = {
1175 .halt_reg = 0x24004,
1176 .halt_check = BRANCH_HALT,
1177 .hwcg_reg = 0x24004,
1178 .hwcg_bit = 1,
1179 .clkr = {
1180 .enable_reg = 0x24004,
1181 .enable_mask = BIT(0),
1182 .hw.init = &(struct clk_init_data){
1183 .name = "gcc_pdm_ahb_clk",
1184 .ops = &clk_branch2_ops,
1185 },
1186 },
1187 };
1188
1189 static struct clk_branch gcc_pdm_xo4_clk = {
1190 .halt_reg = 0x24008,
1191 .halt_check = BRANCH_HALT,
1192 .clkr = {
1193 .enable_reg = 0x24008,
1194 .enable_mask = BIT(0),
1195 .hw.init = &(struct clk_init_data){
1196 .name = "gcc_pdm_xo4_clk",
1197 .ops = &clk_branch2_ops,
1198 },
1199 },
1200 };
1201
1202 static struct clk_branch gcc_rx1_usb2_clkref_en = {
1203 .halt_reg = 0x88008,
1204 .halt_check = BRANCH_HALT,
1205 .clkr = {
1206 .enable_reg = 0x88008,
1207 .enable_mask = BIT(0),
1208 .hw.init = &(struct clk_init_data){
1209 .name = "gcc_rx1_usb2_clkref_en",
1210 .ops = &clk_branch2_ops,
1211 },
1212 },
1213 };
1214
1215 static struct clk_branch gcc_sdcc1_ahb_clk = {
1216 .halt_reg = 0x1a00c,
1217 .halt_check = BRANCH_HALT,
1218 .clkr = {
1219 .enable_reg = 0x1a00c,
1220 .enable_mask = BIT(0),
1221 .hw.init = &(struct clk_init_data){
1222 .name = "gcc_sdcc1_ahb_clk",
1223 .ops = &clk_branch2_ops,
1224 },
1225 },
1226 };
1227
1228 static struct clk_branch gcc_sdcc1_apps_clk = {
1229 .halt_reg = 0x1a004,
1230 .halt_check = BRANCH_HALT,
1231 .clkr = {
1232 .enable_reg = 0x1a004,
1233 .enable_mask = BIT(0),
1234 .hw.init = &(struct clk_init_data){
1235 .name = "gcc_sdcc1_apps_clk",
1236 .parent_data = &(const struct clk_parent_data){
1237 .hw = &gcc_sdcc1_apps_clk_src.clkr.hw,
1238 },
1239 .num_parents = 1,
1240 .flags = CLK_SET_RATE_PARENT,
1241 .ops = &clk_branch2_ops,
1242 },
1243 },
1244 };
1245
1246 static struct clk_branch gcc_usb30_master_clk = {
1247 .halt_reg = 0x17018,
1248 .halt_check = BRANCH_HALT,
1249 .clkr = {
1250 .enable_reg = 0x17018,
1251 .enable_mask = BIT(0),
1252 .hw.init = &(struct clk_init_data){
1253 .name = "gcc_usb30_master_clk",
1254 .parent_data = &(const struct clk_parent_data){
1255 .hw = &gcc_usb30_master_clk_src.clkr.hw,
1256 },
1257 .num_parents = 1,
1258 .flags = CLK_SET_RATE_PARENT,
1259 .ops = &clk_branch2_ops,
1260 },
1261 },
1262 };
1263
1264 static struct clk_branch gcc_usb30_mock_utmi_clk = {
1265 .halt_reg = 0x1702c,
1266 .halt_check = BRANCH_HALT,
1267 .clkr = {
1268 .enable_reg = 0x1702c,
1269 .enable_mask = BIT(0),
1270 .hw.init = &(struct clk_init_data){
1271 .name = "gcc_usb30_mock_utmi_clk",
1272 .parent_data = &(const struct clk_parent_data){
1273 .hw =
1274 &gcc_usb30_mock_utmi_postdiv_clk_src.clkr.hw,
1275 },
1276 .num_parents = 1,
1277 .flags = CLK_SET_RATE_PARENT,
1278 .ops = &clk_branch2_ops,
1279 },
1280 },
1281 };
1282
1283 static struct clk_branch gcc_usb30_mstr_axi_clk = {
1284 .halt_reg = 0x17020,
1285 .halt_check = BRANCH_HALT,
1286 .clkr = {
1287 .enable_reg = 0x17020,
1288 .enable_mask = BIT(0),
1289 .hw.init = &(struct clk_init_data){
1290 .name = "gcc_usb30_mstr_axi_clk",
1291 .ops = &clk_branch2_ops,
1292 },
1293 },
1294 };
1295
1296 static struct clk_branch gcc_usb30_sleep_clk = {
1297 .halt_reg = 0x17028,
1298 .halt_check = BRANCH_HALT,
1299 .clkr = {
1300 .enable_reg = 0x17028,
1301 .enable_mask = BIT(0),
1302 .hw.init = &(struct clk_init_data){
1303 .name = "gcc_usb30_sleep_clk",
1304 .ops = &clk_branch2_ops,
1305 },
1306 },
1307 };
1308
1309 static struct clk_branch gcc_usb30_slv_ahb_clk = {
1310 .halt_reg = 0x17024,
1311 .halt_check = BRANCH_HALT,
1312 .clkr = {
1313 .enable_reg = 0x17024,
1314 .enable_mask = BIT(0),
1315 .hw.init = &(struct clk_init_data){
1316 .name = "gcc_usb30_slv_ahb_clk",
1317 .ops = &clk_branch2_ops,
1318 },
1319 },
1320 };
1321
1322 static struct clk_branch gcc_usb3_phy_aux_clk = {
1323 .halt_reg = 0x17064,
1324 .halt_check = BRANCH_HALT,
1325 .clkr = {
1326 .enable_reg = 0x17064,
1327 .enable_mask = BIT(0),
1328 .hw.init = &(struct clk_init_data){
1329 .name = "gcc_usb3_phy_aux_clk",
1330 .parent_data = &(const struct clk_parent_data){
1331 .hw = &gcc_usb3_phy_aux_clk_src.clkr.hw,
1332 },
1333 .num_parents = 1,
1334 .flags = CLK_SET_RATE_PARENT,
1335 .ops = &clk_branch2_ops,
1336 },
1337 },
1338 };
1339
1340 static struct gdsc usb30_gdsc = {
1341 .gdscr = 0x17004,
1342 .pd = {
1343 .name = "usb30_gdsc",
1344 },
1345 .pwrsts = PWRSTS_OFF_ON,
1346 };
1347
1348 static struct gdsc pcie_gdsc = {
1349 .gdscr = 0x43004,
1350 .pd = {
1351 .name = "pcie_gdsc",
1352 },
1353 .pwrsts = PWRSTS_OFF_ON,
1354 };
1355
1356 static struct clk_branch gcc_usb3_phy_pipe_clk = {
1357 .halt_reg = 0x17068,
1358
1359
1360
1361
1362
1363
1364 .halt_check = BRANCH_HALT_DELAY,
1365 .hwcg_reg = 0x17068,
1366 .hwcg_bit = 1,
1367 .clkr = {
1368 .enable_reg = 0x17068,
1369 .enable_mask = BIT(0),
1370 .hw.init = &(struct clk_init_data){
1371 .name = "gcc_usb3_phy_pipe_clk",
1372 .parent_data = &(const struct clk_parent_data){
1373 .hw = &gcc_usb3_phy_pipe_clk_src.clkr.hw,
1374 },
1375 .num_parents = 1,
1376 .flags = CLK_SET_RATE_PARENT,
1377 .ops = &clk_branch2_ops,
1378 },
1379 },
1380 };
1381
1382 static struct clk_branch gcc_usb3_prim_clkref_en = {
1383 .halt_reg = 0x88000,
1384 .halt_check = BRANCH_HALT,
1385 .clkr = {
1386 .enable_reg = 0x88000,
1387 .enable_mask = BIT(0),
1388 .hw.init = &(struct clk_init_data){
1389 .name = "gcc_usb3_prim_clkref_en",
1390 .ops = &clk_branch2_ops,
1391 },
1392 },
1393 };
1394
1395 static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
1396 .halt_reg = 0x19008,
1397 .halt_check = BRANCH_HALT,
1398 .hwcg_reg = 0x19008,
1399 .hwcg_bit = 1,
1400 .clkr = {
1401 .enable_reg = 0x19008,
1402 .enable_mask = BIT(0),
1403 .hw.init = &(struct clk_init_data){
1404 .name = "gcc_usb_phy_cfg_ahb2phy_clk",
1405 .ops = &clk_branch2_ops,
1406 },
1407 },
1408 };
1409
1410 static struct clk_branch gcc_xo_div4_clk = {
1411 .halt_reg = 0x2e010,
1412 .halt_check = BRANCH_HALT,
1413 .clkr = {
1414 .enable_reg = 0x2e010,
1415 .enable_mask = BIT(0),
1416 .hw.init = &(struct clk_init_data){
1417 .name = "gcc_xo_div4_clk",
1418 .ops = &clk_branch2_ops,
1419 },
1420 },
1421 };
1422
1423 static struct clk_branch gcc_xo_pcie_link_clk = {
1424 .halt_reg = 0x2e008,
1425 .halt_check = BRANCH_HALT,
1426 .hwcg_reg = 0x2e008,
1427 .hwcg_bit = 1,
1428 .clkr = {
1429 .enable_reg = 0x2e008,
1430 .enable_mask = BIT(0),
1431 .hw.init = &(struct clk_init_data){
1432 .name = "gcc_xo_pcie_link_clk",
1433 .ops = &clk_branch2_ops,
1434 },
1435 },
1436 };
1437
1438 static struct clk_regmap *gcc_sdx65_clocks[] = {
1439 [GCC_AHB_PCIE_LINK_CLK] = &gcc_ahb_pcie_link_clk.clkr,
1440 [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
1441 [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
1442 [GCC_BLSP1_QUP1_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr,
1443 [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
1444 [GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup1_spi_apps_clk_src.clkr,
1445 [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
1446 [GCC_BLSP1_QUP2_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr,
1447 [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
1448 [GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup2_spi_apps_clk_src.clkr,
1449 [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
1450 [GCC_BLSP1_QUP3_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr,
1451 [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
1452 [GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup3_spi_apps_clk_src.clkr,
1453 [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
1454 [GCC_BLSP1_QUP4_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr,
1455 [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
1456 [GCC_BLSP1_QUP4_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup4_spi_apps_clk_src.clkr,
1457 [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
1458 [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
1459 [GCC_BLSP1_UART1_APPS_CLK_SRC] = &gcc_blsp1_uart1_apps_clk_src.clkr,
1460 [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
1461 [GCC_BLSP1_UART2_APPS_CLK_SRC] = &gcc_blsp1_uart2_apps_clk_src.clkr,
1462 [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr,
1463 [GCC_BLSP1_UART3_APPS_CLK_SRC] = &gcc_blsp1_uart3_apps_clk_src.clkr,
1464 [GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr,
1465 [GCC_BLSP1_UART4_APPS_CLK_SRC] = &gcc_blsp1_uart4_apps_clk_src.clkr,
1466 [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
1467 [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
1468 [GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr,
1469 [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
1470 [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
1471 [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
1472 [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
1473 [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
1474 [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
1475 [GCC_PCIE_0_CLKREF_EN] = &gcc_pcie_0_clkref_en.clkr,
1476 [GCC_PCIE_AUX_CLK] = &gcc_pcie_aux_clk.clkr,
1477 [GCC_PCIE_AUX_CLK_SRC] = &gcc_pcie_aux_clk_src.clkr,
1478 [GCC_PCIE_AUX_PHY_CLK_SRC] = &gcc_pcie_aux_phy_clk_src.clkr,
1479 [GCC_PCIE_CFG_AHB_CLK] = &gcc_pcie_cfg_ahb_clk.clkr,
1480 [GCC_PCIE_MSTR_AXI_CLK] = &gcc_pcie_mstr_axi_clk.clkr,
1481 [GCC_PCIE_PIPE_CLK] = &gcc_pcie_pipe_clk.clkr,
1482 [GCC_PCIE_PIPE_CLK_SRC] = &gcc_pcie_pipe_clk_src.clkr,
1483 [GCC_PCIE_RCHNG_PHY_CLK] = &gcc_pcie_rchng_phy_clk.clkr,
1484 [GCC_PCIE_RCHNG_PHY_CLK_SRC] = &gcc_pcie_rchng_phy_clk_src.clkr,
1485 [GCC_PCIE_SLEEP_CLK] = &gcc_pcie_sleep_clk.clkr,
1486 [GCC_PCIE_SLV_AXI_CLK] = &gcc_pcie_slv_axi_clk.clkr,
1487 [GCC_PCIE_SLV_Q2A_AXI_CLK] = &gcc_pcie_slv_q2a_axi_clk.clkr,
1488 [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
1489 [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
1490 [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
1491 [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
1492 [GCC_RX1_USB2_CLKREF_EN] = &gcc_rx1_usb2_clkref_en.clkr,
1493 [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
1494 [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
1495 [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
1496 [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
1497 [GCC_USB30_MASTER_CLK_SRC] = &gcc_usb30_master_clk_src.clkr,
1498 [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
1499 [GCC_USB30_MOCK_UTMI_CLK_SRC] = &gcc_usb30_mock_utmi_clk_src.clkr,
1500 [GCC_USB30_MOCK_UTMI_POSTDIV_CLK_SRC] = &gcc_usb30_mock_utmi_postdiv_clk_src.clkr,
1501 [GCC_USB30_MSTR_AXI_CLK] = &gcc_usb30_mstr_axi_clk.clkr,
1502 [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
1503 [GCC_USB30_SLV_AHB_CLK] = &gcc_usb30_slv_ahb_clk.clkr,
1504 [GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr,
1505 [GCC_USB3_PHY_AUX_CLK_SRC] = &gcc_usb3_phy_aux_clk_src.clkr,
1506 [GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr,
1507 [GCC_USB3_PHY_PIPE_CLK_SRC] = &gcc_usb3_phy_pipe_clk_src.clkr,
1508 [GCC_USB3_PRIM_CLKREF_EN] = &gcc_usb3_prim_clkref_en.clkr,
1509 [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
1510 [GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr,
1511 [GCC_XO_PCIE_LINK_CLK] = &gcc_xo_pcie_link_clk.clkr,
1512 [GPLL0] = &gpll0.clkr,
1513 [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
1514 };
1515
1516 static const struct qcom_reset_map gcc_sdx65_resets[] = {
1517 [GCC_BLSP1_QUP1_BCR] = { 0x1c000 },
1518 [GCC_BLSP1_QUP2_BCR] = { 0x1e000 },
1519 [GCC_BLSP1_QUP3_BCR] = { 0x20000 },
1520 [GCC_BLSP1_QUP4_BCR] = { 0x22000 },
1521 [GCC_BLSP1_UART1_BCR] = { 0x1d000 },
1522 [GCC_BLSP1_UART2_BCR] = { 0x1f000 },
1523 [GCC_BLSP1_UART3_BCR] = { 0x21000 },
1524 [GCC_BLSP1_UART4_BCR] = { 0x23000 },
1525 [GCC_PCIE_BCR] = { 0x43000 },
1526 [GCC_PCIE_LINK_DOWN_BCR] = { 0x77000 },
1527 [GCC_PCIE_NOCSR_COM_PHY_BCR] = { 0x78008 },
1528 [GCC_PCIE_PHY_BCR] = { 0x44000 },
1529 [GCC_PCIE_PHY_CFG_AHB_BCR] = { 0x78000 },
1530 [GCC_PCIE_PHY_COM_BCR] = { 0x78004 },
1531 [GCC_PCIE_PHY_NOCSR_COM_PHY_BCR] = { 0x7800c },
1532 [GCC_PDM_BCR] = { 0x24000 },
1533 [GCC_QUSB2PHY_BCR] = { 0x19000 },
1534 [GCC_SDCC1_BCR] = { 0x1a000 },
1535 [GCC_TCSR_PCIE_BCR] = { 0x57000 },
1536 [GCC_USB30_BCR] = { 0x17000 },
1537 [GCC_USB3_PHY_BCR] = { 0x18000 },
1538 [GCC_USB3PHY_PHY_BCR] = { 0x18004 },
1539 [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x19004 },
1540 };
1541
1542 static struct gdsc *gcc_sdx65_gdscs[] = {
1543 [USB30_GDSC] = &usb30_gdsc,
1544 [PCIE_GDSC] = &pcie_gdsc,
1545 };
1546
1547 static const struct regmap_config gcc_sdx65_regmap_config = {
1548 .reg_bits = 32,
1549 .reg_stride = 4,
1550 .val_bits = 32,
1551 .max_register = 0x1f101c,
1552 .fast_io = true,
1553 };
1554
1555 static const struct qcom_cc_desc gcc_sdx65_desc = {
1556 .config = &gcc_sdx65_regmap_config,
1557 .clks = gcc_sdx65_clocks,
1558 .num_clks = ARRAY_SIZE(gcc_sdx65_clocks),
1559 .resets = gcc_sdx65_resets,
1560 .num_resets = ARRAY_SIZE(gcc_sdx65_resets),
1561 .gdscs = gcc_sdx65_gdscs,
1562 .num_gdscs = ARRAY_SIZE(gcc_sdx65_gdscs),
1563 };
1564
1565 static const struct of_device_id gcc_sdx65_match_table[] = {
1566 { .compatible = "qcom,gcc-sdx65" },
1567 { }
1568 };
1569 MODULE_DEVICE_TABLE(of, gcc_sdx65_match_table);
1570
1571 static int gcc_sdx65_probe(struct platform_device *pdev)
1572 {
1573 struct regmap *regmap;
1574
1575 regmap = qcom_cc_map(pdev, &gcc_sdx65_desc);
1576 if (IS_ERR(regmap))
1577 return PTR_ERR(regmap);
1578
1579
1580
1581
1582
1583 regmap_update_bits(regmap, 0x6d008, BIT(0), BIT(0));
1584 regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21));
1585 regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22));
1586
1587 return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap);
1588 }
1589
1590 static struct platform_driver gcc_sdx65_driver = {
1591 .probe = gcc_sdx65_probe,
1592 .driver = {
1593 .name = "gcc-sdx65",
1594 .of_match_table = gcc_sdx65_match_table,
1595 },
1596 };
1597
1598 static int __init gcc_sdx65_init(void)
1599 {
1600 return platform_driver_register(&gcc_sdx65_driver);
1601 }
1602 subsys_initcall(gcc_sdx65_init);
1603
1604 static void __exit gcc_sdx65_exit(void)
1605 {
1606 platform_driver_unregister(&gcc_sdx65_driver);
1607 }
1608 module_exit(gcc_sdx65_exit);
1609
1610 MODULE_DESCRIPTION("QTI GCC SDX65 Driver");
1611 MODULE_LICENSE("GPL v2");