ARM: OMAP2+: hwmod: add _find_mpu_rt_port()
authorPaul Walmsley <paul@pwsan.com>
Thu, 19 Apr 2012 10:04:27 +0000 (04:04 -0600)
committerPaul Walmsley <paul@pwsan.com>
Thu, 19 Apr 2012 10:04:27 +0000 (04:04 -0600)
Most IP blocks on the OMAP SoC have an interconnect link that is
intended to be used by the MPU to communicate with the IP block.
Several parts of the hwmod code need to be able to identify this link.
Currently, this is open-coded.  However, future patches will change
the way that interconnect links are represented and will make
identifying the link more complex.  So to avoid code duplication, this
patch centralizes the MPU port link identification code into a new
function, _find_mpu_rt_port().

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: BenoƮt Cousson <b-cousson@ti.com>
arch/arm/mach-omap2/omap_hwmod.c

index 2301197..241c663 100644 (file)
@@ -1025,6 +1025,27 @@ static int __init _find_mpu_port_index(struct omap_hwmod *oh)
 }
 
 /**
+ * _find_mpu_rt_port - return omap_hwmod_ocp_if accessible by the MPU
+ * @oh: struct omap_hwmod *
+ *
+ * Given a pointer to a struct omap_hwmod record @oh, return a pointer
+ * to the struct omap_hwmod_ocp_if record that is used by the MPU to
+ * communicate with the IP block.  This interface need not be directly
+ * connected to the MPU (and almost certainly is not), but is directly
+ * connected to the IP block represented by @oh.  Returns a pointer
+ * to the struct omap_hwmod_ocp_if * upon success, or returns NULL upon
+ * error or if there does not appear to be a path from the MPU to this
+ * IP block.
+ */
+static struct omap_hwmod_ocp_if *_find_mpu_rt_port(struct omap_hwmod *oh)
+{
+       if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
+               return NULL;
+
+       return oh->slaves[oh->_mpu_port_index];
+};
+
+/**
  * _find_mpu_rt_addr_space - return MPU register target address space for @oh
  * @oh: struct omap_hwmod *
  *
@@ -1037,10 +1058,7 @@ static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap
        struct omap_hwmod_addr_space *mem;
        int found = 0, i = 0;
 
-       if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
-               return NULL;
-
-       os = oh->slaves[oh->_mpu_port_index];
+       os = _find_mpu_rt_port(oh);
        if (!os->addr)
                return NULL;
 
@@ -1298,12 +1316,11 @@ static int _wait_target_ready(struct omap_hwmod *oh)
        if (!oh)
                return -EINVAL;
 
-       if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
+       if (oh->flags & HWMOD_NO_IDLEST)
                return 0;
 
-       os = oh->slaves[oh->_mpu_port_index];
-
-       if (oh->flags & HWMOD_NO_IDLEST)
+       os = _find_mpu_rt_port(oh);
+       if (!os)
                return 0;
 
        /* XXX check module SIDLEMODE */
@@ -2747,6 +2764,7 @@ int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
 {
        struct clk *c;
+       struct omap_hwmod_ocp_if *oi;
 
        if (!oh)
                return NULL;
@@ -2754,9 +2772,10 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
        if (oh->_clk) {
                c = oh->_clk;
        } else {
-               if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
+               oi = _find_mpu_rt_port(oh);
+               if (!oi)
                        return NULL;
-               c = oh->slaves[oh->_mpu_port_index]->_clk;
+               c = oi->_clk;
        }
 
        if (!c->clkdm)