Skip to contentSkip to conversation

clk: exynos: add support for exynos5260 SoC

PATCH Superseded Rahul Sharma 4 participants 16 messages Mar 12, 2014 – Mar 23, 2014

Subsystems (4)

v5 of 8 Superseded Latest is v8 →

lore
Share & tools
lore
#0 lore raw

v5 cover clk: exynos: add support for exynos5260 SoC

From: Rahul Sharma <[email protected]>

Add clock support for exynos5260 SoC.

This series is based on Tomasz Figa's samsung-next branch.

V5:
1) Include S3c2412 and S3c2443 in clock provider patch.
2) Added SCLK_TOP_FIMD with CLK_IGNORE_UNUSED due to Suspend failure.
3) Moved exynos5260-clk.h to include/dt-bindings/clock.
4) Fix exynos5260_clk_sleep_init protoype for PM disabled.
5) Moved fixed clock registeration to DT.
6) Removed CLK_IGNORE_UNUSED flags from UART clocks. Earlier facing issues because of RFS probing all TTYs.

V4:
1) Rework clock file as per Tomasz review comments at

        http://www.spinics.net/lists/arm-kernel/msg310116.html.

V3:
1) Removed "samsung,exynos5260-clock" property from clock files.
2) Replaced "__SPIN_LOCK_UNLOCKED(lock)" with spin_lock_init.
3) Removed '(' and ')' around numeric constants in macros.

V2:
1) Move suspend resume handling to Exynos5410 Clock file.
2) Removed Unused Macros and Condition checks for Exynos5260.
3) Add spin lock to clock provider context.
4) Add clock provider context for Exynos5410.
5) Uniform implementation for callbacks for PLL2550xx.
6) Split Exynos5260 clock file patch to bring it under 100 Kb limit.
7) Replace aclk/pclk/hclk gates with combined gates.
8) Remove CLK_IGNORE_UNUSED flag for gate clocks.

Pankaj Dubey (1):
clk/samsung: add support for pll2550xx

Rahul Sharma (4):
clk/samsung: add support for multiple clock providers clk/samsung: add support for pll2650xx clk/exynos5260: add macros and documentation for exynos5260 clk/exynos5260: add clock file for exynos5260

 .../devicetree/bindings/clock/exynos5260-clock.txt |   55 +
 drivers/clk/samsung/Makefile                       |    1 +
 drivers/clk/samsung/clk-exynos4.c                  |   47 +-
 drivers/clk/samsung/clk-exynos5250.c               |   25 +-
 drivers/clk/samsung/clk-exynos5260.c               | 1805 ++++++++++++++++++++
 drivers/clk/samsung/clk-exynos5260.h               |  448 +++++
 drivers/clk/samsung/clk-exynos5420.c               |   24 +-
 drivers/clk/samsung/clk-exynos5440.c               |   18 +-
 drivers/clk/samsung/clk-pll.c                      |  223 ++-
 drivers/clk/samsung/clk-pll.h                      |    2 +
 drivers/clk/samsung/clk-s3c2412.c                  |   29 +-
 drivers/clk/samsung/clk-s3c2443.c                  |   46 +-
 drivers/clk/samsung/clk-s3c64xx.c                  |   44 +-
 drivers/clk/samsung/clk.c                          |  114 +-
 drivers/clk/samsung/clk.h                          |   72 +-
 include/dt-bindings/clock/exynos5260-clk.h         |  233 +++
 16 files changed, 3004 insertions(+), 182 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/clock/exynos5260-clock.txt
 create mode 100644 drivers/clk/samsung/clk-exynos5260.c
 create mode 100644 drivers/clk/samsung/clk-exynos5260.h
 create mode 100644 include/dt-bindings/clock/exynos5260-clk.h
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH v5 1/5 clk/samsung: add support for multiple clock providers

Samsung CCF helper functions do not provide support to register multiple Clock Providers for a given SoC. Due to this limitation, SoC platforms are not able to use these helpers for registering multiple clock providers and are forced to bypass this layer.

This layer is modified accordingly to enable the support for multiple clock providers.

Clock file for exynos4, exynos5250, exynos5420, exynos5440, S3c64xx, S3c2412 and S3c2443 are also modified as per changed helper functions.

---
 drivers/clk/samsung/clk-exynos4.c    |   47 +++++++-------
 drivers/clk/samsung/clk-exynos5250.c |   25 +++++---
 drivers/clk/samsung/clk-exynos5420.c |   24 ++++---
 drivers/clk/samsung/clk-exynos5440.c |   18 +++---
 drivers/clk/samsung/clk-pll.c        |   14 +++--
 drivers/clk/samsung/clk-s3c2412.c    |   29 +++++----
 drivers/clk/samsung/clk-s3c2443.c    |   46 +++++++-------
 drivers/clk/samsung/clk-s3c64xx.c    |   44 +++++++------
 drivers/clk/samsung/clk.c            |  114 ++++++++++++++++++----------------
 drivers/clk/samsung/clk.h            |   72 ++++++++++++++-------
 10 files changed, 251 insertions(+), 182 deletions(-)
drivers/clk/samsung/clk-exynos4.c +25 -22
index b4f9672..57ed5a8 100644
@@ -1043,7 +1043,7 @@ static unsigned long exynos4_get_xom(void)
 	return xom;
 }
 
-static void __init exynos4_clk_register_finpll(void)
+static void __init exynos4_clk_register_finpll(struct samsung_clk_provider *ctx)
 {
 	struct samsung_fixed_rate_clock fclk;
 	struct clk *clk;
@@ -1066,7 +1066,7 @@ static void __init exynos4_clk_register_finpll(void)
 	fclk.parent_name = NULL;
 	fclk.flags = CLK_IS_ROOT;
 	fclk.fixed_rate = finpll_f;
-	samsung_clk_register_fixed_rate(&fclk, 1);
+	samsung_clk_register_fixed_rate(ctx, &fclk, 1);
 
 }
 
