1*a4ceaf4bSTaniya Das // SPDX-License-Identifier: GPL-2.0-only 2*a4ceaf4bSTaniya Das /* 3*a4ceaf4bSTaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4*a4ceaf4bSTaniya Das */ 5*a4ceaf4bSTaniya Das 6*a4ceaf4bSTaniya Das #include <linux/clk-provider.h> 7*a4ceaf4bSTaniya Das #include <linux/mod_devicetable.h> 8*a4ceaf4bSTaniya Das #include <linux/module.h> 9*a4ceaf4bSTaniya Das #include <linux/platform_device.h> 10*a4ceaf4bSTaniya Das #include <linux/regmap.h> 11*a4ceaf4bSTaniya Das 12*a4ceaf4bSTaniya Das #include <dt-bindings/clock/qcom,kaanapali-videocc.h> 13*a4ceaf4bSTaniya Das 14*a4ceaf4bSTaniya Das #include "clk-alpha-pll.h" 15*a4ceaf4bSTaniya Das #include "clk-branch.h" 16*a4ceaf4bSTaniya Das #include "clk-rcg.h" 17*a4ceaf4bSTaniya Das #include "clk-regmap.h" 18*a4ceaf4bSTaniya Das #include "clk-regmap-divider.h" 19*a4ceaf4bSTaniya Das #include "common.h" 20*a4ceaf4bSTaniya Das #include "gdsc.h" 21*a4ceaf4bSTaniya Das #include "reset.h" 22*a4ceaf4bSTaniya Das 23*a4ceaf4bSTaniya Das #define ACCU_CFG_MASK GENMASK(25, 21) 24*a4ceaf4bSTaniya Das 25*a4ceaf4bSTaniya Das enum { 26*a4ceaf4bSTaniya Das DT_BI_TCXO, 27*a4ceaf4bSTaniya Das DT_AHB_CLK, 28*a4ceaf4bSTaniya Das }; 29*a4ceaf4bSTaniya Das 30*a4ceaf4bSTaniya Das enum { 31*a4ceaf4bSTaniya Das P_BI_TCXO, 32*a4ceaf4bSTaniya Das P_VIDEO_CC_PLL0_OUT_MAIN, 33*a4ceaf4bSTaniya Das P_VIDEO_CC_PLL1_OUT_MAIN, 34*a4ceaf4bSTaniya Das P_VIDEO_CC_PLL2_OUT_MAIN, 35*a4ceaf4bSTaniya Das P_VIDEO_CC_PLL3_OUT_MAIN, 36*a4ceaf4bSTaniya Das }; 37*a4ceaf4bSTaniya Das 38*a4ceaf4bSTaniya Das static const struct pll_vco taycan_eko_t_vco[] = { 39*a4ceaf4bSTaniya Das { 249600000, 2500000000, 0 }, 40*a4ceaf4bSTaniya Das }; 41*a4ceaf4bSTaniya Das 42*a4ceaf4bSTaniya Das /* 360.0 MHz Configuration */ 43*a4ceaf4bSTaniya Das static const struct alpha_pll_config video_cc_pll0_config = { 44*a4ceaf4bSTaniya Das .l = 0x12, 45*a4ceaf4bSTaniya Das .cal_l = 0x48, 46*a4ceaf4bSTaniya Das .alpha = 0xc000, 47*a4ceaf4bSTaniya Das .config_ctl_val = 0x25c400e7, 48*a4ceaf4bSTaniya Das .config_ctl_hi_val = 0x0a8062e0, 49*a4ceaf4bSTaniya Das .config_ctl_hi1_val = 0xf51dea20, 50*a4ceaf4bSTaniya Das .user_ctl_val = 0x00000008, 51*a4ceaf4bSTaniya Das .user_ctl_hi_val = 0x00000002, 52*a4ceaf4bSTaniya Das }; 53*a4ceaf4bSTaniya Das 54*a4ceaf4bSTaniya Das static struct clk_alpha_pll video_cc_pll0 = { 55*a4ceaf4bSTaniya Das .offset = 0x0, 56*a4ceaf4bSTaniya Das .config = &video_cc_pll0_config, 57*a4ceaf4bSTaniya Das .vco_table = taycan_eko_t_vco, 58*a4ceaf4bSTaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 59*a4ceaf4bSTaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 60*a4ceaf4bSTaniya Das .clkr = { 61*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 62*a4ceaf4bSTaniya Das .name = "video_cc_pll0", 63*a4ceaf4bSTaniya Das .parent_data = &(const struct clk_parent_data) { 64*a4ceaf4bSTaniya Das .index = DT_BI_TCXO, 65*a4ceaf4bSTaniya Das }, 66*a4ceaf4bSTaniya Das .num_parents = 1, 67*a4ceaf4bSTaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 68*a4ceaf4bSTaniya Das }, 69*a4ceaf4bSTaniya Das }, 70*a4ceaf4bSTaniya Das }; 71*a4ceaf4bSTaniya Das 72*a4ceaf4bSTaniya Das /* 480.0 MHz Configuration */ 73*a4ceaf4bSTaniya Das static const struct alpha_pll_config video_cc_pll1_config = { 74*a4ceaf4bSTaniya Das .l = 0x19, 75*a4ceaf4bSTaniya Das .cal_l = 0x48, 76*a4ceaf4bSTaniya Das .alpha = 0x0, 77*a4ceaf4bSTaniya Das .config_ctl_val = 0x25c400e7, 78*a4ceaf4bSTaniya Das .config_ctl_hi_val = 0x0a8062e0, 79*a4ceaf4bSTaniya Das .config_ctl_hi1_val = 0xf51dea20, 80*a4ceaf4bSTaniya Das .user_ctl_val = 0x00000008, 81*a4ceaf4bSTaniya Das .user_ctl_hi_val = 0x00000002, 82*a4ceaf4bSTaniya Das }; 83*a4ceaf4bSTaniya Das 84*a4ceaf4bSTaniya Das static struct clk_alpha_pll video_cc_pll1 = { 85*a4ceaf4bSTaniya Das .offset = 0x1000, 86*a4ceaf4bSTaniya Das .config = &video_cc_pll1_config, 87*a4ceaf4bSTaniya Das .vco_table = taycan_eko_t_vco, 88*a4ceaf4bSTaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 89*a4ceaf4bSTaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 90*a4ceaf4bSTaniya Das .clkr = { 91*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 92*a4ceaf4bSTaniya Das .name = "video_cc_pll1", 93*a4ceaf4bSTaniya Das .parent_data = &(const struct clk_parent_data) { 94*a4ceaf4bSTaniya Das .index = DT_BI_TCXO, 95*a4ceaf4bSTaniya Das }, 96*a4ceaf4bSTaniya Das .num_parents = 1, 97*a4ceaf4bSTaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 98*a4ceaf4bSTaniya Das }, 99*a4ceaf4bSTaniya Das }, 100*a4ceaf4bSTaniya Das }; 101*a4ceaf4bSTaniya Das 102*a4ceaf4bSTaniya Das /* 480.0 MHz Configuration */ 103*a4ceaf4bSTaniya Das static const struct alpha_pll_config video_cc_pll2_config = { 104*a4ceaf4bSTaniya Das .l = 0x19, 105*a4ceaf4bSTaniya Das .cal_l = 0x48, 106*a4ceaf4bSTaniya Das .alpha = 0x0, 107*a4ceaf4bSTaniya Das .config_ctl_val = 0x25c400e7, 108*a4ceaf4bSTaniya Das .config_ctl_hi_val = 0x0a8062e0, 109*a4ceaf4bSTaniya Das .config_ctl_hi1_val = 0xf51dea20, 110*a4ceaf4bSTaniya Das .user_ctl_val = 0x00000008, 111*a4ceaf4bSTaniya Das .user_ctl_hi_val = 0x00000002, 112*a4ceaf4bSTaniya Das }; 113*a4ceaf4bSTaniya Das 114*a4ceaf4bSTaniya Das static struct clk_alpha_pll video_cc_pll2 = { 115*a4ceaf4bSTaniya Das .offset = 0x2000, 116*a4ceaf4bSTaniya Das .config = &video_cc_pll2_config, 117*a4ceaf4bSTaniya Das .vco_table = taycan_eko_t_vco, 118*a4ceaf4bSTaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 119*a4ceaf4bSTaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 120*a4ceaf4bSTaniya Das .clkr = { 121*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 122*a4ceaf4bSTaniya Das .name = "video_cc_pll2", 123*a4ceaf4bSTaniya Das .parent_data = &(const struct clk_parent_data) { 124*a4ceaf4bSTaniya Das .index = DT_BI_TCXO, 125*a4ceaf4bSTaniya Das }, 126*a4ceaf4bSTaniya Das .num_parents = 1, 127*a4ceaf4bSTaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 128*a4ceaf4bSTaniya Das }, 129*a4ceaf4bSTaniya Das }, 130*a4ceaf4bSTaniya Das }; 131*a4ceaf4bSTaniya Das 132*a4ceaf4bSTaniya Das /* 480.0 MHz Configuration */ 133*a4ceaf4bSTaniya Das static const struct alpha_pll_config video_cc_pll3_config = { 134*a4ceaf4bSTaniya Das .l = 0x19, 135*a4ceaf4bSTaniya Das .cal_l = 0x48, 136*a4ceaf4bSTaniya Das .alpha = 0x0, 137*a4ceaf4bSTaniya Das .config_ctl_val = 0x25c400e7, 138*a4ceaf4bSTaniya Das .config_ctl_hi_val = 0x0a8062e0, 139*a4ceaf4bSTaniya Das .config_ctl_hi1_val = 0xf51dea20, 140*a4ceaf4bSTaniya Das .user_ctl_val = 0x00000008, 141*a4ceaf4bSTaniya Das .user_ctl_hi_val = 0x00000002, 142*a4ceaf4bSTaniya Das }; 143*a4ceaf4bSTaniya Das 144*a4ceaf4bSTaniya Das static struct clk_alpha_pll video_cc_pll3 = { 145*a4ceaf4bSTaniya Das .offset = 0x3000, 146*a4ceaf4bSTaniya Das .config = &video_cc_pll3_config, 147*a4ceaf4bSTaniya Das .vco_table = taycan_eko_t_vco, 148*a4ceaf4bSTaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 149*a4ceaf4bSTaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 150*a4ceaf4bSTaniya Das .clkr = { 151*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 152*a4ceaf4bSTaniya Das .name = "video_cc_pll3", 153*a4ceaf4bSTaniya Das .parent_data = &(const struct clk_parent_data) { 154*a4ceaf4bSTaniya Das .index = DT_BI_TCXO, 155*a4ceaf4bSTaniya Das }, 156*a4ceaf4bSTaniya Das .num_parents = 1, 157*a4ceaf4bSTaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 158*a4ceaf4bSTaniya Das }, 159*a4ceaf4bSTaniya Das }, 160*a4ceaf4bSTaniya Das }; 161*a4ceaf4bSTaniya Das 162*a4ceaf4bSTaniya Das static const struct parent_map video_cc_parent_map_0[] = { 163*a4ceaf4bSTaniya Das { P_BI_TCXO, 0 }, 164*a4ceaf4bSTaniya Das }; 165*a4ceaf4bSTaniya Das 166*a4ceaf4bSTaniya Das static const struct clk_parent_data video_cc_parent_data_0[] = { 167*a4ceaf4bSTaniya Das { .index = DT_BI_TCXO }, 168*a4ceaf4bSTaniya Das }; 169*a4ceaf4bSTaniya Das 170*a4ceaf4bSTaniya Das static const struct parent_map video_cc_parent_map_1[] = { 171*a4ceaf4bSTaniya Das { P_BI_TCXO, 0 }, 172*a4ceaf4bSTaniya Das { P_VIDEO_CC_PLL1_OUT_MAIN, 1 }, 173*a4ceaf4bSTaniya Das }; 174*a4ceaf4bSTaniya Das 175*a4ceaf4bSTaniya Das static const struct clk_parent_data video_cc_parent_data_1[] = { 176*a4ceaf4bSTaniya Das { .index = DT_BI_TCXO }, 177*a4ceaf4bSTaniya Das { .hw = &video_cc_pll1.clkr.hw }, 178*a4ceaf4bSTaniya Das }; 179*a4ceaf4bSTaniya Das 180*a4ceaf4bSTaniya Das static const struct parent_map video_cc_parent_map_2[] = { 181*a4ceaf4bSTaniya Das { P_BI_TCXO, 0 }, 182*a4ceaf4bSTaniya Das { P_VIDEO_CC_PLL3_OUT_MAIN, 1 }, 183*a4ceaf4bSTaniya Das }; 184*a4ceaf4bSTaniya Das 185*a4ceaf4bSTaniya Das static const struct clk_parent_data video_cc_parent_data_2[] = { 186*a4ceaf4bSTaniya Das { .index = DT_BI_TCXO }, 187*a4ceaf4bSTaniya Das { .hw = &video_cc_pll3.clkr.hw }, 188*a4ceaf4bSTaniya Das }; 189*a4ceaf4bSTaniya Das 190*a4ceaf4bSTaniya Das static const struct parent_map video_cc_parent_map_3[] = { 191*a4ceaf4bSTaniya Das { P_BI_TCXO, 0 }, 192*a4ceaf4bSTaniya Das { P_VIDEO_CC_PLL2_OUT_MAIN, 1 }, 193*a4ceaf4bSTaniya Das }; 194*a4ceaf4bSTaniya Das 195*a4ceaf4bSTaniya Das static const struct clk_parent_data video_cc_parent_data_3[] = { 196*a4ceaf4bSTaniya Das { .index = DT_BI_TCXO }, 197*a4ceaf4bSTaniya Das { .hw = &video_cc_pll2.clkr.hw }, 198*a4ceaf4bSTaniya Das }; 199*a4ceaf4bSTaniya Das 200*a4ceaf4bSTaniya Das static const struct parent_map video_cc_parent_map_4[] = { 201*a4ceaf4bSTaniya Das { P_BI_TCXO, 0 }, 202*a4ceaf4bSTaniya Das { P_VIDEO_CC_PLL0_OUT_MAIN, 1 }, 203*a4ceaf4bSTaniya Das }; 204*a4ceaf4bSTaniya Das 205*a4ceaf4bSTaniya Das static const struct clk_parent_data video_cc_parent_data_4[] = { 206*a4ceaf4bSTaniya Das { .index = DT_BI_TCXO }, 207*a4ceaf4bSTaniya Das { .hw = &video_cc_pll0.clkr.hw }, 208*a4ceaf4bSTaniya Das }; 209*a4ceaf4bSTaniya Das 210*a4ceaf4bSTaniya Das static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = { 211*a4ceaf4bSTaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 212*a4ceaf4bSTaniya Das { } 213*a4ceaf4bSTaniya Das }; 214*a4ceaf4bSTaniya Das 215*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_ahb_clk_src = { 216*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8060, 217*a4ceaf4bSTaniya Das .mnd_width = 0, 218*a4ceaf4bSTaniya Das .hid_width = 5, 219*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_0, 220*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 221*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 222*a4ceaf4bSTaniya Das .name = "video_cc_ahb_clk_src", 223*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_0, 224*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 225*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 226*a4ceaf4bSTaniya Das .ops = &clk_rcg2_shared_ops, 227*a4ceaf4bSTaniya Das }, 228*a4ceaf4bSTaniya Das }; 229*a4ceaf4bSTaniya Das 230*a4ceaf4bSTaniya Das static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = { 231*a4ceaf4bSTaniya Das F(240000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 232*a4ceaf4bSTaniya Das F(338000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 233*a4ceaf4bSTaniya Das F(420000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 234*a4ceaf4bSTaniya Das F(444000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 235*a4ceaf4bSTaniya Das F(533000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 236*a4ceaf4bSTaniya Das F(630000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 237*a4ceaf4bSTaniya Das F(800000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 238*a4ceaf4bSTaniya Das F(1000000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0), 239*a4ceaf4bSTaniya Das { } 240*a4ceaf4bSTaniya Das }; 241*a4ceaf4bSTaniya Das 242*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_mvs0_clk_src = { 243*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8030, 244*a4ceaf4bSTaniya Das .mnd_width = 0, 245*a4ceaf4bSTaniya Das .hid_width = 5, 246*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_1, 247*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_mvs0_clk_src, 248*a4ceaf4bSTaniya Das .hw_clk_ctrl = true, 249*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 250*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_clk_src", 251*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_1, 252*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 253*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 254*a4ceaf4bSTaniya Das .ops = &clk_rcg2_shared_ops, 255*a4ceaf4bSTaniya Das }, 256*a4ceaf4bSTaniya Das }; 257*a4ceaf4bSTaniya Das 258*a4ceaf4bSTaniya Das static const struct freq_tbl ftbl_video_cc_mvs0a_clk_src[] = { 259*a4ceaf4bSTaniya Das F(240000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 260*a4ceaf4bSTaniya Das F(338000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 261*a4ceaf4bSTaniya Das F(420000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 262*a4ceaf4bSTaniya Das F(444000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 263*a4ceaf4bSTaniya Das F(533000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 264*a4ceaf4bSTaniya Das F(630000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0), 265*a4ceaf4bSTaniya Das { } 266*a4ceaf4bSTaniya Das }; 267*a4ceaf4bSTaniya Das 268*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_mvs0a_clk_src = { 269*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8000, 270*a4ceaf4bSTaniya Das .mnd_width = 0, 271*a4ceaf4bSTaniya Das .hid_width = 5, 272*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_2, 273*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_mvs0a_clk_src, 274*a4ceaf4bSTaniya Das .hw_clk_ctrl = true, 275*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 276*a4ceaf4bSTaniya Das .name = "video_cc_mvs0a_clk_src", 277*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_2, 278*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_2), 279*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 280*a4ceaf4bSTaniya Das .ops = &clk_rcg2_shared_ops, 281*a4ceaf4bSTaniya Das }, 282*a4ceaf4bSTaniya Das }; 283*a4ceaf4bSTaniya Das 284*a4ceaf4bSTaniya Das static const struct freq_tbl ftbl_video_cc_mvs0b_clk_src[] = { 285*a4ceaf4bSTaniya Das F(240000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 286*a4ceaf4bSTaniya Das F(338000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 287*a4ceaf4bSTaniya Das F(420000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 288*a4ceaf4bSTaniya Das F(444000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 289*a4ceaf4bSTaniya Das F(533000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 290*a4ceaf4bSTaniya Das F(630000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 291*a4ceaf4bSTaniya Das F(850000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0), 292*a4ceaf4bSTaniya Das { } 293*a4ceaf4bSTaniya Das }; 294*a4ceaf4bSTaniya Das 295*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_mvs0b_clk_src = { 296*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8018, 297*a4ceaf4bSTaniya Das .mnd_width = 0, 298*a4ceaf4bSTaniya Das .hid_width = 5, 299*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_3, 300*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_mvs0b_clk_src, 301*a4ceaf4bSTaniya Das .hw_clk_ctrl = true, 302*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 303*a4ceaf4bSTaniya Das .name = "video_cc_mvs0b_clk_src", 304*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_3, 305*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_3), 306*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 307*a4ceaf4bSTaniya Das .ops = &clk_rcg2_shared_ops, 308*a4ceaf4bSTaniya Das }, 309*a4ceaf4bSTaniya Das }; 310*a4ceaf4bSTaniya Das 311*a4ceaf4bSTaniya Das static const struct freq_tbl ftbl_video_cc_mvs0c_clk_src[] = { 312*a4ceaf4bSTaniya Das F(360000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 313*a4ceaf4bSTaniya Das F(507000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 314*a4ceaf4bSTaniya Das F(630000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 315*a4ceaf4bSTaniya Das F(666000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 316*a4ceaf4bSTaniya Das F(800000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 317*a4ceaf4bSTaniya Das F(1104000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 318*a4ceaf4bSTaniya Das F(1260000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 319*a4ceaf4bSTaniya Das { } 320*a4ceaf4bSTaniya Das }; 321*a4ceaf4bSTaniya Das 322*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_mvs0c_clk_src = { 323*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8048, 324*a4ceaf4bSTaniya Das .mnd_width = 0, 325*a4ceaf4bSTaniya Das .hid_width = 5, 326*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_4, 327*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_mvs0c_clk_src, 328*a4ceaf4bSTaniya Das .hw_clk_ctrl = true, 329*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 330*a4ceaf4bSTaniya Das .name = "video_cc_mvs0c_clk_src", 331*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_4, 332*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_4), 333*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 334*a4ceaf4bSTaniya Das .ops = &clk_rcg2_shared_ops, 335*a4ceaf4bSTaniya Das }, 336*a4ceaf4bSTaniya Das }; 337*a4ceaf4bSTaniya Das 338*a4ceaf4bSTaniya Das static struct clk_rcg2 video_cc_xo_clk_src = { 339*a4ceaf4bSTaniya Das .cmd_rcgr = 0x8194, 340*a4ceaf4bSTaniya Das .mnd_width = 0, 341*a4ceaf4bSTaniya Das .hid_width = 5, 342*a4ceaf4bSTaniya Das .parent_map = video_cc_parent_map_0, 343*a4ceaf4bSTaniya Das .freq_tbl = ftbl_video_cc_ahb_clk_src, 344*a4ceaf4bSTaniya Das .clkr.hw.init = &(const struct clk_init_data) { 345*a4ceaf4bSTaniya Das .name = "video_cc_xo_clk_src", 346*a4ceaf4bSTaniya Das .parent_data = video_cc_parent_data_0, 347*a4ceaf4bSTaniya Das .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 348*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 349*a4ceaf4bSTaniya Das .ops = &clk_rcg2_ops, 350*a4ceaf4bSTaniya Das }, 351*a4ceaf4bSTaniya Das }; 352*a4ceaf4bSTaniya Das 353*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_clk = { 354*a4ceaf4bSTaniya Das .halt_reg = 0x80d0, 355*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 356*a4ceaf4bSTaniya Das .hwcg_reg = 0x80d0, 357*a4ceaf4bSTaniya Das .hwcg_bit = 1, 358*a4ceaf4bSTaniya Das .clkr = { 359*a4ceaf4bSTaniya Das .enable_reg = 0x80d0, 360*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 361*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 362*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_clk", 363*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 364*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 365*a4ceaf4bSTaniya Das }, 366*a4ceaf4bSTaniya Das .num_parents = 1, 367*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 368*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 369*a4ceaf4bSTaniya Das }, 370*a4ceaf4bSTaniya Das }, 371*a4ceaf4bSTaniya Das }; 372*a4ceaf4bSTaniya Das 373*a4ceaf4bSTaniya Das static struct clk_mem_branch video_cc_mvs0_freerun_clk = { 374*a4ceaf4bSTaniya Das .mem_enable_reg = 0x80e4, 375*a4ceaf4bSTaniya Das .mem_ack_reg = 0x80e4, 376*a4ceaf4bSTaniya Das .mem_enable_mask = BIT(3), 377*a4ceaf4bSTaniya Das .mem_enable_ack_mask = GENMASK(11, 10), 378*a4ceaf4bSTaniya Das .mem_enable_invert = true, 379*a4ceaf4bSTaniya Das .branch = { 380*a4ceaf4bSTaniya Das .halt_reg = 0x80e0, 381*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 382*a4ceaf4bSTaniya Das .clkr = { 383*a4ceaf4bSTaniya Das .enable_reg = 0x80e0, 384*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 385*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 386*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_freerun_clk", 387*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 388*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 389*a4ceaf4bSTaniya Das }, 390*a4ceaf4bSTaniya Das .num_parents = 1, 391*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 392*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 393*a4ceaf4bSTaniya Das }, 394*a4ceaf4bSTaniya Das }, 395*a4ceaf4bSTaniya Das }, 396*a4ceaf4bSTaniya Das }; 397*a4ceaf4bSTaniya Das 398*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_shift_clk = { 399*a4ceaf4bSTaniya Das .halt_reg = 0x81b4, 400*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 401*a4ceaf4bSTaniya Das .hwcg_reg = 0x81b4, 402*a4ceaf4bSTaniya Das .hwcg_bit = 1, 403*a4ceaf4bSTaniya Das .clkr = { 404*a4ceaf4bSTaniya Das .enable_reg = 0x81b4, 405*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 406*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 407*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_shift_clk", 408*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 409*a4ceaf4bSTaniya Das &video_cc_xo_clk_src.clkr.hw, 410*a4ceaf4bSTaniya Das }, 411*a4ceaf4bSTaniya Das .num_parents = 1, 412*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 413*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 414*a4ceaf4bSTaniya Das }, 415*a4ceaf4bSTaniya Das }, 416*a4ceaf4bSTaniya Das }; 417*a4ceaf4bSTaniya Das 418*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_vpp0_clk = { 419*a4ceaf4bSTaniya Das .halt_reg = 0x8134, 420*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 421*a4ceaf4bSTaniya Das .hwcg_reg = 0x8134, 422*a4ceaf4bSTaniya Das .hwcg_bit = 1, 423*a4ceaf4bSTaniya Das .clkr = { 424*a4ceaf4bSTaniya Das .enable_reg = 0x8134, 425*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 426*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 427*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp0_clk", 428*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 429*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 430*a4ceaf4bSTaniya Das }, 431*a4ceaf4bSTaniya Das .num_parents = 1, 432*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 433*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 434*a4ceaf4bSTaniya Das }, 435*a4ceaf4bSTaniya Das }, 436*a4ceaf4bSTaniya Das }; 437*a4ceaf4bSTaniya Das 438*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_vpp0_freerun_clk = { 439*a4ceaf4bSTaniya Das .halt_reg = 0x8144, 440*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 441*a4ceaf4bSTaniya Das .clkr = { 442*a4ceaf4bSTaniya Das .enable_reg = 0x8144, 443*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 444*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 445*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp0_freerun_clk", 446*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 447*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 448*a4ceaf4bSTaniya Das }, 449*a4ceaf4bSTaniya Das .num_parents = 1, 450*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 451*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 452*a4ceaf4bSTaniya Das }, 453*a4ceaf4bSTaniya Das }, 454*a4ceaf4bSTaniya Das }; 455*a4ceaf4bSTaniya Das 456*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_vpp1_clk = { 457*a4ceaf4bSTaniya Das .halt_reg = 0x8108, 458*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 459*a4ceaf4bSTaniya Das .hwcg_reg = 0x8108, 460*a4ceaf4bSTaniya Das .hwcg_bit = 1, 461*a4ceaf4bSTaniya Das .clkr = { 462*a4ceaf4bSTaniya Das .enable_reg = 0x8108, 463*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 464*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 465*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp1_clk", 466*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 467*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 468*a4ceaf4bSTaniya Das }, 469*a4ceaf4bSTaniya Das .num_parents = 1, 470*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 471*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 472*a4ceaf4bSTaniya Das }, 473*a4ceaf4bSTaniya Das }, 474*a4ceaf4bSTaniya Das }; 475*a4ceaf4bSTaniya Das 476*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0_vpp1_freerun_clk = { 477*a4ceaf4bSTaniya Das .halt_reg = 0x8118, 478*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 479*a4ceaf4bSTaniya Das .clkr = { 480*a4ceaf4bSTaniya Das .enable_reg = 0x8118, 481*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 482*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 483*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp1_freerun_clk", 484*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 485*a4ceaf4bSTaniya Das &video_cc_mvs0_clk_src.clkr.hw, 486*a4ceaf4bSTaniya Das }, 487*a4ceaf4bSTaniya Das .num_parents = 1, 488*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 489*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 490*a4ceaf4bSTaniya Das }, 491*a4ceaf4bSTaniya Das }, 492*a4ceaf4bSTaniya Das }; 493*a4ceaf4bSTaniya Das 494*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0a_clk = { 495*a4ceaf4bSTaniya Das .halt_reg = 0x8090, 496*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 497*a4ceaf4bSTaniya Das .hwcg_reg = 0x8090, 498*a4ceaf4bSTaniya Das .hwcg_bit = 1, 499*a4ceaf4bSTaniya Das .clkr = { 500*a4ceaf4bSTaniya Das .enable_reg = 0x8090, 501*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 502*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 503*a4ceaf4bSTaniya Das .name = "video_cc_mvs0a_clk", 504*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 505*a4ceaf4bSTaniya Das &video_cc_mvs0a_clk_src.clkr.hw, 506*a4ceaf4bSTaniya Das }, 507*a4ceaf4bSTaniya Das .num_parents = 1, 508*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 509*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 510*a4ceaf4bSTaniya Das }, 511*a4ceaf4bSTaniya Das }, 512*a4ceaf4bSTaniya Das }; 513*a4ceaf4bSTaniya Das 514*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0a_freerun_clk = { 515*a4ceaf4bSTaniya Das .halt_reg = 0x80a0, 516*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 517*a4ceaf4bSTaniya Das .clkr = { 518*a4ceaf4bSTaniya Das .enable_reg = 0x80a0, 519*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 520*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 521*a4ceaf4bSTaniya Das .name = "video_cc_mvs0a_freerun_clk", 522*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 523*a4ceaf4bSTaniya Das &video_cc_mvs0a_clk_src.clkr.hw, 524*a4ceaf4bSTaniya Das }, 525*a4ceaf4bSTaniya Das .num_parents = 1, 526*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 527*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 528*a4ceaf4bSTaniya Das }, 529*a4ceaf4bSTaniya Das }, 530*a4ceaf4bSTaniya Das }; 531*a4ceaf4bSTaniya Das 532*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0b_clk = { 533*a4ceaf4bSTaniya Das .halt_reg = 0x80bc, 534*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 535*a4ceaf4bSTaniya Das .hwcg_reg = 0x80bc, 536*a4ceaf4bSTaniya Das .hwcg_bit = 1, 537*a4ceaf4bSTaniya Das .clkr = { 538*a4ceaf4bSTaniya Das .enable_reg = 0x80bc, 539*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 540*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 541*a4ceaf4bSTaniya Das .name = "video_cc_mvs0b_clk", 542*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 543*a4ceaf4bSTaniya Das &video_cc_mvs0b_clk_src.clkr.hw, 544*a4ceaf4bSTaniya Das }, 545*a4ceaf4bSTaniya Das .num_parents = 1, 546*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 547*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 548*a4ceaf4bSTaniya Das }, 549*a4ceaf4bSTaniya Das }, 550*a4ceaf4bSTaniya Das }; 551*a4ceaf4bSTaniya Das 552*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0b_freerun_clk = { 553*a4ceaf4bSTaniya Das .halt_reg = 0x80cc, 554*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 555*a4ceaf4bSTaniya Das .clkr = { 556*a4ceaf4bSTaniya Das .enable_reg = 0x80cc, 557*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 558*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 559*a4ceaf4bSTaniya Das .name = "video_cc_mvs0b_freerun_clk", 560*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 561*a4ceaf4bSTaniya Das &video_cc_mvs0b_clk_src.clkr.hw, 562*a4ceaf4bSTaniya Das }, 563*a4ceaf4bSTaniya Das .num_parents = 1, 564*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 565*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 566*a4ceaf4bSTaniya Das }, 567*a4ceaf4bSTaniya Das }, 568*a4ceaf4bSTaniya Das }; 569*a4ceaf4bSTaniya Das 570*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0c_clk = { 571*a4ceaf4bSTaniya Das .halt_reg = 0x8164, 572*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 573*a4ceaf4bSTaniya Das .hwcg_reg = 0x8164, 574*a4ceaf4bSTaniya Das .hwcg_bit = 1, 575*a4ceaf4bSTaniya Das .clkr = { 576*a4ceaf4bSTaniya Das .enable_reg = 0x8164, 577*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 578*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 579*a4ceaf4bSTaniya Das .name = "video_cc_mvs0c_clk", 580*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 581*a4ceaf4bSTaniya Das &video_cc_mvs0c_clk_src.clkr.hw, 582*a4ceaf4bSTaniya Das }, 583*a4ceaf4bSTaniya Das .num_parents = 1, 584*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 585*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 586*a4ceaf4bSTaniya Das }, 587*a4ceaf4bSTaniya Das }, 588*a4ceaf4bSTaniya Das }; 589*a4ceaf4bSTaniya Das 590*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0c_freerun_clk = { 591*a4ceaf4bSTaniya Das .halt_reg = 0x8174, 592*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT, 593*a4ceaf4bSTaniya Das .clkr = { 594*a4ceaf4bSTaniya Das .enable_reg = 0x8174, 595*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 596*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 597*a4ceaf4bSTaniya Das .name = "video_cc_mvs0c_freerun_clk", 598*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 599*a4ceaf4bSTaniya Das &video_cc_mvs0c_clk_src.clkr.hw, 600*a4ceaf4bSTaniya Das }, 601*a4ceaf4bSTaniya Das .num_parents = 1, 602*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 603*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 604*a4ceaf4bSTaniya Das }, 605*a4ceaf4bSTaniya Das }, 606*a4ceaf4bSTaniya Das }; 607*a4ceaf4bSTaniya Das 608*a4ceaf4bSTaniya Das static struct clk_branch video_cc_mvs0c_shift_clk = { 609*a4ceaf4bSTaniya Das .halt_reg = 0x81b8, 610*a4ceaf4bSTaniya Das .halt_check = BRANCH_HALT_VOTED, 611*a4ceaf4bSTaniya Das .hwcg_reg = 0x81b8, 612*a4ceaf4bSTaniya Das .hwcg_bit = 1, 613*a4ceaf4bSTaniya Das .clkr = { 614*a4ceaf4bSTaniya Das .enable_reg = 0x81b8, 615*a4ceaf4bSTaniya Das .enable_mask = BIT(0), 616*a4ceaf4bSTaniya Das .hw.init = &(const struct clk_init_data) { 617*a4ceaf4bSTaniya Das .name = "video_cc_mvs0c_shift_clk", 618*a4ceaf4bSTaniya Das .parent_hws = (const struct clk_hw*[]) { 619*a4ceaf4bSTaniya Das &video_cc_xo_clk_src.clkr.hw, 620*a4ceaf4bSTaniya Das }, 621*a4ceaf4bSTaniya Das .num_parents = 1, 622*a4ceaf4bSTaniya Das .flags = CLK_SET_RATE_PARENT, 623*a4ceaf4bSTaniya Das .ops = &clk_branch2_ops, 624*a4ceaf4bSTaniya Das }, 625*a4ceaf4bSTaniya Das }, 626*a4ceaf4bSTaniya Das }; 627*a4ceaf4bSTaniya Das 628*a4ceaf4bSTaniya Das static struct gdsc video_cc_mvs0_vpp0_gdsc = { 629*a4ceaf4bSTaniya Das .gdscr = 0x8120, 630*a4ceaf4bSTaniya Das .en_rest_wait_val = 0x2, 631*a4ceaf4bSTaniya Das .en_few_wait_val = 0x2, 632*a4ceaf4bSTaniya Das .clk_dis_wait_val = 0xf, 633*a4ceaf4bSTaniya Das .pd = { 634*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp0_gdsc", 635*a4ceaf4bSTaniya Das }, 636*a4ceaf4bSTaniya Das .pwrsts = PWRSTS_OFF_ON, 637*a4ceaf4bSTaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 638*a4ceaf4bSTaniya Das }; 639*a4ceaf4bSTaniya Das 640*a4ceaf4bSTaniya Das static struct gdsc video_cc_mvs0_vpp1_gdsc = { 641*a4ceaf4bSTaniya Das .gdscr = 0x80f4, 642*a4ceaf4bSTaniya Das .en_rest_wait_val = 0x2, 643*a4ceaf4bSTaniya Das .en_few_wait_val = 0x2, 644*a4ceaf4bSTaniya Das .clk_dis_wait_val = 0xf, 645*a4ceaf4bSTaniya Das .pd = { 646*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_vpp1_gdsc", 647*a4ceaf4bSTaniya Das }, 648*a4ceaf4bSTaniya Das .pwrsts = PWRSTS_OFF_ON, 649*a4ceaf4bSTaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 650*a4ceaf4bSTaniya Das }; 651*a4ceaf4bSTaniya Das 652*a4ceaf4bSTaniya Das static struct gdsc video_cc_mvs0a_gdsc = { 653*a4ceaf4bSTaniya Das .gdscr = 0x807c, 654*a4ceaf4bSTaniya Das .en_rest_wait_val = 0x2, 655*a4ceaf4bSTaniya Das .en_few_wait_val = 0x2, 656*a4ceaf4bSTaniya Das .clk_dis_wait_val = 0xf, 657*a4ceaf4bSTaniya Das .pd = { 658*a4ceaf4bSTaniya Das .name = "video_cc_mvs0a_gdsc", 659*a4ceaf4bSTaniya Das }, 660*a4ceaf4bSTaniya Das .pwrsts = PWRSTS_OFF_ON, 661*a4ceaf4bSTaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 662*a4ceaf4bSTaniya Das }; 663*a4ceaf4bSTaniya Das 664*a4ceaf4bSTaniya Das static struct gdsc video_cc_mvs0c_gdsc = { 665*a4ceaf4bSTaniya Das .gdscr = 0x814c, 666*a4ceaf4bSTaniya Das .en_rest_wait_val = 0x2, 667*a4ceaf4bSTaniya Das .en_few_wait_val = 0x2, 668*a4ceaf4bSTaniya Das .clk_dis_wait_val = 0x6, 669*a4ceaf4bSTaniya Das .pd = { 670*a4ceaf4bSTaniya Das .name = "video_cc_mvs0c_gdsc", 671*a4ceaf4bSTaniya Das }, 672*a4ceaf4bSTaniya Das .pwrsts = PWRSTS_OFF_ON, 673*a4ceaf4bSTaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 674*a4ceaf4bSTaniya Das }; 675*a4ceaf4bSTaniya Das 676*a4ceaf4bSTaniya Das static struct gdsc video_cc_mvs0_gdsc = { 677*a4ceaf4bSTaniya Das .gdscr = 0x80a8, 678*a4ceaf4bSTaniya Das .en_rest_wait_val = 0x2, 679*a4ceaf4bSTaniya Das .en_few_wait_val = 0x2, 680*a4ceaf4bSTaniya Das .clk_dis_wait_val = 0x6, 681*a4ceaf4bSTaniya Das .pd = { 682*a4ceaf4bSTaniya Das .name = "video_cc_mvs0_gdsc", 683*a4ceaf4bSTaniya Das }, 684*a4ceaf4bSTaniya Das .pwrsts = PWRSTS_OFF_ON, 685*a4ceaf4bSTaniya Das .parent = &video_cc_mvs0c_gdsc.pd, 686*a4ceaf4bSTaniya Das .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 687*a4ceaf4bSTaniya Das }; 688*a4ceaf4bSTaniya Das 689*a4ceaf4bSTaniya Das static struct clk_regmap *video_cc_kaanapali_clocks[] = { 690*a4ceaf4bSTaniya Das [VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr, 691*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr, 692*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr, 693*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_FREERUN_CLK] = &video_cc_mvs0_freerun_clk.branch.clkr, 694*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr, 695*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP0_CLK] = &video_cc_mvs0_vpp0_clk.clkr, 696*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP0_FREERUN_CLK] = &video_cc_mvs0_vpp0_freerun_clk.clkr, 697*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP1_CLK] = &video_cc_mvs0_vpp1_clk.clkr, 698*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP1_FREERUN_CLK] = &video_cc_mvs0_vpp1_freerun_clk.clkr, 699*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0A_CLK] = &video_cc_mvs0a_clk.clkr, 700*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0A_CLK_SRC] = &video_cc_mvs0a_clk_src.clkr, 701*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0A_FREERUN_CLK] = &video_cc_mvs0a_freerun_clk.clkr, 702*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0B_CLK] = &video_cc_mvs0b_clk.clkr, 703*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0B_CLK_SRC] = &video_cc_mvs0b_clk_src.clkr, 704*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0B_FREERUN_CLK] = &video_cc_mvs0b_freerun_clk.clkr, 705*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr, 706*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_CLK_SRC] = &video_cc_mvs0c_clk_src.clkr, 707*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr, 708*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr, 709*a4ceaf4bSTaniya Das [VIDEO_CC_PLL0] = &video_cc_pll0.clkr, 710*a4ceaf4bSTaniya Das [VIDEO_CC_PLL1] = &video_cc_pll1.clkr, 711*a4ceaf4bSTaniya Das [VIDEO_CC_PLL2] = &video_cc_pll2.clkr, 712*a4ceaf4bSTaniya Das [VIDEO_CC_PLL3] = &video_cc_pll3.clkr, 713*a4ceaf4bSTaniya Das [VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr, 714*a4ceaf4bSTaniya Das }; 715*a4ceaf4bSTaniya Das 716*a4ceaf4bSTaniya Das static struct gdsc *video_cc_kaanapali_gdscs[] = { 717*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0A_GDSC] = &video_cc_mvs0a_gdsc, 718*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc, 719*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP1_GDSC] = &video_cc_mvs0_vpp1_gdsc, 720*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP0_GDSC] = &video_cc_mvs0_vpp0_gdsc, 721*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc, 722*a4ceaf4bSTaniya Das }; 723*a4ceaf4bSTaniya Das 724*a4ceaf4bSTaniya Das static const struct qcom_reset_map video_cc_kaanapali_resets[] = { 725*a4ceaf4bSTaniya Das [VIDEO_CC_INTERFACE_BCR] = { 0x8178 }, 726*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_BCR] = { 0x80a4 }, 727*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP0_BCR] = { 0x811c }, 728*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_VPP1_BCR] = { 0x80f0 }, 729*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0A_BCR] = { 0x8078 }, 730*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_CLK_ARES] = { 0x8164, 2 }, 731*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_BCR] = { 0x8148 }, 732*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0_FREERUN_CLK_ARES] = { 0x80e0, 2 }, 733*a4ceaf4bSTaniya Das [VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x8174, 2 }, 734*a4ceaf4bSTaniya Das [VIDEO_CC_XO_CLK_ARES] = { 0x81ac, 2 }, 735*a4ceaf4bSTaniya Das }; 736*a4ceaf4bSTaniya Das 737*a4ceaf4bSTaniya Das static struct clk_alpha_pll *video_cc_kaanapali_plls[] = { 738*a4ceaf4bSTaniya Das &video_cc_pll0, 739*a4ceaf4bSTaniya Das &video_cc_pll1, 740*a4ceaf4bSTaniya Das &video_cc_pll2, 741*a4ceaf4bSTaniya Das &video_cc_pll3, 742*a4ceaf4bSTaniya Das }; 743*a4ceaf4bSTaniya Das 744*a4ceaf4bSTaniya Das static u32 video_cc_kaanapali_critical_cbcrs[] = { 745*a4ceaf4bSTaniya Das 0x817c, /* VIDEO_CC_AHB_CLK */ 746*a4ceaf4bSTaniya Das 0x81bc, /* VIDEO_CC_SLEEP_CLK */ 747*a4ceaf4bSTaniya Das 0x81b0, /* VIDEO_CC_TS_XO_CLK */ 748*a4ceaf4bSTaniya Das 0x81ac, /* VIDEO_CC_XO_CLK */ 749*a4ceaf4bSTaniya Das }; 750*a4ceaf4bSTaniya Das 751*a4ceaf4bSTaniya Das static const struct regmap_config video_cc_kaanapali_regmap_config = { 752*a4ceaf4bSTaniya Das .reg_bits = 32, 753*a4ceaf4bSTaniya Das .reg_stride = 4, 754*a4ceaf4bSTaniya Das .val_bits = 32, 755*a4ceaf4bSTaniya Das .max_register = 0xa010, 756*a4ceaf4bSTaniya Das .fast_io = true, 757*a4ceaf4bSTaniya Das }; 758*a4ceaf4bSTaniya Das 759*a4ceaf4bSTaniya Das static void clk_kaanapali_regs_configure(struct device *dev, struct regmap *regmap) 760*a4ceaf4bSTaniya Das { 761*a4ceaf4bSTaniya Das /* 762*a4ceaf4bSTaniya Das * Enable clk_on sync for MVS0 and VPP clocks via VIDEO_CC_SPARE1 763*a4ceaf4bSTaniya Das * during core reset by default. 764*a4ceaf4bSTaniya Das */ 765*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x9f24, BIT(0)); 766*a4ceaf4bSTaniya Das 767*a4ceaf4bSTaniya Das /* 768*a4ceaf4bSTaniya Das * As per HW design recommendation 769*a4ceaf4bSTaniya Das * Update DLY_ACCU_RED_SHIFTER_DONE to 0xF for the below GDSCs 770*a4ceaf4bSTaniya Das * MVS0A CFG3, MVS0 CFG3, MVS0 VPP1 CFG3, MVS0 VPP0 CFG3, MVS0C CFG3 771*a4ceaf4bSTaniya Das */ 772*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x8088, ACCU_CFG_MASK); 773*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x80b4, ACCU_CFG_MASK); 774*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x8100, ACCU_CFG_MASK); 775*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x812c, ACCU_CFG_MASK); 776*a4ceaf4bSTaniya Das regmap_set_bits(regmap, 0x8158, ACCU_CFG_MASK); 777*a4ceaf4bSTaniya Das } 778*a4ceaf4bSTaniya Das 779*a4ceaf4bSTaniya Das static struct qcom_cc_driver_data video_cc_kaanapali_driver_data = { 780*a4ceaf4bSTaniya Das .alpha_plls = video_cc_kaanapali_plls, 781*a4ceaf4bSTaniya Das .num_alpha_plls = ARRAY_SIZE(video_cc_kaanapali_plls), 782*a4ceaf4bSTaniya Das .clk_cbcrs = video_cc_kaanapali_critical_cbcrs, 783*a4ceaf4bSTaniya Das .num_clk_cbcrs = ARRAY_SIZE(video_cc_kaanapali_critical_cbcrs), 784*a4ceaf4bSTaniya Das .clk_regs_configure = clk_kaanapali_regs_configure, 785*a4ceaf4bSTaniya Das }; 786*a4ceaf4bSTaniya Das 787*a4ceaf4bSTaniya Das static const struct qcom_cc_desc video_cc_kaanapali_desc = { 788*a4ceaf4bSTaniya Das .config = &video_cc_kaanapali_regmap_config, 789*a4ceaf4bSTaniya Das .clks = video_cc_kaanapali_clocks, 790*a4ceaf4bSTaniya Das .num_clks = ARRAY_SIZE(video_cc_kaanapali_clocks), 791*a4ceaf4bSTaniya Das .resets = video_cc_kaanapali_resets, 792*a4ceaf4bSTaniya Das .num_resets = ARRAY_SIZE(video_cc_kaanapali_resets), 793*a4ceaf4bSTaniya Das .gdscs = video_cc_kaanapali_gdscs, 794*a4ceaf4bSTaniya Das .num_gdscs = ARRAY_SIZE(video_cc_kaanapali_gdscs), 795*a4ceaf4bSTaniya Das .use_rpm = true, 796*a4ceaf4bSTaniya Das .driver_data = &video_cc_kaanapali_driver_data, 797*a4ceaf4bSTaniya Das }; 798*a4ceaf4bSTaniya Das 799*a4ceaf4bSTaniya Das static const struct of_device_id video_cc_kaanapali_match_table[] = { 800*a4ceaf4bSTaniya Das { .compatible = "qcom,kaanapali-videocc" }, 801*a4ceaf4bSTaniya Das { } 802*a4ceaf4bSTaniya Das }; 803*a4ceaf4bSTaniya Das MODULE_DEVICE_TABLE(of, video_cc_kaanapali_match_table); 804*a4ceaf4bSTaniya Das 805*a4ceaf4bSTaniya Das static int video_cc_kaanapali_probe(struct platform_device *pdev) 806*a4ceaf4bSTaniya Das { 807*a4ceaf4bSTaniya Das return qcom_cc_probe(pdev, &video_cc_kaanapali_desc); 808*a4ceaf4bSTaniya Das } 809*a4ceaf4bSTaniya Das 810*a4ceaf4bSTaniya Das static struct platform_driver video_cc_kaanapali_driver = { 811*a4ceaf4bSTaniya Das .probe = video_cc_kaanapali_probe, 812*a4ceaf4bSTaniya Das .driver = { 813*a4ceaf4bSTaniya Das .name = "videocc-kaanapali", 814*a4ceaf4bSTaniya Das .of_match_table = video_cc_kaanapali_match_table, 815*a4ceaf4bSTaniya Das }, 816*a4ceaf4bSTaniya Das }; 817*a4ceaf4bSTaniya Das 818*a4ceaf4bSTaniya Das module_platform_driver(video_cc_kaanapali_driver); 819*a4ceaf4bSTaniya Das 820*a4ceaf4bSTaniya Das MODULE_DESCRIPTION("QTI VIDEOCC Kaanapali Driver"); 821*a4ceaf4bSTaniya Das MODULE_LICENSE("GPL"); 822