OMAP2+: hwmod: Init clkdm field at boot time
authorBenoit Cousson <b-cousson@ti.com>
Sun, 10 Jul 2011 11:56:30 +0000 (05:56 -0600)
committerPaul Walmsley <paul@pwsan.com>
Sun, 10 Jul 2011 11:56:30 +0000 (05:56 -0600)
At boot time, lookup the clkdm_name to get the clkdm
structure pointer for further usage.

Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/plat-omap/include/plat/omap_hwmod.h

index 02b6016..1f6f47f 100644 (file)
@@ -990,9 +990,40 @@ static struct omap_hwmod *_lookup(const char *name)
 
        return oh;
 }
+/**
+ * _init_clkdm - look up a clockdomain name, store pointer in omap_hwmod
+ * @oh: struct omap_hwmod *
+ *
+ * Convert a clockdomain name stored in a struct omap_hwmod into a
+ * clockdomain pointer, and save it into the struct omap_hwmod.
+ * return -EINVAL if clkdm_name does not exist or if the lookup failed.
+ */
+static int _init_clkdm(struct omap_hwmod *oh)
+{
+       if (cpu_is_omap24xx() || cpu_is_omap34xx())
+               return 0;
+
+       if (!oh->clkdm_name) {
+               pr_warning("omap_hwmod: %s: no clkdm_name\n", oh->name);
+               return -EINVAL;
+       }
+
+       oh->clkdm = clkdm_lookup(oh->clkdm_name);
+       if (!oh->clkdm) {
+               pr_warning("omap_hwmod: %s: could not associate to clkdm %s\n",
+                       oh->name, oh->clkdm_name);
+               return -EINVAL;
+       }
+
+       pr_debug("omap_hwmod: %s: associated to clkdm %s\n",
+               oh->name, oh->clkdm_name);
+
+       return 0;
+}
 
 /**
- * _init_clocks - clk_get() all clocks associated with this hwmod
+ * _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as
+ * well the clockdomain.
  * @oh: struct omap_hwmod *
  * @data: not used; pass NULL
  *
@@ -1012,6 +1043,7 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)
        ret |= _init_main_clk(oh);
        ret |= _init_interface_clks(oh);
        ret |= _init_opt_clks(oh);
+       ret |= _init_clkdm(oh);
 
        if (!ret)
                oh->_state = _HWMOD_STATE_CLKS_INITED;
index 21d3922..3306bdf 100644 (file)
@@ -516,6 +516,7 @@ struct omap_hwmod {
        struct clk                      *_clk;
        struct omap_hwmod_opt_clk       *opt_clks;
        char                            *clkdm_name;
+       struct clockdomain              *clkdm;
        char                            *vdd_name;
        struct voltagedomain            *voltdm;
        struct omap_hwmod_ocp_if        **masters; /* connect to *_IA */