summaryrefslogtreecommitdiff
path: root/setup/Linux/oss/build/pci_wrapper.inc
diff options
context:
space:
mode:
Diffstat (limited to 'setup/Linux/oss/build/pci_wrapper.inc')
-rw-r--r--setup/Linux/oss/build/pci_wrapper.inc93
1 files changed, 93 insertions, 0 deletions
diff --git a/setup/Linux/oss/build/pci_wrapper.inc b/setup/Linux/oss/build/pci_wrapper.inc
new file mode 100644
index 0000000..e08ec3a
--- /dev/null
+++ b/setup/Linux/oss/build/pci_wrapper.inc
@@ -0,0 +1,93 @@
+/*
+ * Purpose: PCI wrapper routines for Linux
+ *
+ * This source file contains probe and remove routines for PCI devices.
+ * This code will be compiled in the target system.
+ */
+/*
+ * Copyright (C) 4Front Technologies 2005-2007. Released under GPL2 license.
+ */
+typedef struct
+{
+ struct pci_dev *pcidev;
+ oss_device_t *osdev;
+} dev_map_t;
+
+#define MAX_INSTANCE 10
+static dev_map_t dev_map[MAX_INSTANCE];
+static int n_devmap = 0;
+
+static int __devinit
+osspci_probe (struct pci_dev *pcidev, const struct pci_device_id *pciid)
+{
+ oss_device_t *osdev;
+ dev_info_t *dip;
+
+ if (n_devmap >= MAX_INSTANCE)
+ {
+ printk (KERN_ALERT "oss: Too many instances of " DRIVER_NICK);
+ return -ENOMEM;
+ }
+
+ if ((dip = oss_create_pcidip (pcidev)) == NULL)
+ return -ENOMEM;
+
+ if ((osdev =
+ osdev_create (dip, DRIVER_TYPE, instance++, DRIVER_NICK,
+ NULL)) == NULL)
+ {
+ return -ENOMEM;
+ }
+
+ osdev_set_owner (osdev, THIS_MODULE);
+
+ if (module_major == 0)
+ module_major = oss_request_major (osdev, 0, DRIVER_NICK);
+ if (module_major <= 0)
+ {
+ printk (KERN_ALERT "Failed to allocate major device for " DRIVER_NICK);
+ return -EIO;
+
+ }
+ osdev_set_major (osdev, module_major);
+
+ pci_enable_device (pcidev);
+ if (!DRIVER_ATTACH (osdev))
+ {
+ pci_disable_device (pcidev);
+ return -EIO;
+ }
+
+ dev_map[n_devmap].pcidev = pcidev;
+ dev_map[n_devmap++].osdev = osdev;
+ oss_audio_delayed_attach ();
+
+ return 0;
+}
+
+static void __devexit
+osspci_remove (struct pci_dev *pcidev)
+{
+ int i;
+ oss_device_t *osdev;
+
+ for (i = 0; i < n_devmap; i++)
+ if (dev_map[i].pcidev == pcidev)
+ {
+ osdev = dev_map[i].osdev;
+ if (!DRIVER_DETACH (osdev))
+ printk (KERN_ALERT DRIVER_NICK ": Unloading busy device\n");
+ pci_disable_device (dev_map[i].pcidev);
+ osdev_delete (osdev);
+
+ return;
+ }
+
+ printk (KERN_ALERT DRIVER_NICK ": Can't find the PCI device to detach\n");
+}
+
+void
+oss_pcie_init (oss_device_t * osdev, int flags)
+{
+ /* TODO: Do we need to do something here? */
+}