Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- a/drivers/hid/hid-core.c 2010-08-01 18:11:14.000000000 -0400
- +++ b/drivers/hid/hid-core.c 2010-09-02 16:13:18.723462269 -0400
- @@ -1239,10 +1241,14 @@
- { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
- { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
- { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
- +#if defined(CONFIG_HID_ACRUX_FF) || defined(CONFIG_HID_ACRUX_FF_MODULE)
- + { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
- +#endif
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
- + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
- --- a/drivers/hid/hid-ids.h 2010-08-01 18:11:14.000000000 -0400
- +++ b/drivers/hid/hid-ids.h 2010-09-02 16:13:18.853443470 -0400
- @@ -61,6 +63,7 @@
- #define USB_VENDOR_ID_APPLE 0x05ac
- #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
- #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d
- +#define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e
- #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e
- #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f
- #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214
- --- a/drivers/hid/hid-magicmouse.c 2010-08-01 18:11:14.000000000 -0400
- +++ b/drivers/hid/hid-magicmouse.c 2010-09-02 16:13:19.103407323 -0400
- @@ -2,6 +2,7 @@
- * Apple "Magic" Wireless Mouse driver
- *
- * Copyright (c) 2010 Michael Poole <mdpoole@troilus.org>
- + * Copyright (c) 2010 Chase Douglas <chase.douglas@xxxxxxxxxxxxx>
- */
- /*
- @@ -30,6 +31,21 @@
- module_param(emulate_scroll_wheel, bool, 0644);
- 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;
- module_param(report_touches, bool, 0644);
- MODULE_PARM_DESC(report_touches, "Emit touch records (otherwise, only use them for emulation)");
- @@ -38,7 +54,9 @@
- module_param(report_undeciphered, bool, 0644);
- MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state field using a MSC_RAW event");
- -#define TOUCH_REPORT_ID 0x29
- +#define TRACKPAD_REPORT_ID 0x28
- +#define MOUSE_REPORT_ID 0x29
- +#define DOUBLE_REPORT_ID 0xf7
- /* These definitions are not precise, but they're close enough. (Bits
- * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70 seem
- * to be some kind of bit mask -- 0x20 may be a near-field reading,
- @@ -50,15 +68,21 @@
- #define TOUCH_STATE_START 0x30
- #define TOUCH_STATE_DRAG 0x40
- +#define SCROLL_ACCEL_DEFAULT 7
- +
- +/* Single touch emulation should only begin when no touches are currently down.
- + * This is true when single_touch_id is equal to NO_TOUCHES. If multiple touches
- + * are down and the touch providing for single touch emulation is lifted,
- + * single_touch_id is equal to SINGLE_TOUCH_UP. While single touch emulation is
- + * occuring, single_touch_id corresponds with the tracking id of the touch used.
- + */
- +#define NO_TOUCHES -1
- +#define SINGLE_TOUCH_UP -2
- +
- /**
- * struct magicmouse_sc - Tracks Magic Mouse-specific data.
- * @input: Input device through which we report events.
- * @quirks: Currently unused.
- - * @last_timestamp: Timestamp from most recent (18-bit) touch report
- - * (units of milliseconds over short windows, but seems to
- - * increase faster when there are no touches).
- - * @delta_time: 18-bit difference between the two most recent touch
- - * reports from the mouse.
- * @ntouches: Number of touches in most recent touch report.
- * @scroll_accel: Number of consecutive scroll motions.
- * @scroll_jiffies: Time of last scroll motion.
- @@ -69,8 +93,6 @@
- struct input_dev *input;
- unsigned long quirks;
- - int last_timestamp;
- - int delta_time;
- int ntouches;
- int scroll_accel;
- unsigned long scroll_jiffies;
- @@ -78,10 +100,12 @@
- struct {
- short x;
- short y;
- + short scroll_x;
- short scroll_y;
- u8 size;
- } touches[16];
- int tracking_ids[16];
- + int single_touch_id;
- };
- static int magicmouse_firm_touch(struct magicmouse_sc *msc)
- @@ -141,70 +165,107 @@
- input_report_key(msc->input, BTN_RIGHT, state & 2);
- 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)
- {
- struct input_dev *input = msc->input;
- - __s32 x_y = tdata[0] << 8 | tdata[1] << 16 | tdata[2] << 24;
- - int misc = tdata[5] | tdata[6] << 8;
- - int id = (misc >> 6) & 15;
- - int x = x_y << 12 >> 20;
- - int y = -(x_y >> 20);
- + int id, x, y, size, orientation, touch_major, touch_minor, state, down;
- +
- + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
- + id = (tdata[6] << 2 | tdata[5] >> 6) & 0xf;
- + x = (tdata[1] << 28 | tdata[0] << 20) >> 20;
- + y = -((tdata[2] << 24 | tdata[1] << 16) >> 20);
- + size = tdata[5] & 0x3f;
- + orientation = (tdata[6] >> 2) - 32;
- + touch_major = tdata[3];
- + touch_minor = tdata[4];
- + state = tdata[7] & TOUCH_STATE_MASK;
- + down = state != TOUCH_STATE_NONE;
- + } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + id = (tdata[7] << 2 | tdata[6] >> 6) & 0xf;
- + x = (tdata[1] << 27 | tdata[0] << 19) >> 19;
- + y = -((tdata[3] << 30 | tdata[2] << 22 | tdata[1] << 14) >> 19);
- + size = tdata[6] & 0x3f;
- + orientation = (tdata[7] >> 2) - 32;
- + touch_major = tdata[4];
- + touch_minor = tdata[5];
- + state = tdata[8] & TOUCH_STATE_MASK;
- + down = state != TOUCH_STATE_NONE;
- + }
- /* Store tracking ID and other fields. */
- msc->tracking_ids[raw_id] = id;
- msc->touches[id].x = x;
- msc->touches[id].y = y;
- - msc->touches[id].size = misc & 63;
- + msc->touches[id].size = size;
- /* 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 &&
- - middle_button_start < x && x < middle_button_stop) {
- - static const int accel_profile[] = {
- - 256, 228, 192, 160, 128, 96, 64, 32,
- - };
- + if (emulate_scroll_wheel) {
- unsigned long now = jiffies;
- - int step = 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;
- + int step_x = msc->touches[id].scroll_x - x;
- + int step_y = msc->touches[id].scroll_y - y;
- /* Calculate and apply the scroll motion. */
- - switch (tdata[7] & TOUCH_STATE_MASK) {
- + switch (state) {
- case TOUCH_STATE_START:
- + msc->touches[id].scroll_x = x;
- 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;
- case TOUCH_STATE_DRAG:
- - step = step / accel_profile[msc->scroll_accel];
- - if (step != 0) {
- - msc->touches[id].scroll_y = y;
- + step_x /= (64 - (int)scroll_speed) * msc->scroll_accel;
- + if (step_x != 0) {
- + msc->touches[id].scroll_x -= step_x *
- + (64 - scroll_speed) * msc->scroll_accel;
- 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;
- }
- }
- - /* Generate the input events for this touch. */
- - if (report_touches) {
- - int orientation = (misc >> 10) - 32;
- + if (down) {
- + msc->ntouches++;
- + if (msc->single_touch_id == NO_TOUCHES)
- + msc->single_touch_id = id;
- + } else if (msc->single_touch_id == id)
- + msc->single_touch_id = SINGLE_TOUCH_UP;
- + /* Generate the input events for this touch. */
- + if (report_touches && down) {
- 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_MINOR, tdata[4]);
- + input_report_abs(input, ABS_MT_TOUCH_MAJOR, touch_major << 2);
- + input_report_abs(input, ABS_MT_TOUCH_MINOR, touch_minor << 2);
- input_report_abs(input, ABS_MT_ORIENTATION, orientation);
- input_report_abs(input, ABS_MT_POSITION_X, x);
- input_report_abs(input, ABS_MT_POSITION_Y, y);
- - if (report_undeciphered)
- - input_event(input, EV_MSC, MSC_RAW, tdata[7]);
- + if (report_undeciphered) {
- + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE)
- + input_event(input, EV_MSC, MSC_RAW, tdata[7]);
- + else /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + input_event(input, EV_MSC, MSC_RAW, tdata[8]);
- + }
- input_mt_sync(input);
- }
- @@ -215,7 +276,7 @@
- {
- struct magicmouse_sc *msc = hid_get_drvdata(hdev);
- struct input_dev *input = msc->input;
- - int x, y, ts, ii, clicks;
- + int x = 0, y = 0, ii, clicks = 0, npoints;
- switch (data[0]) {
- case 0x10:
- @@ -225,23 +286,62 @@
- y = (__s16)(data[4] | data[5] << 8);
- clicks = data[1];
- break;
- - case TOUCH_REPORT_ID:
- + case TRACKPAD_REPORT_ID:
- + /* Expect four bytes of prefix, and N*9 bytes of touch data. */
- + if (size < 4 || ((size - 4) % 9) != 0)
- + return 0;
- + npoints = (size - 4) / 9;
- + msc->ntouches = 0;
- + for (ii = 0; ii < npoints; ii++)
- + magicmouse_emit_touch(msc, ii, data + ii * 9 + 4);
- +
- + /* We don't need an MT sync here because trackpad emits a
- + * BTN_TOUCH event in a new frame when all touches are released.
- + */
- + if (msc->ntouches == 0)
- + msc->single_touch_id = NO_TOUCHES;
- +
- + clicks = data[1];
- +
- + /* The following bits provide a device specific timestamp. They
- + * are unused here.
- + *
- + * ts = data[1] >> 6 | data[2] << 2 | data[3] << 10;
- + */
- + break;
- + case MOUSE_REPORT_ID:
- /* Expect six bytes of prefix, and N*8 bytes of touch data. */
- if (size < 6 || ((size - 6) % 8) != 0)
- return 0;
- - ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
- - msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff;
- - msc->last_timestamp = ts;
- - msc->ntouches = (size - 6) / 8;
- - for (ii = 0; ii < msc->ntouches; ii++)
- + npoints = (size - 6) / 8;
- + msc->ntouches = 0;
- + for (ii = 0; ii < npoints; ii++)
- magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
- +
- + if (report_touches && msc->ntouches == 0)
- + input_mt_sync(input);
- +
- /* When emulating three-button mode, it is important
- * to have the current touch information before
- * generating a click event.
- */
- - x = (signed char)data[1];
- - y = (signed char)data[2];
- + x = (int)(((data[3] & 0x0c) << 28) | (data[1] << 22)) >> 22;
- + y = (int)(((data[3] & 0x30) << 26) | (data[2] << 22)) >> 22;
- clicks = data[3];
- +
- + /* The following bits provide a device specific timestamp. They
- + * are unused here.
- + *
- + * ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
- + */
- + break;
- + case DOUBLE_REPORT_ID:
- + /* Sometimes the trackpad sends two touch reports in one
- + * packet.
- + */
- + magicmouse_raw_event(hdev, report, data + 2, data[1]);
- + magicmouse_raw_event(hdev, report, data + 2 + data[1],
- + size - 2 - data[1]);
- break;
- case 0x20: /* Theoretically battery status (0-100), but I have
- * never seen it -- maybe it is only upon request.
- @@ -254,9 +354,25 @@
- return 0;
- }
- - magicmouse_emit_buttons(msc, clicks & 3);
- - input_report_rel(input, REL_X, x);
- - input_report_rel(input, REL_Y, y);
- + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
- + magicmouse_emit_buttons(msc, clicks & 3);
- + input_report_rel(input, REL_X, x);
- + input_report_rel(input, REL_Y, y);
- + } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + input_report_key(input, BTN_MOUSE, clicks & 1);
- + input_report_key(input, BTN_TOUCH, msc->ntouches > 0);
- + input_report_key(input, BTN_TOOL_FINGER, msc->ntouches == 1);
- + input_report_key(input, BTN_TOOL_DOUBLETAP, msc->ntouches == 2);
- + input_report_key(input, BTN_TOOL_TRIPLETAP, msc->ntouches == 3);
- + input_report_key(input, BTN_TOOL_QUADTAP, msc->ntouches == 4);
- + if (msc->single_touch_id >= 0) {
- + input_report_abs(input, ABS_X,
- + msc->touches[msc->single_touch_id].x);
- + input_report_abs(input, ABS_Y,
- + msc->touches[msc->single_touch_id].y);
- + }
- + }
- +
- input_sync(input);
- return 1;
- }
- @@ -292,17 +408,28 @@
- input->dev.parent = hdev->dev.parent;
- __set_bit(EV_KEY, input->evbit);
- - __set_bit(BTN_LEFT, input->keybit);
- - __set_bit(BTN_RIGHT, input->keybit);
- - if (emulate_3button)
- - __set_bit(BTN_MIDDLE, input->keybit);
- - __set_bit(BTN_TOOL_FINGER, input->keybit);
- -
- - __set_bit(EV_REL, input->evbit);
- - __set_bit(REL_X, input->relbit);
- - __set_bit(REL_Y, input->relbit);
- - if (emulate_scroll_wheel)
- - __set_bit(REL_WHEEL, input->relbit);
- +
- + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
- + __set_bit(BTN_LEFT, input->keybit);
- + __set_bit(BTN_RIGHT, input->keybit);
- + if (emulate_3button)
- + __set_bit(BTN_MIDDLE, input->keybit);
- +
- + __set_bit(EV_REL, input->evbit);
- + __set_bit(REL_X, input->relbit);
- + __set_bit(REL_Y, input->relbit);
- + if (emulate_scroll_wheel) {
- + __set_bit(REL_WHEEL, input->relbit);
- + __set_bit(REL_HWHEEL, input->relbit);
- + }
- + } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + __set_bit(BTN_MOUSE, input->keybit);
- + __set_bit(BTN_TOOL_FINGER, input->keybit);
- + __set_bit(BTN_TOOL_DOUBLETAP, input->keybit);
- + __set_bit(BTN_TOOL_TRIPLETAP, input->keybit);
- + __set_bit(BTN_TOOL_QUADTAP, input->keybit);
- + __set_bit(BTN_TOUCH, input->keybit);
- + }
- if (report_touches) {
- __set_bit(EV_ABS, input->evbit);
- @@ -311,16 +438,26 @@
- input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 4, 0);
- input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 255, 4, 0);
- input_set_abs_params(input, ABS_MT_ORIENTATION, -32, 31, 1, 0);
- - input_set_abs_params(input, ABS_MT_POSITION_X, -1100, 1358,
- - 4, 0);
- +
- /* Note: Touch Y position from the device is inverted relative
- * to how pointer motion is reported (and relative to how USB
- * HID recommends the coordinates work). This driver keeps
- * the origin at the same position, and just uses the additive
- * inverse of the reported Y.
- */
- - input_set_abs_params(input, ABS_MT_POSITION_Y, -1589, 2047,
- - 4, 0);
- + if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) {
- + input_set_abs_params(input, ABS_MT_POSITION_X, -1100,
- + 1358, 4, 0);
- + input_set_abs_params(input, ABS_MT_POSITION_Y, -1589,
- + 2047, 4, 0);
- + } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + input_set_abs_params(input, ABS_X, -2909, 3167, 4, 0);
- + input_set_abs_params(input, ABS_Y, -2456, 2565, 4, 0);
- + input_set_abs_params(input, ABS_MT_POSITION_X, -2909,
- + 3167, 4, 0);
- + input_set_abs_params(input, ABS_MT_POSITION_Y, -2456,
- + 2565, 4, 0);
- + }
- }
- if (report_undeciphered) {
- @@ -332,8 +469,7 @@
- static int magicmouse_probe(struct hid_device *hdev,
- const struct hid_device_id *id)
- {
- - __u8 feature_1[] = { 0xd7, 0x01 };
- - __u8 feature_2[] = { 0xf8, 0x01, 0x32 };
- + __u8 feature[] = { 0xd7, 0x01 };
- struct input_dev *input;
- struct magicmouse_sc *msc;
- struct hid_report *report;
- @@ -345,25 +481,43 @@
- return -ENOMEM;
- }
- + msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
- +
- msc->quirks = id->driver_data;
- hid_set_drvdata(hdev, msc);
- + msc->single_touch_id = NO_TOUCHES;
- +
- ret = hid_parse(hdev);
- if (ret) {
- dev_err(&hdev->dev, "magicmouse hid parse failed\n");
- goto err_free;
- }
- - ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
- + /* When registering a hid device, one of hidinput, hidraw, or hiddev
- + * subsystems must claim the device. We are bypassing hidinput due to
- + * our raw event processing, and hidraw and hiddev may not claim the
- + * device. We get around this by telling hid_hw_start that input has
- + * claimed the device already, and then flipping the bit back.
- + */
- + hdev->claimed = HID_CLAIMED_INPUT;
- + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_HIDINPUT);
- + hdev->claimed &= ~HID_CLAIMED_INPUT;
- if (ret) {
- dev_err(&hdev->dev, "magicmouse hw start failed\n");
- goto err_free;
- }
- - /* we are handling the input ourselves */
- - hidinput_disconnect(hdev);
- + if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE)
- + report = hid_register_report(hdev, HID_INPUT_REPORT,
- + MOUSE_REPORT_ID);
- + else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */
- + report = hid_register_report(hdev, HID_INPUT_REPORT,
- + TRACKPAD_REPORT_ID);
- + report = hid_register_report(hdev, HID_INPUT_REPORT,
- + DOUBLE_REPORT_ID);
- + }
- - report = hid_register_report(hdev, HID_INPUT_REPORT, TOUCH_REPORT_ID);
- if (!report) {
- dev_err(&hdev->dev, "unable to register touch report\n");
- ret = -ENOMEM;
- @@ -371,17 +525,10 @@
- }
- report->size = 6;
- - ret = hdev->hid_output_raw_report(hdev, feature_1, sizeof(feature_1),
- + ret = hdev->hid_output_raw_report(hdev, feature, sizeof(feature),
- HID_FEATURE_REPORT);
- - if (ret != sizeof(feature_1)) {
- - dev_err(&hdev->dev, "unable to request touch data (1:%d)\n",
- - ret);
- - goto err_stop_hw;
- - }
- - ret = hdev->hid_output_raw_report(hdev, feature_2,
- - sizeof(feature_2), HID_FEATURE_REPORT);
- - if (ret != sizeof(feature_2)) {
- - dev_err(&hdev->dev, "unable to request touch data (2:%d)\n",
- + if (ret != sizeof(feature)) {
- + dev_err(&hdev->dev, "unable to request touch data (%d)\n",
- ret);
- goto err_stop_hw;
- }
- @@ -421,8 +568,10 @@
- }
- static const struct hid_device_id magic_mice[] = {
- - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE),
- - .driver_data = 0 },
- + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
- + USB_DEVICE_ID_APPLE_MAGICMOUSE), .driver_data = 0 },
- + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
- + USB_DEVICE_ID_APPLE_MAGICTRACKPAD), .driver_data = 0 },
- { }
- };
- MODULE_DEVICE_TABLE(hid, magic_mice);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement