On Wed, 20 Apr 2011 00:31:33 +0900
Taku YAMAMOTO <[email protected]> wrote:

> A patch is attached.
Mailman ate it ;)
Here it is.

-- 
-|-__   YAMAMOTO, Taku
 | __ <     <[email protected]>

      - A chicken is an egg's way of producing more eggs. -
--- sys/dev/syscons/syscons.c.orig      2010-12-08 11:34:37.173729146 +0900
+++ sys/dev/syscons/syscons.c   2011-04-17 16:48:49.762423824 +0900
@@ -128,6 +128,13 @@ static     void            none_saver(sc_softc_t *sc, 
 static void            (*current_saver)(sc_softc_t *, int) = none_saver;
 #endif
 
+#ifdef SC_NO_SUSPEND_VTYSWITCH
+static int             sc_no_suspend_vtswitch = 1;
+#else
+static int             sc_no_suspend_vtswitch = 0;
+#endif
+static int             sc_cur_scr;
+
 SYSCTL_NODE(_hw, OID_AUTO, syscons, CTLFLAG_RD, 0, "syscons");
 SYSCTL_NODE(_hw_syscons, OID_AUTO, saver, CTLFLAG_RD, 0, "saver");
 SYSCTL_INT(_hw_syscons_saver, OID_AUTO, keybonly, CTLFLAG_RW,
@@ -142,6 +149,9 @@ SYSCTL_INT(_hw_syscons, OID_AUTO, kbd_re
 SYSCTL_INT(_hw_syscons, OID_AUTO, kbd_debug, CTLFLAG_RW|CTLFLAG_SECURE, 
&enable_kdbkey,
     0, "enable keyboard debug");
 #endif
+TUNABLE_INT("hw.syscons.sc_no_suspend_vtswitch", &sc_no_suspend_vtswitch);
+SYSCTL_INT(_hw_syscons, OID_AUTO, sc_no_suspend_vtswitch, CTLFLAG_RW,
+    &sc_no_suspend_vtswitch, 0, "Disable VT switch before suspend.");
 #if !defined(SC_NO_FONT_LOADING) && defined(SC_DFLT_FONT)
 #include "font.h"
 #endif
@@ -170,6 +180,8 @@ static kbd_callback_func_t sckbdevent;
 static void scinit(int unit, int flags);
 static scr_stat *sc_get_stat(struct tty *tp);
 static void scterm(int unit, int flags);
+static void scsuspend(void *arg);
+static void scresume(void *arg);
 static void scshutdown(void *arg, int howto);
 static u_int scgetc(sc_softc_t *sc, u_int flags);
 #define SCGETC_CN      1
@@ -518,10 +530,15 @@ sc_attach_unit(int unit, int flags)
        printf("\n");
     }
 
-    /* register a shutdown callback for the kernel console */
-    if (sc_console_unit == unit)
+    /* register suspend, resume and shutdown callbacks for the kernel console 
*/
+    if (sc_console_unit == unit) {
+       EVENTHANDLER_REGISTER(power_suspend, scsuspend,
+                             sc, EVENTHANDLER_PRI_ANY);
+       EVENTHANDLER_REGISTER(power_resume, scresume,
+                             sc, EVENTHANDLER_PRI_ANY);
        EVENTHANDLER_REGISTER(shutdown_pre_sync, scshutdown, 
                              (void *)(uintptr_t)unit, SHUTDOWN_PRI_DEFAULT);
+    }
 
     for (vc = 0; vc < sc->vtys; vc++) {
        if (sc->dev[vc] == NULL) {
@@ -3007,6 +3024,57 @@ scterm(int unit, int flags)
 }
 
 static void
+scsuspend(void *arg)
+{
+    int retry = 10;
+    sc_softc_t *sc;
+
+    sc = arg;
+    mtx_lock(&Giant);
+
+    if (sc->cur_scp == NULL)
+       goto out;
+
+    if (sc->suspend_in_progress == 0) {
+       sc_cur_scr = sc->cur_scp->index;
+       if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
+           do {
+               sc_switch_scr(sc, 0);
+               if (!sc->switch_in_progress)
+                   break;
+               pause("scsuspend", hz);
+           } while (retry--);
+    }
+    sc->suspend_in_progress++;
+
+out:
+    mtx_unlock(&Giant);
+}
+
+static void
+scresume(void *arg)
+{
+    sc_softc_t *sc;
+
+    sc = arg;
+    mtx_lock(&Giant);
+
+    if (sc->cur_scp == NULL)
+       goto out;
+
+    sc->suspend_in_progress--;
+    if (sc->suspend_in_progress == 0) {
+       if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
+           sc_switch_scr(sc, sc_cur_scr);
+       else
+           mark_all(sc->cur_scp);
+    }
+
+out:
+    mtx_unlock(&Giant);
+}
+
+static void
 scshutdown(void *arg, int howto)
 {
     /* assert(sc_console != NULL) */
--- sys/isa/syscons_isa.c.orig  2010-07-16 08:11:51.000000000 +0900
+++ sys/isa/syscons_isa.c       2011-04-17 16:33:33.710420799 +0900
@@ -69,17 +69,6 @@ __FBSDID("$FreeBSD: src/sys/isa/syscons_
 static devclass_t      sc_devclass;
 
 static sc_softc_t      main_softc;
-#ifdef SC_NO_SUSPEND_VTYSWITCH
-static int sc_no_suspend_vtswitch = 1;
-#else
-static int sc_no_suspend_vtswitch = 0;
-#endif
-static int sc_cur_scr;
-
-TUNABLE_INT("hw.syscons.sc_no_suspend_vtswitch", &sc_no_suspend_vtswitch);
-SYSCTL_DECL(_hw_syscons);
-SYSCTL_INT(_hw_syscons, OID_AUTO, sc_no_suspend_vtswitch, CTLFLAG_RW,
-    &sc_no_suspend_vtswitch, 0, "Disable VT switch before suspend.");
 
 static void
 scidentify(driver_t *driver, device_t parent)
@@ -108,53 +97,6 @@ scattach(device_t dev)
            SC_AUTODETECT_KBD));
 }
 
-static int
-scsuspend(device_t dev)
-{
-       int             retry = 10;
-       sc_softc_t      *sc;
-
-       sc = &main_softc;
-
-       if (sc->cur_scp == NULL)
-               return (0);
-
-       if (sc->suspend_in_progress == 0) {
-               sc_cur_scr = sc->cur_scp->index;
-               if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
-                       do {
-                               sc_switch_scr(sc, 0);
-                               if (!sc->switch_in_progress)
-                                       break;
-                               pause("scsuspend", hz);
-                       } while (retry--);
-       }
-       sc->suspend_in_progress++;
-
-       return (0);
-}
-
-static int
-scresume(device_t dev)
-{
-       sc_softc_t      *sc;
-
-       sc = &main_softc;
-
-       if (sc->cur_scp == NULL)
-               return (0);
-
-       sc->suspend_in_progress--;
-       if (sc->suspend_in_progress == 0) {
-               if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
-                       sc_switch_scr(sc, sc_cur_scr);
-               else
-                       mark_all(sc->cur_scp);
-       }
-
-       return (0);
-}
-
 int
 sc_max_unit(void)
 {
@@ -300,8 +242,6 @@ static device_method_t sc_methods[] = {
        DEVMETHOD(device_identify,      scidentify),
        DEVMETHOD(device_probe,         scprobe),
        DEVMETHOD(device_attach,        scattach),
-       DEVMETHOD(device_suspend,       scsuspend),
-       DEVMETHOD(device_resume,        scresume),
        { 0, 0 }
 };
 
@@ -312,70 +252,3 @@ 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);
--- sys/pc98/cbus/syscons_cbus.c.orig   2010-06-24 04:44:07.917176703 +0900
+++ sys/pc98/cbus/syscons_cbus.c        2011-04-17 16:31:04.147420821 +0900
@@ -49,17 +49,6 @@ __FBSDID("$FreeBSD: src/sys/pc98/cbus/sy
 static devclass_t      sc_devclass;
 
 static sc_softc_t      main_softc;
-#ifdef SC_NO_SUSPEND_VTYSWITCH
-static int sc_no_suspend_vtswitch = 1;
-#else
-static int sc_no_suspend_vtswitch = 0;
-#endif
-static int sc_cur_scr;
-
-TUNABLE_INT("hw.syscons.sc_no_suspend_vtswitch", &sc_no_suspend_vtswitch);
-SYSCTL_DECL(_hw_syscons);
-SYSCTL_INT(_hw_syscons, OID_AUTO, sc_no_suspend_vtswitch, CTLFLAG_RW,
-    &sc_no_suspend_vtswitch, 0, "Disable VT switch before suspend.");
 
 static void
 scidentify(driver_t *driver, device_t parent)
@@ -87,47 +76,6 @@ scattach(device_t dev)
        return sc_attach_unit(device_get_unit(dev), device_get_flags(dev));
 }
 
-static int
-scsuspend(device_t dev)
-{
-       int             retry = 10;
-       sc_softc_t      *sc;
-
-       sc = &main_softc;
-
-       if (sc->cur_scp == NULL)
-               return (0);
-
-       sc_cur_scr = sc->cur_scp->index;
-
-       if (sc_no_suspend_vtswitch)
-               return (0);
-
-       do {
-               sc_switch_scr(sc, 0);
-               if (!sc->switch_in_progress) {
-                       break;
-               }
-               pause("scsuspend", hz);
-       } while (retry--);
-
-       return (0);
-}
-
-static int
-scresume(device_t dev)
-{
-       sc_softc_t      *sc;
-
-       if (sc_no_suspend_vtswitch)
-               return (0);
-
-       sc = &main_softc;
-       sc_switch_scr(sc, sc_cur_scr);
-
-       return (0);
-}
-
 int
 sc_max_unit(void)
 {
@@ -242,8 +190,6 @@ static device_method_t sc_methods[] = {
        DEVMETHOD(device_identify,      scidentify),
        DEVMETHOD(device_probe,         scprobe),
        DEVMETHOD(device_attach,        scattach),
-       DEVMETHOD(device_suspend,       scsuspend),
-       DEVMETHOD(device_resume,        scresume),
        { 0, 0 }
 };
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to "[email protected]"

Reply via email to