Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
[pandora-kernel.git] / drivers / hid / hid-roccat-kone.c
index a57838d..2b8f3a3 100644 (file)
 
 static uint profile_numbers[5] = {0, 1, 2, 3, 4};
 
+static int kone_receive(struct usb_device *usb_dev, uint usb_command,
+               void *data, uint size)
+{
+       char *buf;
+       int len;
+
+       buf = kmalloc(size, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
+                       HID_REQ_GET_REPORT,
+                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
+                       usb_command, 0, buf, size, USB_CTRL_SET_TIMEOUT);
+
+       memcpy(data, buf, size);
+       kfree(buf);
+       return ((len < 0) ? len : ((len != size) ? -EIO : 0));
+}
+
+static int kone_send(struct usb_device *usb_dev, uint usb_command,
+               void const *data, uint size)
+{
+       char *buf;
+       int len;
+
+       buf = kmalloc(size, GFP_KERNEL);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       memcpy(buf, data, size);
+
+       len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
+                       HID_REQ_SET_REPORT,
+                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
+                       usb_command, 0, buf, size, USB_CTRL_SET_TIMEOUT);
+
+       kfree(buf);
+       return ((len < 0) ? len : ((len != size) ? -EIO : 0));
+}
+
 /* kone_class is used for creating sysfs attributes via roccat char device */
 static struct class *kone_class;
 
@@ -68,7 +109,7 @@ static int kone_check_write(struct usb_device *usb_dev)
                 */
                msleep(80);
 
-               retval = roccat_common_receive(usb_dev,
+               retval = kone_receive(usb_dev,
                                kone_command_confirm_write, &data, 1);
                if (retval)
                        return retval;
@@ -96,7 +137,7 @@ static int kone_check_write(struct usb_device *usb_dev)
 static int kone_get_settings(struct usb_device *usb_dev,
                struct kone_settings *buf)
 {
-       return roccat_common_receive(usb_dev, kone_command_settings, buf,
+       return kone_receive(usb_dev, kone_command_settings, buf,
                        sizeof(struct kone_settings));
 }
 
@@ -109,7 +150,7 @@ static int kone_set_settings(struct usb_device *usb_dev,
                struct kone_settings const *settings)
 {
        int retval;
-       retval = roccat_common_send(usb_dev, kone_command_settings,
+       retval = kone_send(usb_dev, kone_command_settings,
                        settings, sizeof(struct kone_settings));
        if (retval)
                return retval;
@@ -182,7 +223,7 @@ static int kone_get_weight(struct usb_device *usb_dev, int *result)
        int retval;
        uint8_t data;
 
-       retval = roccat_common_receive(usb_dev, kone_command_weight, &data, 1);
+       retval = kone_receive(usb_dev, kone_command_weight, &data, 1);
 
        if (retval)
                return retval;
@@ -201,7 +242,7 @@ static int kone_get_firmware_version(struct usb_device *usb_dev, int *result)
        int retval;
        uint16_t data;
 
-       retval = roccat_common_receive(usb_dev, kone_command_firmware_version,
+       retval = kone_receive(usb_dev, kone_command_firmware_version,
                        &data, 2);
        if (retval)
                return retval;
@@ -384,7 +425,7 @@ static int kone_tcu_command(struct usb_device *usb_dev, int number)
 {
        unsigned char value;
        value = number;
-       return roccat_common_send(usb_dev, kone_command_calibrate, &value, 1);
+       return kone_send(usb_dev, kone_command_calibrate, &value, 1);
 }
 
 /*
@@ -791,6 +832,9 @@ static int kone_raw_event(struct hid_device *hdev, struct hid_report *report,
        if (size != sizeof(struct kone_mouse_event))
                return 0;
 
+       if (kone == NULL)
+               return 0;
+
        /*
         * Firmware 1.38 introduced new behaviour for tilt and special buttons.
         * Pressed button is reported in each movement event.