1*720b1e8fSKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only 2*720b1e8fSKonrad Dybcio /* 3*720b1e8fSKonrad Dybcio * Copyright (c) 2021, The Linux Foundation. All rights reserved. 4*720b1e8fSKonrad Dybcio * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> 5*720b1e8fSKonrad Dybcio * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com> 6*720b1e8fSKonrad Dybcio */ 7*720b1e8fSKonrad Dybcio 8*720b1e8fSKonrad Dybcio #include <linux/clk-provider.h> 9*720b1e8fSKonrad Dybcio #include <linux/module.h> 10*720b1e8fSKonrad Dybcio #include <linux/platform_device.h> 11*720b1e8fSKonrad Dybcio #include <linux/regmap.h> 12*720b1e8fSKonrad Dybcio 13*720b1e8fSKonrad Dybcio #include <dt-bindings/clock/qcom,sm6350-videocc.h> 14*720b1e8fSKonrad Dybcio 15*720b1e8fSKonrad Dybcio #include "clk-alpha-pll.h" 16*720b1e8fSKonrad Dybcio #include "clk-branch.h" 17*720b1e8fSKonrad Dybcio #include "clk-rcg.h" 18*720b1e8fSKonrad Dybcio #include "clk-regmap.h" 19*720b1e8fSKonrad Dybcio #include "common.h" 20*720b1e8fSKonrad Dybcio #include "gdsc.h" 21*720b1e8fSKonrad Dybcio 22*720b1e8fSKonrad Dybcio enum { 23*720b1e8fSKonrad Dybcio DT_IFACE, 24*720b1e8fSKonrad Dybcio DT_BI_TCXO, 25*720b1e8fSKonrad Dybcio DT_SLEEP_CLK, 26*720b1e8fSKonrad Dybcio }; 27*720b1e8fSKonrad Dybcio 28*720b1e8fSKonrad Dybcio enum { 29*720b1e8fSKonrad Dybcio P_BI_TCXO, 30*720b1e8fSKonrad Dybcio P_CHIP_SLEEP_CLK, 31*720b1e8fSKonrad Dybcio P_VIDEO_PLL0_OUT_EVEN, 32*720b1e8fSKonrad Dybcio }; 33*720b1e8fSKonrad Dybcio 34*720b1e8fSKonrad Dybcio static const struct pll_vco fabia_vco[] = { 35*720b1e8fSKonrad Dybcio { 125000000, 1000000000, 1 }, 36*720b1e8fSKonrad Dybcio }; 37*720b1e8fSKonrad Dybcio 38*720b1e8fSKonrad Dybcio /* 600 MHz */ 39*720b1e8fSKonrad Dybcio static const struct alpha_pll_config video_pll0_config = { 40*720b1e8fSKonrad Dybcio .l = 0x1f, 41*720b1e8fSKonrad Dybcio .alpha = 0x4000, 42*720b1e8fSKonrad Dybcio .config_ctl_val = 0x20485699, 43*720b1e8fSKonrad Dybcio .config_ctl_hi_val = 0x00002067, 44*720b1e8fSKonrad Dybcio .test_ctl_val = 0x40000000, 45*720b1e8fSKonrad Dybcio .test_ctl_hi_val = 0x00000002, 46*720b1e8fSKonrad Dybcio .user_ctl_val = 0x00000101, 47*720b1e8fSKonrad Dybcio .user_ctl_hi_val = 0x00004005, 48*720b1e8fSKonrad Dybcio }; 49*720b1e8fSKonrad Dybcio 50*720b1e8fSKonrad Dybcio static struct clk_alpha_pll video_pll0 = { 51*720b1e8fSKonrad Dybcio .offset = 0x0, 52*720b1e8fSKonrad Dybcio .vco_table = fabia_vco, 53*720b1e8fSKonrad Dybcio .num_vco = ARRAY_SIZE(fabia_vco), 54*720b1e8fSKonrad Dybcio .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 55*720b1e8fSKonrad Dybcio .clkr = { 56*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 57*720b1e8fSKonrad Dybcio .name = "video_pll0", 58*720b1e8fSKonrad Dybcio .parent_data = &(const struct clk_parent_data) { 59*720b1e8fSKonrad Dybcio .index = DT_BI_TCXO, 60*720b1e8fSKonrad Dybcio }, 61*720b1e8fSKonrad Dybcio .num_parents = 1, 62*720b1e8fSKonrad Dybcio .ops = &clk_alpha_pll_fabia_ops, 63*720b1e8fSKonrad Dybcio }, 64*720b1e8fSKonrad Dybcio }, 65*720b1e8fSKonrad Dybcio }; 66*720b1e8fSKonrad Dybcio 67*720b1e8fSKonrad Dybcio static const struct clk_div_table post_div_table_video_pll0_out_even[] = { 68*720b1e8fSKonrad Dybcio { 0x1, 2 }, 69*720b1e8fSKonrad Dybcio { } 70*720b1e8fSKonrad Dybcio }; 71*720b1e8fSKonrad Dybcio 72*720b1e8fSKonrad Dybcio static struct clk_alpha_pll_postdiv video_pll0_out_even = { 73*720b1e8fSKonrad Dybcio .offset = 0x0, 74*720b1e8fSKonrad Dybcio .post_div_shift = 8, 75*720b1e8fSKonrad Dybcio .post_div_table = post_div_table_video_pll0_out_even, 76*720b1e8fSKonrad Dybcio .num_post_div = ARRAY_SIZE(post_div_table_video_pll0_out_even), 77*720b1e8fSKonrad Dybcio .width = 4, 78*720b1e8fSKonrad Dybcio .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 79*720b1e8fSKonrad Dybcio .clkr.hw.init = &(const struct clk_init_data) { 80*720b1e8fSKonrad Dybcio .name = "video_pll0_out_even", 81*720b1e8fSKonrad Dybcio .parent_hws = (const struct clk_hw*[]) { 82*720b1e8fSKonrad Dybcio &video_pll0.clkr.hw, 83*720b1e8fSKonrad Dybcio }, 84*720b1e8fSKonrad Dybcio .num_parents = 1, 85*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 86*720b1e8fSKonrad Dybcio .ops = &clk_alpha_pll_postdiv_fabia_ops, 87*720b1e8fSKonrad Dybcio }, 88*720b1e8fSKonrad Dybcio }; 89*720b1e8fSKonrad Dybcio 90*720b1e8fSKonrad Dybcio static const struct parent_map video_cc_parent_map_0[] = { 91*720b1e8fSKonrad Dybcio { P_BI_TCXO, 0 }, 92*720b1e8fSKonrad Dybcio { P_VIDEO_PLL0_OUT_EVEN, 3 }, 93*720b1e8fSKonrad Dybcio }; 94*720b1e8fSKonrad Dybcio 95*720b1e8fSKonrad Dybcio static const struct clk_parent_data video_cc_parent_data_0[] = { 96*720b1e8fSKonrad Dybcio { .index = DT_BI_TCXO }, 97*720b1e8fSKonrad Dybcio { .hw = &video_pll0_out_even.clkr.hw }, 98*720b1e8fSKonrad Dybcio }; 99*720b1e8fSKonrad Dybcio 100*720b1e8fSKonrad Dybcio static const struct parent_map video_cc_parent_map_1[] = { 101*720b1e8fSKonrad Dybcio { P_CHIP_SLEEP_CLK, 0 }, 102*720b1e8fSKonrad Dybcio }; 103*720b1e8fSKonrad Dybcio 104*720b1e8fSKonrad Dybcio static const struct clk_parent_data video_cc_parent_data_1[] = { 105*720b1e8fSKonrad Dybcio { .index = DT_SLEEP_CLK }, 106*720b1e8fSKonrad Dybcio }; 107*720b1e8fSKonrad Dybcio 108*720b1e8fSKonrad Dybcio static const struct freq_tbl ftbl_video_cc_iris_clk_src[] = { 109*720b1e8fSKonrad Dybcio F(133250000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0), 110*720b1e8fSKonrad Dybcio F(240000000, P_VIDEO_PLL0_OUT_EVEN, 1.5, 0, 0), 111*720b1e8fSKonrad Dybcio F(300000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0), 112*720b1e8fSKonrad Dybcio F(380000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0), 113*720b1e8fSKonrad Dybcio F(460000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0), 114*720b1e8fSKonrad Dybcio { } 115*720b1e8fSKonrad Dybcio }; 116*720b1e8fSKonrad Dybcio 117*720b1e8fSKonrad Dybcio static struct clk_rcg2 video_cc_iris_clk_src = { 118*720b1e8fSKonrad Dybcio .cmd_rcgr = 0x1000, 119*720b1e8fSKonrad Dybcio .mnd_width = 0, 120*720b1e8fSKonrad Dybcio .hid_width = 5, 121*720b1e8fSKonrad Dybcio .parent_map = video_cc_parent_map_0, 122*720b1e8fSKonrad Dybcio .freq_tbl = ftbl_video_cc_iris_clk_src, 123*720b1e8fSKonrad Dybcio .clkr.hw.init = &(const struct clk_init_data) { 124*720b1e8fSKonrad Dybcio .name = "video_cc_iris_clk_src", 125*720b1e8fSKonrad Dybcio .parent_data = video_cc_parent_data_0, 126*720b1e8fSKonrad Dybcio .num_parents = ARRAY_SIZE(video_cc_parent_data_0), 127*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 128*720b1e8fSKonrad Dybcio .ops = &clk_rcg2_shared_ops, 129*720b1e8fSKonrad Dybcio }, 130*720b1e8fSKonrad Dybcio }; 131*720b1e8fSKonrad Dybcio 132*720b1e8fSKonrad Dybcio static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = { 133*720b1e8fSKonrad Dybcio F(32764, P_CHIP_SLEEP_CLK, 1, 0, 0), 134*720b1e8fSKonrad Dybcio { } 135*720b1e8fSKonrad Dybcio }; 136*720b1e8fSKonrad Dybcio 137*720b1e8fSKonrad Dybcio static struct clk_rcg2 video_cc_sleep_clk_src = { 138*720b1e8fSKonrad Dybcio .cmd_rcgr = 0x701c, 139*720b1e8fSKonrad Dybcio .mnd_width = 0, 140*720b1e8fSKonrad Dybcio .hid_width = 5, 141*720b1e8fSKonrad Dybcio .parent_map = video_cc_parent_map_1, 142*720b1e8fSKonrad Dybcio .freq_tbl = ftbl_video_cc_sleep_clk_src, 143*720b1e8fSKonrad Dybcio .clkr.hw.init = &(const struct clk_init_data) { 144*720b1e8fSKonrad Dybcio .name = "video_cc_sleep_clk_src", 145*720b1e8fSKonrad Dybcio .parent_data = video_cc_parent_data_1, 146*720b1e8fSKonrad Dybcio .num_parents = ARRAY_SIZE(video_cc_parent_data_1), 147*720b1e8fSKonrad Dybcio .ops = &clk_rcg2_ops, 148*720b1e8fSKonrad Dybcio }, 149*720b1e8fSKonrad Dybcio }; 150*720b1e8fSKonrad Dybcio 151*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_iris_ahb_clk = { 152*720b1e8fSKonrad Dybcio .halt_reg = 0x5004, 153*720b1e8fSKonrad Dybcio .halt_check = BRANCH_VOTED, 154*720b1e8fSKonrad Dybcio .clkr = { 155*720b1e8fSKonrad Dybcio .enable_reg = 0x5004, 156*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 157*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 158*720b1e8fSKonrad Dybcio .name = "video_cc_iris_ahb_clk", 159*720b1e8fSKonrad Dybcio .parent_hws = (const struct clk_hw*[]) { 160*720b1e8fSKonrad Dybcio &video_cc_iris_clk_src.clkr.hw, 161*720b1e8fSKonrad Dybcio }, 162*720b1e8fSKonrad Dybcio .num_parents = 1, 163*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 164*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 165*720b1e8fSKonrad Dybcio }, 166*720b1e8fSKonrad Dybcio }, 167*720b1e8fSKonrad Dybcio }; 168*720b1e8fSKonrad Dybcio 169*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvs0_axi_clk = { 170*720b1e8fSKonrad Dybcio .halt_reg = 0x800c, 171*720b1e8fSKonrad Dybcio .halt_check = BRANCH_HALT, 172*720b1e8fSKonrad Dybcio .clkr = { 173*720b1e8fSKonrad Dybcio .enable_reg = 0x800c, 174*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 175*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 176*720b1e8fSKonrad Dybcio .name = "video_cc_mvs0_axi_clk", 177*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 178*720b1e8fSKonrad Dybcio }, 179*720b1e8fSKonrad Dybcio }, 180*720b1e8fSKonrad Dybcio }; 181*720b1e8fSKonrad Dybcio 182*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvs0_core_clk = { 183*720b1e8fSKonrad Dybcio .halt_reg = 0x3010, 184*720b1e8fSKonrad Dybcio .halt_check = BRANCH_VOTED, 185*720b1e8fSKonrad Dybcio .hwcg_reg = 0x3010, 186*720b1e8fSKonrad Dybcio .hwcg_bit = 1, 187*720b1e8fSKonrad Dybcio .clkr = { 188*720b1e8fSKonrad Dybcio .enable_reg = 0x3010, 189*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 190*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 191*720b1e8fSKonrad Dybcio .name = "video_cc_mvs0_core_clk", 192*720b1e8fSKonrad Dybcio .parent_hws = (const struct clk_hw*[]) { 193*720b1e8fSKonrad Dybcio &video_cc_iris_clk_src.clkr.hw, 194*720b1e8fSKonrad Dybcio }, 195*720b1e8fSKonrad Dybcio .num_parents = 1, 196*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 197*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 198*720b1e8fSKonrad Dybcio }, 199*720b1e8fSKonrad Dybcio }, 200*720b1e8fSKonrad Dybcio }; 201*720b1e8fSKonrad Dybcio 202*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvsc_core_clk = { 203*720b1e8fSKonrad Dybcio .halt_reg = 0x2014, 204*720b1e8fSKonrad Dybcio .halt_check = BRANCH_HALT, 205*720b1e8fSKonrad Dybcio .clkr = { 206*720b1e8fSKonrad Dybcio .enable_reg = 0x2014, 207*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 208*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 209*720b1e8fSKonrad Dybcio .name = "video_cc_mvsc_core_clk", 210*720b1e8fSKonrad Dybcio .parent_hws = (const struct clk_hw*[]) { 211*720b1e8fSKonrad Dybcio &video_cc_iris_clk_src.clkr.hw, 212*720b1e8fSKonrad Dybcio }, 213*720b1e8fSKonrad Dybcio .num_parents = 1, 214*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 215*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 216*720b1e8fSKonrad Dybcio }, 217*720b1e8fSKonrad Dybcio }, 218*720b1e8fSKonrad Dybcio }; 219*720b1e8fSKonrad Dybcio 220*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvsc_ctl_axi_clk = { 221*720b1e8fSKonrad Dybcio .halt_reg = 0x8004, 222*720b1e8fSKonrad Dybcio .halt_check = BRANCH_HALT, 223*720b1e8fSKonrad Dybcio .clkr = { 224*720b1e8fSKonrad Dybcio .enable_reg = 0x8004, 225*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 226*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 227*720b1e8fSKonrad Dybcio .name = "video_cc_mvsc_ctl_axi_clk", 228*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 229*720b1e8fSKonrad Dybcio }, 230*720b1e8fSKonrad Dybcio }, 231*720b1e8fSKonrad Dybcio }; 232*720b1e8fSKonrad Dybcio 233*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_sleep_clk = { 234*720b1e8fSKonrad Dybcio .halt_reg = 0x7034, 235*720b1e8fSKonrad Dybcio .halt_check = BRANCH_HALT, 236*720b1e8fSKonrad Dybcio .clkr = { 237*720b1e8fSKonrad Dybcio .enable_reg = 0x7034, 238*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 239*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 240*720b1e8fSKonrad Dybcio .name = "video_cc_sleep_clk", 241*720b1e8fSKonrad Dybcio .parent_hws = (const struct clk_hw*[]) { 242*720b1e8fSKonrad Dybcio &video_cc_sleep_clk_src.clkr.hw, 243*720b1e8fSKonrad Dybcio }, 244*720b1e8fSKonrad Dybcio .num_parents = 1, 245*720b1e8fSKonrad Dybcio .flags = CLK_SET_RATE_PARENT, 246*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 247*720b1e8fSKonrad Dybcio }, 248*720b1e8fSKonrad Dybcio }, 249*720b1e8fSKonrad Dybcio }; 250*720b1e8fSKonrad Dybcio 251*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_venus_ahb_clk = { 252*720b1e8fSKonrad Dybcio .halt_reg = 0x801c, 253*720b1e8fSKonrad Dybcio .halt_check = BRANCH_HALT, 254*720b1e8fSKonrad Dybcio .clkr = { 255*720b1e8fSKonrad Dybcio .enable_reg = 0x801c, 256*720b1e8fSKonrad Dybcio .enable_mask = BIT(0), 257*720b1e8fSKonrad Dybcio .hw.init = &(const struct clk_init_data) { 258*720b1e8fSKonrad Dybcio .name = "video_cc_venus_ahb_clk", 259*720b1e8fSKonrad Dybcio .ops = &clk_branch2_ops, 260*720b1e8fSKonrad Dybcio }, 261*720b1e8fSKonrad Dybcio }, 262*720b1e8fSKonrad Dybcio }; 263*720b1e8fSKonrad Dybcio 264*720b1e8fSKonrad Dybcio static struct gdsc mvsc_gdsc = { 265*720b1e8fSKonrad Dybcio .gdscr = 0x2004, 266*720b1e8fSKonrad Dybcio .en_rest_wait_val = 0x2, 267*720b1e8fSKonrad Dybcio .en_few_wait_val = 0x2, 268*720b1e8fSKonrad Dybcio .clk_dis_wait_val = 0x6, 269*720b1e8fSKonrad Dybcio .pd = { 270*720b1e8fSKonrad Dybcio .name = "mvsc_gdsc", 271*720b1e8fSKonrad Dybcio }, 272*720b1e8fSKonrad Dybcio .pwrsts = PWRSTS_OFF_ON, 273*720b1e8fSKonrad Dybcio }; 274*720b1e8fSKonrad Dybcio 275*720b1e8fSKonrad Dybcio static struct gdsc mvs0_gdsc = { 276*720b1e8fSKonrad Dybcio .gdscr = 0x3004, 277*720b1e8fSKonrad Dybcio .en_rest_wait_val = 0x2, 278*720b1e8fSKonrad Dybcio .en_few_wait_val = 0x2, 279*720b1e8fSKonrad Dybcio .clk_dis_wait_val = 0x6, 280*720b1e8fSKonrad Dybcio .pd = { 281*720b1e8fSKonrad Dybcio .name = "mvs0_gdsc", 282*720b1e8fSKonrad Dybcio }, 283*720b1e8fSKonrad Dybcio .pwrsts = PWRSTS_OFF_ON, 284*720b1e8fSKonrad Dybcio .flags = HW_CTRL_TRIGGER, 285*720b1e8fSKonrad Dybcio }; 286*720b1e8fSKonrad Dybcio 287*720b1e8fSKonrad Dybcio static struct gdsc *video_cc_sm6350_gdscs[] = { 288*720b1e8fSKonrad Dybcio [MVSC_GDSC] = &mvsc_gdsc, 289*720b1e8fSKonrad Dybcio [MVS0_GDSC] = &mvs0_gdsc, 290*720b1e8fSKonrad Dybcio }; 291*720b1e8fSKonrad Dybcio 292*720b1e8fSKonrad Dybcio static struct clk_regmap *video_cc_sm6350_clocks[] = { 293*720b1e8fSKonrad Dybcio [VIDEO_CC_IRIS_AHB_CLK] = &video_cc_iris_ahb_clk.clkr, 294*720b1e8fSKonrad Dybcio [VIDEO_CC_IRIS_CLK_SRC] = &video_cc_iris_clk_src.clkr, 295*720b1e8fSKonrad Dybcio [VIDEO_CC_MVS0_AXI_CLK] = &video_cc_mvs0_axi_clk.clkr, 296*720b1e8fSKonrad Dybcio [VIDEO_CC_MVS0_CORE_CLK] = &video_cc_mvs0_core_clk.clkr, 297*720b1e8fSKonrad Dybcio [VIDEO_CC_MVSC_CORE_CLK] = &video_cc_mvsc_core_clk.clkr, 298*720b1e8fSKonrad Dybcio [VIDEO_CC_MVSC_CTL_AXI_CLK] = &video_cc_mvsc_ctl_axi_clk.clkr, 299*720b1e8fSKonrad Dybcio [VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr, 300*720b1e8fSKonrad Dybcio [VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr, 301*720b1e8fSKonrad Dybcio [VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr, 302*720b1e8fSKonrad Dybcio [VIDEO_PLL0] = &video_pll0.clkr, 303*720b1e8fSKonrad Dybcio [VIDEO_PLL0_OUT_EVEN] = &video_pll0_out_even.clkr, 304*720b1e8fSKonrad Dybcio }; 305*720b1e8fSKonrad Dybcio 306*720b1e8fSKonrad Dybcio static const struct regmap_config video_cc_sm6350_regmap_config = { 307*720b1e8fSKonrad Dybcio .reg_bits = 32, 308*720b1e8fSKonrad Dybcio .reg_stride = 4, 309*720b1e8fSKonrad Dybcio .val_bits = 32, 310*720b1e8fSKonrad Dybcio .max_register = 0xb000, 311*720b1e8fSKonrad Dybcio .fast_io = true, 312*720b1e8fSKonrad Dybcio }; 313*720b1e8fSKonrad Dybcio 314*720b1e8fSKonrad Dybcio static const struct qcom_cc_desc video_cc_sm6350_desc = { 315*720b1e8fSKonrad Dybcio .config = &video_cc_sm6350_regmap_config, 316*720b1e8fSKonrad Dybcio .clks = video_cc_sm6350_clocks, 317*720b1e8fSKonrad Dybcio .num_clks = ARRAY_SIZE(video_cc_sm6350_clocks), 318*720b1e8fSKonrad Dybcio .gdscs = video_cc_sm6350_gdscs, 319*720b1e8fSKonrad Dybcio .num_gdscs = ARRAY_SIZE(video_cc_sm6350_gdscs), 320*720b1e8fSKonrad Dybcio }; 321*720b1e8fSKonrad Dybcio 322*720b1e8fSKonrad Dybcio static const struct of_device_id video_cc_sm6350_match_table[] = { 323*720b1e8fSKonrad Dybcio { .compatible = "qcom,sm6350-videocc" }, 324*720b1e8fSKonrad Dybcio { } 325*720b1e8fSKonrad Dybcio }; 326*720b1e8fSKonrad Dybcio MODULE_DEVICE_TABLE(of, video_cc_sm6350_match_table); 327*720b1e8fSKonrad Dybcio 328*720b1e8fSKonrad Dybcio static int video_cc_sm6350_probe(struct platform_device *pdev) 329*720b1e8fSKonrad Dybcio { 330*720b1e8fSKonrad Dybcio struct regmap *regmap; 331*720b1e8fSKonrad Dybcio 332*720b1e8fSKonrad Dybcio regmap = qcom_cc_map(pdev, &video_cc_sm6350_desc); 333*720b1e8fSKonrad Dybcio if (IS_ERR(regmap)) 334*720b1e8fSKonrad Dybcio return PTR_ERR(regmap); 335*720b1e8fSKonrad Dybcio 336*720b1e8fSKonrad Dybcio clk_fabia_pll_configure(&video_pll0, regmap, &video_pll0_config); 337*720b1e8fSKonrad Dybcio 338*720b1e8fSKonrad Dybcio /* Keep some clocks always-on */ 339*720b1e8fSKonrad Dybcio qcom_branch_set_clk_en(regmap, 0x7018); /* VIDEO_CC_XO_CLK */ 340*720b1e8fSKonrad Dybcio 341*720b1e8fSKonrad Dybcio return qcom_cc_really_probe(&pdev->dev, &video_cc_sm6350_desc, regmap); 342*720b1e8fSKonrad Dybcio } 343*720b1e8fSKonrad Dybcio 344*720b1e8fSKonrad Dybcio static struct platform_driver video_cc_sm6350_driver = { 345*720b1e8fSKonrad Dybcio .probe = video_cc_sm6350_probe, 346*720b1e8fSKonrad Dybcio .driver = { 347*720b1e8fSKonrad Dybcio .name = "video_cc-sm6350", 348*720b1e8fSKonrad Dybcio .of_match_table = video_cc_sm6350_match_table, 349*720b1e8fSKonrad Dybcio }, 350*720b1e8fSKonrad Dybcio }; 351*720b1e8fSKonrad Dybcio 352*720b1e8fSKonrad Dybcio module_platform_driver(video_cc_sm6350_driver); 353*720b1e8fSKonrad Dybcio 354*720b1e8fSKonrad Dybcio MODULE_DESCRIPTION("QTI VIDEO_CC SM6350 Driver"); 355*720b1e8fSKonrad Dybcio MODULE_LICENSE("GPL"); 356