1*f003800eSLuca Weiss // SPDX-License-Identifier: GPL-2.0-only 2*f003800eSLuca Weiss /* 3*f003800eSLuca Weiss * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4*f003800eSLuca Weiss * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com> 5*f003800eSLuca Weiss */ 6*f003800eSLuca Weiss 7*f003800eSLuca Weiss #include <linux/clk-provider.h> 8*f003800eSLuca Weiss #include <linux/mod_devicetable.h> 9*f003800eSLuca Weiss #include <linux/module.h> 10*f003800eSLuca Weiss #include <linux/platform_device.h> 11*f003800eSLuca Weiss #include <linux/regmap.h> 12*f003800eSLuca Weiss 13*f003800eSLuca Weiss #include <dt-bindings/clock/qcom,milos-camcc.h> 14*f003800eSLuca Weiss 15*f003800eSLuca Weiss #include "clk-alpha-pll.h" 16*f003800eSLuca Weiss #include "clk-branch.h" 17*f003800eSLuca Weiss #include "clk-pll.h" 18*f003800eSLuca Weiss #include "clk-rcg.h" 19*f003800eSLuca Weiss #include "clk-regmap.h" 20*f003800eSLuca Weiss #include "clk-regmap-divider.h" 21*f003800eSLuca Weiss #include "clk-regmap-mux.h" 22*f003800eSLuca Weiss #include "common.h" 23*f003800eSLuca Weiss #include "gdsc.h" 24*f003800eSLuca Weiss #include "reset.h" 25*f003800eSLuca Weiss 26*f003800eSLuca Weiss /* Need to match the order of clocks in DT binding */ 27*f003800eSLuca Weiss enum { 28*f003800eSLuca Weiss DT_BI_TCXO, 29*f003800eSLuca Weiss DT_SLEEP_CLK, 30*f003800eSLuca Weiss DT_IFACE, 31*f003800eSLuca Weiss }; 32*f003800eSLuca Weiss 33*f003800eSLuca Weiss enum { 34*f003800eSLuca Weiss P_BI_TCXO, 35*f003800eSLuca Weiss P_CAM_CC_PLL0_OUT_EVEN, 36*f003800eSLuca Weiss P_CAM_CC_PLL0_OUT_MAIN, 37*f003800eSLuca Weiss P_CAM_CC_PLL0_OUT_ODD, 38*f003800eSLuca Weiss P_CAM_CC_PLL1_OUT_EVEN, 39*f003800eSLuca Weiss P_CAM_CC_PLL1_OUT_MAIN, 40*f003800eSLuca Weiss P_CAM_CC_PLL2_OUT_MAIN, 41*f003800eSLuca Weiss P_CAM_CC_PLL3_OUT_EVEN, 42*f003800eSLuca Weiss P_CAM_CC_PLL4_OUT_EVEN, 43*f003800eSLuca Weiss P_CAM_CC_PLL4_OUT_MAIN, 44*f003800eSLuca Weiss P_CAM_CC_PLL5_OUT_EVEN, 45*f003800eSLuca Weiss P_CAM_CC_PLL5_OUT_MAIN, 46*f003800eSLuca Weiss P_CAM_CC_PLL6_OUT_EVEN, 47*f003800eSLuca Weiss P_CAM_CC_PLL6_OUT_MAIN, 48*f003800eSLuca Weiss P_SLEEP_CLK, 49*f003800eSLuca Weiss }; 50*f003800eSLuca Weiss 51*f003800eSLuca Weiss static const struct pll_vco lucid_ole_vco[] = { 52*f003800eSLuca Weiss { 249600000, 2300000000, 0 }, 53*f003800eSLuca Weiss }; 54*f003800eSLuca Weiss 55*f003800eSLuca Weiss static const struct pll_vco rivian_ole_vco[] = { 56*f003800eSLuca Weiss { 777000000, 1285000000, 0 }, 57*f003800eSLuca Weiss }; 58*f003800eSLuca Weiss 59*f003800eSLuca Weiss /* 1200.0 MHz Configuration */ 60*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll0_config = { 61*f003800eSLuca Weiss .l = 0x3e, 62*f003800eSLuca Weiss .alpha = 0x8000, 63*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 64*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 65*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 66*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 67*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 68*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 69*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 70*f003800eSLuca Weiss .user_ctl_val = 0x00008400, 71*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 72*f003800eSLuca Weiss }; 73*f003800eSLuca Weiss 74*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll0 = { 75*f003800eSLuca Weiss .offset = 0x0, 76*f003800eSLuca Weiss .config = &cam_cc_pll0_config, 77*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 78*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 79*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 80*f003800eSLuca Weiss .clkr = { 81*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 82*f003800eSLuca Weiss .name = "cam_cc_pll0", 83*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 84*f003800eSLuca Weiss .index = DT_BI_TCXO, 85*f003800eSLuca Weiss }, 86*f003800eSLuca Weiss .num_parents = 1, 87*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 88*f003800eSLuca Weiss }, 89*f003800eSLuca Weiss }, 90*f003800eSLuca Weiss }; 91*f003800eSLuca Weiss 92*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = { 93*f003800eSLuca Weiss { 0x1, 2 }, 94*f003800eSLuca Weiss { } 95*f003800eSLuca Weiss }; 96*f003800eSLuca Weiss 97*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = { 98*f003800eSLuca Weiss .offset = 0x0, 99*f003800eSLuca Weiss .post_div_shift = 10, 100*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll0_out_even, 101*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even), 102*f003800eSLuca Weiss .width = 4, 103*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 104*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 105*f003800eSLuca Weiss .name = "cam_cc_pll0_out_even", 106*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 107*f003800eSLuca Weiss &cam_cc_pll0.clkr.hw, 108*f003800eSLuca Weiss }, 109*f003800eSLuca Weiss .num_parents = 1, 110*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 111*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 112*f003800eSLuca Weiss }, 113*f003800eSLuca Weiss }; 114*f003800eSLuca Weiss 115*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = { 116*f003800eSLuca Weiss { 0x2, 3 }, 117*f003800eSLuca Weiss { } 118*f003800eSLuca Weiss }; 119*f003800eSLuca Weiss 120*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = { 121*f003800eSLuca Weiss .offset = 0x0, 122*f003800eSLuca Weiss .post_div_shift = 14, 123*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll0_out_odd, 124*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd), 125*f003800eSLuca Weiss .width = 4, 126*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 127*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 128*f003800eSLuca Weiss .name = "cam_cc_pll0_out_odd", 129*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 130*f003800eSLuca Weiss &cam_cc_pll0.clkr.hw, 131*f003800eSLuca Weiss }, 132*f003800eSLuca Weiss .num_parents = 1, 133*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 134*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 135*f003800eSLuca Weiss }, 136*f003800eSLuca Weiss }; 137*f003800eSLuca Weiss 138*f003800eSLuca Weiss /* 600.0 MHz Configuration */ 139*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll1_config = { 140*f003800eSLuca Weiss .l = 0x1f, 141*f003800eSLuca Weiss .alpha = 0x4000, 142*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 143*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 144*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 145*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 146*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 147*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 148*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 149*f003800eSLuca Weiss .user_ctl_val = 0x00000400, 150*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 151*f003800eSLuca Weiss }; 152*f003800eSLuca Weiss 153*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll1 = { 154*f003800eSLuca Weiss .offset = 0x1000, 155*f003800eSLuca Weiss .config = &cam_cc_pll1_config, 156*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 157*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 158*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 159*f003800eSLuca Weiss .clkr = { 160*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 161*f003800eSLuca Weiss .name = "cam_cc_pll1", 162*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 163*f003800eSLuca Weiss .index = DT_BI_TCXO, 164*f003800eSLuca Weiss }, 165*f003800eSLuca Weiss .num_parents = 1, 166*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 167*f003800eSLuca Weiss }, 168*f003800eSLuca Weiss }, 169*f003800eSLuca Weiss }; 170*f003800eSLuca Weiss 171*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll1_out_even[] = { 172*f003800eSLuca Weiss { 0x1, 2 }, 173*f003800eSLuca Weiss { } 174*f003800eSLuca Weiss }; 175*f003800eSLuca Weiss 176*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = { 177*f003800eSLuca Weiss .offset = 0x1000, 178*f003800eSLuca Weiss .post_div_shift = 10, 179*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll1_out_even, 180*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll1_out_even), 181*f003800eSLuca Weiss .width = 4, 182*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 183*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 184*f003800eSLuca Weiss .name = "cam_cc_pll1_out_even", 185*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 186*f003800eSLuca Weiss &cam_cc_pll1.clkr.hw, 187*f003800eSLuca Weiss }, 188*f003800eSLuca Weiss .num_parents = 1, 189*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 190*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 191*f003800eSLuca Weiss }, 192*f003800eSLuca Weiss }; 193*f003800eSLuca Weiss 194*f003800eSLuca Weiss /* 960.0 MHz Configuration */ 195*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll2_config = { 196*f003800eSLuca Weiss .l = 0x32, 197*f003800eSLuca Weiss .alpha = 0x0, 198*f003800eSLuca Weiss .config_ctl_val = 0x10000030, 199*f003800eSLuca Weiss .config_ctl_hi_val = 0x80890263, 200*f003800eSLuca Weiss .config_ctl_hi1_val = 0x00000217, 201*f003800eSLuca Weiss .user_ctl_val = 0x00000001, 202*f003800eSLuca Weiss .user_ctl_hi_val = 0x00100000, 203*f003800eSLuca Weiss }; 204*f003800eSLuca Weiss 205*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll2 = { 206*f003800eSLuca Weiss .offset = 0x2000, 207*f003800eSLuca Weiss .config = &cam_cc_pll2_config, 208*f003800eSLuca Weiss .vco_table = rivian_ole_vco, 209*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(rivian_ole_vco), 210*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO], 211*f003800eSLuca Weiss .clkr = { 212*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 213*f003800eSLuca Weiss .name = "cam_cc_pll2", 214*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 215*f003800eSLuca Weiss .index = DT_BI_TCXO, 216*f003800eSLuca Weiss }, 217*f003800eSLuca Weiss .num_parents = 1, 218*f003800eSLuca Weiss .ops = &clk_alpha_pll_rivian_evo_ops, 219*f003800eSLuca Weiss }, 220*f003800eSLuca Weiss }, 221*f003800eSLuca Weiss }; 222*f003800eSLuca Weiss 223*f003800eSLuca Weiss /* 600.0 MHz Configuration */ 224*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll3_config = { 225*f003800eSLuca Weiss .l = 0x1f, 226*f003800eSLuca Weiss .alpha = 0x4000, 227*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 228*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 229*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 230*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 231*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 232*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 233*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 234*f003800eSLuca Weiss .user_ctl_val = 0x00000400, 235*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 236*f003800eSLuca Weiss }; 237*f003800eSLuca Weiss 238*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll3 = { 239*f003800eSLuca Weiss .offset = 0x3000, 240*f003800eSLuca Weiss .config = &cam_cc_pll3_config, 241*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 242*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 243*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 244*f003800eSLuca Weiss .clkr = { 245*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 246*f003800eSLuca Weiss .name = "cam_cc_pll3", 247*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 248*f003800eSLuca Weiss .index = DT_BI_TCXO, 249*f003800eSLuca Weiss }, 250*f003800eSLuca Weiss .num_parents = 1, 251*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 252*f003800eSLuca Weiss }, 253*f003800eSLuca Weiss }, 254*f003800eSLuca Weiss }; 255*f003800eSLuca Weiss 256*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = { 257*f003800eSLuca Weiss { 0x1, 2 }, 258*f003800eSLuca Weiss { } 259*f003800eSLuca Weiss }; 260*f003800eSLuca Weiss 261*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = { 262*f003800eSLuca Weiss .offset = 0x3000, 263*f003800eSLuca Weiss .post_div_shift = 10, 264*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll3_out_even, 265*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even), 266*f003800eSLuca Weiss .width = 4, 267*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 268*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 269*f003800eSLuca Weiss .name = "cam_cc_pll3_out_even", 270*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 271*f003800eSLuca Weiss &cam_cc_pll3.clkr.hw, 272*f003800eSLuca Weiss }, 273*f003800eSLuca Weiss .num_parents = 1, 274*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 275*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 276*f003800eSLuca Weiss }, 277*f003800eSLuca Weiss }; 278*f003800eSLuca Weiss 279*f003800eSLuca Weiss /* 700.0 MHz Configuration */ 280*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll4_config = { 281*f003800eSLuca Weiss .l = 0x24, 282*f003800eSLuca Weiss .alpha = 0x7555, 283*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 284*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 285*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 286*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 287*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 288*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 289*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 290*f003800eSLuca Weiss .user_ctl_val = 0x00000400, 291*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 292*f003800eSLuca Weiss }; 293*f003800eSLuca Weiss 294*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll4 = { 295*f003800eSLuca Weiss .offset = 0x4000, 296*f003800eSLuca Weiss .config = &cam_cc_pll4_config, 297*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 298*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 299*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 300*f003800eSLuca Weiss .clkr = { 301*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 302*f003800eSLuca Weiss .name = "cam_cc_pll4", 303*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 304*f003800eSLuca Weiss .index = DT_BI_TCXO, 305*f003800eSLuca Weiss }, 306*f003800eSLuca Weiss .num_parents = 1, 307*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 308*f003800eSLuca Weiss }, 309*f003800eSLuca Weiss }, 310*f003800eSLuca Weiss }; 311*f003800eSLuca Weiss 312*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = { 313*f003800eSLuca Weiss { 0x1, 2 }, 314*f003800eSLuca Weiss { } 315*f003800eSLuca Weiss }; 316*f003800eSLuca Weiss 317*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = { 318*f003800eSLuca Weiss .offset = 0x4000, 319*f003800eSLuca Weiss .post_div_shift = 10, 320*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll4_out_even, 321*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even), 322*f003800eSLuca Weiss .width = 4, 323*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 324*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 325*f003800eSLuca Weiss .name = "cam_cc_pll4_out_even", 326*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 327*f003800eSLuca Weiss &cam_cc_pll4.clkr.hw, 328*f003800eSLuca Weiss }, 329*f003800eSLuca Weiss .num_parents = 1, 330*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 331*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 332*f003800eSLuca Weiss }, 333*f003800eSLuca Weiss }; 334*f003800eSLuca Weiss 335*f003800eSLuca Weiss /* 700.0 MHz Configuration */ 336*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll5_config = { 337*f003800eSLuca Weiss .l = 0x24, 338*f003800eSLuca Weiss .alpha = 0x7555, 339*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 340*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 341*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 342*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 343*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 344*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 345*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 346*f003800eSLuca Weiss .user_ctl_val = 0x00000400, 347*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 348*f003800eSLuca Weiss }; 349*f003800eSLuca Weiss 350*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll5 = { 351*f003800eSLuca Weiss .offset = 0x5000, 352*f003800eSLuca Weiss .config = &cam_cc_pll5_config, 353*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 354*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 355*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 356*f003800eSLuca Weiss .clkr = { 357*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 358*f003800eSLuca Weiss .name = "cam_cc_pll5", 359*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 360*f003800eSLuca Weiss .index = DT_BI_TCXO, 361*f003800eSLuca Weiss }, 362*f003800eSLuca Weiss .num_parents = 1, 363*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 364*f003800eSLuca Weiss }, 365*f003800eSLuca Weiss }, 366*f003800eSLuca Weiss }; 367*f003800eSLuca Weiss 368*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = { 369*f003800eSLuca Weiss { 0x1, 2 }, 370*f003800eSLuca Weiss { } 371*f003800eSLuca Weiss }; 372*f003800eSLuca Weiss 373*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = { 374*f003800eSLuca Weiss .offset = 0x5000, 375*f003800eSLuca Weiss .post_div_shift = 10, 376*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll5_out_even, 377*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even), 378*f003800eSLuca Weiss .width = 4, 379*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 380*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 381*f003800eSLuca Weiss .name = "cam_cc_pll5_out_even", 382*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 383*f003800eSLuca Weiss &cam_cc_pll5.clkr.hw, 384*f003800eSLuca Weiss }, 385*f003800eSLuca Weiss .num_parents = 1, 386*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 387*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 388*f003800eSLuca Weiss }, 389*f003800eSLuca Weiss }; 390*f003800eSLuca Weiss 391*f003800eSLuca Weiss /* 700.0 MHz Configuration */ 392*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll6_config = { 393*f003800eSLuca Weiss .l = 0x24, 394*f003800eSLuca Weiss .alpha = 0x7555, 395*f003800eSLuca Weiss .config_ctl_val = 0x20485699, 396*f003800eSLuca Weiss .config_ctl_hi_val = 0x00182261, 397*f003800eSLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 398*f003800eSLuca Weiss .test_ctl_val = 0x00000000, 399*f003800eSLuca Weiss .test_ctl_hi_val = 0x00000003, 400*f003800eSLuca Weiss .test_ctl_hi1_val = 0x00009000, 401*f003800eSLuca Weiss .test_ctl_hi2_val = 0x00000034, 402*f003800eSLuca Weiss .user_ctl_val = 0x00000400, 403*f003800eSLuca Weiss .user_ctl_hi_val = 0x00000005, 404*f003800eSLuca Weiss }; 405*f003800eSLuca Weiss 406*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll6 = { 407*f003800eSLuca Weiss .offset = 0x6000, 408*f003800eSLuca Weiss .config = &cam_cc_pll6_config, 409*f003800eSLuca Weiss .vco_table = lucid_ole_vco, 410*f003800eSLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 411*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 412*f003800eSLuca Weiss .clkr = { 413*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 414*f003800eSLuca Weiss .name = "cam_cc_pll6", 415*f003800eSLuca Weiss .parent_data = &(const struct clk_parent_data) { 416*f003800eSLuca Weiss .index = DT_BI_TCXO, 417*f003800eSLuca Weiss }, 418*f003800eSLuca Weiss .num_parents = 1, 419*f003800eSLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 420*f003800eSLuca Weiss }, 421*f003800eSLuca Weiss }, 422*f003800eSLuca Weiss }; 423*f003800eSLuca Weiss 424*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll6_out_even[] = { 425*f003800eSLuca Weiss { 0x1, 2 }, 426*f003800eSLuca Weiss { } 427*f003800eSLuca Weiss }; 428*f003800eSLuca Weiss 429*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll6_out_even = { 430*f003800eSLuca Weiss .offset = 0x6000, 431*f003800eSLuca Weiss .post_div_shift = 10, 432*f003800eSLuca Weiss .post_div_table = post_div_table_cam_cc_pll6_out_even, 433*f003800eSLuca Weiss .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll6_out_even), 434*f003800eSLuca Weiss .width = 4, 435*f003800eSLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 436*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 437*f003800eSLuca Weiss .name = "cam_cc_pll6_out_even", 438*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 439*f003800eSLuca Weiss &cam_cc_pll6.clkr.hw, 440*f003800eSLuca Weiss }, 441*f003800eSLuca Weiss .num_parents = 1, 442*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 443*f003800eSLuca Weiss .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 444*f003800eSLuca Weiss }, 445*f003800eSLuca Weiss }; 446*f003800eSLuca Weiss 447*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_0[] = { 448*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 449*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 450*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 451*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 452*f003800eSLuca Weiss }; 453*f003800eSLuca Weiss 454*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_0[] = { 455*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 456*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 457*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 458*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 459*f003800eSLuca Weiss }; 460*f003800eSLuca Weiss 461*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_1[] = { 462*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 463*f003800eSLuca Weiss { P_CAM_CC_PLL2_OUT_MAIN, 4 }, 464*f003800eSLuca Weiss }; 465*f003800eSLuca Weiss 466*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_1[] = { 467*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 468*f003800eSLuca Weiss { .hw = &cam_cc_pll2.clkr.hw }, 469*f003800eSLuca Weiss }; 470*f003800eSLuca Weiss 471*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_2[] = { 472*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 473*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 474*f003800eSLuca Weiss { P_CAM_CC_PLL1_OUT_MAIN, 2 }, 475*f003800eSLuca Weiss { P_CAM_CC_PLL1_OUT_EVEN, 3 }, 476*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 477*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 478*f003800eSLuca Weiss }; 479*f003800eSLuca Weiss 480*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_2[] = { 481*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 482*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 483*f003800eSLuca Weiss { .hw = &cam_cc_pll1.clkr.hw }, 484*f003800eSLuca Weiss { .hw = &cam_cc_pll1_out_even.clkr.hw }, 485*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 486*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 487*f003800eSLuca Weiss }; 488*f003800eSLuca Weiss 489*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_3[] = { 490*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 491*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 492*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 493*f003800eSLuca Weiss }; 494*f003800eSLuca Weiss 495*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_3[] = { 496*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 497*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 498*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 499*f003800eSLuca Weiss }; 500*f003800eSLuca Weiss 501*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_4[] = { 502*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 503*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 504*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 505*f003800eSLuca Weiss }; 506*f003800eSLuca Weiss 507*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_4[] = { 508*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 509*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 510*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 511*f003800eSLuca Weiss }; 512*f003800eSLuca Weiss 513*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_5[] = { 514*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 515*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 516*f003800eSLuca Weiss { P_CAM_CC_PLL3_OUT_EVEN, 5 }, 517*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 518*f003800eSLuca Weiss }; 519*f003800eSLuca Weiss 520*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_5[] = { 521*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 522*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 523*f003800eSLuca Weiss { .hw = &cam_cc_pll3_out_even.clkr.hw }, 524*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 525*f003800eSLuca Weiss }; 526*f003800eSLuca Weiss 527*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_6[] = { 528*f003800eSLuca Weiss { P_SLEEP_CLK, 0 }, 529*f003800eSLuca Weiss }; 530*f003800eSLuca Weiss 531*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_6_ao[] = { 532*f003800eSLuca Weiss { .index = DT_SLEEP_CLK }, 533*f003800eSLuca Weiss }; 534*f003800eSLuca Weiss 535*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_7[] = { 536*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 537*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 538*f003800eSLuca Weiss { P_CAM_CC_PLL4_OUT_EVEN, 2 }, 539*f003800eSLuca Weiss { P_CAM_CC_PLL4_OUT_MAIN, 3 }, 540*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 541*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 542*f003800eSLuca Weiss }; 543*f003800eSLuca Weiss 544*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_7[] = { 545*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 546*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 547*f003800eSLuca Weiss { .hw = &cam_cc_pll4_out_even.clkr.hw }, 548*f003800eSLuca Weiss { .hw = &cam_cc_pll4.clkr.hw }, 549*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 550*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 551*f003800eSLuca Weiss }; 552*f003800eSLuca Weiss 553*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_8[] = { 554*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 555*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 556*f003800eSLuca Weiss { P_CAM_CC_PLL5_OUT_EVEN, 2 }, 557*f003800eSLuca Weiss { P_CAM_CC_PLL5_OUT_MAIN, 3 }, 558*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 559*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 560*f003800eSLuca Weiss }; 561*f003800eSLuca Weiss 562*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_8[] = { 563*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 564*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 565*f003800eSLuca Weiss { .hw = &cam_cc_pll5_out_even.clkr.hw }, 566*f003800eSLuca Weiss { .hw = &cam_cc_pll5.clkr.hw }, 567*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 568*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 569*f003800eSLuca Weiss }; 570*f003800eSLuca Weiss 571*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_9[] = { 572*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 573*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 574*f003800eSLuca Weiss { P_CAM_CC_PLL6_OUT_EVEN, 2 }, 575*f003800eSLuca Weiss { P_CAM_CC_PLL6_OUT_MAIN, 3 }, 576*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_ODD, 5 }, 577*f003800eSLuca Weiss { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 578*f003800eSLuca Weiss }; 579*f003800eSLuca Weiss 580*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_9[] = { 581*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 582*f003800eSLuca Weiss { .hw = &cam_cc_pll0.clkr.hw }, 583*f003800eSLuca Weiss { .hw = &cam_cc_pll6_out_even.clkr.hw }, 584*f003800eSLuca Weiss { .hw = &cam_cc_pll6.clkr.hw }, 585*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 586*f003800eSLuca Weiss { .hw = &cam_cc_pll0_out_even.clkr.hw }, 587*f003800eSLuca Weiss }; 588*f003800eSLuca Weiss 589*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_10[] = { 590*f003800eSLuca Weiss { P_BI_TCXO, 0 }, 591*f003800eSLuca Weiss }; 592*f003800eSLuca Weiss 593*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_10[] = { 594*f003800eSLuca Weiss { .index = DT_BI_TCXO }, 595*f003800eSLuca Weiss }; 596*f003800eSLuca Weiss 597*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = { 598*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 599*f003800eSLuca Weiss F(410000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 600*f003800eSLuca Weiss F(460000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 601*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 602*f003800eSLuca Weiss F(700000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 603*f003800eSLuca Weiss { } 604*f003800eSLuca Weiss }; 605*f003800eSLuca Weiss 606*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_bps_clk_src = { 607*f003800eSLuca Weiss .cmd_rcgr = 0x1a004, 608*f003800eSLuca Weiss .mnd_width = 0, 609*f003800eSLuca Weiss .hid_width = 5, 610*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_2, 611*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_bps_clk_src, 612*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 613*f003800eSLuca Weiss .name = "cam_cc_bps_clk_src", 614*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_2, 615*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), 616*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 617*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 618*f003800eSLuca Weiss }, 619*f003800eSLuca Weiss }; 620*f003800eSLuca Weiss 621*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = { 622*f003800eSLuca Weiss F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0), 623*f003800eSLuca Weiss F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0), 624*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 625*f003800eSLuca Weiss F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0), 626*f003800eSLuca Weiss { } 627*f003800eSLuca Weiss }; 628*f003800eSLuca Weiss 629*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = { 630*f003800eSLuca Weiss .cmd_rcgr = 0x2401c, 631*f003800eSLuca Weiss .mnd_width = 0, 632*f003800eSLuca Weiss .hid_width = 5, 633*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 634*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src, 635*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 636*f003800eSLuca Weiss .name = "cam_cc_camnoc_axi_clk_src", 637*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 638*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 639*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 640*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 641*f003800eSLuca Weiss }, 642*f003800eSLuca Weiss }; 643*f003800eSLuca Weiss 644*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = { 645*f003800eSLuca Weiss F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0), 646*f003800eSLuca Weiss F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0), 647*f003800eSLuca Weiss F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0), 648*f003800eSLuca Weiss { } 649*f003800eSLuca Weiss }; 650*f003800eSLuca Weiss 651*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cci_0_clk_src = { 652*f003800eSLuca Weiss .cmd_rcgr = 0x21004, 653*f003800eSLuca Weiss .mnd_width = 8, 654*f003800eSLuca Weiss .hid_width = 5, 655*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_3, 656*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cci_0_clk_src, 657*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 658*f003800eSLuca Weiss .name = "cam_cc_cci_0_clk_src", 659*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_3, 660*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), 661*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 662*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 663*f003800eSLuca Weiss }, 664*f003800eSLuca Weiss }; 665*f003800eSLuca Weiss 666*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cci_1_clk_src = { 667*f003800eSLuca Weiss .cmd_rcgr = 0x22004, 668*f003800eSLuca Weiss .mnd_width = 8, 669*f003800eSLuca Weiss .hid_width = 5, 670*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_3, 671*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cci_0_clk_src, 672*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 673*f003800eSLuca Weiss .name = "cam_cc_cci_1_clk_src", 674*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_3, 675*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), 676*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 677*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 678*f003800eSLuca Weiss }, 679*f003800eSLuca Weiss }; 680*f003800eSLuca Weiss 681*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = { 682*f003800eSLuca Weiss F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0), 683*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 684*f003800eSLuca Weiss F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0), 685*f003800eSLuca Weiss { } 686*f003800eSLuca Weiss }; 687*f003800eSLuca Weiss 688*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { 689*f003800eSLuca Weiss .cmd_rcgr = 0x1c05c, 690*f003800eSLuca Weiss .mnd_width = 0, 691*f003800eSLuca Weiss .hid_width = 5, 692*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 693*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 694*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 695*f003800eSLuca Weiss .name = "cam_cc_cphy_rx_clk_src", 696*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 697*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 698*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 699*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 700*f003800eSLuca Weiss }, 701*f003800eSLuca Weiss }; 702*f003800eSLuca Weiss 703*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cre_clk_src[] = { 704*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 705*f003800eSLuca Weiss F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0), 706*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0), 707*f003800eSLuca Weiss { } 708*f003800eSLuca Weiss }; 709*f003800eSLuca Weiss 710*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cre_clk_src = { 711*f003800eSLuca Weiss .cmd_rcgr = 0x27004, 712*f003800eSLuca Weiss .mnd_width = 0, 713*f003800eSLuca Weiss .hid_width = 5, 714*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_2, 715*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cre_clk_src, 716*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 717*f003800eSLuca Weiss .name = "cam_cc_cre_clk_src", 718*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_2, 719*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), 720*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 721*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 722*f003800eSLuca Weiss }, 723*f003800eSLuca Weiss }; 724*f003800eSLuca Weiss 725*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = { 726*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 727*f003800eSLuca Weiss { } 728*f003800eSLuca Weiss }; 729*f003800eSLuca Weiss 730*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { 731*f003800eSLuca Weiss .cmd_rcgr = 0x19004, 732*f003800eSLuca Weiss .mnd_width = 0, 733*f003800eSLuca Weiss .hid_width = 5, 734*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 735*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 736*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 737*f003800eSLuca Weiss .name = "cam_cc_csi0phytimer_clk_src", 738*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 739*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 740*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 741*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 742*f003800eSLuca Weiss }, 743*f003800eSLuca Weiss }; 744*f003800eSLuca Weiss 745*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { 746*f003800eSLuca Weiss .cmd_rcgr = 0x19028, 747*f003800eSLuca Weiss .mnd_width = 0, 748*f003800eSLuca Weiss .hid_width = 5, 749*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 750*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 751*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 752*f003800eSLuca Weiss .name = "cam_cc_csi1phytimer_clk_src", 753*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 754*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 755*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 756*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 757*f003800eSLuca Weiss }, 758*f003800eSLuca Weiss }; 759*f003800eSLuca Weiss 760*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = { 761*f003800eSLuca Weiss .cmd_rcgr = 0x1904c, 762*f003800eSLuca Weiss .mnd_width = 0, 763*f003800eSLuca Weiss .hid_width = 5, 764*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 765*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 766*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 767*f003800eSLuca Weiss .name = "cam_cc_csi2phytimer_clk_src", 768*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 769*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 770*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 771*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 772*f003800eSLuca Weiss }, 773*f003800eSLuca Weiss }; 774*f003800eSLuca Weiss 775*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { 776*f003800eSLuca Weiss .cmd_rcgr = 0x19070, 777*f003800eSLuca Weiss .mnd_width = 0, 778*f003800eSLuca Weiss .hid_width = 5, 779*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 780*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 781*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 782*f003800eSLuca Weiss .name = "cam_cc_csi3phytimer_clk_src", 783*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 784*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 785*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 786*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 787*f003800eSLuca Weiss }, 788*f003800eSLuca Weiss }; 789*f003800eSLuca Weiss 790*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = { 791*f003800eSLuca Weiss F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0), 792*f003800eSLuca Weiss F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0), 793*f003800eSLuca Weiss F(200000000, P_CAM_CC_PLL0_OUT_MAIN, 6, 0, 0), 794*f003800eSLuca Weiss F(240000000, P_CAM_CC_PLL0_OUT_MAIN, 5, 0, 0), 795*f003800eSLuca Weiss { } 796*f003800eSLuca Weiss }; 797*f003800eSLuca Weiss 798*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { 799*f003800eSLuca Weiss .cmd_rcgr = 0x1a030, 800*f003800eSLuca Weiss .mnd_width = 0, 801*f003800eSLuca Weiss .hid_width = 5, 802*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 803*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_fast_ahb_clk_src, 804*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 805*f003800eSLuca Weiss .name = "cam_cc_fast_ahb_clk_src", 806*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 807*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 808*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 809*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 810*f003800eSLuca Weiss }, 811*f003800eSLuca Weiss }; 812*f003800eSLuca Weiss 813*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = { 814*f003800eSLuca Weiss F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0), 815*f003800eSLuca Weiss F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0), 816*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0), 817*f003800eSLuca Weiss { } 818*f003800eSLuca Weiss }; 819*f003800eSLuca Weiss 820*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_icp_clk_src = { 821*f003800eSLuca Weiss .cmd_rcgr = 0x20014, 822*f003800eSLuca Weiss .mnd_width = 0, 823*f003800eSLuca Weiss .hid_width = 5, 824*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_4, 825*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_icp_clk_src, 826*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 827*f003800eSLuca Weiss .name = "cam_cc_icp_clk_src", 828*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_4, 829*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_4), 830*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 831*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 832*f003800eSLuca Weiss }, 833*f003800eSLuca Weiss }; 834*f003800eSLuca Weiss 835*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = { 836*f003800eSLuca Weiss F(19200000, P_CAM_CC_PLL2_OUT_MAIN, 1, 1, 50), 837*f003800eSLuca Weiss F(24000000, P_CAM_CC_PLL2_OUT_MAIN, 10, 1, 4), 838*f003800eSLuca Weiss F(64000000, P_CAM_CC_PLL2_OUT_MAIN, 15, 0, 0), 839*f003800eSLuca Weiss { } 840*f003800eSLuca Weiss }; 841*f003800eSLuca Weiss 842*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk0_clk_src = { 843*f003800eSLuca Weiss .cmd_rcgr = 0x18004, 844*f003800eSLuca Weiss .mnd_width = 8, 845*f003800eSLuca Weiss .hid_width = 5, 846*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_1, 847*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 848*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 849*f003800eSLuca Weiss .name = "cam_cc_mclk0_clk_src", 850*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_1, 851*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 852*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 853*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 854*f003800eSLuca Weiss }, 855*f003800eSLuca Weiss }; 856*f003800eSLuca Weiss 857*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk1_clk_src = { 858*f003800eSLuca Weiss .cmd_rcgr = 0x18024, 859*f003800eSLuca Weiss .mnd_width = 8, 860*f003800eSLuca Weiss .hid_width = 5, 861*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_1, 862*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 863*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 864*f003800eSLuca Weiss .name = "cam_cc_mclk1_clk_src", 865*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_1, 866*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 867*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 868*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 869*f003800eSLuca Weiss }, 870*f003800eSLuca Weiss }; 871*f003800eSLuca Weiss 872*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk2_clk_src = { 873*f003800eSLuca Weiss .cmd_rcgr = 0x18044, 874*f003800eSLuca Weiss .mnd_width = 8, 875*f003800eSLuca Weiss .hid_width = 5, 876*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_1, 877*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 878*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 879*f003800eSLuca Weiss .name = "cam_cc_mclk2_clk_src", 880*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_1, 881*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 882*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 883*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 884*f003800eSLuca Weiss }, 885*f003800eSLuca Weiss }; 886*f003800eSLuca Weiss 887*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk3_clk_src = { 888*f003800eSLuca Weiss .cmd_rcgr = 0x18064, 889*f003800eSLuca Weiss .mnd_width = 8, 890*f003800eSLuca Weiss .hid_width = 5, 891*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_1, 892*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 893*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 894*f003800eSLuca Weiss .name = "cam_cc_mclk3_clk_src", 895*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_1, 896*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 897*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 898*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 899*f003800eSLuca Weiss }, 900*f003800eSLuca Weiss }; 901*f003800eSLuca Weiss 902*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk4_clk_src = { 903*f003800eSLuca Weiss .cmd_rcgr = 0x18084, 904*f003800eSLuca Weiss .mnd_width = 8, 905*f003800eSLuca Weiss .hid_width = 5, 906*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_1, 907*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 908*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 909*f003800eSLuca Weiss .name = "cam_cc_mclk4_clk_src", 910*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_1, 911*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 912*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 913*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 914*f003800eSLuca Weiss }, 915*f003800eSLuca Weiss }; 916*f003800eSLuca Weiss 917*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_ope_0_clk_src[] = { 918*f003800eSLuca Weiss F(300000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 919*f003800eSLuca Weiss F(410000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 920*f003800eSLuca Weiss F(520000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 921*f003800eSLuca Weiss F(645000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 922*f003800eSLuca Weiss F(700000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 923*f003800eSLuca Weiss { } 924*f003800eSLuca Weiss }; 925*f003800eSLuca Weiss 926*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_ope_0_clk_src = { 927*f003800eSLuca Weiss .cmd_rcgr = 0x1b004, 928*f003800eSLuca Weiss .mnd_width = 0, 929*f003800eSLuca Weiss .hid_width = 5, 930*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_5, 931*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_ope_0_clk_src, 932*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 933*f003800eSLuca Weiss .name = "cam_cc_ope_0_clk_src", 934*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_5, 935*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_5), 936*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 937*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 938*f003800eSLuca Weiss }, 939*f003800eSLuca Weiss }; 940*f003800eSLuca Weiss 941*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = { 942*f003800eSLuca Weiss F(32000, P_SLEEP_CLK, 1, 0, 0), 943*f003800eSLuca Weiss { } 944*f003800eSLuca Weiss }; 945*f003800eSLuca Weiss 946*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_sleep_clk_src = { 947*f003800eSLuca Weiss .cmd_rcgr = 0x25044, 948*f003800eSLuca Weiss .mnd_width = 0, 949*f003800eSLuca Weiss .hid_width = 5, 950*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_6, 951*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_sleep_clk_src, 952*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 953*f003800eSLuca Weiss .name = "cam_cc_sleep_clk_src", 954*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_6_ao, 955*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_6_ao), 956*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 957*f003800eSLuca Weiss .ops = &clk_rcg2_ops, 958*f003800eSLuca Weiss }, 959*f003800eSLuca Weiss }; 960*f003800eSLuca Weiss 961*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = { 962*f003800eSLuca Weiss F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0), 963*f003800eSLuca Weiss { } 964*f003800eSLuca Weiss }; 965*f003800eSLuca Weiss 966*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { 967*f003800eSLuca Weiss .cmd_rcgr = 0x1a04c, 968*f003800eSLuca Weiss .mnd_width = 0, 969*f003800eSLuca Weiss .hid_width = 5, 970*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 971*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_slow_ahb_clk_src, 972*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 973*f003800eSLuca Weiss .name = "cam_cc_slow_ahb_clk_src", 974*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 975*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 976*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 977*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 978*f003800eSLuca Weiss }, 979*f003800eSLuca Weiss }; 980*f003800eSLuca Weiss 981*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_0_clk_src[] = { 982*f003800eSLuca Weiss F(350000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 983*f003800eSLuca Weiss F(570000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 984*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 985*f003800eSLuca Weiss F(725000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 986*f003800eSLuca Weiss { } 987*f003800eSLuca Weiss }; 988*f003800eSLuca Weiss 989*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_0_clk_src = { 990*f003800eSLuca Weiss .cmd_rcgr = 0x1c004, 991*f003800eSLuca Weiss .mnd_width = 0, 992*f003800eSLuca Weiss .hid_width = 5, 993*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_7, 994*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_tfe_0_clk_src, 995*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 996*f003800eSLuca Weiss .name = "cam_cc_tfe_0_clk_src", 997*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_7, 998*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_7), 999*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1000*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1001*f003800eSLuca Weiss }, 1002*f003800eSLuca Weiss }; 1003*f003800eSLuca Weiss 1004*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_0_csid_clk_src = { 1005*f003800eSLuca Weiss .cmd_rcgr = 0x1c030, 1006*f003800eSLuca Weiss .mnd_width = 0, 1007*f003800eSLuca Weiss .hid_width = 5, 1008*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 1009*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1010*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1011*f003800eSLuca Weiss .name = "cam_cc_tfe_0_csid_clk_src", 1012*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 1013*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1014*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1015*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1016*f003800eSLuca Weiss }, 1017*f003800eSLuca Weiss }; 1018*f003800eSLuca Weiss 1019*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_1_clk_src[] = { 1020*f003800eSLuca Weiss F(350000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1021*f003800eSLuca Weiss F(570000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1022*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1023*f003800eSLuca Weiss F(725000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1024*f003800eSLuca Weiss { } 1025*f003800eSLuca Weiss }; 1026*f003800eSLuca Weiss 1027*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_1_clk_src = { 1028*f003800eSLuca Weiss .cmd_rcgr = 0x1d004, 1029*f003800eSLuca Weiss .mnd_width = 0, 1030*f003800eSLuca Weiss .hid_width = 5, 1031*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_8, 1032*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_tfe_1_clk_src, 1033*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1034*f003800eSLuca Weiss .name = "cam_cc_tfe_1_clk_src", 1035*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_8, 1036*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_8), 1037*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1038*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1039*f003800eSLuca Weiss }, 1040*f003800eSLuca Weiss }; 1041*f003800eSLuca Weiss 1042*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_1_csid_clk_src = { 1043*f003800eSLuca Weiss .cmd_rcgr = 0x1d030, 1044*f003800eSLuca Weiss .mnd_width = 0, 1045*f003800eSLuca Weiss .hid_width = 5, 1046*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 1047*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1048*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1049*f003800eSLuca Weiss .name = "cam_cc_tfe_1_csid_clk_src", 1050*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 1051*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1052*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1053*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1054*f003800eSLuca Weiss }, 1055*f003800eSLuca Weiss }; 1056*f003800eSLuca Weiss 1057*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_2_clk_src[] = { 1058*f003800eSLuca Weiss F(350000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1059*f003800eSLuca Weiss F(570000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1060*f003800eSLuca Weiss F(600000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1061*f003800eSLuca Weiss F(725000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1062*f003800eSLuca Weiss { } 1063*f003800eSLuca Weiss }; 1064*f003800eSLuca Weiss 1065*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_2_clk_src = { 1066*f003800eSLuca Weiss .cmd_rcgr = 0x1e004, 1067*f003800eSLuca Weiss .mnd_width = 0, 1068*f003800eSLuca Weiss .hid_width = 5, 1069*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_9, 1070*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_tfe_2_clk_src, 1071*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1072*f003800eSLuca Weiss .name = "cam_cc_tfe_2_clk_src", 1073*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_9, 1074*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_9), 1075*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1076*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1077*f003800eSLuca Weiss }, 1078*f003800eSLuca Weiss }; 1079*f003800eSLuca Weiss 1080*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_2_csid_clk_src = { 1081*f003800eSLuca Weiss .cmd_rcgr = 0x1e030, 1082*f003800eSLuca Weiss .mnd_width = 0, 1083*f003800eSLuca Weiss .hid_width = 5, 1084*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_0, 1085*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1086*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1087*f003800eSLuca Weiss .name = "cam_cc_tfe_2_csid_clk_src", 1088*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_0, 1089*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1090*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1091*f003800eSLuca Weiss .ops = &clk_rcg2_shared_ops, 1092*f003800eSLuca Weiss }, 1093*f003800eSLuca Weiss }; 1094*f003800eSLuca Weiss 1095*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = { 1096*f003800eSLuca Weiss F(19200000, P_BI_TCXO, 1, 0, 0), 1097*f003800eSLuca Weiss { } 1098*f003800eSLuca Weiss }; 1099*f003800eSLuca Weiss 1100*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_xo_clk_src = { 1101*f003800eSLuca Weiss .cmd_rcgr = 0x25020, 1102*f003800eSLuca Weiss .mnd_width = 0, 1103*f003800eSLuca Weiss .hid_width = 5, 1104*f003800eSLuca Weiss .parent_map = cam_cc_parent_map_10, 1105*f003800eSLuca Weiss .freq_tbl = ftbl_cam_cc_xo_clk_src, 1106*f003800eSLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 1107*f003800eSLuca Weiss .name = "cam_cc_xo_clk_src", 1108*f003800eSLuca Weiss .parent_data = cam_cc_parent_data_10, 1109*f003800eSLuca Weiss .num_parents = ARRAY_SIZE(cam_cc_parent_data_10), 1110*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1111*f003800eSLuca Weiss .ops = &clk_rcg2_ops, 1112*f003800eSLuca Weiss }, 1113*f003800eSLuca Weiss }; 1114*f003800eSLuca Weiss 1115*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_ahb_clk = { 1116*f003800eSLuca Weiss .halt_reg = 0x1a064, 1117*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1118*f003800eSLuca Weiss .clkr = { 1119*f003800eSLuca Weiss .enable_reg = 0x1a064, 1120*f003800eSLuca Weiss .enable_mask = BIT(0), 1121*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1122*f003800eSLuca Weiss .name = "cam_cc_bps_ahb_clk", 1123*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1124*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1125*f003800eSLuca Weiss }, 1126*f003800eSLuca Weiss .num_parents = 1, 1127*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1128*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1129*f003800eSLuca Weiss }, 1130*f003800eSLuca Weiss }, 1131*f003800eSLuca Weiss }; 1132*f003800eSLuca Weiss 1133*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_areg_clk = { 1134*f003800eSLuca Weiss .halt_reg = 0x1a048, 1135*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1136*f003800eSLuca Weiss .clkr = { 1137*f003800eSLuca Weiss .enable_reg = 0x1a048, 1138*f003800eSLuca Weiss .enable_mask = BIT(0), 1139*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1140*f003800eSLuca Weiss .name = "cam_cc_bps_areg_clk", 1141*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1142*f003800eSLuca Weiss &cam_cc_fast_ahb_clk_src.clkr.hw, 1143*f003800eSLuca Weiss }, 1144*f003800eSLuca Weiss .num_parents = 1, 1145*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1146*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1147*f003800eSLuca Weiss }, 1148*f003800eSLuca Weiss }, 1149*f003800eSLuca Weiss }; 1150*f003800eSLuca Weiss 1151*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_clk = { 1152*f003800eSLuca Weiss .halt_reg = 0x1a01c, 1153*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1154*f003800eSLuca Weiss .clkr = { 1155*f003800eSLuca Weiss .enable_reg = 0x1a01c, 1156*f003800eSLuca Weiss .enable_mask = BIT(0), 1157*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1158*f003800eSLuca Weiss .name = "cam_cc_bps_clk", 1159*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1160*f003800eSLuca Weiss &cam_cc_bps_clk_src.clkr.hw, 1161*f003800eSLuca Weiss }, 1162*f003800eSLuca Weiss .num_parents = 1, 1163*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1164*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1165*f003800eSLuca Weiss }, 1166*f003800eSLuca Weiss }, 1167*f003800eSLuca Weiss }; 1168*f003800eSLuca Weiss 1169*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_atb_clk = { 1170*f003800eSLuca Weiss .halt_reg = 0x24040, 1171*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1172*f003800eSLuca Weiss .clkr = { 1173*f003800eSLuca Weiss .enable_reg = 0x24040, 1174*f003800eSLuca Weiss .enable_mask = BIT(0), 1175*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1176*f003800eSLuca Weiss .name = "cam_cc_camnoc_atb_clk", 1177*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1178*f003800eSLuca Weiss }, 1179*f003800eSLuca Weiss }, 1180*f003800eSLuca Weiss }; 1181*f003800eSLuca Weiss 1182*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_axi_hf_clk = { 1183*f003800eSLuca Weiss .halt_reg = 0x24010, 1184*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1185*f003800eSLuca Weiss .clkr = { 1186*f003800eSLuca Weiss .enable_reg = 0x24010, 1187*f003800eSLuca Weiss .enable_mask = BIT(0), 1188*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1189*f003800eSLuca Weiss .name = "cam_cc_camnoc_axi_hf_clk", 1190*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1191*f003800eSLuca Weiss }, 1192*f003800eSLuca Weiss }, 1193*f003800eSLuca Weiss }; 1194*f003800eSLuca Weiss 1195*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_axi_sf_clk = { 1196*f003800eSLuca Weiss .halt_reg = 0x24004, 1197*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1198*f003800eSLuca Weiss .clkr = { 1199*f003800eSLuca Weiss .enable_reg = 0x24004, 1200*f003800eSLuca Weiss .enable_mask = BIT(0), 1201*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1202*f003800eSLuca Weiss .name = "cam_cc_camnoc_axi_sf_clk", 1203*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1204*f003800eSLuca Weiss }, 1205*f003800eSLuca Weiss }, 1206*f003800eSLuca Weiss }; 1207*f003800eSLuca Weiss 1208*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_nrt_axi_clk = { 1209*f003800eSLuca Weiss .halt_reg = 0x2404c, 1210*f003800eSLuca Weiss .halt_check = BRANCH_HALT_VOTED, 1211*f003800eSLuca Weiss .hwcg_reg = 0x2404c, 1212*f003800eSLuca Weiss .hwcg_bit = 1, 1213*f003800eSLuca Weiss .clkr = { 1214*f003800eSLuca Weiss .enable_reg = 0x2404c, 1215*f003800eSLuca Weiss .enable_mask = BIT(0), 1216*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1217*f003800eSLuca Weiss .name = "cam_cc_camnoc_nrt_axi_clk", 1218*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1219*f003800eSLuca Weiss &cam_cc_camnoc_axi_clk_src.clkr.hw, 1220*f003800eSLuca Weiss }, 1221*f003800eSLuca Weiss .num_parents = 1, 1222*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1223*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1224*f003800eSLuca Weiss }, 1225*f003800eSLuca Weiss }, 1226*f003800eSLuca Weiss }; 1227*f003800eSLuca Weiss 1228*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_rt_axi_clk = { 1229*f003800eSLuca Weiss .halt_reg = 0x24034, 1230*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1231*f003800eSLuca Weiss .clkr = { 1232*f003800eSLuca Weiss .enable_reg = 0x24034, 1233*f003800eSLuca Weiss .enable_mask = BIT(0), 1234*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1235*f003800eSLuca Weiss .name = "cam_cc_camnoc_rt_axi_clk", 1236*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1237*f003800eSLuca Weiss &cam_cc_camnoc_axi_clk_src.clkr.hw, 1238*f003800eSLuca Weiss }, 1239*f003800eSLuca Weiss .num_parents = 1, 1240*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1241*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1242*f003800eSLuca Weiss }, 1243*f003800eSLuca Weiss }, 1244*f003800eSLuca Weiss }; 1245*f003800eSLuca Weiss 1246*f003800eSLuca Weiss static struct clk_branch cam_cc_cci_0_clk = { 1247*f003800eSLuca Weiss .halt_reg = 0x2101c, 1248*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1249*f003800eSLuca Weiss .clkr = { 1250*f003800eSLuca Weiss .enable_reg = 0x2101c, 1251*f003800eSLuca Weiss .enable_mask = BIT(0), 1252*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1253*f003800eSLuca Weiss .name = "cam_cc_cci_0_clk", 1254*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1255*f003800eSLuca Weiss &cam_cc_cci_0_clk_src.clkr.hw, 1256*f003800eSLuca Weiss }, 1257*f003800eSLuca Weiss .num_parents = 1, 1258*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1259*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1260*f003800eSLuca Weiss }, 1261*f003800eSLuca Weiss }, 1262*f003800eSLuca Weiss }; 1263*f003800eSLuca Weiss 1264*f003800eSLuca Weiss static struct clk_branch cam_cc_cci_1_clk = { 1265*f003800eSLuca Weiss .halt_reg = 0x2201c, 1266*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1267*f003800eSLuca Weiss .clkr = { 1268*f003800eSLuca Weiss .enable_reg = 0x2201c, 1269*f003800eSLuca Weiss .enable_mask = BIT(0), 1270*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1271*f003800eSLuca Weiss .name = "cam_cc_cci_1_clk", 1272*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1273*f003800eSLuca Weiss &cam_cc_cci_1_clk_src.clkr.hw, 1274*f003800eSLuca Weiss }, 1275*f003800eSLuca Weiss .num_parents = 1, 1276*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1277*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1278*f003800eSLuca Weiss }, 1279*f003800eSLuca Weiss }, 1280*f003800eSLuca Weiss }; 1281*f003800eSLuca Weiss 1282*f003800eSLuca Weiss static struct clk_branch cam_cc_core_ahb_clk = { 1283*f003800eSLuca Weiss .halt_reg = 0x2501c, 1284*f003800eSLuca Weiss .halt_check = BRANCH_HALT_DELAY, 1285*f003800eSLuca Weiss .clkr = { 1286*f003800eSLuca Weiss .enable_reg = 0x2501c, 1287*f003800eSLuca Weiss .enable_mask = BIT(0), 1288*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1289*f003800eSLuca Weiss .name = "cam_cc_core_ahb_clk", 1290*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1291*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1292*f003800eSLuca Weiss }, 1293*f003800eSLuca Weiss .num_parents = 1, 1294*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1295*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1296*f003800eSLuca Weiss }, 1297*f003800eSLuca Weiss }, 1298*f003800eSLuca Weiss }; 1299*f003800eSLuca Weiss 1300*f003800eSLuca Weiss static struct clk_branch cam_cc_cpas_ahb_clk = { 1301*f003800eSLuca Weiss .halt_reg = 0x23004, 1302*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1303*f003800eSLuca Weiss .clkr = { 1304*f003800eSLuca Weiss .enable_reg = 0x23004, 1305*f003800eSLuca Weiss .enable_mask = BIT(0), 1306*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1307*f003800eSLuca Weiss .name = "cam_cc_cpas_ahb_clk", 1308*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1309*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1310*f003800eSLuca Weiss }, 1311*f003800eSLuca Weiss .num_parents = 1, 1312*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1313*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1314*f003800eSLuca Weiss }, 1315*f003800eSLuca Weiss }, 1316*f003800eSLuca Weiss }; 1317*f003800eSLuca Weiss 1318*f003800eSLuca Weiss static struct clk_branch cam_cc_cre_ahb_clk = { 1319*f003800eSLuca Weiss .halt_reg = 0x27020, 1320*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1321*f003800eSLuca Weiss .clkr = { 1322*f003800eSLuca Weiss .enable_reg = 0x27020, 1323*f003800eSLuca Weiss .enable_mask = BIT(0), 1324*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1325*f003800eSLuca Weiss .name = "cam_cc_cre_ahb_clk", 1326*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1327*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1328*f003800eSLuca Weiss }, 1329*f003800eSLuca Weiss .num_parents = 1, 1330*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1331*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1332*f003800eSLuca Weiss }, 1333*f003800eSLuca Weiss }, 1334*f003800eSLuca Weiss }; 1335*f003800eSLuca Weiss 1336*f003800eSLuca Weiss static struct clk_branch cam_cc_cre_clk = { 1337*f003800eSLuca Weiss .halt_reg = 0x2701c, 1338*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1339*f003800eSLuca Weiss .clkr = { 1340*f003800eSLuca Weiss .enable_reg = 0x2701c, 1341*f003800eSLuca Weiss .enable_mask = BIT(0), 1342*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1343*f003800eSLuca Weiss .name = "cam_cc_cre_clk", 1344*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1345*f003800eSLuca Weiss &cam_cc_cre_clk_src.clkr.hw, 1346*f003800eSLuca Weiss }, 1347*f003800eSLuca Weiss .num_parents = 1, 1348*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1349*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1350*f003800eSLuca Weiss }, 1351*f003800eSLuca Weiss }, 1352*f003800eSLuca Weiss }; 1353*f003800eSLuca Weiss 1354*f003800eSLuca Weiss static struct clk_branch cam_cc_csi0phytimer_clk = { 1355*f003800eSLuca Weiss .halt_reg = 0x1901c, 1356*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1357*f003800eSLuca Weiss .clkr = { 1358*f003800eSLuca Weiss .enable_reg = 0x1901c, 1359*f003800eSLuca Weiss .enable_mask = BIT(0), 1360*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1361*f003800eSLuca Weiss .name = "cam_cc_csi0phytimer_clk", 1362*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1363*f003800eSLuca Weiss &cam_cc_csi0phytimer_clk_src.clkr.hw, 1364*f003800eSLuca Weiss }, 1365*f003800eSLuca Weiss .num_parents = 1, 1366*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1367*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1368*f003800eSLuca Weiss }, 1369*f003800eSLuca Weiss }, 1370*f003800eSLuca Weiss }; 1371*f003800eSLuca Weiss 1372*f003800eSLuca Weiss static struct clk_branch cam_cc_csi1phytimer_clk = { 1373*f003800eSLuca Weiss .halt_reg = 0x19040, 1374*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1375*f003800eSLuca Weiss .clkr = { 1376*f003800eSLuca Weiss .enable_reg = 0x19040, 1377*f003800eSLuca Weiss .enable_mask = BIT(0), 1378*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1379*f003800eSLuca Weiss .name = "cam_cc_csi1phytimer_clk", 1380*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1381*f003800eSLuca Weiss &cam_cc_csi1phytimer_clk_src.clkr.hw, 1382*f003800eSLuca Weiss }, 1383*f003800eSLuca Weiss .num_parents = 1, 1384*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1385*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1386*f003800eSLuca Weiss }, 1387*f003800eSLuca Weiss }, 1388*f003800eSLuca Weiss }; 1389*f003800eSLuca Weiss 1390*f003800eSLuca Weiss static struct clk_branch cam_cc_csi2phytimer_clk = { 1391*f003800eSLuca Weiss .halt_reg = 0x19064, 1392*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1393*f003800eSLuca Weiss .clkr = { 1394*f003800eSLuca Weiss .enable_reg = 0x19064, 1395*f003800eSLuca Weiss .enable_mask = BIT(0), 1396*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1397*f003800eSLuca Weiss .name = "cam_cc_csi2phytimer_clk", 1398*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1399*f003800eSLuca Weiss &cam_cc_csi2phytimer_clk_src.clkr.hw, 1400*f003800eSLuca Weiss }, 1401*f003800eSLuca Weiss .num_parents = 1, 1402*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1403*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1404*f003800eSLuca Weiss }, 1405*f003800eSLuca Weiss }, 1406*f003800eSLuca Weiss }; 1407*f003800eSLuca Weiss 1408*f003800eSLuca Weiss static struct clk_branch cam_cc_csi3phytimer_clk = { 1409*f003800eSLuca Weiss .halt_reg = 0x19088, 1410*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1411*f003800eSLuca Weiss .clkr = { 1412*f003800eSLuca Weiss .enable_reg = 0x19088, 1413*f003800eSLuca Weiss .enable_mask = BIT(0), 1414*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1415*f003800eSLuca Weiss .name = "cam_cc_csi3phytimer_clk", 1416*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1417*f003800eSLuca Weiss &cam_cc_csi3phytimer_clk_src.clkr.hw, 1418*f003800eSLuca Weiss }, 1419*f003800eSLuca Weiss .num_parents = 1, 1420*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1421*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1422*f003800eSLuca Weiss }, 1423*f003800eSLuca Weiss }, 1424*f003800eSLuca Weiss }; 1425*f003800eSLuca Weiss 1426*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy0_clk = { 1427*f003800eSLuca Weiss .halt_reg = 0x19020, 1428*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1429*f003800eSLuca Weiss .clkr = { 1430*f003800eSLuca Weiss .enable_reg = 0x19020, 1431*f003800eSLuca Weiss .enable_mask = BIT(0), 1432*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1433*f003800eSLuca Weiss .name = "cam_cc_csiphy0_clk", 1434*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1435*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1436*f003800eSLuca Weiss }, 1437*f003800eSLuca Weiss .num_parents = 1, 1438*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1439*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1440*f003800eSLuca Weiss }, 1441*f003800eSLuca Weiss }, 1442*f003800eSLuca Weiss }; 1443*f003800eSLuca Weiss 1444*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy1_clk = { 1445*f003800eSLuca Weiss .halt_reg = 0x19044, 1446*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1447*f003800eSLuca Weiss .clkr = { 1448*f003800eSLuca Weiss .enable_reg = 0x19044, 1449*f003800eSLuca Weiss .enable_mask = BIT(0), 1450*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1451*f003800eSLuca Weiss .name = "cam_cc_csiphy1_clk", 1452*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1453*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1454*f003800eSLuca Weiss }, 1455*f003800eSLuca Weiss .num_parents = 1, 1456*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1457*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1458*f003800eSLuca Weiss }, 1459*f003800eSLuca Weiss }, 1460*f003800eSLuca Weiss }; 1461*f003800eSLuca Weiss 1462*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy2_clk = { 1463*f003800eSLuca Weiss .halt_reg = 0x19068, 1464*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1465*f003800eSLuca Weiss .clkr = { 1466*f003800eSLuca Weiss .enable_reg = 0x19068, 1467*f003800eSLuca Weiss .enable_mask = BIT(0), 1468*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1469*f003800eSLuca Weiss .name = "cam_cc_csiphy2_clk", 1470*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1471*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1472*f003800eSLuca Weiss }, 1473*f003800eSLuca Weiss .num_parents = 1, 1474*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1475*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1476*f003800eSLuca Weiss }, 1477*f003800eSLuca Weiss }, 1478*f003800eSLuca Weiss }; 1479*f003800eSLuca Weiss 1480*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy3_clk = { 1481*f003800eSLuca Weiss .halt_reg = 0x1908c, 1482*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1483*f003800eSLuca Weiss .clkr = { 1484*f003800eSLuca Weiss .enable_reg = 0x1908c, 1485*f003800eSLuca Weiss .enable_mask = BIT(0), 1486*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1487*f003800eSLuca Weiss .name = "cam_cc_csiphy3_clk", 1488*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1489*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1490*f003800eSLuca Weiss }, 1491*f003800eSLuca Weiss .num_parents = 1, 1492*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1493*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1494*f003800eSLuca Weiss }, 1495*f003800eSLuca Weiss }, 1496*f003800eSLuca Weiss }; 1497*f003800eSLuca Weiss 1498*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_atb_clk = { 1499*f003800eSLuca Weiss .halt_reg = 0x20004, 1500*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1501*f003800eSLuca Weiss .clkr = { 1502*f003800eSLuca Weiss .enable_reg = 0x20004, 1503*f003800eSLuca Weiss .enable_mask = BIT(0), 1504*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1505*f003800eSLuca Weiss .name = "cam_cc_icp_atb_clk", 1506*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1507*f003800eSLuca Weiss }, 1508*f003800eSLuca Weiss }, 1509*f003800eSLuca Weiss }; 1510*f003800eSLuca Weiss 1511*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_clk = { 1512*f003800eSLuca Weiss .halt_reg = 0x2002c, 1513*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1514*f003800eSLuca Weiss .clkr = { 1515*f003800eSLuca Weiss .enable_reg = 0x2002c, 1516*f003800eSLuca Weiss .enable_mask = BIT(0), 1517*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1518*f003800eSLuca Weiss .name = "cam_cc_icp_clk", 1519*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1520*f003800eSLuca Weiss &cam_cc_icp_clk_src.clkr.hw, 1521*f003800eSLuca Weiss }, 1522*f003800eSLuca Weiss .num_parents = 1, 1523*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1524*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1525*f003800eSLuca Weiss }, 1526*f003800eSLuca Weiss }, 1527*f003800eSLuca Weiss }; 1528*f003800eSLuca Weiss 1529*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_cti_clk = { 1530*f003800eSLuca Weiss .halt_reg = 0x20008, 1531*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1532*f003800eSLuca Weiss .clkr = { 1533*f003800eSLuca Weiss .enable_reg = 0x20008, 1534*f003800eSLuca Weiss .enable_mask = BIT(0), 1535*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1536*f003800eSLuca Weiss .name = "cam_cc_icp_cti_clk", 1537*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1538*f003800eSLuca Weiss }, 1539*f003800eSLuca Weiss }, 1540*f003800eSLuca Weiss }; 1541*f003800eSLuca Weiss 1542*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_ts_clk = { 1543*f003800eSLuca Weiss .halt_reg = 0x2000c, 1544*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1545*f003800eSLuca Weiss .clkr = { 1546*f003800eSLuca Weiss .enable_reg = 0x2000c, 1547*f003800eSLuca Weiss .enable_mask = BIT(0), 1548*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1549*f003800eSLuca Weiss .name = "cam_cc_icp_ts_clk", 1550*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1551*f003800eSLuca Weiss }, 1552*f003800eSLuca Weiss }, 1553*f003800eSLuca Weiss }; 1554*f003800eSLuca Weiss 1555*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk0_clk = { 1556*f003800eSLuca Weiss .halt_reg = 0x1801c, 1557*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1558*f003800eSLuca Weiss .clkr = { 1559*f003800eSLuca Weiss .enable_reg = 0x1801c, 1560*f003800eSLuca Weiss .enable_mask = BIT(0), 1561*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1562*f003800eSLuca Weiss .name = "cam_cc_mclk0_clk", 1563*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1564*f003800eSLuca Weiss &cam_cc_mclk0_clk_src.clkr.hw, 1565*f003800eSLuca Weiss }, 1566*f003800eSLuca Weiss .num_parents = 1, 1567*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1568*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1569*f003800eSLuca Weiss }, 1570*f003800eSLuca Weiss }, 1571*f003800eSLuca Weiss }; 1572*f003800eSLuca Weiss 1573*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk1_clk = { 1574*f003800eSLuca Weiss .halt_reg = 0x1803c, 1575*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1576*f003800eSLuca Weiss .clkr = { 1577*f003800eSLuca Weiss .enable_reg = 0x1803c, 1578*f003800eSLuca Weiss .enable_mask = BIT(0), 1579*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1580*f003800eSLuca Weiss .name = "cam_cc_mclk1_clk", 1581*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1582*f003800eSLuca Weiss &cam_cc_mclk1_clk_src.clkr.hw, 1583*f003800eSLuca Weiss }, 1584*f003800eSLuca Weiss .num_parents = 1, 1585*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1586*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1587*f003800eSLuca Weiss }, 1588*f003800eSLuca Weiss }, 1589*f003800eSLuca Weiss }; 1590*f003800eSLuca Weiss 1591*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk2_clk = { 1592*f003800eSLuca Weiss .halt_reg = 0x1805c, 1593*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1594*f003800eSLuca Weiss .clkr = { 1595*f003800eSLuca Weiss .enable_reg = 0x1805c, 1596*f003800eSLuca Weiss .enable_mask = BIT(0), 1597*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1598*f003800eSLuca Weiss .name = "cam_cc_mclk2_clk", 1599*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1600*f003800eSLuca Weiss &cam_cc_mclk2_clk_src.clkr.hw, 1601*f003800eSLuca Weiss }, 1602*f003800eSLuca Weiss .num_parents = 1, 1603*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1604*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1605*f003800eSLuca Weiss }, 1606*f003800eSLuca Weiss }, 1607*f003800eSLuca Weiss }; 1608*f003800eSLuca Weiss 1609*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk3_clk = { 1610*f003800eSLuca Weiss .halt_reg = 0x1807c, 1611*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1612*f003800eSLuca Weiss .clkr = { 1613*f003800eSLuca Weiss .enable_reg = 0x1807c, 1614*f003800eSLuca Weiss .enable_mask = BIT(0), 1615*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1616*f003800eSLuca Weiss .name = "cam_cc_mclk3_clk", 1617*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1618*f003800eSLuca Weiss &cam_cc_mclk3_clk_src.clkr.hw, 1619*f003800eSLuca Weiss }, 1620*f003800eSLuca Weiss .num_parents = 1, 1621*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1622*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1623*f003800eSLuca Weiss }, 1624*f003800eSLuca Weiss }, 1625*f003800eSLuca Weiss }; 1626*f003800eSLuca Weiss 1627*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk4_clk = { 1628*f003800eSLuca Weiss .halt_reg = 0x1809c, 1629*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1630*f003800eSLuca Weiss .clkr = { 1631*f003800eSLuca Weiss .enable_reg = 0x1809c, 1632*f003800eSLuca Weiss .enable_mask = BIT(0), 1633*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1634*f003800eSLuca Weiss .name = "cam_cc_mclk4_clk", 1635*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1636*f003800eSLuca Weiss &cam_cc_mclk4_clk_src.clkr.hw, 1637*f003800eSLuca Weiss }, 1638*f003800eSLuca Weiss .num_parents = 1, 1639*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1640*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1641*f003800eSLuca Weiss }, 1642*f003800eSLuca Weiss }, 1643*f003800eSLuca Weiss }; 1644*f003800eSLuca Weiss 1645*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_ahb_clk = { 1646*f003800eSLuca Weiss .halt_reg = 0x1b034, 1647*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1648*f003800eSLuca Weiss .clkr = { 1649*f003800eSLuca Weiss .enable_reg = 0x1b034, 1650*f003800eSLuca Weiss .enable_mask = BIT(0), 1651*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1652*f003800eSLuca Weiss .name = "cam_cc_ope_0_ahb_clk", 1653*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1654*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1655*f003800eSLuca Weiss }, 1656*f003800eSLuca Weiss .num_parents = 1, 1657*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1658*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1659*f003800eSLuca Weiss }, 1660*f003800eSLuca Weiss }, 1661*f003800eSLuca Weiss }; 1662*f003800eSLuca Weiss 1663*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_areg_clk = { 1664*f003800eSLuca Weiss .halt_reg = 0x1b030, 1665*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1666*f003800eSLuca Weiss .clkr = { 1667*f003800eSLuca Weiss .enable_reg = 0x1b030, 1668*f003800eSLuca Weiss .enable_mask = BIT(0), 1669*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1670*f003800eSLuca Weiss .name = "cam_cc_ope_0_areg_clk", 1671*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1672*f003800eSLuca Weiss &cam_cc_fast_ahb_clk_src.clkr.hw, 1673*f003800eSLuca Weiss }, 1674*f003800eSLuca Weiss .num_parents = 1, 1675*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1676*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1677*f003800eSLuca Weiss }, 1678*f003800eSLuca Weiss }, 1679*f003800eSLuca Weiss }; 1680*f003800eSLuca Weiss 1681*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_clk = { 1682*f003800eSLuca Weiss .halt_reg = 0x1b01c, 1683*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1684*f003800eSLuca Weiss .clkr = { 1685*f003800eSLuca Weiss .enable_reg = 0x1b01c, 1686*f003800eSLuca Weiss .enable_mask = BIT(0), 1687*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1688*f003800eSLuca Weiss .name = "cam_cc_ope_0_clk", 1689*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1690*f003800eSLuca Weiss &cam_cc_ope_0_clk_src.clkr.hw, 1691*f003800eSLuca Weiss }, 1692*f003800eSLuca Weiss .num_parents = 1, 1693*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1694*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1695*f003800eSLuca Weiss }, 1696*f003800eSLuca Weiss }, 1697*f003800eSLuca Weiss }; 1698*f003800eSLuca Weiss 1699*f003800eSLuca Weiss static struct clk_branch cam_cc_soc_ahb_clk = { 1700*f003800eSLuca Weiss .halt_reg = 0x25018, 1701*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1702*f003800eSLuca Weiss .clkr = { 1703*f003800eSLuca Weiss .enable_reg = 0x25018, 1704*f003800eSLuca Weiss .enable_mask = BIT(0), 1705*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1706*f003800eSLuca Weiss .name = "cam_cc_soc_ahb_clk", 1707*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1708*f003800eSLuca Weiss }, 1709*f003800eSLuca Weiss }, 1710*f003800eSLuca Weiss }; 1711*f003800eSLuca Weiss 1712*f003800eSLuca Weiss static struct clk_branch cam_cc_sys_tmr_clk = { 1713*f003800eSLuca Weiss .halt_reg = 0x20038, 1714*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1715*f003800eSLuca Weiss .clkr = { 1716*f003800eSLuca Weiss .enable_reg = 0x20038, 1717*f003800eSLuca Weiss .enable_mask = BIT(0), 1718*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1719*f003800eSLuca Weiss .name = "cam_cc_sys_tmr_clk", 1720*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1721*f003800eSLuca Weiss &cam_cc_xo_clk_src.clkr.hw, 1722*f003800eSLuca Weiss }, 1723*f003800eSLuca Weiss .num_parents = 1, 1724*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1725*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1726*f003800eSLuca Weiss }, 1727*f003800eSLuca Weiss }, 1728*f003800eSLuca Weiss }; 1729*f003800eSLuca Weiss 1730*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_ahb_clk = { 1731*f003800eSLuca Weiss .halt_reg = 0x1c078, 1732*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1733*f003800eSLuca Weiss .clkr = { 1734*f003800eSLuca Weiss .enable_reg = 0x1c078, 1735*f003800eSLuca Weiss .enable_mask = BIT(0), 1736*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1737*f003800eSLuca Weiss .name = "cam_cc_tfe_0_ahb_clk", 1738*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1739*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1740*f003800eSLuca Weiss }, 1741*f003800eSLuca Weiss .num_parents = 1, 1742*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1743*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1744*f003800eSLuca Weiss }, 1745*f003800eSLuca Weiss }, 1746*f003800eSLuca Weiss }; 1747*f003800eSLuca Weiss 1748*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_clk = { 1749*f003800eSLuca Weiss .halt_reg = 0x1c01c, 1750*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1751*f003800eSLuca Weiss .clkr = { 1752*f003800eSLuca Weiss .enable_reg = 0x1c01c, 1753*f003800eSLuca Weiss .enable_mask = BIT(0), 1754*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1755*f003800eSLuca Weiss .name = "cam_cc_tfe_0_clk", 1756*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1757*f003800eSLuca Weiss &cam_cc_tfe_0_clk_src.clkr.hw, 1758*f003800eSLuca Weiss }, 1759*f003800eSLuca Weiss .num_parents = 1, 1760*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1761*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1762*f003800eSLuca Weiss }, 1763*f003800eSLuca Weiss }, 1764*f003800eSLuca Weiss }; 1765*f003800eSLuca Weiss 1766*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_cphy_rx_clk = { 1767*f003800eSLuca Weiss .halt_reg = 0x1c074, 1768*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1769*f003800eSLuca Weiss .clkr = { 1770*f003800eSLuca Weiss .enable_reg = 0x1c074, 1771*f003800eSLuca Weiss .enable_mask = BIT(0), 1772*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1773*f003800eSLuca Weiss .name = "cam_cc_tfe_0_cphy_rx_clk", 1774*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1775*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1776*f003800eSLuca Weiss }, 1777*f003800eSLuca Weiss .num_parents = 1, 1778*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1779*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1780*f003800eSLuca Weiss }, 1781*f003800eSLuca Weiss }, 1782*f003800eSLuca Weiss }; 1783*f003800eSLuca Weiss 1784*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_csid_clk = { 1785*f003800eSLuca Weiss .halt_reg = 0x1c048, 1786*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1787*f003800eSLuca Weiss .clkr = { 1788*f003800eSLuca Weiss .enable_reg = 0x1c048, 1789*f003800eSLuca Weiss .enable_mask = BIT(0), 1790*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1791*f003800eSLuca Weiss .name = "cam_cc_tfe_0_csid_clk", 1792*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1793*f003800eSLuca Weiss &cam_cc_tfe_0_csid_clk_src.clkr.hw, 1794*f003800eSLuca Weiss }, 1795*f003800eSLuca Weiss .num_parents = 1, 1796*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1797*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1798*f003800eSLuca Weiss }, 1799*f003800eSLuca Weiss }, 1800*f003800eSLuca Weiss }; 1801*f003800eSLuca Weiss 1802*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_ahb_clk = { 1803*f003800eSLuca Weiss .halt_reg = 0x1d058, 1804*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1805*f003800eSLuca Weiss .clkr = { 1806*f003800eSLuca Weiss .enable_reg = 0x1d058, 1807*f003800eSLuca Weiss .enable_mask = BIT(0), 1808*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1809*f003800eSLuca Weiss .name = "cam_cc_tfe_1_ahb_clk", 1810*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1811*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1812*f003800eSLuca Weiss }, 1813*f003800eSLuca Weiss .num_parents = 1, 1814*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1815*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1816*f003800eSLuca Weiss }, 1817*f003800eSLuca Weiss }, 1818*f003800eSLuca Weiss }; 1819*f003800eSLuca Weiss 1820*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_clk = { 1821*f003800eSLuca Weiss .halt_reg = 0x1d01c, 1822*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1823*f003800eSLuca Weiss .clkr = { 1824*f003800eSLuca Weiss .enable_reg = 0x1d01c, 1825*f003800eSLuca Weiss .enable_mask = BIT(0), 1826*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1827*f003800eSLuca Weiss .name = "cam_cc_tfe_1_clk", 1828*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1829*f003800eSLuca Weiss &cam_cc_tfe_1_clk_src.clkr.hw, 1830*f003800eSLuca Weiss }, 1831*f003800eSLuca Weiss .num_parents = 1, 1832*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1833*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1834*f003800eSLuca Weiss }, 1835*f003800eSLuca Weiss }, 1836*f003800eSLuca Weiss }; 1837*f003800eSLuca Weiss 1838*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_cphy_rx_clk = { 1839*f003800eSLuca Weiss .halt_reg = 0x1d054, 1840*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1841*f003800eSLuca Weiss .clkr = { 1842*f003800eSLuca Weiss .enable_reg = 0x1d054, 1843*f003800eSLuca Weiss .enable_mask = BIT(0), 1844*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1845*f003800eSLuca Weiss .name = "cam_cc_tfe_1_cphy_rx_clk", 1846*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1847*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1848*f003800eSLuca Weiss }, 1849*f003800eSLuca Weiss .num_parents = 1, 1850*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1851*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1852*f003800eSLuca Weiss }, 1853*f003800eSLuca Weiss }, 1854*f003800eSLuca Weiss }; 1855*f003800eSLuca Weiss 1856*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_csid_clk = { 1857*f003800eSLuca Weiss .halt_reg = 0x1d048, 1858*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1859*f003800eSLuca Weiss .clkr = { 1860*f003800eSLuca Weiss .enable_reg = 0x1d048, 1861*f003800eSLuca Weiss .enable_mask = BIT(0), 1862*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1863*f003800eSLuca Weiss .name = "cam_cc_tfe_1_csid_clk", 1864*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1865*f003800eSLuca Weiss &cam_cc_tfe_1_csid_clk_src.clkr.hw, 1866*f003800eSLuca Weiss }, 1867*f003800eSLuca Weiss .num_parents = 1, 1868*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1869*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1870*f003800eSLuca Weiss }, 1871*f003800eSLuca Weiss }, 1872*f003800eSLuca Weiss }; 1873*f003800eSLuca Weiss 1874*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_ahb_clk = { 1875*f003800eSLuca Weiss .halt_reg = 0x1e058, 1876*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1877*f003800eSLuca Weiss .clkr = { 1878*f003800eSLuca Weiss .enable_reg = 0x1e058, 1879*f003800eSLuca Weiss .enable_mask = BIT(0), 1880*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1881*f003800eSLuca Weiss .name = "cam_cc_tfe_2_ahb_clk", 1882*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1883*f003800eSLuca Weiss &cam_cc_slow_ahb_clk_src.clkr.hw, 1884*f003800eSLuca Weiss }, 1885*f003800eSLuca Weiss .num_parents = 1, 1886*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1887*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1888*f003800eSLuca Weiss }, 1889*f003800eSLuca Weiss }, 1890*f003800eSLuca Weiss }; 1891*f003800eSLuca Weiss 1892*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_clk = { 1893*f003800eSLuca Weiss .halt_reg = 0x1e01c, 1894*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1895*f003800eSLuca Weiss .clkr = { 1896*f003800eSLuca Weiss .enable_reg = 0x1e01c, 1897*f003800eSLuca Weiss .enable_mask = BIT(0), 1898*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1899*f003800eSLuca Weiss .name = "cam_cc_tfe_2_clk", 1900*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1901*f003800eSLuca Weiss &cam_cc_tfe_2_clk_src.clkr.hw, 1902*f003800eSLuca Weiss }, 1903*f003800eSLuca Weiss .num_parents = 1, 1904*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1905*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1906*f003800eSLuca Weiss }, 1907*f003800eSLuca Weiss }, 1908*f003800eSLuca Weiss }; 1909*f003800eSLuca Weiss 1910*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_cphy_rx_clk = { 1911*f003800eSLuca Weiss .halt_reg = 0x1e054, 1912*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1913*f003800eSLuca Weiss .clkr = { 1914*f003800eSLuca Weiss .enable_reg = 0x1e054, 1915*f003800eSLuca Weiss .enable_mask = BIT(0), 1916*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1917*f003800eSLuca Weiss .name = "cam_cc_tfe_2_cphy_rx_clk", 1918*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1919*f003800eSLuca Weiss &cam_cc_cphy_rx_clk_src.clkr.hw, 1920*f003800eSLuca Weiss }, 1921*f003800eSLuca Weiss .num_parents = 1, 1922*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1923*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1924*f003800eSLuca Weiss }, 1925*f003800eSLuca Weiss }, 1926*f003800eSLuca Weiss }; 1927*f003800eSLuca Weiss 1928*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_csid_clk = { 1929*f003800eSLuca Weiss .halt_reg = 0x1e048, 1930*f003800eSLuca Weiss .halt_check = BRANCH_HALT, 1931*f003800eSLuca Weiss .clkr = { 1932*f003800eSLuca Weiss .enable_reg = 0x1e048, 1933*f003800eSLuca Weiss .enable_mask = BIT(0), 1934*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1935*f003800eSLuca Weiss .name = "cam_cc_tfe_2_csid_clk", 1936*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1937*f003800eSLuca Weiss &cam_cc_tfe_2_csid_clk_src.clkr.hw, 1938*f003800eSLuca Weiss }, 1939*f003800eSLuca Weiss .num_parents = 1, 1940*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1941*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1942*f003800eSLuca Weiss }, 1943*f003800eSLuca Weiss }, 1944*f003800eSLuca Weiss }; 1945*f003800eSLuca Weiss 1946*f003800eSLuca Weiss static struct clk_branch cam_cc_top_shift_clk = { 1947*f003800eSLuca Weiss .halt_reg = 0x25040, 1948*f003800eSLuca Weiss .halt_check = BRANCH_HALT_VOTED, 1949*f003800eSLuca Weiss .clkr = { 1950*f003800eSLuca Weiss .enable_reg = 0x25040, 1951*f003800eSLuca Weiss .enable_mask = BIT(0), 1952*f003800eSLuca Weiss .hw.init = &(const struct clk_init_data) { 1953*f003800eSLuca Weiss .name = "cam_cc_top_shift_clk", 1954*f003800eSLuca Weiss .parent_hws = (const struct clk_hw*[]) { 1955*f003800eSLuca Weiss &cam_cc_xo_clk_src.clkr.hw, 1956*f003800eSLuca Weiss }, 1957*f003800eSLuca Weiss .num_parents = 1, 1958*f003800eSLuca Weiss .flags = CLK_SET_RATE_PARENT, 1959*f003800eSLuca Weiss .ops = &clk_branch2_ops, 1960*f003800eSLuca Weiss }, 1961*f003800eSLuca Weiss }, 1962*f003800eSLuca Weiss }; 1963*f003800eSLuca Weiss 1964*f003800eSLuca Weiss static struct gdsc cam_cc_camss_top_gdsc = { 1965*f003800eSLuca Weiss .gdscr = 0x25004, 1966*f003800eSLuca Weiss .en_rest_wait_val = 0x2, 1967*f003800eSLuca Weiss .en_few_wait_val = 0x2, 1968*f003800eSLuca Weiss .clk_dis_wait_val = 0xf, 1969*f003800eSLuca Weiss .pd = { 1970*f003800eSLuca Weiss .name = "cam_cc_camss_top_gdsc", 1971*f003800eSLuca Weiss }, 1972*f003800eSLuca Weiss .pwrsts = PWRSTS_OFF_ON, 1973*f003800eSLuca Weiss .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 1974*f003800eSLuca Weiss }; 1975*f003800eSLuca Weiss 1976*f003800eSLuca Weiss static struct clk_regmap *cam_cc_milos_clocks[] = { 1977*f003800eSLuca Weiss [CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr, 1978*f003800eSLuca Weiss [CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr, 1979*f003800eSLuca Weiss [CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr, 1980*f003800eSLuca Weiss [CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr, 1981*f003800eSLuca Weiss [CAM_CC_CAMNOC_ATB_CLK] = &cam_cc_camnoc_atb_clk.clkr, 1982*f003800eSLuca Weiss [CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr, 1983*f003800eSLuca Weiss [CAM_CC_CAMNOC_AXI_HF_CLK] = &cam_cc_camnoc_axi_hf_clk.clkr, 1984*f003800eSLuca Weiss [CAM_CC_CAMNOC_AXI_SF_CLK] = &cam_cc_camnoc_axi_sf_clk.clkr, 1985*f003800eSLuca Weiss [CAM_CC_CAMNOC_NRT_AXI_CLK] = &cam_cc_camnoc_nrt_axi_clk.clkr, 1986*f003800eSLuca Weiss [CAM_CC_CAMNOC_RT_AXI_CLK] = &cam_cc_camnoc_rt_axi_clk.clkr, 1987*f003800eSLuca Weiss [CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr, 1988*f003800eSLuca Weiss [CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr, 1989*f003800eSLuca Weiss [CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr, 1990*f003800eSLuca Weiss [CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr, 1991*f003800eSLuca Weiss [CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr, 1992*f003800eSLuca Weiss [CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr, 1993*f003800eSLuca Weiss [CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr, 1994*f003800eSLuca Weiss [CAM_CC_CRE_AHB_CLK] = &cam_cc_cre_ahb_clk.clkr, 1995*f003800eSLuca Weiss [CAM_CC_CRE_CLK] = &cam_cc_cre_clk.clkr, 1996*f003800eSLuca Weiss [CAM_CC_CRE_CLK_SRC] = &cam_cc_cre_clk_src.clkr, 1997*f003800eSLuca Weiss [CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr, 1998*f003800eSLuca Weiss [CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr, 1999*f003800eSLuca Weiss [CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr, 2000*f003800eSLuca Weiss [CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr, 2001*f003800eSLuca Weiss [CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr, 2002*f003800eSLuca Weiss [CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr, 2003*f003800eSLuca Weiss [CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr, 2004*f003800eSLuca Weiss [CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr, 2005*f003800eSLuca Weiss [CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr, 2006*f003800eSLuca Weiss [CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr, 2007*f003800eSLuca Weiss [CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr, 2008*f003800eSLuca Weiss [CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr, 2009*f003800eSLuca Weiss [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr, 2010*f003800eSLuca Weiss [CAM_CC_ICP_ATB_CLK] = &cam_cc_icp_atb_clk.clkr, 2011*f003800eSLuca Weiss [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr, 2012*f003800eSLuca Weiss [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr, 2013*f003800eSLuca Weiss [CAM_CC_ICP_CTI_CLK] = &cam_cc_icp_cti_clk.clkr, 2014*f003800eSLuca Weiss [CAM_CC_ICP_TS_CLK] = &cam_cc_icp_ts_clk.clkr, 2015*f003800eSLuca Weiss [CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr, 2016*f003800eSLuca Weiss [CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr, 2017*f003800eSLuca Weiss [CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr, 2018*f003800eSLuca Weiss [CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr, 2019*f003800eSLuca Weiss [CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr, 2020*f003800eSLuca Weiss [CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr, 2021*f003800eSLuca Weiss [CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr, 2022*f003800eSLuca Weiss [CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr, 2023*f003800eSLuca Weiss [CAM_CC_MCLK4_CLK] = &cam_cc_mclk4_clk.clkr, 2024*f003800eSLuca Weiss [CAM_CC_MCLK4_CLK_SRC] = &cam_cc_mclk4_clk_src.clkr, 2025*f003800eSLuca Weiss [CAM_CC_OPE_0_AHB_CLK] = &cam_cc_ope_0_ahb_clk.clkr, 2026*f003800eSLuca Weiss [CAM_CC_OPE_0_AREG_CLK] = &cam_cc_ope_0_areg_clk.clkr, 2027*f003800eSLuca Weiss [CAM_CC_OPE_0_CLK] = &cam_cc_ope_0_clk.clkr, 2028*f003800eSLuca Weiss [CAM_CC_OPE_0_CLK_SRC] = &cam_cc_ope_0_clk_src.clkr, 2029*f003800eSLuca Weiss [CAM_CC_PLL0] = &cam_cc_pll0.clkr, 2030*f003800eSLuca Weiss [CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr, 2031*f003800eSLuca Weiss [CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.clkr, 2032*f003800eSLuca Weiss [CAM_CC_PLL1] = &cam_cc_pll1.clkr, 2033*f003800eSLuca Weiss [CAM_CC_PLL1_OUT_EVEN] = &cam_cc_pll1_out_even.clkr, 2034*f003800eSLuca Weiss [CAM_CC_PLL2] = &cam_cc_pll2.clkr, 2035*f003800eSLuca Weiss [CAM_CC_PLL3] = &cam_cc_pll3.clkr, 2036*f003800eSLuca Weiss [CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr, 2037*f003800eSLuca Weiss [CAM_CC_PLL4] = &cam_cc_pll4.clkr, 2038*f003800eSLuca Weiss [CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr, 2039*f003800eSLuca Weiss [CAM_CC_PLL5] = &cam_cc_pll5.clkr, 2040*f003800eSLuca Weiss [CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr, 2041*f003800eSLuca Weiss [CAM_CC_PLL6] = &cam_cc_pll6.clkr, 2042*f003800eSLuca Weiss [CAM_CC_PLL6_OUT_EVEN] = &cam_cc_pll6_out_even.clkr, 2043*f003800eSLuca Weiss [CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr, 2044*f003800eSLuca Weiss [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr, 2045*f003800eSLuca Weiss [CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr, 2046*f003800eSLuca Weiss [CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr, 2047*f003800eSLuca Weiss [CAM_CC_TFE_0_AHB_CLK] = &cam_cc_tfe_0_ahb_clk.clkr, 2048*f003800eSLuca Weiss [CAM_CC_TFE_0_CLK] = &cam_cc_tfe_0_clk.clkr, 2049*f003800eSLuca Weiss [CAM_CC_TFE_0_CLK_SRC] = &cam_cc_tfe_0_clk_src.clkr, 2050*f003800eSLuca Weiss [CAM_CC_TFE_0_CPHY_RX_CLK] = &cam_cc_tfe_0_cphy_rx_clk.clkr, 2051*f003800eSLuca Weiss [CAM_CC_TFE_0_CSID_CLK] = &cam_cc_tfe_0_csid_clk.clkr, 2052*f003800eSLuca Weiss [CAM_CC_TFE_0_CSID_CLK_SRC] = &cam_cc_tfe_0_csid_clk_src.clkr, 2053*f003800eSLuca Weiss [CAM_CC_TFE_1_AHB_CLK] = &cam_cc_tfe_1_ahb_clk.clkr, 2054*f003800eSLuca Weiss [CAM_CC_TFE_1_CLK] = &cam_cc_tfe_1_clk.clkr, 2055*f003800eSLuca Weiss [CAM_CC_TFE_1_CLK_SRC] = &cam_cc_tfe_1_clk_src.clkr, 2056*f003800eSLuca Weiss [CAM_CC_TFE_1_CPHY_RX_CLK] = &cam_cc_tfe_1_cphy_rx_clk.clkr, 2057*f003800eSLuca Weiss [CAM_CC_TFE_1_CSID_CLK] = &cam_cc_tfe_1_csid_clk.clkr, 2058*f003800eSLuca Weiss [CAM_CC_TFE_1_CSID_CLK_SRC] = &cam_cc_tfe_1_csid_clk_src.clkr, 2059*f003800eSLuca Weiss [CAM_CC_TFE_2_AHB_CLK] = &cam_cc_tfe_2_ahb_clk.clkr, 2060*f003800eSLuca Weiss [CAM_CC_TFE_2_CLK] = &cam_cc_tfe_2_clk.clkr, 2061*f003800eSLuca Weiss [CAM_CC_TFE_2_CLK_SRC] = &cam_cc_tfe_2_clk_src.clkr, 2062*f003800eSLuca Weiss [CAM_CC_TFE_2_CPHY_RX_CLK] = &cam_cc_tfe_2_cphy_rx_clk.clkr, 2063*f003800eSLuca Weiss [CAM_CC_TFE_2_CSID_CLK] = &cam_cc_tfe_2_csid_clk.clkr, 2064*f003800eSLuca Weiss [CAM_CC_TFE_2_CSID_CLK_SRC] = &cam_cc_tfe_2_csid_clk_src.clkr, 2065*f003800eSLuca Weiss [CAM_CC_TOP_SHIFT_CLK] = &cam_cc_top_shift_clk.clkr, 2066*f003800eSLuca Weiss [CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr, 2067*f003800eSLuca Weiss }; 2068*f003800eSLuca Weiss 2069*f003800eSLuca Weiss static const struct qcom_reset_map cam_cc_milos_resets[] = { 2070*f003800eSLuca Weiss [CAM_CC_BPS_BCR] = { 0x1a000 }, 2071*f003800eSLuca Weiss [CAM_CC_CAMNOC_BCR] = { 0x24000 }, 2072*f003800eSLuca Weiss [CAM_CC_CAMSS_TOP_BCR] = { 0x25000 }, 2073*f003800eSLuca Weiss [CAM_CC_CCI_0_BCR] = { 0x21000 }, 2074*f003800eSLuca Weiss [CAM_CC_CCI_1_BCR] = { 0x22000 }, 2075*f003800eSLuca Weiss [CAM_CC_CPAS_BCR] = { 0x23000 }, 2076*f003800eSLuca Weiss [CAM_CC_CRE_BCR] = { 0x27000 }, 2077*f003800eSLuca Weiss [CAM_CC_CSI0PHY_BCR] = { 0x19000 }, 2078*f003800eSLuca Weiss [CAM_CC_CSI1PHY_BCR] = { 0x19024 }, 2079*f003800eSLuca Weiss [CAM_CC_CSI2PHY_BCR] = { 0x19048 }, 2080*f003800eSLuca Weiss [CAM_CC_CSI3PHY_BCR] = { 0x1906c }, 2081*f003800eSLuca Weiss [CAM_CC_ICP_BCR] = { 0x20000 }, 2082*f003800eSLuca Weiss [CAM_CC_MCLK0_BCR] = { 0x18000 }, 2083*f003800eSLuca Weiss [CAM_CC_MCLK1_BCR] = { 0x18020 }, 2084*f003800eSLuca Weiss [CAM_CC_MCLK2_BCR] = { 0x18040 }, 2085*f003800eSLuca Weiss [CAM_CC_MCLK3_BCR] = { 0x18060 }, 2086*f003800eSLuca Weiss [CAM_CC_MCLK4_BCR] = { 0x18080 }, 2087*f003800eSLuca Weiss [CAM_CC_OPE_0_BCR] = { 0x1b000 }, 2088*f003800eSLuca Weiss [CAM_CC_TFE_0_BCR] = { 0x1c000 }, 2089*f003800eSLuca Weiss [CAM_CC_TFE_1_BCR] = { 0x1d000 }, 2090*f003800eSLuca Weiss [CAM_CC_TFE_2_BCR] = { 0x1e000 }, 2091*f003800eSLuca Weiss }; 2092*f003800eSLuca Weiss 2093*f003800eSLuca Weiss static struct gdsc *cam_cc_milos_gdscs[] = { 2094*f003800eSLuca Weiss [CAM_CC_CAMSS_TOP_GDSC] = &cam_cc_camss_top_gdsc, 2095*f003800eSLuca Weiss }; 2096*f003800eSLuca Weiss 2097*f003800eSLuca Weiss static struct clk_alpha_pll *cam_cc_milos_plls[] = { 2098*f003800eSLuca Weiss &cam_cc_pll0, 2099*f003800eSLuca Weiss &cam_cc_pll1, 2100*f003800eSLuca Weiss &cam_cc_pll2, 2101*f003800eSLuca Weiss &cam_cc_pll3, 2102*f003800eSLuca Weiss &cam_cc_pll4, 2103*f003800eSLuca Weiss &cam_cc_pll5, 2104*f003800eSLuca Weiss &cam_cc_pll6, 2105*f003800eSLuca Weiss }; 2106*f003800eSLuca Weiss 2107*f003800eSLuca Weiss static u32 cam_cc_milos_critical_cbcrs[] = { 2108*f003800eSLuca Weiss 0x25038, /* CAM_CC_GDSC_CLK */ 2109*f003800eSLuca Weiss 0x2505c, /* CAM_CC_SLEEP_CLK */ 2110*f003800eSLuca Weiss }; 2111*f003800eSLuca Weiss 2112*f003800eSLuca Weiss static const struct regmap_config cam_cc_milos_regmap_config = { 2113*f003800eSLuca Weiss .reg_bits = 32, 2114*f003800eSLuca Weiss .reg_stride = 4, 2115*f003800eSLuca Weiss .val_bits = 32, 2116*f003800eSLuca Weiss .max_register = 0x30728, 2117*f003800eSLuca Weiss .fast_io = true, 2118*f003800eSLuca Weiss }; 2119*f003800eSLuca Weiss 2120*f003800eSLuca Weiss static struct qcom_cc_driver_data cam_cc_milos_driver_data = { 2121*f003800eSLuca Weiss .alpha_plls = cam_cc_milos_plls, 2122*f003800eSLuca Weiss .num_alpha_plls = ARRAY_SIZE(cam_cc_milos_plls), 2123*f003800eSLuca Weiss .clk_cbcrs = cam_cc_milos_critical_cbcrs, 2124*f003800eSLuca Weiss .num_clk_cbcrs = ARRAY_SIZE(cam_cc_milos_critical_cbcrs), 2125*f003800eSLuca Weiss }; 2126*f003800eSLuca Weiss 2127*f003800eSLuca Weiss static struct qcom_cc_desc cam_cc_milos_desc = { 2128*f003800eSLuca Weiss .config = &cam_cc_milos_regmap_config, 2129*f003800eSLuca Weiss .clks = cam_cc_milos_clocks, 2130*f003800eSLuca Weiss .num_clks = ARRAY_SIZE(cam_cc_milos_clocks), 2131*f003800eSLuca Weiss .resets = cam_cc_milos_resets, 2132*f003800eSLuca Weiss .num_resets = ARRAY_SIZE(cam_cc_milos_resets), 2133*f003800eSLuca Weiss .gdscs = cam_cc_milos_gdscs, 2134*f003800eSLuca Weiss .num_gdscs = ARRAY_SIZE(cam_cc_milos_gdscs), 2135*f003800eSLuca Weiss .use_rpm = true, 2136*f003800eSLuca Weiss .driver_data = &cam_cc_milos_driver_data, 2137*f003800eSLuca Weiss }; 2138*f003800eSLuca Weiss 2139*f003800eSLuca Weiss static const struct of_device_id cam_cc_milos_match_table[] = { 2140*f003800eSLuca Weiss { .compatible = "qcom,milos-camcc" }, 2141*f003800eSLuca Weiss { } 2142*f003800eSLuca Weiss }; 2143*f003800eSLuca Weiss MODULE_DEVICE_TABLE(of, cam_cc_milos_match_table); 2144*f003800eSLuca Weiss 2145*f003800eSLuca Weiss static int cam_cc_milos_probe(struct platform_device *pdev) 2146*f003800eSLuca Weiss { 2147*f003800eSLuca Weiss return qcom_cc_probe(pdev, &cam_cc_milos_desc); 2148*f003800eSLuca Weiss } 2149*f003800eSLuca Weiss 2150*f003800eSLuca Weiss static struct platform_driver cam_cc_milos_driver = { 2151*f003800eSLuca Weiss .probe = cam_cc_milos_probe, 2152*f003800eSLuca Weiss .driver = { 2153*f003800eSLuca Weiss .name = "cam_cc-milos", 2154*f003800eSLuca Weiss .of_match_table = cam_cc_milos_match_table, 2155*f003800eSLuca Weiss }, 2156*f003800eSLuca Weiss }; 2157*f003800eSLuca Weiss 2158*f003800eSLuca Weiss module_platform_driver(cam_cc_milos_driver); 2159*f003800eSLuca Weiss 2160*f003800eSLuca Weiss MODULE_DESCRIPTION("QTI CAM_CC Milos Driver"); 2161*f003800eSLuca Weiss MODULE_LICENSE("GPL"); 2162