Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2014, The Linux Foundation. All rights reserved.
0004  */
0005 
0006 #include <linux/kernel.h>
0007 #include <linux/bitops.h>
0008 #include <linux/err.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/module.h>
0011 #include <linux/of.h>
0012 #include <linux/of_device.h>
0013 #include <linux/clk-provider.h>
0014 #include <linux/regmap.h>
0015 #include <linux/reset-controller.h>
0016 
0017 #include <dt-bindings/clock/qcom,gcc-ipq806x.h>
0018 #include <dt-bindings/reset/qcom,gcc-ipq806x.h>
0019 
0020 #include "common.h"
0021 #include "clk-regmap.h"
0022 #include "clk-pll.h"
0023 #include "clk-rcg.h"
0024 #include "clk-branch.h"
0025 #include "clk-hfpll.h"
0026 #include "reset.h"
0027 
0028 static const struct clk_parent_data gcc_pxo[] = {
0029     { .fw_name = "pxo", .name = "pxo" },
0030 };
0031 
0032 static struct clk_pll pll0 = {
0033     .l_reg = 0x30c4,
0034     .m_reg = 0x30c8,
0035     .n_reg = 0x30cc,
0036     .config_reg = 0x30d4,
0037     .mode_reg = 0x30c0,
0038     .status_reg = 0x30d8,
0039     .status_bit = 16,
0040     .clkr.hw.init = &(struct clk_init_data){
0041         .name = "pll0",
0042         .parent_data = gcc_pxo,
0043         .num_parents = 1,
0044         .ops = &clk_pll_ops,
0045     },
0046 };
0047 
0048 static struct clk_regmap pll0_vote = {
0049     .enable_reg = 0x34c0,
0050     .enable_mask = BIT(0),
0051     .hw.init = &(struct clk_init_data){
0052         .name = "pll0_vote",
0053         .parent_hws = (const struct clk_hw*[]){
0054             &pll0.clkr.hw,
0055         },
0056         .num_parents = 1,
0057         .ops = &clk_pll_vote_ops,
0058     },
0059 };
0060 
0061 static struct clk_pll pll3 = {
0062     .l_reg = 0x3164,
0063     .m_reg = 0x3168,
0064     .n_reg = 0x316c,
0065     .config_reg = 0x3174,
0066     .mode_reg = 0x3160,
0067     .status_reg = 0x3178,
0068     .status_bit = 16,
0069     .clkr.hw.init = &(struct clk_init_data){
0070         .name = "pll3",
0071         .parent_data = gcc_pxo,
0072         .num_parents = 1,
0073         .ops = &clk_pll_ops,
0074     },
0075 };
0076 
0077 static struct clk_regmap pll4_vote = {
0078     .enable_reg = 0x34c0,
0079     .enable_mask = BIT(4),
0080     .hw.init = &(struct clk_init_data){
0081         .name = "pll4_vote",
0082         .parent_names = (const char *[]){ "pll4" },
0083         .num_parents = 1,
0084         .ops = &clk_pll_vote_ops,
0085     },
0086 };
0087 
0088 static struct clk_pll pll8 = {
0089     .l_reg = 0x3144,
0090     .m_reg = 0x3148,
0091     .n_reg = 0x314c,
0092     .config_reg = 0x3154,
0093     .mode_reg = 0x3140,
0094     .status_reg = 0x3158,
0095     .status_bit = 16,
0096     .clkr.hw.init = &(struct clk_init_data){
0097         .name = "pll8",
0098         .parent_data = gcc_pxo,
0099         .num_parents = 1,
0100         .ops = &clk_pll_ops,
0101     },
0102 };
0103 
0104 static struct clk_regmap pll8_vote = {
0105     .enable_reg = 0x34c0,
0106     .enable_mask = BIT(8),
0107     .hw.init = &(struct clk_init_data){
0108         .name = "pll8_vote",
0109         .parent_hws = (const struct clk_hw*[]){
0110             &pll8.clkr.hw,
0111         },
0112         .num_parents = 1,
0113         .ops = &clk_pll_vote_ops,
0114     },
0115 };
0116 
0117 static struct hfpll_data hfpll0_data = {
0118     .mode_reg = 0x3200,
0119     .l_reg = 0x3208,
0120     .m_reg = 0x320c,
0121     .n_reg = 0x3210,
0122     .config_reg = 0x3204,
0123     .status_reg = 0x321c,
0124     .config_val = 0x7845c665,
0125     .droop_reg = 0x3214,
0126     .droop_val = 0x0108c000,
0127     .min_rate = 600000000UL,
0128     .max_rate = 1800000000UL,
0129 };
0130 
0131 static struct clk_hfpll hfpll0 = {
0132     .d = &hfpll0_data,
0133     .clkr.hw.init = &(struct clk_init_data){
0134         .parent_data = gcc_pxo,
0135         .num_parents = 1,
0136         .name = "hfpll0",
0137         .ops = &clk_ops_hfpll,
0138         .flags = CLK_IGNORE_UNUSED,
0139     },
0140     .lock = __SPIN_LOCK_UNLOCKED(hfpll0.lock),
0141 };
0142 
0143 static struct hfpll_data hfpll1_data = {
0144     .mode_reg = 0x3240,
0145     .l_reg = 0x3248,
0146     .m_reg = 0x324c,
0147     .n_reg = 0x3250,
0148     .config_reg = 0x3244,
0149     .status_reg = 0x325c,
0150     .config_val = 0x7845c665,
0151     .droop_reg = 0x3314,
0152     .droop_val = 0x0108c000,
0153     .min_rate = 600000000UL,
0154     .max_rate = 1800000000UL,
0155 };
0156 
0157 static struct clk_hfpll hfpll1 = {
0158     .d = &hfpll1_data,
0159     .clkr.hw.init = &(struct clk_init_data){
0160         .parent_data = gcc_pxo,
0161         .num_parents = 1,
0162         .name = "hfpll1",
0163         .ops = &clk_ops_hfpll,
0164         .flags = CLK_IGNORE_UNUSED,
0165     },
0166     .lock = __SPIN_LOCK_UNLOCKED(hfpll1.lock),
0167 };
0168 
0169 static struct hfpll_data hfpll_l2_data = {
0170     .mode_reg = 0x3300,
0171     .l_reg = 0x3308,
0172     .m_reg = 0x330c,
0173     .n_reg = 0x3310,
0174     .config_reg = 0x3304,
0175     .status_reg = 0x331c,
0176     .config_val = 0x7845c665,
0177     .droop_reg = 0x3314,
0178     .droop_val = 0x0108c000,
0179     .min_rate = 600000000UL,
0180     .max_rate = 1800000000UL,
0181 };
0182 
0183 static struct clk_hfpll hfpll_l2 = {
0184     .d = &hfpll_l2_data,
0185     .clkr.hw.init = &(struct clk_init_data){
0186         .parent_data = gcc_pxo,
0187         .num_parents = 1,
0188         .name = "hfpll_l2",
0189         .ops = &clk_ops_hfpll,
0190         .flags = CLK_IGNORE_UNUSED,
0191     },
0192     .lock = __SPIN_LOCK_UNLOCKED(hfpll_l2.lock),
0193 };
0194 
0195 static struct clk_pll pll14 = {
0196     .l_reg = 0x31c4,
0197     .m_reg = 0x31c8,
0198     .n_reg = 0x31cc,
0199     .config_reg = 0x31d4,
0200     .mode_reg = 0x31c0,
0201     .status_reg = 0x31d8,
0202     .status_bit = 16,
0203     .clkr.hw.init = &(struct clk_init_data){
0204         .name = "pll14",
0205         .parent_data = gcc_pxo,
0206         .num_parents = 1,
0207         .ops = &clk_pll_ops,
0208     },
0209 };
0210 
0211 static struct clk_regmap pll14_vote = {
0212     .enable_reg = 0x34c0,
0213     .enable_mask = BIT(14),
0214     .hw.init = &(struct clk_init_data){
0215         .name = "pll14_vote",
0216         .parent_hws = (const struct clk_hw*[]){
0217             &pll14.clkr.hw,
0218         },
0219         .num_parents = 1,
0220         .ops = &clk_pll_vote_ops,
0221     },
0222 };
0223 
0224 #define NSS_PLL_RATE(f, _l, _m, _n, i) \
0225     {  \
0226         .freq = f,  \
0227         .l = _l, \
0228         .m = _m, \
0229         .n = _n, \
0230         .ibits = i, \
0231     }
0232 
0233 static struct pll_freq_tbl pll18_freq_tbl[] = {
0234     NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625),
0235     NSS_PLL_RATE(600000000, 48, 0, 1, 0x01495625),
0236     NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625),
0237     NSS_PLL_RATE(800000000, 64, 0, 1, 0x01495625),
0238 };
0239 
0240 static struct clk_pll pll18 = {
0241     .l_reg = 0x31a4,
0242     .m_reg = 0x31a8,
0243     .n_reg = 0x31ac,
0244     .config_reg = 0x31b4,
0245     .mode_reg = 0x31a0,
0246     .status_reg = 0x31b8,
0247     .status_bit = 16,
0248     .post_div_shift = 16,
0249     .post_div_width = 1,
0250     .freq_tbl = pll18_freq_tbl,
0251     .clkr.hw.init = &(struct clk_init_data){
0252         .name = "pll18",
0253         .parent_data = gcc_pxo,
0254         .num_parents = 1,
0255         .ops = &clk_pll_ops,
0256     },
0257 };
0258 
0259 static struct clk_pll pll11 = {
0260     .l_reg = 0x3184,
0261     .m_reg = 0x3188,
0262     .n_reg = 0x318c,
0263     .config_reg = 0x3194,
0264     .mode_reg = 0x3180,
0265     .status_reg = 0x3198,
0266     .status_bit = 16,
0267     .clkr.hw.init = &(struct clk_init_data){
0268         .name = "pll11",
0269         .parent_data = &(const struct clk_parent_data){
0270             .fw_name = "pxo",
0271         },
0272         .num_parents = 1,
0273         .ops = &clk_pll_ops,
0274     },
0275 };
0276 
0277 enum {
0278     P_PXO,
0279     P_PLL8,
0280     P_PLL3,
0281     P_PLL0,
0282     P_CXO,
0283     P_PLL14,
0284     P_PLL18,
0285     P_PLL11,
0286 };
0287 
0288 static const struct parent_map gcc_pxo_pll8_map[] = {
0289     { P_PXO, 0 },
0290     { P_PLL8, 3 }
0291 };
0292 
0293 static const struct clk_parent_data gcc_pxo_pll8[] = {
0294     { .fw_name = "pxo", .name = "pxo" },
0295     { .hw = &pll8_vote.hw },
0296 };
0297 
0298 static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
0299     { P_PXO, 0 },
0300     { P_PLL8, 3 },
0301     { P_CXO, 5 }
0302 };
0303 
0304 static const struct clk_parent_data gcc_pxo_pll8_cxo[] = {
0305     { .fw_name = "pxo", .name = "pxo" },
0306     { .hw = &pll8_vote.hw },
0307     { .fw_name = "cxo", .name = "cxo" },
0308 };
0309 
0310 static const struct parent_map gcc_pxo_pll3_map[] = {
0311     { P_PXO, 0 },
0312     { P_PLL3, 1 }
0313 };
0314 
0315 static const struct parent_map gcc_pxo_pll3_sata_map[] = {
0316     { P_PXO, 0 },
0317     { P_PLL3, 6 }
0318 };
0319 
0320 static const struct clk_parent_data gcc_pxo_pll3[] = {
0321     { .fw_name = "pxo", .name = "pxo" },
0322     { .hw = &pll3.clkr.hw },
0323 };
0324 
0325 static const struct parent_map gcc_pxo_pll8_pll0_map[] = {
0326     { P_PXO, 0 },
0327     { P_PLL8, 3 },
0328     { P_PLL0, 2 }
0329 };
0330 
0331 static const struct clk_parent_data gcc_pxo_pll8_pll0[] = {
0332     { .fw_name = "pxo", .name = "pxo" },
0333     { .hw = &pll8_vote.hw },
0334     { .hw = &pll0_vote.hw },
0335 };
0336 
0337 static const struct parent_map gcc_pxo_pll8_pll14_pll18_pll0_map[] = {
0338     { P_PXO, 0 },
0339     { P_PLL8, 4 },
0340     { P_PLL0, 2 },
0341     { P_PLL14, 5 },
0342     { P_PLL18, 1 }
0343 };
0344 
0345 static const struct clk_parent_data gcc_pxo_pll8_pll14_pll18_pll0[] = {
0346     { .fw_name = "pxo", .name = "pxo" },
0347     { .hw = &pll8_vote.hw },
0348     { .hw = &pll0_vote.hw },
0349     { .hw = &pll14.clkr.hw },
0350     { .hw = &pll18.clkr.hw },
0351 };
0352 
0353 static const struct parent_map gcc_pxo_pll8_pll0_pll14_pll18_pll11_map[] = {
0354     { P_PXO, 0 },
0355     { P_PLL8, 4 },
0356     { P_PLL0, 2 },
0357     { P_PLL14, 5 },
0358     { P_PLL18, 1 },
0359     { P_PLL11, 3 },
0360 };
0361 
0362 static const struct clk_parent_data gcc_pxo_pll8_pll0_pll14_pll18_pll11[] = {
0363     { .fw_name = "pxo" },
0364     { .hw = &pll8_vote.hw },
0365     { .hw = &pll0_vote.hw },
0366     { .hw = &pll14.clkr.hw },
0367     { .hw = &pll18.clkr.hw },
0368     { .hw = &pll11.clkr.hw },
0369 
0370 };
0371 
0372 static const struct parent_map gcc_pxo_pll3_pll0_pll14_pll18_pll11_map[] = {
0373     { P_PXO, 0 },
0374     { P_PLL3, 6 },
0375     { P_PLL0, 2 },
0376     { P_PLL14, 5 },
0377     { P_PLL18, 1 },
0378     { P_PLL11, 3 },
0379 };
0380 
0381 static const struct clk_parent_data gcc_pxo_pll3_pll0_pll14_pll18_pll11[] = {
0382     { .fw_name = "pxo" },
0383     { .hw = &pll3.clkr.hw },
0384     { .hw = &pll0_vote.hw },
0385     { .hw = &pll14.clkr.hw },
0386     { .hw = &pll18.clkr.hw },
0387     { .hw = &pll11.clkr.hw },
0388 
0389 };
0390 
0391 static struct freq_tbl clk_tbl_gsbi_uart[] = {
0392     {  1843200, P_PLL8, 2,  6, 625 },
0393     {  3686400, P_PLL8, 2, 12, 625 },
0394     {  7372800, P_PLL8, 2, 24, 625 },
0395     { 14745600, P_PLL8, 2, 48, 625 },
0396     { 16000000, P_PLL8, 4,  1,   6 },
0397     { 24000000, P_PLL8, 4,  1,   4 },
0398     { 32000000, P_PLL8, 4,  1,   3 },
0399     { 40000000, P_PLL8, 1,  5,  48 },
0400     { 46400000, P_PLL8, 1, 29, 240 },
0401     { 48000000, P_PLL8, 4,  1,   2 },
0402     { 51200000, P_PLL8, 1,  2,  15 },
0403     { 56000000, P_PLL8, 1,  7,  48 },
0404     { 58982400, P_PLL8, 1, 96, 625 },
0405     { 64000000, P_PLL8, 2,  1,   3 },
0406     { }
0407 };
0408 
0409 static struct clk_rcg gsbi1_uart_src = {
0410     .ns_reg = 0x29d4,
0411     .md_reg = 0x29d0,
0412     .mn = {
0413         .mnctr_en_bit = 8,
0414         .mnctr_reset_bit = 7,
0415         .mnctr_mode_shift = 5,
0416         .n_val_shift = 16,
0417         .m_val_shift = 16,
0418         .width = 16,
0419     },
0420     .p = {
0421         .pre_div_shift = 3,
0422         .pre_div_width = 2,
0423     },
0424     .s = {
0425         .src_sel_shift = 0,
0426         .parent_map = gcc_pxo_pll8_map,
0427     },
0428     .freq_tbl = clk_tbl_gsbi_uart,
0429     .clkr = {
0430         .enable_reg = 0x29d4,
0431         .enable_mask = BIT(11),
0432         .hw.init = &(struct clk_init_data){
0433             .name = "gsbi1_uart_src",
0434             .parent_data = gcc_pxo_pll8,
0435             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0436             .ops = &clk_rcg_ops,
0437             .flags = CLK_SET_PARENT_GATE,
0438         },
0439     },
0440 };
0441 
0442 static struct clk_branch gsbi1_uart_clk = {
0443     .halt_reg = 0x2fcc,
0444     .halt_bit = 12,
0445     .clkr = {
0446         .enable_reg = 0x29d4,
0447         .enable_mask = BIT(9),
0448         .hw.init = &(struct clk_init_data){
0449             .name = "gsbi1_uart_clk",
0450             .parent_hws = (const struct clk_hw*[]){
0451                 &gsbi1_uart_src.clkr.hw,
0452             },
0453             .num_parents = 1,
0454             .ops = &clk_branch_ops,
0455             .flags = CLK_SET_RATE_PARENT,
0456         },
0457     },
0458 };
0459 
0460 static struct clk_rcg gsbi2_uart_src = {
0461     .ns_reg = 0x29f4,
0462     .md_reg = 0x29f0,
0463     .mn = {
0464         .mnctr_en_bit = 8,
0465         .mnctr_reset_bit = 7,
0466         .mnctr_mode_shift = 5,
0467         .n_val_shift = 16,
0468         .m_val_shift = 16,
0469         .width = 16,
0470     },
0471     .p = {
0472         .pre_div_shift = 3,
0473         .pre_div_width = 2,
0474     },
0475     .s = {
0476         .src_sel_shift = 0,
0477         .parent_map = gcc_pxo_pll8_map,
0478     },
0479     .freq_tbl = clk_tbl_gsbi_uart,
0480     .clkr = {
0481         .enable_reg = 0x29f4,
0482         .enable_mask = BIT(11),
0483         .hw.init = &(struct clk_init_data){
0484             .name = "gsbi2_uart_src",
0485             .parent_data = gcc_pxo_pll8,
0486             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0487             .ops = &clk_rcg_ops,
0488             .flags = CLK_SET_PARENT_GATE,
0489         },
0490     },
0491 };
0492 
0493 static struct clk_branch gsbi2_uart_clk = {
0494     .halt_reg = 0x2fcc,
0495     .halt_bit = 8,
0496     .clkr = {
0497         .enable_reg = 0x29f4,
0498         .enable_mask = BIT(9),
0499         .hw.init = &(struct clk_init_data){
0500             .name = "gsbi2_uart_clk",
0501             .parent_hws = (const struct clk_hw*[]){
0502                 &gsbi2_uart_src.clkr.hw,
0503             },
0504             .num_parents = 1,
0505             .ops = &clk_branch_ops,
0506             .flags = CLK_SET_RATE_PARENT,
0507         },
0508     },
0509 };
0510 
0511 static struct clk_rcg gsbi4_uart_src = {
0512     .ns_reg = 0x2a34,
0513     .md_reg = 0x2a30,
0514     .mn = {
0515         .mnctr_en_bit = 8,
0516         .mnctr_reset_bit = 7,
0517         .mnctr_mode_shift = 5,
0518         .n_val_shift = 16,
0519         .m_val_shift = 16,
0520         .width = 16,
0521     },
0522     .p = {
0523         .pre_div_shift = 3,
0524         .pre_div_width = 2,
0525     },
0526     .s = {
0527         .src_sel_shift = 0,
0528         .parent_map = gcc_pxo_pll8_map,
0529     },
0530     .freq_tbl = clk_tbl_gsbi_uart,
0531     .clkr = {
0532         .enable_reg = 0x2a34,
0533         .enable_mask = BIT(11),
0534         .hw.init = &(struct clk_init_data){
0535             .name = "gsbi4_uart_src",
0536             .parent_data = gcc_pxo_pll8,
0537             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0538             .ops = &clk_rcg_ops,
0539             .flags = CLK_SET_PARENT_GATE,
0540         },
0541     },
0542 };
0543 
0544 static struct clk_branch gsbi4_uart_clk = {
0545     .halt_reg = 0x2fd0,
0546     .halt_bit = 26,
0547     .clkr = {
0548         .enable_reg = 0x2a34,
0549         .enable_mask = BIT(9),
0550         .hw.init = &(struct clk_init_data){
0551             .name = "gsbi4_uart_clk",
0552             .parent_hws = (const struct clk_hw*[]){
0553                 &gsbi4_uart_src.clkr.hw,
0554             },
0555             .num_parents = 1,
0556             .ops = &clk_branch_ops,
0557             .flags = CLK_SET_RATE_PARENT,
0558         },
0559     },
0560 };
0561 
0562 static struct clk_rcg gsbi5_uart_src = {
0563     .ns_reg = 0x2a54,
0564     .md_reg = 0x2a50,
0565     .mn = {
0566         .mnctr_en_bit = 8,
0567         .mnctr_reset_bit = 7,
0568         .mnctr_mode_shift = 5,
0569         .n_val_shift = 16,
0570         .m_val_shift = 16,
0571         .width = 16,
0572     },
0573     .p = {
0574         .pre_div_shift = 3,
0575         .pre_div_width = 2,
0576     },
0577     .s = {
0578         .src_sel_shift = 0,
0579         .parent_map = gcc_pxo_pll8_map,
0580     },
0581     .freq_tbl = clk_tbl_gsbi_uart,
0582     .clkr = {
0583         .enable_reg = 0x2a54,
0584         .enable_mask = BIT(11),
0585         .hw.init = &(struct clk_init_data){
0586             .name = "gsbi5_uart_src",
0587             .parent_data = gcc_pxo_pll8,
0588             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0589             .ops = &clk_rcg_ops,
0590             .flags = CLK_SET_PARENT_GATE,
0591         },
0592     },
0593 };
0594 
0595 static struct clk_branch gsbi5_uart_clk = {
0596     .halt_reg = 0x2fd0,
0597     .halt_bit = 22,
0598     .clkr = {
0599         .enable_reg = 0x2a54,
0600         .enable_mask = BIT(9),
0601         .hw.init = &(struct clk_init_data){
0602             .name = "gsbi5_uart_clk",
0603             .parent_hws = (const struct clk_hw*[]){
0604                 &gsbi5_uart_src.clkr.hw,
0605             },
0606             .num_parents = 1,
0607             .ops = &clk_branch_ops,
0608             .flags = CLK_SET_RATE_PARENT,
0609         },
0610     },
0611 };
0612 
0613 static struct clk_rcg gsbi6_uart_src = {
0614     .ns_reg = 0x2a74,
0615     .md_reg = 0x2a70,
0616     .mn = {
0617         .mnctr_en_bit = 8,
0618         .mnctr_reset_bit = 7,
0619         .mnctr_mode_shift = 5,
0620         .n_val_shift = 16,
0621         .m_val_shift = 16,
0622         .width = 16,
0623     },
0624     .p = {
0625         .pre_div_shift = 3,
0626         .pre_div_width = 2,
0627     },
0628     .s = {
0629         .src_sel_shift = 0,
0630         .parent_map = gcc_pxo_pll8_map,
0631     },
0632     .freq_tbl = clk_tbl_gsbi_uart,
0633     .clkr = {
0634         .enable_reg = 0x2a74,
0635         .enable_mask = BIT(11),
0636         .hw.init = &(struct clk_init_data){
0637             .name = "gsbi6_uart_src",
0638             .parent_data = gcc_pxo_pll8,
0639             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0640             .ops = &clk_rcg_ops,
0641             .flags = CLK_SET_PARENT_GATE,
0642         },
0643     },
0644 };
0645 
0646 static struct clk_branch gsbi6_uart_clk = {
0647     .halt_reg = 0x2fd0,
0648     .halt_bit = 18,
0649     .clkr = {
0650         .enable_reg = 0x2a74,
0651         .enable_mask = BIT(9),
0652         .hw.init = &(struct clk_init_data){
0653             .name = "gsbi6_uart_clk",
0654             .parent_hws = (const struct clk_hw*[]){
0655                 &gsbi6_uart_src.clkr.hw,
0656             },
0657             .num_parents = 1,
0658             .ops = &clk_branch_ops,
0659             .flags = CLK_SET_RATE_PARENT,
0660         },
0661     },
0662 };
0663 
0664 static struct clk_rcg gsbi7_uart_src = {
0665     .ns_reg = 0x2a94,
0666     .md_reg = 0x2a90,
0667     .mn = {
0668         .mnctr_en_bit = 8,
0669         .mnctr_reset_bit = 7,
0670         .mnctr_mode_shift = 5,
0671         .n_val_shift = 16,
0672         .m_val_shift = 16,
0673         .width = 16,
0674     },
0675     .p = {
0676         .pre_div_shift = 3,
0677         .pre_div_width = 2,
0678     },
0679     .s = {
0680         .src_sel_shift = 0,
0681         .parent_map = gcc_pxo_pll8_map,
0682     },
0683     .freq_tbl = clk_tbl_gsbi_uart,
0684     .clkr = {
0685         .enable_reg = 0x2a94,
0686         .enable_mask = BIT(11),
0687         .hw.init = &(struct clk_init_data){
0688             .name = "gsbi7_uart_src",
0689             .parent_data = gcc_pxo_pll8,
0690             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0691             .ops = &clk_rcg_ops,
0692             .flags = CLK_SET_PARENT_GATE,
0693         },
0694     },
0695 };
0696 
0697 static struct clk_branch gsbi7_uart_clk = {
0698     .halt_reg = 0x2fd0,
0699     .halt_bit = 14,
0700     .clkr = {
0701         .enable_reg = 0x2a94,
0702         .enable_mask = BIT(9),
0703         .hw.init = &(struct clk_init_data){
0704             .name = "gsbi7_uart_clk",
0705             .parent_hws = (const struct clk_hw*[]){
0706                 &gsbi7_uart_src.clkr.hw,
0707             },
0708             .num_parents = 1,
0709             .ops = &clk_branch_ops,
0710             .flags = CLK_SET_RATE_PARENT,
0711         },
0712     },
0713 };
0714 
0715 static struct freq_tbl clk_tbl_gsbi_qup[] = {
0716     {  1100000, P_PXO,  1, 2, 49 },
0717     {  5400000, P_PXO,  1, 1,  5 },
0718     { 10800000, P_PXO,  1, 2,  5 },
0719     { 15060000, P_PLL8, 1, 2, 51 },
0720     { 24000000, P_PLL8, 4, 1,  4 },
0721     { 25000000, P_PXO,  1, 0,  0 },
0722     { 25600000, P_PLL8, 1, 1, 15 },
0723     { 48000000, P_PLL8, 4, 1,  2 },
0724     { 51200000, P_PLL8, 1, 2, 15 },
0725     { }
0726 };
0727 
0728 static struct clk_rcg gsbi1_qup_src = {
0729     .ns_reg = 0x29cc,
0730     .md_reg = 0x29c8,
0731     .mn = {
0732         .mnctr_en_bit = 8,
0733         .mnctr_reset_bit = 7,
0734         .mnctr_mode_shift = 5,
0735         .n_val_shift = 16,
0736         .m_val_shift = 16,
0737         .width = 8,
0738     },
0739     .p = {
0740         .pre_div_shift = 3,
0741         .pre_div_width = 2,
0742     },
0743     .s = {
0744         .src_sel_shift = 0,
0745         .parent_map = gcc_pxo_pll8_map,
0746     },
0747     .freq_tbl = clk_tbl_gsbi_qup,
0748     .clkr = {
0749         .enable_reg = 0x29cc,
0750         .enable_mask = BIT(11),
0751         .hw.init = &(struct clk_init_data){
0752             .name = "gsbi1_qup_src",
0753             .parent_data = gcc_pxo_pll8,
0754             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0755             .ops = &clk_rcg_ops,
0756             .flags = CLK_SET_PARENT_GATE,
0757         },
0758     },
0759 };
0760 
0761 static struct clk_branch gsbi1_qup_clk = {
0762     .halt_reg = 0x2fcc,
0763     .halt_bit = 11,
0764     .clkr = {
0765         .enable_reg = 0x29cc,
0766         .enable_mask = BIT(9),
0767         .hw.init = &(struct clk_init_data){
0768             .name = "gsbi1_qup_clk",
0769             .parent_hws = (const struct clk_hw*[]){
0770                 &gsbi1_qup_src.clkr.hw,
0771             },
0772             .num_parents = 1,
0773             .ops = &clk_branch_ops,
0774             .flags = CLK_SET_RATE_PARENT,
0775         },
0776     },
0777 };
0778 
0779 static struct clk_rcg gsbi2_qup_src = {
0780     .ns_reg = 0x29ec,
0781     .md_reg = 0x29e8,
0782     .mn = {
0783         .mnctr_en_bit = 8,
0784         .mnctr_reset_bit = 7,
0785         .mnctr_mode_shift = 5,
0786         .n_val_shift = 16,
0787         .m_val_shift = 16,
0788         .width = 8,
0789     },
0790     .p = {
0791         .pre_div_shift = 3,
0792         .pre_div_width = 2,
0793     },
0794     .s = {
0795         .src_sel_shift = 0,
0796         .parent_map = gcc_pxo_pll8_map,
0797     },
0798     .freq_tbl = clk_tbl_gsbi_qup,
0799     .clkr = {
0800         .enable_reg = 0x29ec,
0801         .enable_mask = BIT(11),
0802         .hw.init = &(struct clk_init_data){
0803             .name = "gsbi2_qup_src",
0804             .parent_data = gcc_pxo_pll8,
0805             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0806             .ops = &clk_rcg_ops,
0807             .flags = CLK_SET_PARENT_GATE,
0808         },
0809     },
0810 };
0811 
0812 static struct clk_branch gsbi2_qup_clk = {
0813     .halt_reg = 0x2fcc,
0814     .halt_bit = 6,
0815     .clkr = {
0816         .enable_reg = 0x29ec,
0817         .enable_mask = BIT(9),
0818         .hw.init = &(struct clk_init_data){
0819             .name = "gsbi2_qup_clk",
0820             .parent_hws = (const struct clk_hw*[]){
0821                 &gsbi2_qup_src.clkr.hw,
0822             },
0823             .num_parents = 1,
0824             .ops = &clk_branch_ops,
0825             .flags = CLK_SET_RATE_PARENT,
0826         },
0827     },
0828 };
0829 
0830 static struct clk_rcg gsbi4_qup_src = {
0831     .ns_reg = 0x2a2c,
0832     .md_reg = 0x2a28,
0833     .mn = {
0834         .mnctr_en_bit = 8,
0835         .mnctr_reset_bit = 7,
0836         .mnctr_mode_shift = 5,
0837         .n_val_shift = 16,
0838         .m_val_shift = 16,
0839         .width = 8,
0840     },
0841     .p = {
0842         .pre_div_shift = 3,
0843         .pre_div_width = 2,
0844     },
0845     .s = {
0846         .src_sel_shift = 0,
0847         .parent_map = gcc_pxo_pll8_map,
0848     },
0849     .freq_tbl = clk_tbl_gsbi_qup,
0850     .clkr = {
0851         .enable_reg = 0x2a2c,
0852         .enable_mask = BIT(11),
0853         .hw.init = &(struct clk_init_data){
0854             .name = "gsbi4_qup_src",
0855             .parent_data = gcc_pxo_pll8,
0856             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0857             .ops = &clk_rcg_ops,
0858             .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
0859         },
0860     },
0861 };
0862 
0863 static struct clk_branch gsbi4_qup_clk = {
0864     .halt_reg = 0x2fd0,
0865     .halt_bit = 24,
0866     .clkr = {
0867         .enable_reg = 0x2a2c,
0868         .enable_mask = BIT(9),
0869         .hw.init = &(struct clk_init_data){
0870             .name = "gsbi4_qup_clk",
0871             .parent_hws = (const struct clk_hw*[]){
0872                 &gsbi4_qup_src.clkr.hw,
0873             },
0874             .num_parents = 1,
0875             .ops = &clk_branch_ops,
0876             .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
0877         },
0878     },
0879 };
0880 
0881 static struct clk_rcg gsbi5_qup_src = {
0882     .ns_reg = 0x2a4c,
0883     .md_reg = 0x2a48,
0884     .mn = {
0885         .mnctr_en_bit = 8,
0886         .mnctr_reset_bit = 7,
0887         .mnctr_mode_shift = 5,
0888         .n_val_shift = 16,
0889         .m_val_shift = 16,
0890         .width = 8,
0891     },
0892     .p = {
0893         .pre_div_shift = 3,
0894         .pre_div_width = 2,
0895     },
0896     .s = {
0897         .src_sel_shift = 0,
0898         .parent_map = gcc_pxo_pll8_map,
0899     },
0900     .freq_tbl = clk_tbl_gsbi_qup,
0901     .clkr = {
0902         .enable_reg = 0x2a4c,
0903         .enable_mask = BIT(11),
0904         .hw.init = &(struct clk_init_data){
0905             .name = "gsbi5_qup_src",
0906             .parent_data = gcc_pxo_pll8,
0907             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0908             .ops = &clk_rcg_ops,
0909             .flags = CLK_SET_PARENT_GATE,
0910         },
0911     },
0912 };
0913 
0914 static struct clk_branch gsbi5_qup_clk = {
0915     .halt_reg = 0x2fd0,
0916     .halt_bit = 20,
0917     .clkr = {
0918         .enable_reg = 0x2a4c,
0919         .enable_mask = BIT(9),
0920         .hw.init = &(struct clk_init_data){
0921             .name = "gsbi5_qup_clk",
0922             .parent_hws = (const struct clk_hw*[]){
0923                 &gsbi5_qup_src.clkr.hw,
0924             },
0925             .num_parents = 1,
0926             .ops = &clk_branch_ops,
0927             .flags = CLK_SET_RATE_PARENT,
0928         },
0929     },
0930 };
0931 
0932 static struct clk_rcg gsbi6_qup_src = {
0933     .ns_reg = 0x2a6c,
0934     .md_reg = 0x2a68,
0935     .mn = {
0936         .mnctr_en_bit = 8,
0937         .mnctr_reset_bit = 7,
0938         .mnctr_mode_shift = 5,
0939         .n_val_shift = 16,
0940         .m_val_shift = 16,
0941         .width = 8,
0942     },
0943     .p = {
0944         .pre_div_shift = 3,
0945         .pre_div_width = 2,
0946     },
0947     .s = {
0948         .src_sel_shift = 0,
0949         .parent_map = gcc_pxo_pll8_map,
0950     },
0951     .freq_tbl = clk_tbl_gsbi_qup,
0952     .clkr = {
0953         .enable_reg = 0x2a6c,
0954         .enable_mask = BIT(11),
0955         .hw.init = &(struct clk_init_data){
0956             .name = "gsbi6_qup_src",
0957             .parent_data = gcc_pxo_pll8,
0958             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
0959             .ops = &clk_rcg_ops,
0960             .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
0961         },
0962     },
0963 };
0964 
0965 static struct clk_branch gsbi6_qup_clk = {
0966     .halt_reg = 0x2fd0,
0967     .halt_bit = 16,
0968     .clkr = {
0969         .enable_reg = 0x2a6c,
0970         .enable_mask = BIT(9),
0971         .hw.init = &(struct clk_init_data){
0972             .name = "gsbi6_qup_clk",
0973             .parent_hws = (const struct clk_hw*[]){
0974                 &gsbi6_qup_src.clkr.hw,
0975             },
0976             .num_parents = 1,
0977             .ops = &clk_branch_ops,
0978             .flags = CLK_SET_RATE_PARENT,
0979         },
0980     },
0981 };
0982 
0983 static struct clk_rcg gsbi7_qup_src = {
0984     .ns_reg = 0x2a8c,
0985     .md_reg = 0x2a88,
0986     .mn = {
0987         .mnctr_en_bit = 8,
0988         .mnctr_reset_bit = 7,
0989         .mnctr_mode_shift = 5,
0990         .n_val_shift = 16,
0991         .m_val_shift = 16,
0992         .width = 8,
0993     },
0994     .p = {
0995         .pre_div_shift = 3,
0996         .pre_div_width = 2,
0997     },
0998     .s = {
0999         .src_sel_shift = 0,
1000         .parent_map = gcc_pxo_pll8_map,
1001     },
1002     .freq_tbl = clk_tbl_gsbi_qup,
1003     .clkr = {
1004         .enable_reg = 0x2a8c,
1005         .enable_mask = BIT(11),
1006         .hw.init = &(struct clk_init_data){
1007             .name = "gsbi7_qup_src",
1008             .parent_data = gcc_pxo_pll8,
1009             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1010             .ops = &clk_rcg_ops,
1011             .flags = CLK_SET_PARENT_GATE,
1012         },
1013     },
1014 };
1015 
1016 static struct clk_branch gsbi7_qup_clk = {
1017     .halt_reg = 0x2fd0,
1018     .halt_bit = 12,
1019     .clkr = {
1020         .enable_reg = 0x2a8c,
1021         .enable_mask = BIT(9),
1022         .hw.init = &(struct clk_init_data){
1023             .name = "gsbi7_qup_clk",
1024             .parent_hws = (const struct clk_hw*[]){
1025                 &gsbi7_qup_src.clkr.hw,
1026             },
1027             .num_parents = 1,
1028             .ops = &clk_branch_ops,
1029             .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1030         },
1031     },
1032 };
1033 
1034 static struct clk_branch gsbi1_h_clk = {
1035     .hwcg_reg = 0x29c0,
1036     .hwcg_bit = 6,
1037     .halt_reg = 0x2fcc,
1038     .halt_bit = 13,
1039     .clkr = {
1040         .enable_reg = 0x29c0,
1041         .enable_mask = BIT(4),
1042         .hw.init = &(struct clk_init_data){
1043             .name = "gsbi1_h_clk",
1044             .ops = &clk_branch_ops,
1045         },
1046     },
1047 };
1048 
1049 static struct clk_branch gsbi2_h_clk = {
1050     .hwcg_reg = 0x29e0,
1051     .hwcg_bit = 6,
1052     .halt_reg = 0x2fcc,
1053     .halt_bit = 9,
1054     .clkr = {
1055         .enable_reg = 0x29e0,
1056         .enable_mask = BIT(4),
1057         .hw.init = &(struct clk_init_data){
1058             .name = "gsbi2_h_clk",
1059             .ops = &clk_branch_ops,
1060         },
1061     },
1062 };
1063 
1064 static struct clk_branch gsbi4_h_clk = {
1065     .hwcg_reg = 0x2a20,
1066     .hwcg_bit = 6,
1067     .halt_reg = 0x2fd0,
1068     .halt_bit = 27,
1069     .clkr = {
1070         .enable_reg = 0x2a20,
1071         .enable_mask = BIT(4),
1072         .hw.init = &(struct clk_init_data){
1073             .name = "gsbi4_h_clk",
1074             .ops = &clk_branch_ops,
1075             .flags = CLK_IGNORE_UNUSED,
1076         },
1077     },
1078 };
1079 
1080 static struct clk_branch gsbi5_h_clk = {
1081     .hwcg_reg = 0x2a40,
1082     .hwcg_bit = 6,
1083     .halt_reg = 0x2fd0,
1084     .halt_bit = 23,
1085     .clkr = {
1086         .enable_reg = 0x2a40,
1087         .enable_mask = BIT(4),
1088         .hw.init = &(struct clk_init_data){
1089             .name = "gsbi5_h_clk",
1090             .ops = &clk_branch_ops,
1091         },
1092     },
1093 };
1094 
1095 static struct clk_branch gsbi6_h_clk = {
1096     .hwcg_reg = 0x2a60,
1097     .hwcg_bit = 6,
1098     .halt_reg = 0x2fd0,
1099     .halt_bit = 19,
1100     .clkr = {
1101         .enable_reg = 0x2a60,
1102         .enable_mask = BIT(4),
1103         .hw.init = &(struct clk_init_data){
1104             .name = "gsbi6_h_clk",
1105             .ops = &clk_branch_ops,
1106         },
1107     },
1108 };
1109 
1110 static struct clk_branch gsbi7_h_clk = {
1111     .hwcg_reg = 0x2a80,
1112     .hwcg_bit = 6,
1113     .halt_reg = 0x2fd0,
1114     .halt_bit = 15,
1115     .clkr = {
1116         .enable_reg = 0x2a80,
1117         .enable_mask = BIT(4),
1118         .hw.init = &(struct clk_init_data){
1119             .name = "gsbi7_h_clk",
1120             .ops = &clk_branch_ops,
1121         },
1122     },
1123 };
1124 
1125 static const struct freq_tbl clk_tbl_gp[] = {
1126     { 12500000, P_PXO,  2, 0, 0 },
1127     { 25000000, P_PXO,  1, 0, 0 },
1128     { 64000000, P_PLL8, 2, 1, 3 },
1129     { 76800000, P_PLL8, 1, 1, 5 },
1130     { 96000000, P_PLL8, 4, 0, 0 },
1131     { 128000000, P_PLL8, 3, 0, 0 },
1132     { 192000000, P_PLL8, 2, 0, 0 },
1133     { }
1134 };
1135 
1136 static struct clk_rcg gp0_src = {
1137     .ns_reg = 0x2d24,
1138     .md_reg = 0x2d00,
1139     .mn = {
1140         .mnctr_en_bit = 8,
1141         .mnctr_reset_bit = 7,
1142         .mnctr_mode_shift = 5,
1143         .n_val_shift = 16,
1144         .m_val_shift = 16,
1145         .width = 8,
1146     },
1147     .p = {
1148         .pre_div_shift = 3,
1149         .pre_div_width = 2,
1150     },
1151     .s = {
1152         .src_sel_shift = 0,
1153         .parent_map = gcc_pxo_pll8_cxo_map,
1154     },
1155     .freq_tbl = clk_tbl_gp,
1156     .clkr = {
1157         .enable_reg = 0x2d24,
1158         .enable_mask = BIT(11),
1159         .hw.init = &(struct clk_init_data){
1160             .name = "gp0_src",
1161             .parent_data = gcc_pxo_pll8_cxo,
1162             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1163             .ops = &clk_rcg_ops,
1164             .flags = CLK_SET_PARENT_GATE,
1165         },
1166     }
1167 };
1168 
1169 static struct clk_branch gp0_clk = {
1170     .halt_reg = 0x2fd8,
1171     .halt_bit = 7,
1172     .clkr = {
1173         .enable_reg = 0x2d24,
1174         .enable_mask = BIT(9),
1175         .hw.init = &(struct clk_init_data){
1176             .name = "gp0_clk",
1177             .parent_hws = (const struct clk_hw*[]){
1178                 &gp0_src.clkr.hw,
1179             },
1180             .num_parents = 1,
1181             .ops = &clk_branch_ops,
1182             .flags = CLK_SET_RATE_PARENT,
1183         },
1184     },
1185 };
1186 
1187 static struct clk_rcg gp1_src = {
1188     .ns_reg = 0x2d44,
1189     .md_reg = 0x2d40,
1190     .mn = {
1191         .mnctr_en_bit = 8,
1192         .mnctr_reset_bit = 7,
1193         .mnctr_mode_shift = 5,
1194         .n_val_shift = 16,
1195         .m_val_shift = 16,
1196         .width = 8,
1197     },
1198     .p = {
1199         .pre_div_shift = 3,
1200         .pre_div_width = 2,
1201     },
1202     .s = {
1203         .src_sel_shift = 0,
1204         .parent_map = gcc_pxo_pll8_cxo_map,
1205     },
1206     .freq_tbl = clk_tbl_gp,
1207     .clkr = {
1208         .enable_reg = 0x2d44,
1209         .enable_mask = BIT(11),
1210         .hw.init = &(struct clk_init_data){
1211             .name = "gp1_src",
1212             .parent_data = gcc_pxo_pll8_cxo,
1213             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1214             .ops = &clk_rcg_ops,
1215             .flags = CLK_SET_RATE_GATE,
1216         },
1217     }
1218 };
1219 
1220 static struct clk_branch gp1_clk = {
1221     .halt_reg = 0x2fd8,
1222     .halt_bit = 6,
1223     .clkr = {
1224         .enable_reg = 0x2d44,
1225         .enable_mask = BIT(9),
1226         .hw.init = &(struct clk_init_data){
1227             .name = "gp1_clk",
1228             .parent_hws = (const struct clk_hw*[]){
1229                 &gp1_src.clkr.hw,
1230             },
1231             .num_parents = 1,
1232             .ops = &clk_branch_ops,
1233             .flags = CLK_SET_RATE_PARENT,
1234         },
1235     },
1236 };
1237 
1238 static struct clk_rcg gp2_src = {
1239     .ns_reg = 0x2d64,
1240     .md_reg = 0x2d60,
1241     .mn = {
1242         .mnctr_en_bit = 8,
1243         .mnctr_reset_bit = 7,
1244         .mnctr_mode_shift = 5,
1245         .n_val_shift = 16,
1246         .m_val_shift = 16,
1247         .width = 8,
1248     },
1249     .p = {
1250         .pre_div_shift = 3,
1251         .pre_div_width = 2,
1252     },
1253     .s = {
1254         .src_sel_shift = 0,
1255         .parent_map = gcc_pxo_pll8_cxo_map,
1256     },
1257     .freq_tbl = clk_tbl_gp,
1258     .clkr = {
1259         .enable_reg = 0x2d64,
1260         .enable_mask = BIT(11),
1261         .hw.init = &(struct clk_init_data){
1262             .name = "gp2_src",
1263             .parent_data = gcc_pxo_pll8_cxo,
1264             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1265             .ops = &clk_rcg_ops,
1266             .flags = CLK_SET_RATE_GATE,
1267         },
1268     }
1269 };
1270 
1271 static struct clk_branch gp2_clk = {
1272     .halt_reg = 0x2fd8,
1273     .halt_bit = 5,
1274     .clkr = {
1275         .enable_reg = 0x2d64,
1276         .enable_mask = BIT(9),
1277         .hw.init = &(struct clk_init_data){
1278             .name = "gp2_clk",
1279             .parent_hws = (const struct clk_hw*[]){
1280                 &gp2_src.clkr.hw,
1281             },
1282             .num_parents = 1,
1283             .ops = &clk_branch_ops,
1284             .flags = CLK_SET_RATE_PARENT,
1285         },
1286     },
1287 };
1288 
1289 static struct clk_branch pmem_clk = {
1290     .hwcg_reg = 0x25a0,
1291     .hwcg_bit = 6,
1292     .halt_reg = 0x2fc8,
1293     .halt_bit = 20,
1294     .clkr = {
1295         .enable_reg = 0x25a0,
1296         .enable_mask = BIT(4),
1297         .hw.init = &(struct clk_init_data){
1298             .name = "pmem_clk",
1299             .ops = &clk_branch_ops,
1300         },
1301     },
1302 };
1303 
1304 static struct clk_rcg prng_src = {
1305     .ns_reg = 0x2e80,
1306     .p = {
1307         .pre_div_shift = 3,
1308         .pre_div_width = 4,
1309     },
1310     .s = {
1311         .src_sel_shift = 0,
1312         .parent_map = gcc_pxo_pll8_map,
1313     },
1314     .clkr = {
1315         .enable_reg = 0x2e80,
1316         .enable_mask = BIT(11),
1317         .hw.init = &(struct clk_init_data){
1318             .name = "prng_src",
1319             .parent_data = gcc_pxo_pll8,
1320             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1321             .ops = &clk_rcg_ops,
1322         },
1323     },
1324 };
1325 
1326 static struct clk_branch prng_clk = {
1327     .halt_reg = 0x2fd8,
1328     .halt_check = BRANCH_HALT_VOTED,
1329     .halt_bit = 10,
1330     .clkr = {
1331         .enable_reg = 0x3080,
1332         .enable_mask = BIT(10),
1333         .hw.init = &(struct clk_init_data){
1334             .name = "prng_clk",
1335             .parent_hws = (const struct clk_hw*[]){
1336                 &prng_src.clkr.hw,
1337             },
1338             .num_parents = 1,
1339             .ops = &clk_branch_ops,
1340         },
1341     },
1342 };
1343 
1344 static const struct freq_tbl clk_tbl_sdc[] = {
1345     {    200000, P_PXO,   2, 2, 125 },
1346     {    400000, P_PLL8,  4, 1, 240 },
1347     {  16000000, P_PLL8,  4, 1,   6 },
1348     {  17070000, P_PLL8,  1, 2,  45 },
1349     {  20210000, P_PLL8,  1, 1,  19 },
1350     {  24000000, P_PLL8,  4, 1,   4 },
1351     {  48000000, P_PLL8,  4, 1,   2 },
1352     {  51200000, P_PLL8,  1, 2,  15 },
1353     {  64000000, P_PLL8,  3, 1,   2 },
1354     {  96000000, P_PLL8,  4, 0,   0 },
1355     { 192000000, P_PLL8,  2, 0,   0 },
1356     { }
1357 };
1358 
1359 static struct clk_rcg sdc1_src = {
1360     .ns_reg = 0x282c,
1361     .md_reg = 0x2828,
1362     .mn = {
1363         .mnctr_en_bit = 8,
1364         .mnctr_reset_bit = 7,
1365         .mnctr_mode_shift = 5,
1366         .n_val_shift = 16,
1367         .m_val_shift = 16,
1368         .width = 8,
1369     },
1370     .p = {
1371         .pre_div_shift = 3,
1372         .pre_div_width = 2,
1373     },
1374     .s = {
1375         .src_sel_shift = 0,
1376         .parent_map = gcc_pxo_pll8_map,
1377     },
1378     .freq_tbl = clk_tbl_sdc,
1379     .clkr = {
1380         .enable_reg = 0x282c,
1381         .enable_mask = BIT(11),
1382         .hw.init = &(struct clk_init_data){
1383             .name = "sdc1_src",
1384             .parent_data = gcc_pxo_pll8,
1385             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1386             .ops = &clk_rcg_floor_ops,
1387         },
1388     }
1389 };
1390 
1391 static struct clk_branch sdc1_clk = {
1392     .halt_reg = 0x2fc8,
1393     .halt_bit = 6,
1394     .clkr = {
1395         .enable_reg = 0x282c,
1396         .enable_mask = BIT(9),
1397         .hw.init = &(struct clk_init_data){
1398             .name = "sdc1_clk",
1399             .parent_hws = (const struct clk_hw*[]){
1400                 &sdc1_src.clkr.hw,
1401             },
1402             .num_parents = 1,
1403             .ops = &clk_branch_ops,
1404             .flags = CLK_SET_RATE_PARENT,
1405         },
1406     },
1407 };
1408 
1409 static struct clk_rcg sdc3_src = {
1410     .ns_reg = 0x286c,
1411     .md_reg = 0x2868,
1412     .mn = {
1413         .mnctr_en_bit = 8,
1414         .mnctr_reset_bit = 7,
1415         .mnctr_mode_shift = 5,
1416         .n_val_shift = 16,
1417         .m_val_shift = 16,
1418         .width = 8,
1419     },
1420     .p = {
1421         .pre_div_shift = 3,
1422         .pre_div_width = 2,
1423     },
1424     .s = {
1425         .src_sel_shift = 0,
1426         .parent_map = gcc_pxo_pll8_map,
1427     },
1428     .freq_tbl = clk_tbl_sdc,
1429     .clkr = {
1430         .enable_reg = 0x286c,
1431         .enable_mask = BIT(11),
1432         .hw.init = &(struct clk_init_data){
1433             .name = "sdc3_src",
1434             .parent_data = gcc_pxo_pll8,
1435             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1436             .ops = &clk_rcg_ops,
1437         },
1438     }
1439 };
1440 
1441 static struct clk_branch sdc3_clk = {
1442     .halt_reg = 0x2fc8,
1443     .halt_bit = 4,
1444     .clkr = {
1445         .enable_reg = 0x286c,
1446         .enable_mask = BIT(9),
1447         .hw.init = &(struct clk_init_data){
1448             .name = "sdc3_clk",
1449             .parent_hws = (const struct clk_hw*[]){
1450                 &sdc3_src.clkr.hw,
1451             },
1452             .num_parents = 1,
1453             .ops = &clk_branch_ops,
1454             .flags = CLK_SET_RATE_PARENT,
1455         },
1456     },
1457 };
1458 
1459 static struct clk_branch sdc1_h_clk = {
1460     .hwcg_reg = 0x2820,
1461     .hwcg_bit = 6,
1462     .halt_reg = 0x2fc8,
1463     .halt_bit = 11,
1464     .clkr = {
1465         .enable_reg = 0x2820,
1466         .enable_mask = BIT(4),
1467         .hw.init = &(struct clk_init_data){
1468             .name = "sdc1_h_clk",
1469             .ops = &clk_branch_ops,
1470         },
1471     },
1472 };
1473 
1474 static struct clk_branch sdc3_h_clk = {
1475     .hwcg_reg = 0x2860,
1476     .hwcg_bit = 6,
1477     .halt_reg = 0x2fc8,
1478     .halt_bit = 9,
1479     .clkr = {
1480         .enable_reg = 0x2860,
1481         .enable_mask = BIT(4),
1482         .hw.init = &(struct clk_init_data){
1483             .name = "sdc3_h_clk",
1484             .ops = &clk_branch_ops,
1485         },
1486     },
1487 };
1488 
1489 static const struct freq_tbl clk_tbl_tsif_ref[] = {
1490     { 105000, P_PXO,  1, 1, 256 },
1491     { }
1492 };
1493 
1494 static struct clk_rcg tsif_ref_src = {
1495     .ns_reg = 0x2710,
1496     .md_reg = 0x270c,
1497     .mn = {
1498         .mnctr_en_bit = 8,
1499         .mnctr_reset_bit = 7,
1500         .mnctr_mode_shift = 5,
1501         .n_val_shift = 16,
1502         .m_val_shift = 16,
1503         .width = 16,
1504     },
1505     .p = {
1506         .pre_div_shift = 3,
1507         .pre_div_width = 2,
1508     },
1509     .s = {
1510         .src_sel_shift = 0,
1511         .parent_map = gcc_pxo_pll8_map,
1512     },
1513     .freq_tbl = clk_tbl_tsif_ref,
1514     .clkr = {
1515         .enable_reg = 0x2710,
1516         .enable_mask = BIT(11),
1517         .hw.init = &(struct clk_init_data){
1518             .name = "tsif_ref_src",
1519             .parent_data = gcc_pxo_pll8,
1520             .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1521             .ops = &clk_rcg_ops,
1522         },
1523     }
1524 };
1525 
1526 static struct clk_branch tsif_ref_clk = {
1527     .halt_reg = 0x2fd4,
1528     .halt_bit = 5,
1529     .clkr = {
1530         .enable_reg = 0x2710,
1531         .enable_mask = BIT(9),
1532         .hw.init = &(struct clk_init_data){
1533             .name = "tsif_ref_clk",
1534             .parent_hws = (const struct clk_hw*[]){
1535                 &tsif_ref_src.clkr.hw,
1536             },
1537             .num_parents = 1,
1538             .ops = &clk_branch_ops,
1539             .flags = CLK_SET_RATE_PARENT,
1540         },
1541     },
1542 };
1543 
1544 static struct clk_branch tsif_h_clk = {
1545     .hwcg_reg = 0x2700,
1546     .hwcg_bit = 6,
1547     .halt_reg = 0x2fd4,
1548     .halt_bit = 7,
1549     .clkr = {
1550         .enable_reg = 0x2700,
1551         .enable_mask = BIT(4),
1552         .hw.init = &(struct clk_init_data){
1553             .name = "tsif_h_clk",
1554             .ops = &clk_branch_ops,
1555         },
1556     },
1557 };
1558 
1559 static struct clk_branch dma_bam_h_clk = {
1560     .hwcg_reg = 0x25c0,
1561     .hwcg_bit = 6,
1562     .halt_reg = 0x2fc8,
1563     .halt_bit = 12,
1564     .clkr = {
1565         .enable_reg = 0x25c0,
1566         .enable_mask = BIT(4),
1567         .hw.init = &(struct clk_init_data){
1568             .name = "dma_bam_h_clk",
1569             .ops = &clk_branch_ops,
1570         },
1571     },
1572 };
1573 
1574 static struct clk_branch adm0_clk = {
1575     .halt_reg = 0x2fdc,
1576     .halt_check = BRANCH_HALT_VOTED,
1577     .halt_bit = 12,
1578     .clkr = {
1579         .enable_reg = 0x3080,
1580         .enable_mask = BIT(2),
1581         .hw.init = &(struct clk_init_data){
1582             .name = "adm0_clk",
1583             .ops = &clk_branch_ops,
1584         },
1585     },
1586 };
1587 
1588 static struct clk_branch adm0_pbus_clk = {
1589     .hwcg_reg = 0x2208,
1590     .hwcg_bit = 6,
1591     .halt_reg = 0x2fdc,
1592     .halt_check = BRANCH_HALT_VOTED,
1593     .halt_bit = 11,
1594     .clkr = {
1595         .enable_reg = 0x3080,
1596         .enable_mask = BIT(3),
1597         .hw.init = &(struct clk_init_data){
1598             .name = "adm0_pbus_clk",
1599             .ops = &clk_branch_ops,
1600         },
1601     },
1602 };
1603 
1604 static struct clk_branch pmic_arb0_h_clk = {
1605     .halt_reg = 0x2fd8,
1606     .halt_check = BRANCH_HALT_VOTED,
1607     .halt_bit = 22,
1608     .clkr = {
1609         .enable_reg = 0x3080,
1610         .enable_mask = BIT(8),
1611         .hw.init = &(struct clk_init_data){
1612             .name = "pmic_arb0_h_clk",
1613             .ops = &clk_branch_ops,
1614         },
1615     },
1616 };
1617 
1618 static struct clk_branch pmic_arb1_h_clk = {
1619     .halt_reg = 0x2fd8,
1620     .halt_check = BRANCH_HALT_VOTED,
1621     .halt_bit = 21,
1622     .clkr = {
1623         .enable_reg = 0x3080,
1624         .enable_mask = BIT(9),
1625         .hw.init = &(struct clk_init_data){
1626             .name = "pmic_arb1_h_clk",
1627             .ops = &clk_branch_ops,
1628         },
1629     },
1630 };
1631 
1632 static struct clk_branch pmic_ssbi2_clk = {
1633     .halt_reg = 0x2fd8,
1634     .halt_check = BRANCH_HALT_VOTED,
1635     .halt_bit = 23,
1636     .clkr = {
1637         .enable_reg = 0x3080,
1638         .enable_mask = BIT(7),
1639         .hw.init = &(struct clk_init_data){
1640             .name = "pmic_ssbi2_clk",
1641             .ops = &clk_branch_ops,
1642         },
1643     },
1644 };
1645 
1646 static struct clk_branch rpm_msg_ram_h_clk = {
1647     .hwcg_reg = 0x27e0,
1648     .hwcg_bit = 6,
1649     .halt_reg = 0x2fd8,
1650     .halt_check = BRANCH_HALT_VOTED,
1651     .halt_bit = 12,
1652     .clkr = {
1653         .enable_reg = 0x3080,
1654         .enable_mask = BIT(6),
1655         .hw.init = &(struct clk_init_data){
1656             .name = "rpm_msg_ram_h_clk",
1657             .ops = &clk_branch_ops,
1658         },
1659     },
1660 };
1661 
1662 static const struct freq_tbl clk_tbl_pcie_ref[] = {
1663     { 100000000, P_PLL3,  12, 0, 0 },
1664     { }
1665 };
1666 
1667 static struct clk_rcg pcie_ref_src = {
1668     .ns_reg = 0x3860,
1669     .p = {
1670         .pre_div_shift = 3,
1671         .pre_div_width = 4,
1672     },
1673     .s = {
1674         .src_sel_shift = 0,
1675         .parent_map = gcc_pxo_pll3_map,
1676     },
1677     .freq_tbl = clk_tbl_pcie_ref,
1678     .clkr = {
1679         .enable_reg = 0x3860,
1680         .enable_mask = BIT(11),
1681         .hw.init = &(struct clk_init_data){
1682             .name = "pcie_ref_src",
1683             .parent_data = gcc_pxo_pll3,
1684             .num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1685             .ops = &clk_rcg_ops,
1686             .flags = CLK_SET_RATE_GATE,
1687         },
1688     },
1689 };
1690 
1691 static struct clk_branch pcie_ref_src_clk = {
1692     .halt_reg = 0x2fdc,
1693     .halt_bit = 30,
1694     .clkr = {
1695         .enable_reg = 0x3860,
1696         .enable_mask = BIT(9),
1697         .hw.init = &(struct clk_init_data){
1698             .name = "pcie_ref_src_clk",
1699             .parent_hws = (const struct clk_hw*[]){
1700                 &pcie_ref_src.clkr.hw,
1701             },
1702             .num_parents = 1,
1703             .ops = &clk_branch_ops,
1704             .flags = CLK_SET_RATE_PARENT,
1705         },
1706     },
1707 };
1708 
1709 static struct clk_branch pcie_a_clk = {
1710     .halt_reg = 0x2fc0,
1711     .halt_bit = 13,
1712     .clkr = {
1713         .enable_reg = 0x22c0,
1714         .enable_mask = BIT(4),
1715         .hw.init = &(struct clk_init_data){
1716             .name = "pcie_a_clk",
1717             .ops = &clk_branch_ops,
1718         },
1719     },
1720 };
1721 
1722 static struct clk_branch pcie_aux_clk = {
1723     .halt_reg = 0x2fdc,
1724     .halt_bit = 31,
1725     .clkr = {
1726         .enable_reg = 0x22c8,
1727         .enable_mask = BIT(4),
1728         .hw.init = &(struct clk_init_data){
1729             .name = "pcie_aux_clk",
1730             .ops = &clk_branch_ops,
1731         },
1732     },
1733 };
1734 
1735 static struct clk_branch pcie_h_clk = {
1736     .halt_reg = 0x2fd4,
1737     .halt_bit = 8,
1738     .clkr = {
1739         .enable_reg = 0x22cc,
1740         .enable_mask = BIT(4),
1741         .hw.init = &(struct clk_init_data){
1742             .name = "pcie_h_clk",
1743             .ops = &clk_branch_ops,
1744         },
1745     },
1746 };
1747 
1748 static struct clk_branch pcie_phy_clk = {
1749     .halt_reg = 0x2fdc,
1750     .halt_bit = 29,
1751     .clkr = {
1752         .enable_reg = 0x22d0,
1753         .enable_mask = BIT(4),
1754         .hw.init = &(struct clk_init_data){
1755             .name = "pcie_phy_clk",
1756             .ops = &clk_branch_ops,
1757         },
1758     },
1759 };
1760 
1761 static struct clk_rcg pcie1_ref_src = {
1762     .ns_reg = 0x3aa0,
1763     .p = {
1764         .pre_div_shift = 3,
1765         .pre_div_width = 4,
1766     },
1767     .s = {
1768         .src_sel_shift = 0,
1769         .parent_map = gcc_pxo_pll3_map,
1770     },
1771     .freq_tbl = clk_tbl_pcie_ref,
1772     .clkr = {
1773         .enable_reg = 0x3aa0,
1774         .enable_mask = BIT(11),
1775         .hw.init = &(struct clk_init_data){
1776             .name = "pcie1_ref_src",
1777             .parent_data = gcc_pxo_pll3,
1778             .num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1779             .ops = &clk_rcg_ops,
1780             .flags = CLK_SET_RATE_GATE,
1781         },
1782     },
1783 };
1784 
1785 static struct clk_branch pcie1_ref_src_clk = {
1786     .halt_reg = 0x2fdc,
1787     .halt_bit = 27,
1788     .clkr = {
1789         .enable_reg = 0x3aa0,
1790         .enable_mask = BIT(9),
1791         .hw.init = &(struct clk_init_data){
1792             .name = "pcie1_ref_src_clk",
1793             .parent_hws = (const struct clk_hw*[]){
1794                 &pcie1_ref_src.clkr.hw,
1795             },
1796             .num_parents = 1,
1797             .ops = &clk_branch_ops,
1798             .flags = CLK_SET_RATE_PARENT,
1799         },
1800     },
1801 };
1802 
1803 static struct clk_branch pcie1_a_clk = {
1804     .halt_reg = 0x2fc0,
1805     .halt_bit = 10,
1806     .clkr = {
1807         .enable_reg = 0x3a80,
1808         .enable_mask = BIT(4),
1809         .hw.init = &(struct clk_init_data){
1810             .name = "pcie1_a_clk",
1811             .ops = &clk_branch_ops,
1812         },
1813     },
1814 };
1815 
1816 static struct clk_branch pcie1_aux_clk = {
1817     .halt_reg = 0x2fdc,
1818     .halt_bit = 28,
1819     .clkr = {
1820         .enable_reg = 0x3a88,
1821         .enable_mask = BIT(4),
1822         .hw.init = &(struct clk_init_data){
1823             .name = "pcie1_aux_clk",
1824             .ops = &clk_branch_ops,
1825         },
1826     },
1827 };
1828 
1829 static struct clk_branch pcie1_h_clk = {
1830     .halt_reg = 0x2fd4,
1831     .halt_bit = 9,
1832     .clkr = {
1833         .enable_reg = 0x3a8c,
1834         .enable_mask = BIT(4),
1835         .hw.init = &(struct clk_init_data){
1836             .name = "pcie1_h_clk",
1837             .ops = &clk_branch_ops,
1838         },
1839     },
1840 };
1841 
1842 static struct clk_branch pcie1_phy_clk = {
1843     .halt_reg = 0x2fdc,
1844     .halt_bit = 26,
1845     .clkr = {
1846         .enable_reg = 0x3a90,
1847         .enable_mask = BIT(4),
1848         .hw.init = &(struct clk_init_data){
1849             .name = "pcie1_phy_clk",
1850             .ops = &clk_branch_ops,
1851         },
1852     },
1853 };
1854 
1855 static struct clk_rcg pcie2_ref_src = {
1856     .ns_reg = 0x3ae0,
1857     .p = {
1858         .pre_div_shift = 3,
1859         .pre_div_width = 4,
1860     },
1861     .s = {
1862         .src_sel_shift = 0,
1863         .parent_map = gcc_pxo_pll3_map,
1864     },
1865     .freq_tbl = clk_tbl_pcie_ref,
1866     .clkr = {
1867         .enable_reg = 0x3ae0,
1868         .enable_mask = BIT(11),
1869         .hw.init = &(struct clk_init_data){
1870             .name = "pcie2_ref_src",
1871             .parent_data = gcc_pxo_pll3,
1872             .num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1873             .ops = &clk_rcg_ops,
1874             .flags = CLK_SET_RATE_GATE,
1875         },
1876     },
1877 };
1878 
1879 static struct clk_branch pcie2_ref_src_clk = {
1880     .halt_reg = 0x2fdc,
1881     .halt_bit = 24,
1882     .clkr = {
1883         .enable_reg = 0x3ae0,
1884         .enable_mask = BIT(9),
1885         .hw.init = &(struct clk_init_data){
1886             .name = "pcie2_ref_src_clk",
1887             .parent_hws = (const struct clk_hw*[]){
1888                 &pcie2_ref_src.clkr.hw,
1889             },
1890             .num_parents = 1,
1891             .ops = &clk_branch_ops,
1892             .flags = CLK_SET_RATE_PARENT,
1893         },
1894     },
1895 };
1896 
1897 static struct clk_branch pcie2_a_clk = {
1898     .halt_reg = 0x2fc0,
1899     .halt_bit = 9,
1900     .clkr = {
1901         .enable_reg = 0x3ac0,
1902         .enable_mask = BIT(4),
1903         .hw.init = &(struct clk_init_data){
1904             .name = "pcie2_a_clk",
1905             .ops = &clk_branch_ops,
1906         },
1907     },
1908 };
1909 
1910 static struct clk_branch pcie2_aux_clk = {
1911     .halt_reg = 0x2fdc,
1912     .halt_bit = 25,
1913     .clkr = {
1914         .enable_reg = 0x3ac8,
1915         .enable_mask = BIT(4),
1916         .hw.init = &(struct clk_init_data){
1917             .name = "pcie2_aux_clk",
1918             .ops = &clk_branch_ops,
1919         },
1920     },
1921 };
1922 
1923 static struct clk_branch pcie2_h_clk = {
1924     .halt_reg = 0x2fd4,
1925     .halt_bit = 10,
1926     .clkr = {
1927         .enable_reg = 0x3acc,
1928         .enable_mask = BIT(4),
1929         .hw.init = &(struct clk_init_data){
1930             .name = "pcie2_h_clk",
1931             .ops = &clk_branch_ops,
1932         },
1933     },
1934 };
1935 
1936 static struct clk_branch pcie2_phy_clk = {
1937     .halt_reg = 0x2fdc,
1938     .halt_bit = 23,
1939     .clkr = {
1940         .enable_reg = 0x3ad0,
1941         .enable_mask = BIT(4),
1942         .hw.init = &(struct clk_init_data){
1943             .name = "pcie2_phy_clk",
1944             .ops = &clk_branch_ops,
1945         },
1946     },
1947 };
1948 
1949 static const struct freq_tbl clk_tbl_sata_ref[] = {
1950     { 100000000, P_PLL3,  12, 0, 0 },
1951     { }
1952 };
1953 
1954 static struct clk_rcg sata_ref_src = {
1955     .ns_reg = 0x2c08,
1956     .p = {
1957         .pre_div_shift = 3,
1958         .pre_div_width = 4,
1959     },
1960     .s = {
1961         .src_sel_shift = 0,
1962         .parent_map = gcc_pxo_pll3_sata_map,
1963     },
1964     .freq_tbl = clk_tbl_sata_ref,
1965     .clkr = {
1966         .enable_reg = 0x2c08,
1967         .enable_mask = BIT(7),
1968         .hw.init = &(struct clk_init_data){
1969             .name = "sata_ref_src",
1970             .parent_data = gcc_pxo_pll3,
1971             .num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1972             .ops = &clk_rcg_ops,
1973             .flags = CLK_SET_RATE_GATE,
1974         },
1975     },
1976 };
1977 
1978 static struct clk_branch sata_rxoob_clk = {
1979     .halt_reg = 0x2fdc,
1980     .halt_bit = 20,
1981     .clkr = {
1982         .enable_reg = 0x2c0c,
1983         .enable_mask = BIT(4),
1984         .hw.init = &(struct clk_init_data){
1985             .name = "sata_rxoob_clk",
1986             .parent_hws = (const struct clk_hw*[]){
1987                 &sata_ref_src.clkr.hw,
1988             },
1989             .num_parents = 1,
1990             .ops = &clk_branch_ops,
1991             .flags = CLK_SET_RATE_PARENT,
1992         },
1993     },
1994 };
1995 
1996 static struct clk_branch sata_pmalive_clk = {
1997     .halt_reg = 0x2fdc,
1998     .halt_bit = 19,
1999     .clkr = {
2000         .enable_reg = 0x2c10,
2001         .enable_mask = BIT(4),
2002         .hw.init = &(struct clk_init_data){
2003             .name = "sata_pmalive_clk",
2004             .parent_hws = (const struct clk_hw*[]){
2005                 &sata_ref_src.clkr.hw,
2006             },
2007             .num_parents = 1,
2008             .ops = &clk_branch_ops,
2009             .flags = CLK_SET_RATE_PARENT,
2010         },
2011     },
2012 };
2013 
2014 static struct clk_branch sata_phy_ref_clk = {
2015     .halt_reg = 0x2fdc,
2016     .halt_bit = 18,
2017     .clkr = {
2018         .enable_reg = 0x2c14,
2019         .enable_mask = BIT(4),
2020         .hw.init = &(struct clk_init_data){
2021             .name = "sata_phy_ref_clk",
2022             .parent_data = gcc_pxo,
2023             .num_parents = 1,
2024             .ops = &clk_branch_ops,
2025         },
2026     },
2027 };
2028 
2029 static struct clk_branch sata_a_clk = {
2030     .halt_reg = 0x2fc0,
2031     .halt_bit = 12,
2032     .clkr = {
2033         .enable_reg = 0x2c20,
2034         .enable_mask = BIT(4),
2035         .hw.init = &(struct clk_init_data){
2036             .name = "sata_a_clk",
2037             .ops = &clk_branch_ops,
2038         },
2039     },
2040 };
2041 
2042 static struct clk_branch sata_h_clk = {
2043     .halt_reg = 0x2fdc,
2044     .halt_bit = 21,
2045     .clkr = {
2046         .enable_reg = 0x2c00,
2047         .enable_mask = BIT(4),
2048         .hw.init = &(struct clk_init_data){
2049             .name = "sata_h_clk",
2050             .ops = &clk_branch_ops,
2051         },
2052     },
2053 };
2054 
2055 static struct clk_branch sfab_sata_s_h_clk = {
2056     .halt_reg = 0x2fc4,
2057     .halt_bit = 14,
2058     .clkr = {
2059         .enable_reg = 0x2480,
2060         .enable_mask = BIT(4),
2061         .hw.init = &(struct clk_init_data){
2062             .name = "sfab_sata_s_h_clk",
2063             .ops = &clk_branch_ops,
2064         },
2065     },
2066 };
2067 
2068 static struct clk_branch sata_phy_cfg_clk = {
2069     .halt_reg = 0x2fcc,
2070     .halt_bit = 14,
2071     .clkr = {
2072         .enable_reg = 0x2c40,
2073         .enable_mask = BIT(4),
2074         .hw.init = &(struct clk_init_data){
2075             .name = "sata_phy_cfg_clk",
2076             .ops = &clk_branch_ops,
2077         },
2078     },
2079 };
2080 
2081 static const struct freq_tbl clk_tbl_usb30_master[] = {
2082     { 125000000, P_PLL0,  1, 5, 32 },
2083     { }
2084 };
2085 
2086 static struct clk_rcg usb30_master_clk_src = {
2087     .ns_reg = 0x3b2c,
2088     .md_reg = 0x3b28,
2089     .mn = {
2090         .mnctr_en_bit = 8,
2091         .mnctr_reset_bit = 7,
2092         .mnctr_mode_shift = 5,
2093         .n_val_shift = 16,
2094         .m_val_shift = 16,
2095         .width = 8,
2096     },
2097     .p = {
2098         .pre_div_shift = 3,
2099         .pre_div_width = 2,
2100     },
2101     .s = {
2102         .src_sel_shift = 0,
2103         .parent_map = gcc_pxo_pll8_pll0_map,
2104     },
2105     .freq_tbl = clk_tbl_usb30_master,
2106     .clkr = {
2107         .enable_reg = 0x3b2c,
2108         .enable_mask = BIT(11),
2109         .hw.init = &(struct clk_init_data){
2110             .name = "usb30_master_ref_src",
2111             .parent_data = gcc_pxo_pll8_pll0,
2112             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2113             .ops = &clk_rcg_ops,
2114             .flags = CLK_SET_RATE_GATE,
2115         },
2116     },
2117 };
2118 
2119 static struct clk_branch usb30_0_branch_clk = {
2120     .halt_reg = 0x2fc4,
2121     .halt_bit = 22,
2122     .clkr = {
2123         .enable_reg = 0x3b24,
2124         .enable_mask = BIT(4),
2125         .hw.init = &(struct clk_init_data){
2126             .name = "usb30_0_branch_clk",
2127             .parent_hws = (const struct clk_hw*[]){
2128                 &usb30_master_clk_src.clkr.hw,
2129             },
2130             .num_parents = 1,
2131             .ops = &clk_branch_ops,
2132             .flags = CLK_SET_RATE_PARENT,
2133         },
2134     },
2135 };
2136 
2137 static struct clk_branch usb30_1_branch_clk = {
2138     .halt_reg = 0x2fc4,
2139     .halt_bit = 17,
2140     .clkr = {
2141         .enable_reg = 0x3b34,
2142         .enable_mask = BIT(4),
2143         .hw.init = &(struct clk_init_data){
2144             .name = "usb30_1_branch_clk",
2145             .parent_hws = (const struct clk_hw*[]){
2146                 &usb30_master_clk_src.clkr.hw,
2147             },
2148             .num_parents = 1,
2149             .ops = &clk_branch_ops,
2150             .flags = CLK_SET_RATE_PARENT,
2151         },
2152     },
2153 };
2154 
2155 static const struct freq_tbl clk_tbl_usb30_utmi[] = {
2156     { 60000000, P_PLL8,  1, 5, 32 },
2157     { }
2158 };
2159 
2160 static struct clk_rcg usb30_utmi_clk = {
2161     .ns_reg = 0x3b44,
2162     .md_reg = 0x3b40,
2163     .mn = {
2164         .mnctr_en_bit = 8,
2165         .mnctr_reset_bit = 7,
2166         .mnctr_mode_shift = 5,
2167         .n_val_shift = 16,
2168         .m_val_shift = 16,
2169         .width = 8,
2170     },
2171     .p = {
2172         .pre_div_shift = 3,
2173         .pre_div_width = 2,
2174     },
2175     .s = {
2176         .src_sel_shift = 0,
2177         .parent_map = gcc_pxo_pll8_pll0_map,
2178     },
2179     .freq_tbl = clk_tbl_usb30_utmi,
2180     .clkr = {
2181         .enable_reg = 0x3b44,
2182         .enable_mask = BIT(11),
2183         .hw.init = &(struct clk_init_data){
2184             .name = "usb30_utmi_clk",
2185             .parent_data = gcc_pxo_pll8_pll0,
2186             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2187             .ops = &clk_rcg_ops,
2188             .flags = CLK_SET_RATE_GATE,
2189         },
2190     },
2191 };
2192 
2193 static struct clk_branch usb30_0_utmi_clk_ctl = {
2194     .halt_reg = 0x2fc4,
2195     .halt_bit = 21,
2196     .clkr = {
2197         .enable_reg = 0x3b48,
2198         .enable_mask = BIT(4),
2199         .hw.init = &(struct clk_init_data){
2200             .name = "usb30_0_utmi_clk_ctl",
2201             .parent_hws = (const struct clk_hw*[]){
2202                 &usb30_utmi_clk.clkr.hw,
2203             },
2204             .num_parents = 1,
2205             .ops = &clk_branch_ops,
2206             .flags = CLK_SET_RATE_PARENT,
2207         },
2208     },
2209 };
2210 
2211 static struct clk_branch usb30_1_utmi_clk_ctl = {
2212     .halt_reg = 0x2fc4,
2213     .halt_bit = 15,
2214     .clkr = {
2215         .enable_reg = 0x3b4c,
2216         .enable_mask = BIT(4),
2217         .hw.init = &(struct clk_init_data){
2218             .name = "usb30_1_utmi_clk_ctl",
2219             .parent_hws = (const struct clk_hw*[]){
2220                 &usb30_utmi_clk.clkr.hw,
2221             },
2222             .num_parents = 1,
2223             .ops = &clk_branch_ops,
2224             .flags = CLK_SET_RATE_PARENT,
2225         },
2226     },
2227 };
2228 
2229 static const struct freq_tbl clk_tbl_usb[] = {
2230     { 60000000, P_PLL8,  1, 5, 32 },
2231     { }
2232 };
2233 
2234 static struct clk_rcg usb_hs1_xcvr_clk_src = {
2235     .ns_reg = 0x290C,
2236     .md_reg = 0x2908,
2237     .mn = {
2238         .mnctr_en_bit = 8,
2239         .mnctr_reset_bit = 7,
2240         .mnctr_mode_shift = 5,
2241         .n_val_shift = 16,
2242         .m_val_shift = 16,
2243         .width = 8,
2244     },
2245     .p = {
2246         .pre_div_shift = 3,
2247         .pre_div_width = 2,
2248     },
2249     .s = {
2250         .src_sel_shift = 0,
2251         .parent_map = gcc_pxo_pll8_pll0_map,
2252     },
2253     .freq_tbl = clk_tbl_usb,
2254     .clkr = {
2255         .enable_reg = 0x2968,
2256         .enable_mask = BIT(11),
2257         .hw.init = &(struct clk_init_data){
2258             .name = "usb_hs1_xcvr_src",
2259             .parent_data = gcc_pxo_pll8_pll0,
2260             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2261             .ops = &clk_rcg_ops,
2262             .flags = CLK_SET_RATE_GATE,
2263         },
2264     },
2265 };
2266 
2267 static struct clk_branch usb_hs1_xcvr_clk = {
2268     .halt_reg = 0x2fcc,
2269     .halt_bit = 17,
2270     .clkr = {
2271         .enable_reg = 0x290c,
2272         .enable_mask = BIT(9),
2273         .hw.init = &(struct clk_init_data){
2274             .name = "usb_hs1_xcvr_clk",
2275             .parent_hws = (const struct clk_hw*[]){
2276                 &usb_hs1_xcvr_clk_src.clkr.hw,
2277             },
2278             .num_parents = 1,
2279             .ops = &clk_branch_ops,
2280             .flags = CLK_SET_RATE_PARENT,
2281         },
2282     },
2283 };
2284 
2285 static struct clk_branch usb_hs1_h_clk = {
2286     .hwcg_reg = 0x2900,
2287     .hwcg_bit = 6,
2288     .halt_reg = 0x2fc8,
2289     .halt_bit = 1,
2290     .clkr = {
2291         .enable_reg = 0x2900,
2292         .enable_mask = BIT(4),
2293         .hw.init = &(struct clk_init_data){
2294             .name = "usb_hs1_h_clk",
2295             .ops = &clk_branch_ops,
2296         },
2297     },
2298 };
2299 
2300 static struct clk_rcg usb_fs1_xcvr_clk_src = {
2301     .ns_reg = 0x2968,
2302     .md_reg = 0x2964,
2303     .mn = {
2304         .mnctr_en_bit = 8,
2305         .mnctr_reset_bit = 7,
2306         .mnctr_mode_shift = 5,
2307         .n_val_shift = 16,
2308         .m_val_shift = 16,
2309         .width = 8,
2310     },
2311     .p = {
2312         .pre_div_shift = 3,
2313         .pre_div_width = 2,
2314     },
2315     .s = {
2316         .src_sel_shift = 0,
2317         .parent_map = gcc_pxo_pll8_pll0_map,
2318     },
2319     .freq_tbl = clk_tbl_usb,
2320     .clkr = {
2321         .enable_reg = 0x2968,
2322         .enable_mask = BIT(11),
2323         .hw.init = &(struct clk_init_data){
2324             .name = "usb_fs1_xcvr_src",
2325             .parent_data = gcc_pxo_pll8_pll0,
2326             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2327             .ops = &clk_rcg_ops,
2328             .flags = CLK_SET_RATE_GATE,
2329         },
2330     },
2331 };
2332 
2333 static struct clk_branch usb_fs1_xcvr_clk = {
2334     .halt_reg = 0x2fcc,
2335     .halt_bit = 17,
2336     .clkr = {
2337         .enable_reg = 0x2968,
2338         .enable_mask = BIT(9),
2339         .hw.init = &(struct clk_init_data){
2340             .name = "usb_fs1_xcvr_clk",
2341             .parent_hws = (const struct clk_hw*[]){
2342                 &usb_fs1_xcvr_clk_src.clkr.hw,
2343             },
2344             .num_parents = 1,
2345             .ops = &clk_branch_ops,
2346             .flags = CLK_SET_RATE_PARENT,
2347         },
2348     },
2349 };
2350 
2351 static struct clk_branch usb_fs1_sys_clk = {
2352     .halt_reg = 0x2fcc,
2353     .halt_bit = 18,
2354     .clkr = {
2355         .enable_reg = 0x296c,
2356         .enable_mask = BIT(4),
2357         .hw.init = &(struct clk_init_data){
2358             .name = "usb_fs1_sys_clk",
2359             .parent_hws = (const struct clk_hw*[]){
2360                 &usb_fs1_xcvr_clk_src.clkr.hw,
2361             },
2362             .num_parents = 1,
2363             .ops = &clk_branch_ops,
2364             .flags = CLK_SET_RATE_PARENT,
2365         },
2366     },
2367 };
2368 
2369 static struct clk_branch usb_fs1_h_clk = {
2370     .halt_reg = 0x2fcc,
2371     .halt_bit = 19,
2372     .clkr = {
2373         .enable_reg = 0x2960,
2374         .enable_mask = BIT(4),
2375         .hw.init = &(struct clk_init_data){
2376             .name = "usb_fs1_h_clk",
2377             .ops = &clk_branch_ops,
2378         },
2379     },
2380 };
2381 
2382 static struct clk_branch ebi2_clk = {
2383     .hwcg_reg = 0x3b00,
2384     .hwcg_bit = 6,
2385     .halt_reg = 0x2fcc,
2386     .halt_bit = 1,
2387     .clkr = {
2388         .enable_reg = 0x3b00,
2389         .enable_mask = BIT(4),
2390         .hw.init = &(struct clk_init_data){
2391             .name = "ebi2_clk",
2392             .ops = &clk_branch_ops,
2393         },
2394     },
2395 };
2396 
2397 static struct clk_branch ebi2_aon_clk = {
2398     .halt_reg = 0x2fcc,
2399     .halt_bit = 0,
2400     .clkr = {
2401         .enable_reg = 0x3b00,
2402         .enable_mask = BIT(8),
2403         .hw.init = &(struct clk_init_data){
2404             .name = "ebi2_always_on_clk",
2405             .ops = &clk_branch_ops,
2406         },
2407     },
2408 };
2409 
2410 static const struct freq_tbl clk_tbl_gmac[] = {
2411     { 133000000, P_PLL0, 1,  50, 301 },
2412     { 266000000, P_PLL0, 1, 127, 382 },
2413     { }
2414 };
2415 
2416 static struct clk_dyn_rcg gmac_core1_src = {
2417     .ns_reg[0] = 0x3cac,
2418     .ns_reg[1] = 0x3cb0,
2419     .md_reg[0] = 0x3ca4,
2420     .md_reg[1] = 0x3ca8,
2421     .bank_reg = 0x3ca0,
2422     .mn[0] = {
2423         .mnctr_en_bit = 8,
2424         .mnctr_reset_bit = 7,
2425         .mnctr_mode_shift = 5,
2426         .n_val_shift = 16,
2427         .m_val_shift = 16,
2428         .width = 8,
2429     },
2430     .mn[1] = {
2431         .mnctr_en_bit = 8,
2432         .mnctr_reset_bit = 7,
2433         .mnctr_mode_shift = 5,
2434         .n_val_shift = 16,
2435         .m_val_shift = 16,
2436         .width = 8,
2437     },
2438     .s[0] = {
2439         .src_sel_shift = 0,
2440         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2441     },
2442     .s[1] = {
2443         .src_sel_shift = 0,
2444         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2445     },
2446     .p[0] = {
2447         .pre_div_shift = 3,
2448         .pre_div_width = 2,
2449     },
2450     .p[1] = {
2451         .pre_div_shift = 3,
2452         .pre_div_width = 2,
2453     },
2454     .mux_sel_bit = 0,
2455     .freq_tbl = clk_tbl_gmac,
2456     .clkr = {
2457         .enable_reg = 0x3ca0,
2458         .enable_mask = BIT(1),
2459         .hw.init = &(struct clk_init_data){
2460             .name = "gmac_core1_src",
2461             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2462             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2463             .ops = &clk_dyn_rcg_ops,
2464         },
2465     },
2466 };
2467 
2468 static struct clk_branch gmac_core1_clk = {
2469     .halt_reg = 0x3c20,
2470     .halt_bit = 4,
2471     .hwcg_reg = 0x3cb4,
2472     .hwcg_bit = 6,
2473     .clkr = {
2474         .enable_reg = 0x3cb4,
2475         .enable_mask = BIT(4),
2476         .hw.init = &(struct clk_init_data){
2477             .name = "gmac_core1_clk",
2478             .parent_hws = (const struct clk_hw*[]){
2479                 &gmac_core1_src.clkr.hw,
2480             },
2481             .num_parents = 1,
2482             .ops = &clk_branch_ops,
2483             .flags = CLK_SET_RATE_PARENT,
2484         },
2485     },
2486 };
2487 
2488 static struct clk_dyn_rcg gmac_core2_src = {
2489     .ns_reg[0] = 0x3ccc,
2490     .ns_reg[1] = 0x3cd0,
2491     .md_reg[0] = 0x3cc4,
2492     .md_reg[1] = 0x3cc8,
2493     .bank_reg = 0x3ca0,
2494     .mn[0] = {
2495         .mnctr_en_bit = 8,
2496         .mnctr_reset_bit = 7,
2497         .mnctr_mode_shift = 5,
2498         .n_val_shift = 16,
2499         .m_val_shift = 16,
2500         .width = 8,
2501     },
2502     .mn[1] = {
2503         .mnctr_en_bit = 8,
2504         .mnctr_reset_bit = 7,
2505         .mnctr_mode_shift = 5,
2506         .n_val_shift = 16,
2507         .m_val_shift = 16,
2508         .width = 8,
2509     },
2510     .s[0] = {
2511         .src_sel_shift = 0,
2512         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2513     },
2514     .s[1] = {
2515         .src_sel_shift = 0,
2516         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2517     },
2518     .p[0] = {
2519         .pre_div_shift = 3,
2520         .pre_div_width = 2,
2521     },
2522     .p[1] = {
2523         .pre_div_shift = 3,
2524         .pre_div_width = 2,
2525     },
2526     .mux_sel_bit = 0,
2527     .freq_tbl = clk_tbl_gmac,
2528     .clkr = {
2529         .enable_reg = 0x3cc0,
2530         .enable_mask = BIT(1),
2531         .hw.init = &(struct clk_init_data){
2532             .name = "gmac_core2_src",
2533             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2534             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2535             .ops = &clk_dyn_rcg_ops,
2536         },
2537     },
2538 };
2539 
2540 static struct clk_branch gmac_core2_clk = {
2541     .halt_reg = 0x3c20,
2542     .halt_bit = 5,
2543     .hwcg_reg = 0x3cd4,
2544     .hwcg_bit = 6,
2545     .clkr = {
2546         .enable_reg = 0x3cd4,
2547         .enable_mask = BIT(4),
2548         .hw.init = &(struct clk_init_data){
2549             .name = "gmac_core2_clk",
2550             .parent_hws = (const struct clk_hw*[]){
2551                 &gmac_core2_src.clkr.hw,
2552             },
2553             .num_parents = 1,
2554             .ops = &clk_branch_ops,
2555             .flags = CLK_SET_RATE_PARENT,
2556         },
2557     },
2558 };
2559 
2560 static struct clk_dyn_rcg gmac_core3_src = {
2561     .ns_reg[0] = 0x3cec,
2562     .ns_reg[1] = 0x3cf0,
2563     .md_reg[0] = 0x3ce4,
2564     .md_reg[1] = 0x3ce8,
2565     .bank_reg = 0x3ce0,
2566     .mn[0] = {
2567         .mnctr_en_bit = 8,
2568         .mnctr_reset_bit = 7,
2569         .mnctr_mode_shift = 5,
2570         .n_val_shift = 16,
2571         .m_val_shift = 16,
2572         .width = 8,
2573     },
2574     .mn[1] = {
2575         .mnctr_en_bit = 8,
2576         .mnctr_reset_bit = 7,
2577         .mnctr_mode_shift = 5,
2578         .n_val_shift = 16,
2579         .m_val_shift = 16,
2580         .width = 8,
2581     },
2582     .s[0] = {
2583         .src_sel_shift = 0,
2584         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2585     },
2586     .s[1] = {
2587         .src_sel_shift = 0,
2588         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2589     },
2590     .p[0] = {
2591         .pre_div_shift = 3,
2592         .pre_div_width = 2,
2593     },
2594     .p[1] = {
2595         .pre_div_shift = 3,
2596         .pre_div_width = 2,
2597     },
2598     .mux_sel_bit = 0,
2599     .freq_tbl = clk_tbl_gmac,
2600     .clkr = {
2601         .enable_reg = 0x3ce0,
2602         .enable_mask = BIT(1),
2603         .hw.init = &(struct clk_init_data){
2604             .name = "gmac_core3_src",
2605             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2606             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2607             .ops = &clk_dyn_rcg_ops,
2608         },
2609     },
2610 };
2611 
2612 static struct clk_branch gmac_core3_clk = {
2613     .halt_reg = 0x3c20,
2614     .halt_bit = 6,
2615     .hwcg_reg = 0x3cf4,
2616     .hwcg_bit = 6,
2617     .clkr = {
2618         .enable_reg = 0x3cf4,
2619         .enable_mask = BIT(4),
2620         .hw.init = &(struct clk_init_data){
2621             .name = "gmac_core3_clk",
2622             .parent_hws = (const struct clk_hw*[]){
2623                 &gmac_core3_src.clkr.hw,
2624             },
2625             .num_parents = 1,
2626             .ops = &clk_branch_ops,
2627             .flags = CLK_SET_RATE_PARENT,
2628         },
2629     },
2630 };
2631 
2632 static struct clk_dyn_rcg gmac_core4_src = {
2633     .ns_reg[0] = 0x3d0c,
2634     .ns_reg[1] = 0x3d10,
2635     .md_reg[0] = 0x3d04,
2636     .md_reg[1] = 0x3d08,
2637     .bank_reg = 0x3d00,
2638     .mn[0] = {
2639         .mnctr_en_bit = 8,
2640         .mnctr_reset_bit = 7,
2641         .mnctr_mode_shift = 5,
2642         .n_val_shift = 16,
2643         .m_val_shift = 16,
2644         .width = 8,
2645     },
2646     .mn[1] = {
2647         .mnctr_en_bit = 8,
2648         .mnctr_reset_bit = 7,
2649         .mnctr_mode_shift = 5,
2650         .n_val_shift = 16,
2651         .m_val_shift = 16,
2652         .width = 8,
2653     },
2654     .s[0] = {
2655         .src_sel_shift = 0,
2656         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2657     },
2658     .s[1] = {
2659         .src_sel_shift = 0,
2660         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2661     },
2662     .p[0] = {
2663         .pre_div_shift = 3,
2664         .pre_div_width = 2,
2665     },
2666     .p[1] = {
2667         .pre_div_shift = 3,
2668         .pre_div_width = 2,
2669     },
2670     .mux_sel_bit = 0,
2671     .freq_tbl = clk_tbl_gmac,
2672     .clkr = {
2673         .enable_reg = 0x3d00,
2674         .enable_mask = BIT(1),
2675         .hw.init = &(struct clk_init_data){
2676             .name = "gmac_core4_src",
2677             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2678             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2679             .ops = &clk_dyn_rcg_ops,
2680         },
2681     },
2682 };
2683 
2684 static struct clk_branch gmac_core4_clk = {
2685     .halt_reg = 0x3c20,
2686     .halt_bit = 7,
2687     .hwcg_reg = 0x3d14,
2688     .hwcg_bit = 6,
2689     .clkr = {
2690         .enable_reg = 0x3d14,
2691         .enable_mask = BIT(4),
2692         .hw.init = &(struct clk_init_data){
2693             .name = "gmac_core4_clk",
2694             .parent_hws = (const struct clk_hw*[]){
2695                 &gmac_core4_src.clkr.hw,
2696             },
2697             .num_parents = 1,
2698             .ops = &clk_branch_ops,
2699             .flags = CLK_SET_RATE_PARENT,
2700         },
2701     },
2702 };
2703 
2704 static const struct freq_tbl clk_tbl_nss_tcm[] = {
2705     { 266000000, P_PLL0, 3, 0, 0 },
2706     { 400000000, P_PLL0, 2, 0, 0 },
2707     { }
2708 };
2709 
2710 static struct clk_dyn_rcg nss_tcm_src = {
2711     .ns_reg[0] = 0x3dc4,
2712     .ns_reg[1] = 0x3dc8,
2713     .bank_reg = 0x3dc0,
2714     .s[0] = {
2715         .src_sel_shift = 0,
2716         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2717     },
2718     .s[1] = {
2719         .src_sel_shift = 0,
2720         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2721     },
2722     .p[0] = {
2723         .pre_div_shift = 3,
2724         .pre_div_width = 4,
2725     },
2726     .p[1] = {
2727         .pre_div_shift = 3,
2728         .pre_div_width = 4,
2729     },
2730     .mux_sel_bit = 0,
2731     .freq_tbl = clk_tbl_nss_tcm,
2732     .clkr = {
2733         .enable_reg = 0x3dc0,
2734         .enable_mask = BIT(1),
2735         .hw.init = &(struct clk_init_data){
2736             .name = "nss_tcm_src",
2737             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2738             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2739             .ops = &clk_dyn_rcg_ops,
2740         },
2741     },
2742 };
2743 
2744 static struct clk_branch nss_tcm_clk = {
2745     .halt_reg = 0x3c20,
2746     .halt_bit = 14,
2747     .clkr = {
2748         .enable_reg = 0x3dd0,
2749         .enable_mask = BIT(6) | BIT(4),
2750         .hw.init = &(struct clk_init_data){
2751             .name = "nss_tcm_clk",
2752             .parent_hws = (const struct clk_hw*[]){
2753                 &nss_tcm_src.clkr.hw,
2754             },
2755             .num_parents = 1,
2756             .ops = &clk_branch_ops,
2757             .flags = CLK_SET_RATE_PARENT,
2758         },
2759     },
2760 };
2761 
2762 static const struct freq_tbl clk_tbl_nss_ipq8064[] = {
2763     { 110000000, P_PLL18, 1, 1, 5 },
2764     { 275000000, P_PLL18, 2, 0, 0 },
2765     { 550000000, P_PLL18, 1, 0, 0 },
2766     { 733000000, P_PLL18, 1, 0, 0 },
2767     { }
2768 };
2769 
2770 static const struct freq_tbl clk_tbl_nss_ipq8065[] = {
2771     { 110000000, P_PLL18, 1, 1, 5 },
2772     { 275000000, P_PLL18, 2, 0, 0 },
2773     { 600000000, P_PLL18, 1, 0, 0 },
2774     { 800000000, P_PLL18, 1, 0, 0 },
2775     { }
2776 };
2777 
2778 static struct clk_dyn_rcg ubi32_core1_src_clk = {
2779     .ns_reg[0] = 0x3d2c,
2780     .ns_reg[1] = 0x3d30,
2781     .md_reg[0] = 0x3d24,
2782     .md_reg[1] = 0x3d28,
2783     .bank_reg = 0x3d20,
2784     .mn[0] = {
2785         .mnctr_en_bit = 8,
2786         .mnctr_reset_bit = 7,
2787         .mnctr_mode_shift = 5,
2788         .n_val_shift = 16,
2789         .m_val_shift = 16,
2790         .width = 8,
2791     },
2792     .mn[1] = {
2793         .mnctr_en_bit = 8,
2794         .mnctr_reset_bit = 7,
2795         .mnctr_mode_shift = 5,
2796         .n_val_shift = 16,
2797         .m_val_shift = 16,
2798         .width = 8,
2799     },
2800     .s[0] = {
2801         .src_sel_shift = 0,
2802         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2803     },
2804     .s[1] = {
2805         .src_sel_shift = 0,
2806         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2807     },
2808     .p[0] = {
2809         .pre_div_shift = 3,
2810         .pre_div_width = 2,
2811     },
2812     .p[1] = {
2813         .pre_div_shift = 3,
2814         .pre_div_width = 2,
2815     },
2816     .mux_sel_bit = 0,
2817     /* nss freq table is selected based on the SoC compatible */
2818     .clkr = {
2819         .enable_reg = 0x3d20,
2820         .enable_mask = BIT(1),
2821         .hw.init = &(struct clk_init_data){
2822             .name = "ubi32_core1_src_clk",
2823             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2824             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2825             .ops = &clk_dyn_rcg_ops,
2826             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2827         },
2828     },
2829 };
2830 
2831 static struct clk_dyn_rcg ubi32_core2_src_clk = {
2832     .ns_reg[0] = 0x3d4c,
2833     .ns_reg[1] = 0x3d50,
2834     .md_reg[0] = 0x3d44,
2835     .md_reg[1] = 0x3d48,
2836     .bank_reg = 0x3d40,
2837     .mn[0] = {
2838         .mnctr_en_bit = 8,
2839         .mnctr_reset_bit = 7,
2840         .mnctr_mode_shift = 5,
2841         .n_val_shift = 16,
2842         .m_val_shift = 16,
2843         .width = 8,
2844     },
2845     .mn[1] = {
2846         .mnctr_en_bit = 8,
2847         .mnctr_reset_bit = 7,
2848         .mnctr_mode_shift = 5,
2849         .n_val_shift = 16,
2850         .m_val_shift = 16,
2851         .width = 8,
2852     },
2853     .s[0] = {
2854         .src_sel_shift = 0,
2855         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2856     },
2857     .s[1] = {
2858         .src_sel_shift = 0,
2859         .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2860     },
2861     .p[0] = {
2862         .pre_div_shift = 3,
2863         .pre_div_width = 2,
2864     },
2865     .p[1] = {
2866         .pre_div_shift = 3,
2867         .pre_div_width = 2,
2868     },
2869     .mux_sel_bit = 0,
2870     /* nss freq table is selected based on the SoC compatible */
2871     .clkr = {
2872         .enable_reg = 0x3d40,
2873         .enable_mask = BIT(1),
2874         .hw.init = &(struct clk_init_data){
2875             .name = "ubi32_core2_src_clk",
2876             .parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2877             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2878             .ops = &clk_dyn_rcg_ops,
2879             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2880         },
2881     },
2882 };
2883 
2884 static const struct freq_tbl clk_tbl_ce5_core[] = {
2885     { 150000000, P_PLL3, 8, 1, 1 },
2886     { 213200000, P_PLL11, 5, 1, 1 },
2887     { }
2888 };
2889 
2890 static struct clk_dyn_rcg ce5_core_src = {
2891     .ns_reg[0] = 0x36C4,
2892     .ns_reg[1] = 0x36C8,
2893     .bank_reg = 0x36C0,
2894     .s[0] = {
2895         .src_sel_shift = 0,
2896         .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
2897     },
2898     .s[1] = {
2899         .src_sel_shift = 0,
2900         .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
2901     },
2902     .p[0] = {
2903         .pre_div_shift = 3,
2904         .pre_div_width = 4,
2905     },
2906     .p[1] = {
2907         .pre_div_shift = 3,
2908         .pre_div_width = 4,
2909     },
2910     .mux_sel_bit = 0,
2911     .freq_tbl = clk_tbl_ce5_core,
2912     .clkr = {
2913         .enable_reg = 0x36C0,
2914         .enable_mask = BIT(1),
2915         .hw.init = &(struct clk_init_data){
2916             .name = "ce5_core_src",
2917             .parent_data = gcc_pxo_pll3_pll0_pll14_pll18_pll11,
2918             .num_parents = ARRAY_SIZE(gcc_pxo_pll3_pll0_pll14_pll18_pll11),
2919             .ops = &clk_dyn_rcg_ops,
2920         },
2921     },
2922 };
2923 
2924 static struct clk_branch ce5_core_clk = {
2925     .halt_reg = 0x2FDC,
2926     .halt_bit = 5,
2927     .hwcg_reg = 0x36CC,
2928     .hwcg_bit = 6,
2929     .clkr = {
2930         .enable_reg = 0x36CC,
2931         .enable_mask = BIT(4),
2932         .hw.init = &(struct clk_init_data){
2933             .name = "ce5_core_clk",
2934             .parent_hws = (const struct clk_hw*[]){
2935                 &ce5_core_src.clkr.hw,
2936             },
2937             .num_parents = 1,
2938             .ops = &clk_branch_ops,
2939             .flags = CLK_SET_RATE_PARENT,
2940         },
2941     },
2942 };
2943 
2944 static const struct freq_tbl clk_tbl_ce5_a_clk[] = {
2945     { 160000000, P_PLL0, 5, 1, 1 },
2946     { 213200000, P_PLL11, 5, 1, 1 },
2947     { }
2948 };
2949 
2950 static struct clk_dyn_rcg ce5_a_clk_src = {
2951     .ns_reg[0] = 0x3d84,
2952     .ns_reg[1] = 0x3d88,
2953     .bank_reg = 0x3d80,
2954     .s[0] = {
2955         .src_sel_shift = 0,
2956         .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
2957     },
2958     .s[1] = {
2959         .src_sel_shift = 0,
2960         .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
2961     },
2962     .p[0] = {
2963         .pre_div_shift = 3,
2964         .pre_div_width = 4,
2965     },
2966     .p[1] = {
2967         .pre_div_shift = 3,
2968         .pre_div_width = 4,
2969     },
2970     .mux_sel_bit = 0,
2971     .freq_tbl = clk_tbl_ce5_a_clk,
2972     .clkr = {
2973         .enable_reg = 0x3d80,
2974         .enable_mask = BIT(1),
2975         .hw.init = &(struct clk_init_data){
2976             .name = "ce5_a_clk_src",
2977             .parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
2978             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11),
2979             .ops = &clk_dyn_rcg_ops,
2980         },
2981     },
2982 };
2983 
2984 static struct clk_branch ce5_a_clk = {
2985     .halt_reg = 0x3c20,
2986     .halt_bit = 12,
2987     .hwcg_reg = 0x3d8c,
2988     .hwcg_bit = 6,
2989     .clkr = {
2990         .enable_reg = 0x3d8c,
2991         .enable_mask = BIT(4),
2992         .hw.init = &(struct clk_init_data){
2993             .name = "ce5_a_clk",
2994             .parent_hws = (const struct clk_hw*[]){
2995                 &ce5_a_clk_src.clkr.hw,
2996             },
2997             .num_parents = 1,
2998             .ops = &clk_branch_ops,
2999             .flags = CLK_SET_RATE_PARENT,
3000         },
3001     },
3002 };
3003 
3004 static const struct freq_tbl clk_tbl_ce5_h_clk[] = {
3005     { 160000000, P_PLL0, 5, 1, 1 },
3006     { 213200000, P_PLL11, 5, 1, 1 },
3007     { }
3008 };
3009 
3010 static struct clk_dyn_rcg ce5_h_clk_src = {
3011     .ns_reg[0] = 0x3c64,
3012     .ns_reg[1] = 0x3c68,
3013     .bank_reg = 0x3c60,
3014     .s[0] = {
3015         .src_sel_shift = 0,
3016         .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
3017     },
3018     .s[1] = {
3019         .src_sel_shift = 0,
3020         .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
3021     },
3022     .p[0] = {
3023         .pre_div_shift = 3,
3024         .pre_div_width = 4,
3025     },
3026     .p[1] = {
3027         .pre_div_shift = 3,
3028         .pre_div_width = 4,
3029     },
3030     .mux_sel_bit = 0,
3031     .freq_tbl = clk_tbl_ce5_h_clk,
3032     .clkr = {
3033         .enable_reg = 0x3c60,
3034         .enable_mask = BIT(1),
3035         .hw.init = &(struct clk_init_data){
3036             .name = "ce5_h_clk_src",
3037             .parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
3038             .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11),
3039             .ops = &clk_dyn_rcg_ops,
3040         },
3041     },
3042 };
3043 
3044 static struct clk_branch ce5_h_clk = {
3045     .halt_reg = 0x3c20,
3046     .halt_bit = 11,
3047     .hwcg_reg = 0x3c6c,
3048     .hwcg_bit = 6,
3049     .clkr = {
3050         .enable_reg = 0x3c6c,
3051         .enable_mask = BIT(4),
3052         .hw.init = &(struct clk_init_data){
3053             .name = "ce5_h_clk",
3054             .parent_hws = (const struct clk_hw*[]){
3055                 &ce5_h_clk_src.clkr.hw,
3056             },
3057             .num_parents = 1,
3058             .ops = &clk_branch_ops,
3059             .flags = CLK_SET_RATE_PARENT,
3060         },
3061     },
3062 };
3063 
3064 static struct clk_regmap *gcc_ipq806x_clks[] = {
3065     [PLL0] = &pll0.clkr,
3066     [PLL0_VOTE] = &pll0_vote,
3067     [PLL3] = &pll3.clkr,
3068     [PLL4_VOTE] = &pll4_vote,
3069     [PLL8] = &pll8.clkr,
3070     [PLL8_VOTE] = &pll8_vote,
3071     [PLL11] = &pll11.clkr,
3072     [PLL14] = &pll14.clkr,
3073     [PLL14_VOTE] = &pll14_vote,
3074     [PLL18] = &pll18.clkr,
3075     [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
3076     [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
3077     [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
3078     [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
3079     [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
3080     [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
3081     [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
3082     [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
3083     [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
3084     [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
3085     [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
3086     [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
3087     [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
3088     [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
3089     [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
3090     [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
3091     [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
3092     [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
3093     [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
3094     [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
3095     [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
3096     [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
3097     [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
3098     [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
3099     [GP0_SRC] = &gp0_src.clkr,
3100     [GP0_CLK] = &gp0_clk.clkr,
3101     [GP1_SRC] = &gp1_src.clkr,
3102     [GP1_CLK] = &gp1_clk.clkr,
3103     [GP2_SRC] = &gp2_src.clkr,
3104     [GP2_CLK] = &gp2_clk.clkr,
3105     [PMEM_A_CLK] = &pmem_clk.clkr,
3106     [PRNG_SRC] = &prng_src.clkr,
3107     [PRNG_CLK] = &prng_clk.clkr,
3108     [SDC1_SRC] = &sdc1_src.clkr,
3109     [SDC1_CLK] = &sdc1_clk.clkr,
3110     [SDC3_SRC] = &sdc3_src.clkr,
3111     [SDC3_CLK] = &sdc3_clk.clkr,
3112     [TSIF_REF_SRC] = &tsif_ref_src.clkr,
3113     [TSIF_REF_CLK] = &tsif_ref_clk.clkr,
3114     [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
3115     [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
3116     [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
3117     [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
3118     [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
3119     [GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
3120     [GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
3121     [TSIF_H_CLK] = &tsif_h_clk.clkr,
3122     [SDC1_H_CLK] = &sdc1_h_clk.clkr,
3123     [SDC3_H_CLK] = &sdc3_h_clk.clkr,
3124     [ADM0_CLK] = &adm0_clk.clkr,
3125     [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
3126     [PCIE_A_CLK] = &pcie_a_clk.clkr,
3127     [PCIE_AUX_CLK] = &pcie_aux_clk.clkr,
3128     [PCIE_H_CLK] = &pcie_h_clk.clkr,
3129     [PCIE_PHY_CLK] = &pcie_phy_clk.clkr,
3130     [SFAB_SATA_S_H_CLK] = &sfab_sata_s_h_clk.clkr,
3131     [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
3132     [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
3133     [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
3134     [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
3135     [SATA_H_CLK] = &sata_h_clk.clkr,
3136     [SATA_CLK_SRC] = &sata_ref_src.clkr,
3137     [SATA_RXOOB_CLK] = &sata_rxoob_clk.clkr,
3138     [SATA_PMALIVE_CLK] = &sata_pmalive_clk.clkr,
3139     [SATA_PHY_REF_CLK] = &sata_phy_ref_clk.clkr,
3140     [SATA_A_CLK] = &sata_a_clk.clkr,
3141     [SATA_PHY_CFG_CLK] = &sata_phy_cfg_clk.clkr,
3142     [PCIE_ALT_REF_SRC] = &pcie_ref_src.clkr,
3143     [PCIE_ALT_REF_CLK] = &pcie_ref_src_clk.clkr,
3144     [PCIE_1_A_CLK] = &pcie1_a_clk.clkr,
3145     [PCIE_1_AUX_CLK] = &pcie1_aux_clk.clkr,
3146     [PCIE_1_H_CLK] = &pcie1_h_clk.clkr,
3147     [PCIE_1_PHY_CLK] = &pcie1_phy_clk.clkr,
3148     [PCIE_1_ALT_REF_SRC] = &pcie1_ref_src.clkr,
3149     [PCIE_1_ALT_REF_CLK] = &pcie1_ref_src_clk.clkr,
3150     [PCIE_2_A_CLK] = &pcie2_a_clk.clkr,
3151     [PCIE_2_AUX_CLK] = &pcie2_aux_clk.clkr,
3152     [PCIE_2_H_CLK] = &pcie2_h_clk.clkr,
3153     [PCIE_2_PHY_CLK] = &pcie2_phy_clk.clkr,
3154     [PCIE_2_ALT_REF_SRC] = &pcie2_ref_src.clkr,
3155     [PCIE_2_ALT_REF_CLK] = &pcie2_ref_src_clk.clkr,
3156     [USB30_MASTER_SRC] = &usb30_master_clk_src.clkr,
3157     [USB30_0_MASTER_CLK] = &usb30_0_branch_clk.clkr,
3158     [USB30_1_MASTER_CLK] = &usb30_1_branch_clk.clkr,
3159     [USB30_UTMI_SRC] = &usb30_utmi_clk.clkr,
3160     [USB30_0_UTMI_CLK] = &usb30_0_utmi_clk_ctl.clkr,
3161     [USB30_1_UTMI_CLK] = &usb30_1_utmi_clk_ctl.clkr,
3162     [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
3163     [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_clk_src.clkr,
3164     [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
3165     [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
3166     [USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr,
3167     [USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr,
3168     [USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr,
3169     [EBI2_CLK] = &ebi2_clk.clkr,
3170     [EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
3171     [GMAC_CORE1_CLK_SRC] = &gmac_core1_src.clkr,
3172     [GMAC_CORE1_CLK] = &gmac_core1_clk.clkr,
3173     [GMAC_CORE2_CLK_SRC] = &gmac_core2_src.clkr,
3174     [GMAC_CORE2_CLK] = &gmac_core2_clk.clkr,
3175     [GMAC_CORE3_CLK_SRC] = &gmac_core3_src.clkr,
3176     [GMAC_CORE3_CLK] = &gmac_core3_clk.clkr,
3177     [GMAC_CORE4_CLK_SRC] = &gmac_core4_src.clkr,
3178     [GMAC_CORE4_CLK] = &gmac_core4_clk.clkr,
3179     [UBI32_CORE1_CLK_SRC] = &ubi32_core1_src_clk.clkr,
3180     [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr,
3181     [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr,
3182     [NSSTCM_CLK] = &nss_tcm_clk.clkr,
3183     [PLL9] = &hfpll0.clkr,
3184     [PLL10] = &hfpll1.clkr,
3185     [PLL12] = &hfpll_l2.clkr,
3186     [CE5_A_CLK_SRC] = &ce5_a_clk_src.clkr,
3187     [CE5_A_CLK] = &ce5_a_clk.clkr,
3188     [CE5_H_CLK_SRC] = &ce5_h_clk_src.clkr,
3189     [CE5_H_CLK] = &ce5_h_clk.clkr,
3190     [CE5_CORE_CLK_SRC] = &ce5_core_src.clkr,
3191     [CE5_CORE_CLK] = &ce5_core_clk.clkr,
3192 };
3193 
3194 static const struct qcom_reset_map gcc_ipq806x_resets[] = {
3195     [QDSS_STM_RESET] = { 0x2060, 6 },
3196     [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
3197     [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
3198     [AFAB_SMPSS_M0_RESET] = { 0x20b8, 0 },
3199     [AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 },
3200     [AFAB_EBI1_CH1_RESET] = { 0x20c4, 7 },
3201     [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
3202     [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
3203     [SFAB_ADM0_M2_RESET] = { 0x21e8, 7 },
3204     [ADM0_C2_RESET] = { 0x220c, 4 },
3205     [ADM0_C1_RESET] = { 0x220c, 3 },
3206     [ADM0_C0_RESET] = { 0x220c, 2 },
3207     [ADM0_PBUS_RESET] = { 0x220c, 1 },
3208     [ADM0_RESET] = { 0x220c, 0 },
3209     [QDSS_CLKS_SW_RESET] = { 0x2260, 5 },
3210     [QDSS_POR_RESET] = { 0x2260, 4 },
3211     [QDSS_TSCTR_RESET] = { 0x2260, 3 },
3212     [QDSS_HRESET_RESET] = { 0x2260, 2 },
3213     [QDSS_AXI_RESET] = { 0x2260, 1 },
3214     [QDSS_DBG_RESET] = { 0x2260, 0 },
3215     [SFAB_PCIE_M_RESET] = { 0x22d8, 1 },
3216     [SFAB_PCIE_S_RESET] = { 0x22d8, 0 },
3217     [PCIE_EXT_RESET] = { 0x22dc, 6 },
3218     [PCIE_PHY_RESET] = { 0x22dc, 5 },
3219     [PCIE_PCI_RESET] = { 0x22dc, 4 },
3220     [PCIE_POR_RESET] = { 0x22dc, 3 },
3221     [PCIE_HCLK_RESET] = { 0x22dc, 2 },
3222     [PCIE_ACLK_RESET] = { 0x22dc, 0 },
3223     [SFAB_LPASS_RESET] = { 0x23a0, 7 },
3224     [SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
3225     [AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
3226     [AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
3227     [SFAB_SATA_S_RESET] = { 0x2480, 7 },
3228     [SFAB_DFAB_M_RESET] = { 0x2500, 7 },
3229     [DFAB_SFAB_M_RESET] = { 0x2520, 7 },
3230     [DFAB_SWAY0_RESET] = { 0x2540, 7 },
3231     [DFAB_SWAY1_RESET] = { 0x2544, 7 },
3232     [DFAB_ARB0_RESET] = { 0x2560, 7 },
3233     [DFAB_ARB1_RESET] = { 0x2564, 7 },
3234     [PPSS_PROC_RESET] = { 0x2594, 1 },
3235     [PPSS_RESET] = { 0x2594, 0 },
3236     [DMA_BAM_RESET] = { 0x25c0, 7 },
3237     [SPS_TIC_H_RESET] = { 0x2600, 7 },
3238     [SFAB_CFPB_M_RESET] = { 0x2680, 7 },
3239     [SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
3240     [TSIF_H_RESET] = { 0x2700, 7 },
3241     [CE1_H_RESET] = { 0x2720, 7 },
3242     [CE1_CORE_RESET] = { 0x2724, 7 },
3243     [CE1_SLEEP_RESET] = { 0x2728, 7 },
3244     [CE2_H_RESET] = { 0x2740, 7 },
3245     [CE2_CORE_RESET] = { 0x2744, 7 },
3246     [SFAB_SFPB_M_RESET] = { 0x2780, 7 },
3247     [SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
3248     [RPM_PROC_RESET] = { 0x27c0, 7 },
3249     [PMIC_SSBI2_RESET] = { 0x280c, 12 },
3250     [SDC1_RESET] = { 0x2830, 0 },
3251     [SDC2_RESET] = { 0x2850, 0 },
3252     [SDC3_RESET] = { 0x2870, 0 },
3253     [SDC4_RESET] = { 0x2890, 0 },
3254     [USB_HS1_RESET] = { 0x2910, 0 },
3255     [USB_HSIC_RESET] = { 0x2934, 0 },
3256     [USB_FS1_XCVR_RESET] = { 0x2974, 1 },
3257     [USB_FS1_RESET] = { 0x2974, 0 },
3258     [GSBI1_RESET] = { 0x29dc, 0 },
3259     [GSBI2_RESET] = { 0x29fc, 0 },
3260     [GSBI3_RESET] = { 0x2a1c, 0 },
3261     [GSBI4_RESET] = { 0x2a3c, 0 },
3262     [GSBI5_RESET] = { 0x2a5c, 0 },
3263     [GSBI6_RESET] = { 0x2a7c, 0 },
3264     [GSBI7_RESET] = { 0x2a9c, 0 },
3265     [SPDM_RESET] = { 0x2b6c, 0 },
3266     [SEC_CTRL_RESET] = { 0x2b80, 7 },
3267     [TLMM_H_RESET] = { 0x2ba0, 7 },
3268     [SFAB_SATA_M_RESET] = { 0x2c18, 0 },
3269     [SATA_RESET] = { 0x2c1c, 0 },
3270     [TSSC_RESET] = { 0x2ca0, 7 },
3271     [PDM_RESET] = { 0x2cc0, 12 },
3272     [MPM_H_RESET] = { 0x2da0, 7 },
3273     [MPM_RESET] = { 0x2da4, 0 },
3274     [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
3275     [PRNG_RESET] = { 0x2e80, 12 },
3276     [SFAB_CE3_M_RESET] = { 0x36c8, 1 },
3277     [SFAB_CE3_S_RESET] = { 0x36c8, 0 },
3278     [CE3_SLEEP_RESET] = { 0x36d0, 7 },
3279     [PCIE_1_M_RESET] = { 0x3a98, 1 },
3280     [PCIE_1_S_RESET] = { 0x3a98, 0 },
3281     [PCIE_1_EXT_RESET] = { 0x3a9c, 6 },
3282     [PCIE_1_PHY_RESET] = { 0x3a9c, 5 },
3283     [PCIE_1_PCI_RESET] = { 0x3a9c, 4 },
3284     [PCIE_1_POR_RESET] = { 0x3a9c, 3 },
3285     [PCIE_1_HCLK_RESET] = { 0x3a9c, 2 },
3286     [PCIE_1_ACLK_RESET] = { 0x3a9c, 0 },
3287     [PCIE_2_M_RESET] = { 0x3ad8, 1 },
3288     [PCIE_2_S_RESET] = { 0x3ad8, 0 },
3289     [PCIE_2_EXT_RESET] = { 0x3adc, 6 },
3290     [PCIE_2_PHY_RESET] = { 0x3adc, 5 },
3291     [PCIE_2_PCI_RESET] = { 0x3adc, 4 },
3292     [PCIE_2_POR_RESET] = { 0x3adc, 3 },
3293     [PCIE_2_HCLK_RESET] = { 0x3adc, 2 },
3294     [PCIE_2_ACLK_RESET] = { 0x3adc, 0 },
3295     [SFAB_USB30_S_RESET] = { 0x3b54, 1 },
3296     [SFAB_USB30_M_RESET] = { 0x3b54, 0 },
3297     [USB30_0_PORT2_HS_PHY_RESET] = { 0x3b50, 5 },
3298     [USB30_0_MASTER_RESET] = { 0x3b50, 4 },
3299     [USB30_0_SLEEP_RESET] = { 0x3b50, 3 },
3300     [USB30_0_UTMI_PHY_RESET] = { 0x3b50, 2 },
3301     [USB30_0_POWERON_RESET] = { 0x3b50, 1 },
3302     [USB30_0_PHY_RESET] = { 0x3b50, 0 },
3303     [USB30_1_MASTER_RESET] = { 0x3b58, 4 },
3304     [USB30_1_SLEEP_RESET] = { 0x3b58, 3 },
3305     [USB30_1_UTMI_PHY_RESET] = { 0x3b58, 2 },
3306     [USB30_1_POWERON_RESET] = { 0x3b58, 1 },
3307     [USB30_1_PHY_RESET] = { 0x3b58, 0 },
3308     [NSSFB0_RESET] = { 0x3b60, 6 },
3309     [NSSFB1_RESET] = { 0x3b60, 7 },
3310     [UBI32_CORE1_CLKRST_CLAMP_RESET] = { 0x3d3c, 3},
3311     [UBI32_CORE1_CLAMP_RESET] = { 0x3d3c, 2 },
3312     [UBI32_CORE1_AHB_RESET] = { 0x3d3c, 1 },
3313     [UBI32_CORE1_AXI_RESET] = { 0x3d3c, 0 },
3314     [UBI32_CORE2_CLKRST_CLAMP_RESET] = { 0x3d5c, 3 },
3315     [UBI32_CORE2_CLAMP_RESET] = { 0x3d5c, 2 },
3316     [UBI32_CORE2_AHB_RESET] = { 0x3d5c, 1 },
3317     [UBI32_CORE2_AXI_RESET] = { 0x3d5c, 0 },
3318     [GMAC_CORE1_RESET] = { 0x3cbc, 0 },
3319     [GMAC_CORE2_RESET] = { 0x3cdc, 0 },
3320     [GMAC_CORE3_RESET] = { 0x3cfc, 0 },
3321     [GMAC_CORE4_RESET] = { 0x3d1c, 0 },
3322     [GMAC_AHB_RESET] = { 0x3e24, 0 },
3323     [CRYPTO_ENG1_RESET] = { 0x3e00, 0},
3324     [CRYPTO_ENG2_RESET] = { 0x3e04, 0},
3325     [CRYPTO_ENG3_RESET] = { 0x3e08, 0},
3326     [CRYPTO_ENG4_RESET] = { 0x3e0c, 0},
3327     [CRYPTO_AHB_RESET] = { 0x3e10, 0},
3328     [NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 },
3329     [NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 },
3330     [NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 },
3331     [NSS_CH0_HW_RST_RX_125M_N_RESET] = { 0x3b60, 3 },
3332     [NSS_CH0_RST_TX_125M_N_RESET] = { 0x3b60, 4 },
3333     [NSS_CH1_RST_RX_CLK_N_RESET] = { 0x3b60, 5 },
3334     [NSS_CH1_RST_TX_CLK_N_RESET] = { 0x3b60, 6 },
3335     [NSS_CH1_RST_RX_125M_N_RESET] = { 0x3b60, 7 },
3336     [NSS_CH1_HW_RST_RX_125M_N_RESET] = { 0x3b60, 8 },
3337     [NSS_CH1_RST_TX_125M_N_RESET] = { 0x3b60, 9 },
3338     [NSS_CH2_RST_RX_CLK_N_RESET] = { 0x3b60, 10 },
3339     [NSS_CH2_RST_TX_CLK_N_RESET] = { 0x3b60, 11 },
3340     [NSS_CH2_RST_RX_125M_N_RESET] = { 0x3b60, 12 },
3341     [NSS_CH2_HW_RST_RX_125M_N_RESET] = { 0x3b60, 13 },
3342     [NSS_CH2_RST_TX_125M_N_RESET] = { 0x3b60, 14 },
3343     [NSS_CH3_RST_RX_CLK_N_RESET] = { 0x3b60, 15 },
3344     [NSS_CH3_RST_TX_CLK_N_RESET] = { 0x3b60, 16 },
3345     [NSS_CH3_RST_RX_125M_N_RESET] = { 0x3b60, 17 },
3346     [NSS_CH3_HW_RST_RX_125M_N_RESET] = { 0x3b60, 18 },
3347     [NSS_CH3_RST_TX_125M_N_RESET] = { 0x3b60, 19 },
3348     [NSS_RST_RX_250M_125M_N_RESET] = { 0x3b60, 20 },
3349     [NSS_RST_TX_250M_125M_N_RESET] = { 0x3b60, 21 },
3350     [NSS_QSGMII_TXPI_RST_N_RESET] = { 0x3b60, 22 },
3351     [NSS_QSGMII_CDR_RST_N_RESET] = { 0x3b60, 23 },
3352     [NSS_SGMII2_CDR_RST_N_RESET] = { 0x3b60, 24 },
3353     [NSS_SGMII3_CDR_RST_N_RESET] = { 0x3b60, 25 },
3354     [NSS_CAL_PRBS_RST_N_RESET] = { 0x3b60, 26 },
3355     [NSS_LCKDT_RST_N_RESET] = { 0x3b60, 27 },
3356     [NSS_SRDS_N_RESET] = { 0x3b60, 28 },
3357 };
3358 
3359 static const struct regmap_config gcc_ipq806x_regmap_config = {
3360     .reg_bits   = 32,
3361     .reg_stride = 4,
3362     .val_bits   = 32,
3363     .max_register   = 0x3e40,
3364     .fast_io    = true,
3365 };
3366 
3367 static const struct qcom_cc_desc gcc_ipq806x_desc = {
3368     .config = &gcc_ipq806x_regmap_config,
3369     .clks = gcc_ipq806x_clks,
3370     .num_clks = ARRAY_SIZE(gcc_ipq806x_clks),
3371     .resets = gcc_ipq806x_resets,
3372     .num_resets = ARRAY_SIZE(gcc_ipq806x_resets),
3373 };
3374 
3375 static const struct of_device_id gcc_ipq806x_match_table[] = {
3376     { .compatible = "qcom,gcc-ipq8064" },
3377     { }
3378 };
3379 MODULE_DEVICE_TABLE(of, gcc_ipq806x_match_table);
3380 
3381 static int gcc_ipq806x_probe(struct platform_device *pdev)
3382 {
3383     struct device *dev = &pdev->dev;
3384     struct regmap *regmap;
3385     int ret;
3386 
3387     ret = qcom_cc_register_board_clk(dev, "cxo_board", "cxo", 25000000);
3388     if (ret)
3389         return ret;
3390 
3391     ret = qcom_cc_register_board_clk(dev, "pxo_board", "pxo", 25000000);
3392     if (ret)
3393         return ret;
3394 
3395     if (of_machine_is_compatible("qcom,ipq8065")) {
3396         ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8065;
3397         ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8065;
3398     } else {
3399         ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8064;
3400         ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8064;
3401     }
3402 
3403     ret = qcom_cc_probe(pdev, &gcc_ipq806x_desc);
3404     if (ret)
3405         return ret;
3406 
3407     regmap = dev_get_regmap(dev, NULL);
3408     if (!regmap)
3409         return -ENODEV;
3410 
3411     /* Setup PLL18 static bits */
3412     regmap_update_bits(regmap, 0x31a4, 0xffffffc0, 0x40000400);
3413     regmap_write(regmap, 0x31b0, 0x3080);
3414 
3415     /* Set GMAC footswitch sleep/wakeup values */
3416     regmap_write(regmap, 0x3cb8, 8);
3417     regmap_write(regmap, 0x3cd8, 8);
3418     regmap_write(regmap, 0x3cf8, 8);
3419     regmap_write(regmap, 0x3d18, 8);
3420 
3421     return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
3422 }
3423 
3424 static struct platform_driver gcc_ipq806x_driver = {
3425     .probe      = gcc_ipq806x_probe,
3426     .driver     = {
3427         .name   = "gcc-ipq806x",
3428         .of_match_table = gcc_ipq806x_match_table,
3429     },
3430 };
3431 
3432 static int __init gcc_ipq806x_init(void)
3433 {
3434     return platform_driver_register(&gcc_ipq806x_driver);
3435 }
3436 core_initcall(gcc_ipq806x_init);
3437 
3438 static void __exit gcc_ipq806x_exit(void)
3439 {
3440     platform_driver_unregister(&gcc_ipq806x_driver);
3441 }
3442 module_exit(gcc_ipq806x_exit);
3443 
3444 MODULE_DESCRIPTION("QCOM GCC IPQ806x Driver");
3445 MODULE_LICENSE("GPL v2");
3446 MODULE_ALIAS("platform:gcc-ipq806x");