diff options
Diffstat (limited to 'arch/mips/alchemy/common/power.c')
-rw-r--r-- | arch/mips/alchemy/common/power.c | 68 |
1 files changed, 14 insertions, 54 deletions
diff --git a/arch/mips/alchemy/common/power.c b/arch/mips/alchemy/common/power.c index 647e518c90bc..bdd6651e9a4f 100644 --- a/arch/mips/alchemy/common/power.c +++ b/arch/mips/alchemy/common/power.c | |||
@@ -37,8 +37,6 @@ | |||
37 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
38 | #include <asm/mach-au1x00/au1000.h> | 38 | #include <asm/mach-au1x00/au1000.h> |
39 | 39 | ||
40 | #ifdef CONFIG_PM | ||
41 | |||
42 | /* | 40 | /* |
43 | * We need to save/restore a bunch of core registers that are | 41 | * We need to save/restore a bunch of core registers that are |
44 | * either volatile or reset to some state across a processor sleep. | 42 | * either volatile or reset to some state across a processor sleep. |
@@ -49,7 +47,6 @@ | |||
49 | * We only have to save/restore registers that aren't otherwise | 47 | * We only have to save/restore registers that aren't otherwise |
50 | * done as part of a driver pm_* function. | 48 | * done as part of a driver pm_* function. |
51 | */ | 49 | */ |
52 | static unsigned int sleep_usb[2]; | ||
53 | static unsigned int sleep_sys_clocks[5]; | 50 | static unsigned int sleep_sys_clocks[5]; |
54 | static unsigned int sleep_sys_pinfunc; | 51 | static unsigned int sleep_sys_pinfunc; |
55 | static unsigned int sleep_static_memctlr[4][3]; | 52 | static unsigned int sleep_static_memctlr[4][3]; |
@@ -57,31 +54,6 @@ static unsigned int sleep_static_memctlr[4][3]; | |||
57 | 54 | ||
58 | static void save_core_regs(void) | 55 | static void save_core_regs(void) |
59 | { | 56 | { |
60 | #ifndef CONFIG_SOC_AU1200 | ||
61 | /* Shutdown USB host/device. */ | ||
62 | sleep_usb[0] = au_readl(USB_HOST_CONFIG); | ||
63 | |||
64 | /* There appears to be some undocumented reset register.... */ | ||
65 | au_writel(0, 0xb0100004); | ||
66 | au_sync(); | ||
67 | au_writel(0, USB_HOST_CONFIG); | ||
68 | au_sync(); | ||
69 | |||
70 | sleep_usb[1] = au_readl(USBD_ENABLE); | ||
71 | au_writel(0, USBD_ENABLE); | ||
72 | au_sync(); | ||
73 | |||
74 | #else /* AU1200 */ | ||
75 | |||
76 | /* enable access to OTG mmio so we can save OTG CAP/MUX. | ||
77 | * FIXME: write an OTG driver and move this stuff there! | ||
78 | */ | ||
79 | au_writel(au_readl(USB_MSR_BASE + 4) | (1 << 6), USB_MSR_BASE + 4); | ||
80 | au_sync(); | ||
81 | sleep_usb[0] = au_readl(0xb4020020); /* OTG_CAP */ | ||
82 | sleep_usb[1] = au_readl(0xb4020024); /* OTG_MUX */ | ||
83 | #endif | ||
84 | |||
85 | /* Clocks and PLLs. */ | 57 | /* Clocks and PLLs. */ |
86 | sleep_sys_clocks[0] = au_readl(SYS_FREQCTRL0); | 58 | sleep_sys_clocks[0] = au_readl(SYS_FREQCTRL0); |
87 | sleep_sys_clocks[1] = au_readl(SYS_FREQCTRL1); | 59 | sleep_sys_clocks[1] = au_readl(SYS_FREQCTRL1); |
@@ -125,22 +97,6 @@ static void restore_core_regs(void) | |||
125 | au_writel(sleep_sys_pinfunc, SYS_PINFUNC); | 97 | au_writel(sleep_sys_pinfunc, SYS_PINFUNC); |
126 | au_sync(); | 98 | au_sync(); |
127 | 99 | ||
128 | #ifndef CONFIG_SOC_AU1200 | ||
129 | au_writel(sleep_usb[0], USB_HOST_CONFIG); | ||
130 | au_writel(sleep_usb[1], USBD_ENABLE); | ||
131 | au_sync(); | ||
132 | #else | ||
133 | /* enable access to OTG memory */ | ||
134 | au_writel(au_readl(USB_MSR_BASE + 4) | (1 << 6), USB_MSR_BASE + 4); | ||
135 | au_sync(); | ||
136 | |||
137 | /* restore OTG caps and port mux. */ | ||
138 | au_writel(sleep_usb[0], 0xb4020020 + 0); /* OTG_CAP */ | ||
139 | au_sync(); | ||
140 | au_writel(sleep_usb[1], 0xb4020020 + 4); /* OTG_MUX */ | ||
141 | au_sync(); | ||
142 | #endif | ||
143 | |||
144 | /* Restore the static memory controller configuration. */ | 100 | /* Restore the static memory controller configuration. */ |
145 | au_writel(sleep_static_memctlr[0][0], MEM_STCFG0); | 101 | au_writel(sleep_static_memctlr[0][0], MEM_STCFG0); |
146 | au_writel(sleep_static_memctlr[0][1], MEM_STTIME0); | 102 | au_writel(sleep_static_memctlr[0][1], MEM_STTIME0); |
@@ -158,15 +114,19 @@ static void restore_core_regs(void) | |||
158 | 114 | ||
159 | void au_sleep(void) | 115 | void au_sleep(void) |
160 | { | 116 | { |
161 | int cpuid = alchemy_get_cputype(); | 117 | save_core_regs(); |
162 | if (cpuid != ALCHEMY_CPU_UNKNOWN) { | 118 | |
163 | save_core_regs(); | 119 | switch (alchemy_get_cputype()) { |
164 | if (cpuid <= ALCHEMY_CPU_AU1500) | 120 | case ALCHEMY_CPU_AU1000: |
165 | alchemy_sleep_au1000(); | 121 | case ALCHEMY_CPU_AU1500: |
166 | else if (cpuid <= ALCHEMY_CPU_AU1200) | 122 | case ALCHEMY_CPU_AU1100: |
167 | alchemy_sleep_au1550(); | 123 | alchemy_sleep_au1000(); |
168 | restore_core_regs(); | 124 | break; |
125 | case ALCHEMY_CPU_AU1550: | ||
126 | case ALCHEMY_CPU_AU1200: | ||
127 | alchemy_sleep_au1550(); | ||
128 | break; | ||
169 | } | 129 | } |
170 | } | ||
171 | 130 | ||
172 | #endif /* CONFIG_PM */ | 131 | restore_core_regs(); |
132 | } | ||