svn commit: r279308 - projects/pmac_pmu/sys/powerpc/powermac
Justin Hibbits
jhibbits at FreeBSD.org
Thu Feb 26 07:23:53 UTC 2015
Author: jhibbits
Date: Thu Feb 26 07:23:52 2015
New Revision: 279308
URL: https://svnweb.freebsd.org/changeset/base/279308
Log:
Use the power management subsystem, overloading APM, for suspending, instead of
a sysctl.
This unifies things with the x86 behavior.
Modified:
projects/pmac_pmu/sys/powerpc/powermac/pmu.c
Modified: projects/pmac_pmu/sys/powerpc/powermac/pmu.c
==============================================================================
--- projects/pmac_pmu/sys/powerpc/powermac/pmu.c Thu Feb 26 07:20:05 2015 (r279307)
+++ projects/pmac_pmu/sys/powerpc/powermac/pmu.c Thu Feb 26 07:23:52 2015 (r279308)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/kthread.h>
#include <sys/clock.h>
#include <sys/mount.h> /* For syncer_suspend()/syncer_resume() */
+#include <sys/power.h>
#include <sys/proc.h>
#include <sys/reboot.h>
#include <sys/sysctl.h>
@@ -55,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <machine/pcb.h>
#include <machine/pio.h>
#include <machine/resource.h>
+#include <machine/stdarg.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -101,13 +103,14 @@ static u_int pmu_poll(device_t dev);
static void pmu_shutdown(void *xsc, int howto);
static void pmu_set_sleepled(void *xsc, int onoff);
static int pmu_server_mode(SYSCTL_HANDLER_ARGS);
-static int pmu_sleep(SYSCTL_HANDLER_ARGS);
+static int pmu_sys_suspend(void);
static int pmu_acline_state(SYSCTL_HANDLER_ARGS);
static int pmu_query_battery(struct pmu_softc *sc, int batt,
struct pmu_battstate *info);
static int pmu_battquery_sysctl(SYSCTL_HANDLER_ARGS);
static void pmu_restore_state(struct pmu_softc *sc);
static void pmu_save_state(struct pmu_softc *sc);
+static int pmu_pm_func(u_long cmd, void *arg, ...);
static int pmu_suspend(device_t);
static int pmu_resume(device_t);
static int pmu_battmon(SYSCTL_HANDLER_ARGS);
@@ -437,10 +440,6 @@ pmu_attach(device_t dev)
"server_mode", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
pmu_server_mode, "I", "Enable reboot after power failure");
- SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
- "sleep", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
- pmu_sleep, "I", "Put the machine to sleep");
-
if (sc->sc_batteries > 0) {
struct sysctl_oid *oid, *battroot;
char battnum[2];
@@ -523,6 +522,9 @@ pmu_attach(device_t dev)
EVENTHANDLER_REGISTER(shutdown_final, pmu_shutdown, sc,
SHUTDOWN_PRI_LAST);
+ /* Hijack APM for power management. */
+ power_pm_register(POWER_PM_TYPE_APM, pmu_pm_func, sc);
+
return (bus_generic_attach(dev));
}
@@ -1217,16 +1219,10 @@ pmu_set_speed(int low_speed)
}
static int
-pmu_sleep(SYSCTL_HANDLER_ARGS)
+pmu_sys_suspend(void)
{
- u_int sleep = 0;
int error;
- error = sysctl_handle_int(oidp, &sleep, 0, req);
-
- if (error || !req->newptr)
- return (error);
-
EVENTHANDLER_INVOKE(power_suspend_early);
stop_all_proc();
syncer_suspend();
@@ -1248,3 +1244,37 @@ pmu_sleep(SYSCTL_HANDLER_ARGS)
return (error);
}
+
+static int
+pmu_pm_func(u_long cmd, void *arg, ...)
+{
+ int state;
+ int error;
+ va_list ap;
+
+ error = 0;
+ switch (cmd) {
+ case POWER_CMD_SUSPEND:
+ va_start(ap, arg);
+ state = va_arg(ap, int);
+ va_end(ap);
+
+ switch (state) {
+ case POWER_SLEEP_STATE_SUSPEND:
+ pmu_sys_suspend();
+ break;
+ default:
+ error = EINVAL;
+ goto out;
+ }
+
+ break;
+
+ default:
+ error = EINVAL;
+ goto out;
+ }
+
+out:
+ return (error);
+}
More information about the svn-src-projects
mailing list