diff options
Diffstat (limited to 'drivers/hid/hid-roccat-common.c')
| -rw-r--r-- | drivers/hid/hid-roccat-common.c | 65 | 
1 files changed, 59 insertions, 6 deletions
diff --git a/drivers/hid/hid-roccat-common.c b/drivers/hid/hid-roccat-common.c index 74f70403262..02e28e9f4ea 100644 --- a/drivers/hid/hid-roccat-common.c +++ b/drivers/hid/hid-roccat-common.c @@ -65,10 +65,11 @@ int roccat_common2_send(struct usb_device *usb_dev, uint report_id,  EXPORT_SYMBOL_GPL(roccat_common2_send);  enum roccat_common2_control_states { -	ROCCAT_COMMON_CONTROL_STATUS_OVERLOAD = 0, +	ROCCAT_COMMON_CONTROL_STATUS_CRITICAL = 0,  	ROCCAT_COMMON_CONTROL_STATUS_OK = 1,  	ROCCAT_COMMON_CONTROL_STATUS_INVALID = 2, -	ROCCAT_COMMON_CONTROL_STATUS_WAIT = 3, +	ROCCAT_COMMON_CONTROL_STATUS_BUSY = 3, +	ROCCAT_COMMON_CONTROL_STATUS_CRITICAL_NEW = 4,  };  static int roccat_common2_receive_control_status(struct usb_device *usb_dev) @@ -88,13 +89,12 @@ static int roccat_common2_receive_control_status(struct usb_device *usb_dev)  		switch (control.value) {  		case ROCCAT_COMMON_CONTROL_STATUS_OK:  			return 0; -		case ROCCAT_COMMON_CONTROL_STATUS_WAIT: +		case ROCCAT_COMMON_CONTROL_STATUS_BUSY:  			msleep(500);  			continue;  		case ROCCAT_COMMON_CONTROL_STATUS_INVALID: - -		case ROCCAT_COMMON_CONTROL_STATUS_OVERLOAD: -			/* seems to be critical - replug necessary */ +		case ROCCAT_COMMON_CONTROL_STATUS_CRITICAL: +		case ROCCAT_COMMON_CONTROL_STATUS_CRITICAL_NEW:  			return -EINVAL;  		default:  			dev_err(&usb_dev->dev, @@ -122,6 +122,59 @@ int roccat_common2_send_with_status(struct usb_device *usb_dev,  }  EXPORT_SYMBOL_GPL(roccat_common2_send_with_status); +int roccat_common2_device_init_struct(struct usb_device *usb_dev, +		struct roccat_common2_device *dev) +{ +	mutex_init(&dev->lock); +	return 0; +} +EXPORT_SYMBOL_GPL(roccat_common2_device_init_struct); + +ssize_t roccat_common2_sysfs_read(struct file *fp, struct kobject *kobj, +		char *buf, loff_t off, size_t count, +		size_t real_size, uint command) +{ +	struct device *dev = +			container_of(kobj, struct device, kobj)->parent->parent; +	struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev)); +	struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); +	int retval; + +	if (off >= real_size) +		return 0; + +	if (off != 0 || count != real_size) +		return -EINVAL; + +	mutex_lock(&roccat_dev->lock); +	retval = roccat_common2_receive(usb_dev, command, buf, real_size); +	mutex_unlock(&roccat_dev->lock); + +	return retval ? retval : real_size; +} +EXPORT_SYMBOL_GPL(roccat_common2_sysfs_read); + +ssize_t roccat_common2_sysfs_write(struct file *fp, struct kobject *kobj, +		void const *buf, loff_t off, size_t count, +		size_t real_size, uint command) +{ +	struct device *dev = +			container_of(kobj, struct device, kobj)->parent->parent; +	struct roccat_common2_device *roccat_dev = hid_get_drvdata(dev_get_drvdata(dev)); +	struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); +	int retval; + +	if (off != 0 || count != real_size) +		return -EINVAL; + +	mutex_lock(&roccat_dev->lock); +	retval = roccat_common2_send_with_status(usb_dev, command, buf, real_size); +	mutex_unlock(&roccat_dev->lock); + +	return retval ? retval : real_size; +} +EXPORT_SYMBOL_GPL(roccat_common2_sysfs_write); +  MODULE_AUTHOR("Stefan Achatz");  MODULE_DESCRIPTION("USB Roccat common driver");  MODULE_LICENSE("GPL v2");  | 
