--- /dev/null
+--- device.c.orig 2010-12-12 16:34:17.866666668 +0100
++++ device.c 2011-01-09 12:17:06.000000000 +0100
+@@ -1828,6 +1828,8 @@ static int usbid_to_product_code(u32 usb
+ return DJCONTROLLER_PRODUCT_CODE;\r
+ } else if (usbid == USB_ID(USB_HDJ_VENDOR_ID, DJ_CONTROL_MP3W_PID)) {\r
+ return DJCONTROLLER_PRODUCT_CODE;\r
++ } else if (usbid == USB_ID(USB_HDJ_VENDOR_ID, DJ_CONTROL_MP3E2_PID)) {\r
++ return DJCONTROLSTEEL_PRODUCT_CODE;\r
+ } else {\r
+ return DJCONSOLE_PRODUCT_UNKNOWN;\r
+ }\r
+@@ -1860,6 +1862,7 @@ static int hdj_probe(struct usb_interfac
+ (le16_to_cpu(usb_dev->descriptor.idProduct)!=DJ_CONSOLE_RMX_PID)&&\r
+ (le16_to_cpu(usb_dev->descriptor.idProduct)!=DJ_CONTROL_MP3_PID)&&\r
+ (le16_to_cpu(usb_dev->descriptor.idProduct)!=DJ_CONTROL_MP3W_PID)&&\r
++ (le16_to_cpu(usb_dev->descriptor.idProduct)!=DJ_CONTROL_MP3E2_PID)&&\r
+ (le16_to_cpu(usb_dev->descriptor.idProduct)!=DJ_CONSOLE_STEEL_PID))\r
+ {\r
+ printk(KERN_INFO"hdj_probe() unsupported device, idVendor%lx, idProduct:%lx\n",\r
+--- device.h.orig 2009-01-27 15:25:50.000000000 +0100
++++ device.h 2011-01-09 12:19:22.000000000 +0100
+@@ -38,6 +38,7 @@ extern int netlink_unit;
+ #define DJ_CONSOLE_RMX_PID 0xb101\r
+ #define DJ_CONTROL_MP3_PID 0xd000\r
+ #define DJ_CONTROL_MP3W_PID 0xd001\r
++#define DJ_CONTROL_MP3E2_PID 0xb105\r
+ #define DJ_CONSOLE_STEEL_PID 0xb102\r
+ \r
+ #define DJ_BULK_IFNUM 0\r
--- /dev/null
+--- bulk.c.orig
++++ bulk.c
+@@ -34,6 +34,9 @@
+ #include <linux/usb.h>\r
+ #include <linux/delay.h>\r
+ #include <linux/version.h> /* For LINUX_VERSION_CODE */\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++#include <linux/semaphore.h>\r
++#endif\r
+ #if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) )\r
+ #include <linux/slab.h>\r
+ #endif\r
+@@ -3086,7 +3089,11 @@ int hdj_create_bulk_interface(struct snd_hdj_chip* chip,
+ goto hdj_create_bulk_interface_error;\r
+ }\r
+ /* allocate the buffer for bulk_out_urb */\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&ubulk->bulk_out_buffer_mutex,1);\r
++#else\r
+ init_MUTEX(&ubulk->bulk_out_buffer_mutex);\r
++#endif\r
+ \r
+ ubulk->bulk_out_buffer =\r
+ #if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) )\r
+@@ -3633,7 +3640,11 @@ static int init_output_control_state(struct usb_hdjbulk *ubulk)
+ return -EINVAL;\r
+ }\r
+ \r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&ubulk->output_control_mutex,1);\r
++#else\r
+ init_MUTEX(&ubulk->output_control_mutex);\r
++#endif\r
+ init_completion(&ubulk->output_control_completion);\r
+ \r
+ /* Every product here except the Steel targets HID. Since the steel does not target HID, we don't\r
+@@ -3907,7 +3918,11 @@ int hdjbulk_init_dj_console(struct usb_hdjbulk *ubulk)
+ u16 value = 0;\r
+ struct hdj_console_context *dc = ((struct hdj_console_context *)ubulk->device_context);\r
+ \r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&dc->device_config_mutex,1);\r
++#else\r
+ init_MUTEX(&dc->device_config_mutex);\r
++#endif\r
+ \r
+ ret = hdjbulk_init_common_context(ubulk,&ubulk->hdj_common);\r
+ if (ret!=0) {\r
+@@ -4185,7 +4200,11 @@ int hdjbulk_init_dj_steel(struct usb_hdjbulk *ubulk)
+ \r
+ spin_lock_init(&dc->bulk_buffer_lock);\r
+ init_completion(&dc->bulk_request_completion);\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&dc->bulk_request_mutex,1);\r
++#else\r
+ init_MUTEX(&dc->bulk_request_mutex);\r
++#endif\r
+ \r
+ if ((ret = init_continuous_reader(ubulk))!=0) {\r
+ printk(KERN_WARNING"%s() init_continuous_reader() failed, rc:%d\n",\r
+--- device.c.orig
++++ device.c
+@@ -66,7 +66,11 @@ MODULE_PARM_DESC(index, "Index value for the Hercules DJ Series adapter.");
+ module_param_array(id, charp, NULL, 0444);\r
+ MODULE_PARM_DESC(id, "ID string for the Hercules DJ Series adapter.");\r
+ \r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++static DEFINE_SEMAPHORE(register_mutex);\r
++#else\r
+ static DECLARE_MUTEX(register_mutex);\r
++#endif\r
+ static struct snd_hdj_chip *usb_chip[SNDRV_CARDS];\r
+ \r
+ /* reference count for the socket */\r
+@@ -1698,7 +1702,11 @@ static int snd_hdj_chip_create(struct usb_device *dev,
+ chip->card = card;\r
+ chip->product_code = product_code;\r
+ \r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&chip->vendor_request_mutex,1);\r
++#else\r
+ init_MUTEX(&chip->vendor_request_mutex);\r
++#endif\r
+ \r
+ /* initialise the atomic variables */\r
+ atomic_set(&chip->locked_io, 0);\r
+@@ -1713,7 +1721,11 @@ static int snd_hdj_chip_create(struct usb_device *dev,
+ INIT_LIST_HEAD(&chip->bulk_list);\r
+ chip->usb_id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),\r
+ le16_to_cpu(dev->descriptor.idProduct));\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&chip->netlink_list_mutex,1);\r
++#else\r
+ init_MUTEX(&chip->netlink_list_mutex);\r
++#endif\r
+ INIT_LIST_HEAD(&chip->netlink_registered_processes);\r
+ \r
+ /* fill in DJ capabilities for this device */\r
+--- midi.c.orig
++++ midi.c
+@@ -34,6 +34,9 @@
+ #include <linux/module.h>\r
+ #include <linux/usb.h>\r
+ #include <linux/kthread.h>\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++#include <linux/semaphore.h>\r
++#endif\r
+ #if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) )\r
+ #include <linux/slab.h>\r
+ #endif\r
+@@ -63,7 +66,7 @@
+ \r
+ unsigned long channel_list_initialized = 0;\r
+ struct midi_channel_elem channel_list[NUM_MIDI_CHANNELS];\r
+-spinlock_t channel_list_lock = SPIN_LOCK_UNLOCKED;\r
++DEFINE_SPINLOCK(channel_list_lock);\r
+ \r
+ static struct usb_protocol_ops snd_hdjmidi_standard_ops = {\r
+ .input = snd_hdjmidi_standard_input,\r
+@@ -732,7 +735,11 @@ static int controller_output_init(struct controller_output_hid *controller_state
+ \r
+ /* this buffer and URB below are for general control requests, like changing the\r
+ * mouse setting or setting LEDs */\r
++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) )\r
++ sema_init(&controller_state->output_control_ctl_mutex, 1);\r
++#else\r
+ init_MUTEX(&controller_state->output_control_ctl_mutex);\r
++#endif\r
+ init_completion(&controller_state->output_control_ctl_completion);\r
+ #if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) )\r
+ controller_state->output_control_ctl_req = usb_alloc_coherent(ep->umidi->chip->dev, \r