Revert r211288 and move the logic to the acpi_timer itself.

This commit is contained in:
Jung-uk Kim 2012-02-08 20:31:42 +00:00
parent c0ae88db3a
commit cc43a851d2
3 changed files with 48 additions and 18 deletions

View File

@ -43,12 +43,6 @@ if [ -r /var/run/rc.suspend.pid ]; then
echo 'rc.resume: killed rc.suspend that was still around'
fi
if [ -r /var/run/rc.suspend.tch ]; then
_t=`cat /var/run/rc.suspend.tch`
/sbin/sysctl -n kern.timecounter.hardware=$_t > /dev/null 2>&1
/bin/rm -f /var/run/rc.suspend.tch
fi
if [ -r /var/run/moused.pid ]; then
pkill -HUP -F /var/run/moused.pid
fi

View File

@ -43,18 +43,6 @@ fi
echo $$ 2> /dev/null > /var/run/rc.suspend.pid
_t=`/sbin/sysctl -n kern.timecounter.hardware 2> /dev/null`
case ${_t#ACPI-} in
fast|safe)
/bin/rm -f /var/run/rc.suspend.tch
;;
*)
{ /sbin/sysctl -n kern.timecounter.hardware=ACPI-fast || \
/sbin/sysctl -n kern.timecounter.hardware=ACPI-safe; } \
> /dev/null 2>&1 && echo $_t > /var/run/rc.suspend.tch
;;
esac
# If you have troubles on suspending with PC-CARD modem, try this.
# See also contrib/pccardq.c (Only for PAO users).
# pccardq | awk -F '~' '$5 == "filled" && $4 ~ /uart/ \

View File

@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include "opt_acpi.h"
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/eventhandler.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/sysctl.h>
@ -60,12 +61,15 @@ static device_t acpi_timer_dev;
static struct resource *acpi_timer_reg;
static bus_space_handle_t acpi_timer_bsh;
static bus_space_tag_t acpi_timer_bst;
static eventhandler_tag acpi_timer_eh;
static u_int acpi_timer_frequency = 14318182 / 4;
static void acpi_timer_identify(driver_t *driver, device_t parent);
static int acpi_timer_probe(device_t dev);
static int acpi_timer_attach(device_t dev);
static int acpi_timer_suspend(device_t);
static void acpi_timer_resume_handler(struct timecounter *);
static u_int acpi_timer_get_timecount(struct timecounter *tc);
static u_int acpi_timer_get_timecount_safe(struct timecounter *tc);
static int acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS);
@ -77,6 +81,7 @@ static device_method_t acpi_timer_methods[] = {
DEVMETHOD(device_identify, acpi_timer_identify),
DEVMETHOD(device_probe, acpi_timer_probe),
DEVMETHOD(device_attach, acpi_timer_attach),
DEVMETHOD(device_suspend, acpi_timer_suspend),
{0, 0}
};
@ -247,6 +252,49 @@ acpi_timer_attach(device_t dev)
return (0);
}
static void
acpi_timer_resume_handler(struct timecounter *newtc)
{
struct timecounter *tc;
tc = timecounter;
if (tc != newtc) {
if (bootverbose)
device_printf(acpi_timer_dev,
"restoring timecounter, %s -> %s\n",
tc->tc_name, newtc->tc_name);
(void)newtc->tc_get_timecount(newtc);
(void)newtc->tc_get_timecount(newtc);
timecounter = newtc;
}
}
static int
acpi_timer_suspend(device_t dev)
{
struct timecounter *newtc, *tc;
int error;
error = bus_generic_suspend(dev);
if (acpi_timer_eh != NULL) {
EVENTHANDLER_DEREGISTER(power_resume, acpi_timer_eh);
acpi_timer_eh = NULL;
}
tc = timecounter;
newtc = &acpi_timer_timecounter;
if (tc != newtc) {
if (bootverbose)
device_printf(dev, "switching timecounter, %s -> %s\n",
tc->tc_name, newtc->tc_name);
(void)acpi_timer_read();
(void)acpi_timer_read();
timecounter = newtc;
acpi_timer_eh = EVENTHANDLER_REGISTER(power_resume,
acpi_timer_resume_handler, tc, EVENTHANDLER_PRI_LAST);
}
return (error);
}
/*
* Fetch current time value from reliable hardware.
*/