diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-25 16:46:56 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-25 16:46:56 -0400 |
| commit | 7b6181e06841f5ad15c4ff708b967b4db65a64de (patch) | |
| tree | bdfcf5b74b692f76581156e452d268b64c795200 /arch/arm/mach-omap2/pm.c | |
| parent | 72e58063d63c5f0a7bf65312f1e3a5ed9bb5c2ff (diff) | |
| parent | bc487fb341af05120bccb9f59ce76302391dcc77 (diff) | |
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 68f9f2e95891..59ca03b0e691 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
| @@ -18,11 +18,15 @@ | |||
| 18 | #include <plat/omap_device.h> | 18 | #include <plat/omap_device.h> |
| 19 | #include <plat/common.h> | 19 | #include <plat/common.h> |
| 20 | 20 | ||
| 21 | #include <plat/powerdomain.h> | ||
| 22 | #include <plat/clockdomain.h> | ||
| 23 | |||
| 21 | static struct omap_device_pm_latency *pm_lats; | 24 | static struct omap_device_pm_latency *pm_lats; |
| 22 | 25 | ||
| 23 | static struct device *mpu_dev; | 26 | static struct device *mpu_dev; |
| 24 | static struct device *dsp_dev; | 27 | static struct device *iva_dev; |
| 25 | static struct device *l3_dev; | 28 | static struct device *l3_dev; |
| 29 | static struct device *dsp_dev; | ||
| 26 | 30 | ||
| 27 | struct device *omap2_get_mpuss_device(void) | 31 | struct device *omap2_get_mpuss_device(void) |
| 28 | { | 32 | { |
| @@ -30,10 +34,10 @@ struct device *omap2_get_mpuss_device(void) | |||
| 30 | return mpu_dev; | 34 | return mpu_dev; |
| 31 | } | 35 | } |
| 32 | 36 | ||
| 33 | struct device *omap2_get_dsp_device(void) | 37 | struct device *omap2_get_iva_device(void) |
| 34 | { | 38 | { |
| 35 | WARN_ON_ONCE(!dsp_dev); | 39 | WARN_ON_ONCE(!iva_dev); |
| 36 | return dsp_dev; | 40 | return iva_dev; |
| 37 | } | 41 | } |
| 38 | 42 | ||
| 39 | struct device *omap2_get_l3_device(void) | 43 | struct device *omap2_get_l3_device(void) |
| @@ -42,6 +46,13 @@ struct device *omap2_get_l3_device(void) | |||
| 42 | return l3_dev; | 46 | return l3_dev; |
| 43 | } | 47 | } |
| 44 | 48 | ||
| 49 | struct device *omap4_get_dsp_device(void) | ||
| 50 | { | ||
| 51 | WARN_ON_ONCE(!dsp_dev); | ||
| 52 | return dsp_dev; | ||
| 53 | } | ||
| 54 | EXPORT_SYMBOL(omap4_get_dsp_device); | ||
| 55 | |||
| 45 | /* static int _init_omap_device(struct omap_hwmod *oh, void *user) */ | 56 | /* static int _init_omap_device(struct omap_hwmod *oh, void *user) */ |
| 46 | static int _init_omap_device(char *name, struct device **new_dev) | 57 | static int _init_omap_device(char *name, struct device **new_dev) |
| 47 | { | 58 | { |
| @@ -69,8 +80,60 @@ static int _init_omap_device(char *name, struct device **new_dev) | |||
| 69 | static void omap2_init_processor_devices(void) | 80 | static void omap2_init_processor_devices(void) |
| 70 | { | 81 | { |
| 71 | _init_omap_device("mpu", &mpu_dev); | 82 | _init_omap_device("mpu", &mpu_dev); |
| 72 | _init_omap_device("iva", &dsp_dev); | 83 | _init_omap_device("iva", &iva_dev); |
| 73 | _init_omap_device("l3_main", &l3_dev); | 84 | if (cpu_is_omap44xx()) { |
| 85 | _init_omap_device("l3_main_1", &l3_dev); | ||
| 86 | _init_omap_device("dsp", &dsp_dev); | ||
| 87 | } else { | ||
| 88 | _init_omap_device("l3_main", &l3_dev); | ||
| 89 | } | ||
| 90 | } | ||
| 91 | |||
| 92 | /* | ||
| 93 | * This sets pwrdm state (other than mpu & core. Currently only ON & | ||
| 94 | * RET are supported. Function is assuming that clkdm doesn't have | ||
| 95 | * hw_sup mode enabled. | ||
| 96 | */ | ||
| 97 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) | ||
| 98 | { | ||
| 99 | u32 cur_state; | ||
| 100 | int sleep_switch = 0; | ||
| 101 | int ret = 0; | ||
| 102 | |||
| 103 | if (pwrdm == NULL || IS_ERR(pwrdm)) | ||
| 104 | return -EINVAL; | ||
| 105 | |||
| 106 | while (!(pwrdm->pwrsts & (1 << state))) { | ||
| 107 | if (state == PWRDM_POWER_OFF) | ||
| 108 | return ret; | ||
| 109 | state--; | ||
| 110 | } | ||
| 111 | |||
| 112 | cur_state = pwrdm_read_next_pwrst(pwrdm); | ||
| 113 | if (cur_state == state) | ||
| 114 | return ret; | ||
| 115 | |||
| 116 | if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) { | ||
| 117 | omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | ||
| 118 | sleep_switch = 1; | ||
| 119 | pwrdm_wait_transition(pwrdm); | ||
| 120 | } | ||
| 121 | |||
| 122 | ret = pwrdm_set_next_pwrst(pwrdm, state); | ||
| 123 | if (ret) { | ||
| 124 | printk(KERN_ERR "Unable to set state of powerdomain: %s\n", | ||
| 125 | pwrdm->name); | ||
| 126 | goto err; | ||
| 127 | } | ||
| 128 | |||
| 129 | if (sleep_switch) { | ||
| 130 | omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); | ||
| 131 | pwrdm_wait_transition(pwrdm); | ||
| 132 | pwrdm_state_switch(pwrdm); | ||
| 133 | } | ||
| 134 | |||
| 135 | err: | ||
| 136 | return ret; | ||
| 74 | } | 137 | } |
| 75 | 138 | ||
| 76 | static int __init omap2_common_pm_init(void) | 139 | static int __init omap2_common_pm_init(void) |
