From nobody Mon Aug 24 08:07:31 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4002B30B529 for ; Wed, 5 Aug 2026 18:06:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785953182; cv=none; b=LcHwV5bg0JvuTybbCvbgtYwxUWv7GLaON6M1qjlbCvNm5p4fVNm8a1ISnifK4kdvS2atdyr4GFmtapLW0BdfQyy28kmzrLml+qInV1xNGiWnM6zzjMdO1d1jHRdqkKVqP7wZqdAE97gyRrtzLC4YiLfaYDX+pXM3gSe+OeMB7Tc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785953182; c=relaxed/simple; bh=sB1Kaaj57FK35DO6hz/EKtI7Pqsy9TLkFXNKzd2RZds=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GSVH6fFk+pwD/xK9TJFizoysmx4ZgFEreImDhObeizTr+wp74nPaY58QSLSscpuCIHQqkxgM7+OXPJuFAXuobfiid2HnMoYtnLXAWDGXdVszlb8wc49zlQo9vaK8L+DgOiSV1jL6/ivJjWfAumTR05KePH0uD05ZaIf+bznMf1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=M3cO34Vx; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="M3cO34Vx" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-38f0f132f56so127892a91.0 for ; Wed, 05 Aug 2026 11:06:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785953180; x=1786557980; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GgCvWD2l2Fq77GYiybmTZggfpFuEvRxZsMZQT9Lvm84=; b=M3cO34VxS8IwTrtgmt7rMaa/IHUWd+dNbeLYxvqACBBkzV4LZLhFlf2uMuVMVx/9dO cbJoN57nEKW/p8lhMQyffeCYqWvlNxm/dVfS9R1nLCaevqemx2l9a9aPMN64yPFsvU7F Sy8k0tr+7P3wq6y0xQ5ymAqjPo4a41aSg1aPxOX1YnIUVIbyqY3D+VGR71x0KUm+0HgP RYTYT26LRrQf8yaSVja8s7w2MMYn+ZslAaojqhlKhcWetHp4IGRP2xpIGw3C0QWe1G1/ sfeCngjUiXyyY949z/OlzamUeCFQOJkQAxSh1hYvaqQnN3D8UnsX0SDLkFZ1V5k4J+LT 0tvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785953180; x=1786557980; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=GgCvWD2l2Fq77GYiybmTZggfpFuEvRxZsMZQT9Lvm84=; b=SV7U7UJMJWAs/2jNFfXDlsxMtvItMx4k7f68OqkaxgawaupaiK9579vU2wmVC99r7T RnNhqAKkFo6X0GHkHiIaYQi9TYf9smoXKxc0fnm7vZf5JVa4X+bsll7QQCtZlUdlDthd qvrYEOQfDQm2MwlPXcTfdpWK8QkxfRPMaUmlg22gChVhUON1vSBSUxcIWLkk2DX73pgS CrO5wAv/vlI8dTRKSbVAMhJfD93rt12EzFDd+1AVGSIdX0Kvk1H5kObJZgyPbXbIE8gf FaPF1hgfIZ041K1l5O3dFoaP46vS8iTFB2kH0RHnrTYOCoqyboUnBsWTlHFNFqWyQQIP 2jIQ== X-Forwarded-Encrypted: i=1; AHgh+RoIJYT1/CeFhmUZ502qAyPioOarh2Spp56iBJXn/cRnhiU0q5DeZTNvGof3h5l6wFLJMTYStdyzyxVGs58=@vger.kernel.org X-Gm-Message-State: AOJu0YyJsCNzhSbyJh+iZHvDaBHWdv1q+y202jmfsaTuiYK7HcyiRv29 yjRJBoiQADlAT4KoSCDVVuepBrs0yG8xgk824RKQ6PulgcJof+CEgxm1 X-Gm-Gg: AR+sD10gD9yb1LvsfkuiU1xRQoN/lm0jKFFzURY+8HMIwbsUBF/HXtokdGS6+itkOas 2TkHU8SxitivEFiJ3ckz7UHdfXKbOdwxENIyMLwipXrN1FF2lTYFNu+J3kvpu3gkqA3OTm4asIX QVMm7BHlGqAgRwwrqB/z2VWV/7lW09q128OUNqscp8KCfPaKqhKSXK8oLeQHdBlDRTdU8nsziLi lQddHIO/G9jd9tNga0sgFlyOecIEzJMK8SCzYdV8naQQIGzd/BSUDStapwjex2AARvmJGXa+TT+ RYoptnhmoP/kmmoQZM6y9oMQpZTvefIZvW3iK1kljLmLbklsyO/eYjUfdUBdMBEejVtqPE1X+iS 5MXOFJYHx7yj4VoBtrTp3vS1LWi59RKodbH7aExeI5eq788ULINSUeA8PODB3FwzhdfaP0yERLz h1/KFZDkFSApIl7xToY0+OfL9fQom5rrySm1lsUtzTHNqlPpxQFHNSCYKE1wsm3YDB8oaCTUmr7 vIaPBNwQ5aNmAVLIeuU X-Received: by 2002:a17:90b:3810:b0:38e:b3fd:d584 with SMTP id 98e67ed59e1d1-39083aa5aeemr441374a91.15.1785953180191; Wed, 05 Aug 2026 11:06:20 -0700 (PDT) Received: from localhost ([112.204.123.220]) by smtp.googlemail.com with ESMTPSA id 98e67ed59e1d1-3903f5d9b91sm2178422a91.3.2026.08.05.11.06.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 11:06:19 -0700 (PDT) From: Alex Yeo To: platform-driver-x86@vger.kernel.org Cc: alexyeo362@gmail.com, Kenneth Chan , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , linux-kernel@vger.kernel.org Subject: [RFC PATCH v1 1/1] platform/x86: panasonic-laptop: add platform_profile support Date: Thu, 6 Aug 2026 02:05:43 +0800 Message-ID: <20260805180544.1134916-2-alexyeo362@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260805180544.1134916-1-alexyeo362@gmail.com> References: <20260805180544.1134916-1-alexyeo362@gmail.com> 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" Expose firmware thermal and power management policies via the platform_profile interface. Supported and tested models: - CF-RZ6 (2016) - CF-SV8 (2019) - CF-QV9 (2020) - CF-SR4 (2024) Firmware fan operating mode and the TDP limit switch are mapped onto the Linux platform_profile ABI. This implementation queries the firmware for every get(). CUSTOM is returned when the current state is not recognized. The set() callback writes the values regardless of what the current fan mode and TDP limit is. - DMI quirks restrict support to tested models - Missing includes such as sysfs.h were added based on previous feedback. - Logging: pr_fmt added - When raising TDP, fan mode is switched first - When limiting TDP, TDP limit is applied first - ACPI handle for the EC device was used as the EC path varies slightly between models. Signed-off-by: Alex Yeo --- drivers/platform/x86/panasonic-laptop.c | 380 ++++++++++++++++++++++++ 1 file changed, 380 insertions(+) diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86= /panasonic-laptop.c index 719add753cb3..eeb89892768b 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c @@ -119,10 +119,16 @@ * - v0.1 start from toshiba_acpi driver written by John Belmonte */ =20 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include #include #include +#include #include +#include +#include +#include #include #include #include @@ -130,13 +136,18 @@ #include #include #include +#include +#include #include #include #include +#include #include #include #include =20 +DEFINE_FREE(acpi_dev_put, struct acpi_device *, if (_T) acpi_dev_put(_T)) + MODULE_AUTHOR("Hiroshi Miura "); MODULE_AUTHOR("David Bronaugh "); MODULE_AUTHOR("Harald Welte "); @@ -158,12 +169,39 @@ MODULE_LICENSE("GPL"); #define ECO_MODE_OFF 0x00 #define ECO_MODE_ON 0x80 =20 +#define PCC_ACPI_FAN_ACTIVE_MODE 0x00 +#define PCC_ACPI_FAN_PASSIVE_MODE 0x01 +#define PCC_ACPI_TDP_LIMIT_ON 0x01 +#define PCC_ACPI_TDP_LIMIT_OFF 0x00 + #define ACPI_PCC_DRIVER_NAME "Panasonic Laptop Support" #define ACPI_PCC_DEVICE_NAME "Hotkey" #define ACPI_PCC_CLASS "pcc" =20 #define ACPI_PCC_INPUT_PHYS "panasonic/hkey0" =20 +enum pcc_fan_mode { + PCC_FAN_MODE_UNSET =3D 0, + PCC_FAN_MODE_ACTIVE, + PCC_FAN_MODE_PASSIVE, +}; + +enum pcc_tdp_mode { + PCC_TDP_MODE_UNSET =3D 0, + PCC_TDP_MODE_LOCKED, + PCC_TDP_MODE_UNLOCKED, +}; + +struct pcc_platform_profile { + enum pcc_fan_mode fan_mode; + enum pcc_tdp_mode tdp_mode; +}; + +struct pcc_quirk { + bool use_platform_profiles; + struct pcc_platform_profile platform_profiles[PLATFORM_PROFILE_LAST]; +}; + /* LCD_TYPEs: 0 =3D Normal, 1 =3D Semi-transparent ECO_MODEs: 0x03 =3D off, 0x83 =3D on */ @@ -239,6 +277,7 @@ static const struct key_entry panasonic_keymap[] =3D { =20 struct pcc_acpi { acpi_handle handle; + acpi_handle ec_handle; unsigned long num_sifr; int sticky_key; int eco_mode; @@ -246,13 +285,111 @@ struct pcc_acpi { int ac_brightness; int dc_brightness; int current_brightness; + const struct pcc_quirk *quirks; struct acpi_device *device; struct input_dev *input_dev; struct backlight_device *backlight; struct platform_device *platform; + struct device *platform_profile_dev; u32 sinf[] __counted_by(num_sifr); }; =20 +static struct pcc_quirk quirk_cf_sr4 =3D { + .use_platform_profiles =3D true, + .platform_profiles =3D { + [PLATFORM_PROFILE_QUIET] =3D { + .fan_mode =3D PCC_FAN_MODE_PASSIVE, + .tdp_mode =3D PCC_TDP_MODE_LOCKED, + }, + [PLATFORM_PROFILE_COOL] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_LOCKED, + }, + [PLATFORM_PROFILE_PERFORMANCE] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_UNLOCKED, + }, + }, +}; + +static struct pcc_quirk quirk_cf_qv9 =3D { + .use_platform_profiles =3D true, + .platform_profiles =3D { + [PLATFORM_PROFILE_BALANCED] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_LOCKED, + }, + [PLATFORM_PROFILE_PERFORMANCE] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_UNLOCKED, + }, + }, +}; + +static struct pcc_quirk quirk_cf_sv8 =3D { + .use_platform_profiles =3D true, + .platform_profiles =3D { + [PLATFORM_PROFILE_BALANCED] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_LOCKED, + }, + [PLATFORM_PROFILE_PERFORMANCE] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_UNLOCKED, + }, + }, +}; + +static struct pcc_quirk quirk_cf_rz6 =3D { + .use_platform_profiles =3D true, + .platform_profiles =3D { + [PLATFORM_PROFILE_BALANCED] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_LOCKED, + }, + [PLATFORM_PROFILE_PERFORMANCE] =3D { + .fan_mode =3D PCC_FAN_MODE_ACTIVE, + .tdp_mode =3D PCC_TDP_MODE_UNLOCKED, + }, + }, +}; + +static const struct dmi_system_id pcc_quirks[] =3D { + { + .ident =3D "Panasonic Connect Co., Ltd. CFSR4-1", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Panasonic Connect Co., Ltd."), + DMI_MATCH(DMI_PRODUCT_NAME, "CFSR4-1"), + }, + .driver_data =3D &quirk_cf_sr4, + }, + { + .ident =3D "Panasonic Corporation CFQV9-1", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Panasonic Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "CFQV9-1"), + }, + .driver_data =3D &quirk_cf_qv9, + }, + { + .ident =3D "Panasonic Corporation CFSV8-2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Panasonic Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "CFSV8-2"), + }, + .driver_data =3D &quirk_cf_sv8, + }, + { + .ident =3D "Panasonic Corporation CFRZ6-2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Panasonic Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "CFRZ6-2"), + }, + .driver_data =3D &quirk_cf_rz6, + }, + {}, +}; + /* * On some Panasonic models the volume up / down / mute keys send duplicate * keypress events over the PS/2 kbd interface, filter these out. @@ -958,6 +1095,207 @@ static int acpi_pcc_init_input(struct pcc_acpi *pcc) return error; } =20 +static int pcc_fan_mode_get(struct pcc_acpi *pcc, enum pcc_fan_mode *fan_m= ode) +{ + unsigned long long state; + acpi_status status; + + status =3D acpi_evaluate_integer(pcc->ec_handle, "CEFM", NULL, + &state); + if (ACPI_FAILURE(status)) { + pr_err("cannot get fan mode via CEFM\n"); + return -EIO; + } + + if (state =3D=3D PCC_ACPI_FAN_ACTIVE_MODE) + *fan_mode =3D PCC_FAN_MODE_ACTIVE; + else if (state =3D=3D PCC_ACPI_FAN_PASSIVE_MODE) + *fan_mode =3D PCC_FAN_MODE_PASSIVE; + else + return -EINVAL; + + return 0; +} + +static int pcc_tdp_mode_get(struct pcc_acpi *pcc, enum pcc_tdp_mode *tdp_m= ode) +{ + unsigned long long state; + acpi_status status; + + status =3D acpi_evaluate_integer(pcc->ec_handle, "EPLE", NULL, + &state); + if (ACPI_FAILURE(status)) { + pr_err("cannot read power limit using EPLE\n"); + return -EIO; + } + + if (state =3D=3D PCC_ACPI_TDP_LIMIT_ON) + *tdp_mode =3D PCC_TDP_MODE_LOCKED; + else if (state =3D=3D PCC_ACPI_TDP_LIMIT_OFF) + *tdp_mode =3D PCC_TDP_MODE_UNLOCKED; + else + return -EINVAL; + + return 0; +} + +static int pcc_fan_mode_set(struct pcc_acpi *pcc, enum pcc_fan_mode fan_mo= de) +{ + acpi_status status; + + switch (fan_mode) { + case PCC_FAN_MODE_ACTIVE: + status =3D acpi_execute_simple_method(pcc->ec_handle, + "SEFM", + PCC_ACPI_FAN_ACTIVE_MODE); + break; + case PCC_FAN_MODE_PASSIVE: + status =3D acpi_execute_simple_method(pcc->ec_handle, + "SEFM", + PCC_ACPI_FAN_PASSIVE_MODE); + break; + default: + return -EINVAL; + } + + if (ACPI_FAILURE(status)) { + pr_err("failed to set fan mode via SEFM\n"); + return -EIO; + } + + return 0; +} + +static int pcc_tdp_mode_set(struct pcc_acpi *pcc, enum pcc_tdp_mode tdp_mo= de) +{ + acpi_status status; + + switch (tdp_mode) { + case PCC_TDP_MODE_LOCKED: + status =3D acpi_execute_simple_method(pcc->ec_handle, + "SEPL", + PCC_ACPI_TDP_LIMIT_ON); + break; + case PCC_TDP_MODE_UNLOCKED: + status =3D acpi_execute_simple_method(pcc->ec_handle, + "SEPL", + PCC_ACPI_TDP_LIMIT_OFF); + break; + default: + return -EINVAL; + } + + if (ACPI_FAILURE(status)) { + pr_err("failed to set power mode via SEPL\n"); + return -EIO; + } + + return 0; +} + +static int pcc_platform_profile_get(struct device *dev, enum platform_prof= ile_option *profile) +{ + struct pcc_acpi *pcc =3D dev_get_drvdata(dev); + enum pcc_fan_mode fan_mode; + enum pcc_tdp_mode tdp_mode; + int status; + + status =3D pcc_fan_mode_get(pcc, &fan_mode); + if (status) + return status; + + status =3D pcc_tdp_mode_get(pcc, &tdp_mode); + if (status) + return status; + + for (enum platform_profile_option pp_opt =3D 0; + pp_opt < PLATFORM_PROFILE_LAST; + pp_opt++) { + enum pcc_fan_mode profile_fan_mode =3D + pcc->quirks->platform_profiles[pp_opt].fan_mode; + enum pcc_tdp_mode profile_tdp_mode =3D + pcc->quirks->platform_profiles[pp_opt].tdp_mode; + + if (!(profile_fan_mode && profile_tdp_mode)) + continue; + + if (tdp_mode =3D=3D profile_tdp_mode && fan_mode =3D=3D profile_fan_mode= ) { + *profile =3D pp_opt; + return 0; + } + } + + *profile =3D PLATFORM_PROFILE_CUSTOM; + return 0; +} + +static int pcc_platform_profile_set_profile(struct pcc_acpi *pcc, + enum pcc_fan_mode fan_mode, + enum pcc_tdp_mode tdp_mode) +{ + int status; + + switch (tdp_mode) { + case PCC_TDP_MODE_UNLOCKED: + status =3D pcc_fan_mode_set(pcc, fan_mode); + if (status) + return status; + + return pcc_tdp_mode_set(pcc, tdp_mode); + case PCC_TDP_MODE_LOCKED: + status =3D pcc_tdp_mode_set(pcc, tdp_mode); + if (status) + return status; + + return pcc_fan_mode_set(pcc, fan_mode); + default: + return -EINVAL; + } +} + +static int pcc_platform_profile_set(struct device *dev, enum platform_prof= ile_option profile) +{ + struct pcc_acpi *pcc =3D dev_get_drvdata(dev); + struct pcc_platform_profile pcc_profile; + + pcc_profile =3D pcc->quirks->platform_profiles[profile]; + if (pcc_profile.fan_mode && pcc_profile.tdp_mode) + return pcc_platform_profile_set_profile(pcc, + pcc_profile.fan_mode, + pcc_profile.tdp_mode); + + return -EINVAL; +} + +static int pcc_platform_profile_probe(void *drvdata, unsigned long *choice= s) +{ + struct pcc_acpi *pcc =3D drvdata; + + for (enum platform_profile_option pp_opt =3D 0; + pp_opt < PLATFORM_PROFILE_LAST; + pp_opt++) { + enum pcc_fan_mode fan_mode =3D + pcc->quirks->platform_profiles[pp_opt].fan_mode; + enum pcc_tdp_mode tdp_mode =3D + pcc->quirks->platform_profiles[pp_opt].tdp_mode; + + if (fan_mode && tdp_mode) { + set_bit(pp_opt, choices); + } else if (fan_mode || tdp_mode) { + pr_err("error probing platform profiles: malformed quirk\n"); + return -EINVAL; + } + } + + return 0; +} + +static const struct platform_profile_ops pcc_platform_profile_ops =3D { + .probe =3D pcc_platform_profile_probe, + .profile_get =3D pcc_platform_profile_get, + .profile_set =3D pcc_platform_profile_set, +}; + /* kernel module interface */ =20 #ifdef CONFIG_PM_SLEEP @@ -979,8 +1317,37 @@ static int acpi_pcc_hotkey_resume(struct device *dev) } #endif =20 +static int acpi_pcc_platform_profile_probe(struct pcc_acpi *pcc, struct pl= atform_device *pdev) +{ + struct acpi_device *adev __free(acpi_dev_put) =3D + acpi_dev_get_first_match_dev("PNP0C09", NULL, -1); + int err; + + if (!adev) { + pr_err("failed to find embedded controller path\n"); + return -ENODEV; + } + + pcc->ec_handle =3D acpi_device_handle(adev); + + pcc->platform_profile_dev =3D + devm_platform_profile_register(&pdev->dev, + "panasonic-laptop", + pcc, + &pcc_platform_profile_ops); + if (IS_ERR(pcc->platform_profile_dev)) { + err =3D PTR_ERR(pcc->platform_profile_dev); + pcc->platform_profile_dev =3D NULL; + return dev_err_probe(&pdev->dev, err, + "failed to register platform profiles\n"); + } + + return 0; +} + static int acpi_pcc_hotkey_probe(struct platform_device *pdev) { + const struct dmi_system_id *dmi_id; struct backlight_properties props; struct acpi_device *device; struct pcc_acpi *pcc; @@ -1020,6 +1387,12 @@ static int acpi_pcc_hotkey_probe(struct platform_dev= ice *pdev) strscpy(acpi_device_name(device), ACPI_PCC_DEVICE_NAME); strscpy(acpi_device_class(device), ACPI_PCC_CLASS); =20 + dmi_id =3D dmi_first_match(pcc_quirks); + if (dmi_id) { + pcc->quirks =3D dmi_id->driver_data; + pr_debug("quirk detect: enabled quirks for %s\n", dmi_id->ident); + } + result =3D acpi_pcc_init_input(pcc); if (result) { pr_err("Error installing keyinput handler\n"); @@ -1091,6 +1464,13 @@ static int acpi_pcc_hotkey_probe(struct platform_dev= ice *pdev) } =20 i8042_install_filter(panasonic_i8042_filter, NULL); + + if (pcc->quirks && pcc->quirks->use_platform_profiles) { + result =3D acpi_pcc_platform_profile_probe(pcc, pdev); + if (result) + pr_warn("error occurred setting up platform profiles\n"); + } + return 0; =20 out_platform: --=20 2.55.0