1*cfc34906SJagadeesh Kona // SPDX-License-Identifier: GPL-2.0-only 2*cfc34906SJagadeesh Kona /* 3*cfc34906SJagadeesh Kona * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4*cfc34906SJagadeesh Kona */ 5*cfc34906SJagadeesh Kona 6*cfc34906SJagadeesh Kona #include <linux/clk-provider.h> 7*cfc34906SJagadeesh Kona #include <linux/mod_devicetable.h> 8*cfc34906SJagadeesh Kona #include <linux/module.h> 9*cfc34906SJagadeesh Kona #include <linux/platform_device.h> 10*cfc34906SJagadeesh Kona #include <linux/regmap.h> 11*cfc34906SJagadeesh Kona 12*cfc34906SJagadeesh Kona #include <dt-bindings/clock/qcom,x1p42100-videocc.h> 13*cfc34906SJagadeesh Kona 14*cfc34906SJagadeesh Kona #include "clk-alpha-pll.h" 15*cfc34906SJagadeesh Kona #include "clk-branch.h" 16*cfc34906SJagadeesh Kona #include "clk-rcg.h" 17*cfc34906SJagadeesh Kona #include "clk-regmap.h" 18*cfc34906SJagadeesh Kona #include "clk-regmap-divider.h" 19*cfc34906SJagadeesh Kona #include "common.h" 20*cfc34906SJagadeesh Kona #include "gdsc.h" 21*cfc34906SJagadeesh Kona #include "reset.h" 22*cfc34906SJagadeesh Kona 23*cfc34906SJagadeesh Kona enum { 24*cfc34906SJagadeesh Kona DT_BI_TCXO, 25*cfc34906SJagadeesh Kona }; 26*cfc34906SJagadeesh Kona 27*cfc34906SJagadeesh Kona enum { 28*cfc34906SJagadeesh Kona P_BI_TCXO, 29*cfc34906SJagadeesh Kona P_VIDEO_CC_PLL0_OUT_MAIN, 30*cfc34906SJagadeesh Kona P_VIDEO_CC_PLL1_OUT_MAIN, 31*cfc34906SJagadeesh Kona }; 32*cfc34906SJagadeesh Kona 33*cfc34906SJagadeesh Kona static const struct pll_vco lucid_ole_vco[] = { 34*cfc34906SJagadeesh Kona { 249600000, 2300000000, 0 }, 35*cfc34906SJagadeesh Kona }; 36*cfc34906SJagadeesh Kona 37*cfc34906SJagadeesh Kona /* 420.0 MHz Configuration */ 38*cfc34906SJagadeesh Kona static const struct alpha_pll_config video_cc_pll0_config = { 39*cfc34906SJagadeesh Kona .l = 0x15, 40*cfc34906SJagadeesh Kona .alpha = 0xe000, 41*cfc34906SJagadeesh Kona .config_ctl_val = 0x20485699, 42*cfc34906SJagadeesh Kona .config_ctl_hi_val = 0x00182261, 43*cfc34906SJagadeesh Kona .config_ctl_hi1_val = 0x82aa299c, 44*cfc34906SJagadeesh Kona .test_ctl_val = 0x00000000, 45*cfc34906SJagadeesh Kona .test_ctl_hi_val = 0x00000003, 46*cfc34906SJagadeesh Kona .test_ctl_hi1_val = 0x00009000, 47*cfc34906SJagadeesh Kona .test_ctl_hi2_val = 0x00000034, 48*cfc34906SJagadeesh Kona .user_ctl_val = 0x00000000, 49*cfc34906SJagadeesh Kona .user_ctl_hi_val = 0x00000005, 50*cfc34906SJagadeesh Kona }; 51*cfc34906SJagadeesh Kona 52*cfc34906SJagadeesh Kona static struct clk_alpha_pll video_cc_pll0 = { 53*cfc34906SJagadeesh Kona .offset = 0x0, 54*cfc34906SJagadeesh Kona .config = &video_cc_pll0_config, 55*cfc34906SJagadeesh Kona .vco_table = lucid_ole_vco, 56*cfc34906SJagadeesh Kona .num_vco = ARRAY_SIZE(lucid_ole_vco), 57*cfc34906SJagadeesh Kona .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 58*cfc34906SJagadeesh Kona .clkr = { 59*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 60*cfc34906SJagadeesh Kona .name = "video_cc_pll0", 61*cfc34906SJagadeesh Kona .parent_data = &(const struct clk_parent_data) { 62*cfc34906SJagadeesh Kona .index = DT_BI_TCXO, 63*cfc34906SJagadeesh Kona }, 64*cfc34906SJagadeesh Kona .num_parents = 1, 65*cfc34906SJagadeesh Kona .ops = &clk_alpha_pll_lucid_evo_ops, 66*cfc34906SJagadeesh Kona }, 67*cfc34906SJagadeesh Kona }, 68*cfc34906SJagadeesh Kona }; 69*cfc34906SJagadeesh Kona 70*cfc34906SJagadeesh Kona /* 1050.0 MHz Configuration */ 71*cfc34906SJagadeesh Kona static const struct alpha_pll_config video_cc_pll1_config = { 72*cfc34906SJagadeesh Kona .l = 0x36, 73*cfc34906SJagadeesh Kona .alpha = 0xb000, 74*cfc34906SJagadeesh Kona .config_ctl_val = 0x20485699, 75*cfc34906SJagadeesh Kona .config_ctl_hi_val = 0x00182261, 76*cfc34906SJagadeesh Kona .config_ctl_hi1_val = 0x82aa299c, 77*cfc34906SJagadeesh Kona .test_ctl_val = 0x00000000, 78*cfc34906SJagadeesh Kona .test_ctl_hi_val = 0x00000003, 79*cfc34906SJagadeesh Kona .test_ctl_hi1_val = 0x00009000, 80*cfc34906SJagadeesh Kona .test_ctl_hi2_val = 0x00000034, 81*cfc34906SJagadeesh Kona .user_ctl_val = 0x00000000, 82*cfc34906SJagadeesh Kona .user_ctl_hi_val = 0x00000005, 83*cfc34906SJagadeesh Kona }; 84*cfc34906SJagadeesh Kona 85*cfc34906SJagadeesh Kona static struct clk_alpha_pll video_cc_pll1 = { 86*cfc34906SJagadeesh Kona .offset = 0x1000, 87*cfc34906SJagadeesh Kona .config = &video_cc_pll1_config, 88*cfc34906SJagadeesh Kona .vco_table = lucid_ole_vco, 89*cfc34906SJagadeesh Kona .num_vco = ARRAY_SIZE(lucid_ole_vco), 90*cfc34906SJagadeesh Kona .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 91*cfc34906SJagadeesh Kona .clkr = { 92*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 93*cfc34906SJagadeesh Kona .name = "video_cc_pll1", 94*cfc34906SJagadeesh Kona .parent_data = &(const struct clk_parent_data) { 95*cfc34906SJagadeesh Kona .index = DT_BI_TCXO, 96*cfc34906SJagadeesh Kona }, 97*cfc34906SJagadeesh Kona .num_parents = 1, 98*cfc34906SJagadeesh Kona .ops = &clk_alpha_pll_lucid_evo_ops, 99*cfc34906SJagadeesh Kona }, 100*cfc34906SJagadeesh Kona }, 101*cfc34906SJagadeesh Kona }; 102*cfc34906SJagadeesh Kona 103*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_0[] = { 104*cfc34906SJagadeesh Kona { P_BI_TCXO, 0 }, 105*cfc34906SJagadeesh Kona }; 106*cfc34906SJagadeesh Kona 107*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_0[] = { 108*cfc34906SJagadeesh Kona { .index = DT_BI_TCXO }, 109*cfc34906SJagadeesh Kona }; 110*cfc34906SJagadeesh Kona 111*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_1[] = { 112*cfc34906SJagadeesh Kona { P_BI_TCXO, 0 }, 113*cfc34906SJagadeesh Kona { P_VIDEO_CC_PLL0_OUT_MAIN, 1 }, 114*cfc34906SJagadeesh Kona }; 115*cfc34906SJagadeesh Kona 116*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_1[] = { 117*cfc34906SJagadeesh Kona { .index = DT_BI_TCXO }, 118*cfc34906SJagadeesh Kona { .hw = &video_cc_pll0.clkr.hw }, 119*cfc34906SJagadeesh Kona }; 120*cfc34906SJagadeesh Kona 121*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_2[] = { 122*cfc34906SJagadeesh Kona { P_BI_TCXO, 0 }, 123*cfc34906SJagadeesh Kona { P_VIDEO_CC_PLL1_OUT_MAIN, 1 }, 124*cfc34906SJagadeesh Kona }; 125*cfc34906SJagadeesh Kona 126*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_2[] = { 127*cfc34906SJagadeesh Kona { .index = DT_BI_TCXO }, 128*cfc34906SJagadeesh Kona { .hw = &video_cc_pll1.clkr.hw }, 129*cfc34906SJagadeesh Kona }; 130*cfc34906SJagadeesh Kona 131*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs0_bse_clk_src[] = { 132*cfc34906SJagadeesh Kona F(420000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 133*cfc34906SJagadeesh Kona F(600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 134*cfc34906SJagadeesh Kona F(670000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 135*cfc34906SJagadeesh Kona F(848000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 136*cfc34906SJagadeesh Kona F(920000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0), 137*cfc34906SJagadeesh Kona { } 138*cfc34906SJagadeesh Kona }; 139*cfc34906SJagadeesh Kona 140*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs0_bse_clk_src = { 141*cfc34906SJagadeesh Kona .cmd_rcgr = 0x8154, 142*cfc34906SJagadeesh Kona .mnd_width = 0, 143*cfc34906SJagadeesh Kona .hid_width = 5, 144*cfc34906SJagadeesh Kona .parent_map = video_cc_parent_map_1, 145*cfc34906SJagadeesh Kona .freq_tbl = ftbl_video_cc_mvs0_bse_clk_src, 146*cfc34906SJagadeesh Kona .hw_clk_ctrl = true, 147*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 148*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_bse_clk_src", 149*cfc34906SJagadeesh Kona .parent_data = video_cc_parent_data_1, 150*cfc34906SJagadeesh Kona .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 151*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 152*cfc34906SJagadeesh Kona .ops = &clk_rcg2_shared_ops, 153*cfc34906SJagadeesh Kona }, 154*cfc34906SJagadeesh Kona }; 155*cfc34906SJagadeesh Kona 156*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = { 157*cfc34906SJagadeesh Kona F(210000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0), 158*cfc34906SJagadeesh Kona F(300000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0), 159*cfc34906SJagadeesh Kona F(335000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0), 160*cfc34906SJagadeesh Kona F(424000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0), 161*cfc34906SJagadeesh Kona F(460000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0), 162*cfc34906SJagadeesh Kona { } 163*cfc34906SJagadeesh Kona }; 164*cfc34906SJagadeesh Kona 165*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs0_clk_src = { 166*cfc34906SJagadeesh Kona .cmd_rcgr = 0x8000, 167*cfc34906SJagadeesh Kona .mnd_width = 0, 168*cfc34906SJagadeesh Kona .hid_width = 5, 169*cfc34906SJagadeesh Kona .parent_map = video_cc_parent_map_1, 170*cfc34906SJagadeesh Kona .freq_tbl = ftbl_video_cc_mvs0_clk_src, 171*cfc34906SJagadeesh Kona .hw_clk_ctrl = true, 172*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 173*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_clk_src", 174*cfc34906SJagadeesh Kona .parent_data = video_cc_parent_data_1, 175*cfc34906SJagadeesh Kona .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 176*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 177*cfc34906SJagadeesh Kona .ops = &clk_rcg2_shared_ops, 178*cfc34906SJagadeesh Kona }, 179*cfc34906SJagadeesh Kona }; 180*cfc34906SJagadeesh Kona 181*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs1_clk_src[] = { 182*cfc34906SJagadeesh Kona F(1050000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0), 183*cfc34906SJagadeesh Kona F(1350000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0), 184*cfc34906SJagadeesh Kona F(1650000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0), 185*cfc34906SJagadeesh Kona { } 186*cfc34906SJagadeesh Kona }; 187*cfc34906SJagadeesh Kona 188*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs1_clk_src = { 189*cfc34906SJagadeesh Kona .cmd_rcgr = 0x8018, 190*cfc34906SJagadeesh Kona .mnd_width = 0, 191*cfc34906SJagadeesh Kona .hid_width = 5, 192*cfc34906SJagadeesh Kona .parent_map = video_cc_parent_map_2, 193*cfc34906SJagadeesh Kona .freq_tbl = ftbl_video_cc_mvs1_clk_src, 194*cfc34906SJagadeesh Kona .hw_clk_ctrl = true, 195*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 196*cfc34906SJagadeesh Kona .name = "video_cc_mvs1_clk_src", 197*cfc34906SJagadeesh Kona .parent_data = video_cc_parent_data_2, 198*cfc34906SJagadeesh Kona .num_parents = ARRAY_SIZE(video_cc_parent_data_2), 199*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 200*cfc34906SJagadeesh Kona .ops = &clk_rcg2_shared_ops, 201*cfc34906SJagadeesh Kona }, 202*cfc34906SJagadeesh Kona }; 203*cfc34906SJagadeesh Kona 204*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_xo_clk_src[] = { 205*cfc34906SJagadeesh Kona F(19200000, P_BI_TCXO, 1, 0, 0), 206*cfc34906SJagadeesh Kona { } 207*cfc34906SJagadeesh Kona }; 208*cfc34906SJagadeesh Kona 209*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_xo_clk_src = { 210*cfc34906SJagadeesh Kona .cmd_rcgr = 0x810c, 211*cfc34906SJagadeesh Kona .mnd_width = 0, 212*cfc34906SJagadeesh Kona .hid_width = 5, 213*cfc34906SJagadeesh Kona .parent_map = video_cc_parent_map_0, 214*cfc34906SJagadeesh Kona .freq_tbl = ftbl_video_cc_xo_clk_src, 215*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 216*cfc34906SJagadeesh Kona .name = "video_cc_xo_clk_src", 217*cfc34906SJagadeesh Kona .parent_data = video_cc_parent_data_0, 218*cfc34906SJagadeesh Kona .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 219*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 220*cfc34906SJagadeesh Kona .ops = &clk_rcg2_shared_ops, 221*cfc34906SJagadeesh Kona }, 222*cfc34906SJagadeesh Kona }; 223*cfc34906SJagadeesh Kona 224*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs0_bse_div4_div_clk_src = { 225*cfc34906SJagadeesh Kona .reg = 0x817c, 226*cfc34906SJagadeesh Kona .shift = 0, 227*cfc34906SJagadeesh Kona .width = 4, 228*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 229*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_bse_div4_div_clk_src", 230*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 231*cfc34906SJagadeesh Kona &video_cc_mvs0_bse_clk_src.clkr.hw, 232*cfc34906SJagadeesh Kona }, 233*cfc34906SJagadeesh Kona .num_parents = 1, 234*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 235*cfc34906SJagadeesh Kona .ops = &clk_regmap_div_ro_ops, 236*cfc34906SJagadeesh Kona }, 237*cfc34906SJagadeesh Kona }; 238*cfc34906SJagadeesh Kona 239*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs1_div_clk_src = { 240*cfc34906SJagadeesh Kona .reg = 0x80ec, 241*cfc34906SJagadeesh Kona .shift = 0, 242*cfc34906SJagadeesh Kona .width = 4, 243*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 244*cfc34906SJagadeesh Kona .name = "video_cc_mvs1_div_clk_src", 245*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 246*cfc34906SJagadeesh Kona &video_cc_mvs1_clk_src.clkr.hw, 247*cfc34906SJagadeesh Kona }, 248*cfc34906SJagadeesh Kona .num_parents = 1, 249*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 250*cfc34906SJagadeesh Kona .ops = &clk_regmap_div_ro_ops, 251*cfc34906SJagadeesh Kona }, 252*cfc34906SJagadeesh Kona }; 253*cfc34906SJagadeesh Kona 254*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs1c_div2_div_clk_src = { 255*cfc34906SJagadeesh Kona .reg = 0x809c, 256*cfc34906SJagadeesh Kona .shift = 0, 257*cfc34906SJagadeesh Kona .width = 4, 258*cfc34906SJagadeesh Kona .clkr.hw.init = &(const struct clk_init_data) { 259*cfc34906SJagadeesh Kona .name = "video_cc_mvs1c_div2_div_clk_src", 260*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 261*cfc34906SJagadeesh Kona &video_cc_mvs1_clk_src.clkr.hw, 262*cfc34906SJagadeesh Kona }, 263*cfc34906SJagadeesh Kona .num_parents = 1, 264*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 265*cfc34906SJagadeesh Kona .ops = &clk_regmap_div_ro_ops, 266*cfc34906SJagadeesh Kona }, 267*cfc34906SJagadeesh Kona }; 268*cfc34906SJagadeesh Kona 269*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_bse_clk = { 270*cfc34906SJagadeesh Kona .halt_reg = 0x8170, 271*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT, 272*cfc34906SJagadeesh Kona .clkr = { 273*cfc34906SJagadeesh Kona .enable_reg = 0x8170, 274*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 275*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 276*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_bse_clk", 277*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 278*cfc34906SJagadeesh Kona &video_cc_mvs0_bse_div4_div_clk_src.clkr.hw, 279*cfc34906SJagadeesh Kona }, 280*cfc34906SJagadeesh Kona .num_parents = 1, 281*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 282*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 283*cfc34906SJagadeesh Kona }, 284*cfc34906SJagadeesh Kona }, 285*cfc34906SJagadeesh Kona }; 286*cfc34906SJagadeesh Kona 287*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_clk = { 288*cfc34906SJagadeesh Kona .halt_reg = 0x80b8, 289*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 290*cfc34906SJagadeesh Kona .hwcg_reg = 0x80b8, 291*cfc34906SJagadeesh Kona .hwcg_bit = 1, 292*cfc34906SJagadeesh Kona .clkr = { 293*cfc34906SJagadeesh Kona .enable_reg = 0x80b8, 294*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 295*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 296*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_clk", 297*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 298*cfc34906SJagadeesh Kona &video_cc_mvs0_clk_src.clkr.hw, 299*cfc34906SJagadeesh Kona }, 300*cfc34906SJagadeesh Kona .num_parents = 1, 301*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 302*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 303*cfc34906SJagadeesh Kona }, 304*cfc34906SJagadeesh Kona }, 305*cfc34906SJagadeesh Kona }; 306*cfc34906SJagadeesh Kona 307*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_shift_clk = { 308*cfc34906SJagadeesh Kona .halt_reg = 0x8128, 309*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 310*cfc34906SJagadeesh Kona .clkr = { 311*cfc34906SJagadeesh Kona .enable_reg = 0x8128, 312*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 313*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 314*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_shift_clk", 315*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 316*cfc34906SJagadeesh Kona &video_cc_xo_clk_src.clkr.hw, 317*cfc34906SJagadeesh Kona }, 318*cfc34906SJagadeesh Kona .num_parents = 1, 319*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 320*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 321*cfc34906SJagadeesh Kona }, 322*cfc34906SJagadeesh Kona }, 323*cfc34906SJagadeesh Kona }; 324*cfc34906SJagadeesh Kona 325*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0c_clk = { 326*cfc34906SJagadeesh Kona .halt_reg = 0x8064, 327*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT, 328*cfc34906SJagadeesh Kona .clkr = { 329*cfc34906SJagadeesh Kona .enable_reg = 0x8064, 330*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 331*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 332*cfc34906SJagadeesh Kona .name = "video_cc_mvs0c_clk", 333*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 334*cfc34906SJagadeesh Kona &video_cc_mvs0_clk_src.clkr.hw, 335*cfc34906SJagadeesh Kona }, 336*cfc34906SJagadeesh Kona .num_parents = 1, 337*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 338*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 339*cfc34906SJagadeesh Kona }, 340*cfc34906SJagadeesh Kona }, 341*cfc34906SJagadeesh Kona }; 342*cfc34906SJagadeesh Kona 343*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0c_shift_clk = { 344*cfc34906SJagadeesh Kona .halt_reg = 0x812c, 345*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 346*cfc34906SJagadeesh Kona .clkr = { 347*cfc34906SJagadeesh Kona .enable_reg = 0x812c, 348*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 349*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 350*cfc34906SJagadeesh Kona .name = "video_cc_mvs0c_shift_clk", 351*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 352*cfc34906SJagadeesh Kona &video_cc_xo_clk_src.clkr.hw, 353*cfc34906SJagadeesh Kona }, 354*cfc34906SJagadeesh Kona .num_parents = 1, 355*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 356*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 357*cfc34906SJagadeesh Kona }, 358*cfc34906SJagadeesh Kona }, 359*cfc34906SJagadeesh Kona }; 360*cfc34906SJagadeesh Kona 361*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1_clk = { 362*cfc34906SJagadeesh Kona .halt_reg = 0x80e0, 363*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 364*cfc34906SJagadeesh Kona .hwcg_reg = 0x80e0, 365*cfc34906SJagadeesh Kona .hwcg_bit = 1, 366*cfc34906SJagadeesh Kona .clkr = { 367*cfc34906SJagadeesh Kona .enable_reg = 0x80e0, 368*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 369*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 370*cfc34906SJagadeesh Kona .name = "video_cc_mvs1_clk", 371*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 372*cfc34906SJagadeesh Kona &video_cc_mvs1_div_clk_src.clkr.hw, 373*cfc34906SJagadeesh Kona }, 374*cfc34906SJagadeesh Kona .num_parents = 1, 375*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 376*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 377*cfc34906SJagadeesh Kona }, 378*cfc34906SJagadeesh Kona }, 379*cfc34906SJagadeesh Kona }; 380*cfc34906SJagadeesh Kona 381*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1_shift_clk = { 382*cfc34906SJagadeesh Kona .halt_reg = 0x8130, 383*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 384*cfc34906SJagadeesh Kona .clkr = { 385*cfc34906SJagadeesh Kona .enable_reg = 0x8130, 386*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 387*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 388*cfc34906SJagadeesh Kona .name = "video_cc_mvs1_shift_clk", 389*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 390*cfc34906SJagadeesh Kona &video_cc_xo_clk_src.clkr.hw, 391*cfc34906SJagadeesh Kona }, 392*cfc34906SJagadeesh Kona .num_parents = 1, 393*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 394*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 395*cfc34906SJagadeesh Kona }, 396*cfc34906SJagadeesh Kona }, 397*cfc34906SJagadeesh Kona }; 398*cfc34906SJagadeesh Kona 399*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1c_clk = { 400*cfc34906SJagadeesh Kona .halt_reg = 0x8090, 401*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT, 402*cfc34906SJagadeesh Kona .clkr = { 403*cfc34906SJagadeesh Kona .enable_reg = 0x8090, 404*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 405*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 406*cfc34906SJagadeesh Kona .name = "video_cc_mvs1c_clk", 407*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 408*cfc34906SJagadeesh Kona &video_cc_mvs1c_div2_div_clk_src.clkr.hw, 409*cfc34906SJagadeesh Kona }, 410*cfc34906SJagadeesh Kona .num_parents = 1, 411*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 412*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 413*cfc34906SJagadeesh Kona }, 414*cfc34906SJagadeesh Kona }, 415*cfc34906SJagadeesh Kona }; 416*cfc34906SJagadeesh Kona 417*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1c_shift_clk = { 418*cfc34906SJagadeesh Kona .halt_reg = 0x8134, 419*cfc34906SJagadeesh Kona .halt_check = BRANCH_HALT_VOTED, 420*cfc34906SJagadeesh Kona .clkr = { 421*cfc34906SJagadeesh Kona .enable_reg = 0x8134, 422*cfc34906SJagadeesh Kona .enable_mask = BIT(0), 423*cfc34906SJagadeesh Kona .hw.init = &(const struct clk_init_data) { 424*cfc34906SJagadeesh Kona .name = "video_cc_mvs1c_shift_clk", 425*cfc34906SJagadeesh Kona .parent_hws = (const struct clk_hw*[]) { 426*cfc34906SJagadeesh Kona &video_cc_xo_clk_src.clkr.hw, 427*cfc34906SJagadeesh Kona }, 428*cfc34906SJagadeesh Kona .num_parents = 1, 429*cfc34906SJagadeesh Kona .flags = CLK_SET_RATE_PARENT, 430*cfc34906SJagadeesh Kona .ops = &clk_branch2_ops, 431*cfc34906SJagadeesh Kona }, 432*cfc34906SJagadeesh Kona }, 433*cfc34906SJagadeesh Kona }; 434*cfc34906SJagadeesh Kona 435*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs0c_gdsc = { 436*cfc34906SJagadeesh Kona .gdscr = 0x804c, 437*cfc34906SJagadeesh Kona .en_rest_wait_val = 0x2, 438*cfc34906SJagadeesh Kona .en_few_wait_val = 0x2, 439*cfc34906SJagadeesh Kona .clk_dis_wait_val = 0x6, 440*cfc34906SJagadeesh Kona .pd = { 441*cfc34906SJagadeesh Kona .name = "video_cc_mvs0c_gdsc", 442*cfc34906SJagadeesh Kona }, 443*cfc34906SJagadeesh Kona .pwrsts = PWRSTS_OFF_ON, 444*cfc34906SJagadeesh Kona .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 445*cfc34906SJagadeesh Kona }; 446*cfc34906SJagadeesh Kona 447*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs0_gdsc = { 448*cfc34906SJagadeesh Kona .gdscr = 0x80a4, 449*cfc34906SJagadeesh Kona .en_rest_wait_val = 0x2, 450*cfc34906SJagadeesh Kona .en_few_wait_val = 0x2, 451*cfc34906SJagadeesh Kona .clk_dis_wait_val = 0x6, 452*cfc34906SJagadeesh Kona .pd = { 453*cfc34906SJagadeesh Kona .name = "video_cc_mvs0_gdsc", 454*cfc34906SJagadeesh Kona }, 455*cfc34906SJagadeesh Kona .pwrsts = PWRSTS_OFF_ON, 456*cfc34906SJagadeesh Kona .parent = &video_cc_mvs0c_gdsc.pd, 457*cfc34906SJagadeesh Kona .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 458*cfc34906SJagadeesh Kona }; 459*cfc34906SJagadeesh Kona 460*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs1c_gdsc = { 461*cfc34906SJagadeesh Kona .gdscr = 0x8078, 462*cfc34906SJagadeesh Kona .en_rest_wait_val = 0x2, 463*cfc34906SJagadeesh Kona .en_few_wait_val = 0x2, 464*cfc34906SJagadeesh Kona .clk_dis_wait_val = 0xf, 465*cfc34906SJagadeesh Kona .pd = { 466*cfc34906SJagadeesh Kona .name = "video_cc_mvs1c_gdsc", 467*cfc34906SJagadeesh Kona }, 468*cfc34906SJagadeesh Kona .pwrsts = PWRSTS_OFF_ON, 469*cfc34906SJagadeesh Kona .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 470*cfc34906SJagadeesh Kona }; 471*cfc34906SJagadeesh Kona 472*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs1_gdsc = { 473*cfc34906SJagadeesh Kona .gdscr = 0x80cc, 474*cfc34906SJagadeesh Kona .en_rest_wait_val = 0x2, 475*cfc34906SJagadeesh Kona .en_few_wait_val = 0x2, 476*cfc34906SJagadeesh Kona .clk_dis_wait_val = 0xf, 477*cfc34906SJagadeesh Kona .pd = { 478*cfc34906SJagadeesh Kona .name = "video_cc_mvs1_gdsc", 479*cfc34906SJagadeesh Kona }, 480*cfc34906SJagadeesh Kona .pwrsts = PWRSTS_OFF_ON, 481*cfc34906SJagadeesh Kona .parent = &video_cc_mvs1c_gdsc.pd, 482*cfc34906SJagadeesh Kona .flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 483*cfc34906SJagadeesh Kona }; 484*cfc34906SJagadeesh Kona 485*cfc34906SJagadeesh Kona static struct clk_regmap *video_cc_x1p42100_clocks[] = { 486*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_BSE_CLK] = &video_cc_mvs0_bse_clk.clkr, 487*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_BSE_CLK_SRC] = &video_cc_mvs0_bse_clk_src.clkr, 488*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_BSE_DIV4_DIV_CLK_SRC] = &video_cc_mvs0_bse_div4_div_clk_src.clkr, 489*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr, 490*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr, 491*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr, 492*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr, 493*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr, 494*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1_CLK] = &video_cc_mvs1_clk.clkr, 495*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1_CLK_SRC] = &video_cc_mvs1_clk_src.clkr, 496*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1_DIV_CLK_SRC] = &video_cc_mvs1_div_clk_src.clkr, 497*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1_SHIFT_CLK] = &video_cc_mvs1_shift_clk.clkr, 498*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1C_CLK] = &video_cc_mvs1c_clk.clkr, 499*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1C_DIV2_DIV_CLK_SRC] = &video_cc_mvs1c_div2_div_clk_src.clkr, 500*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1C_SHIFT_CLK] = &video_cc_mvs1c_shift_clk.clkr, 501*cfc34906SJagadeesh Kona [VIDEO_CC_PLL0] = &video_cc_pll0.clkr, 502*cfc34906SJagadeesh Kona [VIDEO_CC_PLL1] = &video_cc_pll1.clkr, 503*cfc34906SJagadeesh Kona [VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr, 504*cfc34906SJagadeesh Kona }; 505*cfc34906SJagadeesh Kona 506*cfc34906SJagadeesh Kona static struct gdsc *video_cc_x1p42100_gdscs[] = { 507*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc, 508*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc, 509*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1_GDSC] = &video_cc_mvs1_gdsc, 510*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1C_GDSC] = &video_cc_mvs1c_gdsc, 511*cfc34906SJagadeesh Kona }; 512*cfc34906SJagadeesh Kona 513*cfc34906SJagadeesh Kona static const struct qcom_reset_map video_cc_x1p42100_resets[] = { 514*cfc34906SJagadeesh Kona [CVP_VIDEO_CC_INTERFACE_BCR] = { 0x80f0 }, 515*cfc34906SJagadeesh Kona [CVP_VIDEO_CC_MVS0_BCR] = { 0x80a0 }, 516*cfc34906SJagadeesh Kona [CVP_VIDEO_CC_MVS0C_BCR] = { 0x8048 }, 517*cfc34906SJagadeesh Kona [CVP_VIDEO_CC_MVS1_BCR] = { 0x80c8 }, 518*cfc34906SJagadeesh Kona [CVP_VIDEO_CC_MVS1C_BCR] = { 0x8074 }, 519*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0_BSE_BCR] = { 0x816c }, 520*cfc34906SJagadeesh Kona [VIDEO_CC_MVS0C_CLK_ARES] = { 0x8064, 2 }, 521*cfc34906SJagadeesh Kona [VIDEO_CC_MVS1C_CLK_ARES] = { 0x8090, 2 }, 522*cfc34906SJagadeesh Kona [VIDEO_CC_XO_CLK_ARES] = { 0x8124, 2 }, 523*cfc34906SJagadeesh Kona }; 524*cfc34906SJagadeesh Kona 525*cfc34906SJagadeesh Kona static struct clk_alpha_pll *video_cc_x1p42100_plls[] = { 526*cfc34906SJagadeesh Kona &video_cc_pll0, 527*cfc34906SJagadeesh Kona &video_cc_pll1, 528*cfc34906SJagadeesh Kona }; 529*cfc34906SJagadeesh Kona 530*cfc34906SJagadeesh Kona static u32 video_cc_x1p42100_critical_cbcrs[] = { 531*cfc34906SJagadeesh Kona 0x80f4, /* VIDEO_CC_AHB_CLK */ 532*cfc34906SJagadeesh Kona 0x8150, /* VIDEO_CC_SLEEP_CLK */ 533*cfc34906SJagadeesh Kona 0x8124, /* VIDEO_CC_XO_CLK */ 534*cfc34906SJagadeesh Kona }; 535*cfc34906SJagadeesh Kona 536*cfc34906SJagadeesh Kona static const struct regmap_config video_cc_x1p42100_regmap_config = { 537*cfc34906SJagadeesh Kona .reg_bits = 32, 538*cfc34906SJagadeesh Kona .reg_stride = 4, 539*cfc34906SJagadeesh Kona .val_bits = 32, 540*cfc34906SJagadeesh Kona .max_register = 0x9f54, 541*cfc34906SJagadeesh Kona .fast_io = true, 542*cfc34906SJagadeesh Kona }; 543*cfc34906SJagadeesh Kona 544*cfc34906SJagadeesh Kona static struct qcom_cc_driver_data video_cc_x1p42100_driver_data = { 545*cfc34906SJagadeesh Kona .alpha_plls = video_cc_x1p42100_plls, 546*cfc34906SJagadeesh Kona .num_alpha_plls = ARRAY_SIZE(video_cc_x1p42100_plls), 547*cfc34906SJagadeesh Kona .clk_cbcrs = video_cc_x1p42100_critical_cbcrs, 548*cfc34906SJagadeesh Kona .num_clk_cbcrs = ARRAY_SIZE(video_cc_x1p42100_critical_cbcrs), 549*cfc34906SJagadeesh Kona }; 550*cfc34906SJagadeesh Kona 551*cfc34906SJagadeesh Kona static const struct qcom_cc_desc video_cc_x1p42100_desc = { 552*cfc34906SJagadeesh Kona .config = &video_cc_x1p42100_regmap_config, 553*cfc34906SJagadeesh Kona .clks = video_cc_x1p42100_clocks, 554*cfc34906SJagadeesh Kona .num_clks = ARRAY_SIZE(video_cc_x1p42100_clocks), 555*cfc34906SJagadeesh Kona .resets = video_cc_x1p42100_resets, 556*cfc34906SJagadeesh Kona .num_resets = ARRAY_SIZE(video_cc_x1p42100_resets), 557*cfc34906SJagadeesh Kona .gdscs = video_cc_x1p42100_gdscs, 558*cfc34906SJagadeesh Kona .num_gdscs = ARRAY_SIZE(video_cc_x1p42100_gdscs), 559*cfc34906SJagadeesh Kona .use_rpm = true, 560*cfc34906SJagadeesh Kona .driver_data = &video_cc_x1p42100_driver_data, 561*cfc34906SJagadeesh Kona }; 562*cfc34906SJagadeesh Kona 563*cfc34906SJagadeesh Kona static const struct of_device_id video_cc_x1p42100_match_table[] = { 564*cfc34906SJagadeesh Kona { .compatible = "qcom,x1p42100-videocc" }, 565*cfc34906SJagadeesh Kona { } 566*cfc34906SJagadeesh Kona }; 567*cfc34906SJagadeesh Kona MODULE_DEVICE_TABLE(of, video_cc_x1p42100_match_table); 568*cfc34906SJagadeesh Kona 569*cfc34906SJagadeesh Kona static int video_cc_x1p42100_probe(struct platform_device *pdev) 570*cfc34906SJagadeesh Kona { 571*cfc34906SJagadeesh Kona return qcom_cc_probe(pdev, &video_cc_x1p42100_desc); 572*cfc34906SJagadeesh Kona } 573*cfc34906SJagadeesh Kona 574*cfc34906SJagadeesh Kona static struct platform_driver video_cc_x1p42100_driver = { 575*cfc34906SJagadeesh Kona .probe = video_cc_x1p42100_probe, 576*cfc34906SJagadeesh Kona .driver = { 577*cfc34906SJagadeesh Kona .name = "videocc-x1p42100", 578*cfc34906SJagadeesh Kona .of_match_table = video_cc_x1p42100_match_table, 579*cfc34906SJagadeesh Kona }, 580*cfc34906SJagadeesh Kona }; 581*cfc34906SJagadeesh Kona 582*cfc34906SJagadeesh Kona module_platform_driver(video_cc_x1p42100_driver); 583*cfc34906SJagadeesh Kona 584*cfc34906SJagadeesh Kona MODULE_DESCRIPTION("QTI VIDEOCC X1P42100 Driver"); 585*cfc34906SJagadeesh Kona MODULE_LICENSE("GPL"); 586