linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 0/3] ARM: OMAP2+: preparation for clk/clkctrl support
@ 2017-05-18 17:16 Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available Tero Kristo
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Tero Kristo @ 2017-05-18 17:16 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

This series contains a couple of fixes for supporting clkctrl driver
for OMAP4. The patches in this series can be applied separately,
they don't have any dependency towards the clock driver related patches.
Once the clockctrl driver support itself [1] and this series have
been applied, the DTS changes can start flowing in.

Reference branch with the clkctrl driver, this series and
preliminary DTS patches pushed here:

Tree: https://github.com/t-kristo/linux-pm.git
Branch: 4.12-rc1-clkctrl-integ

Tested the integrated branch with omap4 boot, suspend-resume, and
also with the HDMI external display test (this was failing with some
older revision of the series.)

-Tero

[1] https://www.spinics.net/lists/arm-kernel/msg581685.html

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available
  2017-05-18 17:16 [PATCHv3 0/3] ARM: OMAP2+: preparation for clk/clkctrl support Tero Kristo
@ 2017-05-18 17:16 ` Tero Kristo
  2017-05-26 15:44   ` Tony Lindgren
  2017-05-18 17:16 ` [PATCHv3 2/3] ARM: OMAP2+: timer: add support for fetching fck handle from DT Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 3/3] ARM: OMAP4: hwmod_data: add opt clks for dss_hdmi and dss_venc Tero Kristo
  2 siblings, 1 reply; 6+ messages in thread
From: Tero Kristo @ 2017-05-18 17:16 UTC (permalink / raw)
  To: linux-arm-kernel

Fix the main clock assignment to assign clkctrl clk from DT as the main
clock if available. If main clock is assigned via DT, the direct PRCM
access for module handling is not used on OMAP4+ architectures either,
as it is assumed the main clock will be doing this instead.

This patch also drops the obsolete "_mod_ck" search as the implementation
required for this was not accepted upstream.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/omap_hwmod.c | 57 ++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 20 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 8bcea0d..6b8a2cf 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -693,31 +693,48 @@ static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
 /**
  * _init_main_clk - get a struct clk * for the the hwmod's main functional clk
  * @oh: struct omap_hwmod *
+ * @np: device node mapped to this hwmod
  *
  * Called from _init_clocks().  Populates the @oh _clk (main
  * functional clock pointer) if a clock matching the hwmod name is found,
  * or a main_clk is present.  Returns 0 on success or -EINVAL on error.
  */
-static int _init_main_clk(struct omap_hwmod *oh)
+static int _init_main_clk(struct omap_hwmod *oh, struct device_node *np)
 {
 	int ret = 0;
-	char name[MOD_CLK_MAX_NAME_LEN];
-	struct clk *clk;
-	static const char modck[] = "_mod_ck";
-
-	if (strlen(oh->name) >= MOD_CLK_MAX_NAME_LEN - strlen(modck))
-		pr_warn("%s: warning: cropping name for %s\n", __func__,
-			oh->name);
+	struct clk *clk = NULL;
+	int i;
+	int count;
+	const char *name;
+	char clk_name[strlen("clkctrl-x") + 1];
 
-	strlcpy(name, oh->name, MOD_CLK_MAX_NAME_LEN - strlen(modck));
-	strlcat(name, modck, MOD_CLK_MAX_NAME_LEN);
+	if (np) {
+		clk = of_clk_get_by_name(np, "clkctrl");
+		if (IS_ERR(clk)) {
+			/* Try matching by hwmod name */
+			count = of_property_count_strings(np, "ti,hwmods");
+			for (i = 0; i < count; i++) {
+				ret = of_property_read_string_index(np,
+								    "ti,hwmods",
+								    i, &name);
+				if (ret)
+					continue;
+				if (!strcmp(name, oh->name)) {
+					sprintf(clk_name, "clkctrl-%d", i);
+					clk = of_clk_get_by_name(np, clk_name);
+				}
+			}
+		}
+		if (!IS_ERR(clk)) {
+			pr_debug("%s: mapped main_clk %s for %s\n", __func__,
+				 __clk_get_name(clk), oh->name);
+			oh->main_clk = __clk_get_name(clk);
+			oh->_clk = clk;
+			soc_ops.disable_direct_prcm(oh);
+		}
+	}
 
-	clk = clk_get(NULL, name);
-	if (!IS_ERR(clk)) {
-		oh->_clk = clk;
-		soc_ops.disable_direct_prcm(oh);
-		oh->main_clk = kstrdup(name, GFP_KERNEL);
-	} else {
+	if (IS_ERR_OR_NULL(clk)) {
 		if (!oh->main_clk)
 			return 0;
 
@@ -1482,13 +1499,13 @@ static int _init_clkdm(struct omap_hwmod *oh)
  * _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as
  * well the clockdomain.
  * @oh: struct omap_hwmod *
- * @data: not used; pass NULL
+ * @np: device_node mapped to this hwmod
  *
  * Called by omap_hwmod_setup_*() (after omap2_clk_init()).
  * Resolves all clock names embedded in the hwmod.  Returns 0 on
  * success, or a negative error code on failure.
  */
-static int _init_clocks(struct omap_hwmod *oh, void *data)
+static int _init_clocks(struct omap_hwmod *oh, struct device_node *np)
 {
 	int ret = 0;
 
@@ -1500,7 +1517,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)
 	if (soc_ops.init_clkdm)
 		ret |= soc_ops.init_clkdm(oh);
 
-	ret |= _init_main_clk(oh);
+	ret |= _init_main_clk(oh, np);
 	ret |= _init_interface_clks(oh);
 	ret |= _init_opt_clks(oh);
 
@@ -2360,7 +2377,7 @@ static int __init _init(struct omap_hwmod *oh, void *data)
 		return 0;
 	}
 
-	r = _init_clocks(oh, NULL);
+	r = _init_clocks(oh, np);
 	if (r < 0) {
 		WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
 		return -EINVAL;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv3 2/3] ARM: OMAP2+: timer: add support for fetching fck handle from DT
  2017-05-18 17:16 [PATCHv3 0/3] ARM: OMAP2+: preparation for clk/clkctrl support Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available Tero Kristo
@ 2017-05-18 17:16 ` Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 3/3] ARM: OMAP4: hwmod_data: add opt clks for dss_hdmi and dss_venc Tero Kristo
  2 siblings, 0 replies; 6+ messages in thread
