Re: [PATCH 2/2] clk: qcom: Add MSM8226 Multimedia Clock Controller support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Bartosz,

thanks for the patch!

On Samstag, 13. November 2021 02:58:44 CET Bartosz Dudziak wrote:
> Modify the existing MSM8974 multimedia clock controller driver to
> support the MMCC found on MSM8226 based devices. This should allow most
> multimedia device drivers to probe and control their clocks.
> 
> Signed-off-by: Bartosz Dudziak <bartosz.dudziak@xxxxxxxx>

Tested-by: Luca Weiss <luca@xxxxxxxxx> # lg-lenok

And for reference, I've used this devicetree node:

mmcc: clock-controller@fd8c0000 {
        compatible = "qcom,mmcc-msm8226";
        #clock-cells = <1>;
        #reset-cells = <1>;
        #power-domain-cells = <1>;
        reg = <0xfd8c0000 0x6000>;
};

I think it makes sense adding this to qcom-msm8226.dtsi in this patch series?

Regards,
Luca

> ---
>  drivers/clk/qcom/mmcc-msm8974.c | 206 +++++++++++++++++++++++++++++++-
>  1 file changed, 201 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/clk/qcom/mmcc-msm8974.c
> b/drivers/clk/qcom/mmcc-msm8974.c index a1552b677..e890a23c2 100644
> --- a/drivers/clk/qcom/mmcc-msm8974.c
> +++ b/drivers/clk/qcom/mmcc-msm8974.c
> @@ -257,6 +257,18 @@ static struct clk_rcg2 mmss_ahb_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_mmss_axi_clk_msm8226[] = {
> +	F(19200000, P_XO, 1, 0, 0),
> +	F(37500000, P_GPLL0, 16, 0, 0),
> +	F(50000000, P_GPLL0, 12, 0, 0),
> +	F(75000000, P_GPLL0, 8, 0, 0),
> +	F(100000000, P_GPLL0, 6, 0, 0),
> +	F(150000000, P_GPLL0, 4, 0, 0),
> +	F(200000000, P_MMPLL0, 4, 0, 0),
> +	F(266666666, P_MMPLL0, 3, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_mmss_axi_clk[] = {
>  	F( 19200000, P_XO, 1, 0, 0),
>  	F( 37500000, P_GPLL0, 16, 0, 0),
> @@ -364,6 +376,23 @@ static struct clk_rcg2 csi3_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_camss_vfe_vfe0_clk_msm8226[] = {
> +	F(37500000, P_GPLL0, 16, 0, 0),
> +	F(50000000, P_GPLL0, 12, 0, 0),
> +	F(60000000, P_GPLL0, 10, 0, 0),
> +	F(80000000, P_GPLL0, 7.5, 0, 0),
> +	F(100000000, P_GPLL0, 6, 0, 0),
> +	F(109090000, P_GPLL0, 5.5, 0, 0),
> +	F(133330000, P_GPLL0, 4.5, 0, 0),
> +	F(150000000, P_GPLL0, 4, 0, 0),
> +	F(200000000, P_GPLL0, 3, 0, 0),
> +	F(228570000, P_MMPLL0, 3.5, 0, 0),
> +	F(266670000, P_MMPLL0, 3, 0, 0),
> +	F(320000000, P_MMPLL0, 2.5, 0, 0),
> +	F(400000000, P_MMPLL0, 2, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_camss_vfe_vfe0_1_clk[] = {
>  	F(37500000, P_GPLL0, 16, 0, 0),
>  	F(50000000, P_GPLL0, 12, 0, 0),
> @@ -407,6 +436,18 @@ static struct clk_rcg2 vfe1_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_mdss_mdp_clk_msm8226[] = {
> +	F(37500000, P_GPLL0, 16, 0, 0),
> +	F(60000000, P_GPLL0, 10, 0, 0),
> +	F(75000000, P_GPLL0, 8, 0, 0),
> +	F(92310000, P_GPLL0, 6.5, 0, 0),
> +	F(100000000, P_GPLL0, 6, 0, 0),
> +	F(133330000, P_MMPLL0, 6, 0, 0),
> +	F(177780000, P_MMPLL0, 4.5, 0, 0),
> +	F(200000000, P_MMPLL0, 4, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_mdss_mdp_clk[] = {
>  	F(37500000, P_GPLL0, 16, 0, 0),
>  	F(60000000, P_GPLL0, 10, 0, 0),
> @@ -513,6 +554,14 @@ static struct clk_rcg2 pclk1_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_venus0_vcodec0_clk_msm8226[] = {
> +	F(66700000, P_GPLL0, 9, 0, 0),
> +	F(100000000, P_GPLL0, 6, 0, 0),
> +	F(133330000, P_MMPLL0, 6, 0, 0),
> +	F(160000000, P_MMPLL0, 5, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_venus0_vcodec0_clk[] = {
>  	F(50000000, P_GPLL0, 12, 0, 0),
>  	F(100000000, P_GPLL0, 6, 0, 0),
> @@ -593,6 +642,13 @@ static struct clk_rcg2 camss_gp1_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_camss_mclk0_3_clk_msm8226[] = {
> +	F(19200000, P_XO, 1, 0, 0),
> +	F(24000000, P_GPLL0, 5, 1, 5),
> +	F(66670000, P_GPLL0, 9, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_camss_mclk0_3_clk[] = {
>  	F(4800000, P_XO, 4, 0, 0),
>  	F(6000000, P_GPLL0, 10, 1, 10),
> @@ -705,6 +761,15 @@ static struct clk_rcg2 csi2phytimer_clk_src = {
>  	},
>  };
> 
> +static struct freq_tbl ftbl_camss_vfe_cpp_clk_msm8226[] = {
> +	F(133330000, P_GPLL0, 4.5, 0, 0),
> +	F(150000000, P_GPLL0, 4, 0, 0),
> +	F(266670000, P_MMPLL0, 3, 0, 0),
> +	F(320000000, P_MMPLL0, 2.5, 0, 0),
> +	F(400000000, P_MMPLL0, 2, 0, 0),
> +	{ }
> +};
> +
>  static struct freq_tbl ftbl_camss_vfe_cpp_clk[] = {
>  	F(133330000, P_GPLL0, 4.5, 0, 0),
>  	F(266670000, P_MMPLL0, 3, 0, 0),
> @@ -2366,6 +2431,116 @@ static struct gdsc oxilicx_gdsc = {
>  	.pwrsts = PWRSTS_OFF_ON,
>  };
> 
> +static struct clk_regmap *mmcc_msm8226_clocks[] = {
> +	[MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr,
> +	[MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr,
> +	[MMPLL0] = &mmpll0.clkr,
> +	[MMPLL0_VOTE] = &mmpll0_vote,
> +	[MMPLL1] = &mmpll1.clkr,
> +	[MMPLL1_VOTE] = &mmpll1_vote,
> +	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
> +	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
> +	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
> +	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
> +	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
> +	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
> +	[VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
> +	[CCI_CLK_SRC] = &cci_clk_src.clkr,
> +	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
> +	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
> +	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
> +	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
> +	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
> +	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
> +	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
> +	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
> +	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
> +	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
> +	[CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr,
> +	[CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr,
> +	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
> +	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
> +	[CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
> +	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
> +	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
> +	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
> +	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
> +	[CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
> +	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
> +	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
> +	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
> +	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
> +	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
> +	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
> +	[CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr,
> +	[CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr,
> +	[CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr,
> +	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
> +	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
> +	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
> +	[CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr,
> +	[CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr,
> +	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
> +	[CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr,
> +	[CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr,
> +	[CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr,
> +	[CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr,
> +	[CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr,
> +	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
> +	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
> +	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
> +	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
> +	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
> +	[MDSS_MDP_LUT_CLK] = &mdss_mdp_lut_clk.clkr,
> +	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
> +	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
> +	[MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
> +	[MMSS_MMSSNOC_AHB_CLK] = &mmss_mmssnoc_ahb_clk.clkr,
> +	[MMSS_MMSSNOC_BTO_AHB_CLK] = &mmss_mmssnoc_bto_ahb_clk.clkr,
> +	[MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr,
> +	[MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr,
> +	[OCMEMCX_AHB_CLK] = &ocmemcx_ahb_clk.clkr,
> +	[OXILI_OCMEMGX_CLK] = &oxili_ocmemgx_clk.clkr,
> +	[OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr,
> +	[OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr,
> +	[OXILICX_AXI_CLK] = &oxilicx_axi_clk.clkr,
> +	[VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr,
> +	[VENUS0_AXI_CLK] = &venus0_axi_clk.clkr,
> +	[VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr,
> +};
> +
> +static const struct qcom_reset_map mmcc_msm8226_resets[] = {
> +	[SPDM_RESET] = { 0x0200 },
> +	[SPDM_RM_RESET] = { 0x0300 },
> +	[VENUS0_RESET] = { 0x1020 },
> +	[MDSS_RESET] = { 0x2300 },
> +};
> +
> +static struct gdsc *mmcc_msm8226_gdscs[] = {
> +	[VENUS0_GDSC] = &venus0_gdsc,
> +	[MDSS_GDSC] = &mdss_gdsc,
> +	[CAMSS_JPEG_GDSC] = &camss_jpeg_gdsc,
> +	[CAMSS_VFE_GDSC] = &camss_vfe_gdsc,
> +};
> +
> +static const struct regmap_config mmcc_msm8226_regmap_config = {
> +	.reg_bits	= 32,
> +	.reg_stride	= 4,
> +	.val_bits	= 32,
> +	.max_register	= 0x5104,
> +	.fast_io	= true,
> +};
> +
> +static const struct qcom_cc_desc mmcc_msm8226_desc = {
> +	.config = &mmcc_msm8226_regmap_config,
> +	.clks = mmcc_msm8226_clocks,
> +	.num_clks = ARRAY_SIZE(mmcc_msm8226_clocks),
> +	.resets = mmcc_msm8226_resets,
> +	.num_resets = ARRAY_SIZE(mmcc_msm8226_resets),
> +	.gdscs = mmcc_msm8226_gdscs,
> +	.num_gdscs = ARRAY_SIZE(mmcc_msm8226_gdscs),
> +};
> +
>  static struct clk_regmap *mmcc_msm8974_clocks[] = {
>  	[MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr,
>  	[MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr,
> @@ -2569,23 +2744,44 @@ static const struct qcom_cc_desc mmcc_msm8974_desc =
> { };
> 
>  static const struct of_device_id mmcc_msm8974_match_table[] = {
> -	{ .compatible = "qcom,mmcc-msm8974" },
> +	{ .compatible = "qcom,mmcc-msm8226", .data = &mmcc_msm8226_desc },
> +	{ .compatible = "qcom,mmcc-msm8974", .data = &mmcc_msm8974_desc },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table);
> 
> +static void msm8226_clock_override(void)
> +{
> +	mmss_axi_clk_src.freq_tbl = ftbl_mmss_axi_clk_msm8226;
> +	vfe0_clk_src.freq_tbl = ftbl_camss_vfe_vfe0_clk_msm8226;
> +	mdp_clk_src.freq_tbl = ftbl_mdss_mdp_clk_msm8226;
> +	vcodec0_clk_src.freq_tbl = ftbl_venus0_vcodec0_clk_msm8226;
> +	mclk0_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226;
> +	mclk1_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226;
> +	cpp_clk_src.freq_tbl = ftbl_camss_vfe_cpp_clk_msm8226;
> +}
> +
>  static int mmcc_msm8974_probe(struct platform_device *pdev)
>  {
>  	struct regmap *regmap;
> +	const struct of_device_id *match;
> +
> +	match = of_match_device(mmcc_msm8974_match_table, &pdev->dev);
> +	if (!match)
> +		return -ENODEV;
> 
> -	regmap = qcom_cc_map(pdev, &mmcc_msm8974_desc);
> +	regmap = qcom_cc_map(pdev, match->data);
>  	if (IS_ERR(regmap))
>  		return PTR_ERR(regmap);
> 
> -	clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
> -	clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
> +	if (match->data == &mmcc_msm8974_desc) {
> +		clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, 
&mmpll1_config, true);
> +		clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, 
&mmpll3_config, false);
> +	} else {
> +		msm8226_clock_override();
> +	}
> 
> -	return qcom_cc_really_probe(pdev, &mmcc_msm8974_desc, regmap);
> +	return qcom_cc_really_probe(pdev, match->data, regmap);
>  }
> 
>  static struct platform_driver mmcc_msm8974_driver = {







[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux