From nobody Wed Apr 1 23:51:46 2026 Received: from spark.kcore.it (spark.kcore.it [49.13.27.68]) (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 DD9DD344D9A; Wed, 1 Apr 2026 20:36:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=49.13.27.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; cv=none; b=TO4FhMEn5Z9L9p42NfCFu6X6Kai5DWSGDYvefaghIJw3Xc2jRpnB9iWeScQVhmRUPmAIsZnZhQUBBAHU6tSLMVQA1K/hdfjI46vDbXvcQAz2X5IeG+N5eESz2ZVtEiTzWok/p5FlvahjceeuJrXRhWprffGx9AYm1KDcRKVad10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; c=relaxed/simple; bh=ALZeN5x7W+F6O4oZC0Em1XbKLfwkiKQ9Y1+Yv2nEVrg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=j5mo54qOTZZFCcDgD4c+KHsgq+w7guBIWwlSp4evnkKGHiYiF8FBUI3NE+2V40BYI4ForfzgyTctBizlFaWFoYyEs5zaerzYmOmIId93K0MmE4ogREWkNl/vh9N/LLf4C4gbG2c+knhMOaEUs5ZoqMLe5bqOe41z3EV5ost4N6U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it; spf=pass smtp.mailfrom=kcore.it; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b=s3e20hOv; arc=none smtp.client-ip=49.13.27.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kcore.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b="s3e20hOv" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kcore.it; s=spark; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Gy5thSL72Xzt/zFnmFbUDFRfroq9RoAqfWwVZXShMnI=; b=s3e20hOvu5x2q8DMVxel4Wxi+Q jOJyljrXNVUiE5FcMibyhcLF8uj7xfcZLLlj9jusZm612+Zea5k254Iya/p1tpyoJ/UGk3g9aBaeK 8Ni3CsPh+a78NHowfhkMGgUqfHhMkbm1dfNdbvLjU9SZjzBj/wxRzFOEywwMJ9uwYtBQ=; Received: from mnencia by spark.kcore.it with local (Exim 4.96) (envelope-from ) id 1w82Io-006ifO-20; Wed, 01 Apr 2026 22:36:38 +0200 From: Marco Nenciarini To: Daniel Scally , Sakari Ailus , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Cc: Andy Shevchenko , Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Marco Nenciarini Subject: [PATCH v8 1/4] platform/x86: int3472: Use local variable for LED struct access Date: Wed, 1 Apr 2026 22:36:35 +0200 Message-Id: <20260401203638.1601661-2-mnencia@kcore.it> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260401203638.1601661-1-mnencia@kcore.it> References: <20260401203638.1601661-1-mnencia@kcore.it> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce a local struct int3472_pled pointer in the LED registration, unregistration, and brightness callback functions to avoid repeatedly dereferencing int3472->pled. In the brightness callback, use container_of() to get the int3472_pled struct directly instead of going through int3472_discrete_device. No functional change. Reviewed-by: Andy Shevchenko Reviewed-by: Hans de Goede Signed-off-by: Marco Nenciarini --- Cc: Andy Shevchenko Cc: Hans de Goede drivers/platform/x86/intel/int3472/led.c | 43 ++++++++++++------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/drivers/platform/x86/intel/int3472/led.c b/drivers/platform/x8= 6/intel/int3472/led.c index b1d84b968..35abad900 100644 --- a/drivers/platform/x86/intel/int3472/led.c +++ b/drivers/platform/x86/intel/int3472/led.c @@ -6,55 +6,56 @@ #include #include =20 -static int int3472_pled_set(struct led_classdev *led_cdev, - enum led_brightness brightness) +static int int3472_pled_set(struct led_classdev *led_cdev, enum led_bright= ness brightness) { - struct int3472_discrete_device *int3472 =3D - container_of(led_cdev, struct int3472_discrete_device, pled.classdev); + struct int3472_pled *led =3D container_of(led_cdev, struct int3472_pled, = classdev); =20 - gpiod_set_value_cansleep(int3472->pled.gpio, brightness); + gpiod_set_value_cansleep(led->gpio, brightness); return 0; } =20 int skl_int3472_register_pled(struct int3472_discrete_device *int3472, str= uct gpio_desc *gpio) { + struct int3472_pled *led =3D &int3472->pled; char *p; int ret; =20 - if (int3472->pled.classdev.dev) + if (led->classdev.dev) return -EBUSY; =20 - int3472->pled.gpio =3D gpio; + led->gpio =3D gpio; =20 /* Generate the name, replacing the ':' in the ACPI devname with '_' */ - snprintf(int3472->pled.name, sizeof(int3472->pled.name), + snprintf(led->name, sizeof(led->name), "%s::privacy_led", acpi_dev_name(int3472->sensor)); - p =3D strchr(int3472->pled.name, ':'); + p =3D strchr(led->name, ':'); if (p) *p =3D '_'; =20 - int3472->pled.classdev.name =3D int3472->pled.name; - int3472->pled.classdev.max_brightness =3D 1; - int3472->pled.classdev.brightness_set_blocking =3D int3472_pled_set; + led->classdev.name =3D led->name; + led->classdev.max_brightness =3D 1; + led->classdev.brightness_set_blocking =3D int3472_pled_set; =20 - ret =3D led_classdev_register(int3472->dev, &int3472->pled.classdev); + ret =3D led_classdev_register(int3472->dev, &led->classdev); if (ret) return ret; =20 - int3472->pled.lookup.provider =3D int3472->pled.name; - int3472->pled.lookup.dev_id =3D int3472->sensor_name; - int3472->pled.lookup.con_id =3D "privacy"; - led_add_lookup(&int3472->pled.lookup); + led->lookup.provider =3D led->name; + led->lookup.dev_id =3D int3472->sensor_name; + led->lookup.con_id =3D "privacy"; + led_add_lookup(&led->lookup); =20 return 0; } =20 void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472) { - if (IS_ERR_OR_NULL(int3472->pled.classdev.dev)) + struct int3472_pled *led =3D &int3472->pled; + + if (IS_ERR_OR_NULL(led->classdev.dev)) return; =20 - led_remove_lookup(&int3472->pled.lookup); - led_classdev_unregister(&int3472->pled.classdev); - gpiod_put(int3472->pled.gpio); + led_remove_lookup(&led->lookup); + led_classdev_unregister(&led->classdev); + gpiod_put(led->gpio); } --=20 2.47.3 From nobody Wed Apr 1 23:51:46 2026 Received: from spark.kcore.it (spark.kcore.it [49.13.27.68]) (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 05FDA35F8B9; Wed, 1 Apr 2026 20:36:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=49.13.27.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; cv=none; b=FinXsdkUU6Q6F8oumiGTpePMrY4bzL0RCQ0rjj5OHKkhKFQ88qNk4ImLRub/VLd+Zv3IgjMQoL3Me8s2/xk1n5wMyyxVl7r8Zd2rTaQaxw9S/B8CCT9OtAIzbbJrLpXJU45OU95Mtg7/4Fsl6diNcZNFaEg5BKBFuFB7bs7vufU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; c=relaxed/simple; bh=aP9gx44p5YtpeasjcJgz3fceK478yrZxOxh3s1yWkMk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JrbQ1dzBFdaE6KiOBXi6VMpcNqsFRsnW9GizHCUW/Odlz9Oby1QF8glJm+S0LOn0lWCJtct5VzY827JhujaUDQwviBDgGkguTHr8qzZ+RkXon23dMt7SAP+lkf8JDcRDaV5RUTp+skPBL2mEfotGNlf6/+o1GoIWecBTtumuGkY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it; spf=pass smtp.mailfrom=kcore.it; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b=FtARFkeU; arc=none smtp.client-ip=49.13.27.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kcore.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b="FtARFkeU" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kcore.it; s=spark; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=NPNshM+g8YH5F8lGB0GHngIfkl78zZ9L6+3ToWAk4WY=; b=FtARFkeUSsZP9LyWchuj76vBoq ijAI2TIJfLKK68HZiHiFnWu00K9mqCp6MvoESCMDdeKdGQ9sTTb2sLn6jPaYD9nRcUKtr9aTI8UHU PhkUun0N1OHZBL6QapS5zHJehQC5pxu0u+tNbTAEXrtIHFwyDY76B+Lsl99oBDdxK0zc=; Received: from mnencia by spark.kcore.it with local (Exim 4.96) (envelope-from ) id 1w82Io-006ifR-25; Wed, 01 Apr 2026 22:36:38 +0200 From: Marco Nenciarini To: Daniel Scally , Sakari Ailus , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Cc: Andy Shevchenko , Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Marco Nenciarini Subject: [PATCH v8 2/4] platform/x86: int3472: Rename pled to led in LED registration code Date: Wed, 1 Apr 2026 22:36:36 +0200 Message-Id: <20260401203638.1601661-3-mnencia@kcore.it> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260401203638.1601661-1-mnencia@kcore.it> References: <20260401203638.1601661-1-mnencia@kcore.it> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename the privacy LED type, struct member, and functions from "pled" to "led" in preparation for supporting additional LED types beyond just the privacy LED. No functional change. Reviewed-by: Andy Shevchenko Reviewed-by: Hans de Goede Signed-off-by: Marco Nenciarini --- Cc: Andy Shevchenko Cc: Hans de Goede drivers/platform/x86/intel/int3472/discrete.c | 4 ++-- drivers/platform/x86/intel/int3472/led.c | 14 +++++++------- include/linux/platform_data/x86/int3472.h | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platfo= rm/x86/intel/int3472/discrete.c index 1505fc3ef..cb247633b 100644 --- a/drivers/platform/x86/intel/int3472/discrete.c +++ b/drivers/platform/x86/intel/int3472/discrete.c @@ -348,7 +348,7 @@ static int skl_int3472_handle_gpio_resources(struct acp= i_resource *ares, =20 break; case INT3472_GPIO_TYPE_PRIVACY_LED: - ret =3D skl_int3472_register_pled(int3472, gpio); + ret =3D skl_int3472_register_led(int3472, gpio); if (ret) err_msg =3D "Failed to register LED\n"; =20 @@ -422,7 +422,7 @@ void int3472_discrete_cleanup(struct int3472_discrete_d= evice *int3472) gpiod_remove_lookup_table(&int3472->gpios); =20 skl_int3472_unregister_clock(int3472); - skl_int3472_unregister_pled(int3472); + skl_int3472_unregister_led(int3472); skl_int3472_unregister_regulator(int3472); } EXPORT_SYMBOL_NS_GPL(int3472_discrete_cleanup, "INTEL_INT3472_DISCRETE"); diff --git a/drivers/platform/x86/intel/int3472/led.c b/drivers/platform/x8= 6/intel/int3472/led.c index 35abad900..fe412cb93 100644 --- a/drivers/platform/x86/intel/int3472/led.c +++ b/drivers/platform/x86/intel/int3472/led.c @@ -6,17 +6,17 @@ #include #include =20 -static int int3472_pled_set(struct led_classdev *led_cdev, enum led_bright= ness brightness) +static int int3472_led_set(struct led_classdev *led_cdev, enum led_brightn= ess brightness) { - struct int3472_pled *led =3D container_of(led_cdev, struct int3472_pled, = classdev); + struct int3472_led *led =3D container_of(led_cdev, struct int3472_led, cl= assdev); =20 gpiod_set_value_cansleep(led->gpio, brightness); return 0; } =20 -int skl_int3472_register_pled(struct int3472_discrete_device *int3472, str= uct gpio_desc *gpio) +int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio) { - struct int3472_pled *led =3D &int3472->pled; + struct int3472_led *led =3D &int3472->led; char *p; int ret; =20 @@ -34,7 +34,7 @@ int skl_int3472_register_pled(struct int3472_discrete_dev= ice *int3472, struct gp =20 led->classdev.name =3D led->name; led->classdev.max_brightness =3D 1; - led->classdev.brightness_set_blocking =3D int3472_pled_set; + led->classdev.brightness_set_blocking =3D int3472_led_set; =20 ret =3D led_classdev_register(int3472->dev, &led->classdev); if (ret) @@ -48,9 +48,9 @@ int skl_int3472_register_pled(struct int3472_discrete_dev= ice *int3472, struct gp return 0; } =20 -void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472) +void skl_int3472_unregister_led(struct int3472_discrete_device *int3472) { - struct int3472_pled *led =3D &int3472->pled; + struct int3472_led *led =3D &int3472->led; =20 if (IS_ERR_OR_NULL(led->classdev.dev)) return; diff --git a/include/linux/platform_data/x86/int3472.h b/include/linux/plat= form_data/x86/int3472.h index b1b837583..7af673168 100644 --- a/include/linux/platform_data/x86/int3472.h +++ b/include/linux/platform_data/x86/int3472.h @@ -121,12 +121,12 @@ struct int3472_discrete_device { u8 imgclk_index; } clock; =20 - struct int3472_pled { + struct int3472_led { struct led_classdev classdev; struct led_lookup_data lookup; char name[INT3472_LED_MAX_NAME_LEN]; struct gpio_desc *gpio; - } pled; + } led; =20 struct int3472_discrete_quirks quirks; =20 @@ -160,7 +160,7 @@ int skl_int3472_register_regulator(struct int3472_discr= ete_device *int3472, const char *second_sensor); void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3= 472); =20 -int skl_int3472_register_pled(struct int3472_discrete_device *int3472, str= uct gpio_desc *gpio); -void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472); +int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio); +void skl_int3472_unregister_led(struct int3472_discrete_device *int3472); =20 #endif --=20 2.47.3 From nobody Wed Apr 1 23:51:46 2026 Received: from spark.kcore.it (spark.kcore.it [49.13.27.68]) (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 DDA6A35A3A0; Wed, 1 Apr 2026 20:36:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=49.13.27.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075808; cv=none; b=GqrWxAcS5l1qS7uN5GvfNi/Apf65Lgx3Z6KYlxe9Q9QgZbmJSlkH8CXHm/qsdnTQmwo7U+8+zpnynZCBSZV+3HKzmYuYBA2UbEm6WpQio0nW8Gob73vn685lQwak+cvQgBbd3IRTHLpXoFVXxvQOAbDfD4+3q5vea2B9aiCj9Ug= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075808; c=relaxed/simple; bh=4s/LuJZ2SmFTyX40hmmbagLJgWtp+NJJsyDXstURC1c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mjA4bEBpXsDAH5xbIo490kVRS8TAnWh5/JmTFS8BaFAllIXbM2J6KzQ3p9MH8asHRO+s6mYRFS59HO+pxlVxIXkXqfuuGhxxqgXKX+uICqy9nTzM1KybYsS+G9a1+Pt+4tYASy+QPdHsgUhGXjF2dBiL7U4a9WeNafcdeWPxOWA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it; spf=pass smtp.mailfrom=kcore.it; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b=qg9h3NVY; arc=none smtp.client-ip=49.13.27.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kcore.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b="qg9h3NVY" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kcore.it; s=spark; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=yiX0UXjelJ/pU1oselKaIJa5DDcjSDnnBRqwzKvy3Sc=; b=qg9h3NVYZR+pXa//dPIa9iiccF TJaZnN30BgiUcl0qr7e2u2Qyrt53obEbyGq5KetMfeJHL59NnUTlYidZ0ylc5TZFbi6jUcdXXKi6/ oNhPFhp2JxUSrUui8YQPezNdPLySwyEZSwMHawZzQ8G1Iffrv5vupJ286jbFJ57+NaUA=; Received: from mnencia by spark.kcore.it with local (Exim 4.96) (envelope-from ) id 1w82Io-006ifU-2B; Wed, 01 Apr 2026 22:36:38 +0200 From: Marco Nenciarini To: Daniel Scally , Sakari Ailus , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Cc: Andy Shevchenko , Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Marco Nenciarini Subject: [PATCH v8 3/4] platform/x86: int3472: Parameterize LED con_id in registration Date: Wed, 1 Apr 2026 22:36:37 +0200 Message-Id: <20260401203638.1601661-4-mnencia@kcore.it> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260401203638.1601661-1-mnencia@kcore.it> References: <20260401203638.1601661-1-mnencia@kcore.it> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a con_id parameter to skl_int3472_register_led() to allow callers to specify both the LED name suffix and lookup con_id instead of hardcoding "privacy". This prepares for registering additional LED types with different names. While at it, rename the privacy LED's GPIO con_id from "privacy-led" to "privacy" in int3472_get_con_id_and_polarity() and pass it directly to skl_int3472_register_led(), reducing churn when adding new LED types. No functional change. Reviewed-by: Andy Shevchenko Reviewed-by: Hans de Goede Signed-off-by: Marco Nenciarini --- Cc: Andy Shevchenko Cc: Hans de Goede drivers/platform/x86/intel/int3472/discrete.c | 4 ++-- drivers/platform/x86/intel/int3472/led.c | 7 ++++--- include/linux/platform_data/x86/int3472.h | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platfo= rm/x86/intel/int3472/discrete.c index cb247633b..a45a93093 100644 --- a/drivers/platform/x86/intel/int3472/discrete.c +++ b/drivers/platform/x86/intel/int3472/discrete.c @@ -212,7 +212,7 @@ static void int3472_get_con_id_and_polarity(struct int3= 472_discrete_device *int3 *gpio_flags =3D GPIO_ACTIVE_HIGH; break; case INT3472_GPIO_TYPE_PRIVACY_LED: - *con_id =3D "privacy-led"; + *con_id =3D "privacy"; *gpio_flags =3D GPIO_ACTIVE_HIGH; break; case INT3472_GPIO_TYPE_HOTPLUG_DETECT: @@ -348,7 +348,7 @@ static int skl_int3472_handle_gpio_resources(struct acp= i_resource *ares, =20 break; case INT3472_GPIO_TYPE_PRIVACY_LED: - ret =3D skl_int3472_register_led(int3472, gpio); + ret =3D skl_int3472_register_led(int3472, gpio, con_id); if (ret) err_msg =3D "Failed to register LED\n"; =20 diff --git a/drivers/platform/x86/intel/int3472/led.c b/drivers/platform/x8= 6/intel/int3472/led.c index fe412cb93..22d0d6c5e 100644 --- a/drivers/platform/x86/intel/int3472/led.c +++ b/drivers/platform/x86/intel/int3472/led.c @@ -14,7 +14,8 @@ static int int3472_led_set(struct led_classdev *led_cdev,= enum led_brightness br return 0; } =20 -int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio) +int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio, + const char *con_id) { struct int3472_led *led =3D &int3472->led; char *p; @@ -27,7 +28,7 @@ int skl_int3472_register_led(struct int3472_discrete_devi= ce *int3472, struct gpi =20 /* Generate the name, replacing the ':' in the ACPI devname with '_' */ snprintf(led->name, sizeof(led->name), - "%s::privacy_led", acpi_dev_name(int3472->sensor)); + "%s::%s_led", acpi_dev_name(int3472->sensor), con_id); p =3D strchr(led->name, ':'); if (p) *p =3D '_'; @@ -42,7 +43,7 @@ int skl_int3472_register_led(struct int3472_discrete_devi= ce *int3472, struct gpi =20 led->lookup.provider =3D led->name; led->lookup.dev_id =3D int3472->sensor_name; - led->lookup.con_id =3D "privacy"; + led->lookup.con_id =3D con_id; led_add_lookup(&led->lookup); =20 return 0; diff --git a/include/linux/platform_data/x86/int3472.h b/include/linux/plat= form_data/x86/int3472.h index 7af673168..3ba0d5646 100644 --- a/include/linux/platform_data/x86/int3472.h +++ b/include/linux/platform_data/x86/int3472.h @@ -160,7 +160,8 @@ int skl_int3472_register_regulator(struct int3472_discr= ete_device *int3472, const char *second_sensor); void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3= 472); =20 -int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio); +int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio, + const char *con_id); void skl_int3472_unregister_led(struct int3472_discrete_device *int3472); =20 #endif --=20 2.47.3 From nobody Wed Apr 1 23:51:46 2026 Received: from spark.kcore.it (spark.kcore.it [49.13.27.68]) (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 DDB9A35DA7F; Wed, 1 Apr 2026 20:36:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=49.13.27.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; cv=none; b=LBFkYPsJh8aAJ2R4mTIamOIUKNtK2MaQCvx13xrCN8z4VxMEFn9yFF3Stvzf9ouLP5JPljJJUxx6/vGBhqrkScpB4QS5cqkeZ+UFnEkML1VhDNd/0WnLrgsYS/kCIf8opj/fPEQpYLI9pAGOrEOf9QmIQ9emanbmXv3gZzKk/UU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775075807; c=relaxed/simple; bh=gPlBX4zOHimo90WEB16/vQdW+j5FCKP9gW8J1WNT3Eg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ArgbzDQAn8HSnT+9U/69eTSQFZKrhYGybiA8nKvgFuBw5VKQ6+/htc+zBXSUhopVyvsXgmaN8rPSfuktV/N016de0QaCSsWF9rrRQPVflFH3hqYs6l1bM+gs3d2otoXLzfHAt3+2n42NAsfgNzYo7xULlgugIOY/EvQPrfuRSZo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it; spf=pass smtp.mailfrom=kcore.it; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b=JSLW4LGt; arc=none smtp.client-ip=49.13.27.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kcore.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kcore.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=kcore.it header.i=@kcore.it header.b="JSLW4LGt" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kcore.it; s=spark; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=IA41wtT5V5rXIBop4HcpbrrSYwWN4RGD30edsVoVwa4=; b=JSLW4LGtkJ8y6staZnx+6qrXDI DKwqJ2NkMcq7+ix/J2lpDfFP/WvFnLloN/bncCUxuBuvzZPaN15MUWvbYQ/O6nFBCRIElU9j+52MI DFnOCy5DAmJZ+6zTeUaqObOud0xQ1RCvfsJcGVzoiRLlskRf909l/yq9bSvc0BOmw/tY=; Received: from mnencia by spark.kcore.it with local (Exim 4.96) (envelope-from ) id 1w82Io-006ifX-2H; Wed, 01 Apr 2026 22:36:38 +0200 From: Marco Nenciarini To: Daniel Scally , Sakari Ailus , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Cc: Andy Shevchenko , Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Marco Nenciarini Subject: [PATCH v8 4/4] platform/x86: int3472: Add support for GPIO type 0x02 (IR flood LED) Date: Wed, 1 Apr 2026 22:36:38 +0200 Message-Id: <20260401203638.1601661-5-mnencia@kcore.it> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260401203638.1601661-1-mnencia@kcore.it> References: <20260401203638.1601661-1-mnencia@kcore.it> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for GPIO type 0x02, which controls an IR flood LED used for face authentication on some laptops (e.g. Dell Pro Max 16 Premium). Without this patch, the kernel logs "GPIO type 0x02 unknown; the sensor may not work" and IR sensors paired with a flood LED cannot function. The flood LED is registered through the LED subsystem like the existing privacy LED, including a lookup entry to allow future consumer drivers to find and control it via led_get(). To support multiple LEDs per INT3472 device, convert the single led struct member to an array with a counter. Signed-off-by: Marco Nenciarini --- Changes in v8: - Always register the LED lookup for ir_flood too, removing the type parameter and conditional switch-case (Hans de Goede, Andy Shevchenko). The ACPI _DSM tables refer to this GPIO type as "strobe", hence the INT3472_GPIO_TYPE_STROBE define. The userspace-visible LED name uses "ir_flood" instead, as the hardware is an IR flood illuminator, not a flash strobe. Cc: Andy Shevchenko Cc: Hans de Goede drivers/platform/x86/intel/int3472/discrete.c | 9 +++++++- drivers/platform/x86/intel/int3472/led.c | 23 ++++++++++--------- include/linux/platform_data/x86/int3472.h | 7 ++++-- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platfo= rm/x86/intel/int3472/discrete.c index a45a93093..a675e8f4c 100644 --- a/drivers/platform/x86/intel/int3472/discrete.c +++ b/drivers/platform/x86/intel/int3472/discrete.c @@ -215,6 +215,10 @@ static void int3472_get_con_id_and_polarity(struct int= 3472_discrete_device *int3 *con_id =3D "privacy"; *gpio_flags =3D GPIO_ACTIVE_HIGH; break; + case INT3472_GPIO_TYPE_STROBE: + *con_id =3D "ir_flood"; + *gpio_flags =3D GPIO_ACTIVE_HIGH; + break; case INT3472_GPIO_TYPE_HOTPLUG_DETECT: *con_id =3D "hpd"; *gpio_flags =3D GPIO_ACTIVE_HIGH; @@ -248,6 +252,7 @@ static void int3472_get_con_id_and_polarity(struct int3= 472_discrete_device *int3 * * 0x00 Reset * 0x01 Power down + * 0x02 Strobe * 0x0b Power enable * 0x0c Clock enable * 0x0d Privacy LED @@ -331,6 +336,7 @@ static int skl_int3472_handle_gpio_resources(struct acp= i_resource *ares, break; case INT3472_GPIO_TYPE_CLK_ENABLE: case INT3472_GPIO_TYPE_PRIVACY_LED: + case INT3472_GPIO_TYPE_STROBE: case INT3472_GPIO_TYPE_POWER_ENABLE: case INT3472_GPIO_TYPE_HANDSHAKE: gpio =3D skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, con_id, = gpio_flags); @@ -348,6 +354,7 @@ static int skl_int3472_handle_gpio_resources(struct acp= i_resource *ares, =20 break; case INT3472_GPIO_TYPE_PRIVACY_LED: + case INT3472_GPIO_TYPE_STROBE: ret =3D skl_int3472_register_led(int3472, gpio, con_id); if (ret) err_msg =3D "Failed to register LED\n"; @@ -422,7 +429,7 @@ void int3472_discrete_cleanup(struct int3472_discrete_d= evice *int3472) gpiod_remove_lookup_table(&int3472->gpios); =20 skl_int3472_unregister_clock(int3472); - skl_int3472_unregister_led(int3472); + skl_int3472_unregister_leds(int3472); skl_int3472_unregister_regulator(int3472); } EXPORT_SYMBOL_NS_GPL(int3472_discrete_cleanup, "INTEL_INT3472_DISCRETE"); diff --git a/drivers/platform/x86/intel/int3472/led.c b/drivers/platform/x8= 6/intel/int3472/led.c index 22d0d6c5e..9b2573cc3 100644 --- a/drivers/platform/x86/intel/int3472/led.c +++ b/drivers/platform/x86/intel/int3472/led.c @@ -17,13 +17,14 @@ static int int3472_led_set(struct led_classdev *led_cde= v, enum led_brightness br int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio, const char *con_id) { - struct int3472_led *led =3D &int3472->led; + struct int3472_led *led; char *p; int ret; =20 - if (led->classdev.dev) - return -EBUSY; + if (int3472->n_leds >=3D INT3472_MAX_LEDS) + return -ENOSPC; =20 + led =3D &int3472->leds[int3472->n_leds]; led->gpio =3D gpio; =20 /* Generate the name, replacing the ':' in the ACPI devname with '_' */ @@ -46,17 +47,17 @@ int skl_int3472_register_led(struct int3472_discrete_de= vice *int3472, struct gpi led->lookup.con_id =3D con_id; led_add_lookup(&led->lookup); =20 + int3472->n_leds++; return 0; } =20 -void skl_int3472_unregister_led(struct int3472_discrete_device *int3472) +void skl_int3472_unregister_leds(struct int3472_discrete_device *int3472) { - struct int3472_led *led =3D &int3472->led; + for (unsigned int i =3D 0; i < int3472->n_leds; i++) { + struct int3472_led *led =3D &int3472->leds[i]; =20 - if (IS_ERR_OR_NULL(led->classdev.dev)) - return; - - led_remove_lookup(&led->lookup); - led_classdev_unregister(&led->classdev); - gpiod_put(led->gpio); + led_remove_lookup(&led->lookup); + led_classdev_unregister(&led->classdev); + gpiod_put(led->gpio); + } } diff --git a/include/linux/platform_data/x86/int3472.h b/include/linux/plat= form_data/x86/int3472.h index 3ba0d5646..c597f37e9 100644 --- a/include/linux/platform_data/x86/int3472.h +++ b/include/linux/platform_data/x86/int3472.h @@ -23,6 +23,7 @@ /* PMIC GPIO Types */ #define INT3472_GPIO_TYPE_RESET 0x00 #define INT3472_GPIO_TYPE_POWERDOWN 0x01 +#define INT3472_GPIO_TYPE_STROBE 0x02 #define INT3472_GPIO_TYPE_POWER_ENABLE 0x0b #define INT3472_GPIO_TYPE_CLK_ENABLE 0x0c #define INT3472_GPIO_TYPE_PRIVACY_LED 0x0d @@ -31,6 +32,7 @@ =20 #define INT3472_PDEV_MAX_NAME_LEN 23 #define INT3472_MAX_SENSOR_GPIOS 3 +#define INT3472_MAX_LEDS 2 #define INT3472_MAX_REGULATORS 3 =20 /* E.g. "avdd\0" */ @@ -126,11 +128,12 @@ struct int3472_discrete_device { struct led_lookup_data lookup; char name[INT3472_LED_MAX_NAME_LEN]; struct gpio_desc *gpio; - } led; + } leds[INT3472_MAX_LEDS]; =20 struct int3472_discrete_quirks quirks; =20 unsigned int ngpios; /* how many GPIOs have we seen */ + unsigned int n_leds; /* how many LEDs have we registered */ unsigned int n_sensor_gpios; /* how many have we mapped to sensor */ unsigned int n_regulator_gpios; /* how many have we mapped to a regulator= */ struct gpiod_lookup_table gpios; @@ -162,6 +165,6 @@ void skl_int3472_unregister_regulator(struct int3472_di= screte_device *int3472); =20 int skl_int3472_register_led(struct int3472_discrete_device *int3472, stru= ct gpio_desc *gpio, const char *con_id); -void skl_int3472_unregister_led(struct int3472_discrete_device *int3472); +void skl_int3472_unregister_leds(struct int3472_discrete_device *int3472); =20 #endif --=20 2.47.3