From: Aditya Garg <gargaditya08@live.com>
To: Jiri Kosina <jikos@kernel.org>, Benjamin Tissoires <bentiss@kernel.org>
Cc: "linux-input@vger.kernel.org" <linux-input@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>,
"José Expósito" <jose.exposito89@gmail.com>
Subject: [PATCH v2 0/4] HID: avoid setting up battery timer when not needed in hid-apple and magicmouse
Date: Mon, 30 Jun 2025 12:37:12 +0000 [thread overview]
Message-ID: <20250630123649.80395-1-gargaditya08@live.com> (raw)
Both hid-apple and hid-magicmouse require set up a battery timer for
certain devices in order to fetch battery status. However, the timer
is being set unconditionally for all devices. This patch series
introduces checks to ensure that the battery timer is only set up for
devices that actually require it.
v2: - Address the cases of out_err and err_stop_hw left in v1
- Create a function to check if the device is a USB Magic Mouse 2 or Magic Trackpad 2
to reduce code duplication.
- Add 2 new patches that convert the battery timeout to use
secs_to_jiffies() instead of msecs_to_jiffies().
Aditya Garg (4):
HID: apple: avoid setting up battery timer for devices without battery
HID: magicmouse: avoid setting up battery timer when not needed
HID: apple: use secs_to_jiffies() for battery timeout
HID: magicmouse: use secs_to_jiffies() for battery timeout
drivers/hid/hid-apple.c | 21 +++++++-----
drivers/hid/hid-magicmouse.c | 66 ++++++++++++++++++++++--------------
2 files changed, 54 insertions(+), 33 deletions(-)
Range-diff against v1:
1: 05b6ac964 ! 1: 41c49e1d6 HID: apple: avoid setting up battery timer for devices without battery
@@ drivers/hid/hid-apple.c: static int apple_probe(struct hid_device *hdev,
if (quirks & APPLE_BACKLIGHT_CTL)
apple_backlight_init(hdev);
+@@ drivers/hid/hid-apple.c: static int apple_probe(struct hid_device *hdev,
+ return 0;
+
+ out_err:
+- timer_delete_sync(&asc->battery_timer);
++ if (quirks & APPLE_RDESC_BATTERY)
++ timer_delete_sync(&asc->battery_timer);
++
+ hid_hw_stop(hdev);
+ return ret;
+ }
@@ drivers/hid/hid-apple.c: static void apple_remove(struct hid_device *hdev)
{
struct apple_sc *asc = hid_get_drvdata(hdev);
2: 25b52facf ! 2: a1617042f HID: magicmouse: avoid setting up battery timer when not needed
@@ Commit message
Signed-off-by: Aditya Garg <gargaditya08@live.com>
## drivers/hid/hid-magicmouse.c ##
+@@ drivers/hid/hid-magicmouse.c: 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];
@@ drivers/hid/hid-magicmouse.c: static int magicmouse_probe(struct hid_device *hdev,
return ret;
}
@@ drivers/hid/hid-magicmouse.c: static int magicmouse_probe(struct hid_device *hde
- ((id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 ||
- id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC) &&
- hdev->type != HID_TYPE_USBMOUSE)))
-- return 0;
-+ if (id->vendor == USB_VENDOR_ID_APPLE) {
-+ bool is_mouse2 = (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2 ||
-+ id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2_USBC);
-+ bool is_trackpad2 = (id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 ||
-+ id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2_USBC);
-+
-+ if (is_mouse2 || is_trackpad2) {
-+ timer_setup(&msc->battery_timer, magicmouse_battery_timer_tick, 0);
-+ mod_timer(&msc->battery_timer,
-+ jiffies + msecs_to_jiffies(USB_BATTERY_TIMEOUT_MS));
-+ magicmouse_fetch_battery(hdev);
-+ }
-+
-+ if (is_mouse2 || (is_trackpad2 && hdev->type != HID_TYPE_USBMOUSE))
-+ return 0;
++ 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));
++ magicmouse_fetch_battery(hdev);
+ }
++
++ 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) {
- hid_err(hdev, "magicmouse input not registered\n");
+@@ drivers/hid/hid-magicmouse.c: static int magicmouse_probe(struct hid_device *hdev,
+
+ return 0;
+ err_stop_hw:
+- timer_delete_sync(&msc->battery_timer);
++ 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;
+ }
@@ drivers/hid/hid-magicmouse.c: static void magicmouse_remove(struct hid_device *hdev)
if (msc) {
cancel_delayed_work_sync(&msc->work);
- timer_delete_sync(&msc->battery_timer);
-+ 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))
+ timer_delete_sync(&msc->battery_timer);
}
hid_hw_stop(hdev);
+@@ drivers/hid/hid-magicmouse.c: 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");
-: --------- > 3: 3ebe25998 HID: apple: use secs_to_jiffies() for battery timeout
-: --------- > 4: 1d3400714 HID: magicmouse: use secs_to_jiffies() for battery timeout
--
2.49.0
next reply other threads:[~2025-06-30 12:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-30 12:37 Aditya Garg [this message]
2025-06-30 12:37 ` [PATCH v2 2/4] HID: magicmouse: avoid setting up battery timer when not needed Aditya Garg
2025-06-30 12:37 ` [PATCH v2 1/4] HID: apple: avoid setting up battery timer for devices without battery Aditya Garg
2025-06-30 12:37 ` [PATCH v2 4/4] HID: magicmouse: use secs_to_jiffies() for battery timeout Aditya Garg
2025-06-30 12:39 ` kernel test robot
2025-06-30 12:49 ` Aditya Garg
2025-06-30 12:37 ` [PATCH v2 3/4] HID: apple: " Aditya Garg
2025-07-03 7:42 ` [PATCH v2 0/4] HID: avoid setting up battery timer when not needed in hid-apple and magicmouse Jiri Kosina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250630123649.80395-1-gargaditya08@live.com \
--to=gargaditya08@live.com \
--cc=bentiss@kernel.org \
--cc=jikos@kernel.org \
--cc=jose.exposito89@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox