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: 13957857 X-Patchwork-Delegate: jikos@jikos.cz 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) },