mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 15:11:16 +00:00
Merge branches 'magicmouse', 'roccat' and 'vec-pedal' into for-linus
Conflicts: drivers/hid/hid-ids.h
This commit is contained in:
commit
ada8c7973b
11 changed files with 99 additions and 75 deletions
|
@ -33,19 +33,6 @@ Description: When read, this file returns the raw integer version number of the
|
||||||
left. E.g. a returned value of 138 means 1.38
|
left. E.g. a returned value of 138 means 1.38
|
||||||
This file is readonly.
|
This file is readonly.
|
||||||
|
|
||||||
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/kone_driver_version
|
|
||||||
Date: March 2010
|
|
||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
|
||||||
Description: When read, this file returns the driver version.
|
|
||||||
The format of the string is "v<major>.<minor>.<patchlevel>".
|
|
||||||
This attribute is used by the userland tools to find the sysfs-
|
|
||||||
paths of installed kone-mice and determine the capabilites of
|
|
||||||
the driver. Versions of this driver for old kernels replace
|
|
||||||
usbhid instead of generic-usb. The way to scan for this file
|
|
||||||
has been chosen to provide a consistent way for all supported
|
|
||||||
kernel versions.
|
|
||||||
This file is readonly.
|
|
||||||
|
|
||||||
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile[1-5]
|
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile[1-5]
|
||||||
Date: March 2010
|
Date: March 2010
|
||||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||||
|
|
|
@ -1157,6 +1157,8 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
||||||
|
|
||||||
if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
|
if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
|
||||||
connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
|
connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
|
||||||
|
if (hdev->quirks & HID_QUIRK_HIDINPUT_FORCE)
|
||||||
|
connect_mask |= HID_CONNECT_HIDINPUT_FORCE;
|
||||||
if (hdev->bus != BUS_USB)
|
if (hdev->bus != BUS_USB)
|
||||||
connect_mask &= ~HID_CONNECT_HIDDEV;
|
connect_mask &= ~HID_CONNECT_HIDDEV;
|
||||||
if (hid_hiddev(hdev))
|
if (hid_hiddev(hdev))
|
||||||
|
|
|
@ -439,6 +439,9 @@
|
||||||
#define USB_VENDOR_ID_PHILIPS 0x0471
|
#define USB_VENDOR_ID_PHILIPS 0x0471
|
||||||
#define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
|
#define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_PI_ENGINEERING 0x05f3
|
||||||
|
#define USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL 0xff
|
||||||
|
|
||||||
#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
|
#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
|
||||||
#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
|
#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
|
||||||
|
|
||||||
|
@ -533,5 +536,4 @@
|
||||||
#define USB_VENDOR_ID_ZYDACRON 0x13EC
|
#define USB_VENDOR_ID_ZYDACRON 0x13EC
|
||||||
#define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006
|
#define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -199,11 +199,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||||
case HID_GD_MOUSE:
|
case HID_GD_MOUSE:
|
||||||
case HID_GD_POINTER: code += 0x110; break;
|
case HID_GD_POINTER: code += 0x110; break;
|
||||||
case HID_GD_JOYSTICK:
|
case HID_GD_JOYSTICK:
|
||||||
if (code <= 0xf)
|
if (code <= 0xf)
|
||||||
code += BTN_JOYSTICK;
|
code += BTN_JOYSTICK;
|
||||||
else
|
else
|
||||||
code += BTN_TRIGGER_HAPPY;
|
code += BTN_TRIGGER_HAPPY;
|
||||||
break;
|
break;
|
||||||
case HID_GD_GAMEPAD: code += 0x130; break;
|
case HID_GD_GAMEPAD: code += 0x130; break;
|
||||||
default:
|
default:
|
||||||
switch (field->physical) {
|
switch (field->physical) {
|
||||||
|
@ -589,9 +589,9 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||||
hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
|
hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
|
||||||
if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
|
if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
|
||||||
input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x);
|
input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x);
|
||||||
input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
|
input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */
|
if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */
|
||||||
*quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
|
*quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
|
||||||
|
|
|
@ -30,6 +30,21 @@ static bool emulate_scroll_wheel = true;
|
||||||
module_param(emulate_scroll_wheel, bool, 0644);
|
module_param(emulate_scroll_wheel, bool, 0644);
|
||||||
MODULE_PARM_DESC(emulate_scroll_wheel, "Emulate a scroll wheel");
|
MODULE_PARM_DESC(emulate_scroll_wheel, "Emulate a scroll wheel");
|
||||||
|
|
||||||
|
static unsigned int scroll_speed = 32;
|
||||||
|
static int param_set_scroll_speed(const char *val, struct kernel_param *kp) {
|
||||||
|
unsigned long speed;
|
||||||
|
if (!val || strict_strtoul(val, 0, &speed) || speed > 63)
|
||||||
|
return -EINVAL;
|
||||||
|
scroll_speed = speed;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
module_param_call(scroll_speed, param_set_scroll_speed, param_get_uint, &scroll_speed, 0644);
|
||||||
|
MODULE_PARM_DESC(scroll_speed, "Scroll speed, value from 0 (slow) to 63 (fast)");
|
||||||
|
|
||||||
|
static bool scroll_acceleration = false;
|
||||||
|
module_param(scroll_acceleration, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(scroll_acceleration, "Accelerate sequential scroll events");
|
||||||
|
|
||||||
static bool report_touches = true;
|
static bool report_touches = true;
|
||||||
module_param(report_touches, bool, 0644);
|
module_param(report_touches, bool, 0644);
|
||||||
MODULE_PARM_DESC(report_touches, "Emit touch records (otherwise, only use them for emulation)");
|
MODULE_PARM_DESC(report_touches, "Emit touch records (otherwise, only use them for emulation)");
|
||||||
|
@ -50,6 +65,8 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
|
||||||
#define TOUCH_STATE_START 0x30
|
#define TOUCH_STATE_START 0x30
|
||||||
#define TOUCH_STATE_DRAG 0x40
|
#define TOUCH_STATE_DRAG 0x40
|
||||||
|
|
||||||
|
#define SCROLL_ACCEL_DEFAULT 7
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct magicmouse_sc - Tracks Magic Mouse-specific data.
|
* struct magicmouse_sc - Tracks Magic Mouse-specific data.
|
||||||
* @input: Input device through which we report events.
|
* @input: Input device through which we report events.
|
||||||
|
@ -78,8 +95,10 @@ struct magicmouse_sc {
|
||||||
struct {
|
struct {
|
||||||
short x;
|
short x;
|
||||||
short y;
|
short y;
|
||||||
|
short scroll_x;
|
||||||
short scroll_y;
|
short scroll_y;
|
||||||
u8 size;
|
u8 size;
|
||||||
|
u8 down;
|
||||||
} touches[16];
|
} touches[16];
|
||||||
int tracking_ids[16];
|
int tracking_ids[16];
|
||||||
};
|
};
|
||||||
|
@ -141,7 +160,7 @@ static void magicmouse_emit_buttons(struct magicmouse_sc *msc, int state)
|
||||||
input_report_key(msc->input, BTN_RIGHT, state & 2);
|
input_report_key(msc->input, BTN_RIGHT, state & 2);
|
||||||
|
|
||||||
if (state != last_state)
|
if (state != last_state)
|
||||||
msc->scroll_accel = 0;
|
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tdata)
|
static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tdata)
|
||||||
|
@ -152,6 +171,7 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
|
||||||
int id = (misc >> 6) & 15;
|
int id = (misc >> 6) & 15;
|
||||||
int x = x_y << 12 >> 20;
|
int x = x_y << 12 >> 20;
|
||||||
int y = -(x_y >> 20);
|
int y = -(x_y >> 20);
|
||||||
|
int down = (tdata[7] & TOUCH_STATE_MASK) != TOUCH_STATE_NONE;
|
||||||
|
|
||||||
/* Store tracking ID and other fields. */
|
/* Store tracking ID and other fields. */
|
||||||
msc->tracking_ids[raw_id] = id;
|
msc->tracking_ids[raw_id] = id;
|
||||||
|
@ -160,42 +180,54 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
|
||||||
msc->touches[id].size = misc & 63;
|
msc->touches[id].size = misc & 63;
|
||||||
|
|
||||||
/* If requested, emulate a scroll wheel by detecting small
|
/* If requested, emulate a scroll wheel by detecting small
|
||||||
* vertical touch motions along the middle of the mouse.
|
* vertical touch motions.
|
||||||
*/
|
*/
|
||||||
if (emulate_scroll_wheel &&
|
if (emulate_scroll_wheel) {
|
||||||
middle_button_start < x && x < middle_button_stop) {
|
|
||||||
static const int accel_profile[] = {
|
|
||||||
256, 228, 192, 160, 128, 96, 64, 32,
|
|
||||||
};
|
|
||||||
unsigned long now = jiffies;
|
unsigned long now = jiffies;
|
||||||
int step = msc->touches[id].scroll_y - y;
|
int step_x = msc->touches[id].scroll_x - x;
|
||||||
|
int step_y = msc->touches[id].scroll_y - y;
|
||||||
/* Reset acceleration after half a second. */
|
|
||||||
if (time_after(now, msc->scroll_jiffies + HZ / 2))
|
|
||||||
msc->scroll_accel = 0;
|
|
||||||
|
|
||||||
/* Calculate and apply the scroll motion. */
|
/* Calculate and apply the scroll motion. */
|
||||||
switch (tdata[7] & TOUCH_STATE_MASK) {
|
switch (tdata[7] & TOUCH_STATE_MASK) {
|
||||||
case TOUCH_STATE_START:
|
case TOUCH_STATE_START:
|
||||||
|
msc->touches[id].scroll_x = x;
|
||||||
msc->touches[id].scroll_y = y;
|
msc->touches[id].scroll_y = y;
|
||||||
msc->scroll_accel = min_t(int, msc->scroll_accel + 1,
|
|
||||||
ARRAY_SIZE(accel_profile) - 1);
|
/* Reset acceleration after half a second. */
|
||||||
|
if (scroll_acceleration && time_before(now,
|
||||||
|
msc->scroll_jiffies + HZ / 2))
|
||||||
|
msc->scroll_accel = max_t(int,
|
||||||
|
msc->scroll_accel - 1, 1);
|
||||||
|
else
|
||||||
|
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TOUCH_STATE_DRAG:
|
case TOUCH_STATE_DRAG:
|
||||||
step = step / accel_profile[msc->scroll_accel];
|
step_x /= (64 - (int)scroll_speed) * msc->scroll_accel;
|
||||||
if (step != 0) {
|
if (step_x != 0) {
|
||||||
msc->touches[id].scroll_y = y;
|
msc->touches[id].scroll_x -= step_x *
|
||||||
|
(64 - scroll_speed) * msc->scroll_accel;
|
||||||
msc->scroll_jiffies = now;
|
msc->scroll_jiffies = now;
|
||||||
input_report_rel(input, REL_WHEEL, step);
|
input_report_rel(input, REL_HWHEEL, -step_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
step_y /= (64 - (int)scroll_speed) * msc->scroll_accel;
|
||||||
|
if (step_y != 0) {
|
||||||
|
msc->touches[id].scroll_y -= step_y *
|
||||||
|
(64 - scroll_speed) * msc->scroll_accel;
|
||||||
|
msc->scroll_jiffies = now;
|
||||||
|
input_report_rel(input, REL_WHEEL, step_y);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate the input events for this touch. */
|
/* Generate the input events for this touch. */
|
||||||
if (report_touches) {
|
if (report_touches && down) {
|
||||||
int orientation = (misc >> 10) - 32;
|
int orientation = (misc >> 10) - 32;
|
||||||
|
|
||||||
|
msc->touches[id].down = 1;
|
||||||
|
|
||||||
input_report_abs(input, ABS_MT_TRACKING_ID, id);
|
input_report_abs(input, ABS_MT_TRACKING_ID, id);
|
||||||
input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
|
input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
|
||||||
input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]);
|
input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]);
|
||||||
|
@ -215,7 +247,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,
|
||||||
{
|
{
|
||||||
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
|
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
|
||||||
struct input_dev *input = msc->input;
|
struct input_dev *input = msc->input;
|
||||||
int x, y, ts, ii, clicks;
|
int x, y, ts, ii, clicks, last_up;
|
||||||
|
|
||||||
switch (data[0]) {
|
switch (data[0]) {
|
||||||
case 0x10:
|
case 0x10:
|
||||||
|
@ -235,12 +267,26 @@ static int magicmouse_raw_event(struct hid_device *hdev,
|
||||||
msc->ntouches = (size - 6) / 8;
|
msc->ntouches = (size - 6) / 8;
|
||||||
for (ii = 0; ii < msc->ntouches; ii++)
|
for (ii = 0; ii < msc->ntouches; ii++)
|
||||||
magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
|
magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
|
||||||
|
|
||||||
|
if (report_touches) {
|
||||||
|
last_up = 1;
|
||||||
|
for (ii = 0; ii < ARRAY_SIZE(msc->touches); ii++) {
|
||||||
|
if (msc->touches[ii].down) {
|
||||||
|
last_up = 0;
|
||||||
|
msc->touches[ii].down = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (last_up) {
|
||||||
|
input_mt_sync(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* When emulating three-button mode, it is important
|
/* When emulating three-button mode, it is important
|
||||||
* to have the current touch information before
|
* to have the current touch information before
|
||||||
* generating a click event.
|
* generating a click event.
|
||||||
*/
|
*/
|
||||||
x = (signed char)data[1];
|
x = (int)(((data[3] & 0x0c) << 28) | (data[1] << 22)) >> 22;
|
||||||
y = (signed char)data[2];
|
y = (int)(((data[3] & 0x30) << 26) | (data[2] << 22)) >> 22;
|
||||||
clicks = data[3];
|
clicks = data[3];
|
||||||
break;
|
break;
|
||||||
case 0x20: /* Theoretically battery status (0-100), but I have
|
case 0x20: /* Theoretically battery status (0-100), but I have
|
||||||
|
@ -301,8 +347,10 @@ static void magicmouse_setup_input(struct input_dev *input, struct hid_device *h
|
||||||
__set_bit(EV_REL, input->evbit);
|
__set_bit(EV_REL, input->evbit);
|
||||||
__set_bit(REL_X, input->relbit);
|
__set_bit(REL_X, input->relbit);
|
||||||
__set_bit(REL_Y, input->relbit);
|
__set_bit(REL_Y, input->relbit);
|
||||||
if (emulate_scroll_wheel)
|
if (emulate_scroll_wheel) {
|
||||||
__set_bit(REL_WHEEL, input->relbit);
|
__set_bit(REL_WHEEL, input->relbit);
|
||||||
|
__set_bit(REL_HWHEEL, input->relbit);
|
||||||
|
}
|
||||||
|
|
||||||
if (report_touches) {
|
if (report_touches) {
|
||||||
__set_bit(EV_ABS, input->evbit);
|
__set_bit(EV_ABS, input->evbit);
|
||||||
|
@ -345,6 +393,8 @@ static int magicmouse_probe(struct hid_device *hdev,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
|
||||||
|
|
||||||
msc->quirks = id->driver_data;
|
msc->quirks = id->driver_data;
|
||||||
hid_set_drvdata(hdev, msc);
|
hid_set_drvdata(hdev, msc);
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,6 @@
|
||||||
* Is it possible to remove and reinstall the urb in raw-event- or any
|
* Is it possible to remove and reinstall the urb in raw-event- or any
|
||||||
* other handler, or to defer this action to be executed somewhere else?
|
* other handler, or to defer this action to be executed somewhere else?
|
||||||
*
|
*
|
||||||
* TODO implement notification mechanism for overlong macro execution
|
|
||||||
* If user wants to execute an overlong macro only the names of macroset
|
|
||||||
* and macro are given. Should userland tap hidraw or is there an
|
|
||||||
* additional streaming mechanism?
|
|
||||||
*
|
|
||||||
* TODO is it possible to overwrite group for sysfs attributes via udev?
|
* TODO is it possible to overwrite group for sysfs attributes via udev?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -277,7 +272,7 @@ static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj,
|
||||||
count = sizeof(struct kone_settings) - off;
|
count = sizeof(struct kone_settings) - off;
|
||||||
|
|
||||||
mutex_lock(&kone->kone_lock);
|
mutex_lock(&kone->kone_lock);
|
||||||
memcpy(buf, &kone->settings + off, count);
|
memcpy(buf, ((char const *)&kone->settings) + off, count);
|
||||||
mutex_unlock(&kone->kone_lock);
|
mutex_unlock(&kone->kone_lock);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
|
@ -337,7 +332,7 @@ static ssize_t kone_sysfs_read_profilex(struct kobject *kobj,
|
||||||
count = sizeof(struct kone_profile) - off;
|
count = sizeof(struct kone_profile) - off;
|
||||||
|
|
||||||
mutex_lock(&kone->kone_lock);
|
mutex_lock(&kone->kone_lock);
|
||||||
memcpy(buf, &kone->profiles[number - 1], sizeof(struct kone_profile));
|
memcpy(buf, ((char const *)&kone->profiles[number - 1]) + off, count);
|
||||||
mutex_unlock(&kone->kone_lock);
|
mutex_unlock(&kone->kone_lock);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
|
@ -622,18 +617,6 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev,
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is used by userland software to find devices that are handled by
|
|
||||||
* this driver. This provides a consistent way for actual and older kernels
|
|
||||||
* where this driver replaced usbhid instead of generic-usb.
|
|
||||||
* Driver capabilities are determined by version number.
|
|
||||||
*/
|
|
||||||
static ssize_t kone_sysfs_show_driver_version(struct device *dev,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, ROCCAT_KONE_DRIVER_VERSION "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read actual dpi settings.
|
* Read actual dpi settings.
|
||||||
* Returns raw value for further processing. Refer to enum kone_polling_rates to
|
* Returns raw value for further processing. Refer to enum kone_polling_rates to
|
||||||
|
@ -671,9 +654,6 @@ static DEVICE_ATTR(startup_profile, 0660,
|
||||||
kone_sysfs_show_startup_profile,
|
kone_sysfs_show_startup_profile,
|
||||||
kone_sysfs_set_startup_profile);
|
kone_sysfs_set_startup_profile);
|
||||||
|
|
||||||
static DEVICE_ATTR(kone_driver_version, 0440,
|
|
||||||
kone_sysfs_show_driver_version, NULL);
|
|
||||||
|
|
||||||
static struct attribute *kone_attributes[] = {
|
static struct attribute *kone_attributes[] = {
|
||||||
&dev_attr_actual_dpi.attr,
|
&dev_attr_actual_dpi.attr,
|
||||||
&dev_attr_actual_profile.attr,
|
&dev_attr_actual_profile.attr,
|
||||||
|
@ -681,7 +661,6 @@ static struct attribute *kone_attributes[] = {
|
||||||
&dev_attr_firmware_version.attr,
|
&dev_attr_firmware_version.attr,
|
||||||
&dev_attr_tcu.attr,
|
&dev_attr_tcu.attr,
|
||||||
&dev_attr_startup_profile.attr,
|
&dev_attr_startup_profile.attr,
|
||||||
&dev_attr_kone_driver_version.attr,
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,6 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#define ROCCAT_KONE_DRIVER_VERSION "v0.3.1"
|
|
||||||
|
|
||||||
#pragma pack(push)
|
#pragma pack(push)
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,7 @@ static int roccat_open(struct inode *inode, struct file *file)
|
||||||
printk(KERN_EMERG "roccat device with minor %d doesn't exist\n",
|
printk(KERN_EMERG "roccat device with minor %d doesn't exist\n",
|
||||||
minor);
|
minor);
|
||||||
error = -ENODEV;
|
error = -ENODEV;
|
||||||
goto exit_unlock;
|
goto exit_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!device->open++) {
|
if (!device->open++) {
|
||||||
|
@ -178,7 +178,7 @@ static int roccat_open(struct inode *inode, struct file *file)
|
||||||
PM_HINT_FULLON);
|
PM_HINT_FULLON);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
--device->open;
|
--device->open;
|
||||||
goto exit_unlock;
|
goto exit_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
error = device->hid->ll_driver->open(device->hid);
|
error = device->hid->ll_driver->open(device->hid);
|
||||||
|
@ -187,7 +187,7 @@ static int roccat_open(struct inode *inode, struct file *file)
|
||||||
device->hid->ll_driver->power(device->hid,
|
device->hid->ll_driver->power(device->hid,
|
||||||
PM_HINT_NORMAL);
|
PM_HINT_NORMAL);
|
||||||
--device->open;
|
--device->open;
|
||||||
goto exit_unlock;
|
goto exit_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +202,9 @@ exit_unlock:
|
||||||
mutex_unlock(&device->readers_lock);
|
mutex_unlock(&device->readers_lock);
|
||||||
mutex_unlock(&devices_lock);
|
mutex_unlock(&devices_lock);
|
||||||
return error;
|
return error;
|
||||||
|
exit_err:
|
||||||
|
kfree(reader);
|
||||||
|
goto exit_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int roccat_release(struct inode *inode, struct file *file)
|
static int roccat_release(struct inode *inode, struct file *file)
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <linux/hid.h>
|
#include <linux/hid.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#if defined(CONFIG_HID_ROCCAT) || defined (CONFIG_HID_ROCCAT_MODULE)
|
#if defined(CONFIG_HID_ROCCAT) || defined(CONFIG_HID_ROCCAT_MODULE)
|
||||||
int roccat_connect(struct hid_device *hid);
|
int roccat_connect(struct hid_device *hid);
|
||||||
void roccat_disconnect(int minor);
|
void roccat_disconnect(int minor);
|
||||||
int roccat_report_event(int minor, u8 const *data, int len);
|
int roccat_report_event(int minor, u8 const *data, int len);
|
||||||
|
|
|
@ -75,6 +75,8 @@ static const struct hid_blacklist {
|
||||||
{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||||
{ USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||||
|
|
||||||
|
{ USB_VENDOR_ID_PI_ENGINEERING, USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL, HID_QUIRK_HIDINPUT_FORCE },
|
||||||
|
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -311,6 +311,7 @@ struct hid_item {
|
||||||
#define HID_QUIRK_HIDDEV_FORCE 0x00000010
|
#define HID_QUIRK_HIDDEV_FORCE 0x00000010
|
||||||
#define HID_QUIRK_BADPAD 0x00000020
|
#define HID_QUIRK_BADPAD 0x00000020
|
||||||
#define HID_QUIRK_MULTI_INPUT 0x00000040
|
#define HID_QUIRK_MULTI_INPUT 0x00000040
|
||||||
|
#define HID_QUIRK_HIDINPUT_FORCE 0x00000080
|
||||||
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
|
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
|
||||||
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
|
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
|
||||||
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
|
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue