Loading drivers/hid/hid-apple.c +13 −8 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ #define APPLE_FLAG_TB_FKEY BIT(1) #define HID_COUNTRY_INTERNATIONAL_ISO 13 #define APPLE_BATTERY_TIMEOUT_MS 60000 #define APPLE_BATTERY_TIMEOUT_SEC 60 #define HID_USAGE_MAGIC_BL 0xff00000f #define APPLE_MAGIC_REPORT_ID_POWER 3 Loading Loading @@ -645,7 +645,7 @@ static void apple_battery_timer_tick(struct timer_list *t) if (apple_fetch_battery(hdev) == 0) { mod_timer(&asc->battery_timer, jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); } } Loading Loading @@ -960,10 +960,12 @@ static int apple_probe(struct hid_device *hdev, return ret; } if (quirks & APPLE_RDESC_BATTERY) { timer_setup(&asc->battery_timer, apple_battery_timer_tick, 0); mod_timer(&asc->battery_timer, jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); apple_fetch_battery(hdev); } if (quirks & APPLE_BACKLIGHT_CTL) apple_backlight_init(hdev); Loading @@ -977,7 +979,9 @@ static int apple_probe(struct hid_device *hdev, return 0; out_err: if (quirks & APPLE_RDESC_BATTERY) timer_delete_sync(&asc->battery_timer); hid_hw_stop(hdev); return ret; } Loading @@ -986,6 +990,7 @@ static void apple_remove(struct hid_device *hdev) { struct apple_sc *asc = hid_get_drvdata(hdev); if (asc->quirks & APPLE_RDESC_BATTERY) timer_delete_sync(&asc->battery_timer); hid_hw_stop(hdev); Loading drivers/hid/hid-magicmouse.c +41 −25 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie #define MOUSE_REPORT_ID 0x29 #define MOUSE2_REPORT_ID 0x12 #define DOUBLE_REPORT_ID 0xf7 #define USB_BATTERY_TIMEOUT_MS 60000 #define USB_BATTERY_TIMEOUT_SEC 60 /* These definitions are not precise, but they're close enough. (Bits * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70 seem Loading Loading @@ -791,17 +791,31 @@ static void magicmouse_enable_mt_work(struct work_struct *work) hid_err(msc->hdev, "unable to request touch data (%d)\n", ret); } static bool is_usb_magicmouse2(__u32 vendor, __u32 product) { if (vendor != USB_VENDOR_ID_APPLE) return false; return product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC; } static bool is_usb_magictrackpad2(__u32 vendor, __u32 product) { if (vendor != USB_VENDOR_ID_APPLE) return false; return product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC; } static int magicmouse_fetch_battery(struct hid_device *hdev) { #ifdef CONFIG_HID_BATTERY_STRENGTH struct hid_report_enum *report_enum; struct hid_report *report; if (!hdev->battery || hdev->vendor != USB_VENDOR_ID_APPLE || (hdev->product != USB_DEVICE_ID_APPLE_MAGICMOUSE2 && hdev->product != USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC && hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC)) if (!hdev->battery || (!is_usb_magicmouse2(hdev->vendor, hdev->product) && !is_usb_magictrackpad2(hdev->vendor, hdev->product))) return -1; report_enum = &hdev->report_enum[hdev->battery_report_type]; Loading @@ -827,7 +841,7 @@ static void magicmouse_battery_timer_tick(struct timer_list *t) if (magicmouse_fetch_battery(hdev) == 0) { mod_timer(&msc->battery_timer, jiffies + msecs_to_jiffies(USB_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(USB_BATTERY_TIMEOUT_SEC)); } } Loading Loading @@ -863,17 +877,17 @@ static int magicmouse_probe(struct hid_device *hdev, return ret; } if (is_usb_magicmouse2(id->vendor, id->product) || is_usb_magictrackpad2(id->vendor, id->product)) { timer_setup(&msc->battery_timer, magicmouse_battery_timer_tick, 0); mod_timer(&msc->battery_timer, jiffies + msecs_to_jiffies(USB_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(USB_BATTERY_TIMEOUT_SEC)); magicmouse_fetch_battery(hdev); } if (id->vendor == USB_VENDOR_ID_APPLE && (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || ((id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && hdev->type != HID_TYPE_USBMOUSE))) if (is_usb_magicmouse2(id->vendor, id->product) || (is_usb_magictrackpad2(id->vendor, id->product) && hdev->type != HID_TYPE_USBMOUSE)) return 0; if (!msc->input) { Loading Loading @@ -936,7 +950,10 @@ static int magicmouse_probe(struct hid_device *hdev, return 0; err_stop_hw: if (is_usb_magicmouse2(id->vendor, id->product) || is_usb_magictrackpad2(id->vendor, id->product)) timer_delete_sync(&msc->battery_timer); hid_hw_stop(hdev); return ret; } Loading @@ -947,6 +964,8 @@ static void magicmouse_remove(struct hid_device *hdev) if (msc) { cancel_delayed_work_sync(&msc->work); if (is_usb_magicmouse2(hdev->vendor, hdev->product) || is_usb_magictrackpad2(hdev->vendor, hdev->product)) timer_delete_sync(&msc->battery_timer); } Loading @@ -964,11 +983,8 @@ static const __u8 *magicmouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, * 0x05, 0x01, // Usage Page (Generic Desktop) 0 * 0x09, 0x02, // Usage (Mouse) 2 */ if (hdev->vendor == USB_VENDOR_ID_APPLE && (hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && if ((is_usb_magicmouse2(hdev->vendor, hdev->product) || is_usb_magictrackpad2(hdev->vendor, hdev->product)) && *rsize == 83 && rdesc[46] == 0x84 && rdesc[58] == 0x85) { hid_info(hdev, "fixing up magicmouse battery report descriptor\n"); Loading Loading
drivers/hid/hid-apple.c +13 −8 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ #define APPLE_FLAG_TB_FKEY BIT(1) #define HID_COUNTRY_INTERNATIONAL_ISO 13 #define APPLE_BATTERY_TIMEOUT_MS 60000 #define APPLE_BATTERY_TIMEOUT_SEC 60 #define HID_USAGE_MAGIC_BL 0xff00000f #define APPLE_MAGIC_REPORT_ID_POWER 3 Loading Loading @@ -645,7 +645,7 @@ static void apple_battery_timer_tick(struct timer_list *t) if (apple_fetch_battery(hdev) == 0) { mod_timer(&asc->battery_timer, jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); } } Loading Loading @@ -960,10 +960,12 @@ static int apple_probe(struct hid_device *hdev, return ret; } if (quirks & APPLE_RDESC_BATTERY) { timer_setup(&asc->battery_timer, apple_battery_timer_tick, 0); mod_timer(&asc->battery_timer, jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); apple_fetch_battery(hdev); } if (quirks & APPLE_BACKLIGHT_CTL) apple_backlight_init(hdev); Loading @@ -977,7 +979,9 @@ static int apple_probe(struct hid_device *hdev, return 0; out_err: if (quirks & APPLE_RDESC_BATTERY) timer_delete_sync(&asc->battery_timer); hid_hw_stop(hdev); return ret; } Loading @@ -986,6 +990,7 @@ static void apple_remove(struct hid_device *hdev) { struct apple_sc *asc = hid_get_drvdata(hdev); if (asc->quirks & APPLE_RDESC_BATTERY) timer_delete_sync(&asc->battery_timer); hid_hw_stop(hdev); Loading
drivers/hid/hid-magicmouse.c +41 −25 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie #define MOUSE_REPORT_ID 0x29 #define MOUSE2_REPORT_ID 0x12 #define DOUBLE_REPORT_ID 0xf7 #define USB_BATTERY_TIMEOUT_MS 60000 #define USB_BATTERY_TIMEOUT_SEC 60 /* These definitions are not precise, but they're close enough. (Bits * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70 seem Loading Loading @@ -791,17 +791,31 @@ static void magicmouse_enable_mt_work(struct work_struct *work) hid_err(msc->hdev, "unable to request touch data (%d)\n", ret); } static bool is_usb_magicmouse2(__u32 vendor, __u32 product) { if (vendor != USB_VENDOR_ID_APPLE) return false; return product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC; } static bool is_usb_magictrackpad2(__u32 vendor, __u32 product) { if (vendor != USB_VENDOR_ID_APPLE) return false; return product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC; } static int magicmouse_fetch_battery(struct hid_device *hdev) { #ifdef CONFIG_HID_BATTERY_STRENGTH struct hid_report_enum *report_enum; struct hid_report *report; if (!hdev->battery || hdev->vendor != USB_VENDOR_ID_APPLE || (hdev->product != USB_DEVICE_ID_APPLE_MAGICMOUSE2 && hdev->product != USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC && hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && hdev->product != USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC)) if (!hdev->battery || (!is_usb_magicmouse2(hdev->vendor, hdev->product) && !is_usb_magictrackpad2(hdev->vendor, hdev->product))) return -1; report_enum = &hdev->report_enum[hdev->battery_report_type]; Loading @@ -827,7 +841,7 @@ static void magicmouse_battery_timer_tick(struct timer_list *t) if (magicmouse_fetch_battery(hdev) == 0) { mod_timer(&msc->battery_timer, jiffies + msecs_to_jiffies(USB_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(USB_BATTERY_TIMEOUT_SEC)); } } Loading Loading @@ -863,17 +877,17 @@ static int magicmouse_probe(struct hid_device *hdev, return ret; } if (is_usb_magicmouse2(id->vendor, id->product) || is_usb_magictrackpad2(id->vendor, id->product)) { timer_setup(&msc->battery_timer, magicmouse_battery_timer_tick, 0); mod_timer(&msc->battery_timer, jiffies + msecs_to_jiffies(USB_BATTERY_TIMEOUT_MS)); jiffies + secs_to_jiffies(USB_BATTERY_TIMEOUT_SEC)); magicmouse_fetch_battery(hdev); } if (id->vendor == USB_VENDOR_ID_APPLE && (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || ((id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && hdev->type != HID_TYPE_USBMOUSE))) if (is_usb_magicmouse2(id->vendor, id->product) || (is_usb_magictrackpad2(id->vendor, id->product) && hdev->type != HID_TYPE_USBMOUSE)) return 0; if (!msc->input) { Loading Loading @@ -936,7 +950,10 @@ static int magicmouse_probe(struct hid_device *hdev, return 0; err_stop_hw: if (is_usb_magicmouse2(id->vendor, id->product) || is_usb_magictrackpad2(id->vendor, id->product)) timer_delete_sync(&msc->battery_timer); hid_hw_stop(hdev); return ret; } Loading @@ -947,6 +964,8 @@ static void magicmouse_remove(struct hid_device *hdev) if (msc) { cancel_delayed_work_sync(&msc->work); if (is_usb_magicmouse2(hdev->vendor, hdev->product) || is_usb_magictrackpad2(hdev->vendor, hdev->product)) timer_delete_sync(&msc->battery_timer); } Loading @@ -964,11 +983,8 @@ static const __u8 *magicmouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, * 0x05, 0x01, // Usage Page (Generic Desktop) 0 * 0x09, 0x02, // Usage (Mouse) 2 */ if (hdev->vendor == USB_VENDOR_ID_APPLE && (hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 || hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC || hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 || hdev->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) && if ((is_usb_magicmouse2(hdev->vendor, hdev->product) || is_usb_magictrackpad2(hdev->vendor, hdev->product)) && *rsize == 83 && rdesc[46] == 0x84 && rdesc[58] == 0x85) { hid_info(hdev, "fixing up magicmouse battery report descriptor\n"); Loading