From patchwork Mon Feb 3 17:03:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Aditya Garg X-Patchwork-Id: 861660 Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazolkn19010004.outbound.protection.outlook.com [52.103.67.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0208F20E016; Mon, 3 Feb 2025 17:03:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.103.67.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602234; cv=fail; b=YWLmTVJEHQ7cKNbcp0mnNfDvGrdiq5CKfqDF3bF9jGVP9xRMvtyNENAgcTpHqcG3SQmE2GSNmVhQbP3R2TdS6APmHroib/gbEQoDelEMG6i8NdomFA6/xL9X3ODAxuTjJNmpPDYZRLutgppe/Pk0jKDNurY2J38JvdKKEl6bH0M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602234; c=relaxed/simple; bh=xBU/25vaJozt1v6fkIuEWIKWpOF+JiqVFCAz7WHOJyA=; h=From:To:CC:Subject:Date:Message-ID:References:In-Reply-To: Content-Type:MIME-Version; b=MJce4CJ1YFKeEzq1uav+pT6bdGVM6Q4eWf6ZJZnoy5czmhLCJtjuxK+aHlvUq21BlC2HNg1eIHCjFiurs4ArqZS0bYWy2+MH94S2kZ8hE2KYtUonrZv0wItwxMihV83nu9IF4amtUQ1A04DQYiu6DeQh0fDI2lVgGouvEIgQsMU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=live.com; spf=pass smtp.mailfrom=live.com; dkim=pass (2048-bit key) header.d=live.com header.i=@live.com header.b=NqDfGXKU; arc=fail smtp.client-ip=52.103.67.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=live.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=live.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=live.com header.i=@live.com header.b="NqDfGXKU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IT8H5cb2v0jpSpzv0+6FUvpzTcfs7tOX6kiZLikkir8q+en5eVWQxV6x+9ikXRWLSY91VLCeDnVEddoC+IXnULTDZI7DnlPyHbOX0TnRNzE7FVP06zn6HDaL8D/hMo0WFrWjh2yPcEfpektfyC51BQ0R3oEXk2aDa83+YflD/Nhn3EW8r7oL05c4c7F0g5j/UoQHJCRBC0pBrnIWtEx5VhBPmvu/6IfIgkBpCq//z31mb2YcJbvrSYrdow45u0bW8liffG8R99OVtQtWFaaIE0UKY9xBJHrig+I4OMxkW5Ly29tycSphBBm8n/Hn6m5ckFlmaroYIpqn9rnajCylTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xBU/25vaJozt1v6fkIuEWIKWpOF+JiqVFCAz7WHOJyA=; b=UQREmx+6fh4VUNc3i2umKFBJ1S/oLS/hhqcvo/yvyvo5B/tz/OfhtEjqdPX0y+6llWD5KQUbudBCkSQbwjWQgi2xongRdPfwDR2tl5llKFo79idcfPY69A4d8RyC37B47+yA1xVN9X7IdIPfJ2qfF4XSlE4MjL2wbHs9FD/r/gn7R34Y6Avbz373gs/a41JPIJLHDHyJQbdqJdmwfbhcsm/GIQ+l+dHqCLEnwxCShx8IGzLR4B8FRBkMIJqLRq7sp+IeTl2k3kVwvaOOFTORtreN+PlEX4mgoUG+YRAHHyYn7kAjwmXQNUi82ln35Q2TA4bMKC+1JJqsBHowYoUfzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=live.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xBU/25vaJozt1v6fkIuEWIKWpOF+JiqVFCAz7WHOJyA=; b=NqDfGXKULi9qFZyUk8enyqbpVi525i6lWfaot/vY03vzYY/WDZZfQ0byECnEm9eI0B33i+rOOAsIGSUl9PsD/QI10BTlo0UtRx7K2fJGX4gUEat0fFSumMrn2csUXdxwTj24coWSStvcVKRg9Qyp7ap2ZIyMR3wRkERdlv7m7vsXmpLQbpJjbHRuOaJK5DViC7FgvAgaOTOGNvfb+18DNzXLrsgDPxl8wYHVTRKqG1wEdNwxWCyf2YSs6ADVqN0kcNtb/2Ac0hU7C+9zelNi9smBn4ZyZnhjsRSBGKyMb6h5aOVUHJXz8ymiIXRa8fVPFsmULYAU45FtnhzYRUlJYg== Received: from MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a01:a7::7) by PN3PR01MB8673.INDPRD01.PROD.OUTLOOK.COM (2603:1096:c01:d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.25; Mon, 3 Feb 2025 17:03:46 +0000 Received: from MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM ([fe80::21af:2873:67f3:302b]) by MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM ([fe80::21af:2873:67f3:302b%4]) with mapi id 15.20.8398.025; Mon, 3 Feb 2025 17:03:46 +0000 From: Aditya Garg To: Jiri Kosina , "bentiss@kernel.org" , Benjamin Tissoires , =?utf-8?q?Thomas_Wei?= =?utf-8?q?=C3=9Fschuh?= , =?utf-8?q?Thomas_Wei=C3=9Fs?= =?utf-8?q?chuh?= , "jkosina@suse.cz" CC: Kerem Karabay , Orlando Chamberlain , Linux Kernel Mailing List , "linux-input@vger.kernel.org" Subject: [PATCH RESEND v2 1/4] HID: hid-appletb-bl: add driver for the backlight of Apple Touch Bars Thread-Topic: [PATCH RESEND v2 1/4] HID: hid-appletb-bl: add driver for the backlight of Apple Touch Bars Thread-Index: AQHbdl2Wd+Yw7Q/sf0mjy3neBlF4YA== Date: Mon, 3 Feb 2025 17:03:46 +0000 Message-ID: References: <5AEC08E1-0AEF-49BF-94F6-AA1AD71545D0@live.com> In-Reply-To: <5AEC08E1-0AEF-49BF-94F6-AA1AD71545D0@live.com> Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MAZPR01MB8280:EE_|PN3PR01MB8673:EE_ x-ms-office365-filtering-correlation-id: 93b98082-c0ba-47a8-1d83-08dd4474b91f x-microsoft-antispam: BCL:0; ARA:14566002|8062599003|461199028|7092599003|15080799006|19110799003|8060799006|102099032|3412199025|440099028|41001999003; x-microsoft-antispam-message-info: =?utf-8?q?7LwJKtInpiGJANl7SpwaKyNpTq6zrPe?= =?utf-8?q?A91i+9gzpZJSkKMSyfAOZXC9VEAvLYdR2aUir6nqAU1Q5bZeIE8NicM3xu0Zgp3Il?= =?utf-8?q?NEEq1on7ZUw8Ou8kal6tSA8O0zFWx77pcWGXWYBwVqxpZvj6nRAhQJ6g7lCBkB+on?= =?utf-8?q?yY/qrZqoeAaPCYVtYAfE/PiaZ/TsfBZugQNdqN1vwBFz30XqkRsKS9GSLvoYrV+MA?= =?utf-8?q?rw4m5AsWf71pzD+L9Y11Gtq8cE0VKyk6+HIXnQHfeprgnh8/t1oSMlgK6vbQ/OjrU?= =?utf-8?q?lMoQTxzTHb3DQVELu3Z04vOGpIrJRYxxmV29ecNdeUoLpN6L2GiVR4KTZkQmZzvQL?= =?utf-8?q?kXQwdEQ783WpETY1zrTTHXubGV7Vkz1oW1dEMNytTMhuUsAFLZeRmM6YP6x+WsQQe?= =?utf-8?q?ytgYYpObltukhDW9xZnIeOYLsCzS1e4h5QRMQNcIDL5V8hKNkRVGx/ybf2IPSsDI6?= =?utf-8?q?ONSZB6cLrjPYrcUb8K3rS08OYnJCkwcofeE7sdYAKnnjjfmfvPGd9dlXSgQ5yCPjJ?= =?utf-8?q?gTItXwXzpmTGa+gMYg2xEBGCAEO//MGrABIob7bBtwaX6zqND3yrr5OQxHGhMBYaq?= =?utf-8?q?QFbkpCycoU8+FD/KF0KpPE5iRST4cBp9DB05YSrnMnN6szQ0S11f0eQfsinuSBfsQ?= =?utf-8?q?cGChle2g9Tblfjm41Dq/+eT0LOnbmtp0yxq6DqFZwkXvsZWJj8193AIwHJ0uy+nJO?= =?utf-8?q?xjWu4KxYeZLMTXzM+TeJSY4btw+W8UKCuLTFdkfqTF5PfyB5omdEimNH5UohNnW6r?= =?utf-8?q?NNxhPYeLFUVisA/9OOJicYeRAmeF25NC2POtpR5odxbmqJeSk7SmMqSHqnqpHycsA?= =?utf-8?q?W5JjK0Rl1ttCYPp61W39JdcTgZ/L2gFk2TU86rF4TNrf3PzFr5bwc2Xdx6an0fIB2?= =?utf-8?q?oJ4FWZ6mDvgQUyZXmBT17bNlSiRYyiDX1cy4wua9JCJnDVkUXrf8SbIEZ7RJ3OjE3?= =?utf-8?q?fUFC1gE/ZpgUS1ceG+0PECX9ofgyFXBnH8ZN/iE6EFrw26IJbxBfPQq2mOGEiYz+h?= =?utf-8?q?9rOM52fEBhRfoEsKfRTkRLNeMiDB2q1HC17GB97FsBs7iRIqqOxW5fKwwWVE=3D?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?q?Rbi3zQf6IvE+XBjqjSdIPoMBhaok?= =?utf-8?q?Za3rFKnz07xrkKtSc4go+rtgPM0Okk8AkkUudV1U8PCIRHmFthquDD/N+vsU9YR+V?= =?utf-8?q?paG3SlxHyparcOxszO/Y3EJDg+HT7d8cBE2/cT2oY9Uqw4bew/JzSW5rQ6n3UjsvY?= =?utf-8?q?9Z32nrk0YviGOQ/BUem/4wsT2Z9xcnwaPH2LmtF9KZH7dp1uzw1hNS8hOgvvJGMx5?= =?utf-8?q?Isj2jyz0//Aql8HU8gg6WLQhsPfNTN1SagTJvEEADfmf9XmZhEgNncDWaeK5NpXxh?= =?utf-8?q?UN2Jm55cZA31mhmevyOuKgtdqgI1ba15wvJqthHLuBj/YgR/0VuTdGAzslyGOuHBF?= =?utf-8?q?BSKdEWdMgGmV2FdCJDtWpqb/YXFUcF2WloIKRjRz1qKYGRGI4xO0dvXo9t4eDplKv?= =?utf-8?q?tPa4wB30ZpwvoFyw9PHP/4bc+fiVYqwqSnMF0+az/TKGud4p7iglM4O4Nw1PS8Yvp?= =?utf-8?q?hXaLszc65+ChPDWnen1fvmvUMuc2xGOtWMIQBlkl8IMddvv+r20y+RjRFbdKtQdTH?= =?utf-8?q?5AnHxlR3PZjXDVRhu/AFSBxzC/SvU8L0aYb/5cjefte9ss643dkwms+oAI7fSbuol?= =?utf-8?q?HU/15Bvv/QqaEc5Dj9iTAOU7dVKZNNPFKe0rrfES4I7mBGAGd3cApPT+gJG3w1b5Q?= =?utf-8?q?9qbuUi6nGBQGja3YeGWQfPPMeNdayVW46kLFMAYcbNsd2wbRlyzItcdQtDm1iK+3e?= =?utf-8?q?7RL+kZ9LlBATgIa0DFFqcAWfb2/Eo5oZ5WOsR94Xz+ugghRoSCm+LtA11Z5UWlJsV?= =?utf-8?q?cjQvaO6pW9Jqbvb93tjq+IhVCQpFJw7rupXaOpgbC+CUbhVTS+Li6EA8I+2PpdjMQ?= =?utf-8?q?bvimDc7ERQN10gxqy0eg2Rm5VmNi7AwKHiWjAmMi4QucPKsPRlxx46Apzx/Gk169w?= =?utf-8?q?fGpQNurCbib59tp5QBj7Q3YDznPBvYeE6axow0eNJDw6JV9CM1rTr2DHCY0LPrSc/?= =?utf-8?q?wpuhJawuV2x70BIa4F+KFyqeaFcTEr/KgVn7P8ChDPVkXRqsRvELO3Z+3y++RoxU2?= =?utf-8?q?DhS7vVvj3Au+pqd8I6AbTzaFPUzABxRtMwFtPRypH/THIc9erQTF//lc+7oT3E9zZ?= =?utf-8?q?DEBh2NyhqX1IdcIm84s+xOUgynIkkoTCGXIhwSbaeAzi97vBxYrXdHjDoRegq+Z0n?= =?utf-8?q?ify9WiZ3NzBc7Vfmb8dZ5hXTmtamrj6hHYlVaDjADqaanMceWEOnOSugUIxQE=3D?= Content-ID: Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-7719-20-msonline-outlook-ae5c4.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 93b98082-c0ba-47a8-1d83-08dd4474b91f X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Feb 2025 17:03:46.9006 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN3PR01MB8673 From: Kerem Karabay This commit adds a driver for the backlight of Apple Touch Bars on x86 Macs. Note that currently only T2 Macs are supported. This driver is based on previous work done by Ronald Tschalär . Signed-off-by: Kerem Karabay Co-developed-by: Aditya Garg Signed-off-by: Aditya Garg --- drivers/hid/Kconfig | 10 ++ drivers/hid/Makefile | 1 + drivers/hid/hid-appletb-bl.c | 207 +++++++++++++++++++++++++++++++++++ drivers/hid/hid-quirks.c | 4 +- 4 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 drivers/hid/hid-appletb-bl.c diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 4d2a89d65..f6678db27 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -148,6 +148,16 @@ config HID_APPLEIR Say Y here if you want support for Apple infrared remote control. +config HID_APPLETB_BL + tristate "Apple Touch Bar Backlight" + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want support for the backlight of Touch Bars on x86 + MacBook Pros. + + To compile this driver as a module, choose M here: the + module will be called hid-appletb-bl. + config HID_ASUS tristate "Asus" depends on USB_HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 24de45f36..444d24cec 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -29,6 +29,7 @@ obj-$(CONFIG_HID_ALPS) += hid-alps.o obj-$(CONFIG_HID_ACRUX) += hid-axff.o 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_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-appletb-bl.c b/drivers/hid/hid-appletb-bl.c new file mode 100644 index 000000000..819157686 --- /dev/null +++ b/drivers/hid/hid-appletb-bl.c @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Apple Touch Bar Backlight Driver + * + * Copyright (c) 2017-2018 Ronald Tschalär + * Copyright (c) 2022-2023 Kerem Karabay + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +#include "hid-ids.h" + +#define APPLETB_BL_ON 1 +#define APPLETB_BL_DIM 3 +#define APPLETB_BL_OFF 4 + +#define HID_UP_APPLEVENDOR_TB_BL 0xff120000 + +#define HID_VD_APPLE_TB_BRIGHTNESS 0xff120001 +#define HID_USAGE_AUX1 0xff120020 +#define HID_USAGE_BRIGHTNESS 0xff120021 + +static int appletb_bl_def_brightness = 2; +module_param_named(brightness, appletb_bl_def_brightness, int, 0444); +MODULE_PARM_DESC(brightness, "Default brightness:\n" + " 0 - Touchbar is off\n" + " 1 - Dim brightness\n" + " [2] - Full brightness"); + +struct appletb_bl { + struct hid_field *aux1_field, *brightness_field; + struct backlight_device *bdev; + + bool full_on; +}; + +static const u8 appletb_bl_brightness_map[] = { + APPLETB_BL_OFF, + APPLETB_BL_DIM, + APPLETB_BL_ON, +}; + +static int appletb_bl_set_brightness(struct appletb_bl *bl, u8 brightness) +{ + struct hid_report *report = bl->brightness_field->report; + struct hid_device *hdev = report->device; + int ret; + + ret = hid_set_field(bl->aux1_field, 0, 1); + if (ret) { + hid_err(hdev, "Failed to set auxiliary field (%pe)\n", ERR_PTR(ret)); + return ret; + } + + ret = hid_set_field(bl->brightness_field, 0, brightness); + if (ret) { + hid_err(hdev, "Failed to set brightness field (%pe)\n", ERR_PTR(ret)); + return ret; + } + + if (!bl->full_on) { + ret = hid_hw_power(hdev, PM_HINT_FULLON); + if (ret < 0) { + hid_err(hdev, "Device didn't power on (%pe)\n", ERR_PTR(ret)); + return ret; + } + + bl->full_on = true; + } + + hid_hw_request(hdev, report, HID_REQ_SET_REPORT); + + if (brightness == APPLETB_BL_OFF) { + hid_hw_power(hdev, PM_HINT_NORMAL); + bl->full_on = false; + } + + return 0; +} + +static int appletb_bl_update_status(struct backlight_device *bdev) +{ + struct appletb_bl *bl = bl_get_data(bdev); + u8 brightness; + + if (backlight_is_blank(bdev)) + brightness = APPLETB_BL_OFF; + else + brightness = appletb_bl_brightness_map[backlight_get_brightness(bdev)]; + + return appletb_bl_set_brightness(bl, brightness); +} + +static const struct backlight_ops appletb_bl_backlight_ops = { + .options = BL_CORE_SUSPENDRESUME, + .update_status = appletb_bl_update_status, +}; + +static int appletb_bl_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + struct hid_field *aux1_field, *brightness_field; + struct backlight_properties bl_props = { 0 }; + struct device *dev = &hdev->dev; + struct appletb_bl *bl; + int ret; + + ret = hid_parse(hdev); + if (ret) + return dev_err_probe(dev, ret, "HID parse failed\n"); + + aux1_field = hid_find_field(hdev, HID_FEATURE_REPORT, + HID_VD_APPLE_TB_BRIGHTNESS, HID_USAGE_AUX1); + + brightness_field = hid_find_field(hdev, HID_FEATURE_REPORT, + HID_VD_APPLE_TB_BRIGHTNESS, HID_USAGE_BRIGHTNESS); + + if (!aux1_field || !brightness_field) + return -ENODEV; + + if (aux1_field->report != brightness_field->report) + return dev_err_probe(dev, -ENODEV, "Encountered unexpected report structure\n"); + + bl = devm_kzalloc(dev, sizeof(*bl), GFP_KERNEL); + if (!bl) + return -ENOMEM; + + ret = hid_hw_start(hdev, HID_CONNECT_DRIVER); + if (ret) + return dev_err_probe(dev, ret, "HID hardware start failed\n"); + + ret = hid_hw_open(hdev); + if (ret) { + dev_err_probe(dev, ret, "HID hardware open failed\n"); + goto stop_hw; + } + + bl->aux1_field = aux1_field; + bl->brightness_field = brightness_field; + + if (appletb_bl_def_brightness == 0) + ret = appletb_bl_set_brightness(bl, APPLETB_BL_OFF); + else if (appletb_bl_def_brightness == 1) + ret = appletb_bl_set_brightness(bl, APPLETB_BL_DIM); + else + ret = appletb_bl_set_brightness(bl, APPLETB_BL_ON); + + if (ret) { + dev_err_probe(dev, ret, "Failed to set touch bar brightness to off\n"); + goto close_hw; + } + + bl_props.type = BACKLIGHT_RAW; + bl_props.max_brightness = ARRAY_SIZE(appletb_bl_brightness_map) - 1; + + bl->bdev = devm_backlight_device_register(dev, "appletb_backlight", dev, bl, + &appletb_bl_backlight_ops, &bl_props); + if (IS_ERR(bl->bdev)) { + ret = PTR_ERR(bl->bdev); + dev_err_probe(dev, ret, "Failed to register backlight device\n"); + goto close_hw; + } + + hid_set_drvdata(hdev, bl); + + return 0; + +close_hw: + hid_hw_close(hdev); +stop_hw: + hid_hw_stop(hdev); + + return ret; +} + +static void appletb_bl_remove(struct hid_device *hdev) +{ + struct appletb_bl *bl = hid_get_drvdata(hdev); + + appletb_bl_set_brightness(bl, APPLETB_BL_OFF); + + hid_hw_close(hdev); + hid_hw_stop(hdev); +} + +static const struct hid_device_id appletb_bl_hid_ids[] = { + /* MacBook Pro's 2018, 2019, with T2 chip: iBridge DFR Brightness */ + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT) }, + { } +}; +MODULE_DEVICE_TABLE(hid, appletb_bl_hid_ids); + +static struct hid_driver appletb_bl_hid_driver = { + .name = "hid-appletb-bl", + .id_table = appletb_bl_hid_ids, + .probe = appletb_bl_probe, + .remove = appletb_bl_remove, +}; +module_hid_driver(appletb_bl_hid_driver); + +MODULE_AUTHOR("Ronald Tschalär"); +MODULE_AUTHOR("Kerem Karabay "); +MODULE_DESCRIPTION("MacBookPro Touch Bar Backlight Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index e0bbf0c63..818d41a35 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -328,7 +328,6 @@ 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_APPLEIR) @@ -338,6 +337,9 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) }, #endif +#if IS_ENABLED(CONFIG_HID_APPLETB_BL) + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT) }, +#endif #if IS_ENABLED(CONFIG_HID_ASUS) { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD) }, { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD) }, From patchwork Mon Feb 3 17:03:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aditya Garg X-Patchwork-Id: 861661 Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazolkn19010004.outbound.protection.outlook.com [52.103.67.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8472020ADE0; Mon, 3 Feb 2025 17:03:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.103.67.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602229; cv=fail; b=OH04vOHxa1Eu/BIfsOs6/vkJyoWhbQzzY3+JWMUXOks3HhRSstEnT8+vloA1V7o6v4ctXKmKNs/GxsDfgo9/mmFpoxjA80Mv7o0UUVUl5IFYs7PurafE2UR3futei+6KwmmeTTulK7hu9OGO5goOEVn6vPAqRIqvIEsNTXvCVyA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602229; c=relaxed/simple; bh=3mz6Axn8y/+plncvXp/+66j7MYDyHlf4AYZpWN7weFg=; h=From:To:CC:Subject:Date:Message-ID:References:In-Reply-To: Content-Type:MIME-Version; b=vGH8to0kMJGG8a9t37p7U9sahGu2KpVmMJ9BU3oetw2SqgexnMsE2+mNHkibMuo7ahWVg5wUwm/rtGkn9V6M5LOGbbn3vX578kRz7+G4eQrfwxNTccYivAjHjSCUyJdpfondwGC7t3vUa3b0g3CB/tO4xR8XfJRePt4ocSZ4xLo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=live.com; spf=pass smtp.mailfrom=live.com; dkim=pass (2048-bit key) header.d=live.com header.i=@live.com header.b=IH71udQp; arc=fail smtp.client-ip=52.103.67.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=live.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=live.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=live.com header.i=@live.com header.b="IH71udQp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vPVbzYiwOdpSmJFKsKh7VU8oYH+VPMozf7j1Zp5I4ZkU8lrJ458oZkaI1+VQ2mmam6ZoZSbIbRWOq5cgdSK1+GZ+9tKA4f1RLG7gyHomJmAE198yQfL5omtsn1znjcZeDwycpxt8tNktwnFxq69Sq9zDCaZ6R98X60tJvRwdYmhfKsE2hfUQMnLJ56vBxjcP7X53SI4AQgd4Wexuc07hPqG/mPS+K6+p8mp34sgRb5zM9kz70Vw8XWFt6//WY8IKA1G0lSVmFfXnLeQbpGh1MgdNBE+xk4qgGCdmWkGPjN38Uj9dLSsmqc/VkbHrdpOFkZBcGfq8X+jpG1F7iPziQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1VBoik1et6ZCxTD6sE8zAbSU02w5p31wr/Vj6VJ2+EQ=; b=kE/ygTlKrxqs1zATR1V69lDY9lS6CUAcTdxoXLTBr9ySytcMzsJtlt6fekkvHRMJmvaKDTSFi2CxIzNK4DYTMBq0gjVOMMdgoYaKHcBZX4Inw81PYnvfPHk4/Ksruq38fw5ajRUF3GEPHDWYxUzMmbBJspMlJkDtADbWUcUnIZqm23ca5CqEFTa13BDEWUg9It5uN65SuBKaq/hhqQQ070V43o4jV3idof+Zn6kgbITmma+JtY6ZsVdAh8qKnT4PYD2BQclYtOfi3yAUsDsbKqDeGGJ/0cmY4m8zyxk4OiyvLNC3q7WGshdKNnk9ATmXwlIyNQwnpT8Mm5OHIJitCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=live.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1VBoik1et6ZCxTD6sE8zAbSU02w5p31wr/Vj6VJ2+EQ=; b=IH71udQpqoUv3YZMFi9ytmfdAecMiGNNO1C8MXbqtLeeAytsukWP1C8/4r9D+nGRFLL/MnBazszKtSJ4M7FNh0jUiNB/UF5Kp6r6dNKQUPMneI2WJ8WhbYfeZ6Q9HsucDFls9o0rJTnbCVgBreYAb5owc/6cowtgNX0uf6J5mihwv/s8hTctfbm6WajIRoYW4LRXqBZGulRFogNxvrOOTh7lTw+webg/NLsdA/tvvTnzkvq0Xn++E0iddGDwpcRKfhtsnzMvitru0wfG3E7skOy2LEbE6+FEsRbB01xz5s0r0foyM13d3neXgduV2S2vPKP/vUjXZzlhWR1kNKnAaA== Received: from MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a01:a7::7) by PN3PR01MB8673.INDPRD01.PROD.OUTLOOK.COM (2603:1096:c01:d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.25; Mon, 3 Feb 2025 17:03:42 +0000 Received: from MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM ([fe80::21af:2873:67f3:302b]) by MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM ([fe80::21af:2873:67f3:302b%4]) with mapi id 15.20.8398.025; Mon, 3 Feb 2025 17:03:42 +0000 From: Aditya Garg To: Jiri Kosina , "bentiss@kernel.org" , Benjamin Tissoires , =?iso-8859-1?q?Thomas_W?= =?iso-8859-1?q?ei=DFschuh?= , =?iso-8859-1?q?Thomas_W?= =?iso-8859-1?q?ei=DFschuh?= , "jkosina@suse.cz" CC: Kerem Karabay , Orlando Chamberlain , Linux Kernel Mailing List , "linux-input@vger.kernel.org" Subject: [PATCH RESEND v2 3/4] HID: hid-appletb-kbd: add support for fn toggle between media and function mode Thread-Topic: [PATCH RESEND v2 3/4] HID: hid-appletb-kbd: add support for fn toggle between media and function mode Thread-Index: AQHbdl2TbyS8TIxTd02jq+Lk9SO2jg== Date: Mon, 3 Feb 2025 17:03:42 +0000 Message-ID: <3AF1D5E7-77BC-461A-BE1C-2F9CA37A4984@live.com> References: <5AEC08E1-0AEF-49BF-94F6-AA1AD71545D0@live.com> In-Reply-To: <5AEC08E1-0AEF-49BF-94F6-AA1AD71545D0@live.com> Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MAZPR01MB8280:EE_|PN3PR01MB8673:EE_ x-ms-office365-filtering-correlation-id: 856abb93-fefa-4045-b6e0-08dd4474b67e x-microsoft-antispam: BCL:0; ARA:14566002|8062599003|461199028|7092599003|15080799006|19110799003|8060799006|102099032|3412199025|440099028|12091999003|41001999003; x-microsoft-antispam-message-info: =?iso-8859-1?q?NaU3paB4f14GVhoOMbs1vP5Ytq?= =?iso-8859-1?q?jZPrSHqDSBcMDyy1Ot+woxrBHn1LfTOg1/epNYAwH5W4Lqgydz6JPOCdsGzb?= =?iso-8859-1?q?Cib2NWHMwt0e/OZRF/5Oneli89riuRoXa3Y+PgPttYUwxyWgVp95b+J+e5/i?= =?iso-8859-1?q?0cNWvQoNV8tPfHSLQ2KUIIrSqgykmmDfafeCrB+P7erl7mL0jC1K8tdzAEUL?= =?iso-8859-1?q?8suqRFORH/0MKpzhSWj5XnTJQ+C74k2V8GoG2l5ColCik5MmsoRB4aedWr1A?= =?iso-8859-1?q?DXmkOVAqy1YyygTXgmZ2NRVHB1SF26CA85UZjWQQxlcGt40EnAgpewlsXye1?= =?iso-8859-1?q?2VZ8vvLtV1DSJNHe8VVleEo5pjag+g5Mjx0OUC/oH8kLjL8M+k6zu5DBY2RV?= =?iso-8859-1?q?cdsZ0OOu7BqpZZlUv/OSqPkQ10VPFdEKxkN9huSgjnP9jCggFzrmwyAKCg4q?= =?iso-8859-1?q?WYdJNrpACn/Paghn0gwdpKkpiW1UTY6Aalq2gI1DHcfgLwrnV/vGWpOQdZ6S?= =?iso-8859-1?q?5FZBRyHHZMbXYGIPe+8IlqhVRA0/e5DyAh3hrr7rMS1Wgj2al2yyrt2dk6zM?= =?iso-8859-1?q?KMZnghA4vMn+/hWhXdBbQ4DjPFvYvd7G8eY5lRTW9k+qqYj1dR14JRCnyMFA?= =?iso-8859-1?q?RWqC3TA+6WwsZMqF/lrSaAb68/SW/+ktCI1a6XNEMU8FYJ7FbbPsGIpULSuP?= =?iso-8859-1?q?uVpCxTRcUAtPJ3Rs0rhqKU67ofHtie5QJy/XcNvxyl7smGTvdNucl0K3VYrC?= =?iso-8859-1?q?8FnW5KXrrEREZ6uecYxN5cQAHVx9oARueguGizdCafwMrZPbrL55/yG6AyUg?= =?iso-8859-1?q?vvLBq/HrY3VFIGwqeK9g7Q8gE4loRcNQEN87/VlhVJI8EOkzrEl1IJe3Le92?= =?iso-8859-1?q?iDQ4xS02v16eNGkP1UykwAgvaicOTVRqzB1GiGpPuNkm/DBQEKnhJeDjQNk6?= =?iso-8859-1?q?WDvNyklIp9q4y1DIf5E80dpAddKqqzt7v7hm7Mn8njRfeVhCxYlHOyVWHjPJ?= =?iso-8859-1?q?HEPWDFZ3I/EiKOfNbsu74ZnuZTbusiJxLEpxEBz9q3sEVpheTyKn1qA0SQlo?= =?iso-8859-1?q?38gADQkJU9JvRv0L2kK+MpvO11MVjbNHyA+j8jes7pJTG3vtcVkzGf3R+csm?= =?iso-8859-1?q?lVr4ts0W4bDUKSoNdleen0x7tR6iHTnGSli+ekkH02V/JurIPsKAE/f8LEHw?= =?iso-8859-1?q?pa2wbYVA=3D=3D?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?nPPev+xbaIi1lCSdJTJzWFJ?= =?iso-8859-1?q?W99LK58+PnOtVG/WV7yz7sP/2DUuUcx5yPZresqe3GKsljVcM/VpX9V0oolS?= =?iso-8859-1?q?H0sA15G1rVde929kZREG+WTjAE+91wbUL+Dg7LAaFTRmOYwujJnzZ9rZ5KxW?= =?iso-8859-1?q?MHCkSUKGL4SkFl/fNWOKiQCJtCVlwDsDM73GclpxY75okJ/ewvAmziwwIkLw?= =?iso-8859-1?q?MPnpV9eK/iUe5riC1APhgggIT5bqXXChMQHDevUVcWsG4nvZ7yUdT5a+KtGO?= =?iso-8859-1?q?8UHVntwseFr4IbdQ9u67QMP7d1pC70jMmNKxYvI2z5hxplBgWPThsAEzlN67?= =?iso-8859-1?q?zccPEkqqXhAV3y25IiEHGEwRyuRIXp75xI5gYs5h22B6gE8VzGj3tqBInvvT?= =?iso-8859-1?q?qwJTO+z3zj1EANybkuJyOsdIB6eMaYZolwOMdRnB8/vt4Kgvg66KUAPOWbno?= =?iso-8859-1?q?sDnVo/V34HNhuUKDq9ASn17lHhS3YK1Q712mLp+I7miUkEW8Ux13UsLGF0/C?= =?iso-8859-1?q?knE7AmC6z8gM3YYwBOG71YTiv0lxVBBAVcgwjPH2HTOEOmp/iEGhgm03Usbx?= =?iso-8859-1?q?LEpjUaT46vx2JXa391y0/fqrqMx6edDTn37cvlvRPMT2Ja9Tz2PP7hBUR5Gx?= =?iso-8859-1?q?W6EpBbePsS+ZGh6gHeIlFI0ponQYFmMMwPKRTNb6Ebeo4LLCk8k1fgKpE5Kk?= =?iso-8859-1?q?PBG4sU6vAmn3Ni7m7P/csxMigvyAS2Qyd8sOFJeVLPPnHUv6VXTW2X/W1XxM?= =?iso-8859-1?q?4VfmhgToOVhu0SQPPI6+Pf1ozZjLz1WKNlCjPZ+FwRMoN4gFiHOOniblqne9?= =?iso-8859-1?q?MDE7Doi4KWrwrxKLP+qmKCYxKgxVO8jA4NrsQMjs+C51oIAjB39DdYT6PQRN?= =?iso-8859-1?q?UzpOfjiT1GxxrrkFku+cUdILt/Q5bagV8UGvU7/o+o+piUXIKapYduIbwrA2?= =?iso-8859-1?q?LETeWRIEMKLYSSd1QF6G7MQM3vn8PcSm8uJY7BlL4aED7sabpn6sETWjTOvZ?= =?iso-8859-1?q?SdH1RDM1tvHnoqqp/CybdTmX4pNyeoYrCNjbyaLp4P1fZCtDxdurd0rplI8h?= =?iso-8859-1?q?DoC/9axOuTnMmXhmfJD6lGKoGZckEQk4W+C4ugELKlwCCm0/NnSzMoHmCbwm?= =?iso-8859-1?q?7+1YsKFg8mWia04YkEP/z9bua4pkrYqYEtKBbhBVeLijjBpfkFZmjJWhnAZP?= =?iso-8859-1?q?kusDSIh4IArE4uFyDvOXl5jIQ8Uq7Td8IZBPZOwYweVLVYT7akPxgm3NfoQt?= =?iso-8859-1?q?CceEeubOTKQ+b7lemXq4p0UIsmFLgJPkl4Uk=3D?= Content-ID: Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-7719-20-msonline-outlook-ae5c4.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MAZPR01MB8280.INDPRD01.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 856abb93-fefa-4045-b6e0-08dd4474b67e X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Feb 2025 17:03:42.4634 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN3PR01MB8673 From: Aditya Garg This patch adds support for the switching between the Media and Function keys on the touchbar by pressing the Fn key on Apple Internal Keyboard. Signed-off-by: Aditya Garg --- drivers/hid/hid-appletb-kbd.c | 128 ++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/drivers/hid/hid-appletb-kbd.c b/drivers/hid/hid-appletb-kbd.c index 80c87396f..de5770500 100644 --- a/drivers/hid/hid-appletb-kbd.c +++ b/drivers/hid/hid-appletb-kbd.c @@ -26,6 +26,8 @@ #define APPLETB_KBD_MODE_OFF 3 #define APPLETB_KBD_MODE_MAX APPLETB_KBD_MODE_OFF +#define APPLETB_DEVID_KEYBOARD 1 + #define HID_USAGE_MODE 0x00ff0004 static int appletb_tb_def_mode = APPLETB_KBD_MODE_SPCL; @@ -35,11 +37,18 @@ MODULE_PARM_DESC(mode, "Default touchbar mode:\n" " 1 - function-keys\n" " [2] - special keys"); +static bool appletb_tb_fn_toggle = true; +module_param_named(fntoggle, appletb_tb_fn_toggle, bool, 0644); +MODULE_PARM_DESC(fntoggle, "Switch between Fn and media controls on pressing Fn key"); + struct appletb_kbd { struct hid_field *mode_field; u8 saved_mode; u8 current_mode; + struct input_handler inp_handler; + struct input_handle kbd_handle; + }; static const struct key_entry appletb_kbd_keymap[] = { @@ -172,6 +181,75 @@ static int appletb_kbd_hid_event(struct hid_device *hdev, struct hid_field *fiel return kbd->current_mode == APPLETB_KBD_MODE_OFF; } +static void appletb_kbd_inp_event(struct input_handle *handle, unsigned int type, + unsigned int code, int value) +{ + struct appletb_kbd *kbd = handle->private; + + if (type == EV_KEY && code == KEY_FN && appletb_tb_fn_toggle) { + if (value == 1) { + kbd->saved_mode = kbd->current_mode; + if (kbd->current_mode == APPLETB_KBD_MODE_SPCL) + appletb_kbd_set_mode(kbd, APPLETB_KBD_MODE_FN); + else if (kbd->current_mode == APPLETB_KBD_MODE_FN) + appletb_kbd_set_mode(kbd, APPLETB_KBD_MODE_SPCL); + } else if (value == 0) { + if (kbd->saved_mode != kbd->current_mode) + appletb_kbd_set_mode(kbd, kbd->saved_mode); + } + } +} + +static int appletb_kbd_inp_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) +{ + struct appletb_kbd *kbd = handler->private; + struct input_handle *handle; + int rc; + + if (id->driver_info == APPLETB_DEVID_KEYBOARD) { + handle = &kbd->kbd_handle; + handle->name = "tbkbd"; + } else { + return -ENOENT; + } + + if (handle->dev) + return -EEXIST; + + handle->open = 0; + handle->dev = input_get_device(dev); + handle->handler = handler; + handle->private = kbd; + + rc = input_register_handle(handle); + if (rc) + goto err_free_dev; + + rc = input_open_device(handle); + if (rc) + goto err_unregister_handle; + + return 0; + + err_unregister_handle: + input_unregister_handle(handle); + err_free_dev: + input_put_device(handle->dev); + handle->dev = NULL; + return rc; +} + +static void appletb_kbd_inp_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + + input_put_device(handle->dev); + handle->dev = NULL; +} + static int appletb_kbd_input_configured(struct hid_device *hdev, struct hid_input *hidinput) { int idx; @@ -195,6 +273,40 @@ static int appletb_kbd_input_configured(struct hid_device *hdev, struct hid_inpu return 0; } +static const struct input_device_id appletb_kbd_input_devices[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_BUS | + INPUT_DEVICE_ID_MATCH_VENDOR | + INPUT_DEVICE_ID_MATCH_KEYBIT, + .bustype = BUS_USB, + .vendor = USB_VENDOR_ID_APPLE, + .keybit = { [BIT_WORD(KEY_FN)] = BIT_MASK(KEY_FN) }, + .driver_info = APPLETB_DEVID_KEYBOARD, + }, + { } +}; + +static bool appletb_kbd_match_internal_device(struct input_handler *handler, + struct input_dev *inp_dev) +{ + struct device *dev = &inp_dev->dev; + + /* in kernel: dev && !is_usb_device(dev) */ + while (dev && !(dev->type && dev->type->name && + !strcmp(dev->type->name, "usb_device"))) + dev = dev->parent; + + /* + * Apple labels all their internal keyboards and trackpads as such, + * instead of maintaining an ever expanding list of product-id's we + * just look at the device's product name. + */ + if (dev) + return !!strstr(to_usb_device(dev)->product, "Internal Keyboard"); + + return false; +} + static int appletb_kbd_probe(struct hid_device *hdev, const struct hid_device_id *id) { struct appletb_kbd *kbd; @@ -227,6 +339,20 @@ static int appletb_kbd_probe(struct hid_device *hdev, const struct hid_device_id goto stop_hw; } + kbd->inp_handler.event = appletb_kbd_inp_event; + kbd->inp_handler.connect = appletb_kbd_inp_connect; + kbd->inp_handler.disconnect = appletb_kbd_inp_disconnect; + kbd->inp_handler.name = "appletb"; + kbd->inp_handler.id_table = appletb_kbd_input_devices; + kbd->inp_handler.match = appletb_kbd_match_internal_device; + kbd->inp_handler.private = kbd; + + ret = input_register_handler(&kbd->inp_handler); + if (ret) { + dev_err_probe(dev, ret, "Unable to register keyboard handler\n"); + goto close_hw; + } + ret = appletb_kbd_set_mode(kbd, appletb_tb_def_mode); if (ret) { dev_err_probe(dev, ret, "Failed to set touchbar mode\n"); @@ -250,6 +376,8 @@ static void appletb_kbd_remove(struct hid_device *hdev) appletb_kbd_set_mode(kbd, APPLETB_KBD_MODE_OFF); + input_unregister_handler(&kbd->inp_handler); + hid_hw_close(hdev); hid_hw_stop(hdev); }