From: Tero Kristo @ 2017-05-18 17:16 UTC (permalink / raw)
  To: linux-arm-kernel

The mux clock handle shall be provided via "fck" DT handle. This avoids
the need to lookup the main clock via hwmod core, which will not work
with the clkctrl clock support anymore; the main clock is not going to
be a mux.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/timer.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 07dd692..af90f95 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -255,6 +255,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
 
 		timer->io_base = of_iomap(np, 0);
 
+		timer->fclk = of_clk_get_by_name(np, "fck");
+
 		of_node_put(np);
 	} else {
 		if (omap_dm_timer_reserve_systimer(timer->id))
@@ -292,7 +294,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
 	omap_hwmod_setup_one(oh_name);
 
 	/* After the dmtimer is using hwmod these clocks won't be needed */
-	timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh));
+	if (IS_ERR_OR_NULL(timer->fclk))
+		timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh));
 	if (IS_ERR(timer->fclk))
 		return PTR_ERR(timer->fclk);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv3 3/3] ARM: OMAP4: hwmod_data: add opt clks for dss_hdmi and dss_venc
  2017-05-18 17:16 [PATCHv3 0/3] ARM: OMAP2+: preparation for clk/clkctrl support Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available Tero Kristo
  2017-05-18 17:16 ` [PATCHv3 2/3] ARM: OMAP2+: timer: add support for fetching fck handle from DT Tero Kristo
@ 2017-05-18 17:16 ` Tero Kristo
  2 siblings, 0 replies; 6+ messages in thread
From: Tero Kristo @ 2017-05-18 17:16 UTC (permalink / raw)
  To: linux-arm-kernel

