Skip to contentSkip to conversation

ARM: imx31/of: clk: init clock controller with CLK_OF_DECLARE

PATCH New Vladimir Zapolskiy 3 participants 6 messages Sep 19, 2016 – Sep 20, 2016

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

cover ARM: imx31/of: clk: init clock controller with CLK_OF_DECLARE

The change is based on v4.8.0-rc1 and plus it depends on this fixup:

ARM: dts: imx31: fix clock control module interrupts description

The change is tested on qemu kzm target and mx31lite board, while both targets don't have DTS in upstream, I had to write simple DTS files for them, because the proposed change is for i.MX31 targets with OF support.

The second change in the series compilation time dependent on the first one, while the first change apparently should break runtime execution of i.MX31 boards with OF support, if both changes are applied everything should be fine, regression testing on the same legacy targets does not show any problems. Moreover i.MX31/OF/clock initialization seems to be broken currently, if the change is not applied I can not get a working clock source during early boot stage, jiffies are not incremented, but because I didn't check the problem thoroughly (can it be caused by missing CLK_OF_DECLARE? Or caused by something fixed by the change
http://www.spinics.net/lists/linux-clk/msg12235.html ?) and because the change was tested against code which is not found in upstream, I won't call this change as a fix, however its application is apparently wanted to get better OF support for i.MX31 targets.

Vladimir Zapolskiy (2):
ARM: imx31: remove mx31_clocks_init_dt() function calls
clk: imx31: properly init clocks for machines with DT

 arch/arm/mach-imx/common.h   |  1 -
 arch/arm/mach-imx/imx31-dt.c |  6 ------
 drivers/clk/imx/clk-imx31.c  | 49 ++++++++++++++++++++++----------------------
 3 files changed, 25 insertions(+), 31 deletions(-)
Signature · 1 line
2.8.1
#1 lore raw

PATCH 1/2 ARM: imx31: remove mx31_clocks_init_dt() function calls

Clock initialization for i.MX31 powered machines with DT support should be done by a call of an init function registered with CLK_OF_DECLARE() in common clock framework.

---
 arch/arm/mach-imx/common.h   | 1 -
 arch/arm/mach-imx/imx31-dt.c | 6 ------
 2 files changed, 7 deletions(-)
arch/arm/mach-imx/common.h +0 -1
index a8f4693..e97d8cb 100644
@@ -48,7 +48,6 @@ int mx21_clocks_init(unsigned long lref, unsigned long fref);
 int mx27_clocks_init(unsigned long fref);
 int mx31_clocks_init(unsigned long fref);
 int mx35_clocks_init(void);
-int mx31_clocks_init_dt(void);
 struct platform_device *mxc_register_gpio(char *name, int id,
 	resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);
 void mxc_set_cpu_type(unsigned int type);
arch/arm/mach-imx/imx31-dt.c +0 -6
index 62e6b4f..668d74b 100644
@@ -23,11 +23,6 @@ static const char * const imx31_dt_board_compat[] __initconst = {
 	NULL
 };
 
