1e2e0d2f3STaniya Das // SPDX-License-Identifier: GPL-2.0-only 2e2e0d2f3STaniya Das /* 3e2e0d2f3STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4e2e0d2f3STaniya Das */ 5e2e0d2f3STaniya Das 6e2e0d2f3STaniya Das #include <linux/clk-provider.h> 7e2e0d2f3STaniya Das #include <linux/mod_devicetable.h> 8e2e0d2f3STaniya Das #include <linux/module.h> 9e2e0d2f3STaniya Das #include <linux/platform_device.h> 10e2e0d2f3STaniya Das #include <linux/regmap.h> 11e2e0d2f3STaniya Das 12e2e0d2f3STaniya Das #include <dt-bindings/clock/qcom,glymur-videocc.h> 13e2e0d2f3STaniya Das 14e2e0d2f3STaniya Das #include "clk-alpha-pll.h" 15e2e0d2f3STaniya Das #include "clk-branch.h" 16e2e0d2f3STaniya Das #include "clk-pll.h" 17e2e0d2f3STaniya Das #include "clk-rcg.h" 18e2e0d2f3STaniya Das #include "clk-regmap.h" 19e2e0d2f3STaniya Das #include "clk-regmap-divider.h" 20e2e0d2f3STaniya Das #include "clk-regmap-mux.h" 21e2e0d2f3STaniya Das #include "common.h" 22e2e0d2f3STaniya Das #include "gdsc.h" 23e2e0d2f3STaniya Das #include "reset.h" 24e2e0d2f3STaniya Das 25e2e0d2f3STaniya Das enum { 26e2e0d2f3STaniya Das DT_BI_TCXO, 27e2e0d2f3STaniya Das DT_BI_TCXO_AO, 28e2e0d2f3STaniya Das DT_SLEEP_CLK, 29e2e0d2f3STaniya Das }; 30e2e0d2f3STaniya Das 31e2e0d2f3STaniya Das enum { 32e2e0d2f3STaniya Das P_BI_TCXO, 33e2e0d2f3STaniya Das P_SLEEP_CLK, 34e2e0d2f3STaniya Das P_VIDEO_CC_PLL0_OUT_MAIN, 35e2e0d2f3STaniya Das }; 36e2e0d2f3STaniya Das 37e2e0d2f3STaniya Das static const struct pll_vco taycan_eko_t_vco[] = { 38e2e0d2f3STaniya Das { 249600000, 2500000000, 0 }, 39e2e0d2f3STaniya Das }; 40e2e0d2f3STaniya Das 41e2e0d2f3STaniya Das /* 720.0 MHz Configuration */ 42e2e0d2f3STaniya Das static const struct alpha_pll_config video_cc_pll0_config = { 43e2e0d2f3STaniya Das .l = 0x25, 44e2e0d2f3STaniya Das .alpha = 0x8000, 45e2e0d2f3STaniya Das .config_ctl_val = 0x25c400e7, 46e2e0d2f3STaniya Das .config_ctl_hi_val = 0x0a8060e0, 47e2e0d2f3STaniya Das .config_ctl_hi1_val = 0xf51dea20, 48e2e0d2f3STaniya Das .user_ctl_val = 0x00000008, 49e2e0d2f3STaniya Das .user_ctl_hi_val = 0x00000002, 50e2e0d2f3STaniya Das }; 51e2e0d2f3STaniya Das 52e2e0d2f3STaniya Das static struct clk_alpha_pll video_cc_pll0 = { 53e2e0d2f3STaniya Das .offset = 0x0, 54e2e0d2f3STaniya Das .config = &video_cc_pll0_config, 55e2e0d2f3STaniya Das .vco_table = taycan_eko_t_vco, 56e2e0d2f3STaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 57e2e0d2f3STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 58e2e0d2f3STaniya Das .clkr = { 59e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 60e2e0d2f3STaniya Das .name = "video_cc_pll0", 61e2e0d2f3STaniya Das .parent_data = &(const struct clk_parent_data) { 62e2e0d2f3STaniya Das .index = DT_BI_TCXO, 63e2e0d2f3STaniya Das }, 64e2e0d2f3STaniya Das .num_parents = 1, 65e2e0d2f3STaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 66e2e0d2f3STaniya Das }, 67e2e0d2f3STaniya Das }, 68e2e0d2f3STaniya Das }; 69e2e0d2f3STaniya Das 70e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_0[] = { 71e2e0d2f3STaniya Das { P_BI_TCXO, 0 }, 72e2e0d2f3STaniya Das }; 73e2e0d2f3STaniya Das 74e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_0[] = { 75e2e0d2f3STaniya Das { .index = DT_BI_TCXO }, 76e2e0d2f3STaniya Das }; 77e2e0d2f3STaniya Das 78e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_1[] = { 79e2e0d2f3STaniya Das { P_BI_TCXO, 0 }, 80e2e0d2f3STaniya Das { P_VIDEO_CC_PLL0_OUT_MAIN, 1 }, 81e2e0d2f3STaniya Das }; 82e2e0d2f3STaniya Das 83e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_1[] = { 84e2e0d2f3STaniya Das { .index = DT_BI_TCXO }, 85e2e0d2f3STaniya Das { .hw = &video_cc_pll0.clkr.hw }, 86e2e0d2f3STaniya Das }; 87e2e0d2f3STaniya Das 88e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_2[] = { 89e2e0d2f3STaniya Das { P_SLEEP_CLK, 0 }, 90e2e0d2f3STaniya Das }; 91e2e0d2f3STaniya Das 92e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_2[] = { 93e2e0d2f3STaniya Das { .index = DT_SLEEP_CLK }, 94e2e0d2f3STaniya Das }; 95e2e0d2f3STaniya Das 96e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = { 97e2e0d2f3STaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 98e2e0d2f3STaniya Das { } 99e2e0d2f3STaniya Das }; 100e2e0d2f3STaniya Das 101e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_ahb_clk_src = { 102e2e0d2f3STaniya Das .cmd_rcgr = 0x8018, 103e2e0d2f3STaniya Das .mnd_width = 0, 104e2e0d2f3STaniya Das .hid_width = 5, 105e2e0d2f3STaniya Das .parent_map = video_cc_parent_map_0, 106e2e0d2f3STaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 107e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 108e2e0d2f3STaniya Das .name = "video_cc_ahb_clk_src", 109e2e0d2f3STaniya Das .parent_data = video_cc_parent_data_0, 110e2e0d2f3STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 111e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 112e2e0d2f3STaniya Das .ops = &clk_rcg2_shared_ops, 113e2e0d2f3STaniya Das }, 114e2e0d2f3STaniya Das }; 115e2e0d2f3STaniya Das 116e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = { 117e2e0d2f3STaniya Das F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 118e2e0d2f3STaniya Das F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 119e2e0d2f3STaniya Das F(1098000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 120e2e0d2f3STaniya Das F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 121e2e0d2f3STaniya Das F(1600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 122e2e0d2f3STaniya Das F(1965000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 123e2e0d2f3STaniya Das { } 124e2e0d2f3STaniya Das }; 125e2e0d2f3STaniya Das 126e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_mvs0_clk_src = { 127e2e0d2f3STaniya Das .cmd_rcgr = 0x8000, 128e2e0d2f3STaniya Das .mnd_width = 0, 129e2e0d2f3STaniya Das .hid_width = 5, 130e2e0d2f3STaniya Das .parent_map = video_cc_parent_map_1, 131e2e0d2f3STaniya Das .freq_tbl = ftbl_video_cc_mvs0_clk_src, 132e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 133e2e0d2f3STaniya Das .name = "video_cc_mvs0_clk_src", 134e2e0d2f3STaniya Das .parent_data = video_cc_parent_data_1, 135e2e0d2f3STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 136e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 137e2e0d2f3STaniya Das .ops = &clk_rcg2_shared_ops, 138e2e0d2f3STaniya Das }, 139e2e0d2f3STaniya Das }; 140e2e0d2f3STaniya Das 141e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = { 142e2e0d2f3STaniya Das F(32000, P_SLEEP_CLK, 1, 0, 0), 143e2e0d2f3STaniya Das { } 144e2e0d2f3STaniya Das }; 145e2e0d2f3STaniya Das 146e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_sleep_clk_src = { 147e2e0d2f3STaniya Das .cmd_rcgr = 0x8120, 148e2e0d2f3STaniya Das .mnd_width = 0, 149e2e0d2f3STaniya Das .hid_width = 5, 150e2e0d2f3STaniya Das .parent_map = video_cc_parent_map_2, 151e2e0d2f3STaniya Das .freq_tbl = ftbl_video_cc_sleep_clk_src, 152e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 153e2e0d2f3STaniya Das .name = "video_cc_sleep_clk_src", 154e2e0d2f3STaniya Das .parent_data = video_cc_parent_data_2, 155e2e0d2f3STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_2), 156e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 157e2e0d2f3STaniya Das .ops = &clk_rcg2_shared_ops, 158e2e0d2f3STaniya Das }, 159e2e0d2f3STaniya Das }; 160e2e0d2f3STaniya Das 161e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_xo_clk_src = { 162e2e0d2f3STaniya Das .cmd_rcgr = 0x80f8, 163e2e0d2f3STaniya Das .mnd_width = 0, 164e2e0d2f3STaniya Das .hid_width = 5, 165e2e0d2f3STaniya Das .parent_map = video_cc_parent_map_0, 166e2e0d2f3STaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 167e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 168e2e0d2f3STaniya Das .name = "video_cc_xo_clk_src", 169e2e0d2f3STaniya Das .parent_data = video_cc_parent_data_0, 170e2e0d2f3STaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 171e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 172e2e0d2f3STaniya Das .ops = &clk_rcg2_shared_ops, 173e2e0d2f3STaniya Das }, 174e2e0d2f3STaniya Das }; 175e2e0d2f3STaniya Das 176e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs0_div_clk_src = { 177e2e0d2f3STaniya Das .reg = 0x809c, 178e2e0d2f3STaniya Das .shift = 0, 179e2e0d2f3STaniya Das .width = 4, 180e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 181e2e0d2f3STaniya Das .name = "video_cc_mvs0_div_clk_src", 182e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 183e2e0d2f3STaniya Das &video_cc_mvs0_clk_src.clkr.hw, 184e2e0d2f3STaniya Das }, 185e2e0d2f3STaniya Das .num_parents = 1, 186e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 187e2e0d2f3STaniya Das .ops = &clk_regmap_div_ro_ops, 188e2e0d2f3STaniya Das }, 189e2e0d2f3STaniya Das }; 190e2e0d2f3STaniya Das 191e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = { 192e2e0d2f3STaniya Das .reg = 0x8060, 193e2e0d2f3STaniya Das .shift = 0, 194e2e0d2f3STaniya Das .width = 4, 195e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 196e2e0d2f3STaniya Das .name = "video_cc_mvs0c_div2_div_clk_src", 197e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 198e2e0d2f3STaniya Das &video_cc_mvs0_clk_src.clkr.hw, 199e2e0d2f3STaniya Das }, 200e2e0d2f3STaniya Das .num_parents = 1, 201e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 202e2e0d2f3STaniya Das .ops = &clk_regmap_div_ro_ops, 203e2e0d2f3STaniya Das }, 204e2e0d2f3STaniya Das }; 205e2e0d2f3STaniya Das 206e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs1_div_clk_src = { 207e2e0d2f3STaniya Das .reg = 0x80d8, 208e2e0d2f3STaniya Das .shift = 0, 209e2e0d2f3STaniya Das .width = 4, 210e2e0d2f3STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 211e2e0d2f3STaniya Das .name = "video_cc_mvs1_div_clk_src", 212e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 213e2e0d2f3STaniya Das &video_cc_mvs0_clk_src.clkr.hw, 214e2e0d2f3STaniya Das }, 215e2e0d2f3STaniya Das .num_parents = 1, 216e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 217e2e0d2f3STaniya Das .ops = &clk_regmap_div_ro_ops, 218e2e0d2f3STaniya Das }, 219e2e0d2f3STaniya Das }; 220e2e0d2f3STaniya Das 221e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_clk = { 222e2e0d2f3STaniya Das .halt_reg = 0x807c, 223e2e0d2f3STaniya Das .halt_check = BRANCH_HALT_VOTED, 224e2e0d2f3STaniya Das .hwcg_reg = 0x807c, 225e2e0d2f3STaniya Das .hwcg_bit = 1, 226e2e0d2f3STaniya Das .clkr = { 227e2e0d2f3STaniya Das .enable_reg = 0x807c, 228e2e0d2f3STaniya Das .enable_mask = BIT(0), 229e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 230e2e0d2f3STaniya Das .name = "video_cc_mvs0_clk", 231e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 232e2e0d2f3STaniya Das &video_cc_mvs0_div_clk_src.clkr.hw, 233e2e0d2f3STaniya Das }, 234e2e0d2f3STaniya Das .num_parents = 1, 235e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 236e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 237e2e0d2f3STaniya Das }, 238e2e0d2f3STaniya Das }, 239e2e0d2f3STaniya Das }; 240e2e0d2f3STaniya Das 241e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_freerun_clk = { 242e2e0d2f3STaniya Das .halt_reg = 0x808c, 243e2e0d2f3STaniya Das .halt_check = BRANCH_HALT, 244e2e0d2f3STaniya Das .clkr = { 245e2e0d2f3STaniya Das .enable_reg = 0x808c, 246e2e0d2f3STaniya Das .enable_mask = BIT(0), 247e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 248e2e0d2f3STaniya Das .name = "video_cc_mvs0_freerun_clk", 249e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 250e2e0d2f3STaniya Das &video_cc_mvs0_div_clk_src.clkr.hw, 251e2e0d2f3STaniya Das }, 252e2e0d2f3STaniya Das .num_parents = 1, 253e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 254e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 255e2e0d2f3STaniya Das }, 256e2e0d2f3STaniya Das }, 257e2e0d2f3STaniya Das }; 258e2e0d2f3STaniya Das 259e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_shift_clk = { 260e2e0d2f3STaniya Das .halt_reg = 0x8114, 261e2e0d2f3STaniya Das .halt_check = BRANCH_HALT_VOTED, 262e2e0d2f3STaniya Das .hwcg_reg = 0x8114, 263e2e0d2f3STaniya Das .hwcg_bit = 1, 264e2e0d2f3STaniya Das .clkr = { 265e2e0d2f3STaniya Das .enable_reg = 0x8114, 266e2e0d2f3STaniya Das .enable_mask = BIT(0), 267e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 268e2e0d2f3STaniya Das .name = "video_cc_mvs0_shift_clk", 269e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 270e2e0d2f3STaniya Das &video_cc_xo_clk_src.clkr.hw, 271e2e0d2f3STaniya Das }, 272e2e0d2f3STaniya Das .num_parents = 1, 273e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 274e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 275e2e0d2f3STaniya Das }, 276e2e0d2f3STaniya Das }, 277e2e0d2f3STaniya Das }; 278e2e0d2f3STaniya Das 279e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_clk = { 280e2e0d2f3STaniya Das .halt_reg = 0x804c, 281e2e0d2f3STaniya Das .halt_check = BRANCH_HALT, 282e2e0d2f3STaniya Das .clkr = { 283e2e0d2f3STaniya Das .enable_reg = 0x804c, 284e2e0d2f3STaniya Das .enable_mask = BIT(0), 285e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 286e2e0d2f3STaniya Das .name = "video_cc_mvs0c_clk", 287e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 288e2e0d2f3STaniya Das &video_cc_mvs0c_div2_div_clk_src.clkr.hw, 289e2e0d2f3STaniya Das }, 290e2e0d2f3STaniya Das .num_parents = 1, 291e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 292e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 293e2e0d2f3STaniya Das }, 294e2e0d2f3STaniya Das }, 295e2e0d2f3STaniya Das }; 296e2e0d2f3STaniya Das 297e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_freerun_clk = { 298e2e0d2f3STaniya Das .halt_reg = 0x805c, 299e2e0d2f3STaniya Das .halt_check = BRANCH_HALT, 300e2e0d2f3STaniya Das .clkr = { 301e2e0d2f3STaniya Das .enable_reg = 0x805c, 302e2e0d2f3STaniya Das .enable_mask = BIT(0), 303e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 304e2e0d2f3STaniya Das .name = "video_cc_mvs0c_freerun_clk", 305e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 306e2e0d2f3STaniya Das &video_cc_mvs0c_div2_div_clk_src.clkr.hw, 307e2e0d2f3STaniya Das }, 308e2e0d2f3STaniya Das .num_parents = 1, 309e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 310e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 311e2e0d2f3STaniya Das }, 312e2e0d2f3STaniya Das }, 313e2e0d2f3STaniya Das }; 314e2e0d2f3STaniya Das 315e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_shift_clk = { 316e2e0d2f3STaniya Das .halt_reg = 0x811c, 317e2e0d2f3STaniya Das .halt_check = BRANCH_HALT_VOTED, 318e2e0d2f3STaniya Das .hwcg_reg = 0x811c, 319e2e0d2f3STaniya Das .hwcg_bit = 1, 320e2e0d2f3STaniya Das .clkr = { 321e2e0d2f3STaniya Das .enable_reg = 0x811c, 322e2e0d2f3STaniya Das .enable_mask = BIT(0), 323e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 324e2e0d2f3STaniya Das .name = "video_cc_mvs0c_shift_clk", 325e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 326e2e0d2f3STaniya Das &video_cc_xo_clk_src.clkr.hw, 327e2e0d2f3STaniya Das }, 328e2e0d2f3STaniya Das .num_parents = 1, 329e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 330e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 331e2e0d2f3STaniya Das }, 332e2e0d2f3STaniya Das }, 333e2e0d2f3STaniya Das }; 334e2e0d2f3STaniya Das 335e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_clk = { 336e2e0d2f3STaniya Das .halt_reg = 0x80b8, 337e2e0d2f3STaniya Das .halt_check = BRANCH_HALT_VOTED, 338e2e0d2f3STaniya Das .hwcg_reg = 0x80b8, 339e2e0d2f3STaniya Das .hwcg_bit = 1, 340e2e0d2f3STaniya Das .clkr = { 341e2e0d2f3STaniya Das .enable_reg = 0x80b8, 342e2e0d2f3STaniya Das .enable_mask = BIT(0), 343e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 344e2e0d2f3STaniya Das .name = "video_cc_mvs1_clk", 345e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 346e2e0d2f3STaniya Das &video_cc_mvs1_div_clk_src.clkr.hw, 347e2e0d2f3STaniya Das }, 348e2e0d2f3STaniya Das .num_parents = 1, 349e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 350e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 351e2e0d2f3STaniya Das }, 352e2e0d2f3STaniya Das }, 353e2e0d2f3STaniya Das }; 354e2e0d2f3STaniya Das 355e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_freerun_clk = { 356e2e0d2f3STaniya Das .halt_reg = 0x80c8, 357e2e0d2f3STaniya Das .halt_check = BRANCH_HALT, 358e2e0d2f3STaniya Das .clkr = { 359e2e0d2f3STaniya Das .enable_reg = 0x80c8, 360e2e0d2f3STaniya Das .enable_mask = BIT(0), 361e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 362e2e0d2f3STaniya Das .name = "video_cc_mvs1_freerun_clk", 363e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 364e2e0d2f3STaniya Das &video_cc_mvs1_div_clk_src.clkr.hw, 365e2e0d2f3STaniya Das }, 366e2e0d2f3STaniya Das .num_parents = 1, 367e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 368e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 369e2e0d2f3STaniya Das }, 370e2e0d2f3STaniya Das }, 371e2e0d2f3STaniya Das }; 372e2e0d2f3STaniya Das 373e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_shift_clk = { 374e2e0d2f3STaniya Das .halt_reg = 0x8118, 375e2e0d2f3STaniya Das .halt_check = BRANCH_HALT_VOTED, 376e2e0d2f3STaniya Das .hwcg_reg = 0x8118, 377e2e0d2f3STaniya Das .hwcg_bit = 1, 378e2e0d2f3STaniya Das .clkr = { 379e2e0d2f3STaniya Das .enable_reg = 0x8118, 380e2e0d2f3STaniya Das .enable_mask = BIT(0), 381e2e0d2f3STaniya Das .hw.init = &(const struct clk_init_data) { 382e2e0d2f3STaniya Das .name = "video_cc_mvs1_shift_clk", 383e2e0d2f3STaniya Das .parent_hws = (const struct clk_hw*[]) { 384e2e0d2f3STaniya Das &video_cc_xo_clk_src.clkr.hw, 385e2e0d2f3STaniya Das }, 386e2e0d2f3STaniya Das .num_parents = 1, 387e2e0d2f3STaniya Das .flags = CLK_SET_RATE_PARENT, 388e2e0d2f3STaniya Das .ops = &clk_branch2_ops, 389e2e0d2f3STaniya Das }, 390e2e0d2f3STaniya Das }, 391e2e0d2f3STaniya Das }; 392e2e0d2f3STaniya Das 393e2e0d2f3STaniya Das static struct gdsc video_cc_mvs0c_gdsc = { 394e2e0d2f3STaniya Das .gdscr = 0x8034, 395e2e0d2f3STaniya Das .en_rest_wait_val = 0x2, 396e2e0d2f3STaniya Das .en_few_wait_val = 0x2, 397e2e0d2f3STaniya Das .clk_dis_wait_val = 0x6, 398e2e0d2f3STaniya Das .pd = { 399e2e0d2f3STaniya Das .name = "video_cc_mvs0c_gdsc", 400e2e0d2f3STaniya Das }, 401e2e0d2f3STaniya Das .pwrsts = PWRSTS_OFF_ON, 402e2e0d2f3STaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 403e2e0d2f3STaniya Das }; 404e2e0d2f3STaniya Das 405e2e0d2f3STaniya Das static struct gdsc video_cc_mvs0_gdsc = { 406e2e0d2f3STaniya Das .gdscr = 0x8068, 407e2e0d2f3STaniya Das .en_rest_wait_val = 0x2, 408e2e0d2f3STaniya Das .en_few_wait_val = 0x2, 409e2e0d2f3STaniya Das .clk_dis_wait_val = 0x6, 410e2e0d2f3STaniya Das .pd = { 411e2e0d2f3STaniya Das .name = "video_cc_mvs0_gdsc", 412e2e0d2f3STaniya Das }, 413e2e0d2f3STaniya Das .pwrsts = PWRSTS_OFF_ON, 414e2e0d2f3STaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 415e2e0d2f3STaniya Das .parent = &video_cc_mvs0c_gdsc.pd, 416e2e0d2f3STaniya Das }; 417e2e0d2f3STaniya Das 418e2e0d2f3STaniya Das static struct gdsc video_cc_mvs1_gdsc = { 419e2e0d2f3STaniya Das .gdscr = 0x80a4, 420e2e0d2f3STaniya Das .en_rest_wait_val = 0x2, 421e2e0d2f3STaniya Das .en_few_wait_val = 0x2, 422e2e0d2f3STaniya Das .clk_dis_wait_val = 0x6, 423e2e0d2f3STaniya Das .pd = { 424e2e0d2f3STaniya Das .name = "video_cc_mvs1_gdsc", 425e2e0d2f3STaniya Das }, 426e2e0d2f3STaniya Das .pwrsts = PWRSTS_OFF_ON, 427e2e0d2f3STaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 428e2e0d2f3STaniya Das }; 429e2e0d2f3STaniya Das 430e2e0d2f3STaniya Das static struct clk_regmap *video_cc_glymur_clocks[] = { 431e2e0d2f3STaniya Das [VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr, 432e2e0d2f3STaniya Das [VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr, 433e2e0d2f3STaniya Das [VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr, 434e2e0d2f3STaniya Das [VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr, 435e2e0d2f3STaniya Das [VIDEO_CC_MVS0_FREERUN_CLK] = &video_cc_mvs0_freerun_clk.clkr, 436e2e0d2f3STaniya Das [VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr, 437e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr, 438e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] = &video_cc_mvs0c_div2_div_clk_src.clkr, 439e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr, 440e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr, 441e2e0d2f3STaniya Das [VIDEO_CC_MVS1_CLK] = &video_cc_mvs1_clk.clkr, 442e2e0d2f3STaniya Das [VIDEO_CC_MVS1_DIV_CLK_SRC] = &video_cc_mvs1_div_clk_src.clkr, 443e2e0d2f3STaniya Das [VIDEO_CC_MVS1_FREERUN_CLK] = &video_cc_mvs1_freerun_clk.clkr, 444e2e0d2f3STaniya Das [VIDEO_CC_MVS1_SHIFT_CLK] = &video_cc_mvs1_shift_clk.clkr, 445e2e0d2f3STaniya Das [VIDEO_CC_PLL0] = &video_cc_pll0.clkr, 446e2e0d2f3STaniya Das [VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr, 447e2e0d2f3STaniya Das [VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr, 448e2e0d2f3STaniya Das }; 449e2e0d2f3STaniya Das 450e2e0d2f3STaniya Das static struct gdsc *video_cc_glymur_gdscs[] = { 451e2e0d2f3STaniya Das [VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc, 452e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc, 453e2e0d2f3STaniya Das [VIDEO_CC_MVS1_GDSC] = &video_cc_mvs1_gdsc, 454e2e0d2f3STaniya Das }; 455e2e0d2f3STaniya Das 456e2e0d2f3STaniya Das static const struct qcom_reset_map video_cc_glymur_resets[] = { 457e2e0d2f3STaniya Das [VIDEO_CC_INTERFACE_BCR] = { 0x80dc }, 458e2e0d2f3STaniya Das [VIDEO_CC_MVS0_BCR] = { 0x8064 }, 459e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x805c, 2 }, 460e2e0d2f3STaniya Das [VIDEO_CC_MVS0C_BCR] = { 0x8030 }, 461e2e0d2f3STaniya Das [VIDEO_CC_MVS0_FREERUN_CLK_ARES] = { 0x808c, 2 }, 462e2e0d2f3STaniya Das [VIDEO_CC_MVS1_FREERUN_CLK_ARES] = { 0x80c8, 2 }, 463e2e0d2f3STaniya Das [VIDEO_CC_MVS1_BCR] = { 0x80a0 }, 464e2e0d2f3STaniya Das }; 465e2e0d2f3STaniya Das 466e2e0d2f3STaniya Das static struct clk_alpha_pll *video_cc_glymur_plls[] = { 467e2e0d2f3STaniya Das &video_cc_pll0, 468e2e0d2f3STaniya Das }; 469e2e0d2f3STaniya Das 470*87df31eaSKrzysztof Kozlowski static const u32 video_cc_glymur_critical_cbcrs[] = { 471e2e0d2f3STaniya Das 0x80e0, /* VIDEO_CC_AHB_CLK */ 472e2e0d2f3STaniya Das 0x8138, /* VIDEO_CC_SLEEP_CLK */ 473e2e0d2f3STaniya Das 0x8110, /* VIDEO_CC_XO_CLK */ 474e2e0d2f3STaniya Das }; 475e2e0d2f3STaniya Das 476e2e0d2f3STaniya Das static const struct regmap_config video_cc_glymur_regmap_config = { 477e2e0d2f3STaniya Das .reg_bits = 32, 478e2e0d2f3STaniya Das .reg_stride = 4, 479e2e0d2f3STaniya Das .val_bits = 32, 480e2e0d2f3STaniya Das .max_register = 0x9f54, 481e2e0d2f3STaniya Das .fast_io = true, 482e2e0d2f3STaniya Das }; 483e2e0d2f3STaniya Das 484e2e0d2f3STaniya Das static void clk_glymur_regs_configure(struct device *dev, struct regmap *regmap) 485e2e0d2f3STaniya Das { 486e2e0d2f3STaniya Das /* Update CTRL_IN register */ 487e2e0d2f3STaniya Das regmap_update_bits(regmap, 0x9f24, BIT(0), BIT(0)); 488e2e0d2f3STaniya Das } 489e2e0d2f3STaniya Das 490573ddd0dSKrzysztof Kozlowski static const struct qcom_cc_driver_data video_cc_glymur_driver_data = { 491e2e0d2f3STaniya Das .alpha_plls = video_cc_glymur_plls, 492e2e0d2f3STaniya Das .num_alpha_plls = ARRAY_SIZE(video_cc_glymur_plls), 493e2e0d2f3STaniya Das .clk_cbcrs = video_cc_glymur_critical_cbcrs, 494e2e0d2f3STaniya Das .num_clk_cbcrs = ARRAY_SIZE(video_cc_glymur_critical_cbcrs), 495e2e0d2f3STaniya Das .clk_regs_configure = clk_glymur_regs_configure, 496e2e0d2f3STaniya Das }; 497e2e0d2f3STaniya Das 49803aa6ed7SKrzysztof Kozlowski static const struct qcom_cc_desc video_cc_glymur_desc = { 499e2e0d2f3STaniya Das .config = &video_cc_glymur_regmap_config, 500e2e0d2f3STaniya Das .clks = video_cc_glymur_clocks, 501e2e0d2f3STaniya Das .num_clks = ARRAY_SIZE(video_cc_glymur_clocks), 502e2e0d2f3STaniya Das .resets = video_cc_glymur_resets, 503e2e0d2f3STaniya Das .num_resets = ARRAY_SIZE(video_cc_glymur_resets), 504e2e0d2f3STaniya Das .gdscs = video_cc_glymur_gdscs, 505e2e0d2f3STaniya Das .num_gdscs = ARRAY_SIZE(video_cc_glymur_gdscs), 506e2e0d2f3STaniya Das .use_rpm = true, 507e2e0d2f3STaniya Das .driver_data = &video_cc_glymur_driver_data, 508e2e0d2f3STaniya Das }; 509e2e0d2f3STaniya Das 510e2e0d2f3STaniya Das static const struct of_device_id video_cc_glymur_match_table[] = { 511e2e0d2f3STaniya Das { .compatible = "qcom,glymur-videocc" }, 512e2e0d2f3STaniya Das { } 513e2e0d2f3STaniya Das }; 514e2e0d2f3STaniya Das MODULE_DEVICE_TABLE(of, video_cc_glymur_match_table); 515e2e0d2f3STaniya Das 516e2e0d2f3STaniya Das static int video_cc_glymur_probe(struct platform_device *pdev) 517e2e0d2f3STaniya Das { 518e2e0d2f3STaniya Das return qcom_cc_probe(pdev, &video_cc_glymur_desc); 519e2e0d2f3STaniya Das } 520e2e0d2f3STaniya Das 521e2e0d2f3STaniya Das static struct platform_driver video_cc_glymur_driver = { 522e2e0d2f3STaniya Das .probe = video_cc_glymur_probe, 523e2e0d2f3STaniya Das .driver = { 524e2e0d2f3STaniya Das .name = "videocc-glymur", 525e2e0d2f3STaniya Das .of_match_table = video_cc_glymur_match_table, 526e2e0d2f3STaniya Das }, 527e2e0d2f3STaniya Das }; 528e2e0d2f3STaniya Das 529e2e0d2f3STaniya Das module_platform_driver(video_cc_glymur_driver); 530e2e0d2f3STaniya Das 531e2e0d2f3STaniya Das MODULE_DESCRIPTION("QTI VIDEOCC Glymur Driver"); 532e2e0d2f3STaniya Das MODULE_LICENSE("GPL"); 533