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

Commit 234414be authored by Deepak Katragadda's avatar Deepak Katragadda
Browse files

clk: msm: clock-8996: Update the clock drivers for msm8996 v3



Update the 8996 clock drivers to support clock definitions
on msm8996 v3.

Change-Id: I081a2a9eef7b4cb16fa3fc41eb1c1c426b9aa883
Signed-off-by: default avatarDeepak Katragadda <dkatraga@codeaurora.org>
parent 3380d16c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ Required properties:
			"qcom,gcc-fsm9010"
			"qcom,gcc-8996"
			"qcom,gcc-8996-v2"
			"qcom,gcc-8996-v3"
			"qcom,rpmcc-8994"
			"qcom,rpmcc-8992"
			"qcom,rpmcc-8916"
@@ -34,6 +35,7 @@ Required properties:
			"qcom,cc-debug-fsm9010"
			"qcom,cc-debug-8996"
			"qcom,cc-debug-8996-v2"
			"qcom,cc-debug-8996-v3"
			"qcom,gcc-mdss-8936"
			"qcom,gcc-mdss-8909"
			"qcom,gcc-mdss-8916"
@@ -43,8 +45,10 @@ Required properties:
			"qcom,mmsscc-8992"
			"qcom,mmsscc-8996"
			"qcom,mmsscc-8996-v2"
			"qcom,mmsscc-8996-v3"
			"qcom,gpucc-8996"
			"qcom,gpucc-8996-v2"
			"qcom,gpucc-8996-v3"

- reg:			Pairs of physical base addresses and region sizes of
			memory mapped registers.
+32 −0
Original line number Diff line number Diff line
@@ -25,6 +25,38 @@
	qcom,msm-id = <246 0x30000>;
};

&clock_gcc {
	compatible = "qcom,gcc-8996-v3";
};

&clock_debug {
	compatible = "qcom,cc-debug-8996-v3";
};

&clock_mmss {
	compatible = "qcom,mmsscc-8996-v3";
};

&clock_gpu {
	compatible = "qcom,gpucc-8996-v3";
	qcom,gfxfreq-corner-v2 =
		<	   0  0  0 >,
		<  133000000  3  4 >,
		<  210000000  3  4 >,
		<  300000000  3  4 >,
		<  401800000  4  5 >,
		<  510000000  5  5 >,
		<  549000000  6  7 >,
		<  624000000  7  7 >;
};

&gdsc_gpu_gx {
	clock-names = "bimc_core_clk", "core_clk", "core_root_clk";
	clocks = <&clock_gcc clk_gcc_mmss_bimc_gfx_clk>,
		 <&clock_gpu clk_gpu_gx_gfx3d_clk>,
		 <&clock_gpu clk_gfx3d_clk_src_v2>;
};

