1*92aae35fSTaniya Das // SPDX-License-Identifier: GPL-2.0-only 2*92aae35fSTaniya Das /* 3*92aae35fSTaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4*92aae35fSTaniya Das */ 5*92aae35fSTaniya Das 6*92aae35fSTaniya Das #include <linux/clk-provider.h> 7*92aae35fSTaniya Das #include <linux/mod_devicetable.h> 8*92aae35fSTaniya Das #include <linux/module.h> 9*92aae35fSTaniya Das #include <linux/of.h> 10*92aae35fSTaniya Das #include <linux/platform_device.h> 11*92aae35fSTaniya Das #include <linux/pm_runtime.h> 12*92aae35fSTaniya Das #include <linux/regmap.h> 13*92aae35fSTaniya Das 14*92aae35fSTaniya Das #include <dt-bindings/clock/qcom,kaanapali-cambistmclkcc.h> 15*92aae35fSTaniya Das 16*92aae35fSTaniya Das #include "clk-alpha-pll.h" 17*92aae35fSTaniya Das #include "clk-branch.h" 18*92aae35fSTaniya Das #include "clk-pll.h" 19*92aae35fSTaniya Das #include "clk-rcg.h" 20*92aae35fSTaniya Das #include "clk-regmap.h" 21*92aae35fSTaniya Das #include "clk-regmap-divider.h" 22*92aae35fSTaniya Das #include "clk-regmap-mux.h" 23*92aae35fSTaniya Das #include "common.h" 24*92aae35fSTaniya Das #include "gdsc.h" 25*92aae35fSTaniya Das #include "reset.h" 26*92aae35fSTaniya Das 27*92aae35fSTaniya Das enum { 28*92aae35fSTaniya Das DT_AHB_CLK, 29*92aae35fSTaniya Das DT_BI_TCXO, 30*92aae35fSTaniya Das DT_BI_TCXO_AO, 31*92aae35fSTaniya Das DT_SLEEP_CLK, 32*92aae35fSTaniya Das }; 33*92aae35fSTaniya Das 34*92aae35fSTaniya Das enum { 35*92aae35fSTaniya Das P_BI_TCXO, 36*92aae35fSTaniya Das P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN, 37*92aae35fSTaniya Das P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN, 38*92aae35fSTaniya Das }; 39*92aae35fSTaniya Das 40*92aae35fSTaniya Das static const struct pll_vco rivian_eko_t_vco[] = { 41*92aae35fSTaniya Das { 883200000, 1171200000, 0 }, 42*92aae35fSTaniya Das }; 43*92aae35fSTaniya Das 44*92aae35fSTaniya Das /* 960.0 MHz Configuration */ 45*92aae35fSTaniya Das static const struct alpha_pll_config cam_bist_mclk_cc_pll0_config = { 46*92aae35fSTaniya Das .l = 0x32, 47*92aae35fSTaniya Das .cal_l = 0x32, 48*92aae35fSTaniya Das .alpha = 0x0, 49*92aae35fSTaniya Das .config_ctl_val = 0x12000000, 50*92aae35fSTaniya Das .config_ctl_hi_val = 0x00890263, 51*92aae35fSTaniya Das .config_ctl_hi1_val = 0x1af04237, 52*92aae35fSTaniya Das .config_ctl_hi2_val = 0x00000000, 53*92aae35fSTaniya Das }; 54*92aae35fSTaniya Das 55*92aae35fSTaniya Das static struct clk_alpha_pll cam_bist_mclk_cc_pll0 = { 56*92aae35fSTaniya Das .offset = 0x0, 57*92aae35fSTaniya Das .config = &cam_bist_mclk_cc_pll0_config, 58*92aae35fSTaniya Das .vco_table = rivian_eko_t_vco, 59*92aae35fSTaniya Das .num_vco = ARRAY_SIZE(rivian_eko_t_vco), 60*92aae35fSTaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EKO_T], 61*92aae35fSTaniya Das .clkr = { 62*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 63*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_pll0", 64*92aae35fSTaniya Das .parent_data = &(const struct clk_parent_data) { 65*92aae35fSTaniya Das .index = DT_BI_TCXO, 66*92aae35fSTaniya Das }, 67*92aae35fSTaniya Das .num_parents = 1, 68*92aae35fSTaniya Das .ops = &clk_alpha_pll_rivian_eko_t_ops, 69*92aae35fSTaniya Das }, 70*92aae35fSTaniya Das }, 71*92aae35fSTaniya Das }; 72*92aae35fSTaniya Das 73*92aae35fSTaniya Das static const struct parent_map cam_bist_mclk_cc_parent_map_0[] = { 74*92aae35fSTaniya Das { P_BI_TCXO, 0 }, 75*92aae35fSTaniya Das { P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN, 3 }, 76*92aae35fSTaniya Das { P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN, 5 }, 77*92aae35fSTaniya Das }; 78*92aae35fSTaniya Das 79*92aae35fSTaniya Das static const struct clk_parent_data cam_bist_mclk_cc_parent_data_0[] = { 80*92aae35fSTaniya Das { .index = DT_BI_TCXO }, 81*92aae35fSTaniya Das { .hw = &cam_bist_mclk_cc_pll0.clkr.hw }, 82*92aae35fSTaniya Das { .hw = &cam_bist_mclk_cc_pll0.clkr.hw }, 83*92aae35fSTaniya Das }; 84*92aae35fSTaniya Das 85*92aae35fSTaniya Das static const struct freq_tbl ftbl_cam_bist_mclk_cc_mclk0_clk_src[] = { 86*92aae35fSTaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 87*92aae35fSTaniya Das F(24000000, P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN, 10, 1, 4), 88*92aae35fSTaniya Das F(68571429, P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN, 14, 0, 0), 89*92aae35fSTaniya Das { } 90*92aae35fSTaniya Das }; 91*92aae35fSTaniya Das 92*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk0_clk_src = { 93*92aae35fSTaniya Das .cmd_rcgr = 0x4000, 94*92aae35fSTaniya Das .mnd_width = 8, 95*92aae35fSTaniya Das .hid_width = 5, 96*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 97*92aae35fSTaniya Das .hw_clk_ctrl = true, 98*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 99*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 100*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk0_clk_src", 101*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 102*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 103*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 104*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 105*92aae35fSTaniya Das }, 106*92aae35fSTaniya Das }; 107*92aae35fSTaniya Das 108*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk1_clk_src = { 109*92aae35fSTaniya Das .cmd_rcgr = 0x401c, 110*92aae35fSTaniya Das .mnd_width = 8, 111*92aae35fSTaniya Das .hid_width = 5, 112*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 113*92aae35fSTaniya Das .hw_clk_ctrl = true, 114*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 115*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 116*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk1_clk_src", 117*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 118*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 119*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 120*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 121*92aae35fSTaniya Das }, 122*92aae35fSTaniya Das }; 123*92aae35fSTaniya Das 124*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk2_clk_src = { 125*92aae35fSTaniya Das .cmd_rcgr = 0x4038, 126*92aae35fSTaniya Das .mnd_width = 8, 127*92aae35fSTaniya Das .hid_width = 5, 128*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 129*92aae35fSTaniya Das .hw_clk_ctrl = true, 130*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 131*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 132*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk2_clk_src", 133*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 134*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 135*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 136*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 137*92aae35fSTaniya Das }, 138*92aae35fSTaniya Das }; 139*92aae35fSTaniya Das 140*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk3_clk_src = { 141*92aae35fSTaniya Das .cmd_rcgr = 0x4054, 142*92aae35fSTaniya Das .mnd_width = 8, 143*92aae35fSTaniya Das .hid_width = 5, 144*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 145*92aae35fSTaniya Das .hw_clk_ctrl = true, 146*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 147*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 148*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk3_clk_src", 149*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 150*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 151*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 152*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 153*92aae35fSTaniya Das }, 154*92aae35fSTaniya Das }; 155*92aae35fSTaniya Das 156*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk4_clk_src = { 157*92aae35fSTaniya Das .cmd_rcgr = 0x4070, 158*92aae35fSTaniya Das .mnd_width = 8, 159*92aae35fSTaniya Das .hid_width = 5, 160*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 161*92aae35fSTaniya Das .hw_clk_ctrl = true, 162*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 163*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 164*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk4_clk_src", 165*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 166*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 167*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 168*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 169*92aae35fSTaniya Das }, 170*92aae35fSTaniya Das }; 171*92aae35fSTaniya Das 172*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk5_clk_src = { 173*92aae35fSTaniya Das .cmd_rcgr = 0x408c, 174*92aae35fSTaniya Das .mnd_width = 8, 175*92aae35fSTaniya Das .hid_width = 5, 176*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 177*92aae35fSTaniya Das .hw_clk_ctrl = true, 178*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 179*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 180*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk5_clk_src", 181*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 182*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 183*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 184*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 185*92aae35fSTaniya Das }, 186*92aae35fSTaniya Das }; 187*92aae35fSTaniya Das 188*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk6_clk_src = { 189*92aae35fSTaniya Das .cmd_rcgr = 0x40a8, 190*92aae35fSTaniya Das .mnd_width = 8, 191*92aae35fSTaniya Das .hid_width = 5, 192*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 193*92aae35fSTaniya Das .hw_clk_ctrl = true, 194*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 195*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 196*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk6_clk_src", 197*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 198*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 199*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 200*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 201*92aae35fSTaniya Das }, 202*92aae35fSTaniya Das }; 203*92aae35fSTaniya Das 204*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk7_clk_src = { 205*92aae35fSTaniya Das .cmd_rcgr = 0x40c4, 206*92aae35fSTaniya Das .mnd_width = 8, 207*92aae35fSTaniya Das .hid_width = 5, 208*92aae35fSTaniya Das .parent_map = cam_bist_mclk_cc_parent_map_0, 209*92aae35fSTaniya Das .hw_clk_ctrl = true, 210*92aae35fSTaniya Das .freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src, 211*92aae35fSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 212*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk7_clk_src", 213*92aae35fSTaniya Das .parent_data = cam_bist_mclk_cc_parent_data_0, 214*92aae35fSTaniya Das .num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0), 215*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 216*92aae35fSTaniya Das .ops = &clk_rcg2_shared_ops, 217*92aae35fSTaniya Das }, 218*92aae35fSTaniya Das }; 219*92aae35fSTaniya Das 220*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk0_clk = { 221*92aae35fSTaniya Das .halt_reg = 0x4018, 222*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 223*92aae35fSTaniya Das .clkr = { 224*92aae35fSTaniya Das .enable_reg = 0x4018, 225*92aae35fSTaniya Das .enable_mask = BIT(0), 226*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 227*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk0_clk", 228*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 229*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk0_clk_src.clkr.hw, 230*92aae35fSTaniya Das }, 231*92aae35fSTaniya Das .num_parents = 1, 232*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 233*92aae35fSTaniya Das .ops = &clk_branch2_ops, 234*92aae35fSTaniya Das }, 235*92aae35fSTaniya Das }, 236*92aae35fSTaniya Das }; 237*92aae35fSTaniya Das 238*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk1_clk = { 239*92aae35fSTaniya Das .halt_reg = 0x4034, 240*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 241*92aae35fSTaniya Das .clkr = { 242*92aae35fSTaniya Das .enable_reg = 0x4034, 243*92aae35fSTaniya Das .enable_mask = BIT(0), 244*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 245*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk1_clk", 246*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 247*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk1_clk_src.clkr.hw, 248*92aae35fSTaniya Das }, 249*92aae35fSTaniya Das .num_parents = 1, 250*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 251*92aae35fSTaniya Das .ops = &clk_branch2_ops, 252*92aae35fSTaniya Das }, 253*92aae35fSTaniya Das }, 254*92aae35fSTaniya Das }; 255*92aae35fSTaniya Das 256*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk2_clk = { 257*92aae35fSTaniya Das .halt_reg = 0x4050, 258*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 259*92aae35fSTaniya Das .clkr = { 260*92aae35fSTaniya Das .enable_reg = 0x4050, 261*92aae35fSTaniya Das .enable_mask = BIT(0), 262*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 263*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk2_clk", 264*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 265*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk2_clk_src.clkr.hw, 266*92aae35fSTaniya Das }, 267*92aae35fSTaniya Das .num_parents = 1, 268*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 269*92aae35fSTaniya Das .ops = &clk_branch2_ops, 270*92aae35fSTaniya Das }, 271*92aae35fSTaniya Das }, 272*92aae35fSTaniya Das }; 273*92aae35fSTaniya Das 274*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk3_clk = { 275*92aae35fSTaniya Das .halt_reg = 0x406c, 276*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 277*92aae35fSTaniya Das .clkr = { 278*92aae35fSTaniya Das .enable_reg = 0x406c, 279*92aae35fSTaniya Das .enable_mask = BIT(0), 280*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 281*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk3_clk", 282*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 283*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk3_clk_src.clkr.hw, 284*92aae35fSTaniya Das }, 285*92aae35fSTaniya Das .num_parents = 1, 286*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 287*92aae35fSTaniya Das .ops = &clk_branch2_ops, 288*92aae35fSTaniya Das }, 289*92aae35fSTaniya Das }, 290*92aae35fSTaniya Das }; 291*92aae35fSTaniya Das 292*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk4_clk = { 293*92aae35fSTaniya Das .halt_reg = 0x4088, 294*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 295*92aae35fSTaniya Das .clkr = { 296*92aae35fSTaniya Das .enable_reg = 0x4088, 297*92aae35fSTaniya Das .enable_mask = BIT(0), 298*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 299*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk4_clk", 300*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 301*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk4_clk_src.clkr.hw, 302*92aae35fSTaniya Das }, 303*92aae35fSTaniya Das .num_parents = 1, 304*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 305*92aae35fSTaniya Das .ops = &clk_branch2_ops, 306*92aae35fSTaniya Das }, 307*92aae35fSTaniya Das }, 308*92aae35fSTaniya Das }; 309*92aae35fSTaniya Das 310*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk5_clk = { 311*92aae35fSTaniya Das .halt_reg = 0x40a4, 312*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 313*92aae35fSTaniya Das .clkr = { 314*92aae35fSTaniya Das .enable_reg = 0x40a4, 315*92aae35fSTaniya Das .enable_mask = BIT(0), 316*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 317*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk5_clk", 318*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 319*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk5_clk_src.clkr.hw, 320*92aae35fSTaniya Das }, 321*92aae35fSTaniya Das .num_parents = 1, 322*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 323*92aae35fSTaniya Das .ops = &clk_branch2_ops, 324*92aae35fSTaniya Das }, 325*92aae35fSTaniya Das }, 326*92aae35fSTaniya Das }; 327*92aae35fSTaniya Das 328*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk6_clk = { 329*92aae35fSTaniya Das .halt_reg = 0x40c0, 330*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 331*92aae35fSTaniya Das .clkr = { 332*92aae35fSTaniya Das .enable_reg = 0x40c0, 333*92aae35fSTaniya Das .enable_mask = BIT(0), 334*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 335*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk6_clk", 336*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 337*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk6_clk_src.clkr.hw, 338*92aae35fSTaniya Das }, 339*92aae35fSTaniya Das .num_parents = 1, 340*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 341*92aae35fSTaniya Das .ops = &clk_branch2_ops, 342*92aae35fSTaniya Das }, 343*92aae35fSTaniya Das }, 344*92aae35fSTaniya Das }; 345*92aae35fSTaniya Das 346*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk7_clk = { 347*92aae35fSTaniya Das .halt_reg = 0x40dc, 348*92aae35fSTaniya Das .halt_check = BRANCH_HALT, 349*92aae35fSTaniya Das .clkr = { 350*92aae35fSTaniya Das .enable_reg = 0x40dc, 351*92aae35fSTaniya Das .enable_mask = BIT(0), 352*92aae35fSTaniya Das .hw.init = &(const struct clk_init_data) { 353*92aae35fSTaniya Das .name = "cam_bist_mclk_cc_mclk7_clk", 354*92aae35fSTaniya Das .parent_hws = (const struct clk_hw*[]) { 355*92aae35fSTaniya Das &cam_bist_mclk_cc_mclk7_clk_src.clkr.hw, 356*92aae35fSTaniya Das }, 357*92aae35fSTaniya Das .num_parents = 1, 358*92aae35fSTaniya Das .flags = CLK_SET_RATE_PARENT, 359*92aae35fSTaniya Das .ops = &clk_branch2_ops, 360*92aae35fSTaniya Das }, 361*92aae35fSTaniya Das }, 362*92aae35fSTaniya Das }; 363*92aae35fSTaniya Das 364*92aae35fSTaniya Das static struct clk_regmap *cam_bist_mclk_cc_kaanapali_clocks[] = { 365*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK0_CLK] = &cam_bist_mclk_cc_mclk0_clk.clkr, 366*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK0_CLK_SRC] = &cam_bist_mclk_cc_mclk0_clk_src.clkr, 367*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK1_CLK] = &cam_bist_mclk_cc_mclk1_clk.clkr, 368*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK1_CLK_SRC] = &cam_bist_mclk_cc_mclk1_clk_src.clkr, 369*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK2_CLK] = &cam_bist_mclk_cc_mclk2_clk.clkr, 370*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK2_CLK_SRC] = &cam_bist_mclk_cc_mclk2_clk_src.clkr, 371*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK3_CLK] = &cam_bist_mclk_cc_mclk3_clk.clkr, 372*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK3_CLK_SRC] = &cam_bist_mclk_cc_mclk3_clk_src.clkr, 373*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK4_CLK] = &cam_bist_mclk_cc_mclk4_clk.clkr, 374*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK4_CLK_SRC] = &cam_bist_mclk_cc_mclk4_clk_src.clkr, 375*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK5_CLK] = &cam_bist_mclk_cc_mclk5_clk.clkr, 376*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK5_CLK_SRC] = &cam_bist_mclk_cc_mclk5_clk_src.clkr, 377*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK6_CLK] = &cam_bist_mclk_cc_mclk6_clk.clkr, 378*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK6_CLK_SRC] = &cam_bist_mclk_cc_mclk6_clk_src.clkr, 379*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK7_CLK] = &cam_bist_mclk_cc_mclk7_clk.clkr, 380*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_MCLK7_CLK_SRC] = &cam_bist_mclk_cc_mclk7_clk_src.clkr, 381*92aae35fSTaniya Das [CAM_BIST_MCLK_CC_PLL0] = &cam_bist_mclk_cc_pll0.clkr, 382*92aae35fSTaniya Das }; 383*92aae35fSTaniya Das 384*92aae35fSTaniya Das static struct clk_alpha_pll *cam_bist_mclk_cc_kaanapali_plls[] = { 385*92aae35fSTaniya Das &cam_bist_mclk_cc_pll0, 386*92aae35fSTaniya Das }; 387*92aae35fSTaniya Das 388*92aae35fSTaniya Das static u32 cam_bist_mclk_cc_kaanapali_critical_cbcrs[] = { 389*92aae35fSTaniya Das 0x40e0, /* CAM_BIST_MCLK_CC_SLEEP_CLK */ 390*92aae35fSTaniya Das }; 391*92aae35fSTaniya Das 392*92aae35fSTaniya Das static const struct regmap_config cam_bist_mclk_cc_kaanapali_regmap_config = { 393*92aae35fSTaniya Das .reg_bits = 32, 394*92aae35fSTaniya Das .reg_stride = 4, 395*92aae35fSTaniya Das .val_bits = 32, 396*92aae35fSTaniya Das .max_register = 0x5010, 397*92aae35fSTaniya Das .fast_io = true, 398*92aae35fSTaniya Das }; 399*92aae35fSTaniya Das 400*92aae35fSTaniya Das static struct qcom_cc_driver_data cam_bist_mclk_cc_kaanapali_driver_data = { 401*92aae35fSTaniya Das .alpha_plls = cam_bist_mclk_cc_kaanapali_plls, 402*92aae35fSTaniya Das .num_alpha_plls = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_plls), 403*92aae35fSTaniya Das .clk_cbcrs = cam_bist_mclk_cc_kaanapali_critical_cbcrs, 404*92aae35fSTaniya Das .num_clk_cbcrs = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_critical_cbcrs), 405*92aae35fSTaniya Das }; 406*92aae35fSTaniya Das 407*92aae35fSTaniya Das static const struct qcom_cc_desc cam_bist_mclk_cc_kaanapali_desc = { 408*92aae35fSTaniya Das .config = &cam_bist_mclk_cc_kaanapali_regmap_config, 409*92aae35fSTaniya Das .clks = cam_bist_mclk_cc_kaanapali_clocks, 410*92aae35fSTaniya Das .num_clks = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_clocks), 411*92aae35fSTaniya Das .use_rpm = true, 412*92aae35fSTaniya Das .driver_data = &cam_bist_mclk_cc_kaanapali_driver_data, 413*92aae35fSTaniya Das }; 414*92aae35fSTaniya Das 415*92aae35fSTaniya Das static const struct of_device_id cam_bist_mclk_cc_kaanapali_match_table[] = { 416*92aae35fSTaniya Das { .compatible = "qcom,kaanapali-cambistmclkcc" }, 417*92aae35fSTaniya Das { } 418*92aae35fSTaniya Das }; 419*92aae35fSTaniya Das MODULE_DEVICE_TABLE(of, cam_bist_mclk_cc_kaanapali_match_table); 420*92aae35fSTaniya Das 421*92aae35fSTaniya Das static int cam_bist_mclk_cc_kaanapali_probe(struct platform_device *pdev) 422*92aae35fSTaniya Das { 423*92aae35fSTaniya Das return qcom_cc_probe(pdev, &cam_bist_mclk_cc_kaanapali_desc); 424*92aae35fSTaniya Das } 425*92aae35fSTaniya Das 426*92aae35fSTaniya Das static struct platform_driver cam_bist_mclk_cc_kaanapali_driver = { 427*92aae35fSTaniya Das .probe = cam_bist_mclk_cc_kaanapali_probe, 428*92aae35fSTaniya Das .driver = { 429*92aae35fSTaniya Das .name = "cambistmclkcc-kaanapali", 430*92aae35fSTaniya Das .of_match_table = cam_bist_mclk_cc_kaanapali_match_table, 431*92aae35fSTaniya Das }, 432*92aae35fSTaniya Das }; 433*92aae35fSTaniya Das 434*92aae35fSTaniya Das module_platform_driver(cam_bist_mclk_cc_kaanapali_driver); 435*92aae35fSTaniya Das 436*92aae35fSTaniya Das MODULE_DESCRIPTION("QTI CAMBISTMCLKCC Kaanapali Driver"); 437*92aae35fSTaniya Das MODULE_LICENSE("GPL"); 438