Re: [PATCH v2 4/4] clk: qcom: gcc: Add support for QCS615 GCC clocks

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

 



On Wed, Oct 16, 2024 at 09:40:07AM +0530, Taniya Das wrote:
> 
> 
> On 9/20/2024 4:33 PM, Dmitry Baryshkov wrote:
> > On Fri, Sep 20, 2024 at 04:08:18PM GMT, Taniya Das wrote:
> > > Add the global clock controller support for QCS615 SoC.
> > > 
> > > Signed-off-by: Taniya Das <quic_tdas@xxxxxxxxxxx>
> > > ---
> > >   drivers/clk/qcom/Kconfig      |    9 +
> > >   drivers/clk/qcom/Makefile     |    1 +
> > >   drivers/clk/qcom/gcc-qcs615.c | 3035 +++++++++++++++++++++++++++++++++++++++++
> > >   3 files changed, 3045 insertions(+)
> > > 
> > > diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
> > > index a3e2a09e2105..52a7ba6d4cbf 100644
> > > --- a/drivers/clk/qcom/Kconfig
> > > +++ b/drivers/clk/qcom/Kconfig
> > > @@ -467,6 +467,15 @@ config QCS_GCC_404
> > >   	  Say Y if you want to use multimedia devices or peripheral
> > >   	  devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc.
> > > +config QCS_GCC_615
> > > +	tristate "QCS615 Global Clock Controller"
> > > +	depends on ARM64 || COMPILE_TEST
> > > +	select QCOM_GDSC
> > > +	help
> > > +	  Support for the global clock controller on QCS615 devices.
> > > +	  Say Y if you want to use multimedia devices or peripheral
> > > +	  devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc.
> > > +
> > >   config SC_CAMCC_7180
> > >   	tristate "SC7180 Camera Clock Controller"
> > >   	depends on ARM64 || COMPILE_TEST
> > > diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
> > > index 2b378667a63f..a46ce0723602 100644
> > > --- a/drivers/clk/qcom/Makefile
> > > +++ b/drivers/clk/qcom/Makefile
> > > @@ -70,6 +70,7 @@ obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o
> > >   obj-$(CONFIG_QCM_GCC_2290) += gcc-qcm2290.o
> > >   obj-$(CONFIG_QCM_DISPCC_2290) += dispcc-qcm2290.o
> > >   obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o
> > > +obj-$(CONFIG_QCS_GCC_615) += gcc-qcs615.o
> > >   obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o
> > >   obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
> > >   obj-$(CONFIG_QDU_ECPRICC_1000) += ecpricc-qdu1000.o
> > > diff --git a/drivers/clk/qcom/gcc-qcs615.c b/drivers/clk/qcom/gcc-qcs615.c
> > > new file mode 100644
> > > index 000000000000..7db55a5d8e80
> > > --- /dev/null
> > > +++ b/drivers/clk/qcom/gcc-qcs615.c
> > > @@ -0,0 +1,3035 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
> > > + */
> > > +
> > > +#include <linux/clk-provider.h>
> > > +#include <linux/module.h>
> > > +#include <linux/mod_devicetable.h>
> > > +#include <linux/of.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/regmap.h>
> > > +
> > > +#include <dt-bindings/clock/qcom,qcs615-gcc.h>
> > > +
> > > +#include "clk-alpha-pll.h"
> > > +#include "clk-branch.h"
> > > +#include "clk-rcg.h"
> > > +#include "clk-regmap.h"
> > > +#include "clk-regmap-divider.h"
> > > +#include "clk-regmap-mux.h"
> > > +#include "common.h"
> > > +#include "gdsc.h"
> > > +#include "reset.h"
> > > +
> > > +enum {
> > > +	DT_BI_TCXO,
> > > +	DT_BI_TCXO_AO,
> > > +	DT_SLEEP_CLK,
> > > +};
> > > +
> > > +enum {
> > > +	P_BI_TCXO,
> > > +	P_GPLL0_OUT_AUX2_DIV,
> > > +	P_GPLL0_OUT_MAIN,
> > > +	P_GPLL3_OUT_MAIN,
> > > +	P_GPLL3_OUT_MAIN_DIV,
> > > +	P_GPLL4_OUT_MAIN,
> > > +	P_GPLL6_OUT_MAIN,
> > > +	P_GPLL7_OUT_MAIN,
> > > +	P_GPLL8_OUT_MAIN,
> > > +	P_SLEEP_CLK,
> > > +};
> > > +
> > > +static struct clk_alpha_pll gpll0 = {
> > > +	.offset = 0x0,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(0),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll0",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static struct clk_fixed_factor gpll0_out_aux2_div = {
> > > +	.mult = 1,
> > > +	.div = 2,
> > > +	.hw.init = &(struct clk_init_data) {
> > > +		.name = "gpll0_out_aux2_div",
> > > +		.parent_data = &(const struct clk_parent_data) {
> > > +			.hw = &gpll0.clkr.hw,
> > > +		},
> > > +		.num_parents = 1,
> > > +		.ops = &clk_fixed_factor_ops,
> > > +	},
> > > +};
> > 
> > Should it be clk_alpha_pll_postdiv_foo_ops ?
> > 
> 
> This is not the PLL output, but it is a fixed divider which is placed as
> input to the RCG.
> That is the reason to use the fixed factor.

