Skip to content

Commit 62782ba

Browse files
Sam ProtsenkoSylwester Nawrocki
authored andcommitted
clk: samsung: exynos850: Implement CMU_CMGP domain
CMU_CMGP clock domain provides clocks for CMGP IP-core (Common GPIO). CMGP module encapsulates next blocks: - 8 GPIO lines - 1 GPADC - 2 USI blocks, each can be configured to provide one of UART/SPI/HSI2C serial interfaces Signed-off-by: Sam Protsenko <[email protected]> Signed-off-by: Sylwester Nawrocki <[email protected]> Reviewed-by: Krzysztof Kozlowski <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent c2afeb7 commit 62782ba

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

drivers/clk/samsung/clk-exynos850.c

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,103 @@ static const struct samsung_cmu_info apm_cmu_info __initconst = {
492492
.clk_name = "dout_clkcmu_apm_bus",
493493
};
494494

495+
/* ---- CMU_CMGP ------------------------------------------------------------ */
496+
497+
/* Register Offset definitions for CMU_CMGP (0x11c00000) */
498+
#define CLK_CON_MUX_CLK_CMGP_ADC 0x1000
499+
#define CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP0 0x1004
500+
#define CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP1 0x1008
501+
#define CLK_CON_DIV_DIV_CLK_CMGP_ADC 0x1800
502+
#define CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP0 0x1804
503+
#define CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP1 0x1808
504+
#define CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S0 0x200c
505+
#define CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S1 0x2010
506+
#define CLK_CON_GAT_GOUT_CMGP_GPIO_PCLK 0x2018
507+
#define CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_IPCLK 0x2044
508+
#define CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_PCLK 0x2048
509+
#define CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_IPCLK 0x204c
510+
#define CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_PCLK 0x2050
511+
512+
static const unsigned long cmgp_clk_regs[] __initconst = {
513+
CLK_CON_MUX_CLK_CMGP_ADC,
514+
CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP0,
515+
CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP1,
516+
CLK_CON_DIV_DIV_CLK_CMGP_ADC,
517+
CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP0,
518+
CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP1,
519+
CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S0,
520+
CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S1,
521+
CLK_CON_GAT_GOUT_CMGP_GPIO_PCLK,
522+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_IPCLK,
523+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_PCLK,
524+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_IPCLK,
525+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_PCLK,
526+
};
527+
528+
/* List of parent clocks for Muxes in CMU_CMGP */
529+
PNAME(mout_cmgp_usi0_p) = { "clk_rco_cmgp", "gout_clkcmu_cmgp_bus" };
530+
PNAME(mout_cmgp_usi1_p) = { "clk_rco_cmgp", "gout_clkcmu_cmgp_bus" };
531+
PNAME(mout_cmgp_adc_p) = { "oscclk", "dout_cmgp_adc" };
532+
533+
static const struct samsung_fixed_rate_clock cmgp_fixed_clks[] __initconst = {
534+
FRATE(CLK_RCO_CMGP, "clk_rco_cmgp", NULL, 0, 49152000),
535+
};
536+
537+
static const struct samsung_mux_clock cmgp_mux_clks[] __initconst = {
538+
MUX(CLK_MOUT_CMGP_ADC, "mout_cmgp_adc", mout_cmgp_adc_p,
539+
CLK_CON_MUX_CLK_CMGP_ADC, 0, 1),
540+
MUX(CLK_MOUT_CMGP_USI0, "mout_cmgp_usi0", mout_cmgp_usi0_p,
541+
CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP0, 0, 1),
542+
MUX(CLK_MOUT_CMGP_USI1, "mout_cmgp_usi1", mout_cmgp_usi1_p,
543+
CLK_CON_MUX_MUX_CLK_CMGP_USI_CMGP1, 0, 1),
544+
};
545+
546+
static const struct samsung_div_clock cmgp_div_clks[] __initconst = {
547+
DIV(CLK_DOUT_CMGP_ADC, "dout_cmgp_adc", "gout_clkcmu_cmgp_bus",
548+
CLK_CON_DIV_DIV_CLK_CMGP_ADC, 0, 4),
549+
DIV(CLK_DOUT_CMGP_USI0, "dout_cmgp_usi0", "mout_cmgp_usi0",
550+
CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP0, 0, 5),
551+
DIV(CLK_DOUT_CMGP_USI1, "dout_cmgp_usi1", "mout_cmgp_usi1",
552+
CLK_CON_DIV_DIV_CLK_CMGP_USI_CMGP1, 0, 5),
553+
};
554+
555+
static const struct samsung_gate_clock cmgp_gate_clks[] __initconst = {
556+
GATE(CLK_GOUT_CMGP_ADC_S0_PCLK, "gout_adc_s0_pclk",
557+
"gout_clkcmu_cmgp_bus",
558+
CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S0, 21, 0, 0),
559+
GATE(CLK_GOUT_CMGP_ADC_S1_PCLK, "gout_adc_s1_pclk",
560+
"gout_clkcmu_cmgp_bus",
561+
CLK_CON_GAT_GOUT_CMGP_ADC_PCLK_S1, 21, 0, 0),
562+
GATE(CLK_GOUT_CMGP_GPIO_PCLK, "gout_gpio_cmgp_pclk",
563+
"gout_clkcmu_cmgp_bus",
564+
CLK_CON_GAT_GOUT_CMGP_GPIO_PCLK, 21, 0, 0),
565+
GATE(CLK_GOUT_CMGP_USI0_IPCLK, "gout_cmgp_usi0_ipclk", "dout_cmgp_usi0",
566+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_IPCLK, 21, 0, 0),
567+
GATE(CLK_GOUT_CMGP_USI0_PCLK, "gout_cmgp_usi0_pclk",
568+
"gout_clkcmu_cmgp_bus",
569+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP0_PCLK, 21, 0, 0),
570+
GATE(CLK_GOUT_CMGP_USI1_IPCLK, "gout_cmgp_usi1_ipclk", "dout_cmgp_usi1",
571+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_IPCLK, 21, 0, 0),
572+
GATE(CLK_GOUT_CMGP_USI1_PCLK, "gout_cmgp_usi1_pclk",
573+
"gout_clkcmu_cmgp_bus",
574+
CLK_CON_GAT_GOUT_CMGP_USI_CMGP1_PCLK, 21, 0, 0),
575+
};
576+
577+
static const struct samsung_cmu_info cmgp_cmu_info __initconst = {
578+
.mux_clks = cmgp_mux_clks,
579+
.nr_mux_clks = ARRAY_SIZE(cmgp_mux_clks),
580+
.div_clks = cmgp_div_clks,
581+
.nr_div_clks = ARRAY_SIZE(cmgp_div_clks),
582+
.gate_clks = cmgp_gate_clks,
583+
.nr_gate_clks = ARRAY_SIZE(cmgp_gate_clks),
584+
.fixed_clks = cmgp_fixed_clks,
585+
.nr_fixed_clks = ARRAY_SIZE(cmgp_fixed_clks),
586+
.nr_clk_ids = CMGP_NR_CLK,
587+
.clk_regs = cmgp_clk_regs,
588+
.nr_clk_regs = ARRAY_SIZE(cmgp_clk_regs),
589+
.clk_name = "gout_clkcmu_cmgp_bus",
590+
};
591+
495592
/* ---- CMU_HSI ------------------------------------------------------------- */
496593

497594
/* Register Offset definitions for CMU_HSI (0x13400000) */
@@ -943,6 +1040,9 @@ static const struct of_device_id exynos850_cmu_of_match[] = {
9431040
{
9441041
.compatible = "samsung,exynos850-cmu-apm",
9451042
.data = &apm_cmu_info,
1043+
}, {
1044+
.compatible = "samsung,exynos850-cmu-cmgp",
1045+
.data = &cmgp_cmu_info,
9461046
}, {
9471047
.compatible = "samsung,exynos850-cmu-hsi",
9481048
.data = &hsi_cmu_info,

0 commit comments

Comments
 (0)