aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2012-11-15 11:39:47 -0500
committerArnd Bergmann <arnd@arndb.de>2012-11-15 11:39:47 -0500
commitef7848683f4de4903376638b69e6b4ac729b3ead (patch)
treecd7b8848149a0d2b71fcce27b071bbff086b32fb
parent6b2aa055488af2048d4e991c0e1754c24b1b30f5 (diff)
parent74d29168e9af59c9db1885e27493fbed4d24ef18 (diff)
Merge tag 'omap-for-v3.8/pm-part2-v3-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/pm
From Tony Lindgren <tony@atomide.com>: PM changes via Kevin Hilman <khilman@deeprootsystems.com>: Add support for full-chip retention in suspend for OMAP4 SoCs * tag 'omap-for-v3.8/pm-part2-v3-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: ARM: OMAP2+: voltage: fixup oscillator handling when CONFIG_PM=n ARM: OMAP4: USB: power down MUSB PHY during boot ARM: OMAP4: suspend: Program all domains to retention Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--arch/arm/mach-omap2/omap_phy_internal.c32
-rw-r--r--arch/arm/mach-omap2/pm.c2
-rw-r--r--arch/arm/mach-omap2/pm.h2
-rw-r--r--arch/arm/mach-omap2/pm44xx.c7
-rw-r--r--arch/arm/mach-omap2/vc.c2
5 files changed, 37 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c
index d992db8ff0b0..9b56e5e1a2d2 100644
--- a/arch/arm/mach-omap2/omap_phy_internal.c
+++ b/arch/arm/mach-omap2/omap_phy_internal.c
@@ -33,6 +33,38 @@
33#include "soc.h" 33#include "soc.h"
34#include "control.h" 34#include "control.h"
35 35
36#define CONTROL_DEV_CONF 0x300
37#define PHY_PD 0x1
38
39/**
40 * omap4430_phy_power_down: disable MUSB PHY during early init
41 *
42 * OMAP4 MUSB PHY module is enabled by default on reset, but this will
43 * prevent core retention if not disabled by SW. USB driver will
44 * later on enable this, once and if the driver needs it.
45 */
46static int __init omap4430_phy_power_down(void)
47{
48 void __iomem *ctrl_base;
49
50 if (!cpu_is_omap44xx())
51 return 0;
52
53 ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K);
54 if (!ctrl_base) {
55 pr_err("control module ioremap failed\n");
56 return -ENOMEM;
57 }
58
59 /* Power down the phy */
60 __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF);
61
62 iounmap(ctrl_base);
63
64 return 0;
65}
66early_initcall(omap4430_phy_power_down);
67
36void am35x_musb_reset(void) 68void am35x_musb_reset(void)
37{ 69{
38 u32 regval; 70 u32 regval;
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 109a02e02d72..ef668c756db7 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -39,6 +39,7 @@ static struct omap_device_pm_latency *pm_lats;
39 */ 39 */
40int (*omap_pm_suspend)(void); 40int (*omap_pm_suspend)(void);
41 41
42#ifdef CONFIG_PM
42/** 43/**
43 * struct omap2_oscillator - Describe the board main oscillator latencies 44 * struct omap2_oscillator - Describe the board main oscillator latencies
44 * @startup_time: oscillator startup latency 45 * @startup_time: oscillator startup latency
@@ -68,6 +69,7 @@ void omap_pm_get_oscillator(u32 *tstart, u32 *tshut)
68 *tstart = oscillator.startup_time; 69 *tstart = oscillator.startup_time;
69 *tshut = oscillator.shutdown_time; 70 *tshut = oscillator.shutdown_time;
70} 71}
72#endif
71 73
72static int __init _init_omap_device(char *name) 74static int __init _init_omap_device(char *name)
73{ 75{
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index 4db7b238a0d5..02c291c8e470 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -135,7 +135,7 @@ extern void omap_pm_get_oscillator(u32 *tstart, u32 *tshut);
135extern void omap_pm_setup_sr_i2c_pcb_length(u32 mm); 135extern void omap_pm_setup_sr_i2c_pcb_length(u32 mm);
136#else 136#else
137static inline void omap_pm_setup_oscillator(u32 tstart, u32 tshut) { } 137static inline void omap_pm_setup_oscillator(u32 tstart, u32 tshut) { }
138static inline void omap_pm_get_oscillator(u32 *tstart, u32 *tshut) { } 138static inline void omap_pm_get_oscillator(u32 *tstart, u32 *tshut) { *tstart = *tshut = 0; }
139static inline void omap_pm_setup_sr_i2c_pcb_length(u32 mm) { } 139static inline void omap_pm_setup_sr_i2c_pcb_length(u32 mm) { }
140#endif 140#endif
141 141
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
index 04922d149068..f2d69be9b77e 100644
--- a/arch/arm/mach-omap2/pm44xx.c
+++ b/arch/arm/mach-omap2/pm44xx.c
@@ -100,13 +100,6 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
100 if (!strncmp(pwrdm->name, "cpu", 3)) 100 if (!strncmp(pwrdm->name, "cpu", 3))
101 return 0; 101 return 0;
102 102
103 /*
104 * FIXME: Remove this check when core retention is supported
105 * Only MPUSS power domain is added in the list.
106 */
107 if (strcmp(pwrdm->name, "mpu_pwrdm"))
108 return 0;
109
110 pwrst = kmalloc(sizeof(struct power_state), GFP_ATOMIC); 103 pwrst = kmalloc(sizeof(struct power_state), GFP_ATOMIC);
111 if (!pwrst) 104 if (!pwrst)
112 return -ENOMEM; 105 return -ENOMEM;
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index 687aa86c0d5e..a89ec8affed4 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -666,6 +666,7 @@ static u8 omap_vc_calc_vsel(struct voltagedomain *voltdm, u32 uvolt)
666 return voltdm->pmic->uv_to_vsel(uvolt); 666 return voltdm->pmic->uv_to_vsel(uvolt);
667} 667}
668 668
669#ifdef CONFIG_PM
669/** 670/**
670 * omap_pm_setup_sr_i2c_pcb_length - set length of SR I2C traces on PCB 671 * omap_pm_setup_sr_i2c_pcb_length - set length of SR I2C traces on PCB
671 * @mm: length of the PCB trace in millimetres 672 * @mm: length of the PCB trace in millimetres
@@ -678,6 +679,7 @@ void __init omap_pm_setup_sr_i2c_pcb_length(u32 mm)
678{ 679{
679 sr_i2c_pcb_length = mm; 680 sr_i2c_pcb_length = mm;
680} 681}
682#endif
681 683
682void __init omap_vc_init_channel(struct voltagedomain *voltdm) 684void __init omap_vc_init_channel(struct voltagedomain *voltdm)
683{ 685{