1/* 2 * File: arch/blackfin/mach-common/pm.c 3 * Based on: arm/mach-omap/pm.c 4 * Author: Cliff Brake <cbrake@accelent.com> Copyright (c) 2001 5 * 6 * Created: 2001 7 * Description: Power management for the bfin 8 * 9 * Modified: Nicolas Pitre - PXA250 support 10 * Copyright (c) 2002 Monta Vista Software, Inc. 11 * David Singleton - OMAP1510 12 * Copyright (c) 2002 Monta Vista Software, Inc. 13 * Dirk Behme <dirk.behme@de.bosch.com> - OMAP1510/1610 14 * Copyright 2004 15 * Copyright 2004-2006 Analog Devices Inc. 16 * 17 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 18 * 19 * This program is free software; you can redistribute it and/or modify 20 * it under the terms of the GNU General Public License as published by 21 * the Free Software Foundation; either version 2 of the License, or 22 * (at your option) any later version. 23 * 24 * This program is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program; if not, see the file COPYING, or write 31 * to the Free Software Foundation, Inc., 32 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 33 */ 34 35#include <linux/pm.h> 36#include <linux/sched.h> 37#include <linux/proc_fs.h> 38 39#include <asm/io.h> 40#include <asm/dpmc.h> 41#include <asm/irq.h> 42#include <asm/gpio.h> 43 44#ifdef CONFIG_PM_WAKEUP_GPIO_POLAR_H 45#define WAKEUP_TYPE PM_WAKE_HIGH 46#endif 47 48#ifdef CONFIG_PM_WAKEUP_GPIO_POLAR_L 49#define WAKEUP_TYPE PM_WAKE_LOW 50#endif 51 52#ifdef CONFIG_PM_WAKEUP_GPIO_POLAR_EDGE_F 53#define WAKEUP_TYPE PM_WAKE_FALLING 54#endif 55 56#ifdef CONFIG_PM_WAKEUP_GPIO_POLAR_EDGE_R 57#define WAKEUP_TYPE PM_WAKE_RISING 58#endif 59 60#ifdef CONFIG_PM_WAKEUP_GPIO_POLAR_EDGE_B 61#define WAKEUP_TYPE PM_WAKE_BOTH_EDGES 62#endif 63 64void bfin_pm_suspend_standby_enter(void) 65{ 66#ifdef CONFIG_PM_WAKEUP_BY_GPIO 67 gpio_pm_wakeup_request(CONFIG_PM_WAKEUP_GPIO_NUMBER, WAKEUP_TYPE); 68#endif 69 70#if defined(CONFIG_PM_WAKEUP_BY_GPIO) || defined(CONFIG_PM_WAKEUP_GPIO_API) 71 { 72 u32 flags; 73 74 local_irq_save(flags); 75 76 sleep_deeper(gpio_pm_setup()); /*Goto Sleep*/ 77 78 gpio_pm_restore(); 79 80 bfin_write_SIC_IWR(IWR_ENABLE_ALL); 81 82 local_irq_restore(flags); 83 } 84#endif 85 86#if defined(CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR) 87 sleep_deeper(CONFIG_PM_WAKEUP_SIC_IWR); 88 bfin_write_SIC_IWR(IWR_ENABLE_ALL); 89#endif /* CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR */ 90} 91 92 93/* 94 * bfin_pm_prepare - Do preliminary suspend work. 95 * @state: suspend state we're entering. 96 * 97 */ 98static int bfin_pm_prepare(suspend_state_t state) 99{ 100 int error = 0; 101 102 switch (state) { 103 case PM_SUSPEND_STANDBY: 104 break; 105 106 case PM_SUSPEND_MEM: 107 return -ENOTSUPP; 108 109 default: 110 return -EINVAL; 111 } 112 113 return error; 114} 115 116/* 117 * bfin_pm_enter - Actually enter a sleep state. 118 * @state: State we're entering. 119 * 120 */ 121static int bfin_pm_enter(suspend_state_t state) 122{ 123 switch (state) { 124 case PM_SUSPEND_STANDBY: 125 bfin_pm_suspend_standby_enter(); 126 break; 127 128 case PM_SUSPEND_MEM: 129 return -ENOTSUPP; 130 131 default: 132 return -EINVAL; 133 } 134 135 return 0; 136} 137 138/* 139 * bfin_pm_finish - Finish up suspend sequence. 140 * @state: State we're coming out of. 141 * 142 * This is called after we wake back up (or if entering the sleep state 143 * failed). 144 */ 145static int bfin_pm_finish(suspend_state_t state) 146{ 147 switch (state) { 148 case PM_SUSPEND_STANDBY: 149 break; 150 151 case PM_SUSPEND_MEM: 152 return -ENOTSUPP; 153 154 default: 155 return -EINVAL; 156 } 157 158 return 0; 159} 160 161struct pm_ops bfin_pm_ops = { 162 .prepare = bfin_pm_prepare, 163 .enter = bfin_pm_enter, 164 .finish = bfin_pm_finish, 165}; 166 167static int __init bfin_pm_init(void) 168{ 169 pm_set_ops(&bfin_pm_ops); 170 return 0; 171} 172 173__initcall(bfin_pm_init); 174