You've already forked linux-t2-patches
mirror of
https://github.com/t2linux/linux-t2-patches.git
synced 2026-04-30 13:52:11 -07:00
208 lines
6.5 KiB
Diff
208 lines
6.5 KiB
Diff
From c124f5401040d02abd6d349979be29acd1e88545 Mon Sep 17 00:00:00 2001
|
|
From: Orlando Chamberlain <orlandoch.dev@gmail.com>
|
|
Date: Fri, 10 Feb 2023 23:14:31 +1100
|
|
Subject: [PATCH 6/8] HID: hid-apple-magic-backlight: Add driver for keyboard
|
|
backlight on internal Magic Keyboards
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This driver adds support for the keyboard backlight on Intel T2 Macs
|
|
with internal Magic Keyboards (MacBookPro16,x and MacBookAir9,1)
|
|
|
|
Co-developed-by: Kerem Karabay <kekrby@gmail.com>
|
|
Signed-off-by: Kerem Karabay <kekrby@gmail.com>
|
|
Signed-off-by: Orlando Chamberlain <orlandoch.dev@gmail.com>
|
|
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
|
|
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>
|
|
---
|
|
MAINTAINERS | 6 ++
|
|
drivers/hid/Kconfig | 13 +++
|
|
drivers/hid/Makefile | 1 +
|
|
drivers/hid/hid-apple-magic-backlight.c | 120 ++++++++++++++++++++++++
|
|
4 files changed, 140 insertions(+)
|
|
create mode 100644 drivers/hid/hid-apple-magic-backlight.c
|
|
|
|
diff --git a/MAINTAINERS b/MAINTAINERS
|
|
index dfc63d257..9148bda0a 100644
|
|
--- a/MAINTAINERS
|
|
+++ b/MAINTAINERS
|
|
@@ -9169,6 +9169,12 @@ L: linux-input@vger.kernel.org
|
|
S: Maintained
|
|
F: drivers/hid/hid-appletb-*
|
|
|
|
+HID APPLE MAGIC BACKLIGHT DRIVER
|
|
+M: Orlando Chamberlain <orlandoch.dev@gmail.com>
|
|
+L: linux-input@vger.kernel.org
|
|
+S: Maintained
|
|
+F: drivers/hid/apple-magic-backlight.c
|
|
+
|
|
HID CORE LAYER
|
|
M: Jiri Kosina <jikos@kernel.org>
|
|
M: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
|
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
|
|
index 4e238df87..83fbab6d4 100644
|
|
--- a/drivers/hid/Kconfig
|
|
+++ b/drivers/hid/Kconfig
|
|
@@ -169,6 +169,19 @@ config HID_APPLETB_KBD
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called hid-appletb-kbd.
|
|
|
|
+config HID_APPLE_MAGIC_BACKLIGHT
|
|
+ tristate "Apple Magic Keyboard Backlight"
|
|
+ depends on USB_HID
|
|
+ depends on LEDS_CLASS
|
|
+ depends on NEW_LEDS
|
|
+ help
|
|
+ Say Y here if you want support for the keyboard backlight on Macs with
|
|
+ the magic keyboard (MacBookPro16,x and MacBookAir9,1). Note that this
|
|
+ driver is not for external magic keyboards.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the
|
|
+ module will be called hid-apple-magic-backlight.
|
|
+
|
|
config HID_ASUS
|
|
tristate "Asus"
|
|
depends on USB_HID
|
|
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
|
|
index 5b60015fd..581f5e720 100644
|
|
--- a/drivers/hid/Makefile
|
|
+++ b/drivers/hid/Makefile
|
|
@@ -31,6 +31,7 @@ obj-$(CONFIG_HID_APPLE) += hid-apple.o
|
|
obj-$(CONFIG_HID_APPLEIR) += hid-appleir.o
|
|
obj-$(CONFIG_HID_APPLETB_BL) += hid-appletb-bl.o
|
|
obj-$(CONFIG_HID_APPLETB_KBD) += hid-appletb-kbd.o
|
|
+obj-$(CONFIG_HID_APPLE_MAGIC_BACKLIGHT) += hid-apple-magic-backlight.o
|
|
obj-$(CONFIG_HID_CREATIVE_SB0540) += hid-creative-sb0540.o
|
|
obj-$(CONFIG_HID_ASUS) += hid-asus.o
|
|
obj-$(CONFIG_HID_AUREAL) += hid-aureal.o
|
|
diff --git a/drivers/hid/hid-apple-magic-backlight.c b/drivers/hid/hid-apple-magic-backlight.c
|
|
new file mode 100644
|
|
index 000000000..f0fc02ff3
|
|
--- /dev/null
|
|
+++ b/drivers/hid/hid-apple-magic-backlight.c
|
|
@@ -0,0 +1,120 @@
|
|
+// SPDX-License-Identifier: GPL-2.0
|
|
+/*
|
|
+ * Apple Magic Keyboard Backlight Driver
|
|
+ *
|
|
+ * For Intel Macs with internal Magic Keyboard (MacBookPro16,1-4 and MacBookAir9,1)
|
|
+ *
|
|
+ * Copyright (c) 2022 Kerem Karabay <kekrby@gmail.com>
|
|
+ * Copyright (c) 2023 Orlando Chamberlain <orlandoch.dev@gmail.com>
|
|
+ */
|
|
+
|
|
+#include <linux/hid.h>
|
|
+#include <linux/leds.h>
|
|
+#include <linux/device.h>
|
|
+#include <linux/errno.h>
|
|
+#include <dt-bindings/leds/common.h>
|
|
+
|
|
+#include "hid-ids.h"
|
|
+
|
|
+#define HID_USAGE_MAGIC_BL 0xff00000f
|
|
+
|
|
+#define APPLE_MAGIC_REPORT_ID_POWER 3
|
|
+#define APPLE_MAGIC_REPORT_ID_BRIGHTNESS 1
|
|
+
|
|
+struct apple_magic_backlight {
|
|
+ struct led_classdev cdev;
|
|
+ struct hid_report *brightness;
|
|
+ struct hid_report *power;
|
|
+};
|
|
+
|
|
+static void apple_magic_backlight_report_set(struct hid_report *rep, s32 value, u8 rate)
|
|
+{
|
|
+ rep->field[0]->value[0] = value;
|
|
+ rep->field[1]->value[0] = 0x5e; /* Mimic Windows */
|
|
+ rep->field[1]->value[0] |= rate << 8;
|
|
+
|
|
+ hid_hw_request(rep->device, rep, HID_REQ_SET_REPORT);
|
|
+}
|
|
+
|
|
+static void apple_magic_backlight_set(struct apple_magic_backlight *backlight,
|
|
+ int brightness, char rate)
|
|
+{
|
|
+ apple_magic_backlight_report_set(backlight->power, brightness ? 1 : 0, rate);
|
|
+ if (brightness)
|
|
+ apple_magic_backlight_report_set(backlight->brightness, brightness, rate);
|
|
+}
|
|
+
|
|
+static int apple_magic_backlight_led_set(struct led_classdev *led_cdev,
|
|
+ enum led_brightness brightness)
|
|
+{
|
|
+ struct apple_magic_backlight *backlight = container_of(led_cdev,
|
|
+ struct apple_magic_backlight, cdev);
|
|
+
|
|
+ apple_magic_backlight_set(backlight, brightness, 1);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int apple_magic_backlight_probe(struct hid_device *hdev,
|
|
+ const struct hid_device_id *id)
|
|
+{
|
|
+ struct apple_magic_backlight *backlight;
|
|
+ int rc;
|
|
+
|
|
+ rc = hid_parse(hdev);
|
|
+ if (rc)
|
|
+ return rc;
|
|
+
|
|
+ /*
|
|
+ * Ensure this usb endpoint is for the keyboard backlight, not touchbar
|
|
+ * backlight.
|
|
+ */
|
|
+ if (hdev->collection[0].usage != HID_USAGE_MAGIC_BL)
|
|
+ return -ENODEV;
|
|
+
|
|
+ backlight = devm_kzalloc(&hdev->dev, sizeof(*backlight), GFP_KERNEL);
|
|
+ if (!backlight)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ rc = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
|
|
+ if (rc)
|
|
+ return rc;
|
|
+
|
|
+ backlight->brightness = hid_register_report(hdev, HID_FEATURE_REPORT,
|
|
+ APPLE_MAGIC_REPORT_ID_BRIGHTNESS, 0);
|
|
+ backlight->power = hid_register_report(hdev, HID_FEATURE_REPORT,
|
|
+ APPLE_MAGIC_REPORT_ID_POWER, 0);
|
|
+
|
|
+ if (!backlight->brightness || !backlight->power) {
|
|
+ rc = -ENODEV;
|
|
+ goto hw_stop;
|
|
+ }
|
|
+
|
|
+ backlight->cdev.name = ":white:" LED_FUNCTION_KBD_BACKLIGHT;
|
|
+ backlight->cdev.max_brightness = backlight->brightness->field[0]->logical_maximum;
|
|
+ backlight->cdev.brightness_set_blocking = apple_magic_backlight_led_set;
|
|
+
|
|
+ apple_magic_backlight_set(backlight, 0, 0);
|
|
+
|
|
+ return devm_led_classdev_register(&hdev->dev, &backlight->cdev);
|
|
+
|
|
+hw_stop:
|
|
+ hid_hw_stop(hdev);
|
|
+ return rc;
|
|
+}
|
|
+
|
|
+static const struct hid_device_id apple_magic_backlight_hid_ids[] = {
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT) },
|
|
+ { }
|
|
+};
|
|
+MODULE_DEVICE_TABLE(hid, apple_magic_backlight_hid_ids);
|
|
+
|
|
+static struct hid_driver apple_magic_backlight_hid_driver = {
|
|
+ .name = "hid-apple-magic-backlight",
|
|
+ .id_table = apple_magic_backlight_hid_ids,
|
|
+ .probe = apple_magic_backlight_probe,
|
|
+};
|
|
+module_hid_driver(apple_magic_backlight_hid_driver);
|
|
+
|
|
+MODULE_DESCRIPTION("MacBook Magic Keyboard Backlight");
|
|
+MODULE_AUTHOR("Orlando Chamberlain <orlandoch.dev@gmail.com>");
|
|
+MODULE_LICENSE("GPL");
|
|
--
|
|
2.39.2
|
|
|