@@ -1176,22 +1176,25 @@ static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = {
 static void __init exynos4_clk_init(struct device_node *np,
 				    enum exynos4_soc soc)
 {
+	struct samsung_clk_provider *ctx;
 	exynos4_soc = soc;
 
 	reg_base = of_iomap(np, 0);
 	if (!reg_base)
 		panic("%s: failed to map registers\n", __func__);
 
-	samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+	ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+	if (!ctx)
+		panic("%s: unable to allocate context.\n", __func__);
 
-	samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks,
+	samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks,
 			ARRAY_SIZE(exynos4_fixed_rate_ext_clks),
 			ext_clk_match);
 
-	exynos4_clk_register_finpll();
+	exynos4_clk_register_finpll(ctx);
 
 	if (exynos4_soc == EXYNOS4210) {
-		samsung_clk_register_mux(exynos4210_mux_early,
+		samsung_clk_register_mux(ctx, exynos4210_mux_early,
 					ARRAY_SIZE(exynos4210_mux_early));
 
 		if (_get_rate("fin_pll") == 24000000) {
@@ -1205,7 +1208,7 @@ static void __init exynos4_clk_init(struct device_node *np,
 			exynos4210_plls[vpll].rate_table =
 							exynos4210_vpll_rates;
 
-		samsung_clk_register_pll(exynos4210_plls,
+		samsung_clk_register_pll(ctx, exynos4210_plls,
 					ARRAY_SIZE(exynos4210_plls), reg_base);
 	} else {
 		if (_get_rate("fin_pll") == 24000000) {
@@ -1217,42 +1220,42 @@ static void __init exynos4_clk_init(struct device_node *np,
 							exynos4x12_vpll_rates;
 		}
 
-		samsung_clk_register_pll(exynos4x12_plls,
+		samsung_clk_register_pll(ctx, exynos4x12_plls,
 					ARRAY_SIZE(exynos4x12_plls), reg_base);
 	}
 
-	samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks,
+	samsung_clk_register_fixed_rate(ctx, exynos4_fixed_rate_clks,
 			ARRAY_SIZE(exynos4_fixed_rate_clks));
-	samsung_clk_register_mux(exynos4_mux_clks,
+	samsung_clk_register_mux(ctx, exynos4_mux_clks,
 			ARRAY_SIZE(exynos4_mux_clks));
-	samsung_clk_register_div(exynos4_div_clks,
+	samsung_clk_register_div(ctx, exynos4_div_clks,
 			ARRAY_SIZE(exynos4_div_clks));
-	samsung_clk_register_gate(exynos4_gate_clks,
+	samsung_clk_register_gate(ctx, exynos4_gate_clks,
 			ARRAY_SIZE(exynos4_gate_clks));
 
 	if (exynos4_soc == EXYNOS4210) {
-		samsung_clk_register_fixed_rate(exynos4210_fixed_rate_clks,
+		samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks,
 			ARRAY_SIZE(exynos4210_fixed_rate_clks));
-		samsung_clk_register_mux(exynos4210_mux_clks,
+		samsung_clk_register_mux(ctx, exynos4210_mux_clks,
 			ARRAY_SIZE(exynos4210_mux_clks));
-		samsung_clk_register_div(exynos4210_div_clks,
+		samsung_clk_register_div(ctx, exynos4210_div_clks,
 			ARRAY_SIZE(exynos4210_div_clks));
-		samsung_clk_register_gate(exynos4210_gate_clks,
+		samsung_clk_register_gate(ctx, exynos4210_gate_clks,
 			ARRAY_SIZE(exynos4210_gate_clks));
-		samsung_clk_register_alias(exynos4210_aliases,
+		samsung_clk_register_alias(ctx, exynos4210_aliases,
 			ARRAY_SIZE(exynos4210_aliases));
 	} else {
-		samsung_clk_register_mux(exynos4x12_mux_clks,
+		samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
 			ARRAY_SIZE(exynos4x12_mux_clks));
-		samsung_clk_register_div(exynos4x12_div_clks,
+		samsung_clk_register_div(ctx, exynos4x12_div_clks,
 			ARRAY_SIZE(exynos4x12_div_clks));
-		samsung_clk_register_gate(exynos4x12_gate_clks,
+		samsung_clk_register_gate(ctx, exynos4x12_gate_clks,
 			ARRAY_SIZE(exynos4x12_gate_clks));
-		samsung_clk_register_alias(exynos4x12_aliases,
+		samsung_clk_register_alias(ctx, exynos4x12_aliases,
 			ARRAY_SIZE(exynos4x12_aliases));
 	}
 
-	samsung_clk_register_alias(exynos4_aliases,
+	samsung_clk_register_alias(ctx, exynos4_aliases,
 			ARRAY_SIZE(exynos4_aliases));
 
 	exynos4_clk_sleep_init();
drivers/clk/samsung/clk-exynos5250.c +15 -10
index d1d16cf..d1d53ca 100644
@@ -687,6 +687,8 @@ static struct of_device_id ext_clk_match[] __initdata = {
 /* register exynox5250 clocks */
 static void __init exynos5250_clk_init(struct device_node *np)
 {
+	struct samsung_clk_provider *ctx;
+
 	if (np) {
 		reg_base = of_iomap(np, 0);
 		if (!reg_base)
@@ -695,11 +697,13 @@ static void __init exynos5250_clk_init(struct device_node *np)
 		panic("%s: unable to determine soc\n", __func__);
 	}
 
-	samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-	samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks,
+	ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+	if (!ctx)
+		panic("%s: unable to allocate context.\n", __func__);
+	samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks,
 			ARRAY_SIZE(exynos5250_fixed_rate_ext_clks),
 			ext_clk_match);
-	samsung_clk_register_mux(exynos5250_pll_pmux_clks,
+	samsung_clk_register_mux(ctx, exynos5250_pll_pmux_clks,
 				ARRAY_SIZE(exynos5250_pll_pmux_clks));
 
 	if (_get_rate("fin_pll") == 24 * MHZ) {
@@ -710,17 +714,18 @@ static void __init exynos5250_clk_init(struct device_node *np)
 	if (_get_rate("mout_vpllsrc") == 24 * MHZ)
 		exynos5250_plls[vpll].rate_table =  vpll_24mhz_tbl;
 
-	samsung_clk_register_pll(exynos5250_plls, ARRAY_SIZE(exynos5250_plls),
-					reg_base);
-	samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks,
+	samsung_clk_register_pll(ctx, exynos5250_plls,
+			ARRAY_SIZE(exynos5250_plls),
+			reg_base);
+	samsung_clk_register_fixed_rate(ctx, exynos5250_fixed_rate_clks,
 			ARRAY_SIZE(exynos5250_fixed_rate_clks));
-	samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks,
+	samsung_clk_register_fixed_factor(ctx, exynos5250_fixed_factor_clks,
 			ARRAY_SIZE(exynos5250_fixed_factor_clks));
-	samsung_clk_register_mux(exynos5250_mux_clks,
+	samsung_clk_register_mux(ctx, exynos5250_mux_clks,
 			ARRAY_SIZE(exynos5250_mux_clks));
-	samsung_clk_register_div(exynos5250_div_clks,
+	samsung_clk_register_div(ctx, exynos5250_div_clks,
 			ARRAY_SIZE(exynos5250_div_clks));
-	samsung_clk_register_gate(exynos5250_gate_clks,
+	samsung_clk_register_gate(ctx, exynos5250_gate_clks,
 			ARRAY_SIZE(exynos5250_gate_clks));
 
 	exynos5250_clk_sleep_init();
drivers/clk/samsung/clk-exynos5420.c +15 -9
index 35311e1..9f0f426 100644
@@ -782,6 +782,8 @@ static struct of_device_id ext_clk_match[] __initdata = {
 /* register exynos5420 clocks */
 static void __init exynos5420_clk_init(struct device_node *np)
 {
+	struct samsung_clk_provider *ctx;
+
 	if (np) {
 		reg_base = of_iomap(np, 0);
 		if (!reg_base)
@@ -790,21 +792,25 @@ static void __init exynos5420_clk_init(struct device_node *np)
 		panic("%s: unable to determine soc\n", __func__);
 	}
 
-	samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-	samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks,
+	ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+	if (!ctx)
+		panic("%s: unable to allocate context.\n", __func__);
+
+	samsung_clk_of_register_fixed_ext(ctx, exynos5420_fixed_rate_ext_clks,
 			ARRAY_SIZE(exynos5420_fixed_rate_ext_clks),
 			ext_clk_match);
-	samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls),
-					reg_base);
-	samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks,
+	samsung_clk_register_pll(ctx, exynos5420_plls,
+			ARRAY_SIZE(exynos5420_plls),
+			reg_base);
+	samsung_clk_register_fixed_rate(ctx, exynos5420_fixed_rate_clks,
 			ARRAY_SIZE(exynos5420_fixed_rate_clks));
-	samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks,
+	samsung_clk_register_fixed_factor(ctx, exynos5420_fixed_factor_clks,
 			ARRAY_SIZE(exynos5420_fixed_factor_clks));
-	samsung_clk_register_mux(exynos5420_mux_clks,
+	samsung_clk_register_mux(ctx, exynos5420_mux_clks,
 			ARRAY_SIZE(exynos5420_mux_clks));
-	samsung_clk_register_div(exynos5420_div_clks,
+	samsung_clk_register_div(ctx, exynos5420_div_clks,
 			ARRAY_SIZE(exynos5420_div_clks));
-	samsung_clk_register_gate(exynos5420_gate_clks,
+	samsung_clk_register_gate(ctx, exynos5420_gate_clks,
 			ARRAY_SIZE(exynos5420_gate_clks));
 
 	exynos5420_clk_sleep_init();
drivers/clk/samsung/clk-exynos5440.c +11 -7
index 2bfad5a..647f144 100644
@@ -93,6 +93,7 @@ static struct of_device_id ext_clk_match[] __initdata = {
 static void __init exynos5440_clk_init(struct device_node *np)
 {
 	void __iomem *reg_base;
+	struct samsung_clk_provider *ctx;
 
 	reg_base = of_iomap(np, 0);
 	if (!reg_base) {
@@ -101,22 +102,25 @@ static void __init exynos5440_clk_init(struct device_node *np)
 		return;
 	}
 
-	samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-	samsung_clk_of_register_fixed_ext(exynos5440_fixed_rate_ext_clks,
+	ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+	if (!ctx)
+		panic("%s: unable to allocate context.\n", __func__);
+
+	samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks,
 		ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match);
 
 	samsung_clk_register_pll2550x("cplla", "xtal", reg_base + 0x1c, 0x10);
 	samsung_clk_register_pll2550x("cpllb", "xtal", reg_base + 0x20, 0x10);
 
-	samsung_clk_register_fixed_rate(exynos5440_fixed_rate_clks,
+	samsung_clk_register_fixed_rate(ctx, exynos5440_fixed_rate_clks,
 			ARRAY_SIZE(exynos5440_fixed_rate_clks));
-	samsung_clk_register_fixed_factor(exynos5440_fixed_factor_clks,
+	samsung_clk_register_fixed_factor(ctx, exynos5440_fixed_factor_clks,
 			ARRAY_SIZE(exynos5440_fixed_factor_clks));
-	samsung_clk_register_mux(exynos5440_mux_clks,
+	samsung_clk_register_mux(ctx, exynos5440_mux_clks,
 			ARRAY_SIZE(exynos5440_mux_clks));
-	samsung_clk_register_div(exynos5440_div_clks,
+	samsung_clk_register_div(ctx, exynos5440_div_clks,
 			ARRAY_SIZE(exynos5440_div_clks));
-	samsung_clk_register_gate(exynos5440_gate_clks,
+	samsung_clk_register_gate(ctx, exynos5440_gate_clks,
 			ARRAY_SIZE(exynos5440_gate_clks));
 
 	pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk"));
drivers/clk/samsung/clk-pll.c +8 -6
index 7fb0a28..1f310be 100644
@@ -947,8 +947,9 @@ struct clk * __init samsung_clk_register_pll2550x(const char *name,
 	return clk;
 }
 
-static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
-						void __iomem *base)
+static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
+				struct samsung_pll_clock *pll_clk,
+				void __iomem *base)
 {
 	struct samsung_clk_pll *pll;
 	struct clk *clk;
@@ -1066,7 +1067,7 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
 		return;
 	}
 
-	samsung_clk_add_lookup(clk, pll_clk->id);
+	samsung_clk_add_lookup(ctx, clk, pll_clk->id);
 
 	if (!pll_clk->alias)
 		return;
@@ -1077,11 +1078,12 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
 			__func__, pll_clk->name, ret);
 }
 
-void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list,
-				unsigned int nr_pll, void __iomem *base)
+void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
+			struct samsung_pll_clock *pll_list,
+			unsigned int nr_pll, void __iomem *base)
 {
 	int cnt;
 
 	for (cnt = 0; cnt < nr_pll; cnt++)
-		_samsung_clk_register_pll(&pll_list[cnt], base);
+		_samsung_clk_register_pll(ctx, &pll_list[cnt], base);
 }
drivers/clk/samsung/clk-s3c2412.c +17 -12
index 0f11a07..23e4313 100644
@@ -214,23 +214,25 @@ struct samsung_fixed_rate_clock s3c2412_common_frate_clks[] __initdata = {
 	FRATE(0, "ext", NULL, CLK_IS_ROOT, 0),
 };
 
-static void __init s3c2412_common_clk_register_fixed_ext(unsigned long xti_f,
-							 unsigned long ext_f)
+static void __init s3c2412_common_clk_register_fixed_ext(
+		struct samsung_clk_provider *ctx,
+		unsigned long xti_f, unsigned long ext_f)
 {
 	/* xtal alias is necessary for the current cpufreq driver */
 	struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal");
 
 	s3c2412_common_frate_clks[0].fixed_rate = xti_f;
 	s3c2412_common_frate_clks[1].fixed_rate = ext_f;
-	samsung_clk_register_fixed_rate(s3c2412_common_frate_clks,
+	samsung_clk_register_fixed_rate(ctx, s3c2412_common_frate_clks,
 				ARRAY_SIZE(s3c2412_common_frate_clks));
 
-	samsung_clk_register_alias(&xti_alias, 1);
+	samsung_clk_register_alias(ctx, &xti_alias, 1);
 }
 
 void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
 				    unsigned long ext_f, void __iomem *base)
 {
+	struct samsung_clk_provider *ctx;
 	reg_base = base;
 
 	if (np) {
@@ -239,24 +241,27 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
 			panic("%s: failed to map registers\n", __func__);
 	}
 
-	samsung_clk_init(np, reg_base, NR_CLKS);
+	ctx = samsung_clk_init(np, reg_base, NR_CLKS);
+	if (!ctx)
+		panic("%s: unable to allocate context.\n", __func__);
 
 	/* Register external clocks only in non-dt cases */
 	if (!np)
-		s3c2412_common_clk_register_fixed_ext(xti_f, ext_f);
+		s3c2412_common_clk_register_fixed_ext(ctx, xti_f, ext_f);
 
 	/* Register PLLs. */
-	samsung_clk_register_pll(s3c2412_plls, ARRAY_SIZE(s3c2412_plls),
+	samsung_clk_register_pll(ctx, s3c2412_plls, ARRAY_SIZE(s3c2412_plls),
 				 reg_base);
 
 	/* Register common internal clocks. */
-	samsung_clk_register_mux(s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes));
-	samsung_clk_register_div(s3c2412_dividers,
+	samsung_clk_register_mux(ctx, s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes));
+	samsung_clk_register_div(ctx, s3c2412_dividers,
 					  ARRAY_SIZE(s3c2412_dividers));
-	samsung_clk_register_gate(s3c2412_gates, ARRAY_SIZE(s3c2412_gates));
-	samsung_clk_register_fixed_factor(s3c2412_ffactor,
+	samsung_clk_register_gate(ctx, s3c2412_gates,
+					ARRAY_SIZE(s3c2412_gates));
+	samsung_clk_register_fixed_factor(ctx, s3c2412_ffactor,
 					  ARRAY_SIZE(s3c2412_ffactor));
-	samsung_clk_register_alias(s3c2412_aliases,
+	samsung_clk_register_alias(ctx, s3c2412_aliases,
 				   ARRAY_SIZE(s3c2412_aliases));
 
 	s3c2412_clk_sleep_init();
drivers/clk/samsung/clk-s3c2443.c +25 -21

99 lines not on this page · raw message

drivers/clk/samsung/clk-s3c64xx.c +25 -19

91 lines not on this page · raw message

drivers/clk/samsung/clk.c +62 -52

248 lines not on this page · raw message

drivers/clk/samsung/clk.h +48 -24

94 lines not on this page · raw message

Signature · 1 line
1.7.9.5
Applied
#2 lore raw

PATCH v5 1/5 clk/samsung: add support for multiple clock providers

Hi Rahul,

Quoted 14 lines · Rahul Sharma

Samsung CCF helper functions do not provide support to register multiple Clock Providers for a given SoC. Due to this limitation, SoC platforms are not able to use these helpers for registering multiple clock providers and are forced to bypass this layer.

This layer is modified accordingly to enable the support for multiple clock providers.

Clock file for exynos4, exynos5250, exynos5420, exynos5440, S3c64xx, S3c2412 and S3c2443 are also modified as per changed helper functions.

Quoted 12 lines
---
  drivers/clk/samsung/clk-exynos4.c    |   47 +++++++-------
  drivers/clk/samsung/clk-exynos5250.c |   25 +++++---
  drivers/clk/samsung/clk-exynos5420.c |   24 ++++---
  drivers/clk/samsung/clk-exynos5440.c |   18 +++---
  drivers/clk/samsung/clk-pll.c        |   14 +++--
  drivers/clk/samsung/clk-s3c2412.c    |   29 +++++----
  drivers/clk/samsung/clk-s3c2443.c    |   46 +++++++-------
  drivers/clk/samsung/clk-s3c64xx.c    |   44 +++++++------
  drivers/clk/samsung/clk.c            |  114 ++++++++++++++++++----------------
  drivers/clk/samsung/clk.h            |   72 ++++++++++++++-------
  10 files changed, 251 insertions(+), 182 deletions(-)

Applied, thanks.

Best regards,
Tomasz

#3 lore raw

PATCH v5 2/5 clk/samsung: add support for pll2550xx

In reply to Rahul Sharma

From: Pankaj Dubey <[email protected]>

exynos5260 use pll2550xx and it has different bit fields for P,M,S values as compared to pll2550. Support for pll2550xx is added here.

---
 drivers/clk/samsung/clk-pll.c |  108 +++++++++++++++++++++++++++++++++++++++++
 drivers/clk/samsung/clk-pll.h |    1 +
 2 files changed, 109 insertions(+)
drivers/clk/samsung/clk-pll.c +108 -0
index 1f310be..18e42ef 100644
@@ -947,6 +947,108 @@ struct clk * __init samsung_clk_register_pll2550x(const char *name,
 	return clk;
 }
 
+/*
+ * PLL2550xx Clock Type
+ */
+
+/* Maximum lock time can be 270 * PDIV cycles */
+#define PLL2550XX_LOCK_FACTOR 270
+
+#define PLL2550XX_M_MASK		0x3FF
+#define PLL2550XX_P_MASK		0x3F
+#define PLL2550XX_S_MASK		0x7
+#define PLL2550XX_LOCK_STAT_MASK	0x1
+#define PLL2550XX_M_SHIFT		9
+#define PLL2550XX_P_SHIFT		3
+#define PLL2550XX_S_SHIFT		0
+#define PLL2550XX_LOCK_STAT_SHIFT	21
+
+static unsigned long samsung_pll2550xx_recalc_rate(struct clk_hw *hw,
+				unsigned long parent_rate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	u32 mdiv, pdiv, sdiv, pll_con;
+	u64 fvco = parent_rate;
+
+	pll_con = __raw_readl(pll->con_reg);
+	mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK;
+	pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK;
+	sdiv = (pll_con >> PLL2550XX_S_SHIFT) & PLL2550XX_S_MASK;
+
+	fvco *= mdiv;
+	do_div(fvco, (pdiv << sdiv));
+
+	return (unsigned long)fvco;
+}
+
+static inline bool samsung_pll2550xx_mp_change(u32 mdiv, u32 pdiv, u32 pll_con)
+{
+	u32 old_mdiv, old_pdiv;
+
+	old_mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK;
+	old_pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK;
+
+	return mdiv != old_mdiv || pdiv != old_pdiv;
+}
+
+static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate,
+					unsigned long prate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	const struct samsung_pll_rate_table *rate;
+	u32 tmp;
+
+	/* Get required rate settings from table */
+	rate = samsung_get_pll_settings(pll, drate);
+	if (!rate) {
+		pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+			drate, __clk_get_name(hw->clk));
+		return -EINVAL;
+	}
+
+	tmp = __raw_readl(pll->con_reg);
+
+	if (!(samsung_pll2550xx_mp_change(rate->mdiv, rate->pdiv, tmp))) {
+		/* If only s change, change just s value only*/
+		tmp &= ~(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT);
+		tmp |= rate->sdiv << PLL2550XX_S_SHIFT;
+		__raw_writel(tmp, pll->con_reg);
+
+		return 0;
+	}
+
+	/* Set PLL lock time. */
+	__raw_writel(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg);
+
+	/* Change PLL PMS values */
+	tmp &= ~((PLL2550XX_M_MASK << PLL2550XX_M_SHIFT) |
+			(PLL2550XX_P_MASK << PLL2550XX_P_SHIFT) |
+			(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT));
+	tmp |= (rate->mdiv << PLL2550XX_M_SHIFT) |
+			(rate->pdiv << PLL2550XX_P_SHIFT) |
+			(rate->sdiv << PLL2550XX_S_SHIFT);
+	__raw_writel(tmp, pll->con_reg);
+
+	/* wait_lock_time */
+	do {
+		cpu_relax();
+		tmp = __raw_readl(pll->con_reg);
+	} while (!(tmp & (PLL2550XX_LOCK_STAT_MASK
+			<< PLL2550XX_LOCK_STAT_SHIFT)));
+
+	return 0;
+}
+
+static const struct clk_ops samsung_pll2550xx_clk_ops = {
+	.recalc_rate = samsung_pll2550xx_recalc_rate,
+	.round_rate = samsung_pll_round_rate,
+	.set_rate = samsung_pll2550xx_set_rate,
+};
+
+static const struct clk_ops samsung_pll2550xx_clk_min_ops = {
+	.recalc_rate = samsung_pll2550xx_recalc_rate,
+};
+
 static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 				struct samsung_pll_clock *pll_clk,
 				void __iomem *base)
@@ -1049,6 +1151,12 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 		else
 			init.ops = &samsung_s3c2440_mpll_clk_ops;
 		break;
+	case pll_2550xx:
+		if (!pll->rate_table)
+			init.ops = &samsung_pll2550xx_clk_min_ops;
+		else
+			init.ops = &samsung_pll2550xx_clk_ops;
+		break;
 	default:
 		pr_warn("%s: Unknown pll type for pll clk %s\n",
 			__func__, pll_clk->name);
drivers/clk/samsung/clk-pll.h +1 -0
index 6428bcc..ec4bc1d 100644
@@ -31,6 +31,7 @@ enum samsung_pll_type {
 	pll_s3c2410_mpll,
 	pll_s3c2410_upll,
 	pll_s3c2440_mpll,
+	pll_2550xx,
 };
 
 #define PLL_35XX_RATE(_rate, _m, _p, _s)			\
Signature · 1 line
1.7.9.5
Applied
#4 lore raw

PATCH v5 2/5 clk/samsung: add support for pll2550xx

Hi Rahul,

Quoted 6 lines · Rahul Sharma

From: Pankaj Dubey <[email protected]>

exynos5260 use pll2550xx and it has different bit fields for P,M,S values as compared to pll2550. Support for pll2550xx is added here.

Quoted 7 lines
---
  drivers/clk/samsung/clk-pll.c |  108 +++++++++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-pll.h |    1 +
  2 files changed, 109 insertions(+)

Applied, thanks.

Best regards,
Tomasz

#5 lore raw

PATCH v5 3/5 clk/samsung: add support for pll2650xx

In reply to Rahul Sharma

Add support for pll2650xx in samsung pll file. This PLL variant is close to pll36xx but uses CON2 registers instead of CON1.

Aud_pll in Exynos5260 is pll2650xx and uses this code.

---
 drivers/clk/samsung/clk-pll.c |  101 +++++++++++++++++++++++++++++++++++++++++
 drivers/clk/samsung/clk-pll.h |    1 +
 2 files changed, 102 insertions(+)
drivers/clk/samsung/clk-pll.c +101 -0
index 18e42ef..b07fad2 100644
@@ -1049,6 +1049,101 @@ static const struct clk_ops samsung_pll2550xx_clk_min_ops = {
 	.recalc_rate = samsung_pll2550xx_recalc_rate,
 };
 
+/*
+ * PLL2650XX Clock Type
+ */
+
+/* Maximum lock time can be 3000 * PDIV cycles */
+#define PLL2650XX_LOCK_FACTOR 3000
+
+#define PLL2650XX_MDIV_SHIFT		9
+#define PLL2650XX_PDIV_SHIFT		3
+#define PLL2650XX_SDIV_SHIFT		0
+#define PLL2650XX_KDIV_SHIFT		0
+#define PLL2650XX_MDIV_MASK		0x1ff
+#define PLL2650XX_PDIV_MASK		0x3f
+#define PLL2650XX_SDIV_MASK		0x7
+#define PLL2650XX_KDIV_MASK		0xffff
+#define PLL2650XX_PLL_ENABLE_SHIFT	23
+#define PLL2650XX_PLL_LOCKTIME_SHIFT	21
+#define PLL2650XX_PLL_FOUTMASK_SHIFT	31
+
+static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw,
+				unsigned long parent_rate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	u32 mdiv, pdiv, sdiv, pll_con0, pll_con2;
+	s16 kdiv;
+	u64 fvco = parent_rate;
+
+	pll_con0 = __raw_readl(pll->con_reg);
+	pll_con2 = __raw_readl(pll->con_reg + 8);
+	mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK;
+	pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK;
+	sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK;
+	kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK);
+
+	fvco *= (mdiv << 16) + kdiv;
+	do_div(fvco, (pdiv << sdiv));
+	fvco >>= 16;
+
+	return (unsigned long)fvco;
+}
+
+static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate,
+					unsigned long parent_rate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	u32 tmp, pll_con0, pll_con2;
+	const struct samsung_pll_rate_table *rate;
+
+	rate = samsung_get_pll_settings(pll, drate);
+	if (!rate) {
+		pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+			drate, __clk_get_name(hw->clk));
+		return -EINVAL;
+	}
+
+	pll_con0 = __raw_readl(pll->con_reg);
+	pll_con2 = __raw_readl(pll->con_reg + 8);
+
+	 /* Change PLL PMS values */
+	pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT |
+			PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT |
+			PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT);
+	pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT;
+	pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT;
+	pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT;
+	pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT;
+	pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT;
+
+	pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT);
+	pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK)
+			<< PLL2650XX_KDIV_SHIFT;
+
+	/* Set PLL lock time. */
+	__raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
+
+	__raw_writel(pll_con0, pll->con_reg);
+	__raw_writel(pll_con2, pll->con_reg + 8);
+
+	do {
+		tmp = __raw_readl(pll->con_reg);
+	} while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT)));
+
+	return 0;
+}
+
+static const struct clk_ops samsung_pll2650xx_clk_ops = {
+	.recalc_rate = samsung_pll2650xx_recalc_rate,
+	.set_rate = samsung_pll2650xx_set_rate,
+	.round_rate = samsung_pll_round_rate,
+};
+
+static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
+	.recalc_rate = samsung_pll2650xx_recalc_rate,
+};
+
 static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 				struct samsung_pll_clock *pll_clk,
 				void __iomem *base)
@@ -1157,6 +1252,12 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 		else
 			init.ops = &samsung_pll2550xx_clk_ops;
 		break;
+	case pll_2650xx:
+		if (!pll->rate_table)
+			init.ops = &samsung_pll2650xx_clk_min_ops;
+		else
+			init.ops = &samsung_pll2650xx_clk_ops;
+		break;
 	default:
 		pr_warn("%s: Unknown pll type for pll clk %s\n",
 			__func__, pll_clk->name);
drivers/clk/samsung/clk-pll.h +1 -0
index ec4bc1d..c0ed4d4 100644
@@ -32,6 +32,7 @@ enum samsung_pll_type {
 	pll_s3c2410_upll,
 	pll_s3c2440_mpll,
 	pll_2550xx,
+	pll_2650xx,
 };
 
 #define PLL_35XX_RATE(_rate, _m, _p, _s)			\
Signature · 1 line
1.7.9.5
#6 lore raw

PATCH v5 3/5 clk/samsung: add support for pll2650xx

Hi Rahul,

Quoted 135 lines · Rahul Sharma

Add support for pll2650xx in samsung pll file. This PLL variant is close to pll36xx but uses CON2 registers instead of CON1.

Aud_pll in Exynos5260 is pll2650xx and uses this code.

---
  drivers/clk/samsung/clk-pll.c |  101 +++++++++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-pll.h |    1 +
  2 files changed, 102 insertions(+)
drivers/clk/samsung/clk-pll.c +101 -0
index 18e42ef..b07fad2 100644
@@ -1049,6 +1049,101 @@ static const struct clk_ops samsung_pll2550xx_clk_min_ops = {
  	.recalc_rate = samsung_pll2550xx_recalc_rate,
  };
 
+/*
+ * PLL2650XX Clock Type
+ */
+
+/* Maximum lock time can be 3000 * PDIV cycles */
+#define PLL2650XX_LOCK_FACTOR 3000
+
+#define PLL2650XX_MDIV_SHIFT		9
+#define PLL2650XX_PDIV_SHIFT		3
+#define PLL2650XX_SDIV_SHIFT		0
+#define PLL2650XX_KDIV_SHIFT		0
+#define PLL2650XX_MDIV_MASK		0x1ff
+#define PLL2650XX_PDIV_MASK		0x3f
+#define PLL2650XX_SDIV_MASK		0x7
+#define PLL2650XX_KDIV_MASK		0xffff
+#define PLL2650XX_PLL_ENABLE_SHIFT	23
+#define PLL2650XX_PLL_LOCKTIME_SHIFT	21
+#define PLL2650XX_PLL_FOUTMASK_SHIFT	31
+
+static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw,
+				unsigned long parent_rate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	u32 mdiv, pdiv, sdiv, pll_con0, pll_con2;
+	s16 kdiv;
+	u64 fvco = parent_rate;
+
+	pll_con0 = __raw_readl(pll->con_reg);
+	pll_con2 = __raw_readl(pll->con_reg + 8);
+	mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK;
+	pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK;
+	sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK;
+	kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK);
+
+	fvco *= (mdiv << 16) + kdiv;
+	do_div(fvco, (pdiv << sdiv));
+	fvco >>= 16;
+
+	return (unsigned long)fvco;
+}
+
+static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate,
+					unsigned long parent_rate)
+{
+	struct samsung_clk_pll *pll = to_clk_pll(hw);
+	u32 tmp, pll_con0, pll_con2;
+	const struct samsung_pll_rate_table *rate;
+
+	rate = samsung_get_pll_settings(pll, drate);
+	if (!rate) {
+		pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+			drate, __clk_get_name(hw->clk));
+		return -EINVAL;
+	}
+
+	pll_con0 = __raw_readl(pll->con_reg);
+	pll_con2 = __raw_readl(pll->con_reg + 8);
+
+	 /* Change PLL PMS values */
+	pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT |
+			PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT |
+			PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT);
+	pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT;
+	pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT;
+	pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT;
+	pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT;
+	pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT;
+
+	pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT);
+	pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK)
+			<< PLL2650XX_KDIV_SHIFT;
+
+	/* Set PLL lock time. */
+	__raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
+
+	__raw_writel(pll_con0, pll->con_reg);
+	__raw_writel(pll_con2, pll->con_reg + 8);
+
+	do {
+		tmp = __raw_readl(pll->con_reg);
+	} while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT)));
+
+	return 0;
+}
+
+static const struct clk_ops samsung_pll2650xx_clk_ops = {
+	.recalc_rate = samsung_pll2650xx_recalc_rate,
+	.set_rate = samsung_pll2650xx_set_rate,
+	.round_rate = samsung_pll_round_rate,
+};
+
+static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
+	.recalc_rate = samsung_pll2650xx_recalc_rate,
+};
+
  static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
  				struct samsung_pll_clock *pll_clk,
  				void __iomem *base)
@@ -1157,6 +1252,12 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
  		else
  			init.ops = &samsung_pll2550xx_clk_ops;
  		break;
+	case pll_2650xx:
+		if (!pll->rate_table)
+			init.ops = &samsung_pll2650xx_clk_min_ops;
+		else
+			init.ops = &samsung_pll2650xx_clk_ops;
+		break;
  	default:
  		pr_warn("%s: Unknown pll type for pll clk %s\n",
  			__func__, pll_clk->name);
drivers/clk/samsung/clk-pll.h +0 -0
index ec4bc1d..c0ed4d4 100644

drivers/clk/samsung/clk-pll.h enum samsung_pll_type { · line 38

Quoted 7 lines
drivers/clk/samsung/clk-pll.h +1 -0
@@ -32,6 +32,7 @@ enum samsung_pll_type {
  	pll_s3c2410_upll,
  	pll_s3c2440_mpll,
  	pll_2550xx,
+	pll_2650xx,
  };
 
  #define PLL_35XX_RATE(_rate, _m, _p, _s)			\
Reviewed-by Pankaj Dubey <pankaj.dubey@samsung,com <mailto:[email protected]>>
Signature · 2 lines
Best Regards,
Pankaj Dubey
#7 lore raw

PATCH v5 3/5 clk/samsung: add support for pll2650xx

Quoted 165 lines · Pankaj Dubey

Hi Rahul,

Quoted 141 lines · Rahul Sharma

Add support for pll2650xx in samsung pll file. This PLL variant is close to pll36xx but uses CON2 registers instead of CON1.

Aud_pll in Exynos5260 is pll2650xx and uses this code.

---
  drivers/clk/samsung/clk-pll.c |  101
+++++++++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-pll.h |    1 +
  2 files changed, 102 insertions(+)
drivers/clk/samsung/clk-pll.c +94 -0
index 18e42ef..b07fad2 100644
@@ -1049,6 +1049,101 @@ static const struct clk_ops
 samsung_pll2550xx_clk_min_ops = {
        .recalc_rate = samsung_pll2550xx_recalc_rate,
  };
  +/*
+ * PLL2650XX Clock Type
+ */
+
+/* Maximum lock time can be 3000 * PDIV cycles */
+#define PLL2650XX_LOCK_FACTOR 3000
+
+#define PLL2650XX_MDIV_SHIFT           9
+#define PLL2650XX_PDIV_SHIFT           3
+#define PLL2650XX_SDIV_SHIFT           0
+#define PLL2650XX_KDIV_SHIFT           0
+#define PLL2650XX_MDIV_MASK            0x1ff
+#define PLL2650XX_PDIV_MASK            0x3f
+#define PLL2650XX_SDIV_MASK            0x7
+#define PLL2650XX_KDIV_MASK            0xffff
+#define PLL2650XX_PLL_ENABLE_SHIFT     23
+#define PLL2650XX_PLL_LOCKTIME_SHIFT   21
+#define PLL2650XX_PLL_FOUTMASK_SHIFT   31
+
+static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw,
+                               unsigned long parent_rate)
+{
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 mdiv, pdiv, sdiv, pll_con0, pll_con2;
+       s16 kdiv;
+       u64 fvco = parent_rate;
+
+       pll_con0 = __raw_readl(pll->con_reg);
+       pll_con2 = __raw_readl(pll->con_reg + 8);
+       mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK;
+       pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK;
+       sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK;
+       kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK);
+
+       fvco *= (mdiv << 16) + kdiv;
+       do_div(fvco, (pdiv << sdiv));
+       fvco >>= 16;
+
+       return (unsigned long)fvco;
+}
+
+static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long
 drate,
+                                       unsigned long parent_rate)
+{
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 tmp, pll_con0, pll_con2;
+       const struct samsung_pll_rate_table *rate;
+
+       rate = samsung_get_pll_settings(pll, drate);
+       if (!rate) {
+               pr_err("%s: Invalid rate : %lu for pll clk %s\n",
 __func__,
+                       drate, __clk_get_name(hw->clk));
+               return -EINVAL;
+       }
+
+       pll_con0 = __raw_readl(pll->con_reg);
+       pll_con2 = __raw_readl(pll->con_reg + 8);
+
+        /* Change PLL PMS values */
+       pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT |
+                       PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT |
+                       PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT);
+       pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT;
+       pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT;
+       pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT;
+       pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT;
+       pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT;
+
+       pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT);
+       pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK)
+                       << PLL2650XX_KDIV_SHIFT;
+
+       /* Set PLL lock time. */
+       __raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
+
+       __raw_writel(pll_con0, pll->con_reg);
+       __raw_writel(pll_con2, pll->con_reg + 8);
+
+       do {
+               tmp = __raw_readl(pll->con_reg);
+       } while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT)));
+
+       return 0;
+}
+
+static const struct clk_ops samsung_pll2650xx_clk_ops = {
+       .recalc_rate = samsung_pll2650xx_recalc_rate,
+       .set_rate = samsung_pll2650xx_set_rate,
+       .round_rate = samsung_pll_round_rate,
+};
+
+static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
+       .recalc_rate = samsung_pll2650xx_recalc_rate,
+};
+
  static void __init _samsung_clk_register_pll(struct samsung_clk_provider

*ctx,
struct samsung_pll_clock *pll_clk, void __iomem *base)

