diff options
| author | Michael Hennerich <michael.hennerich@analog.com> | 2008-08-05 05:38:41 -0400 |
|---|---|---|
| committer | Bryan Wu <cooloney@kernel.org> | 2008-08-05 05:38:41 -0400 |
| commit | 4a88d0ce494034fbb8dd0076d80e71b38abf5748 (patch) | |
| tree | c9c560f0314e3d494ae1b9020921128fa1e3e9f5 | |
| parent | 5400c5aa2de41501be7529831c9df36c729bf371 (diff) | |
Blackfin arch: Functional power management support
Merge VR Regulator Hibernate wakeups into set_irq_wake for internal
interrupts.
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
| -rw-r--r-- | arch/blackfin/Kconfig | 36 | ||||
| -rw-r--r-- | arch/blackfin/mach-common/ints-priority.c | 46 | ||||
| -rw-r--r-- | arch/blackfin/mach-common/pm.c | 18 | ||||
| -rw-r--r-- | include/asm-blackfin/bfin-global.h | 1 |
4 files changed, 45 insertions, 56 deletions
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 5a097c46bc46..cc2add7e39e7 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
| @@ -933,13 +933,6 @@ endchoice | |||
| 933 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" | 933 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" |
| 934 | depends on PM | 934 | depends on PM |
| 935 | 935 | ||
| 936 | config PM_BFIN_WAKE_RTC | ||
| 937 | bool "Allow Wake-Up from RESET and on-chip RTC" | ||
| 938 | depends on PM | ||
| 939 | default n | ||
| 940 | help | ||
| 941 | Enable RTC Wake-Up (Voltage Regulator Power-Up) | ||
| 942 | |||
| 943 | config PM_BFIN_WAKE_PH6 | 936 | config PM_BFIN_WAKE_PH6 |
| 944 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" | 937 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" |
| 945 | depends on PM && (BF52x || BF534 || BF536 || BF537) | 938 | depends on PM && (BF52x || BF534 || BF536 || BF537) |
| @@ -947,41 +940,12 @@ config PM_BFIN_WAKE_PH6 | |||
| 947 | help | 940 | help |
| 948 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) | 941 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) |
| 949 | 942 | ||
| 950 | config PM_BFIN_WAKE_CAN | ||
| 951 | bool "Allow Wake-Up from on-chip CAN0/1" | ||
| 952 | depends on PM && (BF54x || BF534 || BF536 || BF537) | ||
| 953 | default n | ||
| 954 | help | ||
| 955 | Enable CAN0/1 Wake-Up (Voltage Regulator Power-Up) | ||
| 956 | |||
| 957 | config PM_BFIN_WAKE_GP | 943 | config PM_BFIN_WAKE_GP |
| 958 | bool "Allow Wake-Up from GPIOs" | 944 | bool "Allow Wake-Up from GPIOs" |
| 959 | depends on PM && BF54x | 945 | depends on PM && BF54x |
| 960 | default n | 946 | default n |
| 961 | help | 947 | help |
| 962 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) | 948 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) |
| 963 | |||
| 964 | config PM_BFIN_WAKE_USB | ||
| 965 | bool "Allow Wake-Up from on-chip USB" | ||
| 966 | depends on PM && (BF54x || BF52x) | ||
| 967 | default n | ||
| 968 | help | ||
| 969 | Enable USB Wake-Up (Voltage Regulator Power-Up) | ||
| 970 | |||
| 971 | config PM_BFIN_WAKE_KEYPAD | ||
| 972 | bool "Allow Wake-Up from on-chip Keypad" | ||
| 973 | depends on PM && BF54x | ||
| 974 | default n | ||
| 975 | help | ||
| 976 | Enable Keypad Wake-Up (Voltage Regulator Power-Up) | ||
| 977 | |||
| 978 | config PM_BFIN_WAKE_ROTARY | ||
| 979 | bool "Allow Wake-Up from on-chip Rotary" | ||
| 980 | depends on PM && BF54x | ||
| 981 | default n | ||
| 982 | help | ||
| 983 | Enable Rotary Wake-Up (Voltage Regulator Power-Up) | ||
| 984 | |||
| 985 | endmenu | 949 | endmenu |
| 986 | 950 | ||
| 987 | menu "CPU Frequency scaling" | 951 | menu "CPU Frequency scaling" |
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 64d746114e4b..e713b9db867d 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
| @@ -71,6 +71,7 @@ atomic_t num_spurious; | |||
| 71 | 71 | ||
| 72 | #ifdef CONFIG_PM | 72 | #ifdef CONFIG_PM |
| 73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ | 73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ |
| 74 | unsigned vr_wakeup; | ||
| 74 | #endif | 75 | #endif |
| 75 | 76 | ||
| 76 | struct ivgx { | 77 | struct ivgx { |
| @@ -184,17 +185,56 @@ static void bfin_internal_unmask_irq(unsigned int irq) | |||
| 184 | #ifdef CONFIG_PM | 185 | #ifdef CONFIG_PM |
| 185 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) | 186 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) |
| 186 | { | 187 | { |
| 187 | unsigned bank, bit; | 188 | unsigned bank, bit, wakeup = 0; |
| 188 | unsigned long flags; | 189 | unsigned long flags; |
| 189 | bank = SIC_SYSIRQ(irq) / 32; | 190 | bank = SIC_SYSIRQ(irq) / 32; |
| 190 | bit = SIC_SYSIRQ(irq) % 32; | 191 | bit = SIC_SYSIRQ(irq) % 32; |
| 191 | 192 | ||
| 193 | switch (irq) { | ||
| 194 | #ifdef IRQ_RTC | ||
| 195 | case IRQ_RTC: | ||
| 196 | wakeup |= WAKE; | ||
| 197 | break; | ||
| 198 | #endif | ||
| 199 | #ifdef IRQ_CAN0_RX | ||
| 200 | case IRQ_CAN0_RX: | ||
| 201 | wakeup |= CANWE; | ||
| 202 | break; | ||
| 203 | #endif | ||
| 204 | #ifdef IRQ_CAN1_RX | ||
| 205 | case IRQ_CAN1_RX: | ||
| 206 | wakeup |= CANWE; | ||
| 207 | break; | ||
| 208 | #endif | ||
| 209 | #ifdef IRQ_USB_INT0 | ||
| 210 | case IRQ_USB_INT0: | ||
| 211 | wakeup |= USBWE; | ||
| 212 | break; | ||
| 213 | #endif | ||
| 214 | #ifdef IRQ_KEY | ||
| 215 | case IRQ_KEY: | ||
| 216 | wakeup |= KPADWE; | ||
| 217 | break; | ||
| 218 | #endif | ||
| 219 | #ifdef IRQ_CNT | ||
| 220 | case IRQ_CNT: | ||
| 221 | wakeup |= ROTWE; | ||
| 222 | break; | ||
| 223 | #endif | ||
| 224 | default: | ||
| 225 | break; | ||
| 226 | } | ||
| 227 | |||
| 192 | local_irq_save(flags); | 228 | local_irq_save(flags); |
| 193 | 229 | ||
| 194 | if (state) | 230 | if (state) { |
| 195 | bfin_sic_iwr[bank] |= (1 << bit); | 231 | bfin_sic_iwr[bank] |= (1 << bit); |
| 196 | else | 232 | vr_wakeup |= wakeup; |
| 233 | |||
| 234 | } else { | ||
| 197 | bfin_sic_iwr[bank] &= ~(1 << bit); | 235 | bfin_sic_iwr[bank] &= ~(1 << bit); |
| 236 | vr_wakeup &= ~wakeup; | ||
| 237 | } | ||
| 198 | 238 | ||
| 199 | local_irq_restore(flags); | 239 | local_irq_restore(flags); |
| 200 | 240 | ||
diff --git a/arch/blackfin/mach-common/pm.c b/arch/blackfin/mach-common/pm.c index 4fe6a2366b13..143134b852ea 100644 --- a/arch/blackfin/mach-common/pm.c +++ b/arch/blackfin/mach-common/pm.c | |||
| @@ -229,28 +229,12 @@ int bfin_pm_suspend_mem_enter(void) | |||
| 229 | wakeup = bfin_read_VR_CTL() & ~FREQ; | 229 | wakeup = bfin_read_VR_CTL() & ~FREQ; |
| 230 | wakeup |= SCKELOW; | 230 | wakeup |= SCKELOW; |
| 231 | 231 | ||
| 232 | /* FIXME: merge this somehow with set_irq_wake */ | ||
| 233 | #ifdef CONFIG_PM_BFIN_WAKE_RTC | ||
| 234 | wakeup |= WAKE; | ||
| 235 | #endif | ||
| 236 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 | 232 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 |
| 237 | wakeup |= PHYWE; | 233 | wakeup |= PHYWE; |
| 238 | #endif | 234 | #endif |
| 239 | #ifdef CONFIG_PM_BFIN_WAKE_CAN | ||
| 240 | wakeup |= CANWE; | ||
| 241 | #endif | ||
| 242 | #ifdef CONFIG_PM_BFIN_WAKE_GP | 235 | #ifdef CONFIG_PM_BFIN_WAKE_GP |
| 243 | wakeup |= GPWE; | 236 | wakeup |= GPWE; |
| 244 | #endif | 237 | #endif |
| 245 | #ifdef CONFIG_PM_BFIN_WAKE_USB | ||
| 246 | wakeup |= USBWE; | ||
| 247 | #endif | ||
| 248 | #ifdef CONFIG_PM_BFIN_WAKE_KEYPAD | ||
| 249 | wakeup |= KPADWE; | ||
| 250 | #endif | ||
| 251 | #ifdef CONFIG_PM_BFIN_WAKE_ROTARY | ||
| 252 | wakeup |= ROTWE; | ||
| 253 | #endif | ||
| 254 | 238 | ||
| 255 | local_irq_save(flags); | 239 | local_irq_save(flags); |
| 256 | 240 | ||
| @@ -268,7 +252,7 @@ int bfin_pm_suspend_mem_enter(void) | |||
| 268 | icache_disable(); | 252 | icache_disable(); |
| 269 | bf53x_suspend_l1_mem(memptr); | 253 | bf53x_suspend_l1_mem(memptr); |
| 270 | 254 | ||
| 271 | do_hibernate(wakeup); /* Goodbye */ | 255 | do_hibernate(wakeup | vr_wakeup); /* Goodbye */ |
| 272 | 256 | ||
| 273 | bf53x_resume_l1_mem(memptr); | 257 | bf53x_resume_l1_mem(memptr); |
| 274 | 258 | ||
diff --git a/include/asm-blackfin/bfin-global.h b/include/asm-blackfin/bfin-global.h index 9fbbee61f982..93ae5335e8a3 100644 --- a/include/asm-blackfin/bfin-global.h +++ b/include/asm-blackfin/bfin-global.h | |||
| @@ -113,6 +113,7 @@ extern const char bfin_board_name[]; | |||
| 113 | extern unsigned long wall_jiffies; | 113 | extern unsigned long wall_jiffies; |
| 114 | 114 | ||
| 115 | extern unsigned long bfin_sic_iwr[]; | 115 | extern unsigned long bfin_sic_iwr[]; |
| 116 | extern unsigned vr_wakeup; | ||
| 116 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | 117 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ |
| 117 | extern struct file_operations dpmc_fops; | 118 | extern struct file_operations dpmc_fops; |
| 118 | extern unsigned long _ramstart, _ramend, _rambase; | 119 | extern unsigned long _ramstart, _ramend, _rambase; |
