diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 33 | 
1 files changed, 20 insertions, 13 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index e436dcb1979..4a134c4d227 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -819,11 +819,8 @@ static int _wait_target_ready(struct omap_hwmod *oh)  		ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs,  						 oh->prcm.omap2.idlest_reg_id,  						 oh->prcm.omap2.idlest_idle_bit); -#if 0  	} else if (cpu_is_omap44xx()) { -		ret = omap4_cm_wait_module_ready(oh->prcm.omap4.module_offs, -						 oh->prcm.omap4.device_offs); -#endif +		ret = omap4_cm_wait_module_ready(oh->prcm.omap4.clkctrl_reg);  	} else {  		BUG();  	}; @@ -912,16 +909,21 @@ static int _enable(struct omap_hwmod *oh)  	_add_initiator_dep(oh, mpu_oh);  	_enable_clocks(oh); -	if (oh->class->sysc) { -		if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) -			_update_sysc_cache(oh); -		_sysc_enable(oh); -	} -  	r = _wait_target_ready(oh); -	if (!r) +	if (!r) {  		oh->_state = _HWMOD_STATE_ENABLED; +		/* Access the sysconfig only if the target is ready */ +		if (oh->class->sysc) { +			if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) +				_update_sysc_cache(oh); +			_sysc_enable(oh); +		} +	} else { +		pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", +			 oh->name, r); +	} +  	return r;  } @@ -999,7 +1001,7 @@ static int _shutdown(struct omap_hwmod *oh)  static int _setup(struct omap_hwmod *oh)  {  	struct omap_hwmod_ocp_if *os; -	int i; +	int i, r;  	if (!oh)  		return -EINVAL; @@ -1023,7 +1025,12 @@ static int _setup(struct omap_hwmod *oh)  	oh->_state = _HWMOD_STATE_INITIALIZED; -	_enable(oh); +	r = _enable(oh); +	if (r) { +		pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", +			   oh->name, oh->_state); +		return 0; +	}  	if (!(oh->flags & HWMOD_INIT_NO_RESET)) {  		/*  |