Linux-ARM-Kernel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: paul@pwsan.com (Paul Walmsley)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 7/8] OMAP2+: hwmod: add ability to late-init individual hwmods
Date: Wed, 23 Feb 2011 00:11:53 -0700	[thread overview]
Message-ID: <20110223071152.5874.54222.stgit@twilight.localdomain> (raw)
In-Reply-To: <20110223070455.5874.51326.stgit@twilight.localdomain>

Add omap_hwmod_late_init_one(), which is intended for use early in
boot to selectively init the hwmods needed for system clocksources
and clockevents, and any other hwmod that is needed in early boot.
omap_hwmod_late_init() can then be called later in the boot process.
The point is to minimize the amount of code that needs to be run early
in the boot process.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Beno?t Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/omap_hwmod.c             |   53 +++++++++++++++++++++++++-
 arch/arm/plat-omap/include/plat/omap_hwmod.h |    3 +
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 1b6eb1f..83ca219 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1639,6 +1639,55 @@ static int __init _populate_mpu_rt_base(struct omap_hwmod *oh, void *data)
 }
 
 /**
+ * omap_hwmod_late_init_one - XXX
+ *
+ * XXX Fix this documentation
+ *
+ * Must be called after omap2_clk_init().  Resolves the struct clk
+ * names to struct clk pointers for each registered omap_hwmod.  Also
+ * calls _setup() on each hwmod.  Returns -EINVAL upon error or 0 upon
+ * success.
+ */
+int __init omap_hwmod_late_init_one(const char *oh_name)
+{
+	struct omap_hwmod *oh;
+	int r;
+
+	pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
+
+	if (!mpu_oh) {
+		pr_err("omap_hwmod: %s: cannot late_init_one: MPU initiator hwmod %s not yet registered\n",
+		       oh_name, MPU_INITIATOR_NAME);
+		return -EINVAL;
+	}
+
+	oh = _lookup(oh_name);
+	if (!oh) {
+		WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
+		return -EINVAL;
+	}
+
+	if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
+		omap_hwmod_late_init_one(MPU_INITIATOR_NAME);
+
+	r = _populate_mpu_rt_base(oh, NULL);
+	if (IS_ERR_VALUE(r)) {
+		WARN(1, "omap_hwmod: %s: couldn't set mpu_rt_base\n", oh_name);
+		return -EINVAL;
+	}
+
+	r = _init_clocks(oh, NULL);
+	if (IS_ERR_VALUE(r)) {
+		WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh_name);
+		return -EINVAL;
+	}
+
+	_setup(oh, NULL);
+
+	return 0;
+}
+
+/**
  * omap_hwmod_late_init - do some post-clock framework initialization
  *
  * Must be called after omap2_clk_init().  Resolves the struct clk names
@@ -1657,9 +1706,9 @@ static int __init omap_hwmod_late_init(void)
 
 	r = omap_hwmod_for_each(_populate_mpu_rt_base, NULL);
 
-	/* XXX check return value */
 	r = omap_hwmod_for_each(_init_clocks, NULL);
-	WARN(r, "omap_hwmod: omap_hwmod_late_init(): _init_clocks failed\n");
+	WARN(IS_ERR_VALUE(r),
+	     "omap_hwmod: %s: _init_clocks failed\n", __func__);
 
 	omap_hwmod_for_each(_setup, NULL);
 
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index fedd829..48b8dd3 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -30,6 +30,7 @@
 #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
 
 #include <linux/kernel.h>
+#include <linux/init.h>
 #include <linux/list.h>
 #include <linux/ioport.h>
 #include <linux/spinlock.h>
@@ -540,6 +541,8 @@ struct omap_hwmod *omap_hwmod_lookup(const char *name);
 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
 			void *data);
 
+int __init omap_hwmod_late_init_one(const char *name);
+
 int omap_hwmod_enable(struct omap_hwmod *oh);
 int _omap_hwmod_enable(struct omap_hwmod *oh);
 int omap_hwmod_idle(struct omap_hwmod *oh);

  parent reply	other threads:[~2011-02-23  7:11 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-23  7:11 [PATCH 0/8] OMAP2+: hwmod/clockevent: allow late-init of individual hwmods Paul Walmsley
2011-02-23  7:11 ` [PATCH 1/8] OMAP2420: hwmod data: add dmtimer Paul Walmsley
2011-02-23  7:11 ` [PATCH 2/8] OMAP2430: " Paul Walmsley
2011-02-23  7:11 ` [PATCH 3/8] OMAP3: " Paul Walmsley
2011-02-23  7:11 ` [PATCH 4/8] OMAP2+: hwmod: find MPU initiator hwmod during in _register() Paul Walmsley
2011-02-23 14:38   ` Cousson, Benoit
2011-02-24  9:16     ` Paul Walmsley
2011-02-23  7:11 ` [PATCH 5/8] OMAP2+: hwmod: allow multiple calls to omap_hwmod_init() Paul Walmsley
2011-02-23 14:46   ` Cousson, Benoit
2011-02-23  7:11 ` [PATCH 6/8] OMAP2+: hwmod: ignore attempts to re-late-init a hwmod Paul Walmsley
2011-02-23  7:11 ` Paul Walmsley [this message]
2011-02-23 19:12   ` [PATCH 7/8] OMAP2+: hwmod: add ability to late-init individual hwmods Tony Lindgren
2011-02-24  9:06     ` Paul Walmsley
2011-02-23  7:11 ` [PATCH 8/8] OMAP2+: clockevent: late-init GPTIMER clockevent hwmod right before timer init Paul Walmsley
2011-02-23  8:53   ` [PATCH 8/8] OMAP2+: clockevent: late-init GPTIMER clockevent hwmodright " Santosh Shilimkar
2011-02-23 11:48     ` DebBarma, Tarun Kanti
2011-02-24  8:13     ` Paul Walmsley
2011-02-24  8:15       ` Paul Walmsley
2011-02-24  8:29         ` DebBarma, Tarun Kanti
2011-02-24  9:00           ` Paul Walmsley
2011-02-24 15:41           ` Tony Lindgren
2011-02-25 14:07             ` DebBarma, Tarun Kanti
2011-02-24  8:57         ` Santosh Shilimkar
2011-02-23  9:13   ` [PATCH 8/8] OMAP2+: clockevent: late-init GPTIMER clockevent hwmod right " DebBarma, Tarun Kanti
2011-02-24  8:18     ` Paul Walmsley
2011-02-23 14:28 ` [PATCH 0/8] OMAP2+: hwmod/clockevent: allow late-init of individual hwmods Cousson, Benoit
2011-02-28  2:31   ` Paul Walmsley
2011-02-28 11:17     ` Cousson, Benoit
2011-03-02 17:54       ` Tony Lindgren
2011-03-03 11:10         ` Cousson, Benoit
2011-03-04 14:51           ` Cousson, Benoit
2011-03-04 16:19             ` Tony Lindgren
2011-03-04 16:39               ` Cousson, Benoit
2011-03-04 16:42                 ` Paul Walmsley
2011-03-04 16:48                 ` Santosh Shilimkar
2011-02-23 19:12 ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110223071152.5874.54222.stgit@twilight.localdomain \
    --to=paul@pwsan.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox