Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: qcom: gcc-sm8450: Add SM8475 support

Add support to the SM8475 global clock controller by extending the
SM8450 global clock controller, which is almost identical but has some
minor differences.

Signed-off-by: Danila Tikhonov <danila@jiaxyga.com>
Link: https://lore.kernel.org/r/20240818204348.197788-3-danila@jiaxyga.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Danila Tikhonov and committed by
Bjorn Andersson
20e06dc8 0519714a

+182 -2
+2 -1
drivers/clk/qcom/Kconfig
··· 1050 1050 depends on ARM64 || COMPILE_TEST 1051 1051 select QCOM_GDSC 1052 1052 help 1053 - Support for the global clock controller on SM8450 devices. 1053 + Support for the global clock controller on SM8450 or SM8475 1054 + devices. 1054 1055 Say Y if you want to use peripheral devices such as UART, 1055 1056 SPI, I2C, USB, SD/UFS, PCIe etc. 1056 1057
+180 -1
drivers/clk/qcom/gcc-sm8450.c
··· 26 26 P_BI_TCXO, 27 27 P_GCC_GPLL0_OUT_EVEN, 28 28 P_GCC_GPLL0_OUT_MAIN, 29 + P_SM8475_GCC_GPLL2_OUT_EVEN, 30 + P_SM8475_GCC_GPLL3_OUT_EVEN, 29 31 P_GCC_GPLL4_OUT_MAIN, 30 32 P_GCC_GPLL9_OUT_MAIN, 31 33 P_PCIE_1_PHY_AUX_CLK, ··· 36 34 P_UFS_PHY_RX_SYMBOL_1_CLK, 37 35 P_UFS_PHY_TX_SYMBOL_0_CLK, 38 36 P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 37 + }; 38 + 39 + static struct clk_init_data sm8475_gcc_gpll0_init = { 40 + .name = "gcc_gpll0", 41 + .parent_data = &(const struct clk_parent_data){ 42 + .fw_name = "bi_tcxo", 43 + }, 44 + .num_parents = 1, 45 + .ops = &clk_alpha_pll_fixed_lucid_ole_ops, 39 46 }; 40 47 41 48 static struct clk_alpha_pll gcc_gpll0 = { ··· 62 51 .ops = &clk_alpha_pll_fixed_lucid_evo_ops, 63 52 }, 64 53 }, 54 + }; 55 + 56 + static struct clk_init_data sm8475_gcc_gpll0_out_even_init = { 57 + .name = "gcc_gpll0_out_even", 58 + .parent_hws = (const struct clk_hw*[]) { 59 + &gcc_gpll0.clkr.hw, 60 + }, 61 + .num_parents = 1, 62 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 65 63 }; 66 64 67 65 static const struct clk_div_table post_div_table_gcc_gpll0_out_even[] = { ··· 95 75 }, 96 76 }; 97 77 78 + static struct clk_alpha_pll sm8475_gcc_gpll2 = { 79 + .offset = 0x2000, 80 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 81 + .clkr = { 82 + .enable_reg = 0x62018, 83 + .enable_mask = BIT(2), 84 + .hw.init = &(struct clk_init_data){ 85 + .name = "gcc_gpll2", 86 + .parent_data = &(const struct clk_parent_data){ 87 + .fw_name = "bi_tcxo", 88 + }, 89 + .num_parents = 1, 90 + .ops = &clk_alpha_pll_fixed_lucid_ole_ops, 91 + }, 92 + }, 93 + }; 94 + 95 + static struct clk_alpha_pll sm8475_gcc_gpll3 = { 96 + .offset = 0x3000, 97 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 98 + .clkr = { 99 + .enable_reg = 0x62018, 100 + .enable_mask = BIT(3), 101 + .hw.init = &(struct clk_init_data){ 102 + .name = "gcc_gpll3", 103 + .parent_data = &(const struct clk_parent_data){ 104 + .fw_name = "bi_tcxo", 105 + }, 106 + .num_parents = 1, 107 + .ops = &clk_alpha_pll_fixed_lucid_ole_ops, 108 + }, 109 + }, 110 + }; 111 + 112 + static struct clk_init_data sm8475_gcc_gpll4_init = { 113 + .name = "gcc_gpll4", 114 + .parent_data = &(const struct clk_parent_data){ 115 + .fw_name = "bi_tcxo", 116 + }, 117 + .num_parents = 1, 118 + .ops = &clk_alpha_pll_fixed_lucid_ole_ops, 119 + }; 120 + 98 121 static struct clk_alpha_pll gcc_gpll4 = { 99 122 .offset = 0x4000, 100 123 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO], ··· 153 90 .ops = &clk_alpha_pll_fixed_lucid_evo_ops, 154 91 }, 155 92 }, 93 + }; 94 + 95 + static struct clk_init_data sm8475_gcc_gpll9_init = { 96 + .name = "gcc_gpll9", 97 + .parent_data = &(const struct clk_parent_data){ 98 + .fw_name = "bi_tcxo", 99 + }, 100 + .num_parents = 1, 101 + .ops = &clk_alpha_pll_fixed_lucid_ole_ops, 156 102 }; 157 103 158 104 static struct clk_alpha_pll gcc_gpll9 = { ··· 223 151 224 152 static const struct clk_parent_data gcc_parent_data_3[] = { 225 153 { .fw_name = "bi_tcxo" }, 154 + }; 155 + 156 + static const struct parent_map sm8475_gcc_parent_map_3[] = { 157 + { P_BI_TCXO, 0 }, 158 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 159 + { P_SM8475_GCC_GPLL2_OUT_EVEN, 2 }, 160 + { P_SM8475_GCC_GPLL3_OUT_EVEN, 3 }, 161 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 162 + }; 163 + 164 + static const struct clk_parent_data sm8475_gcc_parent_data_3[] = { 165 + { .fw_name = "bi_tcxo" }, 166 + { .hw = &gcc_gpll0.clkr.hw }, 167 + { .hw = &sm8475_gcc_gpll2.clkr.hw }, 168 + { .hw = &sm8475_gcc_gpll3.clkr.hw }, 169 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 226 170 }; 227 171 228 172 static const struct parent_map gcc_parent_map_5[] = { ··· 1003 915 .clkr.hw.init = &gcc_qupv3_wrap2_s6_clk_src_init, 1004 916 }; 1005 917 918 + static const struct freq_tbl sm8475_ftbl_gcc_sdcc2_apps_clk_src[] = { 919 + F(400000, P_BI_TCXO, 12, 1, 4), 920 + F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 921 + F(37000000, P_GCC_GPLL9_OUT_MAIN, 16, 0, 0), 922 + F(50000000, P_GCC_GPLL0_OUT_EVEN, 6, 0, 0), 923 + F(100000000, P_GCC_GPLL0_OUT_EVEN, 3, 0, 0), 924 + F(148000000, P_GCC_GPLL9_OUT_MAIN, 4, 0, 0), 925 + { } 926 + }; 927 + 1006 928 static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 1007 929 F(400000, P_BI_TCXO, 12, 1, 4), 1008 930 F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), ··· 1061 963 }, 1062 964 }; 1063 965 966 + static const struct freq_tbl sm8475_ftbl_gcc_ufs_phy_axi_clk_src[] = { 967 + F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 968 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 969 + F(150000000, P_GCC_GPLL0_OUT_MAIN, 4, 0, 0), 970 + F(300000000, P_GCC_GPLL0_OUT_MAIN, 2, 0, 0), 971 + F(600000000, P_GCC_GPLL0_OUT_MAIN, 1, 0, 0), 972 + F(806400000, P_SM8475_GCC_GPLL2_OUT_EVEN, 1, 0, 0), 973 + F(850000000, P_SM8475_GCC_GPLL2_OUT_EVEN, 1, 0, 0), 974 + { } 975 + }; 976 + 977 + static struct clk_init_data sm8475_gcc_ufs_phy_axi_clk_src_init = { 978 + .name = "gcc_ufs_phy_axi_clk_src", 979 + .parent_data = sm8475_gcc_parent_data_3, 980 + .num_parents = ARRAY_SIZE(sm8475_gcc_parent_map_3), 981 + .flags = CLK_SET_RATE_PARENT, 982 + .ops = &clk_rcg2_ops, 983 + }; 984 + 1064 985 static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 1065 986 F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 1066 987 F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), ··· 1102 985 .flags = CLK_SET_RATE_PARENT, 1103 986 .ops = &clk_rcg2_ops, 1104 987 }, 988 + }; 989 + 990 + static const struct freq_tbl sm8475_ftbl_gcc_ufs_phy_ice_core_clk_src[] = { 991 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 992 + F(150000000, P_GCC_GPLL0_OUT_MAIN, 4, 0, 0), 993 + F(300000000, P_GCC_GPLL0_OUT_MAIN, 2, 0, 0), 994 + F(600000000, P_GCC_GPLL0_OUT_MAIN, 1, 0, 0), 995 + F(806400000, P_SM8475_GCC_GPLL2_OUT_EVEN, 1, 0, 0), 996 + F(850000000, P_SM8475_GCC_GPLL2_OUT_EVEN, 1, 0, 0), 997 + { } 998 + }; 999 + 1000 + static struct clk_init_data sm8475_gcc_ufs_phy_ice_core_clk_src_init = { 1001 + .name = "gcc_ufs_phy_ice_core_clk_src", 1002 + .parent_data = sm8475_gcc_parent_data_3, 1003 + .num_parents = ARRAY_SIZE(sm8475_gcc_parent_map_3), 1004 + .flags = CLK_SET_RATE_PARENT, 1005 + .ops = &clk_rcg2_ops, 1105 1006 }; 1106 1007 1107 1008 static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = { ··· 1165 1030 .flags = CLK_SET_RATE_PARENT, 1166 1031 .ops = &clk_rcg2_ops, 1167 1032 }, 1033 + }; 1034 + 1035 + static struct clk_init_data sm8475_gcc_ufs_phy_unipro_core_clk_src_init = { 1036 + .name = "gcc_ufs_phy_unipro_core_clk_src", 1037 + .parent_data = sm8475_gcc_parent_data_3, 1038 + .num_parents = ARRAY_SIZE(sm8475_gcc_parent_map_3), 1039 + .flags = CLK_SET_RATE_PARENT, 1040 + .ops = &clk_rcg2_ops, 1168 1041 }; 1169 1042 1170 1043 static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { ··· 3309 3166 [GCC_USB3_PRIM_PHY_PIPE_CLK_SRC] = &gcc_usb3_prim_phy_pipe_clk_src.clkr, 3310 3167 [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr, 3311 3168 [GCC_VIDEO_AXI1_CLK] = &gcc_video_axi1_clk.clkr, 3169 + [SM8475_GCC_GPLL2] = NULL, 3170 + [SM8475_GCC_GPLL3] = NULL, 3312 3171 }; 3313 3172 3314 3173 static const struct qcom_reset_map gcc_sm8450_resets[] = { ··· 3404 3259 3405 3260 static const struct of_device_id gcc_sm8450_match_table[] = { 3406 3261 { .compatible = "qcom,gcc-sm8450" }, 3262 + { .compatible = "qcom,sm8475-gcc" }, 3407 3263 { } 3408 3264 }; 3409 3265 MODULE_DEVICE_TABLE(of, gcc_sm8450_match_table); ··· 3422 3276 ARRAY_SIZE(gcc_dfs_clocks)); 3423 3277 if (ret) 3424 3278 return ret; 3279 + 3280 + if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8475-gcc")) { 3281 + /* Update GCC PLL0 */ 3282 + gcc_gpll0.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE]; 3283 + gcc_gpll0.clkr.hw.init = &sm8475_gcc_gpll0_init; 3284 + gcc_gpll0_out_even.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE]; 3285 + gcc_gpll0_out_even.clkr.hw.init = &sm8475_gcc_gpll0_out_even_init; 3286 + 3287 + /* Update GCC PLL4 */ 3288 + gcc_gpll4.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE]; 3289 + gcc_gpll4.clkr.hw.init = &sm8475_gcc_gpll4_init; 3290 + 3291 + /* Update GCC PLL9 */ 3292 + gcc_gpll9.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE]; 3293 + gcc_gpll9.clkr.hw.init = &sm8475_gcc_gpll9_init; 3294 + 3295 + gcc_sdcc2_apps_clk_src.freq_tbl = sm8475_ftbl_gcc_sdcc2_apps_clk_src; 3296 + 3297 + gcc_ufs_phy_axi_clk_src.parent_map = sm8475_gcc_parent_map_3; 3298 + gcc_ufs_phy_axi_clk_src.freq_tbl = sm8475_ftbl_gcc_ufs_phy_axi_clk_src; 3299 + gcc_ufs_phy_axi_clk_src.clkr.hw.init = &sm8475_gcc_ufs_phy_axi_clk_src_init; 3300 + 3301 + gcc_ufs_phy_ice_core_clk_src.parent_map = sm8475_gcc_parent_map_3; 3302 + gcc_ufs_phy_ice_core_clk_src.freq_tbl = sm8475_ftbl_gcc_ufs_phy_ice_core_clk_src; 3303 + gcc_ufs_phy_ice_core_clk_src.clkr.hw.init = &sm8475_gcc_ufs_phy_ice_core_clk_src_init; 3304 + 3305 + gcc_ufs_phy_unipro_core_clk_src.parent_map = sm8475_gcc_parent_map_3; 3306 + gcc_ufs_phy_unipro_core_clk_src.freq_tbl = sm8475_ftbl_gcc_ufs_phy_ice_core_clk_src; 3307 + gcc_ufs_phy_unipro_core_clk_src.clkr.hw.init = &sm8475_gcc_ufs_phy_unipro_core_clk_src_init; 3308 + 3309 + gcc_sm8450_desc.clks[SM8475_GCC_GPLL2] = &sm8475_gcc_gpll2.clkr; 3310 + gcc_sm8450_desc.clks[SM8475_GCC_GPLL3] = &sm8475_gcc_gpll3.clkr; 3311 + } 3425 3312 3426 3313 /* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ 3427 3314 regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14)); ··· 3491 3312 } 3492 3313 module_exit(gcc_sm8450_exit); 3493 3314 3494 - MODULE_DESCRIPTION("QTI GCC SM8450 Driver"); 3315 + MODULE_DESCRIPTION("QTI GCC SM8450 / SM8475 Driver"); 3495 3316 MODULE_LICENSE("GPL v2");