18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 78c2ecf20Sopenharmony_ci#include <linux/module.h> 88c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 98c2ecf20Sopenharmony_ci#include <linux/regmap.h> 108c2ecf20Sopenharmony_ci#include <linux/reset-controller.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <dt-bindings/clock/qcom,dispcc-sdm845.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "clk-alpha-pll.h" 158c2ecf20Sopenharmony_ci#include "clk-branch.h" 168c2ecf20Sopenharmony_ci#include "clk-rcg.h" 178c2ecf20Sopenharmony_ci#include "clk-regmap-divider.h" 188c2ecf20Sopenharmony_ci#include "common.h" 198c2ecf20Sopenharmony_ci#include "gdsc.h" 208c2ecf20Sopenharmony_ci#include "reset.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cienum { 238c2ecf20Sopenharmony_ci P_BI_TCXO, 248c2ecf20Sopenharmony_ci P_CORE_BI_PLL_TEST_SE, 258c2ecf20Sopenharmony_ci P_DISP_CC_PLL0_OUT_MAIN, 268c2ecf20Sopenharmony_ci P_DSI0_PHY_PLL_OUT_BYTECLK, 278c2ecf20Sopenharmony_ci P_DSI0_PHY_PLL_OUT_DSICLK, 288c2ecf20Sopenharmony_ci P_DSI1_PHY_PLL_OUT_BYTECLK, 298c2ecf20Sopenharmony_ci P_DSI1_PHY_PLL_OUT_DSICLK, 308c2ecf20Sopenharmony_ci P_GPLL0_OUT_MAIN, 318c2ecf20Sopenharmony_ci P_GPLL0_OUT_MAIN_DIV, 328c2ecf20Sopenharmony_ci P_DP_PHY_PLL_LINK_CLK, 338c2ecf20Sopenharmony_ci P_DP_PHY_PLL_VCO_DIV_CLK, 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic const struct parent_map disp_cc_parent_map_0[] = { 378c2ecf20Sopenharmony_ci { P_BI_TCXO, 0 }, 388c2ecf20Sopenharmony_ci { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 }, 398c2ecf20Sopenharmony_ci { P_DSI1_PHY_PLL_OUT_BYTECLK, 2 }, 408c2ecf20Sopenharmony_ci { P_CORE_BI_PLL_TEST_SE, 7 }, 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistatic const char * const disp_cc_parent_names_0[] = { 448c2ecf20Sopenharmony_ci "bi_tcxo", 458c2ecf20Sopenharmony_ci "dsi0_phy_pll_out_byteclk", 468c2ecf20Sopenharmony_ci "dsi1_phy_pll_out_byteclk", 478c2ecf20Sopenharmony_ci "core_bi_pll_test_se", 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic const struct parent_map disp_cc_parent_map_1[] = { 518c2ecf20Sopenharmony_ci { P_BI_TCXO, 0 }, 528c2ecf20Sopenharmony_ci { P_DP_PHY_PLL_LINK_CLK, 1 }, 538c2ecf20Sopenharmony_ci { P_DP_PHY_PLL_VCO_DIV_CLK, 2 }, 548c2ecf20Sopenharmony_ci { P_CORE_BI_PLL_TEST_SE, 7 }, 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic const char * const disp_cc_parent_names_1[] = { 588c2ecf20Sopenharmony_ci "bi_tcxo", 598c2ecf20Sopenharmony_ci "dp_link_clk_divsel_ten", 608c2ecf20Sopenharmony_ci "dp_vco_divided_clk_src_mux", 618c2ecf20Sopenharmony_ci "core_bi_pll_test_se", 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistatic const struct parent_map disp_cc_parent_map_2[] = { 658c2ecf20Sopenharmony_ci { P_BI_TCXO, 0 }, 668c2ecf20Sopenharmony_ci { P_CORE_BI_PLL_TEST_SE, 7 }, 678c2ecf20Sopenharmony_ci}; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistatic const char * const disp_cc_parent_names_2[] = { 708c2ecf20Sopenharmony_ci "bi_tcxo", 718c2ecf20Sopenharmony_ci "core_bi_pll_test_se", 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic const struct parent_map disp_cc_parent_map_3[] = { 758c2ecf20Sopenharmony_ci { P_BI_TCXO, 0 }, 768c2ecf20Sopenharmony_ci { P_DISP_CC_PLL0_OUT_MAIN, 1 }, 778c2ecf20Sopenharmony_ci { P_GPLL0_OUT_MAIN, 4 }, 788c2ecf20Sopenharmony_ci { P_GPLL0_OUT_MAIN_DIV, 5 }, 798c2ecf20Sopenharmony_ci { P_CORE_BI_PLL_TEST_SE, 7 }, 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_cistatic const char * const disp_cc_parent_names_3[] = { 838c2ecf20Sopenharmony_ci "bi_tcxo", 848c2ecf20Sopenharmony_ci "disp_cc_pll0", 858c2ecf20Sopenharmony_ci "gcc_disp_gpll0_clk_src", 868c2ecf20Sopenharmony_ci "gcc_disp_gpll0_div_clk_src", 878c2ecf20Sopenharmony_ci "core_bi_pll_test_se", 888c2ecf20Sopenharmony_ci}; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistatic const struct parent_map disp_cc_parent_map_4[] = { 918c2ecf20Sopenharmony_ci { P_BI_TCXO, 0 }, 928c2ecf20Sopenharmony_ci { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, 938c2ecf20Sopenharmony_ci { P_DSI1_PHY_PLL_OUT_DSICLK, 2 }, 948c2ecf20Sopenharmony_ci { P_CORE_BI_PLL_TEST_SE, 7 }, 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistatic const char * const disp_cc_parent_names_4[] = { 988c2ecf20Sopenharmony_ci "bi_tcxo", 998c2ecf20Sopenharmony_ci "dsi0_phy_pll_out_dsiclk", 1008c2ecf20Sopenharmony_ci "dsi1_phy_pll_out_dsiclk", 1018c2ecf20Sopenharmony_ci "core_bi_pll_test_se", 1028c2ecf20Sopenharmony_ci}; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistatic struct clk_alpha_pll disp_cc_pll0 = { 1058c2ecf20Sopenharmony_ci .offset = 0x0, 1068c2ecf20Sopenharmony_ci .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 1078c2ecf20Sopenharmony_ci .clkr = { 1088c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 1098c2ecf20Sopenharmony_ci .name = "disp_cc_pll0", 1108c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ "bi_tcxo" }, 1118c2ecf20Sopenharmony_ci .num_parents = 1, 1128c2ecf20Sopenharmony_ci .ops = &clk_alpha_pll_fabia_ops, 1138c2ecf20Sopenharmony_ci }, 1148c2ecf20Sopenharmony_ci }, 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 1188c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { 1198c2ecf20Sopenharmony_ci .cmd_rcgr = 0x20d0, 1208c2ecf20Sopenharmony_ci .mnd_width = 0, 1218c2ecf20Sopenharmony_ci .hid_width = 5, 1228c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_0, 1238c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 1248c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte0_clk_src", 1258c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_0, 1268c2ecf20Sopenharmony_ci .num_parents = 4, 1278c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 1288c2ecf20Sopenharmony_ci .ops = &clk_byte2_ops, 1298c2ecf20Sopenharmony_ci }, 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 1338c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_byte1_clk_src = { 1348c2ecf20Sopenharmony_ci .cmd_rcgr = 0x20ec, 1358c2ecf20Sopenharmony_ci .mnd_width = 0, 1368c2ecf20Sopenharmony_ci .hid_width = 5, 1378c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_0, 1388c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 1398c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte1_clk_src", 1408c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_0, 1418c2ecf20Sopenharmony_ci .num_parents = 4, 1428c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 1438c2ecf20Sopenharmony_ci .ops = &clk_byte2_ops, 1448c2ecf20Sopenharmony_ci }, 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistatic const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = { 1488c2ecf20Sopenharmony_ci F(19200000, P_BI_TCXO, 1, 0, 0), 1498c2ecf20Sopenharmony_ci { } 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = { 1538c2ecf20Sopenharmony_ci .cmd_rcgr = 0x219c, 1548c2ecf20Sopenharmony_ci .mnd_width = 0, 1558c2ecf20Sopenharmony_ci .hid_width = 5, 1568c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_2, 1578c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src, 1588c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 1598c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_aux_clk_src", 1608c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_2, 1618c2ecf20Sopenharmony_ci .num_parents = 2, 1628c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 1638c2ecf20Sopenharmony_ci .ops = &clk_rcg2_ops, 1648c2ecf20Sopenharmony_ci }, 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = { 1688c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2154, 1698c2ecf20Sopenharmony_ci .mnd_width = 0, 1708c2ecf20Sopenharmony_ci .hid_width = 5, 1718c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_1, 1728c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 1738c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_crypto_clk_src", 1748c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_1, 1758c2ecf20Sopenharmony_ci .num_parents = 4, 1768c2ecf20Sopenharmony_ci .ops = &clk_byte2_ops, 1778c2ecf20Sopenharmony_ci }, 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = { 1818c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2138, 1828c2ecf20Sopenharmony_ci .mnd_width = 0, 1838c2ecf20Sopenharmony_ci .hid_width = 5, 1848c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_1, 1858c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 1868c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_link_clk_src", 1878c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_1, 1888c2ecf20Sopenharmony_ci .num_parents = 4, 1898c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 1908c2ecf20Sopenharmony_ci .ops = &clk_byte2_ops, 1918c2ecf20Sopenharmony_ci }, 1928c2ecf20Sopenharmony_ci}; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_dp_pixel1_clk_src = { 1958c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2184, 1968c2ecf20Sopenharmony_ci .mnd_width = 16, 1978c2ecf20Sopenharmony_ci .hid_width = 5, 1988c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_1, 1998c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2008c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_pixel1_clk_src", 2018c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_1, 2028c2ecf20Sopenharmony_ci .num_parents = 4, 2038c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 2048c2ecf20Sopenharmony_ci .ops = &clk_dp_ops, 2058c2ecf20Sopenharmony_ci }, 2068c2ecf20Sopenharmony_ci}; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = { 2098c2ecf20Sopenharmony_ci .cmd_rcgr = 0x216c, 2108c2ecf20Sopenharmony_ci .mnd_width = 16, 2118c2ecf20Sopenharmony_ci .hid_width = 5, 2128c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_1, 2138c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2148c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_pixel_clk_src", 2158c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_1, 2168c2ecf20Sopenharmony_ci .num_parents = 4, 2178c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 2188c2ecf20Sopenharmony_ci .ops = &clk_dp_ops, 2198c2ecf20Sopenharmony_ci }, 2208c2ecf20Sopenharmony_ci}; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = { 2238c2ecf20Sopenharmony_ci F(19200000, P_BI_TCXO, 1, 0, 0), 2248c2ecf20Sopenharmony_ci { } 2258c2ecf20Sopenharmony_ci}; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { 2288c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2108, 2298c2ecf20Sopenharmony_ci .mnd_width = 0, 2308c2ecf20Sopenharmony_ci .hid_width = 5, 2318c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_0, 2328c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, 2338c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2348c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_esc0_clk_src", 2358c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_0, 2368c2ecf20Sopenharmony_ci .num_parents = 4, 2378c2ecf20Sopenharmony_ci .ops = &clk_rcg2_ops, 2388c2ecf20Sopenharmony_ci }, 2398c2ecf20Sopenharmony_ci}; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_esc1_clk_src = { 2428c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2120, 2438c2ecf20Sopenharmony_ci .mnd_width = 0, 2448c2ecf20Sopenharmony_ci .hid_width = 5, 2458c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_0, 2468c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, 2478c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2488c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_esc1_clk_src", 2498c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_0, 2508c2ecf20Sopenharmony_ci .num_parents = 4, 2518c2ecf20Sopenharmony_ci .ops = &clk_rcg2_ops, 2528c2ecf20Sopenharmony_ci }, 2538c2ecf20Sopenharmony_ci}; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_cistatic const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { 2568c2ecf20Sopenharmony_ci F(19200000, P_BI_TCXO, 1, 0, 0), 2578c2ecf20Sopenharmony_ci F(85714286, P_GPLL0_OUT_MAIN, 7, 0, 0), 2588c2ecf20Sopenharmony_ci F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 2598c2ecf20Sopenharmony_ci F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 2608c2ecf20Sopenharmony_ci F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0), 2618c2ecf20Sopenharmony_ci F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 2628c2ecf20Sopenharmony_ci F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 2638c2ecf20Sopenharmony_ci F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), 2648c2ecf20Sopenharmony_ci F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0), 2658c2ecf20Sopenharmony_ci { } 2668c2ecf20Sopenharmony_ci}; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { 2698c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2088, 2708c2ecf20Sopenharmony_ci .mnd_width = 0, 2718c2ecf20Sopenharmony_ci .hid_width = 5, 2728c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_3, 2738c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, 2748c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2758c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_mdp_clk_src", 2768c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_3, 2778c2ecf20Sopenharmony_ci .num_parents = 5, 2788c2ecf20Sopenharmony_ci .ops = &clk_rcg2_shared_ops, 2798c2ecf20Sopenharmony_ci }, 2808c2ecf20Sopenharmony_ci}; 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 2838c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { 2848c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2058, 2858c2ecf20Sopenharmony_ci .mnd_width = 8, 2868c2ecf20Sopenharmony_ci .hid_width = 5, 2878c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_4, 2888c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 2898c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_pclk0_clk_src", 2908c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_4, 2918c2ecf20Sopenharmony_ci .num_parents = 4, 2928c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 2938c2ecf20Sopenharmony_ci .ops = &clk_pixel_ops, 2948c2ecf20Sopenharmony_ci }, 2958c2ecf20Sopenharmony_ci}; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 2988c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = { 2998c2ecf20Sopenharmony_ci .cmd_rcgr = 0x2070, 3008c2ecf20Sopenharmony_ci .mnd_width = 8, 3018c2ecf20Sopenharmony_ci .hid_width = 5, 3028c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_4, 3038c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 3048c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_pclk1_clk_src", 3058c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_4, 3068c2ecf20Sopenharmony_ci .num_parents = 4, 3078c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 3088c2ecf20Sopenharmony_ci .ops = &clk_pixel_ops, 3098c2ecf20Sopenharmony_ci }, 3108c2ecf20Sopenharmony_ci}; 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistatic const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = { 3138c2ecf20Sopenharmony_ci F(19200000, P_BI_TCXO, 1, 0, 0), 3148c2ecf20Sopenharmony_ci F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0), 3158c2ecf20Sopenharmony_ci F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 3168c2ecf20Sopenharmony_ci F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), 3178c2ecf20Sopenharmony_ci F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0), 3188c2ecf20Sopenharmony_ci { } 3198c2ecf20Sopenharmony_ci}; 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_rot_clk_src = { 3228c2ecf20Sopenharmony_ci .cmd_rcgr = 0x20a0, 3238c2ecf20Sopenharmony_ci .mnd_width = 0, 3248c2ecf20Sopenharmony_ci .hid_width = 5, 3258c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_3, 3268c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src, 3278c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 3288c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_rot_clk_src", 3298c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_3, 3308c2ecf20Sopenharmony_ci .num_parents = 5, 3318c2ecf20Sopenharmony_ci .ops = &clk_rcg2_shared_ops, 3328c2ecf20Sopenharmony_ci }, 3338c2ecf20Sopenharmony_ci}; 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_cistatic struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { 3368c2ecf20Sopenharmony_ci .cmd_rcgr = 0x20b8, 3378c2ecf20Sopenharmony_ci .mnd_width = 0, 3388c2ecf20Sopenharmony_ci .hid_width = 5, 3398c2ecf20Sopenharmony_ci .parent_map = disp_cc_parent_map_2, 3408c2ecf20Sopenharmony_ci .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, 3418c2ecf20Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 3428c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_vsync_clk_src", 3438c2ecf20Sopenharmony_ci .parent_names = disp_cc_parent_names_2, 3448c2ecf20Sopenharmony_ci .num_parents = 2, 3458c2ecf20Sopenharmony_ci .ops = &clk_rcg2_ops, 3468c2ecf20Sopenharmony_ci }, 3478c2ecf20Sopenharmony_ci}; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_ahb_clk = { 3508c2ecf20Sopenharmony_ci .halt_reg = 0x4004, 3518c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 3528c2ecf20Sopenharmony_ci .clkr = { 3538c2ecf20Sopenharmony_ci .enable_reg = 0x4004, 3548c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 3558c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 3568c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_ahb_clk", 3578c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 3588c2ecf20Sopenharmony_ci }, 3598c2ecf20Sopenharmony_ci }, 3608c2ecf20Sopenharmony_ci}; 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_axi_clk = { 3638c2ecf20Sopenharmony_ci .halt_reg = 0x4008, 3648c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 3658c2ecf20Sopenharmony_ci .clkr = { 3668c2ecf20Sopenharmony_ci .enable_reg = 0x4008, 3678c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 3688c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 3698c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_axi_clk", 3708c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 3718c2ecf20Sopenharmony_ci }, 3728c2ecf20Sopenharmony_ci }, 3738c2ecf20Sopenharmony_ci}; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 3768c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_byte0_clk = { 3778c2ecf20Sopenharmony_ci .halt_reg = 0x2028, 3788c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 3798c2ecf20Sopenharmony_ci .clkr = { 3808c2ecf20Sopenharmony_ci .enable_reg = 0x2028, 3818c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 3828c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 3838c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte0_clk", 3848c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 3858c2ecf20Sopenharmony_ci "disp_cc_mdss_byte0_clk_src", 3868c2ecf20Sopenharmony_ci }, 3878c2ecf20Sopenharmony_ci .num_parents = 1, 3888c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 3898c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 3908c2ecf20Sopenharmony_ci }, 3918c2ecf20Sopenharmony_ci }, 3928c2ecf20Sopenharmony_ci}; 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 3958c2ecf20Sopenharmony_cistatic struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { 3968c2ecf20Sopenharmony_ci .reg = 0x20e8, 3978c2ecf20Sopenharmony_ci .shift = 0, 3988c2ecf20Sopenharmony_ci .width = 2, 3998c2ecf20Sopenharmony_ci .clkr = { 4008c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4018c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte0_div_clk_src", 4028c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4038c2ecf20Sopenharmony_ci "disp_cc_mdss_byte0_clk_src", 4048c2ecf20Sopenharmony_ci }, 4058c2ecf20Sopenharmony_ci .num_parents = 1, 4068c2ecf20Sopenharmony_ci .ops = &clk_regmap_div_ops, 4078c2ecf20Sopenharmony_ci }, 4088c2ecf20Sopenharmony_ci }, 4098c2ecf20Sopenharmony_ci}; 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 4128c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_byte0_intf_clk = { 4138c2ecf20Sopenharmony_ci .halt_reg = 0x202c, 4148c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 4158c2ecf20Sopenharmony_ci .clkr = { 4168c2ecf20Sopenharmony_ci .enable_reg = 0x202c, 4178c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 4188c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4198c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte0_intf_clk", 4208c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4218c2ecf20Sopenharmony_ci "disp_cc_mdss_byte0_div_clk_src", 4228c2ecf20Sopenharmony_ci }, 4238c2ecf20Sopenharmony_ci .num_parents = 1, 4248c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 4258c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 4268c2ecf20Sopenharmony_ci }, 4278c2ecf20Sopenharmony_ci }, 4288c2ecf20Sopenharmony_ci}; 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 4318c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_byte1_clk = { 4328c2ecf20Sopenharmony_ci .halt_reg = 0x2030, 4338c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 4348c2ecf20Sopenharmony_ci .clkr = { 4358c2ecf20Sopenharmony_ci .enable_reg = 0x2030, 4368c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 4378c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4388c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte1_clk", 4398c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4408c2ecf20Sopenharmony_ci "disp_cc_mdss_byte1_clk_src", 4418c2ecf20Sopenharmony_ci }, 4428c2ecf20Sopenharmony_ci .num_parents = 1, 4438c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 4448c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 4458c2ecf20Sopenharmony_ci }, 4468c2ecf20Sopenharmony_ci }, 4478c2ecf20Sopenharmony_ci}; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 4508c2ecf20Sopenharmony_cistatic struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = { 4518c2ecf20Sopenharmony_ci .reg = 0x2104, 4528c2ecf20Sopenharmony_ci .shift = 0, 4538c2ecf20Sopenharmony_ci .width = 2, 4548c2ecf20Sopenharmony_ci .clkr = { 4558c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4568c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte1_div_clk_src", 4578c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4588c2ecf20Sopenharmony_ci "disp_cc_mdss_byte1_clk_src", 4598c2ecf20Sopenharmony_ci }, 4608c2ecf20Sopenharmony_ci .num_parents = 1, 4618c2ecf20Sopenharmony_ci .ops = &clk_regmap_div_ops, 4628c2ecf20Sopenharmony_ci }, 4638c2ecf20Sopenharmony_ci }, 4648c2ecf20Sopenharmony_ci}; 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 4678c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_byte1_intf_clk = { 4688c2ecf20Sopenharmony_ci .halt_reg = 0x2034, 4698c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 4708c2ecf20Sopenharmony_ci .clkr = { 4718c2ecf20Sopenharmony_ci .enable_reg = 0x2034, 4728c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 4738c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4748c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_byte1_intf_clk", 4758c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4768c2ecf20Sopenharmony_ci "disp_cc_mdss_byte1_div_clk_src", 4778c2ecf20Sopenharmony_ci }, 4788c2ecf20Sopenharmony_ci .num_parents = 1, 4798c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 4808c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 4818c2ecf20Sopenharmony_ci }, 4828c2ecf20Sopenharmony_ci }, 4838c2ecf20Sopenharmony_ci}; 4848c2ecf20Sopenharmony_ci 4858c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_aux_clk = { 4868c2ecf20Sopenharmony_ci .halt_reg = 0x2054, 4878c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 4888c2ecf20Sopenharmony_ci .clkr = { 4898c2ecf20Sopenharmony_ci .enable_reg = 0x2054, 4908c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 4918c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4928c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_aux_clk", 4938c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 4948c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_aux_clk_src", 4958c2ecf20Sopenharmony_ci }, 4968c2ecf20Sopenharmony_ci .num_parents = 1, 4978c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 4988c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 4998c2ecf20Sopenharmony_ci }, 5008c2ecf20Sopenharmony_ci }, 5018c2ecf20Sopenharmony_ci}; 5028c2ecf20Sopenharmony_ci 5038c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_crypto_clk = { 5048c2ecf20Sopenharmony_ci .halt_reg = 0x2048, 5058c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5068c2ecf20Sopenharmony_ci .clkr = { 5078c2ecf20Sopenharmony_ci .enable_reg = 0x2048, 5088c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5098c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 5108c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_crypto_clk", 5118c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 5128c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_crypto_clk_src", 5138c2ecf20Sopenharmony_ci }, 5148c2ecf20Sopenharmony_ci .num_parents = 1, 5158c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 5168c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 5178c2ecf20Sopenharmony_ci }, 5188c2ecf20Sopenharmony_ci }, 5198c2ecf20Sopenharmony_ci}; 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_link_clk = { 5228c2ecf20Sopenharmony_ci .halt_reg = 0x2040, 5238c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5248c2ecf20Sopenharmony_ci .clkr = { 5258c2ecf20Sopenharmony_ci .enable_reg = 0x2040, 5268c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5278c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 5288c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_link_clk", 5298c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 5308c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_link_clk_src", 5318c2ecf20Sopenharmony_ci }, 5328c2ecf20Sopenharmony_ci .num_parents = 1, 5338c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 5348c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 5358c2ecf20Sopenharmony_ci }, 5368c2ecf20Sopenharmony_ci }, 5378c2ecf20Sopenharmony_ci}; 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci/* reset state of disp_cc_mdss_dp_link_div_clk_src divider is 0x3 (div 4) */ 5408c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_link_intf_clk = { 5418c2ecf20Sopenharmony_ci .halt_reg = 0x2044, 5428c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5438c2ecf20Sopenharmony_ci .clkr = { 5448c2ecf20Sopenharmony_ci .enable_reg = 0x2044, 5458c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5468c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 5478c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_link_intf_clk", 5488c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 5498c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_link_clk_src", 5508c2ecf20Sopenharmony_ci }, 5518c2ecf20Sopenharmony_ci .num_parents = 1, 5528c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 5538c2ecf20Sopenharmony_ci }, 5548c2ecf20Sopenharmony_ci }, 5558c2ecf20Sopenharmony_ci}; 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_pixel1_clk = { 5588c2ecf20Sopenharmony_ci .halt_reg = 0x2050, 5598c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5608c2ecf20Sopenharmony_ci .clkr = { 5618c2ecf20Sopenharmony_ci .enable_reg = 0x2050, 5628c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5638c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 5648c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_pixel1_clk", 5658c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 5668c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_pixel1_clk_src", 5678c2ecf20Sopenharmony_ci }, 5688c2ecf20Sopenharmony_ci .num_parents = 1, 5698c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 5708c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 5718c2ecf20Sopenharmony_ci }, 5728c2ecf20Sopenharmony_ci }, 5738c2ecf20Sopenharmony_ci}; 5748c2ecf20Sopenharmony_ci 5758c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_dp_pixel_clk = { 5768c2ecf20Sopenharmony_ci .halt_reg = 0x204c, 5778c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5788c2ecf20Sopenharmony_ci .clkr = { 5798c2ecf20Sopenharmony_ci .enable_reg = 0x204c, 5808c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5818c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 5828c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_dp_pixel_clk", 5838c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 5848c2ecf20Sopenharmony_ci "disp_cc_mdss_dp_pixel_clk_src", 5858c2ecf20Sopenharmony_ci }, 5868c2ecf20Sopenharmony_ci .num_parents = 1, 5878c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 5888c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 5898c2ecf20Sopenharmony_ci }, 5908c2ecf20Sopenharmony_ci }, 5918c2ecf20Sopenharmony_ci}; 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_esc0_clk = { 5948c2ecf20Sopenharmony_ci .halt_reg = 0x2038, 5958c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 5968c2ecf20Sopenharmony_ci .clkr = { 5978c2ecf20Sopenharmony_ci .enable_reg = 0x2038, 5988c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 5998c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6008c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_esc0_clk", 6018c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6028c2ecf20Sopenharmony_ci "disp_cc_mdss_esc0_clk_src", 6038c2ecf20Sopenharmony_ci }, 6048c2ecf20Sopenharmony_ci .num_parents = 1, 6058c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 6068c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6078c2ecf20Sopenharmony_ci }, 6088c2ecf20Sopenharmony_ci }, 6098c2ecf20Sopenharmony_ci}; 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_esc1_clk = { 6128c2ecf20Sopenharmony_ci .halt_reg = 0x203c, 6138c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 6148c2ecf20Sopenharmony_ci .clkr = { 6158c2ecf20Sopenharmony_ci .enable_reg = 0x203c, 6168c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 6178c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6188c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_esc1_clk", 6198c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6208c2ecf20Sopenharmony_ci "disp_cc_mdss_esc1_clk_src", 6218c2ecf20Sopenharmony_ci }, 6228c2ecf20Sopenharmony_ci .num_parents = 1, 6238c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 6248c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6258c2ecf20Sopenharmony_ci }, 6268c2ecf20Sopenharmony_ci }, 6278c2ecf20Sopenharmony_ci}; 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_mdp_clk = { 6308c2ecf20Sopenharmony_ci .halt_reg = 0x200c, 6318c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 6328c2ecf20Sopenharmony_ci .clkr = { 6338c2ecf20Sopenharmony_ci .enable_reg = 0x200c, 6348c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 6358c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6368c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_mdp_clk", 6378c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6388c2ecf20Sopenharmony_ci "disp_cc_mdss_mdp_clk_src", 6398c2ecf20Sopenharmony_ci }, 6408c2ecf20Sopenharmony_ci .num_parents = 1, 6418c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 6428c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6438c2ecf20Sopenharmony_ci }, 6448c2ecf20Sopenharmony_ci }, 6458c2ecf20Sopenharmony_ci}; 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_mdp_lut_clk = { 6488c2ecf20Sopenharmony_ci .halt_reg = 0x201c, 6498c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 6508c2ecf20Sopenharmony_ci .clkr = { 6518c2ecf20Sopenharmony_ci .enable_reg = 0x201c, 6528c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 6538c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6548c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_mdp_lut_clk", 6558c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6568c2ecf20Sopenharmony_ci "disp_cc_mdss_mdp_clk_src", 6578c2ecf20Sopenharmony_ci }, 6588c2ecf20Sopenharmony_ci .num_parents = 1, 6598c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6608c2ecf20Sopenharmony_ci }, 6618c2ecf20Sopenharmony_ci }, 6628c2ecf20Sopenharmony_ci}; 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 6658c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_pclk0_clk = { 6668c2ecf20Sopenharmony_ci .halt_reg = 0x2004, 6678c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 6688c2ecf20Sopenharmony_ci .clkr = { 6698c2ecf20Sopenharmony_ci .enable_reg = 0x2004, 6708c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 6718c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6728c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_pclk0_clk", 6738c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6748c2ecf20Sopenharmony_ci "disp_cc_mdss_pclk0_clk_src", 6758c2ecf20Sopenharmony_ci }, 6768c2ecf20Sopenharmony_ci .num_parents = 1, 6778c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 6788c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6798c2ecf20Sopenharmony_ci }, 6808c2ecf20Sopenharmony_ci }, 6818c2ecf20Sopenharmony_ci}; 6828c2ecf20Sopenharmony_ci 6838c2ecf20Sopenharmony_ci/* Return the HW recalc rate for idle use case */ 6848c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_pclk1_clk = { 6858c2ecf20Sopenharmony_ci .halt_reg = 0x2008, 6868c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 6878c2ecf20Sopenharmony_ci .clkr = { 6888c2ecf20Sopenharmony_ci .enable_reg = 0x2008, 6898c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 6908c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 6918c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_pclk1_clk", 6928c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 6938c2ecf20Sopenharmony_ci "disp_cc_mdss_pclk1_clk_src", 6948c2ecf20Sopenharmony_ci }, 6958c2ecf20Sopenharmony_ci .num_parents = 1, 6968c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 6978c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 6988c2ecf20Sopenharmony_ci }, 6998c2ecf20Sopenharmony_ci }, 7008c2ecf20Sopenharmony_ci}; 7018c2ecf20Sopenharmony_ci 7028c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_rot_clk = { 7038c2ecf20Sopenharmony_ci .halt_reg = 0x2014, 7048c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 7058c2ecf20Sopenharmony_ci .clkr = { 7068c2ecf20Sopenharmony_ci .enable_reg = 0x2014, 7078c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 7088c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 7098c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_rot_clk", 7108c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 7118c2ecf20Sopenharmony_ci "disp_cc_mdss_rot_clk_src", 7128c2ecf20Sopenharmony_ci }, 7138c2ecf20Sopenharmony_ci .num_parents = 1, 7148c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 7158c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 7168c2ecf20Sopenharmony_ci }, 7178c2ecf20Sopenharmony_ci }, 7188c2ecf20Sopenharmony_ci}; 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_rscc_ahb_clk = { 7218c2ecf20Sopenharmony_ci .halt_reg = 0x5004, 7228c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 7238c2ecf20Sopenharmony_ci .clkr = { 7248c2ecf20Sopenharmony_ci .enable_reg = 0x5004, 7258c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 7268c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 7278c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_rscc_ahb_clk", 7288c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 7298c2ecf20Sopenharmony_ci }, 7308c2ecf20Sopenharmony_ci }, 7318c2ecf20Sopenharmony_ci}; 7328c2ecf20Sopenharmony_ci 7338c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_rscc_vsync_clk = { 7348c2ecf20Sopenharmony_ci .halt_reg = 0x5008, 7358c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 7368c2ecf20Sopenharmony_ci .clkr = { 7378c2ecf20Sopenharmony_ci .enable_reg = 0x5008, 7388c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 7398c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 7408c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_rscc_vsync_clk", 7418c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 7428c2ecf20Sopenharmony_ci "disp_cc_mdss_vsync_clk_src", 7438c2ecf20Sopenharmony_ci }, 7448c2ecf20Sopenharmony_ci .num_parents = 1, 7458c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 7468c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 7478c2ecf20Sopenharmony_ci }, 7488c2ecf20Sopenharmony_ci }, 7498c2ecf20Sopenharmony_ci}; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_cistatic struct clk_branch disp_cc_mdss_vsync_clk = { 7528c2ecf20Sopenharmony_ci .halt_reg = 0x2024, 7538c2ecf20Sopenharmony_ci .halt_check = BRANCH_HALT, 7548c2ecf20Sopenharmony_ci .clkr = { 7558c2ecf20Sopenharmony_ci .enable_reg = 0x2024, 7568c2ecf20Sopenharmony_ci .enable_mask = BIT(0), 7578c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ 7588c2ecf20Sopenharmony_ci .name = "disp_cc_mdss_vsync_clk", 7598c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ 7608c2ecf20Sopenharmony_ci "disp_cc_mdss_vsync_clk_src", 7618c2ecf20Sopenharmony_ci }, 7628c2ecf20Sopenharmony_ci .num_parents = 1, 7638c2ecf20Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 7648c2ecf20Sopenharmony_ci .ops = &clk_branch2_ops, 7658c2ecf20Sopenharmony_ci }, 7668c2ecf20Sopenharmony_ci }, 7678c2ecf20Sopenharmony_ci}; 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_cistatic struct gdsc mdss_gdsc = { 7708c2ecf20Sopenharmony_ci .gdscr = 0x3000, 7718c2ecf20Sopenharmony_ci .pd = { 7728c2ecf20Sopenharmony_ci .name = "mdss_gdsc", 7738c2ecf20Sopenharmony_ci }, 7748c2ecf20Sopenharmony_ci .pwrsts = PWRSTS_OFF_ON, 7758c2ecf20Sopenharmony_ci .flags = HW_CTRL | POLL_CFG_GDSCR, 7768c2ecf20Sopenharmony_ci}; 7778c2ecf20Sopenharmony_ci 7788c2ecf20Sopenharmony_cistatic struct clk_regmap *disp_cc_sdm845_clocks[] = { 7798c2ecf20Sopenharmony_ci [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, 7808c2ecf20Sopenharmony_ci [DISP_CC_MDSS_AXI_CLK] = &disp_cc_mdss_axi_clk.clkr, 7818c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, 7828c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, 7838c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, 7848c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = 7858c2ecf20Sopenharmony_ci &disp_cc_mdss_byte0_div_clk_src.clkr, 7868c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr, 7878c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr, 7888c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr, 7898c2ecf20Sopenharmony_ci [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = 7908c2ecf20Sopenharmony_ci &disp_cc_mdss_byte1_div_clk_src.clkr, 7918c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr, 7928c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr, 7938c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr, 7948c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = 7958c2ecf20Sopenharmony_ci &disp_cc_mdss_dp_crypto_clk_src.clkr, 7968c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr, 7978c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr, 7988c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr, 7998c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_PIXEL1_CLK] = &disp_cc_mdss_dp_pixel1_clk.clkr, 8008c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_PIXEL1_CLK_SRC] = 8018c2ecf20Sopenharmony_ci &disp_cc_mdss_dp_pixel1_clk_src.clkr, 8028c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr, 8038c2ecf20Sopenharmony_ci [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr, 8048c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, 8058c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, 8068c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr, 8078c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr, 8088c2ecf20Sopenharmony_ci [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, 8098c2ecf20Sopenharmony_ci [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, 8108c2ecf20Sopenharmony_ci [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, 8118c2ecf20Sopenharmony_ci [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, 8128c2ecf20Sopenharmony_ci [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, 8138c2ecf20Sopenharmony_ci [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr, 8148c2ecf20Sopenharmony_ci [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr, 8158c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, 8168c2ecf20Sopenharmony_ci [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr, 8178c2ecf20Sopenharmony_ci [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr, 8188c2ecf20Sopenharmony_ci [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, 8198c2ecf20Sopenharmony_ci [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, 8208c2ecf20Sopenharmony_ci [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, 8218c2ecf20Sopenharmony_ci [DISP_CC_PLL0] = &disp_cc_pll0.clkr, 8228c2ecf20Sopenharmony_ci}; 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_cistatic const struct qcom_reset_map disp_cc_sdm845_resets[] = { 8258c2ecf20Sopenharmony_ci [DISP_CC_MDSS_RSCC_BCR] = { 0x5000 }, 8268c2ecf20Sopenharmony_ci}; 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_cistatic struct gdsc *disp_cc_sdm845_gdscs[] = { 8298c2ecf20Sopenharmony_ci [MDSS_GDSC] = &mdss_gdsc, 8308c2ecf20Sopenharmony_ci}; 8318c2ecf20Sopenharmony_ci 8328c2ecf20Sopenharmony_cistatic const struct regmap_config disp_cc_sdm845_regmap_config = { 8338c2ecf20Sopenharmony_ci .reg_bits = 32, 8348c2ecf20Sopenharmony_ci .reg_stride = 4, 8358c2ecf20Sopenharmony_ci .val_bits = 32, 8368c2ecf20Sopenharmony_ci .max_register = 0x10000, 8378c2ecf20Sopenharmony_ci .fast_io = true, 8388c2ecf20Sopenharmony_ci}; 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_cistatic const struct qcom_cc_desc disp_cc_sdm845_desc = { 8418c2ecf20Sopenharmony_ci .config = &disp_cc_sdm845_regmap_config, 8428c2ecf20Sopenharmony_ci .clks = disp_cc_sdm845_clocks, 8438c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(disp_cc_sdm845_clocks), 8448c2ecf20Sopenharmony_ci .resets = disp_cc_sdm845_resets, 8458c2ecf20Sopenharmony_ci .num_resets = ARRAY_SIZE(disp_cc_sdm845_resets), 8468c2ecf20Sopenharmony_ci .gdscs = disp_cc_sdm845_gdscs, 8478c2ecf20Sopenharmony_ci .num_gdscs = ARRAY_SIZE(disp_cc_sdm845_gdscs), 8488c2ecf20Sopenharmony_ci}; 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_cistatic const struct of_device_id disp_cc_sdm845_match_table[] = { 8518c2ecf20Sopenharmony_ci { .compatible = "qcom,sdm845-dispcc" }, 8528c2ecf20Sopenharmony_ci { } 8538c2ecf20Sopenharmony_ci}; 8548c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, disp_cc_sdm845_match_table); 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_cistatic int disp_cc_sdm845_probe(struct platform_device *pdev) 8578c2ecf20Sopenharmony_ci{ 8588c2ecf20Sopenharmony_ci struct regmap *regmap; 8598c2ecf20Sopenharmony_ci struct alpha_pll_config disp_cc_pll0_config = {}; 8608c2ecf20Sopenharmony_ci 8618c2ecf20Sopenharmony_ci regmap = qcom_cc_map(pdev, &disp_cc_sdm845_desc); 8628c2ecf20Sopenharmony_ci if (IS_ERR(regmap)) 8638c2ecf20Sopenharmony_ci return PTR_ERR(regmap); 8648c2ecf20Sopenharmony_ci 8658c2ecf20Sopenharmony_ci disp_cc_pll0_config.l = 0x2c; 8668c2ecf20Sopenharmony_ci disp_cc_pll0_config.alpha = 0xcaaa; 8678c2ecf20Sopenharmony_ci 8688c2ecf20Sopenharmony_ci clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); 8698c2ecf20Sopenharmony_ci 8708c2ecf20Sopenharmony_ci /* Enable hardware clock gating for DSI and MDP clocks */ 8718c2ecf20Sopenharmony_ci regmap_update_bits(regmap, 0x8000, 0x7f0, 0x7f0); 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ci return qcom_cc_really_probe(pdev, &disp_cc_sdm845_desc, regmap); 8748c2ecf20Sopenharmony_ci} 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_cistatic struct platform_driver disp_cc_sdm845_driver = { 8778c2ecf20Sopenharmony_ci .probe = disp_cc_sdm845_probe, 8788c2ecf20Sopenharmony_ci .driver = { 8798c2ecf20Sopenharmony_ci .name = "disp_cc-sdm845", 8808c2ecf20Sopenharmony_ci .of_match_table = disp_cc_sdm845_match_table, 8818c2ecf20Sopenharmony_ci }, 8828c2ecf20Sopenharmony_ci}; 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_cistatic int __init disp_cc_sdm845_init(void) 8858c2ecf20Sopenharmony_ci{ 8868c2ecf20Sopenharmony_ci return platform_driver_register(&disp_cc_sdm845_driver); 8878c2ecf20Sopenharmony_ci} 8888c2ecf20Sopenharmony_cisubsys_initcall(disp_cc_sdm845_init); 8898c2ecf20Sopenharmony_ci 8908c2ecf20Sopenharmony_cistatic void __exit disp_cc_sdm845_exit(void) 8918c2ecf20Sopenharmony_ci{ 8928c2ecf20Sopenharmony_ci platform_driver_unregister(&disp_cc_sdm845_driver); 8938c2ecf20Sopenharmony_ci} 8948c2ecf20Sopenharmony_cimodule_exit(disp_cc_sdm845_exit); 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 8978c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("QTI DISPCC SDM845 Driver"); 898