]> Pileus Git - ~andy/linux/blobdiff - arch/arm/mach-omap2/omap_hwmod.c
ARM: OMAP2+: hwmod: Extract no-idle and no-reset info from DT
[~andy/linux] / arch / arm / mach-omap2 / omap_hwmod.c
index 3d5db8c83b3cb1ab228dae53ab16b4cca0542f82..1c217e89deb975b81a6b884e6c16dbe6f6dd4b26 100644 (file)
@@ -2357,6 +2357,8 @@ static struct device_node *of_dev_hwmod_lookup(struct device_node *np,
 /**
  * _init_mpu_rt_base - populate the virtual address for a hwmod
  * @oh: struct omap_hwmod * to locate the virtual address
+ * @data: (unused, caller should pass NULL)
+ * @np: struct device_node * of the IP block's device node in the DT data
  *
  * Cache the virtual address used by the MPU to access this IP block's
  * registers.  This address is needed early so the OCP registers that
@@ -2365,11 +2367,11 @@ static struct device_node *of_dev_hwmod_lookup(struct device_node *np,
  * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
  * -ENXIO on absent or invalid register target address space.
  */
-static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
+static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
+                                   struct device_node *np)
 {
        struct omap_hwmod_addr_space *mem;
        void __iomem *va_start = NULL;
-       struct device_node *np;
 
        if (!oh)
                return -EINVAL;
@@ -2385,12 +2387,10 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
                         oh->name);
 
                /* Extract the IO space from device tree blob */
-               if (!of_have_populated_dt())
+               if (!np)
                        return -ENXIO;
 
-               np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh);
-               if (np)
-                       va_start = of_iomap(np, oh->mpu_rt_idx);
+               va_start = of_iomap(np, oh->mpu_rt_idx);
        } else {
                va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
        }
@@ -2423,12 +2423,16 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
 static int __init _init(struct omap_hwmod *oh, void *data)
 {
        int r;
+       struct device_node *np = NULL;
 
        if (oh->_state != _HWMOD_STATE_REGISTERED)
                return 0;
 
+       if (of_have_populated_dt())
+               np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh);
+
        if (oh->class->sysc) {
-               r = _init_mpu_rt_base(oh, NULL);
+               r = _init_mpu_rt_base(oh, NULL, np);
                if (r < 0) {
                        WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
                             oh->name);
@@ -2442,6 +2446,12 @@ static int __init _init(struct omap_hwmod *oh, void *data)
                return -EINVAL;
        }
 
+       if (np)
+               if (of_find_property(np, "ti,no-reset-on-init", NULL))
+                       oh->flags |= HWMOD_INIT_NO_RESET;
+               if (of_find_property(np, "ti,no-idle-on-init", NULL))
+                       oh->flags |= HWMOD_INIT_NO_IDLE;
+
        oh->_state = _HWMOD_STATE_INITIALIZED;
 
        return 0;