Commit 069e79a0 authored by Jiri Kosina's avatar Jiri Kosina
Browse files

Merge branch 'for-6.17/battery-timer-fixes' into for-linus

- avoid setting up battery timer for Apple and Magicmouse devices without
  battery (Aditya Garg)
parents 96ba894d 230cdd8a
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -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
@@ -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));
	}
}

@@ -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);
@@ -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;
}
@@ -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);
+41 −25
Original line number Diff line number Diff line
@@ -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
@@ -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];
@@ -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));
	}
}

@@ -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) {
@@ -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;
}
@@ -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);
	}

@@ -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");