/* GPU overrides */
&msm_gpu {
	/* Updated chip ID */
+4 −1
Original line number Diff line number Diff line
@@ -3681,7 +3681,8 @@ static int msm_gcc_8996_probe(struct platform_device *pdev)
	compat = of_get_property(pdev->dev.of_node, "compatible", &compatlen);
	if (!compat || (compatlen <= 0))
		return -EINVAL;
	is_v2 = !strcmp(compat, "qcom,gcc-8996-v2");
	is_v2 = !strcmp(compat, "qcom,gcc-8996-v2") ||
				!strcmp(compat, "qcom,gcc-8996-v3");
	if (is_v2)
		msm_clocks_gcc_8996_v2_fixup();

@@ -3718,6 +3719,7 @@ static int msm_gcc_8996_probe(struct platform_device *pdev)
static struct of_device_id msm_clock_gcc_match_table[] = {
	{ .compatible = "qcom,gcc-8996" },
	{ .compatible = "qcom,gcc-8996-v2" },
	{ .compatible = "qcom,gcc-8996-v3" },
	{}
};

@@ -3755,6 +3757,7 @@ static struct clk_lookup msm_clocks_measure_8996_v2[] = {
static struct of_device_id msm_clock_debug_match_table[] = {
	{ .compatible = "qcom,cc-debug-8996" },
	{ .compatible = "qcom,cc-debug-8996-v2" },
	{ .compatible = "qcom,cc-debug-8996-v3" },
	{}
};

+211 −12
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ static struct alpha_pll_vco_tbl mmpll_p_vco[] = {
};

static struct alpha_pll_vco_tbl mmpll_gfx_vco[] = {
	VCO(2,  500000000, 1000000000),
	VCO(2,  400000000, 1000000000),
	VCO(1, 1000000000, 1500000000),
	VCO(0, 1500000000, 2000000000),
};
@@ -423,6 +423,15 @@ static struct clk_freq_tbl ftbl_csi0_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi0_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_MM( 480000000,  mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,     mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk csi0_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI0_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -459,6 +468,16 @@ static struct clk_freq_tbl ftbl_vfe0_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_vfe0_clk_src_v3[] = {
	F_MM(  75000000,   mmsscc_gpll0_div,    4,    0,     0),
	F_MM( 100000000,   mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 300000000,       mmsscc_gpll0,    2,    0,     0),
	F_MM( 320000000,    mmpll0_out_main,  2.5,    0,     0),
	F_MM( 480000000,    mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,       mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk vfe0_clk_src = {
	.cmd_rcgr_reg = MMSS_VFE0_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -495,6 +514,16 @@ static struct clk_freq_tbl ftbl_vfe1_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_vfe1_clk_src_v3[] = {
	F_MM(  75000000,   mmsscc_gpll0_div,    4,    0,     0),
	F_MM( 100000000,   mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 300000000,       mmsscc_gpll0,    2,    0,     0),
	F_MM( 320000000,    mmpll0_out_main,  2.5,    0,     0),
	F_MM( 480000000,    mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,       mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk vfe1_clk_src = {
	.cmd_rcgr_reg = MMSS_VFE1_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -528,6 +557,15 @@ static struct clk_freq_tbl ftbl_csi1_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi1_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_MM( 480000000,  mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,     mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk csi1_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI1_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -561,6 +599,15 @@ static struct clk_freq_tbl ftbl_csi2_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi2_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_MM( 480000000,  mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,     mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk csi2_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI2_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -594,6 +641,15 @@ static struct clk_freq_tbl ftbl_csi3_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi3_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_MM( 480000000,  mmpll4_out_main,    2,    0,     0),
	F_MM( 600000000,     mmsscc_gpll0,    1,    0,     0),
	F_END
};

static struct rcg_clk csi3_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI3_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -875,6 +931,14 @@ static struct clk_freq_tbl ftbl_video_core_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_video_core_clk_src_v3[] = {
	F_MM(  75000000, mmsscc_gpll0_div,    4,    0,     0),
	F_MM( 150000000,     mmsscc_gpll0,    4,    0,     0),
	F_MM( 355333333,  mmpll3_out_main,    3,    0,     0),
	F_MM( 533000000,  mmpll3_out_main,    2,    0,     0),
	F_END
};

static struct rcg_clk video_core_clk_src = {
	.cmd_rcgr_reg = MMSS_VIDEO_CORE_CMD_RCGR,
	.set_rate = set_rate_mnd,
@@ -1197,6 +1261,13 @@ static struct clk_freq_tbl ftbl_csi0phytimer_clk_src[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi0phytimer_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_END
};

static struct rcg_clk csi0phytimer_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI0PHYTIMER_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -1218,6 +1289,13 @@ static struct clk_freq_tbl ftbl_csi1phytimer_clk_src[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi1phytimer_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_END
};

static struct rcg_clk csi1phytimer_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI1PHYTIMER_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -1239,6 +1317,13 @@ static struct clk_freq_tbl ftbl_csi2phytimer_clk_src[] = {
	F_END
};

static struct clk_freq_tbl ftbl_csi2phytimer_clk_src_v3[] = {
	F_MM( 100000000, mmsscc_gpll0_div,    3,    0,     0),
	F_MM( 200000000,     mmsscc_gpll0,    3,    0,     0),
	F_MM( 266666667,  mmpll0_out_main,    3,    0,     0),
	F_END
};

static struct rcg_clk csi2phytimer_clk_src = {
	.cmd_rcgr_reg = MMSS_CSI2PHYTIMER_CMD_RCGR,
	.set_rate = set_rate_hid,
@@ -1488,6 +1573,14 @@ static struct clk_freq_tbl ftbl_video_subcore0_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_video_subcore0_clk_src_v3[] = {
	F_MM(  75000000, mmsscc_gpll0_div,    4,    0,     0),
	F_MM( 150000000,     mmsscc_gpll0,    4,    0,     0),
	F_MM( 355333333,  mmpll3_out_main,    3,    0,     0),
	F_MM( 533000000,  mmpll3_out_main,    2,    0,     0),
	F_END
};

static struct rcg_clk video_subcore0_clk_src = {
	.cmd_rcgr_reg = MMSS_VIDEO_SUBCORE0_CMD_RCGR,
	.set_rate = set_rate_mnd,
@@ -1519,6 +1612,14 @@ static struct clk_freq_tbl ftbl_video_subcore1_clk_src_v2[] = {
	F_END
};

static struct clk_freq_tbl ftbl_video_subcore1_clk_src_v3[] = {
	F_MM(  75000000, mmsscc_gpll0_div,    4,    0,     0),
	F_MM( 150000000,     mmsscc_gpll0,    4,    0,     0),
	F_MM( 355333333,  mmpll3_out_main,    3,    0,     0),
	F_MM( 533000000,  mmpll3_out_main,    2,    0,     0),
	F_END
};

static struct rcg_clk video_subcore1_clk_src = {
	.cmd_rcgr_reg = MMSS_VIDEO_SUBCORE1_CMD_RCGR,
	.set_rate = set_rate_mnd,
@@ -3289,6 +3390,100 @@ static void msm_mmsscc_8996_v2_fixup(void)
	video_subcore1_clk_src.c.fmax[VDD_DIG_HIGH] = 516000000;
}

static void msm_mmsscc_8996_v3_fixup(void)
{
	mmpll1.c.rate = 810000000;
	mmpll1.c.fmax[VDD_DIG_LOWER] = 405000000;
	mmpll1.c.fmax[VDD_DIG_LOW] = 405000000;
	mmpll1.c.fmax[VDD_DIG_NOMINAL] = 810000000;
	mmpll1.c.fmax[VDD_DIG_HIGH] = 810000000;

	mmpll2.vco_tbl = mmpll_gfx_vco;
	mmpll2.num_vco = ARRAY_SIZE(mmpll_gfx_vco),
	mmpll2.c.rate = 0;
	mmpll2.c.fmax[VDD_DIG_LOWER] = 1000000000;
	mmpll2.c.fmax[VDD_DIG_LOW] = 1000000000;
	mmpll2.c.fmax[VDD_DIG_NOMINAL] = 1000000000;
	mmpll2.c.fmax[VDD_DIG_HIGH] = 1000000000;
	mmpll2.no_prepared_reconfig = true;
	mmpll2.c.ops = &clk_ops_alpha_pll;

	mmpll3.c.rate = 1066000000;
	mmpll3.c.fmax[VDD_DIG_LOWER] = 533000000;
	mmpll3.c.fmax[VDD_DIG_LOW] = 533000000;
	mmpll3.c.fmax[VDD_DIG_NOMINAL] = 1066000000;
	mmpll3.c.fmax[VDD_DIG_HIGH] = 1066000000;

	mmpll5.c.rate = 825000000;
	mmpll5.c.fmax[VDD_DIG_LOWER] = 412500000;
	mmpll5.c.fmax[VDD_DIG_LOW] = 825000000;
	mmpll5.c.fmax[VDD_DIG_NOMINAL] = 825000000;
	mmpll5.c.fmax[VDD_DIG_HIGH] = 825000000;

	mmpll8.vco_tbl = mmpll_gfx_vco;
	mmpll8.num_vco = ARRAY_SIZE(mmpll_gfx_vco),
	mmpll8.c.rate = 0;
	mmpll8.c.fmax[VDD_DIG_LOWER] = 1000000000;
	mmpll8.c.fmax[VDD_DIG_LOW] = 1000000000;
	mmpll8.c.fmax[VDD_DIG_NOMINAL] = 1000000000;
	mmpll8.c.fmax[VDD_DIG_HIGH] = 1000000000;
	mmpll8.no_prepared_reconfig = true;
	mmpll8.c.ops = &clk_ops_alpha_pll;

	mmpll9.c.rate = 1248000000;
	mmpll9.c.fmax[VDD_DIG_LOWER] = 624000000;
	mmpll9.c.fmax[VDD_DIG_LOW] = 624000000;
	mmpll9.c.fmax[VDD_DIG_NOMINAL] = 1248000000;
	mmpll9.c.fmax[VDD_DIG_HIGH] = 1248000000;

	csi0_clk_src.freq_tbl = ftbl_csi0_clk_src_v3;
	csi1_clk_src.freq_tbl = ftbl_csi1_clk_src_v3;
	csi2_clk_src.freq_tbl = ftbl_csi2_clk_src_v3;
	csi3_clk_src.freq_tbl = ftbl_csi3_clk_src_v3;

	csiphy0_3p_clk_src.freq_tbl = ftbl_csiphy0_3p_clk_src_v2;
	csiphy0_3p_clk_src.c.fmax[VDD_DIG_HIGH] = 384000000;
	csiphy1_3p_clk_src.freq_tbl = ftbl_csiphy1_3p_clk_src_v2;
	csiphy1_3p_clk_src.c.fmax[VDD_DIG_HIGH] = 384000000;
	csiphy2_3p_clk_src.freq_tbl = ftbl_csiphy2_3p_clk_src_v2;
	csiphy2_3p_clk_src.c.fmax[VDD_DIG_HIGH] = 384000000;

	csi0phytimer_clk_src.freq_tbl = ftbl_csi0phytimer_clk_src_v3;
	csi0phytimer_clk_src.c.fmax[VDD_DIG_LOW] = 200000000;
	csi1phytimer_clk_src.freq_tbl = ftbl_csi1phytimer_clk_src_v3;
	csi1phytimer_clk_src.c.fmax[VDD_DIG_LOW] = 200000000;
	csi2phytimer_clk_src.freq_tbl = ftbl_csi2phytimer_clk_src_v3;
	csi2phytimer_clk_src.c.fmax[VDD_DIG_LOW] = 200000000;

	vfe0_clk_src.freq_tbl = ftbl_vfe0_clk_src_v3;
	vfe0_clk_src.c.fmax[VDD_DIG_LOWER] = 100000000;
	vfe0_clk_src.c.fmax[VDD_DIG_LOW] = 300000000;
	vfe1_clk_src.freq_tbl = ftbl_vfe1_clk_src_v3;
	vfe1_clk_src.c.fmax[VDD_DIG_LOW] = 300000000;

	mdp_clk_src.freq_tbl = ftbl_mdp_clk_src_v2;
	mdp_clk_src.c.fmax[VDD_DIG_LOW] = 275000000;
	mdp_clk_src.c.fmax[VDD_DIG_NOMINAL] = 330000000;
	mdp_clk_src.c.fmax[VDD_DIG_HIGH] = 412500000;

	maxi_clk_src.freq_tbl = ftbl_maxi_clk_src_v2;
	maxi_clk_src.c.fmax[VDD_DIG_HIGH] = 405000000;

	rbcpr_clk_src.freq_tbl = ftbl_rbcpr_clk_src_v2;
	rbcpr_clk_src.c.fmax[VDD_DIG_NOMINAL] = 50000000;
	rbcpr_clk_src.c.fmax[VDD_DIG_HIGH] = 50000000;

	video_core_clk_src.freq_tbl = ftbl_video_core_clk_src_v3;
	video_core_clk_src.c.fmax[VDD_DIG_NOMINAL] = 355333333;
	video_core_clk_src.c.fmax[VDD_DIG_HIGH] = 533000000;
	video_subcore0_clk_src.freq_tbl = ftbl_video_subcore0_clk_src_v3;
	video_subcore0_clk_src.c.fmax[VDD_DIG_NOMINAL] = 355333333;
	video_subcore0_clk_src.c.fmax[VDD_DIG_HIGH] = 533000000;
	video_subcore1_clk_src.freq_tbl = ftbl_video_subcore1_clk_src_v3;
	video_subcore1_clk_src.c.fmax[VDD_DIG_NOMINAL] = 355333333;
	video_subcore1_clk_src.c.fmax[VDD_DIG_HIGH] = 533000000;
}

static int of_get_fmax_vdd_class(struct platform_device *pdev, struct clk *c,
								char *prop_name)
{
@@ -3399,13 +3594,7 @@ static void populate_gpu_opp_table(struct platform_device *pdev)
		if (!gpu_clk->fmax[i])
			continue;

		ret = clk_round_rate(gpu_clk, gpu_clk->fmax[i]);
		if (ret < 0) {
			pr_warn("clock-gpu: %s: round_rate failed at %lu - err: %d\n",
							__func__, rate, ret);
			return;
		}
		rate = ret;
		rate = gpu_clk->fmax[i];
		corner = vdd->vdd_uv[2 * i];
		uv = regulator_list_corner_voltage(vdd_gfx.regulator[0],
								corner);
@@ -3435,7 +3624,7 @@ int msm_mmsscc_8996_probe(struct platform_device *pdev)
	struct clk *tmp;
	struct regulator *reg;
	u32 regval;
	int is_v2 = 0;
	int is_v2, is_v3 = 0;

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cc_base");
	if (!res) {
@@ -3524,13 +3713,19 @@ int msm_mmsscc_8996_probe(struct platform_device *pdev)
	if (is_v2)
		msm_mmsscc_8996_v2_fixup();

	is_v3 = of_device_is_compatible(pdev->dev.of_node,
						"qcom,mmsscc-8996-v3");
	if (is_v3)
		msm_mmsscc_8996_v3_fixup();


	rc = of_msm_clock_register(pdev->dev.of_node, msm_clocks_mmss_8996,
				   ARRAY_SIZE(msm_clocks_mmss_8996));
	if (rc)
		return rc;

	/* Register v2 specific clocks */
	if (is_v2) {
	/* Register v2/v3 specific clocks */
	if (is_v2 || is_v3) {
		rc = of_msm_clock_register(pdev->dev.of_node,
				msm_clocks_mmsscc_8996_v2,
				ARRAY_SIZE(msm_clocks_mmsscc_8996_v2));
@@ -3545,6 +3740,7 @@ int msm_mmsscc_8996_probe(struct platform_device *pdev)
static struct of_device_id msm_clock_mmss_match_table[] = {
	{ .compatible = "qcom,mmsscc-8996" },
	{ .compatible = "qcom,mmsscc-8996-v2" },
	{ .compatible = "qcom,mmsscc-8996-v3" },
	{},
};

@@ -3649,7 +3845,9 @@ int msm_gpucc_8996_probe(struct platform_device *pdev)
	}

	is_v2_gpu = of_device_is_compatible(pdev->dev.of_node,
						"qcom,gpucc-8996-v2");
						"qcom,gpucc-8996-v2") ||
		of_device_is_compatible(pdev->dev.of_node,
						"qcom,gpucc-8996-v3");
	if (!is_v2_gpu) {
		rc = of_get_fmax_vdd_class(pdev, &gfx3d_clk_src.c,
					"qcom,gfxfreq-corner-v0");
@@ -3702,6 +3900,7 @@ int msm_gpucc_8996_probe(struct platform_device *pdev)
static struct of_device_id msm_clock_gpu_match_table[] = {
	{ .compatible = "qcom,gpucc-8996" },
	{ .compatible = "qcom,gpucc-8996-v2" },
	{ .compatible = "qcom,gpucc-8996-v3" },
	{},
};