Usually OUT_AUX2 is the PLL output, isn't it? Even by its name. See
gcc-qcm2290 / gcc-sm6115 and most of other clock controller drivers,
except gcc-sm6125. Maybe I don't understand the difference between the
two usecases. Is there a difference in the GCC / PLL design?

> > > +
> > > +static struct clk_alpha_pll gpll3 = {
> > > +	.offset = 0x3000,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(3),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll3",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static struct clk_fixed_factor gpll3_out_aux2_div = {
> > > +	.mult = 1,
> > > +	.div = 2,
> > > +	.hw.init = &(struct clk_init_data) {
> > > +		.name = "gpll3_out_aux2_div",
> > > +		.parent_data = &(const struct clk_parent_data) {
> > > +			.hw = &gpll3.clkr.hw,
> > > +		},
> > > +		.num_parents = 1,
> > > +		.ops = &clk_fixed_factor_ops,
> > > +	},
> > > +};
> > 
> > Should it be clk_alpha_pll_postdiv_foo_ops ?
> > 
> 
> Same is the case here as well. This is not the PLL output, but it is a fixed
> divider which is placed as input to the RCG.
> That is the reason to use the fixed factor.
> 
> > > +
> > > +static struct clk_alpha_pll gpll4 = {
> > > +	.offset = 0x76000,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(4),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll4",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static struct clk_alpha_pll gpll6 = {
> > > +	.offset = 0x13000,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(6),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll6",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static const struct clk_div_table post_div_table_gpll6_out_main[] = {
> > > +	{ 0x1, 2 },
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_alpha_pll_postdiv gpll6_out_main = {
> > > +	.offset = 0x13000,
> > > +	.post_div_shift = 8,
> > > +	.post_div_table = post_div_table_gpll6_out_main,
> > > +	.num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_main),
> > > +	.width = 4,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gpll6_out_main",
> > > +		.parent_hws = (const struct clk_hw*[]) {
> > > +			&gpll6.clkr.hw,
> > > +		},
> > > +		.num_parents = 1,
> > > +		.ops = &clk_alpha_pll_postdiv_ops,
> > > +	},
> > > +};
> > > +
> > > +static struct clk_alpha_pll gpll7 = {
> > > +	.offset = 0x1a000,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(7),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll7",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static struct clk_alpha_pll gpll8 = {
> > > +	.offset = 0x1b000,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr = {
> > > +		.enable_reg = 0x52000,
> > > +		.enable_mask = BIT(8),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gpll8",
> > > +			.parent_data = &(const struct clk_parent_data) {
> > > +				.index = DT_BI_TCXO,
> > > +			},
> > > +			.num_parents = 1,
> > > +			.ops = &clk_alpha_pll_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > > +static const struct clk_div_table post_div_table_gpll8_out_main[] = {
> > > +	{ 0x1, 2 },
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_alpha_pll_postdiv gpll8_out_main = {
> > > +	.offset = 0x1b000,
> > > +	.post_div_shift = 8,
> > > +	.post_div_table = post_div_table_gpll8_out_main,
> > > +	.num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_main),
> > > +	.width = 4,
> > > +	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gpll8_out_main",
> > > +		.parent_hws = (const struct clk_hw*[]) {
> > > +			&gpll8.clkr.hw,
> > > +		},
> > > +		.num_parents = 1,
> > > +		.ops = &clk_alpha_pll_postdiv_ops,
> > > +	},
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_0[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_0[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_0_ao[] = {
> > > +	{ .index = DT_BI_TCXO_AO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_1[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL6_OUT_MAIN, 2 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_1[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll6_out_main.clkr.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_2[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_SLEEP_CLK, 5 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_2[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .index = DT_SLEEP_CLK },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_3[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_SLEEP_CLK, 5 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_3[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .index = DT_SLEEP_CLK },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_4[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_4[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_5[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL7_OUT_MAIN, 3 },
> > > +	{ P_GPLL4_OUT_MAIN, 5 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_5[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll7.clkr.hw },
> > > +	{ .hw = &gpll4.clkr.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_6[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL7_OUT_MAIN, 3 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_6[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll7.clkr.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_7[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL3_OUT_MAIN_DIV, 4 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_7[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll3_out_aux2_div.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_8[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL8_OUT_MAIN, 2 },
> > > +	{ P_GPLL4_OUT_MAIN, 5 },
> > > +	{ P_GPLL0_OUT_AUX2_DIV, 6 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_8[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll8_out_main.clkr.hw },
> > > +	{ .hw = &gpll4.clkr.hw },
> > > +	{ .hw = &gpll0_out_aux2_div.hw },
> > > +};
> > > +
> > > +static const struct parent_map gcc_parent_map_9[] = {
> > > +	{ P_BI_TCXO, 0 },
> > > +	{ P_GPLL0_OUT_MAIN, 1 },
> > > +	{ P_GPLL3_OUT_MAIN, 4 },
> > > +};
> > > +
> > > +static const struct clk_parent_data gcc_parent_data_9[] = {
> > > +	{ .index = DT_BI_TCXO },
> > > +	{ .hw = &gpll0.clkr.hw },
> > > +	{ .hw = &gpll3.clkr.hw },
> > > +};
> > > +
> > > +static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
> > > +	F(19200000, P_BI_TCXO, 1, 0, 0),
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
> > > +	.cmd_rcgr = 0x48014,
> > > +	.mnd_width = 0,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_0,
> > > +	.freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_cpuss_ahb_clk_src",
> > > +		.parent_data = gcc_parent_data_0_ao,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_0_ao),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static const struct freq_tbl ftbl_gcc_emac_ptp_clk_src[] = {
> > > +	F(19200000, P_BI_TCXO, 1, 0, 0),
> > > +	F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0),
> > > +	F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0),
> > > +	F(125000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
> > > +	F(250000000, P_GPLL7_OUT_MAIN, 2, 0, 0),
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_emac_ptp_clk_src = {
> > > +	.cmd_rcgr = 0x6038,
> > > +	.mnd_width = 0,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_5,
> > > +	.freq_tbl = ftbl_gcc_emac_ptp_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_emac_ptp_clk_src",
> > > +		.parent_data = gcc_parent_data_5,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_5),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static const struct freq_tbl ftbl_gcc_emac_rgmii_clk_src[] = {
> > > +	F(2500000, P_BI_TCXO, 1, 25, 192),
> > > +	F(5000000, P_BI_TCXO, 1, 25, 96),
> > > +	F(19200000, P_BI_TCXO, 1, 0, 0),
> > > +	F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0),
> > > +	F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0),
> > > +	F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0),
> > > +	F(125000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
> > > +	F(250000000, P_GPLL7_OUT_MAIN, 2, 0, 0),
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_emac_rgmii_clk_src = {
> > > +	.cmd_rcgr = 0x601c,
> > > +	.mnd_width = 8,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_6,
> > > +	.freq_tbl = ftbl_gcc_emac_rgmii_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_emac_rgmii_clk_src",
> > > +		.parent_data = gcc_parent_data_6,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_6),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
> > > +	F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0),
> > > +	F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0),
> > > +	F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
> > > +	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_gp1_clk_src = {
> > > +	.cmd_rcgr = 0x64004,
> > > +	.mnd_width = 8,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_2,
> > > +	.freq_tbl = ftbl_gcc_gp1_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_gp1_clk_src",
> > > +		.parent_data = gcc_parent_data_2,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_2),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_gp2_clk_src = {
> > > +	.cmd_rcgr = 0x65004,
> > > +	.mnd_width = 8,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_2,
> > > +	.freq_tbl = ftbl_gcc_gp1_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_gp2_clk_src",
> > > +		.parent_data = gcc_parent_data_2,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_2),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_gp3_clk_src = {
> > > +	.cmd_rcgr = 0x66004,
> > > +	.mnd_width = 8,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_2,
> > > +	.freq_tbl = ftbl_gcc_gp1_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_gp3_clk_src",
> > > +		.parent_data = gcc_parent_data_2,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_2),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = {
> > > +	F(9600000, P_BI_TCXO, 2, 0, 0),
> > > +	F(19200000, P_BI_TCXO, 1, 0, 0),
> > > +	{ }
> > > +};
> > > +
> > > +static struct clk_rcg2 gcc_pcie_0_aux_clk_src = {
> > > +	.cmd_rcgr = 0x6b02c,
> > > +	.mnd_width = 16,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_3,
> > > +	.freq_tbl = ftbl_gcc_pcie_0_aux_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_pcie_0_aux_clk_src",
> > > +		.parent_data = gcc_parent_data_3,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_3),
> > > +		.ops = &clk_rcg2_ops,
> > 
> > Should it be using shared ops?
> > I think there are other clocks here which are usually
> > clk_rcg2_shared_ops.
> > 
> 
> As the source frequency is derived from 19.2MHz, so I left it as the normal
> RCG ops. I can update it in the next patch.
> 
> > > +	},
> > > +};
> > > +
> > 
> > [...]
> > 
> > > +static struct clk_rcg2 gcc_vsensor_clk_src = {
> > > +	.cmd_rcgr = 0x7a018,
> > > +	.mnd_width = 0,
> > > +	.hid_width = 5,
> > > +	.parent_map = gcc_parent_map_9,
> > > +	.freq_tbl = ftbl_gcc_vsensor_clk_src,
> > > +	.clkr.hw.init = &(const struct clk_init_data) {
> > > +		.name = "gcc_vsensor_clk_src",
> > > +		.parent_data = gcc_parent_data_9,
> > > +		.num_parents = ARRAY_SIZE(gcc_parent_data_9),
> > > +		.ops = &clk_rcg2_ops,
> > > +	},
> > > +};
> > > +
> > > +
> > 
> > Extra empty line
> > 
> Sure, will take care in the next patch.
> 
> 
> > > +static struct clk_branch gcc_aggre_ufs_phy_axi_clk = {
> > > +	.halt_reg = 0x770c0,
> > > +	.halt_check = BRANCH_HALT_VOTED,
> > 
> > [...]
> > 
> > > +
> > > +static struct clk_branch gcc_pcie_0_pipe_clk = {
> > > +	.halt_reg = 0x6b024,
> > > +	.halt_check = BRANCH_HALT_SKIP,
> > > +	.clkr = {
> > > +		.enable_reg = 0x5200c,
> > > +		.enable_mask = BIT(4),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gcc_pcie_0_pipe_clk",
> > > +			.ops = &clk_branch2_ops,
> > > +		},
> > > +	},
> > > +};
> > 
> > No corresponding gcc_pcie_0_pipe_clk_src?
> > 
> 
> On QCS615 the pipe clock source is not required to be modelled as the mux is
> default Power on reset is set to external pipe clock.

And do we need to toggle the source of the clk_src together with the
GDSC toggling?

> 
> > > +
> > > +static struct clk_branch gcc_pcie_0_slv_axi_clk = {
> > > +	.halt_reg = 0x6b014,
> > > +	.halt_check = BRANCH_HALT_VOTED,
> > > +	.hwcg_reg = 0x6b014,
> > > +	.hwcg_bit = 1,
> > > +	.clkr = {
> > > +		.enable_reg = 0x5200c,
> > > +		.enable_mask = BIT(0),
> > > +		.hw.init = &(const struct clk_init_data) {
> > > +			.name = "gcc_pcie_0_slv_axi_clk",
> > > +			.ops = &clk_branch2_ops,
> > > +		},
> > > +	},
> > > +};
> > > +
> > 
> > [...]
> > 
> 
> -- 
> Thanks & Regards,
> Taniya Das.

-- 
With best wishes
Dmitry




[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