From owner-svn-src-projects@FreeBSD.ORG Thu Feb 26 07:23:53 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 23B03C45; Thu, 26 Feb 2015 07:23:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0E7D47C4; Thu, 26 Feb 2015 07:23:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1Q7NqWO023843; Thu, 26 Feb 2015 07:23:52 GMT (envelope-from jhibbits@FreeBSD.org) Received: (from jhibbits@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1Q7Nqrk023842; Thu, 26 Feb 2015 07:23:52 GMT (envelope-from jhibbits@FreeBSD.org) Message-Id: <201502260723.t1Q7Nqrk023842@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: jhibbits set sender to jhibbits@FreeBSD.org using -f From: Justin Hibbits Date: Thu, 26 Feb 2015 07:23:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r279308 - projects/pmac_pmu/sys/powerpc/powermac X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2015 07:23:53 -0000 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 #include #include /* For syncer_suspend()/syncer_resume() */ +#include #include #include #include @@ -55,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -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); +}