patch-2.4.19 linux-2.4.19/arch/arm/mach-sa1100/pm.c
Next file: linux-2.4.19/arch/arm/mach-sa1100/sa1111-pcibuf.c
Previous file: linux-2.4.19/arch/arm/mach-sa1100/pleb.c
Back to the patch index
Back to the overall index
- Lines: 144
- Date:
Fri Aug 2 17:39:42 2002
- Orig file:
linux-2.4.18/arch/arm/mach-sa1100/pm.c
- Orig date:
Thu Oct 25 13:53:46 2001
diff -urN linux-2.4.18/arch/arm/mach-sa1100/pm.c linux-2.4.19/arch/arm/mach-sa1100/pm.c
@@ -19,30 +19,27 @@
* Cleaned up, pushed platform dependent stuff
* in the platform specific files.
*/
-
-/*
- * Debug macros
- */
-#define DEBUG 1
-#ifdef DEBUG
-# define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args)
-#else
-# define DPRINTK(fmt, args...)
-#endif
-
-
+#include <linux/config.h>
#include <linux/init.h>
#include <linux/pm.h>
#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
#include <linux/sysctl.h>
-#include <linux/acpi.h>
+#include <linux/errno.h>
#include <asm/hardware.h>
#include <asm/memory.h>
#include <asm/system.h>
+#include <asm/leds.h>
#include "sleep.h"
+/*
+ * Debug macros
+ */
+#undef DEBUG
+
extern void sa1100_cpu_suspend(void);
extern void sa1100_cpu_resume(void);
@@ -54,22 +51,17 @@
int pm_do_suspend(void)
{
- int retval;
-
/* set up pointer to sleep parameters */
- sleep_save = kmalloc (SLEEP_SAVE_SIZE*sizeof(long), GFP_ATOMIC);
+ sleep_save = kmalloc(SLEEP_SAVE_SIZE*sizeof(long), GFP_ATOMIC);
if (!sleep_save)
return -ENOMEM;
- sleep_save_p = virt_to_phys(sleep_save);
- retval = pm_send_all(PM_SUSPEND, (void *)2);
- if (retval) {
- kfree(sleep_save);
- return retval;
- }
+ sleep_save_p = virt_to_phys(sleep_save);
cli();
+ leds_event(led_stop);
+
/* preserve current time */
RCNR = xtime.tv_sec;
@@ -112,7 +104,9 @@
/* ensure not to come back here if it wasn't intended */
PSPR = 0;
- DPRINTK("*** made it back from resume\n");
+#ifdef DEBUG
+ printk(KERN_DEBUG "*** made it back from resume\n");
+#endif
/* restore registers */
RESTORE(GPDR);
@@ -146,21 +140,55 @@
/* restore current time */
xtime.tv_sec = RCNR;
+ leds_event(led_start);
+
sti();
kfree (sleep_save);
- retval = pm_send_all(PM_RESUME, (void *)0);
- if (retval)
- return retval;
+ /*
+ * Restore the CPU frequency settings.
+ */
+#ifdef CONFIG_CPU_FREQ
+ cpufreq_restore();
+#endif
return 0;
}
+#ifdef CONFIG_SYSCTL
+/*
+ * ARGH! ACPI people defined CTL_ACPI in linux/acpi.h rather than
+ * linux/sysctl.h.
+ *
+ * This means our interface here won't survive long - it needs a new
+ * interface. Quick hack to get this working - use sysctl id 9999.
+ */
+#warning ACPI broke the kernel, this interface needs to be fixed up.
+#define CTL_ACPI 9999
+#define ACPI_S1_SLP_TYP 19
+
+/*
+ * Send us to sleep.
+ */
+static int sysctl_pm_do_suspend(void)
+{
+ int retval;
+
+ retval = pm_send_all(PM_SUSPEND, (void *)3);
+
+ if (retval == 0) {
+ retval = pm_do_suspend();
+
+ pm_send_all(PM_RESUME, (void *)0);
+ }
+
+ return retval;
+}
static struct ctl_table pm_table[] =
{
- {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, (proc_handler *)&pm_do_suspend},
+ {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, (proc_handler *)&sysctl_pm_do_suspend},
{0}
};
@@ -181,3 +209,4 @@
__initcall(pm_init);
+#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)