18a997770SDoug Rabson /*- 2fe267a55SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3fe267a55SPedro F. Giffuni * 48a997770SDoug Rabson * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 58a997770SDoug Rabson * All rights reserved. 68a997770SDoug Rabson * 78a997770SDoug Rabson * Redistribution and use in source and binary forms, with or without 88a997770SDoug Rabson * modification, are permitted provided that the following conditions 98a997770SDoug Rabson * are met: 108a997770SDoug Rabson * 1. Redistributions of source code must retain the above copyright 118a997770SDoug Rabson * notice, this list of conditions and the following disclaimer as 128a997770SDoug Rabson * the first lines of this file unmodified. 138a997770SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 148a997770SDoug Rabson * notice, this list of conditions and the following disclaimer in the 158a997770SDoug Rabson * documentation and/or other materials provided with the distribution. 168a997770SDoug Rabson * 178a997770SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 188a997770SDoug Rabson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 198a997770SDoug Rabson * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 208a997770SDoug Rabson * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 218a997770SDoug Rabson * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 228a997770SDoug Rabson * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 238a997770SDoug Rabson * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 248a997770SDoug Rabson * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258a997770SDoug Rabson * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268a997770SDoug Rabson * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278a997770SDoug Rabson */ 288a997770SDoug Rabson 298c9bbf48SDavid E. O'Brien #include <sys/cdefs.h> 308c9bbf48SDavid E. O'Brien __FBSDID("$FreeBSD$"); 318c9bbf48SDavid E. O'Brien 328a997770SDoug Rabson #include "opt_vga.h" 338a997770SDoug Rabson #include "opt_fb.h" 348a997770SDoug Rabson #include "opt_syscons.h" /* should be removed in the future, XXX */ 358a997770SDoug Rabson 368a997770SDoug Rabson #include <sys/param.h> 378a997770SDoug Rabson #include <sys/systm.h> 388a997770SDoug Rabson #include <sys/kernel.h> 39528433baSIan Dowse #include <sys/malloc.h> 405dba30f1SPoul-Henning Kamp #include <sys/module.h> 416e8394b8SKazutaka YOKOTA #include <sys/conf.h> 428a997770SDoug Rabson #include <sys/bus.h> 436e8394b8SKazutaka YOKOTA #include <sys/fbio.h> 446e8394b8SKazutaka YOKOTA 456e8394b8SKazutaka YOKOTA #include <machine/bus.h> 466e8394b8SKazutaka YOKOTA #include <machine/resource.h> 476e8394b8SKazutaka YOKOTA 486e8394b8SKazutaka YOKOTA #include <sys/rman.h> 498a997770SDoug Rabson 508a997770SDoug Rabson #include <vm/vm.h> 518a997770SDoug Rabson #include <vm/pmap.h> 528a997770SDoug Rabson 538a997770SDoug Rabson #include <machine/md_var.h> 5433a9fd01SPeter Wemm #ifdef __i386__ 558a997770SDoug Rabson #include <machine/pc/bios.h> 5633a9fd01SPeter Wemm #endif 578a997770SDoug Rabson 588a997770SDoug Rabson #include <dev/fb/fbreg.h> 598a997770SDoug Rabson #include <dev/fb/vgareg.h> 608a997770SDoug Rabson 618a997770SDoug Rabson #include <isa/isareg.h> 628a997770SDoug Rabson #include <isa/isavar.h> 638a997770SDoug Rabson 64bf71c25fSJung-uk Kim static void 65bf71c25fSJung-uk Kim vga_suspend(device_t dev) 66bf71c25fSJung-uk Kim { 67bf71c25fSJung-uk Kim vga_softc_t *sc; 68bf71c25fSJung-uk Kim int nbytes; 69bf71c25fSJung-uk Kim 70bf71c25fSJung-uk Kim sc = device_get_softc(dev); 71bf71c25fSJung-uk Kim 72bf71c25fSJung-uk Kim /* Save the video state across the suspend. */ 73bf71c25fSJung-uk Kim if (sc->state_buf != NULL) 74bf71c25fSJung-uk Kim goto save_palette; 75bf71c25fSJung-uk Kim nbytes = vidd_save_state(sc->adp, NULL, 0); 76bf71c25fSJung-uk Kim if (nbytes <= 0) 77bf71c25fSJung-uk Kim goto save_palette; 78bf71c25fSJung-uk Kim sc->state_buf = malloc(nbytes, M_TEMP, M_NOWAIT); 79bf71c25fSJung-uk Kim if (sc->state_buf == NULL) 80bf71c25fSJung-uk Kim goto save_palette; 81bf71c25fSJung-uk Kim if (bootverbose) 82bf71c25fSJung-uk Kim device_printf(dev, "saving %d bytes of video state\n", nbytes); 83bf71c25fSJung-uk Kim if (vidd_save_state(sc->adp, sc->state_buf, nbytes) != 0) { 84bf71c25fSJung-uk Kim device_printf(dev, "failed to save state (nbytes=%d)\n", 85bf71c25fSJung-uk Kim nbytes); 86bf71c25fSJung-uk Kim free(sc->state_buf, M_TEMP); 87bf71c25fSJung-uk Kim sc->state_buf = NULL; 88bf71c25fSJung-uk Kim } 89bf71c25fSJung-uk Kim 90bf71c25fSJung-uk Kim save_palette: 91bf71c25fSJung-uk Kim /* Save the color palette across the suspend. */ 92bf71c25fSJung-uk Kim if (sc->pal_buf != NULL) 93bf71c25fSJung-uk Kim return; 94bf71c25fSJung-uk Kim sc->pal_buf = malloc(256 * 3, M_TEMP, M_NOWAIT); 95bf71c25fSJung-uk Kim if (sc->pal_buf == NULL) 96bf71c25fSJung-uk Kim return; 97bf71c25fSJung-uk Kim if (bootverbose) 98bf71c25fSJung-uk Kim device_printf(dev, "saving color palette\n"); 99bf71c25fSJung-uk Kim if (vidd_save_palette(sc->adp, sc->pal_buf) != 0) { 100bf71c25fSJung-uk Kim device_printf(dev, "failed to save palette\n"); 101bf71c25fSJung-uk Kim free(sc->pal_buf, M_TEMP); 102bf71c25fSJung-uk Kim sc->pal_buf = NULL; 103bf71c25fSJung-uk Kim } 104bf71c25fSJung-uk Kim } 105bf71c25fSJung-uk Kim 106bf71c25fSJung-uk Kim static void 107bf71c25fSJung-uk Kim vga_resume(device_t dev) 108bf71c25fSJung-uk Kim { 109bf71c25fSJung-uk Kim vga_softc_t *sc; 110bf71c25fSJung-uk Kim 111bf71c25fSJung-uk Kim sc = device_get_softc(dev); 112bf71c25fSJung-uk Kim 113bf71c25fSJung-uk Kim if (sc->state_buf != NULL) { 114bf71c25fSJung-uk Kim if (vidd_load_state(sc->adp, sc->state_buf) != 0) 115bf71c25fSJung-uk Kim device_printf(dev, "failed to reload state\n"); 116bf71c25fSJung-uk Kim free(sc->state_buf, M_TEMP); 117bf71c25fSJung-uk Kim sc->state_buf = NULL; 118bf71c25fSJung-uk Kim } 119bf71c25fSJung-uk Kim if (sc->pal_buf != NULL) { 120bf71c25fSJung-uk Kim if (vidd_load_palette(sc->adp, sc->pal_buf) != 0) 121bf71c25fSJung-uk Kim device_printf(dev, "failed to reload palette\n"); 122bf71c25fSJung-uk Kim free(sc->pal_buf, M_TEMP); 123bf71c25fSJung-uk Kim sc->pal_buf = NULL; 124bf71c25fSJung-uk Kim } 125bf71c25fSJung-uk Kim } 126bf71c25fSJung-uk Kim 1276e8394b8SKazutaka YOKOTA #define VGA_SOFTC(unit) \ 1286e8394b8SKazutaka YOKOTA ((vga_softc_t *)devclass_get_softc(isavga_devclass, unit)) 1298a997770SDoug Rabson 1306e8394b8SKazutaka YOKOTA static devclass_t isavga_devclass; 1318a997770SDoug Rabson 1328a997770SDoug Rabson #ifdef FB_INSTALL_CDEV 1338a997770SDoug Rabson 1346e8394b8SKazutaka YOKOTA static d_open_t isavga_open; 1356e8394b8SKazutaka YOKOTA static d_close_t isavga_close; 1366e8394b8SKazutaka YOKOTA static d_read_t isavga_read; 1376e8394b8SKazutaka YOKOTA static d_write_t isavga_write; 1386e8394b8SKazutaka YOKOTA static d_ioctl_t isavga_ioctl; 1396e8394b8SKazutaka YOKOTA static d_mmap_t isavga_mmap; 1408a997770SDoug Rabson 1416e8394b8SKazutaka YOKOTA static struct cdevsw isavga_cdevsw = { 142dc08ffecSPoul-Henning Kamp .d_version = D_VERSION, 143dc08ffecSPoul-Henning Kamp .d_flags = D_NEEDGIANT, 1447ac40f5fSPoul-Henning Kamp .d_open = isavga_open, 1457ac40f5fSPoul-Henning Kamp .d_close = isavga_close, 1467ac40f5fSPoul-Henning Kamp .d_read = isavga_read, 1477ac40f5fSPoul-Henning Kamp .d_write = isavga_write, 1487ac40f5fSPoul-Henning Kamp .d_ioctl = isavga_ioctl, 1497ac40f5fSPoul-Henning Kamp .d_mmap = isavga_mmap, 1507ac40f5fSPoul-Henning Kamp .d_name = VGA_DRIVER_NAME, 1518a997770SDoug Rabson }; 1528a997770SDoug Rabson 1538a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */ 1548a997770SDoug Rabson 155c20ac811SPeter Wemm static void 156c20ac811SPeter Wemm isavga_identify(driver_t *driver, device_t parent) 157c20ac811SPeter Wemm { 158c20ac811SPeter Wemm BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, VGA_DRIVER_NAME, 0); 159c20ac811SPeter Wemm } 160c20ac811SPeter Wemm 1618a997770SDoug Rabson static int 1628a997770SDoug Rabson isavga_probe(device_t dev) 1638a997770SDoug Rabson { 1646e8394b8SKazutaka YOKOTA video_adapter_t adp; 1656e8394b8SKazutaka YOKOTA int error; 1668a997770SDoug Rabson 167f7f2df54SDoug Rabson /* No pnp support */ 168f7f2df54SDoug Rabson if (isa_get_vendorid(dev)) 169f7f2df54SDoug Rabson return (ENXIO); 170f7f2df54SDoug Rabson 171062acdb7SDoug Rabson error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev)); 1726e8394b8SKazutaka YOKOTA if (error == 0) { 173bf71c25fSJung-uk Kim device_set_desc(dev, "Generic ISA VGA"); 17425afb89bSDoug Rabson bus_set_resource(dev, SYS_RES_IOPORT, 0, 1756e8394b8SKazutaka YOKOTA adp.va_io_base, adp.va_io_size); 17625afb89bSDoug Rabson bus_set_resource(dev, SYS_RES_MEMORY, 0, 1776e8394b8SKazutaka YOKOTA adp.va_mem_base, adp.va_mem_size); 1786e8394b8SKazutaka YOKOTA #if 0 1796e8394b8SKazutaka YOKOTA isa_set_port(dev, adp.va_io_base); 1806e8394b8SKazutaka YOKOTA isa_set_portsize(dev, adp.va_io_size); 1816e8394b8SKazutaka YOKOTA isa_set_maddr(dev, adp.va_mem_base); 1826e8394b8SKazutaka YOKOTA isa_set_msize(dev, adp.va_mem_size); 1836e8394b8SKazutaka YOKOTA #endif 1846e8394b8SKazutaka YOKOTA } 185b66e2b8eSJung-uk Kim return (error); 1868a997770SDoug Rabson } 1878a997770SDoug Rabson 1888a997770SDoug Rabson static int 1898a997770SDoug Rabson isavga_attach(device_t dev) 1908a997770SDoug Rabson { 1916e8394b8SKazutaka YOKOTA vga_softc_t *sc; 1926e8394b8SKazutaka YOKOTA int unit; 1936e8394b8SKazutaka YOKOTA int rid; 1948a997770SDoug Rabson int error; 1958a997770SDoug Rabson 1966e8394b8SKazutaka YOKOTA unit = device_get_unit(dev); 1976e8394b8SKazutaka YOKOTA sc = device_get_softc(dev); 1988a997770SDoug Rabson 1996e8394b8SKazutaka YOKOTA rid = 0; 20043cd6160SJustin Hibbits bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, 20143cd6160SJustin Hibbits RF_ACTIVE | RF_SHAREABLE); 2026e8394b8SKazutaka YOKOTA rid = 0; 20343cd6160SJustin Hibbits bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 20443cd6160SJustin Hibbits RF_ACTIVE | RF_SHAREABLE); 2056e8394b8SKazutaka YOKOTA 206062acdb7SDoug Rabson error = vga_attach_unit(unit, sc, device_get_flags(dev)); 2078a997770SDoug Rabson if (error) 208b66e2b8eSJung-uk Kim return (error); 2098a997770SDoug Rabson 2108a997770SDoug Rabson #ifdef FB_INSTALL_CDEV 2118a997770SDoug Rabson /* attach a virtual frame buffer device */ 2124866f95dSPoul-Henning Kamp error = fb_attach(VGA_MKMINOR(unit), sc->adp, &isavga_cdevsw); 2138a997770SDoug Rabson if (error) 214b66e2b8eSJung-uk Kim return (error); 2158a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */ 2168a997770SDoug Rabson 21761eb992fSPoul-Henning Kamp if (0 && bootverbose) 2189336e069SWojciech A. Koszek vidd_diag(sc->adp, bootverbose); 2198a997770SDoug Rabson 220f4e98881SRuslan Ermilov #if 0 /* experimental */ 221fe0d4089SMatthew N. Dodd device_add_child(dev, "fb", -1); 2226e8394b8SKazutaka YOKOTA bus_generic_attach(dev); 2238a997770SDoug Rabson #endif 2248a997770SDoug Rabson 225b66e2b8eSJung-uk Kim return (0); 2268a997770SDoug Rabson } 2278a997770SDoug Rabson 228528433baSIan Dowse static int 229528433baSIan Dowse isavga_suspend(device_t dev) 230528433baSIan Dowse { 231bf71c25fSJung-uk Kim int error; 232528433baSIan Dowse 233bf71c25fSJung-uk Kim error = bus_generic_suspend(dev); 234bf71c25fSJung-uk Kim if (error != 0) 235bf71c25fSJung-uk Kim return (error); 236bf71c25fSJung-uk Kim vga_suspend(dev); 2372259d74cSJung-uk Kim 238bf71c25fSJung-uk Kim return (error); 239528433baSIan Dowse } 240528433baSIan Dowse 241528433baSIan Dowse static int 242528433baSIan Dowse isavga_resume(device_t dev) 243528433baSIan Dowse { 244528433baSIan Dowse 245bf71c25fSJung-uk Kim vga_resume(dev); 2462259d74cSJung-uk Kim 247bf71c25fSJung-uk Kim return (bus_generic_resume(dev)); 248528433baSIan Dowse } 249528433baSIan Dowse 2506e8394b8SKazutaka YOKOTA #ifdef FB_INSTALL_CDEV 2516e8394b8SKazutaka YOKOTA 2528a997770SDoug Rabson static int 25389c9c53dSPoul-Henning Kamp isavga_open(struct cdev *dev, int flag, int mode, struct thread *td) 2548a997770SDoug Rabson { 255b66e2b8eSJung-uk Kim return (vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); 2568a997770SDoug Rabson } 2578a997770SDoug Rabson 2588a997770SDoug Rabson static int 25989c9c53dSPoul-Henning Kamp isavga_close(struct cdev *dev, int flag, int mode, struct thread *td) 2608a997770SDoug Rabson { 261b66e2b8eSJung-uk Kim return (vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); 2628a997770SDoug Rabson } 2638a997770SDoug Rabson 2648a997770SDoug Rabson static int 26589c9c53dSPoul-Henning Kamp isavga_read(struct cdev *dev, struct uio *uio, int flag) 2668a997770SDoug Rabson { 267b66e2b8eSJung-uk Kim return (vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); 2688a997770SDoug Rabson } 2698a997770SDoug Rabson 2708a997770SDoug Rabson static int 27189c9c53dSPoul-Henning Kamp isavga_write(struct cdev *dev, struct uio *uio, int flag) 2728a997770SDoug Rabson { 273b66e2b8eSJung-uk Kim return (vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); 2748a997770SDoug Rabson } 2758a997770SDoug Rabson 2768a997770SDoug Rabson static int 27789c9c53dSPoul-Henning Kamp isavga_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) 2788a997770SDoug Rabson { 279b66e2b8eSJung-uk Kim return (vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td)); 2808a997770SDoug Rabson } 2818a997770SDoug Rabson 2828a997770SDoug Rabson static int 283cfd7baceSRobert Noland isavga_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, 284cfd7baceSRobert Noland int prot, vm_memattr_t *memattr) 2858a997770SDoug Rabson { 286cfd7baceSRobert Noland return (vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot, 287cfd7baceSRobert Noland memattr)); 2888a997770SDoug Rabson } 2898a997770SDoug Rabson 2906e8394b8SKazutaka YOKOTA #endif /* FB_INSTALL_CDEV */ 291c20ac811SPeter Wemm 292c20ac811SPeter Wemm static device_method_t isavga_methods[] = { 293c20ac811SPeter Wemm DEVMETHOD(device_identify, isavga_identify), 294c20ac811SPeter Wemm DEVMETHOD(device_probe, isavga_probe), 295c20ac811SPeter Wemm DEVMETHOD(device_attach, isavga_attach), 296528433baSIan Dowse DEVMETHOD(device_suspend, isavga_suspend), 297528433baSIan Dowse DEVMETHOD(device_resume, isavga_resume), 298c20ac811SPeter Wemm 2994b7ec270SMarius Strobl DEVMETHOD_END 300c20ac811SPeter Wemm }; 301c20ac811SPeter Wemm 302c20ac811SPeter Wemm static driver_t isavga_driver = { 303c20ac811SPeter Wemm VGA_DRIVER_NAME, 304c20ac811SPeter Wemm isavga_methods, 305c20ac811SPeter Wemm sizeof(vga_softc_t), 306c20ac811SPeter Wemm }; 307c20ac811SPeter Wemm 308c20ac811SPeter Wemm DRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0); 309bf71c25fSJung-uk Kim 310bf71c25fSJung-uk Kim static devclass_t vgapm_devclass; 311bf71c25fSJung-uk Kim 312bf71c25fSJung-uk Kim static void 313bf71c25fSJung-uk Kim vgapm_identify(driver_t *driver, device_t parent) 314bf71c25fSJung-uk Kim { 315bf71c25fSJung-uk Kim 316bf71c25fSJung-uk Kim if (device_get_flags(parent) != 0) 317bf71c25fSJung-uk Kim device_add_child(parent, "vgapm", 0); 318bf71c25fSJung-uk Kim } 319bf71c25fSJung-uk Kim 320bf71c25fSJung-uk Kim static int 321bf71c25fSJung-uk Kim vgapm_probe(device_t dev) 322bf71c25fSJung-uk Kim { 323bf71c25fSJung-uk Kim 324bf71c25fSJung-uk Kim device_set_desc(dev, "VGA suspend/resume"); 325bf71c25fSJung-uk Kim device_quiet(dev); 326bf71c25fSJung-uk Kim 327bf71c25fSJung-uk Kim return (BUS_PROBE_DEFAULT); 328bf71c25fSJung-uk Kim } 329bf71c25fSJung-uk Kim 330bf71c25fSJung-uk Kim static int 331bf71c25fSJung-uk Kim vgapm_attach(device_t dev) 332bf71c25fSJung-uk Kim { 333bf71c25fSJung-uk Kim 3341ce5efd4SJung-uk Kim bus_generic_probe(dev); 3351ce5efd4SJung-uk Kim bus_generic_attach(dev); 3361ce5efd4SJung-uk Kim 337bf71c25fSJung-uk Kim return (0); 338bf71c25fSJung-uk Kim } 339bf71c25fSJung-uk Kim 340bf71c25fSJung-uk Kim static int 341bf71c25fSJung-uk Kim vgapm_suspend(device_t dev) 342bf71c25fSJung-uk Kim { 343bf71c25fSJung-uk Kim device_t vga_dev; 344bf71c25fSJung-uk Kim int error; 345bf71c25fSJung-uk Kim 346bf71c25fSJung-uk Kim error = bus_generic_suspend(dev); 347bf71c25fSJung-uk Kim if (error != 0) 348bf71c25fSJung-uk Kim return (error); 349bf71c25fSJung-uk Kim vga_dev = devclass_get_device(isavga_devclass, 0); 350bf71c25fSJung-uk Kim if (vga_dev == NULL) 351bf71c25fSJung-uk Kim return (0); 352bf71c25fSJung-uk Kim vga_suspend(vga_dev); 353bf71c25fSJung-uk Kim 354bf71c25fSJung-uk Kim return (0); 355bf71c25fSJung-uk Kim } 356bf71c25fSJung-uk Kim 357bf71c25fSJung-uk Kim static int 358bf71c25fSJung-uk Kim vgapm_resume(device_t dev) 359bf71c25fSJung-uk Kim { 360bf71c25fSJung-uk Kim device_t vga_dev; 361bf71c25fSJung-uk Kim 362bf71c25fSJung-uk Kim vga_dev = devclass_get_device(isavga_devclass, 0); 363bf71c25fSJung-uk Kim if (vga_dev != NULL) 364bf71c25fSJung-uk Kim vga_resume(vga_dev); 365bf71c25fSJung-uk Kim 366bf71c25fSJung-uk Kim return (bus_generic_resume(dev)); 367bf71c25fSJung-uk Kim } 368bf71c25fSJung-uk Kim 369bf71c25fSJung-uk Kim static device_method_t vgapm_methods[] = { 370bf71c25fSJung-uk Kim DEVMETHOD(device_identify, vgapm_identify), 371bf71c25fSJung-uk Kim DEVMETHOD(device_probe, vgapm_probe), 372bf71c25fSJung-uk Kim DEVMETHOD(device_attach, vgapm_attach), 373bf71c25fSJung-uk Kim DEVMETHOD(device_suspend, vgapm_suspend), 374bf71c25fSJung-uk Kim DEVMETHOD(device_resume, vgapm_resume), 375bf71c25fSJung-uk Kim { 0, 0 } 376bf71c25fSJung-uk Kim }; 377bf71c25fSJung-uk Kim 378bf71c25fSJung-uk Kim static driver_t vgapm_driver = { 379bf71c25fSJung-uk Kim "vgapm", 380bf71c25fSJung-uk Kim vgapm_methods, 381bf71c25fSJung-uk Kim 0 382bf71c25fSJung-uk Kim }; 383bf71c25fSJung-uk Kim 384bf71c25fSJung-uk Kim DRIVER_MODULE(vgapm, vgapci, vgapm_driver, vgapm_devclass, 0, 0); 385