Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d14fe96c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "clk: qcom: smd-rpm: Add RPM-SMD clock support for QM215"

parents 66c3a546 4010379e
Loading
Loading
Loading
Loading
+123 −1
Original line number Diff line number Diff line
@@ -1080,6 +1080,108 @@ static const struct rpm_smd_clk_desc rpm_clk_sdm660 = {
	.num_clks = ARRAY_SIZE(sdm660_clks),
};

/* sdm429w SMD clocks */
DEFINE_CLK_SMD_RPM_BRANCH(sdm429w, bi_tcxo, bi_tcxo_ao,
					QCOM_SMD_RPM_MISC_CLK, 0, 19200000);
DEFINE_CLK_SMD_RPM(sdm429w, pnoc_clk, pnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0);
DEFINE_CLK_SMD_RPM(sdm429w, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);

DEFINE_CLK_SMD_RPM(sdm429w, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0);

DEFINE_CLK_SMD_RPM(sdm429w, sysmmnoc_clk, sysmmnoc_a_clk, QCOM_SMD_RPM_BUS_CLK,
		 2);

DEFINE_CLK_SMD_RPM_QDSS(sdm429w, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK,
		1);

DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm429w, bb_clk1, bb_clk1_a, 1);
DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm429w, bb_clk2, bb_clk2_a, 2);
DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm429w, rf_clk2, rf_clk2_a, 5);
DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm429w, div_clk2, div_clk2_a, 0xc);

DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm429w, bb_clk1_pin, bb_clk1_a_pin, 1);
DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm429w, bb_clk2_pin, bb_clk2_a_pin, 2);

/* Voter clocks */
static DEFINE_CLK_VOTER(pnoc_msmbus_clk, pnoc_clk, LONG_MAX);
static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, pnoc_a_clk, LONG_MAX);
static DEFINE_CLK_VOTER(pnoc_keepalive_a_clk, pnoc_a_clk, LONG_MAX);

static DEFINE_CLK_VOTER(sysmmnoc_msmbus_clk, sysmmnoc_clk,  LONG_MAX);
static DEFINE_CLK_VOTER(sysmmnoc_msmbus_a_clk, sysmmnoc_a_clk,  LONG_MAX);

static DEFINE_CLK_VOTER(pnoc_usb_clk, pnoc_clk, LONG_MAX);
static DEFINE_CLK_VOTER(snoc_usb_clk, snoc_clk, LONG_MAX);
static DEFINE_CLK_VOTER(bimc_usb_clk, bimc_clk, LONG_MAX);

static DEFINE_CLK_VOTER(pnoc_usb_a_clk, pnoc_a_clk, LONG_MAX);
static DEFINE_CLK_VOTER(snoc_usb_a_clk, snoc_a_clk, LONG_MAX);
static DEFINE_CLK_VOTER(bimc_usb_a_clk, bimc_a_clk, LONG_MAX);

static DEFINE_CLK_VOTER(snoc_wcnss_a_clk, snoc_a_clk, LONG_MAX);
static DEFINE_CLK_VOTER(bimc_wcnss_a_clk, bimc_a_clk, LONG_MAX);

/* Branch Voter clocks */
static DEFINE_CLK_BRANCH_VOTER(bi_tcxo_lpm_clk, bi_tcxo);

