summaryrefslogtreecommitdiff
path: root/setup/FreeBSD/oss/build/bsdpci.inc
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2013-05-03 21:08:42 +0400
committerIgor Pashev <pashev.igor@gmail.com>2013-05-03 21:08:42 +0400
commit1058def8e7827e56ce4a70afb4aeacb5dc44148f (patch)
tree4495d23e7b54ab5700e3839081e797c1eafe0db9 /setup/FreeBSD/oss/build/bsdpci.inc
downloadoss4-upstream.tar.gz
Imported Upstream version 4.2-build2006upstream/4.2-build2006upstream
Diffstat (limited to 'setup/FreeBSD/oss/build/bsdpci.inc')
-rw-r--r--setup/FreeBSD/oss/build/bsdpci.inc153
1 files changed, 153 insertions, 0 deletions
diff --git a/setup/FreeBSD/oss/build/bsdpci.inc b/setup/FreeBSD/oss/build/bsdpci.inc
new file mode 100644
index 0000000..5cb0b55
--- /dev/null
+++ b/setup/FreeBSD/oss/build/bsdpci.inc
@@ -0,0 +1,153 @@
+/*
+ * Purpose: Wrapper functions for PCI drivers under FreeBSD
+ */
+/*
+ * 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;