-static void __init imx31_dt_timer_init(void)
-{
-	mx31_clocks_init_dt();
-}
-
 /* FIXME: replace with DT binding */
 static const struct resource imx31_rnga_res[] __initconst = {
 	DEFINE_RES_MEM(MX31_RNGA_BASE_ADDR, SZ_16K),
@@ -43,7 +38,6 @@ DT_MACHINE_START(IMX31_DT, "Freescale i.MX31 (Device Tree Support)")
 	.map_io		= mx31_map_io,
 	.init_early	= imx31_init_early,
 	.init_irq	= mx31_init_irq,
-	.init_time	= imx31_dt_timer_init,
 	.init_machine	= imx31_dt_mach_init,
 	.dt_compat	= imx31_dt_board_compat,
 MACHINE_END
Signature · 1 line
2.8.1
#2 lore raw

PATCH 2/2 clk: imx31: properly init clocks for machines with DT

In reply to Vladimir Zapolskiy

The change converts exported mx31_clocks_init_dt() into a static initialization function registered by CLK_OF_DECLARE().

---
 drivers/clk/imx/clk-imx31.c | 50 +++++++++++++++++++++++----------------------
 1 file changed, 26 insertions(+), 24 deletions(-)
drivers/clk/imx/clk-imx31.c +26 -24
index 6a49ba2..cbce308 100644
@@ -21,6 +21,7 @@
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <soc/imx/revision.h>
 #include <soc/imx/timer.h>
 #include <asm/irq.h>
@@ -72,14 +73,8 @@ static struct clk ** const uart_clks[] __initconst = {
 	NULL
 };
 
-static void __init _mx31_clocks_init(unsigned long fref)
+static void __init _mx31_clocks_init(void __iomem *base, unsigned long fref)
 {
-	void __iomem *base;
-	struct device_node *np;
-
-	base = ioremap(MX31_CCM_BASE_ADDR, SZ_4K);
-	BUG_ON(!base);
-
 	clk[dummy] = imx_clk_fixed("dummy", 0);
 	clk[ckih] = imx_clk_fixed("ckih", fref);
 	clk[ckil] = imx_clk_fixed("ckil", 32768);
@@ -147,19 +142,17 @@ static void __init _mx31_clocks_init(unsigned long fref)
 	clk_prepare_enable(clk[iim_gate]);
 	mx31_revision();
 	clk_disable_unprepare(clk[iim_gate]);
-
-	np = of_find_compatible_node(NULL, NULL, "fsl,imx31-ccm");
-
-	if (np) {
-		clk_data.clks = clk;
-		clk_data.clk_num = ARRAY_SIZE(clk);
-		of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
-	}
 }
 
 int __init mx31_clocks_init(unsigned long fref)
 {
-	_mx31_clocks_init(fref);
+	void __iomem *base;
+
+	base = ioremap(MX31_CCM_BASE_ADDR, SZ_4K);
+	if (!base)
+		panic("%s: failed to map registers\n", __func__);
+
+	_mx31_clocks_init(base, fref);
 
 	clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0");
 	clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0");
@@ -222,22 +215,31 @@ int __init mx31_clocks_init(unsigned long fref)
 	return 0;
 }
 
-int __init mx31_clocks_init_dt(void)
+static void __init mx31_clocks_init_dt(struct device_node *np)
 {
-	struct device_node *np;
+	struct device_node *osc_np;
 	u32 fref = 26000000; /* default */
+	void __iomem *ccm;
 
-	for_each_compatible_node(np, NULL, "fixed-clock") {
-		if (!of_device_is_compatible(np, "fsl,imx-osc26m"))
+	for_each_compatible_node(osc_np, NULL, "fixed-clock") {
+		if (!of_device_is_compatible(osc_np, "fsl,imx-osc26m"))
 			continue;
 
-		if (!of_property_read_u32(np, "clock-frequency", &fref)) {
-			of_node_put(np);
+		if (!of_property_read_u32(osc_np, "clock-frequency", &fref)) {
+			of_node_put(osc_np);
 			break;
 		}
 	}
 
-	_mx31_clocks_init(fref);
+	ccm = of_iomap(np, 0);
+	if (!ccm)
+		panic("%s: failed to map registers\n", __func__);
 
-	return 0;
+	_mx31_clocks_init(ccm, fref);
+
+	clk_data.clks = clk;
+	clk_data.clk_num = ARRAY_SIZE(clk);
+	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 }
+
+CLK_OF_DECLARE(imx31_ccm, "fsl,imx31-ccm", mx31_clocks_init_dt);
Signature · 1 line
2.8.1
#3 lore raw

PATCH 2/2 clk: imx31: properly init clocks for machines with DT

drivers/clk/imx/clk-imx31.c int __init mx31_clocks_init(unsigned long fref) · line 218

Quoted 6 lines · Vladimir Zapolskiy
drivers/clk/imx/clk-imx31.c +1 -1
@@ -222,22 +215,31 @@ int __init mx31_clocks_init(unsigned long fref)
 	return 0;
 }
 
-int __init mx31_clocks_init_dt(void)
+static void __init mx31_clocks_init_dt(struct device_node *np)

Alternatively we can leave mx31_clocks_init_dt() around as an exported API, but make it return 0 immediately in the same patch to the clk driver here. Then after rc1 we can delete the "unused" function in the clk tree assuming the last caller has been deleted through arm-soc.

Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
#4 lore raw

cover ARM: imx31/of: clk: init clock controller with CLK_OF_DECLARE

In reply to Vladimir Zapolskiy

Hello,

Quoted 4 lines · Vladimir Zapolskiy

The change is based on v4.8.0-rc1 and plus it depends on this fixup:

ARM: dts: imx31: fix clock control module interrupts description

Quoted 8 lines

The change is tested on qemu kzm target and mx31lite board, while both targets don't have DTS in upstream, I had to write simple DTS files for them, because the proposed change is for i.MX31 targets with OF support.

The second change in the series compilation time dependent on the first one, while the first change apparently should break runtime execution of i.MX31 boards with OF support, if both changes are applied everything should be fine, regression testing on the same legacy targets does not

that means this should be done in a single patch.

Quoted 9 lines

show any problems. Moreover i.MX31/OF/clock initialization seems to be broken currently, if the change is not applied I can not get a working clock source during early boot stage, jiffies are not incremented, but because I didn't check the problem thoroughly (can it be caused by missing CLK_OF_DECLARE? Or caused by something fixed by the change
http://www.spinics.net/lists/linux-clk/msg12235.html ?) and because the change was tested against code which is not found in upstream, I won't call this change as a fix, however its application is apparently wanted to get better OF support for i.MX31 targets.

Very appreciated!

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
#5 lore raw

cover ARM: imx31/of: clk: init clock controller with CLK_OF_DECLARE

Quoted 11 lines · Uwe Kleine-K?nig

Hello,

Quoted 8 lines · Vladimir Zapolskiy

The change is based on v4.8.0-rc1 and plus it depends on this fixup:

ARM: dts: imx31: fix clock control module interrupts description

The change is tested on qemu kzm target and mx31lite board, while both targets don't have DTS in upstream, I had to write simple DTS files for them, because the proposed change is for i.MX31 targets with OF support.

Quoted 6 lines
Quoted 4 lines

The second change in the series compilation time dependent on the first one, while the first change apparently should break runtime execution of i.MX31 boards with OF support, if both changes are applied everything should be fine, regression testing on the same legacy targets does not

that means this should be done in a single patch.

Yes, please combine the patches. I can ack it then so it can be routed through arm-soc.

Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project