diff options
author | jkim <jkim@FreeBSD.org> | 2010-05-22 07:35:17 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2010-05-22 07:35:17 +0000 |
commit | 64e597f0789096550e2a46dcc41cb59d447a9fc3 (patch) | |
tree | 321148f56fd04d09715225b8a1c8f81799568e13 /sys/isa | |
parent | 810a32455d43efc2de222a2109f0691456aa7645 (diff) | |
download | FreeBSD-src-64e597f0789096550e2a46dcc41cb59d447a9fc3.zip FreeBSD-src-64e597f0789096550e2a46dcc41cb59d447a9fc3.tar.gz |
Suspend screen updates when the video controller is powered down.
Diffstat (limited to 'sys/isa')
-rw-r--r-- | sys/isa/syscons_isa.c | 101 |
1 files changed, 86 insertions, 15 deletions
diff --git a/sys/isa/syscons_isa.c b/sys/isa/syscons_isa.c index 237e188..986789e 100644 --- a/sys/isa/syscons_isa.c +++ b/sys/isa/syscons_isa.c @@ -114,21 +114,21 @@ scsuspend(device_t dev) sc = &main_softc; - if (sc->cur_scp == NULL) + if (sc->cur_scp == NULL || sc->suspend_in_progress) return (0); - sc_cur_scr = sc->cur_scp->index; - - if (sc_no_suspend_vtswitch) - return (0); + if (!sc_no_suspend_vtswitch) { + sc_cur_scr = sc->cur_scp->index; + do { + sc_switch_scr(sc, 0); + if (!sc->switch_in_progress) { + break; + } + pause("scsuspend", hz); + } while (retry--); + } - do { - sc_switch_scr(sc, 0); - if (!sc->switch_in_progress) { - break; - } - pause("scsuspend", hz); - } while (retry--); + sc->suspend_in_progress = TRUE; return (0); } @@ -138,11 +138,15 @@ scresume(device_t dev) { sc_softc_t *sc; - if (sc_no_suspend_vtswitch) + sc = &main_softc; + + if (!sc->suspend_in_progress) return (0); - sc = &main_softc; - sc_switch_scr(sc, sc_cur_scr); + sc->suspend_in_progress = FALSE; + + if (!sc_no_suspend_vtswitch) + sc_switch_scr(sc, sc_cur_scr); return (0); } @@ -303,3 +307,70 @@ static driver_t sc_driver = { }; DRIVER_MODULE(sc, isa, sc_driver, sc_devclass, 0, 0); + +static devclass_t scpm_devclass; + +static void +scpm_identify(driver_t *driver, device_t parent) +{ + + device_add_child(parent, "scpm", 0); +} + +static int +scpm_probe(device_t dev) +{ + + device_set_desc(dev, SC_DRIVER_NAME " suspend/resume"); + device_quiet(dev); + + return (BUS_PROBE_DEFAULT); +} + +static int +scpm_attach(device_t dev) +{ + + bus_generic_probe(dev); + bus_generic_attach(dev); + + return (0); +} + +static int +scpm_suspend(device_t dev) +{ + int error; + + error = bus_generic_suspend(dev); + if (error != 0) + return (error); + + return (scsuspend(dev)); +} + +static int +scpm_resume(device_t dev) +{ + + scresume(dev); + + return (bus_generic_resume(dev)); +} + +static device_method_t scpm_methods[] = { + DEVMETHOD(device_identify, scpm_identify), + DEVMETHOD(device_probe, scpm_probe), + DEVMETHOD(device_attach, scpm_attach), + DEVMETHOD(device_suspend, scpm_suspend), + DEVMETHOD(device_resume, scpm_resume), + { 0, 0 } +}; + +static driver_t scpm_driver = { + "scpm", + scpm_methods, + 0 +}; + +DRIVER_MODULE(scpm, vgapm, scpm_driver, scpm_devclass, 0, 0); |