subr_power.c revision 91640
185835Siwasaki/*-
285835Siwasaki * Copyright (c) 2001 Mitsuru IWASAKI
385835Siwasaki * All rights reserved.
485835Siwasaki *
585835Siwasaki * Redistribution and use in source and binary forms, with or without
685835Siwasaki * modification, are permitted provided that the following conditions
785835Siwasaki * are met:
885835Siwasaki * 1. Redistributions of source code must retain the above copyright
985835Siwasaki *    notice, this list of conditions and the following disclaimer.
1085835Siwasaki * 2. Redistributions in binary form must reproduce the above copyright
1185835Siwasaki *    notice, this list of conditions and the following disclaimer in the
1285835Siwasaki *    documentation and/or other materials provided with the distribution.
1385835Siwasaki *
1485835Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1585835Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1685835Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1785835Siwasaki * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1885835Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1985835Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2085835Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2185835Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2285835Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2385835Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2485835Siwasaki * SUCH DAMAGE.
2585835Siwasaki *
2685835Siwasaki * $FreeBSD: head/sys/kern/subr_power.c 91640 2002-03-04 18:46:13Z iwasaki $
2785835Siwasaki */
2885835Siwasaki
2985835Siwasaki#include <sys/param.h>
3085835Siwasaki#include <sys/systm.h>
3191640Siwasaki#include <sys/proc.h>
3285835Siwasaki
3385835Siwasaki#include <sys/power.h>
3485835Siwasaki
3585835Siwasakistatic u_int		 power_pm_type	= POWER_PM_TYPE_NONE;
3685835Siwasakistatic power_pm_fn_t	 power_pm_fn	= NULL;
3785835Siwasakistatic void		*power_pm_arg	= NULL;
3885835Siwasaki
3985835Siwasakiint
4085835Siwasakipower_pm_register(u_int pm_type, power_pm_fn_t pm_fn, void *pm_arg)
4185835Siwasaki{
4285835Siwasaki	int	error;
4385835Siwasaki
4485835Siwasaki	if (power_pm_type == POWER_PM_TYPE_NONE ||
4585835Siwasaki	    power_pm_type == pm_type) {
4685835Siwasaki		power_pm_type	= pm_type;
4785835Siwasaki		power_pm_fn	= pm_fn;
4885835Siwasaki		power_pm_arg	= pm_arg;
4985835Siwasaki		error = 0;
5085835Siwasaki	} else {
5185835Siwasaki		error = ENXIO;
5285835Siwasaki	}
5385835Siwasaki
5485835Siwasaki	return (error);
5585835Siwasaki}
5685835Siwasaki
5785835Siwasakiu_int
5885835Siwasakipower_pm_get_type(void)
5985835Siwasaki{
6085835Siwasaki
6185835Siwasaki	return (power_pm_type);
6285835Siwasaki}
6385835Siwasaki
6485835Siwasakivoid
6585835Siwasakipower_pm_suspend(int state)
6685835Siwasaki{
6785835Siwasaki	if (power_pm_fn == NULL)
6885835Siwasaki		return;
6985835Siwasaki
7085835Siwasaki	if (state != POWER_SLEEP_STATE_STANDBY &&
7185835Siwasaki	    state != POWER_SLEEP_STATE_SUSPEND &&
7285835Siwasaki	    state != POWER_SLEEP_STATE_HIBERNATE)
7385835Siwasaki		return;
7485835Siwasaki
7585835Siwasaki	power_pm_fn(POWER_CMD_SUSPEND, power_pm_arg, state);
7685835Siwasaki}
7785835Siwasaki
7891640Siwasaki/*
7991640Siwasaki * Power profile.
8091640Siwasaki */
8191640Siwasaki
8291640Siwasakistatic int	power_profile_state = POWER_PROFILE_PERFORMANCE;
8391640Siwasaki
8491640Siwasakiint
8591640Siwasakipower_profile_get_state(void)
8691640Siwasaki{
8791640Siwasaki	return (power_profile_state);
8891640Siwasaki}
8991640Siwasaki
9091640Siwasakivoid
9191640Siwasakipower_profile_set_state(int state)
9291640Siwasaki{
9391640Siwasaki	int		changed;
9491640Siwasaki
9591640Siwasaki	if (state != power_profile_state) {
9691640Siwasaki		power_profile_state = state;
9791640Siwasaki		changed = 1;
9891640Siwasaki		printf("system power profile changed to '%s'\n",
9991640Siwasaki		       (state == POWER_PROFILE_PERFORMANCE) ? "performance" : "economy");
10091640Siwasaki	} else {
10191640Siwasaki		changed = 0;
10291640Siwasaki	}
10391640Siwasaki
10491640Siwasaki	if (changed)
10591640Siwasaki		EVENTHANDLER_INVOKE(power_profile_change);
10691640Siwasaki}
10791640Siwasaki
108