These extra optional clocks are required as main clock for these modules
are going to be routed to the main module clock. Otherwise, the hdmi / tv
clocks are not going to be enabled during usage, leading to failure.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 94f09c7..0855434 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -775,6 +775,7 @@
 
 static struct omap_hwmod_opt_clk dss_hdmi_opt_clks[] = {
 	{ .role = "sys_clk", .clk = "dss_sys_clk" },
+	{ .role = "hdmi_clk", .clk = "dss_48mhz_clk" },
 };
 
 static struct omap_hwmod omap44xx_dss_hdmi_hwmod = {
@@ -785,7 +786,7 @@
 	 * HDMI audio requires to use no-idle mode. Hence,
 	 * set idle mode by software.
 	 */
-	.flags		= HWMOD_SWSUP_SIDLE,
+	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_OPT_CLKS_NEEDED,
 	.mpu_irqs	= omap44xx_dss_hdmi_irqs,
 	.xlate_irq	= omap4_xlate_irq,
 	.sdma_reqs	= omap44xx_dss_hdmi_sdma_reqs,
@@ -858,11 +859,16 @@
 };
 
 /* dss_venc */
+static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {
+	{ .role = "tv_clk", .clk = "dss_tv_clk" },
+};
+
 static struct omap_hwmod omap44xx_dss_venc_hwmod = {
 	.name		= "dss_venc",
 	.class		= &omap44xx_venc_hwmod_class,
 	.clkdm_name	= "l3_dss_clkdm",
 	.main_clk	= "dss_tv_clk",
+	.flags		= HWMOD_OPT_CLKS_NEEDED,
 	.prcm = {
 		.omap4 = {
 			.clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET,
@@ -870,6 +876,8 @@
 		},
 	},
 	.parent_hwmod	= &omap44xx_dss_hwmod,
+	.opt_clks	= dss_venc_opt_clks,
+	.opt_clks_cnt	= ARRAY_SIZE(dss_venc_opt_clks),
 };
 
 /*
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available
  2017-05-18 17:16 ` [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available Tero Kristo
@ 2017-05-26 15:44   ` Tony Lindgren
  2017-05-29  7:07     ` Tero Kristo
  0 siblings, 1 reply; 6+ messages in thread
From: Tony Lindgren @ 2017-05-26 15:44 UTC (permalink / raw)
  To: linux-arm-kernel

* Tero Kristo <t-kristo@ti.com> [170518 10:19]:
> Fix the main clock assignment to assign clkctrl clk from DT as the main
> clock if available. If main clock is assigned via DT, the direct PRCM
> access for module handling is not used on OMAP4+ architectures either,
> as it is assumed the main clock will be doing this instead.

Is this still needed based on what we chatted last week?

I'd like to avoid adding the clkctrl clocks to the wrong node
as we then end up moving them again later on when we have support
for the wrapper device..

Regards,

Tony

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available
  2017-05-26 15:44   ` Tony Lindgren
@ 2017-05-29  7:07     ` Tero Kristo
  0 siblings, 0 replies; 6+ messages in thread
From: Tero Kristo @ 2017-05-29  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

On 26/05/17 18:44, Tony Lindgren wrote:
> * Tero Kristo <t-kristo@ti.com> [170518 10:19]:
>> Fix the main clock assignment to assign clkctrl clk from DT as the main
>> clock if available. If main clock is assigned via DT, the direct PRCM
>> access for module handling is not used on OMAP4+ architectures either,
>> as it is assumed the main clock will be doing this instead.
>
> Is this still needed based on what we chatted last week?
>
> I'd like to avoid adding the clkctrl clocks to the wrong node
> as we then end up moving them again later on when we have support
> for the wrapper device..
>
> Regards,
>
> Tony
>

I am investigating this currently, don't have much input yet but an 
alternative solution seems rather plausible. If I can get it working, we 
don't need this specific patch, but something that will replace it.

-Tero

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-05-29  7:07 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-18 17:16 [PATCHv3 0/3] ARM: OMAP2+: preparation for clk/clkctrl support Tero Kristo
2017-05-18 17:16 ` [PATCHv3 1/3] ARM: OMAP2+: hwmod: assign main clock from DT if available Tero Kristo
2017-05-26 15:44   ` Tony Lindgren
2017-05-29  7:07     ` Tero Kristo
2017-05-18 17:16 ` [PATCHv3 2/3] ARM: OMAP2+: timer: add support for fetching fck handle from DT Tero Kristo
2017-05-18 17:16 ` [PATCHv3 3/3] ARM: OMAP4: hwmod_data: add opt clks for dss_hdmi and dss_venc Tero Kristo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).