diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 39 | 
1 files changed, 29 insertions, 10 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 23011975650..241c663a8f6 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -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)  |