diff --git a/drivers/clk/qcom/clk-smd-rpm.c b/drivers/clk/qcom/clk-smd-rpm.c index e855d5bac4f8..49429c5fadda 100644 --- a/drivers/clk/qcom/clk-smd-rpm.c +++ b/drivers/clk/qcom/clk-smd-rpm.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016, Linaro Limited - * Copyright (c) 2014, 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2020-2021, The Linux Foundation. All rights reserved. */ #include @@ -941,6 +941,61 @@ static const struct rpm_smd_clk_desc rpm_clk_sdxnightjar = { .num_clks = ARRAY_SIZE(sdxnightjar_clks), }; +/* Monaco */ +DEFINE_CLK_SMD_RPM(monaco, cpuss_gnoc_clk, cpuss_gnoc_a_clk, + QCOM_SMD_RPM_MEM_CLK, 1); +DEFINE_CLK_SMD_RPM(monaco, bimc_gpu_clk, bimc_gpu_a_clk, + QCOM_SMD_RPM_MEM_CLK, 2); + +DEFINE_CLK_SMD_RPM_XO_BUFFER(monaco, ln_bb_clk2, ln_bb_clk2_a, + QCOM_SMD_RPM_CLK_BUF_A, 0x2); +DEFINE_CLK_SMD_RPM_XO_BUFFER(monaco, rf_clk3, rf_clk3_a, + QCOM_SMD_RPM_CLK_BUF_A, 6); + +static struct clk_hw *monaco_clks[] = { + [RPM_SMD_XO_CLK_SRC] = &holi_bi_tcxo.hw, + [RPM_SMD_XO_A_CLK_SRC] = &holi_bi_tcxo_ao.hw, + [RPM_SMD_SNOC_CLK] = &holi_snoc_clk.hw, + [RPM_SMD_SNOC_A_CLK] = &holi_snoc_a_clk.hw, + [RPM_SMD_BIMC_CLK] = &holi_bimc_clk.hw, + [RPM_SMD_BIMC_A_CLK] = &holi_bimc_a_clk.hw, + [RPM_SMD_QDSS_CLK] = &holi_qdss_clk.hw, + [RPM_SMD_QDSS_A_CLK] = &holi_qdss_a_clk.hw, + [RPM_SMD_LN_BB_CLK2] = &monaco_ln_bb_clk2.hw, + [RPM_SMD_LN_BB_CLK2_A] = &monaco_ln_bb_clk2_a.hw, + [RPM_SMD_RF_CLK3] = &monaco_rf_clk3.hw, + [RPM_SMD_RF_CLK3_A] = &monaco_rf_clk3_a.hw, + [RPM_SMD_CNOC_CLK] = &holi_cnoc_clk.hw, + [RPM_SMD_CNOC_A_CLK] = &holi_cnoc_a_clk.hw, + [RPM_SMD_IPA_CLK] = &holi_ipa_clk.hw, + [RPM_SMD_IPA_A_CLK] = &holi_ipa_a_clk.hw, + [RPM_SMD_QUP_CLK] = &holi_qup_clk.hw, + [RPM_SMD_QUP_A_CLK] = &holi_qup_a_clk.hw, + [RPM_SMD_MMRT_CLK] = &holi_mmrt_clk.hw, + [RPM_SMD_MMRT_A_CLK] = &holi_mmrt_a_clk.hw, + [RPM_SMD_MMNRT_CLK] = &holi_mmnrt_clk.hw, + [RPM_SMD_MMNRT_A_CLK] = &holi_mmnrt_a_clk.hw, + [RPM_SMD_SNOC_PERIPH_CLK] = &holi_snoc_periph_clk.hw, + [RPM_SMD_SNOC_PERIPH_A_CLK] = &holi_snoc_periph_a_clk.hw, + [RPM_SMD_SNOC_LPASS_CLK] = &holi_snoc_lpass_clk.hw, + [RPM_SMD_SNOC_LPASS_A_CLK] = &holi_snoc_lpass_a_clk.hw, + [RPM_SMD_CE1_CLK] = &holi_ce1_clk.hw, + [RPM_SMD_CE1_A_CLK] = &holi_ce1_a_clk.hw, + [RPM_SMD_HWKM_CLK] = &holi_hwkm_clk.hw, + [RPM_SMD_HWKM_A_CLK] = &holi_hwkm_a_clk.hw, + [RPM_SMD_PKA_CLK] = &holi_pka_clk.hw, + [RPM_SMD_PKA_A_CLK] = &holi_pka_a_clk.hw, + [RPM_SMD_BIMC_GPU_CLK] = &monaco_bimc_gpu_clk.hw, + [RPM_SMD_BIMC_GPU_A_CLK] = &monaco_bimc_gpu_a_clk.hw, + [RPM_SMD_CPUSS_GNOC_CLK] = &monaco_cpuss_gnoc_clk.hw, + [RPM_SMD_CPUSS_GNOC_A_CLK] = &monaco_cpuss_gnoc_a_clk.hw, +}; + +static const struct rpm_smd_clk_desc rpm_clk_monaco = { + .clks = monaco_clks, + .num_clks = ARRAY_SIZE(monaco_clks), +}; + static const struct of_device_id rpm_smd_clk_match_table[] = { { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 }, { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 }, @@ -949,6 +1004,7 @@ static const struct of_device_id rpm_smd_clk_match_table[] = { { .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 }, { .compatible = "qcom,rpmcc-holi", .data = &rpm_clk_holi}, { .compatible = "qcom,rpmcc-sdxnightjar", .data = &rpm_clk_sdxnightjar}, + { .compatible = "qcom,rpmcc-monaco", .data = &rpm_clk_monaco }, { } }; MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table); @@ -1007,7 +1063,7 @@ static int rpm_smd_clk_probe(struct platform_device *pdev) { struct clk_hw **hw_clks; const struct rpm_smd_clk_desc *desc; - int ret, i, is_holi, hw_clk_handoff = false, is_sdxnightjar; + int ret, i, is_holi, hw_clk_handoff = false, is_sdxnightjar, is_monaco; desc = of_device_get_match_data(&pdev->dev); if (!desc) @@ -1017,7 +1073,10 @@ static int rpm_smd_clk_probe(struct platform_device *pdev) "qcom,rpmcc-holi"); is_sdxnightjar = of_device_is_compatible(pdev->dev.of_node, "qcom,rpmcc-sdxnightjar"); - if (is_holi || is_sdxnightjar) { + is_monaco = of_device_is_compatible(pdev->dev.of_node, + "qcom,rpmcc-monaco"); + + if (is_holi || is_sdxnightjar || is_monaco) { ret = clk_vote_bimc(&holi_bimc_clk.hw, INT_MAX); if (ret < 0) return ret; @@ -1061,7 +1120,7 @@ static int rpm_smd_clk_probe(struct platform_device *pdev) if (ret) goto err; - if (is_holi) { + if (is_holi || is_monaco) { /* * Keep an active vote on CXO in case no other driver * votes for it.