static struct clk_hw *qm215_clks[] = {
	[RPM_SMD_XO_CLK_SRC] = &sdm429w_bi_tcxo.hw,
	[RPM_SMD_XO_A_CLK_SRC] = &sdm429w_bi_tcxo_ao.hw,
	[RPM_SMD_QDSS_CLK] = &sdm429w_qdss_clk.hw,
	[RPM_SMD_QDSS_A_CLK] = &sdm429w_qdss_a_clk.hw,
	[RPM_SMD_PNOC_CLK] = &sdm429w_pnoc_clk.hw,
	[RPM_SMD_PNOC_A_CLK] = &sdm429w_pnoc_a_clk.hw,
	[RPM_SMD_SNOC_CLK] = &sdm429w_snoc_clk.hw,
	[RPM_SMD_SNOC_A_CLK] = &sdm429w_snoc_a_clk.hw,
	[RPM_SMD_BIMC_CLK] = &sdm429w_bimc_clk.hw,
	[RPM_SMD_BIMC_A_CLK] = &sdm429w_bimc_a_clk.hw,
	[RPM_SMD_BIMC_GPU_CLK] = &scuba_bimc_gpu_clk.hw,
	[RPM_SMD_BIMC_GPU_A_CLK] = &scuba_bimc_gpu_a_clk.hw,
	[RPM_SMD_SYSMMNOC_CLK] = &sdm429w_sysmmnoc_clk.hw,
	[RPM_SMD_SYSMMNOC_A_CLK] = &sdm429w_sysmmnoc_a_clk.hw,
	[RPM_SMD_BB_CLK1] = &sdm429w_bb_clk1.hw,
	[RPM_SMD_BB_CLK1_A] = &sdm429w_bb_clk1_a.hw,
	[RPM_SMD_BB_CLK2] = &sdm429w_bb_clk2.hw,
	[RPM_SMD_BB_CLK2_A] = &sdm429w_bb_clk2_a.hw,
	[RPM_SMD_BB_CLK1_PIN] = &sdm429w_bb_clk1_pin.hw,
	[RPM_SMD_BB_CLK1_A_PIN] = &sdm429w_bb_clk1_a_pin.hw,
	[RPM_SMD_BB_CLK2_PIN] = &sdm429w_bb_clk2_pin.hw,
	[RPM_SMD_BB_CLK2_A_PIN] = &sdm429w_bb_clk2_a_pin.hw,
	[RPM_SMD_RF_CLK2] = &sdm429w_rf_clk2.hw,
	[RPM_SMD_RF_CLK2_A] = &sdm429w_rf_clk2_a.hw,
	[RPM_SMD_DIV_CLK2] = &sdm429w_div_clk2.hw,
	[RPM_SMD_DIV_A_CLK2] = &sdm429w_div_clk2_a.hw,
	[PNOC_MSMBUS_CLK] = &pnoc_msmbus_clk.hw,
	[PNOC_MSMBUS_A_CLK] = &pnoc_msmbus_a_clk.hw,
	[PNOC_KEEPALIVE_A_CLK] = &pnoc_keepalive_a_clk.hw,
	[SNOC_MSMBUS_CLK] = &snoc_msmbus_clk.hw,
	[SNOC_MSMBUS_A_CLK] = &snoc_msmbus_a_clk.hw,
	[BIMC_MSMBUS_CLK] = &bimc_msmbus_clk.hw,
	[BIMC_MSMBUS_A_CLK] = &bimc_msmbus_a_clk.hw,
	[PNOC_USB_CLK] = &pnoc_usb_clk.hw,
	[PNOC_USB_A_CLK] = &pnoc_usb_a_clk.hw,
	[SNOC_USB_CLK] = &snoc_usb_clk.hw,
	[SNOC_USB_A_CLK] = &snoc_usb_a_clk.hw,
	[BIMC_USB_CLK] = &bimc_usb_clk.hw,
	[BIMC_USB_A_CLK] = &bimc_usb_a_clk.hw,
	[SNOC_WCNSS_A_CLK] = &snoc_wcnss_a_clk.hw,
	[BIMC_WCNSS_A_CLK] = &bimc_wcnss_a_clk.hw,
	[SYSMMNOC_MSMBUS_CLK] = &sysmmnoc_msmbus_clk.hw,
	[SYSMMNOC_MSMBUS_A_CLK] = &sysmmnoc_msmbus_a_clk.hw,
	[CXO_SMD_OTG_CLK] = &bi_tcxo_otg_clk.hw,
	[CXO_SMD_LPM_CLK] = &bi_tcxo_lpm_clk.hw,
	[CXO_SMD_PIL_PRONTO_CLK] = &bi_tcxo_pil_pronto_clk.hw,
	[CXO_SMD_PIL_MSS_CLK] = &bi_tcxo_pil_mss_clk.hw,
	[CXO_SMD_WLAN_CLK] = &bi_tcxo_wlan_clk.hw,
	[CXO_SMD_PIL_LPASS_CLK] = &bi_tcxo_pil_lpass_clk.hw,
};

static const struct rpm_smd_clk_desc rpm_clk_qm215 = {
	.clks = qm215_clks,
	.num_rpm_clks = RPM_SMD_SYSMMNOC_A_CLK,
	.num_clks = ARRAY_SIZE(qm215_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 },
@@ -1087,6 +1189,7 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
	{ .compatible = "qcom,rpmcc-bengal", .data = &rpm_clk_bengal},
	{ .compatible = "qcom,rpmcc-scuba", .data = &rpm_clk_scuba},
	{ .compatible = "qcom,rpmcc-sdm660",  .data = &rpm_clk_sdm660  },
	{ .compatible = "qcom,rpmcc-qm215",  .data = &rpm_clk_qm215 },
	{ }
};
MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table);
@@ -1097,7 +1200,7 @@ static int rpm_smd_clk_probe(struct platform_device *pdev)
	struct clk *clk;
	struct rpm_cc *rcc;
	struct clk_onecell_data *data;
	int ret, is_bengal, is_scuba, is_sdm660;
	int ret, is_bengal, is_scuba, is_sdm660, is_qm215;
	size_t num_clks, i;
	struct clk_hw **hw_clks;
	const struct rpm_smd_clk_desc *desc;
@@ -1115,12 +1218,22 @@ static int rpm_smd_clk_probe(struct platform_device *pdev)

	is_sdm660 = of_device_is_compatible(pdev->dev.of_node,
						"qcom,rpmcc-sdm660");

	is_qm215 = of_device_is_compatible(pdev->dev.of_node,
						"qcom,rpmcc-qm215");

	if (is_sdm660) {
		ret = clk_vote_bimc(&sdm660_bimc_clk.hw, INT_MAX);
		if (ret < 0)
			return ret;
	}

	if (is_qm215) {
		ret = clk_vote_bimc(&sdm429w_bimc_clk.hw, INT_MAX);
		if (ret < 0)
			return ret;
	}

	desc = of_device_get_match_data(&pdev->dev);
	if (!desc)
		return -EINVAL;
@@ -1204,6 +1317,15 @@ static int rpm_smd_clk_probe(struct platform_device *pdev)
		/* Hold an active set vote for the cnoc_periph resource */
		clk_set_rate(cnoc_periph_keepalive_a_clk.hw.clk, 19200000);
		clk_prepare_enable(cnoc_periph_keepalive_a_clk.hw.clk);
	} else if (is_qm215) {
		clk_prepare_enable(sdm429w_bi_tcxo_ao.hw.clk);

		/*
		 * Hold an active set vote for the pnoc_periph PCNOC AHB
		 * resource. Sleep set vote is 0
		 */
		clk_set_rate(pnoc_keepalive_a_clk.hw.clk, 19200000);
		clk_prepare_enable(pnoc_keepalive_a_clk.hw.clk);
	}

	dev_info(&pdev->dev, "Registered RPM clocks\n");