18a997770SDoug Rabson /*- 28a997770SDoug Rabson * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 38a997770SDoug Rabson * All rights reserved. 48a997770SDoug Rabson * 58a997770SDoug Rabson * Redistribution and use in source and binary forms, with or without 68a997770SDoug Rabson * modification, are permitted provided that the following conditions 78a997770SDoug Rabson * are met: 88a997770SDoug Rabson * 1. Redistributions of source code must retain the above copyright 98a997770SDoug Rabson * notice, this list of conditions and the following disclaimer as 108a997770SDoug Rabson * the first lines of this file unmodified. 118a997770SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 128a997770SDoug Rabson * notice, this list of conditions and the following disclaimer in the 138a997770SDoug Rabson * documentation and/or other materials provided with the distribution. 148a997770SDoug Rabson * 158a997770SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 168a997770SDoug Rabson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 178a997770SDoug Rabson * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 188a997770SDoug Rabson * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 198a997770SDoug Rabson * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 208a997770SDoug Rabson * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 218a997770SDoug Rabson * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 228a997770SDoug Rabson * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238a997770SDoug Rabson * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 248a997770SDoug Rabson * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258a997770SDoug Rabson */ 268a997770SDoug Rabson 278c9bbf48SDavid E. O'Brien #include <sys/cdefs.h> 288c9bbf48SDavid E. O'Brien __FBSDID("$FreeBSD$"); 298c9bbf48SDavid E. O'Brien 308a997770SDoug Rabson #include "opt_vga.h" 318a997770SDoug Rabson #include "opt_fb.h" 328a997770SDoug Rabson #include "opt_syscons.h" /* should be removed in the future, XXX */ 338a997770SDoug Rabson 348a997770SDoug Rabson #include <sys/param.h> 358a997770SDoug Rabson #include <sys/systm.h> 368a997770SDoug Rabson #include <sys/kernel.h> 37528433baSIan Dowse #include <sys/malloc.h> 385dba30f1SPoul-Henning Kamp #include <sys/module.h> 396e8394b8SKazutaka YOKOTA #include <sys/conf.h> 408a997770SDoug Rabson #include <sys/bus.h> 416e8394b8SKazutaka YOKOTA #include <sys/fbio.h> 426e8394b8SKazutaka YOKOTA 436e8394b8SKazutaka YOKOTA #include <machine/bus.h> 446e8394b8SKazutaka YOKOTA #include <machine/resource.h> 456e8394b8SKazutaka YOKOTA 466e8394b8SKazutaka YOKOTA #include <sys/rman.h> 478a997770SDoug Rabson 488a997770SDoug Rabson #include <vm/vm.h> 498a997770SDoug Rabson #include <vm/pmap.h> 508a997770SDoug Rabson 518a997770SDoug Rabson #include <machine/md_var.h> 5233a9fd01SPeter Wemm #ifdef __i386__ 538a997770SDoug Rabson #include <machine/pc/bios.h> 5433a9fd01SPeter Wemm #endif 558a997770SDoug Rabson 568a997770SDoug Rabson #include <dev/fb/fbreg.h> 578a997770SDoug Rabson #include <dev/fb/vgareg.h> 588a997770SDoug Rabson 598a997770SDoug Rabson #include <isa/isareg.h> 608a997770SDoug Rabson #include <isa/isavar.h> 618a997770SDoug Rabson 62bf71c25fSJung-uk Kim static void 63bf71c25fSJung-uk Kim vga_suspend(device_t dev) 64bf71c25fSJung-uk Kim { 65bf71c25fSJung-uk Kim vga_softc_t *sc; 66bf71c25fSJung-uk Kim int nbytes; 67bf71c25fSJung-uk Kim 68bf71c25fSJung-uk Kim sc = device_get_softc(dev); 69bf71c25fSJung-uk Kim 70bf71c25fSJung-uk Kim /* Save the video state across the suspend. */ 71bf71c25fSJung-uk Kim if (sc->state_buf != NULL) 72bf71c25fSJung-uk Kim goto save_palette; 73bf71c25fSJung-uk Kim nbytes = vidd_save_state(sc->adp, NULL, 0); 74bf71c25fSJung-uk Kim if (nbytes <= 0) 75bf71c25fSJung-uk Kim goto save_palette; 76bf71c25fSJung-uk Kim sc->state_buf = malloc(nbytes, M_TEMP, M_NOWAIT); 77bf71c25fSJung-uk Kim if (sc->state_buf == NULL) 78bf71c25fSJung-uk Kim goto save_palette; 79bf71c25fSJung-uk Kim if (bootverbose) 80bf71c25fSJung-uk Kim device_printf(dev, "saving %d bytes of video state\n", nbytes); 81bf71c25fSJung-uk Kim if (vidd_save_state(sc->adp, sc->state_buf, nbytes) != 0) { 82bf71c25fSJung-uk Kim device_printf(dev, "failed to save state (nbytes=%d)\n", 83bf71c25fSJung-uk Kim nbytes); 84bf71c25fSJung-uk Kim free(sc->state_buf, M_TEMP); 85bf71c25fSJung-uk Kim sc->state_buf = NULL; 86bf71c25fSJung-uk Kim } 87bf71c25fSJung-uk Kim 88bf71c25fSJung-uk Kim save_palette: 89bf71c25fSJung-uk Kim /* Save the color palette across the suspend. */ 90bf71c25fSJung-uk Kim if (sc->pal_buf != NULL) 91bf71c25fSJung-uk Kim return; 92bf71c25fSJung-uk Kim sc->pal_buf = malloc(256 * 3, M_TEMP, M_NOWAIT); 93bf71c25fSJung-uk Kim if (sc->pal_buf == NULL) 94bf71c25fSJung-uk Kim return; 95bf71c25fSJung-uk Kim if (bootverbose) 96bf71c25fSJung-uk Kim device_printf(dev, "saving color palette\n"); 97bf71c25fSJung-uk Kim if (vidd_save_palette(sc->adp, sc->pal_buf) != 0) { 98bf71c25fSJung-uk Kim device_printf(dev, "failed to save palette\n"); 99bf71c25fSJung-uk Kim free(sc->pal_buf, M_TEMP); 100bf71c25fSJung-uk Kim sc->pal_buf = NULL; 101bf71c25fSJung-uk Kim } 102bf71c25fSJung-uk Kim } 103bf71c25fSJung-uk Kim 104bf71c25fSJung-uk Kim static void 105bf71c25fSJung-uk Kim vga_resume(device_t dev) 106bf71c25fSJung-uk Kim { 107bf71c25fSJung-uk Kim vga_softc_t *sc; 108bf71c25fSJung-uk Kim 109bf71c25fSJung-uk Kim sc = device_get_softc(dev); 110bf71c25fSJung-uk Kim 111bf71c25fSJung-uk Kim if (sc->state_buf != NULL) { 112bf71c25fSJung-uk Kim if (vidd_load_state(sc->adp, sc->state_buf) != 0) 113bf71c25fSJung-uk Kim device_printf(dev, "failed to reload state\n"); 114bf71c25fSJung-uk Kim free(sc->state_buf, M_TEMP); 115bf71c25fSJung-uk Kim sc->state_buf = NULL; 116bf71c25fSJung-uk Kim } 117bf71c25fSJung-uk Kim if (sc->pal_buf != NULL) { 118bf71c25fSJung-uk Kim if (vidd_load_palette(sc->adp, sc->pal_buf) != 0) 119bf71c25fSJung-uk Kim device_printf(dev, "failed to reload palette\n"); 120bf71c25fSJung-uk Kim free(sc->pal_buf, M_TEMP); 121bf71c25fSJung-uk Kim sc->pal_buf = NULL; 122bf71c25fSJung-uk Kim } 123bf71c25fSJung-uk Kim } 124bf71c25fSJung-uk Kim 1256e8394b8SKazutaka YOKOTA #define VGA_SOFTC(unit) \ 1266e8394b8SKazutaka YOKOTA ((vga_softc_t *)devclass_get_softc(isavga_devclass, unit)) 1278a997770SDoug Rabson 1286e8394b8SKazutaka YOKOTA static devclass_t isavga_devclass; 1298a997770SDoug Rabson 1308a997770SDoug Rabson #ifdef FB_INSTALL_CDEV 1318a997770SDoug Rabson 1326e8394b8SKazutaka YOKOTA static d_open_t isavga_open; 1336e8394b8SKazutaka YOKOTA static d_close_t isavga_close; 1346e8394b8SKazutaka YOKOTA static d_read_t isavga_read; 1356e8394b8SKazutaka YOKOTA static d_write_t isavga_write; 1366e8394b8SKazutaka YOKOTA static d_ioctl_t isavga_ioctl; 1376e8394b8SKazutaka YOKOTA static d_mmap_t isavga_mmap; 1388a997770SDoug Rabson 1396e8394b8SKazutaka YOKOTA static struct cdevsw isavga_cdevsw = { 140dc08ffecSPoul-Henning Kamp .d_version = D_VERSION, 141dc08ffecSPoul-Henning Kamp .d_flags = D_NEEDGIANT, 1427ac40f5fSPoul-Henning Kamp .d_open = isavga_open, 1437ac40f5fSPoul-Henning Kamp .d_close = isavga_close, 1447ac40f5fSPoul-Henning Kamp .d_read = isavga_read, 1457ac40f5fSPoul-Henning Kamp .d_write = isavga_write, 1467ac40f5fSPoul-Henning Kamp .d_ioctl = isavga_ioctl, 1477ac40f5fSPoul-Henning Kamp .d_mmap = isavga_mmap, 1487ac40f5fSPoul-Henning Kamp .d_name = VGA_DRIVER_NAME, 1498a997770SDoug Rabson }; 1508a997770SDoug Rabson 1518a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */ 1528a997770SDoug Rabson 153c20ac811SPeter Wemm static void 154c20ac811SPeter Wemm isavga_identify(driver_t *driver, device_t parent) 155c20ac811SPeter Wemm { 156c20ac811SPeter Wemm BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, VGA_DRIVER_NAME, 0); 157c20ac811SPeter Wemm } 158c20ac811SPeter Wemm 1598a997770SDoug Rabson static int 1608a997770SDoug Rabson isavga_probe(device_t dev) 1618a997770SDoug Rabson { 1626e8394b8SKazutaka YOKOTA video_adapter_t adp; 1636e8394b8SKazutaka YOKOTA int error; 1648a997770SDoug Rabson 165f7f2df54SDoug Rabson /* No pnp support */ 166f7f2df54SDoug Rabson if (isa_get_vendorid(dev)) 167f7f2df54SDoug Rabson return (ENXIO); 168f7f2df54SDoug Rabson 169062acdb7SDoug Rabson error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev)); 1706e8394b8SKazutaka YOKOTA if (error == 0) { 171bf71c25fSJung-uk Kim device_set_desc(dev, "Generic ISA VGA"); 17225afb89bSDoug Rabson bus_set_resource(dev, SYS_RES_IOPORT, 0, 1736e8394b8SKazutaka YOKOTA adp.va_io_base, adp.va_io_size); 17425afb89bSDoug Rabson bus_set_resource(dev, SYS_RES_MEMORY, 0, 1756e8394b8SKazutaka YOKOTA adp.va_mem_base, adp.va_mem_size); 1766e8394b8SKazutaka YOKOTA #if 0 1776e8394b8SKazutaka YOKOTA isa_set_port(dev, adp.va_io_base); 1786e8394b8SKazutaka YOKOTA isa_set_portsize(dev, adp.va_io_size); 1796e8394b8SKazutaka YOKOTA isa_set_maddr(dev, adp.va_mem_base); 1806e8394b8SKazutaka YOKOTA isa_set_msize(dev, adp.va_mem_size); 1816e8394b8SKazutaka YOKOTA #endif 1826e8394b8SKazutaka YOKOTA } 183b66e2b8eSJung-uk Kim return (error); 1848a997770SDoug Rabson } 1858a997770SDoug Rabson 1868a997770SDoug Rabson static int 1878a997770SDoug Rabson isavga_attach(device_t dev) 1888a997770SDoug Rabson { 1896e8394b8SKazutaka YOKOTA vga_softc_t *sc; 1906e8394b8SKazutaka YOKOTA int unit; 1916e8394b8SKazutaka YOKOTA int rid; 1928a997770SDoug Rabson int error; 1938a997770SDoug Rabson 1946e8394b8SKazutaka YOKOTA unit = device_get_unit(dev); 1956e8394b8SKazutaka YOKOTA sc = device_get_softc(dev); 1968a997770SDoug Rabson 1976e8394b8SKazutaka YOKOTA rid = 0; 19867096659SPoul-Henning Kamp bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 1996e8394b8SKazutaka YOKOTA 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE); 2006e8394b8SKazutaka YOKOTA rid = 0; 20167096659SPoul-Henning Kamp bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 2026e8394b8SKazutaka YOKOTA 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE); 2036e8394b8SKazutaka YOKOTA 204062acdb7SDoug Rabson error = vga_attach_unit(unit, sc, device_get_flags(dev)); 2058a997770SDoug Rabson if (error) 206b66e2b8eSJung-uk Kim return (error); 2078a997770SDoug Rabson 2088a997770SDoug Rabson #ifdef FB_INSTALL_CDEV 2098a997770SDoug Rabson /* attach a virtual frame buffer device */ 2104866f95dSPoul-Henning Kamp error = fb_attach(VGA_MKMINOR(unit), sc->adp, &isavga_cdevsw); 2118a997770SDoug Rabson if (error) 212b66e2b8eSJung-uk Kim return (error); 2138a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */ 2148a997770SDoug Rabson 21561eb992fSPoul-Henning Kamp if (0 && bootverbose) 2169336e069SWojciech A. Koszek vidd_diag(sc->adp, bootverbose); 2178a997770SDoug Rabson 218f4e98881SRuslan Ermilov #if 0 /* experimental */ 219fe0d4089SMatthew N. Dodd device_add_child(dev, "fb", -1); 2206e8394b8SKazutaka YOKOTA bus_generic_attach(dev); 2218a997770SDoug Rabson #endif 2228a997770SDoug Rabson 223b66e2b8eSJung-uk Kim return (0); 2248a997770SDoug Rabson } 2258a997770SDoug Rabson 226528433baSIan Dowse static int 227528433baSIan Dowse isavga_suspend(device_t dev) 228528433baSIan Dowse { 229bf71c25fSJung-uk Kim int error; 230528433baSIan Dowse 231bf71c25fSJung-uk Kim error = bus_generic_suspend(dev); 232bf71c25fSJung-uk Kim if (error != 0) 233bf71c25fSJung-uk Kim return (error); 234bf71c25fSJung-uk Kim vga_suspend(dev); 2352259d74cSJung-uk Kim 236bf71c25fSJung-uk Kim return (error); 237528433baSIan Dowse } 238528433baSIan Dowse 239528433baSIan Dowse static int 240528433baSIan Dowse isavga_resume(device_t dev) 241528433baSIan Dowse { 242528433baSIan Dowse 243bf71c25fSJung-uk Kim vga_resume(dev); 2442259d74cSJung-uk Kim 245bf71c25fSJung-uk Kim return (bus_generic_resume(dev)); 246528433baSIan Dowse } 247528433baSIan Dowse 2486e8394b8SKazutaka YOKOTA #ifdef FB_INSTALL_CDEV 2496e8394b8SKazutaka YOKOTA 2508a997770SDoug Rabson static int 25189c9c53dSPoul-Henning Kamp isavga_open(struct cdev *dev, int flag, int mode, struct thread *td) 2528a997770SDoug Rabson { 253b66e2b8eSJung-uk Kim return (vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); 2548a997770SDoug Rabson } 2558a997770SDoug Rabson 2568a997770SDoug Rabson static int 25789c9c53dSPoul-Henning Kamp isavga_close(struct cdev *dev, int flag, int mode, struct thread *td) 2588a997770SDoug Rabson { 259b66e2b8eSJung-uk Kim return (vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); 2608a997770SDoug Rabson } 2618a997770SDoug Rabson 2628a997770SDoug Rabson static int 26389c9c53dSPoul-Henning Kamp isavga_read(struct cdev *dev, struct uio *uio, int flag) 2648a997770SDoug Rabson { 265b66e2b8eSJung-uk Kim return (vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); 2668a997770SDoug Rabson } 2678a997770SDoug Rabson 2688a997770SDoug Rabson static int 26989c9c53dSPoul-Henning Kamp isavga_write(struct cdev *dev, struct uio *uio, int flag) 2708a997770SDoug Rabson { 271b66e2b8eSJung-uk Kim return (vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); 2728a997770SDoug Rabson } 2738a997770SDoug Rabson 2748a997770SDoug Rabson static int 27589c9c53dSPoul-Henning Kamp isavga_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) 2768a997770SDoug Rabson { 277b66e2b8eSJung-uk Kim return (vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td)); 2788a997770SDoug Rabson } 2798a997770SDoug Rabson 2808a997770SDoug Rabson static int 281cfd7baceSRobert Noland isavga_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, 282cfd7baceSRobert Noland int prot, vm_memattr_t *memattr) 2838a997770SDoug Rabson { 284cfd7baceSRobert Noland return (vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot, 285cfd7baceSRobert Noland memattr)); 2868a997770SDoug Rabson } 2878a997770SDoug Rabson 2886e8394b8SKazutaka YOKOTA #endif /* FB_INSTALL_CDEV */ 289c20ac811SPeter Wemm 290c20ac811SPeter Wemm static device_method_t isavga_methods[] = { 291c20ac811SPeter Wemm DEVMETHOD(device_identify, isavga_identify), 292c20ac811SPeter Wemm DEVMETHOD(device_probe, isavga_probe), 293c20ac811SPeter Wemm DEVMETHOD(device_attach, isavga_attach), 294528433baSIan Dowse DEVMETHOD(device_suspend, isavga_suspend), 295528433baSIan Dowse DEVMETHOD(device_resume, isavga_resume), 296c20ac811SPeter Wemm 2974b7ec270SMarius Strobl DEVMETHOD_END 298c20ac811SPeter Wemm }; 299c20ac811SPeter Wemm 300c20ac811SPeter Wemm static driver_t isavga_driver = { 301c20ac811SPeter Wemm VGA_DRIVER_NAME, 302c20ac811SPeter Wemm isavga_methods, 303c20ac811SPeter Wemm sizeof(vga_softc_t), 304c20ac811SPeter Wemm }; 305c20ac811SPeter Wemm 306c20ac811SPeter Wemm DRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0); 307bf71c25fSJung-uk Kim 308bf71c25fSJung-uk Kim static devclass_t vgapm_devclass; 309bf71c25fSJung-uk Kim 310bf71c25fSJung-uk Kim static void 311bf71c25fSJung-uk Kim vgapm_identify(driver_t *driver, device_t parent) 312bf71c25fSJung-uk Kim { 313bf71c25fSJung-uk Kim 314bf71c25fSJung-uk Kim if (device_get_flags(parent) != 0) 315bf71c25fSJung-uk Kim device_add_child(parent, "vgapm", 0); 316bf71c25fSJung-uk Kim } 317bf71c25fSJung-uk Kim 318bf71c25fSJung-uk Kim static int 319bf71c25fSJung-uk Kim vgapm_probe(device_t dev) 320bf71c25fSJung-uk Kim { 321bf71c25fSJung-uk Kim 322bf71c25fSJung-uk Kim device_set_desc(dev, "VGA suspend/resume"); 323bf71c25fSJung-uk Kim device_quiet(dev); 324bf71c25fSJung-uk Kim 325bf71c25fSJung-uk Kim return (BUS_PROBE_DEFAULT); 326bf71c25fSJung-uk Kim } 327bf71c25fSJung-uk Kim 328bf71c25fSJung-uk Kim static int 329bf71c25fSJung-uk Kim vgapm_attach(device_t dev) 330bf71c25fSJung-uk Kim { 331bf71c25fSJung-uk Kim 3321ce5efd4SJung-uk Kim bus_generic_probe(dev); 3331ce5efd4SJung-uk Kim bus_generic_attach(dev); 3341ce5efd4SJung-uk Kim 335bf71c25fSJung-uk Kim return (0); 336bf71c25fSJung-uk Kim } 337bf71c25fSJung-uk Kim 338bf71c25fSJung-uk Kim static int 339bf71c25fSJung-uk Kim vgapm_suspend(device_t dev) 340bf71c25fSJung-uk Kim { 341bf71c25fSJung-uk Kim device_t vga_dev; 342bf71c25fSJung-uk Kim int error; 343bf71c25fSJung-uk Kim 344bf71c25fSJung-uk Kim error = bus_generic_suspend(dev); 345bf71c25fSJung-uk Kim if (error != 0) 346bf71c25fSJung-uk Kim return (error); 347bf71c25fSJung-uk Kim vga_dev = devclass_get_device(isavga_devclass, 0); 348bf71c25fSJung-uk Kim if (vga_dev == NULL) 349bf71c25fSJung-uk Kim return (0); 350bf71c25fSJung-uk Kim vga_suspend(vga_dev); 351bf71c25fSJung-uk Kim 352bf71c25fSJung-uk Kim return (0); 353bf71c25fSJung-uk Kim } 354bf71c25fSJung-uk Kim 355bf71c25fSJung-uk Kim static int 356bf71c25fSJung-uk Kim vgapm_resume(device_t dev) 357bf71c25fSJung-uk Kim { 358bf71c25fSJung-uk Kim device_t vga_dev; 359bf71c25fSJung-uk Kim 360bf71c25fSJung-uk Kim vga_dev = devclass_get_device(isavga_devclass, 0); 361bf71c25fSJung-uk Kim if (vga_dev != NULL) 362bf71c25fSJung-uk Kim vga_resume(vga_dev); 363bf71c25fSJung-uk Kim 364bf71c25fSJung-uk Kim return (bus_generic_resume(dev)); 365bf71c25fSJung-uk Kim } 366bf71c25fSJung-uk Kim 367bf71c25fSJung-uk Kim static device_method_t vgapm_methods[] = { 368bf71c25fSJung-uk Kim DEVMETHOD(device_identify, vgapm_identify), 369bf71c25fSJung-uk Kim DEVMETHOD(device_probe, vgapm_probe), 370bf71c25fSJung-uk Kim DEVMETHOD(device_attach, vgapm_attach), 371bf71c25fSJung-uk Kim DEVMETHOD(device_suspend, vgapm_suspend), 372bf71c25fSJung-uk Kim DEVMETHOD(device_resume, vgapm_resume), 373bf71c25fSJung-uk Kim { 0, 0 } 374bf71c25fSJung-uk Kim }; 375bf71c25fSJung-uk Kim 376bf71c25fSJung-uk Kim static driver_t vgapm_driver = { 377bf71c25fSJung-uk Kim "vgapm", 378bf71c25fSJung-uk Kim vgapm_methods, 379bf71c25fSJung-uk Kim 0 380bf71c25fSJung-uk Kim }; 381bf71c25fSJung-uk Kim 382bf71c25fSJung-uk Kim DRIVER_MODULE(vgapm, vgapci, vgapm_driver, vgapm_devclass, 0, 0); 383