diff options
| author | Olof Johansson <olof@lixom.net> | 2013-05-22 13:09:20 -0700 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-05-22 13:11:01 -0700 | 
| commit | 25625c9334d3b6a9cd32d009b99b36f6a78616f3 (patch) | |
| tree | 03497342cf9b45da546cd9dd0f4b4434a1c0a697 /arch/arm/mach-omap2/omap_hwmod.c | |
| parent | 8d9849b05154ff6f19f538c2d094ea0f32981bb0 (diff) | |
| parent | 3260c76055afc6c9396e5ad9f9e599505ea8891f (diff) | |
| download | olio-linux-3.10-25625c9334d3b6a9cd32d009b99b36f6a78616f3.tar.xz olio-linux-3.10-25625c9334d3b6a9cd32d009b99b36f6a78616f3.zip  | |
Merge tag 'omap-fixes-a-for-3.10-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/pjw/omap-pending into fixes
From Paul Walmsley:
Fix the OMAP serial driver to work correctly on OMAP4 when booting
with DT.
* tag 'omap-fixes-a-for-3.10-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/pjw/omap-pending:
  ARM: OMAP2+: hwmod: Remove sysc slave idle and auto idle apis
  SERIAL: OMAP: Remove the slave idle handling from the driver
  ARM: OMAP2+: serial: Remove the un-used slave idle hooks
  ARM: OMAP2+: hwmod-data: UART IP needs software control to manage sidle modes
  ARM: OMAP2+: hwmod: Add a new flag to handle SIDLE in SWSUP only in active
  ARM: OMAP2+: hwmod: Fix sidle programming in _enable_sysc()/_idle_sysc()
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 111 | 
1 files changed, 26 insertions, 85 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index e3289888adf..7341eff63f5 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -1356,13 +1356,27 @@ static void _enable_sysc(struct omap_hwmod *oh)  	clkdm = _get_clkdm(oh);  	if (sf & SYSC_HAS_SIDLEMODE) { +		if (oh->flags & HWMOD_SWSUP_SIDLE || +		    oh->flags & HWMOD_SWSUP_SIDLE_ACT) { +			idlemode = HWMOD_IDLEMODE_NO; +		} else { +			if (sf & SYSC_HAS_ENAWAKEUP) +				_enable_wakeup(oh, &v); +			if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) +				idlemode = HWMOD_IDLEMODE_SMART_WKUP; +			else +				idlemode = HWMOD_IDLEMODE_SMART; +		} + +		/* +		 * This is special handling for some IPs like +		 * 32k sync timer. Force them to idle! +		 */  		clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);  		if (clkdm_act && !(oh->class->sysc->idlemodes &  				   (SIDLE_SMART | SIDLE_SMART_WKUP)))  			idlemode = HWMOD_IDLEMODE_FORCE; -		else -			idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? -				HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; +  		_set_slave_idlemode(oh, idlemode, &v);  	} @@ -1391,10 +1405,6 @@ static void _enable_sysc(struct omap_hwmod *oh)  	    (sf & SYSC_HAS_CLOCKACTIVITY))  		_set_clockactivity(oh, oh->class->sysc->clockact, &v); -	/* If slave is in SMARTIDLE, also enable wakeup */ -	if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) -		_enable_wakeup(oh, &v); -  	_write_sysconfig(v, oh);  	/* @@ -1430,13 +1440,16 @@ static void _idle_sysc(struct omap_hwmod *oh)  	sf = oh->class->sysc->sysc_flags;  	if (sf & SYSC_HAS_SIDLEMODE) { -		/* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */ -		if (oh->flags & HWMOD_SWSUP_SIDLE || -		    !(oh->class->sysc->idlemodes & -		      (SIDLE_SMART | SIDLE_SMART_WKUP))) +		if (oh->flags & HWMOD_SWSUP_SIDLE) {  			idlemode = HWMOD_IDLEMODE_FORCE; -		else -			idlemode = HWMOD_IDLEMODE_SMART; +		} else { +			if (sf & SYSC_HAS_ENAWAKEUP) +				_enable_wakeup(oh, &v); +			if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) +				idlemode = HWMOD_IDLEMODE_SMART_WKUP; +			else +				idlemode = HWMOD_IDLEMODE_SMART; +		}  		_set_slave_idlemode(oh, idlemode, &v);  	} @@ -1455,10 +1468,6 @@ static void _idle_sysc(struct omap_hwmod *oh)  		_set_master_standbymode(oh, idlemode, &v);  	} -	/* If slave is in SMARTIDLE, also enable wakeup */ -	if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) -		_enable_wakeup(oh, &v); -  	_write_sysconfig(v, oh);  } @@ -2246,42 +2255,6 @@ static int _idle(struct omap_hwmod *oh)  }  /** - * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit - * @oh: struct omap_hwmod * - * @autoidle: desired AUTOIDLE bitfield value (0 or 1) - * - * Sets the IP block's OCP autoidle bit in hardware, and updates our - * local copy. Intended to be used by drivers that require - * direct manipulation of the AUTOIDLE bits. - * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes - * along the return value from _set_module_autoidle(). - * - * Any users of this function should be scrutinized carefully. - */ -int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) -{ -	u32 v; -	int retval = 0; -	unsigned long flags; - -	if (!oh || oh->_state != _HWMOD_STATE_ENABLED) -		return -EINVAL; - -	spin_lock_irqsave(&oh->_lock, flags); - -	v = oh->_sysc_cache; - -	retval = _set_module_autoidle(oh, autoidle, &v); - -	if (!retval) -		_write_sysconfig(v, oh); - -	spin_unlock_irqrestore(&oh->_lock, flags); - -	return retval; -} - -/**   * _shutdown - shutdown an omap_hwmod   * @oh: struct omap_hwmod *   * @@ -3180,38 +3153,6 @@ error:  }  /** - * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode - * @oh: struct omap_hwmod * - * @idlemode: SIDLEMODE field bits (shifted to bit 0) - * - * Sets the IP block's OCP slave idlemode in hardware, and updates our - * local copy.  Intended to be used by drivers that have some erratum - * that requires direct manipulation of the SIDLEMODE bits.  Returns - * -EINVAL if @oh is null, or passes along the return value from - * _set_slave_idlemode(). - * - * XXX Does this function have any current users?  If not, we should - * remove it; it is better to let the rest of the hwmod code handle this. - * Any users of this function should be scrutinized carefully. - */ -int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) -{ -	u32 v; -	int retval = 0; - -	if (!oh) -		return -EINVAL; - -	v = oh->_sysc_cache; - -	retval = _set_slave_idlemode(oh, idlemode, &v); -	if (!retval) -		_write_sysconfig(v, oh); - -	return retval; -} - -/**   * omap_hwmod_lookup - look up a registered omap_hwmod by name   * @name: name of the omap_hwmod to look up   *  |