blob: b2569ae728b7f2b053aa79c9ea11e9230f79b46f [file] [log] [blame]
--- ../../alsa-kernel/usb/usx2y/usX2Yhwdep.c 2009-11-16 13:18:14.000000000 +0100
+++ usX2Yhwdep.c 2009-12-16 19:58:29.000000000 +0100
@@ -1,3 +1,21 @@
+#include "config.h"
+#ifdef CONFIG_HAVE_DEPRECATED_CONFIG_H
+#include <linux/autoconf.h>
+#else
+#include <linux/config.h>
+#endif
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
+#define SND_NEED_USB_SET_INTERFACE
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define SND_NEED_USB_WRAPPER
+#endif
+#define __NO_VERSION__
+#endif
+#include "adriver.h"
+#include "../usbcompat.h"
+
/*
* Driver for Tascam US-X2Y USB soundcards
*
@@ -30,6 +48,7 @@
#include "usbusx2y.h"
#include "usX2Yhwdep.h"
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
static int snd_us428ctls_vm_fault(struct vm_area_struct *area,
struct vm_fault *vmf)
{
@@ -52,9 +71,66 @@
return 0;
}
+#else /* 2.6.24 */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+static struct page * snd_us428ctls_vm_nopage(struct vm_area_struct *area,
+ unsigned long address, int *type)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
+static struct page * snd_us428ctls_vm_nopage(struct vm_area_struct *area,
+ unsigned long address, int no_share)
+#else
+static unsigned long snd_us428ctls_vm_nopage(struct vm_area_struct *area,
+ unsigned long address, int no_share)
+#endif
+{
+ unsigned long offset;
+ struct page * page;
+ void *vaddr;
+
+ snd_printdd("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
+ area->vm_start,
+ address - area->vm_start,
+ (address - area->vm_start) >> PAGE_SHIFT,
+ address);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25)
+ offset = area->vm_pgoff << PAGE_SHIFT;
+#else
+ offset = area->vm_offset;
+#endif
+ offset += address - area->vm_start;
+ if (snd_BUG_ON(offset % PAGE_SIZE))
+ return NOPAGE_SIGBUS;
+ vaddr = (char*)((struct usX2Ydev *)
+ area->vm_private_data)->us428ctls_sharedmem + offset;
+ page = virt_to_page(vaddr);
+ get_page(page);
+ snd_printdd( "vaddr=%p made us428ctls_vm_nopage() return %p; "
+ "offset=%lX\n", vaddr, page, offset);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+ if (type)
+ *type = VM_FAULT_MINOR;
+#endif
+
+#ifndef LINUX_2_2
+ return page;
+#else
+ /* why 2.2's kcomp.h redefines this? */
+#ifdef page_address
+#undef page_address
+#endif
+ return page_address(page);
+#endif
+}
+#endif /* >= 2.6.24 */
static const struct vm_operations_struct us428ctls_vm_ops = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
.fault = snd_us428ctls_vm_fault,
+#else
+ .nopage = snd_us428ctls_vm_nopage,
+#endif
};
static int snd_us428ctls_mmap(struct snd_hwdep * hw, struct file *filp, struct vm_area_struct *area)
@@ -81,8 +157,14 @@
us428->us428ctls_sharedmem->CtlSnapShotLast = -2;
}
area->vm_ops = &us428ctls_vm_ops;
+#ifdef VM_RESERVED
area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
+#endif
+#ifndef LINUX_2_2
area->vm_private_data = hw->private_data;
+#else
+ area->vm_private_data = (long)hw->private_data;
+#endif
return 0;
}
@@ -114,7 +196,11 @@
struct usX2Ydev *us428 = hw->private_data;
int id = -1;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
switch (le16_to_cpu(us428->dev->descriptor.idProduct)) {
+#else
+ switch (((struct usX2Ydev*)hw->private_data)->dev->descriptor.idProduct) {
+#endif
case USB_ID_US122:
id = USX2Y_TYPE_122;
break;
@@ -166,9 +252,15 @@
};
struct usb_device *dev = usX2Y(card)->dev;
struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
struct snd_usb_audio_quirk *quirk =
le16_to_cpu(dev->descriptor.idProduct) == USB_ID_US428 ?
&quirk_2 : &quirk_1;
+#else
+ struct snd_usb_audio_quirk *quirk =
+ dev->descriptor.idProduct == USB_ID_US428 ?
+ &quirk_2 : &quirk_1;
+#endif
snd_printdd("usX2Y_create_usbmidi \n");
return snd_usbmidi_create(card, iface, &usX2Y(card)->midi_list, quirk);
@@ -213,7 +305,11 @@
if (err)
snd_printk(KERN_ERR "usb_set_interface error \n");
else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 12)
err = usb_bulk_msg(dev, usb_sndbulkpipe(dev, 2), buf, dsp->length, &lret, 6000);
+#else
+ err = usb_bulk_msg(dev, usb_sndbulkpipe(dev, 2), buf, dsp->length, &lret, 6 * HZ);
+#endif
kfree(buf);
}
if (err)