Skip to contentSkip to conversation

clk: ti: change clock init to use generic of_clk_init

PATCH Superseded Tero Kristo 4 participants 7 messages Aug 21, 2014 – Sep 23, 2014

Subsystems (6)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Previously, the TI clock driver initialized all the clocks hierarchically under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range to use.

This patch allows the TI clock driver to use a few new features provided by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Cc Mike Turquette <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc Mark Rutland <[email protected]>
Cc Peter Ujfalusi <[email protected]>
Cc Jyri Sarha <[email protected]>
Cc Stefan Assmann <[email protected]>
---
 arch/arm/mach-omap2/io.c         |   10 ++++++++--
 arch/arm/mach-omap2/prm_common.c |    2 --
 drivers/clk/ti/clk.c             |   31 ++++++++++++++++---------------
 3 files changed, 24 insertions(+), 19 deletions(-)
arch/arm/mach-omap2/io.c +8 -2
index 5d0667c..3325df6 100644
@@ -734,8 +734,14 @@ int __init omap_clk_init(void)
 	ti_clk_init_features();
 
 	ret = of_prcm_init();
-	if (!ret)
-		ret = omap_clk_soc_init();
+	if (ret)
+		return ret;
+
+	of_clk_init(NULL);
+
+	ti_dt_clockdomains_setup();
+
+	ret = omap_clk_soc_init();
 
 	return ret;
 }
arch/arm/mach-omap2/prm_common.c +0 -2
index 76ca320..3b89080 100644
@@ -525,8 +525,6 @@ int __init of_prcm_init(void)
 		memmap_index++;
 	}
 
-	ti_dt_clockdomains_setup();
-
 	return 0;
 }
 
drivers/clk/ti/clk.c +16 -15
index b1a6f71..f7201d0 100644
@@ -25,8 +25,8 @@
 #undef pr_fmt
 #define pr_fmt(fmt) "%s: " fmt, __func__
 
-static int ti_dt_clk_memmap_index;
 struct ti_clk_ll_ops *ti_clk_ll_ops;
+static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
 
 /**
  * ti_dt_clocks_register - register DT alias clocks during boot
@@ -108,9 +108,21 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index)
 	struct clk_omap_reg *reg;
 	u32 val;
 	u32 tmp;
+	int i;
 
 	reg = (struct clk_omap_reg *)&tmp;
-	reg->index = ti_dt_clk_memmap_index;
+
+	for (i = 0; i < CLK_MAX_MEMMAPS; i++) {
+		if (clocks_node_ptr[i] == node->parent)
+			break;
+	}
+
+	if (i == CLK_MAX_MEMMAPS) {
+		pr_err("clk-provider not found for %s!\n", node->name);
+		return NULL;
+	}
+
+	reg->index = i;
 
 	if (of_property_read_u32_index(node, "reg", index, &val)) {
 		pr_err("%s must have reg[%d]!\n", node->name, index);
@@ -133,15 +145,10 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index)
  */
 void ti_dt_clk_init_provider(struct device_node *parent, int index)
 {
-	const struct of_device_id *match;
-	struct device_node *np;
 	struct device_node *clocks;
-	of_clk_init_cb_t clk_init_cb;
 	struct clk_init_item *retry;
 	struct clk_init_item *tmp;
 
-	ti_dt_clk_memmap_index = index;
-
 	/* get clocks for this parent */
 	clocks = of_get_child_by_name(parent, "clocks");
 	if (!clocks) {
@@ -149,14 +156,8 @@ void ti_dt_clk_init_provider(struct device_node *parent, int index)
 		return;
 	}
 
-	for_each_child_of_node(clocks, np) {
-		match = of_match_node(&__clk_of_table, np);
-		if (!match)
-			continue;
-		clk_init_cb = (of_clk_init_cb_t)match->data;
-		pr_debug("%s: initializing: %s\n", __func__, np->name);
-		clk_init_cb(np);
-	}
+	/* add clocks node info */
+	clocks_node_ptr[index] = clocks;
 
 	list_for_each_entry_safe(retry, tmp, &retry_list, link) {
 		pr_debug("retry-init: %s\n", retry->node->name);
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Quoted 9 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range to use.

This patch allows the TI clock driver to use a few new features provided by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Quoted 8 lines
Cc Mike Turquette <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc Mark Rutland <[email protected]>
Cc Peter Ujfalusi <[email protected]>
Cc Jyri Sarha <[email protected]>
Cc Stefan Assmann <[email protected]>
maintainer
#2 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

In reply to Tero Kristo
Quoted 8 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range to use.

This patch allows the TI clock driver to use a few new features provided by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Paul, any comments on this one?

Regards,

Tony

Quoted 121 lines
Cc Mike Turquette <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc Mark Rutland <[email protected]>
Cc Peter Ujfalusi <[email protected]>
Cc Jyri Sarha <[email protected]>
Cc Stefan Assmann <[email protected]>
---
 arch/arm/mach-omap2/io.c         |   10 ++++++++--
 arch/arm/mach-omap2/prm_common.c |    2 --
 drivers/clk/ti/clk.c             |   31 ++++++++++++++++---------------
 3 files changed, 24 insertions(+), 19 deletions(-)
arch/arm/mach-omap2/io.c +8 -2
index 5d0667c..3325df6 100644
@@ -734,8 +734,14 @@ int __init omap_clk_init(void)
 	ti_clk_init_features();
 
 	ret = of_prcm_init();
-	if (!ret)
-		ret = omap_clk_soc_init();
+	if (ret)
+		return ret;
+
+	of_clk_init(NULL);
+
+	ti_dt_clockdomains_setup();
+
+	ret = omap_clk_soc_init();
 
 	return ret;
 }
arch/arm/mach-omap2/prm_common.c +0 -2
index 76ca320..3b89080 100644
@@ -525,8 +525,6 @@ int __init of_prcm_init(void)
 		memmap_index++;
 	}
 
-	ti_dt_clockdomains_setup();
-
 	return 0;
 }
 
drivers/clk/ti/clk.c +16 -15
index b1a6f71..f7201d0 100644
@@ -25,8 +25,8 @@
 #undef pr_fmt
 #define pr_fmt(fmt) "%s: " fmt, __func__
 
-static int ti_dt_clk_memmap_index;
 struct ti_clk_ll_ops *ti_clk_ll_ops;
+static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
 
 /**
  * ti_dt_clocks_register - register DT alias clocks during boot
@@ -108,9 +108,21 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index)
 	struct clk_omap_reg *reg;
 	u32 val;
 	u32 tmp;
+	int i;
 
 	reg = (struct clk_omap_reg *)&tmp;
-	reg->index = ti_dt_clk_memmap_index;
+
+	for (i = 0; i < CLK_MAX_MEMMAPS; i++) {
+		if (clocks_node_ptr[i] == node->parent)
+			break;
+	}
+
+	if (i == CLK_MAX_MEMMAPS) {
+		pr_err("clk-provider not found for %s!\n", node->name);
+		return NULL;
+	}
+
+	reg->index = i;
 
 	if (of_property_read_u32_index(node, "reg", index, &val)) {
 		pr_err("%s must have reg[%d]!\n", node->name, index);
@@ -133,15 +145,10 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index)
  */
 void ti_dt_clk_init_provider(struct device_node *parent, int index)
 {
-	const struct of_device_id *match;
-	struct device_node *np;
 	struct device_node *clocks;
-	of_clk_init_cb_t clk_init_cb;
 	struct clk_init_item *retry;
 	struct clk_init_item *tmp;
 
-	ti_dt_clk_memmap_index = index;
-
 	/* get clocks for this parent */
 	clocks = of_get_child_by_name(parent, "clocks");
 	if (!clocks) {
@@ -149,14 +156,8 @@ void ti_dt_clk_init_provider(struct device_node *parent, int index)
 		return;
 	}
 
-	for_each_child_of_node(clocks, np) {
-		match = of_match_node(&__clk_of_table, np);
-		if (!match)
-			continue;
-		clk_init_cb = (of_clk_init_cb_t)match->data;
-		pr_debug("%s: initializing: %s\n", __func__, np->name);
-		clk_init_cb(np);
-	}
+	/* add clocks node info */
+	clocks_node_ptr[index] = clocks;
 
 	list_for_each_entry_safe(retry, tmp, &retry_list, link) {
 		pr_debug("retry-init: %s\n", retry->node->name);
Signature · 1 line
1.7.9.5
maintainer
#3 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Quoted 11 lines · Tony Lindgren
Quoted 8 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range to use.

This patch allows the TI clock driver to use a few new features provided by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Paul, any comments on this one?

Not at this point.

- Paul

#4 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Quoted 8 lines · Paul Walmsley
Quoted 6 lines · Tony Lindgren
Quoted 5 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range to use.

Quoted 7 lines
Quoted 5 lines
Quoted 3 lines

This patch allows the TI clock driver to use a few new features provided by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Paul, any comments on this one?

Not at this point.

Tony, ok to merge this through clock tree?

-Tero

#5 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Quoted 16 lines · Tero Kristo
Quoted 15 lines · Paul Walmsley
Quoted 13 lines · Tony Lindgren
Quoted 11 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically
under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range
to use.

This patch allows the TI clock driver to use a few new features provided
by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Quoted 5 lines
Quoted 3 lines
Quoted 1 line

Paul, any comments on this one?

Not at this point.

Tony, ok to merge this through clock tree?

Oh btw, this is v1, I posted v2 a week back here:

http://article.gmane.org/gmane.linux.ports.arm.omap/118551

v2 has the retry init logic fixed in it (mainly for DPLLs which can have two separate parents which of both must be available during init.)

-Tero

maintainer
#6 lore raw

PATCH 1/1 clk: ti: change clock init to use generic of_clk_init

Quoted 21 lines · Tero Kristo
Quoted 20 lines · Tero Kristo
Quoted 18 lines · Paul Walmsley
Quoted 8 lines · Tony Lindgren
Quoted 7 lines · Tero Kristo

Previously, the TI clock driver initialized all the clocks hierarchically
under each separate clock provider node. Now, each clock that requires IO access will instead check their parent node to find out which IO range
to use.

Quoted 6 lines
Quoted 4 lines

This patch allows the TI clock driver to use a few new features provided
by the generic of_clk_init, and also allows registration of clock nodes outside the clock hierarchy (for example, any external clocks.)

Paul, any comments on this one?

Not at this point.

Quoted 8 lines
Quoted 1 line

Tony, ok to merge this through clock tree?

Oh btw, this is v1, I posted v2 a week back here:

http://article.gmane.org/gmane.linux.ports.arm.omap/118551

v2 has the retry init logic fixed in it (mainly for DPLLs which can have two separate parents which of both must be available during init.)

Oh OK. I acked that one so please feel free to merge it via the clock tree. It does not seem to confilict with anything I have queued up.

Regards,

Tony