diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-25 13:46:56 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-25 13:46:56 -0700 | 
| commit | 7b6181e06841f5ad15c4ff708b967b4db65a64de (patch) | |
| tree | bdfcf5b74b692f76581156e452d268b64c795200 /arch/arm/mach-omap2/pm.c | |
| parent | 72e58063d63c5f0a7bf65312f1e3a5ed9bb5c2ff (diff) | |
| parent | bc487fb341af05120bccb9f59ce76302391dcc77 (diff) | |
| download | olio-linux-3.10-7b6181e06841f5ad15c4ff708b967b4db65a64de.tar.xz olio-linux-3.10-7b6181e06841f5ad15c4ff708b967b4db65a64de.zip  | |
Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6
* 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (163 commits)
  omap: complete removal of machine_desc.io_pg_offst and .phys_io
  omap: UART: fix wakeup registers for OMAP24xx UART2
  omap: Fix spotty MMC voltages
  ASoC: OMAP4: MCPDM: Remove unnecessary include of plat/control.h
  serial: omap-serial: fix signess error
  OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish
  omap: dma: Fix buffering disable bit setting for omap24xx
  omap: serial: Fix the boot-up crash/reboot without CONFIG_PM
  OMAP3: PM: fix scratchpad memory accesses for off-mode
  omap4: pandaboard: enable the ehci port on pandaboard
  omap4: pandaboard: Fix the init if CONFIG_MMC_OMAP_HS is not set
  omap4: pandaboard: remove unused hsmmc definition
  OMAP: McBSP: Remove null omap44xx ops comment
  OMAP: McBSP: Swap CLKS source definition
  OMAP: McBSP: Fix CLKR and FSR signal muxing
  OMAP2+: clock: reduce the amount of standard debugging while disabling unused clocks
  OMAP: control: move plat-omap/control.h to mach-omap2/control.h
  OMAP: split plat-omap/common.c
  OMAP: McBSP: implement functional clock switching via clock framework
  OMAP: McBSP: implement McBSP CLKR and FSR signal muxing via mach-omap2/mcbsp.c
  ...
Fixed up trivial conflicts in arch/arm/mach-omap2/
{board-zoom-peripherals.c,devices.c} as per Tony
Diffstat (limited to 'arch/arm/mach-omap2/pm.c')
| -rw-r--r-- | arch/arm/mach-omap2/pm.c | 75 | 
1 files changed, 69 insertions, 6 deletions
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 68f9f2e9589..59ca03b0e69 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -18,11 +18,15 @@  #include <plat/omap_device.h>  #include <plat/common.h> +#include <plat/powerdomain.h> +#include <plat/clockdomain.h> +  static struct omap_device_pm_latency *pm_lats;  static struct device *mpu_dev; -static struct device *dsp_dev; +static struct device *iva_dev;  static struct device *l3_dev; +static struct device *dsp_dev;  struct device *omap2_get_mpuss_device(void)  { @@ -30,10 +34,10 @@ struct device *omap2_get_mpuss_device(void)  	return mpu_dev;  } -struct device *omap2_get_dsp_device(void) +struct device *omap2_get_iva_device(void)  { -	WARN_ON_ONCE(!dsp_dev); -	return dsp_dev; +	WARN_ON_ONCE(!iva_dev); +	return iva_dev;  }  struct device *omap2_get_l3_device(void) @@ -42,6 +46,13 @@ struct device *omap2_get_l3_device(void)  	return l3_dev;  } +struct device *omap4_get_dsp_device(void) +{ +	WARN_ON_ONCE(!dsp_dev); +	return dsp_dev; +} +EXPORT_SYMBOL(omap4_get_dsp_device); +  /* static int _init_omap_device(struct omap_hwmod *oh, void *user) */  static int _init_omap_device(char *name, struct device **new_dev)  { @@ -69,8 +80,60 @@ static int _init_omap_device(char *name, struct device **new_dev)  static void omap2_init_processor_devices(void)  {  	_init_omap_device("mpu", &mpu_dev); -	_init_omap_device("iva", &dsp_dev); -	_init_omap_device("l3_main", &l3_dev); +	_init_omap_device("iva", &iva_dev); +	if (cpu_is_omap44xx()) { +		_init_omap_device("l3_main_1", &l3_dev); +		_init_omap_device("dsp", &dsp_dev); +	} else { +		_init_omap_device("l3_main", &l3_dev); +	} +} + +/* + * This sets pwrdm state (other than mpu & core. Currently only ON & + * RET are supported. Function is assuming that clkdm doesn't have + * hw_sup mode enabled. + */ +int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) +{ +	u32 cur_state; +	int sleep_switch = 0; +	int ret = 0; + +	if (pwrdm == NULL || IS_ERR(pwrdm)) +		return -EINVAL; + +	while (!(pwrdm->pwrsts & (1 << state))) { +		if (state == PWRDM_POWER_OFF) +			return ret; +		state--; +	} + +	cur_state = pwrdm_read_next_pwrst(pwrdm); +	if (cur_state == state) +		return ret; + +	if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) { +		omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); +		sleep_switch = 1; +		pwrdm_wait_transition(pwrdm); +	} + +	ret = pwrdm_set_next_pwrst(pwrdm, state); +	if (ret) { +		printk(KERN_ERR "Unable to set state of powerdomain: %s\n", +		       pwrdm->name); +		goto err; +	} + +	if (sleep_switch) { +		omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); +		pwrdm_wait_transition(pwrdm); +		pwrdm_state_switch(pwrdm); +	} + +err: +	return ret;  }  static int __init omap2_common_pm_init(void)  |