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