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
Delete 1002-Add-apple-ibridge-driver.patch
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,70 @@
|
||||
From dc27d4db5787546ae5eacf3483f3b87f2d4fb1c1 Mon Sep 17 00:00:00 2001
|
||||
From: Redecorating <69827514+Redecorating@users.noreply.github.com>
|
||||
Date: Mon, 7 Nov 2022 14:56:34 +0530
|
||||
Subject: [PATCH] Put apple-bce in drivers/staging
|
||||
|
||||
---
|
||||
drivers/staging/Kconfig | 2 ++
|
||||
drivers/staging/Makefile | 1 +
|
||||
drivers/staging/apple-bce/Kconfig | 18 ++++++++++++++++++
|
||||
drivers/staging/apple-bce/Makefile | 2 +-
|
||||
4 files changed, 22 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/staging/apple-bce/Kconfig
|
||||
|
||||
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
|
||||
index 5cfabd537..3b8e61d26 100644
|
||||
--- a/drivers/staging/Kconfig
|
||||
+++ b/drivers/staging/Kconfig
|
||||
@@ -80,4 +80,6 @@ source "drivers/staging/qlge/Kconfig"
|
||||
|
||||
source "drivers/staging/vme_user/Kconfig"
|
||||
|
||||
+source "drivers/staging/apple-bce/Kconfig"
|
||||
+
|
||||
endif # STAGING
|
||||
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
|
||||
index f8c3aa9c2..1e148d6c3 100644
|
||||
--- a/drivers/staging/Makefile
|
||||
+++ b/drivers/staging/Makefile
|
||||
@@ -29,3 +29,4 @@ obj-$(CONFIG_PI433) += pi433/
|
||||
obj-$(CONFIG_XIL_AXIS_FIFO) += axis-fifo/
|
||||
obj-$(CONFIG_FIELDBUS_DEV) += fieldbus/
|
||||
obj-$(CONFIG_QLGE) += qlge/
|
||||
+obj-$(CONFIG_APPLE_BCE) += apple-bce/
|
||||
diff --git a/drivers/staging/apple-bce/Kconfig b/drivers/staging/apple-bce/Kconfig
|
||||
new file mode 100644
|
||||
index 000000000..fe92bc441
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/apple-bce/Kconfig
|
||||
@@ -0,0 +1,18 @@
|
||||
+config APPLE_BCE
|
||||
+ tristate "Apple BCE driver (VHCI and Audio support)"
|
||||
+ default m
|
||||
+ depends on X86
|
||||
+ select SOUND
|
||||
+ select SND
|
||||
+ select SND_PCM
|
||||
+ select SND_JACK
|
||||
+ help
|
||||
+ VHCI and audio support on Apple MacBooks with the T2 Chip.
|
||||
+ This driver is divided in three components:
|
||||
+ - BCE (Buffer Copy Engine): which establishes a basic communication
|
||||
+ channel with the T2 chip. This component is required by the other two:
|
||||
+ - VHCI (Virtual Host Controller Interface): Access to keyboard, mouse
|
||||
+ and other system devices depend on this virtual USB host controller
|
||||
+ - Audio: a driver for the T2 audio interface.
|
||||
+
|
||||
+ If "M" is selected, the module will be called apple-bce.'
|
||||
diff --git a/drivers/staging/apple-bce/Makefile b/drivers/staging/apple-bce/Makefile
|
||||
index a6a656f06..8cfbd3f64 100644
|
||||
--- a/drivers/staging/apple-bce/Makefile
|
||||
+++ b/drivers/staging/apple-bce/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
modname := apple-bce
|
||||
-obj-m += $(modname).o
|
||||
+obj-$(CONFIG_APPLE_BCE) += $(modname).o
|
||||
|
||||
apple-bce-objs := apple_bce.o mailbox.o queue.o queue_dma.o vhci/vhci.o vhci/queue.o vhci/transfer.o audio/audio.o audio/protocol.o audio/protocol_bce.o audio/pcm.o
|
||||
|
||||
--
|
||||
2.34.1
|
||||
@@ -1,111 +0,0 @@
|
||||
From 153b587ed53135eaf244144f6f8bdd5a0fe6b69e Mon Sep 17 00:00:00 2001
|
||||
From: Redecorating <69827514+Redecorating@users.noreply.github.com>
|
||||
Date: Fri, 24 Dec 2021 18:12:25 +1100
|
||||
Subject: [PATCH 1/1] Put apple-bce and apple-ibridge in drivers/staging
|
||||
|
||||
---
|
||||
drivers/staging/Kconfig | 4 ++++
|
||||
drivers/staging/Makefile | 2 ++
|
||||
drivers/staging/apple-bce/Kconfig | 18 ++++++++++++++++++
|
||||
drivers/staging/apple-bce/Makefile | 2 +-
|
||||
drivers/staging/apple-ibridge/Kconfig | 15 +++++++++++++++
|
||||
drivers/staging/apple-ibridge/Makefile | 6 +++---
|
||||
6 files changed, 43 insertions(+), 4 deletions(-)
|
||||
create mode 100644 drivers/staging/apple-bce/Kconfig
|
||||
create mode 100644 drivers/staging/apple-ibridge/Kconfig
|
||||
|
||||
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
|
||||
index e03627a..fc121d5 100644
|
||||
--- a/drivers/staging/Kconfig
|
||||
+++ b/drivers/staging/Kconfig
|
||||
@@ -102,4 +102,8 @@ source "drivers/staging/qlge/Kconfig"
|
||||
|
||||
source "drivers/staging/vme_user/Kconfig"
|
||||
|
||||
+source "drivers/staging/apple-bce/Kconfig"
|
||||
+
|
||||
+source "drivers/staging/apple-ibridge/Kconfig"
|
||||
+
|
||||
endif # STAGING
|
||||
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
|
||||
index c7f8d8d..debad40 100644
|
||||
--- a/drivers/staging/Makefile
|
||||
+++ b/drivers/staging/Makefile
|
||||
@@ -41,3 +41,5 @@ obj-$(CONFIG_XIL_AXIS_FIFO) += axis-fifo/
|
||||
obj-$(CONFIG_XIL_AXIS_FIFO) += axis-fifo/
|
||||
obj-$(CONFIG_FIELDBUS_DEV) += fieldbus/
|
||||
obj-$(CONFIG_QLGE) += qlge/
|
||||
+obj-$(CONFIG_APPLE_BCE) += apple-bce/
|
||||
+obj-$(CONFIG_APPLE_IBRIDGE) += apple-ibridge/
|
||||
diff --git a/drivers/staging/apple-bce/Kconfig b/drivers/staging/apple-bce/Kconfig
|
||||
new file mode 100644
|
||||
index 0000000..bbfb89b
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/apple-bce/Kconfig
|
||||
@@ -0,0 +1,18 @@
|
||||
+config APPLE_BCE
|
||||
+ tristate "Apple BCE driver (VHCI and Audio support)"
|
||||
+ default m
|
||||
+ depends on X86
|
||||
+ select SOUND
|
||||
+ select SND
|
||||
+ select SND_PCM
|
||||
+ select SND_JACK
|
||||
+ help
|
||||
+ VHCI and audio support on Apple MacBooks with the T2 Chip.
|
||||
+ This driver is divided in three components:
|
||||
+ - BCE (Buffer Copy Engine): which establishes a basic communication
|
||||
+ channel with the T2 chip. This component is required by the other two:
|
||||
+ - VHCI (Virtual Host Controller Interface): Access to keyboard, mouse
|
||||
+ and other system devices depend on this virtual USB host controller
|
||||
+ - Audio: a driver for the T2 audio interface.
|
||||
+
|
||||
+ If "M" is selected, the module will be called apple-bce.'
|
||||
diff --git a/drivers/staging/apple-bce/Makefile b/drivers/staging/apple-bce/Makefile
|
||||
index a6a656f..8cfbd3f 100644
|
||||
--- a/drivers/staging/apple-bce/Makefile
|
||||
+++ b/drivers/staging/apple-bce/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
modname := apple-bce
|
||||
-obj-m += $(modname).o
|
||||
+obj-$(CONFIG_APPLE_BCE) += $(modname).o
|
||||
|
||||
apple-bce-objs := apple_bce.o mailbox.o queue.o queue_dma.o vhci/vhci.o vhci/queue.o vhci/transfer.o audio/audio.o audio/protocol.o audio/protocol_bce.o audio/pcm.o
|
||||
|
||||
diff --git a/drivers/staging/apple-ibridge/Kconfig b/drivers/staging/apple-ibridge/Kconfig
|
||||
new file mode 100644
|
||||
index 0000000..0716486
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/apple-ibridge/Kconfig
|
||||
@@ -0,0 +1,15 @@
|
||||
+config APPLE_IBRIDGE
|
||||
+ tristate "Apple iBridge driver (Touchbar and ALS support)"
|
||||
+ default m
|
||||
+ depends on X86
|
||||
+ select HID
|
||||
+ select IIO
|
||||
+ select IIO_TRIGGERED_BUFFER
|
||||
+ select IIO_BUFFER
|
||||
+ select ACPI_ALS
|
||||
+ help
|
||||
+ Driver for the Touchbar and ALS (Ambient Light Sensor) on some
|
||||
+ Apple computers.
|
||||
+
|
||||
+ If "M" is selected, the modules will be called apple-ibridge,
|
||||
+ apple-ib-tb and apple-ib-als.
|
||||
diff --git a/drivers/staging/apple-ibridge/Makefile b/drivers/staging/apple-ibridge/Makefile
|
||||
index ea40afe..ae129bd 100644
|
||||
--- a/drivers/staging/apple-ibridge/Makefile
|
||||
+++ b/drivers/staging/apple-ibridge/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
-obj-m += apple-ibridge.o
|
||||
-obj-m += apple-ib-tb.o
|
||||
-obj-m += apple-ib-als.o
|
||||
+obj-$(CONFIG_APPLE_IBRIDGE) += apple-ibridge.o
|
||||
+obj-$(CONFIG_APPLE_IBRIDGE) += apple-ib-tb.o
|
||||
+obj-$(CONFIG_APPLE_IBRIDGE) += apple-ib-als.o
|
||||
|
||||
KVERSION := $(KERNELRELEASE)
|
||||
ifeq ($(origin KERNELRELEASE), undefined)
|
||||
--
|
||||
2.34.1
|
||||
@@ -0,0 +1,63 @@
|
||||
From 18bed33b3b1180a8af8a52dcf544b67b61786e89 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ronald=20Tschal=C3=A4r?= <ronald@innovation.ch>
|
||||
Date: Sat, 27 Feb 2021 17:26:39 -0800
|
||||
Subject: [PATCH 1/6] HID: Recognize sensors with application collections too.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
According to HUTRR39 logical sensor devices may be nested inside
|
||||
physical collections or may be specified in multiple top-level
|
||||
application collections (see page 59, strategies 1 and 2). However,
|
||||
the current code was only recognizing those with physical collections.
|
||||
|
||||
This issue turned up in recent MacBook Pro's which define the ALS in
|
||||
a top-level application collection.
|
||||
|
||||
Signed-off-by: Ronald Tschalär <ronald@innovation.ch>
|
||||
---
|
||||
drivers/hid/hid-core.c | 3 ++-
|
||||
drivers/hid/hid-sensor-hub.c | 6 ++++--
|
||||
2 files changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||
index b7f5566e338d..8fcd663b10e2 100644
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -804,7 +804,8 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
|
||||
int i;
|
||||
|
||||
if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
|
||||
- type == HID_COLLECTION_PHYSICAL)
|
||||
+ (type == HID_COLLECTION_PHYSICAL ||
|
||||
+ type == HID_COLLECTION_APPLICATION))
|
||||
hid->group = HID_GROUP_SENSOR_HUB;
|
||||
|
||||
if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
|
||||
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
|
||||
index 6abd3e2a9094..d03dc4ca095f 100644
|
||||
--- a/drivers/hid/hid-sensor-hub.c
|
||||
+++ b/drivers/hid/hid-sensor-hub.c
|
||||
@@ -397,7 +397,8 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
|
||||
for (i = 0; i < report->maxfield; ++i) {
|
||||
field = report->field[i];
|
||||
if (field->maxusage) {
|
||||
- if (field->physical == usage_id &&
|
||||
+ if ((field->physical == usage_id ||
|
||||
+ field->application == usage_id) &&
|
||||
(field->logical == attr_usage_id ||
|
||||
field->usage[0].hid ==
|
||||
attr_usage_id) &&
|
||||
@@ -506,7 +507,8 @@ static int sensor_hub_raw_event(struct hid_device *hdev,
|
||||
collection->usage);
|
||||
|
||||
callback = sensor_hub_get_callback(hdev,
|
||||
- report->field[i]->physical,
|
||||
+ report->field[i]->physical ?:
|
||||
+ report->field[i]->application,
|
||||
report->field[i]->usage[0].collection_index,
|
||||
&hsdev, &priv);
|
||||
if (!callback) {
|
||||
--
|
||||
2.38.1
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
From 360637979541fa2f3a64ed54af818f07e4e95a8d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ronald=20Tschal=C3=A4r?= <ronald@innovation.ch>
|
||||
Date: Sat, 27 Feb 2021 17:26:41 -0800
|
||||
Subject: [PATCH 2/6] HID: core: Export some report item parsing functions.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
These are useful to drivers that need to scan or parse reports
|
||||
themselves.
|
||||
|
||||
Signed-off-by: Ronald Tschalär <ronald@innovation.ch>
|
||||
---
|
||||
drivers/hid/hid-core.c | 54 +++++++++++++++++++++++++-----------------
|
||||
include/linux/hid.h | 4 ++++
|
||||
2 files changed, 36 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||
index 8fcd663b10e2..f0d914238e55 100644
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -343,7 +343,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
|
||||
* Read data value from item.
|
||||
*/
|
||||
|
||||
-static u32 item_udata(struct hid_item *item)
|
||||
+u32 hid_item_udata(struct hid_item *item)
|
||||
{
|
||||
switch (item->size) {
|
||||
case 1: return item->data.u8;
|
||||
@@ -352,8 +352,9 @@ static u32 item_udata(struct hid_item *item)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(hid_item_udata);
|
||||
|
||||
-static s32 item_sdata(struct hid_item *item)
|
||||
+s32 hid_item_sdata(struct hid_item *item)
|
||||
{
|
||||
switch (item->size) {
|
||||
case 1: return item->data.s8;
|
||||
@@ -362,6 +363,7 @@ static s32 item_sdata(struct hid_item *item)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(hid_item_sdata);
|
||||
|
||||
/*
|
||||
* Process a global item.
|
||||
@@ -394,29 +396,29 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
|
||||
- parser->global.usage_page = item_udata(item);
|
||||
+ parser->global.usage_page = hid_item_udata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
|
||||
- parser->global.logical_minimum = item_sdata(item);
|
||||
+ parser->global.logical_minimum = hid_item_sdata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
|
||||
if (parser->global.logical_minimum < 0)
|
||||
- parser->global.logical_maximum = item_sdata(item);
|
||||
+ parser->global.logical_maximum = hid_item_sdata(item);
|
||||
else
|
||||
- parser->global.logical_maximum = item_udata(item);
|
||||
+ parser->global.logical_maximum = hid_item_udata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
|
||||
- parser->global.physical_minimum = item_sdata(item);
|
||||
+ parser->global.physical_minimum = hid_item_sdata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
|
||||
if (parser->global.physical_minimum < 0)
|
||||
- parser->global.physical_maximum = item_sdata(item);
|
||||
+ parser->global.physical_maximum = hid_item_sdata(item);
|
||||
else
|
||||
- parser->global.physical_maximum = item_udata(item);
|
||||
+ parser->global.physical_maximum = hid_item_udata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
|
||||
@@ -424,7 +426,7 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
* nibble due to the common misunderstanding of HID
|
||||
* specification 1.11, 6.2.2.7 Global Items. Attempt to handle
|
||||
* both this and the standard encoding. */
|
||||
- raw_value = item_sdata(item);
|
||||
+ raw_value = hid_item_sdata(item);
|
||||
if (!(raw_value & 0xfffffff0))
|
||||
parser->global.unit_exponent = hid_snto32(raw_value, 4);
|
||||
else
|
||||
@@ -432,11 +434,11 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_UNIT:
|
||||
- parser->global.unit = item_udata(item);
|
||||
+ parser->global.unit = hid_item_udata(item);
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
|
||||
- parser->global.report_size = item_udata(item);
|
||||
+ parser->global.report_size = hid_item_udata(item);
|
||||
if (parser->global.report_size > 256) {
|
||||
hid_err(parser->device, "invalid report_size %d\n",
|
||||
parser->global.report_size);
|
||||
@@ -445,7 +447,7 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
|
||||
- parser->global.report_count = item_udata(item);
|
||||
+ parser->global.report_count = hid_item_udata(item);
|
||||
if (parser->global.report_count > HID_MAX_USAGES) {
|
||||
hid_err(parser->device, "invalid report_count %d\n",
|
||||
parser->global.report_count);
|
||||
@@ -454,7 +456,7 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_REPORT_ID:
|
||||
- parser->global.report_id = item_udata(item);
|
||||
+ parser->global.report_id = hid_item_udata(item);
|
||||
if (parser->global.report_id == 0 ||
|
||||
parser->global.report_id >= HID_MAX_IDS) {
|
||||
hid_err(parser->device, "report_id %u is invalid\n",
|
||||
@@ -479,7 +481,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
unsigned n;
|
||||
__u32 count;
|
||||
|
||||
- data = item_udata(item);
|
||||
+ data = hid_item_udata(item);
|
||||
|
||||
switch (item->tag) {
|
||||
case HID_LOCAL_ITEM_TAG_DELIMITER:
|
||||
@@ -611,7 +613,7 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
|
||||
|
||||
hid_concatenate_last_usage_page(parser);
|
||||
|
||||
- data = item_udata(item);
|
||||
+ data = hid_item_udata(item);
|
||||
|
||||
switch (item->tag) {
|
||||
case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
|
||||
@@ -712,12 +714,19 @@ static void hid_device_release(struct device *dev)
|
||||
kfree(hid);
|
||||
}
|
||||
|
||||
-/*
|
||||
+/**
|
||||
+ * hid_fetch_item - fetch an item from a report
|
||||
+ *
|
||||
+ * @start: the current position in the report buffer to read the next item from
|
||||
+ * @end: the end of the report buffer
|
||||
+ * @item: the item struct to fill in
|
||||
+ *
|
||||
* Fetch a report description item from the data stream. We support long
|
||||
* items, though they are not used yet.
|
||||
+ *
|
||||
+ * Return: the position of the next item in the report
|
||||
*/
|
||||
-
|
||||
-static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
|
||||
+u8 *hid_fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
|
||||
{
|
||||
u8 b;
|
||||
|
||||
@@ -778,6 +787,7 @@ static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(hid_fetch_item);
|
||||
|
||||
static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)
|
||||
{
|
||||
@@ -836,7 +846,7 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
|
||||
|
||||
hid_concatenate_last_usage_page(parser);
|
||||
|
||||
- data = item_udata(item);
|
||||
+ data = hid_item_udata(item);
|
||||
|
||||
switch (item->tag) {
|
||||
case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
|
||||
@@ -896,7 +906,7 @@ static int hid_scan_report(struct hid_device *hid)
|
||||
* be robust against hid errors. Those errors will be raised by
|
||||
* hid_open_report() anyway.
|
||||
*/
|
||||
- while ((start = fetch_item(start, end, &item)) != NULL)
|
||||
+ while ((start = hid_fetch_item(start, end, &item)) != NULL)
|
||||
dispatch_type[item.type](parser, &item);
|
||||
|
||||
/*
|
||||
@@ -1255,7 +1265,7 @@ int hid_open_report(struct hid_device *device)
|
||||
device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
|
||||
|
||||
ret = -EINVAL;
|
||||
- while ((next = fetch_item(start, end, &item)) != NULL) {
|
||||
+ while ((next = hid_fetch_item(start, end, &item)) != NULL) {
|
||||
start = next;
|
||||
|
||||
if (item.format != HID_ITEM_FORMAT_SHORT) {
|
||||
diff --git a/include/linux/hid.h b/include/linux/hid.h
|
||||
index 4363a63b9775..b39f97d565e2 100644
|
||||
--- a/include/linux/hid.h
|
||||
+++ b/include/linux/hid.h
|
||||
@@ -941,6 +941,10 @@ struct hid_report *hid_validate_values(struct hid_device *hid,
|
||||
unsigned int field_index,
|
||||
unsigned int report_counts);
|
||||
|
||||
+u32 hid_item_udata(struct hid_item *item);
|
||||
+s32 hid_item_sdata(struct hid_item *item);
|
||||
+u8 *hid_fetch_item(__u8 *start, __u8 *end, struct hid_item *item);
|
||||
+
|
||||
void hid_setup_resolution_multiplier(struct hid_device *hid);
|
||||
int hid_open_report(struct hid_device *device);
|
||||
int hid_check_keys_pressed(struct hid_device *hid);
|
||||
--
|
||||
2.38.1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
||||
From c36014bd8cbf435a3668dbe257cb3d4293968074 Mon Sep 17 00:00:00 2001
|
||||
From: Orlando Chamberlain <redecorating@protonmail.com>
|
||||
Date: Sun, 6 Nov 2022 19:23:56 +0300
|
||||
Subject: [PATCH 5/6] HID: apple-touchbar: support magic keyboard backlight
|
||||
|
||||
MacBookPro16,1/2/3/4 have the magic keyboard, with the keyboard
|
||||
backlight controlled via the Touch Bar Backlight USB device.
|
||||
|
||||
We check that the internal keyboard's USB product ID matches that of
|
||||
models with the magic keyboard, and then we create a sysfs led class
|
||||
dev that controls the backlight.
|
||||
|
||||
NOTE: This commit hasn't been signed off yet
|
||||
---
|
||||
drivers/hid/apple-touchbar.c | 167 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 167 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/apple-touchbar.c b/drivers/hid/apple-touchbar.c
|
||||
index 87cb9ebafb61..e2cf41b35363 100644
|
||||
--- a/drivers/hid/apple-touchbar.c
|
||||
+++ b/drivers/hid/apple-touchbar.c
|
||||
@@ -78,6 +78,8 @@
|
||||
|
||||
#define APPLETB_FEATURE_IS_T1 BIT(0)
|
||||
|
||||
+#define APPLE_MAGIC_KBD_BL_MAX 60
|
||||
+
|
||||
static int appletb_tb_def_idle_timeout = 5 * 60;
|
||||
module_param_named(idle_timeout, appletb_tb_def_idle_timeout, int, 0444);
|
||||
MODULE_PARM_DESC(idle_timeout, "Default touch bar idle timeout:\n"
|
||||
@@ -136,6 +138,12 @@ static const struct attribute_group appletb_attr_group = {
|
||||
.attrs = appletb_attrs,
|
||||
};
|
||||
|
||||
+struct apple_magic_backlight {
|
||||
+ struct led_classdev cdev;
|
||||
+ struct usb_device *dev;
|
||||
+ bool powered;
|
||||
+};
|
||||
+
|
||||
struct appletb_device {
|
||||
bool active;
|
||||
struct device *log_dev;
|
||||
@@ -175,6 +183,8 @@ struct appletb_device {
|
||||
int fn_mode;
|
||||
|
||||
bool is_t1;
|
||||
+
|
||||
+ struct apple_magic_backlight kbd_backlight;
|
||||
};
|
||||
|
||||
struct appletb_key_translation {
|
||||
@@ -197,6 +207,30 @@ static const struct appletb_key_translation appletb_fn_codes[] = {
|
||||
{ KEY_F12, KEY_VOLUMEUP },
|
||||
};
|
||||
|
||||
+struct apple_magic_keyboard_backlight_brightness_report {
|
||||
+ u8 report_id; /* 0x01 */
|
||||
+ u8 mode; /* If 0x00, brightness can turn off backlight */
|
||||
+ u8 brightness;
|
||||
+ u8 override_1; /* If these are non-zero, backlight is overridden to max brightness */
|
||||
+ u8 override_2;
|
||||
+ u8 max; /* Lower is brighter, only takes effect when turning backlight
|
||||
+ * on from off, can be unreliable
|
||||
+ */
|
||||
+ u8 rate;
|
||||
+ u8 magic_1; /* If these are non-zero, we are ignored. */
|
||||
+ u8 magic_2;
|
||||
+};
|
||||
+
|
||||
+struct apple_magic_keyboard_backlight_power_report {
|
||||
+ u8 report_id; /* 0x03 */
|
||||
+ u8 power;
|
||||
+ u8 max; /* Lower is brighter, only takes effect when turning backlight
|
||||
+ * on from off, can be unreliable
|
||||
+ */
|
||||
+ u8 rate;
|
||||
+ u8 magic_1; /* If these are non-zero, we are ignored. */
|
||||
+ u8 magic_2;
|
||||
+};
|
||||
static struct appletb_device *appletb_dev;
|
||||
|
||||
static int appletb_send_usb_ctrl(struct appletb_iface_info *iface_info,
|
||||
@@ -317,6 +351,132 @@ static int appletb_send_hid_report(struct appletb_iface_info *iface_info,
|
||||
return rc;
|
||||
}
|
||||
|
||||
+static int apple_magic_keyboard_backlight_power_set(struct apple_magic_backlight *backlight,
|
||||
+ char power, char rate)
|
||||
+{
|
||||
+ int tries = 0;
|
||||
+ int rc;
|
||||
+ struct apple_magic_keyboard_backlight_power_report *rep;
|
||||
+
|
||||
+ rep = kmalloc(sizeof(*rep), GFP_KERNEL);
|
||||
+ if (rep == NULL)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ backlight->powered = power ? true : false;
|
||||
+
|
||||
+ rep->report_id = 0x03;
|
||||
+ rep->power = power;
|
||||
+ rep->max = 0x5e; /* Windows uses 0x5e when turning on, and 0xf4 when
|
||||
+ * turning off. When it's off it doesn't matter, so
|
||||
+ * use 0x5e
|
||||
+ */
|
||||
+ rep->rate = rate;
|
||||
+
|
||||
+ do {
|
||||
+ /*
|
||||
+ * FIXME: use appletb_send_hid_report, don't hard code all of this
|
||||
+ * Need to get apple_tb_send_hid_report to use wIndex=0x01
|
||||
+ */
|
||||
+ rc = usb_control_msg(backlight->dev,
|
||||
+ usb_sndctrlpipe(backlight->dev, 0),
|
||||
+ HID_REQ_SET_REPORT, USB_DIR_OUT |
|
||||
+ USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
+ 0x0303, 0x01, rep, sizeof(*rep),
|
||||
+ 2000);
|
||||
+ if (rc != -EPIPE)
|
||||
+ break;
|
||||
+
|
||||
+ usleep_range(1000 << tries, 3000 << tries);
|
||||
+ } while (++tries < 5);
|
||||
+
|
||||
+ kfree(rep);
|
||||
+ return (rc > 0) ? 0 : rc;
|
||||
+}
|
||||
+
|
||||
+static int apple_magic_keyboard_backlight_brightness_set(struct apple_magic_backlight *backlight,
|
||||
+ char brightness, char rate)
|
||||
+{
|
||||
+ int tries = 0;
|
||||
+ int rc;
|
||||
+ struct apple_magic_keyboard_backlight_brightness_report *rep;
|
||||
+
|
||||
+ rep = kmalloc(sizeof(*rep), GFP_KERNEL);
|
||||
+ if (rep == NULL)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ rep->report_id = 0x01;
|
||||
+ rep->mode = brightness;
|
||||
+ rep->brightness = brightness;
|
||||
+ rep->max = 0x5e;
|
||||
+ rep->rate = rate;
|
||||
+
|
||||
+ do {
|
||||
+ /*
|
||||
+ * FIXME: use appletb_send_hid_report, don't hard code all of this
|
||||
+ * Need to get apple_tb_send_hid_report to use wIndex=0x01
|
||||
+ */
|
||||
+ rc = usb_control_msg(backlight->dev,
|
||||
+ usb_sndctrlpipe(backlight->dev, 0),
|
||||
+ HID_REQ_SET_REPORT, USB_DIR_OUT |
|
||||
+ USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
+ 0x0301, 0x01, rep, sizeof(*rep),
|
||||
+ 2000);
|
||||
+ if (rc != -EPIPE)
|
||||
+ break;
|
||||
+
|
||||
+ usleep_range(1000 << tries, 3000 << tries);
|
||||
+ } while (++tries < 5);
|
||||
+
|
||||
+ kfree(rep);
|
||||
+ return (rc > 0) ? 0 : rc;
|
||||
+}
|
||||
+
|
||||
+static int apple_magic_keyboard_backlight_set(struct apple_magic_backlight *backlight,
|
||||
+ char brightness, char rate)
|
||||
+{
|
||||
+ int rc;
|
||||
+
|
||||
+ if (!brightness)
|
||||
+ return apple_magic_keyboard_backlight_power_set(backlight, 0, rate);
|
||||
+
|
||||
+ rc = apple_magic_keyboard_backlight_brightness_set(backlight, brightness, rate);
|
||||
+ if (rc)
|
||||
+ return rc;
|
||||
+
|
||||
+ if (!backlight->powered && brightness)
|
||||
+ rc = apple_magic_keyboard_backlight_power_set(backlight, 1, rate);
|
||||
+
|
||||
+ return (rc > 0) ? 0 : rc;
|
||||
+}
|
||||
+
|
||||
+static int apple_magic_keyboard_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);
|
||||
+
|
||||
+ return apple_magic_keyboard_backlight_set(backlight, brightness, 1);
|
||||
+}
|
||||
+
|
||||
+static int apple_magic_keyboard_backlight_init(struct appletb_device *tb_dev)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ tb_dev->kbd_backlight.dev = interface_to_usbdev(tb_dev->disp_iface.usb_iface);
|
||||
+ tb_dev->kbd_backlight.cdev.name = "apple::kbd_backlight";
|
||||
+ tb_dev->kbd_backlight.cdev.max_brightness = APPLE_MAGIC_KBD_BL_MAX;
|
||||
+ tb_dev->kbd_backlight.cdev.brightness_set_blocking = apple_magic_keyboard_backlight_led_set;
|
||||
+
|
||||
+ ret = apple_magic_keyboard_backlight_set(&tb_dev->kbd_backlight, 0, 0);
|
||||
+ if (ret) {
|
||||
+ dev_err(tb_dev->log_dev,
|
||||
+ "Failed to initialise Magic Keyboard Backlight (%d)\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return devm_led_classdev_register(tb_dev->log_dev, &tb_dev->kbd_backlight.cdev);
|
||||
+}
|
||||
+
|
||||
static int appletb_set_tb_disp(struct appletb_device *tb_dev,
|
||||
unsigned char disp)
|
||||
{
|
||||
@@ -881,6 +1041,13 @@ static int appletb_inp_connect(struct input_handler *handler,
|
||||
if (id->driver_info == APPLETB_DEVID_KEYBOARD) {
|
||||
handle = &tb_dev->kbd_handle;
|
||||
handle->name = "tbkbd";
|
||||
+ switch (dev->id.product) {
|
||||
+ case 0x0340u: /* MacBookPro16,1/4 */
|
||||
+ case 0x027eu: /* MacBookPro16,2 */
|
||||
+ case 0x027fu: /* MacBookPro16,3 */
|
||||
+ apple_magic_keyboard_backlight_init(tb_dev);
|
||||
+ break;
|
||||
+ }
|
||||
} else if (id->driver_info == APPLETB_DEVID_TOUCHPAD) {
|
||||
handle = &tb_dev->tpd_handle;
|
||||
handle->name = "tbtpad";
|
||||
--
|
||||
2.38.1
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 17d3c266246722505ef5bddd470d532d2dd75a3f Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Garg <gargaditya08@live.com>
|
||||
Date: Mon, 7 Nov 2022 01:17:17 +0530
|
||||
Subject: [PATCH 6/6] HID: quirks: Use touchbar quirks when touchbar driver is
|
||||
enabled
|
||||
|
||||
Signed-off-by: Aditya Garg <gargaditya08@live.com>
|
||||
---
|
||||
drivers/hid/hid-quirks.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
||||
index cc862fbf1995..32ff8b7b336f 100644
|
||||
--- a/drivers/hid/hid-quirks.c
|
||||
+++ b/drivers/hid/hid-quirks.c
|
||||
@@ -314,12 +314,14 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021) },
|
||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT) },
|
||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_DISPLAY) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_APPLE_IBRIDGE)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IBRIDGE) },
|
||||
#endif
|
||||
+#if IS_ENABLED(CONFIG_HID_APPLE_TOUCHBAR)
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_DISPLAY) },
|
||||
+#endif
|
||||
#if IS_ENABLED(CONFIG_HID_APPLEIR)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
|
||||
--
|
||||
2.38.1
|
||||
|
||||
@@ -1,144 +0,0 @@
|
||||
From 4f50f041554c78aaa821585ce583946ecdae91b3 Mon Sep 17 00:00:00 2001
|
||||
From: Ard Biesheuvel <ardb@kernel.org>
|
||||
Date: Thu, 27 Oct 2022 15:52:31 +0200
|
||||
Subject: efi: efivars: Fix variable writes with unsupported
|
||||
query_variable_store()
|
||||
|
||||
Commit 8a254d90a775 ("efi: efivars: Fix variable writes without
|
||||
query_variable_store()") addressed an issue that was introduced during
|
||||
the EFI variable store refactor, where alternative implementations of
|
||||
the efivars layer that lacked query_variable_store() would no longer
|
||||
work.
|
||||
|
||||
Unfortunately, there is another case to consider here, which was missed:
|
||||
if the efivars layer is backed by the EFI runtime services as usual, but
|
||||
the EFI implementation predates the introduction of QueryVariableInfo(),
|
||||
we will return EFI_UNSUPPORTED, and this is no longer being dealt with
|
||||
correctly.
|
||||
|
||||
So let's fix this, and while at it, clean up the code a bit, by merging
|
||||
the check_var_size() routines as well as their callers.
|
||||
|
||||
Cc: <stable@vger.kernel.org> # v6.0
|
||||
Fixes: bbc6d2c6ef22 ("efi: vars: Switch to new wrapper layer")
|
||||
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
|
||||
---
|
||||
drivers/firmware/efi/vars.c | 68 +++++++++++++--------------------------------
|
||||
1 file changed, 20 insertions(+), 48 deletions(-)
|
||||
|
||||
diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
|
||||
index 433b615871395..0ba9f18312f5b 100644
|
||||
--- a/drivers/firmware/efi/vars.c
|
||||
+++ b/drivers/firmware/efi/vars.c
|
||||
@@ -21,29 +21,22 @@ static struct efivars *__efivars;
|
||||
|
||||
static DEFINE_SEMAPHORE(efivars_lock);
|
||||
|
||||
-static efi_status_t check_var_size(u32 attributes, unsigned long size)
|
||||
-{
|
||||
- const struct efivar_operations *fops;
|
||||
-
|
||||
- fops = __efivars->ops;
|
||||
-
|
||||
- if (!fops->query_variable_store)
|
||||
- return (size <= SZ_64K) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;
|
||||
-
|
||||
- return fops->query_variable_store(attributes, size, false);
|
||||
-}
|
||||
-
|
||||
-static
|
||||
-efi_status_t check_var_size_nonblocking(u32 attributes, unsigned long size)
|
||||
+static efi_status_t check_var_size(bool nonblocking, u32 attributes,
|
||||
+ unsigned long size)
|
||||
{
|
||||
const struct efivar_operations *fops;
|
||||
+ efi_status_t status;
|
||||
|
||||
fops = __efivars->ops;
|
||||
|
||||
if (!fops->query_variable_store)
|
||||
+ status = EFI_UNSUPPORTED;
|
||||
+ else
|
||||
+ status = fops->query_variable_store(attributes, size,
|
||||
+ nonblocking);
|
||||
+ if (status == EFI_UNSUPPORTED)
|
||||
return (size <= SZ_64K) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;
|
||||
-
|
||||
- return fops->query_variable_store(attributes, size, true);
|
||||
+ return status;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -195,26 +188,6 @@ efi_status_t efivar_get_next_variable(unsigned long *name_size,
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(efivar_get_next_variable, EFIVAR);
|
||||
|
||||
-/*
|
||||
- * efivar_set_variable_blocking() - local helper function for set_variable
|
||||
- *
|
||||
- * Must be called with efivars_lock held.
|
||||
- */
|
||||
-static efi_status_t
|
||||
-efivar_set_variable_blocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
- u32 attr, unsigned long data_size, void *data)
|
||||
-{
|
||||
- efi_status_t status;
|
||||
-
|
||||
- if (data_size > 0) {
|
||||
- status = check_var_size(attr, data_size +
|
||||
- ucs2_strsize(name, 1024));
|
||||
- if (status != EFI_SUCCESS)
|
||||
- return status;
|
||||
- }
|
||||
- return __efivars->ops->set_variable(name, vendor, attr, data_size, data);
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* efivar_set_variable_locked() - set a variable identified by name/vendor
|
||||
*
|
||||
@@ -228,23 +201,21 @@ efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
|
||||
efi_set_variable_t *setvar;
|
||||
efi_status_t status;
|
||||
|
||||
- if (!nonblocking)
|
||||
- return efivar_set_variable_blocking(name, vendor, attr,
|
||||
- data_size, data);
|
||||
+ if (data_size > 0) {
|
||||
+ status = check_var_size(nonblocking, attr,
|
||||
+ data_size + ucs2_strsize(name, 1024));
|
||||
+ if (status != EFI_SUCCESS)
|
||||
+ return status;
|
||||
+ }
|
||||
|
||||
/*
|
||||
* If no _nonblocking variant exists, the ordinary one
|
||||
* is assumed to be non-blocking.
|
||||
*/
|
||||
- setvar = __efivars->ops->set_variable_nonblocking ?:
|
||||
- __efivars->ops->set_variable;
|
||||
+ setvar = __efivars->ops->set_variable_nonblocking;
|
||||
+ if (!setvar || !nonblocking)
|
||||
+ setvar = __efivars->ops->set_variable;
|
||||
|
||||
- if (data_size > 0) {
|
||||
- status = check_var_size_nonblocking(attr, data_size +
|
||||
- ucs2_strsize(name, 1024));
|
||||
- if (status != EFI_SUCCESS)
|
||||
- return status;
|
||||
- }
|
||||
return setvar(name, vendor, attr, data_size, data);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(efivar_set_variable_locked, EFIVAR);
|
||||
@@ -264,7 +235,8 @@ efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
if (efivar_lock())
|
||||
return EFI_ABORTED;
|
||||
|
||||
- status = efivar_set_variable_blocking(name, vendor, attr, data_size, data);
|
||||
+ status = efivar_set_variable_locked(name, vendor, attr, data_size,
|
||||
+ data, false);
|
||||
efivar_unlock();
|
||||
return status;
|
||||
}
|
||||
--
|
||||
cgit
|
||||
|
||||
Reference in New Issue
Block a user