1*f40b5217SLuca Weiss // SPDX-License-Identifier: GPL-2.0-only 2*f40b5217SLuca Weiss /* 3*f40b5217SLuca Weiss * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4*f40b5217SLuca Weiss * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com> 5*f40b5217SLuca Weiss */ 6*f40b5217SLuca Weiss 7*f40b5217SLuca Weiss #include <linux/clk.h> 8*f40b5217SLuca Weiss #include <linux/clk-provider.h> 9*f40b5217SLuca Weiss #include <linux/err.h> 10*f40b5217SLuca Weiss #include <linux/kernel.h> 11*f40b5217SLuca Weiss #include <linux/module.h> 12*f40b5217SLuca Weiss #include <linux/of.h> 13*f40b5217SLuca Weiss #include <linux/platform_device.h> 14*f40b5217SLuca Weiss #include <linux/regmap.h> 15*f40b5217SLuca Weiss 16*f40b5217SLuca Weiss #include <dt-bindings/clock/qcom,milos-dispcc.h> 17*f40b5217SLuca Weiss 18*f40b5217SLuca Weiss #include "common.h" 19*f40b5217SLuca Weiss #include "clk-alpha-pll.h" 20*f40b5217SLuca Weiss #include "clk-branch.h" 21*f40b5217SLuca Weiss #include "clk-pll.h" 22*f40b5217SLuca Weiss #include "clk-rcg.h" 23*f40b5217SLuca Weiss #include "clk-regmap.h" 24*f40b5217SLuca Weiss #include "clk-regmap-divider.h" 25*f40b5217SLuca Weiss #include "clk-regmap-mux.h" 26*f40b5217SLuca Weiss #include "reset.h" 27*f40b5217SLuca Weiss #include "gdsc.h" 28*f40b5217SLuca Weiss 29*f40b5217SLuca Weiss /* Need to match the order of clocks in DT binding */ 30*f40b5217SLuca Weiss enum { 31*f40b5217SLuca Weiss DT_BI_TCXO, 32*f40b5217SLuca Weiss DT_SLEEP_CLK, 33*f40b5217SLuca Weiss DT_AHB_CLK, 34*f40b5217SLuca Weiss DT_GCC_DISP_GPLL0_CLK, 35*f40b5217SLuca Weiss DT_DSI0_PHY_PLL_OUT_BYTECLK, 36*f40b5217SLuca Weiss DT_DSI0_PHY_PLL_OUT_DSICLK, 37*f40b5217SLuca Weiss DT_DP0_PHY_PLL_LINK_CLK, 38*f40b5217SLuca Weiss DT_DP0_PHY_PLL_VCO_DIV_CLK, 39*f40b5217SLuca Weiss }; 40*f40b5217SLuca Weiss 41*f40b5217SLuca Weiss #define DISP_CC_MISC_CMD 0xF000 42*f40b5217SLuca Weiss 43*f40b5217SLuca Weiss enum { 44*f40b5217SLuca Weiss P_BI_TCXO, 45*f40b5217SLuca Weiss P_DISP_CC_PLL0_OUT_EVEN, 46*f40b5217SLuca Weiss P_DISP_CC_PLL0_OUT_MAIN, 47*f40b5217SLuca Weiss P_DP0_PHY_PLL_LINK_CLK, 48*f40b5217SLuca Weiss P_DP0_PHY_PLL_VCO_DIV_CLK, 49*f40b5217SLuca Weiss P_DSI0_PHY_PLL_OUT_BYTECLK, 50*f40b5217SLuca Weiss P_DSI0_PHY_PLL_OUT_DSICLK, 51*f40b5217SLuca Weiss P_GCC_DISP_GPLL0_CLK, 52*f40b5217SLuca Weiss P_SLEEP_CLK, 53*f40b5217SLuca Weiss }; 54*f40b5217SLuca Weiss 55*f40b5217SLuca Weiss static const struct pll_vco lucid_ole_vco[] = { 56*f40b5217SLuca Weiss { 249600000, 2300000000, 0 }, 57*f40b5217SLuca Weiss }; 58*f40b5217SLuca Weiss 59*f40b5217SLuca Weiss /* 257.142858 MHz Configuration */ 60*f40b5217SLuca Weiss static const struct alpha_pll_config disp_cc_pll0_config = { 61*f40b5217SLuca Weiss .l = 0xd, 62*f40b5217SLuca Weiss .alpha = 0x6492, 63*f40b5217SLuca Weiss .config_ctl_val = 0x20485699, 64*f40b5217SLuca Weiss .config_ctl_hi_val = 0x00182261, 65*f40b5217SLuca Weiss .config_ctl_hi1_val = 0x82aa299c, 66*f40b5217SLuca Weiss .test_ctl_val = 0x00000000, 67*f40b5217SLuca Weiss .test_ctl_hi_val = 0x00000003, 68*f40b5217SLuca Weiss .test_ctl_hi1_val = 0x00009000, 69*f40b5217SLuca Weiss .test_ctl_hi2_val = 0x00000034, 70*f40b5217SLuca Weiss .user_ctl_val = 0x00000000, 71*f40b5217SLuca Weiss .user_ctl_hi_val = 0x00000005, 72*f40b5217SLuca Weiss }; 73*f40b5217SLuca Weiss 74*f40b5217SLuca Weiss static struct clk_alpha_pll disp_cc_pll0 = { 75*f40b5217SLuca Weiss .offset = 0x0, 76*f40b5217SLuca Weiss .config = &disp_cc_pll0_config, 77*f40b5217SLuca Weiss .vco_table = lucid_ole_vco, 78*f40b5217SLuca Weiss .num_vco = ARRAY_SIZE(lucid_ole_vco), 79*f40b5217SLuca Weiss .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 80*f40b5217SLuca Weiss .clkr = { 81*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 82*f40b5217SLuca Weiss .name = "disp_cc_pll0", 83*f40b5217SLuca Weiss .parent_data = &(const struct clk_parent_data) { 84*f40b5217SLuca Weiss .index = DT_BI_TCXO, 85*f40b5217SLuca Weiss }, 86*f40b5217SLuca Weiss .num_parents = 1, 87*f40b5217SLuca Weiss .ops = &clk_alpha_pll_lucid_evo_ops, 88*f40b5217SLuca Weiss }, 89*f40b5217SLuca Weiss }, 90*f40b5217SLuca Weiss }; 91*f40b5217SLuca Weiss 92*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_0[] = { 93*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 94*f40b5217SLuca Weiss }; 95*f40b5217SLuca Weiss 96*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_0[] = { 97*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 98*f40b5217SLuca Weiss }; 99*f40b5217SLuca Weiss 100*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_1[] = { 101*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 102*f40b5217SLuca Weiss { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, 103*f40b5217SLuca Weiss { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 104*f40b5217SLuca Weiss }; 105*f40b5217SLuca Weiss 106*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_1[] = { 107*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 108*f40b5217SLuca Weiss { .index = DT_DSI0_PHY_PLL_OUT_DSICLK }, 109*f40b5217SLuca Weiss { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 110*f40b5217SLuca Weiss }; 111*f40b5217SLuca Weiss 112*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_2[] = { 113*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 114*f40b5217SLuca Weiss { P_DP0_PHY_PLL_LINK_CLK, 1 }, 115*f40b5217SLuca Weiss { P_DP0_PHY_PLL_VCO_DIV_CLK, 2 }, 116*f40b5217SLuca Weiss }; 117*f40b5217SLuca Weiss 118*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_2[] = { 119*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 120*f40b5217SLuca Weiss { .index = DT_DP0_PHY_PLL_LINK_CLK }, 121*f40b5217SLuca Weiss { .index = DT_DP0_PHY_PLL_VCO_DIV_CLK }, 122*f40b5217SLuca Weiss }; 123*f40b5217SLuca Weiss 124*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_3[] = { 125*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 126*f40b5217SLuca Weiss { P_GCC_DISP_GPLL0_CLK, 4 }, 127*f40b5217SLuca Weiss }; 128*f40b5217SLuca Weiss 129*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_3[] = { 130*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 131*f40b5217SLuca Weiss { .index = DT_GCC_DISP_GPLL0_CLK }, 132*f40b5217SLuca Weiss }; 133*f40b5217SLuca Weiss 134*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_4[] = { 135*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 136*f40b5217SLuca Weiss { P_DP0_PHY_PLL_LINK_CLK, 1 }, 137*f40b5217SLuca Weiss }; 138*f40b5217SLuca Weiss 139*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_4[] = { 140*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 141*f40b5217SLuca Weiss { .index = DT_DP0_PHY_PLL_LINK_CLK }, 142*f40b5217SLuca Weiss }; 143*f40b5217SLuca Weiss 144*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_5[] = { 145*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 146*f40b5217SLuca Weiss { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 147*f40b5217SLuca Weiss }; 148*f40b5217SLuca Weiss 149*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_5[] = { 150*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 151*f40b5217SLuca Weiss { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 152*f40b5217SLuca Weiss }; 153*f40b5217SLuca Weiss 154*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_6[] = { 155*f40b5217SLuca Weiss { P_BI_TCXO, 0 }, 156*f40b5217SLuca Weiss { P_DISP_CC_PLL0_OUT_MAIN, 1 }, 157*f40b5217SLuca Weiss { P_GCC_DISP_GPLL0_CLK, 4 }, 158*f40b5217SLuca Weiss { P_DISP_CC_PLL0_OUT_EVEN, 6 }, 159*f40b5217SLuca Weiss }; 160*f40b5217SLuca Weiss 161*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_6[] = { 162*f40b5217SLuca Weiss { .index = DT_BI_TCXO }, 163*f40b5217SLuca Weiss { .hw = &disp_cc_pll0.clkr.hw }, 164*f40b5217SLuca Weiss { .index = DT_GCC_DISP_GPLL0_CLK }, 165*f40b5217SLuca Weiss { .hw = &disp_cc_pll0.clkr.hw }, 166*f40b5217SLuca Weiss }; 167*f40b5217SLuca Weiss 168*f40b5217SLuca Weiss static const struct parent_map disp_cc_parent_map_7[] = { 169*f40b5217SLuca Weiss { P_SLEEP_CLK, 0 }, 170*f40b5217SLuca Weiss }; 171*f40b5217SLuca Weiss 172*f40b5217SLuca Weiss static const struct clk_parent_data disp_cc_parent_data_7_ao[] = { 173*f40b5217SLuca Weiss { .index = DT_SLEEP_CLK }, 174*f40b5217SLuca Weiss }; 175*f40b5217SLuca Weiss 176*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { 177*f40b5217SLuca Weiss F(19200000, P_BI_TCXO, 1, 0, 0), 178*f40b5217SLuca Weiss F(37500000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0), 179*f40b5217SLuca Weiss F(75000000, P_GCC_DISP_GPLL0_CLK, 4, 0, 0), 180*f40b5217SLuca Weiss { } 181*f40b5217SLuca Weiss }; 182*f40b5217SLuca Weiss 183*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { 184*f40b5217SLuca Weiss .cmd_rcgr = 0x8130, 185*f40b5217SLuca Weiss .mnd_width = 0, 186*f40b5217SLuca Weiss .hid_width = 5, 187*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_3, 188*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, 189*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 190*f40b5217SLuca Weiss .name = "disp_cc_mdss_ahb_clk_src", 191*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_3, 192*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 193*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 194*f40b5217SLuca Weiss .ops = &clk_rcg2_shared_ops, 195*f40b5217SLuca Weiss }, 196*f40b5217SLuca Weiss }; 197*f40b5217SLuca Weiss 198*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { 199*f40b5217SLuca Weiss .cmd_rcgr = 0x8098, 200*f40b5217SLuca Weiss .mnd_width = 0, 201*f40b5217SLuca Weiss .hid_width = 5, 202*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_1, 203*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 204*f40b5217SLuca Weiss .name = "disp_cc_mdss_byte0_clk_src", 205*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_1, 206*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 207*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 208*f40b5217SLuca Weiss .ops = &clk_byte2_ops, 209*f40b5217SLuca Weiss }, 210*f40b5217SLuca Weiss }; 211*f40b5217SLuca Weiss 212*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_dptx0_aux_clk_src[] = { 213*f40b5217SLuca Weiss F(19200000, P_BI_TCXO, 1, 0, 0), 214*f40b5217SLuca Weiss { } 215*f40b5217SLuca Weiss }; 216*f40b5217SLuca Weiss 217*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = { 218*f40b5217SLuca Weiss .cmd_rcgr = 0x8118, 219*f40b5217SLuca Weiss .mnd_width = 0, 220*f40b5217SLuca Weiss .hid_width = 5, 221*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_0, 222*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src, 223*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 224*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_aux_clk_src", 225*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_0, 226*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 227*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 228*f40b5217SLuca Weiss .ops = &clk_rcg2_ops, 229*f40b5217SLuca Weiss }, 230*f40b5217SLuca Weiss }; 231*f40b5217SLuca Weiss 232*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = { 233*f40b5217SLuca Weiss .cmd_rcgr = 0x80cc, 234*f40b5217SLuca Weiss .mnd_width = 0, 235*f40b5217SLuca Weiss .hid_width = 5, 236*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_4, 237*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 238*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_link_clk_src", 239*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_4, 240*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_4), 241*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 242*f40b5217SLuca Weiss .ops = &clk_byte2_ops, 243*f40b5217SLuca Weiss }, 244*f40b5217SLuca Weiss }; 245*f40b5217SLuca Weiss 246*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = { 247*f40b5217SLuca Weiss .cmd_rcgr = 0x80e8, 248*f40b5217SLuca Weiss .mnd_width = 16, 249*f40b5217SLuca Weiss .hid_width = 5, 250*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_2, 251*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 252*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_pixel0_clk_src", 253*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_2, 254*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 255*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 256*f40b5217SLuca Weiss .ops = &clk_dp_ops, 257*f40b5217SLuca Weiss }, 258*f40b5217SLuca Weiss }; 259*f40b5217SLuca Weiss 260*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = { 261*f40b5217SLuca Weiss .cmd_rcgr = 0x8100, 262*f40b5217SLuca Weiss .mnd_width = 16, 263*f40b5217SLuca Weiss .hid_width = 5, 264*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_2, 265*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 266*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_pixel1_clk_src", 267*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_2, 268*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 269*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 270*f40b5217SLuca Weiss .ops = &clk_dp_ops, 271*f40b5217SLuca Weiss }, 272*f40b5217SLuca Weiss }; 273*f40b5217SLuca Weiss 274*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = { 275*f40b5217SLuca Weiss F(9600000, P_BI_TCXO, 2, 0, 0), 276*f40b5217SLuca Weiss F(12800000, P_BI_TCXO, 1.5, 0, 0), 277*f40b5217SLuca Weiss F(19200000, P_BI_TCXO, 1, 0, 0), 278*f40b5217SLuca Weiss { } 279*f40b5217SLuca Weiss }; 280*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { 281*f40b5217SLuca Weiss .cmd_rcgr = 0x80b4, 282*f40b5217SLuca Weiss .mnd_width = 0, 283*f40b5217SLuca Weiss .hid_width = 5, 284*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_5, 285*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, 286*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 287*f40b5217SLuca Weiss .name = "disp_cc_mdss_esc0_clk_src", 288*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_5, 289*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), 290*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 291*f40b5217SLuca Weiss .ops = &clk_rcg2_ops, 292*f40b5217SLuca Weiss }, 293*f40b5217SLuca Weiss }; 294*f40b5217SLuca Weiss 295*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { 296*f40b5217SLuca Weiss F(19200000, P_BI_TCXO, 1, 0, 0), 297*f40b5217SLuca Weiss F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 298*f40b5217SLuca Weiss F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 299*f40b5217SLuca Weiss F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 300*f40b5217SLuca Weiss F(342000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 301*f40b5217SLuca Weiss F(402000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 302*f40b5217SLuca Weiss F(535000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 303*f40b5217SLuca Weiss F(600000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 304*f40b5217SLuca Weiss F(630000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 305*f40b5217SLuca Weiss { } 306*f40b5217SLuca Weiss }; 307*f40b5217SLuca Weiss 308*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { 309*f40b5217SLuca Weiss .cmd_rcgr = 0x8068, 310*f40b5217SLuca Weiss .mnd_width = 0, 311*f40b5217SLuca Weiss .hid_width = 5, 312*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_6, 313*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, 314*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 315*f40b5217SLuca Weiss .name = "disp_cc_mdss_mdp_clk_src", 316*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_6, 317*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), 318*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 319*f40b5217SLuca Weiss .ops = &clk_rcg2_shared_ops, 320*f40b5217SLuca Weiss }, 321*f40b5217SLuca Weiss }; 322*f40b5217SLuca Weiss 323*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { 324*f40b5217SLuca Weiss .cmd_rcgr = 0x8050, 325*f40b5217SLuca Weiss .mnd_width = 8, 326*f40b5217SLuca Weiss .hid_width = 5, 327*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_1, 328*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 329*f40b5217SLuca Weiss .name = "disp_cc_mdss_pclk0_clk_src", 330*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_1, 331*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 332*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 333*f40b5217SLuca Weiss .ops = &clk_pixel_ops, 334*f40b5217SLuca Weiss }, 335*f40b5217SLuca Weiss }; 336*f40b5217SLuca Weiss 337*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { 338*f40b5217SLuca Weiss .cmd_rcgr = 0x8080, 339*f40b5217SLuca Weiss .mnd_width = 0, 340*f40b5217SLuca Weiss .hid_width = 5, 341*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_0, 342*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src, 343*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 344*f40b5217SLuca Weiss .name = "disp_cc_mdss_vsync_clk_src", 345*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_0, 346*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 347*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 348*f40b5217SLuca Weiss .ops = &clk_rcg2_ops, 349*f40b5217SLuca Weiss }, 350*f40b5217SLuca Weiss }; 351*f40b5217SLuca Weiss 352*f40b5217SLuca Weiss static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = { 353*f40b5217SLuca Weiss F(32000, P_SLEEP_CLK, 1, 0, 0), 354*f40b5217SLuca Weiss { } 355*f40b5217SLuca Weiss }; 356*f40b5217SLuca Weiss 357*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_sleep_clk_src = { 358*f40b5217SLuca Weiss .cmd_rcgr = 0xe054, 359*f40b5217SLuca Weiss .mnd_width = 0, 360*f40b5217SLuca Weiss .hid_width = 5, 361*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_7, 362*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_sleep_clk_src, 363*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 364*f40b5217SLuca Weiss .name = "disp_cc_sleep_clk_src", 365*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_7_ao, 366*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_7_ao), 367*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 368*f40b5217SLuca Weiss .ops = &clk_rcg2_ops, 369*f40b5217SLuca Weiss }, 370*f40b5217SLuca Weiss }; 371*f40b5217SLuca Weiss 372*f40b5217SLuca Weiss static struct clk_rcg2 disp_cc_xo_clk_src = { 373*f40b5217SLuca Weiss .cmd_rcgr = 0xe034, 374*f40b5217SLuca Weiss .mnd_width = 0, 375*f40b5217SLuca Weiss .hid_width = 5, 376*f40b5217SLuca Weiss .parent_map = disp_cc_parent_map_0, 377*f40b5217SLuca Weiss .freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src, 378*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 379*f40b5217SLuca Weiss .name = "disp_cc_xo_clk_src", 380*f40b5217SLuca Weiss .parent_data = disp_cc_parent_data_0, 381*f40b5217SLuca Weiss .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 382*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 383*f40b5217SLuca Weiss .ops = &clk_rcg2_ops, 384*f40b5217SLuca Weiss }, 385*f40b5217SLuca Weiss }; 386*f40b5217SLuca Weiss 387*f40b5217SLuca Weiss static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { 388*f40b5217SLuca Weiss .reg = 0x80b0, 389*f40b5217SLuca Weiss .shift = 0, 390*f40b5217SLuca Weiss .width = 4, 391*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 392*f40b5217SLuca Weiss .name = "disp_cc_mdss_byte0_div_clk_src", 393*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 394*f40b5217SLuca Weiss &disp_cc_mdss_byte0_clk_src.clkr.hw, 395*f40b5217SLuca Weiss }, 396*f40b5217SLuca Weiss .num_parents = 1, 397*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 398*f40b5217SLuca Weiss .ops = &clk_regmap_div_ops, 399*f40b5217SLuca Weiss }, 400*f40b5217SLuca Weiss }; 401*f40b5217SLuca Weiss 402*f40b5217SLuca Weiss static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = { 403*f40b5217SLuca Weiss .reg = 0x80e4, 404*f40b5217SLuca Weiss .shift = 0, 405*f40b5217SLuca Weiss .width = 4, 406*f40b5217SLuca Weiss .clkr.hw.init = &(const struct clk_init_data) { 407*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_link_div_clk_src", 408*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 409*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 410*f40b5217SLuca Weiss }, 411*f40b5217SLuca Weiss .num_parents = 1, 412*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 413*f40b5217SLuca Weiss .ops = &clk_regmap_div_ro_ops, 414*f40b5217SLuca Weiss }, 415*f40b5217SLuca Weiss }; 416*f40b5217SLuca Weiss 417*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_accu_clk = { 418*f40b5217SLuca Weiss .halt_reg = 0xe050, 419*f40b5217SLuca Weiss .halt_check = BRANCH_HALT_VOTED, 420*f40b5217SLuca Weiss .clkr = { 421*f40b5217SLuca Weiss .enable_reg = 0xe050, 422*f40b5217SLuca Weiss .enable_mask = BIT(0), 423*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 424*f40b5217SLuca Weiss .name = "disp_cc_mdss_accu_clk", 425*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 426*f40b5217SLuca Weiss &disp_cc_xo_clk_src.clkr.hw, 427*f40b5217SLuca Weiss }, 428*f40b5217SLuca Weiss .num_parents = 1, 429*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 430*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 431*f40b5217SLuca Weiss }, 432*f40b5217SLuca Weiss }, 433*f40b5217SLuca Weiss }; 434*f40b5217SLuca Weiss 435*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_ahb1_clk = { 436*f40b5217SLuca Weiss .halt_reg = 0xa020, 437*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 438*f40b5217SLuca Weiss .clkr = { 439*f40b5217SLuca Weiss .enable_reg = 0xa020, 440*f40b5217SLuca Weiss .enable_mask = BIT(0), 441*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 442*f40b5217SLuca Weiss .name = "disp_cc_mdss_ahb1_clk", 443*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 444*f40b5217SLuca Weiss &disp_cc_mdss_ahb_clk_src.clkr.hw, 445*f40b5217SLuca Weiss }, 446*f40b5217SLuca Weiss .num_parents = 1, 447*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 448*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 449*f40b5217SLuca Weiss }, 450*f40b5217SLuca Weiss }, 451*f40b5217SLuca Weiss }; 452*f40b5217SLuca Weiss 453*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_ahb_clk = { 454*f40b5217SLuca Weiss .halt_reg = 0x804c, 455*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 456*f40b5217SLuca Weiss .clkr = { 457*f40b5217SLuca Weiss .enable_reg = 0x804c, 458*f40b5217SLuca Weiss .enable_mask = BIT(0), 459*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 460*f40b5217SLuca Weiss .name = "disp_cc_mdss_ahb_clk", 461*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 462*f40b5217SLuca Weiss &disp_cc_mdss_ahb_clk_src.clkr.hw, 463*f40b5217SLuca Weiss }, 464*f40b5217SLuca Weiss .num_parents = 1, 465*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 466*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 467*f40b5217SLuca Weiss }, 468*f40b5217SLuca Weiss }, 469*f40b5217SLuca Weiss }; 470*f40b5217SLuca Weiss 471*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_byte0_clk = { 472*f40b5217SLuca Weiss .halt_reg = 0x8024, 473*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 474*f40b5217SLuca Weiss .clkr = { 475*f40b5217SLuca Weiss .enable_reg = 0x8024, 476*f40b5217SLuca Weiss .enable_mask = BIT(0), 477*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 478*f40b5217SLuca Weiss .name = "disp_cc_mdss_byte0_clk", 479*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 480*f40b5217SLuca Weiss &disp_cc_mdss_byte0_clk_src.clkr.hw, 481*f40b5217SLuca Weiss }, 482*f40b5217SLuca Weiss .num_parents = 1, 483*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 484*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 485*f40b5217SLuca Weiss }, 486*f40b5217SLuca Weiss }, 487*f40b5217SLuca Weiss }; 488*f40b5217SLuca Weiss 489*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_byte0_intf_clk = { 490*f40b5217SLuca Weiss .halt_reg = 0x8028, 491*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 492*f40b5217SLuca Weiss .clkr = { 493*f40b5217SLuca Weiss .enable_reg = 0x8028, 494*f40b5217SLuca Weiss .enable_mask = BIT(0), 495*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 496*f40b5217SLuca Weiss .name = "disp_cc_mdss_byte0_intf_clk", 497*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 498*f40b5217SLuca Weiss &disp_cc_mdss_byte0_div_clk_src.clkr.hw, 499*f40b5217SLuca Weiss }, 500*f40b5217SLuca Weiss .num_parents = 1, 501*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 502*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 503*f40b5217SLuca Weiss }, 504*f40b5217SLuca Weiss }, 505*f40b5217SLuca Weiss }; 506*f40b5217SLuca Weiss 507*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_aux_clk = { 508*f40b5217SLuca Weiss .halt_reg = 0x8048, 509*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 510*f40b5217SLuca Weiss .clkr = { 511*f40b5217SLuca Weiss .enable_reg = 0x8048, 512*f40b5217SLuca Weiss .enable_mask = BIT(0), 513*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 514*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_aux_clk", 515*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 516*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_aux_clk_src.clkr.hw, 517*f40b5217SLuca Weiss }, 518*f40b5217SLuca Weiss .num_parents = 1, 519*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 520*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 521*f40b5217SLuca Weiss }, 522*f40b5217SLuca Weiss }, 523*f40b5217SLuca Weiss }; 524*f40b5217SLuca Weiss 525*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = { 526*f40b5217SLuca Weiss .halt_reg = 0x803c, 527*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 528*f40b5217SLuca Weiss .clkr = { 529*f40b5217SLuca Weiss .enable_reg = 0x803c, 530*f40b5217SLuca Weiss .enable_mask = BIT(0), 531*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 532*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_crypto_clk", 533*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 534*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 535*f40b5217SLuca Weiss }, 536*f40b5217SLuca Weiss .num_parents = 1, 537*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 538*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 539*f40b5217SLuca Weiss }, 540*f40b5217SLuca Weiss }, 541*f40b5217SLuca Weiss }; 542*f40b5217SLuca Weiss 543*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_link_clk = { 544*f40b5217SLuca Weiss .halt_reg = 0x8030, 545*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 546*f40b5217SLuca Weiss .clkr = { 547*f40b5217SLuca Weiss .enable_reg = 0x8030, 548*f40b5217SLuca Weiss .enable_mask = BIT(0), 549*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 550*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_link_clk", 551*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 552*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 553*f40b5217SLuca Weiss }, 554*f40b5217SLuca Weiss .num_parents = 1, 555*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 556*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 557*f40b5217SLuca Weiss }, 558*f40b5217SLuca Weiss }, 559*f40b5217SLuca Weiss }; 560*f40b5217SLuca Weiss 561*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = { 562*f40b5217SLuca Weiss .halt_reg = 0x8038, 563*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 564*f40b5217SLuca Weiss .clkr = { 565*f40b5217SLuca Weiss .enable_reg = 0x8038, 566*f40b5217SLuca Weiss .enable_mask = BIT(0), 567*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 568*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_link_intf_clk", 569*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 570*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 571*f40b5217SLuca Weiss }, 572*f40b5217SLuca Weiss .num_parents = 1, 573*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 574*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 575*f40b5217SLuca Weiss }, 576*f40b5217SLuca Weiss }, 577*f40b5217SLuca Weiss }; 578*f40b5217SLuca Weiss 579*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = { 580*f40b5217SLuca Weiss .halt_reg = 0x8040, 581*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 582*f40b5217SLuca Weiss .clkr = { 583*f40b5217SLuca Weiss .enable_reg = 0x8040, 584*f40b5217SLuca Weiss .enable_mask = BIT(0), 585*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 586*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_pixel0_clk", 587*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 588*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw, 589*f40b5217SLuca Weiss }, 590*f40b5217SLuca Weiss .num_parents = 1, 591*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 592*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 593*f40b5217SLuca Weiss }, 594*f40b5217SLuca Weiss }, 595*f40b5217SLuca Weiss }; 596*f40b5217SLuca Weiss 597*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = { 598*f40b5217SLuca Weiss .halt_reg = 0x8044, 599*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 600*f40b5217SLuca Weiss .clkr = { 601*f40b5217SLuca Weiss .enable_reg = 0x8044, 602*f40b5217SLuca Weiss .enable_mask = BIT(0), 603*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 604*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_pixel1_clk", 605*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 606*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw, 607*f40b5217SLuca Weiss }, 608*f40b5217SLuca Weiss .num_parents = 1, 609*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 610*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 611*f40b5217SLuca Weiss }, 612*f40b5217SLuca Weiss }, 613*f40b5217SLuca Weiss }; 614*f40b5217SLuca Weiss 615*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = { 616*f40b5217SLuca Weiss .halt_reg = 0x8034, 617*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 618*f40b5217SLuca Weiss .clkr = { 619*f40b5217SLuca Weiss .enable_reg = 0x8034, 620*f40b5217SLuca Weiss .enable_mask = BIT(0), 621*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 622*f40b5217SLuca Weiss .name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk", 623*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 624*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 625*f40b5217SLuca Weiss }, 626*f40b5217SLuca Weiss .num_parents = 1, 627*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 628*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 629*f40b5217SLuca Weiss }, 630*f40b5217SLuca Weiss }, 631*f40b5217SLuca Weiss }; 632*f40b5217SLuca Weiss 633*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_esc0_clk = { 634*f40b5217SLuca Weiss .halt_reg = 0x802c, 635*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 636*f40b5217SLuca Weiss .clkr = { 637*f40b5217SLuca Weiss .enable_reg = 0x802c, 638*f40b5217SLuca Weiss .enable_mask = BIT(0), 639*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 640*f40b5217SLuca Weiss .name = "disp_cc_mdss_esc0_clk", 641*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 642*f40b5217SLuca Weiss &disp_cc_mdss_esc0_clk_src.clkr.hw, 643*f40b5217SLuca Weiss }, 644*f40b5217SLuca Weiss .num_parents = 1, 645*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 646*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 647*f40b5217SLuca Weiss }, 648*f40b5217SLuca Weiss }, 649*f40b5217SLuca Weiss }; 650*f40b5217SLuca Weiss 651*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp1_clk = { 652*f40b5217SLuca Weiss .halt_reg = 0xa004, 653*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 654*f40b5217SLuca Weiss .clkr = { 655*f40b5217SLuca Weiss .enable_reg = 0xa004, 656*f40b5217SLuca Weiss .enable_mask = BIT(0), 657*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 658*f40b5217SLuca Weiss .name = "disp_cc_mdss_mdp1_clk", 659*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 660*f40b5217SLuca Weiss &disp_cc_mdss_mdp_clk_src.clkr.hw, 661*f40b5217SLuca Weiss }, 662*f40b5217SLuca Weiss .num_parents = 1, 663*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 664*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 665*f40b5217SLuca Weiss }, 666*f40b5217SLuca Weiss }, 667*f40b5217SLuca Weiss }; 668*f40b5217SLuca Weiss 669*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_clk = { 670*f40b5217SLuca Weiss .halt_reg = 0x8008, 671*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 672*f40b5217SLuca Weiss .clkr = { 673*f40b5217SLuca Weiss .enable_reg = 0x8008, 674*f40b5217SLuca Weiss .enable_mask = BIT(0), 675*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 676*f40b5217SLuca Weiss .name = "disp_cc_mdss_mdp_clk", 677*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 678*f40b5217SLuca Weiss &disp_cc_mdss_mdp_clk_src.clkr.hw, 679*f40b5217SLuca Weiss }, 680*f40b5217SLuca Weiss .num_parents = 1, 681*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 682*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 683*f40b5217SLuca Weiss }, 684*f40b5217SLuca Weiss }, 685*f40b5217SLuca Weiss }; 686*f40b5217SLuca Weiss 687*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_lut1_clk = { 688*f40b5217SLuca Weiss .halt_reg = 0xa010, 689*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 690*f40b5217SLuca Weiss .clkr = { 691*f40b5217SLuca Weiss .enable_reg = 0xa010, 692*f40b5217SLuca Weiss .enable_mask = BIT(0), 693*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 694*f40b5217SLuca Weiss .name = "disp_cc_mdss_mdp_lut1_clk", 695*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 696*f40b5217SLuca Weiss &disp_cc_mdss_mdp_clk_src.clkr.hw, 697*f40b5217SLuca Weiss }, 698*f40b5217SLuca Weiss .num_parents = 1, 699*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 700*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 701*f40b5217SLuca Weiss }, 702*f40b5217SLuca Weiss }, 703*f40b5217SLuca Weiss }; 704*f40b5217SLuca Weiss 705*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_mdp_lut_clk = { 706*f40b5217SLuca Weiss .halt_reg = 0x8014, 707*f40b5217SLuca Weiss .halt_check = BRANCH_HALT_VOTED, 708*f40b5217SLuca Weiss .clkr = { 709*f40b5217SLuca Weiss .enable_reg = 0x8014, 710*f40b5217SLuca Weiss .enable_mask = BIT(0), 711*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 712*f40b5217SLuca Weiss .name = "disp_cc_mdss_mdp_lut_clk", 713*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 714*f40b5217SLuca Weiss &disp_cc_mdss_mdp_clk_src.clkr.hw, 715*f40b5217SLuca Weiss }, 716*f40b5217SLuca Weiss .num_parents = 1, 717*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 718*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 719*f40b5217SLuca Weiss }, 720*f40b5217SLuca Weiss }, 721*f40b5217SLuca Weiss }; 722*f40b5217SLuca Weiss 723*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { 724*f40b5217SLuca Weiss .halt_reg = 0xc004, 725*f40b5217SLuca Weiss .halt_check = BRANCH_HALT_VOTED, 726*f40b5217SLuca Weiss .clkr = { 727*f40b5217SLuca Weiss .enable_reg = 0xc004, 728*f40b5217SLuca Weiss .enable_mask = BIT(0), 729*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 730*f40b5217SLuca Weiss .name = "disp_cc_mdss_non_gdsc_ahb_clk", 731*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 732*f40b5217SLuca Weiss &disp_cc_mdss_ahb_clk_src.clkr.hw, 733*f40b5217SLuca Weiss }, 734*f40b5217SLuca Weiss .num_parents = 1, 735*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 736*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 737*f40b5217SLuca Weiss }, 738*f40b5217SLuca Weiss }, 739*f40b5217SLuca Weiss }; 740*f40b5217SLuca Weiss 741*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_pclk0_clk = { 742*f40b5217SLuca Weiss .halt_reg = 0x8004, 743*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 744*f40b5217SLuca Weiss .clkr = { 745*f40b5217SLuca Weiss .enable_reg = 0x8004, 746*f40b5217SLuca Weiss .enable_mask = BIT(0), 747*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 748*f40b5217SLuca Weiss .name = "disp_cc_mdss_pclk0_clk", 749*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 750*f40b5217SLuca Weiss &disp_cc_mdss_pclk0_clk_src.clkr.hw, 751*f40b5217SLuca Weiss }, 752*f40b5217SLuca Weiss .num_parents = 1, 753*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 754*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 755*f40b5217SLuca Weiss }, 756*f40b5217SLuca Weiss }, 757*f40b5217SLuca Weiss }; 758*f40b5217SLuca Weiss 759*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_rscc_ahb_clk = { 760*f40b5217SLuca Weiss .halt_reg = 0xc00c, 761*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 762*f40b5217SLuca Weiss .clkr = { 763*f40b5217SLuca Weiss .enable_reg = 0xc00c, 764*f40b5217SLuca Weiss .enable_mask = BIT(0), 765*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 766*f40b5217SLuca Weiss .name = "disp_cc_mdss_rscc_ahb_clk", 767*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 768*f40b5217SLuca Weiss &disp_cc_mdss_ahb_clk_src.clkr.hw, 769*f40b5217SLuca Weiss }, 770*f40b5217SLuca Weiss .num_parents = 1, 771*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 772*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 773*f40b5217SLuca Weiss }, 774*f40b5217SLuca Weiss }, 775*f40b5217SLuca Weiss }; 776*f40b5217SLuca Weiss 777*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { 778*f40b5217SLuca Weiss .halt_reg = 0xc008, 779*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 780*f40b5217SLuca Weiss .clkr = { 781*f40b5217SLuca Weiss .enable_reg = 0xc008, 782*f40b5217SLuca Weiss .enable_mask = BIT(0), 783*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 784*f40b5217SLuca Weiss .name = "disp_cc_mdss_rscc_vsync_clk", 785*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 786*f40b5217SLuca Weiss &disp_cc_mdss_vsync_clk_src.clkr.hw, 787*f40b5217SLuca Weiss }, 788*f40b5217SLuca Weiss .num_parents = 1, 789*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 790*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 791*f40b5217SLuca Weiss }, 792*f40b5217SLuca Weiss }, 793*f40b5217SLuca Weiss }; 794*f40b5217SLuca Weiss 795*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_vsync1_clk = { 796*f40b5217SLuca Weiss .halt_reg = 0xa01c, 797*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 798*f40b5217SLuca Weiss .clkr = { 799*f40b5217SLuca Weiss .enable_reg = 0xa01c, 800*f40b5217SLuca Weiss .enable_mask = BIT(0), 801*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 802*f40b5217SLuca Weiss .name = "disp_cc_mdss_vsync1_clk", 803*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 804*f40b5217SLuca Weiss &disp_cc_mdss_vsync_clk_src.clkr.hw, 805*f40b5217SLuca Weiss }, 806*f40b5217SLuca Weiss .num_parents = 1, 807*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 808*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 809*f40b5217SLuca Weiss }, 810*f40b5217SLuca Weiss }, 811*f40b5217SLuca Weiss }; 812*f40b5217SLuca Weiss 813*f40b5217SLuca Weiss static struct clk_branch disp_cc_mdss_vsync_clk = { 814*f40b5217SLuca Weiss .halt_reg = 0x8020, 815*f40b5217SLuca Weiss .halt_check = BRANCH_HALT, 816*f40b5217SLuca Weiss .clkr = { 817*f40b5217SLuca Weiss .enable_reg = 0x8020, 818*f40b5217SLuca Weiss .enable_mask = BIT(0), 819*f40b5217SLuca Weiss .hw.init = &(const struct clk_init_data) { 820*f40b5217SLuca Weiss .name = "disp_cc_mdss_vsync_clk", 821*f40b5217SLuca Weiss .parent_hws = (const struct clk_hw*[]) { 822*f40b5217SLuca Weiss &disp_cc_mdss_vsync_clk_src.clkr.hw, 823*f40b5217SLuca Weiss }, 824*f40b5217SLuca Weiss .num_parents = 1, 825*f40b5217SLuca Weiss .flags = CLK_SET_RATE_PARENT, 826*f40b5217SLuca Weiss .ops = &clk_branch2_ops, 827*f40b5217SLuca Weiss }, 828*f40b5217SLuca Weiss }, 829*f40b5217SLuca Weiss }; 830*f40b5217SLuca Weiss 831*f40b5217SLuca Weiss static struct gdsc disp_cc_mdss_core_gdsc = { 832*f40b5217SLuca Weiss .gdscr = 0x9000, 833*f40b5217SLuca Weiss .en_rest_wait_val = 0x2, 834*f40b5217SLuca Weiss .en_few_wait_val = 0x2, 835*f40b5217SLuca Weiss .clk_dis_wait_val = 0xf, 836*f40b5217SLuca Weiss .pd = { 837*f40b5217SLuca Weiss .name = "disp_cc_mdss_core_gdsc", 838*f40b5217SLuca Weiss }, 839*f40b5217SLuca Weiss .pwrsts = PWRSTS_OFF_ON, 840*f40b5217SLuca Weiss .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, 841*f40b5217SLuca Weiss }; 842*f40b5217SLuca Weiss 843*f40b5217SLuca Weiss static struct gdsc disp_cc_mdss_core_int2_gdsc = { 844*f40b5217SLuca Weiss .gdscr = 0xb000, 845*f40b5217SLuca Weiss .en_rest_wait_val = 0x2, 846*f40b5217SLuca Weiss .en_few_wait_val = 0x2, 847*f40b5217SLuca Weiss .clk_dis_wait_val = 0xf, 848*f40b5217SLuca Weiss .pd = { 849*f40b5217SLuca Weiss .name = "disp_cc_mdss_core_int2_gdsc", 850*f40b5217SLuca Weiss }, 851*f40b5217SLuca Weiss .pwrsts = PWRSTS_OFF_ON, 852*f40b5217SLuca Weiss .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, 853*f40b5217SLuca Weiss }; 854*f40b5217SLuca Weiss 855*f40b5217SLuca Weiss static struct clk_regmap *disp_cc_milos_clocks[] = { 856*f40b5217SLuca Weiss [DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr, 857*f40b5217SLuca Weiss [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr, 858*f40b5217SLuca Weiss [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, 859*f40b5217SLuca Weiss [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, 860*f40b5217SLuca Weiss [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, 861*f40b5217SLuca Weiss [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, 862*f40b5217SLuca Weiss [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr, 863*f40b5217SLuca Weiss [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, 864*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr, 865*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr, 866*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr, 867*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr, 868*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr, 869*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr, 870*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr, 871*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr, 872*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr, 873*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr, 874*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr, 875*f40b5217SLuca Weiss [DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] = 876*f40b5217SLuca Weiss &disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr, 877*f40b5217SLuca Weiss [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, 878*f40b5217SLuca Weiss [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, 879*f40b5217SLuca Weiss [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr, 880*f40b5217SLuca Weiss [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, 881*f40b5217SLuca Weiss [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, 882*f40b5217SLuca Weiss [DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr, 883*f40b5217SLuca Weiss [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, 884*f40b5217SLuca Weiss [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, 885*f40b5217SLuca Weiss [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, 886*f40b5217SLuca Weiss [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, 887*f40b5217SLuca Weiss [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr, 888*f40b5217SLuca Weiss [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, 889*f40b5217SLuca Weiss [DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr, 890*f40b5217SLuca Weiss [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, 891*f40b5217SLuca Weiss [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, 892*f40b5217SLuca Weiss [DISP_CC_PLL0] = &disp_cc_pll0.clkr, 893*f40b5217SLuca Weiss [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr, 894*f40b5217SLuca Weiss [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr, 895*f40b5217SLuca Weiss }; 896*f40b5217SLuca Weiss 897*f40b5217SLuca Weiss static const struct qcom_reset_map disp_cc_milos_resets[] = { 898*f40b5217SLuca Weiss [DISP_CC_MDSS_CORE_BCR] = { 0x8000 }, 899*f40b5217SLuca Weiss [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 }, 900*f40b5217SLuca Weiss [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 }, 901*f40b5217SLuca Weiss }; 902*f40b5217SLuca Weiss 903*f40b5217SLuca Weiss static struct gdsc *disp_cc_milos_gdscs[] = { 904*f40b5217SLuca Weiss [DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc, 905*f40b5217SLuca Weiss [DISP_CC_MDSS_CORE_INT2_GDSC] = &disp_cc_mdss_core_int2_gdsc, 906*f40b5217SLuca Weiss }; 907*f40b5217SLuca Weiss 908*f40b5217SLuca Weiss static struct clk_alpha_pll *disp_cc_milos_plls[] = { 909*f40b5217SLuca Weiss &disp_cc_pll0, 910*f40b5217SLuca Weiss }; 911*f40b5217SLuca Weiss 912*f40b5217SLuca Weiss static u32 disp_cc_milos_critical_cbcrs[] = { 913*f40b5217SLuca Weiss 0xe06c, /* DISP_CC_SLEEP_CLK */ 914*f40b5217SLuca Weiss 0xe04c, /* DISP_CC_XO_CLK */ 915*f40b5217SLuca Weiss }; 916*f40b5217SLuca Weiss 917*f40b5217SLuca Weiss static const struct regmap_config disp_cc_milos_regmap_config = { 918*f40b5217SLuca Weiss .reg_bits = 32, 919*f40b5217SLuca Weiss .reg_stride = 4, 920*f40b5217SLuca Weiss .val_bits = 32, 921*f40b5217SLuca Weiss .max_register = 0x11008, 922*f40b5217SLuca Weiss .fast_io = true, 923*f40b5217SLuca Weiss }; 924*f40b5217SLuca Weiss 925*f40b5217SLuca Weiss static void disp_cc_milos_clk_regs_configure(struct device *dev, struct regmap *regmap) 926*f40b5217SLuca Weiss { 927*f40b5217SLuca Weiss /* Enable clock gating for MDP clocks */ 928*f40b5217SLuca Weiss regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); 929*f40b5217SLuca Weiss } 930*f40b5217SLuca Weiss 931*f40b5217SLuca Weiss 932*f40b5217SLuca Weiss static struct qcom_cc_driver_data disp_cc_milos_driver_data = { 933*f40b5217SLuca Weiss .alpha_plls = disp_cc_milos_plls, 934*f40b5217SLuca Weiss .num_alpha_plls = ARRAY_SIZE(disp_cc_milos_plls), 935*f40b5217SLuca Weiss .clk_cbcrs = disp_cc_milos_critical_cbcrs, 936*f40b5217SLuca Weiss .num_clk_cbcrs = ARRAY_SIZE(disp_cc_milos_critical_cbcrs), 937*f40b5217SLuca Weiss .clk_regs_configure = disp_cc_milos_clk_regs_configure, 938*f40b5217SLuca Weiss }; 939*f40b5217SLuca Weiss 940*f40b5217SLuca Weiss static struct qcom_cc_desc disp_cc_milos_desc = { 941*f40b5217SLuca Weiss .config = &disp_cc_milos_regmap_config, 942*f40b5217SLuca Weiss .clks = disp_cc_milos_clocks, 943*f40b5217SLuca Weiss .num_clks = ARRAY_SIZE(disp_cc_milos_clocks), 944*f40b5217SLuca Weiss .resets = disp_cc_milos_resets, 945*f40b5217SLuca Weiss .num_resets = ARRAY_SIZE(disp_cc_milos_resets), 946*f40b5217SLuca Weiss .gdscs = disp_cc_milos_gdscs, 947*f40b5217SLuca Weiss .num_gdscs = ARRAY_SIZE(disp_cc_milos_gdscs), 948*f40b5217SLuca Weiss .use_rpm = true, 949*f40b5217SLuca Weiss .driver_data = &disp_cc_milos_driver_data, 950*f40b5217SLuca Weiss }; 951*f40b5217SLuca Weiss 952*f40b5217SLuca Weiss static const struct of_device_id disp_cc_milos_match_table[] = { 953*f40b5217SLuca Weiss { .compatible = "qcom,milos-dispcc" }, 954*f40b5217SLuca Weiss { } 955*f40b5217SLuca Weiss }; 956*f40b5217SLuca Weiss MODULE_DEVICE_TABLE(of, disp_cc_milos_match_table); 957*f40b5217SLuca Weiss 958*f40b5217SLuca Weiss static int disp_cc_milos_probe(struct platform_device *pdev) 959*f40b5217SLuca Weiss { 960*f40b5217SLuca Weiss return qcom_cc_probe(pdev, &disp_cc_milos_desc); 961*f40b5217SLuca Weiss } 962*f40b5217SLuca Weiss 963*f40b5217SLuca Weiss static struct platform_driver disp_cc_milos_driver = { 964*f40b5217SLuca Weiss .probe = disp_cc_milos_probe, 965*f40b5217SLuca Weiss .driver = { 966*f40b5217SLuca Weiss .name = "disp_cc-milos", 967*f40b5217SLuca Weiss .of_match_table = disp_cc_milos_match_table, 968*f40b5217SLuca Weiss }, 969*f40b5217SLuca Weiss }; 970*f40b5217SLuca Weiss 971*f40b5217SLuca Weiss module_platform_driver(disp_cc_milos_driver); 972*f40b5217SLuca Weiss 973*f40b5217SLuca Weiss MODULE_DESCRIPTION("QTI DISP_CC Milos Driver"); 974*f40b5217SLuca Weiss MODULE_LICENSE("GPL"); 975