1a1608605STaniya Das // SPDX-License-Identifier: GPL-2.0-only 2a1608605STaniya Das /* 3a1608605STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4a1608605STaniya Das */ 5a1608605STaniya Das 6a1608605STaniya Das #include <linux/clk-provider.h> 7a1608605STaniya Das #include <linux/mod_devicetable.h> 8a1608605STaniya Das #include <linux/module.h> 9a1608605STaniya Das #include <linux/platform_device.h> 10a1608605STaniya Das #include <linux/pm_runtime.h> 11a1608605STaniya Das #include <linux/regmap.h> 12a1608605STaniya Das 13a1608605STaniya Das #include <dt-bindings/clock/qcom,sm8750-videocc.h> 14a1608605STaniya Das 15a1608605STaniya Das #include "clk-alpha-pll.h" 16a1608605STaniya Das #include "clk-branch.h" 17a1608605STaniya Das #include "clk-pll.h" 18a1608605STaniya Das #include "clk-rcg.h" 19a1608605STaniya Das #include "clk-regmap.h" 20a1608605STaniya Das #include "clk-regmap-divider.h" 21a1608605STaniya Das #include "clk-regmap-mux.h" 22a1608605STaniya Das #include "common.h" 23a1608605STaniya Das #include "gdsc.h" 24a1608605STaniya Das #include "reset.h" 25a1608605STaniya Das 26a1608605STaniya Das enum { 27a1608605STaniya Das DT_BI_TCXO, 28a1608605STaniya Das DT_BI_TCXO_AO, 29a1608605STaniya Das DT_SLEEP_CLK, 30a1608605STaniya Das }; 31a1608605STaniya Das 32a1608605STaniya Das enum { 33a1608605STaniya Das P_BI_TCXO, 34a1608605STaniya Das P_SLEEP_CLK, 35a1608605STaniya Das P_VIDEO_CC_PLL0_OUT_MAIN, 36a1608605STaniya Das }; 37a1608605STaniya Das 38a1608605STaniya Das static const struct pll_vco taycan_elu_vco[] = { 39a1608605STaniya Das { 249600000, 2500000000, 0 }, 40a1608605STaniya Das }; 41a1608605STaniya Das 42a1608605STaniya Das static const struct alpha_pll_config video_cc_pll0_config = { 43a1608605STaniya Das .l = 0x25, 44a1608605STaniya Das .alpha = 0x8000, 45a1608605STaniya Das .config_ctl_val = 0x19660387, 46a1608605STaniya Das .config_ctl_hi_val = 0x098060a0, 47a1608605STaniya Das .config_ctl_hi1_val = 0xb416cb20, 48a1608605STaniya Das .user_ctl_val = 0x00000000, 49a1608605STaniya Das .user_ctl_hi_val = 0x00000002, 50a1608605STaniya Das }; 51a1608605STaniya Das 52a1608605STaniya Das static struct clk_alpha_pll video_cc_pll0 = { 53a1608605STaniya Das .offset = 0x0, 54a1608605STaniya Das .config = &video_cc_pll0_config, 55a1608605STaniya Das .vco_table = taycan_elu_vco, 56a1608605STaniya Das .num_vco = ARRAY_SIZE(taycan_elu_vco), 57a1608605STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 58a1608605STaniya Das .clkr = { 59a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 60a1608605STaniya Das .name = "video_cc_pll0", 61a1608605STaniya Das .parent_data = &(const struct clk_parent_data) { 62a1608605STaniya Das .index = DT_BI_TCXO, 63a1608605STaniya Das }, 64a1608605STaniya Das .num_parents = 1, 65a1608605STaniya Das .ops = &clk_alpha_pll_taycan_elu_ops, 66a1608605STaniya Das }, 67a1608605STaniya Das }, 68a1608605STaniya Das }; 69a1608605STaniya Das 70a1608605STaniya Das static const struct parent_map video_cc_parent_map_0[] = { 71a1608605STaniya Das { P_BI_TCXO, 0 }, 72a1608605STaniya Das }; 73a1608605STaniya Das 74a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_0_ao[] = { 75a1608605STaniya Das { .index = DT_BI_TCXO_AO }, 76a1608605STaniya Das }; 77a1608605STaniya Das 78a1608605STaniya Das static const struct parent_map video_cc_parent_map_1[] = { 79a1608605STaniya Das { P_BI_TCXO, 0 }, 80a1608605STaniya Das { P_VIDEO_CC_PLL0_OUT_MAIN, 1 }, 81a1608605STaniya Das }; 82a1608605STaniya Das 83a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_1[] = { 84a1608605STaniya Das { .index = DT_BI_TCXO }, 85a1608605STaniya Das { .hw = &video_cc_pll0.clkr.hw }, 86a1608605STaniya Das }; 87a1608605STaniya Das 88a1608605STaniya Das static const struct parent_map video_cc_parent_map_2[] = { 89a1608605STaniya Das { P_SLEEP_CLK, 0 }, 90a1608605STaniya Das }; 91a1608605STaniya Das 92a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_2_ao[] = { 93a1608605STaniya Das { .index = DT_SLEEP_CLK }, 94a1608605STaniya Das }; 95a1608605STaniya Das 96a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = { 97a1608605STaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 98a1608605STaniya Das { } 99a1608605STaniya Das }; 100a1608605STaniya Das 101a1608605STaniya Das static struct clk_rcg2 video_cc_ahb_clk_src = { 102a1608605STaniya Das .cmd_rcgr = 0x8018, 103a1608605STaniya Das .mnd_width = 0, 104a1608605STaniya Das .hid_width = 5, 105a1608605STaniya Das .parent_map = video_cc_parent_map_0, 106a1608605STaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 107a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 108a1608605STaniya Das .name = "video_cc_ahb_clk_src", 109a1608605STaniya Das .parent_data = video_cc_parent_data_0_ao, 110a1608605STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao), 111a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 112a1608605STaniya Das .ops = &clk_rcg2_ops, 113a1608605STaniya Das }, 114a1608605STaniya Das }; 115a1608605STaniya Das 116a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = { 117a1608605STaniya Das F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 118a1608605STaniya Das F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 119a1608605STaniya Das F(1260000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 120a1608605STaniya Das F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 121a1608605STaniya Das F(1600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 122a1608605STaniya Das F(1710000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 123a1608605STaniya Das F(1890000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 124a1608605STaniya Das { } 125a1608605STaniya Das }; 126a1608605STaniya Das 127a1608605STaniya Das static struct clk_rcg2 video_cc_mvs0_clk_src = { 128a1608605STaniya Das .cmd_rcgr = 0x8000, 129a1608605STaniya Das .mnd_width = 0, 130a1608605STaniya Das .hid_width = 5, 131a1608605STaniya Das .parent_map = video_cc_parent_map_1, 132a1608605STaniya Das .freq_tbl = ftbl_video_cc_mvs0_clk_src, 133a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 134a1608605STaniya Das .name = "video_cc_mvs0_clk_src", 135a1608605STaniya Das .parent_data = video_cc_parent_data_1, 136a1608605STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 137a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 138a1608605STaniya Das .ops = &clk_rcg2_shared_ops, 139a1608605STaniya Das }, 140a1608605STaniya Das }; 141a1608605STaniya Das 142a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = { 143a1608605STaniya Das F(32000, P_SLEEP_CLK, 1, 0, 0), 144a1608605STaniya Das { } 145a1608605STaniya Das }; 146a1608605STaniya Das 147a1608605STaniya Das static struct clk_rcg2 video_cc_sleep_clk_src = { 148a1608605STaniya Das .cmd_rcgr = 0x80e0, 149a1608605STaniya Das .mnd_width = 0, 150a1608605STaniya Das .hid_width = 5, 151a1608605STaniya Das .parent_map = video_cc_parent_map_2, 152a1608605STaniya Das .freq_tbl = ftbl_video_cc_sleep_clk_src, 153a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 154a1608605STaniya Das .name = "video_cc_sleep_clk_src", 155a1608605STaniya Das .parent_data = video_cc_parent_data_2_ao, 156a1608605STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_2_ao), 157a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 158a1608605STaniya Das .ops = &clk_rcg2_ops, 159a1608605STaniya Das }, 160a1608605STaniya Das }; 161a1608605STaniya Das 162a1608605STaniya Das static struct clk_rcg2 video_cc_xo_clk_src = { 163a1608605STaniya Das .cmd_rcgr = 0x80bc, 164a1608605STaniya Das .mnd_width = 0, 165a1608605STaniya Das .hid_width = 5, 166a1608605STaniya Das .parent_map = video_cc_parent_map_0, 167a1608605STaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 168a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 169a1608605STaniya Das .name = "video_cc_xo_clk_src", 170a1608605STaniya Das .parent_data = video_cc_parent_data_0_ao, 171a1608605STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao), 172a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 173a1608605STaniya Das .ops = &clk_rcg2_ops, 174a1608605STaniya Das }, 175a1608605STaniya Das }; 176a1608605STaniya Das 177a1608605STaniya Das static struct clk_regmap_div video_cc_mvs0_div_clk_src = { 178a1608605STaniya Das .reg = 0x809c, 179a1608605STaniya Das .shift = 0, 180a1608605STaniya Das .width = 4, 181a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 182a1608605STaniya Das .name = "video_cc_mvs0_div_clk_src", 183a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 184a1608605STaniya Das &video_cc_mvs0_clk_src.clkr.hw, 185a1608605STaniya Das }, 186a1608605STaniya Das .num_parents = 1, 187a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 188a1608605STaniya Das .ops = &clk_regmap_div_ro_ops, 189a1608605STaniya Das }, 190a1608605STaniya Das }; 191a1608605STaniya Das 192a1608605STaniya Das static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = { 193a1608605STaniya Das .reg = 0x8060, 194a1608605STaniya Das .shift = 0, 195a1608605STaniya Das .width = 4, 196a1608605STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 197a1608605STaniya Das .name = "video_cc_mvs0c_div2_div_clk_src", 198a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 199a1608605STaniya Das &video_cc_mvs0_clk_src.clkr.hw, 200a1608605STaniya Das }, 201a1608605STaniya Das .num_parents = 1, 202a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 203a1608605STaniya Das .ops = &clk_regmap_div_ro_ops, 204a1608605STaniya Das }, 205a1608605STaniya Das }; 206a1608605STaniya Das 207a1608605STaniya Das static struct clk_branch video_cc_mvs0_clk = { 208a1608605STaniya Das .halt_reg = 0x807c, 209a1608605STaniya Das .halt_check = BRANCH_HALT_VOTED, 210a1608605STaniya Das .hwcg_reg = 0x807c, 211a1608605STaniya Das .hwcg_bit = 1, 212a1608605STaniya Das .clkr = { 213a1608605STaniya Das .enable_reg = 0x807c, 214a1608605STaniya Das .enable_mask = BIT(0), 215a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 216a1608605STaniya Das .name = "video_cc_mvs0_clk", 217a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 218a1608605STaniya Das &video_cc_mvs0_div_clk_src.clkr.hw, 219a1608605STaniya Das }, 220a1608605STaniya Das .num_parents = 1, 221a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 222a1608605STaniya Das .ops = &clk_branch2_ops, 223a1608605STaniya Das }, 224a1608605STaniya Das }, 225a1608605STaniya Das }; 226a1608605STaniya Das 227a1608605STaniya Das static struct clk_mem_branch video_cc_mvs0_freerun_clk = { 228a1608605STaniya Das .mem_enable_reg = 0x8090, 229a1608605STaniya Das .mem_ack_reg = 0x8090, 230a1608605STaniya Das .mem_enable_mask = BIT(3), 231a1608605STaniya Das .mem_enable_ack_mask = GENMASK(11, 10), 232a1608605STaniya Das .mem_enable_invert = true, 233a1608605STaniya Das .branch = { 234a1608605STaniya Das .halt_reg = 0x808c, 235a1608605STaniya Das .halt_check = BRANCH_HALT, 236a1608605STaniya Das .clkr = { 237a1608605STaniya Das .enable_reg = 0x808c, 238a1608605STaniya Das .enable_mask = BIT(0), 239a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 240a1608605STaniya Das .name = "video_cc_mvs0_freerun_clk", 241a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 242a1608605STaniya Das &video_cc_mvs0_div_clk_src.clkr.hw, 243a1608605STaniya Das }, 244a1608605STaniya Das .num_parents = 1, 245a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 246a1608605STaniya Das .ops = &clk_branch2_mem_ops, 247a1608605STaniya Das }, 248a1608605STaniya Das }, 249a1608605STaniya Das }, 250a1608605STaniya Das }; 251a1608605STaniya Das 252a1608605STaniya Das static struct clk_branch video_cc_mvs0_shift_clk = { 253a1608605STaniya Das .halt_reg = 0x80d8, 254a1608605STaniya Das .halt_check = BRANCH_HALT_VOTED, 255a1608605STaniya Das .hwcg_reg = 0x80d8, 256a1608605STaniya Das .hwcg_bit = 1, 257a1608605STaniya Das .clkr = { 258a1608605STaniya Das .enable_reg = 0x80d8, 259a1608605STaniya Das .enable_mask = BIT(0), 260a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 261a1608605STaniya Das .name = "video_cc_mvs0_shift_clk", 262a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 263a1608605STaniya Das &video_cc_xo_clk_src.clkr.hw, 264a1608605STaniya Das }, 265a1608605STaniya Das .num_parents = 1, 266a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 267a1608605STaniya Das .ops = &clk_branch2_ops, 268a1608605STaniya Das }, 269a1608605STaniya Das }, 270a1608605STaniya Das }; 271a1608605STaniya Das 272a1608605STaniya Das static struct clk_branch video_cc_mvs0c_clk = { 273a1608605STaniya Das .halt_reg = 0x804c, 274a1608605STaniya Das .halt_check = BRANCH_HALT, 275a1608605STaniya Das .clkr = { 276a1608605STaniya Das .enable_reg = 0x804c, 277a1608605STaniya Das .enable_mask = BIT(0), 278a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 279a1608605STaniya Das .name = "video_cc_mvs0c_clk", 280a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 281a1608605STaniya Das &video_cc_mvs0c_div2_div_clk_src.clkr.hw, 282a1608605STaniya Das }, 283a1608605STaniya Das .num_parents = 1, 284a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 285a1608605STaniya Das .ops = &clk_branch2_ops, 286a1608605STaniya Das }, 287a1608605STaniya Das }, 288a1608605STaniya Das }; 289a1608605STaniya Das 290a1608605STaniya Das static struct clk_branch video_cc_mvs0c_freerun_clk = { 291a1608605STaniya Das .halt_reg = 0x805c, 292a1608605STaniya Das .halt_check = BRANCH_HALT, 293a1608605STaniya Das .clkr = { 294a1608605STaniya Das .enable_reg = 0x805c, 295a1608605STaniya Das .enable_mask = BIT(0), 296a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 297a1608605STaniya Das .name = "video_cc_mvs0c_freerun_clk", 298a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 299a1608605STaniya Das &video_cc_mvs0c_div2_div_clk_src.clkr.hw, 300a1608605STaniya Das }, 301a1608605STaniya Das .num_parents = 1, 302a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 303a1608605STaniya Das .ops = &clk_branch2_ops, 304a1608605STaniya Das }, 305a1608605STaniya Das }, 306a1608605STaniya Das }; 307a1608605STaniya Das 308a1608605STaniya Das static struct clk_branch video_cc_mvs0c_shift_clk = { 309a1608605STaniya Das .halt_reg = 0x80dc, 310a1608605STaniya Das .halt_check = BRANCH_HALT_VOTED, 311a1608605STaniya Das .hwcg_reg = 0x80dc, 312a1608605STaniya Das .hwcg_bit = 1, 313a1608605STaniya Das .clkr = { 314a1608605STaniya Das .enable_reg = 0x80dc, 315a1608605STaniya Das .enable_mask = BIT(0), 316a1608605STaniya Das .hw.init = &(const struct clk_init_data) { 317a1608605STaniya Das .name = "video_cc_mvs0c_shift_clk", 318a1608605STaniya Das .parent_hws = (const struct clk_hw*[]) { 319a1608605STaniya Das &video_cc_xo_clk_src.clkr.hw, 320a1608605STaniya Das }, 321a1608605STaniya Das .num_parents = 1, 322a1608605STaniya Das .flags = CLK_SET_RATE_PARENT, 323a1608605STaniya Das .ops = &clk_branch2_ops, 324a1608605STaniya Das }, 325a1608605STaniya Das }, 326a1608605STaniya Das }; 327a1608605STaniya Das 328a1608605STaniya Das static struct gdsc video_cc_mvs0c_gdsc = { 329a1608605STaniya Das .gdscr = 0x8034, 330a1608605STaniya Das .en_rest_wait_val = 0x2, 331a1608605STaniya Das .en_few_wait_val = 0x2, 332a1608605STaniya Das .clk_dis_wait_val = 0x6, 333a1608605STaniya Das .pd = { 334a1608605STaniya Das .name = "video_cc_mvs0c_gdsc", 335a1608605STaniya Das }, 336a1608605STaniya Das .pwrsts = PWRSTS_OFF_ON, 337a1608605STaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 338a1608605STaniya Das }; 339a1608605STaniya Das 340a1608605STaniya Das static struct gdsc video_cc_mvs0_gdsc = { 341a1608605STaniya Das .gdscr = 0x8068, 342a1608605STaniya Das .en_rest_wait_val = 0x2, 343a1608605STaniya Das .en_few_wait_val = 0x2, 344a1608605STaniya Das .clk_dis_wait_val = 0x6, 345a1608605STaniya Das .pd = { 346a1608605STaniya Das .name = "video_cc_mvs0_gdsc", 347a1608605STaniya Das }, 348a1608605STaniya Das .pwrsts = PWRSTS_OFF_ON, 349a1608605STaniya Das .parent = &video_cc_mvs0c_gdsc.pd, 350a1608605STaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | HW_CTRL_TRIGGER, 351a1608605STaniya Das }; 352a1608605STaniya Das 353a1608605STaniya Das static struct clk_regmap *video_cc_sm8750_clocks[] = { 354a1608605STaniya Das [VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr, 355a1608605STaniya Das [VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr, 356a1608605STaniya Das [VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr, 357a1608605STaniya Das [VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr, 358a1608605STaniya Das [VIDEO_CC_MVS0_FREERUN_CLK] = &video_cc_mvs0_freerun_clk.branch.clkr, 359a1608605STaniya Das [VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr, 360a1608605STaniya Das [VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr, 361a1608605STaniya Das [VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] = &video_cc_mvs0c_div2_div_clk_src.clkr, 362a1608605STaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr, 363a1608605STaniya Das [VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr, 364a1608605STaniya Das [VIDEO_CC_PLL0] = &video_cc_pll0.clkr, 365a1608605STaniya Das [VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr, 366a1608605STaniya Das [VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr, 367a1608605STaniya Das }; 368a1608605STaniya Das 369a1608605STaniya Das static struct gdsc *video_cc_sm8750_gdscs[] = { 370a1608605STaniya Das [VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc, 371a1608605STaniya Das [VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc, 372a1608605STaniya Das }; 373a1608605STaniya Das 374a1608605STaniya Das static const struct qcom_reset_map video_cc_sm8750_resets[] = { 375a1608605STaniya Das [VIDEO_CC_INTERFACE_BCR] = { 0x80a0 }, 376a1608605STaniya Das [VIDEO_CC_MVS0_BCR] = { 0x8064 }, 377a1608605STaniya Das [VIDEO_CC_MVS0C_CLK_ARES] = { 0x804c, 2 }, 378a1608605STaniya Das [VIDEO_CC_MVS0C_BCR] = { 0x8030 }, 379a1608605STaniya Das [VIDEO_CC_MVS0_FREERUN_CLK_ARES] = { 0x808c, 2 }, 380a1608605STaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x805c, 2 }, 381a1608605STaniya Das [VIDEO_CC_XO_CLK_ARES] = { 0x80d4, 2 }, 382a1608605STaniya Das }; 383a1608605STaniya Das 384a1608605STaniya Das static const struct regmap_config video_cc_sm8750_regmap_config = { 385a1608605STaniya Das .reg_bits = 32, 386a1608605STaniya Das .reg_stride = 4, 387a1608605STaniya Das .val_bits = 32, 388a1608605STaniya Das .max_register = 0x9f4c, 389a1608605STaniya Das .fast_io = true, 390a1608605STaniya Das }; 391a1608605STaniya Das 392a1608605STaniya Das static struct clk_alpha_pll *video_cc_sm8750_plls[] = { 393a1608605STaniya Das &video_cc_pll0, 394a1608605STaniya Das }; 395a1608605STaniya Das 396a1608605STaniya Das static u32 video_cc_sm8750_critical_cbcrs[] = { 397a1608605STaniya Das 0x80a4, /* VIDEO_CC_AHB_CLK */ 398a1608605STaniya Das 0x80f8, /* VIDEO_CC_SLEEP_CLK */ 399a1608605STaniya Das 0x80d4, /* VIDEO_CC_XO_CLK */ 400a1608605STaniya Das }; 401a1608605STaniya Das 402a1608605STaniya Das static void clk_sm8750_regs_configure(struct device *dev, struct regmap *regmap) 403a1608605STaniya Das { 404a1608605STaniya Das /* Update DLY_ACCU_RED_SHIFTER_DONE to 0xF for mvs0, mvs0c */ 405a1608605STaniya Das regmap_update_bits(regmap, 0x8074, GENMASK(25, 21), GENMASK(25, 21)); 406a1608605STaniya Das regmap_update_bits(regmap, 0x8040, GENMASK(25, 21), GENMASK(25, 21)); 407a1608605STaniya Das 408a1608605STaniya Das regmap_update_bits(regmap, 0x9f24, BIT(0), BIT(0)); 409a1608605STaniya Das } 410a1608605STaniya Das 411a1608605STaniya Das static struct qcom_cc_driver_data video_cc_sm8750_driver_data = { 412a1608605STaniya Das .alpha_plls = video_cc_sm8750_plls, 413a1608605STaniya Das .num_alpha_plls = ARRAY_SIZE(video_cc_sm8750_plls), 414a1608605STaniya Das .clk_cbcrs = video_cc_sm8750_critical_cbcrs, 415a1608605STaniya Das .num_clk_cbcrs = ARRAY_SIZE(video_cc_sm8750_critical_cbcrs), 416a1608605STaniya Das .clk_regs_configure = clk_sm8750_regs_configure, 417a1608605STaniya Das }; 418a1608605STaniya Das 419*77d0ea71SKrzysztof Kozlowski static const struct qcom_cc_desc video_cc_sm8750_desc = { 420a1608605STaniya Das .config = &video_cc_sm8750_regmap_config, 421a1608605STaniya Das .clks = video_cc_sm8750_clocks, 422a1608605STaniya Das .num_clks = ARRAY_SIZE(video_cc_sm8750_clocks), 423a1608605STaniya Das .resets = video_cc_sm8750_resets, 424a1608605STaniya Das .num_resets = ARRAY_SIZE(video_cc_sm8750_resets), 425a1608605STaniya Das .gdscs = video_cc_sm8750_gdscs, 426a1608605STaniya Das .num_gdscs = ARRAY_SIZE(video_cc_sm8750_gdscs), 427a1608605STaniya Das .use_rpm = true, 428a1608605STaniya Das .driver_data = &video_cc_sm8750_driver_data, 429a1608605STaniya Das }; 430a1608605STaniya Das 431a1608605STaniya Das static const struct of_device_id video_cc_sm8750_match_table[] = { 432a1608605STaniya Das { .compatible = "qcom,sm8750-videocc" }, 433a1608605STaniya Das { } 434a1608605STaniya Das }; 435a1608605STaniya Das MODULE_DEVICE_TABLE(of, video_cc_sm8750_match_table); 436a1608605STaniya Das 437a1608605STaniya Das static int video_cc_sm8750_probe(struct platform_device *pdev) 438a1608605STaniya Das { 439a1608605STaniya Das return qcom_cc_probe(pdev, &video_cc_sm8750_desc); 440a1608605STaniya Das } 441a1608605STaniya Das 442a1608605STaniya Das static struct platform_driver video_cc_sm8750_driver = { 443a1608605STaniya Das .probe = video_cc_sm8750_probe, 444a1608605STaniya Das .driver = { 445a1608605STaniya Das .name = "video_cc-sm8750", 446a1608605STaniya Das .of_match_table = video_cc_sm8750_match_table, 447a1608605STaniya Das }, 448a1608605STaniya Das }; 449a1608605STaniya Das 450a1608605STaniya Das static int __init video_cc_sm8750_init(void) 451a1608605STaniya Das { 452a1608605STaniya Das return platform_driver_register(&video_cc_sm8750_driver); 453a1608605STaniya Das } 454a1608605STaniya Das subsys_initcall(video_cc_sm8750_init); 455a1608605STaniya Das 456a1608605STaniya Das static void __exit video_cc_sm8750_exit(void) 457a1608605STaniya Das { 458a1608605STaniya Das platform_driver_unregister(&video_cc_sm8750_driver); 459a1608605STaniya Das } 460a1608605STaniya Das module_exit(video_cc_sm8750_exit); 461a1608605STaniya Das 462a1608605STaniya Das MODULE_DESCRIPTION("QTI VIDEO_CC SM8750 Driver"); 463a1608605STaniya Das MODULE_LICENSE("GPL"); 464