HID: roccat: Introduce module hid-roccat-common
[pandora-kernel.git] / drivers / hid / hid-roccat-pyra.c
index 02c58e0..abe77d3 100644 (file)
 #include <linux/device.h>
 #include <linux/input.h>
 #include <linux/hid.h>
-#include <linux/usb.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include "hid-ids.h"
 #include "hid-roccat.h"
+#include "hid-roccat-common.h"
 #include "hid-roccat-pyra.h"
 
 static uint profile_numbers[5] = {0, 1, 2, 3, 4};
@@ -42,7 +42,6 @@ static void profile_activated(struct pyra_device *pyra,
 static int pyra_send_control(struct usb_device *usb_dev, int value,
                enum pyra_control_requests request)
 {
-       int len;
        struct pyra_control control;
 
        if ((request == PYRA_CONTROL_REQUEST_PROFILE_SETTINGS ||
@@ -54,47 +53,31 @@ static int pyra_send_control(struct usb_device *usb_dev, int value,
        control.value = value;
        control.request = request;
 
-       len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                       USB_REQ_SET_CONFIGURATION,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
-                       PYRA_USB_COMMAND_CONTROL, 0, (char *)&control,
-                       sizeof(struct pyra_control),
-                       USB_CTRL_SET_TIMEOUT);
-
-       if (len != sizeof(struct pyra_control))
-               return len;
-
-       return 0;
+       return roccat_common_send(usb_dev, PYRA_USB_COMMAND_CONTROL,
+                       &control, sizeof(struct pyra_control));
 }
 
 static int pyra_receive_control_status(struct usb_device *usb_dev)
 {
-       int len;
+       int retval;
        struct pyra_control control;
 
        do {
                msleep(10);
-
-               len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
-                               USB_REQ_CLEAR_FEATURE,
-                               USB_TYPE_CLASS | USB_RECIP_INTERFACE |
-                               USB_DIR_IN,
-                               PYRA_USB_COMMAND_CONTROL, 0, (char *)&control,
-                               sizeof(struct pyra_control),
-                               USB_CTRL_SET_TIMEOUT);
+               retval = roccat_common_receive(usb_dev, PYRA_USB_COMMAND_CONTROL,
+                               &control, sizeof(struct pyra_control));
 
                /* requested too early, try again */
-       } while (len == -EPROTO);
+       } while (retval == -EPROTO);
 
-       if (len == sizeof(struct pyra_control) &&
-                       control.command == PYRA_COMMAND_CONTROL &&
+       if (!retval && control.command == PYRA_COMMAND_CONTROL &&
                        control.request == PYRA_CONTROL_REQUEST_STATUS &&
                        control.value == 1)
-                       return 0;
+               return 0;
        else {
                hid_err(usb_dev, "receive control status: unknown response 0x%x 0x%x\n",
                        control.request, control.value);
-               return -EINVAL;
+               return retval ? retval : -EINVAL;
        }
 }
 
@@ -102,125 +85,72 @@ static int pyra_get_profile_settings(struct usb_device *usb_dev,
                struct pyra_profile_settings *buf, int number)
 {
        int retval;
-
        retval = pyra_send_control(usb_dev, number,
                        PYRA_CONTROL_REQUEST_PROFILE_SETTINGS);
-
        if (retval)
                return retval;
-
-       retval = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
-                       USB_REQ_CLEAR_FEATURE,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
-                       PYRA_USB_COMMAND_PROFILE_SETTINGS, 0, (char *)buf,
-                       sizeof(struct pyra_profile_settings),
-                       USB_CTRL_SET_TIMEOUT);
-
-       if (retval != sizeof(struct pyra_profile_settings))
-               return retval;
-
-       return 0;
+       return roccat_common_receive(usb_dev, PYRA_USB_COMMAND_PROFILE_SETTINGS,
+                       buf, sizeof(struct pyra_profile_settings));
 }
 
 static int pyra_get_profile_buttons(struct usb_device *usb_dev,
                struct pyra_profile_buttons *buf, int number)
 {
        int retval;
-
        retval = pyra_send_control(usb_dev, number,
                        PYRA_CONTROL_REQUEST_PROFILE_BUTTONS);
-
        if (retval)
                return retval;
-
-       retval = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
-                       USB_REQ_CLEAR_FEATURE,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
-                       PYRA_USB_COMMAND_PROFILE_BUTTONS, 0, (char *)buf,
-                       sizeof(struct pyra_profile_buttons),
-                       USB_CTRL_SET_TIMEOUT);
-
-       if (retval != sizeof(struct pyra_profile_buttons))
-               return retval;
-
-       return 0;
+       return roccat_common_receive(usb_dev, PYRA_USB_COMMAND_PROFILE_BUTTONS,
+                       buf, sizeof(struct pyra_profile_buttons));
 }
 
 static int pyra_get_settings(struct usb_device *usb_dev,
                struct pyra_settings *buf)
 {
-       int len;
-       len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
-                       USB_REQ_CLEAR_FEATURE,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
-                       PYRA_USB_COMMAND_SETTINGS, 0, buf,
-                       sizeof(struct pyra_settings), USB_CTRL_SET_TIMEOUT);
-       if (len != sizeof(struct pyra_settings))
-               return -EIO;
-       return 0;
+       return roccat_common_receive(usb_dev, PYRA_USB_COMMAND_SETTINGS,
+                       buf, sizeof(struct pyra_settings));
 }
 
 static int pyra_get_info(struct usb_device *usb_dev, struct pyra_info *buf)
 {
-       int len;
-       len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
-                       USB_REQ_CLEAR_FEATURE,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
-                       PYRA_USB_COMMAND_INFO, 0, buf,
-                       sizeof(struct pyra_info), USB_CTRL_SET_TIMEOUT);
-       if (len != sizeof(struct pyra_info))
-               return -EIO;
-       return 0;
+       return roccat_common_receive(usb_dev, PYRA_USB_COMMAND_INFO,
+                       buf, sizeof(struct pyra_info));
+}
+
+static int pyra_send(struct usb_device *usb_dev, uint command,
+               void const *buf, uint size)
+{
+       int retval;
+       retval = roccat_common_send(usb_dev, command, buf, size);
+       if (retval)
+               return retval;
+       return pyra_receive_control_status(usb_dev);
 }
 
 static int pyra_set_profile_settings(struct usb_device *usb_dev,
                struct pyra_profile_settings const *settings)
 {
-       int len;
-       len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                       USB_REQ_SET_CONFIGURATION,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
-                       PYRA_USB_COMMAND_PROFILE_SETTINGS, 0, (char *)settings,
-                       sizeof(struct pyra_profile_settings),
-                       USB_CTRL_SET_TIMEOUT);
-       if (len != sizeof(struct pyra_profile_settings))
-               return -EIO;
-       if (pyra_receive_control_status(usb_dev))
-               return -EIO;
-       return 0;
+       return pyra_send(usb_dev, PYRA_USB_COMMAND_PROFILE_SETTINGS, settings,
+                       sizeof(struct pyra_profile_settings));
 }
 
 static int pyra_set_profile_buttons(struct usb_device *usb_dev,
                struct pyra_profile_buttons const *buttons)
 {
-       int len;
-       len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                       USB_REQ_SET_CONFIGURATION,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
-                       PYRA_USB_COMMAND_PROFILE_BUTTONS, 0, (char *)buttons,
-                       sizeof(struct pyra_profile_buttons),
-                       USB_CTRL_SET_TIMEOUT);
-       if (len != sizeof(struct pyra_profile_buttons))
-               return -EIO;
-       if (pyra_receive_control_status(usb_dev))
-               return -EIO;
-       return 0;
+       return pyra_send(usb_dev, PYRA_USB_COMMAND_PROFILE_BUTTONS, buttons,
+                       sizeof(struct pyra_profile_buttons));
 }
 
 static int pyra_set_settings(struct usb_device *usb_dev,
                struct pyra_settings const *settings)
 {
-       int len;
-       len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                       USB_REQ_SET_CONFIGURATION,
-                       USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
-                       PYRA_USB_COMMAND_SETTINGS, 0, (char *)settings,
-                       sizeof(struct pyra_settings), USB_CTRL_SET_TIMEOUT);
-       if (len != sizeof(struct pyra_settings))
-               return -EIO;
-       if (pyra_receive_control_status(usb_dev))
-               return -EIO;
-       return 0;
+       int retval;
+       retval = roccat_common_send(usb_dev, PYRA_USB_COMMAND_SETTINGS, settings,
+                       sizeof(struct pyra_settings));
+       if (retval)
+               return retval;
+       return pyra_receive_control_status(usb_dev);
 }
 
 static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp,
@@ -521,21 +451,16 @@ static struct bin_attribute pyra_bin_attributes[] = {
 static int pyra_init_pyra_device_struct(struct usb_device *usb_dev,
                struct pyra_device *pyra)
 {
-       struct pyra_info *info;
+       struct pyra_info info;
        int retval, i;
 
        mutex_init(&pyra->pyra_lock);
 
-       info = kmalloc(sizeof(struct pyra_info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
-       retval = pyra_get_info(usb_dev, info);
-       if (retval) {
-               kfree(info);
+       retval = pyra_get_info(usb_dev, &info);
+       if (retval)
                return retval;
-       }
-       pyra->firmware_version = info->firmware_version;
-       kfree(info);
+
+       pyra->firmware_version = info.firmware_version;
 
        retval = pyra_get_settings(usb_dev, &pyra->settings);
        if (retval)