Open Sound System |
Do you have problems with sound/audio application development? Don't panic! Click here for help! |
Copyright (C) 4Front Technologies 2005-2007. Released under BSD license.
#include <dev/pci/pcivar.h> /* For pci_get macros! */ #include <dev/pci/pcireg.h> /* PCI Support Functions */ static oss_device_t *device_list[16]; static device_t bsd_devices[16]; static int ndevs = 0;
Compare the device ID of this device against the IDs that this driver supports. If there is a match, set the description and return success.
static int osspci_probe (device_t dev) { #ifdef DEVTYPE_PCI int i, ok = 0; int vendor, device, class; oss_device_t *osdev; for (i = 0; i < ndevs; i++) if (dev == bsd_devices[i]) /* Already detected */ { return ENXIO; } if (ndevs >= 16) { printf (DRIVER_NICK ": Too many instances\n"); return ENXIO; } vendor = pci_get_vendor (dev); device = pci_get_device (dev); class = pci_get_class (dev); // printf("PCI dev %08lx c=%x, v=%04x, d=%04x\n", (unsigned long)dev, class, vendor, device); if (class != 4) /* Not a multimedia device */ return ENXIO; for (i = 0; id_table[i].vendor != 0; i++) if (vendor == id_table[i].vendor && device == id_table[i].device) /* Match */ { ok = 1; break; } if (!ok) { return (ENXIO); } if ((osdev = osdev_create (dev, DRIVER_TYPE, ndevs, DRIVER_NICK, NULL)) == NULL) { return ENOMEM; } if (!DRIVER_ATTACH (osdev)) return EIO; bsd_devices[ndevs] = dev; device_list[ndevs++] = osdev; #endif return (BUS_PROBE_DEFAULT); } /* Attach function is only called if the probe is successful */ static int osspci_attach (device_t dev) { return 0; } /* Detach device. */ static int osspci_detach (device_t dev) { oss_device_t *osdev; int i; for (i = 0; i < ndevs; i++) { osdev = device_list[i]; if (osdev->dip == dev) { if (device_get_state(dev) == DS_BUSY) device_unbusy(dev); if (!DRIVER_DETACH (osdev)) { printf (DRIVER_NICK ": Unloading busy device\n"); return EBUSY; } osdev_delete (osdev); } } return (0); } /* Called during system shutdown after sync. */ static int osspci_shutdown (device_t dev) { printf ("Mypci shutdown!\n"); return (0); }
Device suspend routine.
static int osspci_suspend (device_t dev) { printf ("Mypci suspend!\n"); return (0); }
Device resume routine.
static int osspci_resume (device_t dev) { printf ("Mypci resume!\n"); return (0); } static device_method_t osspci_methods[] = { /* Device interface */ DEVMETHOD (device_probe, osspci_probe), DEVMETHOD (device_attach, osspci_attach), DEVMETHOD (device_detach, osspci_detach), DEVMETHOD (device_shutdown, osspci_shutdown), DEVMETHOD (device_suspend, osspci_suspend), DEVMETHOD (device_resume, osspci_resume), {0, 0} }; static devclass_t osspci_devclass;