2 * linux/arch/arm/mach-omap2/pm.c
4 * OMAP Power Management Common Routines
6 * Copyright (C) 2005 Texas Instruments, Inc.
7 * Copyright (C) 2006-2008 Nokia Corporation
10 * Richard Woodruff <r-woodruff2@ti.com>
13 * Amit Kucheria <amit.kucheria@nokia.com>
14 * Igor Stoppa <igor.stoppa@nokia.com>
17 * Based on pm.c for omap1
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 2 as
21 * published by the Free Software Foundation.
24 #include <linux/suspend.h>
25 #include <linux/time.h>
28 #include <asm/mach/time.h>
29 #include <asm/atomic.h>
34 unsigned short enable_dyn_sleep
;
35 unsigned short clocks_off_while_idle
;
36 atomic_t sleep_block
= ATOMIC_INIT(0);
38 static ssize_t
idle_show(struct kobject
*, struct kobj_attribute
*, char *);
39 static ssize_t
idle_store(struct kobject
*k
, struct kobj_attribute
*,
40 const char *buf
, size_t n
);
42 static struct kobj_attribute sleep_while_idle_attr
=
43 __ATTR(sleep_while_idle
, 0644, idle_show
, idle_store
);
45 static struct kobj_attribute clocks_off_while_idle_attr
=
46 __ATTR(clocks_off_while_idle
, 0644, idle_show
, idle_store
);
48 static ssize_t
idle_show(struct kobject
*kobj
, struct kobj_attribute
*attr
,
51 if (attr
== &sleep_while_idle_attr
)
52 return sprintf(buf
, "%hu\n", enable_dyn_sleep
);
53 else if (attr
== &clocks_off_while_idle_attr
)
54 return sprintf(buf
, "%hu\n", clocks_off_while_idle
);
59 static ssize_t
idle_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
60 const char *buf
, size_t n
)
64 if (sscanf(buf
, "%hu", &value
) != 1 ||
65 (value
!= 0 && value
!= 1)) {
66 printk(KERN_ERR
"idle_store: Invalid value\n");
70 if (attr
== &sleep_while_idle_attr
)
71 enable_dyn_sleep
= value
;
72 else if (attr
== &clocks_off_while_idle_attr
)
73 clocks_off_while_idle
= value
;
80 void omap2_block_sleep(void)
82 atomic_inc(&sleep_block
);
85 void omap2_allow_sleep(void)
89 i
= atomic_dec_return(&sleep_block
);
93 static int __init
omap_pm_init(void)
97 if (cpu_is_omap24xx())
98 error
= omap2_pm_init();
99 if (cpu_is_omap34xx())
100 error
= omap3_pm_init();
102 printk(KERN_ERR
"omap2|3_pm_init failed: %d\n", error
);
106 /* disabled till drivers are fixed */
107 enable_dyn_sleep
= 0;
108 error
= sysfs_create_file(power_kobj
, &sleep_while_idle_attr
.attr
);
110 printk(KERN_ERR
"sysfs_create_file failed: %d\n", error
);
111 error
= sysfs_create_file(power_kobj
,
112 &clocks_off_while_idle_attr
.attr
);
114 printk(KERN_ERR
"sysfs_create_file failed: %d\n", error
);
119 late_initcall(omap_pm_init
);