drivers/clk/samsung/clk-pll.c +6 -0
@@ -1157,6 +1252,12 @@ static void __init _samsung_clk_register_pll(struct
 samsung_clk_provider *ctx,
                else
                        init.ops = &samsung_pll2550xx_clk_ops;
                break;
+       case pll_2650xx:
+               if (!pll->rate_table)
+                       init.ops = &samsung_pll2650xx_clk_min_ops;
+               else
+                       init.ops = &samsung_pll2650xx_clk_ops;
+               break;
        default:
                pr_warn("%s: Unknown pll type for pll clk %s\n",
                        __func__, pll_clk->name);
drivers/clk/samsung/clk-pll.h +0 -0
index ec4bc1d..c0ed4d4 100644

drivers/clk/samsung/clk-pll.h enum samsung_pll_type { · line 37

Quoted 6 lines
drivers/clk/samsung/clk-pll.h +1 -0
@@ -32,6 +32,7 @@ enum samsung_pll_type {
        pll_s3c2410_upll,
        pll_s3c2440_mpll,
        pll_2550xx,
+       pll_2650xx,
  };
    #define PLL_35XX_RATE(_rate, _m, _p, _s)                    \

--
Best Regards,
Pankaj Dubey

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#8 lore raw

PATCH v5 3/5 clk/samsung: add support for pll2650xx

In reply to Rahul Sharma

Hi Rahul,

Quoted 10 lines · Rahul Sharma

Add support for pll2650xx in samsung pll file. This PLL variant is close to pll36xx but uses CON2 registers instead of CON1.

Aud_pll in Exynos5260 is pll2650xx and uses this code.

---
  drivers/clk/samsung/clk-pll.c |  101 +++++++++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-pll.h |    1 +
  2 files changed, 102 insertions(+)

Applied with Pankaj's reviewed-by, thanks.

Best regards,
Tomasz

#9 lore raw

PATCH v5 4/5 clk/exynos5260: add macros and documentation for exynos5260

In reply to Rahul Sharma

Add macros which are used as Clock IDs in DT and clock file. It also adds the documentation for the exynos5260 clocks.

---
 .../devicetree/bindings/clock/exynos5260-clock.txt |   55 +++++
 include/dt-bindings/clock/exynos5260-clk.h         |  233 ++++++++++++++++++++
 2 files changed, 288 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/exynos5260-clock.txt
 create mode 100644 include/dt-bindings/clock/exynos5260-clk.h
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +55 -0
new file mode 100644
index 0000000..4128892
@@ -0,0 +1,55 @@
+* Samsung Exynos5260 Clock Controller
+
+The Exynos5260 clock controller encapsulate all CMUs which are
+instantiaited independently from the device-tree. As a whole, these
+CMUs generates and supplies clocks to various controllers within
+the Exynos5260 SoC.
+
+Required Properties:
+
+- compatible: should be one of the following.
+	"exynos5260-clock-top"
+	"exynos5260-clock-peri"
+	"exynos5260-clock-egl"
+	"exynos5260-clock-kfc"
+	"exynos5260-clock-g2d"
+	"exynos5260-clock-mif"
+	"exynos5260-clock-mfc"
+	"exynos5260-clock-g3d"
+	"exynos5260-clock-fsys"
+	"exynos5260-clock-aud"
+	"exynos5260-clock-isp"
+	"exynos5260-clock-gscl"
+	"exynos5260-clock-disp"
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+The following is the list of clocks generated by each controller. Each
+clock is assigned with a MACRO constant. These constants are defined in
+"dt-bindings/clk/exynos5260-clk.h". DT client nodes use this MACRO to
+specify the clock, which they want to consume.
+
+Example 1: An example of a clock controller node is listed below.
+
+	cmu_disp: clock-controller at 0x14550000 {
+		compatible = "exynos5260-clock-disp";
+		reg = <0x14550000 0x10000>;
+		#clock-cells = <1>;
+	};
+
+Example 2: UART controller node that consumes the clock generated by the
+		peri clock controller. Refer to the standard clock bindings for
+		information about 'clocks' and 'clock-names' property.
+
+	serial at 12C00000 {
+		compatible = "samsung,exynos4210-uart";
+		reg = <0x12C00000 0x100>;
+		interrupts = <0 146 0>;
+		clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri PERI_SCLK_UART0>;
+		clock-names = "uart", "clk_uart_baud0";
+		status = "disabled";
+	};
+
include/dt-bindings/clock/exynos5260-clk.h new file +233 -0

233 lines not on this page · raw message

Signature · 1 line
1.7.9.5
#10 lore raw

PATCH v5 4/5 clk/exynos5260: add macros and documentation for exynos5260

Hi Rahul,

Quoted 39 lines · Rahul Sharma

Add macros which are used as Clock IDs in DT and clock file. It also adds the documentation for the exynos5260 clocks.

---
  .../devicetree/bindings/clock/exynos5260-clock.txt |   55 +++++
  include/dt-bindings/clock/exynos5260-clk.h         |  233 ++++++++++++++++++++
  2 files changed, 288 insertions(+)

create mode 100644 Documentation/devicetree/bindings/clock/exynos5260-clock.txt create mode 100644 include/dt-bindings/clock/exynos5260-clk.h

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +22 -0
new file mode 100644
index 0000000..4128892
@@ -0,0 +1,55 @@
+* Samsung Exynos5260 Clock Controller
+
+The Exynos5260 clock controller encapsulate all CMUs which are
+instantiaited independently from the device-tree. As a whole, these
+CMUs generates and supplies clocks to various controllers within
+the Exynos5260 SoC.
+
+Required Properties:
+
+- compatible: should be one of the following.
+	"exynos5260-clock-top"
+	"exynos5260-clock-peri"
+	"exynos5260-clock-egl"
+	"exynos5260-clock-kfc"
+	"exynos5260-clock-g2d"
+	"exynos5260-clock-mif"
+	"exynos5260-clock-mfc"
+	"exynos5260-clock-g3d"
+	"exynos5260-clock-fsys"
+	"exynos5260-clock-aud"
+	"exynos5260-clock-isp"
+	"exynos5260-clock-gscl"

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 32

Quoted 10 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +10 -0
+	"exynos5260-clock-disp"
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+The following is the list of clocks generated by each controller. Each
+clock is assigned with a MACRO constant. These constants are defined in
+"dt-bindings/clk/exynos5260-clk.h". DT client nodes use this MACRO to

nit: s/clk/clock

Quoted 12 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +12 -0
+specify the clock, which they want to consume.
+
+Example 1: An example of a clock controller node is listed below.
+
+	cmu_disp: clock-controller@0x14550000 {
+		compatible = "exynos5260-clock-disp";
+		reg = <0x14550000 0x10000>;
+		#clock-cells = <1>;
+	};
+
+Example 2: UART controller node that consumes the clock generated by the
+		peri clock controller. Refer to the standard clock bindings for

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 54

Quoted 10 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +10 -0
+		information about 'clocks' and 'clock-names' property.
+
+	serial@12C00000 {
+		compatible = "samsung,exynos4210-uart";
+		reg = <0x12C00000 0x100>;
+		interrupts = <0 146 0>;
+		clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri PERI_SCLK_UART0>;
+		clock-names = "uart", "clk_uart_baud0";
+		status = "disabled";
+	};

Isn't it better that we should add binding information about fixed-clocks (phyclocks and ioclks) here?

Quoted 18 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +1 -0
+
include/dt-bindings/clock/exynos5260-clk.h new file +11 -0
new file mode 100644
index 0000000..d6f4391
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Provides Constants for Exynos5260 clocks.
+*/
+
+#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H

include/dt-bindings/clock/exynos5260-clk.h line 21

Quoted 10 lines
include/dt-bindings/clock/exynos5260-clk.h new file +10 -0
+#define _DT_BINDINGS_CLK_EXYNOS5260_H
+
+/*
+ * Clock names:	XXXXX_YYYYYY_ZZZZ
+ *		|---| |----| |--|
+ *		 cmu   type   IP
+ */
+
+/* List Of Clocks For CMU_TOP */
+#define FIN_PLL			1

This should be removed now.

include/dt-bindings/clock/exynos5260-clk.h line 31

Quoted 10 lines
include/dt-bindings/clock/exynos5260-clk.h new file +10 -0
+#define TOP_FOUT_DISP_PLL	2
+#define TOP_FOUT_AUD_PLL	3
+#define TOP_SCLK_MMC0		4
+#define TOP_SCLK_MMC1		5
+#define TOP_SCLK_MMC2		6
+#define TOP_SCLK_HDMIPHY	7
+#define TOP_SCLK_FIMD1		8
+#define TOP_MOUT_FIMD1		9
+#define TOP_MOUT_DISP_PLL	10
+#define TOP_HDMI_PHY_PIXEL_CLKO	11

ditto.

Quoted 202 lines
include/dt-bindings/clock/exynos5260-clk.h new file +202 -0
+#define TOP_NR_CLK		12
+
+/* List Of Clocks For CMU_EGL */
+#define EGL_FOUT_EGL_PLL	1
+#define EGL_FOUT_EGL_DPLL	2
+#define EGL_NR_CLK		3
+
+/* List Of Clocks For CMU_KFC */
+#define KFC_FOUT_KFC_PLL	1
+#define KFC_NR_CLK		2
+
+/* List Of Clocks For CMU_MIF */
+#define MIF_FOUT_MEM_PLL	1
+#define MIF_FOUT_BUS_PLL	2
+#define MIF_FOUT_MEDIA_PLL	3
+#define MIF_NR_CLK		4
+
+/* List Of Clocks For CMU_G3D */
+#define G3D_FOUT_G3D_PLL	1
+#define G3D_CLK_G3D_HPM		2
+#define G3D_CLK_G3D		3
+#define G3D_NR_CLK		4
+
+/* List Of Clocks For CMU_AUD */
+#define AUD_CLK_AUD_UART	1
+#define AUD_CLK_PCM		2
+#define AUD_CLK_I2S		3
+#define AUD_CLK_DMAC		4
+#define AUD_SCLK_AUD_UART	5
+#define AUD_SCLK_PCM		6
+#define AUD_SCLK_I2S		7
+#define AUD_NR_CLK		8
+
+/* List Of Clocks For CMU_MFC */
+#define MFC_CLK_MFC		1
+#define MFC_CLK_SMMU2_MFCM1	2
+#define MFC_CLK_SMMU2_MFCM0	3
+#define MFC_NR_CLK		4
+
+/* List Of Clocks For CMU_GSCL */
+#define GSCL_CLK_PIXEL_GSCL1	1
+#define GSCL_CLK_PIXEL_GSCL0	2
+#define GSCL_CLK_MSCL1		3
+#define GSCL_CLK_MSCL0		4
+#define GSCL_CLK_GSCL1		5
+#define GSCL_CLK_GSCL0		6
+#define GSCL_CLK_FIMC_LITE_D	7
+#define GSCL_CLK_FIMC_LITE_B	8
+#define GSCL_CLK_FIMC_LITE_A	9
+#define GSCL_CLK_CSIS1		10
+#define GSCL_CLK_CSIS0		11
+#define GSCL_CLK_SMMU3_LITE_D	12
+#define GSCL_CLK_SMMU3_LITE_B	13
+#define GSCL_CLK_SMMU3_LITE_A	14
+#define GSCL_CLK_SMMU3_GSCL0	15
+#define GSCL_CLK_SMMU3_GSCL1	16
+#define GSCL_CLK_SMMU3_MSCL0	17
+#define GSCL_CLK_SMMU3_MSCL1	18
+#define GSCL_SCLK_CSIS1_WRAP	19
+#define GSCL_SCLK_CSIS0_WRAP	20
+#define GSCL_NR_CLK		21
+
+/* List Of Clocks For CMU_FSYS */
+#define FSYS_CLK_TSI		1
+#define FSYS_CLK_USBLINK	2
+#define FSYS_CLK_USBHOST20	3
+#define FSYS_CLK_USBDRD30	4
+#define FSYS_CLK_SROMC		5
+#define FSYS_CLK_PDMA		6
+#define FSYS_CLK_MMC2		7
+#define FSYS_CLK_MMC1		8
+#define FSYS_CLK_MMC0		9
+#define FSYS_CLK_RTIC		10
+#define FSYS_CLK_SMMU_RTIC	11
+#define FSYS_PHYCLK_USBDRD30	12
+#define FSYS_PHYCLK_USBHOST20	13
+#define FSYS_NR_CLK		14
+
+/* List Of Clocks For CMU_PERI */
+#define PERI_CLK_WDT_KFC	1
+#define PERI_CLK_WDT_EGL	2
+#define PERI_CLK_HSIC3		3
+#define PERI_CLK_HSIC2		4
+#define PERI_CLK_HSIC1		5
+#define PERI_CLK_HSIC0		6
+#define PERI_CLK_PCM		7
+#define PERI_CLK_MCT		8
+#define PERI_CLK_I2S		9
+#define PERI_CLK_I2CHDMI	10
+#define PERI_CLK_I2C7		11
+#define PERI_CLK_I2C6		12
+#define PERI_CLK_I2C5		13
+#define PERI_CLK_I2C4		14
+#define PERI_CLK_I2C9		15
+#define PERI_CLK_I2C8		16
+#define PERI_CLK_I2C11		17
+#define PERI_CLK_I2C10		18
+#define PERI_CLK_HDMICEC	19
+#define PERI_CLK_EFUSE_WRITER	20
+#define PERI_CLK_ABB		21
+#define PERI_CLK_UART2		22
+#define PERI_CLK_UART1		23
+#define PERI_CLK_UART0		24
+#define PERI_CLK_ADC		25
+#define PERI_CLK_TMU4		26
+#define PERI_CLK_TMU3		27
+#define PERI_CLK_TMU2		28
+#define PERI_CLK_TMU1		29
+#define PERI_CLK_TMU0		30
+#define PERI_CLK_SPI2		31
+#define PERI_CLK_SPI1		32
+#define PERI_CLK_SPI0		33
+#define PERI_CLK_SPDIF		34
+#define PERI_CLK_PWM		35
+#define PERI_CLK_UART4		36
+#define PERI_CLK_CHIPID		37
+#define PERI_CLK_PROVKEY0	38
+#define PERI_CLK_PROVKEY1	39
+#define PERI_CLK_SECKEY		40
+#define PERI_CLK_TOP_RTC	41
+#define PERI_CLK_TZPC10		42
+#define PERI_CLK_TZPC9		43
+#define PERI_CLK_TZPC8		44
+#define PERI_CLK_TZPC7		45
+#define PERI_CLK_TZPC6		46
+#define PERI_CLK_TZPC5		47
+#define PERI_CLK_TZPC4		48
+#define PERI_CLK_TZPC3		49
+#define PERI_CLK_TZPC2		50
+#define PERI_CLK_TZPC1		51
+#define PERI_CLK_TZPC0		52
+#define PERI_SCLK_SPI2		53
+#define PERI_SCLK_SPI1		54
+#define PERI_SCLK_SPI0		55
+#define PERI_SCLK_SPDIF		56
+#define PERI_SCLK_I2S		57
+#define PERI_SCLK_PCM1		58
+#define PERI_SCLK_UART2		59
+#define PERI_SCLK_UART1		60
+#define PERI_SCLK_UART0		61
+#define PERI_NR_CLK		62
+
+/* List Of Clocks For CMU_DISP */
+#define DISP_CLK_SMMU_TV	1
+#define DISP_CLK_SMMU_FIMD1M1	2
+#define DISP_CLK_SMMU_FIMD1M0	3
+#define DISP_CLK_MIXER		4
+#define DISP_CLK_MIPIPHY	5
+#define DISP_CLK_HDMIPHY	6
+#define DISP_CLK_HDMI		7
+#define DISP_CLK_FIMD1		8
+#define DISP_CLK_DSIM1		9
+#define DISP_CLK_DPPHY		10
+#define DISP_CLK_DP		11
+#define DISP_SCLK_PIXEL		12
+#define DISP_MOUT_HDMI_PHY_PIXEL_USER		13
+#define DISP_MOUT_HDMI_PHY_PIXEL	14
+#define DISP_NR_CLK		15
+
+/* List Of Clocks For CMU_G2D */
+#define G2D_CLK_SMMU3_JPEG	1
+#define G2D_CLK_MDMA		2
+#define G2D_CLK_JPEG		3
+#define G2D_CLK_G2D		4
+#define G2D_CLK_SSS		5
+#define G2D_CLK_SLIM_SSS	6
+#define G2D_CLK_SMMU_SLIM_SSS	7
+#define G2D_CLK_SMMU_SSS	8
+#define G2D_CLK_SMMU_MDMA	9
+#define G2D_CLK_SMMU3_G2D	10
+#define G2D_NR_CLK		11
+
+/* List Of Clocks For CMU_ISP */
+#define ISP_CLK_GIC		1
+#define ISP_CLK_WDT		2
+#define ISP_CLK_UART		3
+#define ISP_CLK_SPI1		4
+#define ISP_CLK_SPI0		5
+#define ISP_CLK_SMMU_SCALERP	6
+#define ISP_CLK_SMMU_SCALERC	7
+#define ISP_CLK_SMMU_ISPCX	8
+#define ISP_CLK_SMMU_ISP	9
+#define ISP_CLK_SMMU_FD		10
+#define ISP_CLK_SMMU_DRC	11
+#define ISP_CLK_PWM		12
+#define ISP_CLK_MTCADC		13
+#define ISP_CLK_MPWM		14
+#define ISP_CLK_MCUCTL		15
+#define ISP_CLK_I2C1		16
+#define ISP_CLK_I2C0		17
+#define ISP_CLK_FIMC_SCALERP	18
+#define ISP_CLK_FIMC_SCALERC	19
+#define ISP_CLK_FIMC		20
+#define ISP_CLK_FIMC_FD		21
+#define ISP_CLK_FIMC_DRC	22
+#define ISP_CLK_CA5		23
+#define ISP_SCLK_SPI0_EXT	24
+#define ISP_SCLK_SPI1_EXT	25
+#define ISP_SCLK_UART_EXT	26
+#define ISP_NR_CLK		27
+
+#endif
Signature · 2 lines
Best Regards,
Pankaj Dubey
#11 lore raw

PATCH v5 4/5 clk/exynos5260: add macros and documentation for exynos5260

Quoted 53 lines · Pankaj Dubey

Hi Rahul,

Quoted 49 lines · Rahul Sharma

Add macros which are used as Clock IDs in DT and clock file. It also adds the documentation for the exynos5260 clocks.

---
  .../devicetree/bindings/clock/exynos5260-clock.txt |   55 +++++
  include/dt-bindings/clock/exynos5260-clk.h         |  233
++++++++++++++++++++
  2 files changed, 288 insertions(+)

create mode 100644
Documentation/devicetree/bindings/clock/exynos5260-clock.txt
create mode 100644 include/dt-bindings/clock/exynos5260-clk.h

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +25 -0
new file mode 100644
index 0000000..4128892
@@ -0,0 +1,55 @@
+* Samsung Exynos5260 Clock Controller
+
+The Exynos5260 clock controller encapsulate all CMUs which are
+instantiaited independently from the device-tree. As a whole, these
+CMUs generates and supplies clocks to various controllers within
+the Exynos5260 SoC.
+
+Required Properties:
+
+- compatible: should be one of the following.
+       "exynos5260-clock-top"
+       "exynos5260-clock-peri"
+       "exynos5260-clock-egl"
+       "exynos5260-clock-kfc"
+       "exynos5260-clock-g2d"
+       "exynos5260-clock-mif"
+       "exynos5260-clock-mfc"
+       "exynos5260-clock-g3d"
+       "exynos5260-clock-fsys"
+       "exynos5260-clock-aud"
+       "exynos5260-clock-isp"
+       "exynos5260-clock-gscl"
+       "exynos5260-clock-disp"
+
+- reg: physical base address of the controller and length of memory

mapped

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +2 -0
+  region.
+
Quoted 9 lines

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 32

Quoted 5 lines

+- #clock-cells: should be 1.

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +4 -0
+
+The following is the list of clocks generated by each controller. Each
+clock is assigned with a MACRO constant. These constants are defined in
+"dt-bindings/clk/exynos5260-clk.h". DT client nodes use this MACRO to

nit: s/clk/clock

Oops. I will change this.

Quoted 21 lines
Quoted 21 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +12 -0
+specify the clock, which they want to consume.
+
+Example 1: An example of a clock controller node is listed below.
+
+       cmu_disp: clock-controller at 0x14550000 {
+               compatible = "exynos5260-clock-disp";
+               reg = <0x14550000 0x10000>;
+               #clock-cells = <1>;
+       };
+
+Example 2: UART controller node that consumes the clock generated by the
+               peri clock controller. Refer to the standard clock

bindings for

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +7 -0
+               information about 'clocks' and 'clock-names' property.
+
+       serial at 12C00000 {
+               compatible = "samsung,exynos4210-uart";
+               reg = <0x12C00000 0x100>;
+               interrupts = <0 146 0>;
+               clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri
Quoted 9 lines

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 54

Quoted 4 lines

PERI_SCLK_UART0>;

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +3 -0
+               clock-names = "uart", "clk_uart_baud0";
+               status = "disabled";
+       };

Isn't it better that we should add binding information about fixed-clocks (phyclocks and ioclks) here?

Binding for "fixed-clocks" are applicable for the above clocks. We don't need to add them here. Did you mean something different ?

Quoted 35 lines
Quoted 20 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +1 -0
+
include/dt-bindings/clock/exynos5260-clk.h new file +11 -0
new file mode 100644
index 0000000..d6f4391
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Provides Constants for Exynos5260 clocks.
+*/
+
+#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H

include/dt-bindings/clock/exynos5260-clk.h line 21

Quoted 10 lines
include/dt-bindings/clock/exynos5260-clk.h new file +10 -0
+#define _DT_BINDINGS_CLK_EXYNOS5260_H
+
+/*
+ * Clock names:        XXXXX_YYYYYY_ZZZZ
+ *             |---| |----| |--|
+ *              cmu   type   IP
+ */
+
+/* List Of Clocks For CMU_TOP */
+#define FIN_PLL                        1

This should be removed now.

Quoted 12 lines

include/dt-bindings/clock/exynos5260-clk.h line 31

Quoted 10 lines
include/dt-bindings/clock/exynos5260-clk.h new file +10 -0
+#define TOP_FOUT_DISP_PLL      2
+#define TOP_FOUT_AUD_PLL       3
+#define TOP_SCLK_MMC0          4
+#define TOP_SCLK_MMC1          5
+#define TOP_SCLK_MMC2          6
+#define TOP_SCLK_HDMIPHY       7
+#define TOP_SCLK_FIMD1         8
+#define TOP_MOUT_FIMD1         9
+#define TOP_MOUT_DISP_PLL      10
+#define TOP_HDMI_PHY_PIXEL_CLKO        11

yea, I will remove these 2.

Quoted 196 lines
Quoted 196 lines
include/dt-bindings/clock/exynos5260-clk.h new file +194 -0
+#define TOP_NR_CLK             12
+
+/* List Of Clocks For CMU_EGL */
+#define EGL_FOUT_EGL_PLL       1
+#define EGL_FOUT_EGL_DPLL      2
+#define EGL_NR_CLK             3
+
+/* List Of Clocks For CMU_KFC */
+#define KFC_FOUT_KFC_PLL       1
+#define KFC_NR_CLK             2
+
+/* List Of Clocks For CMU_MIF */
+#define MIF_FOUT_MEM_PLL       1
+#define MIF_FOUT_BUS_PLL       2
+#define MIF_FOUT_MEDIA_PLL     3
+#define MIF_NR_CLK             4
+
+/* List Of Clocks For CMU_G3D */
+#define G3D_FOUT_G3D_PLL       1
+#define G3D_CLK_G3D_HPM                2
+#define G3D_CLK_G3D            3
+#define G3D_NR_CLK             4
+
+/* List Of Clocks For CMU_AUD */
+#define AUD_CLK_AUD_UART       1
+#define AUD_CLK_PCM            2
+#define AUD_CLK_I2S            3
+#define AUD_CLK_DMAC           4
+#define AUD_SCLK_AUD_UART      5
+#define AUD_SCLK_PCM           6
+#define AUD_SCLK_I2S           7
+#define AUD_NR_CLK             8
+
+/* List Of Clocks For CMU_MFC */
+#define MFC_CLK_MFC            1
+#define MFC_CLK_SMMU2_MFCM1    2
+#define MFC_CLK_SMMU2_MFCM0    3
+#define MFC_NR_CLK             4
+
+/* List Of Clocks For CMU_GSCL */
+#define GSCL_CLK_PIXEL_GSCL1   1
+#define GSCL_CLK_PIXEL_GSCL0   2
+#define GSCL_CLK_MSCL1         3
+#define GSCL_CLK_MSCL0         4
+#define GSCL_CLK_GSCL1         5
+#define GSCL_CLK_GSCL0         6
+#define GSCL_CLK_FIMC_LITE_D   7
+#define GSCL_CLK_FIMC_LITE_B   8
+#define GSCL_CLK_FIMC_LITE_A   9
+#define GSCL_CLK_CSIS1         10
+#define GSCL_CLK_CSIS0         11
+#define GSCL_CLK_SMMU3_LITE_D  12
+#define GSCL_CLK_SMMU3_LITE_B  13
+#define GSCL_CLK_SMMU3_LITE_A  14
+#define GSCL_CLK_SMMU3_GSCL0   15
+#define GSCL_CLK_SMMU3_GSCL1   16
+#define GSCL_CLK_SMMU3_MSCL0   17
+#define GSCL_CLK_SMMU3_MSCL1   18
+#define GSCL_SCLK_CSIS1_WRAP   19
+#define GSCL_SCLK_CSIS0_WRAP   20
+#define GSCL_NR_CLK            21
+
+/* List Of Clocks For CMU_FSYS */
+#define FSYS_CLK_TSI           1
+#define FSYS_CLK_USBLINK       2
+#define FSYS_CLK_USBHOST20     3
+#define FSYS_CLK_USBDRD30      4
+#define FSYS_CLK_SROMC         5
+#define FSYS_CLK_PDMA          6
+#define FSYS_CLK_MMC2          7
+#define FSYS_CLK_MMC1          8
+#define FSYS_CLK_MMC0          9
+#define FSYS_CLK_RTIC          10
+#define FSYS_CLK_SMMU_RTIC     11
+#define FSYS_PHYCLK_USBDRD30   12
+#define FSYS_PHYCLK_USBHOST20  13
+#define FSYS_NR_CLK            14
+
+/* List Of Clocks For CMU_PERI */
+#define PERI_CLK_WDT_KFC       1
+#define PERI_CLK_WDT_EGL       2
+#define PERI_CLK_HSIC3         3
+#define PERI_CLK_HSIC2         4
+#define PERI_CLK_HSIC1         5
+#define PERI_CLK_HSIC0         6
+#define PERI_CLK_PCM           7
+#define PERI_CLK_MCT           8
+#define PERI_CLK_I2S           9
+#define PERI_CLK_I2CHDMI       10
+#define PERI_CLK_I2C7          11
+#define PERI_CLK_I2C6          12
+#define PERI_CLK_I2C5          13
+#define PERI_CLK_I2C4          14
+#define PERI_CLK_I2C9          15
+#define PERI_CLK_I2C8          16
+#define PERI_CLK_I2C11         17
+#define PERI_CLK_I2C10         18
+#define PERI_CLK_HDMICEC       19
+#define PERI_CLK_EFUSE_WRITER  20
+#define PERI_CLK_ABB           21
+#define PERI_CLK_UART2         22
+#define PERI_CLK_UART1         23
+#define PERI_CLK_UART0         24
+#define PERI_CLK_ADC           25
+#define PERI_CLK_TMU4          26
+#define PERI_CLK_TMU3          27
+#define PERI_CLK_TMU2          28
+#define PERI_CLK_TMU1          29
+#define PERI_CLK_TMU0          30
+#define PERI_CLK_SPI2          31
+#define PERI_CLK_SPI1          32
+#define PERI_CLK_SPI0          33
+#define PERI_CLK_SPDIF         34
+#define PERI_CLK_PWM           35
+#define PERI_CLK_UART4         36
+#define PERI_CLK_CHIPID                37
+#define PERI_CLK_PROVKEY0      38
+#define PERI_CLK_PROVKEY1      39
+#define PERI_CLK_SECKEY                40
+#define PERI_CLK_TOP_RTC       41
+#define PERI_CLK_TZPC10                42
+#define PERI_CLK_TZPC9         43
+#define PERI_CLK_TZPC8         44
+#define PERI_CLK_TZPC7         45
+#define PERI_CLK_TZPC6         46
+#define PERI_CLK_TZPC5         47
+#define PERI_CLK_TZPC4         48
+#define PERI_CLK_TZPC3         49
+#define PERI_CLK_TZPC2         50
+#define PERI_CLK_TZPC1         51
+#define PERI_CLK_TZPC0         52
+#define PERI_SCLK_SPI2         53
+#define PERI_SCLK_SPI1         54
+#define PERI_SCLK_SPI0         55
+#define PERI_SCLK_SPDIF                56
+#define PERI_SCLK_I2S          57
+#define PERI_SCLK_PCM1         58
+#define PERI_SCLK_UART2                59
+#define PERI_SCLK_UART1                60
+#define PERI_SCLK_UART0                61
+#define PERI_NR_CLK            62
+
+/* List Of Clocks For CMU_DISP */
+#define DISP_CLK_SMMU_TV       1
+#define DISP_CLK_SMMU_FIMD1M1  2
+#define DISP_CLK_SMMU_FIMD1M0  3
+#define DISP_CLK_MIXER         4
+#define DISP_CLK_MIPIPHY       5
+#define DISP_CLK_HDMIPHY       6
+#define DISP_CLK_HDMI          7
+#define DISP_CLK_FIMD1         8
+#define DISP_CLK_DSIM1         9
+#define DISP_CLK_DPPHY         10
+#define DISP_CLK_DP            11
+#define DISP_SCLK_PIXEL                12
+#define DISP_MOUT_HDMI_PHY_PIXEL_USER          13
+#define DISP_MOUT_HDMI_PHY_PIXEL       14
+#define DISP_NR_CLK            15
+
+/* List Of Clocks For CMU_G2D */
+#define G2D_CLK_SMMU3_JPEG     1
+#define G2D_CLK_MDMA           2
+#define G2D_CLK_JPEG           3
+#define G2D_CLK_G2D            4
+#define G2D_CLK_SSS            5
+#define G2D_CLK_SLIM_SSS       6
+#define G2D_CLK_SMMU_SLIM_SSS  7
+#define G2D_CLK_SMMU_SSS       8
+#define G2D_CLK_SMMU_MDMA      9
+#define G2D_CLK_SMMU3_G2D      10
+#define G2D_NR_CLK             11
+
+/* List Of Clocks For CMU_ISP */
+#define ISP_CLK_GIC            1
+#define ISP_CLK_WDT            2
+#define ISP_CLK_UART           3
+#define ISP_CLK_SPI1           4
+#define ISP_CLK_SPI0           5
+#define ISP_CLK_SMMU_SCALERP   6
+#define ISP_CLK_SMMU_SCALERC   7
+#define ISP_CLK_SMMU_ISPCX     8
+#define ISP_CLK_SMMU_ISP       9
+#define ISP_CLK_SMMU_FD                10
+#define ISP_CLK_SMMU_DRC       11
+#define ISP_CLK_PWM            12
+#define ISP_CLK_MTCADC         13
+#define ISP_CLK_MPWM           14
+#define ISP_CLK_MCUCTL         15
+#define ISP_CLK_I2C1           16
+#define ISP_CLK_I2C0           17
+#define ISP_CLK_FIMC_SCALERP   18
+#define ISP_CLK_FIMC_SCALERC   19
+#define ISP_CLK_FIMC           20
+#define ISP_CLK_FIMC_FD                21
Quoted 10 lines

include/dt-bindings/clock/exynos5260-clk.h line 233

Quoted 8 lines
include/dt-bindings/clock/exynos5260-clk.h new file +8 -0
+#define ISP_CLK_FIMC_DRC       22
+#define ISP_CLK_CA5            23
+#define ISP_SCLK_SPI0_EXT      24
+#define ISP_SCLK_SPI1_EXT      25
+#define ISP_SCLK_UART_EXT      26
+#define ISP_NR_CLK             27
+
+#endif

Regards,
Rahul Sharma.

Quoted 5 lines

--
Best Regards,
Pankaj Dubey

#12 lore raw

PATCH v5 4/5 clk/exynos5260: add macros and documentation for exynos5260

In reply to Rahul Sharma

Hi Rahul,

Quoted 17 lines · Rahul Sharma

Add macros which are used as Clock IDs in DT and clock file. It also adds the documentation for the exynos5260 clocks.

---
  .../devicetree/bindings/clock/exynos5260-clock.txt |   55 +++++
  include/dt-bindings/clock/exynos5260-clk.h         |  233 ++++++++++++++++++++
  2 files changed, 288 insertions(+)

create mode 100644 Documentation/devicetree/bindings/clock/exynos5260-clock.txt create mode 100644 include/dt-bindings/clock/exynos5260-clk.h

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +0 -0
new file mode 100644
index 0000000..4128892

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 3

Quoted 3 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +3 -0
@@ -0,0 +1,55 @@
+* Samsung Exynos5260 Clock Controller
+
+The Exynos5260 clock controller encapsulate all CMUs which are

s/encapsulate/encapsulates/

Anyway, I don't think there is any global clock controller entity that should be described here. The binding is related to several separate entities found on Exynos5260, i.e. particular CMUs.

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 4

Quoted 1 line
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +1 -0
+instantiaited independently from the device-tree. As a whole, these

s/instantiaited/instantiated/
s/the device-tree/device tree/

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 5

Quoted 1 line
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +1 -0
+CMUs generates and supplies clocks to various controllers within

s/generates/generate/
s/supplies/supply/

Quoted 8 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +8 -0
+the Exynos5260 SoC.
+
+Required Properties:
+
+- compatible: should be one of the following.
+	"exynos5260-clock-top"
+	"exynos5260-clock-peri"
+	"exynos5260-clock-egl"

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 23

Quoted 10 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +10 -0
+	"exynos5260-clock-kfc"
+	"exynos5260-clock-g2d"
+	"exynos5260-clock-mif"
+	"exynos5260-clock-mfc"
+	"exynos5260-clock-g3d"
+	"exynos5260-clock-fsys"
+	"exynos5260-clock-aud"
+	"exynos5260-clock-isp"
+	"exynos5260-clock-gscl"
+	"exynos5260-clock-disp"

Compatible strings should be prefixed with Samsung's vendor prefix, i.e. "samsung,".

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 28

Quoted 5 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +5 -0
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.

As implemented in patch [1] the clock core will be able to sort out dependencies between particular clock providers based on clock consumer bindings. This means that it would be a good idea to add clock properties to this binding and strictly specify which clocks outside particular CMU block are fed into the block.

So for example, if CMU TOP uses fin_pll clock, its node would need to have "clock-names" property with "fin_pll" entry and "clocks" property with respective entry pointing to the fixed rate clock node.

In general, all external, IO and PHY clocks fed into CMU blocks should be listed this way to have dependencies between clocks properly defined in the system.

[1] http://thread.gmane.org/gmane.linux.kernel/1654635

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 30

Quoted 2 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +2 -0
+
+The following is the list of clocks generated by each controller.

There is no list below. IMHO this sentence should be removed.

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 33

Quoted 4 lines

Each

Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +3 -0
+clock is assigned with a MACRO constant. These constants are defined in
+"dt-bindings/clk/exynos5260-clk.h". DT client nodes use this MACRO to
+specify the clock, which they want to consume.

IMHO the whole paragraph above can be rewritten taking samsung,s3c64xx-clock.txt as an example:

Each clock is assigned an identifier and client nodes can use this identifier to specify the clock which they consume. All available clocks are defined as preprocessor macros in dt-bindings/clock/exynos5260-clk.h header and can be used in device tree sources.

In addition to the above, a list of external clocks that need or may be present should be added. Again, see samsung,s3c64xx-clock.txt for an example.

Documentation/devicetree/bindings/clock/exynos5260-clock.txt line 38

Quoted 5 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +5 -0
+
+Example 1: An example of a clock controller node is listed below.
+
+	cmu_disp: clock-controller at 0x14550000 {
+		compatible = "exynos5260-clock-disp";

Incorrect compatible string.

Quoted 47 lines
Documentation/devicetree/bindings/clock/exynos5260-clock.txt new file +17 -0
+		reg = <0x14550000 0x10000>;
+		#clock-cells = <1>;
+	};
+
+Example 2: UART controller node that consumes the clock generated by the
+		peri clock controller. Refer to the standard clock bindings for
+		information about 'clocks' and 'clock-names' property.
+
+	serial at 12C00000 {
+		compatible = "samsung,exynos4210-uart";
+		reg = <0x12C00000 0x100>;
+		interrupts = <0 146 0>;
+		clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri PERI_SCLK_UART0>;
+		clock-names = "uart", "clk_uart_baud0";
+		status = "disabled";
+	};
+
include/dt-bindings/clock/exynos5260-clk.h new file +24 -0
new file mode 100644
index 0000000..d6f4391
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Provides Constants for Exynos5260 clocks.
+*/
+
+#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H
+#define _DT_BINDINGS_CLK_EXYNOS5260_H
+
+/*
+ * Clock names:	XXXXX_YYYYYY_ZZZZ
+ *		|---| |----| |--|
+ *		 cmu   type   IP
+ */
+
+/* List Of Clocks For CMU_TOP */
+#define FIN_PLL			1
+#define TOP_FOUT_DISP_PLL	2
+#define TOP_FOUT_AUD_PLL	3
+#define TOP_SCLK_MMC0		4

[snip]

include/dt-bindings/clock/exynos5260-clk.h line 188

Quoted 6 lines
include/dt-bindings/clock/exynos5260-clk.h new file +6 -0
+#define DISP_CLK_DSIM1		9
+#define DISP_CLK_DPPHY		10
+#define DISP_CLK_DP		11
+#define DISP_SCLK_PIXEL		12
+#define DISP_MOUT_HDMI_PHY_PIXEL_USER		13
+#define DISP_MOUT_HDMI_PHY_PIXEL	14

nit: Incorrect alignment. Please indent further all the numbers to match the longest indentation level.

Best regards,
Tomasz

#13 lore raw

PATCH v5 5/5 clk/exynos5260: add clock file for exynos5260

In reply to Rahul Sharma

Add support for exynos5260 clocks in clock driver.

---
 drivers/clk/samsung/Makefile         |    1 +
 drivers/clk/samsung/clk-exynos5260.c | 1805 ++++++++++++++++++++++++++++++++++
 drivers/clk/samsung/clk-exynos5260.h |  448 +++++++++
 3 files changed, 2254 insertions(+)
 create mode 100644 drivers/clk/samsung/clk-exynos5260.c
 create mode 100644 drivers/clk/samsung/clk-exynos5260.h
drivers/clk/samsung/Makefile +1 -0
index 77313e2..56e7d38 100644
@@ -5,6 +5,7 @@
 obj-$(CONFIG_COMMON_CLK)	+= clk.o clk-pll.o
 obj-$(CONFIG_ARCH_EXYNOS4)	+= clk-exynos4.o
 obj-$(CONFIG_SOC_EXYNOS5250)	+= clk-exynos5250.o
+obj-$(CONFIG_SOC_EXYNOS5260)	+= clk-exynos5260.o
 obj-$(CONFIG_SOC_EXYNOS5420)	+= clk-exynos5420.o
 obj-$(CONFIG_SOC_EXYNOS5440)	+= clk-exynos5440.o
 obj-$(CONFIG_ARCH_EXYNOS)	+= clk-exynos-audss.o
drivers/clk/samsung/clk-exynos5260.c new file +1805 -0

1,805 lines not on this page · raw message

drivers/clk/samsung/clk-exynos5260.h new file +448 -0

448 lines not on this page · raw message

Signature · 1 line
1.7.9.5
#14 lore raw

PATCH v5 5/5 clk/exynos5260: add clock file for exynos5260

Quoted 11 lines · Rahul Sharma

Add support for exynos5260 clocks in clock driver.

---
  drivers/clk/samsung/Makefile         |    1 +
  drivers/clk/samsung/clk-exynos5260.c | 1805 ++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-exynos5260.h |  448 +++++++++
  3 files changed, 2254 insertions(+)

create mode 100644 drivers/clk/samsung/clk-exynos5260.c create mode 100644 drivers/clk/samsung/clk-exynos5260.h

[snip]

Quoted 5 lines
drivers/clk/samsung/clk-exynos5260.c new file +0 -0
new file mode 100644
index 0000000..f72ad6a

[snip]

Quoted 5 lines
drivers/clk/samsung/clk-exynos5260.c new file +5 -0
+struct samsung_gate_clock aud_gate_clks[] __initdata = {
+	GATE(AUD_CLK_AUD_UART, "clk_aud_uart", "dout_aclk_aud_131",
+			EN_IP_AUD, 4, 0, 0),
+	GATE(AUD_CLK_PCM, "clk_pcm", "dout_aclk_aud_131", EN_IP_AUD, 3, 0, 0),
+	GATE(AUD_CLK_I2S, "clk_i2s", "dout_aclk_aud_131", EN_IP_AUD, 2, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 255

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(AUD_CLK_DMAC, "clk_dmac", "dout_aclk_aud_131",
+			EN_IP_AUD, 1, 0, 0),
+	GATE(0, "clk_sramc", "dout_aclk_aud_131", EN_IP_AUD, 0, 0, 0),
+
+	GATE(AUD_SCLK_AUD_UART, "sclk_aud_uart", "dout_sclk_aud_uart",
+			EN_SCLK_AUD, 2, CLK_SET_RATE_PARENT, 0),
+	GATE(AUD_SCLK_PCM, "sclk_aud_pcm", "dout_sclk_aud_pcm",
+			EN_SCLK_AUD, 1, CLK_SET_RATE_PARENT, 0),
+	GATE(AUD_SCLK_I2S, "sclk_aud_i2s", "dout_sclk_aud_i2s",
+			EN_SCLK_AUD, 0, CLK_SET_RATE_PARENT, 0),

Please keep the clocks sorted by the register offsets ascending as well, to match the order in UM.

[snip]

drivers/clk/samsung/clk-exynos5260.c line 344

Quoted 8 lines
drivers/clk/samsung/clk-exynos5260.c new file +8 -0
+
+struct samsung_mux_clock disp_mux_clks[] __initdata = {
+	MUX(0, "mout_sclk_hdmi_spdif", mout_sclk_hdmi_spdif_p,
+			MUX_SEL_DISP4, 4, 2),
+
+	MUX(0, "mout_sclk_dsim1_tx_clk_esc_clk_user",
+			mout_sclk_dsim1_tx_clk_esc_clk_user_p,
+			MUX_SEL_DISP2, 28, 1),

Ditto.

[snip]

Quoted 25 lines
drivers/clk/samsung/clk-exynos5260.c new file +25 -0
+struct samsung_gate_clock disp_gate_clks[] __initdata = {
+	GATE(DISP_CLK_SMMU_TV, "clk_smmu3_tv", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 25, 0, 0),
+	GATE(DISP_CLK_SMMU_FIMD1M1, "clk_smmu3_fimd1m1",
+			"mout_aclk_disp_222_user",
+			EN_IP_DISP, 23, 0, 0),
+	GATE(DISP_CLK_SMMU_FIMD1M0, "clk_smmu3_fimd1m0",
+			"mout_aclk_disp_222_user",
+			EN_IP_DISP, 22, 0, 0),
+	GATE(0, "clk_pixel_mixer", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 13, CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_pixel_disp", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 12, CLK_IGNORE_UNUSED, 0),
+	GATE(DISP_CLK_MIXER, "clk_mixer", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 11, 0, 0),
+	GATE(DISP_CLK_MIPIPHY, "clk_mipi_dphy", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 10, 0, 0),
+	GATE(DISP_CLK_HDMIPHY, "clk_hdmiphy", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 9, 0, 0),
+	GATE(DISP_CLK_HDMI, "clk_hdmi", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 8, 0, 0),
+	GATE(DISP_CLK_FIMD1, "clk_fimd1", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 7, 0, 0),
+	GATE(DISP_CLK_DSIM1, "clk_dsim1", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 6, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 446

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(DISP_CLK_DPPHY, "clk_dptx_phy", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 5, 0, 0),
+	GATE(DISP_CLK_DP, "clk_dptx_link", "mout_aclk_disp_222_user",
+			EN_IP_DISP, 4, 0, 0),
+	GATE(DISP_SCLK_PIXEL, "sclk_hdmi_phy_pixel_clki",
+			"dout_sclk_hdmi_phy_pixel_clki",
+			EN_SCLK_DISP0, 29, CLK_SET_RATE_PARENT, 0),
+	GATE(DISP_MOUT_HDMI_PHY_PIXEL_USER, "sclk_hdmi_link_i_pixel",
+			"mout_phyclk_hdmi_phy_pixel_clko_user",
+			EN_SCLK_DISP0, 26, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 19 lines
drivers/clk/samsung/clk-exynos5260.c new file +19 -0
+struct samsung_gate_clock fsys_gate_clks[] __initdata = {
+	GATE(FSYS_CLK_TSI, "clk_tsi", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 20, 0, 0),
+	GATE(FSYS_CLK_USBLINK, "clk_usblink", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 18, 0, 0),
+	GATE(FSYS_CLK_USBHOST20, "clk_usbhost20", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 15, 0, 0),
+	GATE(FSYS_CLK_USBDRD30, "clk_usbdrd30", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 14, 0, 0),
+	GATE(FSYS_CLK_SROMC, "clk_sromc", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 13, 0, 0),
+	GATE(FSYS_CLK_PDMA, "clk_pdma", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 9, 0, 0),
+	GATE(FSYS_CLK_MMC2, "clk_mmc2", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 8, 0, 0),
+	GATE(FSYS_CLK_MMC1, "clk_mmc1", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 7, 0, 0),
+	GATE(FSYS_CLK_MMC0, "clk_mmc0", "dout_aclk_fsys_200",
+			EN_IP_FSYS, 6, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 602

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(FSYS_CLK_RTIC, "clk_rtic", "mout_bustop_pll_user",
+			EN_IP_FSYS_SECURE_RTIC, 11, 0, 0),
+	GATE(FSYS_CLK_SMMU_RTIC, "clk_smmu_rtic", "mout_bustop_pll_user",
+			EN_IP_FSYS_SECURE_SMMU_RTIC, 12, 0, 0),
+	GATE(FSYS_PHYCLK_USBDRD30, "phyclk_usbdrd30_udrd30_phyclock_g",
+			"mout_phyclk_usbdrd30_phyclock_user",
+			EN_SCLK_FSYS, 7, 0, 0),
+	GATE(FSYS_PHYCLK_USBHOST20, "phyclk_usbhost20_phyclock",
+			"mout_phyclk_usbdrd30_phyclock_user",
+			EN_SCLK_FSYS, 1, 0, 0),

Ditto.

[snip]

Quoted 40 lines
drivers/clk/samsung/clk-exynos5260.c new file +40 -0
+struct samsung_gate_clock gscl_gate_clks[] __initdata = {
+	GATE(GSCL_CLK_PIXEL_GSCL1, "clk_pixel_gscl1", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 9, 0, 0),
+	GATE(GSCL_CLK_PIXEL_GSCL0, "clk_pixel_gscl0", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 8, 0, 0),
+	GATE(GSCL_CLK_MSCL1, "clk_mscl1", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 5, 0, 0),
+	GATE(GSCL_CLK_MSCL0, "clk_mscl0", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 4, 0, 0),
+	GATE(GSCL_CLK_GSCL1, "clk_gscl1", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 3, 0, 0),
+	GATE(GSCL_CLK_GSCL0, "clk_gscl0", "mout_aclk_gscl_333",
+			EN_IP_GSCL, 2, 0, 0),
+	GATE(GSCL_CLK_FIMC_LITE_D, "clk_fimc_lite_d",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 12, 0, 0),
+	GATE(GSCL_CLK_FIMC_LITE_B, "clk_fimc_lite_b",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 11, 0, 0),
+	GATE(GSCL_CLK_FIMC_LITE_A, "clk_fimc_lite_a",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 10, 0, 0),
+	GATE(GSCL_CLK_CSIS1, "clk_csis1", "mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 9, 0, 0),
+	GATE(GSCL_CLK_CSIS0, "clk_csis0", "mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 8, 0, 0),
+	GATE(GSCL_CLK_SMMU3_LITE_D, "clk_smmu3_lite_d",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 7, 0, 0),
+	GATE(GSCL_CLK_SMMU3_LITE_B, "clk_smmu3_lite_b",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 6, 0, 0),
+	GATE(GSCL_CLK_SMMU3_LITE_A, "clk_smmu3_lite_a",
+			"mout_aclk_gscl_fimc_user",
+			EN_IP_GSCL_FIMC, 5, 0, 0),
+	GATE(GSCL_CLK_SMMU3_GSCL0, "clk_smmu3_gscl0",
+			"mout_aclk_gscl_333",
+			EN_IP_GSCL_SECURE_SMMU_GSCL0, 17, 0, 0),
+	GATE(GSCL_CLK_SMMU3_GSCL1, "clk_smmu3_gscl1", "mout_aclk_gscl_333",
+			EN_IP_GSCL_SECURE_SMMU_GSCL1, 18, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 868

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(GSCL_CLK_SMMU3_MSCL0, "clk_smmu3_mscl0",
+			"mout_aclk_m2m_400_user",
+			EN_IP_GSCL_SECURE_SMMU_MSCL0, 19, 0, 0),
+	GATE(GSCL_CLK_SMMU3_MSCL1, "clk_smmu3_mscl1",
+			"mout_aclk_m2m_400_user",
+			EN_IP_GSCL_SECURE_SMMU_MSCL1, 20, 0, 0),
+	GATE(GSCL_SCLK_CSIS1_WRAP, "sclk_csis1_wrap", "dout_aclk_csis_200",
+			EN_SCLK_GSCL_FIMC, 1, CLK_SET_RATE_PARENT, 0),
+	GATE(GSCL_SCLK_CSIS0_WRAP, "sclk_csis0_wrap", "dout_aclk_csis_200",
+			EN_SCLK_GSCL_FIMC, 0, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 47 lines
drivers/clk/samsung/clk-exynos5260.c new file +47 -0
+struct samsung_gate_clock isp_gate_clks[] __initdata = {
+	GATE(ISP_CLK_GIC, "clk_isp_gic", "mout_aclk_isp1_266",
+			EN_IP_ISP0, 15, 0, 0),
+	GATE(ISP_CLK_WDT, "clk_isp_wdt", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 31, 0, 0),
+	GATE(ISP_CLK_UART, "clk_isp_uart", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 30, 0, 0),
+	GATE(ISP_CLK_SPI1, "clk_isp_spi1", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 28, 0, 0),
+	GATE(ISP_CLK_SPI0, "clk_isp_spi0", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 27, 0, 0),
+	GATE(ISP_CLK_SMMU_SCALERP, "clk_isp_smmu_scalerp",
+			"mout_aclk_isp1_266",
+			EN_IP_ISP1, 26, 0, 0),
+	GATE(ISP_CLK_SMMU_SCALERC, "clk_isp_smmu_scalerc",
+			"mout_aclk_isp1_266",
+			EN_IP_ISP1, 25, 0, 0),
+	GATE(ISP_CLK_SMMU_ISPCX, "clk_smmu_ispcx", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 24, 0, 0),
+	GATE(ISP_CLK_SMMU_ISP, "clk_smmu_isp", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 23, 0, 0),
+	GATE(ISP_CLK_SMMU_FD, "clk_smmu_fd", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 22, 0, 0),
+	GATE(ISP_CLK_SMMU_DRC, "clk_smmu_drc", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 21, 0, 0),
+	GATE(ISP_CLK_PWM, "clk_isp_pwm", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 14, 0, 0),
+	GATE(ISP_CLK_MTCADC, "clk_isp_mtcadc", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 11, 0, 0),
+	GATE(ISP_CLK_MPWM, "clk_isp_mpwm", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 10, 0, 0),
+	GATE(ISP_CLK_MCUCTL, "clk_isp_mcuctl", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 9, 0, 0),
+	GATE(ISP_CLK_I2C1, "clk_isp_i2c1", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 8, 0, 0),
+	GATE(ISP_CLK_I2C0, "clk_isp_i2c0", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 7, 0, 0),
+	GATE(ISP_CLK_FIMC_SCALERP, "clk_isp_fimc_scalerp",
+			"mout_aclk_isp1_266",
+			EN_IP_ISP1, 6, 0, 0),
+	GATE(ISP_CLK_FIMC_SCALERC, "clk_isp_fimc_scalerc",
+			"mout_aclk_isp1_266",
+			EN_IP_ISP1, 5, 0, 0),
+	GATE(ISP_CLK_FIMC, "clk_isp_fimc", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 4, 0, 0),
+	GATE(ISP_CLK_FIMC_FD, "clk_isp_fimc_fd", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 3, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 981

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(ISP_CLK_FIMC_DRC, "clk_isp_fimc_drc", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 2, 0, 0),
+	GATE(ISP_CLK_CA5, "clk_isp_ca5", "mout_aclk_isp1_266",
+			EN_IP_ISP1, 1, 0, 0),
+	GATE(ISP_SCLK_SPI0_EXT, "sclk_isp_spi0_ext", "fin_pll",
+			EN_SCLK_ISP, 9, CLK_SET_RATE_PARENT, 0),
+	GATE(ISP_SCLK_SPI1_EXT, "sclk_isp_spi1_ext", "fin_pll",
+			EN_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0),
+	GATE(ISP_SCLK_UART_EXT, "sclk_isp_uart_ext", "fin_pll",
+			EN_SCLK_ISP, 7, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 16 lines
drivers/clk/samsung/clk-exynos5260.c new file +16 -0
+struct samsung_gate_clock mif_gate_clks[] __initdata = {
+	GATE(0, "clk_lpddr3phy_wrap1", "dout_clk2x_phy",
+			EN_IP_MIF, 13, CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_lpddr3phy_wrap0", "dout_clk2x_phy",
+			EN_IP_MIF, 12, CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_monocnt", "dout_aclk_bus_100",
+			EN_IP_MIF_SECURE_MONOCNT, 22,
+			CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_mif_rtc", "dout_aclk_bus_100",
+			EN_IP_MIF_SECURE_RTC_APBIF, 23,
+			CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_drex1", "dout_aclk_mif_466",
+			EN_IP_MIF_SECURE_DREX1_TZ, 9,
+			CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_drex0", "dout_aclk_mif_466",
+			EN_IP_MIF_SECURE_DREX0_TZ, 9,

drivers/clk/samsung/clk-exynos5260.c line 1212

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+			CLK_IGNORE_UNUSED, 0),
+	GATE(0, "clk_intmem", "dout_aclk_bus_200",
+			EN_IP_MIF_SECURE_INTEMEM, 11,
+			CLK_IGNORE_UNUSED, 0),
+	GATE(0, "sclk_lpddr3phy_wrap_u1", "dout_clkm_phy",
+			EN_SCLK_MIF, 0, CLK_IGNORE_UNUSED |
+				CLK_SET_RATE_PARENT, 0),
+	GATE(0, "sclk_lpddr3phy_wrap_u0", "dout_clkm_phy",
+			EN_SCLK_MIF, 0, CLK_IGNORE_UNUSED |
+				CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 1 line

+struct samsung_gate_clock peri_gate_clks[] __initdata = {

[snip]

Quoted 15 lines
drivers/clk/samsung/clk-exynos5260.c new file +15 -0
+		EN_IP_PERI_SECURE_TZPC, 13, 0, 0),
+	GATE(PERI_CLK_TZPC2, "clk_tzpc2", "dout_aclk_peri_66",
+		EN_IP_PERI_SECURE_TZPC, 12, 0, 0),
+	GATE(PERI_CLK_TZPC1, "clk_tzpc1", "dout_aclk_peri_66",
+		EN_IP_PERI_SECURE_TZPC, 11, 0, 0),
+	GATE(PERI_CLK_TZPC0, "clk_tzpc0", "dout_aclk_peri_66",
+		EN_IP_PERI_SECURE_TZPC, 10, 0, 0),
+	GATE(PERI_SCLK_UART2, "sclk_uart2", "dout_sclk_peri_uart2",
+			EN_SCLK_PERI, 12, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_UART1, "sclk_uart1", "dout_sclk_peri_uart1",
+			EN_SCLK_PERI, 11, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_UART0, "sclk_uart0", "dout_sclk_peri_uart0",
+			EN_SCLK_PERI, 10, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_SPI2, "sclk_spi2", "dout_sclk_peri_spi2_b",
+			EN_SCLK_PERI, 9, CLK_SET_RATE_PARENT, 0),

drivers/clk/samsung/clk-exynos5260.c line 1424

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	GATE(PERI_SCLK_SPI1, "sclk_spi1", "dout_sclk_peri_spi1_b",
+			EN_SCLK_PERI, 8, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_SPI0, "sclk_spi0", "dout_sclk_peri_spi0_b",
+			EN_SCLK_PERI, 7, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_SPDIF, "sclk_spdif", "dout_sclk_peri_spi0_b",
+			EN_SCLK_PERI, 2, CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_I2S, "sclk_i2s", "dout_i2s", EN_SCLK_PERI, 1,
+			CLK_SET_RATE_PARENT, 0),
+	GATE(PERI_SCLK_PCM1, "sclk_pcm1", "dout_pcm", EN_SCLK_PERI, 0,
+			CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 42 lines
drivers/clk/samsung/clk-exynos5260.c new file +42 -0
+struct samsung_mux_clock top_mux_clks[] __initdata = {
+	MUX(0, "mout_audtop_pll_user", mout_audtop_pll_user_p,
+			MUX_SEL_TOP_PLL0, 24, 1),
+	MUX(0, "mout_aud_pll", mout_aud_pll_p, MUX_SEL_TOP_PLL0, 16, 1),
+	MUX(TOP_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p,
+			MUX_SEL_TOP_PLL0, 12, 1),
+	MUX(0, "mout_bustop_pll_user", mout_bustop_pll_user_p,
+			MUX_SEL_TOP_PLL0, 8, 1),
+	MUX(0, "mout_memtop_pll_user", mout_memtop_pll_user_p,
+			MUX_SEL_TOP_PLL0, 4, 1),
+	MUX(0, "mout_mediatop_pll_user", mout_mediatop_pll_user_p,
+			MUX_SEL_TOP_PLL0, 0, 1),
+	MUX(0, "mout_disp_disp_333", mout_disp_disp_333_p,
+			MUX_SEL_TOP_DISP0, 0, 1),
+	MUX(0, "mout_aclk_disp_333", mout_aclk_disp_333_p,
+			MUX_SEL_TOP_DISP0, 8, 1),
+	MUX(0, "mout_disp_disp_222", mout_disp_disp_222_p,
+			MUX_SEL_TOP_DISP0, 12, 1),
+	MUX(0, "mout_aclk_disp_222", mout_aclk_disp_222_p,
+			MUX_SEL_TOP_DISP0, 20, 1),
+	MUX(0, "mout_disp_media_pixel", mout_disp_media_pixel_p,
+			MUX_SEL_TOP_DISP1, 8, 1),
+	MUX(TOP_MOUT_FIMD1, "mout_sclk_disp_pixel", mout_sclk_disp_pixel_p,
+			MUX_SEL_TOP_DISP1, 0, 1),
+	MUX(0, "mout_sclk_peri_spi0_clk", mout_sclk_peri_spi_clk_p,
+			MUX_SEL_TOP_PERI1, 8, 1),
+	MUX(0, "mout_sclk_peri_spi1_clk", mout_sclk_peri_spi_clk_p,
+			MUX_SEL_TOP_PERI1, 4, 1),
+	MUX(0, "mout_sclk_peri_spi2_clk", mout_sclk_peri_spi_clk_p,
+			MUX_SEL_TOP_PERI1, 0, 1),
+	MUX(0, "mout_sclk_peri_uart0_uclk", mout_sclk_peri_uart_uclk_p,
+			MUX_SEL_TOP_PERI1, 20, 1),
+	MUX(0, "mout_sclk_peri_uart2_uclk", mout_sclk_peri_uart_uclk_p,
+			MUX_SEL_TOP_PERI1, 16, 1),
+	MUX(0, "mout_sclk_peri_uart1_uclk", mout_sclk_peri_uart_uclk_p,
+			MUX_SEL_TOP_PERI1, 12, 1),
+	MUX(0, "mout_bus4_bustop_100", mout_bus_bustop_100_p,
+			MUX_SEL_TOP_BUS, 28, 1),
+	MUX(0, "mout_bus4_bustop_400", mout_bus_bustop_400_p,
+			MUX_SEL_TOP_BUS, 24, 1),
+	MUX(0, "mout_bus3_bustop_100", mout_bus_bustop_100_p,
+			MUX_SEL_TOP_BUS, 20, 1),

drivers/clk/samsung/clk-exynos5260.c line 1588

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	MUX(0, "mout_bus3_bustop_400", mout_bus_bustop_400_p,
+			MUX_SEL_TOP_BUS, 16, 1),
+	MUX(0, "mout_bus2_bustop_400", mout_bus_bustop_400_p,
+			MUX_SEL_TOP_BUS, 12, 1),
+	MUX(0, "mout_bus2_bustop_100", mout_bus_bustop_100_p,
+			MUX_SEL_TOP_BUS, 8, 1),
+	MUX(0, "mout_bus1_bustop_100", mout_bus_bustop_100_p,
+			MUX_SEL_TOP_BUS, 4, 1),
+	MUX(0, "mout_bus1_bustop_400", mout_bus_bustop_400_p,
+			MUX_SEL_TOP_BUS, 0, 1),

Ditto.

Quoted 30 lines
drivers/clk/samsung/clk-exynos5260.c new file +30 -0
+	MUX(0, "mout_sclk_fsys_usb", mout_sclk_fsys_usb_p,
+			MUX_SEL_TOP_FSYS, 0, 1),
+	MUX(0, "mout_sclk_fsys_mmc0_sdclkin_a",
+			mout_sclk_fsys_mmc_sdclkin_a_p,
+			MUX_SEL_TOP_FSYS, 20, 1),
+	MUX(0, "mout_sclk_fsys_mmc1_sdclkin_a",
+			mout_sclk_fsys_mmc_sdclkin_a_p,
+			MUX_SEL_TOP_FSYS, 12, 1),
+	MUX(0, "mout_sclk_fsys_mmc2_sdclkin_a",
+			mout_sclk_fsys_mmc_sdclkin_a_p,
+			MUX_SEL_TOP_FSYS, 4, 1),
+	MUX(0, "mout_sclk_fsys_mmc0_sdclkin_b",
+			mout_sclk_fsys_mmc0_sdclkin_b_p,
+			MUX_SEL_TOP_FSYS, 24, 1),
+	MUX(0, "mout_sclk_fsys_mmc1_sdclkin_b",
+			mout_sclk_fsys_mmc1_sdclkin_b_p,
+			MUX_SEL_TOP_FSYS, 16, 1),
+	MUX(0, "mout_sclk_fsys_mmc2_sdclkin_b",
+			mout_sclk_fsys_mmc2_sdclkin_b_p,
+			MUX_SEL_TOP_FSYS, 8, 1),
+	MUX(0, "mout_aclk_isp1_266", mout_aclk_isp1_266_p,
+			MUX_SEL_TOP_ISP10, 20, 1),
+	MUX(0, "mout_isp1_media_266", mout_isp1_media_266_p,
+			MUX_SEL_TOP_ISP10, 16, 1),
+	MUX(0, "mout_aclk_isp1_400", mout_aclk_isp1_400_p,
+			MUX_SEL_TOP_ISP10, 8 , 1),
+	MUX(0, "mout_isp1_media_400", mout_isp1_media_400_p,
+			MUX_SEL_TOP_ISP10, 4, 1),
+	MUX(0, "mout_sclk_isp1_spi0", mout_sclk_isp_spi_p,
+			MUX_SEL_TOP_ISP11, 4, 1),

drivers/clk/samsung/clk-exynos5260.c line 1628

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	MUX(0, "mout_sclk_isp1_spi1", mout_sclk_isp_spi_p,
+			MUX_SEL_TOP_ISP11, 8, 1),
+	MUX(0, "mout_sclk_isp1_uart", mout_sclk_isp_uart_p,
+			MUX_SEL_TOP_ISP11, 12, 1),
+	MUX(0, "mout_sclk_isp1_sensor2", mout_sclk_isp_sensor_p,
+			MUX_SEL_TOP_ISP11, 24, 1),
+	MUX(0, "mout_sclk_isp1_sensor1", mout_sclk_isp_sensor_p,
+			MUX_SEL_TOP_ISP11, 20, 1),
+	MUX(0, "mout_sclk_isp1_sensor0", mout_sclk_isp_sensor_p,
+			MUX_SEL_TOP_ISP11, 16, 1),

Ditto.

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	MUX(0, "mout_aclk_mfc_333", mout_aclk_mfc_333_p,
+			MUX_SEL_TOP_MFC, 8, 1),
+	MUX(0, "mout_mfc_bustop_333", mout_mfc_bustop_333_p,
+			MUX_SEL_TOP_MFC, 4, 1),
+	MUX(0, "mout_aclk_g2d_333", mout_aclk_g2d_333_p,
+			MUX_SEL_TOP_G2D, 8, 1),
+	MUX(0, "mout_g2d_bustop_333", mout_g2d_bustop_333_p,
+			MUX_SEL_TOP_G2D, 4, 1),
+	MUX(0, "mout_aclk_gscl_fimc", mout_aclk_gscl_fimc_p,
+			MUX_SEL_TOP_GSCL, 20, 1),

drivers/clk/samsung/clk-exynos5260.c line 1648

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	MUX(0, "mout_gscl_bustop_fimc", mout_gscl_bustop_fimc_p,
+			MUX_SEL_TOP_GSCL, 16, 1),
+	MUX(0, "mout_aclk_gscl_333", mout_aclk_gscl_333_p,
+			MUX_SEL_TOP_GSCL, 12, 1),
+	MUX(0, "mout_gscl_bustop_333", mout_gscl_bustop_333_p,
+			MUX_SEL_TOP_GSCL, 8, 1),
+	MUX(0, "mout_aclk_gscl_400", mout_aclk_gscl_400_p,
+			MUX_SEL_TOP_GSCL, 4, 1),
+	MUX(0, "mout_m2m_mediatop_400", mout_m2m_mediatop_400_p,
+			MUX_SEL_TOP_GSCL, 0, 1),

Ditto.

drivers/clk/samsung/clk-exynos5260.c line 1655

Quoted 7 lines
drivers/clk/samsung/clk-exynos5260.c new file +7 -0
+};
+
+struct samsung_div_clock top_div_clks[] __initdata = {
+	DIV(0, "dout_aclk_mfc_333", "mout_aclk_mfc_333",
+			DIV_TOP_G2D_MFC, 4, 3),
+	DIV(0, "dout_aclk_g2d_333", "mout_aclk_g2d_333",
+			DIV_TOP_GSCL_ISP0, 0, 3),

This looks wrong. The register and bit field are the same as "dout_aclk_gscl_333" below.

Quoted 30 lines
drivers/clk/samsung/clk-exynos5260.c new file +30 -0
+	DIV(0, "dout_sclk_isp1_sensor2_a", "mout_aclk_gscl_fimc",
+			DIV_TOP_GSCL_ISP0, 24, 4),
+	DIV(0, "dout_sclk_isp1_sensor1_a", "mout_aclk_gscl_400",
+			DIV_TOP_GSCL_ISP0, 20, 4),
+	DIV(0, "dout_sclk_isp1_sensor0_a", "mout_aclk_gscl_fimc",
+			DIV_TOP_GSCL_ISP0, 16, 4),
+	DIV(0, "dout_aclk_gscl_fimc", "mout_aclk_gscl_fimc",
+			DIV_TOP_GSCL_ISP0, 8, 3),
+	DIV(0, "dout_aclk_gscl_400", "mout_aclk_gscl_400",
+			DIV_TOP_GSCL_ISP0, 4, 3),
+	DIV(0, "dout_aclk_gscl_333", "mout_aclk_gscl_333",
+			DIV_TOP_GSCL_ISP0, 0, 3),
+	DIV(0, "dout_sclk_isp1_spi0_b", "dout_sclk_isp1_spi0_a",
+			DIV_TOP_ISP10, 16, 8),
+	DIV(0, "dout_sclk_isp1_spi0_a", "mout_sclk_isp1_spi0",
+			DIV_TOP_ISP10, 12, 4),
+	DIV(0, "dout_aclk_isp1_400", "mout_aclk_isp1_400",
+			DIV_TOP_ISP10, 4, 3),
+	DIV(0, "dout_aclk_isp1_266", "mout_aclk_isp1_266",
+			DIV_TOP_ISP10, 0, 3),
+	DIV(0, "dout_sclk_isp1_uart", "mout_sclk_isp1_uart",
+			DIV_TOP_ISP11, 12, 4),
+	DIV(0, "dout_sclk_isp1_spi1_b", "dout_sclk_isp1_spi1_a",
+			DIV_TOP_ISP11, 4, 8),
+	DIV(0, "dout_sclk_isp1_spi1_a", "mout_sclk_isp1_spi1",
+			DIV_TOP_ISP11, 0, 4),
+	DIV(0, "dout_sclk_isp1_sensor2_b", "dout_sclk_isp1_sensor2_a",
+			DIV_TOP_ISP11, 24, 4),
+	DIV(0, "dout_sclk_isp1_sensor1_b", "dout_sclk_isp1_sensor1_a",
+			DIV_TOP_ISP11, 20, 4),

drivers/clk/samsung/clk-exynos5260.c line 1695

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+	DIV(0, "dout_sclk_isp1_sensor0_b", "dout_sclk_isp1_sensor0_a",
+			DIV_TOP_ISP11, 16, 4),
+	DIV(0, "dout_sclk_hpm_targetclk", "mout_bustop_pll_user",
+			DIV_TOP_HPM, 0, 3),
+	DIV(0, "dout_sclk_disp_pixel", "mout_sclk_disp_pixel",
+			DIV_TOP_DISP, 8, 3),
+	DIV(0, "dout_aclk_disp_222", "mout_aclk_disp_222",
+			DIV_TOP_DISP, 4, 3),
+	DIV(0, "dout_aclk_disp_333", "mout_aclk_disp_333",
+			DIV_TOP_DISP, 0, 3),

Sorting order.

Quoted 58 lines
drivers/clk/samsung/clk-exynos5260.c new file +58 -0
+	DIV(0, "dout_aclk_bus4_100", "mout_bus4_bustop_100",
+			DIV_TOP_BUS, 28, 4),
+	DIV(0, "dout_aclk_bus4_400", "mout_bus4_bustop_400",
+			DIV_TOP_BUS, 24, 3),
+	DIV(0, "dout_aclk_bus3_100", "mout_bus3_bustop_100",
+			DIV_TOP_BUS, 20, 4),
+	DIV(0, "dout_aclk_bus3_400", "mout_bus3_bustop_400",
+			DIV_TOP_BUS, 16, 3),
+	DIV(0, "dout_aclk_bus2_100", "mout_bus2_bustop_100",
+			DIV_TOP_BUS, 12, 4),
+	DIV(0, "dout_aclk_bus2_400", "mout_bus2_bustop_400",
+			DIV_TOP_BUS, 8, 3),
+	DIV(0, "dout_aclk_bus1_100", "mout_bus1_bustop_100",
+			DIV_TOP_BUS, 4, 4),
+	DIV(0, "dout_aclk_bus1_400", "mout_bus1_bustop_400",
+			DIV_TOP_BUS, 0, 3),
+	DIV(0, "dout_sclk_peri_spi1_b", "dout_sclk_peri_spi1_a",
+			DIV_TOP_PERI0, 20, 8),
+	DIV(0, "dout_sclk_peri_spi1_a", "mout_sclk_peri_spi1_clk",
+			DIV_TOP_PERI0, 16, 4),
+	DIV(0, "dout_sclk_peri_spi0_b", "dout_sclk_peri_spi0_a",
+			DIV_TOP_PERI0, 8, 8),
+	DIV(0, "dout_sclk_peri_spi0_a", "mout_sclk_peri_spi0_clk",
+			DIV_TOP_PERI0, 4, 4),
+	DIV(0, "dout_sclk_peri_uart0", "mout_sclk_peri_uart0_uclk",
+			DIV_TOP_PERI1, 24, 4),
+	DIV(0, "dout_sclk_peri_uart2", "mout_sclk_peri_uart2_uclk",
+			DIV_TOP_PERI1, 20, 4),
+	DIV(0, "dout_sclk_peri_uart1", "mout_sclk_peri_uart1_uclk",
+			DIV_TOP_PERI1, 16, 4),
+	DIV(0, "dout_sclk_peri_spi2_b", "dout_sclk_peri_spi2_a",
+			DIV_TOP_PERI1, 4, 8),
+	DIV(0, "dout_sclk_peri_spi2_a", "mout_sclk_peri_spi2_clk",
+			DIV_TOP_PERI1, 0, 4),
+	DIV(0, "dout_aclk_peri_aud", "mout_audtop_pll_user",
+			DIV_TOP_PERI2, 24, 3),
+	DIV(0, "dout_aclk_peri_66", "mout_bustop_pll_user",
+			DIV_TOP_PERI2, 20, 4),
+	DIV(0, "dout_sclk_fsys_mmc0_sdclkin_b",
+			"dout_sclk_fsys_mmc0_sdclkin_a",
+			DIV_TOP_FSYS0, 16, 8),
+	DIV(0, "dout_sclk_fsys_mmc0_sdclkin_a",
+			"mout_sclk_fsys_mmc0_sdclkin_b",
+			DIV_TOP_FSYS0, 12, 4),
+	DIV(0, "dout_sclk_fsys_usbdrd30_suspend_clk",
+			"mout_sclk_fsys_usb",
+			DIV_TOP_FSYS0, 4, 4),
+	DIV(0, "dout_aclk_fsys_200", "mout_bustop_pll_user",
+			DIV_TOP_FSYS0, 0, 3),
+
+	DIV(0, "dout_sclk_fsys_mmc2_sdclkin_b",
+			"dout_sclk_fsys_mmc2_sdclkin_a",
+			DIV_TOP_FSYS1, 16, 8),
+	DIV(0, "dout_sclk_fsys_mmc2_sdclkin_a",
+			"mout_sclk_fsys_mmc2_sdclkin_b",
+			DIV_TOP_FSYS1, 12, 4),
+	DIV(0, "dout_sclk_fsys_mmc1_sdclkin_b",
+			"dout_sclk_fsys_mmc1_sdclkin_a",

drivers/clk/samsung/clk-exynos5260.c line 1763

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+			DIV_TOP_FSYS1, 4, 8),
+	DIV(0, "dout_sclk_fsys_mmc1_sdclkin_a",
+			"mout_sclk_fsys_mmc1_sdclkin_b",
+			DIV_TOP_FSYS1, 0, 4),
+};
+
+struct samsung_gate_clock top_gate_clks[] __initdata = {
+	GATE(TOP_SCLK_FIMD1, "sclk_disp_pixel", "dout_sclk_disp_pixel",
+			EN_ACLK_TOP, 10, CLK_IGNORE_UNUSED |
+			CLK_SET_RATE_PARENT, 0),

Is this the right register? Enabling an SCLK in an ACLK enable register seems a bit strange. Could you confirm in the UM?

Quoted 11 lines
drivers/clk/samsung/clk-exynos5260.c new file +11 -0
+	GATE(TOP_SCLK_MMC2, "sclk_fsys_mmc2_sdclkin",
+			"dout_sclk_fsys_mmc2_sdclkin_b",
+			EN_SCLK_TOP, 9, CLK_SET_RATE_PARENT, 0),
+	GATE(TOP_SCLK_MMC1, "sclk_fsys_mmc1_sdclkin",
+			"dout_sclk_fsys_mmc1_sdclkin_b",
+			EN_SCLK_TOP, 8, CLK_SET_RATE_PARENT,
+			0),
+	GATE(TOP_SCLK_MMC0, "sclk_fsys_mmc0_sdclkin",
+			"dout_sclk_fsys_mmc0_sdclkin_b",
+			EN_SCLK_TOP, 7, CLK_SET_RATE_PARENT, 0),
+};

[snip]

Quoted 5 lines
drivers/clk/samsung/clk-exynos5260.h new file +0 -0
new file mode 100644
index 0000000..7c3717a

[snip]

drivers/clk/samsung/clk-exynos5260.h line 85

Quoted 11 lines
drivers/clk/samsung/clk-exynos5260.h new file +11 -0
+#define CLKOUT_CMU_EGL		0x0c00
+#define CLKOUT_CMU_EGL_DIV_STAT	0x0c04
+#define ARMCLK_STOPCTRL		0x1000
+#define EAGLE_EMA_CTRL		0x1008
+#define EAGLE_EMA_STATUS	0x100c
+#define PWR_CTRL		0x1020
+#define PWR_CTRL2		0x1024
+#define CLKSTOP_CTRL		0x1028
+#define INTR_SPREAD_EN		0x1080
+#define INTR_SPREAD_USE_STANDBYWFI	0x1084
+#define INTR_SPREAD_BLOCKING_DURATION	0x1088

Please align indentation of values to the highest common one.

Best regards,
Tomasz

#15 lore raw

PATCH v5 5/5 clk/exynos5260: add clock file for exynos5260

Quoted 595 lines · Tomasz Figa
Quoted 13 lines · Rahul Sharma

Add support for exynos5260 clocks in clock driver.

---
  drivers/clk/samsung/Makefile         |    1 +
  drivers/clk/samsung/clk-exynos5260.c | 1805
++++++++++++++++++++++++++++++++++
  drivers/clk/samsung/clk-exynos5260.h |  448 +++++++++
  3 files changed, 2254 insertions(+)

create mode 100644 drivers/clk/samsung/clk-exynos5260.c create mode 100644 drivers/clk/samsung/clk-exynos5260.h

[snip]

Quoted 6 lines
drivers/clk/samsung/clk-exynos5260.c new file +0 -0
new file mode 100644
index 0000000..f72ad6a

[snip]

Quoted 7 lines
drivers/clk/samsung/clk-exynos5260.c new file +4 -0
+struct samsung_gate_clock aud_gate_clks[] __initdata = {
+       GATE(AUD_CLK_AUD_UART, "clk_aud_uart", "dout_aclk_aud_131",
+                       EN_IP_AUD, 4, 0, 0),
+       GATE(AUD_CLK_PCM, "clk_pcm", "dout_aclk_aud_131", EN_IP_AUD, 3, 0,

0),
+ GATE(AUD_CLK_I2S, "clk_i2s", "dout_aclk_aud_131", EN_IP_AUD, 2, 0,
0),

drivers/clk/samsung/clk-exynos5260.c line 255

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       GATE(AUD_CLK_DMAC, "clk_dmac", "dout_aclk_aud_131",
+                       EN_IP_AUD, 1, 0, 0),
+       GATE(0, "clk_sramc", "dout_aclk_aud_131", EN_IP_AUD, 0, 0, 0),
+
+       GATE(AUD_SCLK_AUD_UART, "sclk_aud_uart", "dout_sclk_aud_uart",
+                       EN_SCLK_AUD, 2, CLK_SET_RATE_PARENT, 0),
+       GATE(AUD_SCLK_PCM, "sclk_aud_pcm", "dout_sclk_aud_pcm",
+                       EN_SCLK_AUD, 1, CLK_SET_RATE_PARENT, 0),
+       GATE(AUD_SCLK_I2S, "sclk_aud_i2s", "dout_sclk_aud_i2s",
+                       EN_SCLK_AUD, 0, CLK_SET_RATE_PARENT, 0),

Please keep the clocks sorted by the register offsets ascending as well, to match the order in UM.

[snip]

drivers/clk/samsung/clk-exynos5260.c line 344

Quoted 8 lines
drivers/clk/samsung/clk-exynos5260.c new file +8 -0
+
+struct samsung_mux_clock disp_mux_clks[] __initdata = {
+       MUX(0, "mout_sclk_hdmi_spdif", mout_sclk_hdmi_spdif_p,
+                       MUX_SEL_DISP4, 4, 2),
+
+       MUX(0, "mout_sclk_dsim1_tx_clk_esc_clk_user",
+                       mout_sclk_dsim1_tx_clk_esc_clk_user_p,
+                       MUX_SEL_DISP2, 28, 1),

Ditto.

[snip]

Quoted 25 lines
drivers/clk/samsung/clk-exynos5260.c new file +25 -0
+struct samsung_gate_clock disp_gate_clks[] __initdata = {
+       GATE(DISP_CLK_SMMU_TV, "clk_smmu3_tv", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 25, 0, 0),
+       GATE(DISP_CLK_SMMU_FIMD1M1, "clk_smmu3_fimd1m1",
+                       "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 23, 0, 0),
+       GATE(DISP_CLK_SMMU_FIMD1M0, "clk_smmu3_fimd1m0",
+                       "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 22, 0, 0),
+       GATE(0, "clk_pixel_mixer", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 13, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_pixel_disp", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 12, CLK_IGNORE_UNUSED, 0),
+       GATE(DISP_CLK_MIXER, "clk_mixer", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 11, 0, 0),
+       GATE(DISP_CLK_MIPIPHY, "clk_mipi_dphy", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 10, 0, 0),
+       GATE(DISP_CLK_HDMIPHY, "clk_hdmiphy", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 9, 0, 0),
+       GATE(DISP_CLK_HDMI, "clk_hdmi", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 8, 0, 0),
+       GATE(DISP_CLK_FIMD1, "clk_fimd1", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 7, 0, 0),
+       GATE(DISP_CLK_DSIM1, "clk_dsim1", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 6, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 446

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       GATE(DISP_CLK_DPPHY, "clk_dptx_phy", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 5, 0, 0),
+       GATE(DISP_CLK_DP, "clk_dptx_link", "mout_aclk_disp_222_user",
+                       EN_IP_DISP, 4, 0, 0),
+       GATE(DISP_SCLK_PIXEL, "sclk_hdmi_phy_pixel_clki",
+                       "dout_sclk_hdmi_phy_pixel_clki",
+                       EN_SCLK_DISP0, 29, CLK_SET_RATE_PARENT, 0),
+       GATE(DISP_MOUT_HDMI_PHY_PIXEL_USER, "sclk_hdmi_link_i_pixel",
+                       "mout_phyclk_hdmi_phy_pixel_clko_user",
+                       EN_SCLK_DISP0, 26, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 19 lines
drivers/clk/samsung/clk-exynos5260.c new file +19 -0
+struct samsung_gate_clock fsys_gate_clks[] __initdata = {
+       GATE(FSYS_CLK_TSI, "clk_tsi", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 20, 0, 0),
+       GATE(FSYS_CLK_USBLINK, "clk_usblink", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 18, 0, 0),
+       GATE(FSYS_CLK_USBHOST20, "clk_usbhost20", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 15, 0, 0),
+       GATE(FSYS_CLK_USBDRD30, "clk_usbdrd30", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 14, 0, 0),
+       GATE(FSYS_CLK_SROMC, "clk_sromc", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 13, 0, 0),
+       GATE(FSYS_CLK_PDMA, "clk_pdma", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 9, 0, 0),
+       GATE(FSYS_CLK_MMC2, "clk_mmc2", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 8, 0, 0),
+       GATE(FSYS_CLK_MMC1, "clk_mmc1", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 7, 0, 0),
+       GATE(FSYS_CLK_MMC0, "clk_mmc0", "dout_aclk_fsys_200",
+                       EN_IP_FSYS, 6, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 602

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       GATE(FSYS_CLK_RTIC, "clk_rtic", "mout_bustop_pll_user",
+                       EN_IP_FSYS_SECURE_RTIC, 11, 0, 0),
+       GATE(FSYS_CLK_SMMU_RTIC, "clk_smmu_rtic", "mout_bustop_pll_user",
+                       EN_IP_FSYS_SECURE_SMMU_RTIC, 12, 0, 0),
+       GATE(FSYS_PHYCLK_USBDRD30, "phyclk_usbdrd30_udrd30_phyclock_g",
+                       "mout_phyclk_usbdrd30_phyclock_user",
+                       EN_SCLK_FSYS, 7, 0, 0),
+       GATE(FSYS_PHYCLK_USBHOST20, "phyclk_usbhost20_phyclock",
+                       "mout_phyclk_usbdrd30_phyclock_user",
+                       EN_SCLK_FSYS, 1, 0, 0),

Ditto.

[snip]

Quoted 53 lines
drivers/clk/samsung/clk-exynos5260.c new file +2 -0
+struct samsung_gate_clock gscl_gate_clks[] __initdata = {
+       GATE(GSCL_CLK_PIXEL_GSCL1, "clk_pixel_gscl1",

"mout_aclk_gscl_333",

drivers/clk/samsung/clk-exynos5260.c new file +2 -0
+                       EN_IP_GSCL, 9, 0, 0),
+       GATE(GSCL_CLK_PIXEL_GSCL0, "clk_pixel_gscl0",

"mout_aclk_gscl_333",

drivers/clk/samsung/clk-exynos5260.c new file +35 -0
+                       EN_IP_GSCL, 8, 0, 0),
+       GATE(GSCL_CLK_MSCL1, "clk_mscl1", "mout_aclk_gscl_333",
+                       EN_IP_GSCL, 5, 0, 0),
+       GATE(GSCL_CLK_MSCL0, "clk_mscl0", "mout_aclk_gscl_333",
+                       EN_IP_GSCL, 4, 0, 0),
+       GATE(GSCL_CLK_GSCL1, "clk_gscl1", "mout_aclk_gscl_333",
+                       EN_IP_GSCL, 3, 0, 0),
+       GATE(GSCL_CLK_GSCL0, "clk_gscl0", "mout_aclk_gscl_333",
+                       EN_IP_GSCL, 2, 0, 0),
+       GATE(GSCL_CLK_FIMC_LITE_D, "clk_fimc_lite_d",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 12, 0, 0),
+       GATE(GSCL_CLK_FIMC_LITE_B, "clk_fimc_lite_b",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 11, 0, 0),
+       GATE(GSCL_CLK_FIMC_LITE_A, "clk_fimc_lite_a",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 10, 0, 0),
+       GATE(GSCL_CLK_CSIS1, "clk_csis1", "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 9, 0, 0),
+       GATE(GSCL_CLK_CSIS0, "clk_csis0", "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 8, 0, 0),
+       GATE(GSCL_CLK_SMMU3_LITE_D, "clk_smmu3_lite_d",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 7, 0, 0),
+       GATE(GSCL_CLK_SMMU3_LITE_B, "clk_smmu3_lite_b",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 6, 0, 0),
+       GATE(GSCL_CLK_SMMU3_LITE_A, "clk_smmu3_lite_a",
+                       "mout_aclk_gscl_fimc_user",
+                       EN_IP_GSCL_FIMC, 5, 0, 0),
+       GATE(GSCL_CLK_SMMU3_GSCL0, "clk_smmu3_gscl0",
+                       "mout_aclk_gscl_333",
+                       EN_IP_GSCL_SECURE_SMMU_GSCL0, 17, 0, 0),
+       GATE(GSCL_CLK_SMMU3_GSCL1, "clk_smmu3_gscl1",

"mout_aclk_gscl_333",

drivers/clk/samsung/clk-exynos5260.c new file +8 -0
+                       EN_IP_GSCL_SECURE_SMMU_GSCL1, 18, 0, 0),
+       GATE(GSCL_CLK_SMMU3_MSCL0, "clk_smmu3_mscl0",
+                       "mout_aclk_m2m_400_user",
+                       EN_IP_GSCL_SECURE_SMMU_MSCL0, 19, 0, 0),
+       GATE(GSCL_CLK_SMMU3_MSCL1, "clk_smmu3_mscl1",
+                       "mout_aclk_m2m_400_user",
+                       EN_IP_GSCL_SECURE_SMMU_MSCL1, 20, 0, 0),
+       GATE(GSCL_SCLK_CSIS1_WRAP, "sclk_csis1_wrap",

"dout_aclk_csis_200",

drivers/clk/samsung/clk-exynos5260.c new file +2 -0
+                       EN_SCLK_GSCL_FIMC, 1, CLK_SET_RATE_PARENT, 0),
+       GATE(GSCL_SCLK_CSIS0_WRAP, "sclk_csis0_wrap",
Quoted 2 lines

"dout_aclk_csis_200",
+ EN_SCLK_GSCL_FIMC, 0, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 47 lines
drivers/clk/samsung/clk-exynos5260.c new file +47 -0
+struct samsung_gate_clock isp_gate_clks[] __initdata = {
+       GATE(ISP_CLK_GIC, "clk_isp_gic", "mout_aclk_isp1_266",
+                       EN_IP_ISP0, 15, 0, 0),
+       GATE(ISP_CLK_WDT, "clk_isp_wdt", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 31, 0, 0),
+       GATE(ISP_CLK_UART, "clk_isp_uart", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 30, 0, 0),
+       GATE(ISP_CLK_SPI1, "clk_isp_spi1", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 28, 0, 0),
+       GATE(ISP_CLK_SPI0, "clk_isp_spi0", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 27, 0, 0),
+       GATE(ISP_CLK_SMMU_SCALERP, "clk_isp_smmu_scalerp",
+                       "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 26, 0, 0),
+       GATE(ISP_CLK_SMMU_SCALERC, "clk_isp_smmu_scalerc",
+                       "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 25, 0, 0),
+       GATE(ISP_CLK_SMMU_ISPCX, "clk_smmu_ispcx", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 24, 0, 0),
+       GATE(ISP_CLK_SMMU_ISP, "clk_smmu_isp", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 23, 0, 0),
+       GATE(ISP_CLK_SMMU_FD, "clk_smmu_fd", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 22, 0, 0),
+       GATE(ISP_CLK_SMMU_DRC, "clk_smmu_drc", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 21, 0, 0),
+       GATE(ISP_CLK_PWM, "clk_isp_pwm", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 14, 0, 0),
+       GATE(ISP_CLK_MTCADC, "clk_isp_mtcadc", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 11, 0, 0),
+       GATE(ISP_CLK_MPWM, "clk_isp_mpwm", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 10, 0, 0),
+       GATE(ISP_CLK_MCUCTL, "clk_isp_mcuctl", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 9, 0, 0),
+       GATE(ISP_CLK_I2C1, "clk_isp_i2c1", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 8, 0, 0),
+       GATE(ISP_CLK_I2C0, "clk_isp_i2c0", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 7, 0, 0),
+       GATE(ISP_CLK_FIMC_SCALERP, "clk_isp_fimc_scalerp",
+                       "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 6, 0, 0),
+       GATE(ISP_CLK_FIMC_SCALERC, "clk_isp_fimc_scalerc",
+                       "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 5, 0, 0),
+       GATE(ISP_CLK_FIMC, "clk_isp_fimc", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 4, 0, 0),
+       GATE(ISP_CLK_FIMC_FD, "clk_isp_fimc_fd", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 3, 0, 0),

drivers/clk/samsung/clk-exynos5260.c line 981

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       GATE(ISP_CLK_FIMC_DRC, "clk_isp_fimc_drc", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 2, 0, 0),
+       GATE(ISP_CLK_CA5, "clk_isp_ca5", "mout_aclk_isp1_266",
+                       EN_IP_ISP1, 1, 0, 0),
+       GATE(ISP_SCLK_SPI0_EXT, "sclk_isp_spi0_ext", "fin_pll",
+                       EN_SCLK_ISP, 9, CLK_SET_RATE_PARENT, 0),
+       GATE(ISP_SCLK_SPI1_EXT, "sclk_isp_spi1_ext", "fin_pll",
+                       EN_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0),
+       GATE(ISP_SCLK_UART_EXT, "sclk_isp_uart_ext", "fin_pll",
+                       EN_SCLK_ISP, 7, CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 16 lines
drivers/clk/samsung/clk-exynos5260.c new file +16 -0
+struct samsung_gate_clock mif_gate_clks[] __initdata = {
+       GATE(0, "clk_lpddr3phy_wrap1", "dout_clk2x_phy",
+                       EN_IP_MIF, 13, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_lpddr3phy_wrap0", "dout_clk2x_phy",
+                       EN_IP_MIF, 12, CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_monocnt", "dout_aclk_bus_100",
+                       EN_IP_MIF_SECURE_MONOCNT, 22,
+                       CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_mif_rtc", "dout_aclk_bus_100",
+                       EN_IP_MIF_SECURE_RTC_APBIF, 23,
+                       CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_drex1", "dout_aclk_mif_466",
+                       EN_IP_MIF_SECURE_DREX1_TZ, 9,
+                       CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_drex0", "dout_aclk_mif_466",
+                       EN_IP_MIF_SECURE_DREX0_TZ, 9,

drivers/clk/samsung/clk-exynos5260.c line 1212

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+                       CLK_IGNORE_UNUSED, 0),
+       GATE(0, "clk_intmem", "dout_aclk_bus_200",
+                       EN_IP_MIF_SECURE_INTEMEM, 11,
+                       CLK_IGNORE_UNUSED, 0),
+       GATE(0, "sclk_lpddr3phy_wrap_u1", "dout_clkm_phy",
+                       EN_SCLK_MIF, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0),
+       GATE(0, "sclk_lpddr3phy_wrap_u0", "dout_clkm_phy",
+                       EN_SCLK_MIF, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 1 line

+struct samsung_gate_clock peri_gate_clks[] __initdata = {

[snip]

Quoted 15 lines
drivers/clk/samsung/clk-exynos5260.c new file +15 -0
+               EN_IP_PERI_SECURE_TZPC, 13, 0, 0),
+       GATE(PERI_CLK_TZPC2, "clk_tzpc2", "dout_aclk_peri_66",
+               EN_IP_PERI_SECURE_TZPC, 12, 0, 0),
+       GATE(PERI_CLK_TZPC1, "clk_tzpc1", "dout_aclk_peri_66",
+               EN_IP_PERI_SECURE_TZPC, 11, 0, 0),
+       GATE(PERI_CLK_TZPC0, "clk_tzpc0", "dout_aclk_peri_66",
+               EN_IP_PERI_SECURE_TZPC, 10, 0, 0),
+       GATE(PERI_SCLK_UART2, "sclk_uart2", "dout_sclk_peri_uart2",
+                       EN_SCLK_PERI, 12, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_UART1, "sclk_uart1", "dout_sclk_peri_uart1",
+                       EN_SCLK_PERI, 11, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_UART0, "sclk_uart0", "dout_sclk_peri_uart0",
+                       EN_SCLK_PERI, 10, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_SPI2, "sclk_spi2", "dout_sclk_peri_spi2_b",
+                       EN_SCLK_PERI, 9, CLK_SET_RATE_PARENT, 0),

drivers/clk/samsung/clk-exynos5260.c line 1424

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       GATE(PERI_SCLK_SPI1, "sclk_spi1", "dout_sclk_peri_spi1_b",
+                       EN_SCLK_PERI, 8, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_SPI0, "sclk_spi0", "dout_sclk_peri_spi0_b",
+                       EN_SCLK_PERI, 7, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_SPDIF, "sclk_spdif", "dout_sclk_peri_spi0_b",
+                       EN_SCLK_PERI, 2, CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_I2S, "sclk_i2s", "dout_i2s", EN_SCLK_PERI, 1,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(PERI_SCLK_PCM1, "sclk_pcm1", "dout_pcm", EN_SCLK_PERI, 0,
+                       CLK_SET_RATE_PARENT, 0),

Ditto.

[snip]

Quoted 43 lines
drivers/clk/samsung/clk-exynos5260.c new file +23 -0
+struct samsung_mux_clock top_mux_clks[] __initdata = {
+       MUX(0, "mout_audtop_pll_user", mout_audtop_pll_user_p,
+                       MUX_SEL_TOP_PLL0, 24, 1),
+       MUX(0, "mout_aud_pll", mout_aud_pll_p, MUX_SEL_TOP_PLL0, 16, 1),
+       MUX(TOP_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p,
+                       MUX_SEL_TOP_PLL0, 12, 1),
+       MUX(0, "mout_bustop_pll_user", mout_bustop_pll_user_p,
+                       MUX_SEL_TOP_PLL0, 8, 1),
+       MUX(0, "mout_memtop_pll_user", mout_memtop_pll_user_p,
+                       MUX_SEL_TOP_PLL0, 4, 1),
+       MUX(0, "mout_mediatop_pll_user", mout_mediatop_pll_user_p,
+                       MUX_SEL_TOP_PLL0, 0, 1),
+       MUX(0, "mout_disp_disp_333", mout_disp_disp_333_p,
+                       MUX_SEL_TOP_DISP0, 0, 1),
+       MUX(0, "mout_aclk_disp_333", mout_aclk_disp_333_p,
+                       MUX_SEL_TOP_DISP0, 8, 1),
+       MUX(0, "mout_disp_disp_222", mout_disp_disp_222_p,
+                       MUX_SEL_TOP_DISP0, 12, 1),
+       MUX(0, "mout_aclk_disp_222", mout_aclk_disp_222_p,
+                       MUX_SEL_TOP_DISP0, 20, 1),
+       MUX(0, "mout_disp_media_pixel", mout_disp_media_pixel_p,
+                       MUX_SEL_TOP_DISP1, 8, 1),
+       MUX(TOP_MOUT_FIMD1, "mout_sclk_disp_pixel",

mout_sclk_disp_pixel_p,

drivers/clk/samsung/clk-exynos5260.c new file +19 -0
+                       MUX_SEL_TOP_DISP1, 0, 1),
+       MUX(0, "mout_sclk_peri_spi0_clk", mout_sclk_peri_spi_clk_p,
+                       MUX_SEL_TOP_PERI1, 8, 1),
+       MUX(0, "mout_sclk_peri_spi1_clk", mout_sclk_peri_spi_clk_p,
+                       MUX_SEL_TOP_PERI1, 4, 1),
+       MUX(0, "mout_sclk_peri_spi2_clk", mout_sclk_peri_spi_clk_p,
+                       MUX_SEL_TOP_PERI1, 0, 1),
+       MUX(0, "mout_sclk_peri_uart0_uclk", mout_sclk_peri_uart_uclk_p,
+                       MUX_SEL_TOP_PERI1, 20, 1),
+       MUX(0, "mout_sclk_peri_uart2_uclk", mout_sclk_peri_uart_uclk_p,
+                       MUX_SEL_TOP_PERI1, 16, 1),
+       MUX(0, "mout_sclk_peri_uart1_uclk", mout_sclk_peri_uart_uclk_p,
+                       MUX_SEL_TOP_PERI1, 12, 1),
+       MUX(0, "mout_bus4_bustop_100", mout_bus_bustop_100_p,
+                       MUX_SEL_TOP_BUS, 28, 1),
+       MUX(0, "mout_bus4_bustop_400", mout_bus_bustop_400_p,
+                       MUX_SEL_TOP_BUS, 24, 1),
+       MUX(0, "mout_bus3_bustop_100", mout_bus_bustop_100_p,
+                       MUX_SEL_TOP_BUS, 20, 1),

drivers/clk/samsung/clk-exynos5260.c line 1588

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       MUX(0, "mout_bus3_bustop_400", mout_bus_bustop_400_p,
+                       MUX_SEL_TOP_BUS, 16, 1),
+       MUX(0, "mout_bus2_bustop_400", mout_bus_bustop_400_p,
+                       MUX_SEL_TOP_BUS, 12, 1),
+       MUX(0, "mout_bus2_bustop_100", mout_bus_bustop_100_p,
+                       MUX_SEL_TOP_BUS, 8, 1),
+       MUX(0, "mout_bus1_bustop_100", mout_bus_bustop_100_p,
+                       MUX_SEL_TOP_BUS, 4, 1),
+       MUX(0, "mout_bus1_bustop_400", mout_bus_bustop_400_p,
+                       MUX_SEL_TOP_BUS, 0, 1),

Ditto.

Quoted 30 lines
drivers/clk/samsung/clk-exynos5260.c new file +30 -0
+       MUX(0, "mout_sclk_fsys_usb", mout_sclk_fsys_usb_p,
+                       MUX_SEL_TOP_FSYS, 0, 1),
+       MUX(0, "mout_sclk_fsys_mmc0_sdclkin_a",
+                       mout_sclk_fsys_mmc_sdclkin_a_p,
+                       MUX_SEL_TOP_FSYS, 20, 1),
+       MUX(0, "mout_sclk_fsys_mmc1_sdclkin_a",
+                       mout_sclk_fsys_mmc_sdclkin_a_p,
+                       MUX_SEL_TOP_FSYS, 12, 1),
+       MUX(0, "mout_sclk_fsys_mmc2_sdclkin_a",
+                       mout_sclk_fsys_mmc_sdclkin_a_p,
+                       MUX_SEL_TOP_FSYS, 4, 1),
+       MUX(0, "mout_sclk_fsys_mmc0_sdclkin_b",
+                       mout_sclk_fsys_mmc0_sdclkin_b_p,
+                       MUX_SEL_TOP_FSYS, 24, 1),
+       MUX(0, "mout_sclk_fsys_mmc1_sdclkin_b",
+                       mout_sclk_fsys_mmc1_sdclkin_b_p,
+                       MUX_SEL_TOP_FSYS, 16, 1),
+       MUX(0, "mout_sclk_fsys_mmc2_sdclkin_b",
+                       mout_sclk_fsys_mmc2_sdclkin_b_p,
+                       MUX_SEL_TOP_FSYS, 8, 1),
+       MUX(0, "mout_aclk_isp1_266", mout_aclk_isp1_266_p,
+                       MUX_SEL_TOP_ISP10, 20, 1),
+       MUX(0, "mout_isp1_media_266", mout_isp1_media_266_p,
+                       MUX_SEL_TOP_ISP10, 16, 1),
+       MUX(0, "mout_aclk_isp1_400", mout_aclk_isp1_400_p,
+                       MUX_SEL_TOP_ISP10, 8 , 1),
+       MUX(0, "mout_isp1_media_400", mout_isp1_media_400_p,
+                       MUX_SEL_TOP_ISP10, 4, 1),
+       MUX(0, "mout_sclk_isp1_spi0", mout_sclk_isp_spi_p,
+                       MUX_SEL_TOP_ISP11, 4, 1),

drivers/clk/samsung/clk-exynos5260.c line 1628

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       MUX(0, "mout_sclk_isp1_spi1", mout_sclk_isp_spi_p,
+                       MUX_SEL_TOP_ISP11, 8, 1),
+       MUX(0, "mout_sclk_isp1_uart", mout_sclk_isp_uart_p,
+                       MUX_SEL_TOP_ISP11, 12, 1),
+       MUX(0, "mout_sclk_isp1_sensor2", mout_sclk_isp_sensor_p,
+                       MUX_SEL_TOP_ISP11, 24, 1),
+       MUX(0, "mout_sclk_isp1_sensor1", mout_sclk_isp_sensor_p,
+                       MUX_SEL_TOP_ISP11, 20, 1),
+       MUX(0, "mout_sclk_isp1_sensor0", mout_sclk_isp_sensor_p,
+                       MUX_SEL_TOP_ISP11, 16, 1),

Ditto.

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       MUX(0, "mout_aclk_mfc_333", mout_aclk_mfc_333_p,
+                       MUX_SEL_TOP_MFC, 8, 1),
+       MUX(0, "mout_mfc_bustop_333", mout_mfc_bustop_333_p,
+                       MUX_SEL_TOP_MFC, 4, 1),
+       MUX(0, "mout_aclk_g2d_333", mout_aclk_g2d_333_p,
+                       MUX_SEL_TOP_G2D, 8, 1),
+       MUX(0, "mout_g2d_bustop_333", mout_g2d_bustop_333_p,
+                       MUX_SEL_TOP_G2D, 4, 1),
+       MUX(0, "mout_aclk_gscl_fimc", mout_aclk_gscl_fimc_p,
+                       MUX_SEL_TOP_GSCL, 20, 1),

drivers/clk/samsung/clk-exynos5260.c line 1648

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       MUX(0, "mout_gscl_bustop_fimc", mout_gscl_bustop_fimc_p,
+                       MUX_SEL_TOP_GSCL, 16, 1),
+       MUX(0, "mout_aclk_gscl_333", mout_aclk_gscl_333_p,
+                       MUX_SEL_TOP_GSCL, 12, 1),
+       MUX(0, "mout_gscl_bustop_333", mout_gscl_bustop_333_p,
+                       MUX_SEL_TOP_GSCL, 8, 1),
+       MUX(0, "mout_aclk_gscl_400", mout_aclk_gscl_400_p,
+                       MUX_SEL_TOP_GSCL, 4, 1),
+       MUX(0, "mout_m2m_mediatop_400", mout_m2m_mediatop_400_p,
+                       MUX_SEL_TOP_GSCL, 0, 1),

Ditto.

drivers/clk/samsung/clk-exynos5260.c line 1655

Quoted 7 lines
drivers/clk/samsung/clk-exynos5260.c new file +7 -0
+};
+
+struct samsung_div_clock top_div_clks[] __initdata = {
+       DIV(0, "dout_aclk_mfc_333", "mout_aclk_mfc_333",
+                       DIV_TOP_G2D_MFC, 4, 3),
+       DIV(0, "dout_aclk_g2d_333", "mout_aclk_g2d_333",
+                       DIV_TOP_GSCL_ISP0, 0, 3),

This looks wrong. The register and bit field are the same as "dout_aclk_gscl_333" below.

Quoted 30 lines
drivers/clk/samsung/clk-exynos5260.c new file +30 -0
+       DIV(0, "dout_sclk_isp1_sensor2_a", "mout_aclk_gscl_fimc",
+                       DIV_TOP_GSCL_ISP0, 24, 4),
+       DIV(0, "dout_sclk_isp1_sensor1_a", "mout_aclk_gscl_400",
+                       DIV_TOP_GSCL_ISP0, 20, 4),
+       DIV(0, "dout_sclk_isp1_sensor0_a", "mout_aclk_gscl_fimc",
+                       DIV_TOP_GSCL_ISP0, 16, 4),
+       DIV(0, "dout_aclk_gscl_fimc", "mout_aclk_gscl_fimc",
+                       DIV_TOP_GSCL_ISP0, 8, 3),
+       DIV(0, "dout_aclk_gscl_400", "mout_aclk_gscl_400",
+                       DIV_TOP_GSCL_ISP0, 4, 3),
+       DIV(0, "dout_aclk_gscl_333", "mout_aclk_gscl_333",
+                       DIV_TOP_GSCL_ISP0, 0, 3),
+       DIV(0, "dout_sclk_isp1_spi0_b", "dout_sclk_isp1_spi0_a",
+                       DIV_TOP_ISP10, 16, 8),
+       DIV(0, "dout_sclk_isp1_spi0_a", "mout_sclk_isp1_spi0",
+                       DIV_TOP_ISP10, 12, 4),
+       DIV(0, "dout_aclk_isp1_400", "mout_aclk_isp1_400",
+                       DIV_TOP_ISP10, 4, 3),
+       DIV(0, "dout_aclk_isp1_266", "mout_aclk_isp1_266",
+                       DIV_TOP_ISP10, 0, 3),
+       DIV(0, "dout_sclk_isp1_uart", "mout_sclk_isp1_uart",
+                       DIV_TOP_ISP11, 12, 4),
+       DIV(0, "dout_sclk_isp1_spi1_b", "dout_sclk_isp1_spi1_a",
+                       DIV_TOP_ISP11, 4, 8),
+       DIV(0, "dout_sclk_isp1_spi1_a", "mout_sclk_isp1_spi1",
+                       DIV_TOP_ISP11, 0, 4),
+       DIV(0, "dout_sclk_isp1_sensor2_b", "dout_sclk_isp1_sensor2_a",
+                       DIV_TOP_ISP11, 24, 4),
+       DIV(0, "dout_sclk_isp1_sensor1_b", "dout_sclk_isp1_sensor1_a",
+                       DIV_TOP_ISP11, 20, 4),

drivers/clk/samsung/clk-exynos5260.c line 1695

Quoted 10 lines
drivers/clk/samsung/clk-exynos5260.c new file +10 -0
+       DIV(0, "dout_sclk_isp1_sensor0_b", "dout_sclk_isp1_sensor0_a",
+                       DIV_TOP_ISP11, 16, 4),
+       DIV(0, "dout_sclk_hpm_targetclk", "mout_bustop_pll_user",
+                       DIV_TOP_HPM, 0, 3),
+       DIV(0, "dout_sclk_disp_pixel", "mout_sclk_disp_pixel",
+                       DIV_TOP_DISP, 8, 3),
+       DIV(0, "dout_aclk_disp_222", "mout_aclk_disp_222",
+                       DIV_TOP_DISP, 4, 3),
+       DIV(0, "dout_aclk_disp_333", "mout_aclk_disp_333",
+                       DIV_TOP_DISP, 0, 3),

Sorting order.

Quoted 64 lines
drivers/clk/samsung/clk-exynos5260.c new file +64 -0
+       DIV(0, "dout_aclk_bus4_100", "mout_bus4_bustop_100",
+                       DIV_TOP_BUS, 28, 4),
+       DIV(0, "dout_aclk_bus4_400", "mout_bus4_bustop_400",
+                       DIV_TOP_BUS, 24, 3),
+       DIV(0, "dout_aclk_bus3_100", "mout_bus3_bustop_100",
+                       DIV_TOP_BUS, 20, 4),
+       DIV(0, "dout_aclk_bus3_400", "mout_bus3_bustop_400",
+                       DIV_TOP_BUS, 16, 3),
+       DIV(0, "dout_aclk_bus2_100", "mout_bus2_bustop_100",
+                       DIV_TOP_BUS, 12, 4),
+       DIV(0, "dout_aclk_bus2_400", "mout_bus2_bustop_400",
+                       DIV_TOP_BUS, 8, 3),
+       DIV(0, "dout_aclk_bus1_100", "mout_bus1_bustop_100",
+                       DIV_TOP_BUS, 4, 4),
+       DIV(0, "dout_aclk_bus1_400", "mout_bus1_bustop_400",
+                       DIV_TOP_BUS, 0, 3),
+       DIV(0, "dout_sclk_peri_spi1_b", "dout_sclk_peri_spi1_a",
+                       DIV_TOP_PERI0, 20, 8),
+       DIV(0, "dout_sclk_peri_spi1_a", "mout_sclk_peri_spi1_clk",
+                       DIV_TOP_PERI0, 16, 4),
+       DIV(0, "dout_sclk_peri_spi0_b", "dout_sclk_peri_spi0_a",
+                       DIV_TOP_PERI0, 8, 8),
+       DIV(0, "dout_sclk_peri_spi0_a", "mout_sclk_peri_spi0_clk",
+                       DIV_TOP_PERI0, 4, 4),
+       DIV(0, "dout_sclk_peri_uart0", "mout_sclk_peri_uart0_uclk",
+                       DIV_TOP_PERI1, 24, 4),
+       DIV(0, "dout_sclk_peri_uart2", "mout_sclk_peri_uart2_uclk",
+                       DIV_TOP_PERI1, 20, 4),
+       DIV(0, "dout_sclk_peri_uart1", "mout_sclk_peri_uart1_uclk",
+                       DIV_TOP_PERI1, 16, 4),
+       DIV(0, "dout_sclk_peri_spi2_b", "dout_sclk_peri_spi2_a",
+                       DIV_TOP_PERI1, 4, 8),
+       DIV(0, "dout_sclk_peri_spi2_a", "mout_sclk_peri_spi2_clk",
+                       DIV_TOP_PERI1, 0, 4),
+       DIV(0, "dout_aclk_peri_aud", "mout_audtop_pll_user",
+                       DIV_TOP_PERI2, 24, 3),
+       DIV(0, "dout_aclk_peri_66", "mout_bustop_pll_user",
+                       DIV_TOP_PERI2, 20, 4),
+       DIV(0, "dout_sclk_fsys_mmc0_sdclkin_b",
+                       "dout_sclk_fsys_mmc0_sdclkin_a",
+                       DIV_TOP_FSYS0, 16, 8),
+       DIV(0, "dout_sclk_fsys_mmc0_sdclkin_a",
+                       "mout_sclk_fsys_mmc0_sdclkin_b",
+                       DIV_TOP_FSYS0, 12, 4),
+       DIV(0, "dout_sclk_fsys_usbdrd30_suspend_clk",
+                       "mout_sclk_fsys_usb",
+                       DIV_TOP_FSYS0, 4, 4),
+       DIV(0, "dout_aclk_fsys_200", "mout_bustop_pll_user",
+                       DIV_TOP_FSYS0, 0, 3),
+
+       DIV(0, "dout_sclk_fsys_mmc2_sdclkin_b",
+                       "dout_sclk_fsys_mmc2_sdclkin_a",
+                       DIV_TOP_FSYS1, 16, 8),
+       DIV(0, "dout_sclk_fsys_mmc2_sdclkin_a",
+                       "mout_sclk_fsys_mmc2_sdclkin_b",
+                       DIV_TOP_FSYS1, 12, 4),
+       DIV(0, "dout_sclk_fsys_mmc1_sdclkin_b",
+                       "dout_sclk_fsys_mmc1_sdclkin_a",
+                       DIV_TOP_FSYS1, 4, 8),
+       DIV(0, "dout_sclk_fsys_mmc1_sdclkin_a",
+                       "mout_sclk_fsys_mmc1_sdclkin_b",
+                       DIV_TOP_FSYS1, 0, 4),
+};
+
Quoted 9 lines

drivers/clk/samsung/clk-exynos5260.c line 1763

Quoted 4 lines
drivers/clk/samsung/clk-exynos5260.c new file +4 -0
+struct samsung_gate_clock top_gate_clks[] __initdata = {
+       GATE(TOP_SCLK_FIMD1, "sclk_disp_pixel", "dout_sclk_disp_pixel",
+                       EN_ACLK_TOP, 10, CLK_IGNORE_UNUSED |
+                       CLK_SET_RATE_PARENT, 0),

Is this the right register? Enabling an SCLK in an ACLK enable register seems a bit strange. Could you confirm in the UM?

Tomasz,

Yea this is as per UM. I am not sure if it is a typo in manual. I have addressed rest of the comments.

Regards,
Rahul Sharma.

Quoted 45 lines
Quoted 12 lines
drivers/clk/samsung/clk-exynos5260.c new file +11 -0
+       GATE(TOP_SCLK_MMC2, "sclk_fsys_mmc2_sdclkin",
+                       "dout_sclk_fsys_mmc2_sdclkin_b",
+                       EN_SCLK_TOP, 9, CLK_SET_RATE_PARENT, 0),
+       GATE(TOP_SCLK_MMC1, "sclk_fsys_mmc1_sdclkin",
+                       "dout_sclk_fsys_mmc1_sdclkin_b",
+                       EN_SCLK_TOP, 8, CLK_SET_RATE_PARENT,
+                       0),
+       GATE(TOP_SCLK_MMC0, "sclk_fsys_mmc0_sdclkin",
+                       "dout_sclk_fsys_mmc0_sdclkin_b",
+                       EN_SCLK_TOP, 7, CLK_SET_RATE_PARENT, 0),
+};

[snip]

Quoted 6 lines
drivers/clk/samsung/clk-exynos5260.h new file +0 -0
new file mode 100644
index 0000000..7c3717a

[snip]

drivers/clk/samsung/clk-exynos5260.h line 85

Quoted 11 lines
drivers/clk/samsung/clk-exynos5260.h new file +11 -0
+#define CLKOUT_CMU_EGL         0x0c00
+#define CLKOUT_CMU_EGL_DIV_STAT        0x0c04
+#define ARMCLK_STOPCTRL                0x1000
+#define EAGLE_EMA_CTRL         0x1008
+#define EAGLE_EMA_STATUS       0x100c
+#define PWR_CTRL               0x1020
+#define PWR_CTRL2              0x1024
+#define CLKSTOP_CTRL           0x1028
+#define INTR_SPREAD_EN         0x1080
+#define INTR_SPREAD_USE_STANDBYWFI     0x1084
+#define INTR_SPREAD_BLOCKING_DURATION  0x1088

Please align indentation of values to the highest common one.

Best regards,
Tomasz